@clickview/lite 0.75.0-rc.2 → 0.75.0-rc.4
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/css/{119-lite-a1f592f602.chunk.css → 1243-lite-13eda8f6a0.chunk.css} +2 -4
- package/dist/css/{7230-lite-36ff6e6d53.chunk.css → 1867-lite-8baa8af02b.chunk.css} +3 -5
- package/dist/css/{5241-lite-baab687563.chunk.css → 4203-lite-9ffab89741.chunk.css} +3 -5
- package/dist/css/{8364-lite-99938dea56.chunk.css → 5193-lite-d434056013.chunk.css} +1 -0
- package/dist/css/{7339-lite-05c396fed3.chunk.css → 6756-lite-839687d3d7.chunk.css} +1 -0
- package/dist/css/{9527-lite-1d2221b6a8.chunk.css → 7103-lite-fef3024f61.chunk.css} +2 -4
- package/dist/css/{8856-lite-827b34aed7.chunk.css → 8856-lite-c114ab5c89.chunk.css} +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/104-0c03791b45-lite.chunk.js +2 -0
- package/dist/scripts/104-0c03791b45-lite.chunk.js.map +1 -0
- package/dist/scripts/1074-4f6b136f9a-lite.chunk.js +2 -0
- package/dist/scripts/1074-4f6b136f9a-lite.chunk.js.map +1 -0
- package/dist/scripts/1087-861be5211f-lite.chunk.js +2 -0
- package/dist/scripts/1087-861be5211f-lite.chunk.js.map +1 -0
- package/dist/scripts/1192-d409863a3c-lite.chunk.js +2 -0
- package/dist/scripts/1192-d409863a3c-lite.chunk.js.map +1 -0
- package/dist/scripts/1199-d2fcbb547e-lite.chunk.js +2 -0
- package/dist/scripts/1199-d2fcbb547e-lite.chunk.js.map +1 -0
- package/dist/scripts/121-1b744469ee-lite.chunk.js +2 -0
- package/dist/scripts/121-1b744469ee-lite.chunk.js.map +1 -0
- package/dist/scripts/{1221-502395e693-lite.chunk.js → 1221-1109d5379d-lite.chunk.js} +3 -3
- package/dist/scripts/1221-1109d5379d-lite.chunk.js.map +1 -0
- package/dist/scripts/1243-ede924125c-lite.chunk.js +2 -0
- package/dist/scripts/1243-ede924125c-lite.chunk.js.map +1 -0
- package/dist/scripts/147-44ee7e9a78-lite.chunk.js +2 -0
- package/dist/scripts/147-44ee7e9a78-lite.chunk.js.map +1 -0
- package/dist/scripts/1491-ab92a040e5-lite.chunk.js +2 -0
- package/dist/scripts/1491-ab92a040e5-lite.chunk.js.map +1 -0
- package/dist/scripts/{1610-7f58bb25a9-lite.chunk.js → 1610-bb6eff2ff1-lite.chunk.js} +2 -2
- package/dist/scripts/1610-bb6eff2ff1-lite.chunk.js.map +1 -0
- package/dist/scripts/{7230-71f8d6d1bd-lite.chunk.js → 1867-3b447a1b85-lite.chunk.js} +2 -2
- package/dist/scripts/{7230-71f8d6d1bd-lite.chunk.js.map → 1867-3b447a1b85-lite.chunk.js.map} +1 -1
- package/dist/scripts/{218-297de74688-lite.chunk.js → 218-f6cc4a3b6a-lite.chunk.js} +2 -2
- package/dist/scripts/218-f6cc4a3b6a-lite.chunk.js.map +1 -0
- package/dist/scripts/2258-ed7383502f-lite.chunk.js +3 -0
- package/dist/scripts/2258-ed7383502f-lite.chunk.js.map +1 -0
- package/dist/scripts/{2968-c4c0114915-lite.chunk.js → 2968-13e56eeff8-lite.chunk.js} +1 -1
- package/dist/scripts/2968-13e56eeff8-lite.chunk.js.map +1 -0
- package/dist/scripts/3268-2736356687-lite.chunk.js +2 -0
- package/dist/scripts/{3268-faca1bf46e-lite.chunk.js.map → 3268-2736356687-lite.chunk.js.map} +1 -1
- package/dist/scripts/3597-eaae787997-lite.chunk.js +3 -0
- package/dist/scripts/3597-eaae787997-lite.chunk.js.map +1 -0
- package/dist/scripts/3836-425334ab13-lite.chunk.js +2 -0
- package/dist/scripts/{3836-f2a0c9f713-lite.chunk.js.map → 3836-425334ab13-lite.chunk.js.map} +1 -1
- package/dist/scripts/3837-e4c5bb738b-lite.chunk.js +2 -0
- package/dist/scripts/3837-e4c5bb738b-lite.chunk.js.map +1 -0
- package/dist/scripts/4185-7178e5a716-lite.chunk.js +2 -0
- package/dist/scripts/4185-7178e5a716-lite.chunk.js.map +1 -0
- package/dist/scripts/4203-ee50e89841-lite.chunk.js +3 -0
- package/dist/scripts/4203-ee50e89841-lite.chunk.js.map +1 -0
- package/dist/scripts/4598-bcd3f6f8a7-lite.chunk.js +2 -0
- package/dist/scripts/{4598-2b1daca7ae-lite.chunk.js.map → 4598-bcd3f6f8a7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4722-d96da2a258-lite.chunk.js → 4722-9eb591621a-lite.chunk.js} +3 -3
- package/dist/scripts/4722-9eb591621a-lite.chunk.js.map +1 -0
- package/dist/scripts/4948-f21dad2ca1-lite.chunk.js +2 -0
- package/dist/scripts/4948-f21dad2ca1-lite.chunk.js.map +1 -0
- package/dist/scripts/{5153-079b4125ae-lite.chunk.js → 5153-cf62a95421-lite.chunk.js} +3 -3
- package/dist/scripts/5153-cf62a95421-lite.chunk.js.map +1 -0
- package/dist/scripts/6137-bc8b193237-lite.chunk.js +2 -0
- package/dist/scripts/6137-bc8b193237-lite.chunk.js.map +1 -0
- package/dist/scripts/6756-cfd00009e4-lite.chunk.js +3 -0
- package/dist/scripts/6756-cfd00009e4-lite.chunk.js.map +1 -0
- package/dist/scripts/6790-36ce6dda04-lite.chunk.js +2 -0
- package/dist/scripts/6790-36ce6dda04-lite.chunk.js.map +1 -0
- package/dist/scripts/705-10a85bae7a-lite.chunk.js +2 -0
- package/dist/scripts/705-10a85bae7a-lite.chunk.js.map +1 -0
- package/dist/scripts/7103-14bd3771d2-lite.chunk.js +2 -0
- package/dist/scripts/7103-14bd3771d2-lite.chunk.js.map +1 -0
- package/dist/scripts/7148-d966512e45-lite.chunk.js +2 -0
- package/dist/scripts/7148-d966512e45-lite.chunk.js.map +1 -0
- package/dist/scripts/7205-12a6b2ac55-lite.chunk.js +2 -0
- package/dist/scripts/7205-12a6b2ac55-lite.chunk.js.map +1 -0
- package/dist/scripts/7438-38f60d3e8e-lite.chunk.js +2 -0
- package/dist/scripts/7438-38f60d3e8e-lite.chunk.js.map +1 -0
- package/dist/scripts/7480-e0749592fc-lite.chunk.js +2 -0
- package/dist/scripts/7480-e0749592fc-lite.chunk.js.map +1 -0
- package/dist/scripts/8010-e9163f5bee-lite.chunk.js +2 -0
- package/dist/scripts/8010-e9163f5bee-lite.chunk.js.map +1 -0
- package/dist/scripts/8410-1f1fd5ccf0-lite.chunk.js +3 -0
- package/dist/scripts/8410-1f1fd5ccf0-lite.chunk.js.map +1 -0
- package/dist/scripts/8705-ecd20ef6cb-lite.chunk.js +2 -0
- package/dist/scripts/8705-ecd20ef6cb-lite.chunk.js.map +1 -0
- package/dist/scripts/8856-4da691f96f-lite.chunk.js +2 -0
- package/dist/scripts/8856-4da691f96f-lite.chunk.js.map +1 -0
- package/dist/scripts/9003-fc8e674468-lite.chunk.js +2 -0
- package/dist/scripts/9003-fc8e674468-lite.chunk.js.map +1 -0
- package/dist/scripts/9042-add0f1c2e2-lite.chunk.js +2 -0
- package/dist/scripts/9042-add0f1c2e2-lite.chunk.js.map +1 -0
- package/dist/scripts/9103-4eec16d73b-lite.chunk.js +2 -0
- package/dist/scripts/9103-4eec16d73b-lite.chunk.js.map +1 -0
- package/dist/scripts/9134-a6a5fc92cf-lite.chunk.js +2 -0
- package/dist/scripts/9134-a6a5fc92cf-lite.chunk.js.map +1 -0
- package/dist/scripts/9266-f0ad8d5cb3-lite.chunk.js +2 -0
- package/dist/scripts/9266-f0ad8d5cb3-lite.chunk.js.map +1 -0
- package/dist/scripts/9620-3746c84350-lite.chunk.js +3 -0
- package/dist/scripts/9620-3746c84350-lite.chunk.js.map +1 -0
- package/dist/scripts/9740-9d50d31b72-lite.chunk.js +2 -0
- package/dist/scripts/9740-9d50d31b72-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-95a6fc2722.min.js → bundle-fc60888464.min.js} +3 -3
- package/dist/scripts/{bundle-95a6fc2722.min.js.map → bundle-fc60888464.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/104-b62a8447f0-lite.chunk.js +0 -2
- package/dist/scripts/104-b62a8447f0-lite.chunk.js.map +0 -1
- package/dist/scripts/107-989ac2dc47-lite.chunk.js +0 -2
- package/dist/scripts/107-989ac2dc47-lite.chunk.js.map +0 -1
- package/dist/scripts/119-e3a8bd94dd-lite.chunk.js +0 -2
- package/dist/scripts/119-e3a8bd94dd-lite.chunk.js.map +0 -1
- package/dist/scripts/1199-a2ac2338d0-lite.chunk.js +0 -2
- package/dist/scripts/1199-a2ac2338d0-lite.chunk.js.map +0 -1
- package/dist/scripts/121-bf7a153eb8-lite.chunk.js +0 -2
- package/dist/scripts/121-bf7a153eb8-lite.chunk.js.map +0 -1
- package/dist/scripts/1221-502395e693-lite.chunk.js.map +0 -1
- package/dist/scripts/1400-43b37bfa8d-lite.chunk.js +0 -2
- package/dist/scripts/1400-43b37bfa8d-lite.chunk.js.map +0 -1
- package/dist/scripts/1610-7f58bb25a9-lite.chunk.js.map +0 -1
- package/dist/scripts/218-297de74688-lite.chunk.js.map +0 -1
- package/dist/scripts/2258-4d0639c9fe-lite.chunk.js +0 -3
- package/dist/scripts/2258-4d0639c9fe-lite.chunk.js.map +0 -1
- package/dist/scripts/2968-c4c0114915-lite.chunk.js.map +0 -1
- package/dist/scripts/3268-faca1bf46e-lite.chunk.js +0 -2
- package/dist/scripts/3836-f2a0c9f713-lite.chunk.js +0 -2
- package/dist/scripts/3837-fe321e8deb-lite.chunk.js +0 -2
- package/dist/scripts/3837-fe321e8deb-lite.chunk.js.map +0 -1
- package/dist/scripts/4025-306e0fbdd5-lite.chunk.js +0 -2
- package/dist/scripts/4025-306e0fbdd5-lite.chunk.js.map +0 -1
- package/dist/scripts/4164-5d3af57b67-lite.chunk.js +0 -2
- package/dist/scripts/4164-5d3af57b67-lite.chunk.js.map +0 -1
- package/dist/scripts/4185-e8e40dab72-lite.chunk.js +0 -2
- package/dist/scripts/4185-e8e40dab72-lite.chunk.js.map +0 -1
- package/dist/scripts/4562-545f04c53f-lite.chunk.js +0 -2
- package/dist/scripts/4562-545f04c53f-lite.chunk.js.map +0 -1
- package/dist/scripts/4598-2b1daca7ae-lite.chunk.js +0 -2
- package/dist/scripts/4722-d96da2a258-lite.chunk.js.map +0 -1
- package/dist/scripts/4948-66ba60c8e3-lite.chunk.js +0 -2
- package/dist/scripts/4948-66ba60c8e3-lite.chunk.js.map +0 -1
- package/dist/scripts/5153-079b4125ae-lite.chunk.js.map +0 -1
- package/dist/scripts/5241-163f5ac64c-lite.chunk.js +0 -3
- package/dist/scripts/5241-163f5ac64c-lite.chunk.js.map +0 -1
- package/dist/scripts/5349-bc0fcb4083-lite.chunk.js +0 -2
- package/dist/scripts/5349-bc0fcb4083-lite.chunk.js.map +0 -1
- package/dist/scripts/6135-a878a9cff0-lite.chunk.js +0 -3
- package/dist/scripts/6135-a878a9cff0-lite.chunk.js.map +0 -1
- package/dist/scripts/6509-23fdb20a4b-lite.chunk.js +0 -2
- package/dist/scripts/6509-23fdb20a4b-lite.chunk.js.map +0 -1
- package/dist/scripts/6790-5086b72662-lite.chunk.js +0 -2
- package/dist/scripts/6790-5086b72662-lite.chunk.js.map +0 -1
- package/dist/scripts/7148-432ab72091-lite.chunk.js +0 -2
- package/dist/scripts/7148-432ab72091-lite.chunk.js.map +0 -1
- package/dist/scripts/7205-2428f775a5-lite.chunk.js +0 -2
- package/dist/scripts/7205-2428f775a5-lite.chunk.js.map +0 -1
- package/dist/scripts/7339-5793c921bb-lite.chunk.js +0 -3
- package/dist/scripts/7339-5793c921bb-lite.chunk.js.map +0 -1
- package/dist/scripts/7438-a5f96e58fc-lite.chunk.js +0 -2
- package/dist/scripts/7438-a5f96e58fc-lite.chunk.js.map +0 -1
- package/dist/scripts/7926-6b040931aa-lite.chunk.js +0 -2
- package/dist/scripts/7926-6b040931aa-lite.chunk.js.map +0 -1
- package/dist/scripts/8536-f75009dd87-lite.chunk.js +0 -2
- package/dist/scripts/8536-f75009dd87-lite.chunk.js.map +0 -1
- package/dist/scripts/8687-549a2d9278-lite.chunk.js +0 -3
- package/dist/scripts/8687-549a2d9278-lite.chunk.js.map +0 -1
- package/dist/scripts/8856-df102acdff-lite.chunk.js +0 -2
- package/dist/scripts/8856-df102acdff-lite.chunk.js.map +0 -1
- package/dist/scripts/9134-42dc2390ce-lite.chunk.js +0 -2
- package/dist/scripts/9134-42dc2390ce-lite.chunk.js.map +0 -1
- package/dist/scripts/9266-c5d6705147-lite.chunk.js +0 -2
- package/dist/scripts/9266-c5d6705147-lite.chunk.js.map +0 -1
- package/dist/scripts/9284-402a14d41c-lite.chunk.js +0 -2
- package/dist/scripts/9284-402a14d41c-lite.chunk.js.map +0 -1
- package/dist/scripts/9470-11c8c2ca71-lite.chunk.js +0 -2
- package/dist/scripts/9470-11c8c2ca71-lite.chunk.js.map +0 -1
- package/dist/scripts/9527-111c8586a7-lite.chunk.js +0 -2
- package/dist/scripts/9527-111c8586a7-lite.chunk.js.map +0 -1
- package/dist/scripts/9528-2b478f4ca8-lite.chunk.js +0 -3
- package/dist/scripts/9528-2b478f4ca8-lite.chunk.js.map +0 -1
- package/dist/scripts/9591-230bcf0935-lite.chunk.js +0 -2
- package/dist/scripts/9591-230bcf0935-lite.chunk.js.map +0 -1
- /package/dist/css/{8687-lite-6787cc731a.chunk.css → 3597-lite-6787cc731a.chunk.css} +0 -0
- /package/dist/css/{5349-lite-829df3b4e7.chunk.css → 6137-lite-829df3b4e7.chunk.css} +0 -0
- /package/dist/css/{9470-lite-edb2d29928.chunk.css → 8010-lite-edb2d29928.chunk.css} +0 -0
- /package/dist/css/{6135-lite-41bdd1c5a3.chunk.css → 8410-lite-41bdd1c5a3.chunk.css} +0 -0
- /package/dist/css/{121-lite-1337d9acf0.chunk.css → 9042-lite-1337d9acf0.chunk.css} +0 -0
- /package/dist/css/{9528-lite-6787cc731a.chunk.css → 9620-lite-6787cc731a.chunk.css} +0 -0
- /package/dist/scripts/{1221-502395e693-lite.chunk.js.LICENSE.txt → 1221-1109d5379d-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2258-4d0639c9fe-lite.chunk.js.LICENSE.txt → 2258-ed7383502f-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4722-d96da2a258-lite.chunk.js.LICENSE.txt → 3597-eaae787997-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5153-079b4125ae-lite.chunk.js.LICENSE.txt → 4203-ee50e89841-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5241-163f5ac64c-lite.chunk.js.LICENSE.txt → 4722-9eb591621a-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6135-a878a9cff0-lite.chunk.js.LICENSE.txt → 5153-cf62a95421-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{7339-5793c921bb-lite.chunk.js.LICENSE.txt → 6756-cfd00009e4-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8687-549a2d9278-lite.chunk.js.LICENSE.txt → 8410-1f1fd5ccf0-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9528-2b478f4ca8-lite.chunk.js.LICENSE.txt → 9620-3746c84350-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-95a6fc2722.min.js.LICENSE.txt → bundle-fc60888464.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/147-44ee7e9a78-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/search/components/search-filters/PartialSearchFilters.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/empty-state/UserManagerSearchEmptyState.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/partial-loading/partial-user-list.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list/partial-loading/PartialUserList.tsx","file:///app/packages/libs/shared/src/components/bulk-selection-summary/bulk-selection-summary.scss","file:///app/packages/libs/shared/src/components/bulk-selection-summary/BulkSelectionSummary.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/JobTitle.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/LastActive.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/UserAuthenticationMethods.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/ManageUsersTable.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/ManageUsersTableUtils.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users-table/manage-users-table.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/select-with-spreadsheet/select-with-spreadsheet.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/select-with-spreadsheet/SelectWithSpreadsheet.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/components/select-with-spreadsheet/select-with-spreadsheet-popup.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/components/select-with-spreadsheet/SelectWithSpreadsheetPopup.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/useManageUsersCheckboxHelper.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/ManageUsers.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/manage-users/useGetActions.tsx","file:///app/packages/libs/shared/src/apps/user-manager/errors/sso-password-reset-email-not-allowed/SsoPasswordResetEmailNotAllowedError.tsx","file:///app/packages/libs/shared/src/utils/CuratorPermissionsHelper.ts","file:///app/packages/libs/shared/src/apps/user-manager/components/user-list-items/components/UserItemActions.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-entries/user-manager-entries.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-entries/UserManagerEntries.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/user-manager-header/UserManagerHeader.tsx","file:///app/packages/libs/shared/src/apps/user-manager/components/warning-alert/warning-alert.scss","file:///app/packages/libs/shared/src/apps/user-manager/components/warning-alert/WarningAlert.tsx","file:///app/packages/libs/shared/src/apps/user-manager/errors/cannot-year-group-rollover/CannotYearGroupRolloverError.ts","file:///app/packages/libs/shared/src/apps/user-manager/hooks/useFetchUserCount.ts","file:///app/packages/libs/shared/src/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel.ts","file:///app/packages/libs/shared/src/apps/user-manager/utils/BulkUserActionsAnalyticsHelper.ts","file:///app/packages/libs/shared/src/components/tags/PartialTagItem.tsx","file:///app/packages/libs/shared/src/components/widgets/items/tag-widget-item/TagWidgetItem.tsx","file:///app/packages/libs/shared/src/enums/SupportArticle.ts","file:///app/packages/libs/shared/src/hooks/useBulkCheckboxManager.ts","file:///app/packages/projects/lite/src/apps/user-manager/constants/SelectWithSpreadsheetTemplate.ts","file:///app/packages/projects/lite/src/apps/user-manager/hooks/useFetchUsers.ts"],"sourcesContent":["import * as React from 'react';\n\nimport styles from './search-filters.scss';\n\ninterface PartialSearchFiltersProps {\n count?: number;\n}\n\nexport function PartialSearchFilters({ count = 6 }: PartialSearchFiltersProps): JSX.Element {\n return (\n <div className='d-flex'>\n <div className='d-flex ps-1'>\n {Array(count).fill(null).map((item, index) => (\n <div key={index} className={`${styles.partialButton} partial-loading-background mx-1`} />\n ))}\n </div>\n </div>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.userManagerSearchEmptyState';\n\ninterface UserManagerSearchEmptyStateProps {\n imageUrl: string;\n}\n\nexport function UserManagerSearchEmptyState(props: UserManagerSearchEmptyStateProps): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} />\n <EmptyState.Heading><Text namespace={namespace} phrase='heading' /></EmptyState.Heading>\n <EmptyState.Info><Text namespace={namespace} phrase='info' /></EmptyState.Info>\n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialEntries\":\"TOmcn\",\"partialCreateUser\":\"Yf4Wx\",\"partialBulkUpload\":\"sp3ux\",\"partialCheckbox\":\"REK11\",\"partialYearGroup\":\"d2NEw\",\"partialName\":\"qmSU8\",\"partialEmail\":\"uHYQO\",\"partialAvatar\":\"Y796I\",\"lastActiveLabel\":\"aItB8\",\"lastActiveDate\":\"RMdcx\",\"partialAction\":\"jn0FO\"};","import React from 'react';\n\nimport styles from './partial-user-list.scss';\n\nfunction PartialUserItem(): JSX.Element {\n return (\n <li className='d-flex align-items-center py-2'>\n <div className={`ms-4 me-3 partial-loading-background ${styles.partialCheckbox}`} />\n\n <div className={`me-2 ms-n1 rounded-circle partial-loading-background ${styles.partialAvatar}`} />\n\n <div className='d-flex flex-column justify-content-center me-auto'>\n <div className='pb-1 d-flex align-items-center'>\n <div>\n <div className={`partial-loading-background align-middle d-inline-block ${styles.partialName}`} />\n </div>\n </div>\n\n <div className={`partial-loading-background me-1 align-middle d-inline-block ${styles.partialEmail}`} />\n </div>\n\n <div className='d-flex ps-1 me-3 d-flex justify-content-end'>\n <div className={`partial-loading-background ${styles.partialYearGroup}`} />\n </div>\n\n <span className='d-flex flex-column me-3'>\n <div className={`partial-loading-background mb-1 ${styles.lastActiveLabel}`} />\n <div className={`partial-loading-background ${styles.lastActiveDate}`} />\n </span>\n\n <div className='d-flex align-items-center'>\n <div className={`partial-loading-background ${styles.partialAction}`} />\n <div className={`partial-loading-background ${styles.partialAction}`} />\n </div>\n </li>\n );\n}\n\nexport function PartialUserList(): JSX.Element {\n return (\n <ul className='m-0 list-unstyled striped-list'>\n {Array(20).fill(null).map((item, index) => <PartialUserItem key={index} />)}\n </ul>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"iconContainer\":\"lUFJg\",\"loadingContainer\":\"b0Mz5\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { UserManagerConstants } from 'libs/shared/apps/user-manager/constants/UserManagerConstants';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\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 { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './bulk-selection-summary.scss';\n\nconst namespace = 'shared.bulkSelectionSummary';\n\ninterface BulkSelectionSummaryProps {\n selectedCount: number;\n onClickDeselectAll: () => void;\n onClickSelectBulk: () => void;\n getTypeText: (count: number) => string;\n \n selectAllCount?: number;\n allSelected?: boolean;\n showSelectingSpinner?: boolean;\n onClickSelectAll?: (success: () => void) => void;\n\n hasRostering?: boolean;\n}\n\nexport function BulkSelectionSummary(props: BulkSelectionSummaryProps): JSX.Element {\n const [ selectAllSpinner, setSelectAllSpinner ] = React.useState(false);\n\n function onClickSelectAll(): void {\n setSelectAllSpinner(true);\n props.onClickSelectAll(() => {\n setSelectAllSpinner(false);\n });\n }\n\n if (!props.selectedCount && !props.showSelectingSpinner)\n return <></>;\n\n const showSelectAll = (\n !!props.onClickSelectAll &&\n !props.allSelected &&\n props.selectAllCount !== 0 &&\n props.selectAllCount > UserManagerConstants.USER_PAGE_LIMIT\n );\n\n return (\n <div className='border border-dark rounded-3 d-flex justify-content-between align-items-center p-2 mb-3'>\n {props.showSelectingSpinner ? (\n <div className={`px-2 d-flex align-items-center ${styles.loadingContainer}`}>\n <Spinner as='div' size='sm' animation='border' role='status' />\n </div>\n ) : (\n <>\n <div className='d-flex align-items-center'>\n <div className={`${styles.iconContainer} text-white rounded-circle bg-dark me-3 ms-2 d-flex justify-content-center align-items-center`}>\n <SvgContainer svgName={cvSvgLibrary.Group} />\n </div>\n\n <Text\n namespace={namespace}\n phrase='selectedCount'\n options={{ smartCount: props.selectedCount, type: props.getTypeText(props.selectedCount) }}\n />\n\n {(() => {\n if (!showSelectAll)\n return <></>;\n\n if (selectAllSpinner || props.selectAllCount === undefined)\n return (\n <div className='px-2 py-1'>\n <Spinner as='div' size='sm' animation='border' role='status' />\n </div>\n );\n\n return (\n <DivButton className='info-link px-2' onClick={onClickSelectAll}>\n <Text\n namespace={namespace}\n phrase='selectAll'\n options={{ smartCount: props.selectAllCount, type: props.getTypeText(props.selectAllCount) }}\n />\n </DivButton>\n );\n })()}\n </div>\n <div className='d-flex'>\n <button className='btn btn-link me-2' onClick={props.onClickDeselectAll}>\n <Text namespace={namespace} phrase='deselectAll' />\n </button>\n <Tooltip\n spanHack\n title={props.hasRostering ? LanguageService.getPhrase(namespace, 'disabled') : ''}\n >\n <button\n className={props.hasRostering ? 'btn btn-outline-dark cursor-default disabled' : 'btn btn-outline-dark'}\n onClick={props.onClickSelectBulk}\n disabled={props.hasRostering}\n >\n <Text namespace={namespace} phrase='selectBulkAction' />\n </button>\n </Tooltip>\n </div>\n </>\n )}\n \n </div>\n );\n}","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { User } from 'libs/shared/interfaces';\n\nconst namespace = 'userManager.userList';\n\ninterface JobTitleProps {\n user: Partial<User>;\n}\n\nexport function JobTitle(props: JobTitleProps): JSX.Element {\n const jobTitle = props.user.userProfile?.metadata?.jobTitle || '-';\n\n return (\n <span className='d-flex flex-column'>\n <small>\n <Text namespace={namespace} phrase='jobTitle' />\n </small>\n <span className={jobTitle === '-' ? 'ms-3' : ''}>\n {jobTitle}\n </span>\n </span>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport styles from './user-item-components.scss';\n\nconst namespace = 'userManager.userList';\n\nfunction isDateValid(date: string, status: ObjectStatus): boolean {\n return !!date && status === ObjectStatus.Active && DateHelper.get(date, 'year') >= 2000;\n}\n\nfunction getLastActiveDate(date: string, status: ObjectStatus): string {\n if (!isDateValid(date, status))\n return '-';\n\n const lastSignedIn = DateHelper.fromNow(date);\n\n if (lastSignedIn === 'a day ago')\n return LanguageService.getPhrase(namespace, 'yesterday');\n\n if (lastSignedIn.includes('hour'))\n return LanguageService.getPhrase(namespace, 'today');\n\n // If the string starts with a char that's not a number, convert it to uppercase. E.g. \"a year ago\"\n if (Number.isNaN(+lastSignedIn.substr(0, 1)))\n return lastSignedIn.substr(0, 1).toUpperCase() + lastSignedIn.substr(1);\n\n return lastSignedIn;\n}\n\ninterface LastActiveProps {\n user: User;\n currentUser?: CurrentUser;\n}\n\nexport function LastActive(props: LastActiveProps): JSX.Element {\n const date = getLastActiveDate(props.user.metadata?.lastSignInTime, props.user.status);\n\n const isCurrentUser = props.user.id.toString() === props.currentUser?.id.toString();\n\n return (\n <span className={`${styles.lastActiveContainer} ${isCurrentUser ? styles.isCurrentUser : ''}`}>\n <span className='d-flex flex-column'>\n <small>\n <Text namespace={namespace} phrase='lastActive' />\n </small>\n <span className={date === '-' ? 'ms-3' : ''}>\n {date}\n </span>\n </span>\n </span>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { User } from 'libs/shared/interfaces';\n\nimport styles from './user-item-components.scss';\n\nconst namespace = 'userManager.userList';\n\ninterface UserAuthenticationMethodsProps {\n user: User;\n}\n\nexport function UserAuthenticationMethods(props: UserAuthenticationMethodsProps): JSX.Element {\n /**\n * Sort the authentication methods so that SSO always appear on top of ClickView\n */\n const sortedAuthMethods = React.useMemo(() => {\n return props.user.authenticationMethods?.sort(method => {\n return method.local ? 1 : -1;\n });\n }, [props.user.authenticationMethods]);\n \n if (!props.user.authenticationMethods?.length)\n return <></>;\n\n const hasSSO = props.user.authenticationMethods?.find(am => !am.local);\n\n return (\n <div className={`${styles.authMethodContainer} d-flex flex-row-reverse justify-content-center ms-n3`}>\n <Tooltip\n title={LanguageService.getPhrase(namespace, hasSSO ? 'ssoTooltip' : 'noSsoTooltip')}\n spanHack\n >\n {sortedAuthMethods.map((authMethod, i) => {\n const backgroundColor = authMethod.backgroundColour ? `#${authMethod.backgroundColour}` : '#fff';\n\n return (\n <div\n key={authMethod.displayName}\n className={`${styles.authMethodLogo} rounded-circle border`}\n style={{\n zIndex: props.user.authenticationMethods.length - i,\n backgroundImage: `url(${authMethod.logoUrl})`,\n backgroundColor\n }}\n />\n );\n })}\n </Tooltip>\n </div>\n );\n}","import React from 'react';\n\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { Table, TableTheme } from 'libs/shared/components/table/Table';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { getColumns, useGetData } from './ManageUsersTableUtils';\n\nconst TABLE_THEME: TableTheme = {\n table: 'striped-list no-full-width pb-3',\n row: 'striped-row rounded',\n cell: 'd-flex align-items-center py-2'\n};\n\ninterface ManageUsersTableProps {\n users: User[];\n currentUser: CurrentUser;\n isChecked: (id: string) => boolean;\n onToggleCheckbox: (id: string) => void;\n imageCdnUrl: string;\n appLinks: UserManagerAppLinks;\n products?: ProductId[];\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n shouldDisplayAuthenticationMethods: boolean;\n ssoHelpArticle?: string;\n hasRostering?: boolean;\n}\n\nexport const ManageUsersTable = React.memo(function (props: ManageUsersTableProps): JSX.Element {\n const client = React.useContext<UserManagerClient>(UserManagerClientContext);\n const data = useGetData(props.users, props.isChecked);\n\n const columns = getColumns(\n props.onToggleCheckbox,\n props.imageCdnUrl,\n props.currentUser,\n props.appLinks,\n props.products,\n props.onClickResendActivationEmail,\n props.onClickSendResetEmail,\n props.onClickSendVerificationEmail,\n props.shouldDisplayAuthenticationMethods,\n props.ssoHelpArticle,\n props.hasRostering,\n client\n );\n\n return (\n <Table\n columns={columns}\n data={data}\n theme={TABLE_THEME}\n />\n );\n});","import React from 'react';\nimport { CellProps, Column } from 'react-table';\n\nimport { JobTitle } from 'libs/shared/apps/user-manager/components/user-list-items/components/JobTitle';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { IconCircle } from 'libs/shared/components/icon-circle/IconCircle';\nimport { SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { UserManagerAppLinks } from '../../interfaces';\nimport { BasicUserDetails } from '../user-list-items/components/BasicUserDetails';\nimport { LastActive } from '../user-list-items/components/LastActive';\nimport { RoleOrYearGroup } from '../user-list-items/components/RoleOrYearGroup';\nimport { UserAuthenticationMethods } from '../user-list-items/components/UserAuthenticationMethods';\nimport { UserItemActions } from '../user-list-items/components/UserItemActions';\nimport { UserItemAvatar } from '../user-list-items/components/UserItemAvatar';\n\nimport styles from './manage-users-table.scss';\n\ninterface ManageUsersTableData {\n user: User;\n checked: boolean;\n}\n\nexport function getColumns(\n onToggleCheckbox: (id: string) => void,\n imageCdnUrl: string,\n currentUser: CurrentUser,\n appLinks: UserManagerAppLinks,\n products: ProductId[],\n onClickResendActivationEmail?: (user: User) => void,\n onClickSendResetEmail?: (user: User) => void,\n onClickSendVerificationEmail?: (user: User) => void,\n shouldDisplayAuthenticationMethods?: boolean,\n ssoHelpArticle?: string,\n hasRostering?: boolean,\n client?: UserManagerClient\n): Column<ManageUsersTableData>[] {\n const columns: Column<ManageUsersTableData>[] = [\n {\n id: 'checkboxes',\n accessor: (data: ManageUsersTableData) => ({ id: data.user.id, checked: data.checked }),\n Cell: (cell: CellProps<ManageUsersTableData, { id: string; checked: boolean; }>) => React.useMemo(() => (\n <div className='w-100 text-center ms-3 ps-2'>\n <Checkbox\n id={cell.value.id}\n checked={cell.value.checked}\n onChange={() => onToggleCheckbox(cell.value.id)}\n />\n </div>\n ), []),\n width: 5\n },\n {\n accessor: 'user',\n id: 'avatar',\n Cell: ({ value }) => React.useMemo(\n () => {\n return (\n value.name ? (\n <div className='w-100'>\n <UserItemAvatar user={value} imageCdnUrl={imageCdnUrl} />\n </div>\n ) : (\n <div className={`${styles.avatarContainer} mx-2`}>\n <IconCircle\n svgName={cvSvgLibrary.User}\n variant='blue'\n svgSize={SvgContainerSize.ExtraLarge}\n svgWrapperClassName='p-1'\n />\n </div>\n ));\n }\n , []\n ),\n width: 5\n },\n {\n accessor: 'user',\n id: 'basicDetails',\n Cell: ({ value }) => React.useMemo(() => {\n return (\n <div className='w-100'>\n <BasicUserDetails user={value} currentUser={currentUser} />\n </div>\n );\n }, []),\n width: 50\n },\n {\n accessor: 'user',\n id: 'roleOrYearGroup',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100 text-end'>\n <RoleOrYearGroup userType={value.userType} user={value} />\n </div>\n ), []),\n width: 11\n }\n ];\n\n if (client === UserManagerClient.Curator) {\n columns.push({\n accessor: 'user',\n id: 'jobTitle',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <JobTitle user={value} />\n </div>\n ), []),\n width: 8\n });\n }\n\n columns.push({\n accessor: 'user',\n id: 'lastActive',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <LastActive user={value} currentUser={currentUser} />\n </div>\n ), []),\n width: 8\n });\n \n if (shouldDisplayAuthenticationMethods) {\n columns.push({\n accessor: 'user',\n id: 'authMethods',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100 d-flex justify-content-center'>\n <UserAuthenticationMethods user={value} />\n </div>\n ), []),\n width: 6\n });\n }\n\n columns.push({\n accessor: 'user',\n id: 'actions',\n Cell: ({ value }) => React.useMemo(() => (\n <div className='w-100'>\n <UserItemActions\n user={value}\n userType={value.userType}\n appLinks={appLinks}\n onClickSendResetEmail={onClickSendResetEmail}\n onClickResendActivationEmail={onClickResendActivationEmail}\n onClickSendVerificationEmail={onClickSendVerificationEmail}\n currentUser={currentUser}\n ssoHelpArticle={ssoHelpArticle}\n products={products}\n hasRostering={hasRostering}\n />\n </div>\n ), []),\n width: 8\n });\n\n return columns;\n}\n\nexport function useGetData(users: User[], isChecked: (id: string) => boolean): ManageUsersTableData[] {\n return users.map(user => {\n return {\n user,\n checked: isChecked(user.id),\n isCurrentUser: false\n };\n });\n}","// extracted by mini-css-extract-plugin\nexport default {\"avatarContainer\":\"kq2Bn\"};","// extracted by mini-css-extract-plugin\nexport default {\"cell\":\"Vsgxg\"};","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { BulkUploadFileSelect } from 'libs/shared/apps/user-manager/components/bulk-upload/bulk-upload-file-select/BulkUploadFileSelect';\nimport { InvalidSpreadsheetError } from 'libs/shared/apps/user-manager/errors/invalid-spreadsheet/InvalidSpreadsheetError';\nimport { BulkUserUploadHelper } from 'libs/shared/apps/user-manager/utils/BulkUserUploadHelper';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './select-with-spreadsheet.scss';\n\nconst namespaces = {\n [UserGroup.Learner]: 'userManager.selectStudentWithSpreadsheet',\n [UserGroup.Staff]: 'userManager.selectStaffWithSpreadsheet',\n [UserGroup.Unknown]: ''\n};\n\ninterface SelectWithSpreadsheetProps {\n onSelectSpreadsheet: (userQuery: string[], spreadsheetRowCount: number) => void;\n onClickCancel: () => void;\n userType: UserGroup;\n templateLink: string;\n}\n\nexport function SelectWithSpreadsheet(props: SelectWithSpreadsheetProps): JSX.Element {\n const namespace = namespaces[props.userType];\n\n function onSelectSpreadsheet(data: string[][]): void {\n const isEmpty = BulkUserUploadHelper.validateEmptySpreadsheetData(data);\n if (isEmpty) {\n props.onClickCancel();\n return;\n }\n\n const clone = [...data];\n const headings = clone.shift();\n\n const { isValid, errorMessage } = BulkUserUploadHelper.validateSelectWithSpreadsheet(\n headings,\n [ 'Email', 'Username' ]\n );\n\n if (!isValid) {\n Core.ErrorHelper.throw(new InvalidSpreadsheetError(errorMessage));\n props.onClickCancel();\n return;\n }\n\n const requests = BulkUserUploadHelper.buildUserQueryFromSpreadsheet(headings, clone, props.userType);\n\n props.onSelectSpreadsheet(requests, data.length);\n }\n\n const ExampleSpreadSheet = () => {\n return (\n <LanguageNamespaceContext.Provider value={namespaces[props.userType]}>\n <table cellPadding={5}>\n <tbody>\n\n <tr className='text-center bg-light'>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='a' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='b' /></td>\n </tr>\n\n <tr className='fw-semibold'>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='email' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='username' /></td>\n </tr>\n\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='exampleEmail' /></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n </tr>\n <tr>\n <td className={`text-nowrap border border-dark ${styles.cell}`}></td>\n <td className={`text-nowrap border border-dark ${styles.cell}`}><Text phrase='exampleUsername' /></td>\n </tr>\n </tbody>\n </table>\n </LanguageNamespaceContext.Provider>\n );\n };\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n {/* Step 1 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='downloadTemplateHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='downloadTemplateInfo' /></p>\n <div className='ms-n1 ps-3'>\n <a className='btn btn-outline-dark mx-auto' download href={props.templateLink}>\n <SvgContainer svgName={cvSvgLibrary.Download} className='svg-container std me-1 ms-n1 align-middle' />\n <div className='align-middle d-inline-block'><Text phrase='downloadBtn' /></div>\n </a>\n </div>\n </div>\n\n {/* Step 2 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='addUsersHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='addUsersInfo' /></p>\n <div className='mx-n1 px-3'>\n <ExampleSpreadSheet/>\n </div>\n </div>\n\n {/* Step 3 */}\n <div className='pb-3'>\n <div className='h6'><Text phrase='uploadHeading' /></div>\n <div className='d-inline-block ms-n1 ps-3 mt-1'>\n <div className='d-inline-block'>\n <BulkUploadFileSelect onSelectSpreadsheet={onSelectSpreadsheet} />\n </div>\n </div>\n </div>\n\n {/* Step 4 */}\n <div>\n <div className='h6'><Text phrase='matchesHeading' /></div>\n <p className='ms-n1 ps-3'><Text phrase='matchesInfo' /></p>\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"modalWidth\":\"KYu7Y\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, OperationDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { useManageUsersCheckboxHelper } from 'libs/shared/apps/user-manager/components/manage-users/useManageUsersCheckboxHelper';\nimport { SelectWithSpreadsheet } from 'libs/shared/apps/user-manager/components/select-with-spreadsheet/SelectWithSpreadsheet';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { User } from 'libs/shared/interfaces';\n\nimport styles from './select-with-spreadsheet-popup.scss';\n\nconst namespaces = 'userManager.selectWithSpreadsheetPopup';\n\ntype ICheckboxHelper = ReturnType<typeof useManageUsersCheckboxHelper>\n\ntype SelectWithSpreadsheetPopupProps = {\n userType: UserGroup;\n users: User[];\n template: string;\n closePopup: () => void;\n checkboxHelper: ICheckboxHelper;\n setShowSelectingSpinner: (arg: boolean) => void;\n userRequest: (query: string) => Flight.Request;\n};\n\nexport function SelectWithSpreadsheetPopup(props: SelectWithSpreadsheetPopupProps): JSX.Element {\n const CheckboxHelper = props.checkboxHelper;\n const fetchAsync = Flight.useGetFetchAsync();\n let ids: string[] = [];\n\n function onSelectSpreadsheet(queries: string[], spreadsheetRowCount: number) {\n props.setShowSelectingSpinner(true);\n\n const requests = queries.map(q => {\n return fetchAsync<string[]>(props.userRequest(q));\n });\n\n Promise.all(requests).then(res => {\n res.forEach(r => {\n ids = ids.concat(r);\n });\n\n CheckboxHelper.selectAll(ids.map(id => id.toString()));\n\n AnalyticsHelper.logUserAction({\n userType: props.userType,\n spreadsheetRowCount: spreadsheetRowCount,\n totalUsersFound: ids.length\n }, {\n workflowPhase: WorkflowPhase.Complete,\n actionType: UserAction.Select,\n entity: EntityType.User,\n descriptor: OperationDescriptor.Bulk,\n location: LocationContext.Popup\n });\n\n props.setShowSelectingSpinner(false);\n });\n\n props.closePopup();\n }\n\n const dataLoaded = props.users.length;\n\n return (\n <Popup\n closePopup={props.closePopup}\n title={LanguageService.getPhrase(namespaces, 'heading')}\n showLoadingSpinner={!dataLoaded}\n dialogClassName={styles.modalWidth}\n >\n {dataLoaded && (\n <SelectWithSpreadsheet\n userType={props.userType}\n onSelectSpreadsheet={onSelectSpreadsheet}\n onClickCancel={props.closePopup}\n templateLink={props.template}\n />\n )}\n </Popup>\n );\n}","import React from 'react';\n\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { BulkCheckboxManagerOptions, useBulkCheckboxManager } from 'libs/shared/hooks/useBulkCheckboxManager';\nimport { User } from 'libs/shared/interfaces';\n\ntype UsedParamNames = keyof Omit<UserManagerQueryParams, 'cursor' | 'sort'>;\n\ninterface ManagerUsersCheckboxHelper extends BulkCheckboxManagerOptions {\n queryParams: UserManagerQueryParams;\n}\n\n/**\n * Used by ManageUsers to determine if we should show the \"Select all X users\"\n * button or not, based on which filters we've previously selected all on\n */\nexport const useManageUsersCheckboxHelper = (\n users: User[],\n options: ManagerUsersCheckboxHelper\n) => {\n const CheckboxHelper = useBulkCheckboxManager(users, options);\n\n const [ bulkSelections, setBulkSelections ] = React.useState<any>({});\n\n function getSelectionKey(): string {\n // Need to disable linting complaining about our params\n // eslint-disable-next-line\n const { cursor, sort, ...queryParams } = options.queryParams;\n return Object.keys(queryParams)\n .sort()\n .map((key: UsedParamNames) => {\n const param = queryParams[key];\n return Array.isArray(param) ?\n param.sort().join(',') :\n param;\n })\n .join(':');\n }\n\n function selectAll(userIds: string[]): void {\n CheckboxHelper.setSelected(userIds);\n\n setBulkSelections({\n ...bulkSelections,\n [getSelectionKey()]: true\n });\n }\n\n function onToggleItem(id: string): void {\n if (CheckboxHelper.isChecked(id))\n setBulkSelections({});\n\n CheckboxHelper.onToggleItem(id);\n }\n\n function onToggleBulk(): void {\n if (CheckboxHelper.bulkChecked)\n setBulkSelections({});\n\n if (!users?.length)\n return;\n\n CheckboxHelper.onToggleBulk();\n }\n\n function reset(): void {\n setBulkSelections({});\n CheckboxHelper.reset();\n }\n\n function allSelected(): boolean {\n if (!Object.keys(bulkSelections).length)\n return false;\n\n /**\n * This will be our selection key if they click select all\n * with no filters or queries\n */\n if (bulkSelections[''])\n return true;\n\n return bulkSelections[getSelectionKey()];\n }\n\n return {\n ...CheckboxHelper,\n selectAll,\n onToggleItem,\n onToggleBulk,\n reset,\n allSelected: allSelected()\n };\n};","import * as React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { ClickDescriptor, EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ScopedSearchBar } from 'libs/shared/apps/search/components/scoped-search-bar/ScopedSearchBar';\nimport { PartialSearchFilters } from 'libs/shared/apps/search/components/search-filters/PartialSearchFilters';\nimport { SearchFilters } from 'libs/shared/apps/search/components/search-filters/SearchFilters';\nimport { UserManagerSearchEmptyState } from 'libs/shared/apps/user-manager/components/user-list/empty-state/UserManagerSearchEmptyState';\nimport { PartialUserList } from 'libs/shared/apps/user-manager/components/user-list/partial-loading/PartialUserList';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces/UserManagerAppLinks';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { YearGroupRolloverStatus } from 'libs/shared/apps/user-manager/interfaces/YearGroupRolloverStatus';\nimport { BulkUserActionsHelper } from 'libs/shared/apps/user-manager/utils/BulkUserActionsHelper';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { ActionsDropdown } from 'libs/shared/components/actions/ActionsDropdown';\nimport { BulkSelectionSummary } from 'libs/shared/components/bulk-selection-summary/BulkSelectionSummary';\nimport { Checkbox } from 'libs/shared/components/forms/form-checkbox/Checkbox';\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { RosteringAlert } from 'libs/shared/components/rostering/rostering-alert/RosteringAlert';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { Config, CurrentUser, User, YearGroup } from 'libs/shared/interfaces';\n\nimport { ManageUsersTable } from '../manage-users-table/ManageUsersTable';\n\nimport { SelectWithSpreadsheetPopup } from './components/select-with-spreadsheet/SelectWithSpreadsheetPopup';\nimport { useGetActions } from './useGetActions';\nimport { useManageUsersCheckboxHelper } from './useManageUsersCheckboxHelper';\n\nconst namespace = 'userManager.manageUsers';\n\nconst subNamespaces = {\n [UserGroup.Learner]: 'userManager.manageStudents',\n [UserGroup.Staff]: 'userManager.manageStaff',\n [UserGroup.Unknown]: ''\n};\n\ninterface ManageUsersListProps {\n users: User[];\n userType: UserGroup;\n config: Config;\n currentUser: CurrentUser;\n searchEmptyState: string;\n appLinks: UserManagerAppLinks;\n totalUsers: number;\n queryParams: UserManagerQueryParams;\n hasSso: boolean;\n hasRostering?: boolean;\n searchInputSize?: FormSize;\n onClickResendActivationEmail?: (user: User) => void;\n fetchUserIds: (success: (userIds: string[]) => void) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n ssoHelpArticle?: string;\n selectWithSpreadsheetTemplate: string;\n userRequest: (query: string, success?: (ids: string[]) => void) => Flight.Request;\n products?: ProductId[];\n}\n\ntype StudentProps = ManageUsersListProps & {\n userType: UserGroup.Learner;\n yearGroups: YearGroup[];\n yearGroupRolloverStatus?: YearGroupRolloverStatus;\n}\n\ntype StaffProps = ManageUsersListProps & {\n userType: UserGroup.Staff;\n yearGroups?: never;\n};\n\nexport function ManageUsers(props: StudentProps | StaffProps): JSX.Element {\n const analyticsLocation = LocationContext[props.userType === UserGroup.Learner ? 'StudentManager' : 'StaffManager'];\n const subNamespace = subNamespaces[props.userType];\n\n const locationContext = props.userType === UserGroup.Learner\n ? LocationContext.StudentManager\n : LocationContext.StaffManager;\n\n const [ viewModel, setBulkActionViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const [ isSelectingWithSpreadsheet, setIsSelectingWithSpreadsheet ] = React.useState<boolean>(false);\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const CheckboxHelper = useManageUsersCheckboxHelper(props.users, {\n persistNamespace: `manage:users:${props.userType}`,\n initialState: viewModel?.userIdMap,\n queryParams: props.queryParams\n });\n\n const extraActions = useGetActions({\n ...props,\n onSelectWithSpreadsheetSelect: () => setIsSelectingWithSpreadsheet(true),\n namespace: subNamespace,\n yearGroups: props.userType === UserGroup.Learner ? props.yearGroups : []\n });\n\n /**\n * We use this to unset our userIdMap when the user is leaving user manager.\n * When the user is going to bulk actions, we set clearOnExit to false\n * so that this hook cleanup doesn't unset our userIdMap.\n */\n const clearOnExit = React.useRef(true);\n React.useEffect(() => {\n return () => {\n if (clearOnExit.current)\n setBulkActionViewModel('userIdMap', undefined);\n };\n }, []);\n\n React.useEffect(() => {\n if (!CheckboxHelper.bulkChecked)\n return;\n\n if (props.totalUsers !== CheckboxHelper.getSelectedCount())\n return;\n\n setBulkActionViewModel('allUsersSelected', true);\n setBulkActionViewModel('allUsersCount', props.totalUsers);\n }, [CheckboxHelper.bulkChecked]);\n\n function onClickSelectBulkAction(): void {\n if (!CheckboxHelper.getSelectedCount())\n return;\n\n AnalyticsHelper.logUserAction({\n userCount: CheckboxHelper.getSelectedCount()\n }, {\n location: locationContext,\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start\n });\n\n clearOnExit.current = false;\n setBulkActionViewModel('userIdMap', CheckboxHelper.getMap());\n Core.AppLinkHelper.trigger(props.appLinks.bulkActionsReviewAccounts);\n }\n \n function onToggleSelectAll(success: () => void): void {\n AnalyticsHelper.logUserAction({\n userCount: CheckboxHelper.getSelectedCount()\n }, {\n location: locationContext,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.SelectAllUsers,\n entity: EntityType.User\n });\n\n props.fetchUserIds(userIds => {\n CheckboxHelper.selectAll(userIds);\n\n /**\n * Used for determining if the user can use year level rollover\n */\n const allUsersSelected = !BulkUserActionsHelper.hasFilterOrQuery(props.queryParams);\n setBulkActionViewModel('allUsersSelected', allUsersSelected);\n\n if (allUsersSelected)\n setBulkActionViewModel('allUsersCount', userIds.length);\n\n success();\n });\n }\n\n function unsetAllUsersSelected(): void {\n setBulkActionViewModel('allUsersSelected', false);\n setBulkActionViewModel('allUsersCount', undefined);\n }\n\n function onToggleBulk(): void {\n if (CheckboxHelper.bulkChecked)\n unsetAllUsersSelected();\n CheckboxHelper.onToggleBulk();\n }\n\n function onToggleItem(id: string): void {\n if (CheckboxHelper.isChecked(id))\n unsetAllUsersSelected();\n CheckboxHelper.onToggleItem(id);\n }\n\n function onClickDeselectAll(): void {\n unsetAllUsersSelected();\n CheckboxHelper.reset();\n }\n\n const mainFilters = React.useMemo(() => {\n return UserManagerHelper.getFilters(\n props.userType,\n props.userType === UserGroup.Learner ? props.yearGroups : []\n );\n }, [props.yearGroups?.length]);\n\n const showFiltersPartialLoading = (\n !props.currentUser?.id ||\n (props.userType === UserGroup.Learner && !props.yearGroups?.length)\n );\n\n return (\n <>\n {props.hasRostering && (\n <RosteringAlert />\n )}\n <div className='d-flex align-items-center pb-3'>\n <div className='ps-4 pe-1'>\n <Checkbox\n id='user-manager'\n name='user-manager'\n checked={CheckboxHelper.bulkChecked}\n onChange={onToggleBulk}\n indeterminate={CheckboxHelper.hasSomeSelections()}\n />\n </div>\n <div className='me-auto'>\n {!showFiltersPartialLoading ? (\n <SearchFilters\n queryParams={props.queryParams}\n mainFilters={mainFilters}\n appLink={props.appLinks.userManager}\n analyticsOptions={{\n entity: EntityType.User,\n location: analyticsLocation\n }}\n hideHeading\n hideDivider\n constantIndices={['user']}\n />\n ) : (\n <PartialSearchFilters count={3} />\n )}\n </div>\n\n <div className='w-25'>\n <ScopedSearchBar\n id={`user-manager-search-${props.userType}`}\n name={`user-manager-search-${props.userType}`}\n placeholder={LanguageService.getPhrase(namespace, 'searchBarPlaceholder')}\n searchAppLink={props.appLinks.search}\n size={props.searchInputSize}\n searchIndices={['user']}\n analyticsOptions={{ entity: EntityType.User, location: analyticsLocation }}\n />\n </div>\n <ActionsDropdown\n actions={extraActions}\n dropdownToggleClassName='btn btn-outline-dark ms-2'\n />\n </div>\n\n <BulkSelectionSummary\n getTypeText={count => LanguageService.getPhrase(subNamespace, 'bulkSelectLabel', { smartCount: count })}\n selectedCount={CheckboxHelper.getSelectedCount()}\n onClickSelectAll={onToggleSelectAll}\n selectAllCount={props.totalUsers}\n onClickDeselectAll={onClickDeselectAll}\n onClickSelectBulk={onClickSelectBulkAction}\n allSelected={CheckboxHelper.allSelected}\n showSelectingSpinner={showSpinner}\n hasRostering={props.hasRostering}\n />\n\n {(() => {\n if (!props.users)\n return <PartialUserList />;\n \n if (!props.users.length)\n return <UserManagerSearchEmptyState imageUrl={props.searchEmptyState} />;\n\n return (\n <ManageUsersTable\n users={props.users}\n currentUser={props.currentUser}\n imageCdnUrl={props.config.imageCdnUrl}\n appLinks={props.appLinks}\n onClickResendActivationEmail={props.onClickResendActivationEmail}\n onClickSendResetEmail={props.onClickSendResetEmail}\n onClickSendVerificationEmail={props.onClickSendVerificationEmail}\n isChecked={CheckboxHelper.isChecked}\n onToggleCheckbox={onToggleItem}\n ssoHelpArticle={props.ssoHelpArticle}\n shouldDisplayAuthenticationMethods={props.hasSso}\n products={props.products}\n hasRostering={props.hasRostering}\n />\n );\n })()}\n\n {isSelectingWithSpreadsheet && (\n <SelectWithSpreadsheetPopup\n users={props.users}\n template={props.selectWithSpreadsheetTemplate}\n userType={props.userType}\n checkboxHelper={CheckboxHelper}\n closePopup={() => {\n setIsSelectingWithSpreadsheet(false);\n }}\n setShowSelectingSpinner={setShowSpinner}\n userRequest={props.userRequest}\n />\n )}\n </>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { EntityType, LocationContext, OperationDescriptor, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { CannotYearGroupRolloverError } from 'libs/shared/apps/user-manager/errors/cannot-year-group-rollover/CannotYearGroupRolloverError';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkUserActionsViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkUserActionsViewModel';\nimport { YearGroupRolloverStatus } from 'libs/shared/apps/user-manager/interfaces/YearGroupRolloverStatus';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { YearGroup } from 'libs/shared/interfaces';\n\nimport { UserManagerConstants } from '../../constants/UserManagerConstants';\nimport { BulkUserActionsAnalyticsHelper } from '../../utils/BulkUserActionsAnalyticsHelper';\n\ntype UserGetActionProps = {\n userType: UserGroup;\n namespace: string;\n appLinks: UserManagerAppLinks;\n yearGroupRolloverStatus?: YearGroupRolloverStatus;\n onSelectWithSpreadsheetSelect: () => void;\n hasRostering?: boolean;\n yearGroups: YearGroup[];\n};\n\nexport function useGetActions(props: UserGetActionProps): ActionOptions[] {\n const [ , setWizardViewModel ] = useViewModel<BulkUserActionsViewModel>(\n SharedViewModelKeys.BULK_USER_ACTIONS\n );\n\n const analyticsLocation = LocationContext[props.userType === UserGroup.Learner ? 'StudentManager' : 'StaffManager'];\n\n const actions: ActionOptions[] = [{\n label: LanguageService.getPhrase(props.namespace, 'export'),\n appLink: props.appLinks.exportUserList,\n analyticsOptions: {\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Export,\n entity: EntityType.User,\n location: analyticsLocation\n },\n analyticsData: {\n userType: props.userType\n }\n }];\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'auditLog'),\n appLink: props.appLinks.auditLog,\n onClick: () => {\n LocalStorageHelper.set(UserManagerConstants.AUDIT_LOG_REFERRER_KEY, props.userType);\n }\n });\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'selectWithSpreadsheet'),\n onClick: props.onSelectWithSpreadsheetSelect,\n analyticsOptions: {\n workflowPhase: WorkflowPhase.Start,\n actionType: UserAction.Select,\n entity: EntityType.User,\n descriptor: OperationDescriptor.Bulk,\n location: analyticsLocation\n },\n analyticsData: {\n userType: props.userType\n }\n });\n\n if (props.userType === UserGroup.Learner && props.yearGroupRolloverStatus && props.yearGroups?.length > 1) {\n const canRollover = !!props.yearGroupRolloverStatus?.canRollover && !props.hasRostering;\n\n actions.push({\n label: LanguageService.getPhrase(props.namespace, 'rollover'),\n appLink: canRollover && !props.hasRostering && props.appLinks.bulkActionsActionDetails.yearGroupRollover,\n disabled: !!props.hasRostering,\n className: props.hasRostering ? 'cursor-default disabled' : '',\n tooltip: props.hasRostering ? LanguageService.getPhrase(props.namespace, 'editControlledByRostering') : '',\n onClick: () => {\n if (canRollover) {\n setWizardViewModel({\n action: 'yearGroupRollover',\n subAction: 'yearGroupRollover'\n });\n\n const locationContext = props.userType === UserGroup.Learner\n ? LocationContext.StudentManager\n : LocationContext.StaffManager;\n\n BulkUserActionsAnalyticsHelper.logYearGroupRolloverEntry(locationContext);\n return;\n }\n\n const error = new CannotYearGroupRolloverError(\n props.yearGroupRolloverStatus?.previousRolloverDate\n );\n\n Core.ErrorHelper.throw(error);\n }\n });\n }\n\n return actions;\n}\n","import React from 'react';\n\nimport { WarningAlert } from 'libs/shared/apps/user-manager/components/warning-alert/WarningAlert';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'userManager.ssoPasswordResetEmailNotAllowedError';\n\ninterface SsoPasswordResetEmailNotAllowedErrorProps {\n helpArticle: string;\n}\n\nexport function SsoPasswordResetEmailNotAllowedError(props: SsoPasswordResetEmailNotAllowedErrorProps): JSX.Element {\n return (\n <WarningAlert>\n <p className='mb-1 fw-semibold'>\n <Text namespace={namespace} phrase='warning' />\n </p>\n {props.helpArticle && (\n <a href={props.helpArticle} target='_blank' className='info-link'>\n <Text namespace={namespace} phrase='findMore' />\n </a>\n )}\n </WarningAlert>\n );\n}","import { CuratorGroup } from 'libs/shared/enums/CuratorGroup';\nimport { CuratorUser } from 'libs/shared/interfaces';\n\nfunction getGroupNames(user: CuratorUser): string[] {\n return (user && user.groups) ? user.groups.map(g => g.name) : [];\n}\n \nexport const CuratorPermissionsHelper = {\n isDev(user: CuratorUser): boolean {\n return getGroupNames(user).includes(CuratorGroup.Developer);\n },\n\n hasSubjectsAccess(user: CuratorUser): boolean {\n const allowedGroups = [\n CuratorGroup.Developer,\n CuratorGroup.Content,\n CuratorGroup.Curator,\n CuratorGroup.StreamableCurator\n ];\n\n return allowedGroups.some(group => getGroupNames(user).includes(group));\n }\n};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions, ClickDescriptor, EmailDescriptor, EntityType, LocationContext, OperationDescriptor, ToggleDescriptor, UserAction, VerifyEmailDescriptor, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { SsoPasswordResetEmailNotAllowedError } from 'libs/shared/apps/user-manager/errors/sso-password-reset-email-not-allowed/SsoPasswordResetEmailNotAllowedError';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { BulkRemoveUsersViewModel } from 'libs/shared/apps/user-manager/interfaces/viewmodels/BulkRemoveUsersViewModel';\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { SharedViewModelKeys } from 'libs/shared/constants/SharedViewModelKeys';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { CuratorUser, CurrentUser, User } from 'libs/shared/interfaces';\nimport { CuratorPermissionsHelper } from 'libs/shared/utils/CuratorPermissionsHelper';\nimport { DialogHelper } from 'libs/shared/utils/DialogHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.userList');\n\nfunction useGetActions(props: UserItemActionsProps): ActionOptions[] {\n const client = React.useContext(UserManagerClientContext);\n\n const hasStatus = (status: ObjectStatus) => status === props.user.status;\n\n const hasVerifiedEmail = props.user.metadata?.isEmailVerified;\n\n // eslint-disable-next-line\n const isCurrentUser = props.user.id == props.currentUser?.id;\n\n const [ , setBulkRemoveUsers ] = useViewModel<BulkRemoveUsersViewModel>(SharedViewModelKeys.BULK_REMOVE_USERS);\n\n function logAnalytics(actionOptions: AnalyticsOptions): void {\n AnalyticsHelper.logUserAction({ id: props.user.id }, AnalyticsHelper.mergeOptions({\n entity: EntityType.User,\n workflowPhase: WorkflowPhase.Start,\n location: LocationContext[props.userType === UserGroup.Learner ? 'StaffManagerListItem' : 'StudentManagerListItem']\n }, actionOptions));\n }\n\n const actions: ActionOptions[] = [];\n \n if (!props.isEditUserForm) {\n function getTooltip(): string {\n if (props.hasRostering)\n return getPhrase('editControlledByRostering');\n\n if (hasStatus(ObjectStatus.Disabled))\n return getPhrase('editUserDisabled');\n\n if (hasStatus(ObjectStatus.Inactive) && client !== UserManagerClient.Curator)\n return getPhrase('editUserPending');\n\n return getPhrase('editUser');\n }\n\n function canEdit(): boolean {\n if (props.hasRostering)\n return false;\n\n if (hasStatus(ObjectStatus.Active))\n return true;\n\n if (hasStatus(ObjectStatus.Inactive) && client === UserManagerClient.Curator)\n return true;\n\n return false;\n }\n\n actions.push({\n order: 0,\n onClick: () => {\n if (!canEdit())\n return;\n \n logAnalytics({ actionType: UserAction.Edit });\n \n const appLink = {\n ...props.appLinks.editUser,\n args: [ ...(props.appLinks.editUser.args ?? []), props.user.id ]\n };\n \n Core.AppLinkHelper.trigger(appLink);\n },\n svgName: cvSvgLibrary.Edit,\n className: `btn btn-link svg-container ${!canEdit() ? 'disabled' : ''}`,\n tooltip: getTooltip(),\n button: true\n });\n }\n\n if (props.user.email && hasStatus(ObjectStatus.Inactive) && props.onClickResendActivationEmail) {\n actions.push({\n order: 5,\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n label: getPhrase('resendActivationEmail'),\n onClick: () => {\n logAnalytics({\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.ActivateUser\n });\n props.onClickResendActivationEmail(props.user);\n },\n className: props.hasRostering ? 'cursor-default disabled' : 'btn btn-link'\n });\n }\n\n if (\n props.user.email &&\n hasStatus(ObjectStatus.Active) &&\n !hasVerifiedEmail\n ) {\n actions.push({\n order: 5,\n label: getPhrase('sendVerificationEmail'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n onClick: () => {\n logAnalytics({\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.VerifyEmail\n });\n props.onClickSendVerificationEmail(props.user);\n },\n className: props.hasRostering ? 'cursor-default disabled' : 'btn btn-link'\n });\n }\n\n if (!isCurrentUser) {\n if (hasVerifiedEmail && hasStatus(ObjectStatus.Active) && props.onClickSendResetEmail) {\n actions.push({\n order: 5,\n label: getPhrase('sendResetEmail'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n onClick: () => {\n if (UserHelper.hasSso(props.user)) {\n DialogHelper.render(\n <SsoPasswordResetEmailNotAllowedError helpArticle={props.ssoHelpArticle} />,\n {\n title: getPhrase('sendResetEmail'),\n cancelButtonProps: {\n text: getPhrase('close'),\n variant: 'dark'\n }\n }\n );\n return;\n }\n\n logAnalytics({\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.ResetPasswordEmail\n });\n props.onClickSendResetEmail(props.user);\n },\n className: props.hasRostering ? 'cursor-default disabled' : 'btn btn-link'\n });\n }\n\n if (!hasStatus(ObjectStatus.Inactive)) {\n actions.push({\n order: 10,\n label: getPhrase(hasStatus(ObjectStatus.Active) ? 'deactivate' : 'activate'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n onClick: () => {\n logAnalytics({\n actionType: UserAction.Activate,\n descriptor: hasStatus(ObjectStatus.Active) ? ToggleDescriptor.Off : ToggleDescriptor.On\n });\n \n const appLink = {\n ...props.appLinks.toggleStatus,\n args: [ ...(props.appLinks.toggleStatus.args ?? []), props.user.id ]\n };\n \n Core.AppLinkHelper.trigger(appLink);\n }\n });\n }\n\n const showDelete = client !== UserManagerClient.Primary || props.products?.includes(ProductId.Online);\n if (showDelete) {\n actions.push({\n order: 25,\n disabled: props.hasRostering,\n onClick: () => {\n if (hasStatus(ObjectStatus.Active))\n return;\n \n logAnalytics({ actionType: UserAction.Delete, descriptor: OperationDescriptor.Single });\n \n setBulkRemoveUsers({ users: [props.user], totalUsers: 1 });\n \n Core.AppLinkHelper.trigger(props.appLinks.deleteUser);\n },\n label: getPhrase('delete'),\n className: `btn btn-link text-danger ${hasStatus(ObjectStatus.Active) || props.hasRostering ? 'cursor-default disabled' : ''}`,\n button: false,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : hasStatus(ObjectStatus.Active) ? getPhrase('deleteDisabledTooltip') : null\n });\n }\n\n const showRemove = client !== UserManagerClient.Online && !props.products?.includes(ProductId.Online);\n if (showRemove) {\n actions.push({\n order: 25,\n disabled: props.hasRostering,\n onClick: () => {\n if (hasStatus(ObjectStatus.Active))\n return;\n \n logAnalytics({ actionType: UserAction.Remove, descriptor: OperationDescriptor.Single });\n \n const appLink = {\n ...props.appLinks.removeUser,\n args: [ ...(props.appLinks.editUser.args ?? []), props.user.id ]\n };\n \n Core.AppLinkHelper.trigger(appLink);\n },\n label: getPhrase('remove'),\n className: `btn btn-link text-danger ${hasStatus(ObjectStatus.Active) || props.hasRostering ? 'cursor-default disabled' : ''}`,\n button: false,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : hasStatus(ObjectStatus.Active) ? getPhrase('removeDisabledTooltip') : null\n });\n }\n }\n\n if (client === UserManagerClient.Online && props.userType === UserGroup.Learner && hasStatus(ObjectStatus.Active)) {\n actions.push({\n order: 15,\n label: getPhrase('viewWorkspace'),\n onClick: () => logAnalytics({ actionType: UserAction.Click, descriptor: ClickDescriptor.ViewStudentWorkspace }),\n appLink: {\n ...props.appLinks.viewStudentWorkspace,\n params: { username: props.user.username }\n },\n className: props.hasRostering ? 'cursor-default disabled' : 'btn btn-link',\n button: false\n });\n }\n\n if (\n client === UserManagerClient.Primary &&\n props.userType === UserGroup.Learner &&\n !hasStatus(ObjectStatus.Inactive)\n ) {\n actions.push({\n order: 15,\n label: getPhrase('viewStudentsVideos'),\n onClick: () => logAnalytics({ actionType: UserAction.Click, descriptor: ClickDescriptor.ViewStudentWorkspace }),\n appLink: {\n ...props.appLinks.viewStudentWorkspace,\n args: [props.user.id]\n },\n className: 'btn btn-link',\n button: false\n });\n }\n\n if (\n hasStatus(ObjectStatus.Active) &&\n (\n (props.userType === UserGroup.Staff && !hasVerifiedEmail) ||\n props.userType === UserGroup.Learner\n )\n ) {\n actions.push({\n order: 20,\n disabled: props.hasRostering,\n label: getPhrase('changePassword'),\n className: props.hasRostering ? 'cursor-default disabled' : '',\n onClick: () => {\n logAnalytics({ actionType: UserAction.ChangePassword });\n\n const appLink = {\n ...props.appLinks.changePassword,\n args: [ ...(props.appLinks.changePassword.args ?? []), props.user.id ]\n };\n \n Core.AppLinkHelper.trigger(appLink);\n }\n });\n }\n\n if (client === UserManagerClient.Curator\n && CuratorPermissionsHelper.isDev(props.currentUser as unknown as CuratorUser)) {\n actions.push(...[\n {\n order: 2,\n label: getPhrase('manageCuratorGroups'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n onClick: () => {\n logAnalytics({ actionType: UserAction.ManageGroup });\n\n Core.AppLinkHelper.trigger({\n ...props.appLinks.manageUserCuratorGroups,\n args: [props.user.id]\n });\n }\n },\n {\n order: 3,\n label: getPhrase('editUserOptions'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n appLink: {\n ...props.appLinks.editUserOptions,\n args: [ ...(props.appLinks.editUserOptions.args ?? []), props.user.id ]\n }\n }\n ]);\n }\n\n if (client === UserManagerClient.Curator && props.hasUserCredit) {\n actions.push({\n order: 4,\n label: getPhrase('editUserCredits'),\n appLink: {\n ...props.appLinks.userCredit,\n args: [ ...(props.appLinks.userCredit.args ?? []), props.user.id ]\n }\n });\n }\n\n if (\n client === UserManagerClient.Curator &&\n props.user.metadata?.isEmailVerified &&\n !hasStatus(ObjectStatus.Inactive)\n ) {\n actions.push({\n order: 5,\n label: getPhrase('unverifyEmail'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n onClick: () => {\n logAnalytics({ actionType: UserAction.VerifyEmail, descriptor: VerifyEmailDescriptor.Remove });\n\n Core.AppLinkHelper.trigger({\n ...props.appLinks.deleteUserEmail,\n args: [ ...(props.appLinks.deleteUserEmail.args ?? []), props.user.id ]\n });\n }\n });\n }\n\n if (client === UserManagerClient.Curator && props.isEditUserForm) {\n actions.push({\n order: 6,\n label: getPhrase('addToAnotherCustomer'),\n disabled: props.hasRostering,\n tooltip: props.hasRostering ? getPhrase('editControlledByRostering') : '',\n className: props.hasRostering ? 'cursor-default disabled' : '',\n appLink: {\n ...props.appLinks.addToAnotherCustomer,\n args: [ ...(props.appLinks.addToAnotherCustomer.args ?? []), props.user.id ]\n }\n });\n }\n\n return actions;\n}\n\ninterface UserItemActionsProps {\n user: User;\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n currentUser: CurrentUser;\n products?: ProductId[];\n onClickResendActivationEmail?: (user: User) => void;\n onClickSendResetEmail?: (user: User) => void;\n onClickSendVerificationEmail?: (user: User) => void;\n isEditUserForm?: boolean;\n ssoHelpArticle?: string;\n hasRostering?: boolean;\n hasUserCredit?: boolean;\n}\n\nexport function UserItemActions(props: UserItemActionsProps): JSX.Element {\n const actions = useGetActions(props);\n\n return (\n <Actions\n actions={actions}\n className={props.isEditUserForm ? 'mb-2' : 'pe-4'}\n actionsDropdownClassName={props.isEditUserForm ? 'btn btn-outline-dark' : 'btn btn-link ms-1'}\n />\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"partialLoading\":\"mXgLg\"};","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './user-manager-entries.scss';\n\nconst namespace = 'userManager.userManagerEntries';\n\ninterface UserManagerEntriesProps {\n totalShowing: number;\n totalUsers: number;\n}\n\nexport function UserManagerEntries(props: UserManagerEntriesProps): JSX.Element {\n return (\n <p className='mb-0 fw-semibold'>\n <Text\n namespace={namespace}\n phrase='users'\n options={{\n totalShowing: props.totalShowing ?? 0,\n totalUsers: props.totalUsers ?? 0,\n smartCount: props.totalUsers ?? 0\n }}\n />\n </p>\n );\n}\n\nexport function PartialUserManagerEntries(): JSX.Element {\n return <div className={`partial-loading-background ${styles.partialLoading} d-inline-block`} />;\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PartialUserManagerEntries, UserManagerEntries } from 'libs/shared/apps/user-manager/components/user-manager-entries/UserManagerEntries';\nimport { GetUserCountResponse } from 'libs/shared/apps/user-manager/interfaces/GetUserCountResponse';\nimport { UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces/UserManagerAppLinks';\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { User } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nconst namespace = 'userManager.userManagerHeader';\nconst subNamespaces = {\n [UserGroup.Learner]: 'userManager.studentManagerHeader',\n [UserGroup.Staff]: 'userManager.staffManagerHeader',\n [UserGroup.Unknown]: ''\n};\n\ninterface UserManagerHeaderProps {\n userType: UserGroup;\n appLinks: UserManagerAppLinks;\n users: User[];\n userCount: GetUserCountResponse;\n hasSso?: boolean;\n hasRostering?: boolean;\n /**\n * Allows curator to specify a different heading component\n */\n headingComponent?: JSX.Element\n}\n\nexport function UserManagerHeader(props: UserManagerHeaderProps): JSX.Element {\n const subNamespace = subNamespaces[props.userType];\n\n const hasNumbers = props.users && typeof (props.userCount?.count) === 'number';\n const totalShowing = hasNumbers && props.users.length;\n\n return (\n <>\n <div className='d-flex justify-content-between'>\n {props.headingComponent ?\n <>{props.headingComponent}</> :\n <span>\n <h1 className='h2'><Text namespace={subNamespace} phrase='heading' /></h1>\n\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n { name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'), appLink: props.appLinks.settings },\n { name: LanguageService.getPhrase(subNamespace, 'managerBreadcrumb'), active: true }\n ]}\n />\n </div>\n </span>\n }\n <span>\n <Tooltip\n spanHack\n title={props.hasRostering ? LanguageService.getPhrase(namespace, 'disabled') : ''}\n placement='left'\n >\n <IconButton\n className='btn btn-outline-dark'\n svgName={cvSvgLibrary.Plus}\n appLink={!props.hasSso ? props.appLinks.addNewUsers : props.appLinks.ssoAddUserConfirm}\n disabled={props.hasRostering}\n >\n <Text namespace={subNamespace} phrase='addNew' />\n </IconButton>\n </Tooltip>\n <div className='text-end mt-1'>\n {hasNumbers ? (\n <UserManagerEntries\n totalShowing={totalShowing}\n totalUsers={props.userCount.count}\n />\n ) : <PartialUserManagerEntries />}\n </div>\n </span>\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"icon\":\"eCi4v\"};","import React from 'react';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport styles from './warning-alert.scss';\n\ninterface Props extends HashObject {\n className?: string;\n}\n\ntype WarningAlertProps = React.PropsWithChildren<Props>;\n\nexport function WarningAlert(props: WarningAlertProps): JSX.Element {\n return (\n <div className={`alert alert-warning d-flex align-items-center px-2 mb-3 ${props.className || ''}`}>\n <SvgContainer\n svgName={cvSvgLibrary.WarningOutline}\n className={`svg-container me-2 ${styles.icon}`}\n />\n <div>\n {props.children}\n </div>\n </div>\n );\n}","import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nconst lang = 'userManager.cannotYearGroupRolloverError';\n\nexport class CannotYearGroupRolloverError extends DialogError {\n private previousRolloverDate: string;\n\n constructor(previousRolloverDate: string) {\n super('CannotYearGroupRolloverError');\n\n const localDate = DateHelper.convertUTCToLocal(previousRolloverDate);\n this.previousRolloverDate = DateHelper.format(localDate, 'MMMM Do YYYY');\n }\n\n // @ts-ignore\n public get name(): string {\n return 'CannotYearGroupRolloverError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: LanguageService.getPhrase(lang, 'heading'),\n text: LanguageService.getPhrase(lang, 'text', {\n previousRolloverDate: this.previousRolloverDate,\n supportUrl: ArticleHelper.getSupportRequestUrl(),\n linkClass: 'info-link'\n }),\n buttons: [{\n text: LanguageService.getPhrase(lang, 'okay'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}","import { Flight } from 'libs/common/flight';\n\nimport { GetUserCountResponse } from 'libs/shared/apps/user-manager/interfaces/GetUserCountResponse';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\ninterface Options {\n userType: UserGroup,\n queryParams: UserManagerQueryParams,\n getUserCountRequest: (\n customerId: string,\n userId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams,\n ) => Flight.Request\n}\n\nexport const useFetchUserCount = (options: Options) => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const userCount = Flight.useBasicFetch<GetUserCountResponse>(\n currentUser.data &&\n options.getUserCountRequest(currentUser.data.customerId, currentUser.data.id, options.userType, options.queryParams)\n );\n\n return userCount;\n};","import { Classroom, YearGroup } from 'libs/shared/interfaces';\n\nimport { BulkUserActionOptions, BulkUserSubAction } from '../../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { UserManagerQueryParams } from '../query-params/UserManagerQueryParams';\n\n// Please keep this array up to date with the interface below, so that the data we log to analytics remains accurate\nexport const BaseBulkUserActionsViewModelKeys: Array<keyof BulkUserActionsViewModel> = [\n 'userIdMap', 'params', 'action', 'subAction', 'allUsersSelected', 'allUsersCount', 'scrollContainer'\n];\n\nexport interface BulkUserActionsViewModel {\n userIdMap?: Map<string, boolean>;\n params?: UserManagerQueryParams;\n\n action?: BulkUserActionOptions; // TODO: Rename this to \"actionCategory\"\n subAction?: BulkUserSubAction; // TODO: Rename this to \"action\"\n\n // Used to determine if we can show year level rollover\n allUsersSelected?: boolean;\n allUsersCount?: number;\n scrollContainer?: HTMLElement;\n}\n\nexport interface BulkUserActionsYearGroupRolloverViewModel extends BulkUserActionsViewModel {\n yearGroup: YearGroup;\n}\n\nexport interface BulkUserActionsAddToClassroomViewModel extends BulkUserActionsViewModel {\n classroom: Classroom;\n}\n\nexport interface BulkUserActionsResetPasswordViewModel extends BulkUserActionsViewModel {\n password: string;\n changeOnNextLogin: boolean;\n}","import { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\n\nimport { BulkUserActionStepId } from '../components/bulk-actions-wizard/layout/BulkUserActionsWizardLayout';\nimport { BaseBulkUserActionsViewModelKeys, BulkUserActionsViewModel } from '../interfaces/viewmodels/BulkUserActionsViewModel';\n\nexport const BulkUserActionsAnalyticsHelper = {\n getAnalyticsActionName(viewModel: BulkUserActionsViewModel): string | null {\n if (!viewModel?.action)\n return null;\n\n switch (viewModel.action) {\n case 'activation': {\n if (!viewModel?.subAction)\n return 'Deactivate / reactivate';\n\n if (viewModel.subAction === 'deactivate')\n return 'Deactivate';\n\n return 'Reactivate';\n }\n case 'addToClassroom':\n return 'Add to classroom';\n case 'changeYearGroup':\n return 'Change year level';\n case 'delete':\n return 'Delete user';\n case 'resetEmail':\n return 'Send password reset email';\n case 'activationEmail':\n return 'Send account activation email';\n case 'resetPassword':\n return 'Reset password';\n case 'yearGroupRollover':\n return 'Annual year level rollover';\n case 'removeFromSchool':\n return 'Remove user';\n default:\n return null;\n }\n },\n\n onClickNext(viewModel: BulkUserActionsViewModel, currentStep: BulkUserActionStepId): void {\n if (!viewModel)\n return;\n\n const analyticsData: HashObject = {\n userCount: viewModel.userIdMap.size,\n step: currentStep\n };\n\n const actionName = BulkUserActionsAnalyticsHelper.getAnalyticsActionName(viewModel);\n\n if (actionName)\n analyticsData.action = actionName;\n\n const actionData = ObjectHelper.omit(viewModel, BaseBulkUserActionsViewModelKeys);\n\n // Adds extra items like the `yearGroup` on year level actions or `password` on the reset pw action\n if (Object.keys(actionData).length)\n analyticsData.actionData = actionData;\n\n AnalyticsHelper.logUserAction(analyticsData, {\n location: LocationContext.BulkUserActionsWizard,\n workflowPhase: WorkflowPhase.Next,\n actionType: UserAction.BulkAction,\n entity: EntityType.User\n });\n },\n\n logYearGroupRolloverEntry(location: LocationContext): void {\n AnalyticsHelper.logUserAction({\n action: BulkUserActionsAnalyticsHelper.getAnalyticsActionName({ action: 'yearGroupRollover' })\n }, {\n entity: EntityType.User,\n actionType: UserAction.BulkAction,\n workflowPhase: WorkflowPhase.Start,\n location\n });\n },\n\n getJobStatus(status: BatchJobStatus): string | null {\n switch (status) {\n case BatchJobStatus.Completed:\n return 'Success';\n case BatchJobStatus.CompletedWithError:\n return 'Completed with some errors';\n case BatchJobStatus.Failed:\n return 'Failed';\n default:\n return null;\n }\n }\n};","import React from 'react';\n\nimport styles from './tags.scss';\n\ninterface PartialTagItemProps {\n tagClass?: string;\n}\n\nexport const PartialTagItem = React.memo(function({ tagClass = '' }: PartialTagItemProps): JSX.Element {\n const classNames = `partial-loading-background d-inline-block rounded-pill py-1 px-2 mb-1 me-1 text-nowrap ${tagClass} ${styles.partialTag}`;\n\n return (\n <div className='mt-1'>\n <span className={classNames}> </span>\n </div>\n );\n});","import React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { FilterOption } from 'libs/shared/apps/search/interfaces';\nimport { TagItem } from 'libs/shared/components/tags/TagItem';\nimport { BaseObject, Tag } from 'libs/shared/interfaces';\n\nexport interface TagWidgetItemProps {\n appLink: Core.AppLink;\n data: Tag;\n selectedItems?: BaseObject[];\n onClick?: (data: Tag | FilterOption) => void;\n}\n\nexport function TagWidgetItem(props: TagWidgetItemProps): JSX.Element {\n const isSelected = props.selectedItems.find(selection => selection.id === props.data.id);\n\n const colorClass = isSelected ? `bg-gray-900 text-white` : 'bg-light';\n\n return (\n <TagItem\n tag={props.data}\n appLink={props.appLink}\n tagClass={`no-decoration ${colorClass} lh-1`}\n onClick={() => props.onClick(props.data)}\n />\n );\n}","// Article name mapped to article ID on support site. Used by `ArticleHelper`\n\nexport enum OnlineSupportArticle {\n AddToPlaylist = '115005679748',\n EditSsoAccounts = '8202508040345',\n\n // LE\n LibraryEditor = '360001974533',\n VideoAccess = '360000153947',\n AddFromOnline = '360011718234',\n UploadToLibraryEditor = '360012069334',\n PBTErrorCodes = '360012421153',\n ManuelReview = '360020004534',\n LibraryReview = '360000163788',\n}\n\nexport enum LiteSupportArticle {\n Integrations = '4407268725529',\n Classrooms = '4405362551833',\n MakeInteractive = '4405370510873',\n EditSsoAccounts = '8202605666073',\n UploadToLibraryEditor = '10672936659865',\n AddFromLite = '10671345281561',\n ManageSsoYearGroups = '14691130889241',\n ContentReview = '18525199576601',\n ContentPermissions = '14692125209497',\n AccessSettings = '27927466562201',\n ContentGuidelines = '24133696186009',\n FoxtelFaq = '24133519542169',\n ViviIntegration = '23826297956377',\n AppleTvIntegration = '25832373739929',\n RssFeed = '32567445635097',\n ManageGroupPermissions = '35407217335705'\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};","export const SelectWithSpreadsheetTemplates = '/templates/Template_Select_With_Spreadsheet.csv';\n","import { Flight } from 'libs/common/flight';\n\nimport { SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { CurrentUser, User, UserCollection } from 'libs/shared/interfaces';\n\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\ntype Response = UserCollection | SearchResults<User>;\n\nexport function useFetchUsers(\n currentUser: CurrentUser,\n queryParams: UserManagerQueryParams,\n userType: UserGroup\n): Flight.Response<Response> {\n function getFetchRequest(): Flight.Request {\n if (!currentUser)\n return null;\n const queryParamsKeys = Object.keys(queryParams);\n\n const onlyPagination = queryParamsKeys.length === 1 && !!queryParams.cursor\n || queryParamsKeys.length === 2 && queryParamsKeys.includes('cursor') && queryParamsKeys.includes('previous');\n\n const onlyHasSort = queryParamsKeys.length === 1 && !!queryParams.sort;\n\n // If we have a search query or filter, we want to use it to limit our search. If not, we want to search all students.\n if (Object.keys(queryParams).length && !onlyPagination && !onlyHasSort)\n return UserManagerRequests.searchUsers(\n currentUser.customerId,\n currentUser.id,\n userType,\n queryParams,\n queryParams?.cursor\n );\n\n return UserManagerRequests.getUsers(currentUser.customerId, userType, queryParams, queryParams?.cursor);\n }\n\n return Flight.useBasicFetch<Response>(getFetchRequest());\n}"],"names":["PartialSearchFilters","count","className","Array","fill","map","item","index","key","namespace","UserManagerSearchEmptyState","props","EmptyState","src","imageUrl","Text","phrase","PartialUserItem","PartialUserList","BulkSelectionSummary","selectAllSpinner","setSelectAllSpinner","selectedCount","showSelectingSpinner","showSelectAll","onClickSelectAll","allSelected","selectAllCount","UserManagerConstants","Spinner","as","size","animation","role","SvgContainer","svgName","options","smartCount","type","getTypeText","undefined","DivButton","onClick","onClickDeselectAll","Tooltip","spanHack","title","hasRostering","LanguageService","onClickSelectBulk","disabled","JobTitle","jobTitle","user","userProfile","metadata","LastActive","date","status","ObjectStatus","DateHelper","isDateValid","lastSignedIn","includes","Number","isNaN","substr","toUpperCase","getLastActiveDate","lastSignInTime","isCurrentUser","id","toString","currentUser","UserAuthenticationMethods","sortedAuthMethods","authenticationMethods","sort","method","local","length","hasSSO","find","am","authMethod","i","backgroundColor","backgroundColour","displayName","style","zIndex","backgroundImage","logoUrl","TABLE_THEME","table","row","cell","ManageUsersTable","users","isChecked","client","UserManagerClientContext","data","checked","columns","onToggleCheckbox","imageCdnUrl","appLinks","products","onClickResendActivationEmail","onClickSendResetEmail","onClickSendVerificationEmail","shouldDisplayAuthenticationMethods","ssoHelpArticle","accessor","Cell","Checkbox","value","onChange","width","name","UserItemAvatar","IconCircle","variant","svgSize","S","svgWrapperClassName","BasicUserDetails","RoleOrYearGroup","userType","UserManagerClient","push","UserItemActions","getColumns","Table","theme","namespaces","UserGroup","SelectWithSpreadsheet","download","href","templateLink","cellPadding","BulkUploadFileSelect","onSelectSpreadsheet","BulkUserUploadHelper","onClickCancel","clone","headings","shift","isValid","errorMessage","InvalidSpreadsheetError","requests","SelectWithSpreadsheetPopup","CheckboxHelper","checkboxHelper","fetchAsync","ids","dataLoaded","Popup","closePopup","showLoadingSpinner","dialogClassName","queries","spreadsheetRowCount","setShowSelectingSpinner","q","userRequest","Promise","all","then","res","forEach","r","concat","selectAll","AnalyticsHelper","totalUsersFound","workflowPhase","actionType","entity","descriptor","location","template","useManageUsersCheckboxHelper","useBulkCheckboxManager","bulkSelections","setBulkSelections","getSelectionKey","queryParams","cursor","Object","keys","param","isArray","join","userIds","setSelected","onToggleItem","onToggleBulk","bulkChecked","reset","subNamespaces","ManageUsers","analyticsLocation","subNamespace","locationContext","SharedViewModelKeys","viewModel","setBulkActionViewModel","isSelectingWithSpreadsheet","setIsSelectingWithSpreadsheet","showSpinner","setShowSpinner","persistNamespace","initialState","userIdMap","extraActions","setWizardViewModel","actions","label","appLink","exportUserList","analyticsOptions","analyticsData","auditLog","LocalStorageHelper","onSelectWithSpreadsheetSelect","yearGroupRolloverStatus","yearGroups","canRollover","bulkActionsActionDetails","yearGroupRollover","tooltip","action","subAction","BulkUserActionsAnalyticsHelper","error","CannotYearGroupRolloverError","previousRolloverDate","useGetActions","clearOnExit","unsetAllUsersSelected","current","totalUsers","getSelectedCount","mainFilters","UserManagerHelper","showFiltersPartialLoading","RosteringAlert","indeterminate","hasSomeSelections","SearchFilters","userManager","hideHeading","hideDivider","constantIndices","ScopedSearchBar","placeholder","searchAppLink","search","searchInputSize","searchIndices","ActionsDropdown","dropdownToggleClassName","success","userCount","fetchUserIds","allUsersSelected","BulkUserActionsHelper","getMap","bulkActionsReviewAccounts","config","hasSso","searchEmptyState","selectWithSpreadsheetTemplate","SsoPasswordResetEmailNotAllowedError","WarningAlert","W","helpArticle","target","getGroupNames","groups","g","CuratorPermissionsHelper","isDev","CuratorGroup","hasSubjectsAccess","Curator","some","group","getPhrase","hasStatus","hasVerifiedEmail","isEmailVerified","setBulkRemoveUsers","logAnalytics","actionOptions","isEditUserForm","canEdit","order","editUser","args","button","email","UserHelper","DialogHelper","cancelButtonProps","text","toggleStatus","ProductId","deleteUser","removeUser","viewStudentWorkspace","params","username","changePassword","manageUserCuratorGroups","editUserOptions","hasUserCredit","userCredit","deleteUserEmail","addToAnotherCustomer","Actions","actionsDropdownClassName","UserManagerEntries","totalShowing","PartialUserManagerEntries","UserManagerHeader","hasNumbers","headingComponent","Breadcrumbs","breadcrumbs","settings","active","placement","IconButton","ssoAddUserConfirm","addNewUsers","children","lang","localDate","this","supportUrl","linkClass","buttons","useFetchUserCount","getUserCountRequest","customerId","BaseBulkUserActionsViewModelKeys","getAnalyticsActionName","onClickNext","currentStep","step","actionName","actionData","ObjectHelper","logYearGroupRolloverEntry","getJobStatus","BatchJobStatus","PartialTagItem","tagClass","classNames","TagWidgetItem","colorClass","selectedItems","selection","tag","OnlineSupportArticle","LiteSupportArticle","collection","idField","initial","Map","items","forceUpdate","prevCollection","prevNamespace","clear","get","isBulkChecked","every","set","preselectedIds","setValue","nextItemState","getSelected","from","deselectAll","SelectWithSpreadsheetTemplates","useFetchUsers","queryParamsKeys","onlyPagination","onlyHasSort","getFetchRequest"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[1491],{14617:(e,t,n)=>{n.d(t,{_:()=>D});var a=n(32735),r=n(83345),i=n(24833),o=n(99705),c=n(12778),s=n(92802),l=n(91693),u=n(35223),m=n(23481),d=n(86974),p=n(15611),f=n(66122);const v={domainFieldContainer:"F9EW7"};function y(e){return y="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},y(e)}function b(e,t,n){return(t=function(e){var t=function(e){if("object"!=y(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=y(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==y(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var g="settings.domainField",E=m.T.encloseNamespace(g),h={"domain-duplicated":"domainDuplicatedErrorMessage","domain-not-certified":"domainNotCertifiedErrorMessage","domain-invalid":"domainInvalidErrorMessage","domain-empty":"domainEmptyErrorMessage","domain-already-exists":{requestingAccess:"joinRequestsDomainAlreadyExistsErrorMessage",automaticAccess:"accessBehaviourDomainAlreadyExistsErrorMessage"}};function S(e){var t=(0,s.u6)(),n=e.index,o=e.domain,c=e.view,l=e.appLinks,u=e.onChangeDomain,m=e.removeDomainField,y=l&&b(b({},i.C.RequestingAccess,l.automaticAccess.action),i.C.AutomaticAccess,l.requestingAccess.action),S=l&&y&&{application:l[c].application,action:y[c],args:l[c].args};function A(e,n){return(0,s.u9)(t.errors,"".concat(e,".domains.").concat(n,".domain"))}return a.createElement("div",{className:v.domainFieldContainer},a.createElement(d.w,{type:"text",name:"".concat(c,".domains.").concat(n,".domain"),className:"form-control form-control-lg",placeholder:E("domainPlaceholder"),value:o.domain,onChange:function(e){return function(e,n,a){e.preventDefault();var r=Object.assign(Object.assign({},o),{domain:e.currentTarget.value,hasChanged:!0});t.setFieldError("".concat(n,".domains.").concat(a,".domain"),void 0),u(r,a)}(e,c,n)},onClickClear:function(){return m(n)},autoComplete:"off",showClearButton:0!==n||!!o.domain,"aria-errormessage":"".concat(c,".domains.").concat(n,".domainError")}),A(c,n)&&a.createElement(f.A,{name:"".concat(c,".domains.").concat(n,".domain")},function(e,t,n){var i=A(e,t);switch(i){case"domain-duplicated":case"domain-invalid":case"domain-not-certified":case"domain-empty":return a.createElement(r.x,{namespace:g,phrase:h[i],options:{domain:n}});case"domain-already-exists":return a.createElement(a.Fragment,null,a.createElement(r.x,{namespace:g,phrase:h[i][e],options:{domain:n}}),l&&S&&a.createElement(p.F,{appLink:S,className:"text-red text-underline"},a.createElement(r.x,{namespace:g,phrase:"viewLinkText"})),l&&S&&a.createElement("span",null,"."))}}(c,n,o.domain)))}var A="settings.domainFields";function w(e){return a.useEffect((function(){e.errors.length&&e.errors.forEach((function(t){var n=t.domain,a=t.errorCode,r=e.domains.findIndex((function(e){return e.domain===n}));-1!==r&&e.setFieldError("".concat(e.view,".domains.").concat(r,".domain"),a)}))}),[e.errors]),a.createElement(a.Fragment,null,a.createElement(s.F2,{name:"".concat(e.view,".domains"),render:function(){return a.createElement(a.Fragment,null,e.domains.length>0&&e.domains.map((function(t,n){return a.createElement(S,{key:n,domain:t,index:n,appLinks:e.appLinks,onChangeDomain:e.onChangeDomain,removeDomainField:e.removeDomainField,view:e.view})})))}}),a.createElement("div",null,a.createElement(l.h,{svgName:u.vn.Plus,className:"ms-3 btn btn-link text-info",onClick:e.addDomainField},a.createElement(r.x,{namespace:A,phrase:"addButtonLabel"}))))}var O=n(58357);const C={radioDescription:"Q4JXA"};var N="settings.domainSettingsRadio",T=m.T.encloseNamespace(N),k={automaticAccess:{none:{label:"accessBehaviourNoneLabel",description:"accessBehaviorNoneDescription"},allowed:{label:"accessBehaviourAllowedLabel",description:"accessBehaviourAllowedDescription"}},requestingAccess:{none:{label:"joinRequestsNoneLabel",description:"joinRequestsNoneDescription"},allowed:{label:"joinRequestsAllowedLabel",description:"joinRequestsAllowedDescription"},any:{label:"joinRequestsAnyLabel",description:"joinRequestsAnyDescription"}}};function j(e){var t=e.option,n=e.selectedOption,i=e.view,o=e.hasDescription,c=e.url,s=e.onSelectValue,l=e.children;return a.createElement("div",{className:"mb-3"},a.createElement(O.Z,{type:"radio",id:"".concat(i,"-").concat(t,"-radio"),label:T(k[i][t].label),className:"fw-normal",value:t,onChange:function(){return s(t)},checked:n===t}),n===t&&a.createElement(a.Fragment,null,o&&a.createElement("p",{className:"".concat(C.radioDescription," mb-0")},a.createElement(r.x,{namespace:N,phrase:k[i][t].description})," ",!!c&&a.createElement("a",{className:"text-info",target:"_blank",href:c},a.createElement(r.x,{namespace:N,phrase:"learnMore"}))),l))}function I(e){return I="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},I(e)}function x(e,t,n){return(t=function(e){var t=function(e){if("object"!=I(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=I(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==I(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var F="settings.domainSettingsForm",q=x(x({},i.C.RequestingAccess,{none:"joinRequestsNoneInfoMessage",allowed:"joinRequestsAllowedInfoMessage",any:"joinRequestsAnyInfoMessage"}),i.C.AutomaticAccess,{none:"accessBehaviourNoneInfoMessage",allowed:"accessBehaviourAllowedInfoMessage"});function D(e){var t=function(t){e.onSelectValue(t),0===(e.domains||[]).length&&e.addDomainField()},n=function(){e.addDomainField()},i=function(t,n){e.onChangeDomain(t,n)},s=function(t){e.removeDomainField(t)};return a.createElement(a.Fragment,null,a.createElement("div",{className:"col-12 col-md-8 card p-3 mb-3 ".concat(e.classname)},e.options.map((function(r){return a.createElement("div",{key:r},"none"===r&&a.createElement(j,{option:r,selectedOption:e.selectedOption,hasDescription:!0,view:e.view,onSelectValue:t}),"allowed"===r&&a.createElement(j,{option:r,selectedOption:e.selectedOption,view:e.view,hasDescription:!0,url:c.o.getLiteArticle(o.b.AccessSettings,"articles"),onSelectValue:t},a.createElement(w,{errors:e.errors,view:e.view,appLinks:e.appLinks,addDomainField:n,onChangeDomain:i,removeDomainField:s,domains:e.domains,setFieldError:e.setFieldError})),"any"===r&&a.createElement(j,{option:r,view:e.view,selectedOption:e.selectedOption,hasDescription:!0,url:c.o.getLiteArticle(o.b.AccessSettings,"articles"),onSelectValue:t}))})),a.createElement("div",{className:"d-flex"},a.createElement("div",{className:"rounded p-2 bg-light-blue text-info fw-semibold"},a.createElement(r.x,{namespace:F,phrase:q[e.view][e.selectedOption]})))))}},61807:(e,t,n)=>{n.d(t,{L:()=>u});var a=n(32735),r=n(81886),i=n(23481),o=n(65858),c=n(38502),s="settings.domainSettingsTabs",l=i.T.encloseNamespace(s);function u(e){var t=e.active,n=e.appLinks;return a.createElement("div",{className:"mb-3"},a.createElement(c.r,{tabs:[{name:l("requestingAccess"),appLink:n.requestingAccess,active:"requesting-access"===t,analyticsData:{name:l("requestingAccess"),url:r.Q.C$.getHref(n.requestingAccess)},analyticsOptions:{actionType:o.Vw.Click,entity:o.py.Url,location:o.LZ.MagicTabs}},{name:l("teacherInvites"),appLink:n.teacherInvites,active:"teacher-invites"===t,analyticsData:{name:i.T.getPhrase(s,"teacherInvites"),url:r.Q.C$.getHref(n.teacherInvites)},analyticsOptions:{actionType:o.Vw.Click,entity:o.py.Url,location:o.LZ.MagicTabs}},{name:l("automaticAccess"),appLink:n.automaticAccess,active:"automatic-access"===t,analyticsData:{name:i.T.getPhrase(s,"automaticAccess"),url:r.Q.C$.getHref(n.automaticAccess)},analyticsOptions:{actionType:o.Vw.Click,entity:o.py.Url,location:o.LZ.MagicTabs}}]}))}},86974:(e,t,n)=>{n.d(t,{w:()=>i});var a=n(32735);function r(){return a.createElement("svg",{viewBox:"0 0 24 24"},a.createElement("path",{d:"M11.959 10.641l4.402-4.296a.964.964 0 0 1 1.358 0 .951.951 0 0 1 0 1.35l-4.403 4.297 4.403 4.378a.951.951 0 0 1 0 1.35.964.964 0 0 1-1.358 0l-4.402-4.378-4.32 4.378a.964.964 0 0 1-1.358 0 .951.951 0 0 1 0-1.35l4.32-4.378-4.32-4.362a.951.951 0 0 1 0-1.35.964.964 0 0 1 1.358 0l4.32 4.361z"}))}var i=a.forwardRef((function(e,t){var n=e.onClickClear,i=e.showClearButton,o=e.clearClassName,c=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n}(e,["onClickClear","showClearButton","clearClassName"]);return a.createElement("div",{className:"position-relative"},a.createElement("input",Object.assign({},c,{ref:t,className:"".concat(e.className," ").concat("aYpO7")})),(!!e.value||i)&&a.createElement("span",{className:"".concat("ygMgF"," position-absolute cursor-pointer text-secondary ").concat(o||""),role:"button",onClick:n,onKeyDown:function(e){return"Enter"===e.key&&n()},tabIndex:0},a.createElement("div",{className:"d-inline-block svg-container md"},a.createElement(r,null))))}))},66122:(e,t,n)=>{n.d(t,{A:()=>r});var a=n(32735);function r(e){return a.createElement("span",{id:"".concat(e.name,"Error"),className:"".concat(e.className," invalid-feedback d-block"),role:"status"},e.children)}},82644:(e,t,n)=>{n.d(t,{b:()=>u,n:()=>l});var a=n(32735),r=n(92802),i=n(91967),o=n(1048);function c(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var s=function(e,t){var n={};for(var a in e)Object.prototype.hasOwnProperty.call(e,a)&&t.indexOf(a)<0&&(n[a]=e[a]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(a=Object.getOwnPropertySymbols(e);r<a.length;r++)t.indexOf(a[r])<0&&Object.prototype.propertyIsEnumerable.call(e,a[r])&&(n[a[r]]=e[a[r]])}return n};function l(e){var t=e.castInitialValues,n=e.castValuesOnSubmit,l=e.initialValues,u=e.onSubmit,m=s(e,["castInitialValues","castValuesOnSubmit","initialValues","onSubmit"]),d=t&&e.validationSchema?e.validationSchema.cast(function(e){if(!e)return{};var t=o.t.deepClone(e);return function e(n){Object.keys(t).forEach((function(a){t.hasOwnProperty(a)&&(o.t.isObject(n[a])?e(n[a]):null===t[a]&&delete t[a])}))}(t),t}(l)):l,p={allowInitialSubmit:e.allowInitialSubmit};return a.createElement(r.J9,Object.assign({enableReinitialize:!0},m,{initialValues:d,onSubmit:function(t,a){var r=a.setSubmitting,i=a.resetForm,o=a.setFieldError,s=n&&e.validationSchema?e.validationSchema.cast(t):t;u(s,(function(){var e,t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(n.reset&&i(),n.errors)for(var a=0,s=Object.entries(n.errors);a<s.length;a++){var l=(e=s[a],t=2,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var a,r,i,o,c=[],s=!0,l=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;s=!1}else for(;!(s=(a=i.call(n)).done)&&(c.push(a.value),c.length!==t);s=!0);}catch(e){l=!0,r=e}finally{try{if(!s&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(l)throw r}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return c(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?c(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),u=l[0],m=l[1];o(u,m)}r(!1)}))},initialStatus:p}),i.q.isFunction(e.children)?function(t){return e.children(t)}:a.Children.count(e.children)?e.children:null)}function u(){return(0,r.u6)()}l.defaultProps={castInitialValues:!0,castValuesOnSubmit:!0}},38502:(e,t,n)=>{n.d(t,{r:()=>m});var a=n(32735),r=n(49985),i=n(15611),o=n(18559),c=n(11607),s=n(83914),l=n(22771);function u(e){return a.createElement(a.Fragment,null,!!e.tab.svgName&&a.createElement("div",{className:e.tab.name?"pe-1":""},a.createElement(s.x,{svgName:e.tab.svgName})),e.tab.name,"number"==typeof e.tab.count&&a.createElement("div",{className:"ps-2"},a.createElement(o.C,{type:o.g.Count,data:e.tab.count})))}function m(e){var t;return a.createElement("nav",{className:null!==(t=e.className)&&void 0!==t?t:"",ref:e.containerRef},a.createElement("ul",{className:"\n list-unstyled d-inline-block m-0 ".concat(l.Z.pillTabSelector,"\n ").concat(e.borderRadius?l.Z.radiusSmall:"","\n ").concat(e.listClassName,"\n ")},e.tabs.map((function(e,t){return a.createElement("li",{className:"\n p-0 ".concat(l.Z.tab," ").concat(e.active?"btn btn-dark":"btn btn-outline-dark","\n ").concat(e.name?l.Z.minWidth:""," ").concat(e.className,"\n "),key:t},e.appLink?a.createElement(i.F,{appLink:e.appLink,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(l.Z.tabLink,"\n ")},a.createElement(u,{tab:e})):a.createElement(c.L,{className:"\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ".concat(l.Z.tabLink,"\n "),onClick:function(){return function(e){!e.active&&e.onSelect&&(e.onSelect(),e.analyticsData&&e.analyticsOptions&&r.k.logUserAction(e.analyticsData,e.analyticsOptions))}(e)}},a.createElement(u,{tab:e})))}))))}m.defaultProps={borderRadius:"lg"}},24833:(e,t,n)=>{var a;n.d(t,{C:()=>a}),function(e){e.RequestingAccess="requestingAccess",e.TeacherInvites="teacherInvites",e.AutomaticAccess="automaticAccess"}(a||(a={}))},23371:(e,t,n)=>{var a;n.d(t,{W:()=>a}),function(e){e.Request="request",e.AutoJoin="auto-join",e.NoRequest="no-request"}(a||(a={}))},99705:(e,t,n)=>{var a,r;n.d(t,{b:()=>r}),function(e){e.AddToPlaylist="115005679748",e.EditSsoAccounts="8202508040345",e.LibraryEditor="360001974533",e.VideoAccess="360000153947",e.AddFromOnline="360011718234",e.UploadToLibraryEditor="360012069334",e.PBTErrorCodes="360012421153",e.ManuelReview="360020004534",e.LibraryReview="360000163788"}(a||(a={})),function(e){e.Integrations="4407268725529",e.Classrooms="4405362551833",e.MakeInteractive="4405370510873",e.EditSsoAccounts="8202605666073",e.UploadToLibraryEditor="10672936659865",e.AddFromLite="10671345281561",e.ManageSsoYearGroups="14691130889241",e.ContentReview="18525199576601",e.ContentPermissions="14692125209497",e.AccessSettings="27927466562201",e.ContentGuidelines="24133696186009",e.FoxtelFaq="24133519542169",e.ViviIntegration="23826297956377",e.AppleTvIntegration="25832373739929",e.RssFeed="32567445635097",e.ManageGroupPermissions="35407217335705"}(r||(r={}))},93802:(e,t,n)=>{n.d(t,{y:()=>s});var a=n(75896),r=n(23371);function i(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}function c(e,t){return!!a.m.findWhere(t,{accessType:e})}var s={getFilteredDomains:function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];return e.filter((function(e){return n.some((function(t){return t===e.accessType}))}))},getInitialJoinRequests:function(e){var t=s.getFilteredDomains(e,r.W.Request,r.W.NoRequest);return c(r.W.Request,t)?{selectedOption:"allowed",domains:t}:c(r.W.NoRequest,t)?{selectedOption:"none",domains:[]}:{selectedOption:"any",domains:[]}},getInitialAccessBehaviour:function(e){var t=s.getFilteredDomains(e,r.W.AutoJoin);return c(r.W.AutoJoin,t)?{selectedOption:"allowed",domains:t}:{selectedOption:"none",domains:[]}},formatRequestData:function(e,t,n){var a=t.domains,o=t.selectedOption,c=s.getFilteredDomains(e,r.W.AutoJoin),l=s.getFilteredDomains(e,r.W.Request,r.W.NoRequest);if(n===r.W.Request){var u=[];switch(o){case"none":u=[{accessType:r.W.NoRequest,domain:""}];break;case"allowed":u=a.map((function(e){return Object.assign(Object.assign({},e),{accessType:r.W.Request})}))}return[].concat(i(c),i(u))}if(n===r.W.AutoJoin){var m=[];return"allowed"===o&&(m=a.map((function(e){return Object.assign(Object.assign({},e),{accessType:r.W.AutoJoin})}))),[].concat(i(l),i(m))}}}},5458:(e,t,n)=>{n.d(t,{T:()=>r});var a=new RegExp(/^(?!-)[A-Za-z0-9-]+([\-\.]{1}[a-z0-9]+)*\.[A-Za-z]{2,6}$/),r=function(e){var t={requestingAccess:{domains:[]},automaticAccess:{domains:[]}},n=function(t){var n=t.domains,r=t.selectedOption,i={domains:[]};return n.forEach((function(t,o){if("allowed"===r)return t.domain?n.some((function(e,n){return n!==o&&e.domain===t.domain}))?(i.domains[o]={domain:"domain-duplicated"},e.alerts.error("There is a field with a duplicate domain"),void e.setShowPopup(!1)):a.test(t.domain)?void 0:(i.domains[o]={domain:"domain-invalid"},e.alerts.error("There are one or more invalid fields"),void e.setShowPopup(!1)):(i.domains[o]={domain:"domain-empty"},e.alerts.error("There is a field with an empty domain"),void e.setShowPopup(!1))})),i.domains};return t.requestingAccess.domains=n(e.values.requestingAccess),t.automaticAccess.domains=n(e.values.automaticAccess),Object.values(t).some((function(e){return e.domains.some((function(e){return e}))}))?t:{}}},81803:(e,t,n)=>{n.d(t,{d:()=>f});var a=n(32735),r=n(81886),i=n(23481),o=n(49935),c=n(22902),s=n(14070),l=n(97291),u=n(96368);function m(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,a=Array(t);n<t;n++)a[n]=e[n];return a}var d="settings.settingsLayout",p=function(e){var t=(0,c.T)().hasPermissions,n=(0,u.e)();if(e)return t(e);var a=r.Q.C$.getCurrentAppLink();return a.application!==l.O.SETTINGS||n.some((function(e){return e.modules.some((function(e){return"appLink"in e&&e.appLink.action===a.action}))}))};function f(e){var t,n=p(e.requiredPermissions);if(a.useEffect((function(){n||r.Q.C$.trigger({application:l.O.SETTINGS,action:s.e.Settings.HOME},{replace:!0})}),[n]),!n)return a.createElement(a.Fragment,null);var c,u=e.breadcrumbs.map((function(t,n){return{name:t,appLink:{application:l.O.SETTINGS,action:s.e.Settings.HOME},active:n===e.breadcrumbs.length-1}}));return a.createElement("div",{className:"px-3"},a.createElement("div",{className:"d-flex align-items-center justify-content-between"},a.createElement("h1",{className:"h2"},e.heading),null===(t=e.headingButton)||void 0===t?void 0:t.call(e)),a.createElement("div",{className:"pb-3"},a.createElement(o.Oo,{breadcrumbs:[{name:i.T.getPhrase(d,"settingsBreadcrumb"),appLink:{application:l.O.SETTINGS,action:s.e.Settings.HOME}}].concat((c=u,function(e){if(Array.isArray(e))return m(e)}(c)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(c)||function(e,t){if(e){if("string"==typeof e)return m(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?m(e,t):void 0}}(c)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()))})),e.description&&a.createElement(a.Fragment,null,a.createElement("p",null,e.description),a.createElement("hr",null)),e.children)}},68598:(e,t,n)=>{n.d(t,{W:()=>s});var a=n(24833),r=n(14070),i=n(97291);function o(e){return o="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},o(e)}function c(e,t,n){return(t=function(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var s=c(c(c({},a.C.RequestingAccess,{application:i.O.SETTINGS,action:r.e.Settings.REQUESTING_ACCESS}),a.C.TeacherInvites,{application:i.O.SETTINGS,action:r.e.Settings.TEACHER_INVITES}),a.C.AutomaticAccess,{application:i.O.SETTINGS,action:r.e.Settings.AUTOMATIC_ACCESS})},71966:(e,t,n)=>{n.d(t,{B:()=>r});var a=n(99940),r={domains:function(e){return{url:"{gateway}/v1/customers/".concat(e,"/approved-domains"),key:"domains",normalize:!1}},updateDomains:function(e,t){return{url:"{gateway}/v1/customers/".concat(e,"/approved-domains"),key:"update:domains",type:a.k.PUT,data:t,normalize:!1,invalidationKeys:["domains"]}}}},96268:(e,t,n)=>{n.d(t,{W:()=>l});var a=n(32735),r=n(81886),i=n(65858),o=n(37802),c=n(14070),s=n(97291);function l(){var e=(0,o.r)(i.LZ.Settings),t=e.isLoadingSettings,n=e.domainSettings;a.useEffect((function(){t||n||r.Q.C$.trigger({application:s.O.SETTINGS,action:c.e.Settings.HOME},{replace:!0})}),[n,t])}},22771:(e,t,n)=>{n.d(t,{Z:()=>a});const a={pillTabSelector:"Hdi6o",tab:"RvNxr",minWidth:"GHSz9",radiusSmall:"VhJJa",tabLink:"WFyvo"}}}]);
|
|
2
|
+
//# sourceMappingURL=1491-ab92a040e5-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/1491-ab92a040e5-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/apps/domain-settings/domain-fields/domain-field/DomainField.scss","file:///app/packages/libs/shared/src/apps/domain-settings/domain-fields/domain-field/DomainField.tsx","file:///app/packages/libs/shared/src/apps/domain-settings/domain-fields/DomainFields.tsx","file:///app/packages/libs/shared/src/apps/domain-settings/domain-settings-radio/DomainSettingsRadio.scss","file:///app/packages/libs/shared/src/apps/domain-settings/domain-settings-radio/DomainSettingsRadio.tsx","file:///app/packages/libs/shared/src/apps/domain-settings/domain-settings-form/DomainSettingsForm.tsx","file:///app/packages/libs/shared/src/apps/domain-settings/domain-settings-tabs/DomainSettingsTabs.tsx","file:///app/packages/libs/shared/src/images/components/CloseIcon.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/general/clear-input/ClearableInput.tsx","file:///app/packages/libs/shared/src/apps/sign-up/components/general/clear-input/clearable-input.scss","file:///app/packages/libs/shared/src/components/forms/form-feedback/FormFeedback.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/enums/AccessSettingsGroup.ts","file:///app/packages/libs/shared/src/enums/AccessType.ts","file:///app/packages/libs/shared/src/enums/SupportArticle.ts","file:///app/packages/libs/shared/src/utils/DomainSettingsFormHelper.ts","file:///app/packages/libs/shared/src/utils/validation/DomainSettingsValidationSchema.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/constants/AccessSettingsAppLinks.ts","file:///app/packages/projects/lite/src/apps/settings/flight-requests/DomainRequests.ts","file:///app/packages/projects/lite/src/apps/settings/hooks/useDomainSettingsSwitch.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["// extracted by mini-css-extract-plugin\nexport default {\"domainFieldContainer\":\"F9EW7\"};","import React from 'react';\nimport { getIn, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ClearableInput } from 'libs/shared/apps/sign-up/components/general/clear-input/ClearableInput';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormFeedback } from 'libs/shared/components/forms/form-feedback/FormFeedback';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { AccessSettingsGroup } from 'libs/shared/enums/AccessSettingsGroup';\nimport { AccessSettingAppLinks } from 'libs/shared/interfaces/domains/AccessSettingAppLinks';\nimport { ApprovedDomain, DomainSettingsModel } from 'libs/shared/interfaces/domains/ApprovedDomain';\nimport { ApprovedDomainError } from 'libs/shared/interfaces/domains/ApprovedDomainErrorResponse';\n\nimport styles from './DomainField.scss';\n\nconst namespace = 'settings.domainField';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype ViewMap = {\n [key in AccessSettingsGroup]?: string;\n}\n\ntype ErrorMessagePhraseMap = {\n [key in ApprovedDomainError]?: string | ViewMap;\n};\n\nconst errorMessagePhraseMap: ErrorMessagePhraseMap = {\n 'domain-duplicated': 'domainDuplicatedErrorMessage',\n 'domain-not-certified': 'domainNotCertifiedErrorMessage',\n 'domain-invalid': 'domainInvalidErrorMessage',\n 'domain-empty': 'domainEmptyErrorMessage',\n 'domain-already-exists': {\n requestingAccess: 'joinRequestsDomainAlreadyExistsErrorMessage',\n automaticAccess: 'accessBehaviourDomainAlreadyExistsErrorMessage'\n }\n};\n\ninterface DomainFieldProps {\n index: number,\n domain: ApprovedDomain,\n view: AccessSettingsGroup\n appLinks?: AccessSettingAppLinks\n onChangeDomain: (domain: ApprovedDomain, index: number) => void,\n removeDomainField: (index: number) => void,\n}\n\nexport function DomainField(props: DomainFieldProps) {\n const formikProps = useFormikContext<DomainSettingsModel>();\n const { index, domain, view, appLinks, onChangeDomain, removeDomainField } = props;\n \n // Only construct actionMap and viewAppLink if appLinks is provided\n const actionMap: { [view: string]: string } | undefined = appLinks && {\n [AccessSettingsGroup.RequestingAccess]: appLinks.automaticAccess.action,\n [AccessSettingsGroup.AutomaticAccess]: appLinks.requestingAccess.action\n };\n\n const viewAppLink = appLinks && actionMap && {\n application: appLinks[view].application,\n action: actionMap[view],\n args: appLinks[view].args\n };\n\n function getDomainErrorCode(view: AccessSettingsGroup, index: number): ApprovedDomainError {\n return getIn(formikProps.errors, `${view}.domains.${index}.domain`);\n }\n\n function getDomainErrorMessage(view: AccessSettingsGroup, index: number, domain: string): JSX.Element {\n const domainErrorCode = getDomainErrorCode(view, index);\n switch (domainErrorCode) {\n case 'domain-duplicated':\n case 'domain-invalid':\n case 'domain-not-certified':\n case 'domain-empty':\n return (\n <Text\n namespace={namespace}\n phrase={errorMessagePhraseMap[domainErrorCode] as string}\n options={{ domain }}\n />\n );\n case 'domain-already-exists':\n return (\n <>\n <Text\n namespace={namespace}\n phrase={(errorMessagePhraseMap[domainErrorCode] as ViewMap)[view]}\n options={{ domain }}\n />\n {appLinks && viewAppLink && (\n <AppLink\n appLink={viewAppLink}\n className='text-red text-underline'\n >\n <Text namespace={namespace} phrase={'viewLinkText'}/>\n </AppLink>\n )}\n {appLinks && viewAppLink && (<span>.</span>)}\n </>\n );\n }\n }\n\n function handleChange(e: React.FormEvent<HTMLInputElement>, view: AccessSettingsGroup, index: number) {\n e.preventDefault();\n const updatedDomain: ApprovedDomain = { ...domain, domain: e.currentTarget.value, hasChanged: true };\n formikProps.setFieldError(`${view}.domains.${index}.domain`, undefined);\n onChangeDomain(updatedDomain, index);\n }\n\n return (\n <div className={styles.domainFieldContainer}>\n <ClearableInput\n type='text'\n name={`${view}.domains.${index}.domain`}\n className={`form-control form-control-lg`}\n placeholder={getPhrase('domainPlaceholder')}\n value={domain.domain}\n onChange={e => handleChange(e, view, index)}\n onClickClear={() => removeDomainField(index)}\n autoComplete='off'\n showClearButton={index !== 0 || !!domain.domain}\n aria-errormessage={`${view}.domains.${index}.domainError`}\n />\n {\n getDomainErrorCode(view, index) &&\n <FormFeedback name={`${view}.domains.${index}.domain`}>\n {getDomainErrorMessage(view, index, domain.domain)}\n </FormFeedback>\n }\n </div>\n );\n}","import React from 'react';\nimport { FieldArray } from 'formik';\n\nimport { IconButton } from 'libs/shared/components/icon-button/IconButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { AccessSettingsGroup } from 'libs/shared/enums/AccessSettingsGroup';\nimport { AccessSettingAppLinks } from 'libs/shared/interfaces/domains/AccessSettingAppLinks';\nimport { ApprovedDomain } from 'libs/shared/interfaces/domains/ApprovedDomain';\nimport { ApprovedDomainErrorResponse } from 'libs/shared/interfaces/domains/ApprovedDomainErrorResponse';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { DomainField } from './domain-field/DomainField';\n\nconst namespace = 'settings.domainFields';\n\ninterface DomainFieldsProps {\n errors: ApprovedDomainErrorResponse[],\n view: AccessSettingsGroup,\n appLinks?: AccessSettingAppLinks,\n addDomainField: () => void,\n onChangeDomain: (domain: ApprovedDomain, index: number) => void,\n removeDomainField: (index: number) => void,\n setFieldError: (error: string, code: string) => void,\n domains: ApprovedDomain[]\n}\n\nexport function DomainFields(props: DomainFieldsProps) {\n React.useEffect(() => {\n if (props.errors.length) {\n props.errors.forEach(({ domain: errorDomain, errorCode }) => {\n const errorIndex = props.domains.findIndex(domain => domain.domain === errorDomain);\n\n if (errorIndex !== -1) {\n props.setFieldError(`${props.view}.domains.${errorIndex}.domain`, errorCode);\n }\n });\n }\n }, [props.errors]);\n\n return (\n <>\n <FieldArray\n name={`${props.view}.domains`}\n render={() => {\n return (\n <>\n {props.domains.length > 0 &&\n props.domains.map((domain: ApprovedDomain, index) => (\n <DomainField\n key={index}\n domain={domain}\n index={index}\n appLinks={props.appLinks}\n onChangeDomain={props.onChangeDomain}\n removeDomainField={props.removeDomainField}\n view={props.view}\n />\n ))}\n </>\n );\n }}\n />\n <div>\n <IconButton\n svgName={cvSvgLibrary.Plus}\n className={`ms-3 btn btn-link text-info`}\n onClick={props.addDomainField}\n >\n <Text namespace={namespace} phrase='addButtonLabel' />\n </IconButton>\n </div>\n </>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"radioDescription\":\"Q4JXA\"};","import React from 'react';\nimport { FormCheck } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { AccessSettingsGroup } from 'libs/shared/enums/AccessSettingsGroup';\nimport { DomainSettingsOption } from 'libs/shared/interfaces/domains/ApprovedDomain';\n\nimport styles from './DomainSettingsRadio.scss';\n\nconst namespace = 'settings.domainSettingsRadio';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ntype RadioPhraseMap = {\n [key in AccessSettingsGroup]?: {\n [key in DomainSettingsOption]?: {\n label: string,\n description?: string\n }\n }\n}\n\nconst radioPhraseMap: RadioPhraseMap = {\n automaticAccess: {\n none: {\n label: 'accessBehaviourNoneLabel',\n description: 'accessBehaviorNoneDescription'\n },\n allowed: {\n label: 'accessBehaviourAllowedLabel',\n description: 'accessBehaviourAllowedDescription'\n }\n },\n requestingAccess: {\n none: {\n label: 'joinRequestsNoneLabel',\n description: 'joinRequestsNoneDescription'\n },\n allowed: {\n label: 'joinRequestsAllowedLabel',\n description: 'joinRequestsAllowedDescription'\n },\n any: {\n label: 'joinRequestsAnyLabel',\n description: 'joinRequestsAnyDescription'\n }\n }\n};\n\ninterface DomainSettingsRadioProps {\n option: DomainSettingsOption;\n selectedOption: DomainSettingsOption;\n view: AccessSettingsGroup,\n hasDescription?: boolean;\n url?: string;\n onSelectValue: (option: DomainSettingsOption) => void;\n children?: JSX.Element;\n}\n\nexport function DomainSettingsRadio(props: DomainSettingsRadioProps) {\n const { option, selectedOption, view, hasDescription, url, onSelectValue, children } = props;\n\n return (\n <div className='mb-3'>\n <FormCheck\n type='radio'\n id={`${view}-${option}-radio`}\n label={getPhrase(radioPhraseMap[view][option].label)}\n className='fw-normal'\n value={option}\n onChange={() => onSelectValue(option)}\n checked={selectedOption === option}\n />\n {selectedOption === option && (\n <>\n {hasDescription && (\n <p className={`${styles.radioDescription} mb-0`}>\n <Text namespace={namespace} phrase={radioPhraseMap[view][option].description} />\n \n {!!url &&\n <a className='text-info' target='_blank' href={url}>\n <Text namespace={namespace} phrase='learnMore' />\n </a>\n }\n </p>\n )}\n {children}\n </>\n )}\n </div>\n );\n}\n","import React from 'react';\n\nimport { Text } from 'libs/shared/components/text/Text';\nimport { AccessSettingsGroup } from 'libs/shared/enums/AccessSettingsGroup';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { AccessSettingAppLinks } from 'libs/shared/interfaces/domains/AccessSettingAppLinks';\nimport { ApprovedDomain, DomainSettingsOption } from 'libs/shared/interfaces/domains/ApprovedDomain';\nimport { ApprovedDomainErrorResponse } from 'libs/shared/interfaces/domains/ApprovedDomainErrorResponse';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { DomainFields } from '../domain-fields/DomainFields';\nimport { DomainSettingsRadio } from '../domain-settings-radio/DomainSettingsRadio';\n\nconst namespace = 'settings.domainSettingsForm';\n\ntype InfoMessageMap = {\n [key in AccessSettingsGroup]?: {\n [key in DomainSettingsOption]?: string;\n }\n}\n\nconst infoMessagePhraseMap: InfoMessageMap = {\n [AccessSettingsGroup.RequestingAccess]: {\n none: 'joinRequestsNoneInfoMessage',\n allowed: 'joinRequestsAllowedInfoMessage',\n any: 'joinRequestsAnyInfoMessage'\n },\n [AccessSettingsGroup.AutomaticAccess]: {\n none: 'accessBehaviourNoneInfoMessage',\n allowed: 'accessBehaviourAllowedInfoMessage'\n }\n};\n\ninterface DomainSettingsFormProps {\n view: AccessSettingsGroup,\n options: DomainSettingsOption[],\n errors: ApprovedDomainErrorResponse[]\n appLinks?: AccessSettingAppLinks,\n classname?: string,\n onSelectValue: (value: string) => void,\n addDomainField: () => void,\n onChangeDomain: (domain: ApprovedDomain, index: number) => void,\n removeDomainField: (index: number) => void,\n setFieldError: (error: string, code: string) => void\n selectedOption: DomainSettingsOption,\n domains: ApprovedDomain[]\n}\n\nexport function DomainSettingsForm(props: DomainSettingsFormProps): JSX.Element {\n const handleSelectValue = (value: string) => {\n props.onSelectValue(value);\n const domains = props.domains || [];\n if (domains.length === 0) {\n props.addDomainField();\n }\n };\n\n const handleAddDomainField = () => {\n props.addDomainField();\n };\n\n const handleChangeDomain = (domain: ApprovedDomain, index: number) => {\n props.onChangeDomain(domain, index);\n };\n\n const handleRemoveDomainField = (index: number) => {\n props.removeDomainField(index);\n };\n\n return (\n <>\n <div className={`col-12 col-md-8 card p-3 mb-3 ${props.classname}`}>\n {props.options.map(option => (\n <div key={option}>\n {option === 'none' && (\n <DomainSettingsRadio\n option={option}\n selectedOption={props.selectedOption}\n hasDescription\n view={props.view}\n onSelectValue={handleSelectValue}\n />\n )}\n {option === 'allowed' && (\n <DomainSettingsRadio\n option={option}\n selectedOption={props.selectedOption}\n view={props.view}\n hasDescription\n url={ArticleHelper.getLiteArticle(LiteSupportArticle.AccessSettings, 'articles')}\n onSelectValue={handleSelectValue}\n >\n <DomainFields\n errors={props.errors}\n view={props.view}\n appLinks={props.appLinks}\n addDomainField={handleAddDomainField}\n onChangeDomain={handleChangeDomain}\n removeDomainField={handleRemoveDomainField}\n domains={props.domains}\n setFieldError={props.setFieldError}\n />\n </DomainSettingsRadio>\n )}\n {option === 'any' && (\n <DomainSettingsRadio\n option={option}\n view={props.view}\n selectedOption={props.selectedOption}\n hasDescription\n url={ArticleHelper.getLiteArticle(LiteSupportArticle.AccessSettings, 'articles')}\n onSelectValue={handleSelectValue}\n />\n )}\n </div>\n ))}\n\n <div className='d-flex'>\n <div className='rounded p-2 bg-light-blue text-info fw-semibold'>\n <Text namespace={namespace} phrase={infoMessagePhraseMap[props.view][props.selectedOption]} />\n </div>\n </div>\n </div>\n </>\n );\n}","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\nimport { AccessSettingAppLinks } from 'libs/shared/interfaces/domains/AccessSettingAppLinks';\n\nconst namespace = 'settings.domainSettingsTabs';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface DomainSettingsTabsProps {\n active: 'requesting-access' | 'teacher-invites' | 'automatic-access',\n appLinks: AccessSettingAppLinks\n}\n\nexport function DomainSettingsTabs(props: DomainSettingsTabsProps): JSX.Element {\n const { active, appLinks } = props;\n \n return (\n <div className='mb-3'>\n <PillTabSelector\n tabs={[{\n name: getPhrase('requestingAccess'),\n appLink: appLinks.requestingAccess,\n active: active === 'requesting-access',\n analyticsData: {\n name: getPhrase('requestingAccess'),\n url: Core.AppLinkHelper.getHref(appLinks.requestingAccess)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }, {\n name: getPhrase('teacherInvites'),\n appLink: appLinks.teacherInvites,\n active: active === 'teacher-invites',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'teacherInvites'),\n url: Core.AppLinkHelper.getHref(appLinks.teacherInvites)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }, {\n name: getPhrase('automaticAccess'),\n appLink: appLinks.automaticAccess,\n active: active === 'automatic-access',\n analyticsData: {\n name: LanguageService.getPhrase(namespace, 'automaticAccess'),\n url: Core.AppLinkHelper.getHref(appLinks.automaticAccess)\n },\n analyticsOptions: {\n actionType: UserAction.Click,\n entity: EntityType.Url,\n location: LocationContext.MagicTabs\n }\n }]}\n />\n </div>\n );\n}","import React from 'react';\n\nexport function CloseIcon(): JSX.Element {\n return (\n <svg viewBox='0 0 24 24'>\n <path d='M11.959 10.641l4.402-4.296a.964.964 0 0 1 1.358 0 .951.951 0 0 1 0 1.35l-4.403 4.297 4.403 4.378a.951.951 0 0 1 0 1.35.964.964 0 0 1-1.358 0l-4.402-4.378-4.32 4.378a.964.964 0 0 1-1.358 0 .951.951 0 0 1 0-1.35l4.32-4.378-4.32-4.362a.951.951 0 0 1 0-1.35.964.964 0 0 1 1.358 0l4.32 4.361z'/>\n </svg>\n );\n}","import React from 'react';\n\nimport { CloseIcon } from 'libs/shared/images/components/CloseIcon';\n\nimport styles from './clearable-input.scss';\n\ninterface ClearInputProps extends React.HTMLProps<HTMLInputElement> {\n showClearButton?: boolean;\n onClickClear: () => void;\n clearClassName?: string;\n}\n\nexport const ClearableInput = React.forwardRef((\n props: ClearInputProps,\n ref: React.ForwardedRef<HTMLInputElement>\n) => {\n const { onClickClear, showClearButton, clearClassName, ...inputProps } = props;\n\n return (\n <div className='position-relative'>\n <input\n {...inputProps}\n ref={ref}\n className={`${props.className} ${styles.clearableInput}`}\n />\n {(!!props.value || showClearButton) &&\n <span\n className={`${styles.clearInput} position-absolute cursor-pointer text-secondary ${clearClassName || ''}`}\n role='button'\n onClick={onClickClear}\n onKeyDown={(e: React.KeyboardEvent) => e.key === 'Enter' && onClickClear()}\n tabIndex={0}\n >\n <div className='d-inline-block svg-container md'>\n <CloseIcon />\n </div>\n </span>\n }\n </div>\n );\n});","// extracted by mini-css-extract-plugin\nexport default {\"clearInput\":\"ygMgF\",\"clearableInput\":\"aYpO7\"};","import React from 'react';\n\ninterface FormFeedbackProps extends React.PropsWithChildren {\n name: string;\n className?: string;\n}\n\nexport function FormFeedback(props: FormFeedbackProps) {\n return (\n <span id={`${props.name}Error`} className={`${props.className} invalid-feedback d-block`} role='status'>{props.children}</span>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport { SvgContainer } from '../svg-container/SvgContainer';\n\nimport styles from './pill-tab-selector.scss';\n\ninterface TabContentsProps {\n tab: PillTab;\n}\n\nfunction TabContents(props: TabContentsProps): JSX.Element {\n return (\n <>\n {!!props.tab.svgName && (\n <div className={props.tab.name ? 'pe-1' : ''}>\n <SvgContainer svgName={props.tab.svgName} />\n </div>\n )}\n\n {props.tab.name}\n\n {typeof (props.tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={props.tab.count} />\n </div>\n )}\n </>\n );\n}\n\nexport interface PillTab {\n name: string;\n active: boolean;\n svgName?: string;\n\n className?: string;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n containerRef?: (el: HTMLElement) => void;\n listClassName?: string;\n className?: string;\n borderRadius?: 'sm' | 'lg'\n}\n\nPillTabSelector.defaultProps = {\n borderRadius: 'lg'\n};\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''} ref={props.containerRef}>\n <ul className={`\n list-unstyled d-inline-block m-0 ${styles.pillTabSelector}\n ${props.borderRadius ? styles.radiusSmall : ''}\n ${props.listClassName}\n `}>\n {props.tabs.map((tab, index) => {\n return (\n <li\n className={`\n p-0 ${styles.tab} ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}\n ${tab.name ? styles.minWidth : ''} ${tab.className}\n `}\n key={index}\n >\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n >\n <TabContents tab={tab} />\n </AppLink>\n ) : (\n <DivButton\n className={`\n cursor-pointer d-flex align-items-center justify-content-center\n text-decoration-none text-reset px-2 text-nowrap ${styles.tabLink}\n `}\n onClick={() => onSelectTab(tab)}\n >\n <TabContents tab={tab} />\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","export enum AccessSettingsGroup {\n RequestingAccess = 'requestingAccess',\n TeacherInvites = 'teacherInvites',\n AutomaticAccess = 'automaticAccess'\n}","export enum AccessType {\n Request = 'request',\n AutoJoin = 'auto-join',\n NoRequest = 'no-request'\n}","// Article name mapped to article ID on support site. Used by `ArticleHelper`\n\nexport enum OnlineSupportArticle {\n AddToPlaylist = '115005679748',\n EditSsoAccounts = '8202508040345',\n\n // LE\n LibraryEditor = '360001974533',\n VideoAccess = '360000153947',\n AddFromOnline = '360011718234',\n UploadToLibraryEditor = '360012069334',\n PBTErrorCodes = '360012421153',\n ManuelReview = '360020004534',\n LibraryReview = '360000163788',\n}\n\nexport enum LiteSupportArticle {\n Integrations = '4407268725529',\n Classrooms = '4405362551833',\n MakeInteractive = '4405370510873',\n EditSsoAccounts = '8202605666073',\n UploadToLibraryEditor = '10672936659865',\n AddFromLite = '10671345281561',\n ManageSsoYearGroups = '14691130889241',\n ContentReview = '18525199576601',\n ContentPermissions = '14692125209497',\n AccessSettings = '27927466562201',\n ContentGuidelines = '24133696186009',\n FoxtelFaq = '24133519542169',\n ViviIntegration = '23826297956377',\n AppleTvIntegration = '25832373739929',\n RssFeed = '32567445635097',\n ManageGroupPermissions = '35407217335705'\n}\n","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AccessType } from 'libs/shared/enums/AccessType';\nimport { ApprovedDomain, DomainSettingsModel } from 'libs/shared/interfaces/domains/ApprovedDomain';\n\nfunction has(accessType: AccessType, domains: ApprovedDomain[]): boolean {\n return !!ArrayHelper.findWhere(domains, { accessType });\n}\n\nexport const DomainSettingsFormHelper = {\n getFilteredDomains(domains: ApprovedDomain[], ...accessTypes: AccessType[]): ApprovedDomain[] {\n return domains.filter(domain => accessTypes.some(accessType => accessType === domain.accessType));\n },\n\n getInitialJoinRequests(domains: ApprovedDomain[]): DomainSettingsModel {\n const filteredDomains = DomainSettingsFormHelper.getFilteredDomains(\n domains,\n AccessType.Request,\n AccessType.NoRequest\n );\n\n if (has(AccessType.Request, filteredDomains))\n return { selectedOption: 'allowed', domains: filteredDomains };\n\n if (has(AccessType.NoRequest, filteredDomains))\n return { selectedOption: 'none', domains: []};\n\n return { selectedOption: 'any', domains: []};\n },\n getInitialAccessBehaviour(domains: ApprovedDomain[]): DomainSettingsModel {\n const filteredDomains = DomainSettingsFormHelper.getFilteredDomains(domains, AccessType.AutoJoin);\n\n if (has(AccessType.AutoJoin, filteredDomains))\n return { selectedOption: 'allowed', domains: filteredDomains };\n\n return { selectedOption: 'none', domains: []};\n },\n formatRequestData(\n prevDomains: ApprovedDomain[],\n values: DomainSettingsModel,\n accessType: AccessType\n ): ApprovedDomain[] {\n const { domains, selectedOption } = values;\n const prevAutoJoinDomains = DomainSettingsFormHelper.getFilteredDomains(prevDomains, AccessType.AutoJoin);\n const prevRequestDomains = DomainSettingsFormHelper.getFilteredDomains(\n prevDomains,\n AccessType.Request,\n AccessType.NoRequest\n );\n\n if (accessType === AccessType.Request) {\n let requestDomains: ApprovedDomain[] = [];\n switch (selectedOption) {\n case 'none':\n requestDomains = [{ accessType: AccessType.NoRequest, domain: '' }];\n break;\n case 'allowed':\n requestDomains = domains.map(domain => ({ ...domain, accessType: AccessType.Request }));\n break;\n case 'any':\n }\n return [ ...prevAutoJoinDomains, ...requestDomains ];\n }\n\n if (accessType === AccessType.AutoJoin) {\n let autoJoinDomains: ApprovedDomain[] = [];\n switch (selectedOption) {\n case 'allowed':\n autoJoinDomains = domains.map(domain => ({ ...domain, accessType: AccessType.AutoJoin }));\n break;\n case 'none':\n }\n return [ ...prevRequestDomains, ...autoJoinDomains ];\n }\n }\n};\n","import { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ApprovedDomain, DomainSettingsModel, DomainSettingsModelV2 } from 'libs/shared/interfaces/domains/ApprovedDomain';\nimport { ApprovedDomainError } from 'libs/shared/interfaces/domains/ApprovedDomainErrorResponse';\n\nconst domainRegex = new RegExp(\n /^(?!-)[A-Za-z0-9-]+([\\-\\.]{1}[a-z0-9]+)*\\.[A-Za-z]{2,6}$/\n);\n\ninterface DomainValidationProps {\n values: DomainSettingsModelV2;\n alerts: ReturnType<typeof useAlerts>;\n setShowPopup: (show: boolean) => void;\n}\n\nexport const DomainValidation = (props: DomainValidationProps) => {\n const errors: {\n requestingAccess: { domains:\n { domain: ApprovedDomainError }[] }, automaticAccess: { domains: { domain: ApprovedDomainError }[] } } = {\n requestingAccess: { domains: []},\n automaticAccess: { domains: []}\n };\n\n const validateDomainSettings = (domainSettings: DomainSettingsModel) => {\n const { domains, selectedOption } = domainSettings;\n const domainErrors: { domains: { domain: ApprovedDomainError }[] } = { domains: []};\n\n domains.forEach((domain, index: number) => {\n if (selectedOption !== 'allowed') {\n return;\n }\n if (!domain.domain) {\n domainErrors.domains[index] = { domain: 'domain-empty' };\n props.alerts.error('There is a field with an empty domain');\n props.setShowPopup(false);\n return;\n }\n\n const duplicateDomain = domains.some(\n (currentDomain: ApprovedDomain, currentIndex: number) =>\n currentIndex !== index && currentDomain.domain === domain.domain\n );\n if (duplicateDomain) {\n domainErrors.domains[index] = { domain: 'domain-duplicated' };\n props.alerts.error('There is a field with a duplicate domain');\n props.setShowPopup(false);\n return;\n }\n\n if (!domainRegex.test(domain.domain)) {\n domainErrors.domains[index] = { domain: 'domain-invalid' };\n props.alerts.error('There are one or more invalid fields');\n props.setShowPopup(false);\n return;\n }\n });\n return domainErrors.domains;\n };\n\n errors.requestingAccess.domains = validateDomainSettings(props.values.requestingAccess);\n errors.automaticAccess.domains = validateDomainSettings(props.values.automaticAccess);\n\n const hasErrors = Object.values(errors).some(errorGroup =>\n errorGroup.domains.some(error => error));\n\n if (!hasErrors) {\n return {};\n }\n return errors;\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","import { Core } from 'libs/common/backbone/index';\n\nimport { AccessSettingsGroup } from 'libs/shared/enums/AccessSettingsGroup';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport const AccessSettingsAppLinks: { [key in AccessSettingsGroup]: Core.AppLink } = {\n [AccessSettingsGroup.RequestingAccess]: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.REQUESTING_ACCESS\n },\n [AccessSettingsGroup.TeacherInvites]: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.TEACHER_INVITES\n },\n [AccessSettingsGroup.AutomaticAccess]: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.AUTOMATIC_ACCESS\n }\n};\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nimport { ApprovedDomain } from 'libs/shared/interfaces/domains/ApprovedDomain';\n\nexport const DomainRequests = {\n domains(customerId: string): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/approved-domains`,\n key: 'domains',\n normalize: false\n };\n },\n updateDomains(\n customerId: string,\n data: ApprovedDomain[]\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/approved-domains`,\n key: 'update:domains',\n type: HttpVerbs.PUT,\n data,\n normalize: false,\n invalidationKeys: ['domains']\n };\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { useSettings } from 'libs/shared/hooks/useSettings';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nexport function useDomainSettingsSwitch() {\n const { isLoadingSettings, domainSettings } = useSettings(LocationContext.Settings);\n\n React.useEffect(() => {\n if (isLoadingSettings)\n return;\n\n if (!domainSettings) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [ domainSettings, isLoadingSettings ]);\n}\n","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"tab\":\"RvNxr\",\"minWidth\":\"GHSz9\",\"radiusSmall\":\"VhJJa\",\"tabLink\":\"WFyvo\"};"],"names":["namespace","getPhrase","LanguageService","errorMessagePhraseMap","requestingAccess","automaticAccess","props","formikProps","index","domain","view","appLinks","onChangeDomain","removeDomainField","actionMap","AccessSettingsGroup","action","viewAppLink","application","args","getDomainErrorCode","errors","className","ClearableInput","type","name","placeholder","value","onChange","e","preventDefault","updatedDomain","currentTarget","hasChanged","setFieldError","undefined","handleChange","onClickClear","autoComplete","showClearButton","FormFeedback","domainErrorCode","Text","phrase","options","AppLink","appLink","getDomainErrorMessage","DomainFields","length","forEach","errorDomain","errorCode","errorIndex","domains","findIndex","render","map","key","IconButton","svgName","onClick","addDomainField","radioPhraseMap","none","label","description","allowed","any","option","selectedOption","hasDescription","url","onSelectValue","children","FormCheck","id","checked","target","href","infoMessagePhraseMap","DomainSettingsForm","handleSelectValue","handleAddDomainField","handleChangeDomain","handleRemoveDomainField","classname","ArticleHelper","DomainSettingsTabs","active","tabs","analyticsData","analyticsOptions","actionType","entity","location","teacherInvites","CloseIcon","viewBox","d","ref","clearClassName","inputProps","role","onKeyDown","tabIndex","FormWrapper","castInitialValues","castValuesOnSubmit","initialValues","onSubmit","formattedInitialValues","validationSchema","cast","values","omitChildValues","child","Object","keys","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","formattedData","reset","entries","f","useFormikContextWrapper","defaultProps","TabContents","tab","count","data","PillTabSelector","containerRef","borderRadius","listClassName","onSelect","onSelectTab","AccessType","OnlineSupportArticle","LiteSupportArticle","has","accessType","DomainSettingsFormHelper","getFilteredDomains","accessTypes","filter","some","getInitialJoinRequests","filteredDomains","getInitialAccessBehaviour","formatRequestData","prevDomains","prevAutoJoinDomains","prevRequestDomains","requestDomains","autoJoinDomains","domainRegex","RegExp","DomainValidation","validateDomainSettings","domainSettings","domainErrors","currentDomain","currentIndex","alerts","error","setShowPopup","test","errorGroup","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","group","modules","settingsModule","SettingsLayout","canAccess","replace","breadcrumbs","i","heading","headingButton","AccessSettingsAppLinks","DomainRequests","customerId","normalize","updateDomains","invalidationKeys","useDomainSettingsSwitch","isLoadingSettings"],"sourceRoot":""}
|