PageSourceSearch

https://www.donate2support.com/chunk-PLSOTMAU.js

js donate2support.com collected 2026-09-24 14:13:13 UTC 15,361 bytes, 1 lines download raw bytes

1import{a as de}from"./chunk-GAQE6NOG.js";import{a as le}from"./chunk-WKRH6XUX.js";import"./chunk-2F6P3XGA.js";import"./chunk-3ZJMOPGD.js";import"./chunk-TRLNGHZX.js";import{a as O}from"./chunk-M6FGC3CN.js";import"./chunk-KRERKVLO.js";import"./chunk-RTE6BKFT.js";import"./chunk-J3GSL4WT.js";import{a as oe,b as re}from"./chunk-XTTX36OU.js";import{c as ae}from"./chunk-VAEUTYVW.js";import{b as J,c as q}from"./chunk-OICYFZXW.js";import{e as Q,i as X,j as Y}from"./chunk-5G4RJBDT.js";import"./chunk-5LYXYUO2.js";import{a as W}from"./chunk-OXQVPTFU.js";import{b as G,i as H}from"./chunk-NSATQ4SA.js";import"./chunk-7BCFPENR.js";import"./chunk-AF426DDZ.js";import{a as Z,b as ee,c as te}from"./chunk-PFSXQTCJ.js";import"./chunk-SAWURXYW.js";import"./chunk-3NYXAAU6.js";import{D as R,h as K,m as U}from"./chunk-X7X2CIAM.js";import{f as ne,g as ie}from"./chunk-C2VH3FL6.js";import{m as j,n as k,s as z}from"./chunk-IPJFUMTJ.js";import"./chunk-MFX2H5HX.js";import"./chunk-JP3IHSWT.js";import"./chunk-PDEU22C3.js";import{Bb as B,Db as g,Fb as m,Ia as P,Na as c,Rb as $,Sc as N,Tb as l,Ub as S,Vb as D,Wb as V,Za as F,da as y,ha as u,ia as _,lb as b,mb as v,ob as I,pb as M,qb as A,rb as p,rc as L,sb as o,tb as a,ua as f,ub as T,z as E}from"./chunk-YT6OWAXC.js";import{a as C,b as x}from"./chunk-IFGU66OU.js";var se=(r,t)=>t.id;function me(r,t){if(r&1&&(o(0,"mat-option",7),l(1),a()),r&2){let e=t.$implicit;p("value",e.id),c(),V("",e.name," (",e.organizationName,")")}}function ge(r,t){r&1&&(o(0,"p",10),l(1,"Loading campaigns..."),a())}function pe(r,t){r&1&&(o(0,"p",10),l(1,"Loading default achievement badges..."),a())}function ue(r,t){r&1&&(o(0,"p",10),l(1,"No default badges yet. Add one below to start the catalog."),a())}function _e(r,t){if(r&1&&T(0,"img",16),r&2){let e=m().$implicit;p("src",e.iconImageUrl,P)}}function he(r,t){if(r&1&&(o(0,"span",17),l(1),a()),r&2){let e=m().$implicit;c(),S(e.emoji||"\u{1F3C5}")}}function fe(r,t){if(r&1){let e=B();o(0,"button",28),g("click",function(){u(e);let i=m().$index,d=m(2);return _(d.clearIconImage(i))}),l(1,"Clear Photo"),a()}}function be(r,t){if(r&1&&(o(0,"mat-option",7),l(1),a()),r&2){let e=t.$implicit,n=m(3);p("value",e),c(),S(n.metricLabels[e])}}function ve(r,t){if(r&1){let e=B();o(0,"mat-form-field",26)(1,"mat-label"),l(2,"Threshold"),a(),o(3,"input",29),g("change",function(i){u(e);let d=m().$index,s=m(2);return _(s.updateBadgeThreshold(d,i.target.value))}),a()()}if(r&2){let e=m().$implicit;c(3),p("value",e.threshold??0)}}function Ce(r,t){if(r&1){let e=B();o(0,"div",14)(1,"div",15),b(2,_e,1,1,"img",16)(3,he,2,1,"span",17),a(),o(4,"mat-form-field",18)(5,"mat-label"),l(6,"Emoji"),a(),o(7,"input",19),g("change",function(i){let d=u(e).$index,s=m(2);return _(s.updateBadgeField(d,"emoji",i.target.value))}),a()(),o(8,"button",20),g("click",function(){let i=u(e).$index,d=m(2);return _(d.chooseIconFromLibrary(i))}),l(9,"Choose Photo"),a(),b(10,fe,2,0,"button",21),o(11,"mat-form-field",22)(12,"mat-label"),l(13,"Badge Name"),a(),o(14,"input",23),g("change",function(i){let d=u(e).$index,s=m(2);return _(s.updateBadgeField(d,"name",i.target.value))}),a()(),o(15,"mat-form-field",24)(16,"mat-label"),l(17,"Earned When"),a(),o(18,"mat-select",25),g("selectionChange",function(i){let d=u(e).$index,s=m(2);return _(s.updateBadgeMetric(d,i.value))}),M(19,be,2,2,"mat-option",7,I),a()(),b(21,ve,4,1,"mat-form-field",26),o(22,"button",20),g("click",function(){let i=u(e).$index,d=m(2);return _(d.toggleActive(i))}),l(23),a(),o(24,"button",27),g("click",function(){let i=u(e).$index,d=m(2);return _(d.removeBadge(i))}),o(25,"mat-icon"),l(26,"delete"),a()()()}if(r&2){let e=t.$implicit,n=m(2);$("inactive",!e.isActive),c(2),v(e.iconImageUrl?2:3),c(5),p("value",e.emoji??""),c(3),v(e.iconImageUrl?10:-1),c(4),p("value",e.name),c(4),p("value",e.metric),c(),A(n.metrics),c(2),v(n.isBooleanMetric(e.metric)?-1:21),c(2),D(" ",e.isActive?"Deactivate":"Activate"," ")}}function xe(r,t){if(r&1){let e=B();b(0,ue,2,0,"p",10),o(1,"div",11),M(2,Ce,27,9,"div",12,se),a(),o(4,"button",13),g("click",function(){u(e);let i=m();return _(i.addBadge())}),o(5,"mat-icon"),l(6,"add"),a(),l(7," Add Badge "),a()}if(r&2){let e=m();v(e.badges().length===0?0:-1),c(2),A(e.badges())}}var ce=class r{defaultAchievementBadgeService=y(de);campaignService=y(z);snackBar=y(oe);dialog=y(ae);badges=f([]);loading=f(!1);metricLabels=k;metrics=Object.keys(k);campaigns=f([]);campaignsLoading=f(!1);selectedCampaignIds=f([]);resettingCampaigns=f(!1);activeCampaigns=L(()=>[...this.campaigns()].filter(t=>t.isActive).sort((t,e)=>t.name.localeCompare(e.name)));ngOnInit(){this.load(),this.loadCampaigns()}load(){this.loading.set(!0),this.defaultAchievementBadgeService.getDefaultAchievementBadges().subscribe({next:t=>{this.badges.set(t),this.loading.set(!1)},error:()=>{this.loading.set(!1),this.snackBar.open("Failed to load default achievement badges.","OK",{duration:4e3})}})}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(O,{width:"480px",data:{title:`Sync achievement badges for ${t.length} campaign${t.length===1?"":"s"}?`,message:`This updates ${e.join(", ")}'s badges to match the current Default Achievement Badges catalog below (adding/updating by key, deactivating any that were removed here). Sellers' already-earned badges are kept.`,confirmLabel:"Sync"}}).afterClosed().subscribe(n=>{n&&(this.resettingCampaigns.set(!0),E(t.map(i=>this.campaignService.resetCampaignAchievementBadgesToDefaults(i))).subscribe({next:()=>{this.resettingCampaigns.set(!1),this.snackBar.open(`Achievement badges synced for ${t.length} campaign${t.length===1?"":"s"}.`,"",{duration:4e3}),this.clearSelectedCampaigns()},error:()=>{this.resettingCampaigns.set(!1),this.snackBar.open("Failed to sync one or more campaigns. Please try again.","OK",{duration:5e3})}}))})}isBooleanMetric(t){return j.includes(t)}addBadge(){let t=`BADGE_${Date.now()}`;this.defaultAchievementBadgeService.createDefaultAchievementBadge({key:t,name:"New Badge",metric:"RAISED",threshold:0}).subscribe({next:e=>this.badges.update(n=>[...n,e]),error:()=>this.snackBar.open("Failed to create badge.","OK",{duration:4e3})})}updateBadgeField(t,e,n){let i=this.badges()[t],d=n||null;this.badges.update(s=>s.map((h,w)=>w===t?x(C({},h),{[e]:d}):h)),this.defaultAchievementBadgeService.updateDefaultAchievementBadge(i.id,{[e]:d}).subscribe({error:()=>this.snackBar.open("Failed to save changes.","OK",{duration:4e3})})}updateBadgeMetric(t,e){let n=this.badges()[t],i=this.isBooleanMetric(e)?null:n.threshold??0;this.badges.update(d=>d.map((s,h)=>h===t?x(C({},s),{metric:e,threshold:i}):s)),this.defaultAchievementBadgeService.updateDefaultAchievementBadge(n.id,{metric:e,threshold:i}).subscribe({error:()=>this.snackBar.open("Failed to save changes.","OK",{duration:4e3})})}updateBadgeThreshold(t,e){let n=parseFloat(e),i=isNaN(n)?0:Math.round(n),d=this.badges()[t];this.badges.update(s=>s.map((h,w)=>w===t?x(C({},h),{threshold:i}):h)),this.defaultAchievementBadgeService.updateDefaultAchievementBadge(d.id,{threshold:i}).subscribe({error:()=>this.snackBar.open("Failed to save changes.","OK",{duration:4e3})})}chooseIconFromLibrary(t){this.dialog.open(le,{maxWidth:"95vw",data:{kind:"IMAGE",title:"Choose a badge icon"}}).afterClosed().subscribe(e=>{typeof e=="string"&&e&&this.updateBadgeField(t,"iconImageUrl",e)})}clearIconImage(t){this.updateBadgeField(t,"iconImageUrl","")}toggleActive(t){let e=this.badges()[t],n=!e.isActive;this.badges.update(i=>i.map((d,s)=>s===t?x(C({},d),{isActive:n}):d)),this.defaultAchievementBadgeService.updateDefaultAchievementBadge(e.id,{isActive:n}).subscribe({error:()=>this.snackBar.open("Failed to save changes.","OK",{duration:4e3})})}removeBadge(t){let e=this.badges()[t];this.dialog.open(O,{width:"420px",data:{title:"Remove default badge?",message:`"${e.name}" will no longer auto-load into new campaigns' Achievement Badges section. This won't affect campaigns that already have it (or sellers who already earned it).`,confirmLabel:"Remove"}}).afterClosed().subscribe(n=>{n&&this.defaultAchievementBadgeService.deleteDefaultAchievementBadge(e.id).subscribe({next:()=>this.badges.update(i=>i.filter((d,s)=>s!==t)),error:()=>this.snackBar.open("Failed to delete badge.","OK",{duration:4e3})})})}static \u0275fac=function(e){return new(e||r)};static \u0275cmp=F({type:r,selectors:[["app-default-achievement-badges"]],decls:27,vars:8,consts:[[1,"default-achievement-badges-container"],[1,"page-header"],[1,"page-note"],[1,"bulk-reset-section"],[1,"bulk-reset-controls"],["appearance","outline",1,"campaign-select-field"],["multiple","",3,"ngModelChange","ngModel","disabled"],[3,"value"],["type","button",1,"btn-secondary",3,"click","disabled"],["type","button","mat-flat-button","","color","primary",3,"click","disabled"],[1,"empty-note"],[1,"badge-list"],[1,"badge-row",3,"inactive"],["type","button","mat-button","",1,"btn-add-badge",3,"click"],[1,"badge-row"],[1,"badge-icon-preview"],["alt","",1,"badge-icon-img",3,"src"],[1,"badge-icon-emoji"],["appearance","outline",1,"emoji-field"],["matInput","","placeholder","\u{1F3C5}",3,"change","value"],["type","button","mat-stroked-button","",3,"click"],["type","button","mat-button",""],["appearance","outline",1,"name-field"],["matInput","",3,"change","value"],["appearance","outline",1,"metric-field"],[3,"selectionChange","value"],["appearance","outline",1,"threshold-field"],["type","button","mat-icon-button","","color","warn","aria-label","Remove badge",3,"click"],["type","button","mat-button","",3,"click"],["matInput","","type","number","min","0","step","1",3,"change","value"]],template:function(e,n){e&1&&(o(0,"div",0)(1,"div",1)(2,"h1"),l(3,"Default Achievement Badges"),a()(),o(4,"p",2),l(5,` This is the standing badge catalog that automatically loads into a new campaign's Achievement Badges section (and can be re-applied to an existing campaign from that section's "Sync with Defaults" button). Sellers see earned badges \u2014 and only earned badges \u2014 in a row under their photo on their app home page. Each badge's icon can be an emoji or a photo chosen from the Media Library; a photo takes priority if both are set. The "Collected All Other Badges" (All-Star) metric is a meta-badge \u2014 it's earned automatically once every other active badge on a campaign is earned, and can optionally be linked to a Prize's drawing from that campaign's own Achievement Badges section. `),a(),o(6,"div",3)(7,"h2"),l(8,"Sync Campaigns with Defaults"),a(),o(9,"p",2),l(10," Pick one, several, or all active campaigns to update their badges to match the catalog below (added/updated by key; badges removed here are deactivated, not deleted). Sellers' already-earned badges are always preserved. "),a(),o(11,"div",4)(12,"mat-form-field",5)(13,"mat-label"),l(14,"Campaigns"),a(),o(15,"mat-select",6),g("ngModelChange",function(d){return n.selectedCampaignIds.set(d)}),M(16,me,2,3,"mat-option",7,se),a()(),o(18,"button",8),g("click",function(){return n.selectAllActiveCampaigns()}),l(19," Select All Active "),a(),o(20,"button",8),g("click",function(){return n.clearSelectedCampaigns()}
1),l(21," Clear "),a(),o(22,"button",9),g("click",function(){return n.resetSelectedCampaigns()}),l(23),a()(),b(24,ge,2,0,"p",10),a(),b(25,pe,2,0,"p",10)(26,xe,8,1),a()),e&2&&(c(15),p("ngModel",n.selectedCampaignIds())("disabled",n.campaignsLoading()),c(),A(n.activeCampaigns()),c(2),p("disabled",n.campaignsLoading()),c(2),p("disabled",!n.selectedCampaignIds().length),c(2),p("disabled",!n.selectedCampaignIds().length||n.resettingCampaigns()),c(),D(" ",n.resettingCampaigns()?"Syncing\u2026":"Sync Selected with Defaults"," "),c(),v(n.campaignsLoading()?24:-1),c(),v(n.loading()?25:26))},dependencies:[N,R,K,U,te,ee,Z,ie,ne,W,H,G,q,J,Y,X,Q,re],styles:[".default-achievement-badges-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}.bulk-reset-section[_ngcontent-%COMP%]{padding:1.25rem 1.5rem;margin-bottom:2rem;border:1px solid var(--gray-200, #e0e0e0);border-radius:8px;background:var(--gray-50, #fafafa)}.bulk-reset-section[_ngcontent-%COMP%]   h2[_ngcontent-%COMP%]{margin:0 0 .5rem;font-size:1.1rem;font-weight:600}.bulk-reset-section[_ngcontent-%COMP%]   .page-note[_ngcontent-%COMP%]{margin-bottom:1rem}.bulk-reset-controls[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:.75rem;flex-wrap:wrap}.bulk-reset-controls[_ngcontent-%COMP%]   .campaign-select-field[_ngcontent-%COMP%]{flex:1 1 320px;min-width:220px}.bulk-reset-controls[_ngcontent-%COMP%]   button[_ngcontent-%COMP%]{height:56px}.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}.badge-list[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:.75rem}.badge-row[_ngcontent-%COMP%]{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap;background:#fff;border:1px solid var(--gray-200, #e0e0e0);border-radius:10px;padding:.75rem 1rem;box-shadow:0 1px 3px #0000000f,0 1px 2px #0000000a}.badge-row.inactive[_ngcontent-%COMP%]{opacity:.55}.badge-row[_ngcontent-%COMP%]   .emoji-field[_ngcontent-%COMP%]{flex:0 1 90px}.badge-row[_ngcontent-%COMP%]   .name-field[_ngcontent-%COMP%]{flex:1 1 180px}.badge-row[_ngcontent-%COMP%]   .metric-field[_ngcontent-%COMP%]{flex:1 1 220px}.badge-row[_ngcontent-%COMP%]   .threshold-field[_ngcontent-%COMP%]{flex:0 1 120px}.badge-icon-preview[_ngcontent-%COMP%]{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--gray-100, #f3f4f6);overflow:hidden;flex-shrink:0}.badge-icon-preview[_ngcontent-%COMP%]   .badge-icon-img[_ngcontent-%COMP%]{width:100%;height:100%;object-fit:cover}.badge-icon-preview[_ngcontent-%COMP%]   .badge-icon-emoji[_ngcontent-%COMP%]{font-size:1.5rem}.btn-add-badge[_ngcontent-%COMP%]{margin-top:1rem;display:flex;align-items:center;gap:.25rem}@media(max-width:640px){.badge-row[_ngcontent-%COMP%]{flex-direction:column;align-items:stretch}.badge-row[_ngcontent-%COMP%]   mat-form-field[_ngcontent-%COMP%]{width:100%}}"]})};export{ce as DefaultAchievementBadgesComponent};

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.