1"use strict";(self.webpackChunklms_frontend=self.webpackChunklms_frontend||[]).push([[2038],{32038:(w,v,l)=>{l.r(v),l.d(v,{routes:()=>z});var r=l(57565),g=l(45109),h=l(3741),f=l(39289),b=l(23126),C=l(13414),a=l(48017),j=l(42885),u=l(51115),p=l(1898),m=l(81006),e=l(70106),_=l(65799),k=l(17647),S=l(22529),I=l(10480),F=l(23384),M=l(1595),y=l(58437),E=l(29959);const x=()=>({width:"820px"}),T=()=>({height:"260px"});function R(o,d){1&o&&(e.j41(0,"tr")(1,"th"),e.EFF(2,"Student"),e.k0s(),e.j41(3,"th"),e.EFF(4,"Course"),e.k0s(),e.j41(5,"th"),e.EFF(6,"Fees"),e.k0s(),e.j41(7,"th"),e.EFF(8,"Status"),e.k0s(),e.j41(9,"th",14),e.EFF(10,"Actions"),e.k0s()())}function W(o,d){1&o&&e.nrm(0,"p-tag",20)}function B(o,d){1&o&&e.nrm(0,"p-tag",21)}function N(o,d){if(1&o){const i=e.RV6();e.j41(0,"tr")(1,"td"),e.EFF(2),e.k0s(),e.j41(3,"td"),e.EFF(4),e.k0s(),e.j41(5,"td"),e.EFF(6),e.k0s(),e.j41(7,"td"),e.DNE(8,W,1,0,"p-tag",15)(9,B,1,0,"p-tag",16),e.k0s(),e.j41(10,"td")(11,"button",17),e.bIt("click",function(){const t=e.eBV(i).$implicit,n=e.XpG();return e.Njj(n.openPreview(t))}),e.k0s(),e.j41(12,"button",18),e.bIt("click",function(){const t=e.eBV(i).$implicit,n=e.XpG();return e.Njj(n.openEdit(t))}),e.k0s(),e.j41(13,"button",19),e.bIt("click",function(){const t=e.eBV(i).$implicit,n=e.XpG();return e.Njj(n.download(t))}),e.k0s()()()}if(2&o){const i=d.$implicit;e.R7$(2),e.JRh(i.studentName||"-"),e.R7$(2),e.JRh(i.courseCode||"-"),e.R7$(2),e.JRh(i.totalFees?"\u20b9"+i.totalFees:"-"),e.R7$(2),e.Y8G("ngIf","PUBLISHED"===i.status),e.R7$(),e.Y8G("ngIf","PUBLISHED"!==i.status),e.R7$(4),e.Y8G("disabled",!i.mediaId)}}function D(o,d){1&o&&(e.j41(0,"tr")(1,"td",22),e.EFF(2,"No welcome letters yet. They are created automatically when a student's plan is activated."),e.k0s()())}function G(o,d){if(1&o){const i=e.RV6();e.j41(0,"div",37)(1,"div",38)(2,"input",39),e.mxI("ngModelChange",function(t){const n=e.eBV(i).$implicit;return e.DH7(n.label,t)||(n.label=t),e.Njj(t)}),e.k0s()(),e.j41(3,"div",40)(4,"p-inputNumber",41),e.mxI("ngModelChange",function(t){const n=e.eBV(i).$implicit;return e.DH7(n.amount,t)||(n.amount=t),e.Njj(t)}),e.k0s()(),e.j41(5,"div",38)(6,"input",42),e.mxI("ngModelChange",function(t){const n=e.eBV(i).$implicit;return e.DH7(n.when,t)||(n.when=t),e.Njj(t)}),e.k0s()(),e.j41(7,"div",43)(8,"button",44),e.bIt("click",function(){const t=e.eBV(i).index,n=e.XpG(2);return e.Njj(n.removeInstallment(t))}),e.k0s()()()}if(2&o){const i=d.$implicit;e.R7$(2),e.R50("ngModel",i.label),e.R7$(2),e.R50("ngModel",i.amount),e.Y8G("min",0),e.R7$(2),e.R50("ngModel",i.when)}}function P(o,d){if(1&o){const i=e.RV6();e.j41(0,"div",23)(1,"div",24)(2,"label"),e.EFF(3,"Student name"),e.k0s(),e.j41(4,"input",25),e.mxI("ngModelChange",function(t){e.eBV(i);const n=e.XpG();return e.DH7(n.editing.studentName,t)||(n.editing.studentName=t),e.Njj(t)}),e.k0s()(),e.j41(5,"div",24)(6,"label"),e.EFF(7,"Course code / name"),e.k0s(),e.j41(8,"input",25),e.mxI("ngModelChange",function(t){e.eBV(i);const n=e.XpG();return e.DH7(n.editing.courseCode,t)||(n.editing.courseCode=t),e.Njj(t)}),e.k0s()(),e.j41(9,"div",26)(10,"label"),e.EFF(11,"Sessions / week"),e.k0s(),e.j41(12,"p-inputNumber",27),e.mxI("ngModelChange",function(t){e.eBV(i);const n=e.XpG();return e.DH7(n.editing.sessionsPerWeek,t)||(n.editing.sessionsPerWeek=t),e.Njj(t)}),e.k0s()(),e.j41(13,"div",26)(14,"label"),e.EFF(15,"Total sessions"),e.k0s(),e.j41(16,"p-inputNumber",27),e.mxI("ngModelChange",function(t){e.eBV(i);const n=e.XpG();return e.DH7(n.editing.totalSessions,t)||(n.editing.totalSessions=t),e.Njj(t)}),e.k0s()(),e.j41(17,"div",24)(18,"label"),e.EFF(19,"Total fees (\u20b9)"),e.k0s(),e.j41(20,"p-inputNumber",27),e.mxI("ngModelChange",function(t){e.eBV(i);const n=e.XpG();return e.DH7(n.editing.totalFees,t)||(n.editing.totalFees=t),e.Njj(t)}),e.k0s()(),e.j41(21,"div",28)(22,"div",29)(23,"label",30),e.EFF(24,"Instalments"),e.k0s(),e.j41(25,"button",31),e.bIt("click",function(){e.eBV(i);const t=e.XpG();return e.Njj(t.addInstallment())}),e.k0s()(),e.DNE(26,G,9,4,"div",32),e.k0s(),e.j41(27,"div",28)(28,"label"),e.EFF(29,"Note (optional, shown under Course Information)"),e.k0s(),e.j41(30,"textarea",33),e.mxI("ngModelChange",function(t){e.eBV(i);const n=e.XpG();return e.DH7(n.editing.note,t)||(n.editing.note=t),e.Njj(t)}),e.k0s()(),e.j41(31,"div",28)(32,"div",34)(33,"label",30),e.EFF(34,"Full letter text (advanced \u2014 edit anything)"),e.k0s(),e.j41(35,"button",35),e.bIt("click",function(){e.eBV(i);const t=e.XpG();return e.Njj(t.regenerateBody())}),e.k0s()(),e.j41(36,"quill-editor",36),e.mxI("ngModelChange",function(t){e.eBV(i);const n=e.XpG();return e.DH7(n.editing.contentHtml,t)||(n.editing.contentHtml=t),e.Njj(t)}),e.k0s()()()}if(2&o){const i=e.XpG();e.R7$(4),e.R50("ngModel",i.editing.studentName),e.R7$(4),e.R50("ngModel",i.editing.courseCode),e.R7$(4),e.R50("ngModel",i.editing.sessionsPerWeek),e.Y8G("min",0),e.R7$(4),e.R50("ngModel",i.editing.totalSessions),e.Y8G("min",0),e.R7$(4),e.R50("ngModel",i.editing.totalFees),e.Y8G("min",0),e.R7$(6),e.Y8G("ngForOf",i.editing.installments),e.R7$(4),e.R50("ngModel",i.editing.note),e.R7$(6),e.Aen(e.lJ4(13,T)),e.R50("ngModel",i.editing.contentHtml)}}function X(o,d){if(1&o){const i=e.RV6();e.j41(0,"button",45),e.bIt("click",function(){e.eBV(i);const t=e.XpG();return e.Njj(t.download(t.editing))}),e.k0s(),e.j41(1,"button",46),e.bIt("click",function(){e.eBV(i);const t=e.XpG();return e.Njj(t.save())}),e.k0s(),e.j41(2,"button",47),e.bIt("click",function(){e.eBV(i);const t=e.XpG();return e.Njj(t.publish())}),e.k0s()}if(2&o){const i=e.XpG();e.Y8G("disabled",!(null!=i.editing&&i.editing.mediaId))}}function H(o,d){1&o&&(e.j41(0,"p",48),e.EFF(1,"Loading the letter\u2026"),e.k0s())}function V(o,d){if(1&o&&e.nrm(0,"iframe",49),2&o){const i=e.XpG();e.Y8G("srcdoc",i.previewHtml,e.npT)}}function O(o,d){if(1&o){const i=e.RV6();e.j41(0,"button",45),e.bIt("click",function(){e.eBV(i);const t=e.XpG();return e.Njj(t.download(t.previewing))}),e.k0s(),e.j41(1,"button",50),e.bIt("click",function(){e.eBV(i);const t=e.XpG();return t.showPreview=!1,e.Njj(t.openEdit(t.previewing))}),e.k0s(),e.j41(2,"button",51),e.bIt("click",function(){e.eBV(i);const t=e.XpG();return e.Njj(t.showPreview=!1)}),e.k0s()}if(2&o){const i=e.XpG();e.Y8G("disabled",!(null!=i.previewing&&i.previewing.mediaId))}}const z=[{path:"",component:(()=>{class o{constructor(i,s,t,n,c,L,U){this.welcomeLetterService=i,this.userService=s,this.toastService=t,this.loaderService=n,this.mediaLibraryService=c,this.route=L,this.sanitizer=U,this.user=this.userService.user.getValue(),this.letters=[],this.showEdit=!1,this.editing=null,this.showPreview=!1,this.previewing=null,this.previewHtml=null,this.previewLoading=!1}openPreview(i){this.previewing=i,this.previewHtml=null,this.previewLoading=!0,this.showPreview=!0,this.welcomeLetterService.previewHtml(i.id).subscribe({next:s=>{this.previewLoading=!1,this.previewHtml=this.sanitizer.bypassSecurityTrustHtml(s?.data?.html||"<p>This letter has no content yet.</p>")},error:s=>{this.previewLoading=!1,this.showPreview=!1,this.toastService.error(s?.error?.message||"Could not build the preview")}})}ngOnInit(){this.load()}
1openRequestedLetter(){const i=this.route.snapshot.queryParamMap.get("letterId");if(!i)return;const s=this.letters.find(t=>t.id===i);s?this.openEdit(s):this.toastService.error("That welcome letter is no longer in the list")}load(){this.loaderService.loadingOn(),this.welcomeLetterService.list().subscribe({next:i=>{this.letters=(i.data||[]).map(s=>({...s,installments:s.installments||[]})),this.loaderService.loadingOff(),this.openRequestedLetter()},error:i=>{this.loaderService.loadingOff(),this.toastService.error(i?.error?.message||"Could not load welcome letters")}})}openEdit(i){this.editing=JSON.parse(JSON.stringify(i)),this.editing.installments=this.editing.installments||[],this.showEdit=!0}addInstallment(){this.editing.installments.push({label:`${this.editing.installments.length+1} Instalment`,amount:0,when:""})}removeInstallment(i){this.editing.installments.splice(i,1)}regenerateBody(){this.saveEditing(!0).subscribe?.({next:()=>this.toastService.success("Letter body rebuilt from the course info"),error:()=>{}})}saveEditing(i=!1){const s={studentName:this.editing.studentName,courseCode:this.editing.courseCode,sessionsPerWeek:this.editing.sessionsPerWeek,totalSessions:this.editing.totalSessions,totalFees:this.editing.totalFees,installments:this.editing.installments,note:this.editing.note,contentHtml:this.editing.contentHtml,regenerateFromFields:i,updatedBy:this.user.id};this.loaderService.loadingOn();const t=this.welcomeLetterService.update(this.editing.id,s);return t.subscribe({next:n=>{this.editing={...n.data,installments:n.data.installments||[]};const c=this.letters.findIndex(L=>L.id===this.editing.id);c>-1&&(this.letters[c]={...n.data,installments:n.data.installments||[]}),this.loaderService.loadingOff()},error:n=>{this.loaderService.loadingOff(),this.toastService.error(n?.error?.message||"Could not save")}}),t}save(){this.saveEditing(!1).subscribe?.({next:()=>this.toastService.success("Welcome letter saved")})}publish(){this.loaderService.loadingOn(),this.welcomeLetterService.update(this.editing.id,{studentName:this.editing.studentName,courseCode:this.editing.courseCode,sessionsPerWeek:this.editing.sessionsPerWeek,totalSessions:this.editing.totalSessions,totalFees:this.editing.totalFees,installments:this.editing.installments,note:this.editing.note,contentHtml:this.editing.contentHtml,updatedBy:this.user.id}).subscribe({next:()=>{this.welcomeLetterService.publish(this.editing.id,this.user.id).subscribe({next:i=>{this.loaderService.loadingOff(),this.toastService.success("Welcome letter published");const s=this.letters.findIndex(t=>t.id===this.editing.id);s>-1&&(this.letters[s]={...i.data,installments:i.data.installments||[]}),this.editing={...i.data,installments:i.data.installments||[]}},error:i=>{this.loaderService.loadingOff(),this.toastService.error(i?.error?.message||"Could not publish")}})},error:i=>{this.loaderService.loadingOff(),this.toastService.error(i?.error?.message||"Could not save before publishing")}})}download(i){i.mediaId?(this.loaderService.loadingOn(),this.mediaLibraryService.getMediaSignedURL(i.mediaId).subscribe({next:s=>{this.loaderService.loadingOff(),window.open(s.data.signedUrl,"_blank")},error:()=>{this.loaderService.loadingOff(),this.toastService.error("Could not open the PDF")}})):this.toastService.error("No PDF yet \u2014 publish the letter first")}static{this.\u0275fac=function(s){return new(s||o)(e.rXU(_.E),e.rXU(k.D),e.rXU(S.f),e.rXU(I.Z),e.rXU(F.H),e.rXU(M.nX),e.rXU(y.up))}}static{this.\u0275cmp=e.VBU({type:o,selectors:[["ems-frontend-list-welcome-letters"]],standalone:!0,features:[e.aNF],decls:17,vars:21,consts:[[1,"card"],[1,"flex","justify-content-between","align-items-center","mb-3"],[2,"margin","0"],[2,"color","var(--secondaryFontColor,#929292)","font-size","0.85rem"],["styleClass","p-datatable-sm",3,"value","paginator","rows"],["pTemplate","header"],["pTemplate","body"],["pTemplate","emptymessage"],["header","Edit Welcome Letter",3,"visibleChange","visible","modal","draggable","maximizable"],["class","grid",4,"ngIf"],["pTemplate","footer"],[3,"visibleChange","header","visible","modal","draggable","maximizable"],["class","text-500",4,"ngIf"],["style","width:100%;height:70vh;border:1px solid var(--surface-border,#e5e7eb);border-radius:6px;background:#f1f3f5","title","Welcome letter preview",3,"srcdoc",4,"ngIf"],[2,"width","180px"],["value","Published","severity","success",4,"ngIf"],["value","Draft","severity","warning",4,"ngIf"],["pButton","","type","button","icon","pi pi-eye","pTooltip","Preview",1,"p-button-text","p-button-sm",3,"click"],["pButton","","type","button","icon","pi pi-pencil","pTooltip","Edit",1,"p-button-text","p-button-sm",3,"click"],["pButton","","type","button","icon","pi pi-download","pTooltip","Download PDF",1,"p-button-text","p-button-sm",3,"click","disabled"],["value","Published","severity","success"],["value","Draft","severity","warning"],["colspan","5",2,"text-align","center","color","var(--secondaryFontColor,#929292)"],[1,"grid"],[1,"col-12","md:col-6"],["type","text","pInputText","",2,"width","100%",3,"ngModelChange","ngModel"],[1,"col-6","md:col-3"],["styleClass","w-full",3,"ngModelChange","ngModel","min"],[1,"col-12"],[1,"flex","justify-content-between","align-items-center","mt-2"],[2,"font-weight","600"],["pButton","","type","button","icon","pi pi-plus","label","Add",1,"p-button-text","p-button-sm",3,"click"],["class","grid align-items-center","style","margin:0;",4,"ngFor","ngForOf"],["pInputTextarea","","rows","2",2,"width","100%",3,"ngModelChange","ngModel"],[1,"flex","justify-content-between","align-items-center"],["pButton","","type","button","icon","pi pi-refresh","label","Rebuild from course info",1,"p-button-outlined","p-button-sm",3,"click"],[3,"ngModelChange","ngModel"],[1,"grid","align-items-center",2,"margin","0"],[1,"col-4"],["type","text","pInputText","","placeholder","Label",2,"width","100%",3,"ngModelChange","ngModel"],[1,"col-3"],["styleClass","w-full","placeholder","Amount",3,"ngModelChange","ngModel","min"],["type","text","pInputText","","placeholder","When (e.g. 1st October, 2026)",2,"width","100%",3,"ngModelChange","ngModel"],[1,"col-1"],["pButton","","type","button","icon","pi pi-trash",1,"p-button-text","p-button-danger","p-button-sm",3,"click"],["pButton","","type","button","label","Download PDF","icon","pi pi-download",1,"p-button-text",3,"click","disabled"],["pButton","","type","button","label","Save Draft","icon","pi pi-save",1,"p-button-outlined",3,"click"],["pButton","","type","button","label","Publish","icon","pi pi-check",3,"click"],[1,"text-500"],["title","Welcome letter preview",2,"width","100%","height","70vh","border","1p
1x solid var(--surface-border,#e5e7eb)","border-radius","6px","background","#f1f3f5",3,"srcdoc"],["pButton","","type","button","label","Edit","icon","pi pi-pencil",1,"p-button-outlined",3,"click"],["pButton","","type","button","label","Close",3,"click"]],template:function(s,t){1&s&&(e.j41(0,"div",0)(1,"div",1)(2,"h2",2),e.EFF(3,"Welcome Letters"),e.k0s(),e.j41(4,"span",3),e.EFF(5,"Auto-created when a plan is activated. Edit, then Publish to show it to the student."),e.k0s()(),e.j41(6,"p-table",4),e.DNE(7,R,11,0,"ng-template",5)(8,N,14,6,"ng-template",6)(9,D,3,0,"ng-template",7),e.k0s()(),e.j41(10,"p-dialog",8),e.mxI("visibleChange",function(c){return e.DH7(t.showEdit,c)||(t.showEdit=c),c}),e.DNE(11,P,37,14,"div",9)(12,X,3,1,"ng-template",10),e.k0s(),e.j41(13,"p-dialog",11),e.mxI("visibleChange",function(c){return e.DH7(t.showPreview,c)||(t.showPreview=c),c}),e.DNE(14,H,2,0,"p",12)(15,V,1,1,"iframe",13)(16,O,3,1,"ng-template",10),e.k0s()),2&s&&(e.R7$(6),e.Y8G("value",t.letters)("paginator",t.letters.length>10)("rows",10),e.R7$(4),e.Aen(e.lJ4(19,x)),e.R50("visible",t.showEdit),e.Y8G("modal",!0)("draggable",!1)("maximizable",!0),e.R7$(),e.Y8G("ngIf",t.editing),e.R7$(2),e.Aen(e.lJ4(20,x)),e.Y8G("header","Welcome Letter \u2014 "+((null==t.previewing?null:t.previewing.studentName)||"")),e.R50("visible",t.showPreview),e.Y8G("modal",!0)("draggable",!1)("maximizable",!0),e.R7$(),e.Y8G("ngIf",t.previewLoading),e.R7$(),e.Y8G("ngIf",!t.previewLoading))},dependencies:[r.MD,r.Sq,r.bT,g.YN,g.me,g.BC,g.vS,h.bG,h.XI,E.Ei,f.tm,f._f,b.P,b.l,C.u,C.S,a.O3,a.YI,j.f,j.Z,u.$,u.v,p.S,p.m,m.i9],encapsulation:2})}}return o})(),data:{title:"Welcome Letters"}}]},42885:(w,v,l)=>{l.d(v,{Z:()=>b,f:()=>C});var r=l(70106),g=l(57565),h=l(45109),f=l(29959);let b=(()=>{class a{el;ngModel;control;cd;config;autoResize;variant="outlined";onResize=new r.bkB;filled;cachedScrollHeight;ngModelSubscription;ngControlSubscription;constructor(u,p,m,e,_){this.el=u,this.ngModel=p,this.control=m,this.cd=e,this.config=_}ngOnInit(){this.ngModel&&(this.ngModelSubscription=this.ngModel.valueChanges.subscribe(()=>{this.updateState()})),this.control&&(this.ngControlSubscription=this.control.valueChanges.subscribe(()=>{this.updateState()}))}ngAfterViewInit(){this.autoResize&&this.resize(),this.updateFilledState(),this.cd.detectChanges()}onInput(u){this.updateState()}updateFilledState(){this.filled=this.el.nativeElement.value&&this.el.nativeElement.value.length}resize(u){this.el.nativeElement.style.height="auto",this.el.nativeElement.style.height=this.el.nativeElement.scrollHeight+"px",parseFloat(this.el.nativeElement.style.height)>=parseFloat(this.el.nativeElement.style.maxHeight)?(this.el.nativeElement.style.overflowY="scroll",this.el.nativeElement.style.height=this.el.nativeElement.style.maxHeight):this.el.nativeElement.style.overflow="hidden",this.onResize.emit(u||{})}updateState(){this.updateFilledState(),this.autoResize&&this.resize()}ngOnDestroy(){this.ngModelSubscription&&this.ngModelSubscription.unsubscribe(),this.ngControlSubscription&&this.ngControlSubscription.unsubscribe()}static \u0275fac=function(p){return new(p||a)(r.rXU(r.aKT),r.rXU(h.vS,8),r.rXU(h.vO,8),r.rXU(r.gRc),r.rXU(f.r1))};static \u0275dir=r.FsC({type:a,selectors:[["","pInputTextarea",""]],hostAttrs:[1,"p-inputtextarea","p-inputtext","p-component","p-element"],hostVars:6,hostBindings:function(p,m){1&p&&r.bIt("input",function(_){return m.onInput(_)}),2&p&&r.AVh("p-filled",m.filled)("p-inputtextarea-resizable",m.autoResize)("p-variant-filled","filled"===m.variant||"filled"===m.config.inputStyle())},inputs:{autoResize:[r.Mj6.HasDecoratorInputTransform,"autoResize","autoResize",r.L39],variant:"variant"},outputs:{onResize:"onResize"},features:[r.GFd]})}return a})(),C=(()=>{class a{static \u0275fac=function(p){return new(p||a)};static \u0275mod=r.$C({type:a});static \u0275inj=r.G2t({imports:[g.MD]})}return a})()}}]);
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.