{"version":3,"sources":["website/menu/cms-menu.ts"],"names":["render","parseIntOrNull","ExtendedApiError","CmsMenu","HTMLElement","constructor","super","connectedCallback","this","readAttributes","rootItems","await","loadRootData","viewRenderer","import","viewPath","settings","toggle","bind","data","children","renderView","renderedView","main","rootValue","hasAttribute","getAttribute","root","productGroupsRootPageId","BasePageID","loadChildren","id","Error","dataResponse","fetch","json","hasError","result","event","item","preventDefault","expanded","length","loading","customElements","define"],"mappings":"OAAQA,MAAuB,KAAV,kBACbC,cAA4C,KAAvB,+BACpBC,gBAAmF,KAA3D,kEAMpBC,gBAAgBC,YAOzBC,cACIC,MAAK,CACT,CAEAC,0BAEIC,KAAKC,eAAc,EAEnB,IAAMC,EAAYC,MAAMH,KAAKI,aAAY,EAEzCJ,KAAKK,aAAeF,MAAMG,OAAON,KAAKO,QAAQ,EAE9CP,KAAKQ,SAAW,CACZC,OAAQT,KAAKS,OAAOC,KAAKV,IAAI,C,EAGjCA,KAAKW,KAAO,CACRC,SAAUV,C,EAGdF,KAAKa,WAAU,CACnB,CAEAA,aACI,IAAMC,EAAed,KAAKK,aAAaU,KAAKf,KAAKW,KAAMX,KAAKQ,QAAQ,EACpEhB,OAAOsB,EAAcd,IAAI,CAC7B,CAEAC,iBACI,IACUe,EADNhB,KAAKiB,aAAa,MAAM,GAClBD,EAAYhB,KAAKkB,aAAa,MAAM,EAC1ClB,KAAKmB,KAAO1B,eAAeuB,CAAS,GAAK,EAEvB,CAAC,IAAfhB,KAAKmB,OACLnB,KAAKmB,KAAOC,0BAGhBpB,KAAKmB,KAAOE,WAGZrB,KAAKiB,aAAa,MAAM,EACxBjB,KAAKO,SAAWP,KAAKkB,aAAa,MAAM,EAExClB,KAAKO,SAAW,oBAExB,CAEAH,qBACI,OAAOJ,KAAKsB,aAAatB,KAAKmB,IAAI,CACtC,CAEAG,mBAAmBC,GACf,GAAIA,EAAK,EACL,MAAM,IAAIC,MAAM,sDAAsD,EAG1E,IACMC,EAAetB,MADJA,MAAMuB,2BAA2BH,gBAAiBvB,KAAKmB,sBAAsBE,UAAY,GACtEM,KAAI,EAExC,GAAI,CAACF,GAAgBA,EAAaG,SAC9B,MAAM,IAAIlC,iBAAiB+B,CAAY,EAG3C,OAAOA,EAAaI,MACxB,CAEApB,aAAaqB,EAAmBC,GAC5BD,EAAME,eAAc,EAGhBD,EAAKE,SACLF,EAAKE,SAAW,CAAA,EAKXF,EAAKnB,UAAYmB,EAAKnB,SAASsB,OACpCH,EAAKE,SAAW,CAAA,GAMpBF,EAAKI,QAAU,CAAA,EACfnC,KAAKa,WAAU,EAGfkB,EAAKnB,SAAWT,MAAMH,KAAKsB,aAAaS,EAAKR,EAAE,EAC/CQ,EAAKE,SAAW,CAAA,EAGhBF,EAAKI,QAAU,CAAA,GACfnC,KAAKa,WAAU,CACnB,C,CAwBJuB,eAAeC,OAAO,WAAY1C,OAAO,SA5H5BA,OA4H6B","file":"cms-menu.js","sourcesContent":["import {render} from \"lit-html\";\r\nimport {parseIntOrNull} from \"../../utils/number.js\";\r\nimport { ExtendedApiError } from \"../../../components-shared/api/base/extended-api-error.js\";\r\nimport { IExtendedApiResponse } from \"../../../components-shared/api/base/i-extended-api-response.js\";\r\n\r\ndeclare var productGroupsRootPageId: number;\r\ndeclare var BasePageID: number;\r\n\r\nexport class CmsMenu extends HTMLElement {\r\n root:number;\r\n viewPath:string;\r\n data: IMenuData;\r\n settings: IMenuSettings;\r\n viewRenderer: { main: (data: IMenuData, settings: IMenuSettings) => {} };\r\n\r\n constructor(){\r\n super();\r\n }\r\n\r\n async connectedCallback() {\r\n\r\n this.readAttributes();\r\n\r\n const rootItems = await this.loadRootData();\r\n\r\n this.viewRenderer = await import(this.viewPath) as { main: (data: IMenuData, settings: IMenuSettings) => {} };\r\n\r\n this.settings = {\r\n toggle: this.toggle.bind(this)\r\n };\r\n\r\n this.data = {\r\n children: rootItems\r\n };\r\n\r\n this.renderView();\r\n }\r\n\r\n renderView() {\r\n const renderedView = this.viewRenderer.main(this.data, this.settings);\r\n render(renderedView, this);\r\n }\r\n\r\n readAttributes() {\r\n if (this.hasAttribute(\"root\")) {\r\n const rootValue = this.getAttribute(\"root\");\r\n this.root = parseIntOrNull(rootValue) ?? 0;\r\n\r\n if (this.root === -2) {\r\n this.root = productGroupsRootPageId;\r\n }\r\n } else {\r\n this.root = BasePageID;\r\n }\r\n\r\n if (this.hasAttribute(\"view\")) {\r\n this.viewPath = this.getAttribute(\"view\");\r\n } else {\r\n this.viewPath = \"./views/default.js\";\r\n }\r\n }\r\n\r\n async loadRootData() {\r\n return this.loadChildren(this.root);\r\n }\r\n\r\n async loadChildren(id:number) : Promise {\r\n if (id < 0) {\r\n throw new Error(\"cms-menu: Failed to load children. ID is less than 0\");\r\n }\r\n\r\n const response = await fetch(`/api/website/menu/${id}?rootPageId=${this.root}¤tPageId=${BasePageID}`);\r\n const dataResponse = await response.json() as IExtendedApiResponse;\r\n\r\n if (!dataResponse || dataResponse.hasError) {\r\n throw new ExtendedApiError(dataResponse);\r\n }\r\n\r\n return dataResponse.result;\r\n }\r\n\r\n async toggle(event: MouseEvent, item: IMenuItem) {\r\n event.preventDefault();\r\n\r\n // If currently expanded, just close\r\n if (item.expanded) {\r\n item.expanded = false;\r\n this.renderView();\r\n return;\r\n }\r\n // If not expanded but already have children loaded, just open\r\n else if (item.children && item.children.length) {\r\n item.expanded = true;\r\n this.renderView();\r\n return;\r\n }\r\n\r\n // Set loading state and re-render\r\n item.loading = true;\r\n this.renderView();\r\n\r\n // Load children\r\n item.children = await this.loadChildren(item.id);\r\n item.expanded = true;\r\n\r\n // Unset loading state and re-render\r\n item.loading = false;\r\n this.renderView();\r\n }\r\n}\r\n\r\nexport interface IMenuData {\r\n children: IMenuItem[];\r\n}\r\n\r\nexport interface IMenuItem {\r\n id: number;\r\n name: string;\r\n url: string;\r\n useTargetBlank: boolean;\r\n selected: boolean;\r\n expanded: boolean;\r\n level: number;\r\n loading: boolean;\r\n hasChildren: boolean;\r\n children: IMenuItem[];\r\n}\r\n\r\nexport interface IMenuSettings {\r\n toggle: (event: MouseEvent, item: IMenuItem) => void;\r\n}\r\n\r\ncustomElements.define(\"cms-menu\", CmsMenu);"]}