@clickview/lite 0.82.2 → 0.83.0-rc.0
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/bundles.json +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/1074-fdce06d863-lite.chunk.js +2 -0
- package/dist/scripts/1074-fdce06d863-lite.chunk.js.map +1 -0
- package/dist/scripts/{1199-da55d69853-lite.chunk.js → 1199-01cc084886-lite.chunk.js} +1 -1
- package/dist/scripts/{1199-da55d69853-lite.chunk.js.map → 1199-01cc084886-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2664-87c8cbfa7f-lite.chunk.js → 2664-907153c03b-lite.chunk.js} +2 -2
- package/dist/scripts/2664-907153c03b-lite.chunk.js.map +1 -0
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js +2 -0
- package/dist/scripts/2970-024b1dd55d-lite.chunk.js.map +1 -0
- package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js → 3392-f7f8cb65e5-lite.chunk.js} +3 -3
- package/dist/scripts/3392-f7f8cb65e5-lite.chunk.js.map +1 -0
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js +2 -0
- package/dist/scripts/3840-59e5e53cda-lite.chunk.js.map +1 -0
- package/dist/scripts/{4177-285ddf9ae3-lite.chunk.js → 4177-2d876c7b14-lite.chunk.js} +2 -2
- package/dist/scripts/4177-2d876c7b14-lite.chunk.js.map +1 -0
- package/dist/scripts/{1336-1826f6e582-lite.chunk.js → 4208-0706461da6-lite.chunk.js} +2 -2
- package/dist/scripts/4208-0706461da6-lite.chunk.js.map +1 -0
- package/dist/scripts/{4578-7578bcf17a-lite.chunk.js → 4578-27028d26eb-lite.chunk.js} +2 -2
- package/dist/scripts/4578-27028d26eb-lite.chunk.js.map +1 -0
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js +2 -0
- package/dist/scripts/4598-8f5266e4c2-lite.chunk.js.map +1 -0
- package/dist/scripts/{4621-1f79d94416-lite.chunk.js → 4621-7fb0a05bcb-lite.chunk.js} +2 -2
- package/dist/scripts/4621-7fb0a05bcb-lite.chunk.js.map +1 -0
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js +2 -0
- package/dist/scripts/4806-a6f31d703c-lite.chunk.js.map +1 -0
- package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js → 4948-ba684e5f4f-lite.chunk.js} +1 -1
- package/dist/scripts/{4948-de1c75e7fb-lite.chunk.js.map → 4948-ba684e5f4f-lite.chunk.js.map} +1 -1
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js +2 -0
- package/dist/scripts/4985-7e02d5df40-lite.chunk.js.map +1 -0
- package/dist/scripts/{5554-17bb3b86fc-lite.chunk.js → 5554-f1f3baf822-lite.chunk.js} +2 -2
- package/dist/scripts/5554-f1f3baf822-lite.chunk.js.map +1 -0
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js +2 -0
- package/dist/scripts/5712-7cee70c6b4-lite.chunk.js.map +1 -0
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js +2 -0
- package/dist/scripts/6550-d99e0ed75d-lite.chunk.js.map +1 -0
- package/dist/scripts/{6909-a9b8930e37-lite.chunk.js → 6909-ba75701156-lite.chunk.js} +2 -2
- package/dist/scripts/6909-ba75701156-lite.chunk.js.map +1 -0
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js +2 -0
- package/dist/scripts/7148-1ced1b5dce-lite.chunk.js.map +1 -0
- package/dist/scripts/7568-55e9b01367-lite.chunk.js +3 -0
- package/dist/scripts/7568-55e9b01367-lite.chunk.js.map +1 -0
- package/dist/scripts/{7617-9d34c841e6-lite.chunk.js → 7617-211f084b70-lite.chunk.js} +2 -2
- package/dist/scripts/7617-211f084b70-lite.chunk.js.map +1 -0
- package/dist/scripts/7742-514844bd1a-lite.chunk.js +2 -0
- package/dist/scripts/7742-514844bd1a-lite.chunk.js.map +1 -0
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js +2 -0
- package/dist/scripts/7843-cbebf1a786-lite.chunk.js.map +1 -0
- package/dist/scripts/8077-870bd8e245-lite.chunk.js +3 -0
- package/dist/scripts/8077-870bd8e245-lite.chunk.js.map +1 -0
- package/dist/scripts/843-4dbc5df109-lite.chunk.js +3 -0
- package/dist/scripts/843-4dbc5df109-lite.chunk.js.LICENSE.txt +1 -0
- package/dist/scripts/843-4dbc5df109-lite.chunk.js.map +1 -0
- package/dist/scripts/8735-e74a148502-lite.chunk.js +2 -0
- package/dist/scripts/8735-e74a148502-lite.chunk.js.map +1 -0
- package/dist/scripts/8856-2d332952ae-lite.chunk.js +2 -0
- package/dist/scripts/8856-2d332952ae-lite.chunk.js.map +1 -0
- package/dist/scripts/904-2784e45cfc-lite.chunk.js +2 -0
- package/dist/scripts/904-2784e45cfc-lite.chunk.js.map +1 -0
- package/dist/scripts/{9042-fdc5ecb459-lite.chunk.js → 9042-fd7e79b891-lite.chunk.js} +1 -1
- package/dist/scripts/{9042-fdc5ecb459-lite.chunk.js.map → 9042-fd7e79b891-lite.chunk.js.map} +1 -1
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js +2 -0
- package/dist/scripts/9295-eb130a0b17-lite.chunk.js.map +1 -0
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js +2 -0
- package/dist/scripts/9528-4e954d9dff-lite.chunk.js.map +1 -0
- package/dist/scripts/{9742-5f99d74bb0-lite.chunk.js → 9742-3f6b75484a-lite.chunk.js} +2 -2
- package/dist/scripts/9742-3f6b75484a-lite.chunk.js.map +1 -0
- package/dist/scripts/979-6a70a0e616-lite.chunk.js +2 -0
- package/dist/scripts/979-6a70a0e616-lite.chunk.js.map +1 -0
- package/dist/scripts/{3612-8c6423bd51-lite.chunk.js → 9911-8892b6dbfe-lite.chunk.js} +2 -2
- package/dist/scripts/{3612-8c6423bd51-lite.chunk.js.map → 9911-8892b6dbfe-lite.chunk.js.map} +1 -1
- package/dist/scripts/bundle-f926852f33.min.js +3 -0
- package/dist/scripts/{bundle-9a3e49399a.min.js.map → bundle-f926852f33.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/css/2074-lite-ac8da6c78b.chunk.css +0 -4
- package/dist/scripts/1202-d96ad80884-lite.chunk.js +0 -2
- package/dist/scripts/1202-d96ad80884-lite.chunk.js.map +0 -1
- package/dist/scripts/1336-1826f6e582-lite.chunk.js.map +0 -1
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js +0 -2
- package/dist/scripts/2074-39b86b9a22-lite.chunk.js.map +0 -1
- package/dist/scripts/2664-87c8cbfa7f-lite.chunk.js.map +0 -1
- package/dist/scripts/2888-2596e106a5-lite.chunk.js +0 -2
- package/dist/scripts/2888-2596e106a5-lite.chunk.js.map +0 -1
- package/dist/scripts/289-669c0c8222-lite.chunk.js +0 -2
- package/dist/scripts/289-669c0c8222-lite.chunk.js.map +0 -1
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js +0 -2
- package/dist/scripts/3840-98c79fc0d8-lite.chunk.js.map +0 -1
- package/dist/scripts/3893-2856933742-lite.chunk.js +0 -2
- package/dist/scripts/3893-2856933742-lite.chunk.js.map +0 -1
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js +0 -3
- package/dist/scripts/4006-9dfe9cec1b-lite.chunk.js.map +0 -1
- package/dist/scripts/4177-285ddf9ae3-lite.chunk.js.map +0 -1
- package/dist/scripts/4578-7578bcf17a-lite.chunk.js.map +0 -1
- package/dist/scripts/4621-1f79d94416-lite.chunk.js.map +0 -1
- package/dist/scripts/4806-f36469abb7-lite.chunk.js +0 -2
- package/dist/scripts/4806-f36469abb7-lite.chunk.js.map +0 -1
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js +0 -2
- package/dist/scripts/4985-bdfa839f8f-lite.chunk.js.map +0 -1
- package/dist/scripts/5554-17bb3b86fc-lite.chunk.js.map +0 -1
- package/dist/scripts/5579-a9c152057f-lite.chunk.js +0 -2
- package/dist/scripts/5579-a9c152057f-lite.chunk.js.map +0 -1
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js +0 -2
- package/dist/scripts/5712-e784cfe89c-lite.chunk.js.map +0 -1
- package/dist/scripts/6070-a390fdce21-lite.chunk.js +0 -2
- package/dist/scripts/6070-a390fdce21-lite.chunk.js.map +0 -1
- package/dist/scripts/6909-a9b8930e37-lite.chunk.js.map +0 -1
- package/dist/scripts/7401-98135f09e8-lite.chunk.js +0 -2
- package/dist/scripts/7401-98135f09e8-lite.chunk.js.map +0 -1
- package/dist/scripts/7617-9d34c841e6-lite.chunk.js.map +0 -1
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js +0 -2
- package/dist/scripts/7742-342db3ce4f-lite.chunk.js.map +0 -1
- package/dist/scripts/7843-f6033528ce-lite.chunk.js +0 -2
- package/dist/scripts/7843-f6033528ce-lite.chunk.js.map +0 -1
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js +0 -2
- package/dist/scripts/787-dcb3a0a26c-lite.chunk.js.map +0 -1
- package/dist/scripts/8077-9fdb522d7e-lite.chunk.js +0 -2
- package/dist/scripts/8077-9fdb522d7e-lite.chunk.js.map +0 -1
- package/dist/scripts/8133-ffcff3b7fc-lite.chunk.js.map +0 -1
- package/dist/scripts/8364-ff63447d36-lite.chunk.js +0 -3
- package/dist/scripts/8364-ff63447d36-lite.chunk.js.map +0 -1
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js +0 -2
- package/dist/scripts/8672-6967ce8a23-lite.chunk.js.map +0 -1
- package/dist/scripts/9295-4242401e60-lite.chunk.js +0 -2
- package/dist/scripts/9295-4242401e60-lite.chunk.js.map +0 -1
- package/dist/scripts/9742-5f99d74bb0-lite.chunk.js.map +0 -1
- package/dist/scripts/979-4b893e5603-lite.chunk.js +0 -2
- package/dist/scripts/979-4b893e5603-lite.chunk.js.map +0 -1
- package/dist/scripts/9911-9272b96e46-lite.chunk.js +0 -2
- package/dist/scripts/9911-9272b96e46-lite.chunk.js.map +0 -1
- package/dist/scripts/bundle-9a3e49399a.min.js +0 -3
- /package/dist/css/{787-lite-5a317efacd.chunk.css → 2970-lite-5a317efacd.chunk.css} +0 -0
- /package/dist/css/{6070-lite-45dc286aab.chunk.css → 6550-lite-45dc286aab.chunk.css} +0 -0
- /package/dist/css/{2888-lite-856c02f000.chunk.css → 7148-lite-856c02f000.chunk.css} +0 -0
- /package/dist/css/{8364-lite-db31e36b79.chunk.css → 843-lite-db31e36b79.chunk.css} +0 -0
- /package/dist/css/{9911-lite-856c02f000.chunk.css → 8735-lite-856c02f000.chunk.css} +0 -0
- /package/dist/css/{5579-lite-f8e496136d.chunk.css → 8856-lite-f8e496136d.chunk.css} +0 -0
- /package/dist/css/{289-lite-2435a34b13.chunk.css → 904-lite-2435a34b13.chunk.css} +0 -0
- /package/dist/css/{1202-lite-4a892bdbf2.chunk.css → 9528-lite-4a892bdbf2.chunk.css} +0 -0
- /package/dist/css/{3612-lite-2b4142796a.chunk.css → 9911-lite-2b4142796a.chunk.css} +0 -0
- /package/dist/scripts/{4006-9dfe9cec1b-lite.chunk.js.LICENSE.txt → 3392-f7f8cb65e5-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8133-ffcff3b7fc-lite.chunk.js.LICENSE.txt → 7568-55e9b01367-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8364-ff63447d36-lite.chunk.js.LICENSE.txt → 8077-870bd8e245-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-9a3e49399a.min.js.LICENSE.txt → bundle-f926852f33.min.js.LICENSE.txt} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/4177-285ddf9ae3-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/rostering/rostering-alert/RosteringAlert.tsx","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/partial-loading/partial-manage-classroom-students.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/partial-loading/PartialManageClassroomStudents.tsx","file:///app/packages/projects/lite/src/apps/classrooms/views/full-classrooms-experience/empty-state/ClassroomsNoStudentsState.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/empty-state/ManageClassroomStudentsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-group-pill/classroom-group-pill.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-group-pill/ClassroomGroupPill.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-student-item/manage-classroom-student-item.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-student-item/ManageClassroomStudentItem.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-students/ManageClassroomStudents.tsx","file:///app/packages/projects/lite/src/apps/classrooms/views/classroom-students/ClassroomStudentsView.tsx","file:///app/packages/projects/lite/src/shared/hooks/useClassroomExperience.ts"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'rostering.alert';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RosteringAlertProps {\n type?: 'classroom' | 'general';\n}\n\nexport function RosteringAlert(props: RosteringAlertProps) {\n const text = props.type === 'classroom' ? getPhrase('classroom') : getPhrase('hasRostering');\n\n return (\n <div className='alert text-info bg-light-blue px-2 rounded-3 fw-semibold py-2 d-flex flex-wrap'>\n {text} \n {/* todo add it back when KB article link is ready */}\n {/* <ExternalLink\n className='text-info text-underline'\n href={''}\n newTab\n >\n {LanguageService.getPhrase(namespace, 'learnMore')}\n </ExternalLink> */}\n </div>\n );\n}","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { useForceUpdate } from 'libs/shared/hooks/useForceUpdate';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\n\ntype CheckboxItemsState = Map<string, boolean>;\n\nexport interface BulkCheckboxManager {\n onToggleBulk: () => void;\n onToggleItem: (id: string) => void;\n getSelected: () => string[];\n isChecked: (item: string | number | HashObject<string>) => boolean;\n bulkChecked: boolean;\n deselectAll: () => void;\n hasSomeSelections: () => boolean;\n setSelected: (ids: string[]) => void;\n getSelectedCount: () => number;\n reset: () => void;\n getMap: () => Map<string, boolean>;\n}\n\nexport interface BulkCheckboxManagerOptions {\n idField?: string; // For objects like `PresentationAudiences` that don't use `id` as their identifier field\n persistNamespace?: string;\n preselectedIds?: string[];\n initialState?: CheckboxItemsState;\n}\n\n/**\n * @param collection - The collection you are keeping track of with checkboxes\n * @param options - See interface above\n */\nexport const useBulkCheckboxManager = (collection: HashObject[], options: BulkCheckboxManagerOptions = {}) => {\n const { idField = 'id', persistNamespace } = options;\n\n const initial = options.initialState ? options.initialState : new Map<string, boolean>();\n\n const items = React.useRef<CheckboxItemsState>(initial);\n \n const forceUpdate = useForceUpdate();\n\n const prevCollection = usePrevious(collection);\n const prevNamespace = usePrevious(persistNamespace);\n\n /**\n * This hook will clear the state of this hook when a user navigates between pages\n * if a persistNamespace was not provided\n */\n React.useEffect(() => {\n /**\n * If we're being passed initial state, we don't want to clear the state\n */\n if (options.initialState)\n return;\n\n /**\n * If we've been given a persist namespace, we don't want to clear our\n * selections while the namespace stays the same\n */\n if (persistNamespace && prevNamespace === persistNamespace)\n return;\n\n /**\n * Don't reinitialize if the ids of the new and old collection\n * are identical\n */\n const prevIds = prevCollection?.map(i => i[idField]).join();\n const ids = collection?.map(i => i[idField]).join();\n\n if (prevIds === ids)\n return;\n\n reset();\n }, [ prevCollection, prevNamespace, collection, options.initialState ]);\n\n React.useEffect(() => {\n if (!options.preselectedIds?.length)\n return;\n\n setSelected(options.preselectedIds);\n }, []);\n\n function reset(): void {\n items.current.clear();\n forceUpdate();\n }\n\n // When toggled on, all checkbox items will be enabled. Vice versa if toggled off\n function onToggleBulk(): void {\n const setValue = !isBulkChecked();\n\n collection.forEach(item => {\n if (setValue)\n items.current.set(item[idField].toString(), true);\n else\n items.current.delete(item[idField].toString());\n });\n\n forceUpdate();\n }\n\n // Toggles a single item\n function onToggleItem(id: string): void {\n const nextItemState = !items.current.get(id.toString());\n\n if (nextItemState)\n items.current.set(id.toString(), nextItemState);\n else\n items.current.delete(id.toString());\n \n forceUpdate();\n }\n\n // Returns the state of the item passed in\n function isChecked(item: string | number | HashObject<string>): boolean {\n if (typeof item === 'number')\n item = item.toString();\n else if (typeof item !== 'string')\n item = item[idField].toString();\n\n return items.current.get(item);\n }\n\n function getSelected(): string[] {\n return Array.from(items.current.keys());\n }\n\n function deselectAll(): void {\n if (!collection?.length) return;\n\n collection.forEach(item => {\n items.current.delete(item[idField].toString());\n });\n forceUpdate();\n }\n\n // Returns true if at least 1 item is checked\n function hasSomeSelections(): boolean {\n if (!collection?.length)\n return false;\n\n return !!collection.find(item => isChecked(item));\n }\n\n function isBulkChecked(): boolean {\n if (!collection?.length)\n return false;\n\n return collection.every(isChecked);\n }\n\n function setSelected(ids: string[]): void {\n ids.forEach(id => {\n items.current.set(id, true);\n });\n forceUpdate();\n }\n\n function getSelectedCount(): number {\n return items.current.size;\n }\n\n function getMap(): Map<string, boolean> {\n return items.current;\n }\n\n return {\n onToggleBulk,\n onToggleItem,\n getSelected,\n isChecked,\n bulkChecked: isBulkChecked(),\n deselectAll,\n hasSomeSelections,\n setSelected,\n getSelectedCount,\n reset,\n getMap\n };\n};","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"heading\":\"YrP_G\",\"avatar\":\"droqZ\",\"checkbox\":\"pJf6R\",\"actionIcon\":\"MSvzY\",\"addStudents\":\"j62jt\",\"studentName\":\"gorcb\",\"group\":\"IFmvc\",\"sm\":\"pOcvk\",\"lg\":\"SdQ90\",\"moreActions\":\"S7p4K\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialPillTabSelector } from 'libs/shared/components/pill-tab-selector/partial-loading/PartialPillTabSelector';\n\nimport styles from './partial-manage-classroom-students.scss';\n\nexport const PartialManageClassroomStudents = React.memo(function(): JSX.Element {\n return (\n <div className='px-3'>\n {/* Heading */}\n <div className={`mb-1 partial-loading-background ${styles.heading}`} />\n\n {/* Breadcrumbs */}\n <div className='pb-3'>\n <PartialBreadcrumbs numItems={2} />\n </div>\n\n {/* Pill tab selector */}\n <div className='pb-2'>\n <PartialPillTabSelector />\n </div>\n\n <div className='d-flex align-items-center py-2'>\n {/* Checkbox */}\n <div className={`mx-4 partial-loading-background ${styles.checkbox}`} />\n {/* Group selector */}\n <div className={`me-2 partial-loading-background ${styles.actionIcon}`} />\n {/* Delete action */}\n <div className={`me-auto partial-loading-background ${styles.actionIcon}`} />\n\n {/* Add new students button */}\n <div className={`partial-loading-background ${styles.addStudents}`} />\n </div>\n\n {/* Students list */}\n <ul className='striped-list list-unstyled'>\n {Array(20).fill(null).map((student, i) => (\n <li key={i}>\n <div className='d-flex align-items-center py-1 px-4'>\n {/* Checkbox */}\n <div className={`me-2 partial-loading-background ${styles.checkbox}`} />\n\n {/* Avatar */}\n <div className={`me-2 partial-loading-background ${styles.avatar}`} />\n\n {/* Student name */}\n <div className='w-25'>\n <div className={`partial-loading-background ${styles.studentName}`} />\n </div>\n\n {/* Groups list. Randomly renders either 1 or 2 groups. Group widths are randomly generated */}\n <div className='me-auto d-flex'>\n {Math.random() > 0.5\n ? (\n <>\n <div className={`partial-loading-background rounded-pill me-1 ${styles.group} ${styles.lg}`} />\n <div className={`partial-loading-background rounded-pill ${styles.group} ${styles.sm}`} />\n </>\n ) : <div className={`partial-loading-background rounded-pill ${styles.group} ${styles.sm}`} />\n }\n </div>\n\n {/* Group selector */}\n <div className={`me-2 partial-loading-background ${styles.actionIcon}`} />\n {/* More actions */}\n <div className={`partial-loading-background ${styles.moreActions}`} />\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n});","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.classroomsEmptyState';\n\ninterface ClassroomsNoStudentsStateProps {\n canManageUsers: boolean;\n isRostering?: boolean;\n}\n\nexport function ClassroomsNoStudentsState(props: ClassroomsNoStudentsStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='noStudentsHeading' /></EmptyState.Heading>\n <EmptyState.Info className={`w-33 ${!props.canManageUsers ? 'mb-0' : ''}`}>\n <Text phrase='noStudentsInfo' />\n </EmptyState.Info>\n\n {props.canManageUsers && !props.isRostering && (\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'noStudentsCta')}\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.STUDENTS\n }}\n />\n )}\n {!props.canManageUsers && !props.isRostering && (\n <EmptyState.Info><Text phrase='askAdmin' /></EmptyState.Info>\n )}\n {props.isRostering && (\n <a className='btn btn-link info-link font-semibold' href={''} target='_blank'>\n {LanguageService.getPhrase(namespace, 'rosteringCta')}\n </a>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomsNoStudentsState } from 'apps/classrooms/views/full-classrooms-experience/empty-state/ClassroomsNoStudentsState';\n\nconst namespace = 'classrooms.manageClassroomStudentsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst STUDENT_ENGAGEMENT_IDEAS_LINK = 'https://static.clickview.com.au/Primary/Documents/Student-engagement-ideas.pdf';\nconst ROSTERING_KB_ARTICLE_URL = '';\n\ninterface ManageClassroomStudentsEmptyStateProps {\n classroom: Classroom;\n classroomIdeasText: string;\n schoolHasNoStudents: boolean;\n canManageUsers: boolean;\n}\n\nexport function RosteredClassroomStudentsEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='emptyStateHeading' /></EmptyState.Heading>\n\n <EmptyState.Info className='mb-2' ><Text phrase='emptyStateInfo' /></EmptyState.Info>\n\n <a className='btn btn-link info-link font-semibold' href={ROSTERING_KB_ARTICLE_URL} target='_blank'>\n {getPhrase('rosteringCta')}\n </a>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function ManageClassroomStudentsEmptyState(props: ManageClassroomStudentsEmptyStateProps): JSX.Element {\n if (props.schoolHasNoStudents)\n return <ClassroomsNoStudentsState canManageUsers={props.canManageUsers} />;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.STUDENTS} />\n\n <EmptyState.Heading><Text phrase='emptyStateHeading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='emptyStateInfo' /></EmptyState.Info>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'addStudents')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ADD_STUDENTS_CHOICES,\n args: [props.classroom.id]\n }}\n />\n\n <a className='btn btn-link info-link font-semibold' href={STUDENT_ENGAGEMENT_IDEAS_LINK} target='_blank'>\n {props.classroomIdeasText}\n </a>\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"maxWidth\":\"A0VzW\"};","import React from 'react';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { ClassroomGroup } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\n\nimport styles from './classroom-group-pill.scss';\n\ninterface ClassroomGroupProps {\n group: ClassroomGroup;\n}\n\nexport function ClassroomGroupPill(props: ClassroomGroupProps): JSX.Element {\n if (!props.group)\n return <></>;\n\n return (\n <div className={`classroom-pill ${styles.maxWidth} text-white text-truncate bg-${mapColourToBsVariant(props.group.metadata?.colour)}`}>\n <p className='text-truncate mb-0' title={props.group.name}>{props.group.name}</p>\n </div>\n );\n}\n\ninterface ClassroomGroupExpanderProps {\n count: number;\n onClick: () => void;\n}\n\nexport function ClassroomGroupExpander(props: ClassroomGroupExpanderProps): JSX.Element {\n if (!props.count)\n return <></>;\n\n return (\n <DivButton onClick={props.onClick} className={`classroom-pill bg-white border border-dark`}>\n +{props.count}\n </DivButton>\n );\n}","import React from 'react';\nimport { Dropdown } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { HashObject } from 'libs/common/react/interfaces/HashObject';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { PropsWithAnalyticsOptions, User } from 'libs/shared/interfaces';\nimport { Classroom, ClassroomGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupPill } from 'apps/classrooms/components/classroom-group-pill/ClassroomGroupPill';\n\nconst namespace = 'classrooms.classroomGroupDropdown';\n\nconst getNewGroupAppLink = (id: string, students: User[]) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.NEW_GROUP,\n args: [id],\n params: {\n addStudents: students.map(s => s.id)\n }\n});\n\nfunction checkStudentsAllInGroup(students: User[], group: ClassroomGroup) {\n const groupUserIds = new Set(group.users.data.map(u => u.id.toString()));\n return students.every(student => groupUserIds.has(student.id.toString()));\n}\n\nfunction checkStudentsNotInGroup(students: User[], group: ClassroomGroup) {\n const groupUserIds = new Set(group.users.data.map(u => u.id.toString()));\n return students.every(student => !groupUserIds.has(student.id.toString()));\n}\n\ntype ClassroomGroupDropdownProps = PropsWithAnalyticsOptions<{\n id: string;\n classroom: Classroom;\n selectedStudents: User[];\n groups: ClassroomGroup[];\n onSelectGroup: (group: ClassroomGroup, toggleOn?: boolean) => void;\n preselections?: ClassroomGroup[];\n isBulk?: boolean;\n\n alignRight?: boolean;\n disabled?: boolean;\n disabledTooltips?: string;\n}>;\n\nClassroomGroupDropdown.defaultProps = {\n preselections: []\n};\n\nexport function ClassroomGroupDropdown(props: ClassroomGroupDropdownProps): JSX.Element {\n const { onToggleItem, isChecked } = useBulkCheckboxManager(props.groups, {\n preselectedIds: props.preselections.map(s => s.id)\n });\n\n const studentsAllInGroupLookup = props.groups.reduce((acc, group) => {\n acc[group.id] = checkStudentsAllInGroup(props.selectedStudents, group);\n return acc;\n }, {} as Record<string, boolean>);\n\n function onChange(group: ClassroomGroup): void {\n const shouldAdd = !isChecked(group.id);\n props.onSelectGroup(group, shouldAdd);\n\n onToggleItem(group.id);\n }\n\n function onClickCreateNewGroup(): void {\n if (props.disabled)\n return;\n\n AnalyticsHelper.logUserAction({\n classroom: { id: props.classroom.id, name: props.classroom.name }\n }, AnalyticsHelper.mergeOptions(props.analyticsOptions, {\n actionType: UserAction.Create,\n workflowPhase: WorkflowPhase.Start,\n entity: EntityType.ClassroomGroup\n }));\n }\n\n React.useEffect(() => {\n // On each passthrough, validate that the checkbox states are valid\n // This is needed because the group/student state is managed in 2 separate places on the same page\n props.groups.forEach(g => {\n const totalCheckedForGroup = studentsAllInGroupLookup[g.id];\n // Validate if unchecked checkbox should be checked\n if (!!totalCheckedForGroup && !isChecked(g.id)) {\n onToggleItem(g.id);\n return;\n }\n\n // Validate if checked checkbox should be unchecked\n if (!totalCheckedForGroup && isChecked(g.id)) {\n onToggleItem(g.id);\n return;\n }\n });\n }, [\n Object.entries(studentsAllInGroupLookup).sort((a, b) => a[0].localeCompare(b[0])).join(',')\n ]);\n\n const buttonClasses = 'me-2 d-inline-block svg-container sm';\n\n const dropdownProps: HashObject = {\n align: props.alignRight ? 'end' : 'start'\n };\n\n /**\n * This prop is applied like this so that when `props.disabled` it false, the prop is omitted altogether.\n * This is because we want `react-bootstrap` to control the open state, and if we used the `show` prop\n * at all times we'd be preventing that.\n */\n if (props.disabled)\n dropdownProps.show = false;\n\n return (\n <Dropdown {...dropdownProps}>\n <Dropdown.Toggle\n as='div'\n id={props.id}\n className={`${props.disabled ? 'text-light' : 'cursor-pointer'} ${buttonClasses} no-caret`}\n >\n <SvgContainer\n svgName={cvSvgLibrary.Group}\n title={props.disabled ? props.disabledTooltips : LanguageService.getPhrase(namespace, 'addToGroupTooltip')}\n tooltipPlacement='top'\n tooltipSpanHack\n tooltipSpanHackClassName=''\n />\n </Dropdown.Toggle>\n <Dropdown.Menu>\n {!!props.groups?.length && (\n <div className='px-2 border-bottom mb-1'>\n <p className='mb-0'><Text namespace={namespace} phrase='addToGroup' /></p>\n <ul className='list-unstyled pe-3'>\n {props.groups.map(group => {\n const isEmptyChecked = checkStudentsNotInGroup(props.selectedStudents, group);\n const isIndeterminate = !props.isBulk\n ? false\n : !studentsAllInGroupLookup[group.id] && !isEmptyChecked;\n\n return (\n <li key={group.id} className='d-flex align-items-center bg-white my-1'>\n <Checkbox\n id={`${props.id}:${group.id}`}\n checked={isChecked(group.id)}\n onChange={() => onChange(group)}\n indeterminate={isIndeterminate }\n />\n <ClassroomGroupPill group={group} />\n </li>\n );\n })}\n </ul>\n </div>\n )}\n <AppLink\n onClick={onClickCreateNewGroup}\n appLink={getNewGroupAppLink(props.classroom.id, props.selectedStudents)}\n className={props.disabled ? 'disabled' : 'text-nowrap d-flex align-items-center px-2'}\n >\n <SvgContainer svgName={cvSvgLibrary.Plus} />\n <Text namespace={namespace} phrase='createNew' />\n </AppLink>\n </Dropdown.Menu>\n </Dropdown>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"rfVnC\",\"name\":\"RYLWZ\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions, Actions as MoreActions } from 'libs/shared/components/actions/Actions';\nimport { Avatar } from 'libs/shared/components/avatar/Avatar';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useResizeListener } from 'libs/shared/hooks/UseResizeListener';\nimport { ClassroomGroup, Config } from 'libs/shared/interfaces';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupDropdown } from 'apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown';\nimport { ClassroomGroupExpander, ClassroomGroupPill } from 'apps/classrooms/components/classroom-group-pill/ClassroomGroupPill';\n\nimport styles from './manage-classroom-student-item.scss';\n\ntype GroupVisibilityMapping = { [id: string]: boolean };\n\nconst namespace = 'classrooms.manageClassroomStudentItem';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst getEditStudentAppLink = (id: string) => ({\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.EDIT_USER,\n args: [id],\n params: { userType: UserGroup.Learner }\n});\n\nconst getRemoveStudentsAppLink = (studentId: string, classroomId: string) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_STUDENTS,\n args: [classroomId],\n params: {\n studentIds: [studentId]\n }\n});\n\ninterface ManageClassroomStudentItemProps {\n classroom: Classroom;\n student: User;\n classroomGroups: ClassroomGroup[];\n selectedGroups: ClassroomGroup[];\n config: Config;\n onToggleGroup: (student: User, group: ClassroomGroup, toggleOn: boolean) => void;\n onToggleCheckbox: () => void;\n checked: boolean;\n readOnly?: boolean;\n readOnlyTooltip?: string;\n}\n\nexport function ManageClassroomStudentItem(props: ManageClassroomStudentItemProps): JSX.Element {\n const [ isComputingTruncation, setIsComputingTruncation ] = React.useState(false);\n const [ hasExpandedGroups, setHasExpandedGroups ] = React.useState(false);\n\n // Maps a group to it's visibility state.\n const [ groupVisibilityMapping, setGroupVisibilityMapping ] = React.useState<GroupVisibilityMapping>({});\n\n const groupListRef = React.useRef<HTMLDivElement>(null);\n const expanderRef = React.useRef<HTMLDivElement>(null);\n const selectedGroupsRef = React.useRef<ClassroomGroup[]>(props.selectedGroups);\n\n const { hasPermissions } = usePermissions();\n\n // Every time the selected groups array changes, we want to re-compute which groups should be truncated\n React.useEffect(() => {\n selectedGroupsRef.current = props.selectedGroups;\n renderAllGroups();\n\n if (hasExpandedGroups) // Don't re-compute if the user has expanded all groups\n return;\n\n setIsComputingTruncation(true);\n }, [props.selectedGroups.length]);\n\n function onResize(): void {\n renderAllGroups();\n setIsComputingTruncation(true);\n }\n\n const throttledResizeListener = FunctionHelper.throttle(onResize, 300);\n\n useResizeListener(() => {\n if (hasExpandedGroups) // Don't re-compute if the user has expanded all groups\n return;\n\n throttledResizeListener();\n });\n\n /**\n * This iterates through each group element, and detects if any of them don't\n * fit on the first row of items. The elements that don't will be hidden.\n */\n React.useEffect(() => {\n if (!groupListRef.current || !expanderRef.current || !isComputingTruncation)\n return;\n\n const firstGroupPill = groupListRef.current.firstElementChild as HTMLDivElement;\n if (!firstGroupPill) return;\n\n const topRowHeight = firstGroupPill.getBoundingClientRect().y;\n\n const nextGroupVisibilityMapping: { [id: string]: boolean } = {};\n\n /**\n * Here we're checking if the y-coordinate of any groups\n * don't match the y-coordinate of the first group (which should\n * always be on the first row). This way we know if they should be\n * hidden or not.\n */\n let lastVisibleId: string;\n for (const child of groupListRef.current.children) {\n if (child.id) {\n nextGroupVisibilityMapping[child.id] = child.getBoundingClientRect().y === topRowHeight;\n lastVisibleId = nextGroupVisibilityMapping[child.id] ? child.id : lastVisibleId;\n }\n }\n\n // If the expander button has also wrapped, we hide the last element that we were going to make visible.\n if (expanderRef.current.getBoundingClientRect().y !== topRowHeight)\n nextGroupVisibilityMapping[lastVisibleId] = false;\n\n setGroupVisibilityMapping(nextGroupVisibilityMapping);\n setIsComputingTruncation(false);\n }, [isComputingTruncation]);\n\n function onClickShowAllGroups(): void {\n setHasExpandedGroups(true);\n renderAllGroups();\n }\n\n // Updates the group visibility mapping to display all groups\n function renderAllGroups(): void {\n setGroupVisibilityMapping(selectedGroupsRef.current.reduce((acc, group) => {\n acc[group.id] = true;\n return acc;\n }, {} as GroupVisibilityMapping));\n }\n\n // Returns the number of groups that are invisible\n function getInvisibleGroupCount(): number {\n return Object.keys(groupVisibilityMapping).reduce((count, groupId) => {\n if (!groupVisibilityMapping[groupId])\n count++;\n \n return count;\n }, 0);\n }\n\n function getActions(): ActionOptions[] {\n const actions: ActionOptions[] = [];\n\n if (hasPermissions(PermissionName.ManageUsers))\n actions.push({\n label: getPhrase('editStudent'),\n appLink: getEditStudentAppLink(props.student.id),\n disabled: props.readOnly,\n className: props.readOnly ? 'disabled' : '',\n tooltip: props.readOnly ? props.readOnlyTooltip : '',\n onClick: () => {\n AnalyticsHelper.logUserAction({ id: props.student.id }, {\n actionType: UserAction.Edit,\n entity: EntityType.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomStudentListItem\n });\n }\n });\n\n actions.push({\n label: getPhrase('removeStudent'),\n appLink: getRemoveStudentsAppLink(props.student.id, props.classroom.id),\n disabled: props.readOnly,\n className: props.readOnly ? 'disabled' : 'text-danger',\n tooltip: props.readOnly ? props.readOnlyTooltip : '',\n onClick: () => {\n AnalyticsHelper.logUserAction({\n id: props.classroom.id,\n name: props.classroom.name,\n userId: props.student.id\n }, {\n actionType: UserAction.Dissociate,\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext.ManageClassroomStudentListItem\n });\n }\n });\n\n return actions;\n }\n\n return (\n <div className='d-flex align-items-center py-1 px-4'>\n <Checkbox\n id={props.student.id}\n checked={props.checked}\n onChange={props.onToggleCheckbox}\n className='me-2'\n disabled={props.readOnly}\n />\n\n <div className={`${styles.avatarContainer} flex-shrink-0 me-2`}>\n <Avatar\n imageCdnUrl={props.config.imageCdnUrl}\n initials={UserHelper.getInitials(props.student.name, props.student.surname)}\n imageUrl={props.student.avatar?.url}\n />\n </div>\n\n <p className={`me-2 ${styles.name} text-truncate mb-0 text-nowrap`}>{props.student.name} {props.student.surname}</p>\n\n <div\n // When we are computing the truncation, we want all group elements to be rendered but invisible.\n className={`${isComputingTruncation ? 'invisible' : ''} me-auto d-flex flex-wrap mt-n1`}\n ref={groupListRef}\n >\n {props.selectedGroups.map(group => {\n if (!groupVisibilityMapping[group.id]) // Don't render any groups that are marked as hidden\n return <React.Fragment key={group.id}></React.Fragment>;\n\n return (\n <div key={group.id} className='me-1 mt-1' id={group.id}>\n <ClassroomGroupPill group={group} />\n </div>\n );\n })}\n <div ref={expanderRef} className='me-1 mt-1'>\n <ClassroomGroupExpander count={getInvisibleGroupCount()} onClick={onClickShowAllGroups} />\n </div>\n </div>\n\n <ClassroomGroupDropdown\n id={`add-group-${props.student.id}`}\n classroom={props.classroom}\n groups={props.classroomGroups}\n selectedStudents={[props.student]}\n preselections={props.selectedGroups}\n onSelectGroup={(group, toggleOn) => props.onToggleGroup(props.student, group, toggleOn)}\n analyticsOptions={{ location: LocationContext.ManageClassroomStudentListItem }}\n alignRight\n disabled={props.readOnly}\n disabledTooltips={props.readOnlyTooltip}\n />\n\n <MoreActions\n actions={getActions()}\n actionsDropdownClassName='btn'\n />\n </div>\n );\n}","import * as React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Classroom, Config } from 'libs/shared/interfaces';\nimport { ClassroomGroup, User, UserCollection } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ClassroomGroupDropdown } from 'apps/classrooms/components/classroom-group-dropdown/ClassroomGroupDropdown';\nimport { ManageClassroomStudentItem } from 'apps/classrooms/components/manage-classroom-student-item/ManageClassroomStudentItem';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nimport { ManageClassroomStudentsEmptyState } from './empty-state/ManageClassroomStudentsEmptyState';\n\nconst namespace = 'classrooms.manageClassroomStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ManageClassroomStudentsProps {\n classroom: Classroom;\n students: UserCollection;\n schoolHasNoStudents: boolean;\n canManageUsers: boolean;\n groups: ClassroomGroup[];\n config: Config;\n onToggleGroup: (student: User, group: ClassroomGroup, toggleOn: boolean) => void;\n onBulkSelectGroup: (students: User[], group: ClassroomGroup, shouldAdd: boolean) => void;\n readOnly?: boolean;\n}\n\nexport function ManageClassroomStudents(props: ManageClassroomStudentsProps): JSX.Element {\n const { classroom, students, groups } = props;\n\n const dispatch = useDispatch();\n const alerts = useAlerts();\n\n const CheckboxHelper = useBulkCheckboxManager(students.data);\n const selectionCount = CheckboxHelper.getSelected().length;\n\n const bulkPreselections = groups.filter(group => {\n if (!group.users?.data?.length)\n return false;\n\n let allStudentsFound = true;\n let index = 0;\n\n const studentIds = CheckboxHelper.getSelected();\n\n if (!studentIds.length)\n return;\n\n do {\n const id = studentIds[index];\n if (!group.users.data.find((stu: any) => stu.id.toString() === id.toString()))\n allStudentsFound = false;\n\n index++;\n } while (index < studentIds.length);\n\n return allStudentsFound;\n });\n\n function onClickAddStudents(): void {\n AnalyticsHelper.logUserAction({ id: classroom.id }, {\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Associate,\n location: LocationContext.ManageClassroomStudents\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.ADD_STUDENTS_CHOICES,\n args: [classroom.id]\n });\n }\n\n function onClickBulkRemoveStudents(): void {\n if (!selectionCount || props.readOnly)\n return;\n\n const studentIds = CheckboxHelper.getSelected();\n\n AnalyticsHelper.logUserAction({\n id: classroom.id,\n studentCount: studentIds.length\n }, {\n entity: EntityType.Classroom,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Dissociate,\n location: LocationContext.ManageClassroomStudents\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.REMOVE_STUDENTS,\n args: [classroom.id],\n params: {\n studentIds\n }\n });\n }\n\n function onSelectGroup(group: ClassroomGroup, shouldAdd: boolean): void {\n const selectedStudentIds = CheckboxHelper.getSelected();\n // optimistically update the UI on bulk add/remove\n props.onBulkSelectGroup(students.data.filter(s => selectedStudentIds.includes(s.id.toString())), group, shouldAdd);\n\n const request = shouldAdd ? ClassroomRequests.addStudentsToGroup : ClassroomRequests.removeStudentsFromGroup;\n\n Flight.fetch(\n dispatch,\n request(selectedStudentIds, group.id, classroom.id, () => {\n AnalyticsHelper.logUserAction({\n id: group.id,\n studentCount: selectedStudentIds.length\n }, {\n actionType: UserAction.Associate,\n entity: EntityType.ClassroomGroup,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.ManageClassroomStudents\n });\n\n alerts.success(getPhrase('addSuccess', { groupName: group.name, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('addError', { groupName: group.name, escapeText: true }));\n })\n );\n }\n\n const edgeToEdge = useMediaQuery(MediaQueryStrings.XLDown);\n\n if (!students.data?.length) {\n return (\n <ManageClassroomStudentsEmptyState\n classroom={props.classroom}\n classroomIdeasText={getPhrase('classroomIdeasText')}\n schoolHasNoStudents={props.schoolHasNoStudents}\n canManageUsers={props.canManageUsers}\n />\n );\n }\n\n const selectedStudents = CheckboxHelper\n .getSelected()\n .map(id => {\n return props.students.data.find(s => s.id.toString() === id.toString());\n })\n .filter(s => !!s);\n\n return (\n <>\n <div className={`d-flex align-items-center py-2 ${edgeToEdge ? 'ps-2' : 'ps-4'}`}>\n <Checkbox\n id='manage-classroom-students-bulk'\n onChange={CheckboxHelper.onToggleBulk}\n checked={CheckboxHelper.bulkChecked}\n className='me-2'\n indeterminate={CheckboxHelper.hasSomeSelections()}\n disabled={props.readOnly}\n />\n\n <ClassroomGroupDropdown\n id='bulk-add-group'\n classroom={classroom}\n selectedStudents={selectedStudents}\n isBulk\n groups={groups}\n onSelectGroup={onSelectGroup}\n disabled={!selectionCount || props.readOnly}\n preselections={bulkPreselections}\n analyticsOptions={{ location: LocationContext.ManageClassroomStudents }}\n disabledTooltips={props.readOnly && LanguageService.getPhrase(namespace, 'disabledByRostering')}\n />\n <DivButton\n className={`me-auto ${!selectionCount || props.readOnly ? 'text-light cursor-default' : ''}`}\n onClick={onClickBulkRemoveStudents}\n >\n <Tooltip\n spanHack\n title={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : ''}\n >\n <SvgContainer\n svgName={cvSvgLibrary.Delete}\n title={LanguageService.getPhrase(namespace, 'delete')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </Tooltip>\n </DivButton>\n <Tooltip\n spanHack\n title={props.readOnly ? LanguageService.getPhrase(namespace, 'disabledByRostering') : ''}\n >\n <IconButton\n onClick={onClickAddStudents}\n svgName={cvSvgLibrary.Plus}\n className='btn btn-outline-dark'\n disabled={props.readOnly}\n >\n <Text namespace={namespace} phrase='addStudent' />\n </IconButton>\n </Tooltip>\n </div>\n\n <ul className='striped-list list-unstyled'>\n {students.data.map(student => (\n <li key={student.id}>\n <ManageClassroomStudentItem\n classroom={classroom}\n student={student}\n classroomGroups={props.groups}\n config={props.config}\n selectedGroups={props.groups.filter(g => g.users.data.find(u => u.id === student.id))}\n checked={CheckboxHelper.isChecked(student.id)}\n onToggleCheckbox={() => CheckboxHelper.onToggleItem(student.id)}\n onToggleGroup={props.onToggleGroup}\n readOnly={props.readOnly}\n readOnlyTooltip={props.readOnly ? getPhrase('disabledByRostering') : ''}\n />\n </li>\n ))}\n </ul>\n </>\n );\n}\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AssocDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { RosteringAlert } from 'libs/shared/components/rostering/rostering-alert/RosteringAlert';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, ClassroomGroup, ClassroomGroupCollection, Config, CurrentUser, User, UserCollection } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ManageClassroomStudentsEmptyState, RosteredClassroomStudentsEmptyState } from 'apps/classrooms/components/manage-classroom-students/empty-state/ManageClassroomStudentsEmptyState';\nimport { ManageClassroomStudents } from 'apps/classrooms/components/manage-classroom-students/ManageClassroomStudents';\nimport { PartialManageClassroomStudents } from 'apps/classrooms/components/manage-classroom-students/partial-loading/PartialManageClassroomStudents';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { useHandleClassroomErrors } from 'apps/classrooms/hooks/useHandleClassroomErrors';\nimport { ClassroomLayout } from 'apps/classrooms/layouts/ClassroomLayout';\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nconst namespace = 'classrooms.classroomStudents';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst baseAnalyticsOptions = {\n entity: EntityType.ClassroomGroup,\n descriptor: AssocDescriptor.User,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.ManageClassroomStudentListItem\n};\n\ninterface ClassroomStudentsViewProps {\n id: string;\n cursor: string;\n}\n\nexport function ClassroomStudentsView(props: ClassroomStudentsViewProps): JSX.Element {\n const { hasShareFlowV2 } = useSettings(null);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.id, currentUser.data.id));\n const students = Flight.useBasicFetch<UserCollection>(ClassroomRequests.getClassroomStudents(props.id, props.cursor));\n const allStudents = Flight.useBasicFetch<UserCollection>(currentUser.data &&\n UserManagerRequests.getUsers(currentUser.data.customerId, UserGroup.Learner));\n const groups = Flight.useBasicFetch<ClassroomGroupCollection>(ClassroomRequests.getClassroomGroups(props.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n // Maintain a localGroups to optimistically update the UI\n const [ localGroups, setLocalGroups ] = React.useState<ClassroomGroup[]>(groups.data?.data);\n React.useEffect(() => {\n if (groups.hasCompleted && !groups.isFetching)\n setLocalGroups(groups.data.data);\n }, [ groups.hasCompleted, groups.isFetching ]);\n\n const isRostered = classroom.data?._integrations?.rostered;\n\n const dispatch = useDispatch();\n const { hasPermissions } = usePermissions();\n\n useSetPageMetadata({\n title: getPhrase('pageTitle', { classroomName: classroom.data?.name })\n });\n useHandleClassroomErrors(classroom);\n\n function onToggleGroup(student: User, group: ClassroomGroup, toggleOn: boolean): void {\n const analyticsData = {\n id: group.id,\n studentCount: 1\n };\n\n // optimistically update the UI\n let updatedGroups = [...localGroups];\n if (!toggleOn) {\n updatedGroups = updatedGroups.map(g => {\n if (g.id === group.id) {\n return {\n ...g,\n users: {\n ...g.users,\n data: g.users.data.filter(s => s.id !== student.id)\n }\n };\n }\n return g;\n });\n } else {\n updatedGroups = updatedGroups.map(g => {\n if (g.id === group.id) {\n return {\n ...g,\n users: {\n ...g.users,\n data: ArrayHelper.uniq([ ...g.users.data, student ], 'id')\n }\n };\n }\n return g;\n });\n }\n setLocalGroups(updatedGroups);\n\n // send the request\n const request = toggleOn\n ? ClassroomRequests.addStudentsToGroup([student.id], group.id, props.id, () => {\n AnalyticsHelper.logUserAction(analyticsData, {\n ...baseAnalyticsOptions,\n actionType: UserAction.Associate\n });\n })\n : ClassroomRequests.removeStudentsFromGroup([student.id], group.id, props.id, () => {\n AnalyticsHelper.logUserAction(analyticsData, {\n ...baseAnalyticsOptions,\n actionType: UserAction.Dissociate\n });\n });\n\n Flight.fetch(dispatch, request);\n }\n // optimistically update the UI on bulk add/remove\n function onBulkSelectGroup(students: User[], group: ClassroomGroup, shouldAdd: boolean): void {\n let updatedGroups = [...localGroups];\n if (!shouldAdd) {\n updatedGroups = updatedGroups.map(g => {\n if (g.id !== group.id) {\n return g;\n }\n\n return {\n ...g,\n users: {\n ...g.users,\n data: g.users.data.filter(s => !students.some(stu => stu.id === s.id))\n }\n };\n });\n } else {\n updatedGroups = updatedGroups.map(g => {\n if (g.id !== group.id) {\n return g;\n }\n return {\n ...g,\n users: {\n ...g.users,\n data: ArrayHelper.uniq([ ...g.users.data, ...students ], 'id')\n }\n };\n });\n }\n setLocalGroups(updatedGroups);\n }\n\n function onTogglePin(shouldPin: boolean, onSuccess: () => void, onError: () => void): void {\n if (isRostered)\n return;\n const request = shouldPin\n ? ClassroomRequests.pinClassroom\n : ClassroomRequests.unpinClassroom;\n\n Flight.fetch(dispatch, request(classroom.data, onSuccess, onError));\n }\n\n if (\n !classroom.data\n || !students.data?.data\n || !groups.data?.data\n || !config.data\n || !allStudents.data\n || !localGroups\n )\n return <PartialManageClassroomStudents />;\n\n return (\n <ClassroomLayout\n classroom={classroom.data}\n currentUser={currentUser.data}\n onTogglePin={onTogglePin}\n activeTab='students'\n isRostered={isRostered}\n hasShareFlowV2={hasShareFlowV2}\n >\n {(() => {\n if (isRostered)\n return (\n <>\n <RosteringAlert type='classroom'/>\n {!students.data?.data?.length ? (\n <RosteredClassroomStudentsEmptyState />\n ) : (\n <ManageClassroomStudents\n classroom={classroom.data}\n students={students.data}\n groups={localGroups}\n onToggleGroup={onToggleGroup}\n onBulkSelectGroup={onBulkSelectGroup}\n config={config.data}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n readOnly\n />\n )}\n </>\n );\n\n if (students.data?.data?.length) {\n return (\n <ManageClassroomStudents\n classroom={classroom.data}\n students={students.data}\n groups={localGroups}\n onToggleGroup={onToggleGroup}\n onBulkSelectGroup={onBulkSelectGroup}\n config={config.data}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n />\n );\n }\n\n return (\n <ManageClassroomStudentsEmptyState\n classroom={classroom.data}\n classroomIdeasText={getPhrase('classroomIdeasText')}\n schoolHasNoStudents={!allStudents.data?.data?.length}\n canManageUsers={hasPermissions(PermissionName.ManageUsers)}\n />\n );\n })()}\n\n {!!students.data?.pagination?.cursors && (\n <Pagination\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.CLASSROOM_STUDENTS,\n args: [props.id]\n }}\n cursors={students.data?.pagination?.cursors}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n prevHack\n />\n )}\n </ClassroomLayout>\n );\n}\n","import { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\ntype ClassroomExperience = 'none' | 'minimal' | 'full';\n\nexport function useClassroomExperience() {\n const { hasShareFlowV2, hasClassrooms, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded, getGatedPermission } = usePermissions();\n\n function getExperience(): ClassroomExperience {\n if (!hasClassrooms)\n return 'none';\n\n if (getGatedPermission(PermissionName.ViewClassrooms) === 'soft-gate')\n return 'minimal';\n\n if (hasPermissions(PermissionName.ViewClassrooms))\n return 'full';\n \n if (hasShareFlowV2)\n return 'minimal';\n }\n\n return {\n experience: getExperience(),\n loading: isLoadingSettings || !isLoaded\n };\n}"],"names":["getPhrase","RosteringAlert","props","text","type","className","useBulkCheckboxManager","collection","options","idField","persistNamespace","initial","initialState","Map","items","forceUpdate","prevCollection","prevNamespace","reset","current","clear","isChecked","item","toString","get","isBulkChecked","length","every","setSelected","ids","forEach","id","set","map","i","join","preselectedIds","onToggleBulk","setValue","onToggleItem","nextItemState","getSelected","Array","from","keys","bulkChecked","deselectAll","hasSomeSelections","find","getSelectedCount","size","getMap","mapColourToBsVariant","groupColour","PartialManageClassroomStudents","numItems","PartialPillTabSelector","fill","student","key","Math","random","namespace","ClassroomsNoStudentsState","value","EmptyState","src","ImageUrls","Text","phrase","canManageUsers","isRostering","LanguageService","appLink","application","action","href","target","STUDENT_ENGAGEMENT_IDEAS_LINK","ROSTERING_KB_ARTICLE_URL","RosteredClassroomStudentsEmptyState","ManageClassroomStudentsEmptyState","schoolHasNoStudents","icon","args","classroom","classroomIdeasText","ClassroomGroupPill","group","metadata","colour","title","name","ClassroomGroupExpander","count","DivButton","onClick","getNewGroupAppLink","students","params","addStudents","s","ClassroomGroupDropdown","groups","preselections","studentsAllInGroupLookup","reduce","acc","groupUserIds","Set","users","data","u","has","checkStudentsAllInGroup","selectedStudents","g","totalCheckedForGroup","Object","entries","sort","a","b","localeCompare","dropdownProps","align","alignRight","disabled","show","Dropdown","as","SvgContainer","svgName","disabledTooltips","tooltipPlacement","tooltipSpanHack","tooltipSpanHackClassName","isEmptyChecked","checkStudentsNotInGroup","isIndeterminate","isBulk","Checkbox","checked","onChange","shouldAdd","onSelectGroup","indeterminate","AppLink","AnalyticsHelper","analyticsOptions","actionType","workflowPhase","entity","defaultProps","getEditStudentAppLink","userType","UserGroup","getRemoveStudentsAppLink","studentId","classroomId","studentIds","ManageClassroomStudentItem","isComputingTruncation","setIsComputingTruncation","hasExpandedGroups","setHasExpandedGroups","groupVisibilityMapping","setGroupVisibilityMapping","groupListRef","expanderRef","selectedGroupsRef","selectedGroups","hasPermissions","usePermissions","renderAllGroups","actions","throttledResizeListener","FunctionHelper","firstGroupPill","firstElementChild","lastVisibleId","topRowHeight","getBoundingClientRect","y","nextGroupVisibilityMapping","children","child","onToggleCheckbox","readOnly","Avatar","imageCdnUrl","config","initials","UserHelper","surname","imageUrl","avatar","url","ref","groupId","classroomGroups","toggleOn","onToggleGroup","location","readOnlyTooltip","PermissionName","push","label","tooltip","userId","descriptor","actionsDropdownClassName","ManageClassroomStudents","dispatch","alerts","CheckboxHelper","selectionCount","bulkPreselections","filter","allStudentsFound","index","stu","edgeToEdge","selectedStudentIds","onBulkSelectGroup","includes","request","ClassroomRequests","studentCount","success","groupName","escapeText","error","Tooltip","spanHack","IconButton","baseAnalyticsOptions","ClassroomStudentsView","hasShareFlowV2","useSettings","currentUser","UserRequests","cursor","allStudents","UserManagerRequests","customerId","ConfigRequests","localGroups","setLocalGroups","hasCompleted","isFetching","isRostered","_integrations","rostered","analyticsData","updatedGroups","ArrayHelper","some","useSetPageMetadata","classroomName","useHandleClassroomErrors","ClassroomLayout","onTogglePin","shouldPin","onSuccess","onError","activeTab","pagination","cursors","Pagination","buttonVariant","prevHack","useClassroomExperience","hasClassrooms","isLoadingSettings","isLoaded","getGatedPermission","experience","loading"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/4578-7578bcf17a-lite.chunk.js","mappings":"i1BAYA,IACMA,EAAY,qBADA,uBAGZC,EAAQ,EAAH,WACR,SAAiB,iBACjB,SAAiB,WACjB,cAAsB,iBACtB,SAAiB,WACjB,iBAAyB,YAGtBC,EAAc,EAAH,WACd,SAAiB,QACjB,SAAiB,SACjB,cAAsB,UACtB,SAAiB,UACjB,iBAAyB,UAGtBC,EAA0B,EAAH,WAC1B,SAAiB,iBACjB,SAAiB,iBACjB,cAAsB,sBACtB,SAAiB,iBACjB,iBAAyB,yBAsFtB,SAAUC,EAAYC,G,QACpBC,EApFR,SAAkB,GAAiF,IAA/EC,EAAI,EAAJA,KAAMC,EAAa,EAAbA,cAAeC,EAAmB,EAAnBA,oBAAqBC,EAAiB,EAAjBA,kBAC5D,GAAIH,IAAS,UAAkBG,EAC7B,OAAOA,EAET,GAAIH,IAAS,eAAuBC,EAClC,OAAOA,EAET,IAAIF,EAAQN,EAAUG,EAAwBI,IAK9C,OAHIE,IACFH,GAAS,IAAMG,GAEVH,CACT,CAuEgBK,CAASN,GACvB,OACE,uBAAKO,WAAW,OAAW,kCAAmCP,EAAMO,YAClE,2BACE,gBAAC,IAAU,CACTC,QAASZ,EAAMI,EAAME,MACrBO,QAASZ,EAAYG,EAAME,MAC3BQ,YAAa,QACbC,oBAAoB,MACpBC,QAAsB,QAAb,EAAAZ,EAAMY,eAAO,QAAI,EAAAC,EAAA,YAG9B,uBAAKN,UAAU,sBACb,qBAAGA,WAAW,OAAW,MAAOP,EAAMc,gBAAiBb,MAAOA,GAAQA,IACpED,EAAMe,cAAgB,wBAAMR,UAAU,kBAAoC,QAAlB,EAAAP,EAAMgB,oBAAY,QArDpF,SAAqB,GAA8E,IAA5Ed,EAAI,EAAJA,KAAMe,EAAO,EAAPA,QAAO,IAAEC,aAAAA,OAAY,IAAG,IAAC,MAAEC,oBAAAA,OAAmB,IAAG,IAAC,EAC7E,OAAQjB,GACN,KAAK,cACH,OAjCN,SAA8BiB,EAA6BD,GACzD,OAAIC,GAAuBD,EAClB,GAAP,OAAUvB,EAAU,sBAAuB,CAAEyB,WAAYD,IAAsB,aAAKxB,EAAU,kBAAmB,CAAEyB,WAAYF,KAE7HC,EACKxB,EAAU,gBAAiB,CAAEyB,WAAYD,IAE9CD,EACKvB,EAAU,kBAAmB,CAAEyB,WAAYF,IAE7CvB,EAAU,sBACnB,CAsBa0B,CAAqBF,EAAqBD,GAEnD,KAAK,SACH,OAAOvB,EAAU,yBAEnB,KAAK,SACH,OA1BN,SAAyBsB,GACvB,MAAI,CAAE,iBAA2B,eAAyBK,SAASL,GAC1DtB,EAAU,0BAEfsB,IAAY,oCACPtB,EAAU,0BAEfsB,IAAY,iCACPtB,EAAU,0BAEfsB,IAAY,WACPtB,EAAU,0BAEfsB,IAAY,YACPtB,EAAU,8BADnB,CAEF,CAWa4B,CAAgBN,GAEzB,KAAK,SACH,OAAOtB,EAAU,yBAEnB,KAAK,iBACH,OAAOA,EAAU,4BAEnB,QACE,OAAOA,EAAU,2BAEvB,CAiCwF6B,CAAYxB,KAIpG,C,kBC7IA,IAAYyB,E,iBAAZ,SAAYA,GACV,kBACA,oBACA,wCACA,8DACA,oEACA,wBACA,8BACA,iBACD,CATD,CAAYA,IAAAA,EAAY,I,sGCoBXC,EAAkB,CAC7BC,SAAQ,SAACzB,GACP,MAAO,CAAE,QAAS,cAAe,QAASoB,SAASpB,EACrD,EAKA0B,eAAc,SAAC1B,GACb,MAAO,CAAC,eAAeoB,SAASpB,EAClC,EAEA2B,uBAAsB,SAACC,EAAiCC,GAEtD,OADqB,yBAAuCD,EAAwBC,GAChEC,OAAO,SAAAC,GAAC,OAAIA,EAAEC,OAAO,GAAEC,IAAI,SAAAF,GAAC,OAAIA,EAAEG,EAAE,EAC1D,EAEAC,8BAA6B,SAACC,EAAcC,G,gBAC1C,MAAO,CACLC,iBAAmF,QAAjE,EAAgC,QAAhC,EAAc,QAAd,EAAAF,aAAK,EAALA,EAAOG,eAAO,eAAED,wBAAgB,QAAID,aAAW,EAAXA,EAAaC,wBAAgB,SACnFE,kBAAsF,QAAnE,EAAiC,QAAjC,EAAc,QAAd,EAAAJ,aAAK,EAALA,EAAOG,eAAO,eAAEC,yBAAiB,QAAIH,aAAW,EAAXA,EAAaG,yBAAiB,SAE1F,EAEAC,wBAAuB,SAACC,GACtB,MAAO,CACLC,2BAA2C,gBAAfD,EAC5BE,0BAA0C,gBAAfF,EAE/B,EAEAG,sBAAqB,SAACT,GACpB,OAAQA,EAAMU,cACZ,KAAK,UACH,MAAO,QACT,KAAK,aACH,MAAO,WACT,KAAK,YACH,MAAO,UACT,KAAK,WACH,MAAO,SACT,KAAK,gBACH,MAAO,cACT,KAAK,SACH,MAAO,OAEb,EAKAC,uBAAwB,SAAC/C,GACvB,OAAQA,GACN,IAAK,WACH,OAAO,SAACkC,GAAU,OAAK,kBAA+B,kCAA+CA,GAAI,EAG3G,IAAK,SACH,OAAO,SAACA,GAAU,OAAK,kBAA6B,gCAA2CA,GAAI,EAIvG,OAAO,2BAA0ClC,EACnD,EAEAgD,mBAAkB,SAACN,GACjB,OAAO,uBAAsCA,EAC/C,EAEAO,oBAAmB,SAACP,GAClB,OAAO,wBAAuCA,EAChD,E,kBC3FF,IAAYQ,E,iBAAZ,SAAYA,GACV,qCACA,mCACA,cACA,oBACD,CALD,CAAYA,IAAAA,EAAa,I,wECOnBzD,EAAY,qBADA,uBAGL0D,EAAoB,CAC/BC,qBAAoB,SAACxB,EAAiCC,GACpD,MAAO,CACL,CACEK,GAAI,oBACJmB,KAAM5D,EAAU,mBAChBuC,QAASJ,EACT0B,YAAa,4BAEf,CACEpB,GAAI,mBACJmB,KAAM5D,EAAU,aAChBuC,QAASH,EACTyB,YAAa,2BAGnB,E,mFCjBI7D,EAAY,qBADA,uBAmBZ,SAAU8D,EAAazD,GAC3B,IAAM0D,EAAiB1D,EAAM0D,iBAAmB1D,EAAM2D,YAChDC,EAAiB5D,EAAM4D,iBAAmB5D,EAAM6D,YAChDC,EAA4B9D,EAAM8D,4BAA8B9D,EAAM+D,uBAE5E,OAAIL,GAAkBE,GAAkBE,EAC/B,iCAGP,gBAAC,IAAY,CAACvD,UAAU,2BACtB,6BACKP,EAAMgE,eAAiBhE,EAAMgE,eAC9BF,GACA,gBAAC,WAAmB,CAACrD,QAAQ,OAAOwD,QAASjE,EAAM+D,uBAAwBG,KAAMvE,EAAU,mBAAoBY,UAAU,mBAG7H,uBAAKA,UAAU,WACXmD,GACA,gBAAC,WAAmB,CAACjD,QAAQ,OAAOwD,QAASjE,EAAM2D,YAAaO,KAAMlE,EAAMmE,gBAAkBxE,EAAU,WAExGiE,GACA,gBAAC,IAAO,CAAC3D,MAAOD,EAAMoE,kBAAmBC,SAAUrE,EAAMoE,kBAAmBE,UAAU,MAAMC,UAAQ,GAClG,gBAAC,WAAmB,CAClB9D,QAAQ,OACRwD,QAASjE,EAAM6D,YACfK,KAAMlE,EAAMwE,gBAAkB7E,EAAU,QACxC8E,SAAUzE,EAAM0E,kBAChBC,YAAa3E,EAAM2E,gBAOjC,C,2JCtDMC,EAAY,yBAMZ,SAAUC,EAAe7E,GAG7B,MAFqB,CAAE8E,EAAA,WAAqBA,EAAA,UAAoBxD,SAAStB,EAAMsC,MAAMU,cAG5E,iCAEF,gBAAC+B,EAAA,EAAI,CAACH,UAAWA,EAAWI,OAAO,YAAYvC,QAAS,CAAErB,WAAYpB,EAAMsC,MAAM2C,WAAa,IACxG,C,oCCPM,SAAUC,EAAmBlF,GAGjC,MAFqB,CAAE8E,EAAA,WAAqBA,EAAA,UAAoBxD,SAAStB,EAAMsC,MAAMU,cAG5E,iCAgBP,wBAAMzC,UAAU,mDACd,gBAAC4E,EAAA,EAAY,CAAC3E,QAAS,YACvB,4BAhBJ,WACE,IAAM4E,EAAmBpF,EAAMsC,MAAM+C,aAAe,EACpD,GAAIrF,EAAMsC,MAAMpC,OAASoF,EAAA,OACvB,MAAO,GAAP,OAAUF,GAEZ,GAAIpF,EAAMsC,MAAMpC,OAASoF,EAAA,YAAqB,CAC5C,IAAMC,EAAkBvF,EAAMsC,MAAMkD,WAAWC,OAC/C,MAAO,GAAP,OAAUL,EAAgB,YAAIG,EAC/B,CAED,MAAO,GAAP,OAAUH,EACZ,CAKWM,IAGb,C,qCCpCA,SAAgB,cAAgB,QAAQ,eAAiB,QAAQ,YAAc,QAAQ,iBAAmB,SCuB1G,IAAM,EAAY,6BAQlB,SAASC,EAA0B3F,GACjC,OACE,uBAAKO,WAAW,OAAW,oDAAqDP,EAAM4F,MAAQ,SAC5F,sBAAIrF,UAAU,cAAa,gBAACwE,EAAA,EAAI,CAACH,UAAW,EAAWI,OAAO,UAAUvC,QAAS,CAAEoD,MAAO7F,EAAM6F,UAChG,gBAACC,EAAA,EAAU,CACTtF,QAASR,EAAM4F,KAAO,eAAyB,iBAC/C3B,QAASjE,EAAM+F,WAIvB,CAEM,SAAUC,IACd,IAAMC,EAAmB,yDAEzB,OACE,gBAAC,aAAiC,CAACC,MAAO,GACxC,gBAACC,EAAA,EAAG,CAAC5F,UAAU,kBACb,gBAAC6F,EAAA,EAAG,CAACC,GAAI,EAAG9F,UAAW0F,GACrB,gBAAClB,EAAA,EAAI,CAACC,OAAO,gBAEf,gBAACoB,EAAA,EAAG,CAACC,GAAI,EAAG9F,UAAW0F,GACrB,gBAAClB,EAAA,EAAI,CAACC,OAAO,WAEf,gBAACoB,EAAA,EAAG,CAACC,GAAI,EAAG9F,UAAW0F,GACrB,gBAAClB,EAAA,EAAI,CAACC,OAAO,cAEf,gBAACoB,EAAA,EAAG,CAACC,GAAI,EAAG9F,UAAW0F,GACrB,gBAAClB,EAAA,EAAI,CAACC,OAAO,kBAKvB,CAeA,SAASsB,EAA2BtG,G,QAC5BuG,EAAiBC,EAAA,uBAAiCxG,EAAMsC,MAAOtC,EAAMyG,YAErEC,EAAkC,QAAtB,EAAA1G,EAAM2G,wBAAgB,sBAAG3G,EAAMsC,OAEjD,OACE,gBAACsE,EAAA,EAAO,CACNC,IAAK7G,EAAMsC,MAAMwE,QACjBC,QAAS/G,EAAMgH,eAAehH,EAAMsC,OACpC2E,cAAeP,aAAS,EAATA,EAAWQ,KAC1BC,iBAAkBT,aAAS,EAATA,EAAWjE,QAC7BlC,WAAW,OAAW,8EAA+E,gBAAsBP,EAAMO,YAEjI,gBAAC4F,EAAA,EAAG,CAAC5F,UAAU,QACb,gBAAC6F,EAAA,EAAG,CAACC,GAAI,EAAG9F,UAAU,6BACpB,gBAACR,EAAA,EAAW,CACVG,KAAMF,EAAMsC,MAAMpC,KAClBe,QAASjB,EAAMsC,MAAMrB,QACrBd,cAAeoG,aAAc,EAAdA,EAAgBhD,KAC/B3C,QAASuE,EAAAtE,EAAA,MACTR,kBAAsC,QAAnB,EAAAL,EAAMsC,MAAMG,eAAO,eAAEpC,kBACxCE,WAAW,OAAW,eACtBO,gBAAgB,OAAW,gBAAiB,oBAC5CC,cAAY,KAGhB,gBAACqF,EAAA,EAAG,CAACC,GAAI,EAAG9F,UAAU,mDACpB,gBAACsE,EAAc,CAACvC,MAAOtC,EAAMsC,SAE/B,gBAAC8D,EAAA,EAAG,CAACC,GAAI,EAAG9F,UAAU,mDACpB,gBAAC2E,EAAkB,CAAC5C,MAAOtC,EAAMsC,SAEnC,gBAAC8D,EAAA,EAAG,CAACC,GAAI,EAAGe,GAAI,EAAG7G,UAAU,mDAC3B,6BAAO,QAAWP,EAAMsC,MAAM+E,eAEhC,gBAACjB,EAAA,EAAG,CAACgB,GAAI,EAAG7G,UAAU,2DACpB,wBAAMA,WAAW,OAAW,gDAAiD,mBAC3E,gBAACwE,EAAA,EAAI,CAACH,UAAW,EAAWI,OAAO,YAM/C,CAUM,SAAUsC,EAAwBtH,G,MACtC,OACE,uBAAKO,WAAW,OACd,8DAEA,gBAAC,KAAU,CACTgH,YAAU,EACVC,cAAe,EACfC,cAAoC,QAArB,EAAAzH,EAAM0H,uBAAe,QAAI,IACxCC,UAAQ,GAEP3H,EAAM4H,YAAYzF,IAAI,SAACG,EAAOuF,GAAG,OAChC,gBAACvB,EAA0B,CACzBhE,MAAOA,EACPmE,WAAYzG,EAAMyG,WAClBO,eAAgBhH,EAAMgH,eACtBL,iBAAkB,SAAArE,GAAQ,MAAC,OAAsB,QAAtB,EAAAtC,EAAM2G,wBAAgB,sBAAGrE,EAAOuF,EAAI,EAC/DtH,WAAW,OAAWsH,EAAM,GAAM,GAAK,eACvChB,IAAKvE,EAAMwE,SACX,IAKZ,CAWM,SAAUgB,EAAoB9H,GAClC,IAAKA,EAAM4H,YAAYnC,OACrB,OAAO,iCAET,IAAMsC,EAAkB/H,EAAM4F,MAAQ5F,EAAM4H,YAAYnC,OAAS,EAEjE,OACE,uBAAKlF,WAAW,OAAW,yBAA0BwH,GAAmB,SACtE,gBAACpC,EAAyB,CAACE,MAAO7F,EAAM4H,YAAYnC,OAAQM,SAAU/F,EAAM+F,SAAUH,KAAM5F,EAAM4F,OACjG5F,EAAM4F,MACL,gCACE,gBAACI,EAA6B,MAC9B,gBAACsB,EAAuB,iBAAKtH,KAKvC,C,wICxKM,SAAUgI,EAAoBvF,G,MAC5BwF,EAAc,kBAAkC,mBAChDC,EAAS,2BAAuCzF,EAAQG,WAA/C,CAA2DH,EAAQ0F,SAA0B,QAAhB,EAAAF,EAAYf,YAAI,eAAE9E,IACxGgG,EAAS,kBAA6B,cAOtC7F,EAAc,kBAClB,WAA6C2F,EAAOhB,KAAM,kBAA2BgB,EAAOhB,KAAKmB,eAC/F,gBAAgCH,EAAOhB,KAAKmB,gBAGhD,GAAyD,SAAjDC,EAAc,EAAdA,eAAgBC,EAAkB,EAAlBA,mBAAoBC,EAAQ,EAARA,SAEtCC,EAAgBH,EAAe,uBAC/BI,EAAsBJ,EAAe,sBACrCK,EAA+BJ,EAAmB,2BASxD,MAAO,CACLK,UAPEX,EAAYf,MACZgB,EAAOhB,MACPkB,EAAOlB,MACPsB,GAKFP,YAAAA,EACAC,OAAAA,EACA3F,YAAAA,EACA6F,OAAAA,EACAK,cAAAA,EACAC,oBAAAA,EACAC,6BAAAA,EAEJ,C,sWC5CM/D,EAAY,wCACZjF,EAAYkJ,EAAA,mBAAiCjE,GAQ7C,SAAUkE,EAA+B9I,GAC7C,OACE,gBAAC+I,EAAA,EAAU,CAACxI,UAAU,QACpB,gBAACwI,EAAA,QAAgB,CACfC,KAAK,QACLC,IAAKC,EAAA,gCAEP,gBAACH,EAAA,UAAkB,KAAC,gBAAChE,EAAA,EAAI,CAACC,OAAO,QAAQJ,UAAWA,KACpD,gBAACmE,EAAA,OAAe,KAAC,gBAAChE,EAAA,EAAI,CAACC,OAAO,cAAcJ,UAAWA,MACrD5E,EAAMmJ,kBAAoB,gCAC1B,gBAACJ,EAAA,MAAc,CACbK,KAAM,gBACNlF,KAAMvE,EAAU,aAChBoH,QAAS/G,EAAMqJ,gBAEjB,gBAACN,EAAA,MAAc,CACbxI,UAAU,gDACV2D,KAAMvE,EAAU,gBAChBoH,QAAS/G,EAAMsJ,oBAGlBtJ,EAAMmJ,kBACL,gBAACJ,EAAA,MAAc,CACbK,KAAM,UACNlF,KAAMvE,EAAU,YAChBoH,QAAS/G,EAAMsJ,mBAKzB,CCvCA,IAAM,EAAY,0BACZ,EAAYT,EAAA,mBAAiC,GAM7C,SAAUU,EAAiBvJ,GAC/B,OACE,gBAAC+I,EAAA,EAAU,CAACxI,UAAU,QACpB,gBAACwI,EAAA,QAAgB,CACfC,KAAK,QACLC,IAAKC,EAAA,gCAEP,gBAACH,EAAA,UAAkB,KAAC,gBAAChE,EAAA,EAAI,CAACC,OAAO,QAAQJ,UAAW,KACpD,gBAACmE,EAAA,OAAe,KAAC,gBAAChE,EAAA,EAAI,CAACC,OAAO,cAAcJ,UAAW,KACvD,gBAACmE,EAAA,MAAc,CACbK,KAAM,UACNlF,KAAM,EAAU,OAChB6C,QAAS/G,EAAM+G,UAIvB,CCGA,IAAM,EAAY,6BACZ,EAAY8B,EAAA,mBAAiC,GAE7CW,EAAoB,IAE1B,SAASC,EAAkBC,EAAUC,GACnC,GAAKD,GAAMC,EAGX,OAAIC,EAAA,SAAkBF,EAAErC,YAAasC,EAAEtC,aAC9B,EAELuC,EAAA,UAAmBF,EAAErC,YAAasC,EAAEtC,aAC/B,GAED,CACV,CAMA,SAASwC,EAA4B7J,GACnC,OACE,qBAAG8J,KAAM9J,EAAM8J,KAAMC,OAAO,SAASxJ,UAAU,0BAC7C,wBAAMA,UAAU,QAAO,gBAACwE,EAAA,EAAI,CAACC,OAAO,wBAAwBJ,UAAW,KACvE,gBAACO,EAAA,EAAY,CAAC3E,QAAS,eAAwBwI,KAAM7D,EAAAtE,EAAA,QAG3D,CASA,SAASmJ,EAA0BhK,GACjC,MAAmB,sBAAfA,EAAME,KAEN,gBAAC4I,EAA8B,CAC7BO,cAAerJ,EAAMqJ,cACrBC,iBAAkBtJ,EAAMiK,aACxBd,iBAAkBnJ,EAAMmJ,mBAKvB,gBAACI,EAAgB,CAACxC,QAAS/G,EAAMiK,cAC1C,CAOM,SAAUC,EAAoBlK,G,UAC5BmK,GAAa,EAAAnC,EAAA,GAAoB,CACrCG,SAAUnI,EAAMmI,SAChBvF,WAAY5C,EAAM4C,aAGZ0F,GAAmB,EAAA8B,EAAA,KAAnB9B,eACA+B,GAAmB,EAAAC,EAAA,GAAY,MAA/BD,eACFE,GAAa,EAAAC,EAAA,KAEbC,EAAiB,kBAA8BC,EAAA,sBAAkC1K,EAAMmI,WACvFP,GAAiC,QAAnB,EAAA6C,EAAevD,YAAI,eAAEyD,KAAKlB,KAAsB,GAC9DmB,EAAiCC,EAAA,OACrCjD,EAAYzF,IAAIqE,EAAA,2BAAqCxE,OAAO,SAAA8I,GAAC,QAAMA,CAAC,IAEhErE,EAAa,kBACjBgE,EAAeM,cACbC,EAAA,qBAAqCJ,EAA2D,QAA3B,EAAAT,EAAWlC,YAAYf,YAAI,eAAE+D,aAWhGC,EAAeC,EAAA,eACG,QAAtB,EAAAhB,EAAW/B,OAAOlB,YAAI,eAAEkE,gBACxBjB,EAAWjC,OAAOhB,KAClBmD,GAGIgB,EACJ/C,EAAegD,EAAA,yBACfhD,EAAegD,EAAA,yBAEXC,EAAkBlB,GAAkBE,EAAc,SAAW,oBAE7D3B,EAASuB,EAAWvB,UAAY6B,EAAevD,QAAUT,EAAWS,KAE1E,OACE,gBAACsE,EAAA,EAAK,CACJxC,KAAK,KACL/I,MAAO,EAAU,SACjBwL,oBAAqB7C,EACrB8C,WAAY1L,EAAM0L,aAEhB9D,EAAYnC,QACZ,gBAACuE,EAAyB,CACxBX,cAAesC,EAAA,eAAiC,CAAE/I,WAAY5C,EAAM4C,WAAYuF,SAAUnI,EAAMmI,WAChG8B,aAAc,CACZ2B,YAAa,UACbC,OAAQ,gBACRC,KAAM,CAAC9L,EAAMmI,UACb4D,OAAQ,CACNnJ,WAAY5C,EAAM4C,aAGtB1C,KAAMqL,EACNpC,iBAAkB6C,EAAA,iCAA4C7B,EAAWlC,YAAYf,UAItFU,EAAYnC,QACb,gCACE,gBAACqC,EAAA,GAA6B,MAC9B,gBAACA,EAAA,GAAuB,CACtBF,YAAaA,EAAYqE,UACzBxF,WAAYA,EAAWS,KACvBF,eAnDV,SAAwB1E,GACtB,IAAMyE,GAAU,QAA2BzE,GAC3C,GAAKyE,EAGL,OAAOA,CACT,EA8CUW,gBAAiB8B,KAIvB,gBAAC/F,EAAA,EAAY,CACXG,gBAAc,EACdE,2BAAyB,EACzBH,YAAa3D,EAAM0L,WACnBvH,eAAgB,EAAU,SAC1BH,gBAAiBkH,GAAgBG,GAA0B,gBAACxB,EAA2B,CAACC,KAAMoB,MAItG,C,oCCnLA,IAAIgB,EAAQ,CAAC,SAAU,SAAU,OAAQ,MAAO,OAAQ,QAAS,QCA7DC,EAAQ,CAAC,IAAK,KAAM,KAAM,IAAK,IAAK,KAAM,KCO1CC,EAAU,CAAC,EAMJC,EAAW,SAAUC,EAAQC,GACpCH,EAAQE,GAAUC,CACtB,ECXIC,EAAY,CACZ,GACA,GACA,GACA,EACA,IAAM,EAAI,GACV,IAOG,SAASC,EAAOC,GACnB,OAAIA,aAAiBC,KACVD,GAENE,MAAMF,IAAU,QAAQG,KAAKH,GACvB,IAAIC,KAAKG,SAASJ,KAC7BA,GAASA,GAAS,IAEbK,OACAC,QAAQ,QAAS,IACjBA,QAAQ,IAAK,KACbA,QAAQ,IAAK,KACbA,QAAQ,YAAa,SACrBA,QAAQ,IAAK,QACbA,QAAQ,qBAAsB,SAC5B,IAAIL,KAAKD,GACpB,CCzBO,IAAIO,EAAS,SAAUC,EAAMZ,EAAQa,GAExC,IAAIC,EDgFD,SAAiBF,EAAMG,GAE1B,SADcA,EAAeZ,EAAOY,GAAgB,IAAIV,OACpCF,EAAOS,IAAS,GACxC,CCnFc,CAAQA,EAAMC,GAAQA,EAAKE,cAErC,OD4BG,SAAoBC,EAAMC,GAyB7B,IAhBA,IAAIC,EAAQF,EAAO,EAAI,EAAI,EAWvBG,EAJJH,EAAOI,KAAKC,IAAIL,GAQZzF,EAAM,EACHyF,GAAQd,EAAU3E,IAAQA,EAAM2E,EAAU/G,OAAQoC,IACrDyF,GAAQd,EAAU3E,GAgBtB,OAJAyF,EAAOI,KAAKE,MAAMN,KAEE,IADpBzF,GAAO,GACiB,EAAI,KACxBA,GAAO,GACJ0F,EAAWD,EAAMzF,EAAK4F,GAAUD,GAAOR,QAAQ,KAAMM,EAAKO,WACrE,CCvEW,CAAWT,EFSC,SAAUd,GAC7B,OAAOF,EAAQE,IAAWF,EAAe,KAC7C,CEX2B,CAAUE,GACrC,ECNAD,EAAS,QLNM,SAAUiB,EAAMzF,GAC3B,GAAY,IAARA,EACA,MAAO,CAAC,WAAY,aACxB,IAAIiG,EAAO5B,EAAMwB,KAAKE,MAAM/F,EAAM,IAGlC,OAFIyF,EAAO,IACPQ,GAAQ,KACL,CAACR,EAAO,IAAMQ,EAAO,OAAQ,MAAQR,EAAO,IAAMQ,EAC7D,GKAAzB,EAAS,QJPM,SAAUiB,EAAMzF,GAC3B,GAAY,IAARA,EACA,MAAO,CAAC,KAAM,OAClB,IAAIiG,EAAO3B,KAAStE,EAAM,IAC1B,MAAO,CAACyF,EAAO,IAAMQ,EAAO,IAAUR,EAAO,IAAMQ,EAAO,IAC9D,E","sources":["file:///app/packages/libs/shared/src/apps/share-v2/components/share-avatar/ShareAvatar.tsx","file:///app/packages/libs/shared/src/apps/share-v2/enums/SharePrivacy.ts","file:///app/packages/libs/shared/src/apps/share-v2/utils/ShareViewHelper.tsx","file:///app/packages/libs/shared/src/enums/IntegrationId.ts","file:///app/packages/libs/shared/src/utils/IntegrationHelper.ts","file:///app/packages/projects/lite/src/apps/assign/components/flow-controls/FlowControls.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-view-count/ShareViewCount.tsx","file:///app/packages/libs/shared/src/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount.tsx","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/previous-assignments.scss","file:///app/packages/projects/lite/src/apps/assign/components/previous-assignments/PreviousAssignments.tsx","file:///app/packages/projects/lite/src/apps/assign/hooks/useAssignSharedData.ts","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/empty-states/shares-and-assignments-empty-state/SharesAndAssignmentsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/empty-states/shares-empty-state/SharesEmptyState.tsx","file:///app/packages/projects/lite/src/apps/assign/views/show-assignments-view/ShowAssignmentsView.tsx","file:///app/node_modules/timeago.js/esm/lang/en_US.js","file:///app/node_modules/timeago.js/esm/lang/zh_CN.js","file:///app/node_modules/timeago.js/esm/register.js","file:///app/node_modules/timeago.js/esm/utils/date.js","file:///app/node_modules/timeago.js/esm/format.js","file:///app/node_modules/timeago.js/esm/index.js"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SharePrivacy } from '../../enums/SharePrivacy';\nimport { ShareType } from '../../enums/ShareType';\n\nconst namespace = 'sharev2.shareAvatar';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst icons = {\n [ShareType.Open]: cvSvgLibrary.Classrooms,\n [ShareType.Link]: cvSvgLibrary.Link,\n [ShareType.Classroom]: cvSvgLibrary.Classrooms,\n [ShareType.Live]: cvSvgLibrary.Play,\n [ShareType.LegacyDirect]: cvSvgLibrary.Share\n};\n\nconst iconColours = {\n [ShareType.Open]: 'blue',\n [ShareType.Link]: 'black',\n [ShareType.Classroom]: 'purple',\n [ShareType.Live]: 'purple',\n [ShareType.LegacyDirect]: 'indigo'\n};\n\nconst shareTypeTitlePhraseMap = {\n [ShareType.Open]: 'openShareType',\n [ShareType.Link]: 'linkShareType',\n [ShareType.Classroom]: 'classroomShareType',\n [ShareType.Live]: 'liveShareType',\n [ShareType.LegacyDirect]: 'legacyDirectShareType'\n};\n\nfunction getTitle({ type, classroomName, additionalTitleText, openClassroomName }: ShareAvatarProps) {\n if (type === ShareType.Open && openClassroomName)\n return openClassroomName;\n \n if (type === ShareType.Classroom && classroomName)\n return classroomName;\n\n let title = getPhrase(shareTypeTitlePhraseMap[type]);\n\n if (additionalTitleText)\n title += ' ' + additionalTitleText;\n\n return title;\n}\n\nfunction getClassroomSubtitle(classroomGroupCount: number, studentCount: number): string {\n if (classroomGroupCount && studentCount)\n return `${getPhrase('classroomGroupCount', { smartCount: classroomGroupCount })}, ${getPhrase('studentSubTitle', { smartCount: studentCount })}`;\n\n if (classroomGroupCount)\n return getPhrase('groupSubTitle', { smartCount: classroomGroupCount });\n\n if (studentCount)\n return getPhrase('studentSubTitle', { smartCount: studentCount });\n\n return getPhrase('allStudentsSubTitle');\n}\n\nfunction getLinkSubtitle(privacy: SharePrivacy) {\n if ([ SharePrivacy.JustMySchool, SharePrivacy.Protected ].includes(privacy))\n return getPhrase('respectRatingsSubTitle');\n\n if (privacy === SharePrivacy.JustMySchoolOverrideRestriction)\n return getPhrase('anyoneInSchoolSubTitle');\n\n if (privacy === SharePrivacy.ProtectedOverrideRestriction)\n return getPhrase('anyoneSignedInSubTitle');\n\n if (privacy === SharePrivacy.Public)\n return getPhrase('anyoneWithLinkSubTitle');\n\n if (privacy === SharePrivacy.PinCode)\n return getPhrase('anyoneWithPinSubTitle');\n}\n\nfunction getSubtitle({ type, privacy, studentCount = 0, classroomGroupCount = 0 }: ShareAvatarProps) {\n switch (type) {\n case ShareType.Classroom:\n return getClassroomSubtitle(classroomGroupCount, studentCount);\n\n case ShareType.Open:\n return getPhrase('openShareTypeSubTitle');\n\n case ShareType.Link:\n return getLinkSubtitle(privacy);\n \n case ShareType.Live:\n return getPhrase('liveShareTypeSubTitle');\n\n case ShareType.LegacyDirect:\n return getPhrase('legacyDirectTypeSubTitle');\n\n default:\n return getPhrase('publicShareTypeSubTitle');\n }\n}\n\ninterface ShareAvatarProps {\n type: ShareType;\n privacy: SharePrivacy;\n studentCount?: number;\n classroomGroupCount?: number;\n classroomName?: string;\n openClassroomName?: string;\n hideSubtitle?: boolean;\n subtitleText?: string;\n svgSize?: SvgContainerSize;\n additionalTitleText?: string;\n className?: string;\n titleClassName?: string;\n showIconCircle?: boolean;\n}\n\nexport function ShareAvatar(props: ShareAvatarProps): JSX.Element {\n const title = getTitle(props);\n return (\n <div className={classNames('d-flex align-items-center gap-2', props.className)}>\n <div>\n <IconCircle\n svgName={icons[props.type]}\n variant={iconColours[props.type]}\n textVariant={'white'}\n svgWrapperClassName='p-1'\n svgSize={props.svgSize ?? SvgContainerSize.Standard}\n />\n </div>\n <div className='d-flex flex-column'>\n <p className={classNames('m-0', props.titleClassName)} title={title}>{title}</p>\n {!props.hideSubtitle && <span className='text-secondary'>{props.subtitleText ?? getSubtitle(props)}</span>}\n </div>\n </div>\n );\n}","export enum SharePrivacy {\n Public = 'Public',\n PinCode = 'PinCode',\n PasswordProtected = 'PasswordProtected',\n ProtectedOverrideRestriction = 'ProtectedOverrideRestriction',\n JustMySchoolOverrideRestriction = 'JustMySchoolOverrideRestriction',\n Protected = 'Protected',\n JustMySchool = 'JustMySchool',\n Direct = 'Direct'\n}","import { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsOptions, EntityType } from 'libs/analytics/interfaces';\n\nimport { ShareViewHelper as OldShareViewHelper } from 'libs/shared/apps/share/views/share/ShareViewHelper';\nimport type { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PlaylistRequests } from 'libs/shared/flight-requests/PlaylistRequests';\nimport { SeriesRequests } from 'libs/shared/flight-requests/SeriesRequests';\nimport type { Clip, Interactive, InteractiveMetadata, Playlist, Series, Subject, Video } from 'libs/shared/interfaces';\nimport { IntegrationHelper } from 'libs/shared/utils/IntegrationHelper';\n\nexport type SharableEntityType = 'video' | 'playlist' | 'subject' | 'series' | 'interactive' | 'clip';\nexport type SharableEntity = Video | Playlist | Subject | Series | InteractiveMetadata | Clip;\nexport interface ShareSettingsFormFields {\n preventScrubbing: boolean;\n immediateFeedback: boolean;\n}\n\nexport const ShareViewHelper = {\n canEmbed(type: SharableEntityType): boolean {\n return [ 'video', 'interactive', 'clip' ].includes(type);\n },\n\n /**\n * Only interactive entities can update share settings currently\n */\n canAddPolicies(type: SharableEntityType): boolean {\n return ['interactive'].includes(type);\n },\n\n getEnabledIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): IntegrationId[] {\n const integrations = IntegrationHelper.getShareIntegrations(googleClassroomSetting, msftTeamsSetting);\n return integrations.filter(i => i.enabled).map(i => i.id);\n },\n\n getShareSettingsInitialValues(share: Share, interactive: Interactive | null) {\n return {\n preventScrubbing: share?.options?.preventScrubbing ?? interactive?.preventScrubbing ?? false,\n immediateFeedback: share?.options?.immediateFeedback ?? interactive?.immediateFeedback ?? false\n };\n },\n \n getEnabledSettingsField(entityType: SharableEntityType): {[key in `show${Capitalize<keyof ShareSettingsFormFields>}Field`]: boolean} {\n return {\n showImmediateFeedbackField: entityType === 'interactive',\n showPreventScrubbingField: entityType === 'interactive'\n };\n },\n\n getSharableEntityType(share: Share): SharableEntityType {\n switch (share.objectTypeId) {\n case MasterType.Video:\n return 'video';\n case MasterType.Playlist:\n return 'playlist';\n case MasterType.Subject:\n return 'subject';\n case MasterType.Series:\n return 'series';\n case MasterType.Interactive:\n return 'interactive';\n case MasterType.Clip:\n return 'clip';\n }\n },\n\n /**\n * Methods from old ShareViewHelper imported here for namespacing\n */\n getFetchFunctionByType: (type: SharableEntityType) => {\n switch (type) {\n case 'playlist': {\n return (id: string) => Flight.useBasicFetch<Playlist>(PlaylistRequests.playlistWithThumbnailAndCount(id));\n }\n\n case 'series': {\n return (id: string) => Flight.useBasicFetch<Series>(SeriesRequests.seriesWithThumbnailAndCount(id));\n }\n }\n \n return OldShareViewHelper.getFetchFunctionByType(type);\n },\n\n getAnalyticsEntity(entityType: string): EntityType {\n return OldShareViewHelper.getAnalyticsEntity(entityType);\n },\n\n getAnalyticsOptions(entityType: SharableEntityType): AnalyticsOptions {\n return OldShareViewHelper.getAnalyticsOptions(entityType);\n }\n};","export enum IntegrationId {\n GoogleClassroom = 'google-classroom',\n MicrosoftTeams = 'microsoft-teams',\n Vivi = 'vivi',\n AppleTv = 'apply-tv'\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { IntegrationId } from 'libs/shared/enums/IntegrationId';\nimport { SettingName } from 'libs/shared/enums/SettingName';\nimport { Integration } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.shared-utils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const IntegrationHelper = {\n getShareIntegrations(googleClassroomSetting: boolean, msftTeamsSetting: boolean): Integration[] {\n return [\n {\n id: IntegrationId.GoogleClassroom,\n name: getPhrase('googleClassroom'),\n enabled: googleClassroomSetting,\n settingName: SettingName.ShareToGoogleClassroom\n },\n {\n id: IntegrationId.MicrosoftTeams,\n name: getPhrase('msftTeams'),\n enabled: msftTeamsSetting,\n settingName: SettingName.ShareToMicrosoftTeams\n }\n ];\n }\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nconst namespace = 'assign.flowControls';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface FlowControlsProps {\n showSpinner?: boolean;\n hideNextButton?: boolean;\n hideBackButton?: boolean;\n disableNextButton?: boolean;\n disableBackButton?: boolean;\n backButtonText?: string;\n hideCreateClassroomButton?: boolean;\n nextButtonText?: string;\n nextButtonTooltip?: string;\n onClickNext?: () => void;\n onClickBack?: () => void;\n onClickCreateClassroom?: () => void;\n leftComponent?: JSX.Element;\n}\n\nexport function FlowControls(props: FlowControlsProps): JSX.Element {\n const hideBackButton = props.hideBackButton || !props.onClickBack;\n const hideNextButton = props.hideNextButton || !props.onClickNext;\n const hideCreateClassroomButton = props.hideCreateClassroomButton || !props.onClickCreateClassroom;\n \n if (hideBackButton && hideNextButton && hideCreateClassroomButton)\n return <></>;\n \n return (\n <PopupButtons className='justify-content-between'>\n <div>\n {!!props.leftComponent && props.leftComponent}\n {!hideCreateClassroomButton && (\n <PopupButtons.Submit variant='link' onClick={props.onClickCreateClassroom} text={getPhrase('createClassroom')} className='text-info p-0' />\n )}\n </div>\n <div className='d-flex'>\n {!hideBackButton && (\n <PopupButtons.Cancel variant='link' onClick={props.onClickBack} text={props.backButtonText || getPhrase('back')} />\n )}\n {!hideNextButton && (\n <Tooltip title={props.nextButtonTooltip} disable={!props.nextButtonTooltip} placement='top' spanHack>\n <PopupButtons.Submit\n variant='dark'\n onClick={props.onClickNext}\n text={props.nextButtonText || getPhrase('next')}\n disabled={props.disableNextButton}\n showSpinner={props.showSpinner}\n />\n </Tooltip>\n )}\n </div>\n </PopupButtons>\n );\n}","import React from 'react';\n\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { MasterType } from 'libs/shared/enums/MasterType';\n\nconst namespace = 'sharev2.shareViewCount';\n\ninterface ShareViewCountProps {\n share: Share;\n}\n\nexport function ShareViewCount(props: ShareViewCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n \n if (isCollection)\n return <span>-</span>;\n\n return <Text namespace={namespace} phrase='viewCount' options={{ smartCount: props.share.viewCount || 0 }} />;\n}","import React from 'react';\n\nimport { ShareType } from 'libs/shared/apps/share-v2/enums/ShareType';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\ninterface ShareViewedByCountProps {\n share: Share;\n}\n\nexport function ShareViewedByCount(props: ShareViewedByCountProps): JSX.Element {\n const isCollection = [ MasterType.Playlist, MasterType.Series ].includes(props.share.objectTypeId);\n\n if (isCollection)\n return <span>-</span>;\n \n function getViewCount(): string {\n const shareAccessCount = props.share.accessCount || 0;\n if (props.share.type === ShareType.Open)\n return `${shareAccessCount}`;\n\n if (props.share.type === ShareType.Classroom) {\n const totalRecipients = props.share.recipients.length;\n return `${shareAccessCount}/${totalRecipients}`;\n }\n\n return `${shareAccessCount}`;\n }\n \n return (\n <span className='d-inline-flex flex-row gap-2 align-items-center'>\n <SvgContainer svgName={cvSvgLibrary.User} />\n <span>{getViewCount()}</span>\n </span>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"shareListItem\":\"vLROV\",\"visibleOnHover\":\"o2KJH\",\"shareAvatar\":\"zDcMp\",\"shareAvatarTitle\":\"U8yMQ\"};","import React from 'react';\nimport { Col, Row } from 'react-bootstrap';\nimport Scrollbars from 'react-custom-scrollbars-2';\nimport { format as formatDate } from 'timeago.js';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnalyticsOptions, HashObject } from 'libs/analytics/interfaces';\n\nimport { ShareAvatar } from 'libs/shared/apps/share-v2/components/share-avatar/ShareAvatar';\nimport { ShareViewCount } from 'libs/shared/apps/share-v2/components/share-view-count/ShareViewCount';\nimport { ShareViewedByCount } from 'libs/shared/apps/share-v2/components/share-viewed-by-count/ShareViewedByCount';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './previous-assignments.scss';\n\nconst namespace = 'assign.previousAssignments';\n\ninterface PreviousAssignmentsHeaderProps {\n count: number;\n show: boolean;\n onToggle: () => void;\n}\n\nfunction PreviousAssignmentsHeader(props: PreviousAssignmentsHeaderProps): JSX.Element {\n return (\n <div className={classNames('d-flex align-items-center justify-content-between', props.show && 'mb-3')}>\n <h3 className='h6 m-0 p-0'><Text namespace={namespace} phrase='heading' options={{ count: props.count }} /></h3>\n <IconButton\n svgName={props.show ? cvSvgLibrary.ChevronUp : cvSvgLibrary.ChevronDown}\n onClick={props.onToggle}\n />\n </div>\n );\n}\n\nexport function PreviousAssignmentsListHeader(): JSX.Element {\n const columnClassNames = 'd-flex align-items-end justify-content-start fw-medium';\n \n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Row className='gx-2 px-3 mb-2'>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='assignedTo' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='views' />\n </Col>\n <Col xs={2} className={columnClassNames}>\n <Text phrase='viewedBy' />\n </Col>\n <Col xs={4} className={columnClassNames}>\n <Text phrase='dateCreated' />\n </Col>\n </Row>\n </LanguageNamespaceContext.Provider>\n );\n}\n\ntype ItemAnalytics = {\n data: HashObject;\n options: AnalyticsOptions;\n}\ninterface PreviousAssignmentListItemProps {\n share: Share;\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n\n getItemAnalytics?: (share: Share) => ItemAnalytics;\n className?: string;\n}\n\nfunction PreviousAssignmentListItem(props: PreviousAssignmentListItemProps): JSX.Element {\n const shareClassroom = ShareHelper.getClassroomForShare(props.share, props.classrooms);\n\n const analytics = props.getItemAnalytics?.(props.share);\n\n return (\n <AppLink\n key={props.share.shareId}\n appLink={props.getItemAppLink(props.share)}\n analyticsData={analytics?.data}\n analyticsOptions={analytics?.options}\n className={classNames('d-block p-3 hover-bg-light-blue border border-top-0 no-hover-text-underline', styles.shareListItem, props.className)}\n >\n <Row className='gx-2'>\n <Col xs={4} className='d-flex align-items-center'>\n <ShareAvatar\n type={props.share.type}\n privacy={props.share.privacy}\n classroomName={shareClassroom?.name}\n svgSize={SvgContainerSize.Small}\n openClassroomName={props.share.options?.openClassroomName}\n className={classNames(styles.shareAvatar)}\n titleClassName={classNames('text-truncate', styles.shareAvatarTitle)}\n hideSubtitle\n />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewCount share={props.share} />\n </Col>\n <Col xs={2} className='d-flex align-items-center justify-content-start'>\n <ShareViewedByCount share={props.share} />\n </Col>\n <Col xs={4} lg={3} className='d-flex align-items-center justify-content-start'>\n <span>{formatDate(props.share.dateCreated)}</span>\n </Col>\n <Col lg={1} className='align-items-center justify-content-end d-none d-lg-flex'>\n <span className={classNames('cursor-pointer text-info hover-text-underline', styles.visibleOnHover)}>\n <Text namespace={namespace} phrase='view' />\n </span>\n </Col>\n </Row>\n </AppLink>\n );\n}\n\ninterface PreviousAssignmentsListProps {\n assignments: Share[];\n classrooms: Classroom[];\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n scrollHeightMax?: number;\n}\n\nexport function PreviousAssignmentsList(props: PreviousAssignmentsListProps): JSX.Element {\n return (\n <div className={classNames(\n 'd-flex flex-column border-top rounded-top overflow-hidden'\n )}>\n <Scrollbars\n autoHeight\n autoHeightMin={0}\n autoHeightMax={props.scrollHeightMax ?? 215}\n autoHide\n >\n {props.assignments.map((share, idx) => (\n <PreviousAssignmentListItem\n share={share}\n classrooms={props.classrooms}\n getItemAppLink={props.getItemAppLink}\n getItemAnalytics={share => props.getItemAnalytics?.(share, idx)}\n className={classNames(idx % 2 === 0 && 'bg-gray-100')}\n key={share.shareId}\n />\n ))}\n </Scrollbars>\n </div>\n );\n}\n\ninterface PreviousAssignmentsProps {\n show: boolean;\n assignments: Share[];\n classrooms: Classroom[];\n onToggle: () => void;\n getItemAppLink: (share: Share) => Core.AppLink;\n getItemAnalytics?: (share: Share, yIndex: number) => ItemAnalytics;\n}\n\nexport function PreviousAssignments(props: PreviousAssignmentsProps): JSX.Element {\n if (!props.assignments.length)\n return <></>;\n \n const noBottomPadding = props.show && props.assignments.length > 3;\n \n return (\n <div className={classNames('bg-white rounded-3 p-3', noBottomPadding && 'pb-0')}>\n <PreviousAssignmentsHeader count={props.assignments.length} onToggle={props.onToggle} show={props.show} />\n {props.show && (\n <>\n <PreviousAssignmentsListHeader />\n <PreviousAssignmentsList {...props} />\n </>\n )}\n </div>\n );\n}","import { Flight } from 'libs/common/react/index';\n\nimport { SharableEntityType, ShareViewHelper } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { Config, CurrentUser, Interactive, InteractiveMetadata } from 'libs/shared/interfaces';\nimport { MasterTypeHelper } from 'libs/shared/utils/MasterTypeHelper';\n\nexport interface UseAssignSharedDataOptions {\n objectId: string;\n entityType: SharableEntityType;\n}\n\nexport function useAssignSharedData(options: UseAssignSharedDataOptions) {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const entity = ShareViewHelper.getFetchFunctionByType(options.entityType)(options.objectId, currentUser.data?.id);\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n /**\n * Fetch interactive videos options to set them as defaults\n * if the interactive share data does not have any options set.\n * We only fetch this if its an interactive share entity\n */\n const interactive = Flight.useBasicFetch<Interactive>(\n MasterTypeHelper.isType<InteractiveMetadata>(entity.data, MasterType.Interactive) && entity.data.interactiveId &&\n InteractiveRequests.interactive(entity.data.interactiveId)\n );\n\n const { hasPermissions, getGatedPermission, isLoaded } = usePermissions();\n\n const hasStudentExp = hasPermissions(PermissionName.StudentExperience);\n const canCreateClassrooms = hasPermissions(PermissionName.CreateClassrooms);\n const openClassroomGatedPermission = getGatedPermission(PermissionName.ShareToOpenClassrooms);\n \n const dataLoaded = (\n !!currentUser.data &&\n !!entity.data &&\n !!config.data &&\n !!isLoaded\n );\n \n return {\n loaded: dataLoaded,\n currentUser,\n entity,\n interactive,\n config,\n hasStudentExp,\n canCreateClassrooms,\n openClassroomGatedPermission\n };\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'assign.sharesAndAssignmentsEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SharesAndAssignmentsEmptyStateProps {\n assignAppLink: Core.AppLink;\n shareLinkAppLink: Core.AppLink;\n hideAssignButton?: boolean;\n}\n\nexport function SharesAndAssignmentsEmptyState(props: SharesAndAssignmentsEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='py-4'>\n <EmptyState.Image\n size='small'\n src={ImageUrls.EmptyStates.Share.MY_SHARES}\n />\n <EmptyState.Heading><Text phrase='title' namespace={namespace} /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='description' namespace={namespace} /></EmptyState.Info>\n {!props.hideAssignButton && <>\n <EmptyState.Cta\n icon={cvSvgLibrary.Classrooms}\n text={getPhrase('ctaAssign')}\n appLink={props.assignAppLink}\n />\n <EmptyState.Cta\n className='text-dark hover-text-underline mt-3 fw-medium'\n text={getPhrase('ctaShareLink')}\n appLink={props.shareLinkAppLink}\n />\n </>}\n {props.hideAssignButton &&\n <EmptyState.Cta\n icon={cvSvgLibrary.Link}\n text={getPhrase('ctaShare')}\n appLink={props.shareLinkAppLink}\n />\n }\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'assign.sharesEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SharesEmptyStateProps {\n appLink: Core.AppLink;\n}\n\nexport function SharesEmptyState(props: SharesEmptyStateProps): JSX.Element {\n return (\n <EmptyState className='py-4'>\n <EmptyState.Image\n size='small'\n src={ImageUrls.EmptyStates.Share.MY_SHARES}\n />\n <EmptyState.Heading><Text phrase='title' namespace={namespace} /></EmptyState.Heading>\n <EmptyState.Info><Text phrase='description' namespace={namespace} /></EmptyState.Info>\n <EmptyState.Cta\n icon={cvSvgLibrary.Link}\n text={getPhrase('cta')}\n appLink={props.appLink}\n />\n </EmptyState>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ShareRequests } from 'libs/shared/apps/share-v2/flight-requests/ShareRequests';\nimport { Share } from 'libs/shared/apps/share-v2/interfaces/Share';\nimport { ShareHelper } from 'libs/shared/apps/share-v2/utils/ShareHelper';\nimport { SharableEntityType } from 'libs/shared/apps/share-v2/utils/ShareViewHelper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, PopupViewProps } from 'libs/shared/interfaces';\nimport { AnalyticsRouteHelper } from 'libs/shared/utils/AnalyticsRouteHelper';\nimport { AssignHelper } from 'libs/shared/utils/AssignHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { getInsightsOverviewAppLink } from 'shared/utils/ObjectAppLinkHelper';\n\nimport { FlowControls } from 'apps/assign/components/flow-controls/FlowControls';\nimport { PreviousAssignmentsList, PreviousAssignmentsListHeader } from 'apps/assign/components/previous-assignments/PreviousAssignments';\nimport { useAssignSharedData } from 'apps/assign/hooks/useAssignSharedData';\nimport { AssignAppLinkHelper } from 'apps/assign/utils/AssignAppLinkHelper';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { useIsTertiary } from 'apps/onboarding/hooks/useIsTertiary';\n\nimport { SharesAndAssignmentsEmptyState } from './empty-states/shares-and-assignments-empty-state/SharesAndAssignmentsEmptyState';\nimport { SharesEmptyState } from './empty-states/shares-empty-state/SharesEmptyState';\n\nconst namespace = 'assign.showAssignmentsView';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nconst MAX_SCROLL_HEIGHT = 400;\n\nfunction sortByDateCreated(a: Share, b: Share) {\n if (!a || !b)\n return;\n\n if (DateHelper.isSame(a.dateCreated, b.dateCreated))\n return 0;\n\n if (DateHelper.isAfter(a.dateCreated, b.dateCreated))\n return 1;\n\n return -1;\n}\n\ninterface ViewInSchoolAnalyticsButtonProps {\n href: string;\n}\n\nfunction ViewInSchoolAnalyticsButton(props: ViewInSchoolAnalyticsButtonProps): JSX.Element {\n return (\n <a href={props.href} target='_blank' className='btn btn-link text-info'>\n <span className='pe-1'><Text phrase='openInSchoolAnalytics' namespace={namespace} /></span>\n <SvgContainer svgName={cvSvgLibrary.NewWindow} size={SvgContainerSize.Small} />\n </a>\n );\n}\n\ninterface ShowAssignmentsEmptyStateProps {\n type: 'assign-and-shares' | 'shares';\n assignAppLink: Core.AppLink;\n shareAppLink: Core.AppLink;\n hideAssignButton?: boolean;\n}\n\nfunction ShowAssignmentsEmptyState(props: ShowAssignmentsEmptyStateProps): JSX.Element {\n if (props.type === 'assign-and-shares') {\n return (\n <SharesAndAssignmentsEmptyState\n assignAppLink={props.assignAppLink}\n shareLinkAppLink={props.shareAppLink}\n hideAssignButton={props.hideAssignButton}\n />\n );\n }\n \n return <SharesEmptyState appLink={props.shareAppLink} />;\n}\n\ninterface ShowAssignmentsViewProps extends PopupViewProps {\n objectId: string;\n entityType: SharableEntityType;\n}\n\nexport function ShowAssignmentsView(props: ShowAssignmentsViewProps): JSX.Element {\n const sharedData = useAssignSharedData({\n objectId: props.objectId,\n entityType: props.entityType\n });\n\n const { hasPermissions } = usePermissions();\n const { hasShareFlowV2 } = useSettings(null);\n const isTertiary = useIsTertiary();\n\n const previousShares = Flight.useBasicFetch<Share[]>(ShareRequests.getSharesByObjectId(props.objectId));\n const assignments = previousShares.data?.sort(sortByDateCreated) || [];\n const previousAssignmentClassroomIds = ArrayHelper.uniq(\n assignments.map(ShareHelper.getClassroomIdFromShare).filter(x => !!x)\n );\n const classrooms = Flight.useBasicFetch<Classroom[]>(\n previousShares.hasCompleted &&\n ClassroomRequests.getClassroomsByIds(previousAssignmentClassroomIds, sharedData.currentUser.data?.customerId)\n );\n\n function getItemAppLink(share: Share) {\n const appLink = getInsightsOverviewAppLink(share);\n if (!appLink)\n return;\n\n return appLink;\n }\n\n const analyticsUrl = AnalyticsRouteHelper.getObjectUrl(\n sharedData.config.data?.analyticsWebUrl,\n sharedData.entity.data,\n hasShareFlowV2\n );\n \n const canViewSchoolAnalytics =\n hasPermissions(PermissionName.ViewAnalyticsProduct) &&\n hasPermissions(PermissionName.ViewCustomerAnalytics);\n\n const emptyStateType = (hasShareFlowV2 && isTertiary) ? 'shares' : 'assign-and-shares';\n\n const loaded = sharedData.loaded && !!previousShares.data && !!classrooms.data;\n\n return (\n <Popup\n size='lg'\n title={getPhrase('title')}\n showLoadingSpinner={!loaded}\n closePopup={props.closePopup}\n >\n {!assignments.length &&\n <ShowAssignmentsEmptyState\n assignAppLink={AssignAppLinkHelper.flowSelector({ entityType: props.entityType, objectId: props.objectId })}\n shareAppLink={{\n application: AppChannels.SHARE,\n action: Actions.Share.SHARE,\n args: [props.objectId],\n params: {\n entityType: props.entityType\n }\n }}\n type={emptyStateType}\n hideAssignButton={AssignHelper.hideAssignButtonOnVideoActions(sharedData.currentUser.data)}\n />\n }\n \n {!!assignments.length &&\n <>\n <PreviousAssignmentsListHeader />\n <PreviousAssignmentsList\n assignments={assignments.reverse()}\n classrooms={classrooms.data}\n getItemAppLink={getItemAppLink}\n scrollHeightMax={MAX_SCROLL_HEIGHT}\n />\n </>\n }\n <FlowControls\n hideNextButton\n hideCreateClassroomButton\n onClickBack={props.closePopup}\n backButtonText={getPhrase('close')}\n leftComponent={!!analyticsUrl && canViewSchoolAnalytics && <ViewInSchoolAnalyticsButton href={analyticsUrl} />}\n />\n </Popup>\n );\n}","var EN_US = ['second', 'minute', 'hour', 'day', 'week', 'month', 'year'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['just now', 'right now'];\n var unit = EN_US[Math.floor(idx / 2)];\n if (diff > 1)\n unit += 's';\n return [diff + \" \" + unit + \" ago\", \"in \" + diff + \" \" + unit];\n}\n//# sourceMappingURL=en_US.js.map","var ZH_CN = ['秒', '分钟', '小时', '天', '周', '个月', '年'];\nexport default function (diff, idx) {\n if (idx === 0)\n return ['刚刚', '片刻后'];\n var unit = ZH_CN[~~(idx / 2)];\n return [diff + \" \" + unit + \"\\u524D\", diff + \" \" + unit + \"\\u540E\"];\n}\n//# sourceMappingURL=zh_CN.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\n/**\n * All supported locales\n */\nvar Locales = {};\n/**\n * register a locale\n * @param locale\n * @param func\n */\nexport var register = function (locale, func) {\n Locales[locale] = func;\n};\n/**\n * get a locale, default is en_US\n * @param locale\n * @returns {*}\n */\nexport var getLocale = function (locale) {\n return Locales[locale] || Locales['en_US'];\n};\n//# sourceMappingURL=register.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nvar SEC_ARRAY = [\n 60,\n 60,\n 24,\n 7,\n 365 / 7 / 12,\n 12,\n];\n/**\n * format Date / string / timestamp to timestamp\n * @param input\n * @returns {*}\n */\nexport function toDate(input) {\n if (input instanceof Date)\n return input;\n // @ts-ignore\n if (!isNaN(input) || /^\\d+$/.test(input))\n return new Date(parseInt(input));\n input = (input || '')\n // @ts-ignore\n .trim()\n .replace(/\\.\\d+/, '') // remove milliseconds\n .replace(/-/, '/')\n .replace(/-/, '/')\n .replace(/(\\d)T(\\d)/, '$1 $2')\n .replace(/Z/, ' UTC') // 2017-2-5T3:57:52Z -> 2017-2-5 3:57:52UTC\n .replace(/([+-]\\d\\d):?(\\d\\d)/, ' $1$2'); // -04:00 -> -0400\n return new Date(input);\n}\n/**\n * format the diff second to *** time ago, with setting locale\n * @param diff\n * @param localeFunc\n * @returns\n */\nexport function formatDiff(diff, localeFunc) {\n /**\n * if locale is not exist, use defaultLocale.\n * if defaultLocale is not exist, use build-in `en`.\n * be sure of no error when locale is not exist.\n *\n * If `time in`, then 1\n * If `time ago`, then 0\n */\n var agoIn = diff < 0 ? 1 : 0;\n /**\n * Get absolute value of number (|diff| is non-negative) value of x\n * |diff| = diff if diff is positive\n * |diff| = -diff if diff is negative\n * |0| = 0\n */\n diff = Math.abs(diff);\n /**\n * Time in seconds\n */\n var totalSec = diff;\n /**\n * Unit of time\n */\n var idx = 0;\n for (; diff >= SEC_ARRAY[idx] && idx < SEC_ARRAY.length; idx++) {\n diff /= SEC_ARRAY[idx];\n }\n /**\n * Math.floor() is alternative of ~~\n *\n * The differences and bugs:\n * Math.floor(3.7) -> 4 but ~~3.7 -> 3\n * Math.floor(1559125440000.6) -> 1559125440000 but ~~1559125440000.6 -> 52311552\n *\n * More information about the performance of algebraic:\n * https://www.youtube.com/watch?v=65-RbBwZQdU\n */\n diff = Math.floor(diff);\n idx *= 2;\n if (diff > (idx === 0 ? 9 : 1))\n idx += 1;\n return localeFunc(diff, idx, totalSec)[agoIn].replace('%s', diff.toString());\n}\n/**\n * calculate the diff second between date to be formatted an now date.\n * @param date\n * @param relativeDate\n * @returns {number}\n */\nexport function diffSec(date, relativeDate) {\n var relDate = relativeDate ? toDate(relativeDate) : new Date();\n return (+relDate - +toDate(date)) / 1000;\n}\n/**\n * nextInterval: calculate the next interval time.\n * - diff: the diff sec between now and date to be formatted.\n *\n * What's the meaning?\n * diff = 61 then return 59\n * diff = 3601 (an hour + 1 second), then return 3599\n * make the interval with high performance.\n **/\nexport function nextInterval(diff) {\n var rst = 1, i = 0, d = Math.abs(diff);\n for (; diff >= SEC_ARRAY[i] && i < SEC_ARRAY.length; i++) {\n diff /= SEC_ARRAY[i];\n rst *= SEC_ARRAY[i];\n }\n d = d % rst;\n d = d ? rst - d : rst;\n return Math.ceil(d);\n}\n//# sourceMappingURL=date.js.map","import { formatDiff, diffSec } from './utils/date';\nimport { getLocale } from './register';\n/**\n * format a TDate into string\n * @param date\n * @param locale\n * @param opts\n */\nexport var format = function (date, locale, opts) {\n // diff seconds\n var sec = diffSec(date, opts && opts.relativeDate);\n // format it with locale\n return formatDiff(sec, getLocale(locale));\n};\n//# sourceMappingURL=format.js.map","/**\n * Created by hustcc on 18/5/20.\n * Contract: i@hust.cc\n */\nimport en_US from './lang/en_US';\nimport zh_CN from './lang/zh_CN';\nimport { register } from './register';\nregister('en_US', en_US);\nregister('zh_CN', zh_CN);\nexport { format } from './format';\nexport { render, cancel } from './realtime';\nexport { register };\n//# sourceMappingURL=index.js.map"],"names":["getPhrase","icons","iconColours","shareTypeTitlePhraseMap","ShareAvatar","props","title","type","classroomName","additionalTitleText","openClassroomName","getTitle","className","svgName","variant","textVariant","svgWrapperClassName","svgSize","S","titleClassName","hideSubtitle","subtitleText","privacy","studentCount","classroomGroupCount","smartCount","getClassroomSubtitle","includes","getLinkSubtitle","getSubtitle","SharePrivacy","ShareViewHelper","canEmbed","canAddPolicies","getEnabledIntegrations","googleClassroomSetting","msftTeamsSetting","filter","i","enabled","map","id","getShareSettingsInitialValues","share","interactive","preventScrubbing","options","immediateFeedback","getEnabledSettingsField","entityType","showImmediateFeedbackField","showPreventScrubbingField","getSharableEntityType","objectTypeId","getFetchFunctionByType","getAnalyticsEntity","getAnalyticsOptions","IntegrationId","IntegrationHelper","getShareIntegrations","name","settingName","FlowControls","hideBackButton","onClickBack","hideNextButton","onClickNext","hideCreateClassroomButton","onClickCreateClassroom","leftComponent","onClick","text","backButtonText","nextButtonTooltip","disable","placement","spanHack","nextButtonText","disabled","disableNextButton","showSpinner","namespace","ShareViewCount","MasterType","Text","phrase","viewCount","ShareViewedByCount","SvgContainer","shareAccessCount","accessCount","ShareType","totalRecipients","recipients","length","getViewCount","PreviousAssignmentsHeader","show","count","IconButton","onToggle","PreviousAssignmentsListHeader","columnClassNames","value","Row","Col","xs","PreviousAssignmentListItem","shareClassroom","ShareHelper","classrooms","analytics","getItemAnalytics","AppLink","key","shareId","appLink","getItemAppLink","analyticsData","data","analyticsOptions","lg","dateCreated","PreviousAssignmentsList","autoHeight","autoHeightMin","autoHeightMax","scrollHeightMax","autoHide","assignments","idx","PreviousAssignments","noBottomPadding","useAssignSharedData","currentUser","entity","objectId","config","interactiveId","hasPermissions","getGatedPermission","isLoaded","hasStudentExp","canCreateClassrooms","openClassroomGatedPermission","loaded","LanguageService","SharesAndAssignmentsEmptyState","EmptyState","size","src","ImageUrls","hideAssignButton","icon","assignAppLink","shareLinkAppLink","SharesEmptyState","MAX_SCROLL_HEIGHT","sortByDateCreated","a","b","DateHelper","ViewInSchoolAnalyticsButton","href","target","ShowAssignmentsEmptyState","shareAppLink","ShowAssignmentsView","sharedData","usePermissions","hasShareFlowV2","useSettings","isTertiary","useIsTertiary","previousShares","ShareRequests","sort","previousAssignmentClassroomIds","ArrayHelper","x","hasCompleted","ClassroomRequests","customerId","analyticsUrl","AnalyticsRouteHelper","analyticsWebUrl","canViewSchoolAnalytics","PermissionName","emptyStateType","Popup","showLoadingSpinner","closePopup","AssignAppLinkHelper","application","action","args","params","AssignHelper","reverse","EN_US","ZH_CN","Locales","register","locale","func","SEC_ARRAY","toDate","input","Date","isNaN","test","parseInt","trim","replace","format","date","opts","sec","relativeDate","diff","localeFunc","agoIn","totalSec","Math","abs","floor","toString","unit"],"sourceRoot":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/4621-1f79d94416-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/hooks/UseInfiniteScroll.ts","file:///app/packages/libs/shared/src/hooks/UseInfiniteList.ts","file:///app/packages/libs/shared/src/utils/GroupHelper.ts","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-groups/empty-state/ManageClassroomGroupsEmptyState.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-group-item/manage-classroom-group-item.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-group-item/ManageClassroomGroupItem.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-groups/manage-classroom-groups.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-groups/ManageClassroomGroups.tsx","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-groups/partial-loading/partial-manage-classrooms-groups.scss","file:///app/packages/projects/lite/src/apps/classrooms/components/manage-classroom-groups/partial-loading/PartialManageClassroomGroups.tsx","file:///app/packages/projects/lite/src/apps/classrooms/hooks/useFetchClassroomGroups.ts","file:///app/packages/projects/lite/src/apps/classrooms/views/classroom-groups/ClassroomGroupsView.tsx","file:///app/packages/projects/lite/src/shared/hooks/useClassroomExperience.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\n\nconst SCROLL_TOLERANCE = 400; // value in px\n\ninterface UseInfiniteScrollOptions {\n fetchNextPage: () => void;\n hasMore: boolean;\n isFetching: boolean;\n scrollContainer?: HTMLElement;\n}\n\nexport function useInfiniteScroll(options: UseInfiniteScrollOptions): void {\n const handleScroll = (): void => {\n if (options.isFetching)\n return;\n\n if (!options.scrollContainer) {\n const currentScrollHeight = window.innerHeight + document.documentElement.scrollTop;\n \n const totalHeight = document.documentElement.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n } else {\n const { scrollContainer } = options;\n const currentScrollHeight = scrollContainer.getBoundingClientRect().height + scrollContainer.scrollTop;\n \n const totalHeight = scrollContainer.scrollHeight - SCROLL_TOLERANCE;\n \n if (currentScrollHeight < totalHeight)\n return;\n }\n\n options.fetchNextPage();\n };\n\n useEffect(() => {\n const onScroll = FunctionHelper.throttle(handleScroll, 200);\n\n const scrollContainer = options.scrollContainer || window;\n\n if (options.hasMore)\n scrollContainer.addEventListener('scroll', onScroll);\n\n return () => scrollContainer.removeEventListener('scroll', onScroll);\n }, [ options.hasMore, options.fetchNextPage, options.scrollContainer ]);\n}","import { useEffect, useState } from 'react';\n\nimport { HttpStatus, HttpStatusClass } from 'libs/common/backbone/enums/HttpStatus';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject, BasePaginatedCollection } from 'libs/shared/interfaces';\n\nimport { useInfiniteScroll } from './UseInfiniteScroll';\nimport { useSelectAllPages } from './UseSelectAllPages';\n\nexport interface UseInfiniteListResult<T extends BaseObject> {\n items: T[];\n hasMore: boolean;\n isFetching: boolean;\n nextCursor: string;\n totalItems?: number;\n hasFirstPageCompleted: boolean;\n}\n\n/**\n * Hook to extract an infinite list from the application state,\n * save it locally in state and only update when new data\n * is fetched.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useInfiniteList<TObject = BaseObject, TResponse = BasePaginatedCollection<TObject>>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false,\n onError?: (pageNumber: number, statusCode: HttpStatus) => void,\n getItems?: (responseData: TResponse) => TObject[],\n getCursor?: (responseData: TResponse) => string,\n scrollContainer?: HTMLElement\n): UseInfiniteListResult<TObject> {\n const [ pagesFetched, setPagesFetched ] = useState(0);\n\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n function getKey(cursor?: string): string {\n if (!getRequest)\n return null;\n\n const request = getRequest(cursor);\n\n if (!request)\n return null;\n\n return request.key;\n }\n\n const response = useSelectAllPages<TObject, TResponse>(\n getKey,\n getItems,\n getCursor\n );\n\n function fetchNextPage(): void {\n if (!fetchNext || !getRequest || !response)\n return;\n\n setPagesFetched(currentVal => currentVal + 1);\n return fetchNextFn(response.nextCursor);\n }\n\n useInfiniteScroll({\n fetchNextPage,\n hasMore: !!response?.nextCursor,\n isFetching: response?.isFetching,\n scrollContainer\n });\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext) {\n fetchNextFn();\n setPagesFetched(currentVal => currentVal + 1);\n }\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response?.statusCode || !FunctionHelper.isFunction(onError))\n return;\n\n const httpStatusClass: HttpStatusClass = +(response.statusCode?.toString()?.substr(0, 1));\n\n if (httpStatusClass !== HttpStatusClass.ClientError && httpStatusClass !== HttpStatusClass.ServerError)\n return;\n\n onError(pagesFetched, response.statusCode);\n }, [response?.statusCode]);\n\n return {\n items: response?.items,\n hasMore: !!response?.nextCursor,\n nextCursor: response?.nextCursor,\n isFetching: response?.isFetching,\n totalItems: response?.totalItems,\n hasFirstPageCompleted: response?.hasFirstPageCompleted\n };\n}","import { ButtonProps } from 'react-bootstrap';\n\nimport { ClassroomGroupColour } from 'libs/shared/interfaces';\n\nexport function mapColourToBsVariant(groupColour: ClassroomGroupColour): ButtonProps['variant'] {\n switch (groupColour) {\n case ClassroomGroupColour.Pink:\n return 'pink';\n case ClassroomGroupColour.Orange:\n return 'orange';\n case ClassroomGroupColour.Green:\n return 'green';\n case ClassroomGroupColour.Blue:\n return 'blue';\n case ClassroomGroupColour.Purple:\n return 'purple';\n case ClassroomGroupColour.Indigo:\n return 'indigo';\n default:\n return 'pink';\n }\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nconst namespace = 'classrooms.manageClassroomGroupsEmptyState';\n\ninterface ManageClassroomGroupsEmptyStateProps {\n classroomId: string;\n}\n\nexport function RosteredClassroomGroupsEmptyState(): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.GROUPS} />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info className='mb-2'><Text phrase='info' /></EmptyState.Info>\n\n {/* todo add kb link */}\n <a className='btn btn-link info-link font-semibold' href={''} target='_blank'>\n {LanguageService.getPhrase(namespace, 'rosteringCta')}\n </a>\n \n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\nexport function ManageClassroomGroupsEmptyState(props: ManageClassroomGroupsEmptyStateProps): JSX.Element {\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Classrooms.GROUPS} />\n\n <EmptyState.Heading><Text phrase='heading' /></EmptyState.Heading>\n\n <EmptyState.Info><Text phrase='info' /></EmptyState.Info>\n\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'addGroups')}\n icon={cvSvgLibrary.Plus}\n appLink={{\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.NEW_GROUP,\n args: [props.classroomId]\n }}\n />\n\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"colourColumn\":\"B2Gwz\",\"groupContainer\":\"RXaVm\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ClassroomGroup } from 'libs/shared/interfaces';\nimport { Classroom } from 'libs/shared/interfaces';\nimport { mapColourToBsVariant } from 'libs/shared/utils/GroupHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport styles from './manage-classroom-group-item.scss';\n\nconst getPhrase = LanguageService.encloseNamespace('classrooms.manageClassroomGroupItem');\n\ninterface ManageClassroomGroupItemProps {\n classroom: Classroom;\n group: ClassroomGroup;\n}\n\nexport function ManageClassroomGroupItem(props: ManageClassroomGroupItemProps): JSX.Element {\n function onClickEdit(): void {\n AnalyticsHelper.logUserAction({ id: props.group.id, name: props.group.name }, {\n entity: EntityType.ClassroomGroup,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Edit,\n location: LocationContext.ManageClassroomGroupListItem\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.EDIT_GROUP,\n args: [ props.classroom.id, props.group.id ]\n });\n }\n\n function onClickDelete(): void {\n AnalyticsHelper.logUserAction({ id: props.group.id, name: props.group.name }, {\n entity: EntityType.ClassroomGroup,\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Delete,\n location: LocationContext.ManageClassroomGroupListItem\n });\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.DELETE_GROUP,\n args: [ props.classroom.id, props.group.id ]\n });\n }\n\n return (\n <>\n <div className='d-flex align-items-center px-3 py-1'>\n <div className={`${styles.colourColumn} flex-shrink-0 me-2`}>\n <div className={`${styles.groupContainer}`}>\n <IconCircle svgName={cvSvgLibrary.Group} variant={mapColourToBsVariant(props.group.metadata?.colour)} />\n </div>\n </div>\n\n <p className='mb-0 me-auto clamp-2'>{props.group.name}</p>\n\n <DivButton className='me-2' onClick={onClickEdit}>\n <SvgContainer\n svgName={cvSvgLibrary.Edit}\n title={getPhrase('editGroup')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </DivButton>\n\n <DivButton onClick={onClickDelete}>\n <SvgContainer\n svgName={cvSvgLibrary.Delete}\n title={getPhrase('deleteGroup')}\n tooltipPlacement='top'\n tooltipSpanHack\n />\n </DivButton>\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"colourColumn\":\"TpyUA\"};","import * as React from 'react';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { Classroom, ClassroomGroup } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { ManageClassroomGroupItem } from 'apps/classrooms/components/manage-classroom-group-item/ManageClassroomGroupItem';\n\nimport { ManageClassroomGroupsEmptyState } from './empty-state/ManageClassroomGroupsEmptyState';\n\nimport styles from './manage-classroom-groups.scss';\n\nconst namespace = 'classrooms.manageClassroomGroups';\n\nconst getCreateGroupAppLink = (id: string) => ({\n application: AppChannels.CLASSROOMS,\n action: Actions.Classrooms.NEW_GROUP,\n args: [id]\n});\n\ninterface ManageClassroomGroupsProps {\n classroom: Classroom;\n groups: ClassroomGroup[];\n}\n\nexport function ManageClassroomGroups(props: ManageClassroomGroupsProps): JSX.Element {\n function onClickCreateGroup(): void {\n AnalyticsHelper.logUserAction({\n classroomId: props.classroom.id,\n classroomName: props.classroom.name\n }, {\n workflowPhase: WorkflowPhase.Start,\n entity: EntityType.ClassroomGroup,\n actionType: UserAction.Create,\n location: LocationContext.ManageClassroomGroups\n });\n }\n\n const isSmallScreen = useMediaQuery(MediaQueryStrings.XLDown);\n\n if (!props.groups?.length)\n return <ManageClassroomGroupsEmptyState classroomId={props.classroom.id} />;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='py-2'>\n <div className={`d-flex align-items-center mb-2 ${!isSmallScreen ? 'ps-3' : ''}`}>\n <h2 className={`h6 mb-0 me-2 ${styles.colourColumn}`}><Text phrase='colour' /></h2>\n <h2 className='h6 mb-0'><Text phrase='groupName' /></h2>\n <IconButton\n appLink={getCreateGroupAppLink(props.classroom.id)}\n onClick={onClickCreateGroup}\n className='btn btn-outline-dark ms-auto'\n svgName={cvSvgLibrary.Plus}\n >\n <Text phrase='createNew' />\n </IconButton>\n </div>\n\n <ul className='striped-list list-unstyled'>\n {!!props.groups?.length && props.groups.map(group => (\n <li key={group.id}>\n <ManageClassroomGroupItem classroom={props.classroom} group={group} />\n </li>\n ))}\n </ul>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"heading\":\"bhtoZ\",\"nameHeading\":\"vytHM\",\"colourHeading\":\"yLWgp\",\"newGroup\":\"r5cCZ\",\"group\":\"ED2Tj\",\"colourPicker\":\"AYLSY\",\"actionIcon\":\"BX3vN\"};","import React from 'react';\n\nimport { PartialBreadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PartialPillTabSelector } from 'libs/shared/components/pill-tab-selector/partial-loading/PartialPillTabSelector';\n\nimport styles from './partial-manage-classrooms-groups.scss';\n\nexport function PartialManageClassroomGroups(): JSX.Element {\n return (\n <div className='px-3'>\n {/* Heading */}\n <div className={`mb-1 partial-loading-background ${styles.heading}`} />\n\n {/* Breadcrumbs */}\n <div className='pb-3'>\n <PartialBreadcrumbs numItems={2} />\n </div>\n\n {/* Pill tab selector */}\n <div className='pb-2'>\n <PartialPillTabSelector />\n </div>\n\n <div className='py-2'>\n <div className='d-flex align-items-center'>\n {/* Name heading */}\n <div className='w-25 mb-2'>\n <div className={`partial-loading-background ${styles.nameHeading}`} />\n </div>\n {/* Colour heading */}\n <div className='w-25 mb-2'>\n <div className={`partial-loading-background ${styles.colourHeading}`} />\n </div>\n\n {/* New group button */}\n <div className={`partial-loading-background ms-auto ${styles.newGroup}`} />\n </div>\n\n {/* List of partial group items */}\n <ul className='list-unstyled'>\n {Array(8).fill(null).map((group, i) => (\n <li key={i} className='mb-2'>\n <div className='d-flex align-items-center'>\n {/* Group name */}\n <div className='w-25'>\n <div className={`partial-loading-background ${styles.group}`} />\n </div>\n\n {/* Colour picker */}\n <div className='d-inline-block me-4'>\n <div className={`partial-loading-background ${styles.colourPicker}`} />\n </div>\n\n {/* Edit action */}\n <div className={`partial-loading-background me-2 ${styles.actionIcon}`} />\n {/* Delete action */}\n <div className={`partial-loading-background ${styles.actionIcon}`} />\n </div>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}","import { useDispatch } from 'react-redux';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError } from 'libs/shared/errors/handlers/HttpErrorHandlers';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useInfiniteList, UseInfiniteListResult } from 'libs/shared/hooks/UseInfiniteList';\nimport { ClassroomGroup, ClassroomGroupCollection, CurrentUser } from 'libs/shared/interfaces';\n\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\n\nconst namespace = 'classrooms.hooks';\n\nexport type GetClassroomsResponse = UseInfiniteListResult<ClassroomGroup> & {\n fetchNext: (cursor?: string) => void;\n};\n\nexport const useFetchClassroomGroups = (classroomId: string): GetClassroomsResponse => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const alerts = useAlerts();\n const dispatch = useDispatch();\n\n const getClassroomsRequest = (cursor?: string) => {\n return ClassroomRequests.getClassroomGroups(classroomId, cursor);\n };\n\n const fetchNextPage = (cursor?: string) => Flight.getFetch(dispatch)(getClassroomsRequest(cursor));\n\n function onError(pageNumber: number, httpStatus: HttpStatus): void {\n if (pageNumber === 1)\n return handleHttpError(httpStatus);\n\n alerts.error(LanguageService.getPhrase(namespace, 'error'));\n }\n\n const response = useInfiniteList<ClassroomGroup, ClassroomGroupCollection>(\n currentUser.data && classroomId ? getClassroomsRequest : false,\n fetchNextPage,\n onError,\n response => {\n return (response as ClassroomGroupCollection).data;\n }\n );\n\n return {\n ...response,\n fetchNext: fetchNextPage\n };\n};","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { InfiniteScrollFooter } from 'libs/shared/components/infinite-scroll-footer/InfiniteScrollFooter';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\nimport { Classroom, Config, CurrentUser, UserCollection } from 'libs/shared/interfaces';\n\nimport { ManageClassroomGroupsEmptyState } from 'apps/classrooms/components/manage-classroom-groups/empty-state/ManageClassroomGroupsEmptyState';\nimport { ManageClassroomGroups } from 'apps/classrooms/components/manage-classroom-groups/ManageClassroomGroups';\nimport { PartialManageClassroomGroups } from 'apps/classrooms/components/manage-classroom-groups/partial-loading/PartialManageClassroomGroups';\nimport { ClassroomRequests } from 'apps/classrooms/flight-requests/ClassroomRequests';\nimport { useFetchClassroomGroups } from 'apps/classrooms/hooks/useFetchClassroomGroups';\nimport { useHandleClassroomErrors } from 'apps/classrooms/hooks/useHandleClassroomErrors';\nimport { ClassroomLayout } from 'apps/classrooms/layouts/ClassroomLayout';\n\nconst namespace = 'classrooms.classroomGroups';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ClassroomGroupsViewProps {\n id: string;\n}\n\nexport function ClassroomGroupsView(props: ClassroomGroupsViewProps): JSX.Element {\n const { hasShareFlowV2 } = useSettings(null);\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const classroom = Flight.useBasicFetch<Classroom>(currentUser.data &&\n ClassroomRequests.getClassroom(props.id, currentUser.data.id));\n const students = Flight.useBasicFetch<UserCollection>(ClassroomRequests.getClassroomStudents(props.id));\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const classroomGroupsResponse = useFetchClassroomGroups(classroom.data?.id);\n\n const dispatch = useDispatch();\n\n useSetPageMetadata({\n title: getPhrase('pageTitle', { classroomName: classroom.data?.name })\n });\n useHandleClassroomErrors(classroom);\n\n const isRostered = classroom.data?._integrations?.rostered;\n\n function onTogglePin(shouldPin: boolean, onSuccess: () => void, onError: () => void): void {\n if (isRostered)\n return;\n const request = shouldPin\n ? ClassroomRequests.pinClassroom\n : ClassroomRequests.unpinClassroom;\n\n Flight.fetch(dispatch, request(classroom.data, onSuccess, onError));\n }\n\n const isFetchingClassrooms =\n !classroom.data ||\n !students.data?.data ||\n !classroomGroupsResponse.items ||\n !config.data;\n\n if (isFetchingClassrooms)\n return <PartialManageClassroomGroups />;\n\n return (\n <ClassroomLayout\n classroom={classroom.data}\n currentUser={currentUser.data}\n onTogglePin={onTogglePin}\n activeTab='groups'\n isRostered={isRostered}\n hasShareFlowV2={hasShareFlowV2}\n >\n {classroomGroupsResponse?.items.length ? (\n <>\n <ManageClassroomGroups\n classroom={classroom.data}\n groups={classroomGroupsResponse.items}\n />\n {(classroomGroupsResponse.isFetching || classroomGroupsResponse.nextCursor) && (\n <InfiniteScrollFooter\n isFetching={classroomGroupsResponse.isFetching}\n fetchNext={classroomGroupsResponse.fetchNext}\n nextCursor={classroomGroupsResponse.nextCursor}\n />\n )}\n </>\n ) : <ManageClassroomGroupsEmptyState classroomId={classroom.data.id} />}\n </ClassroomLayout>\n );\n}\n","import { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\ntype ClassroomExperience = 'none' | 'minimal' | 'full';\n\nexport function useClassroomExperience() {\n const { hasShareFlowV2, hasClassrooms, isLoadingSettings } = useSettings(null);\n const { hasPermissions, isLoaded, getGatedPermission } = usePermissions();\n\n function getExperience(): ClassroomExperience {\n if (!hasClassrooms)\n return 'none';\n\n if (getGatedPermission(PermissionName.ViewClassrooms) === 'soft-gate')\n return 'minimal';\n\n if (hasPermissions(PermissionName.ViewClassrooms))\n return 'full';\n \n if (hasShareFlowV2)\n return 'minimal';\n }\n\n return {\n experience: getExperience(),\n loading: isLoadingSettings || !isLoaded\n };\n}"],"names":["SCROLL_TOLERANCE","useInfiniteList","getRequest","fetchNext","onError","getItems","getCursor","scrollContainer","options","handleScroll","useState","pagesFetched","setPagesFetched","fetchNextFn","response","cursor","request","key","fetchNextPage","currentVal","nextCursor","hasMore","isFetching","getBoundingClientRect","height","scrollTop","scrollHeight","window","innerHeight","document","documentElement","useEffect","onScroll","FunctionHelper","addEventListener","removeEventListener","shouldInitialFetch","statusCode","httpStatusClass","toString","substr","HttpStatus","items","totalItems","hasFirstPageCompleted","mapColourToBsVariant","groupColour","namespace","ManageClassroomGroupsEmptyState","props","value","src","phrase","text","icon","appLink","application","action","args","classroomId","getPhrase","ManageClassroomGroupItem","className","IconCircle","svgName","variant","group","metadata","colour","name","DivButton","onClick","AnalyticsHelper","id","entity","workflowPhase","actionType","location","classroom","SvgContainer","title","tooltipPlacement","tooltipSpanHack","getCreateGroupAppLink","ManageClassroomGroups","isSmallScreen","groups","length","IconButton","classroomName","map","PartialManageClassroomGroups","numItems","PartialPillTabSelector","Array","fill","i","useFetchClassroomGroups","currentUser","UserRequests","alerts","dispatch","getClassroomsRequest","ClassroomRequests","data","pageNumber","httpStatus","error","ClassroomGroupsView","hasShareFlowV2","useSettings","students","config","ConfigRequests","classroomGroupsResponse","useSetPageMetadata","useHandleClassroomErrors","isRostered","_integrations","rostered","ClassroomLayout","onTogglePin","shouldPin","onSuccess","activeTab","InfiniteScrollFooter","useClassroomExperience","hasClassrooms","isLoadingSettings","hasPermissions","isLoaded","getGatedPermission","experience","loading"],"sourceRoot":""}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4806],{34079:(e,t,n)=>{n.d(t,{O:()=>o});var r=n(32735),a=n(23481),l=n(40782),i=n(36532),c=a.T.encloseNamespace("interactives.pendingIndicator");function s(e){var t="d-flex align-items-center h-100";return t+=e.showLabel?" justify-content-between":" justify-content-center",e.className&&(t+=" ".concat(e.className)),t}function o(e){var t=e.title,n=e.showLabel,a=e.tooltipClassName,o=e.showIndicator,u=void 0===o||o,m=function(){return r.createElement("div",{className:s(e)},!!n&&r.createElement("em",null,c("pending")),!!u&&r.createElement(l.O,null))};return t?r.createElement(i.u,{title:t,spanHack:!0,spanHackClassName:a||"h-100 w-100 d-flex align-items-center"},r.createElement(m,null)):r.createElement(m,null)}},84806:(e,t,n)=>{n.d(t,{Ju:()=>T,bB:()=>H,l8:()=>z,R7:()=>j,lE:()=>A,Fx:()=>D});var r=n(32735),a=n(23481),l=n(75896),i=n(34079),c=n(26136),s=n(39157),o=n(97364),u=n(77640),m=n(97408),d=n(40782),v=n(83914),f=n(80845),g=n(64818),p=n(26378),y=n(71151),h=n(93264),E=n(84120);function w(e){return e.duration?r.createElement(r.Fragment,null,e.interactive.timepoints.map(function(t,n){if(!t.interactions.length)return r.createElement(r.Fragment,null);var a,l,i=(a=t,l=e.selectedInteraction,a.interactions.find(function(e){return e.id===l.id})||a.interactions[0]),c=i.id===e.selectedInteraction.id,s=c?E.w.getTypeInfo(i.typeId).bgClassName:"bg-gray-500",o=t.visibleAt/1e3/e.duration*100;return r.createElement("div",{key:n,className:"".concat("Wf1bl"," text-center"),style:{left:"".concat(o,"%")}},r.createElement("div",{className:"".concat("Fpm49"," ").concat(s)}),!!c&&r.createElement("div",null,h.T.ToDisplayDuration(t.visibleAt)))})):r.createElement(r.Fragment,null)}var b=n(86572);var N=a.T.encloseNamespace("shared.interactionResultsSummary");function C(e){var t,n=r.useMemo(function(){return(0,s.nq)(e.interaction,e.results)},[e.interaction,e.results]);return r.createElement("div",{className:"px-1 pt-1"},r.createElement("div",{className:"d-flex"},r.createElement(b.y,{interaction:e.interaction,iconClassName:"flex-shrink-0"})),r.createElement("div",{className:"my-4 ".concat("FCXQd")},r.createElement(w,{interactive:e.interactive,duration:(t=e.interactiveMetadata,t._parentClip?t._parentClip.endTime-t._parentClip.startTime:t._parentVideo.duration?t._parentVideo.duration/1e3:0),selectedInteraction:e.interaction})),r.createElement("div",{className:"row pt-1 pb-2"},r.createElement("div",{className:"col-6 pe-1"},r.createElement("div",{className:"bg-light rounded p-2 h-100"},!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-between"},r.createElement("strong",null,N("correctlyAnswered")),r.createElement(d.O,{percentage:n.percentCorrect,layout:d.I.LabelOnly})),!!n.awaitingMarking&&r.createElement("div",{className:"d-flex align-items-center justify-content-center"},r.createElement("strong",null,r.createElement("em",null,N("pending")))))),r.createElement("div",{className:"col-6 ps-1"},r.createElement("div",{className:"bg-light rounded h-100 p-2 d-flex align-items-center justify-content-between"},r.createElement("strong",null,N("unanswered")),r.createElement("span",null,n.unanswered)))))}var x=r.forwardRef(function(e,t){var n=e.interaction,a=e.interactive,l=e.interactiveMetadata,i=e.results,c=function(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var a=0;for(r=Object.getOwnPropertySymbols(e);a<r.length;a++)t.indexOf(r[a])<0&&Object.prototype.propertyIsEnumerable.call(e,r[a])&&(n[r[a]]=e[r[a]])}return n}(e,["interaction","interactive","interactiveMetadata","results"]);return r.createElement("div",{className:"popover-lg"},r.createElement(y.Z,Object.assign({id:"interaction-results-summary-".concat(n.id),ref:t},c),r.createElement(y.Z.Body,null,r.createElement(C,{interaction:n,interactive:a,interactiveMetadata:l,results:i}))))}),S=n(19912);function k(e){var t;return r.createElement(p.Z,{trigger:(null===(t=e.results.students)||void 0===t?void 0:t.length)?"click":null,placement:"bottom",overlay:r.createElement(x,{interaction:e.interaction,interactive:e.interactive,interactiveMetadata:e.interactiveMetadata,results:e.results}),rootClose:!0},r.createElement("div",{className:"text-center h-100\n d-flex align-items-center justify-content-center\n ".concat(S.Z.interactionHeaderCellInner),onMouseEnter:e.onMouseEnter,onMouseLeave:e.onMouseLeave},r.createElement("div",{className:"p-1 position-relative"},e.interactionNumber)))}var M=n(28972),I=n(83140),R=n(35223);function Z(e){var t="".concat(S.Z.resultsCellInner," h-100 position-relative");return e===M.w.Correct&&(t+=" ".concat(S.Z.correct)),e===M.w.Incorrect&&(t+=" ".concat(S.Z.incorrect," text-danger")),e===M.w.AwaitingMarking&&(t+=" ".concat(S.Z.awaitingMarking)),e===M.w.UnAnswered&&(t+=" ".concat(S.Z.unanswered," text-warning")),t}function L(e){var t=I.A.isInteractionCorrect(e.interaction,(0,f.j_)(e.studentResults)),n=function(e){return e===M.w.Correct?R.vn.Check:e===M.w.Incorrect?R.vn.Close:e===M.w.UnAnswered?R.vn.Minus:void 0}(t);return r.createElement("div",{className:Z(t)},!!n&&r.createElement(v.x,{svgName:n}),t===M.w.AwaitingMarking&&r.createElement(i.O,null))}var O=a.T.encloseNamespace("shared.studentResultsTable"),T=60;function B(e,t){var n;if(e.sessionId||e.deleted||t){var r=(0,c.B)(e,t).split(" ").filter(function(e){return!!e});return{name:r[0],surname:r.slice(1).join(" ")||"",avatarUrl:null}}return{name:e.displayName||e.name,surname:e.surname||"",avatarUrl:null===(n=e.avatar)||void 0===n?void 0:n.url}}function U(e){var t;return r.createElement("div",{className:"d-flex align-items-center p-2 h-100 ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.children)}function _(e){return r.createElement(U,{className:e.column.isSorted&&"fw-bold"},O(e.phraseKey))}function j(e,t,n,a){var l,s=!!(null===(l=e.students)||void 0===l?void 0:l.length);return r.useMemo(function(){var e=[];return a?e.push({id:"firstName",Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"firstName"})},accessor:function(e){return e},width:130,Cell:function(e){var a=e.value,l=B(a.user,t),i=l.name,c=l.surname,s=l.avatarUrl;return r.createElement(U,null,r.createElement("div",{className:"d-inline-block flex-shrink-0 p-1 ".concat(S.Z.avatar)},r.createElement(m.q,{imageUrl:s,imageCdnUrl:n,initials:g.l.getInitials(i,c),showAnonymousUser:!(t||!a.user.sessionId&&!a.user.deleted),anonymiseUsers:t,anonymousSvgSize:v.S.Small})),r.createElement("div",{className:"ms-2 overflow-hidden"},r.createElement("h4",{className:"font-size-normal fw-normal m-0 text-truncate"},i)))},disableSortBy:!s},{id:"surname",Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"surname"})},accessor:function(e){return e},width:130,Cell:function(e){var n=B(e.value.user,t).surname;return r.createElement(U,null,r.createElement("div",{className:"overflow-hidden"},r.createElement("h5",{className:"font-size-normal fw-normal m-0 text-truncate"},n||"")))},disableSortBy:!s}):e.push({id:"name",Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"name"})},accessor:function(e){return e},width:n?175:void 0,Cell:function(e){var a=e.value;return n?r.createElement(U,null,r.createElement(u.t,{user:a.user,imageCdnUrl:n,anonymiseUsers:t,detailsClassName:"ms-2 overflow-hidden",nameClassName:"text-truncate",showDisplayName:!0,avatarClassName:"p-1",showSubText:!1})):r.createElement(U,null,r.createElement("span",{className:"text-truncate"},(0,c.B)(a.user,t)))},disableSortBy:!s}),e.push({Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"unanswered"})},accessor:"summary.unanswered",sortType:"basic",sortDescFirst:!0,disableSortBy:!s,width:a?120:130,Cell:function(e){var t=e.value;return r.createElement(U,null,t)}},{Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"score"})},accessor:"summary",id:"score",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(U,null,r.createElement(i.O,{title:O("markingRequired"),className:"flex-grow-1",showLabel:!0,showIndicator:!a})):r.createElement(U,null,"".concat(t.correct,"/").concat(t.answered+t.unanswered))},width:a?80:125,sortDescFirst:!0,disableSortBy:!s},{Header:function(e){var t=e.column;return r.createElement(_,{column:t,phraseKey:"percentage"})},accessor:"summary",id:"percentage",Cell:function(e){var t=e.value;return t.awaitingMarking?r.createElement(U,null,r.createElement(i.O,{title:O("markingRequired"),className:"flex-grow-1",showLabel:!0})):r.createElement(U,null,r.createElement(d.O,{percentage:t.percentCorrect,layout:d.I.LabelBefore,className:"flex-grow-1"}))},width:125,sortDescFirst:!0,disableSortBy:!s}),e},[t,s])}function A(e,t,n,a,l){return r.useMemo(function(){return(0,f.Q)(e).map(function(l,i){return{Header:function(){return r.createElement(k,{interaction:l,results:n,interactive:e,interactiveMetadata:t,interactionNumber:i+1,onMouseEnter:function(){return a(i)},onMouseLeave:function(){return a(null)}})},accessor:"results",id:l.id,disableSortBy:!0,width:T,Cell:function(e){var t=e.row.original;return r.createElement(L,{interaction:l,studentResults:t})}}})},[l])}function D(e,t,n,a,i,u,m){return r.useMemo(function(){var n=[];if(null==t||t.students.forEach(function(t){var r=(0,s.Rt)(e,t);u&&(0,o.C)(u,r)||n.push(Object.assign(Object.assign({},t),{summary:r}))}),"name"===(null==i?void 0:i.id)){var r=l.m.sortBy(n,function(e){return(0,c.B)(e.user,a)});return i.desc?r.reverse():r}if("firstName"===(null==i?void 0:i.id)){var m=l.m.sortBy(n,function(e){return B(e.user,a).name||""});return i.desc?m.reverse():m}if("surname"===(null==i?void 0:i.id)){var d=l.m.sortBy(n,function(e){return B(e.user,a).surname||""});return i.desc?d.reverse():d}if("summary.unanswered"===(null==i?void 0:i.id)){var v=l.m.sortBy(n,function(e){return e.summary.unanswered});return i.desc?v.reverse():v}if("score"===(null==i?void 0:i.id)||"percentage"===(null==i?void 0:i.id)){var f=l.m.sortBy(n,function(e){return e.summary.awaitingMarking?-1:e.summary.percentCorrect});return i.desc?f.reverse():f}return n},[n,i,a,u,m])}function H(e,t){if(e){var n=e.querySelectorAll(".".concat(S.Z.resultsRow));null==n||n.forEach(function(e){e.childNodes.forEach(function(e,n){e.classList.remove(S.Z.highlightColumn),n===t&&e.classList.add(S.Z.highlightColumn)})})}}function z(e,t){if(e){var n=e.querySelectorAll(".".concat(S.Z.resultsRow));null==n||n.forEach(function(e,n){e.classList.remove(S.Z.highlightResultsRow),n===t&&e.classList.add(S.Z.highlightResultsRow)})}}},97364:(e,t,n)=>{n.d(t,{C:()=>l,P:()=>a});var r=n(94892);function a(e,t){switch(e){case"score_desc":return[{id:t,desc:!0}];case"score_asc":return[{id:t,desc:!1}];default:return[]}}function l(e,t){return"marking_required"===e&&!t.awaitingMarking||"helping_hand"===e&&t.percentCorrect>=r.T.HIGH||"not_completed"===e&&!t.unanswered}},77640:(e,t,n)=>{n.d(t,{t:()=>f});var r=n(32735),a=n(23481),l=n(31453),i=n(26136),c=n(97408),s=n(83914),o=n(76881),u=n(86613),m=n(64818),d=n(26521),v=a.T.encloseNamespace("shared.userRecipientItemMetadata");function f(e){var t=function(e){var t,n=e.user,r=e.anonymiseUsers,a=e.showDisplayName;if(n.sessionId||n.deleted){var l=(0,i.B)(n,r),c=l.split(" ").filter(function(e){return!!e});return{name:l,surname:c.slice(1).join(" "),avatarUrl:null}}return{name:r?(0,i.B)(n,!0):a?m.l.getDisplayName(n):m.l.getFullName(n),surname:n.surname,avatarUrl:null===(t=n.avatar)||void 0===t?void 0:t.url}}(e),n=t.name,a=t.surname,f=t.avatarUrl;return r.createElement(r.Fragment,null,r.createElement("div",{className:"".concat(d.Z.avatarContainer," ").concat(e.avatarClassName," d-inline-block flex-shrink-0")},r.createElement(c.q,{imageUrl:f,imageCdnUrl:e.imageCdnUrl,initials:m.l.getInitials(n,a),showAnonymousUser:!(e.anonymiseUsers||!e.user.sessionId&&!e.user.deleted),anonymiseUsers:e.anonymiseUsers,anonymousSvgSize:s.S.Small})),r.createElement("div",{className:e.detailsClassName},r.createElement("h4",{className:(0,l.A)("font-size-normal fw-normal m-0",e.nameClassName)},n),e.showSubText&&"id"in e.user&&r.createElement("p",{className:"text-secondary m-0"},e.getSubText?e.getSubText(e.user):function(e){var t=m.l.getUserType(e),n=m.l.getUserRole(e);if(t===o.Y.Staff)return n===u.i.Admin?v("admin"):v("staff");var r=m.l.getYearGroup(e);return(null==r?void 0:r.name)&&"Learners"!==r.name?r.name:v("student")}(e.user))))}f.defaults={showSubText:!0}},40782:(e,t,n)=>{n.d(t,{I:()=>r,O:()=>s});var r,a=n(32735),l=n(2606),i=n(362);function c(e){var t=a.useCallback(function(t){if(t){var n=t.r.baseVal.value,r=2*Math.PI*n,a=r-e.percentage*r;t.style.strokeDasharray="".concat(r," ").concat(r),t.style.strokeDashoffset=a.toString()}},[e.percentage]);return a.createElement("svg",null,a.createElement("circle",{r:(0,l.pu)(e.size),className:i.Z.backgroundCircle}),!(0,l.zR)(e.percentage)&&a.createElement("circle",{ref:t,r:(0,l.pu)(e.size),className:(0,l.V4)(e.percentage,e.scoreThresholds)}))}function s(e){var t,n=(0,l.Ki)(e.percentage),s=e.size||(e.layout===r.LabelInside?l.Mk.Large:l.Mk.Small),o=e.customLabel||(0,l.DV)(n);return e.layout===r.LabelOnly?a.createElement("span",{className:(0,l.IA)(n)},o):a.createElement("div",{className:"d-flex align-items-center justify-content-between ".concat(null!==(t=e.className)&&void 0!==t?t:"")},e.layout===r.LabelBefore&&a.createElement("span",{className:"me-2"},o),a.createElement("div",{className:(0,l.tw)(s,n)},a.createElement(c,{percentage:n,size:s,scoreThresholds:e.scoreThresholds}),e.layout===r.LabelInside&&a.createElement("span",{className:i.Z.centredPercentageText},o)))}!function(e){e.CircleOnly="circle_only",e.LabelOnly="label_only",e.LabelBefore="label_before",e.LabelInside="label_inside"}(r||(r={})),s.defaultProps={layout:r.CircleOnly}},2606:(e,t,n)=>{n.d(t,{DV:()=>p,IA:()=>v,Ki:()=>g,Mk:()=>c,V4:()=>d,pu:()=>m,tw:()=>f,zR:()=>y});var r=n(94892),a=n(362);function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function i(e,t,n){return(t=function(e){var t=function(e){if("object"!=l(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=l(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==l(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var c,s=.2,o=.36;!function(e){e.Small="small",e.Large="large",e.ExtraSmall="extraSmall"}(c||(c={}));var u=i(i(i({},c.ExtraSmall,{size:2}),c.Small,{size:2}),c.Large,{size:5.8});function m(e){var t=u[e].size,n=e===c.Large?o:s;return"".concat(t/2-2*n,"rem")}function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.i;return e>=t.HIGH?a.Z.circleSuccess:e>=t.MODERATE?a.Z.circleWarning:a.Z.circleDanger}function v(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:r.i;return e>=t.HIGH?"text-success":e>=t.MODERATE?"text-warning":"text-danger"}function f(e,t){var n="d-inline-block ".concat(a.Z.circleContainer);return e===c.Large&&(n+=" ".concat(a.Z.lgCircleContainer)),e===c.ExtraSmall&&(n+=" ".concat(a.Z.xsCircleContainer)),y(t)&&(n+=" ".concat(a.Z.pendingCircle)),n}function g(e){if(!y(e))return+e.toFixed(2)}function p(e){return y(e)?"--%":"".concat(Math.round(100*e),"%")}function y(e){return"number"!=typeof e}},19912:(e,t,n)=>{n.d(t,{Z:()=>r});const r={header:"hnMke",avatar:"b7JCz",row:"ILLa_",fixedTable:"_fdpt",interactionHeaderCellOuter:"kjXYB",hasResults:"M4qgr",interactionHeaderCellInner:"cnFvB",resultsCellOuter:"bdzRb",correct:"xANR6",incorrect:"_44sb",awaitingMarking:"eQ9sh",unanswered:"xRUK8",highlightColumn:"f9Zqr",resultsCellInner:"LAFwi",highlightResultsRow:"TwwLO",resultsRow:"xZ5iP"}},26521:(e,t,n)=>{n.d(t,{Z:()=>r});const r={removeRecipient:"mCbMC",recipientItem:"kdcb0",showSpinner:"xH6Mu",avatarContainer:"Zcpg3",recipientDetails:"v5EmV",recipientDetailsWithRemoveButton:"_V928"}},362:(e,t,n)=>{n.d(t,{Z:()=>r});const r={circleContainer:"p8Vgz",backgroundCircle:"asGGE",circleSuccess:"PXLNj",circleWarning:"ZckRN",circleDanger:"slBRg",lgCircleContainer:"N8KCI",xsCircleContainer:"RPqZ2",pendingCircle:"DKrcq",centredPercentageText:"tpmLR"}}}]);
|
|
2
|
-
//# sourceMappingURL=4806-f36469abb7-lite.chunk.js.map
|