From 8bbc1e1ff0badb02f04994fb66fef3f5104bbbaa Mon Sep 17 00:00:00 2001 From: kkrzowski Date: Wed, 21 Jan 2026 15:05:08 +0100 Subject: [PATCH] add js --- javascript.js | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 javascript.js diff --git a/javascript.js b/javascript.js new file mode 100644 index 0000000..f96c228 --- /dev/null +++ b/javascript.js @@ -0,0 +1,178 @@ +const LITERALS = { + reorder: , + errorOccured: , + added: , + reorderLast: , + recentlyBoughtProducts: , + mostBoughtProducts: , + lastOrders: , + closeModal: , + searchPlaceholder: , + yourLastOrder: , + orderId: , + orderDate: , + orderWorth: , + productsCount: , + size: , + quantity: , + universal: , + product: , + products: , + productsPlural: , + showAllOrderProducts: , + hideAllOrderProducts: , + productOutOfStock: , + goNextStep: +}; + +class IdmTabsModal{ + constructor(config){ + const {title, tabs, cacheContainerSelector} = config; + + this.title = title; + this.tabs = tabs; + this.currentTabId = null; + this.cacheContainer = document.querySelector(cacheContainerSelector); + + //before open container is cacheContainer + this.container = this.cacheContainer; + + + this.init(); + } + + + getTabsButtonsHTML(){ + return this.tabs.map((tab, i) => ` + + `).join(""); + } + + updateActiveItemsHelper({selector, activeClass}){ + const items = this.container.querySelectorAll(selector); + + items.forEach(item => { + const tabId = parseInt(item.dataset.tabId); + const isActive = tabId === this.currentTabId; + if(isActive){ + item.classList.add(activeClass); + return; + } + item.classList.remove(activeClass); + + }) + } + + + updateActiveButtons(){ + this.updateActiveItemsHelper({selector:".idm-tabs-modal__button", activeClass:"idm-tabs-modal__button--active"}); + } + + mountTabs(){ + const content = this.container.querySelector(".idm-tabs-modal__content"); + content.innerHTML = ''; + + this.tabs.forEach((tab, i) => { + const div = document.createElement('div'); + div.className = 'idm-tabs-modal__tab'; + div.dataset.tabId = i; + div.innerHTML = tab.html; + + tab.ref = div; + + content.appendChild(div); + }); + } + + updateActiveTabs(){ + this.updateActiveItemsHelper({selector:".idm-tabs-modal__tab", activeClass:"idm-tabs-modal__tab--active"}); + } + + async changeTab(tabId){ + this.currentTabId = tabId; + this.updateActiveButtons(); + this.updateActiveTabs(); + + const currentTab = this.tabs[tabId]; + const isInitialised = currentTab?.isInitialised; + + if(!isInitialised && typeof currentTab.onInit === 'function'){ + currentTab.isInitialised = true; + await currentTab?.onInit(currentTab.ref, this); + } + + } + + initTabButtonsEvents(){ + const buttons = this.container.querySelectorAll(".idm-tabs-modal__button"); + + buttons.forEach(button => button.addEventListener("click", (e) => { + e.preventDefault(); + e.stopPropagation(); + const tabId = parseInt(button.dataset.tabId); + this.changeTab(tabId); + })); + } + + + initButtonsEvents(){ + this.initTabButtonsEvents(); + } + + + getModalHTML(){ + return ` +
+
+
+

${this.title}

+ +
+ +
+ ${this.getTabsButtonsHTML()} +
+
+
+
+ + + ` + } + + + // render modal in cache container + initModal(){ + const html = this.getModalHTML(); + this.cacheContainer.innerHTML = html; + + // this.modal = new Modal({html , classList:"idm-tabs-modal", afterShow: (modal)=>this.container=modal}); + } + + show(){ + const element = this.cacheContainer.querySelector(".idm-tabs-modal__wrapper"); + this.modal = new Modal({element , classList:"idm-tabs-modal", afterShow: (modal)=>this.container=modal}); + } + + initButtons(){ + this.updateActiveButtons(); + this.initButtonsEvents(); + } + + initTabs(){ + this.mountTabs(); + this.changeTab(0); + } + + init(){ + this.initModal(); + this.initButtons(); + this.initTabs(); + } + +} +