Initial commit

This commit is contained in:
2025-07-27 18:47:50 +03:00
parent ae1ed5b41b
commit d127006d9d
196 changed files with 72333 additions and 0 deletions

View File

@@ -0,0 +1,180 @@
<?php
#функция нахождения всех файлов в папке
function managerPathFolder($params) {
global $config, $path, $_SESSION;
$lang = include $path . 'main_plugin/manager/lang.php';
$dirParam = $params['managerPathFolder'] ?? '';
$directory = realpath($path . ($dirParam ?: ''));
if ($directory && is_dir($directory)) {
$files = scandir($directory);
$data = [];
foreach ($files as $file) {
if ($file === '.' || $file === '..') continue;
$filePath = $directory . '/' . $file;
if (is_dir($filePath)) {
$name = $file;
$type = $lang[$_SESSION['lng']]['folder'];
$items = array_diff(scandir($filePath), ['.','..']);
$size = count($items);
} else {
$extension = pathinfo($file, PATHINFO_EXTENSION);
$name = $extension ? $file : pathinfo($file, PATHINFO_FILENAME);
$type = $lang[$_SESSION['lng']]['file'];
$size = filesize($filePath);
}
$data[] = [
'name' => $name,
'path' => ($dirParam ?: '') . "/" . $file,
'type' => $type,
'size' => $size,
'creationTime' => date('Y-m-d H:i:s', filemtime($filePath)),
];
}
array_unshift($data, ['rootFolder' => basename($path)]);
return ['items' => $data];
}
return ['error' => "Invalid path: {$dirParam}"];
}
// проверка на существование папки в буфере
function checkFolderForFile($params) {
global $_SESSION;
$exists = !empty($_SESSION['managerClipboardFile']['path']);
return ['exists' => $exists ? 1 : 0];
}
// проверка на существование файла с таким же именем
function checkSameName($params) {
global $path, $_SESSION;
if (!empty($params['managerSettingsInsert'])) {
$clipboard = $_SESSION['managerClipboardFile']['path'];
$newPath = $path . $params['currentPath'] . '/' . basename($clipboard);
} else {
$newPath = $path . $params['currentPath'] . DIRECTORY_SEPARATOR . ($params['name'] ?? '');
}
return ['exists' => file_exists($newPath) ? 1 : 0];
}
// проверка буфера обмена
function managerClipboard($params) {
global $path, $_SESSION;
$in = $params['managerClipboard'] ?? '';
$filePath = realpath($path . '/' . $in);
if ($filePath && file_exists($filePath)) {
$_SESSION['managerClipboardFile'] = ['path' => $filePath, 'action' => $params['action'] ?? ''];
return ['message' => 1];
}
return ['message' => 0];
}
// вставка из буфера обмена
function managerSettingsInsert($params) {
global $path, $_SESSION;
$dest = realpath($path . '/' . ($params['managerSettingsInsert'] ?? ''));
if (!$dest) return ['message' => 0, 'error' => 'Invalid destination'];
if (empty($_SESSION['managerClipboardFile']['path'])) return ['message' => 0, 'error' => 'Clipboard empty'];
$clipboard = $_SESSION['managerClipboardFile']['path'];
$action = $_SESSION['managerClipboardFile']['action'];
$newPath = $dest . '/' . basename($clipboard);
if ($action === 'cut') {
$ok = rename($clipboard, $newPath);
return ['message' => $ok ? 1 : 0];
}
if ($action === 'copy') {
$copyDir = function($src, $dst) use (&$copyDir) {
if (is_dir($src)) {
if (!is_dir($dst)) mkdir($dst, 0755, true);
foreach (array_diff(scandir($src), ['.','..']) as $f) {
$copyDir($src."/".$f, $dst."/".$f);
}
} else {
copy($src, $dst);
}
};
$copyDir($clipboard, $newPath);
return ['message' => 1];
}
return ['message' => 0, 'error' => 'Invalid action'];
}
// переименование
function managerSettingsRename($params) {
$curr = realpath($GLOBALS['path'] . '/' . ($params['managerSettingsRename'] ?? ''));
$new = $params['managerNamePath'] ?? '';
$ok = $curr && rename($curr, dirname($curr).'/'.$new);
return ['message' => $ok ? 1 : 0];
}
// удаление
function managerSettingsDelete($params) {
$target = realpath($GLOBALS['path'] . '/' . ($params['managerSettingsDelete'] ?? ''));
$del = function($p) use (&$del) {
if (is_dir($p)) {
foreach (array_diff(scandir($p), ['.','..']) as $f) $del($p.'/'.$f);
return rmdir($p);
}
return unlink($p);
};
$ok = $target ? $del($target) : false;
return ['message' => $ok ? 1 : 0];
}
// свойства файла/папки
function managerSettingsProperties($params) {
global $config, $path, $_SESSION;
$lang = include $path . 'main_plugin/manager/lang.php';
$curr = realpath($path . '/' . ($params['managerSettingsProperties'] ?? ''));
if (!$curr) return ['error' => 'not_found'];
$info = [
['label'=>$lang[$_SESSION['lng']]['name'],'value'=>basename($curr)],
['label'=>$lang[$_SESSION['lng']]['type'],'value'=>is_dir($curr)?$lang[$_SESSION['lng']]['folder']:$lang[$_SESSION['lng']]['file']],
['label'=>$lang[$_SESSION['lng']]['location'],'value'=>str_replace($path,'',dirname('/'.$curr))],
['label'=>$lang[$_SESSION['lng']]['size'],'value'=>is_dir($curr)?'-':filesize($curr).' байт'],
['label'=>$lang[$_SESSION['lng']]['creation_time'],'value'=>date('Y-m-d H:i:s',filectime($curr))],
['label'=>$lang[$_SESSION['lng']]['last_modified_time'],'value'=>date('Y-m-d H:i:s',filemtime($curr))]
];
return ['properties'=>$info];
}
// создание
function managerSettingsCreate($params) {
$name = $params['managerSettingsCreate'] ?? '';
$type = $params['managerType'] ?? '';
$parent = realpath($GLOBALS['path'].'/'.($params['managerNamePath'] ?? ''));
if (!$parent) return ['message'=>'invalid_parent'];
$full = $parent.'/'.$name;
if (file_exists($full)) return ['message'=>'exists'];
$ok = ($type==='папка')?mkdir($full):file_put_contents($full,'')!==false;
return ['message'=>$ok?1:'noSuccess'];
}
// открыть страницу
function newPath($params) {
global $path, $_SESSION;
$page = simplexml_load_file($path.'/'.($params['newPath']??'').'.page.php');
$out = [
'right'=>GetBlock($page->rblock->block,'right'),
'left'=>GetBlock($page->lblock->block,'left'),
'content'=>(string)$page->content->{$_SESSION['lng']}
];
$_SESSION['page_url']=$params['newPath']??'';
return $out;
}
// загрузка файла менеджером
function pathLoad($params) {
global $path;
$f = $_FILES['pathFile'] ?? null;
if (!$f || $f['error']!==UPLOAD_ERR_OK) return ['error'=>'upload_error'];
$ext=strtolower(pathinfo($f['name'],PATHINFO_EXTENSION));
if (!in_array($ext,['jpg','png','txt','pdf'])) return ['error'=>'ext'];
$dir=realpath($path.'/'.($params['pathLoad']??''));
if (!$dir||!is_writable($dir)) return ['error'=>'dir'];
$name=pathinfo($f['name'],PATHINFO_FILENAME); $i=1; $final=$name;
while(file_exists("$dir/$final.$ext")) $final=$name.'_'.($i++);
$file="$dir/$final.$ext";
return move_uploaded_file($f['tmp_name'],$file)?['path'=>str_replace('\\','/',$file)]:['error'=>'move'];
}
?>

View File

@@ -0,0 +1,8 @@
<?php
$lang = include $path . 'lang.php';
$lng = $_GET['lng'] ?? ($_SESSION['lng'] ?? 'en');
$placeholders = [];
foreach ($lang[$lng] as $key => $value) {
$placeholders['{{' . $key . '}}'] = $value;
}
echo strtr(file_get_contents($path . 'manager.js'), $placeholders);

View File

@@ -0,0 +1,169 @@
<?php
$lang = [
'ru' => [
'copy' => 'Копировать',
'cut' => 'Вырезать',
'rename' => 'Переименовать',
'delete' => 'Удалить',
'properties' => 'Свойства',
'upload_file' => 'Загрузить файл',
'paste' => 'Вставить',
'create_file' => 'Создать файл',
'create_folder' => 'Создать папку',
'rights' => 'Права',
'ok' => 'Ок',
'cancel' => 'Отмена',
'file' => 'Файл',
'to_clipboard' => 'в буфер обмена!',
'error_when' => 'Ошибка при',
'right_click_to_select_file' => 'Кликните правой кнопкой мыши на файл для выбора файла!',
'file_with_same_name_exists' => 'Файл с таким именем уже существует!',
'file_pasted_successfully' => 'Файл вставлен из буфера обмена!',
'file_paste_unknown_error' => 'Неизвестная ошибка при вставке файла!',
'error' => 'Ошибка',
'enter_new_name' => 'Введите новое имя:',
'rename_success' => 'Переименование выполнено успешно!',
'rename_error' => 'Ошибка при переименовании!',
'invalid_name_error' => 'Некорректное имя. Использование запрещенных символов...',
'delete_confirm' => 'Подтвердите удаление!',
'delete_success' => 'Удаление выполнено успешно!',
'delete_error' => 'Ошибка при удалении!',
'folder' => 'Папка',
'enter_new_folder_name' => 'Введите имя новой папки:',
'invalid_folder_name' => 'Некорректное имя папки',
'folder_created_successfully' => 'Папка создана успешно!',
'enter_new_file_name' => 'Введите имя нового файла:',
'invalid_file_name' => 'Некорректное имя файла',
'file_created_successfully' => 'Файл создан успешно!',
'create' => 'Создать',
'with_name' => 'с именем',
'create_error' => 'Ошибка при создании',
'item_already_exists' => 'с таким же именем уже есть!',
'unknown_error' => 'Неизвестная ошибка!',
'no_rights_yet' => 'прав пока что нету',
'file_upload_error' => 'Ошибка загрузки файла!',
'file_uploaded_successfully' => 'Файл успешно загружен!',
'select_file_ending_with_page_php' => 'Выберите файл с расширением .page.php!',
'name' => 'Имя',
'type' => 'Тип',
'location' => 'Расположение',
'size' => 'Размер',
'creation_time' => 'Время создания',
'last_modified_time' => 'Время последнего изменения',
'error' => 'Ошибка',
'file_or_folder_not_found' => 'Файл или папка не найдены'
],
'en' => [
'copy' => 'Copy',
'cut' => 'Cut',
'rename' => 'Rename',
'delete' => 'Delete',
'properties' => 'Properties',
'upload_file' => 'Upload file',
'paste' => 'Paste',
'create_file' => 'Create file',
'create_folder' => 'Create folder',
'rights' => 'Permissions',
'ok' => 'OK',
'cancel' => 'Cancel',
'file' => 'File',
'to_clipboard' => 'to clipboard!',
'error_when' => 'Error when',
'right_click_to_select_file' => 'Right-click to select a file!',
'file_with_same_name_exists' => 'File with this name already exists!',
'file_pasted_successfully' => 'File pasted successfully!',
'file_paste_unknown_error' => 'Unknown error while pasting!',
'error' => 'Error',
'enter_new_name' => 'Enter new name:',
'rename_success' => 'Renamed successfully!',
'rename_error' => 'Error renaming!',
'invalid_name_error' => 'Invalid name contains forbidden characters',
'delete_confirm' => 'Confirm deletion!',
'delete_success' => 'Deleted successfully!',
'delete_error' => 'Error deleting!',
'folder' => 'Folder',
'enter_new_folder_name' => 'Enter folder name:',
'invalid_folder_name' => 'Invalid folder name',
'folder_created_successfully' => 'Folder created successfully!',
'enter_new_file_name' => 'Enter file name:',
'invalid_file_name' => 'Invalid file name',
'file_created_successfully' => 'File created successfully!',
'create' => 'Create',
'with_name' => 'with name',
'create_error' => 'Error creating',
'item_already_exists' => 'already exists!',
'unknown_error' => 'Unknown error!',
'no_rights_yet' => 'No permissions set',
'file_upload_error' => 'File upload error!',
'file_uploaded_successfully' => 'File uploaded successfully!',
'select_file_ending_with_page_php' => 'Select file ending with .page.php!',
'name' => 'Name',
'type' => 'Type',
'location' => 'Location',
'size' => 'Size',
'creation_time' => 'Creation Time',
'last_modified_time' => 'Last Modified Time',
'file' => 'File',
'error' => 'Error',
'file_or_folder_not_found' => 'File or folder not found'
],
'lv' => [
'copy' => 'Kopēt',
'cut' => 'Izgriezt',
'rename' => 'Pārdēvēt',
'delete' => 'Dzēst',
'properties' => 'Īpašības',
'upload_file' => 'Augšupielādēt failu',
'paste' => 'Ielīmēt',
'create_file' => 'Izveidot failu',
'create_folder' => 'Izveidot mapi',
'rights' => 'Tiesības',
'ok' => 'Labi',
'cancel' => 'Atcelt',
'file' => 'Fails',
'to_clipboard' => 'starpliktuvi!',
'error_when' => 'Kļūda, mēģinot',
'right_click_to_select_file' => 'Ar peles labo pogu atlasiet failu!',
'file_with_same_name_exists' => 'Fails ar šādu nosaukumu jau pastāv!',
'file_pasted_successfully' => 'Fails veiksmīgi ielīmēts!',
'file_paste_unknown_error' => 'Nezināma kļūda ielīmējot!',
'error' => 'Kļūda',
'enter_new_name' => 'Ievadiet jaunu nosaukumu:',
'rename_success' => 'Pārdēvēts veiksmīgi!',
'rename_error' => 'Kļūda pārdēvējot!',
'invalid_name_error' => 'Nederīgs nosaukums',
'delete_confirm' => 'Apstipriniet dzēšanu!',
'delete_success' => 'Dzēsts veiksmīgi!',
'delete_error' => 'Kļūda dzēšot!',
'folder' => 'Mape',
'enter_new_folder_name' => 'Ievadiet mapes nosaukumu:',
'invalid_folder_name' => 'Nederīgs mapes nosaukums',
'folder_created_successfully' => 'Mape izveidota veiksmīgi!',
'enter_new_file_name' => 'Ievadiet faila nosaukumu:',
'invalid_file_name' => 'Nederīgs faila nosaukums',
'file_created_successfully' => 'Fails izveidots veiksmīgi!',
'create' => 'Izveidot',
'with_name' => 'ar nosaukumu',
'create_error' => 'Kļūda izveidojot',
'item_already_exists' => 'jau eksistē!',
'unknown_error' => 'Nezināma kļūda!',
'no_rights_yet' => 'Nav piešķirtu tiesību',
'file_upload_error' => 'Kļūda augšupielādējot failu!',
'file_uploaded_successfully' => 'Fails augšupielādēts veiksmīgi!',
'select_file_ending_with_page_php' => 'Atlasiet failu ar paplašinājumu .page.php!',
'name' => 'Vārds',
'type' => 'Tips',
'location' => 'Atrašanās vieta',
'size' => 'Izmērs',
'creation_time' => 'Izveidošanas laiks',
'last_modified_time' => 'Pēdējās izmaiņas',
'file' => 'Fails',
'error' => 'Kļūda',
'file_or_folder_not_found' => 'Fails vai mape nav atrasti'
]
];
return $lang;

View File

@@ -0,0 +1,254 @@
/* менеджер */
#managerDiv {
display: inline-block;
position: fixed;
z-index: 100;
user-select: none;
background-color: rgba(255, 255, 255, 0.92);
border: 1px solid #000000;
width: 800px;
border-radius: 5px;
height: 600px;
font-size: 1em;
box-shadow: 0px 0px 5px #777;
}
#managerCloseFun {
float: right;
width: 20px;
height: 20px;
background-position: -159px -121px;
cursor: pointer;
}
#managerHistoryBackFun {
margin-right: 2px;
float: left;
width: 20px;
height: 14px;
background-position: -400px -43px;
cursor: pointer;
}
#managerHistoryForwFun {
margin-right: 2px;
float: left;
width: 20px;
height: 14px;
background-position: -441px -43px;
cursor: pointer;
}
#managerBackFun {
margin-right: 12px;
float: left;
width: 20px;
height: 14px;
background-position: -481px -43px;
cursor: pointer;
}
#managerTop {
text-align: center;
border-bottom: 1px #40464d solid;
padding: 5px;
background-color: rgba(255, 255, 255, 0.6);
}
#managerTopTitle {
text-align: center;
}
#managerPath {
display: inline-block;
flex: 1;
height: 18px;
background-color: rgba(255, 255, 255, 0.8);
border-radius: 5px;
padding: 2px;
}
#managerPath.active {
border: 1px #40464d solid;
}
.managerPathButton {
background-color: rgba(255, 255, 255, 1);
border-radius: 5px;
cursor: pointer;
}
.managerPathButton:hover {
color: #787878;
}
#managerTopDiv {
display: flex;
align-items: center;
flex-wrap: wrap;
}
#managerTableDiv {
height: 480px;
margin: 0px 20px 0px 20px;
border: 1px #40464d solid;
overflow-y: overlay;
border-radius: 5px;
}
#managerTable {
font-size: 1em;
border-collapse: collapse;
background-color: rgba(255, 255, 255, 0.8);
width: -webkit-fill-available;
}
#managerTableTitle {
position: sticky;
top: 0;
font-weight: bold;
background-color: rgba(255, 255, 255, 1);
}
#managerTable td {
padding: 5px;
}
.managerTableDivFile:hover td {
background-color: #c5e7f9;
cursor: pointer;
}
/* #managerTableDiv::-webkit-scrollbar {
width: 10px;
}
#managerTableDiv::-webkit-scrollbar-track {
border: 1px solid #000;
padding: 2px 0;
background-color: #ffffff;
}
#managerTableDiv::-webkit-scrollbar-thumb {
border-radius: 10px;
box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
background-color: #ffffff;
border: 1px solid #000;
border-right: 0px solid #000;
} */
/* сохронение как*/
#saveHowDiv {
margin: 8px 20px 0px 20px;
white-space: nowrap;
display: flex;
align-items: center;
}
#saveHowName {
border: 1px #40464d solid;
border-radius: 5px;
padding: 5px;
width: 594px;
font-size: 1em;
display: inline-block;
margin-left: 10px;
}
#saveHowButton {
border: 1px #40464d solid;
border-radius: 5px;
padding: 5px;
margin: 0px 0px 0px 10px;
cursor: pointer;
display: inline-block;
width: 91px;
}
#saveHowButton:hover {
color: #787878;
}
/* окно менеджер */
#managerSettings {
display: inline-block;
position: fixed;
z-index: 100;
user-select: none;
background-color: rgba(255, 255, 255, 0.92);
border: 1px solid #000000;
border-radius: 5px;
font-size: 1em;
box-shadow: 0px 0px 5px #777;
padding: 5px;
animation: fadeIn 0.5s ease-in forwards;
}
.managerSettingsButtonButtons {
background-color: rgba(255, 255, 255, 0.8);
border-radius: 5px;
padding: 5px;
border: 1px #40464d solid;
cursor: pointer;
}
.managerSettingsButtonButtons:hover {
color: #787878;
}
/* окно свойств */
#managerProperties {
display: inline-block;
position: fixed;
z-index: 100;
user-select: none;
background-color: rgba(255, 255, 255, 0.97);
border: 1px solid #000000;
border-radius: 5px;
font-size: 1em;
box-shadow: 0px 0px 5px #777;
width: 600px;
}
#managerPropertiesMiddle {
margin: 0px 20px 0px 20px;
}
#managerPropertiesTop {
border-bottom: 1px solid #000000;
padding: 5px;
text-align: center;
}
#managerPropertiesTopName {
text-align: center;
}
#managerPropertiesTopClose {
float: right;
width: 20px;
height: 20px;
background-position: -159px -121px;
cursor: pointer;
}
#managerPropertiesWindow {
text-align: center;
display: flex;
}
.managerPropertiesWindowDiv {
cursor: pointer;
text-align: center;
width: 50%;
display: inline-block;
padding: 9px;
}
.managerPropertiesWindowDiv:hover {
color: #787878;
}
#managerPropertiesDiv {
border: 1px solid #000000;
border-radius: 5px;
}
.managerPropertiesDivDivs {
padding: 6px 8px 6px 8px;
border-radius: 5px;
}
#managerPropertiesDivButtons {
padding: 9px;
display: flex;
justify-content: right;
align-items: center;
}
#managerPropertiesDivButtons {
text-align: center;
}
.managerPropertiesDivButton {
margin: 3px 3px 3px 15px;
cursor: pointer;
display: inline-block;
}
.managerPropertiesDivButton:hover {
color: #787878;
}

View File

@@ -0,0 +1,485 @@
addEventListener("load", function() {
movementMenu("managerDiv");
movementMenu("managerProperties");
//менеджер папок
let managerDiv = document.getElementById('managerDiv');
managerData(currentPath);
function managerFun() { //кнопки и редактируемые поля в менеджере
document.getElementById('managerCloseFun').onclick = function() {
managerDiv.style.visibility = "hidden";
};
document.getElementById('managerHistoryBackFun').onclick = function() {
if (managerHistoryIndex > 0) {
managerHistoryIndex--;
managerData(managerHistoryPaths[managerHistoryIndex]);
}
};
document.getElementById('managerHistoryForwFun').onclick = function() {
if (managerHistoryIndex < managerHistoryPaths.length - 1) {
managerHistoryIndex++;
managerData(managerHistoryPaths[managerHistoryIndex]);
}
};
document.getElementById('managerBackFun').onclick = function() {
managerData(removeLastSegment(currentPath));
};
document.getElementById('managerSettingsCopy').onclick = function() {
managerClipboard("copy", "{{copy}}");
};
document.getElementById('managerSettingsCut').onclick = function() {
managerClipboard("cut", "{{cut}}");
};
function managerClipboard(action, messageText) {
if (managerTableDivFilePath) {
createAjaxRequest({ managerClipboard: managerTableDivFilePath, action: action, handleRequestAction: "managerClipboard" }, function(data) {
if (data.message === 1) {
messageFunction("{{file}}" + messageText + " {{to clipboard}}!");
} else {
messageFunction("{{error when}}" + messageText + " {{file}}!");
}
/* managerData(currentPath); */
});
} else {
messageFunction("{{right_click_to_select_file}}");
}
}
let managerSettingsInsertId = document.getElementById('managerSettingsInsert');
managerSettingsInsertId.onclick = function() {
let title;
createAjaxRequest({ name: title, currentPath: currentPath, managerSettingsInsert: "managerSettingsInsert", handleRequestAction: "checkSameName" }, function(data) {
if (data.exists) {
messageFunction("{{file_with_same_name_exists}}");
} else {
createAjaxRequest({ managerSettingsInsert: currentPath, handleRequestAction: "managerSettingsInsert" }, function(data) {
if (data.message === 1) {
messageFunction("{{file_pasted_successfully}}");
} else {
let errorMessage = data.error ? data.error : "{{file_paste_unknown_error}}";
messageFunction("{{error}}: " + errorMessage);
}
managerData(currentPath);
});
}
});
};
let managerSettingsRenameId = document.getElementById('managerSettingsRename');
managerSettingsRenameId.onclick = function() {
if (managerTableDivFilePath) {
let invalidCharacters = /[\/\\:*?"<>|]/;
let managerTableDivFileName = managerTableDivFilePath.split(/[/\\]/).pop();
let title = prompt("{{enter_new_name}}", managerTableDivFileName);
let isFolder = !/\./.test(managerTableDivFileName);
if (title !== null) {
if (title && !invalidCharacters.test(title) && (!isFolder || !title.includes('.'))) {
if (confirm("{{rename_confirm}} " + title + "?")) {
createAjaxRequest({ name: title, currentPath: currentPath, handleRequestAction: "checkSameName" }, function(data) {
if (data.exists) {
messageFunction("{{file_with_same_name_exists}}");
} else {
createAjaxRequest({ managerSettingsRename: managerTableDivFilePath, managerNamePath: title, handleRequestAction: "managerSettingsRename" }, function(data) {
if (data.message === 1) {
messageFunction("{{rename_success}}");
} else {
messageFunction("{{rename_error}}");
}
managerData(currentPath);
});
}
});
}
} else {
messageFunction("{{invalid_name_error}}");
}
}
} else {
messageFunction("{{right_click_to_select_file}}");
}
};
let managerSettingsDeleteId = document.getElementById('managerSettingsDelete');
managerSettingsDeleteId.onclick = function() {
if (managerTableDivFilePath) {
if (confirm("{{delete_confirm}}")) {
createAjaxRequest({ managerSettingsDelete: managerTableDivFilePath, handleRequestAction: "managerSettingsDelete" }, function(data) {
if (data.message === 1) {
messageFunction("{{delete_success}}");
} else {
messageFunction("{{delete_error}}");
}
managerData(currentPath);
});
}
} else {
messageFunction("{{right_click_to_select_file}}");
}
};
document.getElementById('managerSettingsButtonCreateFolder').onclick = function() {
createManagerItem("{{folder}}", "{{enter_new_folder_name}}", "{{invalid_folder_name}}", "{{folder_created_successfully}}");
};
document.getElementById('managerSettingsButtonCreateFile').onclick = function() {
createManagerItem("{{file}}", "{{enter_new_file_name}}", "{{invalid_file_name}}", "{{file_created_successfully}}");
};
function createManagerItem(type, promptMessage, errorMessage, successMessage, nameSuffix = '') {
let title = prompt(promptMessage);
if (title !== null) {
let invalidCharacters = /[\/\\:*?"<>|]/;
let isValidTitle = title && !invalidCharacters.test(title) && !title.startsWith('.') && !title.endsWith('.');
if (type === "{{folder}}") {
isValidTitle = isValidTitle && !title.includes('.');
}
if (isValidTitle) {
title += nameSuffix;
if (confirm("{{create}} " + type + " {{with_name}} " + title + "?")) {
createAjaxRequest({ name: title, currentPath: currentPath, handleRequestAction: "checkSameName" }, function(data) {
if (data.exists) {
messageFunction("{{file_with_same_name_exists}}!");
} else {
createAjaxRequest({ managerSettingsCreate: title, managerType: type, managerNamePath: currentPath, handleRequestAction: "managerSettingsCreate", },
function (data) {
if (data.message === 0) {
messageFunction(successMessage);
} else if (data.message === "noSuccess") {
messageFunction("{{create_error}} " + type + "!");
} else if (data.message === "checkItemExists") {
messageFunction(type + " {{item_already_exists}}");
} else {
messageFunction("{{unknown_error}}");
}
managerData(currentPath);
}
);
}
});
}
} else {
messageFunction(errorMessage);
}
}
}
let managerSettingsPropertiesId = document.getElementById('managerSettingsProperties');;
managerSettingsPropertiesId.onclick = function() {
if (managerTableDivFilePath) {
createAjaxRequest({ managerSettingsProperties: managerTableDivFilePath, handleRequestAction: "managerSettingsProperties" }, function(data) {
let managerPropertiesId = document.getElementById('managerProperties');
let managerPropertiesDivId = document.getElementById('managerPropertiesDiv');
let managerPropertiesTopNameId = document.getElementById('managerPropertiesTopName');
let managerPropertiesWindowPropertiesId = document.getElementById('managerPropertiesWindowProperties');
let managerPropertiesWindowRightsId = document.getElementById('managerPropertiesWindowRights');
let tableProperties = document.createElement('table');
tableProperties.style.width = "100%";
data.forEach(item => {
let row = document.createElement('tr');
let labelCell = document.createElement('td');
let valueCell = document.createElement('td');
labelCell.className = 'managerPropertiesDivDivs';
valueCell.className = 'managerPropertiesDivDivs';
labelCell.textContent = item.label;
valueCell.textContent = item.value;
row.appendChild(labelCell);
row.appendChild(valueCell);
tableProperties.appendChild(row);
});
let tableRights = document.createElement('div');
tableRights.innerHTML= "{{no_rights_yet}}";
managerPropertiesTopNameId.textContent = "{{properties}} " + data[0].value;
managerPropertiesDivId.innerHTML = '';
managerPropertiesWindowPropertiesId.onclick = function() {
managerPropertiesDivId.innerHTML = '';
managerPropertiesDivId.appendChild(tableProperties);
managerPropertiesWindowPropertiesId.style.backgroundColor = "#f3f3f3";
managerPropertiesWindowRightsId.style.backgroundColor = "";
};
managerPropertiesWindowRightsId.onclick = function() {
managerPropertiesDivId.innerHTML = '';
managerPropertiesDivId.appendChild(tableRights);
managerPropertiesWindowPropertiesId.style.backgroundColor = "";
managerPropertiesWindowRightsId.style.backgroundColor = "#f3f3f3";
};
managerPropertiesWindowPropertiesId.click();
if (managerPropertiesId.style.visibility == 'hidden') {
managerPropertiesId.style.visibility = 'visible';
}
let managerPropertiesTopCloseId = document.getElementById('managerPropertiesTopClose');
let managerPropertiesDivButtonOkId = document.getElementById('managerPropertiesDivButtonOk');
let managerPropertiesDivButtonCancelId = document.getElementById('managerPropertiesDivButtonCancel');
managerPropertiesTopCloseId.onclick = function() {
managerPropertiesId.style.visibility = 'hidden';
};
managerPropertiesDivButtonOkId.onclick = function() {
managerPropertiesId.style.visibility = 'hidden';
};
managerPropertiesDivButtonCancelId.onclick = function() {
managerPropertiesId.style.visibility = 'hidden';
};
});
} else {
messageFunction("{{right_click_to_select_file}}");
}
};
//загрузка файла для менеджера
let managerSettingsLoadId = document.getElementById('managerSettingsLoad');
managerSettingsLoadId.onclick = function() {
let fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.addEventListener('change', function() {
createAjaxRequest({ name: fileInput.files[0].name, currentPath: currentPath, handleRequestAction: "checkSameName" }, function(data) {
if (data.exists) {
messageFunction("{{file_with_same_name_exists}}");
} else {
let formData = new FormData()
formData.append('pathFile', fileInput.files[0])
formData.append('pathLoad', currentPath)
handleJsonRpcRequest('pathLoad', formData, 1)
.then(result => {
if (result.error) {
messageFunction("{{file_with_same_name_exists}}")
} else {
messageFunction("{{file_uploaded_successfully}}")
managerData(currentPath)
}
})
.catch(e => {
console.error('Upload error:', e)
})
}
});
});
fileInput.click();
};
}
function removeLastSegment(str) { //удаление текста после последнего "/"
const segments = str.split('/');
if (segments.length > 1) {
segments.pop();
}
return segments.join('/');
}
//окно менеджера настроек
function managerSettings() {
let managerDiv = document.getElementById('managerDiv');
let managerSettingsDiv = document.getElementById('managerSettings');
managerDiv.addEventListener('contextmenu', managerSettingsClick);
touchLong(managerDiv, managerSettingsClick);
}
if (isPhone) document.getElementById('managerDiv').style.paddingBottom = "150px"
if (!isPhone) {
document.querySelectorAll('.managerSettingsButtons').forEach(btn=>{
btn.style.backgroundColor='rgba(255, 255, 255, 1)'
btn.style.borderRadius='5px'
btn.style.padding='2px'
btn.style.margin='3px'
btn.style.cursor='pointer'
btn.style.display='block'
btn.addEventListener('mouseover',()=>btn.style.color='#787878')
btn.addEventListener('mouseout',()=>btn.style.color='')
})
} else {
document.querySelectorAll('.managerSettingsButtons').forEach(btn=>{
btn.style.backgroundImage='url(../../img/pict/b_iconslyb.svg)'
btn.style.height='42px'
btn.style.minWidth='42px'
btn.style.setProperty('background-size','calc(1122px* 1.5)','important')
btn.style.display='inline-block'
btn.style.borderRadius='5px'
btn.style.cursor='pointer'
btn.style.display='flex'
btn.style.flexDirection='column'
btn.style.alignItems='center'
btn.style.fontSize='10px'
btn.style.lineHeight='1'
btn.style.justifyContent = 'flex-end'
btn.style.top='2px'
btn.style.position = 'relative'
btn.style.width = 'auto'
})
let wrap = document.getElementById('managerSettings')
wrap.style.display = 'flex'
wrap.style.maxWidth = '-webkit-fill-available'
wrap.style.overflowX = 'auto'
wrap.style.overflowY = 'hidden'
wrap.style.justifyContent = 'center'
let div = document.getElementById('managerSettingsDiv')
div.style.height = '-webkit-fill-available'
div.style.display = 'inline-flex'
div.style.whiteSpace = 'nowrap'
div.style.width = 'max-content'
div.style.gap = '7px'
div.style.alignItems = 'center'
}
function managerSettingsClick(event) {
event.preventDefault();
let managerSettingsDiv = document.getElementById('managerSettings');
if (!isPhone) {
managerSettingsDiv.style.left = `${touchX}px`;
managerSettingsDiv.style.top = `${touchY}px`;
} else {
managerSettingsDiv.style.bottom = '15px';
managerSettingsDiv.style.width = 'calc(100vw - 42px)';
managerSettingsDiv.style.height = '42px';
managerSettingsDiv.style.left = '15px';
managerSettingsDiv.style.top = 'auto';
managerSettingsDiv.style.boxShadow = 'none';
}
let ids = [
'managerSettingsCopy',
'managerSettingsCut',
'managerSettingsRename',
'managerSettingsDelete',
'managerSettingsProperties',
'managerSettingsLoad',
'managerSettingsInsert',
'managerSettingsButtonCreateFolder',
'managerSettingsButtonCreateFile'
];
ids.forEach(id => {
let el = document.getElementById(id);
if (el) {
if (el.dataset.oldDisplay === undefined) {
el.dataset.oldDisplay = getComputedStyle(el).display;
}
el.style.display = 'none';
}
});
if (event.target.closest('.managerTableDivFile')) {
['managerSettingsCopy','managerSettingsCut','managerSettingsRename','managerSettingsDelete','managerSettingsProperties']
.forEach(id => {
let el = document.getElementById(id);
el.style.display = el.dataset.oldDisplay;
});
} else {
document.getElementById('managerSettingsLoad').style.display = document.getElementById('managerSettingsLoad').dataset.oldDisplay;
createAjaxRequest(
{ checkFolderForFile: "$_SESSION['managerClipboardFile']['path']", handleRequestAction: "checkFolderForFile" },
function(data) {
if (data.message === 1) {
let el = document.getElementById('managerSettingsInsert');
el.style.display = el.dataset.oldDisplay;
}
}
);
['managerSettingsButtonCreateFolder','managerSettingsButtonCreateFile']
.forEach(id => {
let el = document.getElementById(id);
el.style.display = el.dataset.oldDisplay;
});
}
managerSettingsDiv.style.visibility = 'visible';
document.addEventListener('pointerdown', function hideMenu(e) {
if (!managerSettingsDiv.contains(e.target)) {
managerSettingsDiv.style.visibility = 'hidden';
document.removeEventListener('pointerdown', hideMenu);
}
});
}
function managerPathContext(event){
let targetElement=event.target.closest('[path]')
if(targetElement){
let pathValue=targetElement.getAttribute('path')
managerTableDivFilePath=pathValue
}
}
document.addEventListener('contextmenu',managerPathContext)
touchLong(document, managerPathContext)
/* функция сохранение файла через сохронить как */
function saveHow() {
let currentPathHow = currentPath;
if (currentPathHow.startsWith('/')) {
currentPathHow = currentPathHow.slice(1);
}
if (!currentPathHow.endsWith('/')) {
currentPathHow += '/';
}
window.saveContentIdHow(currentPathHow);
}
/* функции открытие страницы */
function openPageBut() {
if (openPageButPath != "no/Select") {
openPage(openPageButPath);
} else {
messageFunction('{{select_file_ending_with_page_php}}');
}
}
/* функции выбора страницы */
function propertiesUrlFun() {
let saveHowNameValue = document.getElementById('saveHowName').value;
if (!saveHowNameValue.includes('.page.php')) return;
let newValue = saveHowNameValue.replace(/\.page\.php/, "");
let cp = currentPath;
if (cp.charAt(0) === "/") {
cp = cp.substring(1);
}
document.getElementById('treePropertiesDivUrlValue').innerHTML = cp + "/" + newValue;
window.managerDataAction = "";
managerDiv.style.visibility = "hidden";
}
/* функции выбора страницы */
function selectImgFormButFun() {
var rawPath = document.getElementById('managerPath').textContent;
var cleanPath = rawPath.trim().replace(/\s*\/\s*/g, '/').replace(/\s+/g, '');
var fileName = document.getElementById('saveHowName').value.trim();
var fullPath = cleanPath + fileName;
if (fullPath.startsWith('/')) {
fullPath = fullPath.slice(1);
}
var img = document.createElement("img");
img.src = fullPath;
img.setAttribute("style", "float: left; margin: 10px; width: 250px; border: 0px solid rgb(0, 0, 0); overflow: hidden;");
var sel = window.getSelection();
if (sel.rangeCount) {
var range = sel.getRangeAt(0);
range.deleteContents();
range.insertNode(img);
}
window.managerDataAction = "";
managerDiv.style.visibility = "hidden";
}
window.managerSettings = managerSettings;
window.managerFun = managerFun;
window.saveHow = saveHow;
window.openPageBut = openPageBut;
window.propertiesUrlFun = propertiesUrlFun;
window.selectImgFormButFun = selectImgFormButFun;
});/* начало */

View File

@@ -0,0 +1,33 @@
<div id="managerDiv" style="visibility: hidden; top: 20%; left: 50%; transform: translate(-50%, -20%);">
</div>
<div id="managerSettings" style="visibility: hidden; top: 0px; left: 0px;">
<div id="managerSettingsDiv">
<span id="managerSettingsCopy" class="managerSettingsButtons" style="background-position: -890px -840px;">{{copy}}</span>
<span id="managerSettingsCut" class="managerSettingsButtons" style="background-position: -1372px -419px;">{{cut}}</span>
<span id="managerSettingsRename" class="managerSettingsButtons" style="background-position: -96px -359px;">{{rename}}</span>
<span id="managerSettingsDelete" class="managerSettingsButtons" style="background-position: -654px -1018px;">{{delete}}</span>
<span id="managerSettingsProperties" class="managerSettingsButtons" style="background-position: -1195px -1076px;">{{properties}}</span>
<span id="managerSettingsLoad" class="managerSettingsButtons" style="background-position: -1059px -2px;">{{upload_file}}</span>
<span id="managerSettingsInsert" class="managerSettingsButtons" style="background-position: -1435px -419px;">{{paste}}</span>
<span id="managerSettingsButtonCreateFile" class="managerSettingsButtons" style="background-position: -642px -839px;">{{create_file}}</span>
<span id="managerSettingsButtonCreateFolder" class="managerSettingsButtons" style="background-position: -1121px -840px;">{{create_folder}}</span>
</div>
</div>
<div id="managerProperties" style="visibility: hidden; top: 20%; left: 50%; transform: translate(-50%, -20%);">
<div id="managerPropertiesTop">
<span id="managerPropertiesTopName" class="managerPropertiesTop"></span>
<span id="managerPropertiesTopClose" class="editib"></span>
</div>
<div id="managerPropertiesMiddle">
<div id="managerPropertiesWindow">
<span id="managerPropertiesWindowProperties" class="managerPropertiesWindowDiv">{{properties}}</span>
<span id="managerPropertiesWindowRights" class="managerPropertiesWindowDiv">{{rights}}</span>
</div>
<div id="managerPropertiesDiv">
</div>
<div id="managerPropertiesDivButtons">
<div id="managerPropertiesDivButtonOk" class="managerPropertiesDivButton">{{ok}}</div>
<div id="managerPropertiesDivButtonCancel" class="managerPropertiesDivButton">{{cancel}}</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,18 @@
<?php
global $path, $_SESSION, $configAdmins;
$lang = include $path . 'main_plugin/manager/lang.php';
$lng = $_SESSION['lng'] ?? 'en';
if (in_array($_SESSION['username'], $configAdmins, true)) {
include_once $path . 'main_plugin/manager/func.manager.php';
$Html = file_get_contents($path . 'main_plugin/manager/manager.php');
foreach ($lang[$lng] as $key => $value) {
$Html = str_replace('{{' . $key . '}}', $value, $Html);
}
echo $Html;
echo '<link rel="stylesheet" href="/main_plugin/manager/manager.css">';
echo '<script type="text/javascript" src="/main_plugin/manager/lang.js.php?lng=' . $lng . '"></script>';
}
?>