@local-civics/mgmt-ui 0.1.213 → 0.1.215
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +65 -79
- package/dist/index.d.ts.css +18 -0
- package/dist/index.js +826 -855
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +829 -857
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -61,7 +61,7 @@ function styleInject(css, ref) {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
var css_248z = "@font-face{font-family:ProximaNova;src:url(https://cdn.localcivics.io/fonts/ProximaNova.otf) format(\"opentype\")}@font-face{font-family:ProximaNova;font-weight:700;src:url(https://cdn.localcivics.io/fonts/ProximaNovaBold.otf) format(\"opentype\")}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.\\!relative{position:relative!important}.m-3{margin:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.mt-2{margin-top:.5rem}.mt-1\\.5{margin-top:.375rem}.ml-\\[29px\\]{margin-left:29px}.mt-0\\.5{margin-top:.125rem}.mt-0{margin-top:0}.block{display:block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-full{height:100%}.h-8{height:2rem}.h-7{height:1.75rem}.h-screen{height:100vh}.h-\\[30px\\]{height:30px}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-8{width:2rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-7{width:1.75rem}.w-screen{width:100vw}.w-\\[230px\\]{width:230px}.w-24{width:6rem}.w-\\[30px\\]{width:30px}.min-w-0{min-width:0}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.rotate-90{--tw-rotate:90deg}.rotate-90,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1\\.2fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1.2fr 1fr .6fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-5{gap:1.25rem}.gap-2\\.5{gap:.625rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-3{gap:.75rem}.gap-0\\.5{gap:.125rem}.gap-0{gap:0}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-y-4{row-gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-none{overscroll-behavior:none}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-xl{border-radius:.75rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-2xl{border-radius:1rem}.rounded-\\[10px\\]{border-radius:10px}.rounded-\\[8px\\]{border-radius:8px}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-l{border-left-width:1px}.border-none{border-style:none}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-sky-blue-400\\/30{border-color:rgba(59,208,242,.3)}.border-mint-400\\/30{border-color:rgba(30,226,175,.3)}.border-gold-400\\/30{border-color:rgba(255,212,77,.3)}.border-transparent{border-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-dark-blue-400{--tw-bg-opacity:1;background-color:rgb(35 42 58/var(--tw-bg-opacity))}.bg-mint-400\\/20{background-color:rgba(30,226,175,.2)}.bg-gold-400\\/15{background-color:rgba(255,212,77,.15)}.bg-sky-blue-400\\/15{background-color:rgba(59,208,242,.15)}.bg-sky-blue-400\\/25{background-color:rgba(59,208,242,.25)}.bg-mint-400\\/15{background-color:rgba(30,226,175,.15)}.bg-mint-400\\/25{background-color:rgba(30,226,175,.25)}.bg-gold-400\\/25{background-color:rgba(255,212,77,.25)}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-gold-400{--tw-gradient-from:#ffd44d;--tw-gradient-to:rgba(255,212,77,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-dark-blue-600{--tw-gradient-from:#0a0f2e;--tw-gradient-to:rgba(10,15,46,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-sky-blue-400\\/15{--tw-gradient-from:rgba(59,208,242,.15);--tw-gradient-to:rgba(59,208,242,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-dark-blue-400{--tw-gradient-to:rgba(35,42,58,0);--tw-gradient-stops:var(--tw-gradient-from),#232a3a,var(--tw-gradient-to)}.to-\\[\\#f5c300\\]{--tw-gradient-to:#f5c300}.to-sky-blue-400{--tw-gradient-to:#3bd0f2}.to-mint-400\\/15{--tw-gradient-to:rgba(30,226,175,.15)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-8{padding:2rem}.p-4{padding:1rem}.p-2\\.5{padding:.625rem}.p-2{padding:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-4{padding-bottom:1rem;padding-top:1rem}.px-3\\.5{padding-left:.875rem;padding-right:.875rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}.py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-0\\.5{padding-bottom:.125rem;padding-top:.125rem}.py-0{padding-bottom:0;padding-top:0}.pl-2\\.5{padding-left:.625rem}.pl-2{padding-left:.5rem}.text-center{text-align:center}.font-proxima{font-family:ProximaNova}.text-2xl{font-size:1.5rem;line-height:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-\\[10px\\]{font-size:10px}.text-\\[10\\.5px\\]{font-size:10.5px}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\\[11px\\]{font-size:11px}.text-\\[11\\.5px\\]{font-size:11.5px}.font-extrabold{font-weight:800}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-black{font-weight:900}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-dark-blue-400{--tw-text-opacity:1;color:rgb(35 42 58/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-sky-blue-400{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-mint-400{--tw-text-opacity:1;color:rgb(30 226 175/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-white\\/70{color:hsla(0,0%,100%,.7)}.text-gold-400{--tw-text-opacity:1;color:rgb(255 212 77/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-\\[0_3px_12px_rgba\\(255\\2c 212\\2c 77\\2c 0\\.35\\)\\],.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\\[0_3px_12px_rgba\\(255\\2c 212\\2c 77\\2c 0\\.35\\)\\]{--tw-shadow:0 3px 12px rgba(255,212,77,.35);--tw-shadow-colored:0 3px 12px var(--tw-shadow-color)}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-\\[0_2px_10px_rgba\\(30\\2c 226\\2c 175\\2c 0\\.15\\)\\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\\[0_2px_10px_rgba\\(30\\2c 226\\2c 175\\2c 0\\.15\\)\\]{--tw-shadow:0 2px 10px rgba(30,226,175,.15);--tw-shadow-colored:0 2px 10px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}*,:after,:before{border-style:solid;border-width:0}.placeholder\\:text-slate-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.placeholder\\:text-slate-400::placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.hover\\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.hover\\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.disabled\\:opacity-50:disabled{opacity:.5}";
|
|
64
|
+
var css_248z = "@font-face{font-family:ProximaNova;src:url(https://cdn.localcivics.io/fonts/ProximaNova.otf) format(\"opentype\")}@font-face{font-family:ProximaNova;font-weight:700;src:url(https://cdn.localcivics.io/fonts/ProximaNovaBold.otf) format(\"opentype\")}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.\\!relative{position:relative!important}.left-3\\.5{left:.875rem}.top-1\\/2{top:50%}.left-3{left:.75rem}.m-3{margin:.75rem}.mt-0\\.5{margin-top:.125rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-6{margin-top:1.5rem}.mt-2{margin-top:.5rem}.mt-1\\.5{margin-top:.375rem}.ml-\\[29px\\]{margin-left:29px}.block{display:block}.inline{display:inline}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-full{height:100%}.h-8{height:2rem}.h-7{height:1.75rem}.h-12{height:3rem}.h-9{height:2.25rem}.h-screen{height:100vh}.h-\\[30px\\]{height:30px}.w-10{width:2.5rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-8{width:2rem}.w-fit{width:-moz-fit-content;width:fit-content}.w-7{width:1.75rem}.w-64{width:16rem}.w-12{width:3rem}.w-16{width:4rem}.w-36{width:9rem}.w-4{width:1rem}.w-9{width:2.25rem}.w-\\[440px\\]{width:440px}.w-40{width:10rem}.w-screen{width:100vw}.w-\\[230px\\]{width:230px}.w-24{width:6rem}.w-\\[30px\\]{width:30px}.min-w-0{min-width:0}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y:-50%}.-translate-y-1\\/2,.rotate-180{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate:180deg}.rotate-90{--tw-rotate:90deg}.rotate-90,.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1\\.2fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1.2fr 1fr .6fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-\\[18px\\]{gap:18px}.gap-5{gap:1.25rem}.gap-2\\.5{gap:.625rem}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-1{gap:.25rem}.gap-1\\.5{gap:.375rem}.gap-3{gap:.75rem}.gap-3\\.5{gap:.875rem}.gap-0\\.5{gap:.125rem}.gap-0{gap:0}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-10{-moz-column-gap:2.5rem;column-gap:2.5rem}.gap-y-4{row-gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-1\\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.375rem*var(--tw-space-y-reverse));margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overscroll-none{overscroll-behavior:none}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded-2xl{border-radius:1rem}.rounded-\\[10px\\]{border-radius:10px}.rounded-xl{border-radius:.75rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-\\[8px\\]{border-radius:8px}.border{border-width:1px}.border-l-4{border-left-width:4px}.border-b{border-bottom-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-l{border-left-width:1px}.border-none{border-style:none}.border-slate-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-slate-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-sky-blue-400\\/30{border-color:rgba(59,208,242,.3)}.border-mint-400\\/30{border-color:rgba(30,226,175,.3)}.border-gold-400\\/30{border-color:rgba(255,212,77,.3)}.border-transparent{border-color:transparent}.border-l-sky-blue-400{--tw-border-opacity:1;border-left-color:rgb(59 208 242/var(--tw-border-opacity))}.border-l-mint-400{--tw-border-opacity:1;border-left-color:rgb(30 226 175/var(--tw-border-opacity))}.border-l-gold-400{--tw-border-opacity:1;border-left-color:rgb(255 212 77/var(--tw-border-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-dark-blue-400{--tw-bg-opacity:1;background-color:rgb(35 42 58/var(--tw-bg-opacity))}.bg-mint-400\\/20{background-color:rgba(30,226,175,.2)}.bg-mint-100{--tw-bg-opacity:1;background-color:rgb(208 251 240/var(--tw-bg-opacity))}.bg-sky-blue-400\\/20{background-color:rgba(59,208,242,.2)}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-white\\/90{background-color:hsla(0,0%,100%,.9)}.bg-gold-100{--tw-bg-opacity:1;background-color:rgb(255 248 214/var(--tw-bg-opacity))}.bg-gold-400\\/15{background-color:rgba(255,212,77,.15)}.bg-sky-blue-400\\/15{background-color:rgba(59,208,242,.15)}.bg-sky-blue-400\\/25{background-color:rgba(59,208,242,.25)}.bg-mint-400\\/15{background-color:rgba(30,226,175,.15)}.bg-mint-400\\/25{background-color:rgba(30,226,175,.25)}.bg-gold-400\\/25{background-color:rgba(255,212,77,.25)}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-sky-blue-400{--tw-gradient-from:#3bd0f2;--tw-gradient-to:rgba(59,208,242,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-mint-400{--tw-gradient-from:#1ee2af;--tw-gradient-to:rgba(30,226,175,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-gold-400{--tw-gradient-from:#ffd44d;--tw-gradient-to:rgba(255,212,77,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-dark-blue-600{--tw-gradient-from:#0a0f2e;--tw-gradient-to:rgba(10,15,46,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-sky-blue-400\\/15{--tw-gradient-from:rgba(59,208,242,.15);--tw-gradient-to:rgba(59,208,242,0);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-dark-blue-400{--tw-gradient-to:rgba(35,42,58,0);--tw-gradient-stops:var(--tw-gradient-from),#232a3a,var(--tw-gradient-to)}.to-dark-blue-400{--tw-gradient-to:#232a3a}.to-\\[\\#f5c300\\]{--tw-gradient-to:#f5c300}.to-sky-blue-400{--tw-gradient-to:#3bd0f2}.to-mint-400\\/15{--tw-gradient-to:rgba(30,226,175,.15)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-8{padding:2rem}.p-4{padding:1rem}.p-1{padding:.25rem}.p-5{padding:1.25rem}.p-2\\.5{padding:.625rem}.p-2{padding:.5rem}.px-\\[22px\\]{padding-left:22px;padding-right:22px}.py-\\[18px\\]{padding-bottom:18px;padding-top:18px}.px-4{padding-left:1rem;padding-right:1rem}.py-8{padding-bottom:2rem;padding-top:2rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-4{padding-bottom:1rem;padding-top:1rem}.px-3\\.5{padding-left:.875rem;padding-right:.875rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}.py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-8{padding-left:2rem;padding-right:2rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.py-0\\.5{padding-bottom:.125rem;padding-top:.125rem}.py-0{padding-bottom:0;padding-top:0}.pb-2{padding-bottom:.5rem}.pl-10{padding-left:2.5rem}.pr-4{padding-right:1rem}.pl-2\\.5{padding-left:.625rem}.pl-2{padding-left:.5rem}.text-left{text-align:left}.text-center{text-align:center}.font-proxima{font-family:ProximaNova}.text-\\[15\\.5px\\]{font-size:15.5px}.text-xs{font-size:.75rem;line-height:1rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-\\[10px\\]{font-size:10px}.text-\\[10\\.5px\\]{font-size:10.5px}.text-\\[11px\\]{font-size:11px}.text-\\[28px\\]{font-size:28px}.text-\\[12\\.5px\\]{font-size:12.5px}.text-base{font-size:1rem;line-height:1.5rem}.text-\\[11\\.5px\\]{font-size:11.5px}.text-3xl{font-size:1.875rem;line-height:2.25rem}.font-extrabold{font-weight:800}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-black{font-weight:900}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-dark-blue-400{--tw-text-opacity:1;color:rgb(35 42 58/var(--tw-text-opacity))}.text-slate-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-sky-blue-400{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-mint-400{--tw-text-opacity:1;color:rgb(30 226 175/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-white\\/70{color:hsla(0,0%,100%,.7)}.text-gold-400{--tw-text-opacity:1;color:rgb(255 212 77/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.no-underline{text-decoration-line:none}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-\\[0_3px_12px_rgba\\(255\\2c 212\\2c 77\\2c 0\\.35\\)\\],.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\\[0_3px_12px_rgba\\(255\\2c 212\\2c 77\\2c 0\\.35\\)\\]{--tw-shadow:0 3px 12px rgba(255,212,77,.35);--tw-shadow-colored:0 3px 12px var(--tw-shadow-color)}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-\\[0_2px_10px_rgba\\(30\\2c 226\\2c 175\\2c 0\\.15\\)\\]{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-\\[0_2px_10px_rgba\\(30\\2c 226\\2c 175\\2c 0\\.15\\)\\]{--tw-shadow:0 2px 10px rgba(30,226,175,.15);--tw-shadow-colored:0 2px 10px var(--tw-shadow-color)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}*,:after,:before{border-style:solid;border-width:0}button{background-color:transparent;background-image:none;color:inherit;cursor:pointer;font:inherit;margin:0;padding:0;text-transform:none}.placeholder\\:text-slate-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.placeholder\\:text-slate-400::placeholder{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.hover\\:scale-\\[1\\.02\\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\\:bg-slate-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\\:bg-red-50:hover{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.hover\\:bg-white:hover{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.hover\\:text-slate-700:hover{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.hover\\:text-red-500:hover{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity))}.hover\\:text-slate-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.hover\\:text-slate-500:hover{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\\:border-sky-blue-400:focus{--tw-border-opacity:1;border-color:rgb(59 208 242/var(--tw-border-opacity))}.focus\\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\\:opacity-50:disabled{opacity:.5}";
|
|
65
65
|
styleInject(css_248z);
|
|
66
66
|
|
|
67
67
|
function UserButton({ image, name, email }) {
|
|
@@ -145,25 +145,25 @@ function LinksGroup({ icon: Icon, href, label, accent = "cyan", initiallyOpened,
|
|
|
145
145
|
), hasLinks && opened && /* @__PURE__ */ React__namespace.createElement("div", { className: "ml-[29px] mt-0.5 flex flex-col gap-0.5 border-l border-slate-100 pl-2.5" }, items));
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
var __defProp$
|
|
149
|
-
var __defProps$
|
|
150
|
-
var __getOwnPropDescs$
|
|
151
|
-
var __getOwnPropSymbols$
|
|
152
|
-
var __hasOwnProp$
|
|
153
|
-
var __propIsEnum$
|
|
154
|
-
var __defNormalProp$
|
|
155
|
-
var __spreadValues$
|
|
148
|
+
var __defProp$f = Object.defineProperty;
|
|
149
|
+
var __defProps$b = Object.defineProperties;
|
|
150
|
+
var __getOwnPropDescs$b = Object.getOwnPropertyDescriptors;
|
|
151
|
+
var __getOwnPropSymbols$f = Object.getOwnPropertySymbols;
|
|
152
|
+
var __hasOwnProp$f = Object.prototype.hasOwnProperty;
|
|
153
|
+
var __propIsEnum$f = Object.prototype.propertyIsEnumerable;
|
|
154
|
+
var __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
155
|
+
var __spreadValues$f = (a, b) => {
|
|
156
156
|
for (var prop in b || (b = {}))
|
|
157
|
-
if (__hasOwnProp$
|
|
158
|
-
__defNormalProp$
|
|
159
|
-
if (__getOwnPropSymbols$
|
|
160
|
-
for (var prop of __getOwnPropSymbols$
|
|
161
|
-
if (__propIsEnum$
|
|
162
|
-
__defNormalProp$
|
|
157
|
+
if (__hasOwnProp$f.call(b, prop))
|
|
158
|
+
__defNormalProp$f(a, prop, b[prop]);
|
|
159
|
+
if (__getOwnPropSymbols$f)
|
|
160
|
+
for (var prop of __getOwnPropSymbols$f(b)) {
|
|
161
|
+
if (__propIsEnum$f.call(b, prop))
|
|
162
|
+
__defNormalProp$f(a, prop, b[prop]);
|
|
163
163
|
}
|
|
164
164
|
return a;
|
|
165
165
|
};
|
|
166
|
-
var __spreadProps$
|
|
166
|
+
var __spreadProps$b = (a, b) => __defProps$b(a, __getOwnPropDescs$b(b));
|
|
167
167
|
const data = [
|
|
168
168
|
{ label: "Home", icon: icons.IconHome2, accent: "cyan" },
|
|
169
169
|
{ label: "Dashboard", icon: icons.IconGauge, accent: "mint" },
|
|
@@ -190,12 +190,12 @@ function Navbar(props) {
|
|
|
190
190
|
}
|
|
191
191
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
192
192
|
LinksGroup,
|
|
193
|
-
__spreadProps$
|
|
193
|
+
__spreadProps$b(__spreadValues$f(__spreadValues$f({
|
|
194
194
|
key: item.label,
|
|
195
195
|
active: props.active
|
|
196
196
|
}, item), context), {
|
|
197
197
|
links: (item.links || []).map((link) => {
|
|
198
|
-
return __spreadValues$
|
|
198
|
+
return __spreadValues$f(__spreadValues$f({}, link), props.links[`${item.label}/${link.label}`] || { notifications: 0, href: "" });
|
|
199
199
|
})
|
|
200
200
|
})
|
|
201
201
|
);
|
|
@@ -215,7 +215,7 @@ const UtilLink = (props) => {
|
|
|
215
215
|
);
|
|
216
216
|
};
|
|
217
217
|
|
|
218
|
-
const useStyles$
|
|
218
|
+
const useStyles$k = core.createStyles((theme) => ({
|
|
219
219
|
inner: {
|
|
220
220
|
paddingTop: theme.spacing.xl,
|
|
221
221
|
paddingBottom: theme.spacing.xl * 4
|
|
@@ -251,7 +251,7 @@ const useStyles$o = core.createStyles((theme) => ({
|
|
|
251
251
|
}
|
|
252
252
|
}));
|
|
253
253
|
const GettingStarted = (props) => {
|
|
254
|
-
const { classes } = useStyles$
|
|
254
|
+
const { classes } = useStyles$k();
|
|
255
255
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
256
256
|
core.Modal,
|
|
257
257
|
{
|
|
@@ -265,7 +265,7 @@ const GettingStarted = (props) => {
|
|
|
265
265
|
);
|
|
266
266
|
};
|
|
267
267
|
|
|
268
|
-
const useStyles$
|
|
268
|
+
const useStyles$j = core.createStyles((theme) => ({
|
|
269
269
|
title: {
|
|
270
270
|
fontSize: 34,
|
|
271
271
|
fontWeight: 900,
|
|
@@ -306,7 +306,7 @@ const useStyles$n = core.createStyles((theme) => ({
|
|
|
306
306
|
}
|
|
307
307
|
}));
|
|
308
308
|
const SwitchAccount = (props) => {
|
|
309
|
-
const { classes, theme } = useStyles$
|
|
309
|
+
const { classes, theme } = useStyles$j();
|
|
310
310
|
const options = props.accounts.map((a) => {
|
|
311
311
|
return /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: () => props.onClick && props.onClick(a.accountId), key: a.accountId, p: theme.spacing.md }, /* @__PURE__ */ React__namespace.createElement(core.Card, { withBorder: true, shadow: "md", radius: "md", className: classes.card, p: "xl" }, a.isAdmin && /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(icons.IconBatteryEco, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), a.isGroupAdmin && !a.isAdmin && /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(icons.IconBooks, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), !a.isAdmin && !a.isGroupAdmin && /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(icons.IconBackpack, { size: 50, stroke: 2, color: theme.fn.primaryColor() })), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "lg", weight: 500, className: classes.cardTitle, mt: "md" }, a.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", color: "dimmed", mt: "sm" }, a.isAdmin ? "Admin" : a.isGroupAdmin ? "Educator" : "Student")));
|
|
312
312
|
});
|
|
@@ -343,7 +343,7 @@ const Tabs = (props) => {
|
|
|
343
343
|
return /* @__PURE__ */ React__namespace.createElement(core.Tabs, { value: props.value, onTabChange: props.onChange }, /* @__PURE__ */ React__namespace.createElement(core.Tabs.List, null, tabs));
|
|
344
344
|
};
|
|
345
345
|
|
|
346
|
-
const useStyles$
|
|
346
|
+
const useStyles$i = core.createStyles((theme) => ({
|
|
347
347
|
button: {
|
|
348
348
|
borderTopRightRadius: 0,
|
|
349
349
|
borderBottomRightRadius: 0,
|
|
@@ -358,7 +358,7 @@ const useStyles$m = core.createStyles((theme) => ({
|
|
|
358
358
|
}
|
|
359
359
|
}));
|
|
360
360
|
const SplitButton$4 = (props) => {
|
|
361
|
-
const { classes, theme } = useStyles$
|
|
361
|
+
const { classes, theme } = useStyles$i();
|
|
362
362
|
theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
|
|
363
363
|
return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
364
364
|
core.Button,
|
|
@@ -386,7 +386,7 @@ const SplitButton$4 = (props) => {
|
|
|
386
386
|
));
|
|
387
387
|
};
|
|
388
388
|
|
|
389
|
-
const useStyles$
|
|
389
|
+
const useStyles$h = core.createStyles((theme) => ({
|
|
390
390
|
wrapper: {
|
|
391
391
|
display: "flex",
|
|
392
392
|
alignItems: "center",
|
|
@@ -437,7 +437,7 @@ const useStyles$l = core.createStyles((theme) => ({
|
|
|
437
437
|
}
|
|
438
438
|
}));
|
|
439
439
|
const PlaceholderBanner = (props) => {
|
|
440
|
-
const { classes } = useStyles$
|
|
440
|
+
const { classes } = useStyles$h();
|
|
441
441
|
const title = props.title || "Nothing to display";
|
|
442
442
|
const description = props.description || "We don't have anything to show you here just yet. Add data, check back later, or adjust your search.";
|
|
443
443
|
return /* @__PURE__ */ React__namespace.createElement("div", { className: classes.wrapper }, /* @__PURE__ */ React__namespace.createElement("div", { className: classes.body }, /* @__PURE__ */ React__namespace.createElement(core.Title, { className: classes.title }, props.loading ? "Loading..." : title), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", color: "dimmed" }, props.loading ? "Hold on, we're loading your data." : description)), /* @__PURE__ */ React__namespace.createElement(core.Image, { src: `https://cdn.localcivics.io/illustrations/${props.icon}.svg`, className: classes.image }));
|
|
@@ -489,28 +489,28 @@ function useSortableData(items, config = { key: "", direction: null }) {
|
|
|
489
489
|
return { items: sortedItems, requestSort, sortConfig };
|
|
490
490
|
}
|
|
491
491
|
|
|
492
|
-
var __defProp$
|
|
493
|
-
var __defProps$
|
|
494
|
-
var __getOwnPropDescs$
|
|
495
|
-
var __getOwnPropSymbols$
|
|
496
|
-
var __hasOwnProp$
|
|
497
|
-
var __propIsEnum$
|
|
498
|
-
var __defNormalProp$
|
|
499
|
-
var __spreadValues$
|
|
492
|
+
var __defProp$e = Object.defineProperty;
|
|
493
|
+
var __defProps$a = Object.defineProperties;
|
|
494
|
+
var __getOwnPropDescs$a = Object.getOwnPropertyDescriptors;
|
|
495
|
+
var __getOwnPropSymbols$e = Object.getOwnPropertySymbols;
|
|
496
|
+
var __hasOwnProp$e = Object.prototype.hasOwnProperty;
|
|
497
|
+
var __propIsEnum$e = Object.prototype.propertyIsEnumerable;
|
|
498
|
+
var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
499
|
+
var __spreadValues$e = (a, b) => {
|
|
500
500
|
for (var prop in b || (b = {}))
|
|
501
|
-
if (__hasOwnProp$
|
|
502
|
-
__defNormalProp$
|
|
503
|
-
if (__getOwnPropSymbols$
|
|
504
|
-
for (var prop of __getOwnPropSymbols$
|
|
505
|
-
if (__propIsEnum$
|
|
506
|
-
__defNormalProp$
|
|
501
|
+
if (__hasOwnProp$e.call(b, prop))
|
|
502
|
+
__defNormalProp$e(a, prop, b[prop]);
|
|
503
|
+
if (__getOwnPropSymbols$e)
|
|
504
|
+
for (var prop of __getOwnPropSymbols$e(b)) {
|
|
505
|
+
if (__propIsEnum$e.call(b, prop))
|
|
506
|
+
__defNormalProp$e(a, prop, b[prop]);
|
|
507
507
|
}
|
|
508
508
|
return a;
|
|
509
509
|
};
|
|
510
|
-
var __spreadProps$
|
|
510
|
+
var __spreadProps$a = (a, b) => __defProps$a(a, __getOwnPropDescs$a(b));
|
|
511
511
|
function Table$k(props) {
|
|
512
512
|
const preparedItems = React__namespace.useMemo(() => {
|
|
513
|
-
return props.items.map((item) => __spreadProps$
|
|
513
|
+
return props.items.map((item) => __spreadProps$a(__spreadValues$e({}, item), {
|
|
514
514
|
status: item.isComplete ? 1 : 0
|
|
515
515
|
}));
|
|
516
516
|
}, [props.items]);
|
|
@@ -607,7 +607,7 @@ function Table$j(props) {
|
|
|
607
607
|
));
|
|
608
608
|
}
|
|
609
609
|
|
|
610
|
-
const useStyles$
|
|
610
|
+
const useStyles$g = core.createStyles((theme) => ({
|
|
611
611
|
title: {
|
|
612
612
|
fontSize: 34,
|
|
613
613
|
fontWeight: 900,
|
|
@@ -620,12 +620,12 @@ const useStyles$k = core.createStyles((theme) => ({
|
|
|
620
620
|
}
|
|
621
621
|
}));
|
|
622
622
|
const Badge = (props) => {
|
|
623
|
-
const { classes } = useStyles$
|
|
623
|
+
const { classes } = useStyles$g();
|
|
624
624
|
const [tab, setTab] = React.useState("lessons");
|
|
625
625
|
const numberOfStudents = props.students.length;
|
|
626
626
|
const numberOfBadges = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
|
|
627
627
|
numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length / numberOfStudents : 0;
|
|
628
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Container, {
|
|
628
|
+
return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
|
|
629
629
|
core.Badge,
|
|
630
630
|
{
|
|
631
631
|
variant: "filled",
|
|
@@ -706,7 +706,7 @@ function Table$i(props) {
|
|
|
706
706
|
}
|
|
707
707
|
|
|
708
708
|
const Badges = (props) => {
|
|
709
|
-
return /* @__PURE__ */ React__namespace.createElement("div", { className: "
|
|
709
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Badges and micro-credentials"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Project-sized skills acquisition and standards alignment.")), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-2.5 rounded-xl border border-slate-200 bg-white px-4 py-3 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(icons.IconSearch, { size: 15, stroke: 1.75, className: "text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
|
|
710
710
|
"input",
|
|
711
711
|
{
|
|
712
712
|
type: "text",
|
|
@@ -823,7 +823,7 @@ function Table$d(props) {
|
|
|
823
823
|
|
|
824
824
|
const Dashboard = (props) => {
|
|
825
825
|
const [tab, setTab] = React.useState("students");
|
|
826
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Container, {
|
|
826
|
+
return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(core.Title, { size: "h3" }, "Dashboard"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", size: "sm", mt: "md" }, "Track your students\u2019 pathway progress")), /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React__namespace.createElement(core.LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
827
827
|
{
|
|
828
828
|
title: "# OF STUDENTS",
|
|
829
829
|
value: props.students.length
|
|
@@ -905,6 +905,25 @@ const Dashboard = (props) => {
|
|
|
905
905
|
)))))));
|
|
906
906
|
};
|
|
907
907
|
|
|
908
|
+
var __defProp$d = Object.defineProperty;
|
|
909
|
+
var __defProps$9 = Object.defineProperties;
|
|
910
|
+
var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
|
|
911
|
+
var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
|
|
912
|
+
var __hasOwnProp$d = Object.prototype.hasOwnProperty;
|
|
913
|
+
var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
|
|
914
|
+
var __defNormalProp$d = (obj, key, value) => key in obj ? __defProp$d(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
915
|
+
var __spreadValues$d = (a, b) => {
|
|
916
|
+
for (var prop in b || (b = {}))
|
|
917
|
+
if (__hasOwnProp$d.call(b, prop))
|
|
918
|
+
__defNormalProp$d(a, prop, b[prop]);
|
|
919
|
+
if (__getOwnPropSymbols$d)
|
|
920
|
+
for (var prop of __getOwnPropSymbols$d(b)) {
|
|
921
|
+
if (__propIsEnum$d.call(b, prop))
|
|
922
|
+
__defNormalProp$d(a, prop, b[prop]);
|
|
923
|
+
}
|
|
924
|
+
return a;
|
|
925
|
+
};
|
|
926
|
+
var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
|
|
908
927
|
const openDeleteModal = (student, onDelete) => modals.openConfirmModal({
|
|
909
928
|
title: `Remove "${student.givenName && student.familyName ? `${student.givenName} ${student.familyName}` : student.email}" from this class?`,
|
|
910
929
|
centered: true,
|
|
@@ -914,24 +933,32 @@ const openDeleteModal = (student, onDelete) => modals.openConfirmModal({
|
|
|
914
933
|
onConfirm: () => onDelete(student)
|
|
915
934
|
});
|
|
916
935
|
function Table$c(props) {
|
|
936
|
+
const preparedItems = React__namespace.useMemo(() => {
|
|
937
|
+
return props.items.map((item) => __spreadProps$9(__spreadValues$d({}, item), {
|
|
938
|
+
fullName: item.givenName && item.familyName ? `${item.givenName} ${item.familyName}`.toLowerCase() : item.email.toLowerCase()
|
|
939
|
+
}));
|
|
940
|
+
}, [props.items]);
|
|
941
|
+
const { items: sortedItems, requestSort, sortConfig } = useSortableData(preparedItems);
|
|
917
942
|
if (props.loading) {
|
|
918
943
|
return /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm text-slate-400" }, "Loading\u2026");
|
|
919
944
|
}
|
|
920
945
|
if (props.items.length === 0) {
|
|
921
946
|
return /* @__PURE__ */ React__namespace.createElement("div", { className: "rounded-xl border border-slate-200 bg-white p-8 text-center text-sm text-slate-400 shadow-sm" }, "You have not rostered any students yet.");
|
|
922
947
|
}
|
|
923
|
-
|
|
948
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
949
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "grid grid-cols-[2.2fr_1.2fr_1fr_1.2fr_1fr_0.6fr] gap-3 border-b border-slate-100 px-5 py-3 text-[10px] font-bold uppercase tracking-wide text-slate-500" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("fullName"), className: "flex items-center text-left hover:text-slate-700" }, "Name", indicator("fullName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("isAdmin"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Role", indicator("isAdmin")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("badgesEarned"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Badges Earned", indicator("badgesEarned")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("lessonsCompleted"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Lessons Completed", indicator("lessonsCompleted")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("hasAccount"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Account Created?", indicator("hasAccount")), /* @__PURE__ */ React__namespace.createElement("div", null)), sortedItems.map((row, i) => {
|
|
924
950
|
var _a, _b;
|
|
925
951
|
const name = row.givenName && row.familyName ? `${row.givenName} ${row.familyName}` : row.email;
|
|
926
952
|
const initials = (((_a = row.givenName) == null ? void 0 : _a[0]) || row.email[0] || "?") + (((_b = row.familyName) == null ? void 0 : _b[0]) || "");
|
|
953
|
+
const identity = /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, row.avatar ? /* @__PURE__ */ React__namespace.createElement("img", { className: "h-8 w-8 shrink-0 rounded-full object-cover", src: row.avatar, alt: name }) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-mint-400/20 text-[10px] font-bold text-dark-blue-400" }, initials.toUpperCase()), /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs font-bold text-dark-blue-400" }, name), /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-[10.5px] text-slate-500" }, row.email)));
|
|
927
954
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
928
955
|
"div",
|
|
929
956
|
{
|
|
930
957
|
key: row.email,
|
|
931
|
-
className: `grid grid-cols-[2.2fr_1.2fr_1fr_1.2fr_1fr_0.6fr] items-center gap-3 px-5 py-3.5 ${i <
|
|
958
|
+
className: `grid grid-cols-[2.2fr_1.2fr_1fr_1.2fr_1fr_0.6fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
|
|
932
959
|
},
|
|
933
|
-
/* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: row.href, className: "flex min-w-0 items-center gap-2.5 no-underline" },
|
|
934
|
-
/* @__PURE__ */ React__namespace.createElement(
|
|
960
|
+
row.href ? /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: row.href, className: "flex min-w-0 items-center gap-2.5 no-underline" }, identity) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex min-w-0 items-center gap-2.5" }, identity),
|
|
961
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React__namespace.createElement(
|
|
935
962
|
"select",
|
|
936
963
|
{
|
|
937
964
|
disabled: row.readonly,
|
|
@@ -941,16 +968,16 @@ function Table$c(props) {
|
|
|
941
968
|
},
|
|
942
969
|
/* @__PURE__ */ React__namespace.createElement("option", { value: "student" }, "Student"),
|
|
943
970
|
/* @__PURE__ */ React__namespace.createElement("option", { value: "educator" }, "Educator")
|
|
944
|
-
),
|
|
945
|
-
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs font-bold text-dark-blue-400" }, row.badgesEarned),
|
|
946
|
-
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs font-bold text-dark-blue-400" }, row.lessonsCompleted),
|
|
947
|
-
/* @__PURE__ */ React__namespace.createElement("div",
|
|
971
|
+
)),
|
|
972
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-center text-xs font-bold text-dark-blue-400" }, row.badgesEarned),
|
|
973
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-center text-xs font-bold text-dark-blue-400" }, row.lessonsCompleted),
|
|
974
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "flex justify-center" }, row.hasAccount && /* @__PURE__ */ React__namespace.createElement(icons.IconCheck, { size: 16, stroke: 3, className: "text-mint-400" })),
|
|
948
975
|
/* @__PURE__ */ React__namespace.createElement("div", null, !row.readonly && !!props.onDelete && /* @__PURE__ */ React__namespace.createElement(
|
|
949
976
|
"button",
|
|
950
977
|
{
|
|
951
978
|
type: "button",
|
|
952
979
|
onClick: () => openDeleteModal(row, props.onDelete),
|
|
953
|
-
className: "flex h-7 w-7 items-center justify-center rounded-md text-slate-
|
|
980
|
+
className: "flex h-7 w-7 items-center justify-center rounded-md text-slate-400 hover:bg-red-50 hover:text-red-500"
|
|
954
981
|
},
|
|
955
982
|
/* @__PURE__ */ React__namespace.createElement(icons.IconTrash, { size: 14, stroke: 1.75 })
|
|
956
983
|
))
|
|
@@ -958,25 +985,25 @@ function Table$c(props) {
|
|
|
958
985
|
}));
|
|
959
986
|
}
|
|
960
987
|
|
|
961
|
-
var __defProp$
|
|
962
|
-
var __defProps$
|
|
963
|
-
var __getOwnPropDescs$
|
|
964
|
-
var __getOwnPropSymbols$
|
|
965
|
-
var __hasOwnProp$
|
|
966
|
-
var __propIsEnum$
|
|
967
|
-
var __defNormalProp$
|
|
968
|
-
var __spreadValues$
|
|
988
|
+
var __defProp$c = Object.defineProperty;
|
|
989
|
+
var __defProps$8 = Object.defineProperties;
|
|
990
|
+
var __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;
|
|
991
|
+
var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
|
|
992
|
+
var __hasOwnProp$c = Object.prototype.hasOwnProperty;
|
|
993
|
+
var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
|
|
994
|
+
var __defNormalProp$c = (obj, key, value) => key in obj ? __defProp$c(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
995
|
+
var __spreadValues$c = (a, b) => {
|
|
969
996
|
for (var prop in b || (b = {}))
|
|
970
|
-
if (__hasOwnProp$
|
|
971
|
-
__defNormalProp$
|
|
972
|
-
if (__getOwnPropSymbols$
|
|
973
|
-
for (var prop of __getOwnPropSymbols$
|
|
974
|
-
if (__propIsEnum$
|
|
975
|
-
__defNormalProp$
|
|
997
|
+
if (__hasOwnProp$c.call(b, prop))
|
|
998
|
+
__defNormalProp$c(a, prop, b[prop]);
|
|
999
|
+
if (__getOwnPropSymbols$c)
|
|
1000
|
+
for (var prop of __getOwnPropSymbols$c(b)) {
|
|
1001
|
+
if (__propIsEnum$c.call(b, prop))
|
|
1002
|
+
__defNormalProp$c(a, prop, b[prop]);
|
|
976
1003
|
}
|
|
977
1004
|
return a;
|
|
978
1005
|
};
|
|
979
|
-
var __spreadProps$
|
|
1006
|
+
var __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));
|
|
980
1007
|
const Class = (props) => {
|
|
981
1008
|
const [opened, setOpened] = React.useState(false);
|
|
982
1009
|
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(
|
|
@@ -988,8 +1015,8 @@ const Class = (props) => {
|
|
|
988
1015
|
padding: "xl",
|
|
989
1016
|
size: "xl"
|
|
990
1017
|
},
|
|
991
|
-
/* @__PURE__ */ React__namespace.createElement(DropzoneButton$1, __spreadProps$
|
|
992
|
-
), /* @__PURE__ */ React__namespace.createElement("div", { className: "
|
|
1018
|
+
/* @__PURE__ */ React__namespace.createElement(DropzoneButton$1, __spreadProps$8(__spreadValues$c({}, props), { close: () => setOpened(false) }))
|
|
1019
|
+
), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-start justify-between gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: props.onBackClick, className: "flex w-max cursor-pointer items-center gap-1 text-xs font-bold text-sky-blue-400" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.displayName || "Class"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, props.description || "No description")), !props.loading && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React__namespace.createElement(
|
|
993
1020
|
"button",
|
|
994
1021
|
{
|
|
995
1022
|
type: "button",
|
|
@@ -1114,20 +1141,20 @@ const DropzoneButton$1 = (props) => {
|
|
|
1114
1141
|
props.onCreateMembers && props.onCreateMembers([values]);
|
|
1115
1142
|
}) }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1116
1143
|
core.TextInput,
|
|
1117
|
-
__spreadValues$
|
|
1144
|
+
__spreadValues$c({
|
|
1118
1145
|
withAsterisk: true,
|
|
1119
1146
|
label: "Email",
|
|
1120
1147
|
placeholder: "Email"
|
|
1121
1148
|
}, form$1.getInputProps("email"))
|
|
1122
1149
|
), /* @__PURE__ */ React__namespace.createElement(core.Group, { grow: true }, /* @__PURE__ */ React__namespace.createElement(
|
|
1123
1150
|
core.TextInput,
|
|
1124
|
-
__spreadValues$
|
|
1151
|
+
__spreadValues$c({
|
|
1125
1152
|
label: "Given name",
|
|
1126
1153
|
placeholder: "Given name"
|
|
1127
1154
|
}, form$1.getInputProps("givenName"))
|
|
1128
1155
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
1129
1156
|
core.TextInput,
|
|
1130
|
-
__spreadValues$
|
|
1157
|
+
__spreadValues$c({
|
|
1131
1158
|
label: "Family name",
|
|
1132
1159
|
placeholder: "Family name"
|
|
1133
1160
|
}, form$1.getInputProps("familyName"))
|
|
@@ -1207,23 +1234,23 @@ function Table$b(props) {
|
|
|
1207
1234
|
));
|
|
1208
1235
|
}
|
|
1209
1236
|
|
|
1210
|
-
var __defProp$
|
|
1211
|
-
var __getOwnPropSymbols$
|
|
1212
|
-
var __hasOwnProp$
|
|
1213
|
-
var __propIsEnum$
|
|
1214
|
-
var __defNormalProp$
|
|
1215
|
-
var __spreadValues$
|
|
1237
|
+
var __defProp$b = Object.defineProperty;
|
|
1238
|
+
var __getOwnPropSymbols$b = Object.getOwnPropertySymbols;
|
|
1239
|
+
var __hasOwnProp$b = Object.prototype.hasOwnProperty;
|
|
1240
|
+
var __propIsEnum$b = Object.prototype.propertyIsEnumerable;
|
|
1241
|
+
var __defNormalProp$b = (obj, key, value) => key in obj ? __defProp$b(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1242
|
+
var __spreadValues$b = (a, b) => {
|
|
1216
1243
|
for (var prop in b || (b = {}))
|
|
1217
|
-
if (__hasOwnProp$
|
|
1218
|
-
__defNormalProp$
|
|
1219
|
-
if (__getOwnPropSymbols$
|
|
1220
|
-
for (var prop of __getOwnPropSymbols$
|
|
1221
|
-
if (__propIsEnum$
|
|
1222
|
-
__defNormalProp$
|
|
1244
|
+
if (__hasOwnProp$b.call(b, prop))
|
|
1245
|
+
__defNormalProp$b(a, prop, b[prop]);
|
|
1246
|
+
if (__getOwnPropSymbols$b)
|
|
1247
|
+
for (var prop of __getOwnPropSymbols$b(b)) {
|
|
1248
|
+
if (__propIsEnum$b.call(b, prop))
|
|
1249
|
+
__defNormalProp$b(a, prop, b[prop]);
|
|
1223
1250
|
}
|
|
1224
1251
|
return a;
|
|
1225
1252
|
};
|
|
1226
|
-
const useStyles$
|
|
1253
|
+
const useStyles$f = core.createStyles((theme) => ({
|
|
1227
1254
|
title: {
|
|
1228
1255
|
fontSize: 34,
|
|
1229
1256
|
fontWeight: 900,
|
|
@@ -1236,7 +1263,7 @@ const useStyles$j = core.createStyles((theme) => ({
|
|
|
1236
1263
|
}
|
|
1237
1264
|
}));
|
|
1238
1265
|
const Classes = (props) => {
|
|
1239
|
-
const { classes } = useStyles$
|
|
1266
|
+
const { classes } = useStyles$f();
|
|
1240
1267
|
const form$1 = form.useForm({
|
|
1241
1268
|
initialValues: {
|
|
1242
1269
|
classId: "",
|
|
@@ -1266,19 +1293,19 @@ const Classes = (props) => {
|
|
|
1266
1293
|
props.onCreateClass && props.onCreateClass(values);
|
|
1267
1294
|
}) }, /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement(
|
|
1268
1295
|
core.TextInput,
|
|
1269
|
-
__spreadValues$
|
|
1296
|
+
__spreadValues$b({
|
|
1270
1297
|
withAsterisk: true,
|
|
1271
1298
|
label: "Name",
|
|
1272
1299
|
placeholder: "Class name"
|
|
1273
1300
|
}, form$1.getInputProps("name"))
|
|
1274
1301
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
1275
1302
|
core.TextInput,
|
|
1276
|
-
__spreadValues$
|
|
1303
|
+
__spreadValues$b({
|
|
1277
1304
|
label: "Description",
|
|
1278
1305
|
placeholder: "A class for my first period English students"
|
|
1279
1306
|
}, form$1.getInputProps("description"))
|
|
1280
1307
|
)), /* @__PURE__ */ React__namespace.createElement(core.Button, { type: "submit", fullWidth: true, mt: "md" }, "Submit"))
|
|
1281
|
-
), /* @__PURE__ */ React__namespace.createElement(core.Container, {
|
|
1308
|
+
), /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.Badge, { variant: "filled", size: "lg" }, "Classes"), /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, "Organize people into classes"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, "Create classes, cohorts, or custom subgroups")), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "content" }, !props.loading && /* @__PURE__ */ React__namespace.createElement(
|
|
1282
1309
|
core.Button,
|
|
1283
1310
|
{
|
|
1284
1311
|
onClick: () => setOpened(true),
|
|
@@ -1307,24 +1334,6 @@ const Classes = (props) => {
|
|
|
1307
1334
|
))))));
|
|
1308
1335
|
};
|
|
1309
1336
|
|
|
1310
|
-
const useStyles$i = core.createStyles((theme) => ({
|
|
1311
|
-
title: {
|
|
1312
|
-
fontSize: 34,
|
|
1313
|
-
fontWeight: 900,
|
|
1314
|
-
marginTop: 16,
|
|
1315
|
-
[theme.fn.smallerThan("sm")]: {
|
|
1316
|
-
fontSize: 24
|
|
1317
|
-
}
|
|
1318
|
-
},
|
|
1319
|
-
description: {
|
|
1320
|
-
maxWidth: 600
|
|
1321
|
-
}
|
|
1322
|
-
}));
|
|
1323
|
-
const UserInfo = (props) => {
|
|
1324
|
-
const { classes } = useStyles$i();
|
|
1325
|
-
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Title, { className: classes.title }, props.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "xs" }, props.impactStatement));
|
|
1326
|
-
};
|
|
1327
|
-
|
|
1328
1337
|
function Table$a(props) {
|
|
1329
1338
|
if (props.items.length === 0) {
|
|
1330
1339
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
@@ -1337,28 +1346,15 @@ function Table$a(props) {
|
|
|
1337
1346
|
}
|
|
1338
1347
|
);
|
|
1339
1348
|
}
|
|
1340
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
1341
|
-
|
|
1349
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, props.items.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
1350
|
+
"div",
|
|
1342
1351
|
{
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
highlightOnHover: true,
|
|
1350
|
-
records: props.items,
|
|
1351
|
-
idAccessor: "badgeId",
|
|
1352
|
-
columns: [{
|
|
1353
|
-
accessor: "name",
|
|
1354
|
-
title: "Badge Name",
|
|
1355
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Text, null, row.badgeName))
|
|
1356
|
-
}, {
|
|
1357
|
-
accessor: "status",
|
|
1358
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, !!row.isComplete && /* @__PURE__ */ React__namespace.createElement(core.Badge, { variant: "filled" }, "Complete"), !row.isComplete && /* @__PURE__ */ React__namespace.createElement(core.Badge, { color: "red", variant: "filled" }, "Incomplete"))
|
|
1359
|
-
}]
|
|
1360
|
-
}
|
|
1361
|
-
));
|
|
1352
|
+
key: row.badgeId || row.badgeName,
|
|
1353
|
+
className: `flex items-center justify-between gap-4 px-5 py-4 ${i < props.items.length - 1 ? "border-b border-slate-100" : ""}`
|
|
1354
|
+
},
|
|
1355
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-bold text-dark-blue-400" }, row.badgeName),
|
|
1356
|
+
/* @__PURE__ */ React__namespace.createElement("span", { className: `shrink-0 rounded-full px-2.5 py-1 text-[10px] font-bold uppercase tracking-wide ${row.isComplete ? "bg-mint-100 text-dark-blue-400" : "bg-slate-100 text-slate-500"}` }, row.isComplete ? "Complete" : "Incomplete")
|
|
1357
|
+
)));
|
|
1362
1358
|
}
|
|
1363
1359
|
|
|
1364
1360
|
function Table$9(props) {
|
|
@@ -1373,8 +1369,26 @@ function Table$9(props) {
|
|
|
1373
1369
|
}
|
|
1374
1370
|
);
|
|
1375
1371
|
}
|
|
1376
|
-
const
|
|
1377
|
-
|
|
1372
|
+
const groups = [];
|
|
1373
|
+
const groupByLessonId = {};
|
|
1374
|
+
props.items.forEach((row) => {
|
|
1375
|
+
let group = groupByLessonId[row.lessonId];
|
|
1376
|
+
if (!group) {
|
|
1377
|
+
group = { lessonId: row.lessonId, lessonName: row.lessonName, badgeName: row.badgeName, href: row.href, items: [] };
|
|
1378
|
+
groupByLessonId[row.lessonId] = group;
|
|
1379
|
+
groups.push(group);
|
|
1380
|
+
}
|
|
1381
|
+
group.items.push(row);
|
|
1382
|
+
});
|
|
1383
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, groups.map((group) => /* @__PURE__ */ React__namespace.createElement("div", { key: group.lessonId, className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "border-b border-slate-100 px-5 py-4" }, /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: group.href, className: "text-sm font-bold text-dark-blue-400 no-underline hover:underline" }, group.lessonName), group.badgeName && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs text-slate-500" }, group.badgeName)), group.items.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
1384
|
+
"div",
|
|
1385
|
+
{
|
|
1386
|
+
key: row.questionName,
|
|
1387
|
+
className: `px-5 py-4 ${i < group.items.length - 1 ? "border-b border-slate-100" : ""}`
|
|
1388
|
+
},
|
|
1389
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs font-semibold text-slate-500" }, row.questionName),
|
|
1390
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs text-slate-600" }, row.answer.join(", "))
|
|
1391
|
+
)))));
|
|
1378
1392
|
}
|
|
1379
1393
|
|
|
1380
1394
|
function Table$8(props) {
|
|
@@ -1389,299 +1403,142 @@ function Table$8(props) {
|
|
|
1389
1403
|
}
|
|
1390
1404
|
);
|
|
1391
1405
|
}
|
|
1392
|
-
|
|
1393
|
-
|
|
1406
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-xl border border-slate-200 bg-white shadow-sm" }, props.items.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
1407
|
+
"div",
|
|
1408
|
+
{
|
|
1409
|
+
key: row.lessonId || row.lessonName,
|
|
1410
|
+
className: `flex items-start justify-between gap-4 px-5 py-4 ${i < props.items.length - 1 ? "border-b border-slate-100" : ""}`
|
|
1411
|
+
},
|
|
1412
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: row.href, className: "text-sm font-bold text-dark-blue-400 no-underline hover:underline" }, row.lessonName), row.badgeName && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs text-slate-500" }, row.badgeName), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 text-xs text-slate-600" }, row.reflection)),
|
|
1413
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "shrink-0 rounded-full bg-gold-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, row.rating.toLocaleString())
|
|
1414
|
+
)));
|
|
1394
1415
|
}
|
|
1395
1416
|
|
|
1417
|
+
const TABS$1 = [
|
|
1418
|
+
{ label: "My badges", value: "badges" },
|
|
1419
|
+
{ label: "My answers", value: "answers" },
|
|
1420
|
+
{ label: "My reflections", value: "reflections" }
|
|
1421
|
+
];
|
|
1396
1422
|
const Student = (props) => {
|
|
1397
1423
|
const [tab, setTab] = React.useState("badges");
|
|
1398
1424
|
const numberOfBadgesCompleted = props.badges.length > 0 ? props.badges.filter((b) => b.isComplete).length : 0;
|
|
1399
|
-
const
|
|
1400
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
1401
|
-
core.Badge,
|
|
1402
|
-
{
|
|
1403
|
-
variant: "filled",
|
|
1404
|
-
leftSection: /* @__PURE__ */ React__namespace.createElement(core.ActionIcon, { color: "blue", size: "xs", radius: "xl", variant: "filled" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 14 })),
|
|
1405
|
-
size: "lg"
|
|
1406
|
-
},
|
|
1407
|
-
"Back"
|
|
1408
|
-
)), /* @__PURE__ */ React__namespace.createElement(
|
|
1409
|
-
UserInfo,
|
|
1410
|
-
{
|
|
1411
|
-
variant: "compact",
|
|
1412
|
-
name: props.name,
|
|
1413
|
-
impactStatement: props.impactStatement
|
|
1414
|
-
}
|
|
1415
|
-
))), /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React__namespace.createElement(core.LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "lg" }, /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
1425
|
+
const numberOfLessonsCompleted = props.lessons.filter((l) => l.isComplete).length;
|
|
1426
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1.5" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: props.onBackClick, className: "flex w-max cursor-pointer items-center gap-1 text-xs font-bold text-sky-blue-400" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.name || "Student"), props.impactStatement && /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.impactStatement)), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
1416
1427
|
{
|
|
1417
1428
|
title: "PROBLEMS SOLVED",
|
|
1418
1429
|
value: props.numberOfProblemsSolved
|
|
1419
1430
|
},
|
|
1420
1431
|
{
|
|
1421
1432
|
title: "LESSON COMPLETION",
|
|
1422
|
-
value:
|
|
1423
|
-
unit: ""
|
|
1433
|
+
value: numberOfLessonsCompleted
|
|
1424
1434
|
},
|
|
1425
1435
|
{
|
|
1426
1436
|
title: "BADGE COMPLETION",
|
|
1427
|
-
value: numberOfBadgesCompleted
|
|
1428
|
-
unit: ""
|
|
1437
|
+
value: numberOfBadgesCompleted
|
|
1429
1438
|
}
|
|
1430
|
-
] }), /* @__PURE__ */ React__namespace.createElement(
|
|
1431
|
-
|
|
1439
|
+
] }), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-fit gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS$1.map((t) => /* @__PURE__ */ React__namespace.createElement(
|
|
1440
|
+
"button",
|
|
1432
1441
|
{
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1442
|
+
key: t.value,
|
|
1443
|
+
onClick: () => setTab(t.value),
|
|
1444
|
+
className: `rounded-lg px-4 py-2 text-xs font-bold ${tab === t.value ? "bg-sky-blue-400/20 text-dark-blue-400" : "text-slate-400 hover:text-slate-600"}`
|
|
1445
|
+
},
|
|
1446
|
+
t.label
|
|
1447
|
+
))), tab === "badges" && /* @__PURE__ */ React__namespace.createElement(Table$a, { loading: props.loading, items: props.badges }), tab === "answers" && /* @__PURE__ */ React__namespace.createElement(Table$9, { loading: props.loading, items: props.answers }), tab === "reflections" && /* @__PURE__ */ React__namespace.createElement(Table$8, { loading: props.loading, items: props.reflections }));
|
|
1448
|
+
};
|
|
1449
|
+
|
|
1450
|
+
const ACCENT_BORDER = {
|
|
1451
|
+
cyan: "border-l-sky-blue-400",
|
|
1452
|
+
mint: "border-l-mint-400",
|
|
1453
|
+
gold: "border-l-gold-400"
|
|
1454
|
+
};
|
|
1455
|
+
const ACCENT_GRADIENT = {
|
|
1456
|
+
cyan: "from-sky-blue-400",
|
|
1457
|
+
mint: "from-mint-400",
|
|
1458
|
+
gold: "from-gold-400"
|
|
1459
|
+
};
|
|
1460
|
+
function CardGradient(props) {
|
|
1461
|
+
const accent = props.accent || "cyan";
|
|
1462
|
+
return /* @__PURE__ */ React__namespace.createElement(
|
|
1463
|
+
"div",
|
|
1464
|
+
{
|
|
1465
|
+
onClick: props.onClick,
|
|
1466
|
+
className: `flex cursor-pointer items-center gap-[18px] rounded-2xl border border-l-4 border-slate-200 bg-white px-[22px] py-[18px] transition-transform hover:scale-[1.02] hover:shadow-md ${ACCENT_BORDER[accent]}`
|
|
1467
|
+
},
|
|
1468
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: `flex h-10 w-10 shrink-0 items-center justify-center rounded-[10px] bg-gradient-to-br ${ACCENT_GRADIENT[accent]} to-dark-blue-400 text-white` }, props.icon),
|
|
1469
|
+
/* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[15.5px] font-extrabold text-dark-blue-400" }, props.title), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-0.5 text-xs text-slate-500" }, props.description))
|
|
1470
|
+
);
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
const Home = (props) => {
|
|
1474
|
+
const accessCode = props.organization.accessCode;
|
|
1475
|
+
const onCopyAccessCode = async () => {
|
|
1476
|
+
if (!accessCode)
|
|
1477
|
+
return;
|
|
1478
|
+
try {
|
|
1479
|
+
await navigator.clipboard.writeText(accessCode);
|
|
1480
|
+
notifications.showNotification({
|
|
1481
|
+
title: "Copied!",
|
|
1482
|
+
message: "Community code copied to clipboard.",
|
|
1483
|
+
autoClose: 3e3
|
|
1484
|
+
});
|
|
1485
|
+
} catch (err) {
|
|
1486
|
+
console.error("Failed to copy code", err);
|
|
1440
1487
|
}
|
|
1441
|
-
|
|
1442
|
-
|
|
1488
|
+
};
|
|
1489
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-full flex-col gap-5" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-stretch gap-5" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-[28px] font-extrabold text-dark-blue-400" }, props.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 text-[12.5px] text-slate-400" }, props.impactStatement)), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-[440px] shrink-0 flex-col justify-between gap-3 rounded-2xl bg-gradient-to-br from-dark-blue-600 via-dark-blue-400 to-sky-blue-400 p-5" }, /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-base font-extrabold text-white" }, props.organization.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 text-[11.5px] leading-relaxed text-white/70" }, props.organization.description)), accessCode && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React__namespace.createElement("span", { className: "text-[11px] text-white/70" }, "Community code: ", accessCode), /* @__PURE__ */ React__namespace.createElement(
|
|
1490
|
+
"button",
|
|
1443
1491
|
{
|
|
1444
|
-
|
|
1445
|
-
|
|
1492
|
+
onClick: onCopyAccessCode,
|
|
1493
|
+
className: "rounded-md bg-white/90 px-2.5 py-1 text-[10.5px] font-bold text-dark-blue-400 hover:bg-white"
|
|
1494
|
+
},
|
|
1495
|
+
"Copy"
|
|
1496
|
+
)))), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1497
|
+
CardGradient,
|
|
1498
|
+
{
|
|
1499
|
+
title: "Dashboard",
|
|
1500
|
+
description: "Track your students\u2019 pathway progress",
|
|
1501
|
+
accent: "mint",
|
|
1502
|
+
icon: /* @__PURE__ */ React__namespace.createElement(icons.IconGauge, { size: 18, stroke: 1.75 }),
|
|
1503
|
+
onClick: props.onDashboardClick
|
|
1446
1504
|
}
|
|
1447
|
-
),
|
|
1448
|
-
|
|
1505
|
+
), /* @__PURE__ */ React__namespace.createElement(
|
|
1506
|
+
CardGradient,
|
|
1449
1507
|
{
|
|
1450
|
-
|
|
1451
|
-
|
|
1508
|
+
title: "Classes",
|
|
1509
|
+
description: "Create classes, cohorts, or custom subgroups",
|
|
1510
|
+
accent: "gold",
|
|
1511
|
+
icon: /* @__PURE__ */ React__namespace.createElement(icons.IconCategory2, { size: 18, stroke: 1.75 }),
|
|
1512
|
+
onClick: props.onClassesClick
|
|
1452
1513
|
}
|
|
1453
|
-
),
|
|
1454
|
-
|
|
1514
|
+
), /* @__PURE__ */ React__namespace.createElement(
|
|
1515
|
+
CardGradient,
|
|
1455
1516
|
{
|
|
1456
|
-
|
|
1457
|
-
|
|
1517
|
+
title: "Pathways",
|
|
1518
|
+
description: "Explore all your unique pathway requirements in one clear space",
|
|
1519
|
+
accent: "cyan",
|
|
1520
|
+
icon: /* @__PURE__ */ React__namespace.createElement(icons.IconRoute, { size: 18, stroke: 1.75 }),
|
|
1521
|
+
onClick: props.onPathwaysClick
|
|
1458
1522
|
}
|
|
1459
|
-
)
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
"
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
content: '""',
|
|
1479
|
-
position: "absolute",
|
|
1480
|
-
top: 0,
|
|
1481
|
-
bottom: 0,
|
|
1482
|
-
left: 0,
|
|
1483
|
-
width: 6,
|
|
1484
|
-
backgroundImage: theme.fn.linearGradient(0, theme.colors[from][6], theme.colors[to][6])
|
|
1485
|
-
}
|
|
1486
|
-
}
|
|
1487
|
-
};
|
|
1488
|
-
});
|
|
1489
|
-
function CardGradient(props) {
|
|
1490
|
-
const { classes } = useStyles$h(props);
|
|
1491
|
-
const from = props.from || "blue";
|
|
1492
|
-
const to = props.to || "green";
|
|
1493
|
-
const icon = props.icon || /* @__PURE__ */ React__namespace.createElement(icons.IconColorSwatch, { size: 28, stroke: 1.5 });
|
|
1494
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Paper, { withBorder: true, radius: "md", className: classes.card, onClick: props.onClick }, /* @__PURE__ */ React__namespace.createElement(
|
|
1495
|
-
core.ThemeIcon,
|
|
1496
|
-
{
|
|
1497
|
-
size: "xl",
|
|
1498
|
-
radius: "md",
|
|
1499
|
-
variant: "gradient",
|
|
1500
|
-
gradient: { deg: 0, from, to }
|
|
1501
|
-
},
|
|
1502
|
-
icon
|
|
1503
|
-
), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "xl", weight: 500, mt: "md" }, props.title), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", mt: "sm", color: "dimmed" }, props.description));
|
|
1504
|
-
}
|
|
1505
|
-
|
|
1506
|
-
var __defProp$9 = Object.defineProperty;
|
|
1507
|
-
var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;
|
|
1508
|
-
var __hasOwnProp$9 = Object.prototype.hasOwnProperty;
|
|
1509
|
-
var __propIsEnum$9 = Object.prototype.propertyIsEnumerable;
|
|
1510
|
-
var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1511
|
-
var __spreadValues$9 = (a, b) => {
|
|
1512
|
-
for (var prop in b || (b = {}))
|
|
1513
|
-
if (__hasOwnProp$9.call(b, prop))
|
|
1514
|
-
__defNormalProp$9(a, prop, b[prop]);
|
|
1515
|
-
if (__getOwnPropSymbols$9)
|
|
1516
|
-
for (var prop of __getOwnPropSymbols$9(b)) {
|
|
1517
|
-
if (__propIsEnum$9.call(b, prop))
|
|
1518
|
-
__defNormalProp$9(a, prop, b[prop]);
|
|
1519
|
-
}
|
|
1520
|
-
return a;
|
|
1521
|
-
};
|
|
1522
|
-
var __objRest$1 = (source, exclude) => {
|
|
1523
|
-
var target = {};
|
|
1524
|
-
for (var prop in source)
|
|
1525
|
-
if (__hasOwnProp$9.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
1526
|
-
target[prop] = source[prop];
|
|
1527
|
-
if (source != null && __getOwnPropSymbols$9)
|
|
1528
|
-
for (var prop of __getOwnPropSymbols$9(source)) {
|
|
1529
|
-
if (exclude.indexOf(prop) < 0 && __propIsEnum$9.call(source, prop))
|
|
1530
|
-
target[prop] = source[prop];
|
|
1531
|
-
}
|
|
1532
|
-
return target;
|
|
1533
|
-
};
|
|
1534
|
-
const useStyles$g = core.createStyles((theme) => ({
|
|
1535
|
-
card: {
|
|
1536
|
-
height: 240,
|
|
1537
|
-
backgroundSize: "cover",
|
|
1538
|
-
backgroundPosition: "center",
|
|
1539
|
-
whiteSpace: "pre-line"
|
|
1540
|
-
},
|
|
1541
|
-
content: {
|
|
1542
|
-
position: "absolute",
|
|
1543
|
-
padding: theme.spacing.xl,
|
|
1544
|
-
zIndex: 1,
|
|
1545
|
-
top: 0,
|
|
1546
|
-
bottom: 0,
|
|
1547
|
-
right: 0,
|
|
1548
|
-
left: 0
|
|
1549
|
-
},
|
|
1550
|
-
title: {
|
|
1551
|
-
color: theme.white,
|
|
1552
|
-
marginBottom: theme.spacing.xs / 2
|
|
1553
|
-
},
|
|
1554
|
-
description: {
|
|
1555
|
-
color: theme.white,
|
|
1556
|
-
maxWidth: 220
|
|
1557
|
-
},
|
|
1558
|
-
code: {
|
|
1559
|
-
color: theme.white,
|
|
1560
|
-
maxWidth: 220
|
|
1561
|
-
}
|
|
1562
|
-
}));
|
|
1563
|
-
const TenantBanner = (_a) => {
|
|
1564
|
-
var _b = _a, {
|
|
1565
|
-
title,
|
|
1566
|
-
description,
|
|
1567
|
-
image,
|
|
1568
|
-
style,
|
|
1569
|
-
className,
|
|
1570
|
-
code
|
|
1571
|
-
} = _b, others = __objRest$1(_b, [
|
|
1572
|
-
"title",
|
|
1573
|
-
"description",
|
|
1574
|
-
"image",
|
|
1575
|
-
"style",
|
|
1576
|
-
"className",
|
|
1577
|
-
"code"
|
|
1578
|
-
]);
|
|
1579
|
-
const { classes, cx, theme } = useStyles$g();
|
|
1580
|
-
const handleCopy = async () => {
|
|
1581
|
-
if (!code)
|
|
1582
|
-
return;
|
|
1583
|
-
try {
|
|
1584
|
-
await navigator.clipboard.writeText(code);
|
|
1585
|
-
notifications.showNotification({
|
|
1586
|
-
title: "Copied!",
|
|
1587
|
-
message: "Community code copied to clipboard.",
|
|
1588
|
-
autoClose: 3e3
|
|
1589
|
-
});
|
|
1590
|
-
} catch (err) {
|
|
1591
|
-
console.error("Failed to copy code", err);
|
|
1592
|
-
}
|
|
1593
|
-
};
|
|
1594
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
1595
|
-
core.Card,
|
|
1596
|
-
__spreadValues$9({
|
|
1597
|
-
radius: "md",
|
|
1598
|
-
style: __spreadValues$9({ backgroundImage: `url(${image})` }, style),
|
|
1599
|
-
className: cx(classes.card, className)
|
|
1600
|
-
}, others),
|
|
1601
|
-
/* @__PURE__ */ React__namespace.createElement(
|
|
1602
|
-
core.Overlay,
|
|
1603
|
-
{
|
|
1604
|
-
gradient: `linear-gradient(105deg, ${theme.black} 20%, #312f2f 50%, ${theme.colors.gray[6]} 100%)`,
|
|
1605
|
-
opacity: 0.55,
|
|
1606
|
-
zIndex: 0
|
|
1607
|
-
}
|
|
1608
|
-
),
|
|
1609
|
-
/* @__PURE__ */ React__namespace.createElement("div", { className: classes.content }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "lg", weight: 700, className: classes.title }, title), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", className: classes.description }, description), /* @__PURE__ */ React__namespace.createElement(core.Group, { mt: "sm", spacing: "xs" }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", className: classes.code }, "Community Code: ", code || "\u2014"), code && /* @__PURE__ */ React__namespace.createElement(
|
|
1610
|
-
core.Button,
|
|
1611
|
-
{
|
|
1612
|
-
size: "xs",
|
|
1613
|
-
variant: "white",
|
|
1614
|
-
onClick: handleCopy,
|
|
1615
|
-
styles: {
|
|
1616
|
-
root: {
|
|
1617
|
-
backgroundColor: "rgba(255,255,255,0.9)"
|
|
1618
|
-
}
|
|
1619
|
-
}
|
|
1620
|
-
},
|
|
1621
|
-
"Copy"
|
|
1622
|
-
)))
|
|
1623
|
-
);
|
|
1624
|
-
};
|
|
1625
|
-
|
|
1626
|
-
const Home = (props) => {
|
|
1627
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Container, { size: "lg" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "lg" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, { gutter: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { md: 6 }, /* @__PURE__ */ React__namespace.createElement(
|
|
1628
|
-
UserInfo,
|
|
1629
|
-
{
|
|
1630
|
-
variant: "compact",
|
|
1631
|
-
name: props.name,
|
|
1632
|
-
impactStatement: props.impactStatement
|
|
1633
|
-
}
|
|
1634
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { md: 6 }, /* @__PURE__ */ React__namespace.createElement(
|
|
1635
|
-
TenantBanner,
|
|
1636
|
-
{
|
|
1637
|
-
title: props.organization.name,
|
|
1638
|
-
description: props.organization.description,
|
|
1639
|
-
image: props.organization.image,
|
|
1640
|
-
code: props.organization.accessCode
|
|
1641
|
-
}
|
|
1642
|
-
))), /* @__PURE__ */ React__namespace.createElement(core.Grid, { gutter: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
|
|
1643
|
-
CardGradient,
|
|
1644
|
-
{
|
|
1645
|
-
title: "Dashboard",
|
|
1646
|
-
description: "Track your students\u2019 pathway progress",
|
|
1647
|
-
onClick: props.onDashboardClick
|
|
1648
|
-
}
|
|
1649
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
|
|
1650
|
-
CardGradient,
|
|
1651
|
-
{
|
|
1652
|
-
title: "Classes",
|
|
1653
|
-
description: "Create classes, cohorts, or custom subgroups",
|
|
1654
|
-
onClick: props.onClassesClick
|
|
1655
|
-
}
|
|
1656
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
|
|
1657
|
-
CardGradient,
|
|
1658
|
-
{
|
|
1659
|
-
title: "Pathways",
|
|
1660
|
-
description: "Explore all your unique pathway requirements in one clear space",
|
|
1661
|
-
onClick: props.onPathwaysClick
|
|
1662
|
-
}
|
|
1663
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
|
|
1664
|
-
CardGradient,
|
|
1665
|
-
{
|
|
1666
|
-
title: "Badges",
|
|
1667
|
-
description: "Key milestones that reflect skill development, micro-credentials, or academic progress",
|
|
1668
|
-
onClick: props.onBadgesClick
|
|
1669
|
-
}
|
|
1670
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
|
|
1671
|
-
CardGradient,
|
|
1672
|
-
{
|
|
1673
|
-
title: "Lessons",
|
|
1674
|
-
description: "Bite-sized activities and learning experiences accelerating students achievement",
|
|
1675
|
-
onClick: props.onLessonsClick
|
|
1676
|
-
}
|
|
1677
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, null, /* @__PURE__ */ React__namespace.createElement(
|
|
1678
|
-
CardGradient,
|
|
1679
|
-
{
|
|
1680
|
-
title: "File Locker",
|
|
1681
|
-
description: "A secure space to view student-submitted work and provide feedback",
|
|
1682
|
-
onClick: props.onFileLockerClick
|
|
1683
|
-
}
|
|
1684
|
-
)))));
|
|
1523
|
+
), /* @__PURE__ */ React__namespace.createElement(
|
|
1524
|
+
CardGradient,
|
|
1525
|
+
{
|
|
1526
|
+
title: "Badges",
|
|
1527
|
+
description: "Key milestones that reflect skill development, micro-credentials, or academic progress",
|
|
1528
|
+
accent: "mint",
|
|
1529
|
+
icon: /* @__PURE__ */ React__namespace.createElement(icons.IconAlbum, { size: 18, stroke: 1.75 }),
|
|
1530
|
+
onClick: props.onBadgesClick
|
|
1531
|
+
}
|
|
1532
|
+
), /* @__PURE__ */ React__namespace.createElement(
|
|
1533
|
+
CardGradient,
|
|
1534
|
+
{
|
|
1535
|
+
title: "File Locker",
|
|
1536
|
+
description: "A secure space to view student-submitted work and provide feedback",
|
|
1537
|
+
accent: "cyan",
|
|
1538
|
+
icon: /* @__PURE__ */ React__namespace.createElement(icons.IconClipboard, { size: 18, stroke: 1.75 }),
|
|
1539
|
+
onClick: props.onFileLockerClick
|
|
1540
|
+
}
|
|
1541
|
+
)));
|
|
1685
1542
|
};
|
|
1686
1543
|
|
|
1687
1544
|
function Table$7(props) {
|
|
@@ -1716,7 +1573,7 @@ function Table$7(props) {
|
|
|
1716
1573
|
));
|
|
1717
1574
|
}
|
|
1718
1575
|
|
|
1719
|
-
const useStyles$
|
|
1576
|
+
const useStyles$e = core.createStyles((theme) => ({
|
|
1720
1577
|
button: {
|
|
1721
1578
|
borderTopRightRadius: 0,
|
|
1722
1579
|
borderBottomRightRadius: 0,
|
|
@@ -1731,7 +1588,7 @@ const useStyles$f = core.createStyles((theme) => ({
|
|
|
1731
1588
|
}
|
|
1732
1589
|
}));
|
|
1733
1590
|
const SplitButton$3 = (props) => {
|
|
1734
|
-
const { classes, theme } = useStyles$
|
|
1591
|
+
const { classes, theme } = useStyles$e();
|
|
1735
1592
|
theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
|
|
1736
1593
|
return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1737
1594
|
core.Button,
|
|
@@ -1768,28 +1625,28 @@ function Stack$3(props) {
|
|
|
1768
1625
|
return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { component: reactRouterDom.Link, to: props.href }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 24, sx: { padding: 20, minWidth: 700 } }, rows)));
|
|
1769
1626
|
}
|
|
1770
1627
|
|
|
1771
|
-
var __defProp$
|
|
1772
|
-
var __defProps$
|
|
1773
|
-
var __getOwnPropDescs$
|
|
1774
|
-
var __getOwnPropSymbols$
|
|
1775
|
-
var __hasOwnProp$
|
|
1776
|
-
var __propIsEnum$
|
|
1777
|
-
var __defNormalProp$
|
|
1778
|
-
var __spreadValues$
|
|
1628
|
+
var __defProp$a = Object.defineProperty;
|
|
1629
|
+
var __defProps$7 = Object.defineProperties;
|
|
1630
|
+
var __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;
|
|
1631
|
+
var __getOwnPropSymbols$a = Object.getOwnPropertySymbols;
|
|
1632
|
+
var __hasOwnProp$a = Object.prototype.hasOwnProperty;
|
|
1633
|
+
var __propIsEnum$a = Object.prototype.propertyIsEnumerable;
|
|
1634
|
+
var __defNormalProp$a = (obj, key, value) => key in obj ? __defProp$a(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
1635
|
+
var __spreadValues$a = (a, b) => {
|
|
1779
1636
|
for (var prop in b || (b = {}))
|
|
1780
|
-
if (__hasOwnProp$
|
|
1781
|
-
__defNormalProp$
|
|
1782
|
-
if (__getOwnPropSymbols$
|
|
1783
|
-
for (var prop of __getOwnPropSymbols$
|
|
1784
|
-
if (__propIsEnum$
|
|
1785
|
-
__defNormalProp$
|
|
1637
|
+
if (__hasOwnProp$a.call(b, prop))
|
|
1638
|
+
__defNormalProp$a(a, prop, b[prop]);
|
|
1639
|
+
if (__getOwnPropSymbols$a)
|
|
1640
|
+
for (var prop of __getOwnPropSymbols$a(b)) {
|
|
1641
|
+
if (__propIsEnum$a.call(b, prop))
|
|
1642
|
+
__defNormalProp$a(a, prop, b[prop]);
|
|
1786
1643
|
}
|
|
1787
1644
|
return a;
|
|
1788
1645
|
};
|
|
1789
|
-
var __spreadProps$
|
|
1646
|
+
var __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));
|
|
1790
1647
|
function Table$6(props) {
|
|
1791
1648
|
const preparedItems = React__namespace.useMemo(() => {
|
|
1792
|
-
return props.items.map((item) => __spreadProps$
|
|
1649
|
+
return props.items.map((item) => __spreadProps$7(__spreadValues$a({}, item), {
|
|
1793
1650
|
status: item.isComplete ? 2 : item.isStarted ? 1 : 0
|
|
1794
1651
|
}));
|
|
1795
1652
|
}, [props.items]);
|
|
@@ -1909,7 +1766,7 @@ function Stack$2(props) {
|
|
|
1909
1766
|
}
|
|
1910
1767
|
const truncateWithEllipses = (text, max) => text.substr(0, max - 1) + (text.length > max ? "…" : "");
|
|
1911
1768
|
|
|
1912
|
-
const useStyles$
|
|
1769
|
+
const useStyles$d = core.createStyles((theme) => ({
|
|
1913
1770
|
title: {
|
|
1914
1771
|
fontSize: 34,
|
|
1915
1772
|
fontWeight: 900,
|
|
@@ -1922,7 +1779,7 @@ const useStyles$e = core.createStyles((theme) => ({
|
|
|
1922
1779
|
}
|
|
1923
1780
|
}));
|
|
1924
1781
|
const Lesson = (props) => {
|
|
1925
|
-
const { classes } = useStyles$
|
|
1782
|
+
const { classes } = useStyles$d();
|
|
1926
1783
|
const [tab, setTab] = React.useState("question");
|
|
1927
1784
|
const numberOfStudents = props.students.length;
|
|
1928
1785
|
const numberOfLessons = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
|
|
@@ -1964,7 +1821,7 @@ const Lesson = (props) => {
|
|
|
1964
1821
|
{ label: "By student", value: "students" },
|
|
1965
1822
|
{ label: "By reflection", value: "reflections" }
|
|
1966
1823
|
];
|
|
1967
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Container, {
|
|
1824
|
+
return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
|
|
1968
1825
|
core.Badge,
|
|
1969
1826
|
{
|
|
1970
1827
|
variant: "filled",
|
|
@@ -2035,65 +1892,35 @@ const Lesson = (props) => {
|
|
|
2035
1892
|
};
|
|
2036
1893
|
|
|
2037
1894
|
function Table$5(props) {
|
|
1895
|
+
if (props.loading) {
|
|
1896
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm text-slate-400" }, "Loading\u2026");
|
|
1897
|
+
}
|
|
2038
1898
|
if (props.items.length === 0) {
|
|
2039
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
2040
|
-
PlaceholderBanner,
|
|
2041
|
-
{
|
|
2042
|
-
title: "No lessons to display",
|
|
2043
|
-
description: "We don't have any lessons to show you just yet.",
|
|
2044
|
-
loading: props.loading,
|
|
2045
|
-
icon: "lessons"
|
|
2046
|
-
}
|
|
2047
|
-
);
|
|
1899
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "rounded-xl border border-slate-200 bg-white p-8 text-center text-sm text-slate-400 shadow-sm" }, "No lessons to display.");
|
|
2048
1900
|
}
|
|
2049
|
-
|
|
2050
|
-
|
|
1901
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1" }, "Lesson"), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0" }, "Pathway"), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), props.items.map((row) => /* @__PURE__ */ React__namespace.createElement(
|
|
1902
|
+
reactRouterDom.Link,
|
|
2051
1903
|
{
|
|
2052
|
-
|
|
1904
|
+
key: row.lessonId,
|
|
2053
1905
|
to: row.href,
|
|
2054
|
-
|
|
2055
|
-
display: "block",
|
|
2056
|
-
width: "100%",
|
|
2057
|
-
padding: theme.spacing.md,
|
|
2058
|
-
color: theme.colorScheme === "dark" ? theme.colors.dark[0] : theme.black,
|
|
2059
|
-
"&:hover": {
|
|
2060
|
-
backgroundColor: theme.colorScheme === "dark" ? theme.colors.dark[8] : theme.colors.gray[1]
|
|
2061
|
-
}
|
|
2062
|
-
})
|
|
1906
|
+
className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
|
|
2063
1907
|
},
|
|
2064
|
-
/* @__PURE__ */ React__namespace.createElement(
|
|
2065
|
-
|
|
2066
|
-
|
|
1908
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-bold text-dark-blue-400" }, row.name), row.description && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs leading-relaxed text-slate-500" }, row.description)),
|
|
1909
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0 text-xs text-slate-500" }, row.pathway || "\u2014"),
|
|
1910
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 16, stroke: 2, className: "w-4 shrink-0 text-slate-300" })
|
|
1911
|
+
)));
|
|
2067
1912
|
}
|
|
2068
1913
|
|
|
2069
|
-
const useStyles$d = core.createStyles((theme) => ({
|
|
2070
|
-
title: {
|
|
2071
|
-
fontSize: 34,
|
|
2072
|
-
fontWeight: 900,
|
|
2073
|
-
[theme.fn.smallerThan("sm")]: {
|
|
2074
|
-
fontSize: 24
|
|
2075
|
-
}
|
|
2076
|
-
},
|
|
2077
|
-
description: {
|
|
2078
|
-
maxWidth: 600
|
|
2079
|
-
}
|
|
2080
|
-
}));
|
|
2081
1914
|
const Lessons = (props) => {
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
core.Autocomplete,
|
|
1915
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Lessons"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Bite-sized activities and learning experiences accelerating students achievement")), /* @__PURE__ */ React__namespace.createElement("div", { className: "relative" }, /* @__PURE__ */ React__namespace.createElement(icons.IconSearch, { size: 16, stroke: 2, className: "pointer-events-none absolute left-3.5 top-1/2 -translate-y-1/2 text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
|
|
1916
|
+
"input",
|
|
2085
1917
|
{
|
|
1918
|
+
type: "text",
|
|
2086
1919
|
placeholder: "Search for a lesson that fits your needs",
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
}
|
|
2090
|
-
), /* @__PURE__ */ React__namespace.createElement("div", { style: { position: "relative" } }, /* @__PURE__ */ React__namespace.createElement(core.LoadingOverlay, { visible: props.loading, overlayBlur: 2 }), /* @__PURE__ */ React__namespace.createElement(
|
|
2091
|
-
Table$5,
|
|
2092
|
-
{
|
|
2093
|
-
loading: props.loading,
|
|
2094
|
-
items: props.lessons
|
|
1920
|
+
onChange: (e) => props.onAutocompleteChange(e.target.value),
|
|
1921
|
+
className: "w-full rounded-xl border border-slate-200 bg-white py-2.5 pl-10 pr-4 text-sm text-dark-blue-400 placeholder:text-slate-400 focus:border-sky-blue-400 focus:outline-none"
|
|
2095
1922
|
}
|
|
2096
|
-
))));
|
|
1923
|
+
)), /* @__PURE__ */ React__namespace.createElement(Table$5, { loading: props.loading, items: props.lessons }));
|
|
2097
1924
|
};
|
|
2098
1925
|
|
|
2099
1926
|
const useStyles$c = core.createStyles((theme) => ({
|
|
@@ -2174,7 +2001,7 @@ const useStyles$b = core.createStyles((theme) => ({
|
|
|
2174
2001
|
}));
|
|
2175
2002
|
const Organization = (props) => {
|
|
2176
2003
|
const { classes } = useStyles$b();
|
|
2177
|
-
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Container, {
|
|
2004
|
+
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
|
|
2178
2005
|
core.Badge,
|
|
2179
2006
|
{
|
|
2180
2007
|
variant: "filled",
|
|
@@ -2276,25 +2103,25 @@ function Table$4(props) {
|
|
|
2276
2103
|
return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea, null, /* @__PURE__ */ React__namespace.createElement(core.Table, { verticalSpacing: 20, sx: { minWidth: 700 }, highlightOnHover: true, striped: true }, /* @__PURE__ */ React__namespace.createElement("thead", null, /* @__PURE__ */ React__namespace.createElement("tr", null, /* @__PURE__ */ React__namespace.createElement("th", null, "Name"), /* @__PURE__ */ React__namespace.createElement("th", null, "Role"), /* @__PURE__ */ React__namespace.createElement("th", null, "Account Created?"), /* @__PURE__ */ React__namespace.createElement("th", null, "# of Classes"), /* @__PURE__ */ React__namespace.createElement("th", null))), /* @__PURE__ */ React__namespace.createElement("tbody", null, rows)));
|
|
2277
2104
|
}
|
|
2278
2105
|
|
|
2279
|
-
var __defProp$
|
|
2280
|
-
var __defProps$
|
|
2281
|
-
var __getOwnPropDescs$
|
|
2282
|
-
var __getOwnPropSymbols$
|
|
2283
|
-
var __hasOwnProp$
|
|
2284
|
-
var __propIsEnum$
|
|
2285
|
-
var __defNormalProp$
|
|
2286
|
-
var __spreadValues$
|
|
2287
|
-
for (var prop in b || (b = {}))
|
|
2288
|
-
if (__hasOwnProp$
|
|
2289
|
-
__defNormalProp$
|
|
2290
|
-
if (__getOwnPropSymbols$
|
|
2291
|
-
for (var prop of __getOwnPropSymbols$
|
|
2292
|
-
if (__propIsEnum$
|
|
2293
|
-
__defNormalProp$
|
|
2106
|
+
var __defProp$9 = Object.defineProperty;
|
|
2107
|
+
var __defProps$6 = Object.defineProperties;
|
|
2108
|
+
var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;
|
|
2109
|
+
var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;
|
|
2110
|
+
var __hasOwnProp$9 = Object.prototype.hasOwnProperty;
|
|
2111
|
+
var __propIsEnum$9 = Object.prototype.propertyIsEnumerable;
|
|
2112
|
+
var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2113
|
+
var __spreadValues$9 = (a, b) => {
|
|
2114
|
+
for (var prop in b || (b = {}))
|
|
2115
|
+
if (__hasOwnProp$9.call(b, prop))
|
|
2116
|
+
__defNormalProp$9(a, prop, b[prop]);
|
|
2117
|
+
if (__getOwnPropSymbols$9)
|
|
2118
|
+
for (var prop of __getOwnPropSymbols$9(b)) {
|
|
2119
|
+
if (__propIsEnum$9.call(b, prop))
|
|
2120
|
+
__defNormalProp$9(a, prop, b[prop]);
|
|
2294
2121
|
}
|
|
2295
2122
|
return a;
|
|
2296
2123
|
};
|
|
2297
|
-
var __spreadProps$
|
|
2124
|
+
var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));
|
|
2298
2125
|
const useStyles$9 = core.createStyles((theme) => ({
|
|
2299
2126
|
title: {
|
|
2300
2127
|
fontSize: 34,
|
|
@@ -2356,32 +2183,32 @@ const People = (props) => {
|
|
|
2356
2183
|
padding: "xl",
|
|
2357
2184
|
size: "xl"
|
|
2358
2185
|
},
|
|
2359
|
-
/* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(DropzoneButton, __spreadProps$
|
|
2186
|
+
/* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(DropzoneButton, __spreadProps$6(__spreadValues$9({}, props), { close: () => setOpened(false) })), /* @__PURE__ */ React__namespace.createElement(core.Divider, { label: "or", labelPosition: "center", my: "md", variant: "dashed" }), /* @__PURE__ */ React__namespace.createElement("form", { onSubmit: form$1.onSubmit(() => {
|
|
2360
2187
|
const values = form$1.values;
|
|
2361
2188
|
form$1.reset();
|
|
2362
2189
|
setOpened(false);
|
|
2363
2190
|
props.onCreateUsers && props.onCreateUsers([values]);
|
|
2364
2191
|
}) }, /* @__PURE__ */ React__namespace.createElement(core.Stack, null, /* @__PURE__ */ React__namespace.createElement(
|
|
2365
2192
|
core.TextInput,
|
|
2366
|
-
__spreadValues$
|
|
2193
|
+
__spreadValues$9({
|
|
2367
2194
|
withAsterisk: true,
|
|
2368
2195
|
label: "Email",
|
|
2369
2196
|
placeholder: "Email"
|
|
2370
2197
|
}, form$1.getInputProps("email"))
|
|
2371
2198
|
), /* @__PURE__ */ React__namespace.createElement(core.Group, { grow: true }, /* @__PURE__ */ React__namespace.createElement(
|
|
2372
2199
|
core.TextInput,
|
|
2373
|
-
__spreadValues$
|
|
2200
|
+
__spreadValues$9({
|
|
2374
2201
|
label: "Given name",
|
|
2375
2202
|
placeholder: "Given name"
|
|
2376
2203
|
}, form$1.getInputProps("givenName"))
|
|
2377
2204
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
2378
2205
|
core.TextInput,
|
|
2379
|
-
__spreadValues$
|
|
2206
|
+
__spreadValues$9({
|
|
2380
2207
|
label: "Family name",
|
|
2381
2208
|
placeholder: "Family name"
|
|
2382
2209
|
}, form$1.getInputProps("familyName"))
|
|
2383
2210
|
)), /* @__PURE__ */ React__namespace.createElement(core.Button, { type: "submit", fullWidth: true, mt: "md" }, "Submit"))))
|
|
2384
|
-
), /* @__PURE__ */ React__namespace.createElement(core.Container, {
|
|
2211
|
+
), /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
|
|
2385
2212
|
core.Badge,
|
|
2386
2213
|
{
|
|
2387
2214
|
variant: "filled",
|
|
@@ -2562,24 +2389,24 @@ const StartAnonymousLesson = (props) => {
|
|
|
2562
2389
|
))))));
|
|
2563
2390
|
};
|
|
2564
2391
|
|
|
2565
|
-
var __defProp$
|
|
2566
|
-
var __getOwnPropSymbols$
|
|
2567
|
-
var __hasOwnProp$
|
|
2568
|
-
var __propIsEnum$
|
|
2569
|
-
var __defNormalProp$
|
|
2570
|
-
var __spreadValues$
|
|
2392
|
+
var __defProp$8 = Object.defineProperty;
|
|
2393
|
+
var __getOwnPropSymbols$8 = Object.getOwnPropertySymbols;
|
|
2394
|
+
var __hasOwnProp$8 = Object.prototype.hasOwnProperty;
|
|
2395
|
+
var __propIsEnum$8 = Object.prototype.propertyIsEnumerable;
|
|
2396
|
+
var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2397
|
+
var __spreadValues$8 = (a, b) => {
|
|
2571
2398
|
for (var prop in b || (b = {}))
|
|
2572
|
-
if (__hasOwnProp$
|
|
2573
|
-
__defNormalProp$
|
|
2574
|
-
if (__getOwnPropSymbols$
|
|
2575
|
-
for (var prop of __getOwnPropSymbols$
|
|
2576
|
-
if (__propIsEnum$
|
|
2577
|
-
__defNormalProp$
|
|
2399
|
+
if (__hasOwnProp$8.call(b, prop))
|
|
2400
|
+
__defNormalProp$8(a, prop, b[prop]);
|
|
2401
|
+
if (__getOwnPropSymbols$8)
|
|
2402
|
+
for (var prop of __getOwnPropSymbols$8(b)) {
|
|
2403
|
+
if (__propIsEnum$8.call(b, prop))
|
|
2404
|
+
__defNormalProp$8(a, prop, b[prop]);
|
|
2578
2405
|
}
|
|
2579
2406
|
return a;
|
|
2580
2407
|
};
|
|
2581
2408
|
const BadgeGrid = (props) => {
|
|
2582
|
-
const badges = props.badges.map((b) => /* @__PURE__ */ React__namespace.createElement(TaskCard, __spreadValues$
|
|
2409
|
+
const badges = props.badges.map((b) => /* @__PURE__ */ React__namespace.createElement(TaskCard, __spreadValues$8({ key: b.title }, b)));
|
|
2583
2410
|
return /* @__PURE__ */ React__namespace.createElement(core.SimpleGrid, { cols: 4, breakpoints: [{ maxWidth: "sm", cols: 1 }, { maxWidth: "md", cols: 3 }] }, badges);
|
|
2584
2411
|
};
|
|
2585
2412
|
function TaskCard(props) {
|
|
@@ -2596,6 +2423,144 @@ function TaskCard(props) {
|
|
|
2596
2423
|
}
|
|
2597
2424
|
|
|
2598
2425
|
const useStyles$7 = core.createStyles((theme) => ({
|
|
2426
|
+
title: {
|
|
2427
|
+
fontSize: 34,
|
|
2428
|
+
fontWeight: 900,
|
|
2429
|
+
marginTop: 16,
|
|
2430
|
+
[theme.fn.smallerThan("sm")]: {
|
|
2431
|
+
fontSize: 24
|
|
2432
|
+
}
|
|
2433
|
+
},
|
|
2434
|
+
description: {
|
|
2435
|
+
maxWidth: 600
|
|
2436
|
+
}
|
|
2437
|
+
}));
|
|
2438
|
+
const UserInfo = (props) => {
|
|
2439
|
+
const { classes } = useStyles$7();
|
|
2440
|
+
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(core.Title, { className: classes.title }, props.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "xs" }, props.impactStatement));
|
|
2441
|
+
};
|
|
2442
|
+
|
|
2443
|
+
var __defProp$7 = Object.defineProperty;
|
|
2444
|
+
var __getOwnPropSymbols$7 = Object.getOwnPropertySymbols;
|
|
2445
|
+
var __hasOwnProp$7 = Object.prototype.hasOwnProperty;
|
|
2446
|
+
var __propIsEnum$7 = Object.prototype.propertyIsEnumerable;
|
|
2447
|
+
var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2448
|
+
var __spreadValues$7 = (a, b) => {
|
|
2449
|
+
for (var prop in b || (b = {}))
|
|
2450
|
+
if (__hasOwnProp$7.call(b, prop))
|
|
2451
|
+
__defNormalProp$7(a, prop, b[prop]);
|
|
2452
|
+
if (__getOwnPropSymbols$7)
|
|
2453
|
+
for (var prop of __getOwnPropSymbols$7(b)) {
|
|
2454
|
+
if (__propIsEnum$7.call(b, prop))
|
|
2455
|
+
__defNormalProp$7(a, prop, b[prop]);
|
|
2456
|
+
}
|
|
2457
|
+
return a;
|
|
2458
|
+
};
|
|
2459
|
+
var __objRest$1 = (source, exclude) => {
|
|
2460
|
+
var target = {};
|
|
2461
|
+
for (var prop in source)
|
|
2462
|
+
if (__hasOwnProp$7.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
2463
|
+
target[prop] = source[prop];
|
|
2464
|
+
if (source != null && __getOwnPropSymbols$7)
|
|
2465
|
+
for (var prop of __getOwnPropSymbols$7(source)) {
|
|
2466
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum$7.call(source, prop))
|
|
2467
|
+
target[prop] = source[prop];
|
|
2468
|
+
}
|
|
2469
|
+
return target;
|
|
2470
|
+
};
|
|
2471
|
+
const useStyles$6 = core.createStyles((theme) => ({
|
|
2472
|
+
card: {
|
|
2473
|
+
height: 240,
|
|
2474
|
+
backgroundSize: "cover",
|
|
2475
|
+
backgroundPosition: "center",
|
|
2476
|
+
whiteSpace: "pre-line"
|
|
2477
|
+
},
|
|
2478
|
+
content: {
|
|
2479
|
+
position: "absolute",
|
|
2480
|
+
padding: theme.spacing.xl,
|
|
2481
|
+
zIndex: 1,
|
|
2482
|
+
top: 0,
|
|
2483
|
+
bottom: 0,
|
|
2484
|
+
right: 0,
|
|
2485
|
+
left: 0
|
|
2486
|
+
},
|
|
2487
|
+
title: {
|
|
2488
|
+
color: theme.white,
|
|
2489
|
+
marginBottom: theme.spacing.xs / 2
|
|
2490
|
+
},
|
|
2491
|
+
description: {
|
|
2492
|
+
color: theme.white,
|
|
2493
|
+
maxWidth: 220
|
|
2494
|
+
},
|
|
2495
|
+
code: {
|
|
2496
|
+
color: theme.white,
|
|
2497
|
+
maxWidth: 220
|
|
2498
|
+
}
|
|
2499
|
+
}));
|
|
2500
|
+
const TenantBanner = (_a) => {
|
|
2501
|
+
var _b = _a, {
|
|
2502
|
+
title,
|
|
2503
|
+
description,
|
|
2504
|
+
image,
|
|
2505
|
+
style,
|
|
2506
|
+
className,
|
|
2507
|
+
code
|
|
2508
|
+
} = _b, others = __objRest$1(_b, [
|
|
2509
|
+
"title",
|
|
2510
|
+
"description",
|
|
2511
|
+
"image",
|
|
2512
|
+
"style",
|
|
2513
|
+
"className",
|
|
2514
|
+
"code"
|
|
2515
|
+
]);
|
|
2516
|
+
const { classes, cx, theme } = useStyles$6();
|
|
2517
|
+
const handleCopy = async () => {
|
|
2518
|
+
if (!code)
|
|
2519
|
+
return;
|
|
2520
|
+
try {
|
|
2521
|
+
await navigator.clipboard.writeText(code);
|
|
2522
|
+
notifications.showNotification({
|
|
2523
|
+
title: "Copied!",
|
|
2524
|
+
message: "Community code copied to clipboard.",
|
|
2525
|
+
autoClose: 3e3
|
|
2526
|
+
});
|
|
2527
|
+
} catch (err) {
|
|
2528
|
+
console.error("Failed to copy code", err);
|
|
2529
|
+
}
|
|
2530
|
+
};
|
|
2531
|
+
return /* @__PURE__ */ React__namespace.createElement(
|
|
2532
|
+
core.Card,
|
|
2533
|
+
__spreadValues$7({
|
|
2534
|
+
radius: "md",
|
|
2535
|
+
style: __spreadValues$7({ backgroundImage: `url(${image})` }, style),
|
|
2536
|
+
className: cx(classes.card, className)
|
|
2537
|
+
}, others),
|
|
2538
|
+
/* @__PURE__ */ React__namespace.createElement(
|
|
2539
|
+
core.Overlay,
|
|
2540
|
+
{
|
|
2541
|
+
gradient: `linear-gradient(105deg, ${theme.black} 20%, #312f2f 50%, ${theme.colors.gray[6]} 100%)`,
|
|
2542
|
+
opacity: 0.55,
|
|
2543
|
+
zIndex: 0
|
|
2544
|
+
}
|
|
2545
|
+
),
|
|
2546
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: classes.content }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "lg", weight: 700, className: classes.title }, title), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", className: classes.description }, description), /* @__PURE__ */ React__namespace.createElement(core.Group, { mt: "sm", spacing: "xs" }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", className: classes.code }, "Community Code: ", code || "\u2014"), code && /* @__PURE__ */ React__namespace.createElement(
|
|
2547
|
+
core.Button,
|
|
2548
|
+
{
|
|
2549
|
+
size: "xs",
|
|
2550
|
+
variant: "white",
|
|
2551
|
+
onClick: handleCopy,
|
|
2552
|
+
styles: {
|
|
2553
|
+
root: {
|
|
2554
|
+
backgroundColor: "rgba(255,255,255,0.9)"
|
|
2555
|
+
}
|
|
2556
|
+
}
|
|
2557
|
+
},
|
|
2558
|
+
"Copy"
|
|
2559
|
+
)))
|
|
2560
|
+
);
|
|
2561
|
+
};
|
|
2562
|
+
|
|
2563
|
+
const useStyles$5 = core.createStyles((theme) => ({
|
|
2599
2564
|
action: {
|
|
2600
2565
|
backgroundColor: "inherit",
|
|
2601
2566
|
":hover": {
|
|
@@ -2614,8 +2579,8 @@ const useStyles$7 = core.createStyles((theme) => ({
|
|
|
2614
2579
|
}
|
|
2615
2580
|
}));
|
|
2616
2581
|
const TrialHome = (props) => {
|
|
2617
|
-
const { classes } = useStyles$
|
|
2618
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Container, {
|
|
2582
|
+
const { classes } = useStyles$5();
|
|
2583
|
+
return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true }, /* @__PURE__ */ React__namespace.createElement(core.Badge, null, props.daysRemaining, " day", props.daysRemaining !== 1 ? "s" : "", " left"), /* @__PURE__ */ React__namespace.createElement(
|
|
2619
2584
|
core.Button,
|
|
2620
2585
|
{
|
|
2621
2586
|
className: classes.action,
|
|
@@ -2643,38 +2608,38 @@ const TrialHome = (props) => {
|
|
|
2643
2608
|
)), /* @__PURE__ */ React__namespace.createElement(core.Title, { maw: 500, mb: 20, mt: 20, className: classes.title }, "Based on the tags you selected, check out these lessons to get started with your students!"), /* @__PURE__ */ React__namespace.createElement(BadgeGrid, { onAssign: props.onAssign, badges: props.badges })));
|
|
2644
2609
|
};
|
|
2645
2610
|
|
|
2646
|
-
var __defProp$
|
|
2647
|
-
var __defProps$
|
|
2648
|
-
var __getOwnPropDescs$
|
|
2649
|
-
var __getOwnPropSymbols$
|
|
2650
|
-
var __hasOwnProp$
|
|
2651
|
-
var __propIsEnum$
|
|
2652
|
-
var __defNormalProp$
|
|
2653
|
-
var __spreadValues$
|
|
2611
|
+
var __defProp$6 = Object.defineProperty;
|
|
2612
|
+
var __defProps$5 = Object.defineProperties;
|
|
2613
|
+
var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;
|
|
2614
|
+
var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;
|
|
2615
|
+
var __hasOwnProp$6 = Object.prototype.hasOwnProperty;
|
|
2616
|
+
var __propIsEnum$6 = Object.prototype.propertyIsEnumerable;
|
|
2617
|
+
var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2618
|
+
var __spreadValues$6 = (a, b) => {
|
|
2654
2619
|
for (var prop in b || (b = {}))
|
|
2655
|
-
if (__hasOwnProp$
|
|
2656
|
-
__defNormalProp$
|
|
2657
|
-
if (__getOwnPropSymbols$
|
|
2658
|
-
for (var prop of __getOwnPropSymbols$
|
|
2659
|
-
if (__propIsEnum$
|
|
2660
|
-
__defNormalProp$
|
|
2620
|
+
if (__hasOwnProp$6.call(b, prop))
|
|
2621
|
+
__defNormalProp$6(a, prop, b[prop]);
|
|
2622
|
+
if (__getOwnPropSymbols$6)
|
|
2623
|
+
for (var prop of __getOwnPropSymbols$6(b)) {
|
|
2624
|
+
if (__propIsEnum$6.call(b, prop))
|
|
2625
|
+
__defNormalProp$6(a, prop, b[prop]);
|
|
2661
2626
|
}
|
|
2662
2627
|
return a;
|
|
2663
2628
|
};
|
|
2664
|
-
var __spreadProps$
|
|
2629
|
+
var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));
|
|
2665
2630
|
var __objRest = (source, exclude) => {
|
|
2666
2631
|
var target = {};
|
|
2667
2632
|
for (var prop in source)
|
|
2668
|
-
if (__hasOwnProp$
|
|
2633
|
+
if (__hasOwnProp$6.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
2669
2634
|
target[prop] = source[prop];
|
|
2670
|
-
if (source != null && __getOwnPropSymbols$
|
|
2671
|
-
for (var prop of __getOwnPropSymbols$
|
|
2672
|
-
if (exclude.indexOf(prop) < 0 && __propIsEnum$
|
|
2635
|
+
if (source != null && __getOwnPropSymbols$6)
|
|
2636
|
+
for (var prop of __getOwnPropSymbols$6(source)) {
|
|
2637
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum$6.call(source, prop))
|
|
2673
2638
|
target[prop] = source[prop];
|
|
2674
2639
|
}
|
|
2675
2640
|
return target;
|
|
2676
2641
|
};
|
|
2677
|
-
const useStyles$
|
|
2642
|
+
const useStyles$4 = core.createStyles((theme, { checked }) => ({
|
|
2678
2643
|
button: {
|
|
2679
2644
|
display: "flex",
|
|
2680
2645
|
alignItems: "center",
|
|
@@ -2716,10 +2681,10 @@ function ImageCheckbox(_a) {
|
|
|
2716
2681
|
finalValue: false,
|
|
2717
2682
|
onChange
|
|
2718
2683
|
});
|
|
2719
|
-
const { classes, cx } = useStyles$
|
|
2684
|
+
const { classes, cx } = useStyles$4({ checked: value });
|
|
2720
2685
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
2721
2686
|
core.UnstyledButton,
|
|
2722
|
-
__spreadProps$
|
|
2687
|
+
__spreadProps$5(__spreadValues$6({}, others), {
|
|
2723
2688
|
onClick: () => handleChange(!value),
|
|
2724
2689
|
className: cx(classes.button, className)
|
|
2725
2690
|
}),
|
|
@@ -2740,7 +2705,7 @@ function ImageCheckbox(_a) {
|
|
|
2740
2705
|
function SelectGrid(props) {
|
|
2741
2706
|
const items = props.items.map((item) => /* @__PURE__ */ React__namespace.createElement(
|
|
2742
2707
|
ImageCheckbox,
|
|
2743
|
-
__spreadProps$
|
|
2708
|
+
__spreadProps$5(__spreadValues$6({}, item), {
|
|
2744
2709
|
key: item.title,
|
|
2745
2710
|
onChange: (checked) => props.onChange(item.title, checked)
|
|
2746
2711
|
})
|
|
@@ -2758,26 +2723,26 @@ function SelectGrid(props) {
|
|
|
2758
2723
|
);
|
|
2759
2724
|
}
|
|
2760
2725
|
|
|
2761
|
-
var __defProp$
|
|
2762
|
-
var __defProps$
|
|
2763
|
-
var __getOwnPropDescs$
|
|
2764
|
-
var __getOwnPropSymbols$
|
|
2765
|
-
var __hasOwnProp$
|
|
2766
|
-
var __propIsEnum$
|
|
2767
|
-
var __defNormalProp$
|
|
2768
|
-
var __spreadValues$
|
|
2726
|
+
var __defProp$5 = Object.defineProperty;
|
|
2727
|
+
var __defProps$4 = Object.defineProperties;
|
|
2728
|
+
var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;
|
|
2729
|
+
var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;
|
|
2730
|
+
var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
|
|
2731
|
+
var __propIsEnum$5 = Object.prototype.propertyIsEnumerable;
|
|
2732
|
+
var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2733
|
+
var __spreadValues$5 = (a, b) => {
|
|
2769
2734
|
for (var prop in b || (b = {}))
|
|
2770
|
-
if (__hasOwnProp$
|
|
2771
|
-
__defNormalProp$
|
|
2772
|
-
if (__getOwnPropSymbols$
|
|
2773
|
-
for (var prop of __getOwnPropSymbols$
|
|
2774
|
-
if (__propIsEnum$
|
|
2775
|
-
__defNormalProp$
|
|
2735
|
+
if (__hasOwnProp$5.call(b, prop))
|
|
2736
|
+
__defNormalProp$5(a, prop, b[prop]);
|
|
2737
|
+
if (__getOwnPropSymbols$5)
|
|
2738
|
+
for (var prop of __getOwnPropSymbols$5(b)) {
|
|
2739
|
+
if (__propIsEnum$5.call(b, prop))
|
|
2740
|
+
__defNormalProp$5(a, prop, b[prop]);
|
|
2776
2741
|
}
|
|
2777
2742
|
return a;
|
|
2778
2743
|
};
|
|
2779
|
-
var __spreadProps$
|
|
2780
|
-
const useStyles$
|
|
2744
|
+
var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));
|
|
2745
|
+
const useStyles$3 = core.createStyles((theme) => ({
|
|
2781
2746
|
wrapper: {
|
|
2782
2747
|
minHeight: "100%",
|
|
2783
2748
|
boxSizing: "border-box",
|
|
@@ -2840,7 +2805,7 @@ const OPTIONS = [
|
|
|
2840
2805
|
{ description: "project-based learning", title: "Project-Based Learning", icon: icons.IconTools }
|
|
2841
2806
|
];
|
|
2842
2807
|
const TrialRegistration = (props) => {
|
|
2843
|
-
const { classes } = useStyles$
|
|
2808
|
+
const { classes } = useStyles$3();
|
|
2844
2809
|
const [firstName, setFirstName] = React__namespace.useState("");
|
|
2845
2810
|
const [lastName, setLastName] = React__namespace.useState("");
|
|
2846
2811
|
const [organization, setOrganization] = React__namespace.useState({ organizationId: "", displayName: "" });
|
|
@@ -2886,7 +2851,7 @@ const TrialRegistration = (props) => {
|
|
|
2886
2851
|
label: "School/Organization Name",
|
|
2887
2852
|
placeholder: "What's the name of your school?",
|
|
2888
2853
|
data: props.organizations.map((o) => {
|
|
2889
|
-
return __spreadProps$
|
|
2854
|
+
return __spreadProps$4(__spreadValues$5({}, o), { value: o.displayName });
|
|
2890
2855
|
}),
|
|
2891
2856
|
onItemSubmit: (item) => setOrganization({ organizationId: item.organizationId, displayName: item.displayName }),
|
|
2892
2857
|
onChange: (next) => {
|
|
@@ -2898,7 +2863,7 @@ const TrialRegistration = (props) => {
|
|
|
2898
2863
|
SelectGrid,
|
|
2899
2864
|
{
|
|
2900
2865
|
items: OPTIONS,
|
|
2901
|
-
onChange: (e, checked) => setInterests(__spreadProps$
|
|
2866
|
+
onChange: (e, checked) => setInterests(__spreadProps$4(__spreadValues$5({}, interests), { [e]: checked }))
|
|
2902
2867
|
}
|
|
2903
2868
|
), /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "right", mt: "md" }, /* @__PURE__ */ React__namespace.createElement(
|
|
2904
2869
|
core.Button,
|
|
@@ -2936,26 +2901,26 @@ const AdminProvider = (props) => {
|
|
|
2936
2901
|
);
|
|
2937
2902
|
};
|
|
2938
2903
|
|
|
2939
|
-
var __defProp$
|
|
2940
|
-
var __defProps$
|
|
2941
|
-
var __getOwnPropDescs$
|
|
2942
|
-
var __getOwnPropSymbols$
|
|
2943
|
-
var __hasOwnProp$
|
|
2944
|
-
var __propIsEnum$
|
|
2945
|
-
var __defNormalProp$
|
|
2946
|
-
var __spreadValues$
|
|
2904
|
+
var __defProp$4 = Object.defineProperty;
|
|
2905
|
+
var __defProps$3 = Object.defineProperties;
|
|
2906
|
+
var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
|
|
2907
|
+
var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
|
|
2908
|
+
var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
|
|
2909
|
+
var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
|
|
2910
|
+
var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
2911
|
+
var __spreadValues$4 = (a, b) => {
|
|
2947
2912
|
for (var prop in b || (b = {}))
|
|
2948
|
-
if (__hasOwnProp$
|
|
2949
|
-
__defNormalProp$
|
|
2950
|
-
if (__getOwnPropSymbols$
|
|
2951
|
-
for (var prop of __getOwnPropSymbols$
|
|
2952
|
-
if (__propIsEnum$
|
|
2953
|
-
__defNormalProp$
|
|
2913
|
+
if (__hasOwnProp$4.call(b, prop))
|
|
2914
|
+
__defNormalProp$4(a, prop, b[prop]);
|
|
2915
|
+
if (__getOwnPropSymbols$4)
|
|
2916
|
+
for (var prop of __getOwnPropSymbols$4(b)) {
|
|
2917
|
+
if (__propIsEnum$4.call(b, prop))
|
|
2918
|
+
__defNormalProp$4(a, prop, b[prop]);
|
|
2954
2919
|
}
|
|
2955
2920
|
return a;
|
|
2956
2921
|
};
|
|
2957
|
-
var __spreadProps$
|
|
2958
|
-
const useStyles$
|
|
2922
|
+
var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
|
|
2923
|
+
const useStyles$2 = core.createStyles((theme, props) => ({
|
|
2959
2924
|
footer: {
|
|
2960
2925
|
paddingTop: theme.spacing.md,
|
|
2961
2926
|
paddingBottom: theme.spacing.md,
|
|
@@ -3042,7 +3007,7 @@ const useStyles$4 = core.createStyles((theme, props) => ({
|
|
|
3042
3007
|
}
|
|
3043
3008
|
}));
|
|
3044
3009
|
const App = (props) => {
|
|
3045
|
-
const { classes } = useStyles$
|
|
3010
|
+
const { classes } = useStyles$2(props);
|
|
3046
3011
|
const account = useAccount(props.account, props.accounts, props.onAccountChange);
|
|
3047
3012
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
3048
3013
|
core.AppShell,
|
|
@@ -3050,7 +3015,7 @@ const App = (props) => {
|
|
|
3050
3015
|
padding: "xs",
|
|
3051
3016
|
navbar: props.navbar && /* @__PURE__ */ React__namespace.createElement(
|
|
3052
3017
|
Navbar,
|
|
3053
|
-
__spreadProps$
|
|
3018
|
+
__spreadProps$3(__spreadValues$4({}, props.navbar.props), {
|
|
3054
3019
|
onSwitchAccounts: account.accounts && account.accounts.length > 1 ? () => account.setChangeModalOpen(true) : void 0
|
|
3055
3020
|
})
|
|
3056
3021
|
),
|
|
@@ -3157,10 +3122,10 @@ function Table$3(props) {
|
|
|
3157
3122
|
}
|
|
3158
3123
|
|
|
3159
3124
|
const Pathways = (props) => {
|
|
3160
|
-
return /* @__PURE__ */ React__namespace.createElement("div", { className: "
|
|
3125
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "space-y-1" }, /* @__PURE__ */ React__namespace.createElement("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Pathways"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Explore all your unique pathway requirements in one clear space")), /* @__PURE__ */ React__namespace.createElement(Table$3, { loading: props.loading, items: props.pathways }));
|
|
3161
3126
|
};
|
|
3162
3127
|
|
|
3163
|
-
const useStyles$
|
|
3128
|
+
const useStyles$1 = core.createStyles((theme) => ({
|
|
3164
3129
|
button: {
|
|
3165
3130
|
borderTopRightRadius: 0,
|
|
3166
3131
|
borderBottomRightRadius: 0,
|
|
@@ -3175,7 +3140,7 @@ const useStyles$3 = core.createStyles((theme) => ({
|
|
|
3175
3140
|
}
|
|
3176
3141
|
}));
|
|
3177
3142
|
const SplitButton$1 = (props) => {
|
|
3178
|
-
const { classes, theme } = useStyles$
|
|
3143
|
+
const { classes, theme } = useStyles$1();
|
|
3179
3144
|
theme.colors[theme.primaryColor][theme.colorScheme === "dark" ? 5 : 6];
|
|
3180
3145
|
return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
3181
3146
|
core.Button,
|
|
@@ -3211,25 +3176,25 @@ function Stack$1(props) {
|
|
|
3211
3176
|
return /* @__PURE__ */ React__namespace.createElement(core.Grid, { grow: true, gutter: "lg", sx: { padding: 20, minWidth: 700 } }, rows);
|
|
3212
3177
|
}
|
|
3213
3178
|
|
|
3214
|
-
var __defProp$
|
|
3215
|
-
var __getOwnPropSymbols$
|
|
3216
|
-
var __hasOwnProp$
|
|
3217
|
-
var __propIsEnum$
|
|
3218
|
-
var __defNormalProp$
|
|
3219
|
-
var __spreadValues$
|
|
3179
|
+
var __defProp$3 = Object.defineProperty;
|
|
3180
|
+
var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
|
|
3181
|
+
var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
|
|
3182
|
+
var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
|
|
3183
|
+
var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3184
|
+
var __spreadValues$3 = (a, b) => {
|
|
3220
3185
|
for (var prop in b || (b = {}))
|
|
3221
|
-
if (__hasOwnProp$
|
|
3222
|
-
__defNormalProp$
|
|
3223
|
-
if (__getOwnPropSymbols$
|
|
3224
|
-
for (var prop of __getOwnPropSymbols$
|
|
3225
|
-
if (__propIsEnum$
|
|
3226
|
-
__defNormalProp$
|
|
3186
|
+
if (__hasOwnProp$3.call(b, prop))
|
|
3187
|
+
__defNormalProp$3(a, prop, b[prop]);
|
|
3188
|
+
if (__getOwnPropSymbols$3)
|
|
3189
|
+
for (var prop of __getOwnPropSymbols$3(b)) {
|
|
3190
|
+
if (__propIsEnum$3.call(b, prop))
|
|
3191
|
+
__defNormalProp$3(a, prop, b[prop]);
|
|
3227
3192
|
}
|
|
3228
3193
|
return a;
|
|
3229
3194
|
};
|
|
3230
3195
|
function Table$2(props) {
|
|
3231
3196
|
const preparedItems = React__namespace.useMemo(() => {
|
|
3232
|
-
return (props.items || []).map((item) => __spreadValues$
|
|
3197
|
+
return (props.items || []).map((item) => __spreadValues$3(__spreadValues$3({}, item), item.categoryPoints));
|
|
3233
3198
|
}, [props.items]);
|
|
3234
3199
|
const { items: sortedItems, requestSort, sortConfig } = useSortableData(preparedItems);
|
|
3235
3200
|
if (props.loading && props.items.length === 0) {
|
|
@@ -3361,7 +3326,7 @@ function Table$1(props) {
|
|
|
3361
3326
|
));
|
|
3362
3327
|
}
|
|
3363
3328
|
|
|
3364
|
-
const useStyles
|
|
3329
|
+
const useStyles = core.createStyles((theme) => ({
|
|
3365
3330
|
title: {
|
|
3366
3331
|
fontSize: 34,
|
|
3367
3332
|
fontWeight: 900,
|
|
@@ -3374,12 +3339,12 @@ const useStyles$2 = core.createStyles((theme) => ({
|
|
|
3374
3339
|
}
|
|
3375
3340
|
}));
|
|
3376
3341
|
const Pathway = (props) => {
|
|
3377
|
-
const { classes } = useStyles
|
|
3342
|
+
const { classes } = useStyles();
|
|
3378
3343
|
const [tab, setTab] = React.useState("badges");
|
|
3379
3344
|
const numberOfStudents = props.students.length;
|
|
3380
3345
|
numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length / numberOfStudents : 0;
|
|
3381
3346
|
const numberOfBadgesEarned = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
|
|
3382
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Container, {
|
|
3347
|
+
return /* @__PURE__ */ React__namespace.createElement(core.Container, { fluid: true, py: "xl" }, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "md" }, /* @__PURE__ */ React__namespace.createElement(core.Grid, null, /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "auto" }, /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { onClick: props.onBackClick }, /* @__PURE__ */ React__namespace.createElement(
|
|
3383
3348
|
core.Badge,
|
|
3384
3349
|
{
|
|
3385
3350
|
variant: "filled",
|
|
@@ -3441,82 +3406,84 @@ const Pathway = (props) => {
|
|
|
3441
3406
|
)))))));
|
|
3442
3407
|
};
|
|
3443
3408
|
|
|
3444
|
-
const useStyles$1 = core.createStyles((theme) => ({
|
|
3445
|
-
button: {
|
|
3446
|
-
borderTopRightRadius: 0,
|
|
3447
|
-
borderBottomRightRadius: 0,
|
|
3448
|
-
marginLeft: 0,
|
|
3449
|
-
marginRight: 0
|
|
3450
|
-
},
|
|
3451
|
-
menuControl: {
|
|
3452
|
-
borderTopLeftRadius: 0,
|
|
3453
|
-
borderBottomLeftRadius: 0,
|
|
3454
|
-
border: 0,
|
|
3455
|
-
borderLeft: `1px solid ${theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.white}`
|
|
3456
|
-
}
|
|
3457
|
-
}));
|
|
3458
3409
|
const SplitButton = (props) => {
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
3462
|
-
core.Button,
|
|
3410
|
+
return /* @__PURE__ */ React__namespace.createElement(
|
|
3411
|
+
"button",
|
|
3463
3412
|
{
|
|
3464
|
-
|
|
3465
|
-
|
|
3413
|
+
onClick: props.onExportDataClick,
|
|
3414
|
+
className: "flex items-center gap-2 rounded-xl bg-gradient-to-r from-gold-400 to-[#f5c300] px-4 py-2.5 text-xs font-extrabold text-dark-blue-400"
|
|
3466
3415
|
},
|
|
3416
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconTableExport, { size: 14, stroke: 2 }),
|
|
3467
3417
|
"Export data (.csv)"
|
|
3468
|
-
)
|
|
3418
|
+
);
|
|
3469
3419
|
};
|
|
3470
3420
|
|
|
3471
3421
|
function Stack(props) {
|
|
3472
|
-
const { items, hideBadge, hideLesson } = props;
|
|
3422
|
+
const { items, hideBadge, hideLesson, hidePathway } = props;
|
|
3473
3423
|
if (!items.length)
|
|
3474
3424
|
return null;
|
|
3475
|
-
const
|
|
3476
|
-
|
|
3477
|
-
!
|
|
3478
|
-
!hideLesson,
|
|
3479
|
-
|
|
3480
|
-
|
|
3481
|
-
|
|
3482
|
-
|
|
3483
|
-
|
|
3484
|
-
|
|
3485
|
-
|
|
3486
|
-
|
|
3487
|
-
|
|
3488
|
-
|
|
3489
|
-
|
|
3490
|
-
|
|
3491
|
-
|
|
3492
|
-
|
|
3493
|
-
|
|
3425
|
+
const columns = [
|
|
3426
|
+
"minmax(0,2fr)",
|
|
3427
|
+
!hidePathway && "minmax(0,1.3fr)",
|
|
3428
|
+
!hideLesson && "minmax(0,1.3fr)",
|
|
3429
|
+
!hideBadge && "minmax(0,1.3fr)",
|
|
3430
|
+
"auto"
|
|
3431
|
+
].filter(Boolean).join(" ");
|
|
3432
|
+
const headerCell = "border-b border-slate-100 pb-2 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400";
|
|
3433
|
+
const dataCell = "py-3";
|
|
3434
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "grid items-center gap-x-3", style: { gridTemplateColumns: columns } }, /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }, "Question"), !hidePathway && /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }, "Pathway"), !hideLesson && /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }, "Lesson"), !hideBadge && /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }, "Badge"), /* @__PURE__ */ React__namespace.createElement("div", { className: headerCell }), items.map((row, i) => {
|
|
3435
|
+
const rowBorder = i > 0 ? "border-t border-slate-100" : "";
|
|
3436
|
+
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, { key: i }, /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} text-xs font-semibold text-dark-blue-400` }, row.question), !hidePathway && /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.pathwayName || "\u2014"), !hideLesson && /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.lessonName), !hideBadge && /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} truncate text-[11px] text-slate-500` }, row.badgeName), /* @__PURE__ */ React__namespace.createElement("div", { className: `${dataCell} ${rowBorder} flex shrink-0 gap-2` }, /* @__PURE__ */ React__namespace.createElement(
|
|
3437
|
+
"a",
|
|
3438
|
+
{
|
|
3439
|
+
href: row.link,
|
|
3440
|
+
target: "_blank",
|
|
3441
|
+
rel: "noopener noreferrer",
|
|
3442
|
+
className: "flex items-center gap-1 rounded-md border border-slate-200 px-2.5 py-1.5 text-[11px] font-bold text-slate-600 no-underline hover:bg-slate-50"
|
|
3443
|
+
},
|
|
3444
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconExternalLink, { size: 12, stroke: 2 }),
|
|
3445
|
+
"Preview"
|
|
3446
|
+
), /* @__PURE__ */ React__namespace.createElement(
|
|
3447
|
+
"a",
|
|
3448
|
+
{
|
|
3449
|
+
href: row.link,
|
|
3450
|
+
download: true,
|
|
3451
|
+
target: "_blank",
|
|
3452
|
+
rel: "noopener noreferrer",
|
|
3453
|
+
className: "flex items-center gap-1 rounded-md border border-slate-200 px-2.5 py-1.5 text-[11px] font-bold text-slate-600 no-underline hover:bg-slate-50"
|
|
3454
|
+
},
|
|
3455
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconDownload, { size: 12, stroke: 2 }),
|
|
3456
|
+
"Download"
|
|
3457
|
+
)));
|
|
3458
|
+
}));
|
|
3494
3459
|
}
|
|
3495
3460
|
|
|
3496
|
-
var __defProp$
|
|
3497
|
-
var __defProps$
|
|
3498
|
-
var __getOwnPropDescs$
|
|
3499
|
-
var __getOwnPropSymbols$
|
|
3500
|
-
var __hasOwnProp$
|
|
3501
|
-
var __propIsEnum$
|
|
3502
|
-
var __defNormalProp$
|
|
3503
|
-
var __spreadValues$
|
|
3461
|
+
var __defProp$2 = Object.defineProperty;
|
|
3462
|
+
var __defProps$2 = Object.defineProperties;
|
|
3463
|
+
var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
|
|
3464
|
+
var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
|
|
3465
|
+
var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
|
|
3466
|
+
var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
|
|
3467
|
+
var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3468
|
+
var __spreadValues$2 = (a, b) => {
|
|
3504
3469
|
for (var prop in b || (b = {}))
|
|
3505
|
-
if (__hasOwnProp$
|
|
3506
|
-
__defNormalProp$
|
|
3507
|
-
if (__getOwnPropSymbols$
|
|
3508
|
-
for (var prop of __getOwnPropSymbols$
|
|
3509
|
-
if (__propIsEnum$
|
|
3510
|
-
__defNormalProp$
|
|
3470
|
+
if (__hasOwnProp$2.call(b, prop))
|
|
3471
|
+
__defNormalProp$2(a, prop, b[prop]);
|
|
3472
|
+
if (__getOwnPropSymbols$2)
|
|
3473
|
+
for (var prop of __getOwnPropSymbols$2(b)) {
|
|
3474
|
+
if (__propIsEnum$2.call(b, prop))
|
|
3475
|
+
__defNormalProp$2(a, prop, b[prop]);
|
|
3511
3476
|
}
|
|
3512
3477
|
return a;
|
|
3513
3478
|
};
|
|
3514
|
-
var __spreadProps$
|
|
3479
|
+
var __spreadProps$2 = (a, b) => __defProps$2(a, __getOwnPropDescs$2(b));
|
|
3480
|
+
const initials$1 = (name) => name.split(" ").map((w) => w[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
|
|
3515
3481
|
function Table(props) {
|
|
3482
|
+
const [expanded, setExpanded] = React__namespace.useState({});
|
|
3516
3483
|
const preparedItems = React__namespace.useMemo(() => {
|
|
3517
3484
|
return props.items.map((item) => {
|
|
3518
3485
|
var _a;
|
|
3519
|
-
return __spreadProps$
|
|
3486
|
+
return __spreadProps$2(__spreadValues$2({}, item), {
|
|
3520
3487
|
submissionCount: ((_a = item.submissions) == null ? void 0 : _a.length) || 0
|
|
3521
3488
|
});
|
|
3522
3489
|
});
|
|
@@ -3533,76 +3500,82 @@ function Table(props) {
|
|
|
3533
3500
|
}
|
|
3534
3501
|
);
|
|
3535
3502
|
}
|
|
3536
|
-
const
|
|
3537
|
-
|
|
3538
|
-
|
|
3539
|
-
|
|
3540
|
-
|
|
3541
|
-
|
|
3503
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
3504
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 px-4 text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("name"), className: "flex-1 text-left hover:text-slate-600" }, "Student Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("submissionCount"), className: "w-16 shrink-0 text-left hover:text-slate-600" }, "Files", indicator("submissionCount")), props.onReview && /* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0" }), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
|
|
3505
|
+
const isOpen = !!expanded[row.userId];
|
|
3506
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
3507
|
+
"div",
|
|
3508
|
+
{
|
|
3509
|
+
onClick: () => setExpanded(__spreadProps$2(__spreadValues$2({}, expanded), { [row.userId]: !isOpen })),
|
|
3510
|
+
className: "flex cursor-pointer items-center gap-4 p-4"
|
|
3511
|
+
},
|
|
3512
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "flex min-w-0 flex-1 items-center gap-3" }, row.avatar ? /* @__PURE__ */ React__namespace.createElement("img", { src: row.avatar, className: "h-9 w-9 shrink-0 rounded-full object-cover", alt: "" }) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-mint-400 to-dark-blue-400 text-xs font-bold text-white" }, initials$1(row.name)), /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-sm font-bold text-dark-blue-400" }, row.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs text-slate-400" }, row.email))),
|
|
3513
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-16 shrink-0 text-sm font-bold text-dark-blue-400" }, row.submissions.length),
|
|
3514
|
+
props.onReview && /* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0" }, /* @__PURE__ */ React__namespace.createElement(
|
|
3515
|
+
"button",
|
|
3516
|
+
{
|
|
3517
|
+
onClick: (e) => {
|
|
3518
|
+
e.stopPropagation();
|
|
3519
|
+
props.onReview(row);
|
|
3520
|
+
},
|
|
3521
|
+
className: "rounded-lg bg-gradient-to-r from-gold-400 to-[#f5c300] px-3 py-1.5 text-[11px] font-extrabold text-dark-blue-400"
|
|
3522
|
+
},
|
|
3523
|
+
"Review Submission"
|
|
3524
|
+
)),
|
|
3525
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 16, stroke: 2, className: `w-4 shrink-0 text-slate-300 transition-transform ${isOpen ? "rotate-90" : ""}` })
|
|
3526
|
+
), isOpen && /* @__PURE__ */ React__namespace.createElement("div", { className: "border-t border-slate-100 px-4 py-3" }, /* @__PURE__ */ React__namespace.createElement(Stack, { items: row.submissions, hideBadge: props.hideBadge, hideLesson: props.hideLesson, hidePathway: props.hidePathway })));
|
|
3527
|
+
}));
|
|
3528
|
+
}
|
|
3529
|
+
|
|
3530
|
+
const initials = (name) => name.split(" ").map((w) => w[0]).filter(Boolean).slice(0, 2).join("").toUpperCase();
|
|
3531
|
+
function SubmissionDetail(props) {
|
|
3532
|
+
const { student } = props;
|
|
3533
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-full flex-col gap-4 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-2 text-xs text-slate-400" }, /* @__PURE__ */ React__namespace.createElement("button", { onClick: props.onBack, className: "font-bold text-sky-blue-400 hover:underline" }, "File Locker"), /* @__PURE__ */ React__namespace.createElement("span", null, "/"), /* @__PURE__ */ React__namespace.createElement("span", { className: "font-bold text-dark-blue-400" }, student.name)), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-center gap-4 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm" }, student.avatar ? /* @__PURE__ */ React__namespace.createElement("img", { src: student.avatar, className: "h-12 w-12 shrink-0 rounded-full object-cover", alt: "" }) : /* @__PURE__ */ React__namespace.createElement("div", { className: "flex h-12 w-12 shrink-0 items-center justify-center rounded-full bg-gradient-to-br from-mint-400 to-dark-blue-400 text-sm font-bold text-white" }, initials(student.name)), /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-lg font-extrabold text-dark-blue-400" }, student.name), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-0.5 text-xs text-slate-400" }, student.email, props.context ? ` \xB7 ${props.context}` : "")), /* @__PURE__ */ React__namespace.createElement("div", { className: "shrink-0 rounded-full bg-slate-100 px-3 py-1 text-xs font-bold text-slate-500" }, student.submissions.length, " file", student.submissions.length === 1 ? "" : "s")), /* @__PURE__ */ React__namespace.createElement("div", { className: "rounded-2xl border border-slate-200 bg-white p-5 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-extrabold text-dark-blue-400" }, "Files"), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-2" }, /* @__PURE__ */ React__namespace.createElement(Stack, { items: student.submissions }))), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-3" }, /* @__PURE__ */ React__namespace.createElement(
|
|
3534
|
+
"button",
|
|
3542
3535
|
{
|
|
3543
|
-
|
|
3544
|
-
|
|
3545
|
-
|
|
3546
|
-
|
|
3547
|
-
|
|
3548
|
-
|
|
3549
|
-
|
|
3550
|
-
|
|
3551
|
-
|
|
3552
|
-
|
|
3553
|
-
|
|
3554
|
-
|
|
3555
|
-
|
|
3556
|
-
|
|
3557
|
-
sortable: true,
|
|
3558
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.Group, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(core.Avatar, { size: 40, src: row.avatar, radius: 40 }), /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm", weight: 500 }, row.name), /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "xs", color: "dimmed" }, row.email)))
|
|
3559
|
-
}, {
|
|
3560
|
-
accessor: "submissionCount",
|
|
3561
|
-
title: "Files",
|
|
3562
|
-
sortable: true,
|
|
3563
|
-
render: (row) => row.submissions.length
|
|
3564
|
-
}],
|
|
3565
|
-
rowExpansion: {
|
|
3566
|
-
content: ({ record }) => /* @__PURE__ */ React__namespace.createElement(
|
|
3567
|
-
Stack,
|
|
3568
|
-
{
|
|
3569
|
-
items: record.submissions,
|
|
3570
|
-
hideBadge: props.hideBadge,
|
|
3571
|
-
hideLesson: props.hideLesson
|
|
3572
|
-
}
|
|
3573
|
-
)
|
|
3574
|
-
}
|
|
3575
|
-
}
|
|
3576
|
-
));
|
|
3536
|
+
onClick: () => props.onNav(-1),
|
|
3537
|
+
className: "flex flex-1 items-center justify-center gap-1.5 rounded-xl border border-slate-200 bg-white py-2.5 text-xs font-bold text-slate-600 hover:bg-slate-50"
|
|
3538
|
+
},
|
|
3539
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronLeft, { size: 14, stroke: 2 }),
|
|
3540
|
+
"Previous Submission"
|
|
3541
|
+
), /* @__PURE__ */ React__namespace.createElement(
|
|
3542
|
+
"button",
|
|
3543
|
+
{
|
|
3544
|
+
onClick: () => props.onNav(1),
|
|
3545
|
+
className: "flex flex-1 items-center justify-center gap-1.5 rounded-xl border border-slate-200 bg-white py-2.5 text-xs font-bold text-slate-600 hover:bg-slate-50"
|
|
3546
|
+
},
|
|
3547
|
+
"Next Submission",
|
|
3548
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 14, stroke: 2 })
|
|
3549
|
+
)));
|
|
3577
3550
|
}
|
|
3578
3551
|
|
|
3579
|
-
var __defProp = Object.defineProperty;
|
|
3580
|
-
var __defProps = Object.defineProperties;
|
|
3581
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
3582
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3583
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
3584
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
3585
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3586
|
-
var __spreadValues = (a, b) => {
|
|
3552
|
+
var __defProp$1 = Object.defineProperty;
|
|
3553
|
+
var __defProps$1 = Object.defineProperties;
|
|
3554
|
+
var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
|
|
3555
|
+
var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
|
|
3556
|
+
var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
|
|
3557
|
+
var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
|
|
3558
|
+
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3559
|
+
var __spreadValues$1 = (a, b) => {
|
|
3587
3560
|
for (var prop in b || (b = {}))
|
|
3588
|
-
if (__hasOwnProp.call(b, prop))
|
|
3589
|
-
__defNormalProp(a, prop, b[prop]);
|
|
3590
|
-
if (__getOwnPropSymbols)
|
|
3591
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
3592
|
-
if (__propIsEnum.call(b, prop))
|
|
3593
|
-
__defNormalProp(a, prop, b[prop]);
|
|
3561
|
+
if (__hasOwnProp$1.call(b, prop))
|
|
3562
|
+
__defNormalProp$1(a, prop, b[prop]);
|
|
3563
|
+
if (__getOwnPropSymbols$1)
|
|
3564
|
+
for (var prop of __getOwnPropSymbols$1(b)) {
|
|
3565
|
+
if (__propIsEnum$1.call(b, prop))
|
|
3566
|
+
__defNormalProp$1(a, prop, b[prop]);
|
|
3594
3567
|
}
|
|
3595
3568
|
return a;
|
|
3596
3569
|
};
|
|
3597
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
3570
|
+
var __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));
|
|
3598
3571
|
const useFilteredStudents = (students) => {
|
|
3599
3572
|
return React__namespace.useMemo(() => {
|
|
3600
|
-
const byBadge = (badgeId) => students.map((s) => __spreadProps(__spreadValues({}, s), {
|
|
3573
|
+
const byBadge = (badgeId) => students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
|
|
3601
3574
|
submissions: (s.submissions || []).filter(
|
|
3602
3575
|
(sub) => sub.badgeId === badgeId
|
|
3603
3576
|
)
|
|
3604
3577
|
})).filter((s) => s.submissions.length);
|
|
3605
|
-
const byLesson = (lessonName) => students.map((s) => __spreadProps(__spreadValues({}, s), {
|
|
3578
|
+
const byLesson = (lessonName) => students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
|
|
3606
3579
|
submissions: (s.submissions || []).filter(
|
|
3607
3580
|
(sub) => sub.lessonName === lessonName
|
|
3608
3581
|
)
|
|
@@ -3613,7 +3586,7 @@ const useFilteredStudents = (students) => {
|
|
|
3613
3586
|
(c) => c.startsWith(pathwayId)
|
|
3614
3587
|
)
|
|
3615
3588
|
).map((b) => b.badgeId);
|
|
3616
|
-
return students.map((s) => __spreadProps(__spreadValues({}, s), {
|
|
3589
|
+
return students.map((s) => __spreadProps$1(__spreadValues$1({}, s), {
|
|
3617
3590
|
submissions: (s.submissions || []).filter(
|
|
3618
3591
|
(sub) => validBadgeIds.includes(sub.badgeId)
|
|
3619
3592
|
)
|
|
@@ -3623,167 +3596,166 @@ const useFilteredStudents = (students) => {
|
|
|
3623
3596
|
}, [students]);
|
|
3624
3597
|
};
|
|
3625
3598
|
|
|
3626
|
-
|
|
3627
|
-
|
|
3628
|
-
|
|
3629
|
-
|
|
3630
|
-
|
|
3631
|
-
|
|
3599
|
+
var __defProp = Object.defineProperty;
|
|
3600
|
+
var __defProps = Object.defineProperties;
|
|
3601
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
3602
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3603
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
3604
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
3605
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3606
|
+
var __spreadValues = (a, b) => {
|
|
3607
|
+
for (var prop in b || (b = {}))
|
|
3608
|
+
if (__hasOwnProp.call(b, prop))
|
|
3609
|
+
__defNormalProp(a, prop, b[prop]);
|
|
3610
|
+
if (__getOwnPropSymbols)
|
|
3611
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
3612
|
+
if (__propIsEnum.call(b, prop))
|
|
3613
|
+
__defNormalProp(a, prop, b[prop]);
|
|
3632
3614
|
}
|
|
3633
|
-
|
|
3634
|
-
|
|
3635
|
-
|
|
3636
|
-
|
|
3637
|
-
}
|
|
3638
|
-
|
|
3639
|
-
|
|
3640
|
-
|
|
3641
|
-
|
|
3642
|
-
|
|
3643
|
-
|
|
3644
|
-
return
|
|
3645
|
-
|
|
3646
|
-
|
|
3647
|
-
|
|
3648
|
-
|
|
3649
|
-
|
|
3650
|
-
|
|
3651
|
-
|
|
3652
|
-
|
|
3653
|
-
|
|
3654
|
-
)));
|
|
3615
|
+
return a;
|
|
3616
|
+
};
|
|
3617
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
3618
|
+
const TABS = [
|
|
3619
|
+
{ value: "students", label: "By student" },
|
|
3620
|
+
{ value: "pathways", label: "By pathway" },
|
|
3621
|
+
{ value: "badges", label: "By badge" },
|
|
3622
|
+
{ value: "lessons", label: "By lesson" }
|
|
3623
|
+
];
|
|
3624
|
+
const countFiles = (students) => students.reduce((acc, s) => {
|
|
3625
|
+
var _a;
|
|
3626
|
+
return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
|
|
3627
|
+
}, 0);
|
|
3628
|
+
const GroupCard = (props) => {
|
|
3629
|
+
const [open, setOpen] = React__namespace.useState(false);
|
|
3630
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { onClick: () => setOpen(!open), className: "flex cursor-pointer items-center gap-3.5 p-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-extrabold text-dark-blue-400" }, props.title), props.description && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs leading-relaxed text-slate-500" }, props.description)), /* @__PURE__ */ React__namespace.createElement("div", { className: "shrink-0 rounded-full bg-mint-100 px-2.5 py-1 text-xs font-bold text-dark-blue-400" }, props.count), /* @__PURE__ */ React__namespace.createElement(icons.IconChevronDown, { size: 15, stroke: 2.3, className: `shrink-0 text-slate-400 transition-transform ${open ? "rotate-180" : ""}` })), open && /* @__PURE__ */ React__namespace.createElement("div", { className: "border-t border-slate-100 p-4" }, props.children));
|
|
3631
|
+
};
|
|
3632
|
+
const PathwayGroups = (props) => {
|
|
3633
|
+
const { byPathway } = useFilteredStudents(props.students);
|
|
3634
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.pathways.map((p) => {
|
|
3635
|
+
const filtered = byPathway(p.pathwayId, props.badges);
|
|
3636
|
+
return /* @__PURE__ */ React__namespace.createElement(GroupCard, { key: p.pathwayId, title: p.title, description: p.description, count: countFiles(filtered) }, /* @__PURE__ */ React__namespace.createElement(Table, { loading: props.loading, items: filtered, hidePathway: true, onReview: (item) => props.onReview(item, filtered, p.title) }));
|
|
3655
3637
|
}));
|
|
3656
3638
|
};
|
|
3657
|
-
const
|
|
3658
|
-
const {
|
|
3659
|
-
|
|
3660
|
-
|
|
3661
|
-
|
|
3662
|
-
|
|
3663
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Accordion, null, lessons.map((l) => {
|
|
3664
|
-
const studentsForLesson = byLesson(l.lessonName);
|
|
3665
|
-
const fileCount = countFiles(studentsForLesson);
|
|
3666
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Accordion.Item, { key: l.lessonId, value: l.lessonId }, /* @__PURE__ */ React__namespace.createElement(core.Accordion.Control, null, /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "apart", w: "100%" }, /* @__PURE__ */ React__namespace.createElement(core.Text, null, l.lessonName), /* @__PURE__ */ React__namespace.createElement(core.Badge, { size: "sm" }, fileCount))), /* @__PURE__ */ React__namespace.createElement(core.Accordion.Panel, null, /* @__PURE__ */ React__namespace.createElement(
|
|
3667
|
-
Table,
|
|
3668
|
-
{
|
|
3669
|
-
loading,
|
|
3670
|
-
items: studentsForLesson,
|
|
3671
|
-
hideLesson: true
|
|
3672
|
-
}
|
|
3673
|
-
)));
|
|
3639
|
+
const BadgeGroups = (props) => {
|
|
3640
|
+
const { byBadge } = useFilteredStudents(props.students);
|
|
3641
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.badges.map((b) => {
|
|
3642
|
+
const filtered = byBadge(b.badgeId);
|
|
3643
|
+
const pathwayTitle = props.pathwayNameForBadge[b.badgeId];
|
|
3644
|
+
return /* @__PURE__ */ React__namespace.createElement(GroupCard, { key: b.badgeId, title: b.displayName, description: pathwayTitle ? `${pathwayTitle} pathway` : void 0, count: countFiles(filtered) }, /* @__PURE__ */ React__namespace.createElement(Table, { loading: props.loading, items: filtered, hideBadge: true, hidePathway: true, onReview: (item) => props.onReview(item, filtered, b.displayName) }));
|
|
3674
3645
|
}));
|
|
3675
3646
|
};
|
|
3676
|
-
const
|
|
3677
|
-
|
|
3678
|
-
|
|
3679
|
-
|
|
3680
|
-
|
|
3681
|
-
|
|
3682
|
-
|
|
3683
|
-
|
|
3684
|
-
var _a;
|
|
3685
|
-
return acc + (((_a = s.submissions) == null ? void 0 : _a.length) || 0);
|
|
3686
|
-
}, 0);
|
|
3687
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Accordion, null, pathways.map((p) => {
|
|
3688
|
-
const studentsForPathway = byPathway(p.pathwayId, badges);
|
|
3689
|
-
const fileCount = countFiles(studentsForPathway);
|
|
3690
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Accordion.Item, { key: p.pathwayId, value: p.pathwayId }, /* @__PURE__ */ React__namespace.createElement(core.Accordion.Control, null, /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "apart", w: "100%" }, /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("strong", null, p.title), /* @__PURE__ */ React__namespace.createElement("div", null, p.description)), /* @__PURE__ */ React__namespace.createElement(core.Badge, { size: "sm" }, fileCount))), /* @__PURE__ */ React__namespace.createElement(core.Accordion.Panel, null, /* @__PURE__ */ React__namespace.createElement(
|
|
3691
|
-
Table,
|
|
3692
|
-
{
|
|
3693
|
-
loading,
|
|
3694
|
-
items: studentsForPathway
|
|
3695
|
-
}
|
|
3696
|
-
)));
|
|
3647
|
+
const LessonGroups = (props) => {
|
|
3648
|
+
const { byLesson } = useFilteredStudents(props.students);
|
|
3649
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.lessons.map((l) => {
|
|
3650
|
+
const filtered = byLesson(l.lessonName);
|
|
3651
|
+
const badge = props.badgeForLesson[l.lessonId];
|
|
3652
|
+
const pathwayTitle = badge ? props.pathwayNameForBadge[badge.badgeId] : void 0;
|
|
3653
|
+
const description = badge ? pathwayTitle ? `${badge.displayName} \xB7 ${pathwayTitle} pathway` : badge.displayName : void 0;
|
|
3654
|
+
return /* @__PURE__ */ React__namespace.createElement(GroupCard, { key: l.lessonId, title: l.lessonName, description, count: countFiles(filtered) }, /* @__PURE__ */ React__namespace.createElement(Table, { loading: props.loading, items: filtered, hideBadge: true, hideLesson: true, hidePathway: true, onReview: (item) => props.onReview(item, filtered, l.lessonName) }));
|
|
3697
3655
|
}));
|
|
3698
3656
|
};
|
|
3699
3657
|
const FileLocker = (props) => {
|
|
3700
|
-
const
|
|
3701
|
-
const [
|
|
3702
|
-
props.students
|
|
3703
|
-
const
|
|
3704
|
-
|
|
3705
|
-
|
|
3706
|
-
|
|
3707
|
-
|
|
3708
|
-
|
|
3709
|
-
|
|
3710
|
-
|
|
3711
|
-
|
|
3712
|
-
|
|
3713
|
-
|
|
3714
|
-
|
|
3715
|
-
|
|
3716
|
-
|
|
3717
|
-
|
|
3718
|
-
|
|
3719
|
-
|
|
3720
|
-
|
|
3721
|
-
|
|
3722
|
-
|
|
3723
|
-
|
|
3724
|
-
|
|
3725
|
-
|
|
3726
|
-
|
|
3727
|
-
|
|
3728
|
-
|
|
3729
|
-
|
|
3730
|
-
|
|
3731
|
-
|
|
3732
|
-
|
|
3658
|
+
const [tab, setTab] = React__namespace.useState("students");
|
|
3659
|
+
const [reviewing, setReviewing] = React__namespace.useState(null);
|
|
3660
|
+
const numberOfFiles = countFiles(props.students);
|
|
3661
|
+
const { thisWeek, thisMonth } = React__namespace.useMemo(() => {
|
|
3662
|
+
const now = new Date();
|
|
3663
|
+
const weekAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1e3);
|
|
3664
|
+
const fom = new Date(now.getFullYear(), now.getMonth(), 1);
|
|
3665
|
+
let week = 0, month = 0;
|
|
3666
|
+
props.students.forEach((s) => {
|
|
3667
|
+
(s.submissions || []).forEach((sub) => {
|
|
3668
|
+
if (!sub.updatedAt)
|
|
3669
|
+
return;
|
|
3670
|
+
const d = new Date(sub.updatedAt);
|
|
3671
|
+
if (d >= weekAgo)
|
|
3672
|
+
week += 1;
|
|
3673
|
+
if (d >= fom)
|
|
3674
|
+
month += 1;
|
|
3675
|
+
});
|
|
3676
|
+
});
|
|
3677
|
+
return { thisWeek: week, thisMonth: month };
|
|
3678
|
+
}, [props.students]);
|
|
3679
|
+
const pathwayNameForBadge = React__namespace.useMemo(() => {
|
|
3680
|
+
const map = {};
|
|
3681
|
+
(props.badges || []).forEach((b) => {
|
|
3682
|
+
if (!Array.isArray(b.categories))
|
|
3683
|
+
return;
|
|
3684
|
+
const pathway = (props.pathways || []).find((p) => b.categories.some((c) => c.startsWith(p.pathwayId)));
|
|
3685
|
+
if (pathway)
|
|
3686
|
+
map[b.badgeId] = pathway.title;
|
|
3687
|
+
});
|
|
3688
|
+
return map;
|
|
3689
|
+
}, [props.badges, props.pathways]);
|
|
3690
|
+
const badgeForLesson = React__namespace.useMemo(() => {
|
|
3691
|
+
const map = {};
|
|
3692
|
+
(props.badges || []).forEach((b) => {
|
|
3693
|
+
if (!Array.isArray(b.lessonIds))
|
|
3694
|
+
return;
|
|
3695
|
+
b.lessonIds.forEach((lessonId) => {
|
|
3696
|
+
if (!(lessonId in map))
|
|
3697
|
+
map[lessonId] = { displayName: b.displayName, badgeId: b.badgeId };
|
|
3698
|
+
});
|
|
3699
|
+
});
|
|
3700
|
+
return map;
|
|
3701
|
+
}, [props.badges]);
|
|
3702
|
+
const enrichedStudents = React__namespace.useMemo(() => {
|
|
3703
|
+
return props.students.map((s) => __spreadProps(__spreadValues({}, s), {
|
|
3704
|
+
submissions: (s.submissions || []).map((sub) => __spreadProps(__spreadValues({}, sub), { pathwayName: pathwayNameForBadge[sub.badgeId] || "" }))
|
|
3705
|
+
}));
|
|
3706
|
+
}, [props.students, pathwayNameForBadge]);
|
|
3707
|
+
const { byPathway } = useFilteredStudents(enrichedStudents);
|
|
3708
|
+
const mostActivePathway = React__namespace.useMemo(() => {
|
|
3709
|
+
return (props.pathways || []).reduce((best, p) => {
|
|
3710
|
+
const count = countFiles(byPathway(p.pathwayId, props.badges || []));
|
|
3711
|
+
return count > 0 && (!best || count > best.count) ? { title: p.title, count } : best;
|
|
3712
|
+
}, null);
|
|
3713
|
+
}, [props.pathways, props.badges, byPathway]);
|
|
3714
|
+
const onReview = (item, list, context) => setReviewing({ student: item, list, context });
|
|
3715
|
+
const onNav = (dir) => {
|
|
3716
|
+
if (!reviewing)
|
|
3717
|
+
return;
|
|
3718
|
+
const idx = reviewing.list.findIndex((s) => s.userId === reviewing.student.userId);
|
|
3719
|
+
if (idx === -1)
|
|
3720
|
+
return;
|
|
3721
|
+
const next = reviewing.list[(idx + dir + reviewing.list.length) % reviewing.list.length];
|
|
3722
|
+
setReviewing(__spreadProps(__spreadValues({}, reviewing), { student: next }));
|
|
3723
|
+
};
|
|
3724
|
+
if (reviewing) {
|
|
3725
|
+
return /* @__PURE__ */ React__namespace.createElement(
|
|
3726
|
+
SubmissionDetail,
|
|
3727
|
+
{
|
|
3728
|
+
student: reviewing.student,
|
|
3729
|
+
context: reviewing.context,
|
|
3730
|
+
onBack: () => setReviewing(null),
|
|
3731
|
+
onNav
|
|
3732
|
+
}
|
|
3733
|
+
);
|
|
3734
|
+
}
|
|
3735
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-full flex-col gap-5 px-4 py-8" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start justify-between gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement("button", { onClick: props.onBackClick, className: "flex items-center gap-1 text-xs font-bold text-sky-blue-400 hover:underline" }, /* @__PURE__ */ React__namespace.createElement(icons.IconChevronLeft, { size: 13, stroke: 2.5 }), "Back"), /* @__PURE__ */ React__namespace.createElement("h1", { className: "mt-1.5 text-2xl font-extrabold tracking-tight text-dark-blue-400" }, props.displayName || "File Locker"), /* @__PURE__ */ React__namespace.createElement("p", { className: "mt-1 text-sm text-slate-500" }, props.description || "No description")), !props.trial && /* @__PURE__ */ React__namespace.createElement(SplitButton, { href: props.href, onCopyLinkClick: props.onCopyLinkClick, onExportDataClick: props.onExportDataClick })), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: props.trial ? [
|
|
3736
|
+
{ title: "LESSONS SUBMITTED", value: props.lessonsCompleted || 0 }
|
|
3737
|
+
] : [
|
|
3738
|
+
{ title: "FILES", value: numberOfFiles },
|
|
3739
|
+
{ title: "THIS WEEK", value: thisWeek },
|
|
3740
|
+
{ title: "THIS MONTH", value: thisMonth }
|
|
3741
|
+
] }), !props.trial && mostActivePathway && /* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs text-slate-500" }, "Most active pathway: ", /* @__PURE__ */ React__namespace.createElement("span", { className: "font-bold text-dark-blue-400" }, mostActivePathway.title), " (", mostActivePathway.count, " submission", mostActivePathway.count === 1 ? "" : "s", ")"), !props.trial && /* @__PURE__ */ React__namespace.createElement(
|
|
3742
|
+
"select",
|
|
3733
3743
|
{
|
|
3734
|
-
clearable: true,
|
|
3735
|
-
clearButtonLabel: "Clear class selection",
|
|
3736
|
-
size: "sm",
|
|
3737
|
-
placeholder: "Select a class",
|
|
3738
|
-
nothingFound: "No options",
|
|
3739
3744
|
value: props.classId,
|
|
3740
|
-
onChange: props.onClassChange,
|
|
3741
|
-
|
|
3742
|
-
|
|
3743
|
-
|
|
3744
|
-
|
|
3745
|
-
|
|
3746
|
-
|
|
3747
|
-
Tabs,
|
|
3748
|
-
{
|
|
3749
|
-
value: tab,
|
|
3750
|
-
data: [
|
|
3751
|
-
{ label: "By student", value: "students" },
|
|
3752
|
-
{ label: "By pathway", value: "pathways" },
|
|
3753
|
-
{ label: "By badge", value: "badges" },
|
|
3754
|
-
{ label: "By lesson", value: "lessons" }
|
|
3755
|
-
],
|
|
3756
|
-
onChange: setTab
|
|
3757
|
-
}
|
|
3758
|
-
), !props.trial && tab === "students" && /* @__PURE__ */ React__namespace.createElement(
|
|
3759
|
-
Table,
|
|
3760
|
-
{
|
|
3761
|
-
loading: props.loading,
|
|
3762
|
-
items: props.students
|
|
3763
|
-
}
|
|
3764
|
-
), tab === "pathways" && /* @__PURE__ */ React__namespace.createElement(
|
|
3765
|
-
PathwayTable,
|
|
3766
|
-
{
|
|
3767
|
-
pathways: props.pathways || [],
|
|
3768
|
-
badges: props.badges || [],
|
|
3769
|
-
students: props.students,
|
|
3770
|
-
loading: props.loading
|
|
3771
|
-
}
|
|
3772
|
-
), tab === "badges" && /* @__PURE__ */ React__namespace.createElement(
|
|
3773
|
-
BadgeTable,
|
|
3774
|
-
{
|
|
3775
|
-
badges: props.badges || [],
|
|
3776
|
-
students: props.students,
|
|
3777
|
-
loading: props.loading
|
|
3778
|
-
}
|
|
3779
|
-
), tab === "lessons" && /* @__PURE__ */ React__namespace.createElement(
|
|
3780
|
-
LessonTableWrapper,
|
|
3745
|
+
onChange: (e) => props.onClassChange(e.target.value),
|
|
3746
|
+
className: "w-64 rounded-xl border border-slate-200 bg-white px-3.5 py-2.5 text-sm text-dark-blue-400 focus:border-sky-blue-400 focus:outline-none"
|
|
3747
|
+
},
|
|
3748
|
+
/* @__PURE__ */ React__namespace.createElement("option", { value: "" }, "Select a class"),
|
|
3749
|
+
props.classes.map((g) => /* @__PURE__ */ React__namespace.createElement("option", { key: g.classId, value: g.classId }, g.name))
|
|
3750
|
+
), !props.trial && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-fit gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS.map((t) => /* @__PURE__ */ React__namespace.createElement(
|
|
3751
|
+
"button",
|
|
3781
3752
|
{
|
|
3782
|
-
|
|
3783
|
-
|
|
3784
|
-
|
|
3785
|
-
}
|
|
3786
|
-
|
|
3753
|
+
key: t.value,
|
|
3754
|
+
onClick: () => setTab(t.value),
|
|
3755
|
+
className: `rounded-lg px-4 py-2 text-xs font-bold ${tab === t.value ? "bg-sky-blue-400/20 text-dark-blue-400" : "text-slate-400 hover:text-slate-600"}`
|
|
3756
|
+
},
|
|
3757
|
+
t.label
|
|
3758
|
+
))), !props.trial && tab === "students" && /* @__PURE__ */ React__namespace.createElement(Table, { loading: props.loading, items: enrichedStudents, onReview: (item) => onReview(item, enrichedStudents) }), !props.trial && tab === "pathways" && /* @__PURE__ */ React__namespace.createElement(PathwayGroups, { students: enrichedStudents, loading: props.loading, pathways: props.pathways || [], badges: props.badges || [], onReview }), !props.trial && tab === "badges" && /* @__PURE__ */ React__namespace.createElement(BadgeGroups, { students: enrichedStudents, loading: props.loading, badges: props.badges || [], pathwayNameForBadge, onReview }), !props.trial && tab === "lessons" && /* @__PURE__ */ React__namespace.createElement(LessonGroups, { students: enrichedStudents, loading: props.loading, lessons: props.lessons, badgeForLesson, pathwayNameForBadge, onReview }));
|
|
3787
3759
|
};
|
|
3788
3760
|
|
|
3789
3761
|
Object.defineProperty(exports, 'showNotification', {
|
|
@@ -3809,7 +3781,6 @@ exports.Lessons = Lessons;
|
|
|
3809
3781
|
exports.Navbar = Navbar;
|
|
3810
3782
|
exports.Organization = Organization;
|
|
3811
3783
|
exports.Pathway = Pathway;
|
|
3812
|
-
exports.PathwayTable = PathwayTable;
|
|
3813
3784
|
exports.Pathways = Pathways;
|
|
3814
3785
|
exports.People = People;
|
|
3815
3786
|
exports.StartAnonymousLesson = StartAnonymousLesson;
|