PageSourceSearch

https://iattended.app/chunk-EKW3JE73.js

js iattended.app collected 2026-10-09 21:51:00 UTC 27,771 bytes, 1 lines download raw bytes

1import{b as ve}from"./chunk-GCA53SQY.js";import{a as ue}from"./chunk-KWP6C2EX.js";import{a as me}from"./chunk-JUUD4W5Q.js";import{a as ce}from"./chunk-JM2FMWDF.js";import{a as le}from"./chunk-YD2B3FRD.js";import{a as se}from"./chunk-ISU6PKTB.js";import{a as pe}from"./chunk-GIDIS2LO.js";import{a as de}from"./chunk-A7CRMQYF.js";import"./chunk-ATSDFQHF.js";import"./chunk-ZA7SD2JV.js";import"./chunk-4HFYJFD7.js";import"./chunk-NPJP7CO5.js";import{M as Q,O as Z,P as ee,Q as te,R as ne,S as ie,V as ae,Y as re,h as J}from"./chunk-UOVZ2QVB.js";import{d as j,l as X,m as G,y as oe}from"./chunk-QN5HZEUI.js";import"./chunk-EQ7GOEDV.js";import{H as L}from"./chunk-C3ZMX43Q.js";import{Db as x,Dc as S,Eb as P,Fb as B,Gc as O,Hb as V,Hc as I,Ib as q,Jb as p,Kb as l,Lb as o,Tb as E,Vb as d,Xb as c,bb as s,da as w,ic as u,jc as W,kc as Y,la as v,ma as y,q as K,qb as R,ra as z,xa as f,za as H}from"./chunk-2WANGKQ3.js";import{a as _,b as M,h as U}from"./chunk-MG3ERZGY.js";var fe=(a,e)=>e.key;function Ce(a,e){if(a&1){let n=E();l(0,"ia-field",9)(1,"ia-select",15),d("valueChange",function(i){v(n);let r=c();return y(r.patch("parentId",i||null))}),o()()}if(a&2){let n=c();s(),p("value",n.f().parentId??"")("options",n.parentSelectOptions())}}function Te(a,e){if(a&1){let n=E();l(0,"div",13)(1,"div",25)(2,"div",26),u(3),o(),l(4,"div",27),u(5),o()(),l(6,"ia-toggle",28),d("checkedChange",function(i){let r=v(n).$implicit,m=c();return y(m.setFlag(r.key,i))}),o()()}if(a&2){let n=e.$implicit,t=c();s(3),W(n.title),s(2),W(n.desc),s(),p("checked",t.flag(n.key))}}function Ee(a,e){if(a&1){let n=E();l(0,"div",17)(1,"ia-field",35)(2,"ia-num-field",36),d("valueChange",function(i){v(n);let r=c();return y(r.patchNum("missThreshold",i))}),o()(),l(3,"ia-field",37)(4,"ia-num-field",36),d("valueChange",function(i){v(n);let r=c();return y(r.patchNum("embargoWindowHours",i))}),o()()()}if(a&2){let n=c();s(2),p("value",n.f().missThreshold??"")("allowBlank",!0)("min",1),s(2),p("value",n.f().embargoWindowHours??"")("allowBlank",!0)("min",1)}}function we(a,e){if(a&1){let n=E();l(0,"div",17)(1,"ia-field",45)(2,"ia-num-field",42),d("valueChange",function(i){let r=v(n).$index,m=c(2);return y(m.patchTier("late",r,"thresholdMinutes",i))}),o()(),l(3,"ia-field",46)(4,"ia-num-field",47),d("valueChange",function(i){let r=v(n).$index,m=c(2);return y(m.patchTier("late",r,"creditPercent",i))}),o()()(),l(5,"ia-button",48),d("click",function(){let i=v(n).$index,r=c(2);return y(r.removeTier("late",i))}),u(6,"Remove tier"),o()}if(a&2){let n=e.$implicit;s(2),p("value",n.thresholdMinutes??"")("allowBlank",!0)("min",0),s(2),p("value",n.creditPercent??"")("allowBlank",!0)("min",0)}}function xe(a,e){if(a&1){let n=E();l(0,"div",17)(1,"ia-field",49)(2,"ia-num-field",42),d("valueChange",function(i){let r=v(n).$index,m=c(2);return y(m.patchTier("donut",r,"thresholdMinutes",i))}),o()(),l(3,"ia-field",46)(4,"ia-num-field",47),d("valueChange",function(i){let r=v(n).$index,m=c(2);return y(m.patchTier("donut",r,"creditPercent",i))}),o()()(),l(5,"ia-button",48),d("click",function(){let i=v(n).$index,r=c(2);return y(r.removeTier("donut",i))}),u(6,"Remove tier"),o()}if(a&2){let n=e.$implicit;s(2),p("value",n.thresholdMinutes??"")("allowBlank",!0)("min",0),s(2),p("value",n.creditPercent??"")("allowBlank",!0)("min",0)}}function Pe(a,e){a&1&&(l(0,"div",44),u(1," Set both values, or clear both \u2014 an allowance needs to know what counts as a tardy and how many are free. "),o())}function Se(a,e){a&1&&(l(0,"div",27),u(1," Enforced against whichever period counts the event, so the allowance resets each term. Credit settles shortly after an event ends, not at the moment of the scan. "),o())}function ke(a,e){if(a&1){let n=E();l(0,"div",38)(1,"div",26),u(2,"Late arrival"),o(),l(3,"div",27),u(4," Minutes after start \u2192 credit kept. Measured from the attendee's arrival: their entry scan where the event requires a minimum stay, otherwise the single check-in scan. On single-scan events that only means what you intend if attendees scan as they arrive \u2014 nothing stops someone scanning on the way out. "),o()(),V(5,we,7,6,null,null,B),l(7,"ia-button",39),d("click",function(){v(n);let i=c();return y(i.addTier("late"))}),u(8,"Add late tier"),o(),l(9,"div",40)(10,"div",26),u(11,"Donut away-time"),o(),l(12,"div",27),u(13," Total minutes away \u2192 credit 
1kept. An attendee scanned out who never returns counts as away until the event ends. "),o()(),V(14,xe,7,6,null,null,B),l(16,"ia-button",39),d("click",function(){v(n);let i=c();return y(i.addTier("donut"))}),u(17,"Add donut tier"),o(),l(18,"div",40)(19,"div",26),u(20,"Tardy allowance"),o(),l(21,"div",27),u(22," A late arrival that still earns credit counts as a tardy. Once an attendee spends their allowance inside one period, every later tardy in that period earns nothing. Arrivals late enough to lose all credit above aren't tardies \u2014 they cost no allowance. Leave both blank to switch this off. "),o()(),l(23,"div",17)(24,"ia-field",41)(25,"ia-num-field",42),d("valueChange",function(i){v(n);let r=c();return y(r.patchNum("tardyAfterMinutes",i))}),o()(),l(26,"ia-field",43)(27,"ia-num-field",36),d("valueChange",function(i){v(n);let r=c();return y(r.patchNum("tardiesAllowedPerPeriod",i))}),o()()(),x(28,Pe,2,0,"div",44),x(29,Se,2,0,"div",27)}if(a&2){let n=c();s(5),q(n.tiers("late")),s(9),q(n.tiers("donut")),s(11),p("value",n.f().tardyAfterMinutes??"")("allowBlank",!0)("min",1),s(2),p("value",n.f().tardiesAllowedPerPeriod??"")("allowBlank",!0)("min",0),s(),P(n.tardyAllowanceHalfSet()?28:-1),s(),P(n.tardyAllowanceSet()?29:-1)}}function Me(a,e){if(a&1){let n=E();l(0,"ia-section",30)(1,"ia-button",33),d("click",function(){v(n);let i=c();return y(i.subscribeCalendarRequested.emit())}),u(2,"Subscribe to calendar"),o()()}}function Ie(a,e){if(a&1){let n=E();l(0,"ia-section",31)(1,"div",50)(2,"ia-button",33),d("click",function(){v(n);let i=c();return y(i.retireRequested.emit())}),u(3,"Retire event type"),o(),l(4,"ia-button",51),d("click",function(){v(n);let i=c();return y(i.deleteRequested.emit())}),u(5,"Delete event type"),o()()()}a&2&&(s(4),p("danger",!0))}var Ae={name:"",abbreviation:"",parentId:null,description:"",subscribeToParent:!1,showInParentLists:!1,limitSubscriptions:!1,uAttendedUnlocksChildren:!1,virtualType:!1,excludeFromCalendarFeed:!1,gamificationEnabled:!1,emailOption:0,maxPerWeek:null,maxPerMonth:null,embargoEnabled:!1,missThreshold:null,embargoWindowHours:null,penaltyEnabled:!1,lateArrivalTiers:[],donutTiers:[],tardyAfterMinutes:null,tardiesAllowedPerPeriod:null,defaultWholeEventCodeExpiry:""},De=[{value:"",label:"No default"},...ve.filter(([a])=>a!=="Manual").flatMap(([a,e])=>e.map(n=>({value:n.value,label:`${a} \u2014 ${n.label}`})))],$=class a{parentOptions=I([]);primaryDomain=I("");secondaryDomain=I("");presetParentId=I(null);submitting=I(!1);editing=I(!1);initial=I(null);submitType=O();cancel=O();retireRequested=O();deleteRequested=O();subscribeCalendarRequested=O();f=f(_({},Ae));constructor(){H(()=>{let e=this.initial();e&&this.f.set(_({},e))}),H(()=>{let e=this.presetParentId();e&&this.f.update(n=>M(_({},n),{parentId:e}))})}parentSelectOptions=S(()=>[{value:"",label:"None \u2014 top-level type"},...this.parentOptions()]);emailOptions=S(()=>{let e=this.primaryDomain(),n=this.secondaryDomain(),t=[{value:"0",label:"Anyone can subscribe"}];return e&&t.push({value:"1",label:`Require @${e}`}),n&&t.push({value:"2",label:`Require @${n}`}),e&&n&&t.push({value:"3",label:"Require either domain"}),t});defaultExpiryOptions=De;flagRows=[{key:"subscribeToParent",title:"Subscribe to parent",desc:"Subscribing to this type also subscribes the attendee to its parent."},{key:"showInParentLists",title:"Show in parent lists",desc:"Display this type alongside its parent in attendee-facing lists."},{key:"limitSubscriptions",title:"Limit subscriptions",desc:"Restrict automatic and text-code subscriptions to this type."},{key:"uAttendedUnlocksChildren",title:"uAttended unlocks children",desc:"Scanning with uAttended unlocks this type\u2019s child types."},{key:"virtualType",title:"Virtual type",desc:"Mark this as a virtual (grouping) type rather than a real event type."},{key:"excludeFromCalendarFeed",title:"Exclude from calendar feeds",de
1sc:"Hide this type\u2019s events from attendees\u2019 subscribed calendar feeds."},{key:"gamificationEnabled",title:"Enable gamification",desc:"Let attendees track streaks and earn badges for this type."}];flag(e){return this.f()[e]}setFlag(e,n){this.f.update(t=>M(_({},t),{[e]:n}))}patch(e,n){this.f.update(t=>M(_({},t),{[e]:n}))}patchNum(e,n){this.patch(e,n===""?null:n)}tierKey(e){return e==="late"?"lateArrivalTiers":"donutTiers"}tiers(e){return this.f()[this.tierKey(e)]}addTier(e){let n=this.tierKey(e);this.f.update(t=>M(_({},t),{[n]:[...t[n],{thresholdMinutes:null,creditPercent:null}]}))}removeTier(e,n){let t=this.tierKey(e);this.f.update(i=>M(_({},i),{[t]:i[t].filter((r,m)=>m!==n)}))}patchTier(e,n,t,i){let r=this.tierKey(e);this.f.update(m=>M(_({},m),{[r]:m[r].map((C,h)=>h===n?M(_({},C),{[t]:i===""?null:i}):C)}))}defaultAbbr=S(()=>se(this.f().name));nameValid=S(()=>this.f().name.trim().length>0);embargoValid=S(()=>{let e=this.f();return e.embargoEnabled?e.missThreshold!=null&&e.missThreshold>=1&&e.embargoWindowHours!=null&&e.embargoWindowHours>=1:!0});tardyAllowanceSet=S(()=>{let e=this.f();return e.tardyAfterMinutes!=null&&e.tardiesAllowedPerPeriod!=null});tardyAllowanceHalfSet=S(()=>{let e=this.f();return e.tardyAfterMinutes!=null!=(e.tardiesAllowedPerPeriod!=null)});penaltyValid=S(()=>{let e=this.f();if(!e.penaltyEnabled)return!0;if(this.tardyAllowanceHalfSet()||this.tardyAllowanceSet()&&(e.tardyAfterMinutes<1||e.tardiesAllowedPerPeriod<0))return!1;let n=[...e.lateArrivalTiers,...e.donutTiers];return n.length===0?this.tardyAllowanceSet():n.every(t=>t.thresholdMinutes!=null&&t.thresholdMinutes>=0&&t.creditPercent!=null&&t.creditPercent>=0&&t.creditPercent<=100)});canSubmit=S(()=>this.nameValid()&&this.embargoValid()&&this.penaltyValid()&&!this.submitting());onCreate(){this.canSubmit()&&this.submitType.emit(this.f())}static \u0275fac=function(n){return new(n||a)};static \u0275cmp=R({type:a,selectors:[["app-event-type-creation"]],inputs:{parentOptions:[1,"parentOptions"],primaryDomain:[1,"primaryDomain"],secondaryDomain:[1,"secondaryDomain"],presetParentId:[1,"presetParentId"],submitting:[1,"submitting"],editing:[1,"editing"],initial:[1,"initial"]},outputs:{submitType:"submitType",cancel:"cancel",retireRequested:"retireRequested",deleteRequested:"deleteRequested",subscribeCalendarRequested:"subscribeCalendarRequested"},decls:55,vars:29,consts:[[1,"page"],[1,"head"],[1,"sub"],[1,"form-col"],["icon","layers","title","Basics","desc","Name the type and place it in your hierarchy."],["label","Name","data-help","settings-et-name",3,"req"],["placeholder","e.g. Chapel",3,"valueChange","value"],["label","Abbreviation",3,"hint"],[3,"valueChange","value","placeholder"],["label","Parent type","hint","Counts this type toward its parent in the hierarchy.","data-help","settings-et-parent"],["label","Description"],["placeholder","Optional \u2014 a short note about this type.",3,"valueChange","value","rows"],["icon","users","title","Subscriptions & display","desc","How attendees subscribe to and see this type.","data-help","settings-et-flags"],[1,"tg-row"],["label","Email requirement","hint","Require a verified email on an org domain to subscribe."],[3,"valueChange","value","options"],["icon","scale","title","Attendance caps","desc","Optional limits on how often this type can be attended. Leave blank for no limit.","data-help","settings-et-caps"],[1,"grid-2"],["label","Max per week",3,"half"],["suffix","/ week","placeholder","No limit",3,"valueChange","value","allowBlank","min"],["label","Max per month",3,"half"],["suffix","/ month","placeholder","No limit",3,"valueChange","value","allowBlank","min"],["icon","qr","title","Check-in codes","desc","Default expiration for this type\u2019s whole-event text codes.","data-help","settings-et-codes"],["label","Default co
1de expiration","hint","Applies to new events\u2019 whole-event codes. Saving also updates the codes of all upcoming events of this type, replacing any per-event expiration. Entry/exit codes are not affected; clearing the default leaves existing codes unchanged."],["icon","ban","title","Preregistration embargo","desc","Pause early sign-up for attendees who repeatedly miss preregistered events of this type.","data-help","settings-et-embargo"],[1,"tg-text"],[1,"tg-title"],[1,"tg-desc"],[3,"checkedChange","checked"],["icon","scale","title","Attendance penalties","desc","Dock credit when an attendee arrives late or is away too long (donut leave). Opt-in; off by default.","data-help","settings-et-penalties"],["icon","calendar","title","Calendar feed","desc","Subscribe a calendar app to every future event of this type."],["icon","alert","title","Danger zone","desc","Retire hides this type from new events but keeps history; delete removes it permanently.","data-help","settings-et-danger"],[1,"foot"],["variant","ghost",3,"click"],[3,"click","disabled"],["label","Miss threshold","hint","Consecutive misses before embargo."],[3,"valueChange","value","allowBlank","min"],["label","Embargo window in hours","hint","How far before start embargoed attendees may sign up."],[1,"tg-text",2,"margin-top","8px"],["variant","ghost","size","sm","icon","plus",3,"click"],[1,"tg-text",2,"margin-top","16px"],["label","Counts as a tardy after"],["suffix","min",3,"valueChange","value","allowBlank","min"],["label","Tardies allowed per period"],[1,"tg-desc",2,"color","var(--danger)"],["label","After (minutes)"],["label","Credit kept"],["suffix","%",3,"valueChange","value","allowBlank","min"],["variant","ghost","size","sm","icon","trash",3,"click"],["label","Away (minutes)"],[1,"danger-row"],["variant","ghost",3,"click","danger"]],template:function(n,t){n&1&&(l(0,"div",0)(1,"div",1)(2,"div")(3,"h1"),u(4),o(),l(5,"div",2),u(6," Event types organize your events and drive subscriptions, caps and gamification. Changes apply to future events. "),o()()(),l(7,"div",3)(8,"ia-section",4)(9,"ia-field",5)(10,"ia-text-input",6),d("valueChange",function(r){return t.patch("name",r)}),o()(),l(11,"ia-field",7)(12,"ia-text-input",8),d("valueChange",function(r){return t.patch("abbreviation",r)}),o()(),x(13,Ce,2,2,"ia-field",9),l(14,"ia-field",10)(15,"ia-textarea",11),d("valueChange",function(r){return t.patch("description",r)}),o()()(),l(16,"ia-section",12),V(17,Te,7,3,"div",13,fe),l(19,"ia-field",14)(20,"ia-select",15),d("valueChange",function(r){return t.patch("emailOption",+r)}),o()()(),l(21,"ia-section",16)(22,"div",17)(23,"ia-field",18)(24,"ia-num-field",19),d("valueChange",function(r){return t.patchNum("maxPerWeek",r)}),o()(),l(25,"ia-field",20)(26,"ia-num-field",21),d("valueChange",function(r){return t.patchNum("maxPerMonth",r)}),o()()()(),l(27,"ia-section",22)(28,"ia-field",23)(29,"ia-select",15),d("valueChange",function(r){return t.patch("defaultWholeEventCodeExpiry",r)}),o()()(),l(30,"ia-section",24)(31,"div",13)(32,"div",25)(33,"div",26),u(34,"Enable embargo"),o(),l(35,"div",27),u(36," Only applies to capacity-limited events. Needs both values below. "),o()(),l(37,"ia-toggle",28),d("checkedChange",function(r){return t.patch("embargoEnabled",r)}),o()(),x(38,Ee,5,6,"div",17),o(),l(39,"ia-section",29)(40,"div",13)(41,"div",25)(42,"div",26),u(43,"Enable penalty tiers"),o(),l(44,"div",27),u(45," The worst single tier governs \u2014 late and donut penalties never stack. Stay under the smallest threshold and full credit is kept. "),o()(),l(46,"ia-toggle",28),d("checkedChange",function(r){return t.patch("penaltyEnabled",r)}),o()(),x(47,ke,30,8),o(),x(48,Me,3,0,"ia-section",30),x(49,Ie,6,1,"ia-section",31),o(),l(50,"div",32)(51,"ia-button",33),d("click",function(){return t.cancel.emit()}),u(52,"Cancel"),o(),l(53,"ia-button",34),d("click",function(){return t.onCreate()}),u(54),o()()()),n&2&&(s(4),W(t.editing()?"Edit event type":"Create event type"),s(5),p("req",!0),s(),p("value",t.f().name),s(),p("hint",t.defaultAbbr()?"Up to 3 characters. Defaults to \u201C"+t.defaultAbbr()+"\u201D if left blank.":"Up to 3 characters, shown on labels."),s(),p("value",t.f().abbreviation)("placeholder",t.defaultAbbr()||"e.g. CHP"),s(),P(t.parentOptions().length?13:-1),s(2),p("value",t.f().description)("rows",2),s(2),q(t.flagRows),s(3),p("value",""+t.f().emailOption)("options",t.emailOptions()),s(3),p("half",!0),s(),p("value",t.f().maxPerWeek??"")("allowBlank",!0)("min",0),s(),p("half",!0),s(),p("value",t.f().maxPerMonth??"")("allowBlank",!0)("min",0),s(3),p("value",t.f().defaultWholeEventCodeExpiry)("options",t.defaultExpiryOptions),s(8),p("checked",t.f().embargoEnabled),s(),P(t.f().embargoEnabled?38:-1),s(8),p("checked",t.f().penaltyEnabled),s(),P(t.f().penaltyEnabled?47:-1),s(),P(t.editing(
1)?48:-1),s(),P(t.editing()?49:-1),s(4),p("disabled",!t.canSubmit()),s(),Y(" ",t.submitting()?t.editing()?"Saving\u2026":"Creating\u2026":t.editing()?"Save changes":"Create event type"," "))},dependencies:[ae,Z,ee,te,ne,ie,Q,J],styles:["[_nghost-%COMP%]{display:block}.page[_ngcontent-%COMP%]{max-width:760px;margin:0 auto;padding:4px 0 96px}.head[_ngcontent-%COMP%]{margin-bottom:20px}.head[_ngcontent-%COMP%]   h1[_ngcontent-%COMP%]{margin:0;font-size:24px;font-weight:700;letter-spacing:-.4px;color:var(--ink)}.head[_ngcontent-%COMP%]   .sub[_ngcontent-%COMP%]{margin-top:6px;font-size:13.5px;color:var(--ink-2);line-height:1.5;max-width:60ch}.form-col[_ngcontent-%COMP%]{display:flex;flex-direction:column;gap:var(--section-gap)}.tg-row[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:16px;padding:12px 0;border-bottom:1px solid var(--line-soft)}.tg-row[_ngcontent-%COMP%]:last-of-type{border-bottom:none}.tg-text[_ngcontent-%COMP%]{flex:1;min-width:0}.tg-title[_ngcontent-%COMP%]{font-size:14px;font-weight:600;color:var(--ink)}.tg-desc[_ngcontent-%COMP%]{margin-top:2px;font-size:12.5px;color:var(--ink-2);line-height:1.45}.grid-2[_ngcontent-%COMP%]{display:grid;grid-template-columns:1fr 1fr;gap:14px}.danger-row[_ngcontent-%COMP%]{display:flex;gap:10px;flex-wrap:wrap}@media(max-width:639.98px){.grid-2[_ngcontent-%COMP%]{grid-template-columns:1fr}}.foot[_ngcontent-%COMP%]{position:sticky;bottom:0;margin-top:22px;padding:14px 0;display:flex;justify-content:flex-end;gap:10px;background:linear-gradient(to top,var(--bg) 65%,color-mix(in srgb,var(--bg) 0%,transparent))}"],changeDetection:0})};function Oe(a,e){if(a&1){let n=E();l(0,"app-event-type-removal-modal",2),d("confirm",function(i){v(n);let r=c();return y(r.onRemovalConfirm(i))})("cancelled",function(){v(n);let i=c();return y(i.onRemovalCancel())}),o()}if(a&2){let n,t=c();p("mode",e)("typeName",((n=t.initial())==null?null:n.name)??"")("hasChildren",t.removalHasChildren())("childCount",t.removalChildCount())("candidateParents",t.parentOptions())("periodsUsing",t.removalPeriods())("submitting",t.removalSubmitting())}}var Ne="\u2007\u2007";function Fe(a,e){let n=new Map,t=[],i=new Set(a.map(h=>h.eventTypeId));for(let h of a){let g=h.subtypeOfId;if(g&&i.has(g)){let b=n.get(g)??[];b.push(h),n.set(g,b)}else t.push(h)}let r=(h,g)=>h.eventTypeName.localeCompare(g.eventTypeName),m=[],C=(h,g,b)=>{for(let T of[...h].sort(r)){if(b.has(T.eventTypeId)||e.has(T.eventTypeId))continue;let N=new Set(b).add(T.eventTypeId),D=n.get(T.eventTypeId)??[];if(T.isRetired){C(D,g,N);continue}m.push({value:T.eventTypeId,label:Ne.repeat(g)+T.eventTypeName}),C(D,g+1,N)}};return C(t,0,new Set),m}function Re(a){let e=!!a.emailPattern,n=!!a.emailPatternSecondary,t=e&&n?3:n?2:e?1:0,i=b=>b==null||b<0?null:b,r=b=>(b??[]).map(T=>({thresholdMinutes:T.thresholdMinutes,creditPercent:Math.round(T.creditFraction*100)})),m=r(a.attendancePenaltyTiers?.lateArrivalTiers),C=r(a.attendancePenaltyTiers?.donutTiers),h=a.attendancePenaltyTiers?.tardyAfterMinutes??null,g=a.attendancePenaltyTiers?.tardiesAllowedPerPeriod??null;return{name:a.eventTypeName??"",abbreviation:a.abbreviation??"",parentId:a.subtypeOfId??null,description:a.description??"",subscribeToParent:!!a.subscribeToParent,showInParentLists:!!a.showInParentLists,limitSubscriptions:!!a.limitSubscriptions,uAttendedUnlocksChildren:!!a.uAttendedUnlocksChildren,virtualType:!!a.virtualType,excludeFromCalendarFeed:!!a.excludeFromCalendarFeed,gamificationEnabled:!!a.gamificationEnabled,emailOption:t,maxPerWeek:i(a.maxPerWeek),maxPerMonth:i(a.maxPerMonth),embargoEnabled:!!a.preregistrationEmbargoEnabled,missThreshold:a.preregistrationMissThreshold??null,embargoWindowHours:a.preregistrationEmbargoWindowHours??null,penaltyEnabled:m.length>0||C.length>0||h!=null||g!=null,lateArrivalTiers:m,donutTiers:C,tardyAfterMinutes:h,tardiesAllowedPerPeriod:g,defaultWholeEventCodeExpiry:a.defaultWholeEventCodeExpiry??""}}var ye=class a{fb=w(oe);eventTypeData=w(pe);eventTypesService=w(de);pending=w(ce);orgService=w(me);appShell=w(le);toast=w(re);router=w(j);destroyRef=w(z);parentOptions=f([]);primaryDomain=f("");
1secondaryDomain=f("");submitting=f(!1);initial=f(null);removalMode=f(null);removalSubmitting=f(!1);removalHasChildren=f(!1);removalChildCount=f(0);removalPeriods=f([]);presetParentId=history.state?.parentId??null;editId=history.state?.editTypeId??null;editing=!!this.editId;returnTo=history.state?.returnTo??"/app/settings";allTypes=[];orgName="";constructor(){this.appShell.setBreadcrumb(["Settings","Event Types",this.editing?"Edit event type":"New event type"]),this.fb.activeOrganization$.pipe(L(this.destroyRef)).subscribe(e=>{this.orgName=e?.name??"",e?.orgId&&this.loadDomains(e.orgId)}),this.eventTypeData.eventTypes$.pipe(L(this.destroyRef)).subscribe(e=>{this.allTypes=e??[];let n=this.editId?this.allTypes.find(i=>i.eventTypeId===this.editId):void 0,t=new Set(n?.selfAndChildren??[]);this.parentOptions.set(Fe(this.allTypes,t)),n&&!this.initial()&&this.initial.set(Re(n))})}loadDomains(e){return U(this,null,function*(){try{let n=yield this.orgService.getEmailDomains(e);this.primaryDomain.set(Array.isArray(n)?n[0]??"":""),this.secondaryDomain.set(Array.isArray(n)?n[1]??"":"")}catch(n){this.primaryDomain.set(""),this.secondaryDomain.set("")}})}onCancel(){this.router.navigate([this.returnTo],this.returnState())}returnState(){return this.editId?{state:{selectedTypeId:this.editId}}:void 0}onSubscribeCalendar(){return U(this,null,function*(){let e=this.fb.activeOrgId;if(!(!e||!this.editId))try{let i=(yield G(X(),"calendarFunctions-getOrCreateEventTypeCalendarFeed")({orgId:e,eventTypeId:this.editId}))?.data?.webcalUrl;if(!i){this.toast.error("Could not create the calendar feed. Please try again.");return}yield navigator.clipboard.writeText(i).catch(()=>{}),window.open(i,"_blank"),this.toast.success("Calendar feed link copied. Add it to your calendar app to subscribe.")}catch(n){this.toast.error("Could not create the calendar feed. Please try again.")}})}openRemoval(e){let n=this.editId?this.allTypes.find(i=>i.eventTypeId===this.editId):void 0;if(!n)return;let t=Math.max(0,(n.selfAndChildren?.length??1)-1);this.removalChildCount.set(t),this.removalHasChildren.set(t>0),this.removalPeriods.set([]),this.removalSubmitting.set(!1),this.removalMode.set(e),K(this.eventTypesService.getPeriodsCountingEventType(this.editId)).then(i=>this.removalPeriods.set(i??[])).catch(()=>this.removalPeriods.set([]))}onRemovalCancel(){this.removalMode.set(null),this.removalSubmitting.set(!1)}onRemovalConfirm(e){let n=this.editId,t=this.removalMode();if(!n||!t||this.removalSubmitting())return;this.removalSubmitting.set(!0),(t==="delete"?this.eventTypesService.deleteEventType(n,e):this.eventTypesService.retireEventType(n,e)).subscribe({next:()=>{this.removalSubmitting.set(!1),this.removalMode.set(null),this.toast.success(t==="delete"?"Event type deleted.":"Event type retired."),this.router.navigate(["/app/settings"])},error:r=>{this.removalSubmitting.set(!1);let m=r instanceof Error?r.message:"";this.toast.error(m||`Could not ${t} the event type. Please try again.`)}})}onSubmit(e){let n=this.fb.activeOrgId;if(!n||this.submitting())return;let t=e.parentId?this.allTypes.find(k=>k.eventTypeId===e.parentId):void 0,i=e.emailOption===1||e.emailOption===3,r=e.emailOption===2||e.emailOption===3,m=k=>k.filter(A=>A.thresholdMinutes!=null&&A.creditPercent!=null).map(A=>({thresholdMinutes:A.thresholdMinutes,creditFraction:A.creditPercent/100})).sort((A,ge)=>A.thresholdMinutes-ge.thresholdMinutes),C=m(e.lateArrivalTiers),h=m(e.donutTiers),g=e.tardyAfterMinutes!=null&&e.tardiesAllowedPerPeriod!=null,b=g?{tardyAfterMinutes:e.tardyAfterMinutes,tardiesAllowedPerPeriod:e.tardiesAllowedPerPeriod}:{},T=e.penaltyEnabled&&(C.length>0||h.length>0||g)?_({lateArrivalTiers:C,donutTiers:h},b):null,N={eventTypeName:e.name.trim(),abbreviation:e.abbreviation.trim().slice(0,3),description:e.description.trim(),subtypeOfId:e.parentId||null,subtypeOfLabel:t?.eventTypeName??null,subscribeToParent:e.subscribeToParent,showInParentLists:e.showInParentLists,limitSubscriptions:e.limitSubscriptions,uAttendedUnlocksChildren:e.uAttendedUnlocksChildren,virtualType:e.virtualType,excludeFromCalendarFeed:e.excludeFromCalendarFeed,gamificationEnabled:e.gamificationEnabled,maxPerWeek:e.maxPerWeek??-1,maxPerMonth:e.maxPerMonth??-1,preregistrationEmbargoEnabled:e.embargoEnabled,preregistrationMissThreshold:e.embargoEnabled?e.missThreshold??void 0:void 0,preregistrationEmbargoWindowHours:e.embargoEnabled?e.embargoWindowHours??void 0:void 0,attendancePenaltyTiers:T,defaultWholeEventCodeExpiry:e.defaultWholeEventCodeExpiry||null,emailPattern:i?this.primaryDomain():"",emailPatternSecondary:r?this.secondary
1Domain():"",emailRequired:e.emailOption!==0,isClientUpdate:!0},D=this.editId?this.allTypes.find(k=>k.eventTypeId===this.editId):void 0;if(this.editId&&!D){this.toast.error("Could not find that event type.");return}if(!D){this.pending.createFromFields(N,this.allTypes,n,this.orgName),this.router.navigate([this.returnTo]);return}let F=_(_({},D),N),he=this.eventTypeData.updateRelatedEventTypes(F,this.allTypes).filter(k=>k.eventTypeId===F.eventTypeId||(k.selfAndChildren?.includes(F.eventTypeId)??!1));this.submitting.set(!0),this.eventTypesService.writeEventTypesDirectly(he).subscribe({next:()=>{this.submitting.set(!1),this.toast.success(`Event type \u201C${F.eventTypeName}\u201D updated.`),this.router.navigate(["/app/settings"],this.returnState())},error:()=>{this.submitting.set(!1),this.toast.error("Could not save the event type. Please try again.")}})}static \u0275fac=function(n){return new(n||a)};static \u0275cmp=R({type:a,selectors:[["app-event-type-creation-page"]],decls:2,vars:8,consts:[[3,"submitType","cancel","retireRequested","deleteRequested","subscribeCalendarRequested","parentOptions","primaryDomain","secondaryDomain","presetParentId","editing","initial","submitting"],[3,"mode","typeName","hasChildren","childCount","candidateParents","periodsUsing","submitting"],[3,"confirm","cancelled","mode","typeName","hasChildren","childCount","candidateParents","periodsUsing","submitting"]],template:function(n,t){if(n&1&&(l(0,"app-event-type-creation",0),d("submitType",function(r){return t.onSubmit(r)})("cancel",function(){return t.onCancel()})("retireRequested",function(){return t.openRemoval("retire")})("deleteRequested",function(){return t.openRemoval("delete")})("subscribeCalendarRequested",function(){return t.onSubscribeCalendar()}),o(),x(1,Oe,1,7,"app-event-type-removal-modal",1)),n&2){let i;p("parentOptions",t.parentOptions())("primaryDomain",t.primaryDomain())("secondaryDomain",t.secondaryDomain())("presetParentId",t.presetParentId)("editing",t.editing)("initial",t.initial())("submitting",t.submitting()),s(),P((i=t.removalMode())?1:-1,i)}},dependencies:[$,ue],encapsulation:2,changeDetection:0})};export{ye as EventTypeCreationPageComponent};

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.