From 4af4298a09ac30d70ffe03c8b635b0f373d35d09 Mon Sep 17 00:00:00 2001 From: Awey01 <010109ali@gmail.com> Date: Tue, 3 Dec 2024 13:02:34 +0000 Subject: [PATCH] Subtabs are in perfect state, with perfect visual, but no sub-subtabs --- custom_subtabs/public/css/custom_subtabs.css | 50 ++++--- custom_subtabs/public/js/custom_subtabs.js | 130 ++++++++++++------- 2 files changed, 114 insertions(+), 66 deletions(-) diff --git a/custom_subtabs/public/css/custom_subtabs.css b/custom_subtabs/public/css/custom_subtabs.css index a1444e3..d55088f 100644 --- a/custom_subtabs/public/css/custom_subtabs.css +++ b/custom_subtabs/public/css/custom_subtabs.css @@ -1,25 +1,39 @@ -/* Main tab styling */ -.nav-item.active { - border-bottom: 2px solid #171717 !important; - font-weight: bold !important; - color: #171717 !important; +.sub-tab-container { + margin: 0 !important; + padding: 0 !important; + display: flex !important; + justify-content: flex-start !important; + border-bottom: 1px solid #ddd !important; } -/* Subtab styling */ -.sub-tab.active { - border-bottom: 2px solid #171717 !important; - font-weight: bold !important; - color: #171717 !important; +.sub-tab-container .sub-tab { + margin: 0 !important; + background: none !important; + border: none !important; + padding: 0 !important; } -/* Sub-subtab styling */ -.sub-sub-tab.active { - border-bottom: 2px solid #171717 !important; - font-weight: bold !important; - color: #171717 !important; +.sub-tab-container .sub-tab a { + text-decoration: none !important; + display: block !important; + padding: 10px 15px !important; + color: #555 !important; + border: none !important; + font-size: 14px !important; + font-weight: normal !important; + margin: 0 !important; + background: transparent !important; + box-shadow: none !important; } -/* Remove double line */ -.nav-item, .sub-tab, .sub-sub-tab { - border-bottom: none !important; +.sub-tab-container .sub-tab a:hover { + color: #000 !important; /* Цвет текста при наведении */ +} + +.sub-tab-container .sub-tab.active a { + color: #000 !important; /* Черный текст для активного таба */ + font-weight: 600 !important; /* Жирный шрифт */ + border-bottom: 1px solid #000 !important; /* Черная активная полоска снизу */ + background-color: transparent !important; /* Без фона */ + border-radius: 0 !important; /* Без скруглений */ } diff --git a/custom_subtabs/public/js/custom_subtabs.js b/custom_subtabs/public/js/custom_subtabs.js index 87c8f88..887674f 100644 --- a/custom_subtabs/public/js/custom_subtabs.js +++ b/custom_subtabs/public/js/custom_subtabs.js @@ -20,55 +20,55 @@ frappe.ui.form.Layout.prototype.setup_tab_events = function () { tabs.each((index, tab) => { const tabLabel = $(tab).text().trim(); console.log(`Processing subtabs for main tab: '${tabLabel}'`); + if (subtabs[tabLabel]) { - let subtabContainer = $(tab).find(".sub-tab-container"); - if (!subtabContainer.length) { - subtabContainer = $(""); - $(tab).append(subtabContainer); + const tabContentId = $(tab).find("a").attr("aria-controls"); + const tabContent = $(`#${tabContentId}`); + + if (!tabContent.length) { + console.warn(`Content container not found for main tab: '${tabLabel}'`); + return; } + const sectionContainer = tabContent.find(".row.form-section.card-section.visible-section"); + + if (!sectionContainer.length) { + console.warn(`Section container not found for main tab: '${tabLabel}'`); + return; + } + + sectionContainer.find('.section-body').remove(); // Удаление лишнего + let subtabContainer = sectionContainer.find('.sub-tab-container'); + if (!subtabContainer.length) { + subtabContainer = $(""); + sectionContainer.append(subtabContainer); + } + subtabs[tabLabel].forEach((subtab) => { const subtabElement = tabs.filter((_, el) => $(el).text().trim() === subtab); - + if (subtabElement.length) { const subtabClone = subtabElement.clone(); - subtabClone.addClass("sub-tab").find("a").removeAttr("href"); - subtabContainer.append(subtabClone); - subtabElement.remove(); - + + // Убедимся, что мы добавляем только нужные классы + subtabClone.addClass("sub-tab"); // Добавляем только класс sub-tab + // Удаляем только атрибут href, если он мешает работе + subtabClone.find("a").removeAttr("href"); + + subtabClone.attr("data-parent-id", tabContentId); // Присваиваем parent-id + + subtabContainer.append(subtabClone); // Добавляем к контейнеру + subtabElement.remove(); // Удаляем оригинал + console.log(`Processed subtab: '${subtab}' under main tab '${tabLabel}'`); - - // Process sub-subtabs - if (subtabs[subtab]) { - let subsubtabContainer = subtabClone.find(".sub-sub-tab-container"); - if (!subsubtabContainer.length) { - subsubtabContainer = $(""); - subtabClone.append(subsubtabContainer); - } - - subtabs[subtab].forEach((subsubtab) => { - const subsubtabElement = tabs.filter((_, el) => $(el).text().trim() === subsubtab); - - if (subsubtabElement.length) { - const subsubtabClone = subsubtabElement.clone(); - subsubtabClone.addClass("sub-sub-tab").find("a").removeAttr("href"); - subsubtabContainer.append(subsubtabClone); - subsubtabElement.remove(); - - console.log(`Processed sub-subtab: '${subsubtab}' under subtab '${subtab}'`); - } else { - console.warn(`Sub-subtab element not found for '${subsubtab}'`); - } - }); - } } else { console.warn(`Subtab element not found for '${subtab}'`); } - }); + }); } }); - // Handle tab activation + // Handle main tab activation $(".nav-item").on("click", function () { const clickedTab = $(this); const tabId = clickedTab.find("a").attr("aria-controls"); @@ -79,35 +79,67 @@ frappe.ui.form.Layout.prototype.setup_tab_events = function () { const tabContent = document.querySelector(`#${tabId}`); if (tabContent) { $(tabContent).addClass("active show").css("display", "block"); + console.log(`Main tab content displayed:`, tabContent.outerHTML); } else { console.warn(`Tab content not found for ID: ${tabId}`); } $(".nav-item").removeClass("active"); clickedTab.addClass("active"); + + // Show related subtabs without hiding any subtabs + $(".sub-tab-container").each(function () { + const containerParentId = $(this).attr("data-parent-id"); + if (containerParentId === tabId) { + console.log(`Displaying subtabs for parent tab: '${tabId}'`); + $(this).find(".sub-tab").css("display", "block"); + } + }); }); // Handle subtab activation $(".sub-tab").on("click", function (event) { event.stopPropagation(); - + const clickedSubtab = $(this); const subtabId = clickedSubtab.find("a").attr("aria-controls"); - - console.log(`Activating subtab: '${clickedSubtab.text().trim()}' (ID: ${subtabId})`); - - $(".form-tab-content > .tab-pane").removeClass("active show").css("display", "none"); + const parentTabId = clickedSubtab.attr("data-parent-id"); + + console.log(`Subtab clicked: '${clickedSubtab.text().trim()}' (ID: ${subtabId})`); + + // Убедиться, что родительский таб остается активным + const parentTabContent = document.querySelector(`#${parentTabId}`); + if (parentTabContent) { + $(parentTabContent) + .addClass("active show") + .css("display", "block") + .attr("style", ""); // Сброс style + console.log(`Ensured parent tab content stays active for: '${parentTabId}', HTML:`, parentTabContent.outerHTML); + } else { + console.warn(`Parent tab content not found for ID: ${parentTabId}`); + } + + // Активировать субтаб + $(".sub-tab").removeClass("active"); // Убираем активные классы с других субтабов + clickedSubtab.addClass("active"); + console.log(`Activated subtab: '${clickedSubtab.text().trim()}'`); + + // Отобразить контент субтаба const subtabContent = document.querySelector(`#${subtabId}`); if (subtabContent) { - $(subtabContent).addClass("active show").css("display", "block"); + $(subtabContent) + .addClass("active show") + .css("display", "block"); + console.log(`Displaying content for subtab: '${subtabId}', HTML:`, subtabContent.outerHTML); } else { console.warn(`Subtab content not found for ID: ${subtabId}`); } - - $(".sub-tab").removeClass("active"); - clickedSubtab.addClass("active"); + + // Убедиться, что все субтабы остаются видимыми + $(`.sub-tab-container[data-parent-id="${parentTabId}"] .sub-tab`).css("display", "block"); + console.log(`Ensured all subtabs for parent tab '${parentTabId}' are visible.`); }); - + // Handle sub-subtab activation $(".sub-sub-tab").on("click", function (event) { event.stopPropagation(); @@ -117,16 +149,18 @@ frappe.ui.form.Layout.prototype.setup_tab_events = function () { console.log(`Activating sub-subtab: '${clickedSubsubtab.text().trim()}' (ID: ${subsubtabId})`); + $(".sub-sub-tab").removeClass("active"); + clickedSubsubtab.addClass("active"); + console.log(`Activated sub-subtab: '${clickedSubsubtab.text().trim()}'`); + $(".form-tab-content > .tab-pane").removeClass("active show").css("display", "none"); const subsubtabContent = document.querySelector(`#${subsubtabId}`); if (subsubtabContent) { $(subsubtabContent).addClass("active show").css("display", "block"); + console.log(`Displaying content for sub-subtab: '${subsubtabId}', HTML:`, subsubtabContent.outerHTML); } else { console.warn(`Sub-subtab content not found for ID: ${subsubtabId}`); } - - $(".sub-sub-tab").removeClass("active"); - clickedSubsubtab.addClass("active"); }); }, 500); };