@local-civics/mgmt-ui 0.1.215 → 0.1.217
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 +29 -2
- package/dist/index.js +655 -951
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +657 -953
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5,12 +5,10 @@ var icons = require('@tabler/icons');
|
|
|
5
5
|
var core = require('@mantine/core');
|
|
6
6
|
var reactRouterDom = require('react-router-dom');
|
|
7
7
|
var notifications = require('@mantine/notifications');
|
|
8
|
-
var mantineDatatable = require('mantine-datatable');
|
|
9
8
|
var dropzone = require('@mantine/dropzone');
|
|
10
9
|
var form = require('@mantine/form');
|
|
11
10
|
var papa = require('papaparse');
|
|
12
11
|
var modals = require('@mantine/modals');
|
|
13
|
-
var AvatarInit = require('avatar-initials');
|
|
14
12
|
var reactCharts = require('react-charts');
|
|
15
13
|
var hooks = require('@mantine/hooks');
|
|
16
14
|
|
|
@@ -61,7 +59,7 @@ function styleInject(css, ref) {
|
|
|
61
59
|
}
|
|
62
60
|
}
|
|
63
61
|
|
|
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}";
|
|
62
|
+
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{left:.75rem}.top-1\\/2{top:50%}.left-3\\.5{left:.875rem}.bottom-\\[-20px\\]{bottom:-20px}.left-1\\/2{left:50%}.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-2{margin-left:-.5rem}.mt-4{margin-top:1rem}.mb-8{margin-bottom:2rem}.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-9{height:2.25rem}.h-8{height:2rem}.h-7{height:1.75rem}.h-12{height:3rem}.h-\\[300px\\]{height:300px}.h-screen{height:100vh}.h-11{height:2.75rem}.h-16{height:4rem}.h-\\[30px\\]{height:30px}.w-10{width:2.5rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-fit{width:-moz-fit-content;width:fit-content}.w-36{width:9rem}.w-28{width:7rem}.w-4{width:1rem}.w-9{width:2.25rem}.w-40{width:10rem}.w-8{width:2rem}.w-7{width:1.75rem}.w-64{width:16rem}.w-12{width:3rem}.w-16{width:4rem}.w-\\[440px\\]{width:440px}.w-20{width:5rem}.w-24{width:6rem}.w-\\[250px\\]{width:250px}.w-screen{width:100vw}.w-11{width:2.75rem}.w-\\[230px\\]{width:230px}.w-\\[30px\\]{width:30px}.min-w-0{min-width:0}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.max-w-\\[460px\\]{max-width:460px}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-y-1\\/2{--tw-translate-y:-50%}.-translate-x-1\\/2,.-translate-y-1\\/2{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))}.-translate-x-1\\/2{--tw-translate-x:-50%}.rotate-180{--tw-rotate:180deg}.rotate-180,.rotate-90{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-90{--tw-rotate:90deg}.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}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1\\.2fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 1.2fr 1fr .6fr}.grid-cols-\\[1\\.5fr_2fr_1fr_0\\.6fr\\]{grid-template-columns:1.5fr 2fr 1fr .6fr}.grid-cols-\\[1\\.5fr_2fr_0\\.8fr\\]{grid-template-columns:1.5fr 2fr .8fr}.grid-cols-\\[1fr_3fr\\]{grid-template-columns:1fr 3fr}.grid-cols-\\[1fr_1fr_2fr_0\\.8fr\\]{grid-template-columns:1fr 1fr 2fr .8fr}.grid-cols-\\[2fr_1fr\\]{grid-template-columns:2fr 1fr}.grid-cols-\\[2\\.2fr_1\\.2fr_1fr_1fr_0\\.6fr\\]{grid-template-columns:2.2fr 1.2fr 1fr 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-4{gap:1rem}.gap-1{gap:.25rem}.gap-3{gap:.75rem}.gap-2{gap:.5rem}.gap-1\\.5{gap:.375rem}.gap-2\\.5{gap:.625rem}.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\\.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)))}.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)))}.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-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded{border-radius:.25rem}.rounded-\\[8px\\]{border-radius:8px}.border{border-width:1px}.border-2{border-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-b{border-bottom-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-white{--tw-border-opacity:1;border-color:rgb(255 255 255/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-sky-blue-400\\/40{border-color:rgba(59,208,242,.4)}.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-sky-blue-400\\/20{background-color:rgba(59,208,242,.2)}.bg-mint-100{--tw-bg-opacity:1;background-color:rgb(208 251 240/var(--tw-bg-opacity))}.bg-slate-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-gold-100{--tw-bg-opacity:1;background-color:rgb(255 248 214/var(--tw-bg-opacity))}.bg-mint-400\\/20{background-color:rgba(30,226,175,.2)}.bg-transparent{background-color:transparent}.bg-dark-blue-400{--tw-bg-opacity:1;background-color:rgb(35 42 58/var(--tw-bg-opacity))}.bg-white\\/90{background-color:hsla(0,0%,100%,.9)}.bg-slate-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-slate-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-sky-blue-400\\/15{background-color:rgba(59,208,242,.15)}.bg-mint-400\\/15{background-color:rgba(30,226,175,.15)}.bg-gold-400\\/15{background-color:rgba(255,212,77,.15)}.bg-sky-blue-400\\/25{background-color:rgba(59,208,242,.25)}.bg-mint-400\\/25{background-color:rgba(30,226,175,.25)}.bg-gold-400\\/25{background-color:rgba(255,212,77,.25)}.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-1{padding:.25rem}.p-4{padding:1rem}.p-8{padding:2rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-3{padding:.75rem}.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-2{padding-bottom:.5rem;padding-top:.5rem}.py-1\\.5{padding-bottom:.375rem;padding-top:.375rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.px-2\\.5{padding-left:.625rem;padding-right:.625rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3\\.5{padding-left:.875rem;padding-right:.875rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2\\.5{padding-bottom:.625rem;padding-top:.625rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-3\\.5{padding-bottom:.875rem;padding-top:.875rem}.py-0\\.5{padding-bottom:.125rem;padding-top:.125rem}.py-0{padding-bottom:0;padding-top:0}.py-4{padding-bottom:1rem;padding-top:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pl-9{padding-left:2.25rem}.pr-4{padding-right:1rem}.pl-10{padding-left:2.5rem}.pb-2{padding-bottom:.5rem}.pt-0\\.5{padding-top:.125rem}.pt-0{padding-top:0}.pb-12{padding-bottom:3rem}.pl-2\\.5{padding-left:.625rem}.pl-2{padding-left:.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.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-\\[10px\\]{font-size:10px}.text-\\[10\\.5px\\]{font-size:10.5px}.text-lg{font-size:1.125rem;line-height:1.75rem}.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-sky-blue-400{--tw-text-opacity:1;color:rgb(59 208 242/var(--tw-text-opacity))}.text-slate-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-slate-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-slate-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-mint-400{--tw-text-opacity:1;color:rgb(30 226 175/var(--tw-text-opacity))}.text-white\\/70{color:hsla(0,0%,100%,.7)}.text-slate-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.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))}.first\\:ml-0:first-child{margin-left:0}.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-600:hover{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-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-sky-blue-400:hover{--tw-text-opacity:1;color:rgb(59 208 242/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
63
|
styleInject(css_248z);
|
|
66
64
|
|
|
67
65
|
function UserButton({ image, name, email }) {
|
|
@@ -145,25 +143,25 @@ function LinksGroup({ icon: Icon, href, label, accent = "cyan", initiallyOpened,
|
|
|
145
143
|
), 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
144
|
}
|
|
147
145
|
|
|
148
|
-
var __defProp$
|
|
149
|
-
var __defProps$
|
|
150
|
-
var __getOwnPropDescs$
|
|
151
|
-
var __getOwnPropSymbols$
|
|
152
|
-
var __hasOwnProp$
|
|
153
|
-
var __propIsEnum$
|
|
154
|
-
var __defNormalProp$
|
|
155
|
-
var __spreadValues$
|
|
146
|
+
var __defProp$g = Object.defineProperty;
|
|
147
|
+
var __defProps$d = Object.defineProperties;
|
|
148
|
+
var __getOwnPropDescs$d = Object.getOwnPropertyDescriptors;
|
|
149
|
+
var __getOwnPropSymbols$g = Object.getOwnPropertySymbols;
|
|
150
|
+
var __hasOwnProp$g = Object.prototype.hasOwnProperty;
|
|
151
|
+
var __propIsEnum$g = Object.prototype.propertyIsEnumerable;
|
|
152
|
+
var __defNormalProp$g = (obj, key, value) => key in obj ? __defProp$g(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
153
|
+
var __spreadValues$g = (a, b) => {
|
|
156
154
|
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$
|
|
155
|
+
if (__hasOwnProp$g.call(b, prop))
|
|
156
|
+
__defNormalProp$g(a, prop, b[prop]);
|
|
157
|
+
if (__getOwnPropSymbols$g)
|
|
158
|
+
for (var prop of __getOwnPropSymbols$g(b)) {
|
|
159
|
+
if (__propIsEnum$g.call(b, prop))
|
|
160
|
+
__defNormalProp$g(a, prop, b[prop]);
|
|
163
161
|
}
|
|
164
162
|
return a;
|
|
165
163
|
};
|
|
166
|
-
var __spreadProps$
|
|
164
|
+
var __spreadProps$d = (a, b) => __defProps$d(a, __getOwnPropDescs$d(b));
|
|
167
165
|
const data = [
|
|
168
166
|
{ label: "Home", icon: icons.IconHome2, accent: "cyan" },
|
|
169
167
|
{ label: "Dashboard", icon: icons.IconGauge, accent: "mint" },
|
|
@@ -190,12 +188,12 @@ function Navbar(props) {
|
|
|
190
188
|
}
|
|
191
189
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
192
190
|
LinksGroup,
|
|
193
|
-
__spreadProps$
|
|
191
|
+
__spreadProps$d(__spreadValues$g(__spreadValues$g({
|
|
194
192
|
key: item.label,
|
|
195
193
|
active: props.active
|
|
196
194
|
}, item), context), {
|
|
197
195
|
links: (item.links || []).map((link) => {
|
|
198
|
-
return __spreadValues$
|
|
196
|
+
return __spreadValues$g(__spreadValues$g({}, link), props.links[`${item.label}/${link.label}`] || { notifications: 0, href: "" });
|
|
199
197
|
})
|
|
200
198
|
})
|
|
201
199
|
);
|
|
@@ -215,7 +213,7 @@ const UtilLink = (props) => {
|
|
|
215
213
|
);
|
|
216
214
|
};
|
|
217
215
|
|
|
218
|
-
const useStyles$
|
|
216
|
+
const useStyles$9 = core.createStyles((theme) => ({
|
|
219
217
|
inner: {
|
|
220
218
|
paddingTop: theme.spacing.xl,
|
|
221
219
|
paddingBottom: theme.spacing.xl * 4
|
|
@@ -251,7 +249,7 @@ const useStyles$k = core.createStyles((theme) => ({
|
|
|
251
249
|
}
|
|
252
250
|
}));
|
|
253
251
|
const GettingStarted = (props) => {
|
|
254
|
-
const { classes } = useStyles$
|
|
252
|
+
const { classes } = useStyles$9();
|
|
255
253
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
256
254
|
core.Modal,
|
|
257
255
|
{
|
|
@@ -265,7 +263,7 @@ const GettingStarted = (props) => {
|
|
|
265
263
|
);
|
|
266
264
|
};
|
|
267
265
|
|
|
268
|
-
const useStyles$
|
|
266
|
+
const useStyles$8 = core.createStyles((theme) => ({
|
|
269
267
|
title: {
|
|
270
268
|
fontSize: 34,
|
|
271
269
|
fontWeight: 900,
|
|
@@ -306,7 +304,7 @@ const useStyles$j = core.createStyles((theme) => ({
|
|
|
306
304
|
}
|
|
307
305
|
}));
|
|
308
306
|
const SwitchAccount = (props) => {
|
|
309
|
-
const { classes, theme } = useStyles$
|
|
307
|
+
const { classes, theme } = useStyles$8();
|
|
310
308
|
const options = props.accounts.map((a) => {
|
|
311
309
|
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
310
|
});
|
|
@@ -337,56 +335,55 @@ const StatsGroup = ({ data, footer }) => {
|
|
|
337
335
|
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap gap-x-10 gap-y-4 rounded-2xl bg-gradient-to-br from-dark-blue-600 via-dark-blue-400 to-sky-blue-400 px-8 py-6" }, stats, footer);
|
|
338
336
|
};
|
|
339
337
|
|
|
340
|
-
const
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Tabs, { value: props.value, onTabChange: props.onChange }, /* @__PURE__ */ React__namespace.createElement(core.Tabs.List, null, tabs));
|
|
338
|
+
const SIZE = {
|
|
339
|
+
sm: { box: "h-11 w-11", rounded: "rounded-xl", icon: 20 },
|
|
340
|
+
lg: { box: "h-16 w-16", rounded: "rounded-2xl", icon: 28 }
|
|
344
341
|
};
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
border: 0,
|
|
357
|
-
borderLeft: `1px solid ${theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.white}`
|
|
342
|
+
const ACCENT = {
|
|
343
|
+
cyan: { bg: "bg-sky-blue-400/15", text: "text-sky-blue-400" },
|
|
344
|
+
mint: { bg: "bg-mint-400/15", text: "text-mint-400" },
|
|
345
|
+
gold: { bg: "bg-gold-400/15", text: "text-gold-400" }
|
|
346
|
+
};
|
|
347
|
+
function Emblem(props) {
|
|
348
|
+
const s = SIZE[props.size || "sm"];
|
|
349
|
+
const a = ACCENT[props.accent];
|
|
350
|
+
const Icon = props.icon;
|
|
351
|
+
if (props.imageURL) {
|
|
352
|
+
return /* @__PURE__ */ React__namespace.createElement("img", { src: props.imageURL, alt: props.alt || "", className: `${s.box} shrink-0 ${s.rounded} object-cover` });
|
|
358
353
|
}
|
|
359
|
-
}));
|
|
354
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: `flex ${s.box} shrink-0 items-center justify-center ${s.rounded} ${a.bg}` }, /* @__PURE__ */ React__namespace.createElement(Icon, { size: s.icon, stroke: 1.75, className: a.text }));
|
|
355
|
+
}
|
|
356
|
+
|
|
360
357
|
const SplitButton$4 = (props) => {
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
364
|
-
core.Button,
|
|
358
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React__namespace.createElement(
|
|
359
|
+
reactRouterDom.Link,
|
|
365
360
|
{
|
|
366
|
-
component: reactRouterDom.Link,
|
|
367
361
|
to: props.href,
|
|
368
|
-
className:
|
|
369
|
-
variant: "gradient"
|
|
362
|
+
className: "flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white px-3.5 py-2 text-xs font-bold text-slate-600 no-underline hover:bg-slate-50"
|
|
370
363
|
},
|
|
371
364
|
"Preview"
|
|
372
365
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
373
|
-
|
|
366
|
+
"button",
|
|
374
367
|
{
|
|
375
|
-
|
|
376
|
-
onClick: props.onCopyLinkClick
|
|
368
|
+
type: "button",
|
|
369
|
+
onClick: props.onCopyLinkClick,
|
|
370
|
+
className: "flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white px-3.5 py-2 text-xs font-bold text-slate-600 hover:bg-slate-50"
|
|
377
371
|
},
|
|
372
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconClipboardCopy, { size: 13, stroke: 2 }),
|
|
378
373
|
"Copy link"
|
|
379
374
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
380
|
-
|
|
375
|
+
"button",
|
|
381
376
|
{
|
|
382
|
-
|
|
383
|
-
onClick: props.onExportDataClick
|
|
377
|
+
type: "button",
|
|
378
|
+
onClick: props.onExportDataClick,
|
|
379
|
+
className: "flex items-center gap-1.5 rounded-lg bg-gradient-to-r from-gold-400 to-[#f5c300] px-3.5 py-2 text-xs font-bold text-dark-blue-400 shadow-[0_3px_12px_rgba(255,212,77,0.35)]"
|
|
384
380
|
},
|
|
381
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconTableExport, { size: 13, stroke: 2 }),
|
|
385
382
|
"Export data (.csv)"
|
|
386
383
|
));
|
|
387
384
|
};
|
|
388
385
|
|
|
389
|
-
const useStyles$
|
|
386
|
+
const useStyles$7 = core.createStyles((theme) => ({
|
|
390
387
|
wrapper: {
|
|
391
388
|
display: "flex",
|
|
392
389
|
alignItems: "center",
|
|
@@ -437,7 +434,7 @@ const useStyles$h = core.createStyles((theme) => ({
|
|
|
437
434
|
}
|
|
438
435
|
}));
|
|
439
436
|
const PlaceholderBanner = (props) => {
|
|
440
|
-
const { classes } = useStyles$
|
|
437
|
+
const { classes } = useStyles$7();
|
|
441
438
|
const title = props.title || "Nothing to display";
|
|
442
439
|
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
440
|
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 }));
|
|
@@ -447,8 +444,7 @@ function Stack$4(props) {
|
|
|
447
444
|
if (props.items.length === 0) {
|
|
448
445
|
return null;
|
|
449
446
|
}
|
|
450
|
-
|
|
451
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Grid, { grow: true, gutter: "lg", sx: { padding: 20, minWidth: 700 } }, rows);
|
|
447
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-2" }, props.items.map((row) => /* @__PURE__ */ React__namespace.createElement("div", { key: row.lessonName, className: "flex items-center justify-between gap-4 py-1.5" }, /* @__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.completion >= 1 && /* @__PURE__ */ React__namespace.createElement("span", { className: "shrink-0 rounded-full bg-mint-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, "Complete"), row.completion === 0 && !row.isStarted && /* @__PURE__ */ React__namespace.createElement("span", { className: "shrink-0 rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-bold text-slate-500" }, "Not started"), row.completion > 0 && row.completion < 1 && /* @__PURE__ */ React__namespace.createElement("span", { className: "shrink-0 rounded-full bg-gold-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, Math.round((row.completion + Number.EPSILON) * 100), "% Complete"))));
|
|
452
448
|
}
|
|
453
449
|
|
|
454
450
|
function useSortableData(items, config = { key: "", direction: null }) {
|
|
@@ -489,28 +485,29 @@ function useSortableData(items, config = { key: "", direction: null }) {
|
|
|
489
485
|
return { items: sortedItems, requestSort, sortConfig };
|
|
490
486
|
}
|
|
491
487
|
|
|
492
|
-
var __defProp$
|
|
493
|
-
var __defProps$
|
|
494
|
-
var __getOwnPropDescs$
|
|
495
|
-
var __getOwnPropSymbols$
|
|
496
|
-
var __hasOwnProp$
|
|
497
|
-
var __propIsEnum$
|
|
498
|
-
var __defNormalProp$
|
|
499
|
-
var __spreadValues$
|
|
488
|
+
var __defProp$f = Object.defineProperty;
|
|
489
|
+
var __defProps$c = Object.defineProperties;
|
|
490
|
+
var __getOwnPropDescs$c = Object.getOwnPropertyDescriptors;
|
|
491
|
+
var __getOwnPropSymbols$f = Object.getOwnPropertySymbols;
|
|
492
|
+
var __hasOwnProp$f = Object.prototype.hasOwnProperty;
|
|
493
|
+
var __propIsEnum$f = Object.prototype.propertyIsEnumerable;
|
|
494
|
+
var __defNormalProp$f = (obj, key, value) => key in obj ? __defProp$f(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
495
|
+
var __spreadValues$f = (a, b) => {
|
|
500
496
|
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$
|
|
497
|
+
if (__hasOwnProp$f.call(b, prop))
|
|
498
|
+
__defNormalProp$f(a, prop, b[prop]);
|
|
499
|
+
if (__getOwnPropSymbols$f)
|
|
500
|
+
for (var prop of __getOwnPropSymbols$f(b)) {
|
|
501
|
+
if (__propIsEnum$f.call(b, prop))
|
|
502
|
+
__defNormalProp$f(a, prop, b[prop]);
|
|
507
503
|
}
|
|
508
504
|
return a;
|
|
509
505
|
};
|
|
510
|
-
var __spreadProps$
|
|
506
|
+
var __spreadProps$c = (a, b) => __defProps$c(a, __getOwnPropDescs$c(b));
|
|
511
507
|
function Table$k(props) {
|
|
508
|
+
const [expanded, setExpanded] = React__namespace.useState({});
|
|
512
509
|
const preparedItems = React__namespace.useMemo(() => {
|
|
513
|
-
return props.items.map((item) => __spreadProps$
|
|
510
|
+
return props.items.map((item) => __spreadProps$c(__spreadValues$f({}, item), {
|
|
514
511
|
status: item.isComplete ? 1 : 0
|
|
515
512
|
}));
|
|
516
513
|
}, [props.items]);
|
|
@@ -526,40 +523,22 @@ function Table$k(props) {
|
|
|
526
523
|
}
|
|
527
524
|
);
|
|
528
525
|
}
|
|
529
|
-
const
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
onSortStatusChange: (status) => requestSort(status.columnAccessor),
|
|
546
|
-
idAccessor: "userId",
|
|
547
|
-
columns: [{
|
|
548
|
-
accessor: "name",
|
|
549
|
-
title: "Student Name",
|
|
550
|
-
sortable: true,
|
|
551
|
-
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)))
|
|
552
|
-
}, {
|
|
553
|
-
accessor: "status",
|
|
554
|
-
title: "Status",
|
|
555
|
-
sortable: true,
|
|
556
|
-
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"))
|
|
557
|
-
}],
|
|
558
|
-
rowExpansion: {
|
|
559
|
-
content: ({ record }) => /* @__PURE__ */ React__namespace.createElement(Stack$4, { items: record.lessons })
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
));
|
|
526
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
527
|
+
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("status"), className: "w-28 shrink-0 text-center hover:text-slate-600" }, "Status", indicator("status")), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
|
|
528
|
+
var _a;
|
|
529
|
+
const isOpen = !!expanded[row.userId];
|
|
530
|
+
const initials = (((_a = row.name) == null ? void 0 : _a[0]) || row.email[0] || "?").toUpperCase();
|
|
531
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
532
|
+
"div",
|
|
533
|
+
{
|
|
534
|
+
onClick: () => setExpanded(__spreadProps$c(__spreadValues$f({}, expanded), { [row.userId]: !isOpen })),
|
|
535
|
+
className: "flex cursor-pointer items-center gap-4 p-4"
|
|
536
|
+
},
|
|
537
|
+
/* @__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-mint-400/20 text-xs font-bold text-dark-blue-400" }, initials), /* @__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))),
|
|
538
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-28 shrink-0 text-center" }, row.isComplete ? /* @__PURE__ */ React__namespace.createElement("span", { className: "rounded-full bg-mint-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, "Complete") : /* @__PURE__ */ React__namespace.createElement("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-bold text-slate-500" }, "Incomplete")),
|
|
539
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronDown, { size: 15, stroke: 2.3, className: `shrink-0 text-slate-400 transition-transform ${isOpen ? "rotate-180" : ""}` })
|
|
540
|
+
), isOpen && /* @__PURE__ */ React__namespace.createElement("div", { className: "border-t border-slate-100 px-4 py-3" }, /* @__PURE__ */ React__namespace.createElement(Stack$4, { items: row.lessons })));
|
|
541
|
+
}));
|
|
563
542
|
}
|
|
564
543
|
|
|
565
544
|
function Table$j(props) {
|
|
@@ -569,121 +548,63 @@ function Table$j(props) {
|
|
|
569
548
|
PlaceholderBanner,
|
|
570
549
|
{
|
|
571
550
|
title: "No lessons to display",
|
|
572
|
-
description: "There are
|
|
551
|
+
description: "There are no lessons in this badge.",
|
|
573
552
|
loading: props.loading,
|
|
574
553
|
icon: "badges"
|
|
575
554
|
}
|
|
576
555
|
);
|
|
577
556
|
}
|
|
578
|
-
const
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
records: sortedItems,
|
|
590
|
-
sortStatus,
|
|
591
|
-
onSortStatusChange: (status) => requestSort(status.columnAccessor),
|
|
592
|
-
columns: [
|
|
593
|
-
{
|
|
594
|
-
accessor: "lessonName",
|
|
595
|
-
title: "Lesson Name",
|
|
596
|
-
sortable: true,
|
|
597
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.Text, { component: reactRouterDom.Link, to: row.href }, row.lessonName)
|
|
598
|
-
},
|
|
599
|
-
{
|
|
600
|
-
accessor: "percentageCompletion",
|
|
601
|
-
title: "Lesson Completion",
|
|
602
|
-
sortable: true,
|
|
603
|
-
render: (row) => `${Math.round((row.percentageCompletion + Number.EPSILON) * 100)}%`
|
|
604
|
-
}
|
|
605
|
-
]
|
|
606
|
-
}
|
|
607
|
-
));
|
|
557
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
558
|
+
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("button", { onClick: () => requestSort("lessonName"), className: "flex-1 text-left hover:text-slate-600" }, "Lesson Name", indicator("lessonName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("percentageCompletion"), className: "w-36 shrink-0 text-right hover:text-slate-600" }, "Lesson Completion", indicator("percentageCompletion"))), sortedItems.map((row) => /* @__PURE__ */ React__namespace.createElement(
|
|
559
|
+
reactRouterDom.Link,
|
|
560
|
+
{
|
|
561
|
+
key: row.lessonId,
|
|
562
|
+
to: row.href,
|
|
563
|
+
className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
|
|
564
|
+
},
|
|
565
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1 text-sm font-bold text-dark-blue-400" }, row.lessonName),
|
|
566
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0 text-right text-xs text-slate-500" }, Math.round((row.percentageCompletion + Number.EPSILON) * 100), "%")
|
|
567
|
+
)));
|
|
608
568
|
}
|
|
609
569
|
|
|
610
|
-
const
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
[theme.fn.smallerThan("sm")]: {
|
|
615
|
-
fontSize: 24
|
|
616
|
-
}
|
|
617
|
-
},
|
|
618
|
-
description: {
|
|
619
|
-
maxWidth: 600
|
|
620
|
-
}
|
|
621
|
-
}));
|
|
570
|
+
const TABS$4 = [
|
|
571
|
+
{ label: "By lesson", value: "lessons" },
|
|
572
|
+
{ label: "By student", value: "students" }
|
|
573
|
+
];
|
|
622
574
|
const Badge = (props) => {
|
|
623
|
-
const { classes } = useStyles$g();
|
|
624
575
|
const [tab, setTab] = React.useState("lessons");
|
|
625
576
|
const numberOfStudents = props.students.length;
|
|
626
577
|
const numberOfBadges = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
|
|
627
|
-
|
|
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
|
-
core.Badge,
|
|
630
|
-
{
|
|
631
|
-
variant: "filled",
|
|
632
|
-
leftSection: /* @__PURE__ */ React__namespace.createElement(core.ActionIcon, { color: "blue", size: "xs", radius: "xl", variant: "filled" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 14 })),
|
|
633
|
-
size: "lg"
|
|
634
|
-
},
|
|
635
|
-
"Back"
|
|
636
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Group, null, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, props.displayName || "Badge"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, props.description || "No description")), !props.trial && /* @__PURE__ */ React__namespace.createElement(core.Stack, { ml: "auto" }, /* @__PURE__ */ React__namespace.createElement(
|
|
578
|
+
return /* @__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: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement(Emblem, { imageURL: props.imageURL, alt: props.displayName, size: "lg", icon: icons.IconAlbum, accent: "mint" }), /* @__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 || "Badge"), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.description || "No description"))), !props.trial && /* @__PURE__ */ React__namespace.createElement(
|
|
637
579
|
SplitButton$4,
|
|
638
580
|
{
|
|
639
581
|
href: props.href,
|
|
640
582
|
onCopyLinkClick: props.onCopyLinkClick,
|
|
641
583
|
onExportDataClick: props.onExportDataClick
|
|
642
584
|
}
|
|
643
|
-
))
|
|
585
|
+
)), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
644
586
|
{
|
|
645
587
|
title: props.trial ? "LESSONS SUBMITTED" : "BADGE COMPLETION",
|
|
646
|
-
value: props.trial ? props.lessonsCompleted || 0 : numberOfBadges
|
|
647
|
-
unit: props.trial ? "" : ""
|
|
588
|
+
value: props.trial ? props.lessonsCompleted || 0 : numberOfBadges
|
|
648
589
|
}
|
|
649
|
-
] }), !props.trial && /* @__PURE__ */ React__namespace.createElement(
|
|
650
|
-
|
|
590
|
+
] }), !props.trial && /* @__PURE__ */ React__namespace.createElement("div", { className: "relative w-full max-w-xs" }, /* @__PURE__ */ React__namespace.createElement(icons.IconCategory2, { size: 16, stroke: 2, className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
|
|
591
|
+
"select",
|
|
651
592
|
{
|
|
652
|
-
clearable: true,
|
|
653
|
-
clearButtonLabel: "Clear class selection",
|
|
654
|
-
size: "sm",
|
|
655
|
-
placeholder: "Select a class",
|
|
656
|
-
nothingFound: "No options",
|
|
657
593
|
value: props.classId,
|
|
658
|
-
onChange: props.onClassChange,
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
Tabs,
|
|
666
|
-
{
|
|
667
|
-
value: tab,
|
|
668
|
-
data: [
|
|
669
|
-
{ label: "By lesson", value: "lessons" },
|
|
670
|
-
{ label: "By student", value: "students" }
|
|
671
|
-
],
|
|
672
|
-
onChange: setTab
|
|
673
|
-
}
|
|
674
|
-
), (!!props.trial || tab === "lessons") && /* @__PURE__ */ React__namespace.createElement(
|
|
675
|
-
Table$j,
|
|
676
|
-
{
|
|
677
|
-
loading: props.loading,
|
|
678
|
-
items: props.lessons
|
|
679
|
-
}
|
|
680
|
-
), !props.trial && tab === "students" && /* @__PURE__ */ React__namespace.createElement(
|
|
681
|
-
Table$k,
|
|
594
|
+
onChange: (e) => props.onClassChange(e.target.value),
|
|
595
|
+
className: "w-full appearance-none rounded-lg border border-slate-200 bg-white py-2 pl-9 pr-4 text-sm text-dark-blue-400 focus:border-sky-blue-400 focus:outline-none"
|
|
596
|
+
},
|
|
597
|
+
/* @__PURE__ */ React__namespace.createElement("option", { value: "" }, "All classes"),
|
|
598
|
+
props.classes.map((c) => /* @__PURE__ */ React__namespace.createElement("option", { key: c.classId, value: c.classId }, c.name))
|
|
599
|
+
)), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, !props.trial && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-fit gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS$4.map((t) => /* @__PURE__ */ React__namespace.createElement(
|
|
600
|
+
"button",
|
|
682
601
|
{
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
602
|
+
key: t.value,
|
|
603
|
+
onClick: () => setTab(t.value),
|
|
604
|
+
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"}`
|
|
605
|
+
},
|
|
606
|
+
t.label
|
|
607
|
+
))), (!!props.trial || tab === "lessons") && /* @__PURE__ */ React__namespace.createElement(Table$j, { loading: props.loading, items: props.lessons }), !props.trial && tab === "students" && /* @__PURE__ */ React__namespace.createElement(Table$k, { loading: props.loading, items: props.students })));
|
|
687
608
|
};
|
|
688
609
|
|
|
689
610
|
function Table$i(props) {
|
|
@@ -693,20 +614,40 @@ function Table$i(props) {
|
|
|
693
614
|
if (props.items.length === 0) {
|
|
694
615
|
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 badges to display.");
|
|
695
616
|
}
|
|
696
|
-
return /* @__PURE__ */ React__namespace.createElement("div", { className: "
|
|
617
|
+
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" }, "Badge"), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0" }, "Pathway"), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-28 shrink-0" }, "Lessons"), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), props.items.map((row) => /* @__PURE__ */ React__namespace.createElement(
|
|
697
618
|
reactRouterDom.Link,
|
|
698
619
|
{
|
|
699
620
|
key: row.badgeId,
|
|
700
621
|
to: row.href,
|
|
701
|
-
className:
|
|
622
|
+
className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
|
|
623
|
+
},
|
|
624
|
+
/* @__PURE__ */ React__namespace.createElement(Emblem, { imageURL: row.imageURL, alt: row.name, size: "sm", icon: icons.IconAlbum, accent: "mint" }),
|
|
625
|
+
/* @__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)),
|
|
626
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0 text-xs text-slate-500" }, row.pathway || "\u2014"),
|
|
627
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-28 shrink-0 text-xs text-slate-500" }, row.numberOfLessons ? `${row.numberOfLessons} lesson${row.numberOfLessons === 1 ? "" : "s"}` : "\u2014"),
|
|
628
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 16, stroke: 2, className: "w-4 shrink-0 text-slate-300" })
|
|
629
|
+
)));
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
function PathwayFilterPills(props) {
|
|
633
|
+
if (props.pathways.length === 0) {
|
|
634
|
+
return null;
|
|
635
|
+
}
|
|
636
|
+
const pillClass = (active) => `rounded-full border px-3.5 py-1.5 text-xs font-bold ${active ? "border-sky-blue-400/40 bg-sky-blue-400/20 text-dark-blue-400" : "border-slate-200 bg-white text-slate-500 hover:bg-slate-50"}`;
|
|
637
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap gap-2" }, /* @__PURE__ */ React__namespace.createElement("button", { type: "button", onClick: () => props.onChange(""), className: pillClass(!props.selected) }, "All"), props.pathways.map((p) => /* @__PURE__ */ React__namespace.createElement(
|
|
638
|
+
"button",
|
|
639
|
+
{
|
|
640
|
+
key: p.pathwayId,
|
|
641
|
+
type: "button",
|
|
642
|
+
onClick: () => props.onChange(p.pathwayId),
|
|
643
|
+
className: pillClass(props.selected === p.pathwayId)
|
|
702
644
|
},
|
|
703
|
-
|
|
704
|
-
row.description && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs leading-relaxed text-slate-500" }, row.description)
|
|
645
|
+
p.title
|
|
705
646
|
)));
|
|
706
647
|
}
|
|
707
648
|
|
|
708
649
|
const Badges = (props) => {
|
|
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(
|
|
650
|
+
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(PathwayFilterPills, { pathways: props.pathways, selected: props.selectedPathway, onChange: props.onPathwayChange }), /* @__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
651
|
"input",
|
|
711
652
|
{
|
|
712
653
|
type: "text",
|
|
@@ -718,6 +659,7 @@ const Badges = (props) => {
|
|
|
718
659
|
};
|
|
719
660
|
|
|
720
661
|
function Table$h(props) {
|
|
662
|
+
const { items: sortedItems, requestSort, sortConfig } = useSortableData(props.items);
|
|
721
663
|
if (props.items.length === 0) {
|
|
722
664
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
723
665
|
PlaceholderBanner,
|
|
@@ -729,8 +671,24 @@ function Table$h(props) {
|
|
|
729
671
|
}
|
|
730
672
|
);
|
|
731
673
|
}
|
|
732
|
-
const
|
|
733
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
674
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
675
|
+
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-[2fr_1fr] 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("studentName"), className: "flex items-center text-left hover:text-slate-700" }, "Student Name", indicator("studentName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("className"), className: "flex items-center text-left hover:text-slate-700" }, "Class Name", indicator("className"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
676
|
+
"div",
|
|
677
|
+
{
|
|
678
|
+
key: row.studentId,
|
|
679
|
+
className: `grid grid-cols-[2fr_1fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
|
|
680
|
+
},
|
|
681
|
+
/* @__PURE__ */ React__namespace.createElement(
|
|
682
|
+
"button",
|
|
683
|
+
{
|
|
684
|
+
type: "button",
|
|
685
|
+
onClick: () => props.onViewProfile(row),
|
|
686
|
+
className: "truncate text-left text-xs font-bold text-dark-blue-400 hover:text-sky-blue-400"
|
|
687
|
+
},
|
|
688
|
+
row.studentName
|
|
689
|
+
),
|
|
690
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs text-slate-500" }, row.className)
|
|
691
|
+
)));
|
|
734
692
|
}
|
|
735
693
|
|
|
736
694
|
const units = [
|
|
@@ -757,7 +715,32 @@ function relativeTimeFromElapsed(elapsed) {
|
|
|
757
715
|
return "";
|
|
758
716
|
}
|
|
759
717
|
|
|
718
|
+
var __defProp$e = Object.defineProperty;
|
|
719
|
+
var __defProps$b = Object.defineProperties;
|
|
720
|
+
var __getOwnPropDescs$b = Object.getOwnPropertyDescriptors;
|
|
721
|
+
var __getOwnPropSymbols$e = Object.getOwnPropertySymbols;
|
|
722
|
+
var __hasOwnProp$e = Object.prototype.hasOwnProperty;
|
|
723
|
+
var __propIsEnum$e = Object.prototype.propertyIsEnumerable;
|
|
724
|
+
var __defNormalProp$e = (obj, key, value) => key in obj ? __defProp$e(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
725
|
+
var __spreadValues$e = (a, b) => {
|
|
726
|
+
for (var prop in b || (b = {}))
|
|
727
|
+
if (__hasOwnProp$e.call(b, prop))
|
|
728
|
+
__defNormalProp$e(a, prop, b[prop]);
|
|
729
|
+
if (__getOwnPropSymbols$e)
|
|
730
|
+
for (var prop of __getOwnPropSymbols$e(b)) {
|
|
731
|
+
if (__propIsEnum$e.call(b, prop))
|
|
732
|
+
__defNormalProp$e(a, prop, b[prop]);
|
|
733
|
+
}
|
|
734
|
+
return a;
|
|
735
|
+
};
|
|
736
|
+
var __spreadProps$b = (a, b) => __defProps$b(a, __getOwnPropDescs$b(b));
|
|
760
737
|
function Table$g(props) {
|
|
738
|
+
const preparedItems = React__namespace.useMemo(() => {
|
|
739
|
+
return props.items.map((item) => __spreadProps$b(__spreadValues$e({}, item), {
|
|
740
|
+
updatedAtDate: new Date(item.updatedAt)
|
|
741
|
+
}));
|
|
742
|
+
}, [props.items]);
|
|
743
|
+
const { items: sortedItems, requestSort, sortConfig } = useSortableData(preparedItems);
|
|
761
744
|
if (props.items.length === 0) {
|
|
762
745
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
763
746
|
PlaceholderBanner,
|
|
@@ -769,11 +752,22 @@ function Table$g(props) {
|
|
|
769
752
|
}
|
|
770
753
|
);
|
|
771
754
|
}
|
|
772
|
-
const
|
|
773
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
755
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
756
|
+
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-[1fr_1fr_2fr_0.8fr] 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("studentName"), className: "flex items-center text-left hover:text-slate-700" }, "Student Name", indicator("studentName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("lessonName"), className: "flex items-center text-left hover:text-slate-700" }, "Lesson Name", indicator("lessonName")), /* @__PURE__ */ React__namespace.createElement("div", null, "Reflection"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("updatedAtDate"), className: "flex items-center text-left hover:text-slate-700" }, "Updated At", indicator("updatedAtDate"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
757
|
+
"div",
|
|
758
|
+
{
|
|
759
|
+
key: row.studentName + row.lessonName,
|
|
760
|
+
className: `grid grid-cols-[1fr_1fr_2fr_0.8fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
|
|
761
|
+
},
|
|
762
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs font-bold text-dark-blue-400" }, row.studentName),
|
|
763
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs text-slate-500" }, row.lessonName),
|
|
764
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs text-slate-500" }, row.reflection),
|
|
765
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs text-slate-500" }, relativeTimeFromDates(row.updatedAtDate))
|
|
766
|
+
)));
|
|
774
767
|
}
|
|
775
768
|
|
|
776
769
|
function Table$f(props) {
|
|
770
|
+
const { items: sortedItems, requestSort, sortConfig } = useSortableData(props.items);
|
|
777
771
|
if (props.items.length === 0) {
|
|
778
772
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
779
773
|
PlaceholderBanner,
|
|
@@ -785,11 +779,20 @@ function Table$f(props) {
|
|
|
785
779
|
}
|
|
786
780
|
);
|
|
787
781
|
}
|
|
788
|
-
const
|
|
789
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
782
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
783
|
+
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-[1fr_3fr] 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("studentName"), className: "flex items-center text-left hover:text-slate-700" }, "Student Name", indicator("studentName")), /* @__PURE__ */ React__namespace.createElement("div", null, "Impact Statement")), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
784
|
+
"div",
|
|
785
|
+
{
|
|
786
|
+
key: row.studentName,
|
|
787
|
+
className: `grid grid-cols-[1fr_3fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
|
|
788
|
+
},
|
|
789
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs font-bold text-dark-blue-400" }, row.studentName),
|
|
790
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-xs text-slate-500" }, row.impactStatement)
|
|
791
|
+
)));
|
|
790
792
|
}
|
|
791
793
|
|
|
792
794
|
function Table$e(props) {
|
|
795
|
+
const { items: sortedItems, requestSort, sortConfig } = useSortableData(props.items);
|
|
793
796
|
if (props.items.length === 0) {
|
|
794
797
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
795
798
|
PlaceholderBanner,
|
|
@@ -801,11 +804,29 @@ function Table$e(props) {
|
|
|
801
804
|
}
|
|
802
805
|
);
|
|
803
806
|
}
|
|
804
|
-
const
|
|
805
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
807
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
808
|
+
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-[1.5fr_2fr_0.8fr] 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("name"), className: "flex items-center text-left hover:text-slate-700" }, "Badge Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("div", null, "Description"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("percentageCompletion"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Completion", indicator("percentageCompletion"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
809
|
+
"div",
|
|
810
|
+
{
|
|
811
|
+
key: row.badgeId,
|
|
812
|
+
className: `grid grid-cols-[1.5fr_2fr_0.8fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
|
|
813
|
+
},
|
|
814
|
+
/* @__PURE__ */ React__namespace.createElement(
|
|
815
|
+
"button",
|
|
816
|
+
{
|
|
817
|
+
type: "button",
|
|
818
|
+
onClick: () => props.onClick && props.onClick(row),
|
|
819
|
+
className: "truncate text-left text-xs font-bold text-dark-blue-400 hover:text-sky-blue-400"
|
|
820
|
+
},
|
|
821
|
+
row.name
|
|
822
|
+
),
|
|
823
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs text-slate-500" }, row.description),
|
|
824
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-center text-xs font-bold text-dark-blue-400" }, Math.round((row.percentageCompletion + Number.EPSILON) * 100), "%")
|
|
825
|
+
)));
|
|
806
826
|
}
|
|
807
827
|
|
|
808
828
|
function Table$d(props) {
|
|
829
|
+
const { items: sortedItems, requestSort, sortConfig } = useSortableData(props.items);
|
|
809
830
|
if (props.items.length === 0) {
|
|
810
831
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
811
832
|
PlaceholderBanner,
|
|
@@ -817,13 +838,37 @@ function Table$d(props) {
|
|
|
817
838
|
}
|
|
818
839
|
);
|
|
819
840
|
}
|
|
820
|
-
const
|
|
821
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
841
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
842
|
+
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-[1.5fr_2fr_0.8fr] 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("name"), className: "flex items-center text-left hover:text-slate-700" }, "Lesson Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("div", null, "Description"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("percentageCompletion"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "Completion", indicator("percentageCompletion"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
843
|
+
"div",
|
|
844
|
+
{
|
|
845
|
+
key: row.lessonId,
|
|
846
|
+
className: `grid grid-cols-[1.5fr_2fr_0.8fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
|
|
847
|
+
},
|
|
848
|
+
/* @__PURE__ */ React__namespace.createElement(
|
|
849
|
+
"button",
|
|
850
|
+
{
|
|
851
|
+
type: "button",
|
|
852
|
+
onClick: () => props.onClick && props.onClick(row),
|
|
853
|
+
className: "truncate text-left text-xs font-bold text-dark-blue-400 hover:text-sky-blue-400"
|
|
854
|
+
},
|
|
855
|
+
row.name
|
|
856
|
+
),
|
|
857
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs text-slate-500" }, row.description),
|
|
858
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-center text-xs font-bold text-dark-blue-400" }, Math.round((row.percentageCompletion + Number.EPSILON) * 100), "%")
|
|
859
|
+
)));
|
|
822
860
|
}
|
|
823
861
|
|
|
862
|
+
const TABS$3 = [
|
|
863
|
+
{ label: "My students", value: "students" },
|
|
864
|
+
{ label: "Impact statements", value: "impact" },
|
|
865
|
+
{ label: "Reflections", value: "reflections" },
|
|
866
|
+
{ label: "Badges", value: "badges" },
|
|
867
|
+
{ label: "Lessons", value: "lessons" }
|
|
868
|
+
];
|
|
824
869
|
const Dashboard = (props) => {
|
|
825
870
|
const [tab, setTab] = React.useState("students");
|
|
826
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
871
|
+
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("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Dashboard"), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, "Track your students' pathway progress")), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
827
872
|
{
|
|
828
873
|
title: "# OF STUDENTS",
|
|
829
874
|
value: props.students.length
|
|
@@ -841,35 +886,24 @@ const Dashboard = (props) => {
|
|
|
841
886
|
title: "LESSONS COMPLETED",
|
|
842
887
|
value: props.numberOfLessonsCompleted
|
|
843
888
|
}
|
|
844
|
-
] }), /* @__PURE__ */ React__namespace.createElement(
|
|
845
|
-
|
|
889
|
+
] }), /* @__PURE__ */ React__namespace.createElement("div", { className: "relative w-full max-w-xs" }, /* @__PURE__ */ React__namespace.createElement(icons.IconCategory2, { size: 16, stroke: 2, className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
|
|
890
|
+
"select",
|
|
846
891
|
{
|
|
847
|
-
clearable: true,
|
|
848
|
-
clearButtonLabel: "Clear class selection",
|
|
849
|
-
size: "sm",
|
|
850
|
-
placeholder: "Select a class",
|
|
851
|
-
nothingFound: "No options",
|
|
852
892
|
value: props.classId,
|
|
853
|
-
onChange: props.onClassChange,
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
Tabs,
|
|
893
|
+
onChange: (e) => props.onClassChange(e.target.value),
|
|
894
|
+
className: "w-full appearance-none rounded-lg border border-slate-200 bg-white py-2 pl-9 pr-4 text-sm text-dark-blue-400 focus:border-sky-blue-400 focus:outline-none"
|
|
895
|
+
},
|
|
896
|
+
/* @__PURE__ */ React__namespace.createElement("option", { value: "" }, "All classes"),
|
|
897
|
+
props.classes.map((c) => /* @__PURE__ */ React__namespace.createElement("option", { key: c.classId, value: c.classId }, c.name))
|
|
898
|
+
)), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-fit flex-wrap gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS$3.map((t) => /* @__PURE__ */ React__namespace.createElement(
|
|
899
|
+
"button",
|
|
861
900
|
{
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
{ label: "Lessons", value: "lessons" }
|
|
869
|
-
],
|
|
870
|
-
onChange: setTab
|
|
871
|
-
}
|
|
872
|
-
), tab === "impact" && /* @__PURE__ */ React__namespace.createElement(
|
|
901
|
+
key: t.value,
|
|
902
|
+
onClick: () => setTab(t.value),
|
|
903
|
+
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"}`
|
|
904
|
+
},
|
|
905
|
+
t.label
|
|
906
|
+
))), tab === "impact" && /* @__PURE__ */ React__namespace.createElement(
|
|
873
907
|
Table$f,
|
|
874
908
|
{
|
|
875
909
|
loading: props.loading,
|
|
@@ -902,12 +936,12 @@ const Dashboard = (props) => {
|
|
|
902
936
|
items: props.students,
|
|
903
937
|
onViewProfile: props.onViewStudentProfile
|
|
904
938
|
}
|
|
905
|
-
)))
|
|
939
|
+
)));
|
|
906
940
|
};
|
|
907
941
|
|
|
908
942
|
var __defProp$d = Object.defineProperty;
|
|
909
|
-
var __defProps$
|
|
910
|
-
var __getOwnPropDescs$
|
|
943
|
+
var __defProps$a = Object.defineProperties;
|
|
944
|
+
var __getOwnPropDescs$a = Object.getOwnPropertyDescriptors;
|
|
911
945
|
var __getOwnPropSymbols$d = Object.getOwnPropertySymbols;
|
|
912
946
|
var __hasOwnProp$d = Object.prototype.hasOwnProperty;
|
|
913
947
|
var __propIsEnum$d = Object.prototype.propertyIsEnumerable;
|
|
@@ -923,8 +957,8 @@ var __spreadValues$d = (a, b) => {
|
|
|
923
957
|
}
|
|
924
958
|
return a;
|
|
925
959
|
};
|
|
926
|
-
var __spreadProps$
|
|
927
|
-
const openDeleteModal = (student, onDelete) => modals.openConfirmModal({
|
|
960
|
+
var __spreadProps$a = (a, b) => __defProps$a(a, __getOwnPropDescs$a(b));
|
|
961
|
+
const openDeleteModal$2 = (student, onDelete) => modals.openConfirmModal({
|
|
928
962
|
title: `Remove "${student.givenName && student.familyName ? `${student.givenName} ${student.familyName}` : student.email}" from this class?`,
|
|
929
963
|
centered: true,
|
|
930
964
|
children: /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm" }, "Click confirm if you want to remove the student from this specific class. This will NOT remove the student from the Tech Platform."),
|
|
@@ -934,7 +968,7 @@ const openDeleteModal = (student, onDelete) => modals.openConfirmModal({
|
|
|
934
968
|
});
|
|
935
969
|
function Table$c(props) {
|
|
936
970
|
const preparedItems = React__namespace.useMemo(() => {
|
|
937
|
-
return props.items.map((item) => __spreadProps$
|
|
971
|
+
return props.items.map((item) => __spreadProps$a(__spreadValues$d({}, item), {
|
|
938
972
|
fullName: item.givenName && item.familyName ? `${item.givenName} ${item.familyName}`.toLowerCase() : item.email.toLowerCase()
|
|
939
973
|
}));
|
|
940
974
|
}, [props.items]);
|
|
@@ -976,7 +1010,7 @@ function Table$c(props) {
|
|
|
976
1010
|
"button",
|
|
977
1011
|
{
|
|
978
1012
|
type: "button",
|
|
979
|
-
onClick: () => openDeleteModal(row, props.onDelete),
|
|
1013
|
+
onClick: () => openDeleteModal$2(row, props.onDelete),
|
|
980
1014
|
className: "flex h-7 w-7 items-center justify-center rounded-md text-slate-400 hover:bg-red-50 hover:text-red-500"
|
|
981
1015
|
},
|
|
982
1016
|
/* @__PURE__ */ React__namespace.createElement(icons.IconTrash, { size: 14, stroke: 1.75 })
|
|
@@ -986,8 +1020,8 @@ function Table$c(props) {
|
|
|
986
1020
|
}
|
|
987
1021
|
|
|
988
1022
|
var __defProp$c = Object.defineProperty;
|
|
989
|
-
var __defProps$
|
|
990
|
-
var __getOwnPropDescs$
|
|
1023
|
+
var __defProps$9 = Object.defineProperties;
|
|
1024
|
+
var __getOwnPropDescs$9 = Object.getOwnPropertyDescriptors;
|
|
991
1025
|
var __getOwnPropSymbols$c = Object.getOwnPropertySymbols;
|
|
992
1026
|
var __hasOwnProp$c = Object.prototype.hasOwnProperty;
|
|
993
1027
|
var __propIsEnum$c = Object.prototype.propertyIsEnumerable;
|
|
@@ -1003,7 +1037,7 @@ var __spreadValues$c = (a, b) => {
|
|
|
1003
1037
|
}
|
|
1004
1038
|
return a;
|
|
1005
1039
|
};
|
|
1006
|
-
var __spreadProps$
|
|
1040
|
+
var __spreadProps$9 = (a, b) => __defProps$9(a, __getOwnPropDescs$9(b));
|
|
1007
1041
|
const Class = (props) => {
|
|
1008
1042
|
const [opened, setOpened] = React.useState(false);
|
|
1009
1043
|
return /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, /* @__PURE__ */ React__namespace.createElement(
|
|
@@ -1015,7 +1049,7 @@ const Class = (props) => {
|
|
|
1015
1049
|
padding: "xl",
|
|
1016
1050
|
size: "xl"
|
|
1017
1051
|
},
|
|
1018
|
-
/* @__PURE__ */ React__namespace.createElement(DropzoneButton$1, __spreadProps$
|
|
1052
|
+
/* @__PURE__ */ React__namespace.createElement(DropzoneButton$1, __spreadProps$9(__spreadValues$c({}, props), { close: () => setOpened(false) }))
|
|
1019
1053
|
), /* @__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(
|
|
1020
1054
|
"button",
|
|
1021
1055
|
{
|
|
@@ -1168,6 +1202,14 @@ const DropzoneButton$1 = (props) => {
|
|
|
1168
1202
|
))));
|
|
1169
1203
|
};
|
|
1170
1204
|
|
|
1205
|
+
const openDeleteModal$1 = (group, onDeleteClass) => modals.openConfirmModal({
|
|
1206
|
+
title: `Delete "${group.name}"?`,
|
|
1207
|
+
centered: true,
|
|
1208
|
+
children: /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm" }, "Are you sure you want to delete this class? This action is destructive and you will have to contact support to restore your data."),
|
|
1209
|
+
labels: { confirm: "Delete class", cancel: "No don't delete it" },
|
|
1210
|
+
confirmProps: { color: "red" },
|
|
1211
|
+
onConfirm: () => onDeleteClass(group)
|
|
1212
|
+
});
|
|
1171
1213
|
function Table$b(props) {
|
|
1172
1214
|
const { items: sortedItems, requestSort, sortConfig } = useSortableData(props.items);
|
|
1173
1215
|
if (props.items.length === 0) {
|
|
@@ -1181,57 +1223,26 @@ function Table$b(props) {
|
|
|
1181
1223
|
}
|
|
1182
1224
|
);
|
|
1183
1225
|
}
|
|
1184
|
-
const
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
striped: true,
|
|
1205
|
-
records: sortedItems,
|
|
1206
|
-
idAccessor: "classId",
|
|
1207
|
-
sortStatus,
|
|
1208
|
-
onSortStatusChange: (status) => requestSort(status.columnAccessor),
|
|
1209
|
-
columns: [
|
|
1210
|
-
{
|
|
1211
|
-
accessor: "name",
|
|
1212
|
-
title: "Class Name",
|
|
1213
|
-
sortable: true,
|
|
1214
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, { component: reactRouterDom.Link, to: row.href }, /* @__PURE__ */ React__namespace.createElement(core.Text, { size: 14, weight: 500 }, row.name))
|
|
1215
|
-
},
|
|
1216
|
-
{
|
|
1217
|
-
accessor: "description",
|
|
1218
|
-
title: "Description",
|
|
1219
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.Text, { size: 14 }, row.description)
|
|
1220
|
-
},
|
|
1221
|
-
{
|
|
1222
|
-
accessor: "numberOfStudents",
|
|
1223
|
-
title: "# of Students",
|
|
1224
|
-
sortable: true,
|
|
1225
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.Text, { size: 14 }, row.numberOfStudents || 0)
|
|
1226
|
-
},
|
|
1227
|
-
{
|
|
1228
|
-
accessor: "actions",
|
|
1229
|
-
title: "",
|
|
1230
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.Group, { noWrap: true, spacing: 0, position: "right" }, /* @__PURE__ */ React__namespace.createElement(core.ActionIcon, { color: "red", onClick: () => openDeleteModal(row) }, /* @__PURE__ */ React__namespace.createElement(icons.IconTrash, { size: 16, stroke: 1.5 })))
|
|
1231
|
-
}
|
|
1232
|
-
]
|
|
1233
|
-
}
|
|
1234
|
-
));
|
|
1226
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
1227
|
+
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-[1.5fr_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("name"), className: "flex items-center text-left hover:text-slate-700" }, "Class Name", indicator("name")), /* @__PURE__ */ React__namespace.createElement("div", null, "Description"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("numberOfStudents"), className: "flex items-center justify-center text-center hover:text-slate-700" }, "# of Students", indicator("numberOfStudents")), /* @__PURE__ */ React__namespace.createElement("div", null)), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
1228
|
+
"div",
|
|
1229
|
+
{
|
|
1230
|
+
key: row.classId,
|
|
1231
|
+
className: `grid grid-cols-[1.5fr_2fr_1fr_0.6fr] items-center gap-3 px-5 py-3.5 ${i < sortedItems.length - 1 ? "border-b border-slate-100" : ""}`
|
|
1232
|
+
},
|
|
1233
|
+
row.href ? /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: row.href, className: "truncate text-xs font-bold text-dark-blue-400 no-underline hover:text-sky-blue-400" }, row.name) : /* @__PURE__ */ React__namespace.createElement("span", { className: "truncate text-xs font-bold text-dark-blue-400" }, row.name),
|
|
1234
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "truncate text-xs text-slate-500" }, row.description),
|
|
1235
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-center text-xs font-bold text-dark-blue-400" }, row.numberOfStudents || 0),
|
|
1236
|
+
/* @__PURE__ */ React__namespace.createElement("div", null, /* @__PURE__ */ React__namespace.createElement(
|
|
1237
|
+
"button",
|
|
1238
|
+
{
|
|
1239
|
+
type: "button",
|
|
1240
|
+
onClick: () => openDeleteModal$1(row, props.onDeleteClass),
|
|
1241
|
+
className: "flex h-7 w-7 items-center justify-center rounded-md text-slate-400 hover:bg-red-50 hover:text-red-500"
|
|
1242
|
+
},
|
|
1243
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconTrash, { size: 14, stroke: 1.75 })
|
|
1244
|
+
))
|
|
1245
|
+
)));
|
|
1235
1246
|
}
|
|
1236
1247
|
|
|
1237
1248
|
var __defProp$b = Object.defineProperty;
|
|
@@ -1250,20 +1261,7 @@ var __spreadValues$b = (a, b) => {
|
|
|
1250
1261
|
}
|
|
1251
1262
|
return a;
|
|
1252
1263
|
};
|
|
1253
|
-
const useStyles$f = core.createStyles((theme) => ({
|
|
1254
|
-
title: {
|
|
1255
|
-
fontSize: 34,
|
|
1256
|
-
fontWeight: 900,
|
|
1257
|
-
[theme.fn.smallerThan("sm")]: {
|
|
1258
|
-
fontSize: 24
|
|
1259
|
-
}
|
|
1260
|
-
},
|
|
1261
|
-
description: {
|
|
1262
|
-
maxWidth: 600
|
|
1263
|
-
}
|
|
1264
|
-
}));
|
|
1265
1264
|
const Classes = (props) => {
|
|
1266
|
-
const { classes } = useStyles$f();
|
|
1267
1265
|
const form$1 = form.useForm({
|
|
1268
1266
|
initialValues: {
|
|
1269
1267
|
classId: "",
|
|
@@ -1291,7 +1289,7 @@ const Classes = (props) => {
|
|
|
1291
1289
|
form$1.reset();
|
|
1292
1290
|
setOpened(false);
|
|
1293
1291
|
props.onCreateClass && props.onCreateClass(values);
|
|
1294
|
-
}) }, /* @__PURE__ */ React__namespace.createElement(
|
|
1292
|
+
}) }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1295
1293
|
core.TextInput,
|
|
1296
1294
|
__spreadValues$b({
|
|
1297
1295
|
withAsterisk: true,
|
|
@@ -1304,34 +1302,44 @@ const Classes = (props) => {
|
|
|
1304
1302
|
label: "Description",
|
|
1305
1303
|
placeholder: "A class for my first period English students"
|
|
1306
1304
|
}, form$1.getInputProps("description"))
|
|
1307
|
-
)
|
|
1308
|
-
|
|
1309
|
-
|
|
1305
|
+
), /* @__PURE__ */ React__namespace.createElement(
|
|
1306
|
+
"button",
|
|
1307
|
+
{
|
|
1308
|
+
type: "submit",
|
|
1309
|
+
className: "mt-2 rounded-lg bg-dark-blue-400 px-4 py-2.5 text-xs font-bold text-white"
|
|
1310
|
+
},
|
|
1311
|
+
"Submit"
|
|
1312
|
+
)))
|
|
1313
|
+
), /* @__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("h1", { className: "text-2xl font-extrabold tracking-tight text-dark-blue-400" }, "Organize people into classes"), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, "Create classes, cohorts, or custom subgroups")), !props.loading && /* @__PURE__ */ React__namespace.createElement(
|
|
1314
|
+
"button",
|
|
1310
1315
|
{
|
|
1316
|
+
type: "button",
|
|
1311
1317
|
onClick: () => setOpened(true),
|
|
1312
|
-
|
|
1318
|
+
className: "flex items-center gap-1.5 rounded-lg bg-gradient-to-r from-gold-400 to-[#f5c300] px-3.5 py-2 text-xs font-bold text-dark-blue-400 shadow-[0_3px_12px_rgba(255,212,77,0.35)]"
|
|
1313
1319
|
},
|
|
1320
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconPlaylistAdd, { size: 13, stroke: 2 }),
|
|
1314
1321
|
"Create class"
|
|
1315
|
-
))
|
|
1322
|
+
)), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
1316
1323
|
{
|
|
1317
1324
|
title: "# OF CLASSES",
|
|
1318
1325
|
value: props.classes.length
|
|
1319
1326
|
}
|
|
1320
|
-
] }), /* @__PURE__ */ React__namespace.createElement(
|
|
1321
|
-
|
|
1327
|
+
] }), /* @__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(
|
|
1328
|
+
"input",
|
|
1322
1329
|
{
|
|
1330
|
+
type: "text",
|
|
1323
1331
|
placeholder: "Search for classes",
|
|
1324
|
-
|
|
1325
|
-
|
|
1332
|
+
onChange: (e) => props.onAutocompleteChange(e.target.value),
|
|
1333
|
+
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"
|
|
1326
1334
|
}
|
|
1327
|
-
), /* @__PURE__ */ React__namespace.createElement(
|
|
1335
|
+
)), /* @__PURE__ */ React__namespace.createElement(
|
|
1328
1336
|
Table$b,
|
|
1329
1337
|
{
|
|
1330
1338
|
loading: props.loading,
|
|
1331
1339
|
items: props.classes,
|
|
1332
1340
|
onDeleteClass: props.onDeleteClass
|
|
1333
1341
|
}
|
|
1334
|
-
)))
|
|
1342
|
+
)));
|
|
1335
1343
|
};
|
|
1336
1344
|
|
|
1337
1345
|
function Table$a(props) {
|
|
@@ -1414,7 +1422,7 @@ function Table$8(props) {
|
|
|
1414
1422
|
)));
|
|
1415
1423
|
}
|
|
1416
1424
|
|
|
1417
|
-
const TABS$
|
|
1425
|
+
const TABS$2 = [
|
|
1418
1426
|
{ label: "My badges", value: "badges" },
|
|
1419
1427
|
{ label: "My answers", value: "answers" },
|
|
1420
1428
|
{ label: "My reflections", value: "reflections" }
|
|
@@ -1436,7 +1444,7 @@ const Student = (props) => {
|
|
|
1436
1444
|
title: "BADGE COMPLETION",
|
|
1437
1445
|
value: numberOfBadgesCompleted
|
|
1438
1446
|
}
|
|
1439
|
-
] }), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-fit gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS$
|
|
1447
|
+
] }), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex w-fit gap-1 rounded-xl border border-slate-200 bg-white p-1" }, TABS$2.map((t) => /* @__PURE__ */ React__namespace.createElement(
|
|
1440
1448
|
"button",
|
|
1441
1449
|
{
|
|
1442
1450
|
key: t.value,
|
|
@@ -1554,65 +1562,35 @@ function Table$7(props) {
|
|
|
1554
1562
|
}
|
|
1555
1563
|
);
|
|
1556
1564
|
}
|
|
1557
|
-
const
|
|
1558
|
-
|
|
1559
|
-
direction: sortConfig.direction === "desc" ? "desc" : "asc"
|
|
1560
|
-
};
|
|
1561
|
-
return /* @__PURE__ */ React__namespace.createElement(core.ScrollArea.Autosize, { maxHeight: 600 }, /* @__PURE__ */ React__namespace.createElement(
|
|
1562
|
-
mantineDatatable.DataTable,
|
|
1563
|
-
{
|
|
1564
|
-
records: sortedItems,
|
|
1565
|
-
sortStatus,
|
|
1566
|
-
onSortStatusChange: (status) => requestSort(status.columnAccessor),
|
|
1567
|
-
columns: [
|
|
1568
|
-
{ accessor: "studentName", title: "Student Name", sortable: true },
|
|
1569
|
-
{ accessor: "reflection", title: "Reflection" },
|
|
1570
|
-
{ accessor: "rating", title: "Rating", sortable: true }
|
|
1571
|
-
]
|
|
1572
|
-
}
|
|
1573
|
-
));
|
|
1565
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
1566
|
+
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("button", { onClick: () => requestSort("studentName"), className: "w-40 shrink-0 text-left hover:text-slate-600" }, "Student Name", indicator("studentName")), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1" }, "Reflection"), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("rating"), className: "w-20 shrink-0 text-right hover:text-slate-600" }, "Rating", indicator("rating"))), sortedItems.map((row, i) => /* @__PURE__ */ React__namespace.createElement("div", { key: `${row.studentName}-${i}`, className: "rounded-xl border border-slate-200 bg-white p-4 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0 text-sm font-bold text-dark-blue-400" }, row.studentName), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex-1 text-sm text-slate-600" }, row.reflection), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-20 shrink-0 text-right text-sm text-slate-500" }, row.rating)))));
|
|
1574
1567
|
}
|
|
1575
1568
|
|
|
1576
|
-
const useStyles$e = core.createStyles((theme) => ({
|
|
1577
|
-
button: {
|
|
1578
|
-
borderTopRightRadius: 0,
|
|
1579
|
-
borderBottomRightRadius: 0,
|
|
1580
|
-
marginLeft: 0,
|
|
1581
|
-
marginRight: 0
|
|
1582
|
-
},
|
|
1583
|
-
menuControl: {
|
|
1584
|
-
borderTopLeftRadius: 0,
|
|
1585
|
-
borderBottomLeftRadius: 0,
|
|
1586
|
-
border: 0,
|
|
1587
|
-
borderLeft: `1px solid ${theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.white}`
|
|
1588
|
-
}
|
|
1589
|
-
}));
|
|
1590
1569
|
const SplitButton$3 = (props) => {
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1594
|
-
core.Button,
|
|
1570
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1571
|
+
reactRouterDom.Link,
|
|
1595
1572
|
{
|
|
1596
|
-
component: reactRouterDom.Link,
|
|
1597
1573
|
to: props.href,
|
|
1598
|
-
className:
|
|
1599
|
-
variant: "gradient"
|
|
1574
|
+
className: "flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white px-3.5 py-2 text-xs font-bold text-slate-600 no-underline hover:bg-slate-50"
|
|
1600
1575
|
},
|
|
1601
1576
|
"Preview"
|
|
1602
1577
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
1603
|
-
|
|
1578
|
+
"button",
|
|
1604
1579
|
{
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1580
|
+
type: "button",
|
|
1581
|
+
onClick: props.onCopyLinkClick,
|
|
1582
|
+
className: "flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white px-3.5 py-2 text-xs font-bold text-slate-600 hover:bg-slate-50"
|
|
1608
1583
|
},
|
|
1584
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconClipboardCopy, { size: 13, stroke: 2 }),
|
|
1609
1585
|
"Copy link"
|
|
1610
1586
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
1611
|
-
|
|
1587
|
+
"button",
|
|
1612
1588
|
{
|
|
1613
|
-
|
|
1614
|
-
onClick: props.onExportDataClick
|
|
1589
|
+
type: "button",
|
|
1590
|
+
onClick: props.onExportDataClick,
|
|
1591
|
+
className: "flex items-center gap-1.5 rounded-lg bg-gradient-to-r from-gold-400 to-[#f5c300] px-3.5 py-2 text-xs font-bold text-dark-blue-400 shadow-[0_3px_12px_rgba(255,212,77,0.35)]"
|
|
1615
1592
|
},
|
|
1593
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconTableExport, { size: 13, stroke: 2 }),
|
|
1616
1594
|
"Export data (.csv)"
|
|
1617
1595
|
));
|
|
1618
1596
|
};
|
|
@@ -1621,13 +1599,12 @@ function Stack$3(props) {
|
|
|
1621
1599
|
if (props.items.length === 0) {
|
|
1622
1600
|
return null;
|
|
1623
1601
|
}
|
|
1624
|
-
|
|
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)));
|
|
1602
|
+
return /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: props.href, className: "flex flex-col gap-4 no-underline" }, props.items.map((row) => /* @__PURE__ */ React__namespace.createElement("div", { key: row.questionName }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm font-bold text-dark-blue-400" }, row.questionName), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-sm text-slate-600" }, row.answer.join(", ") || "No answer."))));
|
|
1626
1603
|
}
|
|
1627
1604
|
|
|
1628
1605
|
var __defProp$a = Object.defineProperty;
|
|
1629
|
-
var __defProps$
|
|
1630
|
-
var __getOwnPropDescs$
|
|
1606
|
+
var __defProps$8 = Object.defineProperties;
|
|
1607
|
+
var __getOwnPropDescs$8 = Object.getOwnPropertyDescriptors;
|
|
1631
1608
|
var __getOwnPropSymbols$a = Object.getOwnPropertySymbols;
|
|
1632
1609
|
var __hasOwnProp$a = Object.prototype.hasOwnProperty;
|
|
1633
1610
|
var __propIsEnum$a = Object.prototype.propertyIsEnumerable;
|
|
@@ -1643,18 +1620,15 @@ var __spreadValues$a = (a, b) => {
|
|
|
1643
1620
|
}
|
|
1644
1621
|
return a;
|
|
1645
1622
|
};
|
|
1646
|
-
var __spreadProps$
|
|
1623
|
+
var __spreadProps$8 = (a, b) => __defProps$8(a, __getOwnPropDescs$8(b));
|
|
1647
1624
|
function Table$6(props) {
|
|
1625
|
+
const [expanded, setExpanded] = React__namespace.useState({});
|
|
1648
1626
|
const preparedItems = React__namespace.useMemo(() => {
|
|
1649
|
-
return props.items.map((item) => __spreadProps$
|
|
1627
|
+
return props.items.map((item) => __spreadProps$8(__spreadValues$a({}, item), {
|
|
1650
1628
|
status: item.isComplete ? 2 : item.isStarted ? 1 : 0
|
|
1651
1629
|
}));
|
|
1652
1630
|
}, [props.items]);
|
|
1653
1631
|
const { items: sortedItems, requestSort, sortConfig } = useSortableData(preparedItems);
|
|
1654
|
-
const sortStatus = {
|
|
1655
|
-
columnAccessor: sortConfig.key,
|
|
1656
|
-
direction: sortConfig.direction === "desc" ? "desc" : "asc"
|
|
1657
|
-
};
|
|
1658
1632
|
if (props.items.length === 0) {
|
|
1659
1633
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
1660
1634
|
PlaceholderBanner,
|
|
@@ -1666,36 +1640,22 @@ function Table$6(props) {
|
|
|
1666
1640
|
}
|
|
1667
1641
|
);
|
|
1668
1642
|
}
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
title: "Student Name",
|
|
1686
|
-
sortable: true,
|
|
1687
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.UnstyledButton, null, /* @__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))))
|
|
1688
|
-
}, {
|
|
1689
|
-
accessor: "status",
|
|
1690
|
-
title: "Status",
|
|
1691
|
-
sortable: true,
|
|
1692
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(React__namespace.Fragment, null, !!row.isComplete && /* @__PURE__ */ React__namespace.createElement(core.Badge, { variant: "filled" }, "Complete"), !row.isComplete && !row.isStarted && /* @__PURE__ */ React__namespace.createElement(core.Badge, { color: "red", variant: "filled" }, "Not started"), !row.isComplete && !!row.isStarted && /* @__PURE__ */ React__namespace.createElement(core.Badge, { color: "violet", variant: "filled" }, "In progress"))
|
|
1693
|
-
}],
|
|
1694
|
-
rowExpansion: {
|
|
1695
|
-
content: ({ record }) => /* @__PURE__ */ React__namespace.createElement(Stack$3, { href: record.href, items: record.answers })
|
|
1696
|
-
}
|
|
1697
|
-
}
|
|
1698
|
-
));
|
|
1643
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
1644
|
+
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("status"), className: "w-28 shrink-0 text-center hover:text-slate-600" }, "Status", indicator("status")), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
|
|
1645
|
+
var _a;
|
|
1646
|
+
const isOpen = !!expanded[row.userId];
|
|
1647
|
+
const initials = (((_a = row.name) == null ? void 0 : _a[0]) || row.email[0] || "?").toUpperCase();
|
|
1648
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1649
|
+
"div",
|
|
1650
|
+
{
|
|
1651
|
+
onClick: () => setExpanded(__spreadProps$8(__spreadValues$a({}, expanded), { [row.userId]: !isOpen })),
|
|
1652
|
+
className: "flex cursor-pointer items-center gap-4 p-4"
|
|
1653
|
+
},
|
|
1654
|
+
/* @__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-mint-400/20 text-xs font-bold text-dark-blue-400" }, initials), /* @__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))),
|
|
1655
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-28 shrink-0 text-center" }, row.isComplete && /* @__PURE__ */ React__namespace.createElement("span", { className: "rounded-full bg-mint-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, "Complete"), !row.isComplete && !row.isStarted && /* @__PURE__ */ React__namespace.createElement("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-bold text-slate-500" }, "Not started"), !row.isComplete && !!row.isStarted && /* @__PURE__ */ React__namespace.createElement("span", { className: "rounded-full bg-gold-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, "In progress")),
|
|
1656
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronDown, { size: 15, stroke: 2.3, className: `shrink-0 text-slate-400 transition-transform ${isOpen ? "rotate-180" : ""}` })
|
|
1657
|
+
), isOpen && /* @__PURE__ */ React__namespace.createElement("div", { className: "border-t border-slate-100 px-4 py-3" }, /* @__PURE__ */ React__namespace.createElement(Stack$3, { href: row.href, items: row.answers })));
|
|
1658
|
+
}));
|
|
1699
1659
|
}
|
|
1700
1660
|
|
|
1701
1661
|
function Stack$2(props) {
|
|
@@ -1726,7 +1686,7 @@ function Stack$2(props) {
|
|
|
1726
1686
|
}
|
|
1727
1687
|
);
|
|
1728
1688
|
}
|
|
1729
|
-
|
|
1689
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.items.map((row) => {
|
|
1730
1690
|
if (row.chart) {
|
|
1731
1691
|
const labelMap = {};
|
|
1732
1692
|
const choices = row.choices || [];
|
|
@@ -1738,7 +1698,7 @@ function Stack$2(props) {
|
|
|
1738
1698
|
labelMap[r] = labelMap[r] ? labelMap[r] + 1 : 1;
|
|
1739
1699
|
}
|
|
1740
1700
|
}));
|
|
1741
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
1701
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { key: row.question, className: "rounded-xl border border-slate-200 bg-white p-6 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-base font-extrabold text-dark-blue-400" }, row.question), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs text-slate-500" }, row.answers.length, " answers"), /* @__PURE__ */ React__namespace.createElement("div", { className: "relative mt-4 h-[300px] w-full bg-white" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1742
1702
|
reactCharts.Chart,
|
|
1743
1703
|
{
|
|
1744
1704
|
options: {
|
|
@@ -1755,64 +1715,24 @@ function Stack$2(props) {
|
|
|
1755
1715
|
secondaryAxes
|
|
1756
1716
|
}
|
|
1757
1717
|
}
|
|
1758
|
-
)))
|
|
1718
|
+
)));
|
|
1759
1719
|
}
|
|
1760
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
1720
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { key: row.question, className: "rounded-xl border border-slate-200 bg-white p-6 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement("div", { className: "text-base font-extrabold text-dark-blue-400" }, row.question), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1 text-xs text-slate-500" }, row.answers.length, " answers"), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-4 flex flex-col gap-2" }, row.answers.map((a) => {
|
|
1761
1721
|
const answerText = a.join("\n");
|
|
1762
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
1763
|
-
})))
|
|
1764
|
-
});
|
|
1765
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Stack, { py: 4, spacing: 10, sx: { minWidth: 700 } }, rows);
|
|
1722
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { key: answerText, className: "rounded-lg bg-slate-50 p-3 text-sm text-slate-700" }, answerText);
|
|
1723
|
+
})));
|
|
1724
|
+
}));
|
|
1766
1725
|
}
|
|
1767
1726
|
const truncateWithEllipses = (text, max) => text.substr(0, max - 1) + (text.length > max ? "…" : "");
|
|
1768
1727
|
|
|
1769
|
-
const
|
|
1770
|
-
title: {
|
|
1771
|
-
fontSize: 34,
|
|
1772
|
-
fontWeight: 900,
|
|
1773
|
-
[theme.fn.smallerThan("sm")]: {
|
|
1774
|
-
fontSize: 24
|
|
1775
|
-
}
|
|
1776
|
-
},
|
|
1777
|
-
description: {
|
|
1778
|
-
maxWidth: 600
|
|
1779
|
-
}
|
|
1780
|
-
}));
|
|
1728
|
+
const initialsFor = (name) => name.split(/[ -]/).map((n) => n.charAt(0)).join("").toUpperCase();
|
|
1781
1729
|
const Lesson = (props) => {
|
|
1782
|
-
const { classes } = useStyles$d();
|
|
1783
1730
|
const [tab, setTab] = React.useState("question");
|
|
1784
1731
|
const numberOfStudents = props.students.length;
|
|
1785
1732
|
const numberOfLessons = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
|
|
1786
|
-
numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length / numberOfStudents : 0;
|
|
1787
1733
|
const contributors = props.contributors || [];
|
|
1788
|
-
const
|
|
1789
|
-
|
|
1790
|
-
let initials = fullName.split(/[ -]/).map((n) => n.charAt(0)).join("");
|
|
1791
|
-
const src = AvatarInit.initialAvatar({
|
|
1792
|
-
background: "#1c7ed6",
|
|
1793
|
-
color: "#fff",
|
|
1794
|
-
fontFamily: "'Lato', 'Lato-Regular', 'Helvetica Neue'",
|
|
1795
|
-
fontSize: 10,
|
|
1796
|
-
fontWeight: 250,
|
|
1797
|
-
size: 30,
|
|
1798
|
-
initials
|
|
1799
|
-
});
|
|
1800
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Avatar, { key: i, src, radius: "xl" });
|
|
1801
|
-
});
|
|
1802
|
-
const remainingUsers = contributors.slice(5).length;
|
|
1803
|
-
if (remainingUsers) {
|
|
1804
|
-
const initials = "+" + compact(remainingUsers);
|
|
1805
|
-
const src = AvatarInit.initialAvatar({
|
|
1806
|
-
background: "#1c7ed6",
|
|
1807
|
-
color: "#fff",
|
|
1808
|
-
fontFamily: "'Lato', 'Lato-Regular', 'Helvetica Neue'",
|
|
1809
|
-
fontSize: 10,
|
|
1810
|
-
fontWeight: 250,
|
|
1811
|
-
size: 30,
|
|
1812
|
-
initials
|
|
1813
|
-
});
|
|
1814
|
-
avatars.push(/* @__PURE__ */ React__namespace.createElement(core.Avatar, { src, radius: "xl" }));
|
|
1815
|
-
}
|
|
1734
|
+
const visibleContributors = contributors.slice(0, 5);
|
|
1735
|
+
const remainingContributors = contributors.slice(5).length;
|
|
1816
1736
|
const tabs = props.trial ? [
|
|
1817
1737
|
{ label: "By question", value: "question" },
|
|
1818
1738
|
{ label: "By student", value: "students" }
|
|
@@ -1821,15 +1741,7 @@ const Lesson = (props) => {
|
|
|
1821
1741
|
{ label: "By student", value: "students" },
|
|
1822
1742
|
{ label: "By reflection", value: "reflections" }
|
|
1823
1743
|
];
|
|
1824
|
-
return /* @__PURE__ */ React__namespace.createElement(
|
|
1825
|
-
core.Badge,
|
|
1826
|
-
{
|
|
1827
|
-
variant: "filled",
|
|
1828
|
-
leftSection: /* @__PURE__ */ React__namespace.createElement(core.ActionIcon, { color: "blue", size: "xs", radius: "xl", variant: "filled" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 14 })),
|
|
1829
|
-
size: "lg"
|
|
1830
|
-
},
|
|
1831
|
-
"Back"
|
|
1832
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Group, null, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, props.displayName || "Lesson"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, props.description || "No description")), /* @__PURE__ */ React__namespace.createElement(core.Stack, { ml: "auto" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1744
|
+
return /* @__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 || "Lesson"), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.description || "No description")), /* @__PURE__ */ React__namespace.createElement(
|
|
1833
1745
|
SplitButton$3,
|
|
1834
1746
|
{
|
|
1835
1747
|
href: props.href,
|
|
@@ -1837,58 +1749,36 @@ const Lesson = (props) => {
|
|
|
1837
1749
|
onCopyLinkClick: props.onCopyLinkClick,
|
|
1838
1750
|
onExportDataClick: props.onExportDataClick
|
|
1839
1751
|
}
|
|
1840
|
-
))
|
|
1841
|
-
StatsGroup,
|
|
1842
|
-
{
|
|
1843
|
-
data: [
|
|
1844
|
-
{
|
|
1845
|
-
title: props.trial ? "# OF SUBMISSIONS" : "LESSON COMPLETION",
|
|
1846
|
-
value: props.trial ? props.lessonsCompleted || 0 : numberOfLessons,
|
|
1847
|
-
unit: props.trial ? "" : ""
|
|
1848
|
-
}
|
|
1849
|
-
]
|
|
1850
|
-
}
|
|
1851
|
-
), /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "apart" }, /* @__PURE__ */ React__namespace.createElement(core.Avatar.Group, { spacing: "sm" }, avatars)), !props.trial && /* @__PURE__ */ React__namespace.createElement(
|
|
1852
|
-
core.Select,
|
|
1853
|
-
{
|
|
1854
|
-
clearable: true,
|
|
1855
|
-
clearButtonLabel: "Clear class selection",
|
|
1856
|
-
size: "sm",
|
|
1857
|
-
placeholder: "Select a class",
|
|
1858
|
-
nothingFound: "No options",
|
|
1859
|
-
value: props.classId,
|
|
1860
|
-
onChange: props.onClassChange,
|
|
1861
|
-
icon: /* @__PURE__ */ React__namespace.createElement(icons.IconCategory2, null),
|
|
1862
|
-
data: props.classes.map((g) => {
|
|
1863
|
-
return { value: g.classId, label: g.name };
|
|
1864
|
-
})
|
|
1865
|
-
}
|
|
1866
|
-
), /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(
|
|
1867
|
-
Tabs,
|
|
1752
|
+
)), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
1868
1753
|
{
|
|
1869
|
-
|
|
1870
|
-
|
|
1871
|
-
onChange: setTab
|
|
1754
|
+
title: props.trial ? "# OF SUBMISSIONS" : "LESSON COMPLETION",
|
|
1755
|
+
value: props.trial ? props.lessonsCompleted || 0 : numberOfLessons
|
|
1872
1756
|
}
|
|
1873
|
-
),
|
|
1874
|
-
|
|
1757
|
+
] }), contributors.length > 0 && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex" }, visibleContributors.map((u, i) => /* @__PURE__ */ React__namespace.createElement(
|
|
1758
|
+
"div",
|
|
1875
1759
|
{
|
|
1876
|
-
|
|
1877
|
-
items:
|
|
1878
|
-
}
|
|
1879
|
-
|
|
1880
|
-
|
|
1760
|
+
key: i,
|
|
1761
|
+
className: "-ml-2 flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 border-white bg-mint-400/20 text-[10px] font-bold text-dark-blue-400 first:ml-0"
|
|
1762
|
+
},
|
|
1763
|
+
initialsFor(u.name)
|
|
1764
|
+
)), remainingContributors > 0 && /* @__PURE__ */ React__namespace.createElement("div", { className: "-ml-2 flex h-8 w-8 shrink-0 items-center justify-center rounded-full border-2 border-white bg-slate-200 text-[10px] font-bold text-slate-600" }, "+", compact(remainingContributors))), !props.trial && /* @__PURE__ */ React__namespace.createElement("div", { className: "relative w-full max-w-xs" }, /* @__PURE__ */ React__namespace.createElement(icons.IconCategory2, { size: 16, stroke: 2, className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
|
|
1765
|
+
"select",
|
|
1881
1766
|
{
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1767
|
+
value: props.classId,
|
|
1768
|
+
onChange: (e) => props.onClassChange(e.target.value),
|
|
1769
|
+
className: "w-full appearance-none rounded-lg border border-slate-200 bg-white py-2 pl-9 pr-4 text-sm text-dark-blue-400 focus:border-sky-blue-400 focus:outline-none"
|
|
1770
|
+
},
|
|
1771
|
+
/* @__PURE__ */ React__namespace.createElement("option", { value: "" }, "All classes"),
|
|
1772
|
+
props.classes.map((c) => /* @__PURE__ */ React__namespace.createElement("option", { key: c.classId, value: c.classId }, c.name))
|
|
1773
|
+
)), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__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(
|
|
1774
|
+
"button",
|
|
1887
1775
|
{
|
|
1888
|
-
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1776
|
+
key: t.value,
|
|
1777
|
+
onClick: () => setTab(t.value),
|
|
1778
|
+
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"}`
|
|
1779
|
+
},
|
|
1780
|
+
t.label
|
|
1781
|
+
))), tab === "question" && /* @__PURE__ */ React__namespace.createElement(Stack$2, { loading: props.loading, items: props.questions }), tab === "reflections" && /* @__PURE__ */ React__namespace.createElement(Table$7, { loading: props.loading, items: props.reflections }), tab === "students" && /* @__PURE__ */ React__namespace.createElement(Table$6, { loading: props.loading, items: props.students })));
|
|
1892
1782
|
};
|
|
1893
1783
|
|
|
1894
1784
|
function Table$5(props) {
|
|
@@ -1898,7 +1788,7 @@ function Table$5(props) {
|
|
|
1898
1788
|
if (props.items.length === 0) {
|
|
1899
1789
|
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.");
|
|
1900
1790
|
}
|
|
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(
|
|
1791
|
+
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" }, "Badge"), /* @__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
1792
|
reactRouterDom.Link,
|
|
1903
1793
|
{
|
|
1904
1794
|
key: row.lessonId,
|
|
@@ -1906,13 +1796,14 @@ function Table$5(props) {
|
|
|
1906
1796
|
className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
|
|
1907
1797
|
},
|
|
1908
1798
|
/* @__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)),
|
|
1799
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0 text-xs text-slate-500" }, row.badge || "\u2014"),
|
|
1909
1800
|
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-40 shrink-0 text-xs text-slate-500" }, row.pathway || "\u2014"),
|
|
1910
1801
|
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 16, stroke: 2, className: "w-4 shrink-0 text-slate-300" })
|
|
1911
1802
|
)));
|
|
1912
1803
|
}
|
|
1913
1804
|
|
|
1914
1805
|
const Lessons = (props) => {
|
|
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(
|
|
1806
|
+
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(PathwayFilterPills, { pathways: props.pathways, selected: props.selectedPathway, onChange: props.onPathwayChange }), /* @__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
1807
|
"input",
|
|
1917
1808
|
{
|
|
1918
1809
|
type: "text",
|
|
@@ -1923,37 +1814,23 @@ const Lessons = (props) => {
|
|
|
1923
1814
|
)), /* @__PURE__ */ React__namespace.createElement(Table$5, { loading: props.loading, items: props.lessons }));
|
|
1924
1815
|
};
|
|
1925
1816
|
|
|
1926
|
-
const useStyles$c = core.createStyles((theme) => ({
|
|
1927
|
-
title: {
|
|
1928
|
-
fontSize: 22,
|
|
1929
|
-
fontWeight: 900,
|
|
1930
|
-
fontFamily: `Greycliff CF, ${theme.fontFamily}`
|
|
1931
|
-
},
|
|
1932
|
-
controls: {
|
|
1933
|
-
[theme.fn.smallerThan("xs")]: {
|
|
1934
|
-
flexDirection: "column-reverse"
|
|
1935
|
-
}
|
|
1936
|
-
},
|
|
1937
|
-
control: {
|
|
1938
|
-
[theme.fn.smallerThan("xs")]: {
|
|
1939
|
-
width: "100%",
|
|
1940
|
-
textAlign: "center"
|
|
1941
|
-
}
|
|
1942
|
-
}
|
|
1943
|
-
}));
|
|
1944
1817
|
function AccessCode(props) {
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1818
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "max-w-[460px]" }, /* @__PURE__ */ React__namespace.createElement("h2", { className: "text-lg font-extrabold text-dark-blue-400" }, "Access code"), /* @__PURE__ */ React__namespace.createElement("p", { className: "text-sm text-slate-500" }, "Grant access to join your organization"), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-4 rounded-xl border border-slate-200 bg-white p-6 shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1819
|
+
"input",
|
|
1820
|
+
{
|
|
1821
|
+
value: props.value,
|
|
1822
|
+
readOnly: true,
|
|
1823
|
+
className: "w-full rounded-lg border border-slate-200 bg-slate-50 px-3 py-2 text-sm text-dark-blue-400"
|
|
1824
|
+
}
|
|
1825
|
+
), /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-4 flex flex-wrap items-center justify-between gap-3" }, /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: props.peopleLink, className: "flex items-center gap-1.5 text-xs font-bold text-slate-500 no-underline hover:text-slate-700" }, /* @__PURE__ */ React__namespace.createElement(icons.IconPointer, { size: 12, stroke: 1.5 }), "See people in my organization"), /* @__PURE__ */ React__namespace.createElement(
|
|
1826
|
+
"button",
|
|
1827
|
+
{
|
|
1828
|
+
type: "button",
|
|
1829
|
+
onClick: props.onCopyCode,
|
|
1830
|
+
className: "rounded-lg bg-gradient-to-r from-gold-400 to-[#f5c300] px-4 py-2 text-xs font-bold text-dark-blue-400 shadow-[0_3px_12px_rgba(255,212,77,0.35)]"
|
|
1954
1831
|
},
|
|
1955
|
-
|
|
1956
|
-
)
|
|
1832
|
+
"Copy code"
|
|
1833
|
+
))));
|
|
1957
1834
|
}
|
|
1958
1835
|
|
|
1959
1836
|
const monthNames = [
|
|
@@ -1970,46 +1847,8 @@ const monthNames = [
|
|
|
1970
1847
|
"November",
|
|
1971
1848
|
"December"
|
|
1972
1849
|
];
|
|
1973
|
-
const useStyles$b = core.createStyles((theme) => ({
|
|
1974
|
-
title: {
|
|
1975
|
-
fontSize: 34,
|
|
1976
|
-
fontWeight: 900,
|
|
1977
|
-
[theme.fn.smallerThan("sm")]: {
|
|
1978
|
-
fontSize: 24
|
|
1979
|
-
}
|
|
1980
|
-
},
|
|
1981
|
-
description: {
|
|
1982
|
-
maxWidth: 600
|
|
1983
|
-
},
|
|
1984
|
-
wrapper: {
|
|
1985
|
-
position: "relative",
|
|
1986
|
-
marginBottom: 30
|
|
1987
|
-
},
|
|
1988
|
-
dropzone: {
|
|
1989
|
-
borderWidth: 1,
|
|
1990
|
-
paddingBottom: 50
|
|
1991
|
-
},
|
|
1992
|
-
icon: {
|
|
1993
|
-
color: theme.colorScheme === "dark" ? theme.colors.dark[3] : theme.colors.gray[4]
|
|
1994
|
-
},
|
|
1995
|
-
control: {
|
|
1996
|
-
position: "absolute",
|
|
1997
|
-
width: 250,
|
|
1998
|
-
left: "calc(50% - 125px)",
|
|
1999
|
-
bottom: -20
|
|
2000
|
-
}
|
|
2001
|
-
}));
|
|
2002
1850
|
const Organization = (props) => {
|
|
2003
|
-
|
|
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(
|
|
2005
|
-
core.Badge,
|
|
2006
|
-
{
|
|
2007
|
-
variant: "filled",
|
|
2008
|
-
leftSection: /* @__PURE__ */ React__namespace.createElement(core.ActionIcon, { color: "blue", size: "xs", radius: "xl", variant: "filled" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 14 })),
|
|
2009
|
-
size: "lg"
|
|
2010
|
-
},
|
|
2011
|
-
"Back"
|
|
2012
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, props.displayName || "Overview"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, props.description || "No description"))), /* @__PURE__ */ React__namespace.createElement(AccessCode, { value: props.accessCode, onCopyCode: props.onCopyAccessCode, peopleLink: props.peopleLink }), /* @__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: [
|
|
1851
|
+
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.displayName || "Overview"), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.description || "No description")), /* @__PURE__ */ React__namespace.createElement(AccessCode, { value: props.accessCode, onCopyCode: props.onCopyAccessCode, peopleLink: props.peopleLink }), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
2013
1852
|
{
|
|
2014
1853
|
title: "# OF STUDENTS",
|
|
2015
1854
|
value: props.numberOfStudents || 0
|
|
@@ -2019,59 +1858,47 @@ const Organization = (props) => {
|
|
|
2019
1858
|
value: props.numberOfEducators || 0
|
|
2020
1859
|
},
|
|
2021
1860
|
{
|
|
2022
|
-
title: `ACTIVE USERS (${monthNames[new Date().getMonth()]})`,
|
|
2023
|
-
value: props.percentageOfAccountsActive,
|
|
2024
|
-
unit: "%"
|
|
2025
|
-
}
|
|
2026
|
-
] }))
|
|
2027
|
-
};
|
|
2028
|
-
|
|
2029
|
-
const useStyles$a = core.createStyles((theme) => ({
|
|
2030
|
-
button: {
|
|
2031
|
-
borderTopRightRadius: 0,
|
|
2032
|
-
borderBottomRightRadius: 0,
|
|
2033
|
-
marginLeft: 0,
|
|
2034
|
-
marginRight: 0
|
|
2035
|
-
},
|
|
2036
|
-
menuControl: {
|
|
2037
|
-
borderTopLeftRadius: 0,
|
|
2038
|
-
borderBottomLeftRadius: 0,
|
|
2039
|
-
border: 0,
|
|
2040
|
-
borderLeft: `1px solid ${theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.white}`
|
|
2041
|
-
}
|
|
2042
|
-
}));
|
|
1861
|
+
title: `ACTIVE USERS (${monthNames[new Date().getMonth()]})`,
|
|
1862
|
+
value: props.percentageOfAccountsActive,
|
|
1863
|
+
unit: "%"
|
|
1864
|
+
}
|
|
1865
|
+
] }));
|
|
1866
|
+
};
|
|
1867
|
+
|
|
2043
1868
|
const SplitButton$2 = (props) => {
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
const hasMenu = !!props.withOrganizationLink;
|
|
2047
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Group, { noWrap: true, spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(
|
|
2048
|
-
core.Button,
|
|
1869
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1870
|
+
"button",
|
|
2049
1871
|
{
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
1872
|
+
type: "button",
|
|
1873
|
+
onClick: props.onAddUsersClick,
|
|
1874
|
+
className: "flex items-center gap-1.5 rounded-lg bg-gradient-to-r from-gold-400 to-[#f5c300] px-3.5 py-2 text-xs font-bold text-dark-blue-400 shadow-[0_3px_12px_rgba(255,212,77,0.35)]"
|
|
2053
1875
|
},
|
|
1876
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconPlaylistAdd, { size: 13, stroke: 2 }),
|
|
2054
1877
|
"Add members"
|
|
2055
|
-
),
|
|
2056
|
-
|
|
2057
|
-
{
|
|
2058
|
-
variant: "filled",
|
|
2059
|
-
color: theme.primaryColor,
|
|
2060
|
-
size: 36,
|
|
2061
|
-
className: classes.menuControl
|
|
2062
|
-
},
|
|
2063
|
-
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronDown, { size: 16, stroke: 1.5 })
|
|
2064
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Menu.Dropdown, null, !!props.withOrganizationLink && /* @__PURE__ */ React__namespace.createElement(
|
|
2065
|
-
core.Menu.Item,
|
|
1878
|
+
), props.withOrganizationLink && /* @__PURE__ */ React__namespace.createElement(
|
|
1879
|
+
"button",
|
|
2066
1880
|
{
|
|
2067
|
-
|
|
2068
|
-
onClick: props.onCopyOrganizationLinkClick
|
|
1881
|
+
type: "button",
|
|
1882
|
+
onClick: props.onCopyOrganizationLinkClick,
|
|
1883
|
+
className: "flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white px-3.5 py-2 text-xs font-bold text-slate-600 hover:bg-slate-50"
|
|
2069
1884
|
},
|
|
1885
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconClipboardCopy, { size: 13, stroke: 2 }),
|
|
2070
1886
|
"Copy organization link"
|
|
2071
|
-
))
|
|
1887
|
+
));
|
|
2072
1888
|
};
|
|
2073
1889
|
|
|
1890
|
+
const openDeleteModal = (person, onDelete) => modals.openConfirmModal({
|
|
1891
|
+
title: `Remove "${person.givenName && person.familyName ? `${person.givenName} ${person.familyName}` : person.email}" from your organization?`,
|
|
1892
|
+
centered: true,
|
|
1893
|
+
children: /* @__PURE__ */ React__namespace.createElement(core.Text, { size: "sm" }, "Click confirm if you want to remove this person from your organization. This will NOT remove them from the Tech Platform."),
|
|
1894
|
+
labels: { confirm: "Remove", cancel: "Cancel" },
|
|
1895
|
+
confirmProps: { color: "red" },
|
|
1896
|
+
onConfirm: () => onDelete(person)
|
|
1897
|
+
});
|
|
2074
1898
|
function Table$4(props) {
|
|
1899
|
+
if (props.loading) {
|
|
1900
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "text-sm text-slate-400" }, "Loading\u2026");
|
|
1901
|
+
}
|
|
2075
1902
|
if (props.items.length === 0) {
|
|
2076
1903
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
2077
1904
|
PlaceholderBanner,
|
|
@@ -2083,29 +1910,48 @@ function Table$4(props) {
|
|
|
2083
1910
|
}
|
|
2084
1911
|
);
|
|
2085
1912
|
}
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
1913
|
+
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_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("div", null, "Name"), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-center" }, "Role"), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-center" }, "Account Created?"), /* @__PURE__ */ React__namespace.createElement("div", { className: "text-center" }, "# of Classes"), /* @__PURE__ */ React__namespace.createElement("div", null)), props.items.map((row, i) => {
|
|
1914
|
+
var _a, _b;
|
|
1915
|
+
const name = row.givenName && row.familyName ? `${row.givenName} ${row.familyName}` : row.email;
|
|
1916
|
+
const initials = (((_a = row.givenName) == null ? void 0 : _a[0]) || row.email[0] || "?") + (((_b = row.familyName) == null ? void 0 : _b[0]) || "");
|
|
1917
|
+
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)));
|
|
1918
|
+
return /* @__PURE__ */ React__namespace.createElement(
|
|
1919
|
+
"div",
|
|
1920
|
+
{
|
|
1921
|
+
key: row.email,
|
|
1922
|
+
className: `grid grid-cols-[2.2fr_1.2fr_1fr_1fr_0.6fr] items-center gap-3 px-5 py-3.5 ${i < props.items.length - 1 ? "border-b border-slate-100" : ""}`
|
|
1923
|
+
},
|
|
1924
|
+
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),
|
|
1925
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "flex justify-center" }, /* @__PURE__ */ React__namespace.createElement(
|
|
1926
|
+
"select",
|
|
1927
|
+
{
|
|
1928
|
+
disabled: row.readonly,
|
|
1929
|
+
value: row.isAdmin ? "admin" : row.isGroupAdmin ? "educator" : "student",
|
|
1930
|
+
onChange: (e) => props.onRoleChange && props.onRoleChange(row, e.target.value),
|
|
1931
|
+
className: "w-fit rounded-lg border border-slate-200 bg-white px-2.5 py-1.5 text-xs font-medium text-slate-600 disabled:opacity-50"
|
|
1932
|
+
},
|
|
1933
|
+
/* @__PURE__ */ React__namespace.createElement("option", { value: "student" }, "Student"),
|
|
1934
|
+
/* @__PURE__ */ React__namespace.createElement("option", { value: "educator" }, "Educator"),
|
|
1935
|
+
/* @__PURE__ */ React__namespace.createElement("option", { value: "admin" }, "Admin")
|
|
1936
|
+
)),
|
|
1937
|
+
/* @__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" })),
|
|
1938
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "text-center text-xs font-bold text-dark-blue-400" }, row.numberOfClasses),
|
|
1939
|
+
/* @__PURE__ */ React__namespace.createElement("div", null, !row.readonly && !!props.onDelete && /* @__PURE__ */ React__namespace.createElement(
|
|
1940
|
+
"button",
|
|
1941
|
+
{
|
|
1942
|
+
type: "button",
|
|
1943
|
+
onClick: () => openDeleteModal(row, props.onDelete),
|
|
1944
|
+
className: "flex h-7 w-7 items-center justify-center rounded-md text-slate-400 hover:bg-red-50 hover:text-red-500"
|
|
1945
|
+
},
|
|
1946
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconTrash, { size: 14, stroke: 1.75 })
|
|
1947
|
+
))
|
|
1948
|
+
);
|
|
1949
|
+
}));
|
|
2104
1950
|
}
|
|
2105
1951
|
|
|
2106
1952
|
var __defProp$9 = Object.defineProperty;
|
|
2107
|
-
var __defProps$
|
|
2108
|
-
var __getOwnPropDescs$
|
|
1953
|
+
var __defProps$7 = Object.defineProperties;
|
|
1954
|
+
var __getOwnPropDescs$7 = Object.getOwnPropertyDescriptors;
|
|
2109
1955
|
var __getOwnPropSymbols$9 = Object.getOwnPropertySymbols;
|
|
2110
1956
|
var __hasOwnProp$9 = Object.prototype.hasOwnProperty;
|
|
2111
1957
|
var __propIsEnum$9 = Object.prototype.propertyIsEnumerable;
|
|
@@ -2121,38 +1967,8 @@ var __spreadValues$9 = (a, b) => {
|
|
|
2121
1967
|
}
|
|
2122
1968
|
return a;
|
|
2123
1969
|
};
|
|
2124
|
-
var __spreadProps$
|
|
2125
|
-
const useStyles$9 = core.createStyles((theme) => ({
|
|
2126
|
-
title: {
|
|
2127
|
-
fontSize: 34,
|
|
2128
|
-
fontWeight: 900,
|
|
2129
|
-
[theme.fn.smallerThan("sm")]: {
|
|
2130
|
-
fontSize: 24
|
|
2131
|
-
}
|
|
2132
|
-
},
|
|
2133
|
-
description: {
|
|
2134
|
-
maxWidth: 600
|
|
2135
|
-
},
|
|
2136
|
-
wrapper: {
|
|
2137
|
-
position: "relative",
|
|
2138
|
-
marginBottom: 30
|
|
2139
|
-
},
|
|
2140
|
-
dropzone: {
|
|
2141
|
-
borderWidth: 1,
|
|
2142
|
-
paddingBottom: 50
|
|
2143
|
-
},
|
|
2144
|
-
icon: {
|
|
2145
|
-
color: theme.colorScheme === "dark" ? theme.colors.dark[3] : theme.colors.gray[4]
|
|
2146
|
-
},
|
|
2147
|
-
control: {
|
|
2148
|
-
position: "absolute",
|
|
2149
|
-
width: 250,
|
|
2150
|
-
left: "calc(50% - 125px)",
|
|
2151
|
-
bottom: -20
|
|
2152
|
-
}
|
|
2153
|
-
}));
|
|
1970
|
+
var __spreadProps$7 = (a, b) => __defProps$7(a, __getOwnPropDescs$7(b));
|
|
2154
1971
|
const People = (props) => {
|
|
2155
|
-
const { classes } = useStyles$9();
|
|
2156
1972
|
const form$1 = form.useForm({
|
|
2157
1973
|
initialValues: {
|
|
2158
1974
|
userId: "",
|
|
@@ -2183,12 +1999,12 @@ const People = (props) => {
|
|
|
2183
1999
|
padding: "xl",
|
|
2184
2000
|
size: "xl"
|
|
2185
2001
|
},
|
|
2186
|
-
/* @__PURE__ */ React__namespace.createElement(
|
|
2002
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-4" }, /* @__PURE__ */ React__namespace.createElement(DropzoneButton, __spreadProps$7(__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(() => {
|
|
2187
2003
|
const values = form$1.values;
|
|
2188
2004
|
form$1.reset();
|
|
2189
2005
|
setOpened(false);
|
|
2190
2006
|
props.onCreateUsers && props.onCreateUsers([values]);
|
|
2191
|
-
}) }, /* @__PURE__ */ React__namespace.createElement(
|
|
2007
|
+
}) }, /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, /* @__PURE__ */ React__namespace.createElement(
|
|
2192
2008
|
core.TextInput,
|
|
2193
2009
|
__spreadValues$9({
|
|
2194
2010
|
withAsterisk: true,
|
|
@@ -2207,23 +2023,22 @@ const People = (props) => {
|
|
|
2207
2023
|
label: "Family name",
|
|
2208
2024
|
placeholder: "Family name"
|
|
2209
2025
|
}, form$1.getInputProps("familyName"))
|
|
2210
|
-
)), /* @__PURE__ */ React__namespace.createElement(
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, "People"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, "Manage members of your organization")), /* @__PURE__ */ React__namespace.createElement(core.Grid.Col, { sm: "content" }, !props.loading && /* @__PURE__ */ React__namespace.createElement(
|
|
2026
|
+
)), /* @__PURE__ */ React__namespace.createElement(
|
|
2027
|
+
"button",
|
|
2028
|
+
{
|
|
2029
|
+
type: "submit",
|
|
2030
|
+
className: "mt-2 rounded-lg bg-dark-blue-400 px-4 py-2.5 text-xs font-bold text-white"
|
|
2031
|
+
},
|
|
2032
|
+
"Submit"
|
|
2033
|
+
))))
|
|
2034
|
+
), /* @__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" }, "People"), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, "Manage members of your organization")), !props.loading && /* @__PURE__ */ React__namespace.createElement(
|
|
2220
2035
|
SplitButton$2,
|
|
2221
2036
|
{
|
|
2222
2037
|
withOrganizationLink: props.withOrganizationLink,
|
|
2223
2038
|
onAddUsersClick: () => setOpened(true),
|
|
2224
2039
|
onCopyOrganizationLinkClick: props.onCopyLinkClick
|
|
2225
2040
|
}
|
|
2226
|
-
))
|
|
2041
|
+
)), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
2227
2042
|
{
|
|
2228
2043
|
title: "# OF PEOPLE",
|
|
2229
2044
|
value: props.users.length
|
|
@@ -2238,14 +2053,15 @@ const People = (props) => {
|
|
|
2238
2053
|
unit: "%",
|
|
2239
2054
|
value: props.percentageRostered
|
|
2240
2055
|
}
|
|
2241
|
-
] }), /* @__PURE__ */ React__namespace.createElement(
|
|
2242
|
-
|
|
2056
|
+
] }), /* @__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(
|
|
2057
|
+
"input",
|
|
2243
2058
|
{
|
|
2059
|
+
type: "text",
|
|
2244
2060
|
placeholder: "Search for a people in your organization",
|
|
2245
|
-
|
|
2246
|
-
|
|
2061
|
+
onChange: (e) => props.onAutocompleteChange(e.target.value),
|
|
2062
|
+
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"
|
|
2247
2063
|
}
|
|
2248
|
-
), /* @__PURE__ */ React__namespace.createElement(
|
|
2064
|
+
)), /* @__PURE__ */ React__namespace.createElement(
|
|
2249
2065
|
Table$4,
|
|
2250
2066
|
{
|
|
2251
2067
|
loading: props.loading,
|
|
@@ -2253,10 +2069,9 @@ const People = (props) => {
|
|
|
2253
2069
|
onDelete: props.onDeleteUser,
|
|
2254
2070
|
onRoleChange: props.onChangeUserRole
|
|
2255
2071
|
}
|
|
2256
|
-
)))
|
|
2072
|
+
)));
|
|
2257
2073
|
};
|
|
2258
2074
|
const DropzoneButton = (props) => {
|
|
2259
|
-
const { classes, theme } = useStyles$9();
|
|
2260
2075
|
const openRef = React__namespace.useRef(null);
|
|
2261
2076
|
const [loading, setLoading] = React__namespace.useState(false);
|
|
2262
2077
|
const onDrop = React__namespace.useCallback((acceptedFiles) => {
|
|
@@ -2277,32 +2092,33 @@ const DropzoneButton = (props) => {
|
|
|
2277
2092
|
});
|
|
2278
2093
|
});
|
|
2279
2094
|
}, []);
|
|
2280
|
-
return /* @__PURE__ */ React__namespace.createElement("div", { className:
|
|
2095
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "relative mb-8" }, /* @__PURE__ */ React__namespace.createElement(
|
|
2281
2096
|
dropzone.Dropzone,
|
|
2282
2097
|
{
|
|
2283
2098
|
loading,
|
|
2284
2099
|
openRef,
|
|
2285
2100
|
onDrop,
|
|
2286
|
-
className: classes.dropzone,
|
|
2287
2101
|
radius: "md",
|
|
2102
|
+
className: "border pb-12",
|
|
2288
2103
|
accept: [dropzone.MIME_TYPES.csv],
|
|
2289
2104
|
maxSize: 5 * 1024 ** 2
|
|
2290
2105
|
},
|
|
2291
|
-
/* @__PURE__ */ React__namespace.createElement("div", { style: { pointerEvents: "none" } }, /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "center" }, /* @__PURE__ */ React__namespace.createElement(dropzone.Dropzone.Accept, null, /* @__PURE__ */ React__namespace.createElement(icons.IconDownload, { size: 50, color:
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2106
|
+
/* @__PURE__ */ React__namespace.createElement("div", { style: { pointerEvents: "none" } }, /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "center" }, /* @__PURE__ */ React__namespace.createElement(dropzone.Dropzone.Accept, null, /* @__PURE__ */ React__namespace.createElement(icons.IconDownload, { size: 50, color: "#1EE2AF", stroke: 1.5 })), /* @__PURE__ */ React__namespace.createElement(dropzone.Dropzone.Reject, null, /* @__PURE__ */ React__namespace.createElement(icons.IconX, { size: 50, color: "#ef4444", stroke: 1.5 })), /* @__PURE__ */ React__namespace.createElement(dropzone.Dropzone.Idle, null, /* @__PURE__ */ React__namespace.createElement(icons.IconCloudUpload, { size: 50, color: "#232A3A", stroke: 1.5 }))), /* @__PURE__ */ React__namespace.createElement("p", { className: "mt-6 text-center text-lg font-bold text-dark-blue-400" }, /* @__PURE__ */ React__namespace.createElement(dropzone.Dropzone.Accept, null, "Drop files here"), /* @__PURE__ */ React__namespace.createElement(dropzone.Dropzone.Reject, null, "Csv file less than 5mb"), /* @__PURE__ */ React__namespace.createElement(dropzone.Dropzone.Idle, null, "Upload multiple")), /* @__PURE__ */ React__namespace.createElement("p", { className: "mt-2 text-center text-sm text-slate-400" }, "Drag'n'drop files here to upload. We can accept only ", /* @__PURE__ */ React__namespace.createElement("i", null, ".csv"), " files that are less than 5mb in size."))
|
|
2107
|
+
), /* @__PURE__ */ React__namespace.createElement(
|
|
2108
|
+
"button",
|
|
2109
|
+
{
|
|
2110
|
+
type: "button",
|
|
2111
|
+
onClick: () => {
|
|
2112
|
+
var _a;
|
|
2113
|
+
return (_a = openRef.current) == null ? void 0 : _a.call(openRef);
|
|
2114
|
+
},
|
|
2115
|
+
className: "absolute bottom-[-20px] left-1/2 w-[250px] -translate-x-1/2 rounded-full bg-dark-blue-400 px-6 py-2.5 text-xs font-bold text-white"
|
|
2116
|
+
},
|
|
2117
|
+
"Select file"
|
|
2118
|
+
));
|
|
2303
2119
|
};
|
|
2304
2120
|
|
|
2305
|
-
const useStyles$
|
|
2121
|
+
const useStyles$6 = core.createStyles((theme) => ({
|
|
2306
2122
|
form: {
|
|
2307
2123
|
backgroundColor: theme.white,
|
|
2308
2124
|
padding: theme.spacing.xl,
|
|
@@ -2365,7 +2181,7 @@ const useStyles$8 = core.createStyles((theme) => ({
|
|
|
2365
2181
|
}
|
|
2366
2182
|
}));
|
|
2367
2183
|
const StartAnonymousLesson = (props) => {
|
|
2368
|
-
const { classes } = useStyles$
|
|
2184
|
+
const { classes } = useStyles$6();
|
|
2369
2185
|
const [name, setName] = React__namespace.useState("");
|
|
2370
2186
|
return /* @__PURE__ */ React__namespace.createElement("div", { className: classes.wrapper }, /* @__PURE__ */ React__namespace.createElement(core.Container, null, /* @__PURE__ */ React__namespace.createElement(core.SimpleGrid, { maw: 960, cols: 2, spacing: 15, breakpoints: [{ maxWidth: "sm", cols: 1 }] }, /* @__PURE__ */ React__namespace.createElement("div", { className: classes.content }, /* @__PURE__ */ React__namespace.createElement(core.Badge, { color: "violet" }, "Community"), /* @__PURE__ */ React__namespace.createElement(core.Title, { className: classes.title }, props.title), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", mt: "md" }, props.description), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", mt: "md" }, "You are now part of ", `${props.educatorName}'s`, " Class")), /* @__PURE__ */ React__namespace.createElement("div", { className: classes.form }, /* @__PURE__ */ React__namespace.createElement(
|
|
2371
2187
|
core.TextInput,
|
|
@@ -2422,7 +2238,7 @@ function TaskCard(props) {
|
|
|
2422
2238
|
));
|
|
2423
2239
|
}
|
|
2424
2240
|
|
|
2425
|
-
const useStyles$
|
|
2241
|
+
const useStyles$5 = core.createStyles((theme) => ({
|
|
2426
2242
|
title: {
|
|
2427
2243
|
fontSize: 34,
|
|
2428
2244
|
fontWeight: 900,
|
|
@@ -2436,7 +2252,7 @@ const useStyles$7 = core.createStyles((theme) => ({
|
|
|
2436
2252
|
}
|
|
2437
2253
|
}));
|
|
2438
2254
|
const UserInfo = (props) => {
|
|
2439
|
-
const { classes } = useStyles$
|
|
2255
|
+
const { classes } = useStyles$5();
|
|
2440
2256
|
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
2257
|
};
|
|
2442
2258
|
|
|
@@ -2468,7 +2284,7 @@ var __objRest$1 = (source, exclude) => {
|
|
|
2468
2284
|
}
|
|
2469
2285
|
return target;
|
|
2470
2286
|
};
|
|
2471
|
-
const useStyles$
|
|
2287
|
+
const useStyles$4 = core.createStyles((theme) => ({
|
|
2472
2288
|
card: {
|
|
2473
2289
|
height: 240,
|
|
2474
2290
|
backgroundSize: "cover",
|
|
@@ -2513,7 +2329,7 @@ const TenantBanner = (_a) => {
|
|
|
2513
2329
|
"className",
|
|
2514
2330
|
"code"
|
|
2515
2331
|
]);
|
|
2516
|
-
const { classes, cx, theme } = useStyles$
|
|
2332
|
+
const { classes, cx, theme } = useStyles$4();
|
|
2517
2333
|
const handleCopy = async () => {
|
|
2518
2334
|
if (!code)
|
|
2519
2335
|
return;
|
|
@@ -2560,7 +2376,7 @@ const TenantBanner = (_a) => {
|
|
|
2560
2376
|
);
|
|
2561
2377
|
};
|
|
2562
2378
|
|
|
2563
|
-
const useStyles$
|
|
2379
|
+
const useStyles$3 = core.createStyles((theme) => ({
|
|
2564
2380
|
action: {
|
|
2565
2381
|
backgroundColor: "inherit",
|
|
2566
2382
|
":hover": {
|
|
@@ -2579,7 +2395,7 @@ const useStyles$5 = core.createStyles((theme) => ({
|
|
|
2579
2395
|
}
|
|
2580
2396
|
}));
|
|
2581
2397
|
const TrialHome = (props) => {
|
|
2582
|
-
const { classes } = useStyles$
|
|
2398
|
+
const { classes } = useStyles$3();
|
|
2583
2399
|
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(
|
|
2584
2400
|
core.Button,
|
|
2585
2401
|
{
|
|
@@ -2609,8 +2425,8 @@ const TrialHome = (props) => {
|
|
|
2609
2425
|
};
|
|
2610
2426
|
|
|
2611
2427
|
var __defProp$6 = Object.defineProperty;
|
|
2612
|
-
var __defProps$
|
|
2613
|
-
var __getOwnPropDescs$
|
|
2428
|
+
var __defProps$6 = Object.defineProperties;
|
|
2429
|
+
var __getOwnPropDescs$6 = Object.getOwnPropertyDescriptors;
|
|
2614
2430
|
var __getOwnPropSymbols$6 = Object.getOwnPropertySymbols;
|
|
2615
2431
|
var __hasOwnProp$6 = Object.prototype.hasOwnProperty;
|
|
2616
2432
|
var __propIsEnum$6 = Object.prototype.propertyIsEnumerable;
|
|
@@ -2626,7 +2442,7 @@ var __spreadValues$6 = (a, b) => {
|
|
|
2626
2442
|
}
|
|
2627
2443
|
return a;
|
|
2628
2444
|
};
|
|
2629
|
-
var __spreadProps$
|
|
2445
|
+
var __spreadProps$6 = (a, b) => __defProps$6(a, __getOwnPropDescs$6(b));
|
|
2630
2446
|
var __objRest = (source, exclude) => {
|
|
2631
2447
|
var target = {};
|
|
2632
2448
|
for (var prop in source)
|
|
@@ -2639,7 +2455,7 @@ var __objRest = (source, exclude) => {
|
|
|
2639
2455
|
}
|
|
2640
2456
|
return target;
|
|
2641
2457
|
};
|
|
2642
|
-
const useStyles$
|
|
2458
|
+
const useStyles$2 = core.createStyles((theme, { checked }) => ({
|
|
2643
2459
|
button: {
|
|
2644
2460
|
display: "flex",
|
|
2645
2461
|
alignItems: "center",
|
|
@@ -2681,10 +2497,10 @@ function ImageCheckbox(_a) {
|
|
|
2681
2497
|
finalValue: false,
|
|
2682
2498
|
onChange
|
|
2683
2499
|
});
|
|
2684
|
-
const { classes, cx } = useStyles$
|
|
2500
|
+
const { classes, cx } = useStyles$2({ checked: value });
|
|
2685
2501
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
2686
2502
|
core.UnstyledButton,
|
|
2687
|
-
__spreadProps$
|
|
2503
|
+
__spreadProps$6(__spreadValues$6({}, others), {
|
|
2688
2504
|
onClick: () => handleChange(!value),
|
|
2689
2505
|
className: cx(classes.button, className)
|
|
2690
2506
|
}),
|
|
@@ -2705,7 +2521,7 @@ function ImageCheckbox(_a) {
|
|
|
2705
2521
|
function SelectGrid(props) {
|
|
2706
2522
|
const items = props.items.map((item) => /* @__PURE__ */ React__namespace.createElement(
|
|
2707
2523
|
ImageCheckbox,
|
|
2708
|
-
__spreadProps$
|
|
2524
|
+
__spreadProps$6(__spreadValues$6({}, item), {
|
|
2709
2525
|
key: item.title,
|
|
2710
2526
|
onChange: (checked) => props.onChange(item.title, checked)
|
|
2711
2527
|
})
|
|
@@ -2724,8 +2540,8 @@ function SelectGrid(props) {
|
|
|
2724
2540
|
}
|
|
2725
2541
|
|
|
2726
2542
|
var __defProp$5 = Object.defineProperty;
|
|
2727
|
-
var __defProps$
|
|
2728
|
-
var __getOwnPropDescs$
|
|
2543
|
+
var __defProps$5 = Object.defineProperties;
|
|
2544
|
+
var __getOwnPropDescs$5 = Object.getOwnPropertyDescriptors;
|
|
2729
2545
|
var __getOwnPropSymbols$5 = Object.getOwnPropertySymbols;
|
|
2730
2546
|
var __hasOwnProp$5 = Object.prototype.hasOwnProperty;
|
|
2731
2547
|
var __propIsEnum$5 = Object.prototype.propertyIsEnumerable;
|
|
@@ -2741,8 +2557,8 @@ var __spreadValues$5 = (a, b) => {
|
|
|
2741
2557
|
}
|
|
2742
2558
|
return a;
|
|
2743
2559
|
};
|
|
2744
|
-
var __spreadProps$
|
|
2745
|
-
const useStyles$
|
|
2560
|
+
var __spreadProps$5 = (a, b) => __defProps$5(a, __getOwnPropDescs$5(b));
|
|
2561
|
+
const useStyles$1 = core.createStyles((theme) => ({
|
|
2746
2562
|
wrapper: {
|
|
2747
2563
|
minHeight: "100%",
|
|
2748
2564
|
boxSizing: "border-box",
|
|
@@ -2805,7 +2621,7 @@ const OPTIONS = [
|
|
|
2805
2621
|
{ description: "project-based learning", title: "Project-Based Learning", icon: icons.IconTools }
|
|
2806
2622
|
];
|
|
2807
2623
|
const TrialRegistration = (props) => {
|
|
2808
|
-
const { classes } = useStyles$
|
|
2624
|
+
const { classes } = useStyles$1();
|
|
2809
2625
|
const [firstName, setFirstName] = React__namespace.useState("");
|
|
2810
2626
|
const [lastName, setLastName] = React__namespace.useState("");
|
|
2811
2627
|
const [organization, setOrganization] = React__namespace.useState({ organizationId: "", displayName: "" });
|
|
@@ -2851,7 +2667,7 @@ const TrialRegistration = (props) => {
|
|
|
2851
2667
|
label: "School/Organization Name",
|
|
2852
2668
|
placeholder: "What's the name of your school?",
|
|
2853
2669
|
data: props.organizations.map((o) => {
|
|
2854
|
-
return __spreadProps$
|
|
2670
|
+
return __spreadProps$5(__spreadValues$5({}, o), { value: o.displayName });
|
|
2855
2671
|
}),
|
|
2856
2672
|
onItemSubmit: (item) => setOrganization({ organizationId: item.organizationId, displayName: item.displayName }),
|
|
2857
2673
|
onChange: (next) => {
|
|
@@ -2863,7 +2679,7 @@ const TrialRegistration = (props) => {
|
|
|
2863
2679
|
SelectGrid,
|
|
2864
2680
|
{
|
|
2865
2681
|
items: OPTIONS,
|
|
2866
|
-
onChange: (e, checked) => setInterests(__spreadProps$
|
|
2682
|
+
onChange: (e, checked) => setInterests(__spreadProps$5(__spreadValues$5({}, interests), { [e]: checked }))
|
|
2867
2683
|
}
|
|
2868
2684
|
), /* @__PURE__ */ React__namespace.createElement(core.Group, { position: "right", mt: "md" }, /* @__PURE__ */ React__namespace.createElement(
|
|
2869
2685
|
core.Button,
|
|
@@ -2902,8 +2718,8 @@ const AdminProvider = (props) => {
|
|
|
2902
2718
|
};
|
|
2903
2719
|
|
|
2904
2720
|
var __defProp$4 = Object.defineProperty;
|
|
2905
|
-
var __defProps$
|
|
2906
|
-
var __getOwnPropDescs$
|
|
2721
|
+
var __defProps$4 = Object.defineProperties;
|
|
2722
|
+
var __getOwnPropDescs$4 = Object.getOwnPropertyDescriptors;
|
|
2907
2723
|
var __getOwnPropSymbols$4 = Object.getOwnPropertySymbols;
|
|
2908
2724
|
var __hasOwnProp$4 = Object.prototype.hasOwnProperty;
|
|
2909
2725
|
var __propIsEnum$4 = Object.prototype.propertyIsEnumerable;
|
|
@@ -2919,8 +2735,8 @@ var __spreadValues$4 = (a, b) => {
|
|
|
2919
2735
|
}
|
|
2920
2736
|
return a;
|
|
2921
2737
|
};
|
|
2922
|
-
var __spreadProps$
|
|
2923
|
-
const useStyles
|
|
2738
|
+
var __spreadProps$4 = (a, b) => __defProps$4(a, __getOwnPropDescs$4(b));
|
|
2739
|
+
const useStyles = core.createStyles((theme, props) => ({
|
|
2924
2740
|
footer: {
|
|
2925
2741
|
paddingTop: theme.spacing.md,
|
|
2926
2742
|
paddingBottom: theme.spacing.md,
|
|
@@ -3007,7 +2823,7 @@ const useStyles$2 = core.createStyles((theme, props) => ({
|
|
|
3007
2823
|
}
|
|
3008
2824
|
}));
|
|
3009
2825
|
const App = (props) => {
|
|
3010
|
-
const { classes } = useStyles
|
|
2826
|
+
const { classes } = useStyles(props);
|
|
3011
2827
|
const account = useAccount(props.account, props.accounts, props.onAccountChange);
|
|
3012
2828
|
return /* @__PURE__ */ React__namespace.createElement(
|
|
3013
2829
|
core.AppShell,
|
|
@@ -3015,7 +2831,7 @@ const App = (props) => {
|
|
|
3015
2831
|
padding: "xs",
|
|
3016
2832
|
navbar: props.navbar && /* @__PURE__ */ React__namespace.createElement(
|
|
3017
2833
|
Navbar,
|
|
3018
|
-
__spreadProps$
|
|
2834
|
+
__spreadProps$4(__spreadValues$4({}, props.navbar.props), {
|
|
3019
2835
|
onSwitchAccounts: account.accounts && account.accounts.length > 1 ? () => account.setChangeModalOpen(true) : void 0
|
|
3020
2836
|
})
|
|
3021
2837
|
),
|
|
@@ -3109,61 +2925,52 @@ function Table$3(props) {
|
|
|
3109
2925
|
if (props.items.length === 0) {
|
|
3110
2926
|
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 pathways to display.");
|
|
3111
2927
|
}
|
|
3112
|
-
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.items.map((row) =>
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
|
|
3117
|
-
|
|
3118
|
-
|
|
3119
|
-
|
|
3120
|
-
|
|
3121
|
-
|
|
2928
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, props.items.map((row) => {
|
|
2929
|
+
var _a;
|
|
2930
|
+
return /* @__PURE__ */ React__namespace.createElement(
|
|
2931
|
+
reactRouterDom.Link,
|
|
2932
|
+
{
|
|
2933
|
+
key: row.pathwayId,
|
|
2934
|
+
to: row.href,
|
|
2935
|
+
className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
|
|
2936
|
+
},
|
|
2937
|
+
/* @__PURE__ */ React__namespace.createElement(Emblem, { imageURL: row.imageURL, alt: row.name, size: "sm", icon: icons.IconRoute, accent: "cyan" }),
|
|
2938
|
+
/* @__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), !!((_a = row.displayTags) == null ? void 0 : _a.length) && /* @__PURE__ */ React__namespace.createElement("div", { className: "mt-1.5 flex flex-wrap gap-1.5" }, row.displayTags.map((tag) => /* @__PURE__ */ React__namespace.createElement("span", { key: tag, className: "rounded-full bg-slate-100 px-2 py-0.5 text-[10px] font-bold text-slate-500" }, tag)))),
|
|
2939
|
+
!!row.numberOfBadges && /* @__PURE__ */ React__namespace.createElement("div", { className: "w-24 shrink-0 text-right text-xs text-slate-500" }, row.numberOfBadges, " badge", row.numberOfBadges === 1 ? "" : "s"),
|
|
2940
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronRight, { size: 16, stroke: 2, className: "shrink-0 text-slate-300" })
|
|
2941
|
+
);
|
|
2942
|
+
}));
|
|
3122
2943
|
}
|
|
3123
2944
|
|
|
3124
2945
|
const Pathways = (props) => {
|
|
3125
2946
|
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 }));
|
|
3126
2947
|
};
|
|
3127
2948
|
|
|
3128
|
-
const useStyles$1 = core.createStyles((theme) => ({
|
|
3129
|
-
button: {
|
|
3130
|
-
borderTopRightRadius: 0,
|
|
3131
|
-
borderBottomRightRadius: 0,
|
|
3132
|
-
marginLeft: 0,
|
|
3133
|
-
marginRight: 0
|
|
3134
|
-
},
|
|
3135
|
-
menuControl: {
|
|
3136
|
-
borderTopLeftRadius: 0,
|
|
3137
|
-
borderBottomLeftRadius: 0,
|
|
3138
|
-
border: 0,
|
|
3139
|
-
borderLeft: `1px solid ${theme.colorScheme === "dark" ? theme.colors.dark[7] : theme.white}`
|
|
3140
|
-
}
|
|
3141
|
-
}));
|
|
3142
2949
|
const SplitButton$1 = (props) => {
|
|
3143
|
-
|
|
3144
|
-
|
|
3145
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: "sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
3146
|
-
core.Button,
|
|
2950
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React__namespace.createElement(
|
|
2951
|
+
reactRouterDom.Link,
|
|
3147
2952
|
{
|
|
3148
|
-
component: reactRouterDom.Link,
|
|
3149
2953
|
to: props.href,
|
|
3150
|
-
className:
|
|
3151
|
-
variant: "gradient"
|
|
2954
|
+
className: "flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white px-3.5 py-2 text-xs font-bold text-slate-600 no-underline hover:bg-slate-50"
|
|
3152
2955
|
},
|
|
3153
2956
|
"Preview"
|
|
3154
2957
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
3155
|
-
|
|
2958
|
+
"button",
|
|
3156
2959
|
{
|
|
3157
|
-
|
|
3158
|
-
onClick: props.onCopyLinkClick
|
|
2960
|
+
type: "button",
|
|
2961
|
+
onClick: props.onCopyLinkClick,
|
|
2962
|
+
className: "flex items-center gap-1.5 rounded-lg border border-slate-200 bg-white px-3.5 py-2 text-xs font-bold text-slate-600 hover:bg-slate-50"
|
|
3159
2963
|
},
|
|
2964
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconClipboardCopy, { size: 13, stroke: 2 }),
|
|
3160
2965
|
"Copy link"
|
|
3161
2966
|
), /* @__PURE__ */ React__namespace.createElement(
|
|
3162
|
-
|
|
2967
|
+
"button",
|
|
3163
2968
|
{
|
|
3164
|
-
|
|
3165
|
-
onClick: props.onExportDataClick
|
|
2969
|
+
type: "button",
|
|
2970
|
+
onClick: props.onExportDataClick,
|
|
2971
|
+
className: "flex items-center gap-1.5 rounded-lg bg-gradient-to-r from-gold-400 to-[#f5c300] px-3.5 py-2 text-xs font-bold text-dark-blue-400 shadow-[0_3px_12px_rgba(255,212,77,0.35)]"
|
|
3166
2972
|
},
|
|
2973
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconTableExport, { size: 13, stroke: 2 }),
|
|
3167
2974
|
"Export data (.csv)"
|
|
3168
2975
|
));
|
|
3169
2976
|
};
|
|
@@ -3172,11 +2979,12 @@ function Stack$1(props) {
|
|
|
3172
2979
|
if (props.items.length === 0) {
|
|
3173
2980
|
return null;
|
|
3174
2981
|
}
|
|
3175
|
-
|
|
3176
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Grid, { grow: true, gutter: "lg", sx: { padding: 20, minWidth: 700 } }, rows);
|
|
2982
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-2" }, props.items.map((row) => /* @__PURE__ */ React__namespace.createElement("div", { key: row.badgeName, className: "flex items-center justify-between gap-4 py-1.5" }, /* @__PURE__ */ React__namespace.createElement(reactRouterDom.Link, { to: row.href, className: "text-sm font-bold text-dark-blue-400 no-underline hover:underline" }, row.badgeName), row.completion >= 1 && /* @__PURE__ */ React__namespace.createElement("span", { className: "shrink-0 rounded-full bg-mint-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, "Complete"), row.completion === 0 && !row.isStarted && /* @__PURE__ */ React__namespace.createElement("span", { className: "shrink-0 rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-bold text-slate-500" }, "Not started"), row.completion > 0 && row.completion < 1 && /* @__PURE__ */ React__namespace.createElement("span", { className: "shrink-0 rounded-full bg-gold-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, Math.round((row.completion + Number.EPSILON) * 100), "% Complete"))));
|
|
3177
2983
|
}
|
|
3178
2984
|
|
|
3179
2985
|
var __defProp$3 = Object.defineProperty;
|
|
2986
|
+
var __defProps$3 = Object.defineProperties;
|
|
2987
|
+
var __getOwnPropDescs$3 = Object.getOwnPropertyDescriptors;
|
|
3180
2988
|
var __getOwnPropSymbols$3 = Object.getOwnPropertySymbols;
|
|
3181
2989
|
var __hasOwnProp$3 = Object.prototype.hasOwnProperty;
|
|
3182
2990
|
var __propIsEnum$3 = Object.prototype.propertyIsEnumerable;
|
|
@@ -3192,7 +3000,10 @@ var __spreadValues$3 = (a, b) => {
|
|
|
3192
3000
|
}
|
|
3193
3001
|
return a;
|
|
3194
3002
|
};
|
|
3003
|
+
var __spreadProps$3 = (a, b) => __defProps$3(a, __getOwnPropDescs$3(b));
|
|
3195
3004
|
function Table$2(props) {
|
|
3005
|
+
const [expanded, setExpanded] = React__namespace.useState({});
|
|
3006
|
+
const categories = props.categories || [];
|
|
3196
3007
|
const preparedItems = React__namespace.useMemo(() => {
|
|
3197
3008
|
return (props.items || []).map((item) => __spreadValues$3(__spreadValues$3({}, item), item.categoryPoints));
|
|
3198
3009
|
}, [props.items]);
|
|
@@ -3208,55 +3019,26 @@ function Table$2(props) {
|
|
|
3208
3019
|
}
|
|
3209
3020
|
);
|
|
3210
3021
|
}
|
|
3211
|
-
const
|
|
3212
|
-
|
|
3213
|
-
|
|
3214
|
-
|
|
3215
|
-
|
|
3216
|
-
|
|
3217
|
-
|
|
3218
|
-
|
|
3219
|
-
|
|
3220
|
-
|
|
3221
|
-
|
|
3222
|
-
|
|
3223
|
-
|
|
3224
|
-
|
|
3225
|
-
|
|
3226
|
-
|
|
3227
|
-
|
|
3228
|
-
|
|
3229
|
-
|
|
3230
|
-
|
|
3231
|
-
accessor: "name",
|
|
3232
|
-
title: "Student Name",
|
|
3233
|
-
sortable: true,
|
|
3234
|
-
titleStyle: { whiteSpace: "nowrap" },
|
|
3235
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.Group, { spacing: "sm", noWrap: true }, /* @__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)))
|
|
3236
|
-
},
|
|
3237
|
-
{
|
|
3238
|
-
accessor: "isComplete",
|
|
3239
|
-
title: "Status",
|
|
3240
|
-
sortable: true,
|
|
3241
|
-
titleStyle: { whiteSpace: "nowrap" },
|
|
3242
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(core.Badge, { color: row.isComplete ? "blue" : "red", variant: "filled" }, row.isComplete ? "Complete" : "Incomplete")
|
|
3243
|
-
},
|
|
3244
|
-
...props.categories.map((category) => ({
|
|
3245
|
-
accessor: category.categoryId,
|
|
3246
|
-
title: category.name,
|
|
3247
|
-
sortable: true,
|
|
3248
|
-
titleStyle: { whiteSpace: "nowrap" },
|
|
3249
|
-
render: (row) => {
|
|
3250
|
-
var _a;
|
|
3251
|
-
return /* @__PURE__ */ React__namespace.createElement(core.Badge, { color: "blue", variant: "filled" }, (_a = row[category.categoryId]) != null ? _a : 0, " pts");
|
|
3252
|
-
}
|
|
3253
|
-
}))
|
|
3254
|
-
],
|
|
3255
|
-
rowExpansion: {
|
|
3256
|
-
content: ({ record }) => /* @__PURE__ */ React__namespace.createElement(Stack$1, { items: record.badges })
|
|
3257
|
-
}
|
|
3258
|
-
}
|
|
3259
|
-
));
|
|
3022
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
3023
|
+
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("isComplete"), className: "w-28 shrink-0 text-center hover:text-slate-600" }, "Status", indicator("isComplete")), categories.map((category) => /* @__PURE__ */ React__namespace.createElement("button", { key: category.categoryId, onClick: () => requestSort(category.categoryId), className: "w-24 shrink-0 text-center hover:text-slate-600" }, category.name, indicator(category.categoryId))), /* @__PURE__ */ React__namespace.createElement("div", { className: "w-4 shrink-0" })), sortedItems.map((row) => {
|
|
3024
|
+
var _a;
|
|
3025
|
+
const isOpen = !!expanded[row.userId];
|
|
3026
|
+
const initials = (((_a = row.name) == null ? void 0 : _a[0]) || row.email[0] || "?").toUpperCase();
|
|
3027
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { key: row.userId, className: "rounded-xl border border-slate-200 bg-white shadow-sm" }, /* @__PURE__ */ React__namespace.createElement(
|
|
3028
|
+
"div",
|
|
3029
|
+
{
|
|
3030
|
+
onClick: () => setExpanded(__spreadProps$3(__spreadValues$3({}, expanded), { [row.userId]: !isOpen })),
|
|
3031
|
+
className: "flex cursor-pointer items-center gap-4 p-4"
|
|
3032
|
+
},
|
|
3033
|
+
/* @__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-mint-400/20 text-xs font-bold text-dark-blue-400" }, initials), /* @__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))),
|
|
3034
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-28 shrink-0 text-center" }, row.isComplete ? /* @__PURE__ */ React__namespace.createElement("span", { className: "rounded-full bg-mint-100 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, "Complete") : /* @__PURE__ */ React__namespace.createElement("span", { className: "rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-bold text-slate-500" }, "Incomplete")),
|
|
3035
|
+
categories.map((category) => {
|
|
3036
|
+
var _a2;
|
|
3037
|
+
return /* @__PURE__ */ React__namespace.createElement("div", { key: category.categoryId, className: "w-24 shrink-0 text-center" }, /* @__PURE__ */ React__namespace.createElement("span", { className: "rounded-full bg-sky-blue-400/15 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, (_a2 = row[category.categoryId]) != null ? _a2 : 0, " pts"));
|
|
3038
|
+
}),
|
|
3039
|
+
/* @__PURE__ */ React__namespace.createElement(icons.IconChevronDown, { size: 15, stroke: 2.3, className: `shrink-0 text-slate-400 transition-transform ${isOpen ? "rotate-180" : ""}` })
|
|
3040
|
+
), isOpen && /* @__PURE__ */ React__namespace.createElement("div", { className: "border-t border-slate-100 px-4 py-3" }, /* @__PURE__ */ React__namespace.createElement(Stack$1, { items: row.badges })));
|
|
3041
|
+
}));
|
|
3260
3042
|
}
|
|
3261
3043
|
|
|
3262
3044
|
function Table$1(props) {
|
|
@@ -3272,138 +3054,60 @@ function Table$1(props) {
|
|
|
3272
3054
|
}
|
|
3273
3055
|
);
|
|
3274
3056
|
}
|
|
3275
|
-
const
|
|
3276
|
-
|
|
3277
|
-
|
|
3278
|
-
|
|
3279
|
-
|
|
3280
|
-
|
|
3281
|
-
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
|
|
3285
|
-
|
|
3286
|
-
highlightOnHover: true,
|
|
3287
|
-
striped: true,
|
|
3288
|
-
records: sortedItems,
|
|
3289
|
-
idAccessor: "badgeId",
|
|
3290
|
-
sortStatus,
|
|
3291
|
-
onSortStatusChange: (status) => requestSort(status.columnAccessor),
|
|
3292
|
-
columns: [
|
|
3293
|
-
{
|
|
3294
|
-
accessor: "badgeName",
|
|
3295
|
-
title: "Badge Name",
|
|
3296
|
-
sortable: true,
|
|
3297
|
-
render: (row) => /* @__PURE__ */ React__namespace.createElement(
|
|
3298
|
-
core.Text,
|
|
3299
|
-
{
|
|
3300
|
-
component: reactRouterDom.Link,
|
|
3301
|
-
to: row.href,
|
|
3302
|
-
sx: (theme) => ({
|
|
3303
|
-
color: theme.colorScheme === "dark" ? theme.white : theme.black,
|
|
3304
|
-
textDecoration: "none",
|
|
3305
|
-
fontWeight: 500,
|
|
3306
|
-
"&:hover": {
|
|
3307
|
-
textDecoration: "underline",
|
|
3308
|
-
color: theme.colors.blue[6]
|
|
3309
|
-
}
|
|
3310
|
-
})
|
|
3311
|
-
},
|
|
3312
|
-
row.badgeName
|
|
3313
|
-
)
|
|
3314
|
-
},
|
|
3315
|
-
{
|
|
3316
|
-
accessor: "percentageCompletion",
|
|
3317
|
-
title: "Badge Completion",
|
|
3318
|
-
sortable: true,
|
|
3319
|
-
render: (row) => {
|
|
3320
|
-
const roundedValue = Math.round((row.percentageCompletion + Number.EPSILON) * 100);
|
|
3321
|
-
return `${roundedValue}%`;
|
|
3322
|
-
}
|
|
3323
|
-
}
|
|
3324
|
-
]
|
|
3325
|
-
}
|
|
3326
|
-
));
|
|
3057
|
+
const indicator = (key) => sortConfig.key !== key ? "" : sortConfig.direction === "desc" ? " \u25BE" : " \u25B4";
|
|
3058
|
+
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("button", { onClick: () => requestSort("badgeName"), className: "flex-1 text-left hover:text-slate-600" }, "Badge Name", indicator("badgeName")), /* @__PURE__ */ React__namespace.createElement("button", { onClick: () => requestSort("percentageCompletion"), className: "w-36 shrink-0 text-right hover:text-slate-600" }, "Badge Completion", indicator("percentageCompletion"))), sortedItems.map((row) => /* @__PURE__ */ React__namespace.createElement(
|
|
3059
|
+
reactRouterDom.Link,
|
|
3060
|
+
{
|
|
3061
|
+
key: row.badgeId,
|
|
3062
|
+
to: row.href,
|
|
3063
|
+
className: "flex items-center gap-4 rounded-xl border border-slate-200 bg-white p-4 no-underline shadow-sm hover:bg-slate-50"
|
|
3064
|
+
},
|
|
3065
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "min-w-0 flex-1 text-sm font-bold text-dark-blue-400" }, row.badgeName),
|
|
3066
|
+
/* @__PURE__ */ React__namespace.createElement("div", { className: "w-36 shrink-0 text-right text-xs text-slate-500" }, Math.round((row.percentageCompletion + Number.EPSILON) * 100), "%")
|
|
3067
|
+
)));
|
|
3327
3068
|
}
|
|
3328
3069
|
|
|
3329
|
-
const
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
[theme.fn.smallerThan("sm")]: {
|
|
3334
|
-
fontSize: 24
|
|
3335
|
-
}
|
|
3336
|
-
},
|
|
3337
|
-
description: {
|
|
3338
|
-
maxWidth: 600
|
|
3339
|
-
}
|
|
3340
|
-
}));
|
|
3070
|
+
const TABS$1 = [
|
|
3071
|
+
{ label: "By Badge", value: "badges" },
|
|
3072
|
+
{ label: "By student", value: "students" }
|
|
3073
|
+
];
|
|
3341
3074
|
const Pathway = (props) => {
|
|
3342
|
-
|
|
3075
|
+
var _a;
|
|
3343
3076
|
const [tab, setTab] = React.useState("badges");
|
|
3344
3077
|
const numberOfStudents = props.students.length;
|
|
3345
|
-
numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length / numberOfStudents : 0;
|
|
3346
3078
|
const numberOfBadgesEarned = numberOfStudents > 0 ? props.students.filter((u) => u.isComplete).length : 0;
|
|
3347
|
-
|
|
3348
|
-
|
|
3349
|
-
|
|
3350
|
-
variant: "filled",
|
|
3351
|
-
leftSection: /* @__PURE__ */ React__namespace.createElement(core.ActionIcon, { color: "blue", size: "xs", radius: "xl", variant: "filled" }, /* @__PURE__ */ React__namespace.createElement(icons.IconArrowLeft, { size: 14 })),
|
|
3352
|
-
size: "lg"
|
|
3353
|
-
},
|
|
3354
|
-
"Back"
|
|
3355
|
-
)), /* @__PURE__ */ React__namespace.createElement(core.Group, null, /* @__PURE__ */ React__namespace.createElement(core.Stack, { spacing: 0 }, /* @__PURE__ */ React__namespace.createElement(core.Title, { order: 2, className: classes.title, mt: "md" }, props.title || "Pathway"), /* @__PURE__ */ React__namespace.createElement(core.Text, { color: "dimmed", className: classes.description, mt: "sm" }, props.description || "No description")), !props.trial && /* @__PURE__ */ React__namespace.createElement(core.Stack, { ml: "auto" }, /* @__PURE__ */ React__namespace.createElement(
|
|
3079
|
+
const criteria = props.criteria || {};
|
|
3080
|
+
const criteriaCategories = (props.categories || []).filter((c) => criteria[c.categoryId] !== void 0);
|
|
3081
|
+
return /* @__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: "flex items-start gap-4" }, /* @__PURE__ */ React__namespace.createElement(Emblem, { imageURL: props.imageURL, alt: props.title, size: "lg", icon: icons.IconRoute, accent: "cyan" }), /* @__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.title || "Pathway"), !!((_a = props.displayTags) == null ? void 0 : _a.length) && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap gap-1.5" }, props.displayTags.map((tag) => /* @__PURE__ */ React__namespace.createElement("span", { key: tag, className: "rounded-full bg-slate-100 px-2.5 py-1 text-[10px] font-bold text-slate-500" }, tag))), /* @__PURE__ */ React__namespace.createElement("p", { className: "max-w-xl text-sm text-slate-500" }, props.description || "No description"), criteriaCategories.length > 0 && /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-wrap items-center gap-1.5 pt-0.5" }, /* @__PURE__ */ React__namespace.createElement("span", { className: "text-[10.5px] font-extrabold uppercase tracking-wide text-slate-400" }, "Criteria"), criteriaCategories.map((c) => /* @__PURE__ */ React__namespace.createElement("span", { key: c.categoryId, className: "rounded-full bg-sky-blue-400/15 px-2.5 py-1 text-[10px] font-bold text-dark-blue-400" }, c.name, ": ", criteria[c.categoryId], "+", c.maxPoints ? ` of ${c.maxPoints}` : "", " pts"))))), !props.trial && /* @__PURE__ */ React__namespace.createElement(
|
|
3356
3082
|
SplitButton$1,
|
|
3357
3083
|
{
|
|
3358
3084
|
href: props.href,
|
|
3359
3085
|
onCopyLinkClick: props.onCopyLinkClick,
|
|
3360
3086
|
onExportDataClick: props.onExportDataClick
|
|
3361
3087
|
}
|
|
3362
|
-
))
|
|
3088
|
+
)), /* @__PURE__ */ React__namespace.createElement(StatsGroup, { data: [
|
|
3363
3089
|
{
|
|
3364
3090
|
title: props.trial ? "BADGES SUBMITTED" : "PATHWAY COMPLETION",
|
|
3365
|
-
value: props.trial ? 0 : numberOfBadgesEarned
|
|
3366
|
-
unit: props.trial ? "" : ""
|
|
3091
|
+
value: props.trial ? 0 : numberOfBadgesEarned
|
|
3367
3092
|
}
|
|
3368
|
-
] }), !props.trial && /* @__PURE__ */ React__namespace.createElement(
|
|
3369
|
-
|
|
3093
|
+
] }), !props.trial && /* @__PURE__ */ React__namespace.createElement("div", { className: "relative w-full max-w-xs" }, /* @__PURE__ */ React__namespace.createElement(icons.IconCategory2, { size: 16, stroke: 2, className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" }), /* @__PURE__ */ React__namespace.createElement(
|
|
3094
|
+
"select",
|
|
3370
3095
|
{
|
|
3371
|
-
clearable: true,
|
|
3372
|
-
clearButtonLabel: "Clear class selection",
|
|
3373
|
-
size: "sm",
|
|
3374
|
-
placeholder: "Select a class",
|
|
3375
|
-
nothingFound: "No options",
|
|
3376
3096
|
value: props.classId,
|
|
3377
|
-
onChange: props.onClassChange,
|
|
3378
|
-
|
|
3379
|
-
|
|
3380
|
-
|
|
3381
|
-
|
|
3382
|
-
|
|
3383
|
-
|
|
3384
|
-
Tabs,
|
|
3385
|
-
{
|
|
3386
|
-
value: tab,
|
|
3387
|
-
data: [
|
|
3388
|
-
{ label: "By Badge", value: "badges" },
|
|
3389
|
-
{ label: "By student", value: "students" }
|
|
3390
|
-
],
|
|
3391
|
-
onChange: setTab
|
|
3392
|
-
}
|
|
3393
|
-
), (!!props.trial || tab === "badges") && /* @__PURE__ */ React__namespace.createElement(
|
|
3394
|
-
Table$1,
|
|
3395
|
-
{
|
|
3396
|
-
loading: props.loading,
|
|
3397
|
-
items: props.badges
|
|
3398
|
-
}
|
|
3399
|
-
), !props.trial && tab === "students" && /* @__PURE__ */ React__namespace.createElement(
|
|
3400
|
-
Table$2,
|
|
3097
|
+
onChange: (e) => props.onClassChange(e.target.value),
|
|
3098
|
+
className: "w-full appearance-none rounded-lg border border-slate-200 bg-white py-2 pl-9 pr-4 text-sm text-dark-blue-400 focus:border-sky-blue-400 focus:outline-none"
|
|
3099
|
+
},
|
|
3100
|
+
/* @__PURE__ */ React__namespace.createElement("option", { value: "" }, "All classes"),
|
|
3101
|
+
props.classes.map((c) => /* @__PURE__ */ React__namespace.createElement("option", { key: c.classId, value: c.classId }, c.name))
|
|
3102
|
+
)), /* @__PURE__ */ React__namespace.createElement("div", { className: "flex flex-col gap-3" }, !props.trial && /* @__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(
|
|
3103
|
+
"button",
|
|
3401
3104
|
{
|
|
3402
|
-
|
|
3403
|
-
|
|
3404
|
-
|
|
3405
|
-
}
|
|
3406
|
-
|
|
3105
|
+
key: t.value,
|
|
3106
|
+
onClick: () => setTab(t.value),
|
|
3107
|
+
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"}`
|
|
3108
|
+
},
|
|
3109
|
+
t.label
|
|
3110
|
+
))), (!!props.trial || tab === "badges") && /* @__PURE__ */ React__namespace.createElement(Table$1, { loading: props.loading, items: props.badges }), !props.trial && tab === "students" && /* @__PURE__ */ React__namespace.createElement(Table$2, { loading: props.loading, items: props.students, categories: props.categories })));
|
|
3407
3111
|
};
|
|
3408
3112
|
|
|
3409
3113
|
const SplitButton = (props) => {
|