123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- let MenuEditor = (function() {
- let public = {};
- /**
- * ID редактироуемого элемента
- */
- let __EditItemID = -1;
- let __Elements = {
- /**
- * @type {HTMLDivElement}
- */
- ButtonMenuAdd: undefined,
- /**
- * @type {HTMLDivElement}
- */
- ButtonMenuTopAdd: undefined,
- /**
- * @type {HTMLDivElement}
- */
- ButtonMenuEdit: undefined,
- /**
- * @type {HTMLDivElement}
- */
- ButtonMenuTopEdit: undefined,
- };
- let __CurrentCategory = undefined;
- __Elements.ButtonMenuAdd = document.querySelector("#CreateMainMenuItem");
- if (!__Elements.ButtonMenuAdd) {
- Messenger.Show("Некоторые элементы не были найдены");
- return undefined;
- }
- __Elements.ButtonMenuAdd.onclick = addItemModal.bind(__Elements.ButtonMenuAdd, MENU_CATEGORY.MAIN);
- __Elements.ButtonMenuTopAdd = document.querySelector("#CreateTopMenuItem");
- if (!__Elements.ButtonMenuTopAdd) {
- Messenger.Show("Некоторые элементы не были найдены");
- return undefined;
- }
- __Elements.ButtonMenuTopAdd.onclick = addItemModal.bind(__Elements.ButtonMenuTopAdd, MENU_CATEGORY.TOP);
- __Elements.ButtonMenuEdit = document.querySelector("#EditMainMenuItem");
- if (!__Elements.ButtonMenuEdit) {
- Messenger.Show("Некоторые элементы не были найдены");
- return undefined;
- }
- __Elements.ButtonMenuEdit.onclick = addControls.bind(__Elements.ButtonMenuEdit, MENU_CATEGORY.MAIN);
- __Elements.ButtonMenuTopEdit = document.querySelector("#EditTopMenuItem");
- if (!__Elements.ButtonMenuTopEdit) {
- Messenger.Show("Некоторые элементы не были найдены");
- return undefined;
- }
- __Elements.ButtonMenuTopEdit.onclick = addControls.bind(__Elements.ButtonMenuTopEdit, MENU_CATEGORY.TOP);
- function getMenu() {
- XHR.POST(replaceMenu, "/menu-get");
- }
- function replaceMenu(result) {
- if (result && "Menu" in result) {
- Main.ReplaceMenu(result.Menu);
- } else {
- Messenger.Show("Обновленное меню не было получено :(");
- }
- }
- function addItem() {
- /**
- * @type {HTMLDivElement}
- */
- let tree = document.querySelector("#NewItemParent");
- /**
- * @type {HTMLInputElement}
- */
- let caption = document.querySelector("#NewItemCaption");
- /**
- * @type {HTMLInputElement}
- */
- let link = document.querySelector("#NewItemLink");
- let isLink = document.querySelector("#NewItemIsLink");
- if (!caption || !link || !isLink || !tree) {
- Messenger.Show("Необходимые элементы не были найдены. Перезагрузите страницу и повторите попытку");
- return;
- }
- if (caption.value.length < 2) {
- Messenger.Show("Некорректный заголовок");
- return;
- }
- if (isLink.checked) {
- if (link.value.length < 1) {
- Messenger.Show("Некорректная ссылка");
- return;
- }
- }
- let parent = tree.querySelector(".branch.selected");
- if (parent) {
- parent = {
- Int32: (parent.dataset.id * 1),
- Valid: true,
- };
- } else {
- parent = {
- Valid: false,
- Int32: 0,
- }
- }
- let data = {
- Parent: parent,
- Caption: caption.value,
- Link: {
- Valid: isLink.checked,
- String: link.value,
- },
- };
- XHR.POST(
- function (result) {
- if (result && "Error" in result && result.Error) {
- Messenger.Show(result.Error);
- } else {
- Messenger.Show("Пункт меню был успешно добавлен");
- getMenu();
- }
- },
- "/menu-insert-item/"+__CurrentCategory,
- data
- );
- this.closest(".modal").querySelector(".close").click();
- }
- function editItem() {
- /**
- * @type {HTMLInputElement}
- */
- let caption = document.querySelector("#EditItemCaption");
- /**
- * @type {HTMLInputElement}
- */
- let link = document.querySelector("#EditItemLink");
- let isLink = document.querySelector("#EditItemIsLink");
- if (!caption || !link || !isLink) {
- Messenger.Show("Необходимые элементы не были найдены. Перезагрузите страницу и повторите попытку");
- return;
- }
- if (caption.value.length < 2) {
- Messenger.Show("Некорректный заголовок");
- return;
- }
- if (isLink.checked) {
- if (link.value.length < 2) {
- Messenger.Show("Некорректная ссылка");
- return;
- }
- }
- let data = {
- ID: __EditItemID,
- Caption: caption.value,
- Link: {
- Valid: isLink.checked,
- String: link.value,
- },
- };
- XHR.POST(
- function (result) {
- if (result && "Error" in result && result.Error) {
- Messenger.Show(result.Error);
- } else {
- Messenger.Show("Пункт меню был успешно изменён");
- caption.value = "";
- link.value = "";
- isLink.checked = false;
- getMenu();
- }
- },
- "/menu-update-item",
- data
- );
- this.closest(".modal").querySelector(".close").click();
- }
- function deleteItem(event) {
- let data = { ID: __EditItemID };
- XHR.POST(
- function (result) {
- if (result && "Error" in result && result.Error) {
- Messenger.Show(result.Error);
- } else {
- Messenger.Show("Пункт меню был успешно удалён");
- getMenu();
- }
- },
- "/menu-delete-item",
- data
- );
- this.closest(".modal").querySelector(".close").click();
- }
- /**
- * Добавить элементы управления (редактировать, удалить) на каждый пункт меню
- */
- function addControls(category) {
- __CurrentCategory = category;
- let query = "";
- if (__CurrentCategory === MENU_CATEGORY.MAIN) {
- query = ".menu .text[data-id]";
- } else {
- if (__CurrentCategory === MENU_CATEGORY.TOP) {
- query = "nav .text[data-id]";
- } else {
- return;
- }
- }
- let items = document.querySelectorAll(query);
- for (const item of items) {
- let edit = document.createElement("i"),
- textContent = document.createElement("span");
- textContent.textContent = item.textContent;
- item.textContent = null;
- edit.className = "fas fa-pen";
- edit.onclick = editItemModal;
- item.append(textContent, edit);
- }
- }
- /**
- * Открыть окно для редактирования пункта меню
- *
- * @param {MouseEvent} event
- */
- function editItemModal(event) {
- event.stopPropagation();
- event.preventDefault();
- let body = document.createElement("div"),
- inputCaption = document.createElement("input"),
- inputLink = document.createElement("input"),
- button = document.createElement("button"),
- buttonDel = document.createElement("button"),
- buttonGroup = document.createElement("div"),
- inputCheckbox = Controls.CreateCheckbox("Сделать ссылкой?", "EditItemIsLink", null, toggleIsLink),
- inputCheckboxActive = Controls.CreateCheckbox("Активный пункт?", "EditItemIsActive", null, toggleIsActive);
- let item = this.parentElement;
- item.classList.add("edit");
- __EditItemID = item.dataset.id * 1;
- inputCaption.type = "text";
- inputCaption.placeholder = "Заголовок пункта";
- inputCaption.id = "EditItemCaption";
- inputCaption.value = item.firstChild.textContent;
- inputLink.type = "text";
- inputLink.placeholder = "Ссылка на материал или внешний URL";
- inputLink.id = "EditItemLink";
- if (item.dataset.link) {
- if (item.dataset.link == "none") {
- inputLink.disabled = true;
- } else {
- inputCheckbox.querySelector("input").checked = true;
- if (item.dataset.link == "url") {
- inputLink.value = item.href;
- } else {
- inputLink.value = item.dataset.link;
- }
- }
- }
- if (item.parentElement.matches(".hide")) {
- inputCheckboxActive.querySelector("input").checked = false;
- } else {
- inputCheckboxActive.querySelector("input").checked = true;
- }
- button.onclick = editItem;
- button.textContent = "Изменить";
- buttonDel.onclick = deleteItem;
- buttonDel.textContent = "Удалить";
- buttonGroup.append(button, buttonDel);
- buttonGroup.className = "button-group";
- body.append(inputCaption, inputCheckboxActive, inputCheckbox, inputLink, buttonGroup);
- Modal.Create("Редактировать пункт в меню", body, cancelEdit);
- }
- function cancelEdit() {
- if (__EditItemID > -1) {
- let editableItem = document.querySelector(`.text[data-id="${__EditItemID}"`);
- if (editableItem) {
- editableItem.classList.remove("edit");
- }
- __EditItemID = -1;
- }
- }
- /**
- * Создать мадальное окно с указанным типом
- *
- * @param {MENU_CATEGORY} category категория меню
- */
- function addItemModal(category) {
- __CurrentCategory = category;
- let body = document.createElement("div"),
- menuTreeLabel = document.createElement("label"),
- menuTree = document.createElement("div"),
- inputCaption = document.createElement("input"),
- inputLink = document.createElement("input"),
- button = document.createElement("button"),
- buttonGroup = document.createElement("div"),
- inputCheckbox = Controls.CreateCheckbox("Сделать ссылкой?", "NewItemIsLink", null, toggleIsLink);
- menuTreeLabel.textContent = "Родительский элемент:";
- menuTree.className = "menu-tree";
- menuTree.id = "NewItemParent";
- inputCaption.type = "text";
- inputCaption.placeholder = "Заголовок пункта";
- inputCaption.id = "NewItemCaption";
- inputLink.type = "text";
- inputLink.placeholder = "Ссылка на материал или внешний URL";
- inputLink.id = "NewItemLink";
- inputLink.disabled = true;
- button.onclick = addItem;
- button.textContent = "Добавить";
- buttonGroup.append(button);
- buttonGroup.className = "button-group";
- body.append(menuTreeLabel, menuTree, inputCaption, inputCheckbox, inputLink, buttonGroup);
- getMenuSource(menuTree);
- Modal.Create("Добавить новый пункт в меню", body);
- }
- function toggleIsLink() {
- /**
- * @type {HTMLInputElement}
- */
- let input = this.parentElement.nextElementSibling;
- if (input) {
- input.disabled = !this.checked;
- if (input.disabled) {
- input.value = "";
- }
- }
- }
- function getMenuSource(elem) {
- XHR.POST(postGetMenuSource, "/menu-get-source/"+__CurrentCategory, {}, elem);
- }
- function postGetMenuSource(result, elem) {
- if (!result || !elem) {
- return;
- }
- if (!"Menu" in result) {
- Messenger.Show("Нет данных меню");
- return;
- }
- let tree = __init__Tree();
- buildTree(result.Menu, tree);
- tree.SetTo(elem);
- }
- /**
- *
- * @param {[Object]} root
- * @param {Object} tree
- */
- function buildTree(root, tree, branch) {
- for (let item of root) {
- let newBranch = tree.AddBranch(item.Caption, {id: item.ID}, branch);
- if (item.Rows !== null) {
- buildTree(item.Rows, tree, newBranch);
- }
- }
- }
- /**
- *
- * @param {MouseEvent} event
- */
- function toggleIsActive(event) {
- if (__EditItemID < 0) {
- event.preventDefault();
- return;
- }
- let data = {
- ID: __EditItemID,
- Active: this.checked,
- };
- XHR.POST(
- function (result) {
- if (result && "Error" in result && result.Error) {
- Messenger.Show(result.Error);
- } else {
- Messenger.Show("Статус пункта меню был успешно изменён");
- getMenu();
- }
- },
- "/menu-update-item-active",
- data
- );
- this.closest(".modal").querySelector(".close").click();
- }
- return public;
- })();
|