PageSourceSearch

https://myumsi.naumsinc.org/static/js/9977.b17d4bdc.chunk.js

js naumsinc.org collected 2026-10-05 20:04:16 UTC 31,433 bytes, 2 lines download raw bytes

1"use strict";(self.webpackChunknaums_web=self.webpackChunknaums_web||[]).push([[9977],{64:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"m12 8-6 6 1.41 1.41L12 10.83l4.59 4.58L18 14z"}),"ExpandLess")},1420:(e,s,t)=>{t.d(s,{A:()=>d});var a=t(65043),n=t(27421),i=t(58315),l=t(67079),r=t(44051),o=(t(70979),t(70579));const c=340;const d=e=>{let{steps:s,onClose:t}=e;const[d,h]=(0,a.useState)(0),[u,m]=(0,a.useState)(null),[p,x]=(0,a.useState)({top:0,left:0,centered:!0}),g=(0,a.useRef)(null),f=s[d],j=0===d,v=d===s.length-1,b=(0,a.useRef)(200),y=(0,a.useCallback)(()=>{var e;if(!f)return;if(!f.targetSelector)return m(null),void x({top:0,left:0,centered:!0});const s=document.querySelector(f.targetSelector);if(!s)return void(f.fallbackCenter&&(m(null),x({top:0,left:0,centered:!0})));const t=s.getBoundingClientRect(),a={top:t.top,left:t.left,width:t.width,height:t.height};m(a);const n=(null===(e=g.current)||void 0===e?void 0:e.offsetHeight)||b.current;b.current=n,x(function(e,s,t){if(!e)return{top:0,left:0,centered:!0};const a=window.innerWidth,n=window.innerHeight;let i=0,l=0;switch(s||"bottom"){case"right":i=e.top+e.height/2-t/2,l=e.left+e.width+14;break;case"left":i=e.top+e.height/2-t/2,l=e.left-c-14;break;case"top":i=e.top-t-14,l=e.left+e.width/2-170;break;default:i=e.top+e.height+14,l=e.left+e.width/2-170}const r=12;return l<r&&(l=r),l+c>a-r&&(l=a-c-r),i<r&&(i=r),i+t>n-r&&(i=n-t-r),{top:i,left:l,centered:!1}}(a,f.placement,n))},[f]);if((0,a.useLayoutEffect)(()=>{if(!f)return;if(!f.targetSelector)return m(null),void x({top:0,left:0,centered:!0});const e=document.querySelector(f.targetSelector);if(!e)return void(f.fallbackCenter?(m(null),x({top:0,left:0,centered:!0})):d<s.length-1?h(e=>e+1):t());e.scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),y();const a=setTimeout(y,340);return()=>clearTimeout(a)},[f,y,s.length,d,t]),(0,a.useEffect)(()=>{let e=0;const s=()=>{cancelAnimationFrame(e),e=requestAnimationFrame(y)};return window.addEventListener("resize",s),window.addEventListener("scroll",s,!0),()=>{cancelAnimationFrame(e),window.removeEventListener("resize",s),window.removeEventListener("scroll",s,!0)}},[y]),(0,a.useEffect)(()=>{const e=e=>{"Escape"===e.key?t():"ArrowRight"===e.key||"Enter"===e.key?v?t():h(e=>Math.min(e+1,s.length-1)):"ArrowLeft"===e.key&&h(e=>Math.max(e-1,0))};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[t,v,s.length]),!f)return null;const N=!!u&&!p.centered;return(0,o.jsxs)(r.A,{children:[(0,o.jsx)("div",{className:"ht-tour-overlay ".concat(N?"ht-tour-overlay--clear":""),onClick:t}),N&&(0,o.jsx)("div",{className:"ht-tour-spotlight",style:{top:"".concat(u.top-6,"px"),left:"".concat(u.left-6,"px"),width:"".concat(u.width+12,"px"),height:"".concat(u.height+12,"px")}}),(0,o.jsxs)("div",{ref:g,className:"ht-tour-popover ".concat(p.centered?"center":""),style:p.centered?void 0:{top:"".concat(p.top,"px"),left:"".concat(p.left,"px")},onClick:e=>e.stopPropagation(),children:[(0,o.jsx)("button",{className:"ht-tour-close",onClick:t,title:"Close tour",children:(0,o.jsx)(n.A,{fontSize:"small"})}),(0,o.jsxs)("div",{className:"ht-tour-step-counter",children:["Step ",d+1," of ",s.length]}),(0,o.jsx)("h3",{className:"ht-tour-title",children:f.title}),(0,o.jsx)("p",{className:"ht-tour-content",children:f.content}),(0,o.jsxs)("div",{className:"ht-tour-actions",children:[(0,o.jsxs)("button",{className:"ht-tour-btn secondary",onClick:()=>{h(e=>Math.max(e-1,0))},disabled:j,children:[(0,o.jsx)(i.A,{fontSize:"small"}),"Previous"]}),(0,o.jsx)("button",{className:"ht-tour-skip",onClick:t,children:"Skip"}),(0,o.jsx)("button",{className:"ht-tour-btn primary",onClick:()=>{v?t():h(e=>e+1)},children:v?"Done":(0,o.jsxs)(o.Fragment,{children:["Next",(0,o.jsx)(l.A,{fontSize:"small"})]})})]})]})]})}},5060:(e,s,t)=>{function a(e,s){return e.filter(e=>!e.roles||0===e.roles.length||e.roles.some(e=>{switch(e){case"admin":return s.isAdmin;
1case"headOfSchool":return s.isHeadOfSchool;case"staff":return s.isStaff||!1;case"teacher":return s.isTeacher||!1;case"organization":return s.isOrganization||!1;default:return!1}}))}t.d(s,{N:()=>a})},12690:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M11 18h2v-2h-2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4"}),"HelpOutline")},21553:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-6h2zm0-8h-2V7h2z"}),"Info")},22672:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3m3-10H5V5h10z"}),"Save")},45287:(e,s,t)=>{t.d(s,{d:()=>n});var a=t(65043);function n(){const[e,s]=(0,a.useState)([]),t=(0,a.useCallback)(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"info",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:5e3;const n="toast-".concat(Date.now(),"-").concat(Math.random());s(s=>[...s,{id:n,message:e,type:t,duration:a}].slice(-3))},[]),n=(0,a.useCallback)(e=>{s(s=>s.filter(s=>s.id!==e))},[]),i=(0,a.useCallback)((e,s)=>{t(e,"success",s)},[t]),l=(0,a.useCallback)((e,s)=>{t(e,"error",s||7e3)},[t]),r=(0,a.useCallback)((e,s)=>{t(e,"warning",s)},[t]),o=(0,a.useCallback)((e,s)=>{t(e,"info",s)},[t]);return{toasts:e,showToast:t,hideToast:n,success:i,error:l,warning:r,info:o}}},61773:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M3 17.25V21h3.75L17.81 9.94l-3.75-3.75zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34a.996.996 0 0 0-1.41 0l-1.83 1.83 3.75 3.75z"}),"Edit")},63745:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14"}),"Search")},64233:(e,s,t)=>{t.d(s,{n:()=>l});var a=t(65043),n=t(29066),i=t(46892);function l(){const{user:e,isAdmin:s,isHeadOfSchool:t}=(0,n.A)(),l=null===e||void 0===e?void 0:e.role;return(0,a.useMemo)(()=>({isAdmin:!!s,isHeadOfSchool:!!t,isStaff:l===i.gG.STAFF,isTeacher:l===i.gG.TEACHER,isOrganization:l===i.gG.ORGANIZATION}),[s,t,l])}},66335:(e,s,t)=>{t.d(s,{A:()=>m});var a=t(65043),n=t(12690),i=t(1420),l=t(27421),r=t(25272),o=t(64),c=t(87186),d=t(44051),h=t(70579);const u=e=>{var s,t;let{title:n,sections:i,hasTour:u,onStartTour:m,onClose:p}=e;const[x,g]=(0,a.useState)(null!==(s=null===(t=i[0])||void 0===t?void 0:t.key)&&void 0!==s?s:null);return(0,h.jsx)(d.A,{children:(0,h.jsx)("div",{className:"phm-overlay",onClick:p,children:(0,h.jsxs)("div",{className:"phm-modal",style:{maxWidth:560},onClick:e=>e.stopPropagation(),children:[(0,h.jsxs)("div",{className:"phm-header",children:[(0,h.jsx)("h2",{children:n}),(0,h.jsx)("button",{className:"phm-close",onClick:p,type:"button","aria-label":"Close",children:(0,h.jsx)(l.A,{fontSize:"small"})})]}),(0,h.jsxs)("div",{className:"phm-body",children:[u&&(0,h.jsxs)("button",{className:"phm-tour-launch-btn",onClick:m,type:"button",children:[(0,h.jsx)(c.A,{fontSize:"small"}),(0,h.jsxs)("div",{className:"phm-tour-launch-text",children:[(0,h.jsx)("span",{className:"phm-tour-launch-title",children:"Take Interactive Tour"}),(0,h.jsx)("span",{className:"phm-tour-launch-sub",children:"Walk through every feature with on-screen tips"})]})]}),i.map(e=>(0,h.jsxs)("div",{className:"phm-section",children:[(0,h.jsxs)("button",{className:"phm-section-header",onClick:()=>{return s=e.key,g(e=>e===s?null:s);var s},type:"button",children:[(0,h.jsx)("span",{children:e.title}),x===e.key?(0,h.jsx)(o.A,{fontSize:"small"}):(0,h.jsx)(r.A,{fontSize:"small"})]}),x===e.key&&(0,h.jsx)("div",{className:"phm-section-content",children:(0,h.jsx)("ul",{children:e.lines.map((e,s)=>(0,h.jsx)("li",{children:e},s))})})]},e.key))]})]})})})};t(70979);const m=e=>{let{faqSections:s,tourSteps:t=[],modalTitle:l,buttonTitle:r="Help & Guide"}=e;const[o,c]=(0,a.useState)(!1),[d,m]=(0,a.useState)(!1),p=t.length>0;return(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)("button",{type:"button",className:"ht-launcher-btn",onClick:()=>c(!0),title:r,"aria-label":r,children:(0,h.jsx)(n.A,{fontSize:"small"})}),o&&(0,h.jsx)(u,{title:l,sections:s,hasTour:p,onStartTour:()=>{c(!1),m(!0)},onClose:()=>c(!1)}),d&&p&&(0,h.jsx)(i.A,{steps:t,onClose:()=>m(!1)})]})}},67079:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"m12 4-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z"}),"ArrowForward")},67458:(e,s,t)=>{t.d(s,{A:()=>h});var a=t(65043),n=t(93201),i=t(89935),l=t(71101),r=t(21553),o=t(27421),c=t(70579);const d=e=>{let{message:s,type:t="info",duration:d=5e3,onClose:h}=e;const u=(0,a.useRef)(h);u.current=h,(0,a.useEffect)(()=>
1{if(d>0){const e=setTimeout(()=>u.current(),d);return()=>clearTimeout(e)}},[d]);return(0,c.jsxs)("div",{className:"toast toast-".concat(t),children:[(()=>{switch(t){case"success":return(0,c.jsx)(n.A,{className:"toast-icon"});case"error":return(0,c.jsx)(i.A,{className:"toast-icon"});case"warning":return(0,c.jsx)(l.A,{className:"toast-icon"});default:return(0,c.jsx)(r.A,{className:"toast-icon"})}})(),(0,c.jsx)("div",{className:"toast-content",children:(0,c.jsx)("p",{className:"toast-message",children:s})}),(0,c.jsx)("button",{className:"toast-close",onClick:h,"aria-label":"Close",children:(0,c.jsx)(o.A,{})})]})},h=e=>{let{toasts:s,onClose:t}=e;return 0===s.length?null:(0,c.jsx)("div",{className:"toast-container",children:s.map(e=>(0,c.jsx)(d,{message:e.message,type:e.type,duration:e.duration,onClose:()=>t(e.id)},e.id))})}},70979:()=>{},71101:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M1 21h22L12 2zm12-3h-2v-2h2zm0-4h-2v-4h2z"}),"Warning")},87186:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M8 5v14l11-7z"}),"PlayArrow")},89935:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2m1 15h-2v-2h2zm0-4h-2V7h2z"}),"Error")},89977:(e,s,t)=>{t.r(s),t.d(s,{default:()=>E});var a=t(89379),n=t(65043),i=t(29066),l=t(20263),r=t(97700),o=t(66335),c=t(64233),d=t(5060);const h=[{key:"overview",title:"What is this page?",lines:['Release Notes is where admins publish "What\'s New" updates that surface to all users via the bell-style "What\'s New" prompt.',"Each release has a version, date, headline, and a body describing what changed.","Users see unread releases highlighted; once they've viewed a release, it stops nagging them."]},{key:"create",title:"How do I publish a new release?",lines:['Click "New Release" to open the editor.',"Pick a version number (e.g. 1.4.2) and a release date, then write the headline and body in rich text.","When you're ready, save and publish \u2014 it goes live immediately and triggers the \"What's New\" indicator for users."]},{key:"import-commits",title:"Can I auto-import from Git?",lines:['Yes \u2014 the "Import Commits" feature pulls recent commits from the connected GitHub repo and lets you turn them into a release draft.',"Pick which commits to include, edit the description, and publish. Saves you from rewriting the same content twice."]},{key:"edit",title:"Can I edit or unpublish?",lines:['Yes \u2014 every release has Edit and Delete actions. Editing updates the published version (users will see the new content the next time they open "What\'s New").',"Deleting removes it entirely, including from users' \"What's New\" history."]},{key:"whatsnew-prompt",title:"How do users see this?",lines:["Users see a \"What's New\" button in the sidebar footer. When you publish a new release, an indicator appears so they know there's something to read.","Clicking opens a modal showing all unread releases since their last visit. Once they close it, the indicator clears."]}],u=[{id:"welcome",title:"Release Notes",content:'Publish "What\'s New" updates that show to every user via the sidebar prompt. Use this to announce features, bug fixes, policy changes, and anything else worth surfacing.',fallbackCenter:!0},{id:"list",title:"Published Releases",content:"Every release you've published is listed here in reverse chronological order \u2014 version, date, and a preview of the content.",fallbackCenter:!0},{id:"new-release",title:"Create a Release",content:'Click "New Release" to write a fresh entry. Use rich text formatting, images, and links \u2014 whatever helps users understand what changed.',fallbackCenter:!0},{id:"import",title:"Import from GitHub",content:'Use "Import Commits" to pull recent commits from the repo and turn them into a release draft. Saves time on routine updates.',fallbackCenter:!0},{id:"edit-delete",title:"Edit and Delete",content:'Each release has Edit and Delete buttons. Editing updates what users see; deleting removes it from their "What\'s New" feed entirely.',fallbackCenter:!0},{id:"done",title:"You're Set",content:'When you publish a release, every user gets a fresh "What\'s New" indicator. Re-launch this tour anytime from the help icon.',fallbackCenter:!0}];var m=t(67458),p=t(45287),x=t(36785),g=t(1889),f=t(62073),j=t(78018),v=t(99992),b=t(70579);const y=(0,v.A)((0,b.jsx)("path",{d:"M5 4v2h14V4zm0 10h4v6h6v-6h4l-7-7z"}),"Publish");var N=t(61773);const w=(0,v.A)((0,b.jsx)("path",{d:"M21.19 21.19 2.81 2.81 1.39 4.22l2.27 2.27C2.61 8.07 2 9.96 2 12c0 5.52 4.48 10 10 10 2.04 0 3.93-.61 5.51-1.66l2.27 2.27zm-10.6-4.59-4.24-4.24 1.41-1.41 2.83 2.83.18-.18 1.41 1.41zm3-5.84-7.1-7.1C8.07 2.61 9.96 2 12 2c5.52 0 10 4.48 10 10 0 2.04-.61 3.93-1.66 5.51L15 12.17l2.65-2.65-1.41-1.41z"}),"Unpublished");var S=t(91658);const C=(0,v.A)((0,b.jsx)("path",{d:"M12 1.27a11 11 0 00-3.48 21.46c.55.09.73-.28.73-.55v-1.84c-3.03.64-3.67-1.46-3.67-1.46-.55-1.29-1.28-1.65-1.28-1.65-.92-.65.1-.65.1-.65 1.1 0 1.73 1.1 1.73 1.1.92 1.65 2.57 1.2 3.21.92a2 2 0 01.64-1.47c-2.47-.27-5.04-1.19-5.04-5.5 0-1.1.46-2.1 1.2-2.84a3.76 3.76 0 010-2.93s.91-.28 3.11 1.1c1.8-.49 3.7-.49 5.5 0 2.1-1.38 3.02-1.1 3.02-1.1a3.76 3.76 0 010 2.93c.83.74 1.2 1.74 1.2 2.94 0 4.21-2.57 5.13-5.04 5.4.45.37.82.92.82 2.02v3.03c0 .27.1.64.73.55A11 11 0 0012 1.27"}),"GitHub");var k=t(22950),A=t(22672),z=t(27421),T=t(99161),L=t(63745);const R=(0,v.A)((0,b.jsx)("path",{d:"m22.7 19-9.1-9.1c.9-2.3.4-5-1.5-6.9-2-2-5-2.4-7.4-1.3L9 6 6 9 1.6 4.7C.4 7.1.9 10.1 2.9 12.1c1.9 1.9 4.6 2.4 6.9 1.5l9.1 9.1c.4.4 1 .4 
11.4 0l2.3-2.3c.5-.4.5-1.1.1-1.4"}),"Build"),E=()=>{const{user:e,isAdmin:s}=(0,i.A)(),v=(0,p.d)(),E=(0,x.G)(),M=(0,c.n)(),F=(0,d.N)(u,M),[H,D]=(0,n.useState)([]),I=(0,n.useMemo)(()=>(0,l.hV)(H),[H]),[P,B]=(0,n.useState)(!0),[W,U]=(0,n.useState)(null),[O,G]=(0,n.useState)("freeform"),[V,q]=(0,n.useState)(""),[Y,_]=(0,n.useState)(!1),[Z,$]=(0,n.useState)(!1),[J,K]=(0,n.useState)([]),[Q,X]=(0,n.useState)(""),[ee,se]=(0,n.useState)(""),[te,ae]=(0,n.useState)(""),[ne,ie]=(0,n.useState)(!1),[le,re]=(0,n.useState)(null),[oe,ce]=(0,n.useState)(!1),[de,he]=(0,n.useState)(null),ue=(0,n.useCallback)(async()=>{B(!0);const e=await l.Ay.getAllReleases();D(e),B(!1)},[]);(0,n.useEffect)(()=>{ue()},[ue]),(0,n.useEffect)(()=>{let e=!1;return(async()=>{try{const s=await t.e(3784).then(t.t.bind(t,83784,19)),a=s.default||s;if(e)return;K(a.recentCommits||[]),se(a.version||""),ae(a.date||"")}catch(s){}})(),()=>{e=!0}},[]);const me=async e=>{const s=(e=>{const s=new Date(e.date),t="".concat(s.getFullYear(),".").concat(String(s.getMonth()+1).padStart(2,"0"),".").concat(String(s.getDate()).padStart(2,"0"));return"".concat(t,"-").concat(e.shortHash)})(e);if(H.find(e=>e.version===s)){if(!await E({title:"Release for ".concat(e.shortHash," already exists"),message:"Overwrite the existing release with this commit?",confirmLabel:"Overwrite",danger:!0}))return}const{features:t,changes:a}=((e,s)=>{const t=s.join(" ").split(/\.\s+/).map(e=>e.trim().replace(/\.$/,"")).filter(e=>e.length>5),a=[];return t.forEach(e=>{/^Also\s/i.test(e)?a.push(e.replace(/^Also\s+/i,"")):a.push(e)}),{features:[e],changes:a}})(e.subject,e.body);try{await l.Ay.publishRelease({version:s,date:e.date,features:t,fixes:[],changes:a,commitCount:1}),v.success("Created v".concat(s," \u2014 1 feature, ").concat(a.length," changes")),$(!1),ue()}catch(n){v.error("Failed to create release.")}},pe=async()=>{if(W){_(!0);try{const s=(e=>{const s=[],t=[],a=[];let n=a;return e.split("\n").forEach(e=>{const i=e.trim();/^##?\s*features?/i.test(i)?n=s:/^##?\s*(bug\s*)?fix(es)?/i.test(i)?n=t:/^##?\s*(other\s*)?changes?/i.test(i)?n=a:i.startsWith("- ")||i.startsWith("* ")?n.push(i.slice(2).trim()):i&&!i.startsWith("#")&&n.push(i)}),{features:s,fixes:t,changes:a}})(V);await l.Ay.updateRelease(W,(0,a.A)((0,a.A)({},s),{},{editedBy:null===e||void 0===e?void 0:e.uid})),v.success("Release notes updated"),U(null),ue()}catch(s){v.error("Failed to save")}finally{_(!1)}}};return s?(0,b.jsxs)("div",{className:"rl-page",children:[(0,b.jsx)(r.A,{actions:(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)(o.A,{modalTitle:"Release Notes Guide",faqSections:h,tourSteps:F,buttonTitle:"Help & guide for release notes"}),(0,b.jsxs)("button",{className:"btn-secondary",onClick:async()=>{const e=new Date,s="".concat(e.getFullYear(),".").concat(String(e.getMonth()+1).padStart(2,"0"),".").concat(String(e.getDate()).padStart(2,"0"),".manual");H.find(e=>e.version===s)?v.info("A manual release for today already exists. Edit it instead."):(await l.Ay.publishRelease({version:s,date:e.toISOString(),features:[],fixes:[],changes:[],commitCount:0}),v.success("Created blank draft v".concat(s)),ue(),setTimeout(()=>{U(s),q("## Features\n- \n\n## Bug Fixes\n- \n\n## Changes\n- ")},500))},children:[(0,b.jsx)(k.A,{fontSize:"small"}),"New Blank"]}),(0,b.jsxs)("button",{className:"btn-secondary",onClick:async()=>{0!==J.length?await me(J[0]):v.error('No commit data found. Run "npm run prebuild" in terminal first.')},children:[(0,b.jsx)(C,{fontSize:"small"}),"From Last Commit"]}),(0,b.jsxs)("button",{className:"btn-secondary",onClick:()=>$(!0),children:[(0,b.jsx)(T.A,{fontSize:"small"}),"Browse Commits"]}),(0,b.jsxs)("button",{className:"btn-secondary",onClick:async()=>{try{var e,s,a;const n=await t.e(3784).then(t.t.bind(t,83784,19)),i=n.default||n;if(0===((null===(e=i.features)||void 0===e?void 0:e.length)||0)+((null===(s=i.fixes)||void 0===s?void 0:s.length)||0)+((null===(a=i.changes)||void 0===a?void 0:a.length)||0))return void v.info('No changes detected. Run "npm run prebuild" in terminal to regenerate.');if(H.find(e=>e.version===i.version)){if(!await E({title:"v".concat(i.version," already exists"),message:"Do you want to overwrite the existing release with the new build data?",confirmLabel:"Overwrite",danger:!0}))return}await l.Ay.publishRelease(i),v.success("Imported v".concat(i.version," as draft")),ue()}catch(n){v.error('Failed to import. Run "npm run prebuild" in terminal first.')}},children:[(0,b.jsx)(S.A,{fontSize:"small"}),"Import Build"]}),(0,b.jsxs)("button",{className:"btn-secondary",onClick:async()=>
1{if(await E({title:"Run School Type Migration?",message:"This backfills the School Type field from imported Personify data for any school missing it. Schools with a value already set are skipped. Safe to re-run.",confirmLabel:"Run Migration"})){ie(!0),re(null);try{const e=(0,g.httpsCallable)(f.functions,"migrateSchoolModels"),s=await e();re(s.data),v.success("Migration complete: ".concat(s.data.updated," schools updated."))}catch(e){j.vF.error("Migration failed:",e),v.error((null===e||void 0===e?void 0:e.message)||"Migration failed. See console for details.")}finally{ie(!1)}}},disabled:ne,title:"Backfill School Type from Personify import data",children:[(0,b.jsx)(R,{fontSize:"small"}),ne?"Running...":"Backfill School Types"]}),(0,b.jsxs)("button",{className:"btn-secondary",onClick:async()=>{if(await E({title:"Backfill Internal Notes?",message:'This copies imported Personify "Profile Notes" into each school\'s private Internal Notes. Schools that already have notes are skipped. Safe to re-run.',confirmLabel:"Run Migration"})){ce(!0),he(null);try{const e=(0,g.httpsCallable)(f.functions,"migrateSchoolNotes"),s=await e();he(s.data),v.success("Notes migration complete: ".concat(s.data.copied," schools updated."))}catch(e){j.vF.error("Notes migration failed:",e),v.error((null===e||void 0===e?void 0:e.message)||"Notes migration failed. See console for details.")}finally{ce(!1)}}},disabled:oe,title:"Backfill Internal Notes from Personify import data",children:[(0,b.jsx)(R,{fontSize:"small"}),oe?"Running...":"Backfill Internal Notes"]})]}),children:(0,b.jsx)("h1",{className:"page-title",children:"Release Notes"})}),le&&(0,b.jsxs)("div",{className:"rl-migration-result",children:[(0,b.jsxs)("div",{className:"rl-migration-result-header",children:[(0,b.jsx)("strong",{children:"School Type Migration \u2014 Results"}),(0,b.jsx)("button",{className:"rl-migration-close",onClick:()=>re(null),title:"Dismiss",children:(0,b.jsx)(z.A,{fontSize:"small"})})]}),(0,b.jsxs)("div",{className:"rl-migration-stats",children:[(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:le.scanned})," scanned"]}),(0,b.jsxs)("span",{className:"rl-migration-stat-pos",children:[(0,b.jsx)("strong",{children:le.updated})," updated"]}),(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:le.skippedAlreadySet})," already set"]}),(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:le.skippedNoMappableType})," no Type in source"]}),(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:le.skippedNoProfileId})," no profile link"]}),(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:le.skippedNoTestData})," no source record"]}),le.errorCount>0&&(0,b.jsxs)("span",{className:"rl-migration-stat-err",children:[(0,b.jsx)("strong",{children:le.errorCount})," errors"]})]}),le.updatedSchools.length>0&&(0,b.jsxs)("details",{className:"rl-migration-list",children:[(0,b.jsxs)("summary",{children:["Updated schools (",le.updatedSchools.length,")"]}),(0,b.jsx)("ul",{children:le.updatedSchools.map(e=>(0,b.jsxs)("li",{children:[e.name," \u2192 ",(0,b.jsx)("code",{children:e.model})]},e.id))})]}),le.errors.length>0&&(0,b.jsxs)("details",{className:"rl-migration-list rl-migration-errors",children:[(0,b.jsxs)("summary",{children:["Errors (",le.errors.length,")"]}),(0,b.jsx)("ul",{children:le.errors.map((e,s)=>(0,b.jsx)("li",{children:e},s))})]})]}),de&&(0,b.jsxs)("div",{className:"rl-migration-result",children:[(0,b.jsxs)("div",{className:"rl-migration-result-header",children:[(0,b.jsx)("strong",{children:"Internal Notes Migration \u2014 Results"}),(0,b.jsx)("button",{className:"rl-migration-close",onClick:()=>he(null),title:"Dismiss",children:(0,b.jsx)(z.A,{fontSize:"small"})})]}),(0,b.jsxs)("div",{className:"rl-migration-stats",children:[(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:de.scanned})," scanned"]}),(0,b.jsxs)("span",{className:"rl-migration-stat-pos",children:[(0,b.jsx)("strong",{children:de.copied})," copied"]}),(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:de.skippedAlreadyHasNotes})," already had notes"]}),(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:de.skippedNoSourceNotes})," no notes in source"]}),(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:de.skippedNoProfileId})," no profile link"]}),(0,b.jsxs)("span",{children:[(0,b.jsx)("strong",{children:de.skippedNoTestData})," no source record"]}),de.errorCount>0&&(0,b.jsxs)("span",{className:"rl-migration-stat-err",children:[(0,b.jsx)("strong",{children:de.errorCount})," errors"]})]}
1),de.copiedSchools.length>0&&(0,b.jsxs)("details",{className:"rl-migration-list",children:[(0,b.jsxs)("summary",{children:["Schools updated (",de.copiedSchools.length,")"]}),(0,b.jsx)("ul",{children:de.copiedSchools.map(e=>(0,b.jsxs)("li",{children:[(0,b.jsx)("strong",{children:e.name})," \u2014 ",(0,b.jsx)("span",{style:{color:"var(--text-secondary)"},children:e.preview})]},e.id))})]}),de.errors.length>0&&(0,b.jsxs)("details",{className:"rl-migration-list rl-migration-errors",children:[(0,b.jsxs)("summary",{children:["Errors (",de.errors.length,")"]}),(0,b.jsx)("ul",{children:de.errors.map((e,s)=>(0,b.jsx)("li",{children:e},s))})]})]}),(0,b.jsx)("div",{className:"rl-content",children:P?(0,b.jsx)("div",{className:"rl-loading",children:"Loading releases..."}):0===H.length?(0,b.jsx)("div",{className:"rl-empty",children:(0,b.jsx)("p",{children:'No releases yet. Click "Import from Build" to create one from the latest build.'})}):(0,b.jsx)("div",{className:"rl-list",children:H.map(s=>{var t;return(0,b.jsxs)("div",{className:"rl-card".concat(s.published?" rl-card--published":""),children:[(0,b.jsxs)("div",{className:"rl-card-header",children:[(0,b.jsxs)("div",{className:"rl-card-info",children:[(0,b.jsxs)("span",{className:"rl-card-version",children:["v",(0,l.sP)(s.version,I)]}),(0,b.jsx)("span",{className:"rl-card-date",children:s.date.toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})}),(0,b.jsx)("span",{className:"rl-card-badge".concat(s.published?" rl-card-badge--pub":""),children:s.published?"Published":"Draft"}),(0,b.jsxs)("span",{className:"rl-card-counts",children:[s.features.length+s.fixes.length+s.changes.length," items"]})]}),(0,b.jsx)("div",{className:"rl-card-actions",children:W!==s.version&&(0,b.jsxs)(b.Fragment,{children:[(0,b.jsx)("button",{className:"rl-action-btn",onClick:()=>(e=>{U(e.version),G("freeform"),q((e=>{const s=[];return e.features.length>0&&s.push("## Features\n"+e.features.map(e=>"- ".concat(e)).join("\n")),e.fixes.length>0&&s.push("## Bug Fixes\n"+e.fixes.map(e=>"- ".concat(e)).join("\n")),e.changes.length>0&&s.push("## Changes\n"+e.changes.map(e=>"- ".concat(e)).join("\n")),s.join("\n\n")||"(no notes)"})(e))})(s),title:"Edit",children:(0,b.jsx)(N.A,{sx:{fontSize:18}})}),(0,b.jsx)("button",{className:"rl-action-btn",onClick:()=>(async s=>{await E({title:"".concat(s.published?"Unpublish":"Publish"," v").concat(s.version,"?"),message:s.published?"Users will no longer see this release.":"This will show these release notes to all users on their next login.",confirmLabel:s.published?"Unpublish":"Publish",danger:s.published})&&(await l.Ay.updateRelease(s.version,{published:!s.published,editedBy:null===e||void 0===e?void 0:e.uid}),v.success("v".concat(s.version," ").concat(s.published?"unpublished":"published")),ue())})(s),title:s.published?"Unpublish":"Publish",children:s.published?(0,b.jsx)(w,{sx:{fontSize:18}}):(0,b.jsx)(y,{sx:{fontSize:18}})})]})})]}),W===s.version?(0,b.jsxs)("div",{className:"rl-edit-body",children:[(0,b.jsxs)("div",{className:"rl-edit-hint",children:["Use ",(0,b.jsx)("code",{children:"## Features"}),", ",(0,b.jsx)("code",{children:"## Bug Fixes"}),", ",(0,b.jsx)("code",{children:"## Changes"})," as headers. Lines starting with ",(0,b.jsx)("code",{children:"-"})," become list items."]}),(0,b.jsx)("textarea",{className:"rl-textarea",value:V,onChange:e=>q(e.target.value),rows:16,placeholder:"## Features\n- Added customizable dashboard ## Bug Fixes\n- Fixed spacing issues ## Changes\n- Updated analytics page"}),(0,b.jsxs)("div",{className:"rl-edit-actions",children:[(0,b.jsxs)("button",{className:"rl-save-btn",onClick:pe,disabled:Y,children:[(0,b.jsx)(A.A,{sx:{fontSize:16}}),Y?"Saving...":"Save"]}),(0,b.jsxs)("button",{className:"rl-cancel-btn",onClick:()=>U(null),children:[(0,b.jsx)(z.A,{sx:{fontSize:16}}),"Cancel"]})]})]}):(0,b.jsxs)("div",{className:"rl-card-body",children:[s.features.length>0&&(0,b.jsxs)("div",{className:"rl-section",children:[(0,b.jsx)("span",{className:"rl-section-label",children:"Features"}),(0,b.jsx)("ul",{children:s.features.map((e,s)=>(0,b.jsx)("li",{children:e},s))})]}),s.fixes.length>0&&(0,b.jsxs)("div",{className:"rl-section",children:[(0,b.jsx)("span",{className:"rl-section-label",children:"Bug Fixes"}),(0,b.jsx)("ul",{children:s.fixes.map((e,s)=>(0,b.jsx)("li",{children:e},s))})]}),s.changes.length>0&&(0,b.jsxs)("div",{className:"rl-section",children:[(0,b.jsx)("span",{className:"rl-section-label",children:"Changes"}),(0,b.jsx)("ul",{children:s.changes.map((e,s)=>(0,b.jsx)("li",{children:e},s))})]}),0===s.features.length&&0===s.fixes.length&&0===s.changes.length&&(0,b.jsx)("span",{className:"rl-empty-hint",children:"No notes yet \u2014 click edit to add some."}),s.editedBy&&(0,b.jsxs)("span",{className:"rl-edited",children:["Last edited ",null===(t=s.editedAt)||void 0===t?void 0:t.toLocaleDateString()]})]})]},s.version)})})}),Z&&(0,b.jsx)("div",{className:"rl-commit-overlay",onClick:()=>$(!1),children:(0,b.jsxs)("div",{className:"rl-commit-modal",onClick:e=>e.stopPropagation(),children:[(0,b.jsxs)("div",{className:"rl-commit-header",children:[(0,b.jsxs)("div",{children:[(0,b.jsx)("h2",{className:"rl-commit-title",children:"Browse Commits"}),(0,b.jsx)("span",{className:"rl-commit-meta",children:0===J.length?'No commit data \u2014 run "npm run prebuild" in terminal first':"".concat(J.length," commits captured at build v").concat(ee).concat(te?" on ".concat(new Date(te).toLocaleDateString()):"")})]}),(0,b.jsx)("button",{className:"rl-commit-close",onClick:()=>$(!1),children:(0,b.jsx)(z.A,{fontSize:"small"})})]}),(0,b.jsxs)("div",{className:"rl-commit-search",children:[(0,b.jsx)(L.A,{sx:{fontSize:18,color:"var(--text-secondary)"}}),(0,b.jsx)("input",{type:"text",placeholder:"Search commits by subject, hash, or author...",value:Q,onChange:e=>X(e.target.value)})]}),(0,b.jsxs)("div",{className:"rl-commit-list",children:[J.filter(e=>{if(!Q.trim())return!0;const s=Q.toLowerCase();return e.subject.toLowerCase().includes(s)||e.shortHash.toLowerCase().includes(s)||e.author.toLowerCase().includes(s)}).map(e=>(0,b.jsxs)("div",{className:"rl-commit-item",children:[(0,b.jsxs)("div",{className:"rl-commit-item-info",children:[(0,b.jsx)("div",{className:"rl-commit-item-subject",children:e.subject}),(0,b.jsxs)("div",{className:"rl-commit-item-meta",children:[(0,b.jsx)("code",{className:"rl-commit-hash",children:e.shortHash}),(0,b.jsx)("span",{children:e.author}),(0,b.jsx)("span",{children:"\xb7"}),(0,b.jsx)("span",{children:new Date(e.date).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric"})})]}),e.body.length>0&&(0,b.jsxs)("div",{className:"rl-commit-item-body",children:[e.body[0].slice(0,200),e.body[0].length>200?"\u2026":""]})]}),(0,b.jsx)("button",{className:"rl-commit-use-btn",onClick:()=>me(e),children:"Use"})]},e.hash)),0===J.length&&(0,b.jsxs)("div",{className:"rl-commit-empty",children:["Run ",(0,b.jsx)("code",{children:"npm run prebuild"})," in terminal to capture commit history, then refresh this page."]})]})]})}),(0,b.jsx)(m.A,{toasts:v.toasts,onClose:v.hideToast})]}):null}},91658:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(99992),n=t(70579);const i=(0,a.A)((0,n.jsx)("path",{d:"M9 16h6v-6h4l-7-7-7 7h4zm-4 2h14v2H5z"}),"FileUpload")},97700:(e,s,t)=>{t.d(s,{A:()=>i});var a=t(65043),n=t(83912);const i=e=>{let{children:s,actions:t}=e;const{setTopBarContent:i}=(0,n.G)();return(0,a.useEffect)(()=>(i(s,t),()=>{i(null,null)}),[s,t,i]),null}}}]);
2//# sourceMappingURL=9977.b17d4bdc.chunk.js.map

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.