{"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\";\nimport {parseIntOrNull} from \"../../utils/number.js\";\nimport { ExtendedApiError } from \"../../../components-shared/api/base/extended-api-error.js\";\nimport { IExtendedApiResponse } from \"../../../components-shared/api/base/i-extended-api-response.js\";\n\ndeclare var productGroupsRootPageId: number;\ndeclare var BasePageID: number;\n\nexport class CmsMenu extends HTMLElement {\n root:number;\n viewPath:string;\n data: IMenuData;\n settings: IMenuSettings;\n viewRenderer: { main: (data: IMenuData, settings: IMenuSettings) => {} };\n\n constructor(){\n super();\n }\n\n async connectedCallback() {\n\n this.readAttributes();\n\n const rootItems = await this.loadRootData();\n\n this.viewRenderer = await import(this.viewPath) as { main: (data: IMenuData, settings: IMenuSettings) => {} };\n\n this.settings = {\n toggle: this.toggle.bind(this)\n };\n\n this.data = {\n children: rootItems\n };\n\n this.renderView();\n }\n\n renderView() {\n const renderedView = this.viewRenderer.main(this.data, this.settings);\n render(renderedView, this);\n }\n\n readAttributes() {\n if (this.hasAttribute(\"root\")) {\n const rootValue = this.getAttribute(\"root\");\n this.root = parseIntOrNull(rootValue) ?? 0;\n\n if (this.root === -2) {\n this.root = productGroupsRootPageId;\n }\n } else {\n this.root = BasePageID;\n }\n\n if (this.hasAttribute(\"view\")) {\n this.viewPath = this.getAttribute(\"view\");\n } else {\n this.viewPath = \"./views/default.js\";\n }\n }\n\n async loadRootData() {\n return this.loadChildren(this.root);\n }\n\n async loadChildren(id:number) : Promise {\n if (id < 0) {\n throw new Error(\"cms-menu: Failed to load children. ID is less than 0\");\n }\n\n const response = await fetch(`/api/website/menu/${id}?rootPageId=${this.root}¤tPageId=${BasePageID}`);\n const dataResponse = await response.json() as IExtendedApiResponse;\n\n if (!dataResponse || dataResponse.hasError) {\n throw new ExtendedApiError(dataResponse);\n }\n\n return dataResponse.result;\n }\n\n async toggle(event: MouseEvent, item: IMenuItem) {\n event.preventDefault();\n\n // If currently expanded, just close\n if (item.expanded) {\n item.expanded = false;\n this.renderView();\n return;\n }\n // If not expanded but already have children loaded, just open\n else if (item.children && item.children.length) {\n item.expanded = true;\n this.renderView();\n return;\n }\n\n // Set loading state and re-render\n item.loading = true;\n this.renderView();\n\n // Load children\n item.children = await this.loadChildren(item.id);\n item.expanded = true;\n\n // Unset loading state and re-render\n item.loading = false;\n this.renderView();\n }\n}\n\nexport interface IMenuData {\n children: IMenuItem[];\n}\n\nexport interface IMenuItem {\n id: number;\n name: string;\n url: string;\n useTargetBlank: boolean;\n selected: boolean;\n expanded: boolean;\n level: number;\n loading: boolean;\n hasChildren: boolean;\n children: IMenuItem[];\n}\n\nexport interface IMenuSettings {\n toggle: (event: MouseEvent, item: IMenuItem) => void;\n}\n\ncustomElements.define(\"cms-menu\", CmsMenu);"]}