PageSourceSearch

https://www.donate2support.com/chunk-2EZT6O4R.js

js donate2support.com collected 2026-10-02 00:49:09 UTC 15,128 bytes, 1 lines download raw bytes

1import{a as se}from"./chunk-BZ7XTSRS.js";import{a as P,b as ie,c as ae,d as oe,e as re}from"./chunk-63F7TLPS.js";import{a as E}from"./chunk-M6FGC3CN.js";import{a as le,b as me}from"./chunk-XTTX36OU.js";import{c as ne}from"./chunk-VAEUTYVW.js";import{b as q,c as G}from"./chunk-OICYFZXW.js";import{e as Q,i as U,j as W}from"./chunk-5G4RJBDT.js";import"./chunk-5LYXYUO2.js";import{a as J}from"./chunk-OXQVPTFU.js";import{b as R,i as H}from"./chunk-NSATQ4SA.js";import"./chunk-7BCFPENR.js";import"./chunk-AF426DDZ.js";import{a as X,b as Y,c as Z}from"./chunk-PFSXQTCJ.js";import"./chunk-SAWURXYW.js";import"./chunk-3NYXAAU6.js";import{D as z,c as A,h as j,m as K}from"./chunk-X7X2CIAM.js";import{f as ee,g as te}from"./chunk-C2VH3FL6.js";import{s as B}from"./chunk-LNHGRXZG.js";import"./chunk-MFX2H5HX.js";import"./chunk-JP3IHSWT.js";import"./chunk-PDEU22C3.js";import{Bb as k,Db as c,Fb as p,Na as d,Sc as L,Tb as l,Ub as I,Vb as S,Za as V,da as b,ha as g,ia as u,lb as v,mb as D,pb as M,qb as w,rb as C,rc as N,sb as o,tb as r,ua as _,z as $}from"./chunk-YT6OWAXC.js";import{a as x,b as h}from"./chunk-IFGU66OU.js";var F=(s,t)=>t.id;function ce(s,t){if(s&1&&(o(0,"mat-option",7),l(1),r()),s&2){let e=t.$implicit;C("value",e.id),d(),I(e.name)}}function ge(s,t){s&1&&(o(0,"p",10),l(1,"Loading campaigns..."),r())}function ue(s,t){s&1&&(o(0,"p",10),l(1,"Loading default compliments..."),r())}function Ce(s,t){s&1&&(o(0,"p",10),l(1,"No default categories yet. Add one below so new campaigns start with real compliments."),r())}function fe(s,t){if(s&1){let e=k();o(0,"div",23)(1,"span",18)(2,"mat-icon"),l(3,"drag_indicator"),r()(),o(4,"mat-form-field",26)(5,"mat-label"),l(6,"Emoji"),r(),o(7,"input",20),c("change",function(i){let a=g(e).$index,m=p().$index,f=p(2);return u(f.updateOption(m,a,"emoji",i.target.value))}),r()(),o(8,"mat-form-field",27)(9,"mat-label"),l(10),r(),o(11,"input",20),c("change",function(i){let a=g(e).$index,m=p().$index,f=p(2);return u(f.updateOption(m,a,"template",i.target.value))}),r()(),o(12,"button",28),c("click",function(){let i=g(e).$index,a=p().$index,m=p(2);return u(m.removeOption(a,i))}),o(13,"mat-icon"),l(14,"close"),r()()()}if(s&2){let e=t.$implicit,n=p(3);d(7),C("value",e.emoji),d(3),S("Text (use ",n.complimentNamePlaceholder,")"),d(),C("value",e.template)}}function _e(s,t){if(s&1){let e=k();o(0,"div",12)(1,"div",17)(2,"span",18)(3,"mat-icon"),l(4,"drag_indicator"),r()(),o(5,"mat-form-field",19)(6,"mat-label"),l(7,"Category Name"),r(),o(8,"input",20),c("change",function(i){let a=g(e).$index,m=p(2);return u(m.renameCategory(a,i.target.value))}),r()(),o(9,"button",21),c("click",function(){let i=g(e).$index,a=p(2);return u(a.removeCategory(i))}),o(10,"mat-icon"),l(11,"delete"),r()()(),o(12,"div",22),c("cdkDropListDropped",function(i){let a=g(e).$index,m=p(2);return u(m.dropOption(a,i))}),M(13,fe,15,3,"div",23,F),r(),o(15,"div",24)(16,"button",25),c("click",function(){let i=g(e).$index,a=p(2);return u(a.addOption(i))}),o(17,"mat-icon"),l(18,"add"),r(),l(19," Add Option "),r()()()}if(s&2){let e=t.$implicit;d(8),C("value",e.name),d(5),w(e.options)}}function xe(s,t){if(s&1){let e=k();v(0,Ce,2,0,"p",10),o(1,"div",11),c("cdkDropListDropped",function(i){g(e);let a=p();return u(a.dropCategory(i))}),M(2,_e,20,1,"div",12,F),r(),o(4,"div",13)(5,"mat-form-field",14)(6,"mat-label"),l(7,"New Category Name"),r(),o(8,"input",15),c("ngModelChange",function(i){g(e);let a=p();return u(a.newCategoryName.set(i))})("keyup.enter",function(){g(e);let i=p();return u(i.addCategory())}),r()(),o(9,"button",16),c("click",function(){g(e);let i=p();return u(i.addCategory())}),o(10,"mat-icon"),l(11,"add"),r(),l(12," Add Category "),r()()}if(s&2){let e=p();D(e.categories().length===0?0:-1),d(2),w(e.categories()),d(6),C("ngModel",e.newCategoryName())}}var de=class s{defaultComplimentService=b(se);campaignService=b(B);snackBar=b(le);dialog=b(ne);complimentNamePlaceholder="{{name}}";categories=_([]);loading=_(!1);newCategoryName=_("");campaigns=_([]);campaignsLoading=_(!1);selectedCampaignIds=_([]);resettingCampaigns=_(!1);activeCampaigns=N(()=>[...this.campaigns()].filter(t=>t.isActive).sort((t,e)=>t.name.localeCompare(e.name)));ngOnInit(){this.load(),this.loadCampaigns()}loadCampaigns(){this.campaignsLoading.set(!0),this.campaignService.getAllCampaigns().subscribe({next:t=>{this.campaigns.set(t),this.campaignsLoading.set(!1)},error:()=>{this.campaignsLoading.set(!1),this.snackBar.open("Failed to load campaigns.","OK",{duration:4e3})}})}selectAllActiveCampaigns(){this.selectedCampaignIds.set(this.activeCampaigns().map(t=>
1t.id))}clearSelectedCampaigns(){this.selectedCampaignIds.set([])}resetSelectedCampaigns(){let t=this.selectedCampaignIds();if(!t.length)return;let e=this.activeCampaigns().filter(n=>t.includes(n.id)).map(n=>n.name);this.dialog.open(E,{width:"480px",data:{title:`Reset compliments for ${t.length} campaign${t.length===1?"":"s"}?`,message:`This replaces every compliment category and option on ${e.join(", ")} with a fresh copy of the current Default Compliments catalog above. Any campaign-specific customizations \u2014 edited/added/reordered categories and options \u2014 will be lost. This can't be undone.`,confirmLabel:"Reset"}}).afterClosed().subscribe(n=>{n&&(this.resettingCampaigns.set(!0),$(t.map(i=>this.campaignService.resetCampaignComplimentsToDefaults(i))).subscribe({next:()=>{this.resettingCampaigns.set(!1),this.snackBar.open(`Compliments reset for ${t.length} campaign${t.length===1?"":"s"}.`,"",{duration:4e3}),this.clearSelectedCampaigns()},error:()=>{this.resettingCampaigns.set(!1),this.snackBar.open("Failed to reset one or more campaigns. Please try again.","OK",{duration:5e3})}}))})}load(){this.loading.set(!0),this.defaultComplimentService.getDefaultComplimentCategories().subscribe({next:t=>{this.categories.set(t),this.loading.set(!1)},error:()=>{this.loading.set(!1),this.snackBar.open("Failed to load default compliments.","OK",{duration:4e3})}})}addCategory(){let t=this.newCategoryName().trim();t&&this.defaultComplimentService.createDefaultComplimentCategory(t).subscribe({next:e=>{this.categories.update(n=>[...n,e]),this.newCategoryName.set("")},error:()=>this.snackBar.open("Failed to add category.","OK",{duration:4e3})})}renameCategory(t,e){let n=this.categories()[t];this.categories.update(i=>i.map((a,m)=>m===t?h(x({},a),{name:e}):a)),this.defaultComplimentService.updateDefaultComplimentCategory(n.id,{name:e}).subscribe({error:()=>this.snackBar.open("Failed to save category name.","OK",{duration:4e3})})}removeCategory(t){let e=this.categories()[t];this.dialog.open(E,{width:"440px",data:{title:"Remove default category?",message:`"${e.name}" and its ${e.options.length} option(s) will no longer auto-load into new campaigns. This won't affect campaigns that already have them.`,confirmLabel:"Remove"}}).afterClosed().subscribe(n=>{n&&this.defaultComplimentService.deleteDefaultComplimentCategory(e.id).subscribe({next:()=>this.categories.update(i=>i.filter((a,m)=>m!==t)),error:()=>this.snackBar.open("Failed to delete category.","OK",{duration:4e3})})})}dropCategory(t){if(t.previousIndex===t.currentIndex)return;let e=[...this.categories()];P(e,t.previousIndex,t.currentIndex),this.categories.set(e),this.defaultComplimentService.reorderDefaultComplimentCategories(e.map(n=>n.id)).subscribe({error:()=>this.snackBar.open("Failed to save new category order.","OK",{duration:4e3})})}addOption(t){let e=this.categories()[t];this.defaultComplimentService.addDefaultComplimentOption(e.id,{emoji:"\u2B50",template:"{{name}} is awesome"}).subscribe({next:n=>this.categories.update(i=>i.map((a,m)=>m===t?h(x({},a),{options:[...a.options,n]}):a)),error:()=>this.snackBar.open("Failed to add option.","OK",{duration:4e3})})}updateOption(t,e,n,i){let a=this.categories()[t],m=a.options[e];this.categories.update(f=>f.map((y,O)=>O===t?h(x({},y),{options:y.options.map((T,pe)=>pe===e?h(x({},T),{[n]:i}):T)}):y)),this.defaultComplimentService.updateDefaultComplimentOption(a.id,m.id,{[n]:i}).subscribe({error:()=>this.snackBar.open("Failed to save option.","OK",{duration:4e3})})}removeOption(t,e){let n=this.categories()[t],i=n.options[e];this.defaultComplimentService.deleteDefaultComplimentOption(n.id,i.id).subscribe({next:()=>this.categories.update(a=>a.map((m,f)=>f===t?h(x({},m),{options:m.options.filter((y,O)=>O!==e)}):m)),error:()=>this.snackBar.open("Failed to remove option.","OK",{duration:4e3})})}dropOption(t,e){if(e.previousIndex===e.currentIndex)return;let n=this.categories()[t],i=[...n.options];P(i,e.previousIndex,e.currentIndex),this.categories.update(a=>a.map((m,f)=>f===t?h(x({},m),{options:i}):m)),this.defaultComplimentService.reorderDefaultComplimentOptions(n.id,i.map(a=>a.id)).subscribe({error:()=>this.snackBar.open("Failed to save new option order.","OK",{duration:4e3})})}static \u0275fac=function(e){return new(e||s)};static \u0275cmp=V({type:s,selectors:[["app-default-compliments"]],decls:27,vars:7,consts:[[1,"default-compliments-container"],[1,"page-header"],[1,"page-note"],[1,"bulk-reset-section"],[1,"bulk-reset-control
1s"],["appearance","outline",1,"campaign-select-field"],["multiple","",3,"ngModelChange","ngModel"],[3,"value"],["type","button",1,"btn-secondary",3,"click","disabled"],["type","button","mat-flat-button","","color","warn",3,"click","disabled"],[1,"empty-note"],["cdkDropList","",1,"category-list",3,"cdkDropListDropped"],["cdkDrag","",1,"category-card"],[1,"add-category-row"],["appearance","outline",1,"category-name-field"],["matInput","",3,"ngModelChange","keyup.enter","ngModel"],["type","button","mat-flat-button","","color","primary",3,"click"],[1,"category-header"],["cdkDragHandle","",1,"drag-handle"],["appearance","outline","subscriptSizing","dynamic",1,"category-name-field"],["matInput","",3,"change","value"],["type","button","mat-icon-button","","color","warn","aria-label","Remove category",3,"click"],["cdkDropList","",1,"option-list",3,"cdkDropListDropped"],["cdkDrag","",1,"option-row"],[1,"add-option-row"],["type","button","mat-button","",3,"click"],["appearance","outline","subscriptSizing","dynamic",1,"emoji-field"],["appearance","outline","subscriptSizing","dynamic",1,"template-field"],["type","button","mat-icon-button","","color","warn","aria-label","Remove option",3,"click"]],template:function(e,n){e&1&&(o(0,"div",0)(1,"div",1)(2,"h1"),l(3,"Default Compliments"),r()(),o(4,"p",2),l(5," This is the standing compliment catalog \u2014 categories and options \u2014 that automatically loads into every new campaign's Compliments tab. Admins can still add, edit, remove, or reorder categories and options on the campaign itself; this list is just the starting point. Drag the handles to reorder. "),r(),o(6,"div",3)(7,"h2"),l(8,"Reset Campaigns to Defaults"),r(),o(9,"p",2),l(10," Pick one, several, or all active campaigns to overwrite their compliment categories and options with a fresh copy of the catalog below. This only affects the selected campaigns \u2014 the standing default catalog itself is untouched. "),r(),o(11,"div",4)(12,"mat-form-field",5)(13,"mat-label"),l(14,"Campaigns"),r(),o(15,"mat-select",6),c("ngModelChange",function(a){return n.selectedCampaignIds.set(a)}),M(16,ce,2,2,"mat-option",7,F),r()(),o(18,"button",8),c("click",function(){return n.selectAllActiveCampaigns()}),l(19," Select All Active "),r(),o(20,"button",8),c("click",function(){return n.clearSelectedCampaigns()}),l(21," Clear "),r(),o(22,"button",9),c("click",function(){return n.resetSelectedCampaigns()}),l(23),r()(),v(24,ge,2,0,"p",10),r(),v(25,ue,2,0,"p",10)(26,xe,13,2),r()),e&2&&(d(15),C("ngModel",n.selectedCampaignIds()),d(),w(n.activeCampaigns()),d(2),C("disabled",n.campaignsLoading()),d(2),C("disabled",!n.selectedCampaignIds().length),d(2),C("disabled",!n.selectedCampaignIds().length||n.resettingCampaigns()),d(),S(" ",n.resettingCampaigns()?"Resetting\u2026":"Reset Selected to Defaults"," "),d(),D(n.campaignsLoading()?24:-1),d(),D(n.loading()?25:26))},dependencies:[L,z,A,j,K,Z,Y,X,te,ee,J,H,R,G,q,W,U,Q,me,re,oe,ae,ie],styles:[".default-compliments-container[_ngcontent-%COMP%]{padding:2rem;max-width:1200px;margin:0 auto}.page-header[_ngcontent-%COMP%]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem}.page-header[_ngcontent-%COMP%]   h1[_ngcontent-%COMP%]{margin:0;font-size:2rem;font-weight:600}.page-note[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:.9rem;margin:0 0 1.5rem;max-width:720px}.empty-note[_ngcontent-%COMP%]{color:var(--text-secondary);font-size:.9rem;margin:0 0 .75rem}.category-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:1.25rem}.category-card[_ngcontent-%COMP%]{background:#fff;border:1px solid var(--gray-200, #e0e0e0);border-radius:10px;box-shadow:0 1px 3px #0000000f,0 1px 2px #0000000a;padding:1rem}.category-header[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;margin-bottom:.5rem}.category-name-field[_ngcontent-%COMP%]{flex:1}.drag-handle[_ngcontent-%COMP%]{cursor:grab;color:var(--text-secondary);display:flex;align-items:center}.option-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.4rem;margin:.5rem 0;padding-left:1.75rem}.option-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.5rem;background:var(--gray-50, #f7f7f8);border-radius:8px;padding:.35rem .5rem}.emoji-field[_ngcontent-%COMP%]{width:72px;flex-shrink:0}.emoji-field[_ngcontent-%COMP%]   input[_ngcontent-%COMP%]{text-align:center}.template-field[_ngcontent-%COMP%]{flex:1;min-width:0}.add-option-row[_ngcontent-%COMP%]{padding-left:1.75rem;margin-top:.25rem}.add-category-row[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.75rem;margin-top:1.5rem}.add-category-row[_ngcontent-%COMP%]   .category-name-field[_ngcontent-%COMP%]{flex:0 0 320px}.add-category-row[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{height:40px;margin-top:2px}.bulk-reset-section[_ngcontent-%COMP%]{margin-top:2.5rem;padding-top:1.5rem;border-top:1px solid var(--gray-200, #e0e0e0)}.bulk-reset-section[_ngcontent-%COMP%]   h2[_ngcontent-%COMP%]{margin:0 0 .5rem;font-size:1.25rem;font-weight:600}
1.bulk-reset-controls[_ngcontent-%COMP%]{display:flex;align-items:flex-start;flex-wrap:wrap;gap:.75rem}.bulk-reset-controls[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{height:56px}.campaign-select-field[_ngcontent-%COMP%]{flex:1 1 320px;min-width:240px}.btn-secondary[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:.4rem;padding:.5rem 1rem;background:#fff;color:var(--text-secondary);border:1px solid var(--gray-300, #d1d5db);border-radius:8px;font-size:.875rem;font-weight:600;cursor:pointer;transition:all .2s}.btn-secondary[_ngcontent-%COMP%]:hover:not(:disabled){background:var(--gray-50, #f7f7f8);color:var(--text-primary, #111827);border-color:var(--gray-400, #9ca3af)}.btn-secondary[_ngcontent-%COMP%]:disabled{opacity:.5;cursor:not-allowed}.cdk-drag-preview[_ngcontent-%COMP%]{box-shadow:0 5px 15px #0003}.cdk-drag-placeholder[_ngcontent-%COMP%]{opacity:.3}.cdk-drop-list-dragging[_ngcontent-%COMP%]   .cdk-drag[_ngcontent-%COMP%]{transition:transform .2s cubic-bezier(0,0,.2,1)}"]})};export{de as DefaultComplimentsComponent};

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.