{"version":3,"sources":["website/menu/cms-menu.ts"],"names":["render","parseIntOrNull","ExtendedApiError","CmsMenu","HTMLElement","constructor","super","connectedCallback","this","readAttributes","rootItems","loadRootData","viewRenderer","import","viewPath","settings","toggle","bind","data","children","renderView","renderedView","main","rootValue","hasAttribute","getAttribute","root","productGroupsRootPageId","BasePageID","loadChildren","id","Error","response","fetch","dataResponse","json","hasError","result","event","item","preventDefault","expanded","length","loading","customElements","define"],"mappings":"OAAQA,6BACAC,kDACCC,uFAMIC,gBAAgBC,YAOzBC,cACIC,QAGJC,0BAEIC,KAAKC,iBAEL,IAAMC,QAAkBF,KAAKG,eAE7BH,KAAKI,mBAAqBC,OAAOL,KAAKM,UAEtCN,KAAKO,SAAW,CACZC,OAAQR,KAAKQ,OAAOC,KAAKT,OAG7BA,KAAKU,KAAO,CACRC,SAAUT,GAGdF,KAAKY,aAGTA,aACI,IAAMC,EAAeb,KAAKI,aAAaU,KAAKd,KAAKU,KAAMV,KAAKO,UAC5Df,OAAOqB,EAAcb,MAGzBC,iBACI,IACUc,EADNf,KAAKgB,aAAa,SACZD,EAAYf,KAAKiB,aAAa,QACpCjB,KAAKkB,KAAOzB,eAAesB,IAAc,GAEtB,IAAff,KAAKkB,OACLlB,KAAKkB,KAAOC,0BAGhBnB,KAAKkB,KAAOE,WAGZpB,KAAKgB,aAAa,QAClBhB,KAAKM,SAAWN,KAAKiB,aAAa,QAElCjB,KAAKM,SAAW,qBAIxBH,qBACI,OAAOH,KAAKqB,aAAarB,KAAKkB,MAGlCG,mBAAmBC,GACf,GAAIA,EAAK,EACL,MAAM,IAAIC,MAAM,wDAGpB,MAAMC,QAAiBC,2BAA2BH,gBAAiBtB,KAAKkB,sBAAsBE,cAC9F,IAAMM,QAAqBF,EAASG,OAEpC,IAAKD,GAAgBA,EAAaE,SAC9B,MAAM,IAAIlC,iBAAiBgC,GAG/B,OAAOA,EAAaG,OAGxBrB,aAAasB,EAAmBC,GAI5B,OAHAD,EAAME,iBAGFD,EAAKE,SACLF,EAAKE,UAAW,EAKXF,EAAKpB,UAAYoB,EAAKpB,SAASuB,OACpCH,EAAKE,UAAW,GAMpBF,EAAKI,SAAU,EACfnC,KAAKY,aAGLmB,EAAKpB,eAAiBX,KAAKqB,aAAaU,EAAKT,IAC7CS,EAAKE,UAAW,EAGhBF,EAAKI,SAAU,QAnBXnC,KAAKY,cA6CjBwB,eAAeC,OAAO,WAAY1C,gBA5HrBA","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);"]}