1import{a as fe}from"./chunk-7CA34R3S.js";import{a as be}from"./chunk-NTBZFFFQ.js";import{b as Ce}from"./chunk-A5OFHHTD.js";import{a as ue}from"./chunk-4RYFDBZF.js";import{a as re}from"./chunk-JK3MN647.js";import"./chunk-R5R5Y7XJ.js";import{a as he}from"./chunk-2ZBBJ6MB.js";import"./chunk-DP73ZOCP.js";import{a as ye}from"./chunk-CUKO45N5.js";import"./chunk-DJ3AICMX.js";import"./chunk-BAFTGVBD.js";import{a as pe}from"./chunk-C4JTAHPC.js";import{a as te}from"./chunk-NFWLGMSZ.js";import{a as me}from"./chunk-RA7B74KL.js";import{a as ae}from"./chunk-WO7OOYRL.js";import{a as se,g as ce,h as ge}from"./chunk-KCRTBF3Z.js";import"./chunk-IRCCO3CH.js";import"./chunk-PD5VQJGQ.js";import{a as le}from"./chunk-EEMK3WR5.js";import{a as ie}from"./chunk-ZVP6UFJG.js";import{c as de}from"./chunk-SFQLOP3C.js";import{a as P}from"./chunk-OXPW7MZS.js";import"./chunk-3Y4VYNIU.js";import"./chunk-6Q6O7VIC.js";import{j as ee}from"./chunk-ODYJMLFL.js";import{b as ne,c as oe}from"./chunk-EZVCPOKZ.js";import"./chunk-BOBLGWLY.js";import{$a as Q,Ab as c,Bb as I,Bc as T,F as k,Gb as q,Ib as D,Kb as m,N as M,Ob as W,Pa as l,Pb as S,Qb as w,S as F,X as g,Yb as h,Zb as _,_b as Z,ba as b,ca as v,cd as Y,gb as j,ha as z,j as R,oa as u,pb as J,rb as V,tb as O,tc as y,u as U,ua as X,uc as C,vc as G,xc as L,yb as B,z as x,zb as d}from"./chunk-4ILHUPPR.js";import{a as K,b as A}from"./chunk-Q7L6LLAK.js";var N=class r{http=g(le);baseUrl=`${ie.apiUrl}/v1/admin/remote-config`;getEntries(e,t,i,n,o,s){let a={};return e!==void 0&&(a.page=e),t!==void 0&&(a.size=t),i&&(a.apiKeyId=i),n&&(a.search=n),o&&(a.sortBy=o),s&&(a.sortDirection=s),this.http.get(this.baseUrl,{params:a})}getEntry(e){return this.http.get(`${this.baseUrl}/${e}`)}getEntriesByApiKey(e,t,i){let n={};return t!==void 0&&(n.page=t),i!==void 0&&(n.size=i),this.http.get(`${this.baseUrl}/api-key/${e}`,{params:n})}createEntry(e){return this.http.post(this.baseUrl,e)}bulkCreateEntries(e){return this.http.post(`${this.baseUrl}/bulk`,e)}deleteEntry(e){return this.http.delete(`${this.baseUrl}/${e}`)}bulkDeleteEntries(e){return this.http.post(`${this.baseUrl}/bulk-delete`,{ids:e})}deleteEntryByKey(e,t){return this.http.delete(`${this.baseUrl}/api-key/${e}/key/${t}`)}getLimitsByApiKey(e){return this.http.get(`${this.baseUrl}/api-key/${e}/limits`)}getStatistics(){return this.http.get(`${this.baseUrl}/statistics`)}static \u0275fac=function(t){return new(t||r)};static \u0275prov=F({token:r,factory:r.\u0275fac,providedIn:"root"})};var $=class r{_isLoading=u(!1);_error=u(null);_entries=u([]);_limits=u({});_statistics=u(null);_operationLoading=u(new Set);isLoading=this._isLoading.asReadonly();error=this._error.asReadonly();entries=this._entries.asReadonly();limits=this._limits.asReadonly();statistics=this._statistics.asReadonly();operationLoading=this._operationLoading.asReadonly();api=g(N);log=g(me);errorHandleUtils=g(pe);transformEntry(e){return{id:e.id,accountId:e.accountId,apiKeyId:e.apiKeyId,apiKeyName:e.apiKeyName,configKey:e.configKey,configValue:e.configValue,totalLength:e.totalLength,isActive:e.isActive,createdAt:new Date(e.createdAt),updatedAt:new Date(e.updatedAt)}}loadEntries(e,t,i,n,o,s){return this._isLoading.set(!0),this._error.set(null),this.api.getEntries(e,t,i,n,o,s).pipe(M(a=>{let p=a.entries.map(f=>this.transformEntry(f));this._entries.set(p)}),x(a=>{let p=this.errorHandleUtils.getHttpErrorMessage(a);return this._error.set(p),this.log.error("Failed to load remote config entries:",a),R(()=>new Error(p))}),k(()=>this._isLoading.set(!1)))}loadLimitsByApiKey(e){return this.api.getLimitsByApiKey(e).pipe(M(t=>{this._limits.update(i=>A(K({},i),{[e]:t}))}),x(t=>{let i=this.errorHandleUtils.getHttpErrorMessage(t);return this.log.error("Failed to load remote config limits:",t),R(()=>new Error(i))}))}loadStatistics(){return this.api.getStatistics().pipe(M(e=>{this._statistics.set(e)}),x(e=>{let t=this.errorHandleUtils.getHttpErrorMessage(e);return this.log.error("Failed to load remote config statistics:",e),R(()=>new Error(t))}))}loadAll(e,t,i,n,o,s){return this._isLoading.set(!0),this._error.set(null),U({entries:this.api.getEntries(e,t,i,n,o,s),statistics:this.api.getStatistics()}).pipe(M(({entries:a,statistics:p})=>
1{let f=a.entries.map(E=>this.transformEntry(E));this._entries.set(f),this._statistics.set(p)}),x(a=>{let p=this.errorHandleUtils.getHttpErrorMessage(a);return this._error.set(p),this.log.error("Failed to load remote config data:",a),R(()=>new Error(p))}),k(()=>this._isLoading.set(!1)))}createEntry(e){return this._isLoading.set(!0),this._error.set(null),this.api.createEntry(e).pipe(M(t=>{let i=this.transformEntry(t);this._entries.update(o=>[...o,i]);let n=this._statistics();n&&this._statistics.set(A(K({},n),{total:n.total+1,entriesPerApiKey:A(K({},n.entriesPerApiKey),{[e.apiKeyId]:(n.entriesPerApiKey[e.apiKeyId]||0)+1})}))}),x(t=>{let i=this.errorHandleUtils.getHttpErrorMessage(t);return this._error.set(i),R(()=>new Error(i))}),k(()=>this._isLoading.set(!1)))}bulkCreateEntries(e){return this._isLoading.set(!0),this._error.set(null),this.api.bulkCreateEntries(e).pipe(M(t=>{this.loadEntries(0,1e4).subscribe()}),x(t=>{let i=this.errorHandleUtils.getHttpErrorMessage(t);return this._error.set(i),R(()=>new Error(i))}),k(()=>this._isLoading.set(!1)))}deleteEntry(e){return this.setOperationLoading(e,!0),this._error.set(null),this.api.deleteEntry(e).pipe(M(()=>{this._entries.update(i=>i.filter(n=>n.id!==e));let t=this._statistics();t&&this._statistics.set(A(K({},t),{total:Math.max(0,t.total-1)}))}),x(t=>{let i=this.errorHandleUtils.getHttpErrorMessage(t);return this._error.set(i),R(()=>new Error(i))}),k(()=>this.setOperationLoading(e,!1)))}deleteEntryByKey(e,t){let i=`${e}:${t}`;return this.setOperationLoading(i,!0),this._error.set(null),this.api.deleteEntryByKey(e,t).pipe(M(()=>{this._entries.update(n=>n.filter(o=>!(o.apiKeyId===e&&o.configKey===t)))}),x(n=>{let o=this.errorHandleUtils.getHttpErrorMessage(n);return this._error.set(o),R(()=>new Error(o))}),k(()=>this.setOperationLoading(i,!1)))}bulkDeleteEntries(e){return this._isLoading.set(!0),this._error.set(null),this.api.bulkDeleteEntries(e).pipe(M(t=>{let i=new Set(t.results.filter(o=>o.success).map(o=>o.id));this._entries.update(o=>o.filter(s=>!i.has(s.id)));let n=this._statistics();n&&this._statistics.set(A(K({},n),{total:Math.max(0,n.total-t.successful)}))}),x(t=>{let i=this.errorHandleUtils.getHttpErrorMessage(t);return this._error.set(i),R(()=>new Error(i))}),k(()=>this._isLoading.set(!1)))}isOperationLoading(e){return this._operationLoading().has(e)}getLimitsForApiKey(e){return this._limits()[e]}getEntryById(e){return this._entries().find(t=>t.id===e)}setOperationLoading(e,t){this._operationLoading.update(i=>{let n=new Set(i);return t?n.add(e):n.delete(e),n})}static \u0275fac=function(t){return new(t||r)};static \u0275prov=F({token:r,factory:r.\u0275fac,providedIn:"root"})};var xe=["configKeyTpl"],Me=["configValueTpl"],Te=["apiKeyTpl"],Ee=["charsTpl"],ke=["dateTpl"];function Ke(r,e){if(r&1){let t=q();d(0,"div",10)(1,"span",11),h(2),c(),d(3,"button",12),y(4,"translate"),D("click",function(n){let o=b(t).$implicit;return m().copyToClipboard(o.configKey),v(n.stopPropagation())}),I(5,"app-icon",13),c()()}if(r&2){let t=e.$implicit;l(2),_(t.configKey),l(),J("data-testid","remote-config-copy-key-"+t.configKey)("aria-label",C(4,3,"remoteConfigManagement.table.copyKey"))}}function Ae(r,e){if(r&1&&(d(0,"span",14),h(1),c()),r&2){let t=e.$implicit,i=m();l(),_(i.truncateText(t.configValue,50))}}function Be(r,e){if(r&1&&(d(0,"span",16),h(1),c(),d(2,"span",17),h(3),c()),r&2){let t=e;l(),_(t.entityName),l(2),Z("(",t.keyPrefix,")")}}function Se(r,e){r&1&&(d(0,"span",15),h(1),y(2,"translate"),c()),r&2&&(l(),_(C(2,1,"remoteConfigManagement.details.unknownApiKey")))}function we(r,e){if(r&1&&V(0,Be,4,2)(1,Se,3,3,"span",15),r&2){let t,i=e.$implicit,n=m();O((t=n.getApiKeyById(i.apiKeyId))?0:1,t)}}function Le(r,e){if(r&1&&(d(0,"span",16),h(1),c()),r&2){let t=e.$implicit;l(),_(t.totalLength)}}function Ie(r,e){if(r&1&&(d(0,"span",15),h(1),y(2,"date"),c()),r&2){let t=e.$implicit;l(),_(G(2,1,t.createdAt,"short"))}}function De(r,e){r&1&&(d(0,"div",8)(1,"div",18)(2,"div",19),I(3,"a
1pp-icon",20),c(),d(4,"h2",21),h(5),y(6,"translate"),c(),d(7,"p",22),h(8),y(9,"translate"),c(),d(10,"a",23),y(11,"localize"),I(12,"app-icon",24),d(13,"span"),h(14),y(15,"translate"),c()()()()),r&2&&(l(5),_(C(6,4,"remoteConfigManagement.noApiKeys")),l(3),_(C(9,6,"remoteConfigManagement.noApiKeysDescription")),l(2),B("routerLink",C(11,8,"/dashboard/api-key-management")),l(4),_(C(15,10,"remoteConfigManagement.createApiKey")))}function Fe(r,e){if(r&1){let t=q();d(0,"section",9)(1,"div",25)(2,"h2",26),h(3),y(4,"translate"),c()(),d(5,"app-data-table",27),D("emptyActionClick",function(){b(t);let n=m();return v(n.openCreateModal())})("createClick",function(){b(t);let n=m();return v(n.openCreateModal())})("headerButtonClick",function(n){b(t);let o=m();return v(o.onHeaderButtonClick(n))})("filterChange",function(n){b(t);let o=m();return v(o.onDataTableFilterChange(n))})("clearFilters",function(){b(t);let n=m();return v(n.clearFilters())})("pageChange",function(n){b(t);let o=m();return v(o.onDataTablePageChange(n))})("actionClick",function(n){b(t);let o=m();return v(o.onDataTableActionClick(n))})("bulkAction",function(n){b(t);let o=m();return v(o.onDataTableBulkAction(n))})("refreshClick",function(){b(t);let n=m();return v(n.refreshData())}),c()()}if(r&2){let t=m();l(3),_(C(4,25,"remoteConfigManagement.title")),l(2),B("multiSelect",!0)("pageTitle","")("pageSubtitle","")("createButtonLabel","remoteConfigManagement.createNew")("headerButtons",t.headerButtonsConfig())("filters",t.filterConfig())("columns",t.columnConfig())("data",t.paginatedEntries())("actions",t.actionConfig)("bulkActions",t.bulkActionConfig)("totalItems",t.filteredEntries().length)("currentPage",t.currentPage())("pageSize",t.pageSize())("pageSizeOptions",t.pageSizeOptions)("loading",t.isLoading())("error",t.error()??void 0)("hasActiveFilters",t.hasActiveFiltersComputed())("emptyIcon","cloud")("emptyTitle","remoteConfigManagement.noEntriesFound")("emptyDescription","remoteConfigManagement.noEntriesDescription")("emptyActionLabel","remoteConfigManagement.createNew")("emptyNoMatchTitle","remoteConfigManagement.filter.noResults")("emptyNoMatchDescription","remoteConfigManagement.filter.noResultsDescription")("avatarIcon","settings")}}var _e=class r{remoteConfigService=g($);apiKeyService=g(fe);authService=g(ce);toast=g(de);modalService=g(ye);translate=g(ne);destroyRef=g(z);apiKeyContext=g(ge);entries=this.remoteConfigService.entries;isLoading=this.remoteConfigService.isLoading;error=this.remoteConfigService.error;operationLoading=this.remoteConfigService.operationLoading;limits=this.remoteConfigService.limits;statistics=this.remoteConfigService.statistics;apiKeys=this.apiKeyService.apiKeys;Role=te;ApiKeyStatus=se;tabs=[{id:"overview",labelKey:"remoteConfigManagement.tabs.overview"}];activeTabId=u("overview");featureStatCards=T(()=>{let e=this.statistics(),t=this.limits();if(!e)return[];let i=[];i.push({labelKey:"remoteConfigManagement.stats.total",value:e.total,icon:"package",variant:"default"}),e.avgCharsPerEntry!==void 0&&i.push({labelKey:"remoteConfigManagement.stats.avgChars",value:e.avgCharsPerEntry,icon:"bar-chart",variant:"default"});let n=t&&t.maxEntries?Number(t.maxEntries):e.maxLimit||1;return i.push({labelKey:"remoteConfigManagement.cards.limit",value:`${e.total} / ${n}`,icon:"database",variant:"limit",progress:{current:e.total,max:n}}),i});searchQuery=u("");pageSize=u(25);currentPage=u(0);pageSizeOptions=[10,20,25,50,100,250,500,1e3];activeApiKeys=T(()=>this.apiKeys().filter(e=>e.status==="ACTIVE"));filteredEntries=T(()=>{let e=this.entries(),t=this.searchQuery().toLowerCase().trim(),i=this.apiKeyContext.selectedApiKeyId();return t&&(e=e.filter(n=>n.configKey.toLowerCase().includes(t)||n.configValue.toLowerCase().includes(t))),i!==""&&(e=e.filter(n=>n.apiKeyId===i)),e});paginatedEntries=T(()=>{let e=this.filteredEntries(),t=this.currentPage(),i=this.pageSize(),n=t*i,o=n+i;return e.slice(n,o)});totalPages=T(()=>Math.ceil(this.filteredEntries().length/this.pageSize()));configKeyTpl;configValueTpl;apiKeyTpl;charsTpl;dateTpl;columnConfig=u([]);filterConfig=T(()=>[{key:"search",label:"remoteConfigManagement.filter.search",type:"text",placeholder:"remoteConfigManagement.filter.searchPlaceholder",fullWidth:!0}]);actionConfig=[{label:"remoteConfigManagement.table.detailsLabel",icon:"eye",action:"details"},{label:"remoteConfigManagement.table.editLabel",icon:"edit",action:"edit"},{label:"remoteConfigManagement.table.deleteLabel",icon:"trash-2",action:"delete",color:"danger"}];headerButtonsConfig=T(()=>[{label:"remoteConfigManagement.bulk.importButton",icon:"download",action:"bulkImport",color:"secondary",disabled:this.isLoading()||this.activeApiKeys().length===0}]);bulkActionConfig=[{label:"remoteConfigManagement.bulkActions.deleteButton",icon:"trash-2",action:"bulkDelete",color:"danger"}];hasActiveFiltersComputed=T(()=>this.searchQuery()!==""||this.apiKeyContext.hasSpecificKey());constructor(){X(()=>{this.apiKeyContext.selectedApiKeyId(),this.loadData()})}ngOnInit(){this.loadApiKeys()}ngAfterViewInit(){this.columnConfig.set([{key:"configKey",label:"remoteConfigManagement.table.configKeyHeader",cellTemplate:this.configKeyTpl},{key:"configValue",label:"remoteConfigManagement.table.configValueHeader",cellTemplate:this.configValueTpl},{key:"apiKeyId",label:"remoteConfigManagement.table.apiKeyHeader",hiddenBelow:"lg",cellTemplate:this.apiKeyTpl},{key:"totalLength",label:"remoteConfigManagement.table.charsHeader",hiddenBelow:"lg",cellTemplate:this.charsTpl},{key:"createdAt",label:"remoteConfigManagement.table.createdAtHeader",hiddenBelow:"lg",cellTemplate:this.dateTpl}])}ngOnDestroy(){}
1loadData(){this.remoteConfigService.loadAll(0,1e4).pipe(P(this.destroyRef)).subscribe({next:()=>{},error:e=>{console.error("Failed to load remote config entries:",e)}})}loadApiKeys(){this.apiKeyService.loadApiKeys().pipe(P(this.destroyRef)).subscribe({next:()=>{},error:e=>{console.error("Failed to load API keys:",e)}})}onDataTableFilterChange(e){e.search!==void 0&&this.searchQuery.set(e.search),this.currentPage.set(0)}onDataTablePageChange(e){this.pageSize.set(e.pageSize),e.page>=0&&e.page<this.totalPages()?this.currentPage.set(e.page):this.currentPage.set(0)}onDataTableActionClick(e){let t=e.row;e.action==="details"?this.openDetailsModal(t):e.action==="edit"?this.openEditModal(t):e.action==="delete"&&this.openDeleteModal(t)}onHeaderButtonClick(e){e==="bulkImport"&&this.openBulkImportModal()}onDataTableBulkAction(e){e.action==="bulkDelete"&&this.showBulkDeleteModal(Array.from(e.selectedIds))}showBulkDeleteModal(e){let t=e.length;if(t===0)return;let i={title:this.translate.instant("remoteConfigManagement.bulkActions.deleteTitle"),size:"md",fields:[{type:"TEXT",id:"warning",label:this.translate.instant("remoteConfigManagement.bulkActions.deleteWarning",{count:t}),value:"",readonly:!0}],confirmButton:!0,confirmText:this.translate.instant("remoteConfigManagement.bulkActions.deleteConfirm",{count:t}),confirmCss:"bg-destructive hover:bg-destructive/90 text-destructive-foreground",cancelButton:!0,cancelText:this.translate.instant("common.cancel"),showCloseButton:!0};this.modalService.open(i).subscribe({next:n=>{n.confirmed&&this.bulkDelete(e)}})}bulkDelete(e){this.remoteConfigService.bulkDeleteEntries(e).pipe(P(this.destroyRef)).subscribe({next:t=>{this.handleBulkResult(t.successful,t.failed)},error:()=>{this.handleBulkResult(0,e.length)}})}handleBulkResult(e,t){t===0?this.toast.success(this.translate.instant("remoteConfigManagement.bulkActions.success",{count:e})):e>0?this.toast.warning(this.translate.instant("remoteConfigManagement.bulkActions.partialSuccess",{deleted:e,failed:t})):this.toast.error(this.translate.instant("remoteConfigManagement.bulkActions.error"))}clearFilters(){this.searchQuery.set(""),this.apiKeyContext.selectApiKey(""),this.currentPage.set(0)}refreshData(){this.loadData()}openCreateModal(){let e=this.activeApiKeys().map(a=>({value:a.id,label:`${a.entityName} (${a.keyPrefix})`}));if(e.length===0){this.toast.error("remoteConfigManagement.create.noApiKeysAvailable");return}let t=this.apiKeyContext.selectedApiKeyId(),i=t&&e.some(a=>a.value===t)?t:e[0]?.value||"",o={title:"remoteConfigManagement.create.title",fields:[{id:"apiKeyId",type:"SELECT",label:"remoteConfigManagement.apiKey",required:!0,options:e,value:i,readonly:!1},{id:"configKey",type:"TEXT",label:"remoteConfigManagement.configKey",placeholder:"remoteConfigManagement.configKeyPlaceholder",required:!0,validation:{minLength:1,maxLength:100,pattern:"^[a-zA-Z0-9_.-]+$"},readonly:!1},{id:"configValue",type:"TEXTAREA",label:"remoteConfigManagement.configValue",placeholder:"remoteConfigManagement.configValuePlaceholder",required:!0,validation:{minLength:1,maxLength:256},readonly:!1},{id:"charCounter",type:"TEXTBOX",label:"",text:"remoteConfigManagement.create.characterCounterHelp",cssClass:"text-foreground bg-muted/30 border border-border rounded p-2 text-sm mt-2",readonly:!1}],confirmButton:!0,confirmText:"remoteConfigManagement.create.createButton",cancelButton:!0,cancelText:"remoteConfigManagement.create.cancel",showCloseButton:!0,closeOnBackdrop:!1,size:"lg"};this.modalService.open(o).subscribe({next:a=>{a.confirmed&&a.data&&this.handleCreateEntry(a.data)},error:a=>{console.error("Create modal error:",a)}})}handleCreateEntry(e){if(!e.configKey?.trim()){this.toast.error("remoteConfigManagement.configKeyRequired");return}if(!e.configValue?.trim()){this.toast.error("remoteConfigManagement.configValueRequired");return}if(!e.apiKeyId){this.toast.error("remoteConfigManagement.apiKeyRequired");return}if(!/^[a-zA-Z0-9_.-]+$/.test(e.configKey.trim())){this.toast.error("remoteConfigManagement.create.invalidKeyPattern");return}let i=e.configKey.trim().length+e.configValue.trim().length,n=this.authService.currentAccount(),o=this.getMaxCharsForRole(n?.role||"FREE");
1if(i>o){this.toast.error(this.translate.instant("remoteConfigManagement.create.characterLimitExceeded",{max:o}));return}let s={apiKeyId:e.apiKeyId,configKey:e.configKey.trim(),configValue:e.configValue.trim()};this.remoteConfigService.createEntry(s).subscribe({next:()=>{this.toast.success("remoteConfigManagement.create.success")},error:()=>{this.toast.error("remoteConfigManagement.create.error")}})}openEditModal(e){let i={title:"remoteConfigManagement.edit.title",fields:[{id:"configKeyDisplay",type:"TEXT",label:"remoteConfigManagement.configKey",value:e.configKey,readonly:!0,disabled:!0},{id:"keyCannotChange",type:"TEXTBOX",label:"",text:"remoteConfigManagement.edit.keyCannotChange",cssClass:"text-warning text-sm mb-2",readonly:!1},{id:"configValue",type:"TEXTAREA",label:"remoteConfigManagement.configValue",placeholder:"remoteConfigManagement.configValuePlaceholder",required:!0,validation:{minLength:1,maxLength:256},value:e.configValue,readonly:!1},{id:"charCounter",type:"TEXTBOX",label:"",text:"remoteConfigManagement.edit.characterCounterHelp",cssClass:"text-foreground bg-muted/30 border border-border rounded p-2 text-sm mt-2",readonly:!1}],confirmButton:!0,confirmText:"remoteConfigManagement.edit.saveButton",cancelButton:!0,cancelText:"remoteConfigManagement.edit.cancel",showCloseButton:!0,closeOnBackdrop:!1,size:"lg"};this.modalService.open(i).subscribe({next:o=>{o.confirmed&&o.data&&this.handleUpdateEntry(e,o.data)},error:o=>{console.error("Edit modal error:",o)}})}handleUpdateEntry(e,t){if(!t.configValue?.trim()){this.toast.error("remoteConfigManagement.configValueRequired");return}let i=e.configKey.length+t.configValue.trim().length,n=this.authService.currentAccount(),o=this.getMaxCharsForRole(n?.role||"FREE");if(i>o){this.toast.error(this.translate.instant("remoteConfigManagement.edit.characterLimitExceeded",{max:o}));return}let s={apiKeyId:e.apiKeyId,configKey:e.configKey,configValue:t.configValue.trim()};this.remoteConfigService.createEntry(s).subscribe({next:()=>{this.toast.success("remoteConfigManagement.edit.success")},error:()=>{this.toast.error("remoteConfigManagement.edit.error")}})}openDeleteModal(e){let i={title:"remoteConfigManagement.delete.title",fields:[{id:"entryInfo",type:"TEXTBOX",label:"",text:`${e.configKey}`,cssClass:"border border-border bg-muted/30 rounded p-3 mb-4 font-mono",readonly:!1},{id:"warning",type:"TEXTBOX",label:"",text:"remoteConfigManagement.delete.warning",cssClass:"border border-error bg-error text-error-foreground rounded p-4",readonly:!1},{id:"warningDetails",type:"TEXTBOX",label:"",text:"remoteConfigManagement.delete.warningDetails",cssClass:"text-error text-sm",readonly:!1}],confirmButton:!0,confirmText:"remoteConfigManagement.delete.deleteButton",cancelButton:!0,cancelText:"remoteConfigManagement.delete.cancel",showCloseButton:!0,closeOnBackdrop:!1,size:"md"};this.modalService.open(i).subscribe({next:o=>{o.confirmed&&this.handleDeleteEntry(e.id)},error:o=>{console.error("Delete modal error:",o)}})}handleDeleteEntry(e){this.remoteConfigService.deleteEntry(e).subscribe({next:()=>{this.toast.success("remoteConfigManagement.delete.success")},error:()=>{this.toast.error("remoteConfigManagement.delete.error")}})}openBulkImportModal(){let e=this.activeApiKeys().map(a=>({value:a.id,label:`${a.entityName} (${a.keyPrefix})`})),t=this.apiKeyContext.selectedApiKeyId(),i=t&&e.some(a=>a.value===t)?t:e[0]?.value||"",o={title:"remoteConfigManagement.bulk.title",fields:[{id:"apiKeyId",type:"SELECT",label:"remoteConfigManagement.apiKey",required:!0,options:e,value:i,readonly:!1},{id:"entriesJson",type:"TEXTAREA",label:"remoteConfigManagement.bulk.entriesJson",placeholder:"remoteConfigManagement.bulk.entriesJsonPlaceholder",required:!0,readonly:!1},{id:"formatHelp",type:"TEXTBOX",label:"",text:"remoteConfigManagement.bulk.formatHelp",cssClass:"text-white/70 text-sm mt-1",readonly:!1}],confirmButton:!0,confirmText:"remoteConfigManagement.bulk.importButton",cancelButton:!0,cancelText:"remoteConfigManagement.bulk.cancel",showCloseButton:!0,closeOnBackdrop:!1,size:"lg"};this.modalService.open(o).subscribe({next:a=>{a.confirmed&&a.data&&this.handleBulkImport(a.data)},error:a=>{console.error("Bulk import modal error:",a)}})}handleBulkImport(e){if(!e.apiKeyId){this.toast.error("remoteConfigManagement.apiKeyRequired");return}if(!e.entriesJson?.trim()){this.toast.error("remoteConfigManagement.bulk.entr
1iesRequired");return}let t;try{t=JSON.parse(e.entriesJson)}catch{this.toast.error("remoteConfigManagement.bulk.invalidJson");return}let i;if(Array.isArray(t))i=t;else if(typeof t=="object"&&t!==null)i=Object.entries(t).map(([s,a])=>({configKey:s,configValue:String(a)}));else{this.toast.error("remoteConfigManagement.bulk.invalidJson");return}if(i.length===0){this.toast.error("remoteConfigManagement.bulk.entriesRequired");return}let n=this.remoteConfigService.getLimitsForApiKey(e.apiKeyId);if(n){let s=n.maxEntries,a=n.currentCount??0;if(s!=null){let f=Math.max(s-a,0);if(i.length>f){this.toast.error(this.translate.instant("remoteConfigManagement.bulk.tooManyEntries",{requested:i.length,remaining:f,max:s}));return}}let p=n.maxCharsPerEntry;if(p!=null){let f=[];for(let E of i){let H=E.configKey?.length??0,Re=E.configValue?.length??0;H+Re>p&&f.push(E.configKey)}if(f.length>0){let E=f.slice(0,3).join(", "),H=f.length>3?`${E}, +${f.length-3}`:E;this.toast.error(this.translate.instant("remoteConfigManagement.bulk.charsExceeded",{count:f.length,max:p,keys:H}));return}}}let o={apiKeyId:e.apiKeyId,entries:i};this.remoteConfigService.bulkCreateEntries(o).subscribe({next:s=>{this.toast.success(this.translate.instant("remoteConfigManagement.bulk.success",{successful:s.successful,failed:s.failed}))},error:()=>{this.toast.error("remoteConfigManagement.bulk.error")}})}openDetailsModal(e){let t=this.apiKeys().find(s=>s.id===e.apiKeyId),n={fields:[{id:"configKey",type:"TEXT",label:"remoteConfigManagement.configKey",value:e.configKey,readonly:!0,disabled:!1,showCopyButton:!0},{id:"configValue",type:"TEXTAREA",label:"remoteConfigManagement.configValue",value:e.configValue,readonly:!0,disabled:!1},{id:"apiKey",type:"TEXT",label:"remoteConfigManagement.apiKey",value:t?`${t.entityName} (${t.keyPrefix})`:this.translate.instant("remoteConfigManagement.details.unknownApiKey"),readonly:!0,disabled:!1},{id:"totalLength",type:"TEXT",label:"remoteConfigManagement.totalLength",value:e.totalLength.toString(),readonly:!0,disabled:!1},{id:"createdAt",type:"TEXT",label:"remoteConfigManagement.details.createdAt",value:this.formatDateTime(e.createdAt),readonly:!0,disabled:!1},{id:"updatedAt",type:"TEXT",label:"remoteConfigManagement.details.updatedAt",value:this.formatDateTime(e.updatedAt),readonly:!0,disabled:!1}],title:`${this.translate.instant("remoteConfigManagement.details.title")} - ${e.configKey}`,showCloseButton:!0,closeOnBackdrop:!0,size:"lg",confirmButton:!1,cancelButton:!0,cancelText:"common.close",cancelCss:"px-4 py-2 bg-primary text-primary-foreground hover:text-secondary-foreground hover:bg-secondary rounded-md transition-colors"};this.modalService.open(n).subscribe({next:()=>{},error:s=>{console.error("Details modal error:",s)}})}copyToClipboard(e){navigator.clipboard.writeText(e).then(()=>{this.toast.success("remoteConfigManagement.details.copied")}).catch(()=>{this.toast.error("common.copyFailed")})}truncateText(e,t){return e.length<=t?e:e.substring(0,t)+"..."}formatDateTime(e){return new Date(e).toLocaleString()}getApiKeyById(e){return this.apiKeys().find(t=>t.id===e)}getMaxCharsForRole(e){switch(e){case"FREE":case"BASIC":case"PRO":return 128;case"ENTERPRISE":case"ADMIN":return 256;default:return 128}}static \u0275fac=function(t){return new(t||r)};static \u0275cmp=Q({type:r,selectors:[["app-remote-config-management"]],viewQuery:function(t,i){if(t&1&&W(xe,5)(Me,5)(Te,5)(Ee,5)(ke,5),t&2){let n;S(n=w())&&(i.configKeyTpl=n.first),S(n=w())&&(i.configValueTpl=n.first),S(n=w())&&(i.apiKeyTpl=n.first),S(n=w())&&(i.charsTpl=n.first),S(n=w())&&(i.dateTpl=n.first)}},decls:19,vars:20,consts:[["configKeyTpl",""],["configValueTpl",""],["apiKeyTpl",""],["charsTpl",""],["dateTpl",""],["actionIcon","plus","secondaryActionIcon","download",3,"actionClick","secondaryActionClick","title","subtitle","showAction","actionLabel","showSecondaryAction","secondaryActionLabel","secondaryActionDisabled"],[3,"tabChange","tabs","activeTabId"],[3,"cards"],[1,"w-full","min-w-0","py-6"],["aria-labelledby","remote-config-heading",1,"min-w-0","pt-6"],[1,"flex","items-center","gap-2"],[1,"font-mono","text-sm","text-foreground"],["type","button",1,"text-muted-foreground","hover:text-foreground","transition-colors",3,"click"],["name","copy",1,"w-4","h-4"],[1,"text-sm","text-muted-foreground","font-mono"],[1,"text-sm","text-muted-foreground"],[1,"text-sm","text-foreground"],[1,"text-xs","text-muted-foreground","ml-1"],[1,"flex","flex-col","items-center","gap-3","rounded-xl","border","border-dashed","border-border","px-6","py-12","text-center"],[1,"flex","h-12","w-12","items-center","justify-center","rounded-full","bg-muted/50"],["name","key",1,"w-8","h-8","text-muted-foreground"],[1,"text-base","font-semibold","text-foreground"],[1,"max-w-[56ch]","text-sm","text-muted-foreground"],["data-testid","remote-config-create-api-key-link",1,"inline-flex","items-center","gap-2","px-4","py-2","bg-primary","text-primary-foreground","hover:bg-primary/90","rounded-md","transition-colors",3,"routerLink"],["name","plus",1,"w-4","h-4"],[1,"mb-4","border-b","border-border","pb-3"],["id","remote-config-heading",1,"text-base","font-semibold","text-foreground"],[3,"emptyActionClick","createClick","headerButtonClick","filterChange","clearFilters","pageChange","actionClick","bulkAction","refreshClick","multiSelect","pageTitle","pageSubtitle","createButtonLabel","headerButtons","filters","columns","data","actions","bulkActions","totalItems","currentPage","pageSize","pageSizeOptions","loading","error","hasActiveFilters","emptyIcon","emptyTitle","emptyDescription","emptyActionLabel","emptyNoMatchTitle","emptyNoMatchDescription","avatarIcon"]],template:function(t,i){t&1&&(d(0,"app-feature-page-header",5),y(1,"translate"),y(2,"translate"),y(3,"translate"),y(4,"translate"),D("actionClick",function(){return i.openCreateModal()})("secondaryActionClick",function(){return i.openBulkImportModal()}),c(),d(5,"app-feature-tabs",6),D("tabChange",function(o){return i.activeTabId.set(o)}),c(),I(6,"app-stats-cards-row",7),j(7,Ke,6,5,"ng-template",null,0,L)(9,Ae,2,1,"ng-template",null,1,L)(11,we,2,1,"ng-template",null,2,L)(13,Le,2,1,"ng-template",null,3,L)(15,Ie,3,4,"ng-template",null,4,L),V(17,De,16,12,"div",8),V(18,Fe,6,27,"section",9)),t&2&&(B("title",C(1,12,"remoteConfigManagement.title"))("subtitle",C(2,14,"remoteConfigManagement.subtitle"))("showAction",!0)("actionLabel",C(3,16,"remoteConfigManagement.createNew"))("showSecondaryAction",i.activeApiKeys().length>0)("secondaryActionLabel",C(4,18,"remoteConfigManagement.bulk.importButton"))("secondaryActionDisabled",i.isLoading()),l(5),B("tabs",i.tabs)("activeTabId",i.activeTabId()),l(),B("cards",i.featureStatCards()),l(11),O(!i.isLoading()&&i.activeApiKeys().length===0?17:-1),l(),O(i.activeApiKeys().length>0?18:-1))},dependencies:[Ce,ae,ee,he,be,ue,Y,oe,re],encapsulation:2})};export{_e as RemoteConfigManagement};
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.