Добавляем все файлы
This commit is contained in:
203
main_plugin/site_tree/func.site_tree.php
Executable file
203
main_plugin/site_tree/func.site_tree.php
Executable file
@@ -0,0 +1,203 @@
|
||||
<?php
|
||||
/**
|
||||
* @file func.site_tree.php
|
||||
* @brief Функции для работы с деревом сайта: получение, сохранение и обработка структуры, а также получение списка папок
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Получает структуру дерева сайта из XML-файла для текущего языка
|
||||
* @param array $params Не используется, но требуется для совместимости
|
||||
* @return array Массив с элементами дерева сайта, включая дочерние элементы и атрибуты
|
||||
* @throws Exception Если не удалось прочитать или разобрать XML-файл, или структура не сгенерирована
|
||||
*/
|
||||
function getSiteTree($params) {
|
||||
global $path, $_SESSION;
|
||||
|
||||
$file = $path . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'filepath.' . $_SESSION['lng'] . '.php';
|
||||
$content = file_get_contents($file);
|
||||
$xml = simplexml_load_string($content);
|
||||
if (!$xml) {
|
||||
throw new Exception("Problem with file", -32004);
|
||||
}
|
||||
|
||||
function generateArray($xml, $urlParts = []) {
|
||||
$result = [];
|
||||
$anyOpen = false;
|
||||
|
||||
foreach ($xml->children() as $child) {
|
||||
$item = [
|
||||
'name' => (string) $child->attributes()->name,
|
||||
'tag' => $child->getName(),
|
||||
'children' => generateArray($child, $urlParts),
|
||||
'isOpen' => false,
|
||||
|
||||
'url' => (string) $child->attributes()->url,
|
||||
'title' => (string) $child->attributes()->title,
|
||||
'template' => (string) $child->attributes()->template,
|
||||
'PageMenu' => (string) $child->attributes()->PageMenu,
|
||||
'users' => (string) $child->attributes()->users,
|
||||
'group' => (string) $child->attributes()->group,
|
||||
'news' => (string) $child->attributes()->news,
|
||||
'plugins' => (string) $child->attributes()->plugins,
|
||||
|
||||
'content' => (string)$child
|
||||
];
|
||||
|
||||
if (!empty($urlParts) && $urlParts[0] == $item['tag']) {
|
||||
array_shift($urlParts);
|
||||
if (empty($urlParts)) {
|
||||
if ($item['tag'] !== 'index') {
|
||||
$item['isOpen'] = true;
|
||||
$anyOpen = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($item['children'] as $childItem) {
|
||||
if (!empty($childItem['isOpen'])) {
|
||||
$item['isOpen'] = true;
|
||||
$anyOpen = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$result[] = $item;
|
||||
}
|
||||
|
||||
if (!$anyOpen) {
|
||||
foreach ($result as &$item) {
|
||||
if ($item['tag'] === 'index') {
|
||||
$item['isOpen'] = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
foreach ($result as &$item) {
|
||||
if ($item['tag'] === 'index') {
|
||||
$item['isOpen'] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
$url = $_SERVER['REQUEST_URI'];
|
||||
$urlParts = array_filter(explode('/', trim($url, '/')));
|
||||
$urlParts = array_map(function($part) {
|
||||
return pathinfo($part, PATHINFO_FILENAME);
|
||||
}, $urlParts);
|
||||
|
||||
$result = generateArray($xml, $urlParts);
|
||||
if (!is_array($result)) {
|
||||
throw new Exception("Failed to generate structure", -32003);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Сохраняет структуру дерева сайта в XML-файл для текущего языка
|
||||
* @param array $params Массив с ключом 'data', содержащий структуру сайта
|
||||
* @return string "true" при успешном сохранении
|
||||
* @throws Exception Если не удалось сохранить файл или файл пустой
|
||||
*/
|
||||
function saveSiteTree($params) {
|
||||
global $path, $_SESSION;
|
||||
|
||||
$file = $path . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR . 'filepath.' . $_SESSION['lng'] . '.php';
|
||||
|
||||
$treeData = isset($params['data']) ? $params['data'] : [];
|
||||
$siteName = isset($treeData['sitename']) ? htmlspecialchars($treeData['sitename'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '';
|
||||
$slogan = isset($treeData['slogan']) ? htmlspecialchars($treeData['slogan'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '';
|
||||
|
||||
$xmlContent = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n".
|
||||
"<site>\n".
|
||||
" <sitename>$siteName</sitename>\n".
|
||||
" <slogan>$slogan</slogan>\n".
|
||||
buildSiteTreeXml($treeData['children']).
|
||||
"</site>\n";
|
||||
|
||||
$ok = file_put_contents($file, $xmlContent);
|
||||
|
||||
if ($ok === false || !is_file($file) || !filesize($file)) {
|
||||
throw new Exception("Failed to save file", -32004);
|
||||
}
|
||||
|
||||
return 'true';
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Рекурсивно строит XML для структуры сайта
|
||||
* @param array $data Массив с элементами дерева сайта
|
||||
* @param int $level Уровень вложенности для отступов
|
||||
* @return string Строка XML, представляющая элементы дерева
|
||||
*/
|
||||
function buildSiteTreeXml($data, $level = 1) {
|
||||
$xml = "";
|
||||
foreach ($data as $item) {
|
||||
if (!isset($item['name']) || empty($item['name'])) continue;
|
||||
|
||||
$tag = htmlspecialchars(trim(explode(' ', $item['name'])[0]), ENT_XML1 | ENT_QUOTES, 'UTF-8');
|
||||
$nameAttr = htmlspecialchars(trim($tag), ENT_XML1 | ENT_QUOTES, 'UTF-8');
|
||||
|
||||
$attributes = [
|
||||
'url' => isset($item['url']) ? htmlspecialchars($item['url'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
|
||||
'title' => isset($item['title']) ? htmlspecialchars($item['title'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
|
||||
'name' => $nameAttr,
|
||||
'template' => isset($item['template']) ? htmlspecialchars($item['template'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
|
||||
'PageMenu' => isset($item['PageMenu']) ? htmlspecialchars($item['PageMenu'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
|
||||
'users' => isset($item['users']) ? htmlspecialchars($item['users'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
|
||||
'group' => isset($item['group']) ? htmlspecialchars($item['group'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
|
||||
'news' => isset($item['news']) ? htmlspecialchars($item['news'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : '',
|
||||
'plugins' => isset($item['plugins']) ? htmlspecialchars($item['plugins'], ENT_XML1 | ENT_QUOTES, 'UTF-8') : ''
|
||||
];
|
||||
|
||||
$attrString = "";
|
||||
foreach ($attributes as $key => $value) {
|
||||
$attrString .= " $key='$value'";
|
||||
}
|
||||
|
||||
$xml .= str_repeat(" ", $level) . "<$tag$attrString>\n";
|
||||
if (!empty($item['children'])) {
|
||||
$xml .= buildSiteTreeXml($item['children'], $level + 1);
|
||||
}
|
||||
$xml .= str_repeat(" ", $level) . "</$tag>\n";
|
||||
}
|
||||
return $xml;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Получает список папок внутри указанной директории
|
||||
* @param array $params Массив с ключом 'folder', указывающим путь к директории
|
||||
* @return array Массив с именами папок
|
||||
* @throws Exception Если директория недействительна или невозможно прочитать содержимое
|
||||
*/
|
||||
function getFolders($params) {
|
||||
global $path;
|
||||
$folder = $path . DIRECTORY_SEPARATOR . $params['folder'];
|
||||
$folders = [];
|
||||
$ok = true;
|
||||
|
||||
if (!is_dir($folder)) {
|
||||
$ok = false;
|
||||
} else {
|
||||
$files = scandir($folder);
|
||||
if ($files === false) {
|
||||
$ok = false;
|
||||
} else {
|
||||
foreach ($files as $file) {
|
||||
if ($file != '.' && $file != '..' && is_dir($folder . DIRECTORY_SEPARATOR . $file)) {
|
||||
$folders[] = $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$ok) {
|
||||
throw new Exception("Failed to read folder list", -32004);
|
||||
}
|
||||
return $folders;
|
||||
}
|
||||
|
||||
?>
|
||||
21
main_plugin/site_tree/lang.js.php
Executable file
21
main_plugin/site_tree/lang.js.php
Executable file
@@ -0,0 +1,21 @@
|
||||
<?php
|
||||
/**
|
||||
* @file lang.js.php
|
||||
* @brief Подготавливает языковые строки и подставляет их в JS-файл плагина site_tree
|
||||
*/
|
||||
|
||||
/** @brief Языковой массив для site_tree */
|
||||
$lang = include $path . 'lang.php';
|
||||
|
||||
/** @brief Текущий язык пользователя, по умолчанию 'en' */
|
||||
$lng = $_GET['lng'] ?? ($_SESSION['lng'] ?? 'en');
|
||||
|
||||
/** @brief Массив подстановок для шаблона JS */
|
||||
$placeholders = [];
|
||||
|
||||
foreach ($lang[$lng] as $key => $value) {
|
||||
$placeholders['{{' . $key . '}}'] = $value;
|
||||
}
|
||||
|
||||
$js = strtr(file_get_contents($path . 'site_tree.js'), $placeholders);
|
||||
echo "window.site_treeJs = (function() {\n" . $js . "\n})();";
|
||||
83
main_plugin/site_tree/lang.php
Executable file
83
main_plugin/site_tree/lang.php
Executable file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
$lang = [
|
||||
'ru' => [
|
||||
'tree_site_title' => 'Дерево сайта',
|
||||
'save' => 'Сохранить',
|
||||
'add' => 'Добавить',
|
||||
'paste' => 'Вставить',
|
||||
'copy' => 'Копировать',
|
||||
'rename' => 'Переименовать',
|
||||
'properties' => 'Свойства',
|
||||
'delete' => 'Удалить',
|
||||
'choose' => 'Выбрать',
|
||||
'enter_new_name' => 'Введите новое имя',
|
||||
'name_only_english_letters' => 'Имя должно содержать только английские буквы без пробелов и символов.',
|
||||
'no_item_selected' => 'Нет выбранного элемента.',
|
||||
'delete_all_subpages' => 'Удалить все подстраницы страницы',
|
||||
'save_new_page' => 'Сохраните новую страницу!',
|
||||
'enter_tag_for_new_page' => 'Введите тег для новой страницы:',
|
||||
'tag_only_english_letters' => 'Тег должен содержать только английские буквы без пробелов и символов.',
|
||||
'tag_already_exists' => 'Элемент с таким тегом уже существует.',
|
||||
'select_page_for_link' => 'Выбор страницы для ссылки',
|
||||
'rights' => 'Права',
|
||||
'ok' => 'ОК',
|
||||
'cancel' => 'Отмена',
|
||||
'select' => 'Выбрать',
|
||||
'no_rights' => 'Прав пока что нету',
|
||||
'properties' => 'Свойства',
|
||||
],
|
||||
'en' => [
|
||||
'tree_site_title' => 'Site Tree',
|
||||
'save' => 'Save',
|
||||
'add' => 'Add',
|
||||
'paste' => 'Paste',
|
||||
'copy' => 'Copy',
|
||||
'rename' => 'Rename',
|
||||
'properties' => 'Properties',
|
||||
'delete' => 'Delete',
|
||||
'choose' => 'Choose',
|
||||
'enter_new_name' => 'Enter new name',
|
||||
'name_only_english_letters' => 'Name must contain only English letters without spaces and symbols.',
|
||||
'no_item_selected' => 'No item selected.',
|
||||
'delete_all_subpages' => 'Delete all subpages of the page',
|
||||
'save_new_page' => 'Save the new page!',
|
||||
'enter_tag_for_new_page' => 'Enter tag for the new page:',
|
||||
'tag_only_english_letters' => 'Tag must contain only English letters without spaces and symbols.',
|
||||
'tag_already_exists' => 'An element with this tag already exists.',
|
||||
'select_page_for_link' => 'Select page for the link',
|
||||
'rights' => 'Rights',
|
||||
'ok' => 'OK',
|
||||
'cancel' => 'Cancel',
|
||||
'select' => 'Select',
|
||||
'no_rights' => 'No rights yet',
|
||||
'properties' => 'Properties',
|
||||
],
|
||||
'lv' => [
|
||||
'tree_site_title' => 'Saites koks',
|
||||
'save' => 'Saglabāt',
|
||||
'add' => 'Pievienot',
|
||||
'paste' => 'Ielīmēt',
|
||||
'copy' => 'Kopēt',
|
||||
'rename' => 'Pārdēvēt',
|
||||
'properties' => 'Īpašības',
|
||||
'delete' => 'Dzēst',
|
||||
'choose' => 'Izvēlēties',
|
||||
'enter_new_name' => 'Ievadiet jaunu nosaukumu',
|
||||
'name_only_english_letters' => 'Nosaukumam jābūt tikai angļu burtiem bez atstarpēm un simboliem.',
|
||||
'no_item_selected' => 'Nav izvēlēts neviens elements.',
|
||||
'delete_all_subpages' => 'Dzēst visas apakšlapas',
|
||||
'save_new_page' => 'Saglabājiet jauno lapu!',
|
||||
'enter_tag_for_new_page' => 'Ievadiet taga nosaukumu jaunai lapai:',
|
||||
'tag_only_english_letters' => 'Tagam jābūt tikai angļu burtiem bez atstarpēm un simboliem.',
|
||||
'tag_already_exists' => 'Tādā pašā tagā jau pastāv elements.',
|
||||
'select_page_for_link' => 'Izvēlieties lapu saitei',
|
||||
'rights' => 'Tiesības',
|
||||
'ok' => 'Labi',
|
||||
'cancel' => 'Atcelt',
|
||||
'select' => 'Izvēlēties',
|
||||
'no_rights' => 'Nav tiesību vēl',
|
||||
'properties' => 'Īpašības',
|
||||
],
|
||||
];
|
||||
|
||||
return $lang;
|
||||
28
main_plugin/site_tree/plug.php
Executable file
28
main_plugin/site_tree/plug.php
Executable file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
/**
|
||||
* @file plug.php
|
||||
* @brief Подключает плагин site_tree для администраторов, подставляет языковые строки и выводит HTML-код дерева сайта
|
||||
*/
|
||||
|
||||
global $path, $_SESSION, $configAdmins;
|
||||
|
||||
/** @brief Языковой массив для плагина site_tree */
|
||||
$lang = include $path . 'main_plugin/site_tree/lang.php';
|
||||
|
||||
/** @brief Текущий язык пользователя, по умолчанию 'en' */
|
||||
$lng = $_SESSION['lng'] ?? 'en';
|
||||
|
||||
if (in_array($_SESSION['username'], $configAdmins, true)) {
|
||||
include_once $path . 'main_plugin/site_tree/func.site_tree.php';
|
||||
|
||||
$Html = file_get_contents($path . 'main_plugin/site_tree/site_tree.php');
|
||||
foreach ($lang[$lng] as $key => $value) {
|
||||
$Html = str_replace('{{' . $key . '}}', $value, $Html);
|
||||
}
|
||||
|
||||
echo $Html;
|
||||
|
||||
echo '<link rel="stylesheet" type="text/css" href="/main_plugin/site_tree/site_tree.css">';
|
||||
echo '<script type="text/javascript" src="/main_plugin/site_tree/lang.js.php?lng=' . $lng . '"></script>';
|
||||
}
|
||||
?>
|
||||
213
main_plugin/site_tree/site_tree.css
Executable file
213
main_plugin/site_tree/site_tree.css
Executable file
@@ -0,0 +1,213 @@
|
||||
/* основной div */
|
||||
#treeDiv {
|
||||
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;
|
||||
}
|
||||
|
||||
/* верхний див */
|
||||
#treeTop {
|
||||
text-align: center;
|
||||
border-bottom: 1px #40464d solid;
|
||||
padding: 5px;
|
||||
background-color: rgba(255, 255, 255, 0.6);
|
||||
}
|
||||
#treeTopTitle {
|
||||
text-align: center;
|
||||
}
|
||||
#treeCloseFun {
|
||||
float: right;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background-position: -159px -121px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* основное древо сайта */
|
||||
|
||||
#treeTableDiv {
|
||||
top: 36px;
|
||||
height: 480px;
|
||||
position: relative;
|
||||
margin: 0px 20px 0px 20px;
|
||||
border: 1px #40464d solid;
|
||||
overflow-y: overlay;
|
||||
border-radius: 5px;
|
||||
width: calc(100% - 40px);
|
||||
}
|
||||
|
||||
li.has-children::marker {
|
||||
content: "► ";
|
||||
}
|
||||
li.has-children.open::marker {
|
||||
content: "▼ ";
|
||||
}
|
||||
li.no-children::marker {
|
||||
content: "□ ";
|
||||
}
|
||||
|
||||
/* окно страницы */
|
||||
|
||||
.tree-details {
|
||||
display: none;
|
||||
background: white;
|
||||
border: 1px solid black;
|
||||
padding: 3px;
|
||||
margin: 3px 0px 10px 0px;
|
||||
z-index: 10;
|
||||
position: relative;
|
||||
width: max-content;
|
||||
}
|
||||
.tree-details div {
|
||||
margin: 3px;
|
||||
}
|
||||
|
||||
/* окно настроек */
|
||||
#treeSettings {
|
||||
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;
|
||||
}
|
||||
|
||||
.treeSettingsButtons {
|
||||
background-color: rgba(255, 255, 255, 1);
|
||||
border-radius: 5px;
|
||||
padding: 2px;
|
||||
margin: 3px;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
}
|
||||
.treeSettingsButtons:hover {
|
||||
color: #787878;
|
||||
}
|
||||
|
||||
#treeSettingsSave {
|
||||
border: 1px #40464d solid;
|
||||
border-radius: 5px;
|
||||
padding: 5px;
|
||||
margin: 44px 20px 0px 10px;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
width: 91px;
|
||||
float: right;
|
||||
}
|
||||
#treeSettingsSave:hover {
|
||||
color: #787878;
|
||||
}
|
||||
|
||||
/* окно свойств */
|
||||
#treeProperties {
|
||||
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;
|
||||
max-width: calc(100% - 20px);
|
||||
}
|
||||
#treePropertiesMiddle {
|
||||
margin: 0px 20px 0px 20px;
|
||||
}
|
||||
|
||||
#treePropertiesTop {
|
||||
border-bottom: 1px solid #000000;
|
||||
padding: 5px;
|
||||
text-align: center;
|
||||
}
|
||||
#treePropertiesTopName {
|
||||
text-align: center;
|
||||
}
|
||||
#treePropertiesTopClose {
|
||||
float: right;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background-position: -159px -121px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#treePropertiesWindow {
|
||||
text-align: center;
|
||||
display: flex;
|
||||
}
|
||||
.treePropertiesWindowDiv {
|
||||
cursor: pointer;
|
||||
text-align: center;
|
||||
width: 50%;
|
||||
display: inline-block;
|
||||
padding: 9px;
|
||||
}
|
||||
.treePropertiesWindowDiv:hover {
|
||||
color: #787878;
|
||||
}
|
||||
|
||||
#treePropertiesDiv {
|
||||
border: 1px solid #000000;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.treePropertiesDivDivs {
|
||||
padding: 6px 8px 6px 8px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
#treePropertiesDivButtons {
|
||||
padding: 9px;
|
||||
display: flex;
|
||||
justify-content: right;
|
||||
align-items: center;
|
||||
}
|
||||
#treePropertiesDivButtons {
|
||||
text-align: center;
|
||||
}
|
||||
.treePropertiesDivButton {
|
||||
margin: 3px 3px 3px 15px;
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
}
|
||||
.treePropertiesDivButton:hover {
|
||||
color: #787878;
|
||||
}
|
||||
|
||||
.editib {
|
||||
background-image: url(../../img/pict/b_iconslyb.svg);
|
||||
}
|
||||
|
||||
.editimc {
|
||||
background-image: url(../../img/pict/mc_iconslyb.svg);
|
||||
}
|
||||
|
||||
.editib:hover {
|
||||
background-image: url(../../img/pict/g_iconslyb.svg);
|
||||
}
|
||||
|
||||
.editimc:hover {
|
||||
background-image: url(../../img/pict/g_iconslyb.svg);
|
||||
}
|
||||
|
||||
.editf.active {
|
||||
background-image: url(../../img/pict/b_iconslyb.svg);
|
||||
background-color: #e7e7e7;
|
||||
}
|
||||
.editf.active:hover {
|
||||
background-image: url(../../img/pict/g_iconslyb.svg);
|
||||
background-color: #e7e7e7;
|
||||
}
|
||||
1025
main_plugin/site_tree/site_tree.js
Executable file
1025
main_plugin/site_tree/site_tree.js
Executable file
File diff suppressed because it is too large
Load Diff
49
main_plugin/site_tree/site_tree.php
Executable file
49
main_plugin/site_tree/site_tree.php
Executable file
@@ -0,0 +1,49 @@
|
||||
<?php
|
||||
/**
|
||||
* @file site_tree.php
|
||||
* @brief Контейнеры и элементы дерева сайта: основное дерево, панель настроек узлов, свойства узлов с кнопками действий
|
||||
*/
|
||||
?>
|
||||
|
||||
<?php /** @brief Основной контейнер дерева сайта */ $treeDiv; ?>
|
||||
<div id="treeDiv" style="visibility: hidden; top: 20%; left: 50%; transform: translate(-50%, -20%);">
|
||||
<div id="treeTop">
|
||||
<span id="treeTopTitle">{{tree_site_title}}</span>
|
||||
<span id="treeCloseFun" class="editib"></span>
|
||||
</div>
|
||||
<div id="treeTableDiv"></div>
|
||||
<span id="treeSettingsSave">{{save}}</span>
|
||||
</div>
|
||||
|
||||
<?php /** @brief Панель настроек элементов дерева */ $treeSettings; ?>
|
||||
<div id="treeSettings" style="visibility: hidden; top: 0px; left: 0px;">
|
||||
<div id="treeSettingsDiv">
|
||||
<span id="treeSettingsAdd" class="treeSettingsButtons">{{add}}</span>
|
||||
<span id="treeSettingsPaste" class="treeSettingsButtons">{{paste}}</span>
|
||||
<span id="treeSettingsCopy" class="treeSettingsButtons">{{copy}}</span>
|
||||
<span id="treeSettingsRename" class="treeSettingsButtons">{{rename}}</span>
|
||||
<span id="treeSettingsProperties" class="treeSettingsButtons">{{properties}}</span>
|
||||
<span id="treeSettingsDelete" class="treeSettingsButtons">{{delete}}</span>
|
||||
<span id="treeSettingsChoose" class="treeSettingsButtons">{{choose}}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<?php /** @brief Панель свойств выбранного узла дерева с кнопками подтверждения */ $treeProperties; ?>
|
||||
<div id="treeProperties" style="visibility: hidden; top: 20%; left: 50%; transform: translate(-50%, -20%);">
|
||||
<div id="treePropertiesTop">
|
||||
<span id="treePropertiesTopName" class="treePropertiesTop"></span>
|
||||
<span id="treePropertiesTopClose" class="editib"></span>
|
||||
</div>
|
||||
<div id="treePropertiesMiddle">
|
||||
<div id="treePropertiesWindow">
|
||||
<span id="treePropertiesWindowProperties" class="treePropertiesWindowDiv">{{properties}}</span>
|
||||
<span id="treePropertiesWindowRights" class="treePropertiesWindowDiv">{{rights}}</span>
|
||||
</div>
|
||||
<div id="treePropertiesDiv">
|
||||
</div>
|
||||
<div id="treePropertiesDivButtons">
|
||||
<div id="treePropertiesDivButtonOk" class="treePropertiesDivButton">{{ok}}</div>
|
||||
<div id="treePropertiesDivButtonCancel" class="treePropertiesDivButton">{{cancel}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user