1import{a as z}from"./chunk-JCUBDZ6C.js";import{a as H}from"./chunk-B23VMXCS.js";import{a as G}from"./chunk-DMG2QZD3.js";import{a as U}from"./chunk-ZQUTHZTU.js";import{a as L,c as F,d as q,e as W,f as $,g as R,o as B,q as j}from"./chunk-6QV62N6E.js";import"./chunk-SGWS245Z.js";import{e as O}from"./chunk-5JT2KAKO.js";import"./chunk-MPN3YM5U.js";import"./chunk-3AIRW276.js";import{Cb as T,Db as I,Ga as V,N as h,S as m,Sa as x,T as u,Ta as C,Ua as S,Va as w,Wa as f,Xa as t,Ya as i,Za as p,da as b,db as v,dc as N,eb as c,fb as s,lb as D,nb as l,ob as P,pb as g,sb as M,ta as a,tb as y,ub as E,xb as A,yb as k}from"./chunk-PGWAQGBE.js";var X=()=>["/admin/pricing-plans"],J=r=>({productId:r}),Y=()=>["/admin/licenses"],Q=(r,o)=>o.id;function Z(r,o){r&1&&(t(0,"div",9),p(1,"div",12),t(2,"div",13),l(3,"Loading products..."),i()())}function ee(r,o){r&1&&(t(0,"div",9),p(1,"i",14),t(2,"div",15),l(3,"No products found"),i(),t(4,"div",16),l(5,"No product catalog entries exist yet."),i()())}function te(r,o){if(r&1){let e=v();t(0,"tr")(1,"td")(2,"span",19),l(3),i()(),t(4,"td")(5,"div",20),l(6),i()(),t(7,"td")(8,"a",21),p(9,"i",22),l(10),i()(),t(11,"td")(12,"a",23),p(13,"i",24),l(14),i()(),t(15,"td",18)(16,"div",25)(17,"button",26),c("click",function(){let n=m(e).$implicit,_=s(2);return u(_.openViewModal(n))}),p(18,"i",27),i(),t(19,"button",28),c("click",function(){let n=m(e).$implicit,_=s(2);return u(_.openEditModal(n))}),p(20,"i",29),i(),t(21,"button",30),c("click",function(){let n=m(e).$implicit,_=s(2);return u(_.confirmDelete(n))}),p(22,"i",31),i()()()()}if(r&2){let e=o.$implicit;a(3),g("#",e.id),a(3),P(e.name),a(2),f("routerLink",A(8,X))("queryParams",k(9,J,e.id)),a(2),g("",e.plansCount??0," configured plans "),a(2),f("routerLink",A(11,Y))("queryParams",k(12,J,e.id)),a(2),g("",e.licensesCount??0," active licenses ")}}function ie(r,o){if(r&1&&(t(0,"div",10)(1,"table",17)(2,"thead")(3,"tr")(4,"th"),l(5,"Product ID"),i(),t(6,"th"),l(7,"Product Name"),i(),t(8,"th"),l(9,"Pricing Plans"),i(),t(10,"th"),l(11,"Active Licenses"),i(),t(12,"th",18),l(13,"Actions"),i()()(),t(14,"tbody"),S(15,te,23,14,"tr",null,Q),i()()()),r&2){let e=s();a(15),w(e.products())}}function ne(r,o){r&1&&(t(0,"div",39),p(1,"div",42),i())}function oe(r,o){r&1&&(t(0,"div",43),l(1,"No pricing plans linked to this product."),i())}function re(r,o){if(r&1&&(t(0,"tr")(1,"td")(2,"span",19),l(3),i()(),t(4,"td",44),l(5),i(),t(6,"td",45),l(7),T(8,"centsToDollars"),i()()),r&2){let e=o.$implicit;a(3),g("#",e.id),a(2),P(e.plan_name),a(2),P(I(8,3,e.price_year_cents))}}function de(r,o){if(r&1&&(t(0,"div",10)(1,"table",17)(2,"thead")(3,"tr")(4,"th"),l(5,"Plan ID"),i(),t(6,"th"),l(7,"Plan Name"),i(),t(8,"th"),l(9,"Annual Price"),i()()(),t(10,"tbody"),S(11,re,9,5,"tr",null,Q),i()()()),r&2){let e=s();a(11),w(e.plans)}}function le(r,o){if(r&1&&x(0,oe,2,0,"div",43)(1,de,13,0,"div",10),r&2){let e=o;C(!e.plans||e.plans.length===0?0:1)}}function ae(r,o){if(r&1){let e=v();t(0,"div",32),c("click",function(){m(e);let n=s();return u(n.closeViewModal())}),i(),t(1,"div",33)(2,"div",34)(3,"h5",35),p(4,"i",36),l(5),i(),t(6,"button",37),c("click",function(){m(e);let n=s();return u(n.closeViewModal())}),i()(),t(7,"div",38),x(8,ne,2,0,"div",39)(9,le,2,1),i(),t(10,"div",40)(11,"button",41),c("click",function(){m(e);let n=s();return u(n.closeViewModal())}),l(12,"Close"),i()()()}if(r&2){let e,d,n=s();a(5),g(" ",(e=n.selectedProduct())==null?null:e.name," \u2014 Plans "),a(3),C(n.isLoadingDetail()?8:(d=n.productDetail())?9:-1,d)}}function se(r,o){r&1&&p(0,"span",54)}function ce(r,o){if(r&1){let e=v();t(0,"div",32),c("click",function(){m(e);let n=s();return u(n.closeCreateModal())}),i(),t(1,"div",46)(2,"div",34)(3,"h5",35),p(4,"i",47),l(5," Add Software Product "),i(),t(6,"button",37),c("click",function(){m(e);let n=s();return u(n.closeCreateModal())}),i()(),t(7,"div",38)(8,"form",48),c("ngSubmit",function(){m(e);let n=s();return u(n.submitCreate())}),t(9,"div",49)(10,"label",50),l(11,"Product Name *"),i(),t(12,"input",51),E("ngModelChange",function(n){m(e);let _=s();return y(_.nameInput,n)||(_.nameInput=n),u(n)}),i()(),t(13,"div",52)(14,"button",41),c("click",function(){m(e);let n=s();return u(n.closeCreateModal())}),l(15,"Cancel"),i(),t(16,"button",53),x(17,se,1,0,"span",54),l(18," Create Product "),i()()()()()}if(r&2){let e=s();a(12),M("ngModel",e.nameInput),a(4),f("disabled",e.isSubmitting()||!e.nameInput.trim()),a(),C(e.isSubmitting()?17:-1)}}function me(r,o){r&1&&p(0,"span",54)}function ue(r,o){if(r&1){let e=v();t(0,"div",32),c("click",function(){m(e);let n=s();return u(n.closeEditModal())}),i(),t(1,"div",46)(2,"div",34)(3,"h5",35),p(4,"i",55),l(5," Edit Product Name "),i(),t(6,"button",37),c("click",function(){m(e);let n=s();return u(n.closeEditModal())}),i()(),t(7,"div",38)(8,"form",48),c("ngSubmit",function(){m(e);let n=s();return u(n.submitEdit())}),t(9,"div",49)(10,"label",50),l(11,"Product Name *"),i(),t(12,"input",56),E("ngModelChange",function(n){m(e);let _=s();return y(_.nameInput,n)||(_.nameInput=n),u(n)}),i()(),t(13,"div",52)(14,"button",41),c("click",function(){m(e);let n=s();return u(n.closeEditModal())}),l(15,"Cancel"),i(),t(16,"button",53),x(17,me,1,0,"span",54),l(18," Save Changes "),i()()()()()}if(r&2){let e=s();a(12),M("ngModel",e.nameInput),a(4),f("disabled",e.isSubmitting()||!e.nameInput.trim()),a(),C(e.isSubmitting()?17:-1)}}var K=class r{api=h(U);toast=h(G);products=b([]);isLoading=b(!0);isSubmitting=b(!1);
1viewModalOpen=b(!1);createModalOpen=b(!1);editModalOpen=b(!1);deleteModalOpen=b(!1);selectedProduct=b(null);productDetail=b(null);isLoadingDetail=b(!1);nameInput="";ngOnInit(){this.loadProducts()}loadProducts(){this.isLoading.set(!0),this.api.getProducts().subscribe({next:o=>{this.isLoading.set(!1),this.products.set(o||[])},error:o=>{this.isLoading.set(!1),this.toast.error(o?.error?.error||"Failed to fetch products")}})}openViewModal(o){this.selectedProduct.set(o),this.viewModalOpen.set(!0),this.isLoadingDetail.set(!0),this.api.getProduct(o.id).subscribe({next:e=>{this.isLoadingDetail.set(!1),this.productDetail.set(e)},error:e=>{this.isLoadingDetail.set(!1),this.toast.error(e?.error?.error||"Failed to load product details")}})}closeViewModal(){this.viewModalOpen.set(!1),this.selectedProduct.set(null),this.productDetail.set(null)}openCreateModal(){this.nameInput="",this.createModalOpen.set(!0)}closeCreateModal(){this.createModalOpen.set(!1)}submitCreate(){this.nameInput.trim()&&(this.isSubmitting.set(!0),this.api.createProduct({name:this.nameInput.trim()}).subscribe({next:o=>{this.isSubmitting.set(!1),this.toast.success(`Product "${o.name}" added successfully.`,"Product Created"),this.closeCreateModal(),this.loadProducts()},error:o=>{this.isSubmitting.set(!1),this.toast.error(o?.error?.error||"Failed to create product")}}))}openEditModal(o){this.selectedProduct.set(o),this.nameInput=o.name,this.editModalOpen.set(!0)}closeEditModal(){this.editModalOpen.set(!1),this.selectedProduct.set(null)}submitEdit(){let o=this.selectedProduct();!o||!this.nameInput.trim()||(this.isSubmitting.set(!0),this.api.updateProduct(o.id,{name:this.nameInput.trim()}).subscribe({next:e=>{this.isSubmitting.set(!1),this.toast.success(`Product renamed to "${e.name}".`,"Product Updated"),this.closeEditModal(),this.loadProducts()},error:e=>{this.isSubmitting.set(!1),this.toast.error(e?.error?.error||"Failed to update product")}}))}confirmDelete(o){this.selectedProduct.set(o),this.deleteModalOpen.set(!0)}closeDeleteModal(){this.deleteModalOpen.set(!1),this.selectedProduct.set(null)}submitDelete(){let o=this.selectedProduct();o&&(this.isSubmitting.set(!0),this.api.deleteProduct(o.id).subscribe({next:()=>{this.isSubmitting.set(!1),this.toast.success(`Product "${o.name}" deleted.`,"Product Deleted"),this.closeDeleteModal(),this.loadProducts()},error:e=>{this.isSubmitting.set(!1);let d=e?.status===409?`Cannot delete "${o.name}": It is referenced by active pricing plans or licenses.`:e?.error?.error||"Failed to delete product";this.toast.error(d,"Conflict")}}))}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=V({type:r,selectors:[["app-admin-products"]],decls:23,vars:11,consts:[[1,"admin-page-header"],[1,"admin-title"],[1,"admin-subtitle"],[1,"d-flex","align-items-center","gap-2","mt-2","mt-md-0"],[1,"btn","btn-sm","btn-outline-light","d-flex","align-items-center","gap-2","px-3",3,"click","disabled"],[1,"bi","bi-arrow-clockwise"],[1,"btn","btn-sm","btn-primary","d-flex","align-items-center","gap-2","px-3",3,"click"],[1,"bi","bi-plus-circle"],[1,"admin-card"],[1,"text-center","py-5"],[1,"admin-table-container"],["title","Delete Product","confirmText","Delete Product",3,"confirmed","cancelled","isOpen","message","isDanger","isLoading"],["role","status",1,"spinner-border","text-primary","spinner-border-sm"],[1,"text-muted","small","mt-2"],[1,"bi","bi-box-seam","fs-1","text-muted"],[1,"text-white","fw-bold","mt-2"],[1,"text-muted","small"],[1,"admin-table"],[1,"text-end"],[1,"mono-code"],[1,"fw-bold","text-white","fs-6"],[1,"badge","bg-primary-subtle","text-primary","border","border-primary-subtle","text-decoration-none",3,"routerLink","queryParams"],[1,"bi","bi-tags","me-1"],[1,"badge","bg-success-subtle","text-success","border","border-success-subtle","text-decoration-none",3,"routerLink","queryParams"],[1,"bi","bi-key","me-1"],[1,"btn-group","btn-group-sm"],["title","View Plans",1,"btn","btn-outline-info","py-1","px-2",3,"click"],[1,"bi","bi-eye"],["title","Edit Name",1,"btn","btn-outline-primary","py-1","px-2",3,"click"],[1,"bi","bi-pencil"],["t
1itle","Delete Product",1,"btn","btn-outline-danger","py-1","px-2",3,"click"],[1,"bi","bi-trash"],[1,"admin-modal-backdrop",3,"click"],[1,"admin-modal-dialog",2,"max-width","580px"],[1,"admin-modal-header"],[1,"admin-card-title"],[1,"bi","bi-box-seam","text-info"],["type","button",1,"btn-close","btn-close-white",3,"click"],[1,"admin-modal-body"],[1,"text-center","py-4"],[1,"admin-modal-footer"],["type","button",1,"btn","btn-sm","btn-secondary","px-3",3,"click"],["role","status",1,"spinner-border","spinner-border-sm","text-primary"],[1,"text-muted","small","text-center","p-3"],[1,"fw-semibold","text-white"],[1,"text-success","fw-bold"],[1,"admin-modal-dialog",2,"max-width","480px"],[1,"bi","bi-plus-circle","text-primary"],[3,"ngSubmit"],[1,"mb-3"],[1,"form-label","small","text-muted"],["type","text","name","product_name","placeholder","e.g. AD Reporter Pro","required","",1,"form-control","form-control-sm","bg-dark","border-secondary","text-white",3,"ngModelChange","ngModel"],[1,"admin-modal-footer","px-0","pb-0"],["type","submit",1,"btn","btn-sm","btn-primary","px-3",3,"disabled"],["role","status",1,"spinner-border","spinner-border-sm","me-1"],[1,"bi","bi-pencil","text-primary"],["type","text","name","edit_product_name","required","",1,"form-control","form-control-sm","bg-dark","border-secondary","text-white",3,"ngModelChange","ngModel"]],template:function(e,d){if(e&1&&(t(0,"div",0)(1,"div")(2,"h1",1),l(3,"Products Catalog"),i(),t(4,"p",2),l(5,"Maintain software products, view tier plans count, and track associated licenses"),i()(),t(6,"div",3)(7,"button",4),c("click",function(){return d.loadProducts()}),p(8,"i",5),t(9,"span"),l(10,"Refresh"),i()(),t(11,"button",6),c("click",function(){return d.openCreateModal()}),p(12,"i",7),t(13,"span"),l(14,"Add Product"),i()()()(),t(15,"div",8),x(16,Z,4,0,"div",9)(17,ee,6,0,"div",9)(18,ie,17,0,"div",10),i(),x(19,ae,13,2),x(20,ce,19,3),x(21,ue,19,3),t(22,"app-confirm-modal",11),c("confirmed",function(){return d.submitDelete()})("cancelled",function(){return d.closeDeleteModal()}),i()),e&2){let n;a(7),f("disabled",d.isLoading()),a(),D("spin-icon",d.isLoading()),a(8),C(d.isLoading()?16:d.products().length===0?17:18),a(3),C(d.viewModalOpen()?19:-1),a(),C(d.createModalOpen()?20:-1),a(),C(d.editModalOpen()?21:-1),a(),f("isOpen",d.deleteModalOpen())("message","Are you sure you want to delete product "+(((n=d.selectedProduct())==null?null:n.name)||"")+"? Note that products with active pricing plans or licenses cannot be deleted (will return 409 Conflict).")("isDanger",!0)("isLoading",d.isSubmitting())}},dependencies:[N,j,R,L,F,q,B,$,W,O,H,z],styles:[".spin-icon[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_spin 1s linear infinite}@keyframes _ngcontent-%COMP%_spin{to{transform:rotate(360deg)}}"]})};export{K as AdminProductsComponent};
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.