1"use strict";(self.webpackChunkWanasApps=self.webpackChunkWanasApps||[]).push([[4319],{4319:(D,d,l)=>{l.r(d),l.d(d,{PAGES_ROUTES:()=>G});var b=l(467),p=l(6193),g=l(177),s=l(9417),e=l(4438),m=l(2431),_=l(2587),u=l(6100);function v(o,a){if(1&o&&(e.j41(0,"div",9),e.EFF(1),e.k0s()),2&o){const t=e.XpG();e.R7$(),e.JRh(t.error)}}function F(o,a){if(1&o){const t=e.RV6();e.j41(0,"button",18),e.bIt("click",function(){e.eBV(t);const n=e.XpG(2);return e.Njj(n.search="")}),e.nrm(1,"i",19),e.k0s()}}function y(o,a){if(1&o&&(e.j41(0,"option",20),e.EFF(1),e.k0s()),2&o){const t=a.$implicit;e.Y8G("value",t),e.R7$(),e.JRh(t)}}function k(o,a){if(1&o){const t=e.RV6();e.j41(0,"div",10)(1,"div",11),e.nrm(2,"i",12),e.j41(3,"input",13),e.mxI("ngModelChange",function(n){e.eBV(t);const r=e.XpG();return e.DH7(r.search,n)||(r.search=n),e.Njj(n)}),e.k0s(),e.DNE(4,F,2,0,"button",14),e.k0s(),e.j41(5,"select",15),e.mxI("ngModelChange",function(n){e.eBV(t);const r=e.XpG();return e.DH7(r.typeFilter,n)||(r.typeFilter=n),e.Njj(n)}),e.j41(6,"option",16),e.EFF(7,"All types"),e.k0s(),e.DNE(8,y,2,2,"option",17),e.k0s()()}if(2&o){const t=e.XpG();e.R7$(3),e.R50("ngModel",t.search),e.R7$(),e.Y8G("ngIf",t.search),e.R7$(),e.R50("ngModel",t.typeFilter),e.R7$(3),e.Y8G("ngForOf",t.pageTypes)}}function x(o,a){1&o&&(e.j41(0,"div",21),e.nrm(1,"div",22),e.EFF(2," Loading pages...\n"),e.k0s())}function P(o,a){1&o&&(e.j41(0,"div",23),e.nrm(1,"i",24),e.j41(2,"p"),e.EFF(3,"No dynamic pages found. Create one to get started."),e.k0s(),e.j41(4,"a",2),e.EFF(5,"Create the first page"),e.k0s()())}function C(o,a){if(1&o){const t=e.RV6();e.j41(0,"tr")(1,"td")(2,"span",30),e.EFF(3),e.k0s()(),e.j41(4,"td",1)(5,"code"),e.EFF(6),e.k0s()(),e.j41(7,"td",31),e.EFF(8),e.k0s(),e.j41(9,"td",27)(10,"button",32),e.bIt("click",function(){const n=e.eBV(t).$implicit,r=e.XpG(2);return e.Njj(r.editPage(n.page_type,n.slug))}),e.nrm(11,"i",33),e.EFF(12," Edit"),e.k0s(),e.j41(13,"button",34),e.bIt("click",function(){const n=e.eBV(t).$implicit,r=e.XpG(2);return e.Njj(r.deletePage(n.page_type,n.slug))}),e.nrm(14,"i",35),e.EFF(15," Delete"),e.k0s()()()}if(2&o){const t=a.$implicit;e.R7$(3),e.JRh(t.page_type),e.R7$(3),e.SpI("/",t.slug,""),e.R7$(2),e.JRh(t.seo_title||"\u2014")}}function E(o,a){if(1&o){const t=e.RV6();e.j41(0,"tr")(1,"td",36),e.EFF(2," No pages match your filters. "),e.j41(3,"button",37),e.bIt("click",function(){e.eBV(t);const n=e.XpG(2);return e.Njj(n.clearFilters())}),e.EFF(4,"Clear filters"),e.k0s()()()}}function j(o,a){if(1&o&&(e.j41(0,"div",25)(1,"table",26)(2,"thead")(3,"tr")(4,"th"),e.EFF(5,"Page Type"),e.k0s(),e.j41(6,"th"),e.EFF(7,"Slug"),e.k0s(),e.j41(8,"th"),e.EFF(9,"SEO Title"),e.k0s(),e.j41(10,"th",27),e.EFF(11,"Actions"),e.k0s()()(),e.j41(12,"tbody"),e.DNE(13,C,16,3,"tr",28)(14,E,5,0,"tr",29),e.k0s()()()),2&o){const t=e.XpG();e.R7$(13),e.Y8G("ngForOf",t.filteredPages),e.R7$(),e.Y8G("ngIf",0===t.filteredPages.length)}}let S=(()=>{class o{constructor(t,i,n,r){this.pagesService=t,this.router=i,this.notify=n,this.confirmSvc=r,this.pages=[],this.loading=!0,this.error="",this.search="",this.typeFilter=""}ngOnInit(){this.loadPages()}loadPages(){this.loading=!0,this.pagesService.getAllPages().subscribe({next:t=>{this.pages=t.data?t.data.filter(i=>"client"!==i.page_type&&"product"!==i.page_type):[],this.loading=!1},error:t=>{this.error="Failed to load pages: "+t.message,this.loading=!1}})}get pageTypes(){const t=new Set;for(const i of this.pages)i.page_type&&t.add(i.page_type);return Array.from(t).sort((i,n)=>i.localeCompare(n))}get filteredPages(){const t=this.search.trim().toLowerCase();return this.pages.filter(i=>(!this.typeFilter||i.page_type===this.typeFilter)&&(!t||[i.slug,i.seo_title,i.page_type].filter(Boolean).join(" ").toLowerCase().includes(t)))}get hasActiveFilters(){return!!this.search.trim()||!!this.typeFilter}clearFilters(){this.search="",this.typeFilter=""}deletePage(t,i){var n=this;return(0,b.A)(function*(){(yield n.confirmSvc.confirm({title:"Delete page",message:`Delete ${t}/${i}? This cannot be undone.`,confirmText:"Delete",danger:!0}))&&n.pagesService.deletePage(t,i).subscribe({next:()=>{n.loadPages()},error:c=>{n.notify.error("Failed to delete: "+(c?.error?.message||c?.message||"Unknown error"))}})})()}editPage(t,i){this.router.navigate(["/admin/pages/edit",t,i])}static{this.\u0275fac=function(i){return new(i||o)(e.rXU(m.b),e.rXU(p.Ix),e.rXU(_.J),e.rXU(u.G))}}static{this.\u0275cmp=e.VBU({type:o,selectors:[["app-pages-list"]],standalone:!0,features:[e.aNF],decls:14,vars:5,consts:[[1,"cms-page-header","d-flex","justify-content-between","align-items-center","mb-4"],[1,"text-muted"],["routerLink","/admin/pages/new",1,"btn-primary"],[1,"bi","bi-plus-lg","pe-1"],["class","alert-error mb-3",4,"ngIf"],["class","pages-toolbar",4,"ngIf"],["class","text-center py-5 text-muted",4,"ngIf"],["class","empty-card",4,"ngIf"],["class","table-responsive",4,"ngIf"],[1,"alert-error","mb-3"],[1,"pages-toolbar"],[1,"search-box"],[1,"bi","bi-search"],["type","text","placeholder","Search slug, title, type\u2026","aria-label","Search pages",3,"ngModelChange","ngModel"],["class","search-clear","type","button","aria-label","Clear search",3,"click",4,"ngIf"],["aria-label","Filter by page type",1,"form-select","type-select",3,"ngModelChange","ngModel"],["value",""],[3,"value",4,"ngFor","ngForOf"],["type","button","aria-label","Clear search",1,"search-clear",3,"click"],[1,"bi","bi-x-lg"],[3,"value"],[1,"text-center","py-5","text-muted"],["role","status",1,"spinner-border","spinner-border-sm","me-2"],[1,"empty-card"],[1,"bi","bi-file-earmark-richtext"],[1,"table-responsive"],[1,"table","table-hover","align-middle"],[1,"text-end"],[4,"ngFor","ngForOf"],[4,"ngIf"],[1,"badge","bg-primary"],[1,"seo-title"],[1,"btn","btn-sm","btn-outline-primary","me-2",3,"click"],[1,"bi","bi-pencil"],[1,"btn","btn-sm","btn-outline-danger",3,"click"],[1,"bi","bi-trash"],["colspan","4",1,"filtered-empty"],["type","button",1,"btn-link",3,"click"]],template:function(i,n){1&i&&(e.j41(0,"div",0)(1,"div")(2,"h2"),e.EFF(3,"Pages Management"),e.k0s(),e.j41(4,"p",1),e.EFF(5,"Manage your website's dynamic and static pages."),e.k0s()(),e.j41(6,"a",2),e.nrm(7,"i",3),e.EFF(8," Create New Page"),e.k0s()(),e.DNE(9,v,2,1,"div",4)(10,k,9,4,"div",5)(11,x,3,0,"div",6)(12,P,6,0,"div",7)(13,j,15,2,"div",8)),2&i&&(e.R7$(9),e.Y8G("ngIf",n.error),e.R7$(),e.Y8G("ngIf",!n.loading&&!n.error&&n.pages.length>0),e.R7$(),e.Y8G("ngIf",n.loading),e.R7$(),e.Y8G("ngIf",!n.loading&&!n.error&&0===n.pages.length),e.R7$(),e.Y8G("ngIf",!n.loading&&!n.error&&n.pages.length>0))},dependencies:[p.Wk,g.bT,g.pM,s.YN,s.xH,s.y7,s.me,s.wz,s.BC,s.vS],styles:["[_nghost-%COMP%]{display:block}.pages-toolbar[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.search-box[_ngcontent-%COMP%]{position:relative;flex:1;min-width:220px}.search-box[_ngcontent-%COMP%] > .bi-search[_ngcontent-%COMP%]{position:absolute;
1left:13px;top:50%;transform:translateY(-50%);color:var(--muted);font-size:.9rem;pointer-events:none}.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%]{width:100%;background:var(--input-bg);border:1px solid var(--border);border-radius:9999px;color:var(--text);padding:9px 38px;font-size:.9rem;transition:border-color .2s,box-shadow .2s}.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%]::placeholder{color:var(--muted)}.search-box[_ngcontent-%COMP%] input[_ngcontent-%COMP%]:focus{outline:none;border-color:var(--primary);box-shadow:var(--focus-ring)}.search-clear[_ngcontent-%COMP%]{position:absolute;right:8px;top:50%;transform:translateY(-50%);background:none;border:none;color:var(--muted);cursor:pointer;display:flex;padding:5px;border-radius:50%;font-size:.75rem}.search-clear[_ngcontent-%COMP%]:hover{color:var(--text)}.type-select[_ngcontent-%COMP%]{width:auto;min-width:160px;flex-shrink:0}.seo-title[_ngcontent-%COMP%]{font-weight:500}.empty-card[_ngcontent-%COMP%]{text-align:center;padding:60px 20px;color:var(--muted);background:var(--surface);border:1px dashed var(--border);border-radius:16px}.empty-card[_ngcontent-%COMP%] > .bi[_ngcontent-%COMP%]{font-size:2rem;display:block;margin-bottom:10px}.empty-card[_ngcontent-%COMP%] p[_ngcontent-%COMP%]{margin-bottom:16px;font-size:1rem}.filtered-empty[_ngcontent-%COMP%]{text-align:center!important;color:var(--muted);padding:32px 16px!important}.btn-link[_ngcontent-%COMP%]{background:none;border:none;padding:0 4px}"]})}}return o})();function O(o,a){1&o&&(e.j41(0,"div",6),e.nrm(1,"div",7),e.EFF(2," Loading page data...\n"),e.k0s())}function M(o,a){if(1&o&&(e.j41(0,"div",8),e.EFF(1),e.k0s()),2&o){const t=e.XpG();e.R7$(),e.JRh(t.error)}}function T(o,a){1&o&&(e.j41(0,"small",1),e.EFF(1,"Cannot change partition key after creation."),e.k0s())}function R(o,a){1&o&&(e.j41(0,"small",1),e.EFF(1,"Cannot change sort key after creation."),e.k0s())}function I(o,a){1&o&&e.nrm(0,"span",37)}function N(o,a){if(1&o){const t=e.RV6();e.j41(0,"div",9)(1,"form",10),e.bIt("ngSubmit",function(){e.eBV(t);const n=e.XpG();return e.Njj(n.onSubmit())}),e.j41(2,"h5",11),e.EFF(3,"Routing Configuration"),e.k0s(),e.j41(4,"div",12)(5,"div",13)(6,"label",14),e.EFF(7,"Page Type (Partition Key) "),e.j41(8,"span",15),e.EFF(9,"*"),e.k0s()(),e.j41(10,"select",16)(11,"option",17),e.EFF(12,"Select Type"),e.k0s(),e.j41(13,"option",18),e.EFF(14,"Standard Page (page)"),e.k0s(),e.j41(15,"option",19),e.EFF(16,"Landing Page (landing)"),e.k0s(),e.j41(17,"option",20),e.EFF(18,"Service Page (service)"),e.k0s(),e.j41(19,"option",21),e.EFF(20,"System Config (system_config)"),e.k0s()(),e.DNE(21,T,2,0,"small",22),e.k0s(),e.j41(22,"div",13)(23,"label",14),e.EFF(24,"Slug (Sort Key) "),e.j41(25,"span",15),e.EFF(26,"*"),e.k0s()(),e.nrm(27,"input",23),e.DNE(28,R,2,0,"small",22),e.k0s()(),e.j41(29,"h5",24),e.EFF(30,"Search Engine Optimization"),e.k0s(),e.j41(31,"div",12)(32,"div",13)(33,"label",14),e.EFF(34,"SEO Title"),e.k0s(),e.nrm(35,"input",25),e.k0s(),e.j41(36,"div",13)(37,"label",14),e.EFF(38,"SEO Description"),e.k0s(),e.nrm(39,"input",26),e.k0s()(),e.j41(40,"h5",24),e.EFF(41,"Content Blocks"),e.k0s(),e.j41(42,"div",27)(43,"div",28)(44,"label",29),e.EFF(45,"UI Blocks (JSON Array) "),e.j41(46,"span",15),e.EFF(47,"*"),e.k0s()(),e.j41(48,"button",30),e.bIt("click",function(){e.eBV(t);const n=e.XpG();return e.Njj(n.formatJson())}),e.nrm(49,"i",31),e.EFF(50," Format JSON"),e.k0s()(),e.nrm(51,"textarea",32),e.j41(52,"small",33),e.EFF(53,"Define the component layout for this page in valid JSON format."),e.k0s()(),e.j41(54,"div",34)(55,"button",35),e.DNE(56,I,1,0,"span",36),e.EFF(57),e.k0s()()()()}if(2&o){const t=e.XpG();e.R7$(),e.Y8G("formGroup",t.pageForm),e.R7$(20),e.Y8G("ngIf",t.isEditMode),e.R7$(7),e.Y8G("ngIf",t.isEditMode),e.R7$(27),e.Y8G("disabled",t.saving||t.pageForm.invalid),e.R7$(),e.Y8G("ngIf",t.saving),e.R7$(),e.SpI(" ",t.isEditMode?"Update Page":"Create Page"," ")}}let h=(()=>{class o{constructor(t,i,n,r,c){this.fb=t,this.pagesService=i,this.route=n,this.router=r,this.confirmSvc=c,this.isEditMode=!1,this.originalPageType="",this.originalSlug="",this.loading=!1,this.saving=!1,this.error="",this.snapshot=""}ngOnInit(){this.initForm(),this.route.paramMap.subscribe(t=>{const i=t.get("page_type"),n=t.get("slug");i&&n?(this.isEditMode=!0,this.originalPageType=i,this.originalSlug=n,this.loadPageData(i,n)):this.snapshot=this.serialize()})}initForm(){this.pageForm=this.fb.group({page_type:["",s.k0.required],slug:["",s.k0.required],seo_title:[""],seo_description:[""],ui_blocks_json:["[\n \n]",s.k0.required]})}serialize(){return JSON.stringify(this.pageForm?this.pageForm.getRawValue():{})}get isDirty(){return this.serialize()!==this.snapshot}onBeforeUnload(t){this.isDirty&&!this.saving&&(t.preventDefault(),t.returnValue="")}canDeactivate(){return!(this.isDirty&&!this.saving)||this.confirmSvc.confirm({title:"Discard changes?",message:"You have unsaved changes. Leave without saving?",confirmText:"Discard",danger:!0})}loadPageData(t,i){this.loading=!0,this.pagesService.getPage(t,i).subscribe({next:n=>{const r=n.data;this.pageForm.patchValue({page_type:r.page_type,slug:r.slug,seo_title:r.seo_title,seo_description:r.seo_description,ui_blocks_json:JSON.stringify(r.ui_blocks,null,2)}),this.pageForm.get("page_type")?.disable(),this.pageForm.get("slug")?.disable(),this.snapshot=this.serialize(),this.loading=!1},error:n=>{this.error="Failed to load page: "+n.message,this.loading=!1}})}
1onSubmit(){if(this.pageForm.invalid)return void alert("Please fill out all required fields properly.");const t=this.pageForm.getRawValue();let i=[];try{if(i=JSON.parse(t.ui_blocks_json),!Array.isArray(i))return void alert("ui_blocks must be a JSON Array [ ]")}catch(r){return void alert("Invalid JSON format in UI Blocks: "+r)}const n={page_type:t.page_type,slug:t.slug,seo_title:t.seo_title,seo_description:t.seo_description,ui_blocks:i};this.saving=!0,this.isEditMode?this.pagesService.updatePage(this.originalPageType,this.originalSlug,n).subscribe({next:()=>{this.snapshot=this.serialize(),this.router.navigate(["/admin/pages"])},error:r=>{this.error="Failed to update: "+r.message,this.saving=!1}}):this.pagesService.createPage(n).subscribe({next:()=>{this.snapshot=this.serialize(),this.router.navigate(["/admin/pages"])},error:r=>{this.error="Failed to create: "+r.message,this.saving=!1}})}formatJson(){try{const t=this.pageForm.get("ui_blocks_json")?.value,i=JSON.parse(t);this.pageForm.patchValue({ui_blocks_json:JSON.stringify(i,null,2)})}
1catch{alert("Cannot format: JSON is invalid.")}}static{this.\u0275fac=function(i){return new(i||o)(e.rXU(s.ok),e.rXU(m.b),e.rXU(p.nX),e.rXU(p.Ix),e.rXU(u.G))}}static{this.\u0275cmp=e.VBU({type:o,selectors:[["app-page-editor"]],hostBindings:function(i,n){1&i&&e.bIt("beforeunload",function(c){return n.onBeforeUnload(c)},!1,e.tSv)},standalone:!0,features:[e.aNF],decls:11,vars:4,consts:[[1,"cms-page-header","d-flex","justify-content-between","align-items-center","mb-4"],[1,"text-muted"],["routerLink","/admin/pages",1,"btn","btn-outline-secondary"],["class","text-center py-5 text-muted",4,"ngIf"],["class","alert-error mb-3",4,"ngIf"],["class","editor-card glass-panel p-4",4,"ngIf"],[1,"text-center","py-5","text-muted"],["role","status",1,"spinner-border","spinner-border-sm","me-2"],[1,"alert-error","mb-3"],[1,"editor-card","glass-panel","p-4"],[3,"ngSubmit","formGroup"],[1,"section-heading"],[1,"row","mb-3"],[1,"col-md-6","mb-3"],[1,"form-label"],[1,"text-danger"],["formControlName","page_type",1,"form-select","form-control"],["value","","disabled",""],["value","page"],["value","landing"],["value","service"],["value","system_config"],["class","text-muted",4,"ngIf"],["type","text","formControlName","slug","placeholder","e.g. home, about-us",1,"form-control"],[1,"section-heading","mt-4"],["type","text","formControlName","seo_title","placeholder","Optional SEO Title",1,"form-control"],["type","text","formControlName","seo_description","placeholder","Optional SEO Description",1,"form-control"],[1,"mb-4"],[1,"d-flex","justify-content-between","align-items-center","mb-2"],[1,"form-label","mb-0"],["type","button",1,"btn","btn-sm","btn-outline-secondary",3,"click"],[1,"bi","bi-braces"],["rows","15","formControlName","ui_blocks_json","placeholder",'[ { "componentType": "...", "data": { ... } } ]',1,"form-control","font-monospace","blocks-editor"],[1,"text-muted","mt-1","d-block"],[1,"d-flex","justify-content-end","mt-4"],["type","submit",1,"btn","btn-primary","px-4",3,"disabled"],["class","spinner-border spinner-border-sm me-2","role","status","aria-hidden","true",4,"ngIf"],["role","status","aria-hidden","true",1,"spinner-border","spinner-border-sm","me-2"]],template:function(i,n){1&i&&(e.j41(0,"div",0)(1,"div")(2,"h2"),e.EFF(3),e.k0s(),e.j41(4,"p",1),e.EFF(5,"Configure your generic dynamic page and its layout blocks."),e.k0s()(),e.j41(6,"a",2),e.EFF(7,"Back to Pages"),e.k0s()(),e.DNE(8,O,3,0,"div",3)(9,M,2,1,"div",4)(10,N,58,6,"div",5)),2&i&&(e.R7$(3),e.JRh(n.isEditMode?"Edit Page":"Create New Page"),e.R7$(5),e.Y8G("ngIf",n.loading),e.R7$(),e.Y8G("ngIf",n.error),e.R7$(),e.Y8G("ngIf",!n.loading))},dependencies:[p.Wk,g.bT,s.YN,s.qT,s.xH,s.y7,s.me,s.wz,s.BC,s.cb,s.X1,s.j4,s.JD],styles:["[_nghost-%COMP%]{display:block}.editor-card[_ngcontent-%COMP%]{border-radius:12px;color:var(--text)}.section-heading[_ngcontent-%COMP%]{margin-bottom:1rem;padding-bottom:.5rem;border-bottom:1px solid var(--border);color:var(--primary)}.blocks-editor[_ngcontent-%COMP%]{background-color:#0003;color:var(--text);font-size:14px;border:1px solid var(--border)}"]})}}return o})();var f=l(1374);const G=[{path:"",component:S},{path:"new",component:h,canDeactivate:[f.j]},{path:"edit/:page_type/:slug",component:h,canDeactivate:[f.j]}]}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.