@clickview/streamable-learning 0.48.0-rc.0 → 0.48.0-rc.1
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/.vite/manifest.json +646 -646
- package/dist/bundles.json +1 -1
- package/dist/css/DU3tPCD_.chunk.css +12 -0
- package/dist/en.json +1 -1
- package/dist/scripts/{m9QbGES0.chunk.js → ACTQklJQ.chunk.js} +2 -2
- package/dist/scripts/{m9QbGES0.chunk.js.map → ACTQklJQ.chunk.js.map} +1 -1
- package/dist/scripts/{B7if0Lk52.chunk.js → B-qOny0I2.chunk.js} +2 -2
- package/dist/scripts/{B7if0Lk52.chunk.js.map → B-qOny0I2.chunk.js.map} +1 -1
- package/dist/scripts/{BSjm_rCE.chunk.js → B5jBIPaP.chunk.js} +2 -2
- package/dist/scripts/{BSjm_rCE.chunk.js.map → B5jBIPaP.chunk.js.map} +1 -1
- package/dist/scripts/{CPkKuTSK2.chunk.js → B703cBe72.chunk.js} +2 -2
- package/dist/scripts/{CPkKuTSK2.chunk.js.map → B703cBe72.chunk.js.map} +1 -1
- package/dist/scripts/{DNNNPLMp.chunk.js → B7iwtSij.chunk.js} +2 -2
- package/dist/scripts/{DNNNPLMp.chunk.js.map → B7iwtSij.chunk.js.map} +1 -1
- package/dist/scripts/{CXNve4Wq2.chunk.js → BCBfXCYM2.chunk.js} +2 -2
- package/dist/scripts/{CXNve4Wq2.chunk.js.map → BCBfXCYM2.chunk.js.map} +1 -1
- package/dist/scripts/{CoYNU7We2.chunk.js → BKnxYKDu2.chunk.js} +2 -2
- package/dist/scripts/{CoYNU7We2.chunk.js.map → BKnxYKDu2.chunk.js.map} +1 -1
- package/dist/scripts/{BoxedFO8.chunk.js → BLrjbrp8.chunk.js} +2 -2
- package/dist/scripts/{BoxedFO8.chunk.js.map → BLrjbrp8.chunk.js.map} +1 -1
- package/dist/scripts/{CibcLNJP2.chunk.js → BTYwcYPL2.chunk.js} +2 -2
- package/dist/scripts/{CibcLNJP2.chunk.js.map → BTYwcYPL2.chunk.js.map} +1 -1
- package/dist/scripts/{CwI-7tep2.chunk.js → BXJetawx2.chunk.js} +2 -2
- package/dist/scripts/{CwI-7tep2.chunk.js.map → BXJetawx2.chunk.js.map} +1 -1
- package/dist/scripts/{BV74ZRR22.chunk.js → BZOcEcTA2.chunk.js} +2 -2
- package/dist/scripts/{BV74ZRR22.chunk.js.map → BZOcEcTA2.chunk.js.map} +1 -1
- package/dist/scripts/{DxsW8K0n2.chunk.js → BaMNOAYj2.chunk.js} +2 -2
- package/dist/scripts/{DxsW8K0n2.chunk.js.map → BaMNOAYj2.chunk.js.map} +1 -1
- package/dist/scripts/{DrDQfaFN2.chunk.js → BihZ4r0z2.chunk.js} +3 -3
- package/dist/scripts/{DrDQfaFN2.chunk.js.map → BihZ4r0z2.chunk.js.map} +1 -1
- package/dist/scripts/{CK6c6uHp2.chunk.js → BpgHKWR52.chunk.js} +2 -2
- package/dist/scripts/{CK6c6uHp2.chunk.js.map → BpgHKWR52.chunk.js.map} +1 -1
- package/dist/scripts/{JtFbyaXc.chunk.js → Br0Uc4GG.chunk.js} +2 -2
- package/dist/scripts/{JtFbyaXc.chunk.js.map → Br0Uc4GG.chunk.js.map} +1 -1
- package/dist/scripts/{Dd8r1SE32.chunk.js → BsAo7Lri2.chunk.js} +2 -2
- package/dist/scripts/{Dd8r1SE32.chunk.js.map → BsAo7Lri2.chunk.js.map} +1 -1
- package/dist/scripts/{BMjES83N2.chunk.js → BvJXPFoz2.chunk.js} +2 -2
- package/dist/scripts/{BMjES83N2.chunk.js.map → BvJXPFoz2.chunk.js.map} +1 -1
- package/dist/scripts/{CpFOQcL7.chunk.js → BxypZGPK.chunk.js} +2 -2
- package/dist/scripts/{CpFOQcL7.chunk.js.map → BxypZGPK.chunk.js.map} +1 -1
- package/dist/scripts/C4MLxDS-.chunk.js +1 -0
- package/dist/scripts/{DLp7yHzT2.chunk.js → C5i1HsPp2.chunk.js} +2 -2
- package/dist/scripts/{DLp7yHzT2.chunk.js.map → C5i1HsPp2.chunk.js.map} +1 -1
- package/dist/scripts/{Bkv1Tbyu.chunk.js → CCoZQmgX.chunk.js} +2 -2
- package/dist/scripts/{Bkv1Tbyu.chunk.js.map → CCoZQmgX.chunk.js.map} +1 -1
- package/dist/scripts/{Clh6wBrg.chunk.js → CGxa1Jzq.chunk.js} +2 -2
- package/dist/scripts/{Clh6wBrg.chunk.js.map → CGxa1Jzq.chunk.js.map} +1 -1
- package/dist/scripts/{DAvXFgC62.chunk.js → CKdklY2o2.chunk.js} +2 -2
- package/dist/scripts/{DAvXFgC62.chunk.js.map → CKdklY2o2.chunk.js.map} +1 -1
- package/dist/scripts/{CeWjJPIz.chunk.js → CN8PeBwg.chunk.js} +2 -2
- package/dist/scripts/{CeWjJPIz.chunk.js.map → CN8PeBwg.chunk.js.map} +1 -1
- package/dist/scripts/{B1jitqYS2.chunk.js → CNJrD44-2.chunk.js} +2 -2
- package/dist/scripts/{B1jitqYS2.chunk.js.map → CNJrD44-2.chunk.js.map} +1 -1
- package/dist/scripts/{DIHDe4Sg.chunk.js → CNmmq34f.chunk.js} +2 -2
- package/dist/scripts/{DIHDe4Sg.chunk.js.map → CNmmq34f.chunk.js.map} +1 -1
- package/dist/scripts/{CikSQKH-.chunk.js → CUUUI6pl.chunk.js} +2 -2
- package/dist/scripts/{CikSQKH-.chunk.js.map → CUUUI6pl.chunk.js.map} +1 -1
- package/dist/scripts/{DNO0KpY72.chunk.js → CWFInhB82.chunk.js} +2 -2
- package/dist/scripts/{DNO0KpY72.chunk.js.map → CWFInhB82.chunk.js.map} +1 -1
- package/dist/scripts/{i2-k6ULv2.chunk.js → CbLL7dIz2.chunk.js} +2 -2
- package/dist/scripts/{i2-k6ULv2.chunk.js.map → CbLL7dIz2.chunk.js.map} +1 -1
- package/dist/scripts/{KCdpQ8qv2.chunk.js → Ce1TZZdV2.chunk.js} +2 -2
- package/dist/scripts/{KCdpQ8qv2.chunk.js.map → Ce1TZZdV2.chunk.js.map} +1 -1
- package/dist/scripts/{NV4_mMU8.chunk.js → Ces-KTwe.chunk.js} +2 -2
- package/dist/scripts/{NV4_mMU8.chunk.js.map → Ces-KTwe.chunk.js.map} +1 -1
- package/dist/scripts/{0xQRFMBY.chunk.js → CkYqp83j.chunk.js} +2 -2
- package/dist/scripts/{0xQRFMBY.chunk.js.map → CkYqp83j.chunk.js.map} +1 -1
- package/dist/scripts/{DvL3J2BU.chunk.js → CrCAJmt6.chunk.js} +2 -2
- package/dist/scripts/{DvL3J2BU.chunk.js.map → CrCAJmt6.chunk.js.map} +1 -1
- package/dist/scripts/{CcDgbmw52.chunk.js → CsC3VVvE2.chunk.js} +2 -2
- package/dist/scripts/{CcDgbmw52.chunk.js.map → CsC3VVvE2.chunk.js.map} +1 -1
- package/dist/scripts/{C9UjF0q6.chunk.js → D0SYGnyF.chunk.js} +2 -2
- package/dist/scripts/{C9UjF0q6.chunk.js.map → D0SYGnyF.chunk.js.map} +1 -1
- package/dist/scripts/{BqO6i89w2.chunk.js → D7tastET2.chunk.js} +2 -2
- package/dist/scripts/{BqO6i89w2.chunk.js.map → D7tastET2.chunk.js.map} +1 -1
- package/dist/scripts/{CeI-LCE-.chunk.js → DIavEegC.chunk.js} +2 -2
- package/dist/scripts/{CeI-LCE-.chunk.js.map → DIavEegC.chunk.js.map} +1 -1
- package/dist/scripts/{BKbKu9Rp.chunk.js → DK3xia1t.chunk.js} +2 -2
- package/dist/scripts/{BKbKu9Rp.chunk.js.map → DK3xia1t.chunk.js.map} +1 -1
- package/dist/scripts/{BCdnm1Nn.chunk.js → DKnZ8BaN.chunk.js} +2 -2
- package/dist/scripts/{BCdnm1Nn.chunk.js.map → DKnZ8BaN.chunk.js.map} +1 -1
- package/dist/scripts/{awemA_vU2.chunk.js → DO8_mR5i2.chunk.js} +2 -2
- package/dist/scripts/{awemA_vU2.chunk.js.map → DO8_mR5i2.chunk.js.map} +1 -1
- package/dist/scripts/{DlQrdOls.chunk.js → DR80oZtZ.chunk.js} +2 -2
- package/dist/scripts/{DlQrdOls.chunk.js.map → DR80oZtZ.chunk.js.map} +1 -1
- package/dist/scripts/{DMq5Gp-U2.chunk.js → DU1SE31v2.chunk.js} +2 -2
- package/dist/scripts/{DMq5Gp-U2.chunk.js.map → DU1SE31v2.chunk.js.map} +1 -1
- package/dist/scripts/{XnBhLH-02.chunk.js → Dj4AeYQQ2.chunk.js} +2 -2
- package/dist/scripts/{XnBhLH-02.chunk.js.map → Dj4AeYQQ2.chunk.js.map} +1 -1
- package/dist/scripts/{CmrPRojb.chunk.js → DnSy_Myx.chunk.js} +2 -2
- package/dist/scripts/{CmrPRojb.chunk.js.map → DnSy_Myx.chunk.js.map} +1 -1
- package/dist/scripts/{D0vsmyva.chunk.js → Dr1flAez.chunk.js} +2 -2
- package/dist/scripts/{D0vsmyva.chunk.js.map → Dr1flAez.chunk.js.map} +1 -1
- package/dist/scripts/{BXT8nHry2.chunk.js → DwzBzBlI2.chunk.js} +2 -2
- package/dist/scripts/{BXT8nHry2.chunk.js.map → DwzBzBlI2.chunk.js.map} +1 -1
- package/dist/scripts/{CvqqZmNo2.chunk.js → DyT1OGvP2.chunk.js} +2 -2
- package/dist/scripts/{CvqqZmNo2.chunk.js.map → DyT1OGvP2.chunk.js.map} +1 -1
- package/dist/scripts/{E9tNds1l.chunk.js → Llxar-VU.chunk.js} +2 -2
- package/dist/scripts/{E9tNds1l.chunk.js.map → Llxar-VU.chunk.js.map} +1 -1
- package/dist/scripts/{app-B1XBsz23.js → app-BIigh9wv.js} +4 -4
- package/dist/scripts/{app-B1XBsz23.js.map → app-BIigh9wv.js.map} +1 -1
- package/dist/scripts/{BMl02f_62.chunk.js → bycmewy72.chunk.js} +2 -2
- package/dist/scripts/{BMl02f_62.chunk.js.map → bycmewy72.chunk.js.map} +1 -1
- package/dist/scripts/{DmfbtOlu.chunk.js → jWpq99N3.chunk.js} +2 -2
- package/dist/scripts/{DmfbtOlu.chunk.js.map → jWpq99N3.chunk.js.map} +1 -1
- package/dist/scripts/{BDliRFoa.chunk.js → oTYyWWB-.chunk.js} +2 -2
- package/dist/scripts/{BDliRFoa.chunk.js.map → oTYyWWB-.chunk.js.map} +1 -1
- package/dist/scripts/{lokG7Sha2.chunk.js → qcrBN1zR2.chunk.js} +2 -2
- package/dist/scripts/{lokG7Sha2.chunk.js.map → qcrBN1zR2.chunk.js.map} +1 -1
- package/dist/scripts/{UAcFqQzZ.chunk.js → smdLElLq.chunk.js} +2 -2
- package/dist/scripts/{UAcFqQzZ.chunk.js.map → smdLElLq.chunk.js.map} +1 -1
- package/dist/scripts/{D8_5yfHY2.chunk.js → tYi-sUb22.chunk.js} +2 -2
- package/dist/scripts/{D8_5yfHY2.chunk.js.map → tYi-sUb22.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/D5Jnyjf8.chunk.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"B1jitqYS2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/user-manager/enums/UserValidationCode.ts","../../../../libs/shared/src/apps/user-manager/utils/UserManagerHelper.ts","../../src/apps/settings/components/email-settings/EmailSettingsValidationSchema.ts","../../src/apps/settings/components/email-settings/VerifiedEmailIcon.tsx","../../src/apps/settings/components/email-settings/EmailSettings.tsx","../../src/apps/settings/components/email-settings/partial-loading/partial-email-settings.module.scss","../../src/apps/settings/components/email-settings/partial-loading/PartialEmailSettings.tsx","../../../../libs/shared/src/apps/user-manager/components/change-password-form/ChangePasswordForm.tsx","../../src/apps/settings/components/password-settings/PasswordSettingsValidationSchema.ts","../../src/apps/settings/components/password-settings/PasswordSettings.tsx","../../src/apps/settings/flight-requests/SecuritySettingsRequests.ts","../../src/apps/settings/views/account-settings/AccountSettingsView.tsx"],"sourcesContent":["// Copied directly from User API\nexport enum UserValidationCode {\n Ok = 'Ok',\n UsernameRequired = 'UsernameRequired',\n EmailRequired = 'EmailRequired',\n FirstnameRequired = 'FirstnameRequired',\n SurnameRequired = 'SurnameRequired',\n YearGroupRequired = 'YearGroupRequired',\n EmailAlreadyExisted = 'EmailAlreadyExisted', // This means another user has this email address, and it's verified\n UsernameAlreadyExisted = 'UsernameAlreadyExisted',\n UserTypeRequired = 'UserTypeRequired',\n MasterYearGroupRequired = 'MasterYearGroupRequired',\n EmptyUserEntity = 'EmptyUserEntity',\n CustomerIdRequired = 'CustomerIdRequired',\n CustomerNotFoundInOnline = 'CustomerNotFoundInOnline',\n EmailTooLong = 'EmailTooLong',\n UsernameTooLong = 'UsernameTooLong',\n FirstnameTooLong = 'FirstnameTooLong',\n SurnameTooLong = 'SurnameTooLong',\n EmailInvalid = 'EmailInvalid',\n EmailInUse = 'EmailInUse', // This means another user has this email address, but it's unverified\n UsernameInvalid = 'UsernameInvalid',\n PasswordTooShort = 'PasswordTooShort',\n EmailDuplicated = 'EmailDuplicated', // Same email has been used in the same request\n UsernameDuplicated = 'UsernameDuplicated', // Same username has been used in the same request\n DisplayNameTooLong = 'DisplayNameTooLong',\n DisplayNameTooShort = 'DisplayNameTooShort',\n UsernameTooShort = 'UsernameTooShort',\n FirstnameInvalid = 'FirstnameInvalid',\n SurnameInvalid = 'SurnameInvalid',\n\n // user man 3.0\n UserTypeMismatch = 'UserTypeMismatch',\n UserCanBeAddedInCustomer = 'UserCanBeAddedInCustomer',\n UserCanBeCreated = 'UserCanBeCreated',\n CustomerFoundInOnline = 'CustomerFoundInOnline',\n UserInCustomerWithOnline = 'UserInCustomerWithOnline',\n InvalidUserStatus = 'InvalidUserStatus',\n UserAlreadyExistsInCustomer = 'UserAlreadyExistsInCustomer',\n\n // a user created by rostered\n Rostered = 'UserRostered',\n\n // Unknown year group\n InvalidYearGroup = 'InvalidYearGroup'\n}\n","import { FormikErrors } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SearchFilter, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { BulkCreateOrValidateUserRequest, BulkDeleteUsersRequest, BulkUpdateUserStatusRequest, EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { FormSubmissionOptions } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { Customer, User, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nimport { FilterConstants } from '../../search/constants/FilterConstants';\nimport { DuplicateUserSet } from '../interfaces/viewmodels/BulkUserUploadViewModel';\n\nconst FALLBACK_MIN_PASSWORD_LENGTH = 8;\nconst namespace = 'userManager.utils';\n\nconst StatusMap: HashObject = {\n active: ObjectStatus.Active.toLowerCase(),\n deactivated: ObjectStatus.Disabled.toLowerCase(),\n pending: ObjectStatus.Inactive.toLowerCase()\n};\n\nexport const UserManagerHelper = {\n filterIdenticalEntries(spreadsheetEntries: EditUserRequest[]): EditUserRequest[] {\n const identify = (u: EditUserRequest) => {\n return [\n u.firstName?.trim() ?? '',\n u.surname?.trim() ?? '',\n u.masterYearGroup?.id ?? '',\n u.username?.toLowerCase()?.trim() ?? '',\n u.email?.toLowerCase()?.trim() ?? ''\n ].join(':');\n };\n\n return spreadsheetEntries.filter((entry, index, self) =>\n index === self.findIndex(u => identify(u) === identify(entry)));\n },\n\n getNewDuplicates(users?: EditUserRequest[]): DuplicateUserSet[] {\n if (!users)\n return null;\n\n const duplicateSets: DuplicateUserSet[] = [];\n const validUsers: EditUserRequest[] = [];\n\n /**\n * Find all users in uploaded spreadsheet with duplicate usernames.\n */\n const usernameDuplicateLookup: {[ username: string ]: EditUserRequest[] } = {};\n\n users.forEach(user => {\n if (!user.username) {\n validUsers.push(user);\n return;\n }\n\n if (!usernameDuplicateLookup[user.username]) {\n usernameDuplicateLookup[user.username] = [user];\n return;\n }\n\n usernameDuplicateLookup[user.username].push(user);\n });\n\n Object.keys(usernameDuplicateLookup).map(username => {\n if (usernameDuplicateLookup[username].length === 1) {\n validUsers.push(usernameDuplicateLookup[username][0]);\n return;\n }\n\n duplicateSets.push({\n errorCodes: [UserValidationCode.UsernameAlreadyExisted],\n users: usernameDuplicateLookup[username]\n });\n });\n\n /**\n * Find all remaining users in spreadsheet with duplicate emails\n */\n const emailDuplicateLookup: {[ email: string ]: EditUserRequest[] } = {};\n\n users.forEach(user => {\n if (!user.email)\n return;\n\n if (!emailDuplicateLookup[user.email]) {\n emailDuplicateLookup[user.email] = [user];\n return;\n }\n\n emailDuplicateLookup[user.email].push(user);\n });\n\n Object.keys(emailDuplicateLookup).map(email => {\n if (emailDuplicateLookup[email].length === 1)\n return;\n\n const { username } = ArrayHelper.first(emailDuplicateLookup[email]);\n\n if (!username || usernameDuplicateLookup[username].length === 1) {\n duplicateSets.push({\n errorCodes: [UserValidationCode.EmailAlreadyExisted],\n users: emailDuplicateLookup[email]\n });\n } else {\n const dupeSetIndex = duplicateSets.findIndex(set => ArrayHelper.first(set.users).username === username);\n\n duplicateSets[dupeSetIndex].errorCodes.push(UserValidationCode.EmailAlreadyExisted);\n }\n });\n\n return duplicateSets;\n },\n\n formatCreateOrValidateUserRequest(\n users: EditUserRequest[],\n userType: UserGroup,\n customerId: string\n ): BulkCreateOrValidateUserRequest {\n return {\n users: users.map((u: EditUserRequest) => {\n const obj: EditUserRequest = {\n firstName: u.firstName,\n email: u.email,\n surname: u.surname,\n username: u.username,\n userType,\n customerId,\n masterRole: u.masterRole || UserRole.User,\n requirePasswordChange: false,\n generatePassword: !!u.generatePassword,\n password: u.password,\n displayName: u.displayName || null\n };\n\n if (userType === UserGroup.Learner)\n obj.yearGroupId = u.masterYearGroup?.id;\n\n if (!obj.username)\n delete obj.username;\n\n if (!obj.password)\n delete obj.password;\n\n if (obj.password && obj.generatePassword)\n obj.generatePassword = false;\n\n if (u.userId)\n obj.userId = u.userId;\n\n return obj;\n })\n };\n },\n\n formatEditUserRequest(user: EditUserRequest): EditUserRequest {\n if (!user.displayName)\n user.displayName = null;\n\n return user;\n },\n\n formatDeleteRequest(customerId: string, users?: User[], userType?: UserGroup): BulkDeleteUsersRequest {\n const body: BulkDeleteUsersRequest = {\n customerId\n };\n\n if (!users.length) {\n const queryParams = Core.LocationUtils.DeserializeQueryParams(\n Core.LocationUtils.GetCurrentQueryString().substring(1)\n );\n\n if (queryParams.query)\n body.searchQuery = queryParams.query;\n\n const statuses = queryParams.status &&\n (Array.isArray(queryParams.status) ? queryParams.status : [queryParams.status]);\n\n if (statuses?.length) {\n body.userStatuses = [];\n\n statuses.forEach(status => {\n if (status === 'active') body.userStatuses.push(ObjectStatus.Active);\n if (status === 'deactivated') body.userStatuses.push(ObjectStatus.Disabled);\n if (status === 'pending') body.userStatuses.push(ObjectStatus.Inactive);\n });\n }\n \n if (queryParams.yearGroup) {\n body.yearGroupValues = Array.isArray(queryParams.yearGroup) ? queryParams.yearGroup : [queryParams.yearGroup];\n }\n }\n\n if (Object.keys(body).length === 1) {\n body.userIds = users.map(u => u.id);\n } else {\n body.userType = userType;\n }\n\n return body;\n },\n\n formatToggleStatusRequest(user: User, customerId: string, newStatus: ObjectStatus): BulkUpdateUserStatusRequest {\n return {\n customerId,\n users: [{\n userId: user.id,\n status: newStatus\n }]\n };\n },\n\n getErrorMessages(\n errorCodes: UserValidationCode[],\n minPasswordLength: number,\n shortMessages?: boolean,\n localMessage?: HashObject\n ) {\n const messages: HashObject = {};\n\n const getPhrase = LanguageService.encloseNamespace('userManager.utils');\n\n const CodeToMessageMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: getPhrase('emailRequired'),\n [UserValidationCode.FirstnameRequired]: getPhrase('nameRequired'),\n [UserValidationCode.SurnameRequired]: getPhrase('surnameRequired'),\n [UserValidationCode.YearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmailAlreadyExisted]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameAlreadyExisted]: getPhrase(shortMessages ? 'usernameExistsShort' : 'usernameExistsLong'),\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: getPhrase('emailExceeds'),\n [UserValidationCode.UsernameTooLong]: getPhrase('usernameExceeds'),\n [UserValidationCode.FirstnameTooLong]: getPhrase('nameExceeds'),\n [UserValidationCode.SurnameTooLong]: getPhrase('surnameExceeds'),\n [UserValidationCode.EmailInvalid]: getPhrase(shortMessages ? 'emailInvalidShort' : 'emailInvalidLong'),\n [UserValidationCode.EmailInUse]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameInvalid]: getPhrase(shortMessages ? 'usernameInvalidShort' : 'usernameInvalidLong'),\n [UserValidationCode.PasswordTooShort]: getPhrase(shortMessages ? 'passwordTooShortShort' : 'passwordTooShortLong', { minLength: minPasswordLength }),\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: getPhrase('displayNameExceeds'),\n [UserValidationCode.DisplayNameTooShort]: getPhrase('displayNameTooShort'),\n [UserValidationCode.UsernameTooShort]: getPhrase('usernameTooShort'),\n [UserValidationCode.FirstnameInvalid]: getPhrase('firstNameInvalid'),\n [UserValidationCode.SurnameInvalid]: getPhrase('surnameInvalid'),\n [UserValidationCode.CustomerFoundInOnline]: getPhrase('support'),\n [UserValidationCode.UserInCustomerWithOnline]: getPhrase('support'),\n [UserValidationCode.InvalidUserStatus]: getPhrase('support'),\n [UserValidationCode.UserTypeMismatch]: '',\n [UserValidationCode.UserCanBeAddedInCustomer]: '',\n [UserValidationCode.UserCanBeCreated]: '',\n [UserValidationCode.UserAlreadyExistsInCustomer]: '',\n [UserValidationCode.Rostered]: '',\n [UserValidationCode.InvalidYearGroup]: getPhrase('invalidYearGroupError')\n };\n\n const CodeToFieldMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: 'email',\n [UserValidationCode.FirstnameRequired]: 'firstName',\n [UserValidationCode.SurnameRequired]: 'surname',\n [UserValidationCode.YearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmailAlreadyExisted]: 'email',\n [UserValidationCode.UsernameAlreadyExisted]: 'username',\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: 'email',\n [UserValidationCode.UsernameTooLong]: 'username',\n [UserValidationCode.FirstnameTooLong]: 'firstName',\n [UserValidationCode.SurnameTooLong]: 'surname',\n [UserValidationCode.EmailInvalid]: 'email',\n [UserValidationCode.EmailInUse]: 'email',\n [UserValidationCode.UsernameInvalid]: 'username',\n [UserValidationCode.PasswordTooShort]: 'password',\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: 'displayName',\n [UserValidationCode.DisplayNameTooShort]: 'displayName',\n [UserValidationCode.UsernameTooShort]: 'username',\n [UserValidationCode.FirstnameInvalid]: 'firstName',\n [UserValidationCode.SurnameInvalid]: 'surname',\n [UserValidationCode.UserTypeMismatch]: 'email',\n [UserValidationCode.UserCanBeAddedInCustomer]: 'email',\n [UserValidationCode.UserCanBeCreated]: 'email',\n [UserValidationCode.CustomerFoundInOnline]: 'email',\n [UserValidationCode.UserInCustomerWithOnline]: 'email',\n [UserValidationCode.InvalidUserStatus]: 'email',\n [UserValidationCode.UserAlreadyExistsInCustomer]: 'email',\n [UserValidationCode.Rostered]: 'email',\n [UserValidationCode.InvalidYearGroup]: 'masterYearGroup'\n };\n\n errorCodes.forEach(code => {\n const message = localMessage?.[code] ?? CodeToMessageMap[code] ?? '';\n\n if (!message)\n return;\n\n const field = CodeToFieldMap[code];\n\n if (!field)\n return;\n\n messages[field] = localMessage?.[code]?.[field] ?? message;\n });\n\n return messages;\n },\n\n showEmptyState(userRequest: Flight.Response<UserCollection | SearchResults<User>>, queryParams: HashObject): boolean {\n if (!userRequest.data)\n return false;\n\n const hasQueryParams = Object.keys(queryParams).length;\n\n if (('results' in userRequest.data) || hasQueryParams)\n return false;\n\n return !userRequest.data.data?.length;\n },\n\n getFilters(customer: Customer, userType: UserGroup, yearGroups?: YearGroup[], countryCode?: string): SearchFilter[] {\n const filters = [Filters.SortBy(FilterHelper.getNameSortOptions())];\n\n if (userType === UserGroup.Learner && yearGroups?.length > 1)\n filters.push(Filters.YearGroup(FilterHelper.getYearGroupOptions(yearGroups)));\n\n filters.push(Filters.Status());\n \n if (userType === UserGroup.Staff)\n filters.push(Filters.IsAdmin(customer, countryCode));\n\n return filters;\n },\n\n getMinimumPasswordLength(\n securitySettings: SecuritySettingsResponse,\n userType: UserGroup,\n userRole: UserRole\n ): number {\n if (!securitySettings)\n return FALLBACK_MIN_PASSWORD_LENGTH;\n\n const customSetting = securitySettings.securitySettings?.find(s => {\n return s.userRole === userRole && s.userType === userType;\n });\n\n if (customSetting)\n return customSetting.minPasswordLength;\n\n if (userRole === UserRole.Admin || userRole === UserRole.SuperAdmin)\n return securitySettings.defaultAdminMinPasswordLength;\n\n return securitySettings.defaultMinPasswordLength;\n },\n\n mapStatusParamsToValue(statusParam: string | string[]): ObjectStatus[] {\n if (!statusParam)\n return;\n\n const convertToValue = (status: string): ObjectStatus => {\n switch (status) {\n case 'active':\n return ObjectStatus.Active;\n case 'deactivated':\n return ObjectStatus.Disabled;\n case 'pending':\n return ObjectStatus.Inactive;\n }\n };\n\n if (!Array.isArray(statusParam))\n return [convertToValue(statusParam)];\n\n return statusParam.map(convertToValue);\n },\n\n buildSearchData({\n customerId,\n userId,\n userType,\n queryParams = {}\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams\n }): HashObject {\n const filters = UserManagerHelper.buildSearchFiltersData(customerId, userType, queryParams);\n const sorts = UserManagerHelper.buildSearchSortData(customerId, queryParams);\n\n return {\n query: queryParams.query,\n indices: ['user'],\n searchType: 'user',\n customerIdOverride: customerId,\n userId,\n customerId,\n filters,\n sorts\n };\n },\n\n buildSearchDataAndKey({\n customerId,\n userId,\n userType,\n queryParams,\n cursor\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams?: UserManagerQueryParams,\n cursor?: string\n }): { key: string, data: HashObject } {\n const data = UserManagerHelper.buildSearchData({\n customerId,\n userId: userId || '',\n userType,\n queryParams: queryParams || {}\n });\n\n if (cursor)\n data.cursor = cursor;\n\n let key = `search:users:${cursor || ''}`;\n key += ObjectHelper.flattenObjectToString(data);\n\n return { key, data };\n },\n\n buildSearchParams(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n let filters = UserManagerHelper.buildSearchFiltersObject(customerId, userType, queryParams);\n\n filters = Object.keys(filters).reduce((prev: HashObject, current) => {\n prev[`${FilterConstants.FILTER_PARAM_PREFIX}${current}`] = filters[current];\n return prev;\n }, {});\n\n return {\n query: queryParams.query,\n index: 'user',\n customerIdOverride: customerId,\n ...filters\n };\n },\n\n buildSearchSortData(customerId: string, queryParams: UserManagerQueryParams = {}): HashObject {\n const sorts: HashObject = {};\n\n if (queryParams.sort) {\n switch (queryParams.sort) {\n case 'first-name-atoz':\n sorts.firstName = 'asc';\n break;\n\n case 'first-name-ztoa':\n sorts.firstName = 'desc';\n break;\n\n case 'surname-atoz':\n sorts.surname = 'asc';\n break;\n\n case 'surname-ztoa':\n sorts.surname = 'desc';\n break;\n\n case 'newest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n break;\n case 'oldest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'asc'\n }\n };\n break;\n\n default:\n break;\n }\n } else {\n // default to newest sort\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n }\n\n return sorts;\n },\n\n buildSearchFiltersData(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase()\n };\n\n filters.userProfile = {\n customerId\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userProfile.role = [ UserRole.Admin.toLowerCase(), UserRole.SuperAdmin.toLowerCase() ];\n\n if (queryParams.yearGroup) {\n filters.yearGroup = { customerId };\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup.value = queryParams.yearGroup;\n } else {\n filters.yearGroup.value = [queryParams.yearGroup];\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfile.status = [StatusMap[queryParams.status]];\n } else {\n filters.userProfile.status = queryParams.status.map(val => StatusMap[val]);\n }\n }\n\n return filters;\n },\n\n buildSearchFiltersObject(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase(),\n customerId: customerId.toString()\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userRole = UserRole.Admin.toLowerCase();\n\n if (queryParams.yearGroup) {\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup = `${queryParams.yearGroup.join(',')}`;\n } else {\n filters.yearGroup = queryParams.yearGroup;\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfileStatus = StatusMap[queryParams.status];\n } else {\n filters.userProfileStatus = queryParams.status.map(val => StatusMap[val]).join(',');\n }\n }\n\n return filters;\n },\n\n buildGetUsersQuery(\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): string {\n const { yearGroup = '', status = '', isAdmin = '', sort = 'newest' } = queryParams;\n\n const filters = [`usertype:${userType}`];\n\n if (yearGroup) {\n if (Array.isArray(yearGroup)) {\n filters.push(`yeargroups.value:[${yearGroup.join(',')}]`);\n } else {\n filters.push(`yeargroups.value:${yearGroup}`);\n }\n }\n\n if (isAdmin === 'true')\n filters.push(`userprofiles.role:${UserRole.Admin}`);\n\n if (status) {\n if (!Array.isArray(status)) {\n filters.push(`status:${StatusMap[status]}`);\n } else {\n filters.push(`status:[${status.map(val => StatusMap[val]).join(',')}]`);\n }\n }\n\n if (sort) {\n switch (sort) {\n case 'first-name-atoz':\n filters.push('orderby:name');\n break;\n \n case 'first-name-ztoa':\n filters.push('orderbydesc:name');\n break;\n \n case 'surname-atoz':\n filters.push('orderby:surname');\n break;\n \n case 'surname-ztoa':\n filters.push('orderbydesc:surname');\n break;\n\n case 'newest':\n filters.push('orderbydesc:timestamp');\n break;\n\n case 'oldest':\n filters.push('orderby:timestamp');\n break;\n \n default:\n break;\n }\n }\n\n return `{${filters.join(',')}}avatar`;\n },\n\n shouldDisplayAuthenticationMethods(users: User[]): boolean {\n if (!users?.length)\n return false;\n\n const hasFetchedAuthenticationMethods = !!ArrayHelper.first(users).authenticationMethods?.length;\n\n if (!hasFetchedAuthenticationMethods)\n return false;\n\n const userWithSSO = users.find(u => {\n const ssoLoginMethod = u.authenticationMethods?.find(am => !am.local);\n\n return !!ssoLoginMethod;\n });\n\n /**\n * If any user in the list has an authentication method that isn't local (meaning it's SSO)\n * then we display authentication methods.\n * \n * Otherwise we don't show them, as every user list item would just say \"ClickView\"\n */\n if (userWithSSO)\n return true;\n\n return false;\n },\n\n handleAsyncErrors(\n errors: ErroredUsers,\n updatedUser: EditUserRequest,\n oldUser: User | null,\n onDone: (options: FormSubmissionOptions) => void\n ): boolean {\n const errorCodes = errors?.[0]?.errorCodes;\n\n if (!errorCodes?.length)\n return true;\n\n const errorMessages: FormikErrors<EditUserRequest> = {};\n\n if (\n errorCodes.includes(UserValidationCode.EmailAlreadyExisted) ||\n errorCodes.includes(UserValidationCode.EmailInUse)\n ) {\n if (!oldUser || oldUser.email !== updatedUser.email)\n errorMessages.email = LanguageService.getPhrase(namespace, 'emailExistsLong');\n }\n\n if (errorCodes.includes(UserValidationCode.UsernameAlreadyExisted)) {\n if (!oldUser || oldUser.username !== updatedUser.username)\n errorMessages.username = LanguageService.getPhrase(namespace, 'usernameExistsLong');\n }\n\n if (!Object.keys(errorMessages).length)\n return true;\n\n onDone({\n errors: errorMessages\n });\n\n return false;\n },\n\n getInitialErrorsForInvalidYearGroups(yearGroup: YearGroup): FormikErrors<EditUserRequest> {\n if (!yearGroup || yearGroup.value === 0)\n return {\n masterYearGroup: LanguageService.getPhrase(namespace, 'yearGroupRequired') as FormikErrors<YearGroup>\n };\n\n return {};\n }\n};\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.emailSettings';\n\nexport const EmailSettingsValidationSchema = object().shape({\n email: string()\n .required(() => LanguageService.getPhrase(namespace, 'emailRequired'))\n .email(() => LanguageService.getPhrase(namespace, 'emailInvalid'))\n .trim()\n .default('')\n});\n","import React from 'react';\n\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\n\nexport function VerifiedEmailIcon(): JSX.Element {\n return (\n <SvgContainer2>\n <svg viewBox='0 0 24 24'>\n <path d='M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z'/>\n </svg>\n </SvgContainer2>\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { EmailSettingsValidationSchema } from './EmailSettingsValidationSchema';\nimport { VerifiedEmailIcon } from './VerifiedEmailIcon';\n\nconst namespace = 'settings.emailSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface EmailSettingsModel {\n email: string;\n}\n\ninterface EmailSettingsProps {\n currentUser: CurrentUser;\n onChangeEmail: (emailModel: EmailSettingsModel) => void;\n}\n\nexport function EmailSettings(props: EmailSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n const isVerified = props.currentUser.emailVerified;\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4 d-flex align-items-center'>\n <Text phrase='heading' />\n {isVerified && (\n <span className='font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2'>\n <Text phrase='verified' />\n <VerifiedEmailIcon />\n </span>\n )}\n </h2>\n\n {isVerified && (\n <p><Text phrase='info' options={{ email: props.currentUser.email }} /></p>\n )}\n\n {!showForm ?\n (\n <>\n <div className='d-flex'>\n <button className='btn btn-outline-dark me-2' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n </div>\n </>\n ) : (\n <FormWrapper<EmailSettingsModel>\n initialValues={{ email: props.currentUser.email || '' }}\n onSubmit={props.onChangeEmail}\n validationSchema={EmailSettingsValidationSchema}\n >\n <Form>\n <FormField\n className='w-75'\n name='email'\n placeholder={getPhrase('emailPlaceholder')}\n autoComplete='email'\n />\n <div className={`d-flex justify-content-end w-75 ${isSmallScreen ? 'ms-n2' : ''}`}>\n {isSmallScreen && (\n <button type='button' className='btn btn-link me-2' onClick={() => setShowForm(false)}>\n <Text phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={isVerified ? getPhrase('updateEmail') : getPhrase('verifyEmail')}\n variant={isVerified ? 'outline-dark' : 'dark'}\n />\n </div>\n </Form>\n </FormWrapper>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}\n",":local {\n .partialLabel {\n width: 3.0625rem;\n height: 1.5rem;\n }\n\n .partialInfo {\n margin-bottom: 1rem;\n width: 28.125rem;\n height: 1.1875rem;\n }\n\n .partialInput {\n width: 25.75rem;\n height: 2.1875rem;\n }\n\n .partialSubmit {\n width: 6.75rem;\n height: 2.1875rem;\n }\n\n .partialNote {\n width: 30.625rem;\n height: 1.1875rem; \n }\n}","import React from 'react';\n\nimport styles from './partial-email-settings.module.scss';\n\nexport function PartialEmailSettings(): JSX.Element {\n return (\n <div className='w-50'>\n <div className={`partial-loading-background mb-2 ${styles.partialLabel}`} />\n <div className={`partial-loading-background ${styles.partialInfo}`} />\n\n <div className='form-group'>\n <div className={`partial-loading-background ${styles.partialInput}`} />\n </div>\n <div className={`partial-loading-background ${styles.partialSubmit}`} />\n <div className={`partial-loading-background mt-2 ${styles.partialNote}`} />\n </div>\n );\n}\n","import React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField, FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.changePasswordForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ChangePasswordFormProps {\n onClickCancel?: () => void;\n \n hideButtons?: boolean;\n buttonContainerClass?: string;\n buttonSize?: FormSize;\n hideCancelButton?: boolean;\n hideCurrentPassword?: boolean;\n inputWidthClass?: string;\n showChangeOnNextLogin?: boolean;\n\n submitText?: string;\n submitVariant?: ButtonProps['variant'];\n}\n\nChangePasswordForm.defaultProps = {\n submitVariant: 'outline-dark',\n buttonContainerClass: 'btn-container d-flex justify-content-end align-items-center',\n inputWidthClass: 'w-100'\n};\n\nexport function ChangePasswordForm(props: ChangePasswordFormProps): JSX.Element {\n const formikProps = useFormikContext<ChangePasswordRequest>();\n\n return (\n <Form>\n {!props.hideCurrentPassword && (\n <FormField\n className={props.inputWidthClass}\n name='currentPassword'\n label={getPhrase('currentPassword')}\n placeholder={getPhrase('currentPasswordPlaceholder')}\n type='password'\n autoComplete='current-password'\n showRequiredStar\n />\n )}\n\n <FormField\n className={props.inputWidthClass}\n name='newPassword'\n label={getPhrase('newPassword')}\n placeholder={getPhrase('newPasswordPlaceholder')}\n type='password'\n autoComplete='new-password'\n showRequiredStar\n />\n\n <FormField\n className={props.inputWidthClass}\n name='confirmPassword'\n label={getPhrase('confirmPassword')}\n placeholder={getPhrase('confirmPasswordPlaceholder')}\n type='password'\n autoComplete='off'\n showRequiredStar\n />\n\n {props.showChangeOnNextLogin &&\n <FormField\n id='changeOnNextLogin'\n name='changeOnNextLogin'\n label={getPhrase('changeOnNextLogin')}\n type='checkbox'\n checked={formikProps.values.changeOnNextLogin}\n checkboxLabelFontWeight='normal'\n />\n }\n \n {!props.hideButtons && (\n <div className={props.buttonContainerClass}>\n {(!props.hideCancelButton && !!props.onClickCancel) && (\n <button\n type='button'\n className={`btn btn-link me-2 ${props.buttonSize === 'lg' ? 'btn-lg' : ''}`}\n onClick={props.onClickCancel}\n >\n <Text namespace={namespace} phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={props.submitText || getPhrase('save')}\n variant={props.submitVariant}\n size={props.buttonSize}\n />\n </div>\n )}\n </Form>\n );\n}\n","import { object, ref, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.passwordSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const getPasswordSettingsValidationSchema = (minPasswordLength: number) => object().shape({\n currentPassword: string()\n .required(() => getPhrase('currentPasswordRequired'))\n .trim()\n .default(''),\n newPassword: string()\n .required(() => getPhrase('newPasswordRequired'))\n .min(minPasswordLength, () => getPhrase('newPasswordMinLength', { minLen: minPasswordLength }))\n .trim()\n .default(''),\n confirmPassword: string()\n .required(() => getPhrase('confirmPasswordRequired'))\n .oneOf([ ref('newPassword'), null ], () => getPhrase('passwordsDontMatch'))\n .trim()\n .default('')\n});\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordForm } from 'libs/shared/apps/user-manager/components/change-password-form/ChangePasswordForm';\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormSubmissionOptions, FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\n\nimport { getPasswordSettingsValidationSchema } from './PasswordSettingsValidationSchema';\n\nconst namespace = 'settings.passwordSettings';\n\nconst initialValues: ChangePasswordRequest = {\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n};\n\ninterface PasswordSettingsProps {\n onChangePassword: (\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ) => void;\n minPasswordLength: number;\n}\n\nexport function PasswordSettings(props: PasswordSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n function onSubmitPassword(data: ChangePasswordRequest, onDone: (options?: FormSubmissionOptions) => void) {\n props.onChangePassword(data, onDone, () => onDone({ reset: true }));\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4'><Text phrase='heading' /></h2>\n\n {!showForm ?\n (\n <button className='btn btn-outline-dark ' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n ) : (\n <>\n <p><Text phrase='info' /></p>\n\n <FormWrapper<ChangePasswordRequest>\n initialValues={initialValues}\n onSubmit={onSubmitPassword}\n validationSchema={getPasswordSettingsValidationSchema(props.minPasswordLength)}\n >\n <ChangePasswordForm\n onClickCancel={() => setShowForm(false)}\n hideCancelButton={!isSmallScreen}\n submitText={LanguageService.getPhrase(namespace, 'savePassword')}\n buttonContainerClass={isSmallScreen ?\n 'd-flex justify-content-end ms-n2 w-75' :\n 'd-flex justify-content-end w-75'\n }\n inputWidthClass='w-75'\n />\n </FormWrapper>\n </>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nimport { UpdateSecuritySettingsRequest } from 'apps/settings/interfaces/security/requests/UpdateSecuritySettingsRequest';\n\nexport const SecuritySettingsRequests = {\n getCustomerSecuritySettings(\n customerId: string,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `customers:security:settings`,\n normalize: false,\n success,\n error\n };\n },\n\n setCustomerSecuritySettings(\n customerId: string,\n data: UpdateSecuritySettingsRequest,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `update:security:settings`,\n invalidationKeys: `customers:security:settings`,\n type: HttpVerbs.PUT,\n normalize: false,\n data,\n success,\n error\n };\n }\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces/ChangePasswordRequest';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { EmailSettings, EmailSettingsModel } from 'apps/settings/components/email-settings/EmailSettings';\nimport { PartialEmailSettings } from 'apps/settings/components/email-settings/partial-loading/PartialEmailSettings';\nimport { PasswordSettings } from 'apps/settings/components/password-settings/PasswordSettings';\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserManagerRequests } from 'apps/settings/flight-requests/UserManagerRequests';\n\nconst namespace = 'settings.accountSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function AccountSettingsView(): JSX.Element {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const masterCurrentUser = Flight.useBasicFetch<User>(currentUser.data &&\n UserManagerRequests.getUser(currentUser.data.id));\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n useSetPageMetadata({ title: getPhrase('heading') });\n\n function onChangeEmail(emailModel: EmailSettingsModel, onDone?: () => void): void {\n Flight.fetch(dispatch, UserManagerRequests.changeEmail(emailModel.email, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldEmail: currentUser.data.email,\n newEmail: emailModel.email\n }, {\n actionType: UserAction.VerifyEmail,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Start\n });\n\n alerts.success(getPhrase('changeEmailRequestSuccess', { email: emailModel.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('changeEmailRequestError'));\n }, onDone));\n }\n\n function onChangePassword(\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ): void {\n Flight.fetch(dispatch, UserManagerRequests.changePassword(passwordModel, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldPassword: passwordModel.currentPassword,\n newPassword: passwordModel.newPassword\n }, {\n actionType: UserAction.ChangePassword,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Complete\n });\n\n alerts.success(getPhrase('changePasswordSuccess'));\n onSuccess();\n }, ({ responseJSON }: JQuery.jqXHR) => {\n if (responseJSON.errorCode === 'user.password-too-short')\n alerts.error(getPhrase('changePasswordRequirementsError'));\n else if (responseJSON.errorCode === 'user.invalid-password')\n alerts.error(getPhrase('changePasswordInvalid'));\n else if (responseJSON.errorCode === 'user.same-password')\n alerts.error(getPhrase('changePasswordSame'));\n else if (responseJSON.errorCode === 'user.locked-out')\n alerts.error(getPhrase('changePasswordLockedOut'));\n else\n alerts.error(getPhrase('changePasswordError'));\n }, onDone));\n }\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n passwordPolicy.data,\n masterCurrentUser.data?.userType,\n currentUser.data.role\n );\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n >\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {(currentUser.data) ?\n (\n <EmailSettings\n currentUser={currentUser.data}\n onChangeEmail={onChangeEmail}\n />\n ) : <PartialEmailSettings />\n }\n </div>\n\n <hr />\n\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {passwordPolicy.data && (\n <PasswordSettings onChangePassword={onChangePassword} minPasswordLength={minPasswordLength} />\n )}\n </div>\n </SettingsLayout>\n );\n}\n"],"mappings":"u5BACA,EAAA,SAAA,EAAA,OACE,GAAA,GAAA,KACA,EAAA,iBAAA,mBACA,EAAA,cAAA,gBACA,EAAA,kBAAA,oBACA,EAAA,gBAAA,kBACA,EAAA,kBAAA,oBACA,EAAA,oBAAA,sBACA,EAAA,uBAAA,yBACA,EAAA,iBAAA,mBACA,EAAA,wBAAA,0BACA,EAAA,gBAAA,kBACA,EAAA,mBAAA,qBACA,EAAA,yBAAA,2BACA,EAAA,aAAA,eACA,EAAA,gBAAA,kBACA,EAAA,iBAAA,mBACA,EAAA,eAAA,iBACA,EAAA,aAAA,eACA,EAAA,WAAA,aACA,EAAA,gBAAA,kBACA,EAAA,iBAAA,mBACA,EAAA,gBAAA,kBACA,EAAA,mBAAA,qBACA,EAAA,mBAAA,qBACA,EAAA,oBAAA,sBACA,EAAA,iBAAA,mBACA,EAAA,iBAAA,mBACA,EAAA,eAAA,iBAGA,EAAA,iBAAA,mBACA,EAAA,yBAAA,2BACA,EAAA,iBAAA,mBACA,EAAA,sBAAA,wBACA,EAAA,yBAAA,2BACA,EAAA,kBAAA,oBACA,EAAA,4BAAA,8BAGA,EAAA,SAAA,eAGA,EAAA,iBAAA,0BCpBI,EAA+B,EAC/B,EAAY,oBAEZ,EAAwB,CAC5B,OAAQ,EAAa,OAAO,aAAa,CACzC,YAAa,EAAa,SAAS,aAAa,CAChD,QAAS,EAAa,SAAS,aAAA,CAChC,CAEY,EAAoB,CAC/B,uBAAuB,EAA0D,CAC/E,IAAM,EAAY,GACT,CACL,EAAE,WAAW,MAAM,EAAI,GACvB,EAAE,SAAS,MAAM,EAAI,GACrB,EAAE,iBAAiB,IAAM,GACzB,EAAE,UAAU,aAAa,EAAE,MAAM,EAAI,GACrC,EAAE,OAAO,aAAa,EAAE,MAAM,EAAI,GACnC,CAAC,KAAK,IAAI,CAGb,OAAO,EAAmB,QAAQ,EAAO,EAAO,IAC9C,IAAU,EAAK,UAAU,GAAK,EAAS,EAAE,GAAK,EAAS,EAAM,CAAC,CAAC,EAGnE,iBAAiB,EAA+C,CAC9D,GAAI,CAAC,EACH,OAAO,KAET,IAAM,EAAoC,EAAE,CACtC,EAAgC,EAAE,CAKlC,EAAsE,EAAE,CAE9E,EAAM,QAAQ,GAAQ,CACpB,GAAI,CAAC,EAAK,SAAU,CAClB,EAAW,KAAK,EAAK,CACrB,OAGF,GAAI,CAAC,EAAwB,EAAK,UAAW,CAC3C,EAAwB,EAAK,UAAY,CAAC,EAAK,CAC/C,OAGF,EAAwB,EAAK,UAAU,KAAK,EAAK,EACjD,CAEF,OAAO,KAAK,EAAwB,CAAC,IAAI,GAAY,CACnD,GAAI,EAAwB,GAAU,SAAW,EAAG,CAClD,EAAW,KAAK,EAAwB,GAAU,GAAG,CACrD,OAGF,EAAc,KAAK,CACjB,WAAY,CAAC,EAAmB,uBAAuB,CACvD,MAAO,EAAwB,GAChC,CAAC,EACF,CAKF,IAAM,EAAgE,EAAE,CAgCxE,OA9BA,EAAM,QAAQ,GAAQ,CACf,KAAK,MAGV,IAAI,CAAC,EAAqB,EAAK,OAAQ,CACrC,EAAqB,EAAK,OAAS,CAAC,EAAK,CACzC,OAGF,EAAqB,EAAK,OAAO,KAAK,EAAK,GAC3C,CAEF,OAAO,KAAK,EAAqB,CAAC,IAAI,GAAS,CAC7C,GAAI,EAAqB,GAAO,SAAW,EACzC,OAEF,GAAM,CAAE,YAAa,EAAY,MAAM,EAAqB,GAAO,CAE/D,CAAC,GAAY,EAAwB,GAAU,SAAW,EAC5D,EAAc,KAAK,CACjB,WAAY,CAAC,EAAmB,oBAAoB,CACpD,MAAO,EAAqB,GAC7B,CAAC,CAIF,EAFqB,EAAc,UAAU,GAAO,EAAY,MAAM,EAAI,MAAM,CAAC,WAAa,EAAS,EAE3E,WAAW,KAAK,EAAmB,oBAAoB,EAErF,CAEK,GAGT,kCACE,EACA,EACA,EACiC,CACjC,MAAO,CACL,MAAO,EAAM,IAAK,GAAuB,CACvC,IAAM,EAAuB,CAC3B,UAAW,EAAE,UACb,MAAO,EAAE,MACT,QAAS,EAAE,QACX,SAAU,EAAE,SACZ,WACA,aACA,WAAY,EAAE,YAAc,EAAS,KACrC,sBAAuB,GACvB,iBAAkB,CAAC,CAAC,EAAE,iBACtB,SAAU,EAAE,SACZ,YAAa,EAAE,aAAe,KAC/B,CAiBD,OAfI,IAAa,EAAU,UACzB,EAAI,YAAc,EAAE,iBAAiB,IAElC,EAAI,UACP,OAAO,EAAI,SAER,EAAI,UACP,OAAO,EAAI,SAET,EAAI,UAAY,EAAI,mBACtB,EAAI,iBAAmB,IAErB,EAAE,SACJ,EAAI,OAAS,EAAE,QAEV,GACP,CACH,EAGH,sBAAsB,EAAwC,CAI5D,MAHA,CACE,EAAK,cAAc,KAEd,GAGT,oBAAoB,EAAoB,EAAgB,EAA8C,CACpG,IAAM,EAA+B,CACnC,aACD,CAED,GAAI,CAAC,EAAM,OAAQ,CACjB,IAAM,EAAA,EAAiC,uBAAA,EAClB,uBAAuB,CAAC,UAAU,EAAE,CACxD,CAEG,EAAY,QACd,EAAK,YAAc,EAAY,OAEjC,IAAM,EAAW,EAAY,SAC1B,MAAM,QAAQ,EAAY,OAAO,CAAG,EAAY,OAAS,CAAC,EAAY,OAAO,EAE5E,GAAU,SACZ,EAAK,aAAe,EAAE,CAEtB,EAAS,QAAQ,GAAU,CACrB,IAAW,UAAU,EAAK,aAAa,KAAK,EAAa,OAAO,CAChE,IAAW,eAAe,EAAK,aAAa,KAAK,EAAa,SAAS,CACvE,IAAW,WAAW,EAAK,aAAa,KAAK,EAAa,SAAS,EACvE,EAGA,EAAY,YACd,EAAK,gBAAkB,MAAM,QAAQ,EAAY,UAAU,CAAG,EAAY,UAAY,CAAC,EAAY,UAAU,EAUjH,OANI,OAAO,KAAK,EAAK,CAAC,SAAW,EAC/B,EAAK,QAAU,EAAM,IAAI,GAAK,EAAE,GAAG,CAEnC,EAAK,SAAW,EAGX,GAGT,0BAA0B,EAAY,EAAoB,EAAsD,CAC9G,MAAO,CACL,aACA,MAAO,CAAC,CACN,OAAQ,EAAK,GACb,OAAQ,EACT,CAAA,CACF,EAGH,iBACE,EACA,EACA,EACA,EACA,CACA,IAAM,EAAuB,EAAE,CAEzB,EAAY,EAAgB,iBAAiB,oBAAoB,CAEjE,EAAmB,EACtB,EAAmB,IAAK,IACxB,EAAmB,kBAAmB,IACtC,EAAmB,eAAgB,EAAU,gBAAgB,EAC7D,EAAmB,mBAAoB,EAAU,eAAe,EAChE,EAAmB,iBAAkB,EAAU,kBAAkB,EACjE,EAAmB,mBAAoB,EAAU,oBAAoB,EACrE,EAAmB,qBAAsB,EAAU,EAAgB,mBAAqB,kBAAkB,EAC1G,EAAmB,wBAAyB,EAAU,EAAgB,sBAAwB,qBAAqB,EACnH,EAAmB,kBAAmB,IACtC,EAAmB,yBAA0B,EAAU,oBAAoB,EAC3E,EAAmB,iBAAkB,IACrC,EAAmB,oBAAqB,IACxC,EAAmB,0BAA2B,IAC9C,EAAmB,cAAe,EAAU,eAAe,EAC3D,EAAmB,iBAAkB,EAAU,kBAAkB,EACjE,EAAmB,kBAAmB,EAAU,cAAc,EAC9D,EAAmB,gBAAiB,EAAU,iBAAiB,EAC/D,EAAmB,cAAe,EAAU,EAAgB,oBAAsB,mBAAmB,EACrG,EAAmB,YAAa,EAAU,EAAgB,mBAAqB,kBAAkB,EACjG,EAAmB,iBAAkB,EAAU,EAAgB,uBAAyB,sBAAsB,EAC9G,EAAmB,kBAAmB,EAAU,EAAgB,wBAA0B,uBAAwB,CAAE,UAAW,EAAmB,CAAC,EACnJ,EAAmB,iBAAkB,IACrC,EAAmB,oBAAqB,IACxC,EAAmB,oBAAqB,EAAU,qBAAqB,EACvE,EAAmB,qBAAsB,EAAU,sBAAsB,EACzE,EAAmB,kBAAmB,EAAU,mBAAmB,EACnE,EAAmB,kBAAmB,EAAU,mBAAmB,EACnE,EAAmB,gBAAiB,EAAU,iBAAiB,EAC/D,EAAmB,uBAAwB,EAAU,UAAU,EAC/D,EAAmB,0BAA2B,EAAU,UAAU,EAClE,EAAmB,mBAAoB,EAAU,UAAU,EAC3D,EAAmB,kBAAmB,IACtC,EAAmB,0BAA2B,IAC9C,EAAmB,kBAAmB,IACtC,EAAmB,6BAA8B,IACjD,EAAmB,UAAW,IAC9B,EAAmB,kBAAmB,EAAU,wBAAA,CAClD,CAEK,EAAiB,EACpB,EAAmB,IAAK,IACxB,EAAmB,kBAAmB,IACtC,EAAmB,eAAgB,SACnC,EAAmB,mBAAoB,aACvC,EAAmB,iBAAkB,WACrC,EAAmB,mBAAoB,mBACvC,EAAmB,qBAAsB,SACzC,EAAmB,wBAAyB,YAC5C,EAAmB,kBAAmB,IACtC,EAAmB,yBAA0B,mBAC7C,EAAmB,iBAAkB,IACrC,EAAmB,oBAAqB,IACxC,EAAmB,0BAA2B,IAC9C,EAAmB,cAAe,SAClC,EAAmB,iBAAkB,YACrC,EAAmB,kBAAmB,aACtC,EAAmB,gBAAiB,WACpC,EAAmB,cAAe,SAClC,EAAmB,YAAa,SAChC,EAAmB,iBAAkB,YACrC,EAAmB,kBAAmB,YACtC,EAAmB,iBAAkB,IACrC,EAAmB,oBAAqB,IACxC,EAAmB,oBAAqB,eACxC,EAAmB,qBAAsB,eACzC,EAAmB,kBAAmB,YACtC,EAAmB,kBAAmB,aACtC,EAAmB,gBAAiB,WACpC,EAAmB,kBAAmB,SACtC,EAAmB,0BAA2B,SAC9C,EAAmB,kBAAmB,SACtC,EAAmB,uBAAwB,SAC3C,EAAmB,0BAA2B,SAC9C,EAAmB,mBAAoB,SACvC,EAAmB,6BAA8B,SACjD,EAAmB,UAAW,SAC9B,EAAmB,kBAAmB,kBACxC,CAgBD,OAdA,EAAW,QAAQ,GAAQ,CACzB,IAAM,EAAU,IAAe,IAAS,EAAiB,IAAS,GAElE,GAAI,CAAC,EACH,OAEF,IAAM,EAAQ,EAAe,GAExB,IAGL,EAAS,GAAS,IAAe,KAAQ,IAAU,IACnD,CAEK,GAGT,eAAe,EAAoE,EAAkC,CACnH,GAAI,CAAC,EAAY,KACf,MAAO,GAET,IAAM,EAAiB,OAAO,KAAK,EAAY,CAAC,OAKhD,MAHK,YAAa,EAAY,MAAS,EAC9B,GAEF,CAAC,EAAY,KAAK,MAAM,QAGjC,WAAW,EAAoB,EAAqB,EAA0B,EAAsC,CAClH,IAAM,EAAU,CAAC,EAAQ,OAAO,EAAa,oBAAoB,CAAC,CAAC,CAUnE,OARI,IAAa,EAAU,SAAW,GAAY,OAAS,GACzD,EAAQ,KAAK,EAAQ,UAAU,EAAa,oBAAoB,EAAW,CAAC,CAAC,CAE/E,EAAQ,KAAK,EAAQ,QAAQ,CAAC,CAE1B,IAAa,EAAU,OACzB,EAAQ,KAAK,EAAQ,QAAQ,EAAU,EAAY,CAAC,CAE/C,GAGT,yBACE,EACA,EACA,EACQ,CACR,GAAI,CAAC,EACH,OAAO,EAET,IAAM,EAAgB,EAAiB,kBAAkB,KAAK,GACrD,EAAE,WAAa,GAAY,EAAE,WAAa,EACjD,CAQF,OANI,EACK,EAAc,kBAEnB,IAAa,EAAS,OAAS,IAAa,EAAS,WAChD,EAAiB,8BAEnB,EAAiB,0BAG1B,uBAAuB,EAAgD,CACrE,GAAI,CAAC,EACH,OAEF,IAAM,EAAkB,GAAiC,CACvD,OAAQ,EAAR,CACE,IAAK,SACH,OAAO,EAAa,OACtB,IAAK,cACH,OAAO,EAAa,SACtB,IAAK,UACH,OAAO,EAAa,WAO1B,OAHK,MAAM,QAAQ,EAAY,CAGxB,EAAY,IAAI,EAAe,CAF7B,CAAC,EAAe,EAAY,CAAC,EAKxC,gBAAgB,CACd,aACA,SACA,WACA,cAAc,EAAE,EAMH,CACb,IAAM,EAAU,EAAkB,uBAAuB,EAAY,EAAU,EAAY,CACrF,EAAQ,EAAkB,oBAAoB,EAAY,EAAY,CAE5E,MAAO,CACL,MAAO,EAAY,MACnB,QAAS,CAAC,OAAO,CACjB,WAAY,OACZ,mBAAoB,EACpB,SACA,aACA,UACA,QACD,EAGH,sBAAsB,CACpB,aACA,SACA,WACA,cACA,UAOoC,CACpC,IAAM,EAAO,EAAkB,gBAAgB,CAC7C,aACA,OAAQ,GAAU,GAClB,WACA,YAAa,GAAe,EAAA,CAC7B,CAAC,CAEE,IACF,EAAK,OAAS,GAEhB,IAAI,EAAM,gBAAgB,GAAU,KAGpC,MAFA,IAAO,EAAa,sBAAsB,EAAK,CAExC,CAAE,MAAK,OAAM,EAGtB,kBACE,EACA,EACA,EAAsC,EAAE,CAC5B,CACZ,IAAI,EAAU,EAAkB,yBAAyB,EAAY,EAAU,EAAY,CAO3F,MALA,GAAU,OAAO,KAAK,EAAQ,CAAC,QAAQ,EAAkB,KACvD,EAAK,GAAG,EAAgB,sBAAsB,KAAa,EAAQ,GAC5D,GACN,EAAE,CAAC,CAEC,CACL,MAAO,EAAY,MACnB,MAAO,OACP,mBAAoB,EACpB,GAAG,EACJ,EAGH,oBAAoB,EAAoB,EAAsC,EAAE,CAAc,CAC5F,IAAM,EAAoB,EAAE,CAE5B,GAAI,EAAY,KACd,OAAQ,EAAY,KAApB,CACE,IAAK,kBACH,EAAM,UAAY,MAClB,MAEF,IAAK,kBACH,EAAM,UAAY,OAClB,MAEF,IAAK,eACH,EAAM,QAAU,MAChB,MAEF,IAAK,eACH,EAAM,QAAU,OAChB,MAEF,IAAK,SACH,EAAM,YAAc,CAClB,aACA,YAAa,CACX,YAAa,OAAA,CAEhB,CACD,MACF,IAAK,SACH,EAAM,YAAc,CAClB,aACA,YAAa,CACX,YAAa,MAAA,CAEhB,CACD,MAEF,QACE,WAIJ,EAAM,YAAc,CAClB,aACA,YAAa,CACX,YAAa,OAAA,CAEhB,CAGH,OAAO,GAGT,uBACE,EACA,EACA,EAAsC,EAAE,CAC5B,CACZ,IAAM,EAAsB,CAC1B,SAAU,EAAS,aAAa,CACjC,CA0BD,MAxBA,GAAQ,YAAc,CACpB,aACD,CAEG,EAAY,UAAY,SAC1B,EAAQ,YAAY,KAAO,CAAE,EAAS,MAAM,aAAa,CAAE,EAAS,WAAW,aAAa,CAAE,EAE5F,EAAY,YACd,EAAQ,UAAY,CAAE,aAAY,CAC9B,MAAM,QAAQ,EAAY,UAAU,CACtC,EAAQ,UAAU,MAAQ,EAAY,UAEtC,EAAQ,UAAU,MAAQ,CAAC,EAAY,UAAU,EAIjD,EAAY,SACT,MAAM,QAAQ,EAAY,OAAO,CAGpC,EAAQ,YAAY,OAAS,EAAY,OAAO,IAAI,GAAO,EAAU,GAAK,CAF1E,EAAQ,YAAY,OAAS,CAAC,EAAU,EAAY,QAAQ,EAMzD,GAGT,yBACE,EACA,EACA,EAAsC,EAAE,CAC5B,CACZ,IAAM,EAAsB,CAC1B,SAAU,EAAS,aAAa,CAChC,WAAY,EAAW,UAAA,CACxB,CAqBD,OAnBI,EAAY,UAAY,SAC1B,EAAQ,SAAW,EAAS,MAAM,aAAa,EAE7C,EAAY,YACV,MAAM,QAAQ,EAAY,UAAU,CACtC,EAAQ,UAAY,GAAG,EAAY,UAAU,KAAK,IAAI,GAEtD,EAAQ,UAAY,EAAY,WAIhC,EAAY,SACT,MAAM,QAAQ,EAAY,OAAO,CAGpC,EAAQ,kBAAoB,EAAY,OAAO,IAAI,GAAO,EAAU,GAAK,CAAC,KAAK,IAAI,CAFnF,EAAQ,kBAAoB,EAAU,EAAY,SAM/C,GAGT,mBACE,EACA,EAAsC,EAAE,CAChC,CACR,GAAM,CAAE,YAAY,GAAI,SAAS,GAAI,UAAU,GAAI,OAAO,UAAa,EAEjE,EAAU,CAAC,YAAY,IAAW,CAqBxC,GAnBI,IACE,MAAM,QAAQ,EAAU,CAC1B,EAAQ,KAAK,qBAAqB,EAAU,KAAK,IAAI,CAAC,GAAG,CAEzD,EAAQ,KAAK,oBAAoB,IAAY,EAI7C,IAAY,QACd,EAAQ,KAAK,qBAAqB,EAAS,QAAQ,CAEjD,IACG,MAAM,QAAQ,EAAO,CAGxB,EAAQ,KAAK,WAAW,EAAO,IAAI,GAAO,EAAU,GAAK,CAAC,KAAK,IAAI,CAAC,GAAG,CAFvE,EAAQ,KAAK,UAAU,EAAU,KAAU,EAM3C,EACF,OAAQ,EAAR,CACE,IAAK,kBACH,EAAQ,KAAK,eAAe,CAC5B,MAEF,IAAK,kBACH,EAAQ,KAAK,mBAAmB,CAChC,MAEF,IAAK,eACH,EAAQ,KAAK,kBAAkB,CAC/B,MAEF,IAAK,eACH,EAAQ,KAAK,sBAAsB,CACnC,MAEF,IAAK,SACH,EAAQ,KAAK,wBAAwB,CACrC,MAEF,IAAK,SACH,EAAQ,KAAK,oBAAoB,CACjC,MAEF,QACE,MAIN,MAAO,IAAI,EAAQ,KAAK,IAAI,CAAC,UAG/B,mCAAmC,EAAwB,CAwBzD,MAvBI,CAAC,GAAO,QAKR,CAFsC,EAAY,MAAM,EAAM,CAAC,uBAAuB,OAGjF,GAcT,EAZoB,EAAM,KAAK,GAGtB,CAAC,CAFe,EAAE,uBAAuB,KAAK,GAAM,CAAC,EAAG,MAAM,CAGrE,EAcJ,kBACE,EACA,EACA,EACA,EACS,CACT,IAAM,EAAa,IAAS,IAAI,WAEhC,GAAI,CAAC,GAAY,OACf,MAAO,GAET,IAAM,EAA+C,EAAE,CAsBvD,OAnBE,EAAW,SAAS,EAAmB,oBAAoB,EAC3D,EAAW,SAAS,EAAmB,WAAW,IAE9C,CAAC,GAAW,EAAQ,QAAU,EAAY,SAC5C,EAAc,MAAQ,EAAgB,UAAU,EAAW,kBAAkB,EAG7E,EAAW,SAAS,EAAmB,uBAAuB,GAC5D,CAAC,GAAW,EAAQ,WAAa,EAAY,YAC/C,EAAc,SAAW,EAAgB,UAAU,EAAW,qBAAqB,EAGlF,OAAO,KAAK,EAAc,CAAC,QAGhC,EAAO,CACL,OAAQ,EACT,CAAC,CAEK,IANE,IASX,qCAAqC,EAAqD,CAMxF,MALI,CAAC,GAAa,EAAU,QAAU,EAC7B,CACL,gBAAiB,EAAgB,UAAU,EAAW,oBAAoB,CAC3E,CAEI,EAAE,EAEZ,aCntBK,EAAY,yBAEL,GAAA,EAAA,EAAA,SAAwC,CAAC,MAAM,CAC1D,OAAA,EAAA,EAAA,SAAe,CACZ,aAAe,EAAgB,UAAU,EAAW,gBAAgB,CAAC,CACrE,UAAY,EAAgB,UAAU,EAAW,eAAe,CAAC,CACjE,MAAM,CACN,QAAQ,GAAG,CACf,CAAC,OCRF,SAAgB,IAAiC,CAC/C,OACE,EAAA,EAAA,KAAC,EAAD,CAAA,UACE,EAAA,EAAA,KAAC,MAAD,CAAK,QAAQ,sBACX,EAAA,EAAA,KAAC,OAAD,CAAM,EAAE,wkCAAykC,CAAA,CAC7kC,CAAA,CACQ,CAAA,CCMpB,IAAM,EAAY,yBACZ,EAAY,EAAgB,iBAAiB,EAAU,CAW7D,SAAgB,GAAc,EAAwC,CACpE,IAAM,EAAgB,EAAc,EAAkB,OAAO,CAGvD,CAAE,EAAU,GAAA,EAAsB,SAAS,CAAC,EAAc,CAE1D,EAAa,EAAM,YAAY,cAOrC,OALA,EAAM,cAAgB,CAChB,CAAC,GAAiB,CAAC,GACrB,EAAY,GAAK,EAClB,CAAE,EAAe,EAAU,CAAC,EAG7B,EAAA,EAAA,MAAC,EAAyB,SAA1B,CAAmC,MAAO,WAA1C,EACE,EAAA,EAAA,MAAC,KAAD,CAAI,UAAU,wCAAd,EACE,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,UAAY,CAAA,CACxB,IACC,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,yFAAhB,EACE,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,WAAa,CAAA,EAC1B,EAAA,EAAA,KAAC,GAAD,EAAqB,CAAA,CAAA,MAK1B,IACC,EAAA,EAAA,KAAC,IAAD,CAAA,UAAG,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,OAAO,QAAS,CAAE,MAAO,EAAM,YAAY,MAAA,CAAW,CAAA,CAAI,CAAA,CAG1E,GAUE,EAAA,EAAA,KAAC,EAAD,CACE,cAAe,CAAE,MAAO,EAAM,YAAY,OAAS,GAAI,CACvD,SAAU,EAAM,cAChB,iBAAkB,YAElB,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAD,CACE,UAAU,OACV,KAAK,QACL,YAAa,EAAU,mBAAmB,CAC1C,aAAa,QACb,CAAA,EACF,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,mCAAmC,EAAgB,QAAU,cAA7E,CACG,IACC,EAAA,EAAA,KAAC,SAAD,CAAQ,KAAK,SAAS,UAAU,oBAAoB,YAAe,EAAY,GAAM,WACnF,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,SAAW,CAAA,CACjB,CAAA,EAEX,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,GACP,WAAyB,EAAb,EAAuB,cAA2B,cAAc,CAC5E,QAAS,EAAa,eAAiB,OACvC,CAAA,CAAA,GAEC,CAAA,CAAA,CACK,CAAA,EAjCd,EAAA,EAAA,KAAA,EAAA,SAAA,CAAA,UACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mBACb,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,4BAA4B,YAAe,EAAY,GAAK,WAC5E,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,SAAW,CAAA,CACjB,CAAA,CACL,CAAA,CACL,CAAA,sME7Db,SAAgB,IAAoC,CAClD,OACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,gBAAf,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,mCAAmC,EAAO,eAAkB,CAAA,EAC5E,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,8BAA8B,EAAO,cAAiB,CAAA,EAEtE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,uBACb,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,8BAA8B,EAAO,eAAkB,CAAA,CACnE,CAAA,EACN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,8BAA8B,EAAO,gBAAmB,CAAA,EACxE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,mCAAmC,EAAO,cAAiB,CAAA,ICHjF,IAAM,EAAY,4BACZ,EAAY,EAAgB,iBAAiB,EAAU,CAiB7D,EAAmB,aAAe,CAChC,cAAe,eACf,qBAAsB,8DACtB,gBAAiB,QAClB,CAED,SAAgB,EAAmB,EAA6C,CAC9E,IAAM,EAAc,GAAyC,CAE7D,OACE,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,CACG,CAAC,EAAM,sBACN,EAAA,EAAA,KAAC,EAAD,CACE,UAAW,EAAM,gBACjB,KAAK,kBACL,MAAO,EAAU,kBAAkB,CACnC,YAAa,EAAU,6BAA6B,CACpD,KAAK,WACL,aAAa,mBACb,iBAAA,GACA,CAAA,EAGJ,EAAA,EAAA,KAAC,EAAD,CACE,UAAW,EAAM,gBACjB,KAAK,cACL,MAAO,EAAU,cAAc,CAC/B,YAAa,EAAU,yBAAyB,CAChD,KAAK,WACL,aAAa,eACb,iBAAA,GACA,CAAA,EAEF,EAAA,EAAA,KAAC,EAAD,CACE,UAAW,EAAM,gBACjB,KAAK,kBACL,MAAO,EAAU,kBAAkB,CACnC,YAAa,EAAU,6BAA6B,CACpD,KAAK,WACL,aAAa,MACb,iBAAA,GACA,CAAA,CAED,EAAM,wBACL,EAAA,EAAA,KAAC,EAAD,CACE,GAAG,oBACH,KAAK,oBACL,MAAO,EAAU,oBAAoB,CACrC,KAAK,WACL,QAAS,EAAY,OAAO,kBAC5B,wBAAwB,SACxB,CAAA,CAGH,CAAC,EAAM,cACN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAW,EAAM,8BAAtB,CACI,CAAC,EAAM,kBAAoB,CAAC,CAAC,EAAM,gBACnC,EAAA,EAAA,KAAC,SAAD,CACE,KAAK,SACL,UAAW,qBAAqB,EAAM,aAAe,KAAO,SAAW,KACvE,QAAS,EAAM,wBAEf,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,SAAW,CAAA,CACvC,CAAA,EAEX,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,GACP,WAAY,EAAM,YAAc,EAAU,OAAO,CACjD,QAAS,EAAM,cACf,KAAM,EAAM,WACZ,CAAA,CAAA,GAGD,CAAA,CAAA,CCjGX,IAAM,EAAY,EAAgB,iBADhB,4BAC2C,CAEhD,GAAuC,IAAA,EAAA,EAAA,SAAsC,CAAC,MAAM,CAC/F,iBAAA,EAAA,EAAA,SAAyB,CACtB,aAAe,EAAU,0BAA0B,CAAC,CACpD,MAAM,CACN,QAAQ,GAAG,CACd,aAAA,EAAA,EAAA,SAAqB,CAClB,aAAe,EAAU,sBAAsB,CAAC,CAChD,IAAI,MAAyB,EAAU,uBAAwB,CAAE,OAAQ,EAAmB,CAAC,CAAC,CAC9F,MAAM,CACN,QAAQ,GAAG,CACd,iBAAA,EAAA,EAAA,SAAyB,CACtB,aAAe,EAAU,0BAA0B,CAAC,CACpD,MAAM,EAAA,EAAA,EAAA,KAAM,cAAc,CAAE,KAAM,KAAQ,EAAU,qBAAqB,CAAC,CAC1E,MAAM,CACN,QAAQ,GAAG,CACf,CAAC,CCTI,EAAY,4BAEZ,GAAuC,CAC3C,gBAAiB,GACjB,YAAa,GACb,gBAAiB,GAClB,CAWD,SAAgB,GAAiB,EAA2C,CAC1E,IAAM,EAAgB,EAAc,EAAkB,OAAO,CAGvD,CAAE,EAAU,GAAA,EAAsB,SAAS,CAAC,EAAc,CAEhE,EAAM,cAAgB,CAChB,CAAC,GAAiB,CAAC,GACrB,EAAY,GAAK,EAClB,CAAE,EAAe,EAAU,CAAC,CAE/B,SAAS,EAAiB,EAA6B,EAAmD,CACxG,EAAM,iBAAiB,EAAM,MAAc,EAAO,CAAE,MAAO,GAAM,CAAC,CAAC,CAGrE,OACE,EAAA,EAAA,MAAC,EAAyB,SAA1B,CAAmC,MAAO,WAA1C,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,eAAK,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,UAAY,CAAA,CAAK,CAAA,CAE/C,GAME,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,IAAD,CAAA,UAAG,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,OAAS,CAAA,CAAI,CAAA,EAE7B,EAAA,EAAA,KAAC,EAAD,CACiB,iBACf,SAAU,EACV,iBAAkB,GAAoC,EAAM,kBAAkB,WAE9E,EAAA,EAAA,KAAC,EAAD,CACE,kBAAqB,EAAY,GAAM,CACvC,iBAAkB,CAAC,EACnB,WAAY,EAAgB,UAAU,EAAW,eAAe,CAChE,qBAAsB,EACpB,wCACA,kCAEF,gBAAgB,OAChB,CAAA,CACU,CAAA,CACb,CAAA,CAAA,EAvBH,EAAA,EAAA,KAAC,SAAD,CAAQ,UAAU,wBAAwB,YAAe,EAAY,GAAK,WACxE,EAAA,EAAA,KAAC,EAAD,CAAM,OAAO,SAAW,CAAA,CACjB,CAAA,CAwBqB,GCxExC,IAAa,GAA2B,CACtC,4BACE,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,0BAA0B,EAAW,oBAC1C,IAAK,8BACL,UAAW,GACX,UACA,QACD,EAGH,4BACE,EACA,EACA,EACA,EACgB,CAChB,MAAO,CACL,IAAK,0BAA0B,EAAW,oBAC1C,IAAK,2BACL,iBAAkB,8BAClB,KAAM,EAAU,IAChB,UAAW,GACX,OACA,UACA,QACD,EAEJ,CCVK,EAAY,EAAgB,iBADhB,2BAC2C,CAE7D,SAAgB,IAAmC,CACjD,IAAM,EAAW,GAAa,CACxB,EAAS,IAAW,CACpB,EAAgB,EAAc,EAAkB,OAAO,CAEvD,EAAc,EAAkC,GAAa,aAAa,CAAC,CAC3E,EAAoB,EAA2B,EAAY,MAC/D,EAAoB,QAAQ,EAAY,KAAK,GAAG,CAAC,CAC7C,EAAiB,EAA+C,EAAY,MAChF,GAAyB,4BAA4B,EAAY,KAAK,WAAW,CAAC,CAEpF,EAAmB,CAAE,MAAO,EAAU,UAAU,CAAE,CAAC,CAEnD,SAAS,EAAc,EAAgC,EAA2B,CAChF,EAAa,EAAU,EAAoB,YAAY,EAAW,UAAa,CAC7E,EAAgB,cAAc,CAC5B,GAAI,EAAY,KAAK,GACrB,SAAU,EAAY,KAAK,MAC3B,SAAU,EAAW,MACtB,CAAE,CACD,WAAY,EAAW,YACvB,OAAQ,EAAW,KACnB,SAAU,EAAgB,SAC1B,cAAe,EAAc,MAC9B,CAAC,CAEF,EAAO,QAAQ,EAAU,4BAA6B,CAAE,MAAO,EAAW,MAAO,WAAY,GAAM,CAAC,CAAC,MAC9F,CACP,EAAO,MAAM,EAAU,0BAA0B,CAAC,EACjD,EAAO,CAAC,CAGb,SAAS,EACP,EACA,EACA,EACM,CACN,EAAa,EAAU,EAAoB,eAAe,MAAqB,CAC7E,EAAgB,cAAc,CAC5B,GAAI,EAAY,KAAK,GACrB,YAAa,EAAc,gBAC3B,YAAa,EAAc,YAC5B,CAAE,CACD,WAAY,EAAW,eACvB,OAAQ,EAAW,KACnB,SAAU,EAAgB,SAC1B,cAAe,EAAc,SAC9B,CAAC,CAEF,EAAO,QAAQ,EAAU,wBAAwB,CAAC,CAClD,GAAW,GACT,CAAE,kBAAiC,CACjC,EAAa,YAAc,0BAC7B,EAAO,MAAM,EAAU,kCAAkC,CAAC,CACnD,EAAa,YAAc,wBAClC,EAAO,MAAM,EAAU,wBAAwB,CAAC,CACzC,EAAa,YAAc,qBAClC,EAAO,MAAM,EAAU,qBAAqB,CAAC,CACtC,EAAa,YAAc,kBAClC,EAAO,MAAM,EAAU,0BAA0B,CAAC,CAElD,EAAO,MAAM,EAAU,sBAAsB,CAAC,EAC/C,EAAO,CAAC,CAGb,IAAM,EAAoB,EAAkB,yBAC1C,EAAe,KACf,EAAkB,MAAM,SACxB,EAAY,KAAK,KAClB,CAED,OACE,EAAA,EAAA,MAAC,EAAD,CACE,QAAS,EAAU,UAAU,CAC7B,YAAa,CAAC,EAAU,aAAa,CAAC,UAFxC,EAIE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAgB,QAAU,gBACtC,EAAY,MAEV,EAAA,EAAA,KAAC,GAAD,CACE,YAAa,EAAY,KACV,gBACf,CAAA,EACA,EAAA,EAAA,KAAC,GAAD,EAAwB,CAAA,CAE1B,CAAA,EAEN,EAAA,EAAA,KAAC,KAAD,EAAM,CAAA,EAEN,EAAA,EAAA,KAAC,MAAD,CAAK,UAAW,EAAgB,QAAU,gBACvC,EAAe,OACd,EAAA,EAAA,KAAC,GAAD,CAAoC,mBAAqC,oBAAqB,CAAA,CAE5F,CAAA,CACS"}
|
|
1
|
+
{"version":3,"file":"CNJrD44-2.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/user-manager/enums/UserValidationCode.ts","../../../../libs/shared/src/apps/user-manager/utils/UserManagerHelper.ts","../../src/apps/settings/components/email-settings/EmailSettingsValidationSchema.ts","../../src/apps/settings/components/email-settings/VerifiedEmailIcon.tsx","../../src/apps/settings/components/email-settings/EmailSettings.tsx","../../src/apps/settings/components/email-settings/partial-loading/partial-email-settings.module.scss","../../src/apps/settings/components/email-settings/partial-loading/PartialEmailSettings.tsx","../../../../libs/shared/src/apps/user-manager/components/change-password-form/ChangePasswordForm.tsx","../../src/apps/settings/components/password-settings/PasswordSettingsValidationSchema.ts","../../src/apps/settings/components/password-settings/PasswordSettings.tsx","../../src/apps/settings/flight-requests/SecuritySettingsRequests.ts","../../src/apps/settings/views/account-settings/AccountSettingsView.tsx"],"sourcesContent":["// Copied directly from User API\nexport enum UserValidationCode {\n Ok = 'Ok',\n UsernameRequired = 'UsernameRequired',\n EmailRequired = 'EmailRequired',\n FirstnameRequired = 'FirstnameRequired',\n SurnameRequired = 'SurnameRequired',\n YearGroupRequired = 'YearGroupRequired',\n EmailAlreadyExisted = 'EmailAlreadyExisted', // This means another user has this email address, and it's verified\n UsernameAlreadyExisted = 'UsernameAlreadyExisted',\n UserTypeRequired = 'UserTypeRequired',\n MasterYearGroupRequired = 'MasterYearGroupRequired',\n EmptyUserEntity = 'EmptyUserEntity',\n CustomerIdRequired = 'CustomerIdRequired',\n CustomerNotFoundInOnline = 'CustomerNotFoundInOnline',\n EmailTooLong = 'EmailTooLong',\n UsernameTooLong = 'UsernameTooLong',\n FirstnameTooLong = 'FirstnameTooLong',\n SurnameTooLong = 'SurnameTooLong',\n EmailInvalid = 'EmailInvalid',\n EmailInUse = 'EmailInUse', // This means another user has this email address, but it's unverified\n UsernameInvalid = 'UsernameInvalid',\n PasswordTooShort = 'PasswordTooShort',\n EmailDuplicated = 'EmailDuplicated', // Same email has been used in the same request\n UsernameDuplicated = 'UsernameDuplicated', // Same username has been used in the same request\n DisplayNameTooLong = 'DisplayNameTooLong',\n DisplayNameTooShort = 'DisplayNameTooShort',\n UsernameTooShort = 'UsernameTooShort',\n FirstnameInvalid = 'FirstnameInvalid',\n SurnameInvalid = 'SurnameInvalid',\n\n // user man 3.0\n UserTypeMismatch = 'UserTypeMismatch',\n UserCanBeAddedInCustomer = 'UserCanBeAddedInCustomer',\n UserCanBeCreated = 'UserCanBeCreated',\n CustomerFoundInOnline = 'CustomerFoundInOnline',\n UserInCustomerWithOnline = 'UserInCustomerWithOnline',\n InvalidUserStatus = 'InvalidUserStatus',\n UserAlreadyExistsInCustomer = 'UserAlreadyExistsInCustomer',\n\n // a user created by rostered\n Rostered = 'UserRostered',\n\n // Unknown year group\n InvalidYearGroup = 'InvalidYearGroup'\n}\n","import { FormikErrors } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { SearchFilter, SearchResults } from 'libs/shared/apps/search/interfaces';\nimport { FilterHelper, Filters } from 'libs/shared/apps/search/utils/FilterHelper';\nimport { UserValidationCode } from 'libs/shared/apps/user-manager/enums/UserValidationCode';\nimport { BulkCreateOrValidateUserRequest, BulkDeleteUsersRequest, BulkUpdateUserStatusRequest, EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserManagerQueryParams } from 'libs/shared/apps/user-manager/interfaces/query-params/UserManagerQueryParams';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { FormSubmissionOptions } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { Customer, User, UserCollection, YearGroup } from 'libs/shared/interfaces';\n\nimport { FilterConstants } from '../../search/constants/FilterConstants';\nimport { DuplicateUserSet } from '../interfaces/viewmodels/BulkUserUploadViewModel';\n\nconst FALLBACK_MIN_PASSWORD_LENGTH = 8;\nconst namespace = 'userManager.utils';\n\nconst StatusMap: HashObject = {\n active: ObjectStatus.Active.toLowerCase(),\n deactivated: ObjectStatus.Disabled.toLowerCase(),\n pending: ObjectStatus.Inactive.toLowerCase()\n};\n\nexport const UserManagerHelper = {\n filterIdenticalEntries(spreadsheetEntries: EditUserRequest[]): EditUserRequest[] {\n const identify = (u: EditUserRequest) => {\n return [\n u.firstName?.trim() ?? '',\n u.surname?.trim() ?? '',\n u.masterYearGroup?.id ?? '',\n u.username?.toLowerCase()?.trim() ?? '',\n u.email?.toLowerCase()?.trim() ?? ''\n ].join(':');\n };\n\n return spreadsheetEntries.filter((entry, index, self) =>\n index === self.findIndex(u => identify(u) === identify(entry)));\n },\n\n getNewDuplicates(users?: EditUserRequest[]): DuplicateUserSet[] {\n if (!users)\n return null;\n\n const duplicateSets: DuplicateUserSet[] = [];\n const validUsers: EditUserRequest[] = [];\n\n /**\n * Find all users in uploaded spreadsheet with duplicate usernames.\n */\n const usernameDuplicateLookup: {[ username: string ]: EditUserRequest[] } = {};\n\n users.forEach(user => {\n if (!user.username) {\n validUsers.push(user);\n return;\n }\n\n if (!usernameDuplicateLookup[user.username]) {\n usernameDuplicateLookup[user.username] = [user];\n return;\n }\n\n usernameDuplicateLookup[user.username].push(user);\n });\n\n Object.keys(usernameDuplicateLookup).map(username => {\n if (usernameDuplicateLookup[username].length === 1) {\n validUsers.push(usernameDuplicateLookup[username][0]);\n return;\n }\n\n duplicateSets.push({\n errorCodes: [UserValidationCode.UsernameAlreadyExisted],\n users: usernameDuplicateLookup[username]\n });\n });\n\n /**\n * Find all remaining users in spreadsheet with duplicate emails\n */\n const emailDuplicateLookup: {[ email: string ]: EditUserRequest[] } = {};\n\n users.forEach(user => {\n if (!user.email)\n return;\n\n if (!emailDuplicateLookup[user.email]) {\n emailDuplicateLookup[user.email] = [user];\n return;\n }\n\n emailDuplicateLookup[user.email].push(user);\n });\n\n Object.keys(emailDuplicateLookup).map(email => {\n if (emailDuplicateLookup[email].length === 1)\n return;\n\n const { username } = ArrayHelper.first(emailDuplicateLookup[email]);\n\n if (!username || usernameDuplicateLookup[username].length === 1) {\n duplicateSets.push({\n errorCodes: [UserValidationCode.EmailAlreadyExisted],\n users: emailDuplicateLookup[email]\n });\n } else {\n const dupeSetIndex = duplicateSets.findIndex(set => ArrayHelper.first(set.users).username === username);\n\n duplicateSets[dupeSetIndex].errorCodes.push(UserValidationCode.EmailAlreadyExisted);\n }\n });\n\n return duplicateSets;\n },\n\n formatCreateOrValidateUserRequest(\n users: EditUserRequest[],\n userType: UserGroup,\n customerId: string\n ): BulkCreateOrValidateUserRequest {\n return {\n users: users.map((u: EditUserRequest) => {\n const obj: EditUserRequest = {\n firstName: u.firstName,\n email: u.email,\n surname: u.surname,\n username: u.username,\n userType,\n customerId,\n masterRole: u.masterRole || UserRole.User,\n requirePasswordChange: false,\n generatePassword: !!u.generatePassword,\n password: u.password,\n displayName: u.displayName || null\n };\n\n if (userType === UserGroup.Learner)\n obj.yearGroupId = u.masterYearGroup?.id;\n\n if (!obj.username)\n delete obj.username;\n\n if (!obj.password)\n delete obj.password;\n\n if (obj.password && obj.generatePassword)\n obj.generatePassword = false;\n\n if (u.userId)\n obj.userId = u.userId;\n\n return obj;\n })\n };\n },\n\n formatEditUserRequest(user: EditUserRequest): EditUserRequest {\n if (!user.displayName)\n user.displayName = null;\n\n return user;\n },\n\n formatDeleteRequest(customerId: string, users?: User[], userType?: UserGroup): BulkDeleteUsersRequest {\n const body: BulkDeleteUsersRequest = {\n customerId\n };\n\n if (!users.length) {\n const queryParams = Core.LocationUtils.DeserializeQueryParams(\n Core.LocationUtils.GetCurrentQueryString().substring(1)\n );\n\n if (queryParams.query)\n body.searchQuery = queryParams.query;\n\n const statuses = queryParams.status &&\n (Array.isArray(queryParams.status) ? queryParams.status : [queryParams.status]);\n\n if (statuses?.length) {\n body.userStatuses = [];\n\n statuses.forEach(status => {\n if (status === 'active') body.userStatuses.push(ObjectStatus.Active);\n if (status === 'deactivated') body.userStatuses.push(ObjectStatus.Disabled);\n if (status === 'pending') body.userStatuses.push(ObjectStatus.Inactive);\n });\n }\n \n if (queryParams.yearGroup) {\n body.yearGroupValues = Array.isArray(queryParams.yearGroup) ? queryParams.yearGroup : [queryParams.yearGroup];\n }\n }\n\n if (Object.keys(body).length === 1) {\n body.userIds = users.map(u => u.id);\n } else {\n body.userType = userType;\n }\n\n return body;\n },\n\n formatToggleStatusRequest(user: User, customerId: string, newStatus: ObjectStatus): BulkUpdateUserStatusRequest {\n return {\n customerId,\n users: [{\n userId: user.id,\n status: newStatus\n }]\n };\n },\n\n getErrorMessages(\n errorCodes: UserValidationCode[],\n minPasswordLength: number,\n shortMessages?: boolean,\n localMessage?: HashObject\n ) {\n const messages: HashObject = {};\n\n const getPhrase = LanguageService.encloseNamespace('userManager.utils');\n\n const CodeToMessageMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: getPhrase('emailRequired'),\n [UserValidationCode.FirstnameRequired]: getPhrase('nameRequired'),\n [UserValidationCode.SurnameRequired]: getPhrase('surnameRequired'),\n [UserValidationCode.YearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmailAlreadyExisted]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameAlreadyExisted]: getPhrase(shortMessages ? 'usernameExistsShort' : 'usernameExistsLong'),\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: getPhrase('yearGroupRequired'),\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: getPhrase('emailExceeds'),\n [UserValidationCode.UsernameTooLong]: getPhrase('usernameExceeds'),\n [UserValidationCode.FirstnameTooLong]: getPhrase('nameExceeds'),\n [UserValidationCode.SurnameTooLong]: getPhrase('surnameExceeds'),\n [UserValidationCode.EmailInvalid]: getPhrase(shortMessages ? 'emailInvalidShort' : 'emailInvalidLong'),\n [UserValidationCode.EmailInUse]: getPhrase(shortMessages ? 'emailExistsShort' : 'emailExistsLong'),\n [UserValidationCode.UsernameInvalid]: getPhrase(shortMessages ? 'usernameInvalidShort' : 'usernameInvalidLong'),\n [UserValidationCode.PasswordTooShort]: getPhrase(shortMessages ? 'passwordTooShortShort' : 'passwordTooShortLong', { minLength: minPasswordLength }),\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: getPhrase('displayNameExceeds'),\n [UserValidationCode.DisplayNameTooShort]: getPhrase('displayNameTooShort'),\n [UserValidationCode.UsernameTooShort]: getPhrase('usernameTooShort'),\n [UserValidationCode.FirstnameInvalid]: getPhrase('firstNameInvalid'),\n [UserValidationCode.SurnameInvalid]: getPhrase('surnameInvalid'),\n [UserValidationCode.CustomerFoundInOnline]: getPhrase('support'),\n [UserValidationCode.UserInCustomerWithOnline]: getPhrase('support'),\n [UserValidationCode.InvalidUserStatus]: getPhrase('support'),\n [UserValidationCode.UserTypeMismatch]: '',\n [UserValidationCode.UserCanBeAddedInCustomer]: '',\n [UserValidationCode.UserCanBeCreated]: '',\n [UserValidationCode.UserAlreadyExistsInCustomer]: '',\n [UserValidationCode.Rostered]: '',\n [UserValidationCode.InvalidYearGroup]: getPhrase('invalidYearGroupError')\n };\n\n const CodeToFieldMap = {\n [UserValidationCode.Ok]: '',\n [UserValidationCode.UsernameRequired]: '',\n [UserValidationCode.EmailRequired]: 'email',\n [UserValidationCode.FirstnameRequired]: 'firstName',\n [UserValidationCode.SurnameRequired]: 'surname',\n [UserValidationCode.YearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmailAlreadyExisted]: 'email',\n [UserValidationCode.UsernameAlreadyExisted]: 'username',\n [UserValidationCode.UserTypeRequired]: '',\n [UserValidationCode.MasterYearGroupRequired]: 'masterYearGroup',\n [UserValidationCode.EmptyUserEntity]: '',\n [UserValidationCode.CustomerIdRequired]: '',\n [UserValidationCode.CustomerNotFoundInOnline]: '',\n [UserValidationCode.EmailTooLong]: 'email',\n [UserValidationCode.UsernameTooLong]: 'username',\n [UserValidationCode.FirstnameTooLong]: 'firstName',\n [UserValidationCode.SurnameTooLong]: 'surname',\n [UserValidationCode.EmailInvalid]: 'email',\n [UserValidationCode.EmailInUse]: 'email',\n [UserValidationCode.UsernameInvalid]: 'username',\n [UserValidationCode.PasswordTooShort]: 'password',\n [UserValidationCode.EmailDuplicated]: '',\n [UserValidationCode.UsernameDuplicated]: '',\n [UserValidationCode.DisplayNameTooLong]: 'displayName',\n [UserValidationCode.DisplayNameTooShort]: 'displayName',\n [UserValidationCode.UsernameTooShort]: 'username',\n [UserValidationCode.FirstnameInvalid]: 'firstName',\n [UserValidationCode.SurnameInvalid]: 'surname',\n [UserValidationCode.UserTypeMismatch]: 'email',\n [UserValidationCode.UserCanBeAddedInCustomer]: 'email',\n [UserValidationCode.UserCanBeCreated]: 'email',\n [UserValidationCode.CustomerFoundInOnline]: 'email',\n [UserValidationCode.UserInCustomerWithOnline]: 'email',\n [UserValidationCode.InvalidUserStatus]: 'email',\n [UserValidationCode.UserAlreadyExistsInCustomer]: 'email',\n [UserValidationCode.Rostered]: 'email',\n [UserValidationCode.InvalidYearGroup]: 'masterYearGroup'\n };\n\n errorCodes.forEach(code => {\n const message = localMessage?.[code] ?? CodeToMessageMap[code] ?? '';\n\n if (!message)\n return;\n\n const field = CodeToFieldMap[code];\n\n if (!field)\n return;\n\n messages[field] = localMessage?.[code]?.[field] ?? message;\n });\n\n return messages;\n },\n\n showEmptyState(userRequest: Flight.Response<UserCollection | SearchResults<User>>, queryParams: HashObject): boolean {\n if (!userRequest.data)\n return false;\n\n const hasQueryParams = Object.keys(queryParams).length;\n\n if (('results' in userRequest.data) || hasQueryParams)\n return false;\n\n return !userRequest.data.data?.length;\n },\n\n getFilters(customer: Customer, userType: UserGroup, yearGroups?: YearGroup[], countryCode?: string): SearchFilter[] {\n const filters = [Filters.SortBy(FilterHelper.getNameSortOptions())];\n\n if (userType === UserGroup.Learner && yearGroups?.length > 1)\n filters.push(Filters.YearGroup(FilterHelper.getYearGroupOptions(yearGroups)));\n\n filters.push(Filters.Status());\n \n if (userType === UserGroup.Staff)\n filters.push(Filters.IsAdmin(customer, countryCode));\n\n return filters;\n },\n\n getMinimumPasswordLength(\n securitySettings: SecuritySettingsResponse,\n userType: UserGroup,\n userRole: UserRole\n ): number {\n if (!securitySettings)\n return FALLBACK_MIN_PASSWORD_LENGTH;\n\n const customSetting = securitySettings.securitySettings?.find(s => {\n return s.userRole === userRole && s.userType === userType;\n });\n\n if (customSetting)\n return customSetting.minPasswordLength;\n\n if (userRole === UserRole.Admin || userRole === UserRole.SuperAdmin)\n return securitySettings.defaultAdminMinPasswordLength;\n\n return securitySettings.defaultMinPasswordLength;\n },\n\n mapStatusParamsToValue(statusParam: string | string[]): ObjectStatus[] {\n if (!statusParam)\n return;\n\n const convertToValue = (status: string): ObjectStatus => {\n switch (status) {\n case 'active':\n return ObjectStatus.Active;\n case 'deactivated':\n return ObjectStatus.Disabled;\n case 'pending':\n return ObjectStatus.Inactive;\n }\n };\n\n if (!Array.isArray(statusParam))\n return [convertToValue(statusParam)];\n\n return statusParam.map(convertToValue);\n },\n\n buildSearchData({\n customerId,\n userId,\n userType,\n queryParams = {}\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams\n }): HashObject {\n const filters = UserManagerHelper.buildSearchFiltersData(customerId, userType, queryParams);\n const sorts = UserManagerHelper.buildSearchSortData(customerId, queryParams);\n\n return {\n query: queryParams.query,\n indices: ['user'],\n searchType: 'user',\n customerIdOverride: customerId,\n userId,\n customerId,\n filters,\n sorts\n };\n },\n\n buildSearchDataAndKey({\n customerId,\n userId,\n userType,\n queryParams,\n cursor\n }: {\n customerId: string,\n userId?: string,\n userType: UserGroup,\n queryParams?: UserManagerQueryParams,\n cursor?: string\n }): { key: string, data: HashObject } {\n const data = UserManagerHelper.buildSearchData({\n customerId,\n userId: userId || '',\n userType,\n queryParams: queryParams || {}\n });\n\n if (cursor)\n data.cursor = cursor;\n\n let key = `search:users:${cursor || ''}`;\n key += ObjectHelper.flattenObjectToString(data);\n\n return { key, data };\n },\n\n buildSearchParams(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n let filters = UserManagerHelper.buildSearchFiltersObject(customerId, userType, queryParams);\n\n filters = Object.keys(filters).reduce((prev: HashObject, current) => {\n prev[`${FilterConstants.FILTER_PARAM_PREFIX}${current}`] = filters[current];\n return prev;\n }, {});\n\n return {\n query: queryParams.query,\n index: 'user',\n customerIdOverride: customerId,\n ...filters\n };\n },\n\n buildSearchSortData(customerId: string, queryParams: UserManagerQueryParams = {}): HashObject {\n const sorts: HashObject = {};\n\n if (queryParams.sort) {\n switch (queryParams.sort) {\n case 'first-name-atoz':\n sorts.firstName = 'asc';\n break;\n\n case 'first-name-ztoa':\n sorts.firstName = 'desc';\n break;\n\n case 'surname-atoz':\n sorts.surname = 'asc';\n break;\n\n case 'surname-ztoa':\n sorts.surname = 'desc';\n break;\n\n case 'newest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n break;\n case 'oldest':\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'asc'\n }\n };\n break;\n\n default:\n break;\n }\n } else {\n // default to newest sort\n sorts.userProfile = {\n customerId,\n fieldOrders: {\n dateCreated: 'desc'\n }\n };\n }\n\n return sorts;\n },\n\n buildSearchFiltersData(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase()\n };\n\n filters.userProfile = {\n customerId\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userProfile.role = [ UserRole.Admin.toLowerCase(), UserRole.SuperAdmin.toLowerCase() ];\n\n if (queryParams.yearGroup) {\n filters.yearGroup = { customerId };\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup.value = queryParams.yearGroup;\n } else {\n filters.yearGroup.value = [queryParams.yearGroup];\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfile.status = [StatusMap[queryParams.status]];\n } else {\n filters.userProfile.status = queryParams.status.map(val => StatusMap[val]);\n }\n }\n\n return filters;\n },\n\n buildSearchFiltersObject(\n customerId: string,\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): HashObject {\n const filters: HashObject = {\n userType: userType.toLowerCase(),\n customerId: customerId.toString()\n };\n\n if (queryParams.isAdmin === 'true')\n filters.userRole = UserRole.Admin.toLowerCase();\n\n if (queryParams.yearGroup) {\n if (Array.isArray(queryParams.yearGroup)) {\n filters.yearGroup = `${queryParams.yearGroup.join(',')}`;\n } else {\n filters.yearGroup = queryParams.yearGroup;\n }\n }\n\n if (queryParams.status) {\n if (!Array.isArray(queryParams.status)) {\n filters.userProfileStatus = StatusMap[queryParams.status];\n } else {\n filters.userProfileStatus = queryParams.status.map(val => StatusMap[val]).join(',');\n }\n }\n\n return filters;\n },\n\n buildGetUsersQuery(\n userType: UserGroup,\n queryParams: UserManagerQueryParams = {}\n ): string {\n const { yearGroup = '', status = '', isAdmin = '', sort = 'newest' } = queryParams;\n\n const filters = [`usertype:${userType}`];\n\n if (yearGroup) {\n if (Array.isArray(yearGroup)) {\n filters.push(`yeargroups.value:[${yearGroup.join(',')}]`);\n } else {\n filters.push(`yeargroups.value:${yearGroup}`);\n }\n }\n\n if (isAdmin === 'true')\n filters.push(`userprofiles.role:${UserRole.Admin}`);\n\n if (status) {\n if (!Array.isArray(status)) {\n filters.push(`status:${StatusMap[status]}`);\n } else {\n filters.push(`status:[${status.map(val => StatusMap[val]).join(',')}]`);\n }\n }\n\n if (sort) {\n switch (sort) {\n case 'first-name-atoz':\n filters.push('orderby:name');\n break;\n \n case 'first-name-ztoa':\n filters.push('orderbydesc:name');\n break;\n \n case 'surname-atoz':\n filters.push('orderby:surname');\n break;\n \n case 'surname-ztoa':\n filters.push('orderbydesc:surname');\n break;\n\n case 'newest':\n filters.push('orderbydesc:timestamp');\n break;\n\n case 'oldest':\n filters.push('orderby:timestamp');\n break;\n \n default:\n break;\n }\n }\n\n return `{${filters.join(',')}}avatar`;\n },\n\n shouldDisplayAuthenticationMethods(users: User[]): boolean {\n if (!users?.length)\n return false;\n\n const hasFetchedAuthenticationMethods = !!ArrayHelper.first(users).authenticationMethods?.length;\n\n if (!hasFetchedAuthenticationMethods)\n return false;\n\n const userWithSSO = users.find(u => {\n const ssoLoginMethod = u.authenticationMethods?.find(am => !am.local);\n\n return !!ssoLoginMethod;\n });\n\n /**\n * If any user in the list has an authentication method that isn't local (meaning it's SSO)\n * then we display authentication methods.\n * \n * Otherwise we don't show them, as every user list item would just say \"ClickView\"\n */\n if (userWithSSO)\n return true;\n\n return false;\n },\n\n handleAsyncErrors(\n errors: ErroredUsers,\n updatedUser: EditUserRequest,\n oldUser: User | null,\n onDone: (options: FormSubmissionOptions) => void\n ): boolean {\n const errorCodes = errors?.[0]?.errorCodes;\n\n if (!errorCodes?.length)\n return true;\n\n const errorMessages: FormikErrors<EditUserRequest> = {};\n\n if (\n errorCodes.includes(UserValidationCode.EmailAlreadyExisted) ||\n errorCodes.includes(UserValidationCode.EmailInUse)\n ) {\n if (!oldUser || oldUser.email !== updatedUser.email)\n errorMessages.email = LanguageService.getPhrase(namespace, 'emailExistsLong');\n }\n\n if (errorCodes.includes(UserValidationCode.UsernameAlreadyExisted)) {\n if (!oldUser || oldUser.username !== updatedUser.username)\n errorMessages.username = LanguageService.getPhrase(namespace, 'usernameExistsLong');\n }\n\n if (!Object.keys(errorMessages).length)\n return true;\n\n onDone({\n errors: errorMessages\n });\n\n return false;\n },\n\n getInitialErrorsForInvalidYearGroups(yearGroup: YearGroup): FormikErrors<EditUserRequest> {\n if (!yearGroup || yearGroup.value === 0)\n return {\n masterYearGroup: LanguageService.getPhrase(namespace, 'yearGroupRequired') as FormikErrors<YearGroup>\n };\n\n return {};\n }\n};\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.emailSettings';\n\nexport const EmailSettingsValidationSchema = object().shape({\n email: string()\n .required(() => LanguageService.getPhrase(namespace, 'emailRequired'))\n .email(() => LanguageService.getPhrase(namespace, 'emailInvalid'))\n .trim()\n .default('')\n});\n","import React from 'react';\n\nimport { SvgContainer2 } from 'libs/shared/components/svg-container/SvgContainer2';\n\nexport function VerifiedEmailIcon(): JSX.Element {\n return (\n <SvgContainer2>\n <svg viewBox='0 0 24 24'>\n <path d='M10.407 12.368l-1.22-1.22a.49.49 0 0 0-.698.004l-.583.583a.494.494 0 0 0-.004.697l2.135 2.135c.107.108.25.154.388.142a.488.488 0 0 0 .352-.143l4.362-4.362a.494.494 0 0 0-.004-.698l-.582-.582a.495.495 0 0 0-.698-.004l-3.448 3.448zm7.922-.37l1.437 1.406c.208.194.277.437.208.728a.716.716 0 0 1-.541.531l-1.957.5.551 1.936a.671.671 0 0 1-.197.729.671.671 0 0 1-.73.198l-1.935-.552-.5 1.957a.716.716 0 0 1-.53.541 1.28 1.28 0 0 1-.199.021.686.686 0 0 1-.53-.229L12 18.328l-1.405 1.436c-.195.208-.437.278-.729.208a.696.696 0 0 1-.53-.541l-.5-1.957-1.937.552a.671.671 0 0 1-.728-.198.671.671 0 0 1-.198-.729l.551-1.936-1.957-.5a.716.716 0 0 1-.54-.53c-.07-.292 0-.535.207-.73l1.437-1.405-1.437-1.405c-.208-.194-.277-.437-.208-.729a.716.716 0 0 1 .541-.53l1.957-.5-.551-1.936a.671.671 0 0 1 .198-.73.671.671 0 0 1 .728-.197l1.936.552.5-1.957a.675.675 0 0 1 .531-.531.671.671 0 0 1 .729.198L12 5.68l1.405-1.447a.697.697 0 0 1 .73-.198c.284.07.46.246.53.53l.5 1.958L17.1 5.97a.671.671 0 0 1 .729.198.671.671 0 0 1 .197.729l-.551 1.936 1.957.5a.715.715 0 0 1 .541.53c.07.292 0 .535-.208.73l-1.437 1.404z'/>\n </svg>\n </SvgContainer2>\n );\n}\n","import React from 'react';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { EmailSettingsValidationSchema } from './EmailSettingsValidationSchema';\nimport { VerifiedEmailIcon } from './VerifiedEmailIcon';\n\nconst namespace = 'settings.emailSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface EmailSettingsModel {\n email: string;\n}\n\ninterface EmailSettingsProps {\n currentUser: CurrentUser;\n onChangeEmail: (emailModel: EmailSettingsModel) => void;\n}\n\nexport function EmailSettings(props: EmailSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n const isVerified = props.currentUser.emailVerified;\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4 d-flex align-items-center'>\n <Text phrase='heading' />\n {isVerified && (\n <span className='font-size-normal fw-semibold text-primary d-flex align-items-center mb-0 ms-2'>\n <Text phrase='verified' />\n <VerifiedEmailIcon />\n </span>\n )}\n </h2>\n\n {isVerified && (\n <p><Text phrase='info' options={{ email: props.currentUser.email }} /></p>\n )}\n\n {!showForm ?\n (\n <>\n <div className='d-flex'>\n <button className='btn btn-outline-dark me-2' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n </div>\n </>\n ) : (\n <FormWrapper<EmailSettingsModel>\n initialValues={{ email: props.currentUser.email || '' }}\n onSubmit={props.onChangeEmail}\n validationSchema={EmailSettingsValidationSchema}\n >\n <Form>\n <FormField\n className='w-75'\n name='email'\n placeholder={getPhrase('emailPlaceholder')}\n autoComplete='email'\n />\n <div className={`d-flex justify-content-end w-75 ${isSmallScreen ? 'ms-n2' : ''}`}>\n {isSmallScreen && (\n <button type='button' className='btn btn-link me-2' onClick={() => setShowForm(false)}>\n <Text phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={isVerified ? getPhrase('updateEmail') : getPhrase('verifyEmail')}\n variant={isVerified ? 'outline-dark' : 'dark'}\n />\n </div>\n </Form>\n </FormWrapper>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}\n",":local {\n .partialLabel {\n width: 3.0625rem;\n height: 1.5rem;\n }\n\n .partialInfo {\n margin-bottom: 1rem;\n width: 28.125rem;\n height: 1.1875rem;\n }\n\n .partialInput {\n width: 25.75rem;\n height: 2.1875rem;\n }\n\n .partialSubmit {\n width: 6.75rem;\n height: 2.1875rem;\n }\n\n .partialNote {\n width: 30.625rem;\n height: 1.1875rem; \n }\n}","import React from 'react';\n\nimport styles from './partial-email-settings.module.scss';\n\nexport function PartialEmailSettings(): JSX.Element {\n return (\n <div className='w-50'>\n <div className={`partial-loading-background mb-2 ${styles.partialLabel}`} />\n <div className={`partial-loading-background ${styles.partialInfo}`} />\n\n <div className='form-group'>\n <div className={`partial-loading-background ${styles.partialInput}`} />\n </div>\n <div className={`partial-loading-background ${styles.partialSubmit}`} />\n <div className={`partial-loading-background mt-2 ${styles.partialNote}`} />\n </div>\n );\n}\n","import React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField, FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'shared.changePasswordForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface ChangePasswordFormProps {\n onClickCancel?: () => void;\n \n hideButtons?: boolean;\n buttonContainerClass?: string;\n buttonSize?: FormSize;\n hideCancelButton?: boolean;\n hideCurrentPassword?: boolean;\n inputWidthClass?: string;\n showChangeOnNextLogin?: boolean;\n\n submitText?: string;\n submitVariant?: ButtonProps['variant'];\n}\n\nChangePasswordForm.defaultProps = {\n submitVariant: 'outline-dark',\n buttonContainerClass: 'btn-container d-flex justify-content-end align-items-center',\n inputWidthClass: 'w-100'\n};\n\nexport function ChangePasswordForm(props: ChangePasswordFormProps): JSX.Element {\n const formikProps = useFormikContext<ChangePasswordRequest>();\n\n return (\n <Form>\n {!props.hideCurrentPassword && (\n <FormField\n className={props.inputWidthClass}\n name='currentPassword'\n label={getPhrase('currentPassword')}\n placeholder={getPhrase('currentPasswordPlaceholder')}\n type='password'\n autoComplete='current-password'\n showRequiredStar\n />\n )}\n\n <FormField\n className={props.inputWidthClass}\n name='newPassword'\n label={getPhrase('newPassword')}\n placeholder={getPhrase('newPasswordPlaceholder')}\n type='password'\n autoComplete='new-password'\n showRequiredStar\n />\n\n <FormField\n className={props.inputWidthClass}\n name='confirmPassword'\n label={getPhrase('confirmPassword')}\n placeholder={getPhrase('confirmPasswordPlaceholder')}\n type='password'\n autoComplete='off'\n showRequiredStar\n />\n\n {props.showChangeOnNextLogin &&\n <FormField\n id='changeOnNextLogin'\n name='changeOnNextLogin'\n label={getPhrase('changeOnNextLogin')}\n type='checkbox'\n checked={formikProps.values.changeOnNextLogin}\n checkboxLabelFontWeight='normal'\n />\n }\n \n {!props.hideButtons && (\n <div className={props.buttonContainerClass}>\n {(!props.hideCancelButton && !!props.onClickCancel) && (\n <button\n type='button'\n className={`btn btn-link me-2 ${props.buttonSize === 'lg' ? 'btn-lg' : ''}`}\n onClick={props.onClickCancel}\n >\n <Text namespace={namespace} phrase='cancel' />\n </button>\n )}\n <FormButtons\n isNew={false}\n submitText={props.submitText || getPhrase('save')}\n variant={props.submitVariant}\n size={props.buttonSize}\n />\n </div>\n )}\n </Form>\n );\n}\n","import { object, ref, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'settings.passwordSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const getPasswordSettingsValidationSchema = (minPasswordLength: number) => object().shape({\n currentPassword: string()\n .required(() => getPhrase('currentPasswordRequired'))\n .trim()\n .default(''),\n newPassword: string()\n .required(() => getPhrase('newPasswordRequired'))\n .min(minPasswordLength, () => getPhrase('newPasswordMinLength', { minLen: minPasswordLength }))\n .trim()\n .default(''),\n confirmPassword: string()\n .required(() => getPhrase('confirmPasswordRequired'))\n .oneOf([ ref('newPassword'), null ], () => getPhrase('passwordsDontMatch'))\n .trim()\n .default('')\n});\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { ChangePasswordForm } from 'libs/shared/apps/user-manager/components/change-password-form/ChangePasswordForm';\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { FormSubmissionOptions, FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\n\nimport { getPasswordSettingsValidationSchema } from './PasswordSettingsValidationSchema';\n\nconst namespace = 'settings.passwordSettings';\n\nconst initialValues: ChangePasswordRequest = {\n currentPassword: '',\n newPassword: '',\n confirmPassword: ''\n};\n\ninterface PasswordSettingsProps {\n onChangePassword: (\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ) => void;\n minPasswordLength: number;\n}\n\nexport function PasswordSettings(props: PasswordSettingsProps): JSX.Element {\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n // On small screens, we collapse the forms by default\n const [ showForm, setShowForm ] = React.useState(!isSmallScreen);\n\n React.useEffect(() => {\n if (!isSmallScreen && !showForm)\n setShowForm(true);\n }, [ isSmallScreen, showForm ]);\n\n function onSubmitPassword(data: ChangePasswordRequest, onDone: (options?: FormSubmissionOptions) => void) {\n props.onChangePassword(data, onDone, () => onDone({ reset: true }));\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <h2 className='h4'><Text phrase='heading' /></h2>\n\n {!showForm ?\n (\n <button className='btn btn-outline-dark ' onClick={() => setShowForm(true)}>\n <Text phrase='change' />\n </button>\n ) : (\n <>\n <p><Text phrase='info' /></p>\n\n <FormWrapper<ChangePasswordRequest>\n initialValues={initialValues}\n onSubmit={onSubmitPassword}\n validationSchema={getPasswordSettingsValidationSchema(props.minPasswordLength)}\n >\n <ChangePasswordForm\n onClickCancel={() => setShowForm(false)}\n hideCancelButton={!isSmallScreen}\n submitText={LanguageService.getPhrase(namespace, 'savePassword')}\n buttonContainerClass={isSmallScreen ?\n 'd-flex justify-content-end ms-n2 w-75' :\n 'd-flex justify-content-end w-75'\n }\n inputWidthClass='w-75'\n />\n </FormWrapper>\n </>\n )\n }\n </LanguageNamespaceContext.Provider>\n );\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Flight } from 'libs/common/flight';\n\nimport { UpdateSecuritySettingsRequest } from 'apps/settings/interfaces/security/requests/UpdateSecuritySettingsRequest';\n\nexport const SecuritySettingsRequests = {\n getCustomerSecuritySettings(\n customerId: string,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `customers:security:settings`,\n normalize: false,\n success,\n error\n };\n },\n\n setCustomerSecuritySettings(\n customerId: string,\n data: UpdateSecuritySettingsRequest,\n success?: () => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: `{gateway}/v1/customers/${customerId}/settings/security`,\n key: `update:security:settings`,\n invalidationKeys: `customers:security:settings`,\n type: HttpVerbs.PUT,\n normalize: false,\n data,\n success,\n error\n };\n }\n};\n","import React from 'react';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ChangePasswordRequest } from 'libs/shared/apps/user-manager/interfaces/ChangePasswordRequest';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, User } from 'libs/shared/interfaces';\n\nimport { EmailSettings, EmailSettingsModel } from 'apps/settings/components/email-settings/EmailSettings';\nimport { PartialEmailSettings } from 'apps/settings/components/email-settings/partial-loading/PartialEmailSettings';\nimport { PasswordSettings } from 'apps/settings/components/password-settings/PasswordSettings';\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { SecuritySettingsRequests } from 'apps/settings/flight-requests/SecuritySettingsRequests';\nimport { UserManagerRequests } from 'apps/settings/flight-requests/UserManagerRequests';\n\nconst namespace = 'settings.accountSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function AccountSettingsView(): JSX.Element {\n const dispatch = useDispatch();\n const alerts = useAlerts();\n const isSmallScreen = useMediaQuery(MediaQueryStrings.MDDown);\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const masterCurrentUser = Flight.useBasicFetch<User>(currentUser.data &&\n UserManagerRequests.getUser(currentUser.data.id));\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(currentUser.data &&\n SecuritySettingsRequests.getCustomerSecuritySettings(currentUser.data.customerId));\n\n useSetPageMetadata({ title: getPhrase('heading') });\n\n function onChangeEmail(emailModel: EmailSettingsModel, onDone?: () => void): void {\n Flight.fetch(dispatch, UserManagerRequests.changeEmail(emailModel.email, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldEmail: currentUser.data.email,\n newEmail: emailModel.email\n }, {\n actionType: UserAction.VerifyEmail,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Start\n });\n\n alerts.success(getPhrase('changeEmailRequestSuccess', { email: emailModel.email, escapeText: true }));\n }, () => {\n alerts.error(getPhrase('changeEmailRequestError'));\n }, onDone));\n }\n\n function onChangePassword(\n passwordModel: ChangePasswordRequest,\n onDone?: () => void,\n onSuccess?: () => void\n ): void {\n Flight.fetch(dispatch, UserManagerRequests.changePassword(passwordModel, () => {\n AnalyticsHelper.logUserAction({\n id: currentUser.data.id,\n oldPassword: passwordModel.currentPassword,\n newPassword: passwordModel.newPassword\n }, {\n actionType: UserAction.ChangePassword,\n entity: EntityType.User,\n location: LocationContext.Settings,\n workflowPhase: WorkflowPhase.Complete\n });\n\n alerts.success(getPhrase('changePasswordSuccess'));\n onSuccess();\n }, ({ responseJSON }: JQuery.jqXHR) => {\n if (responseJSON.errorCode === 'user.password-too-short')\n alerts.error(getPhrase('changePasswordRequirementsError'));\n else if (responseJSON.errorCode === 'user.invalid-password')\n alerts.error(getPhrase('changePasswordInvalid'));\n else if (responseJSON.errorCode === 'user.same-password')\n alerts.error(getPhrase('changePasswordSame'));\n else if (responseJSON.errorCode === 'user.locked-out')\n alerts.error(getPhrase('changePasswordLockedOut'));\n else\n alerts.error(getPhrase('changePasswordError'));\n }, onDone));\n }\n\n const minPasswordLength = UserManagerHelper.getMinimumPasswordLength(\n passwordPolicy.data,\n masterCurrentUser.data?.userType,\n currentUser.data.role\n );\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n >\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {(currentUser.data) ?\n (\n <EmailSettings\n currentUser={currentUser.data}\n onChangeEmail={onChangeEmail}\n />\n ) : <PartialEmailSettings />\n }\n </div>\n\n <hr />\n\n <div className={isSmallScreen ? 'w-100' : 'w-50'}>\n {passwordPolicy.data && (\n <PasswordSettings onChangePassword={onChangePassword} minPasswordLength={minPasswordLength} />\n )}\n </div>\n </SettingsLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{gt as e,p as t}from"./Dp9qJj1C.chunk.js";import{r as n}from"./BJvPfCvt.chunk.js";import{t as r}from"./ImQRQGZr.chunk.js";import{M as i,dt as a,l as o,lt as s,m as c,ut as l}from"./Dun43GrB.chunk.js";import{t as u}from"./Xo0rk19-.chunk.js";import{t as d}from"./B-OL6Vs7.chunk.js";import{l as f}from"./BQ5XMoHG.chunk.js";import{t as p}from"./B7tm2CBz.chunk.js";import{t as m}from"./DeldjYRc.chunk.js";import{t as ee}from"./BVWg3YHX.chunk.js";import{t as h}from"./BYYiNmLB.chunk.js";import{n as g,t as _,u as v}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{gt as e,p as t}from"./Dp9qJj1C.chunk.js";import{r as n}from"./BJvPfCvt.chunk.js";import{t as r}from"./ImQRQGZr.chunk.js";import{M as i,dt as a,l as o,lt as s,m as c,ut as l}from"./Dun43GrB.chunk.js";import{t as u}from"./Xo0rk19-.chunk.js";import{t as d}from"./B-OL6Vs7.chunk.js";import{l as f}from"./BQ5XMoHG.chunk.js";import{t as p}from"./B7tm2CBz.chunk.js";import{t as m}from"./DeldjYRc.chunk.js";import{t as ee}from"./BVWg3YHX.chunk.js";import{t as h}from"./BYYiNmLB.chunk.js";import{n as g,t as _,u as v}from"./oTYyWWB-.chunk.js";import{n as y,t as b}from"./D7d5XFW82.chunk.js";import{n as x,t as S}from"./DjIdG9LL2.chunk.js";import{t as C}from"./DUNFBIIl2.chunk.js";import{r as w}from"./B8R4YVaF2.chunk.js";import{n as T,t as E}from"./Bx_V3too2.chunk.js";import{t as D}from"./CoualKDX.chunk.js";import{t as O}from"./iTHYgnO8.chunk.js";import{I as k,X as A,q as j}from"./app-BIigh9wv.js";import{t as M}from"./BRiYVLuz.chunk.js";import{t as N}from"./CwttNCGZ.chunk.js";import{t as P}from"./DpDQnXqh2.chunk.js";import{t as F}from"./C9tPKnK22.chunk.js";import{t as I}from"./BlBCp_pE.chunk.js";import{n as L,t as R}from"./DnSy_Myx.chunk.js";import{n as z,t as B}from"./B5jBIPaP.chunk.js";import{r as te,t as V}from"./BBWlVBxr.chunk.js";import{t as H}from"./Dr1flAez.chunk.js";import{t as U}from"./DIavEegC.chunk.js";import{t as W}from"./D0SYGnyF.chunk.js";import{t as G}from"./BjxC-sgo.chunk.js";var K=e(l()),q=s(),J=`streamable.companyDashboardEmptyState`,Y=r.encloseNamespace(J);function X(e){let t=e.dashboard?.status===E.Archived;return(0,q.jsx)(b.Provider,{value:J,children:(0,q.jsxs)(O,{children:[(0,q.jsx)(O.Image,{src:e.imageUrl,altText:Y(`headingForStreamable`)}),e.isReadOnly?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(O.Heading,{children:(0,q.jsx)(y,{namespace:J,phrase:`headingForCurator`})}),(0,q.jsx)(O.Info,{children:(0,q.jsx)(y,{namespace:J,phrase:`info`})}),(0,q.jsx)(n,{title:t?r.getPhrase(J,`archivedCtaTooltip`):``,spanHack:!0,children:(0,q.jsx)(O.Cta,{text:r.getPhrase(J,`add`),appLink:e.addWidgetApplink?.(),className:`btn btn-dark`,icon:N,disabled:t})})]}):(0,q.jsx)(O.Heading,{children:(0,q.jsx)(y,{phrase:`headingForStreamable`})})]})})}var Z=r.encloseNamespace(`streamable.companyDashboard`);function Q(e){let t=p.sortBy(e.dashboard?.widgets,`index`),n=K.useMemo(()=>t.reduce((e,t)=>(e[t.id]=!1,e),{}),[t?.length]),[r,i]=K.useState(n);function a(t,n,r){let i=w.getWidgetParams(n,r,w.getDashboardTargetType(e.dashboard),e.activeAudiences?.map(e=>e.masterId));return e.getWidgetContentRequest(t,i,r)}let s=K.useCallback((e,t)=>{r[e]!==t&&i({...r,[e]:t})},[r,t]);function l(){return t?.length?Object.values(r).every(e=>!!e):!0}let u=l();return(0,q.jsxs)(q.Fragment,{children:[!!t.length&&(0,q.jsxs)(q.Fragment,{children:[e.company?(0,q.jsx)(B,{heading:e.company.name,logo:e.company.logo,logoBgColour:e.company.metadata?.colour,alignLogoLeft:!!e.company.logo||!!e.company.cover,banner:e.company.banner,imageCdnUrl:e.commonVideoProps.imageCdnUrl,blockColourClass:V(e.company.name,te),actions:e.getBannerActions?.(),actionsDropdownClassName:`btn btn-outline-dark`}):(0,q.jsx)(z,{}),(0,q.jsxs)(`div`,{className:`d-flex flex-column row-gap-3 py-3 mb-3 border-bottom`,children:[(0,q.jsx)(H,{breadcrumbs:e.getBreadcrumbs?.()}),(0,q.jsx)(L,{audiences:e.audiences,activeAudiences:e.activeAudiences,disabled:e.isReadOnly,appLink:e.widgetAppLinks?.audience()})]}),e.company.description&&(0,q.jsx)(`div`,{className:`mb-5`,children:(0,q.jsx)(v,{id:e.company?.id,question:Z(`aboutUs`),answer:P.linkifyText(e.company.description),isBot:e.isBot,analyticsOptions:{entity:o.Company,location:c.Dashboard}})}),(0,q.jsx)(`div`,{children:t.map(t=>(0,q.jsx)(g,{widgetCollection:T.Company,dashboardTarget:T.Company,id:t.id,getContentRequest:a,audiences:e.audiences,name:t.name,description:t.description,templateId:t.templateId,metadata:t.metadata,setIsEmpty:s,appLinks:e.widgetAppLinks,isScrollToTargetWidget:e?.scrollToWidgetId===t.id,widgetTypeId:t.widgetId,hasPermissions:e.hasPermissions,hasLocalPermissions:e.hasLocalPermissions,isPreviewing:e.isReadOnly,lazyLoad:e.lazyLoad,contentType:C.Livestream,imageCdnUrl:e.commonVideoProps.imageCdnUrl,commonVideoProps:e.commonVideoProps,classification:null,seeMoreLink:void 0,hasTableOfContents:!1,onClickRemoveItem:void 0,settings:{hasTopicDirectories:!1},badgeComponent:null},t.id))})]}),u&&(0,q.jsx)(X,{dashboard:e.dashboard,isReadOnly:e.isReadOnly,imageUrl:e.emptyImageUrl,addWidgetApplink:e.widgetAppLinks.widgetWizard})]})}function ne(e,t){return{...D,audience:()=>({application:d.DASHBOARD,action:m.Dashboard.COMPANY_DASHBOARD,args:[e?.id,a.slugify(e?.name)],params:t}),series:()=>null,classificationLatestReleases:()=>null,playlist:()=>null,watchHistory:()=>null,widgetWizard:()=>null,searchSettings:()=>null,searchHome:()=>null,getPreviewQuestionsAppLink:()=>null,partner:()=>null,partnerHome:()=>null}}var $=r.encloseNamespace(`dashboard.companyDashboard`);function re(e){return e?i.pick(e,[`a`,`dashboardId`]):{}}function ie(e){let{commonVideoProps:n}=U(),r=f(A.config()),i=f(G.company(e.companyId,{query:`banner,logo`})),a=f(j.streamablePresentation()),o=f(a.data&&M.presentationAudiences(ee.StreamableLearning,a.data.id)),s=F.getActiveAudiencesFromParams(o.data,e.queryParams),c=i.data&&ne(i.data,e.queryParams),{dashboard:l,isPreviewing:p}=_({targetType:T.Company,companyId:e.companyId,dashboardId:e.queryParams?.dashboardId});S(x.getDefaultMetadata({title:i.data?.name,phraseContext:{phraseHandler:$,titlePhrase:`pageTitle`,descriptionPhrase:`pageDescription`},canonicalLink:I.getCanonicalLink({customAppLink:c?.audience()}),allowIndexing:!0,product:k.PRODUCT_NAME}));function g(){return i.hasCompleted?[{name:$(`discover`),appLink:{application:d.DASHBOARD,action:m.Dashboard.HOME}},{name:i.data.name,active:!0}]:[]}return K.useEffect(()=>{!l.hasCompleted||l.data||t.throw(new u)},[l.data,l.hasCompleted]),r.hasCompleted&&l.hasCompleted&&a.hasCompleted&&o.hasCompleted&&i.hasCompleted?(0,q.jsxs)(`div`,{className:`position-relative px-4`,children:[!!(p&&l.data)&&(0,q.jsx)(R,{status:l.data.status,type:`company`}),(0,q.jsx)(Q,{company:i.data,dashboard:l.data,getWidgetContentRequest:W.dashboardWidgetContent,presentation:a.data,widgetAppLinks:c,getBreadcrumbs:g,hasPermissions:()=>!1,hasLocalPermissions:()=>!1,audiences:o.data,activeAudiences:s,emptyImageUrl:h.EmptyStates.Topics.TOPIC,isBot:I.isBot(),lazyLoad:!I.isBot(),commonVideoProps:n})]}):(0,q.jsx)(q.Fragment,{})}export{ie as CompanyDashboardView,re as sanitizeDashboardParams};
|
|
2
|
+
//# sourceMappingURL=CNmmq34f.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DIHDe4Sg.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/streamable-learning/components/company-dashboard/empty-state/StreamableCompanyDashboardEmptyState.tsx","../../../../libs/shared/src/apps/streamable-learning/components/company-dashboard/StreamableCompanyDashboard.tsx","../../src/apps/dashboard/views/company-dashboard/CompanyDashboardViewUtils.ts","../../src/apps/dashboard/views/company-dashboard/CompanyDashboardView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { CuratedDashboard, DashboardStatus } from 'libs/shared/interfaces';\n\nconst namespace = 'streamable.companyDashboardEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StreamableCompanyDashboardEmptyStateProps {\n dashboard: CuratedDashboard;\n imageUrl: string;\n isReadOnly: boolean;\n addWidgetApplink?: () => Core.AppLink;\n}\n\nexport function StreamableCompanyDashboardEmptyState(props: StreamableCompanyDashboardEmptyStateProps): JSX.Element {\n const isArchived = props.dashboard?.status === DashboardStatus.Archived;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('headingForStreamable')} />\n {!props.isReadOnly ? (\n <EmptyState.Heading>\n <Text phrase='headingForStreamable' />\n </EmptyState.Heading>\n ) : (\n <>\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='headingForCurator' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='info' />\n </EmptyState.Info>\n <Tooltip title={isArchived ? LanguageService.getPhrase(namespace, 'archivedCtaTooltip') : ''} spanHack>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'add')}\n appLink={props.addWidgetApplink?.()}\n className='btn btn-dark'\n icon={PlusSvg}\n disabled={isArchived}\n />\n </Tooltip>\n </>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { StreamableCompanyDashboardEmptyState } from 'libs/shared/apps/streamable-learning/components/company-dashboard/empty-state/StreamableCompanyDashboardEmptyState';\nimport { AudienceFilter } from 'libs/shared/apps/subjects/components/audience-filter/AudienceFilter';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader, PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { ExpandableQuestion } from 'libs/shared/components/expandable-question/ExpandableQuestion';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllCompanyWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CalendarEventContentType, Company, CuratedDashboard, CuratedWidgetQueryParams, DashboardTargetType, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\n\nconst namespace = 'streamable.companyDashboard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface StreamableCompanyDashboardProps {\n dashboard: CuratedDashboard;\n company: Company;\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate\n ) => Flight.Request;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n audiences?: PresentationAudience[];\n activeAudiences?: PresentationAudience[];\n emptyImageUrl?: string;\n presentation: Presentation;\n widgetAppLinks?: AllCompanyWidgetTemplates['appLinks'] & {\n audience: () => Core.AppLink,\n widgetWizard: () => Core.AppLink\n };\n scrollToWidgetId?: string;\n isReadOnly?: boolean;\n getBreadcrumbs?: () => Breadcrumb[];\n getBannerActions?: () => ActionOptions[];\n isBot?: boolean;\n lazyLoad?: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function StreamableCompanyDashboard(props: StreamableCompanyDashboardProps): JSX.Element {\n const widgets = ArrayHelper.sortBy(props.dashboard?.widgets, 'index');\n\n const initialEmptyWidgets = React.useMemo(() => {\n return widgets.reduce((acc: HashObject<boolean>, widget) => {\n acc[widget.id] = false;\n return acc;\n }, {});\n }, [widgets?.length]);\n \n const [ emptyWidgets, setEmptyWidgets ] = React.useState(initialEmptyWidgets);\n\n function getWidgetContentRequest(id: string, widgetTypeId: WidgetTypeId, template: WidgetTemplate): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard),\n props.activeAudiences?.map(a => a.masterId)\n );\n\n return props.getWidgetContentRequest(id, params, template);\n }\n\n const onSetIsEmpty = React.useCallback((widgetId: string, isEmpty: boolean) => {\n if (emptyWidgets[widgetId] === isEmpty)\n return;\n\n const newEmptyState = {\n ...emptyWidgets,\n [widgetId]: isEmpty\n };\n\n setEmptyWidgets(newEmptyState);\n }, [ emptyWidgets, widgets ]);\n\n function shouldShowEmptyState(): boolean {\n if (!widgets?.length)\n return true;\n\n return Object.values(emptyWidgets).every(state => !!state);\n }\n\n const showEmptyState = shouldShowEmptyState();\n\n return (\n <>\n {!!widgets.length &&\n <>\n {props.company ?\n (\n <BannerHeader\n heading={props.company.name}\n logo={props.company.logo}\n logoBgColour={props.company.metadata?.colour}\n alignLogoLeft={!!props.company.logo || !!props.company.cover}\n banner={props.company.banner}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n blockColourClass={getBgColorClass(props.company.name, BG_COLOUR_CLASS_NAMES)}\n actions={props.getBannerActions?.()}\n actionsDropdownClassName='btn btn-outline-dark'\n />\n ) : <PartialBannerHeader />\n }\n\n <div className='d-flex flex-column row-gap-3 py-3 mb-3 border-bottom'>\n <Breadcrumbs breadcrumbs={props.getBreadcrumbs?.()} />\n\n <AudienceFilter\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n disabled={props.isReadOnly}\n appLink={props.widgetAppLinks?.audience()}\n />\n </div>\n\n {props.company.description && (\n <div className='mb-5'>\n <ExpandableQuestion\n id={props.company?.id}\n question={getPhrase('aboutUs')}\n answer={LinkifyHelper.linkifyText(props.company.description)}\n isBot={props.isBot}\n analyticsOptions={{\n entity: EntityType.Company,\n location: LocationContext.Dashboard\n }}\n />\n </div>\n )}\n\n <div>\n {widgets.map(widget => {\n return (\n <WidgetContainerView\n widgetCollection={DashboardTargetType.Company}\n dashboardTarget={DashboardTargetType.Company}\n key={widget.id}\n id={widget.id}\n getContentRequest={getWidgetContentRequest}\n audiences={props.audiences}\n name={widget.name}\n description={widget.description}\n templateId={widget.templateId}\n metadata={widget.metadata}\n setIsEmpty={onSetIsEmpty}\n appLinks={props.widgetAppLinks}\n isScrollToTargetWidget={props?.scrollToWidgetId === widget.id}\n widgetTypeId={widget.widgetId}\n hasPermissions={props.hasPermissions}\n hasLocalPermissions={props.hasLocalPermissions}\n isPreviewing={props.isReadOnly}\n lazyLoad={props.lazyLoad}\n contentType={CalendarEventContentType.Livestream}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n commonVideoProps={props.commonVideoProps}\n\n // TODO: Ideally we don't have to do this\n classification={null}\n seeMoreLink={undefined}\n hasTableOfContents={false}\n onClickRemoveItem={undefined}\n settings={{\n hasTopicDirectories: false\n }}\n badgeComponent={null}\n />\n );\n })}\n </div>\n </>\n }\n\n {showEmptyState && (\n <StreamableCompanyDashboardEmptyState\n dashboard={props.dashboard}\n isReadOnly={props.isReadOnly}\n imageUrl={props.emptyImageUrl}\n addWidgetApplink={props.widgetAppLinks.widgetWizard}\n />\n )}\n </>\n );\n}\n","import { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { StreamableCompanyDashboardProps } from 'libs/shared/apps/streamable-learning/components/company-dashboard/StreamableCompanyDashboard';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\n\nexport function getCompanyAppLinks(\n company: Company,\n params: HashObject\n): StreamableCompanyDashboardProps['widgetAppLinks'] {\n return {\n ...StreamableAppLinks,\n audience: () => ({\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.COMPANY_DASHBOARD,\n args: [ company?.id, TextHelper.slugify(company?.name) ],\n params\n }),\n\n // TODO: Find a nice way around having to pass these in\n series: () => null,\n classificationLatestReleases: () => null,\n playlist: () => null,\n watchHistory: () => null,\n widgetWizard: () => null,\n searchSettings: () => null,\n searchHome: () => null,\n getPreviewQuestionsAppLink: () => null,\n partner: () => null,\n partnerHome: () => null\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { StreamableCompanyDashboard } from 'libs/shared/apps/streamable-learning/components/company-dashboard/StreamableCompanyDashboard';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Company, Config, DashboardTargetType, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { CompanyRequests } from 'shared/flight-requests/CompanyRequests';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useFetchDashboard } from 'shared/hooks/useFetchDashboard';\nimport { SeoHelper } from 'shared/utils/StreamableSeoHelper';\n\nimport { getCompanyAppLinks } from 'apps/dashboard/views/company-dashboard/CompanyDashboardViewUtils';\n\nconst namespace = 'dashboard.companyDashboard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n/**\n * NOTE: Ensure any keys added here are also added\n * to sanitizeDashboardParams below.\n */\nexport interface CompanyDashboardViewQueryParams {\n a?: string[];\n dashboardId?: string;\n}\n\nexport function sanitizeDashboardParams(queryParams: CompanyDashboardViewQueryParams): CompanyDashboardViewQueryParams {\n if (!queryParams)\n return {};\n\n return ObjectHelper.pick(queryParams, [ 'a', 'dashboardId' ]);\n}\n\ninterface CompanyDashboardViewProps {\n companyId: string;\n queryParams?: CompanyDashboardViewQueryParams;\n}\n\nexport function CompanyDashboardView(props: CompanyDashboardViewProps): JSX.Element {\n const { commonVideoProps } = useCommonVideoProps();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const company = Flight.useBasicFetch<Company>(CompanyRequests.company(props.companyId, { query: 'banner,logo' }));\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(PresentationType.StreamableLearning, presentation.data.id));\n\n const activeAudiences = AudienceHelper.getActiveAudiencesFromParams(audiences.data, props.queryParams);\n\n const companyAppLinks = company.data && getCompanyAppLinks(company.data, props.queryParams);\n\n const {\n dashboard,\n isPreviewing\n } = useFetchDashboard({\n targetType: DashboardTargetType.Company,\n companyId: props.companyId,\n dashboardId: props.queryParams?.dashboardId\n });\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: company.data?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n customAppLink: companyAppLinks?.audience()\n }),\n allowIndexing: true,\n product: StreamableConstants.PRODUCT_NAME\n }));\n\n function getBreadcrumbs(): Breadcrumb[] {\n if (!company.hasCompleted)\n return [];\n\n return [{\n name: getPhrase('discover'),\n appLink: {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }\n }, {\n name: company.data.name,\n active: true\n }];\n }\n\n React.useEffect(() => {\n if (!dashboard.hasCompleted || dashboard.data)\n return;\n\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ dashboard.data, dashboard.hasCompleted ]);\n\n const hasLoaded = (\n config.hasCompleted &&\n dashboard.hasCompleted &&\n presentation.hasCompleted &&\n audiences.hasCompleted &&\n company.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='position-relative px-4'>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='company' />}\n <StreamableCompanyDashboard\n company={company.data}\n dashboard={dashboard.data}\n getWidgetContentRequest={DashboardRequests.dashboardWidgetContent}\n presentation={presentation.data}\n widgetAppLinks={companyAppLinks}\n getBreadcrumbs={getBreadcrumbs}\n hasPermissions={() => false}\n hasLocalPermissions={() => false}\n audiences={audiences.data}\n activeAudiences={activeAudiences}\n emptyImageUrl={ImageUrls.EmptyStates.Topics.TOPIC}\n isBot={SeoHelper.isBot()}\n lazyLoad={!SeoHelper.isBot()}\n commonVideoProps={commonVideoProps}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CNmmq34f.chunk.js","names":[],"sources":["../../../../libs/shared/src/apps/streamable-learning/components/company-dashboard/empty-state/StreamableCompanyDashboardEmptyState.tsx","../../../../libs/shared/src/apps/streamable-learning/components/company-dashboard/StreamableCompanyDashboard.tsx","../../src/apps/dashboard/views/company-dashboard/CompanyDashboardViewUtils.ts","../../src/apps/dashboard/views/company-dashboard/CompanyDashboardView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { CuratedDashboard, DashboardStatus } from 'libs/shared/interfaces';\n\nconst namespace = 'streamable.companyDashboardEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StreamableCompanyDashboardEmptyStateProps {\n dashboard: CuratedDashboard;\n imageUrl: string;\n isReadOnly: boolean;\n addWidgetApplink?: () => Core.AppLink;\n}\n\nexport function StreamableCompanyDashboardEmptyState(props: StreamableCompanyDashboardEmptyStateProps): JSX.Element {\n const isArchived = props.dashboard?.status === DashboardStatus.Archived;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <EmptyState>\n <EmptyState.Image src={props.imageUrl} altText={getPhrase('headingForStreamable')} />\n {!props.isReadOnly ? (\n <EmptyState.Heading>\n <Text phrase='headingForStreamable' />\n </EmptyState.Heading>\n ) : (\n <>\n <EmptyState.Heading>\n <Text namespace={namespace} phrase='headingForCurator' />\n </EmptyState.Heading>\n <EmptyState.Info>\n <Text namespace={namespace} phrase='info' />\n </EmptyState.Info>\n <Tooltip title={isArchived ? LanguageService.getPhrase(namespace, 'archivedCtaTooltip') : ''} spanHack>\n <EmptyState.Cta\n text={LanguageService.getPhrase(namespace, 'add')}\n appLink={props.addWidgetApplink?.()}\n className='btn btn-dark'\n icon={PlusSvg}\n disabled={isArchived}\n />\n </Tooltip>\n </>\n )}\n </EmptyState>\n </LanguageNamespaceContext.Provider>\n );\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\n\nimport { EntityType, LocationContext } from 'libs/analytics/interfaces';\n\nimport { StreamableCompanyDashboardEmptyState } from 'libs/shared/apps/streamable-learning/components/company-dashboard/empty-state/StreamableCompanyDashboardEmptyState';\nimport { AudienceFilter } from 'libs/shared/apps/subjects/components/audience-filter/AudienceFilter';\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { BannerHeader, PartialBannerHeader } from 'libs/shared/components/banner-header/BannerHeader';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { ExpandableQuestion } from 'libs/shared/components/expandable-question/ExpandableQuestion';\nimport { WidgetContainerView } from 'libs/shared/components/widgets/curated-widgets/WidgetContainerView';\nimport { AllCompanyWidgetTemplates } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { BG_COLOUR_CLASS_NAMES } from 'libs/shared/constants/ColourClassNames';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { HasLocalPermissionsFunc, HasPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { CalendarEventContentType, Company, CuratedDashboard, CuratedWidgetQueryParams, DashboardTargetType, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { getBgColorClass } from 'libs/shared/utils/getBgColorClass';\n\nconst namespace = 'streamable.companyDashboard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport interface StreamableCompanyDashboardProps {\n dashboard: CuratedDashboard;\n company: Company;\n getWidgetContentRequest: (\n id: string,\n params: CuratedWidgetQueryParams,\n widgetTemplate: WidgetTemplate\n ) => Flight.Request;\n hasPermissions: HasPermissionsFunc;\n hasLocalPermissions: HasLocalPermissionsFunc;\n audiences?: PresentationAudience[];\n activeAudiences?: PresentationAudience[];\n emptyImageUrl?: string;\n presentation: Presentation;\n widgetAppLinks?: AllCompanyWidgetTemplates['appLinks'] & {\n audience: () => Core.AppLink,\n widgetWizard: () => Core.AppLink\n };\n scrollToWidgetId?: string;\n isReadOnly?: boolean;\n getBreadcrumbs?: () => Breadcrumb[];\n getBannerActions?: () => ActionOptions[];\n isBot?: boolean;\n lazyLoad?: boolean;\n commonVideoProps: CommonVideoProps;\n}\n\nexport function StreamableCompanyDashboard(props: StreamableCompanyDashboardProps): JSX.Element {\n const widgets = ArrayHelper.sortBy(props.dashboard?.widgets, 'index');\n\n const initialEmptyWidgets = React.useMemo(() => {\n return widgets.reduce((acc: HashObject<boolean>, widget) => {\n acc[widget.id] = false;\n return acc;\n }, {});\n }, [widgets?.length]);\n \n const [ emptyWidgets, setEmptyWidgets ] = React.useState(initialEmptyWidgets);\n\n function getWidgetContentRequest(id: string, widgetTypeId: WidgetTypeId, template: WidgetTemplate): Flight.Request {\n const params = CuratedDashboardHelper.getWidgetParams(\n widgetTypeId,\n template,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard),\n props.activeAudiences?.map(a => a.masterId)\n );\n\n return props.getWidgetContentRequest(id, params, template);\n }\n\n const onSetIsEmpty = React.useCallback((widgetId: string, isEmpty: boolean) => {\n if (emptyWidgets[widgetId] === isEmpty)\n return;\n\n const newEmptyState = {\n ...emptyWidgets,\n [widgetId]: isEmpty\n };\n\n setEmptyWidgets(newEmptyState);\n }, [ emptyWidgets, widgets ]);\n\n function shouldShowEmptyState(): boolean {\n if (!widgets?.length)\n return true;\n\n return Object.values(emptyWidgets).every(state => !!state);\n }\n\n const showEmptyState = shouldShowEmptyState();\n\n return (\n <>\n {!!widgets.length &&\n <>\n {props.company ?\n (\n <BannerHeader\n heading={props.company.name}\n logo={props.company.logo}\n logoBgColour={props.company.metadata?.colour}\n alignLogoLeft={!!props.company.logo || !!props.company.cover}\n banner={props.company.banner}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n blockColourClass={getBgColorClass(props.company.name, BG_COLOUR_CLASS_NAMES)}\n actions={props.getBannerActions?.()}\n actionsDropdownClassName='btn btn-outline-dark'\n />\n ) : <PartialBannerHeader />\n }\n\n <div className='d-flex flex-column row-gap-3 py-3 mb-3 border-bottom'>\n <Breadcrumbs breadcrumbs={props.getBreadcrumbs?.()} />\n\n <AudienceFilter\n audiences={props.audiences}\n activeAudiences={props.activeAudiences}\n disabled={props.isReadOnly}\n appLink={props.widgetAppLinks?.audience()}\n />\n </div>\n\n {props.company.description && (\n <div className='mb-5'>\n <ExpandableQuestion\n id={props.company?.id}\n question={getPhrase('aboutUs')}\n answer={LinkifyHelper.linkifyText(props.company.description)}\n isBot={props.isBot}\n analyticsOptions={{\n entity: EntityType.Company,\n location: LocationContext.Dashboard\n }}\n />\n </div>\n )}\n\n <div>\n {widgets.map(widget => {\n return (\n <WidgetContainerView\n widgetCollection={DashboardTargetType.Company}\n dashboardTarget={DashboardTargetType.Company}\n key={widget.id}\n id={widget.id}\n getContentRequest={getWidgetContentRequest}\n audiences={props.audiences}\n name={widget.name}\n description={widget.description}\n templateId={widget.templateId}\n metadata={widget.metadata}\n setIsEmpty={onSetIsEmpty}\n appLinks={props.widgetAppLinks}\n isScrollToTargetWidget={props?.scrollToWidgetId === widget.id}\n widgetTypeId={widget.widgetId}\n hasPermissions={props.hasPermissions}\n hasLocalPermissions={props.hasLocalPermissions}\n isPreviewing={props.isReadOnly}\n lazyLoad={props.lazyLoad}\n contentType={CalendarEventContentType.Livestream}\n imageCdnUrl={props.commonVideoProps.imageCdnUrl}\n commonVideoProps={props.commonVideoProps}\n\n // TODO: Ideally we don't have to do this\n classification={null}\n seeMoreLink={undefined}\n hasTableOfContents={false}\n onClickRemoveItem={undefined}\n settings={{\n hasTopicDirectories: false\n }}\n badgeComponent={null}\n />\n );\n })}\n </div>\n </>\n }\n\n {showEmptyState && (\n <StreamableCompanyDashboardEmptyState\n dashboard={props.dashboard}\n isReadOnly={props.isReadOnly}\n imageUrl={props.emptyImageUrl}\n addWidgetApplink={props.widgetAppLinks.widgetWizard}\n />\n )}\n </>\n );\n}\n","import { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { HashObject } from 'libs/analytics/interfaces';\n\nimport { StreamableCompanyDashboardProps } from 'libs/shared/apps/streamable-learning/components/company-dashboard/StreamableCompanyDashboard';\nimport { Company } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { StreamableAppLinks } from 'shared/utils/StreamableAppLinks';\n\nexport function getCompanyAppLinks(\n company: Company,\n params: HashObject\n): StreamableCompanyDashboardProps['widgetAppLinks'] {\n return {\n ...StreamableAppLinks,\n audience: () => ({\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.COMPANY_DASHBOARD,\n args: [ company?.id, TextHelper.slugify(company?.name) ],\n params\n }),\n\n // TODO: Find a nice way around having to pass these in\n series: () => null,\n classificationLatestReleases: () => null,\n playlist: () => null,\n watchHistory: () => null,\n widgetWizard: () => null,\n searchSettings: () => null,\n searchHome: () => null,\n getPreviewQuestionsAppLink: () => null,\n partner: () => null,\n partnerHome: () => null\n };\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { StreamableCompanyDashboard } from 'libs/shared/apps/streamable-learning/components/company-dashboard/StreamableCompanyDashboard';\nimport { PreviewBanner } from 'libs/shared/apps/subjects/components/preview-banner/PreviewBanner';\nimport { Breadcrumb } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { AudienceRequests } from 'libs/shared/flight-requests/AudienceRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { DashboardRequests } from 'libs/shared/flight-requests/DashboardRequests';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Company, Config, DashboardTargetType, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { AudienceHelper } from 'libs/shared/utils/audience-helper/AudienceHelper';\nimport { PageMetadataHelper } from 'libs/shared/utils/PageMetadataHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/StreamableActions';\nimport { StreamableConstants } from 'shared/constants/StreamableConstants';\nimport { AppChannels } from 'shared/constants/StreamableRadioChannels';\nimport { CompanyRequests } from 'shared/flight-requests/CompanyRequests';\nimport { PresentationRequests } from 'shared/flight-requests/PresentationRequests';\nimport { useCommonVideoProps } from 'shared/hooks/useCommonVideoProps';\nimport { useFetchDashboard } from 'shared/hooks/useFetchDashboard';\nimport { SeoHelper } from 'shared/utils/StreamableSeoHelper';\n\nimport { getCompanyAppLinks } from 'apps/dashboard/views/company-dashboard/CompanyDashboardViewUtils';\n\nconst namespace = 'dashboard.companyDashboard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n/**\n * NOTE: Ensure any keys added here are also added\n * to sanitizeDashboardParams below.\n */\nexport interface CompanyDashboardViewQueryParams {\n a?: string[];\n dashboardId?: string;\n}\n\nexport function sanitizeDashboardParams(queryParams: CompanyDashboardViewQueryParams): CompanyDashboardViewQueryParams {\n if (!queryParams)\n return {};\n\n return ObjectHelper.pick(queryParams, [ 'a', 'dashboardId' ]);\n}\n\ninterface CompanyDashboardViewProps {\n companyId: string;\n queryParams?: CompanyDashboardViewQueryParams;\n}\n\nexport function CompanyDashboardView(props: CompanyDashboardViewProps): JSX.Element {\n const { commonVideoProps } = useCommonVideoProps();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n const company = Flight.useBasicFetch<Company>(CompanyRequests.company(props.companyId, { query: 'banner,logo' }));\n\n const presentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.streamablePresentation()\n );\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(presentation.data &&\n AudienceRequests.presentationAudiences(PresentationType.StreamableLearning, presentation.data.id));\n\n const activeAudiences = AudienceHelper.getActiveAudiencesFromParams(audiences.data, props.queryParams);\n\n const companyAppLinks = company.data && getCompanyAppLinks(company.data, props.queryParams);\n\n const {\n dashboard,\n isPreviewing\n } = useFetchDashboard({\n targetType: DashboardTargetType.Company,\n companyId: props.companyId,\n dashboardId: props.queryParams?.dashboardId\n });\n\n useSetPageMetadata(PageMetadataHelper.getDefaultMetadata({\n title: company.data?.name,\n phraseContext: {\n phraseHandler: getPhrase,\n titlePhrase: 'pageTitle',\n descriptionPhrase: 'pageDescription'\n },\n canonicalLink: SeoHelper.getCanonicalLink({\n customAppLink: companyAppLinks?.audience()\n }),\n allowIndexing: true,\n product: StreamableConstants.PRODUCT_NAME\n }));\n\n function getBreadcrumbs(): Breadcrumb[] {\n if (!company.hasCompleted)\n return [];\n\n return [{\n name: getPhrase('discover'),\n appLink: {\n application: AppChannels.DASHBOARD,\n action: Actions.Dashboard.HOME\n }\n }, {\n name: company.data.name,\n active: true\n }];\n }\n\n React.useEffect(() => {\n if (!dashboard.hasCompleted || dashboard.data)\n return;\n\n Core.ErrorHelper.throw(new NotFoundError());\n }, [ dashboard.data, dashboard.hasCompleted ]);\n\n const hasLoaded = (\n config.hasCompleted &&\n dashboard.hasCompleted &&\n presentation.hasCompleted &&\n audiences.hasCompleted &&\n company.hasCompleted\n );\n\n if (!hasLoaded)\n return <></>;\n\n return (\n <div className='position-relative px-4'>\n {!!(isPreviewing && dashboard.data) && <PreviewBanner status={dashboard.data.status} type='company' />}\n <StreamableCompanyDashboard\n company={company.data}\n dashboard={dashboard.data}\n getWidgetContentRequest={DashboardRequests.dashboardWidgetContent}\n presentation={presentation.data}\n widgetAppLinks={companyAppLinks}\n getBreadcrumbs={getBreadcrumbs}\n hasPermissions={() => false}\n hasLocalPermissions={() => false}\n audiences={audiences.data}\n activeAudiences={activeAudiences}\n emptyImageUrl={ImageUrls.EmptyStates.Topics.TOPIC}\n isBot={SeoHelper.isBot()}\n lazyLoad={!SeoHelper.isBot()}\n commonVideoProps={commonVideoProps}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{b as e,gt as t}from"./Dp9qJj1C.chunk.js";import{i as n,n as r,r as i,t as a,v as o}from"./BJvPfCvt.chunk.js";import{lt as s,n as c,ut as l}from"./Dun43GrB.chunk.js";import{t as u}from"./Ca1QPe-q2.chunk.js";import{t as d}from"./Cz6swPXe2.chunk.js";import{H as f}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{b as e,gt as t}from"./Dp9qJj1C.chunk.js";import{i as n,n as r,r as i,t as a,v as o}from"./BJvPfCvt.chunk.js";import{lt as s,n as c,ut as l}from"./Dun43GrB.chunk.js";import{t as u}from"./Ca1QPe-q2.chunk.js";import{t as d}from"./Cz6swPXe2.chunk.js";import{H as f}from"./app-BIigh9wv.js";var p=t(l()),m=s();function h(e){return(0,m.jsx)(`svg`,{...e,children:(0,m.jsx)(`path`,{d:`M12 13.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3m0 5.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3m0-11a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3`,fill:`currentColor`})})}var g={dropdownToggle:`_dropdownToggle_1jkd1_1`};function _(){return(0,m.jsxs)(m.Fragment,{children:[(0,m.jsx)(`div`,{style:{padding:`0.53125rem 1rem`},children:(0,m.jsx)(`div`,{className:`partial-loading-background`,style:{height:`1.0625rem`,width:`8rem`}})}),(0,m.jsx)(`div`,{style:{padding:`0.53125rem 1rem`},children:(0,m.jsx)(`div`,{className:`partial-loading-background`,style:{height:`1.0625rem`,width:`12rem`}})}),(0,m.jsx)(`div`,{style:{padding:`0.53125rem 1rem`},children:(0,m.jsx)(`div`,{className:`partial-loading-background`,style:{height:`1.0625rem`,width:`11rem`}})}),(0,m.jsx)(`div`,{style:{padding:`0.53125rem 1rem`},children:(0,m.jsx)(`div`,{className:`partial-loading-background`,style:{height:`1.0625rem`,width:`9rem`}})})]})}function v(e){let t=`dropdown-item`;return e&&(t+=` ${e}`),t}function y(t){let n=o.isFunction(t.action.label)?t.action.label():(0,m.jsx)(m.Fragment,{children:t.action.label});if(t.action.appLink)return(0,m.jsxs)(u,{appLink:t.action.appLink,onClick:t.action.onClick,className:v(t.action.className),analyticsData:t.action.analyticsData,analyticsOptions:t.action.analyticsOptions,openInNewTab:t.action.openInNewTab,disabled:t.action.disabled,children:[t.action.svg&&(0,m.jsx)(a,{svg:t.action.svg,className:`d-inline-block svg-container me-2 align-middle`}),(0,m.jsx)(`span`,{className:`align-middle`,children:n})]});function r(n){n.preventDefault(),t.action.analyticsData&&t.action.analyticsOptions&&c.logUserAction(t.action.analyticsData,t.action.analyticsOptions),o.isFunction(t.action.onClick)&&t.action.onClick(),t.action.href&&e.PageLoad(t.action.href,t.action.openInNewTab)}return t.action.href?(0,m.jsxs)(`a`,{className:v(t.action.className),onClick:r,href:t.action.href,children:[t.action.svg&&(0,m.jsx)(a,{svg:t.action.svg,className:`d-inline-block svg-container me-2 align-middle`}),(0,m.jsx)(`span`,{className:`align-middle`,children:n})]}):(0,m.jsxs)(`span`,{className:`cursor-pointer ${v(t.action.className)}`,onClick:r,role:`button`,tabIndex:0,onKeyDown:e=>e.key===`Enter`&&r(e),children:[t.action.svg&&(0,m.jsx)(a,{svg:t.action.svg,className:`d-inline-block svg-container me-2`}),n]})}b.defaultProps={dropdownToggleClassName:`btn btn-light`,dropdownToggleSvgSize:r.Small};function b(e){if(!e.actions||!e.actions.length)return(0,m.jsx)(m.Fragment,{});let t=e.actions.some(e=>e.lazyPlaceholder),r=`dropdown`;e.className&&(r+=` ${e.className}`);let o=`actions-dropdown-${n.getRandomInt()}`,s=`dropdown-toggle px-0 ${g.dropdownToggle}`;e.dropdownToggleClassName&&(s+=` ${e.dropdownToggleClassName}`);let c;return(0,m.jsxs)(`div`,{className:r,children:[(0,m.jsx)(`button`,{className:s,type:`button`,id:o,"data-bs-toggle":`dropdown`,"data-toggle":`dropdown`,"aria-haspopup":`true`,"aria-expanded":`false`,"aria-label":`More actions dropdown`,onClick:t?e.fetchMore:null,children:(0,m.jsx)(a,{svg:h,size:e.dropdownToggleSvgSize})}),(0,m.jsx)(`ul`,{className:`dropdown-menu dropdown-menu-end dropdown-menu-right font-size-normal`,"aria-labelledby":o,children:t?(0,m.jsx)(_,{}):e.actions.map((e,t)=>{let n=c!==void 0&&c!==e.group;return c=e.group,e.tooltip?(0,m.jsxs)(`li`,{children:[n&&(0,m.jsx)(`hr`,{className:`dropdown-divider`,role:`separator`}),(0,m.jsx)(i,{title:e.tooltip,spanHack:!0,children:(0,m.jsx)(y,{action:e})})]},t):(0,m.jsxs)(`li`,{children:[n&&(0,m.jsx)(`hr`,{className:`dropdown-divider`,role:`separator`}),(0,m.jsx)(y,{action:e})]},t)})})]})}function x(e){let t=p.useMemo(()=>e.actions.sort((e,t)=>e.order-t.order),[e.actions]),n=[],r=[];t.forEach(e=>{e.button?n.push(e):r.push(e)});let i=`d-flex`;return e.className&&(i+=` ${e.className}`),!n.length&&!r.length?(0,m.jsx)(m.Fragment,{}):(0,m.jsxs)(`div`,{className:i,children:[n.length?n.map((t,n)=>(0,m.jsx)(p.Fragment,{children:(()=>{if(t.label){let n=o.isFunction(t.label)?t.label():(0,m.jsx)(m.Fragment,{children:t.label});return(0,m.jsx)(f,{appLink:t.appLink,href:t.href,onClick:t.onClick,svg:t.svg,svgSize:e.dropdownToggleSvgSize,className:t.className,tooltip:t.tooltip,showSpinner:t.showSpinner,analyticsData:t.analyticsData,analyticsOptions:t.analyticsOptions,openInNewTab:t.openInNewTab,disabled:t.disabled,children:n})}return(0,m.jsx)(d,{appLink:t.appLink,href:t.href,onClick:t.onClick,svg:t.svg,className:t.className,analyticsData:t.analyticsData,analyticsOptions:t.analyticsOptions,openInNewTab:t.openInNewTab,disabled:t.disabled,showBorder:t.showBorder,customSize:e.customSize,ariaLabel:t.tooltip,tooltip:t.tooltip})})()},n)):(0,m.jsx)(m.Fragment,{}),e.sortComponent&&e.sortComponent,r.length?(0,m.jsx)(b,{actions:r,dropdownToggleClassName:e.actionsDropdownClassName,dropdownToggleSvgSize:e.dropdownToggleSvgSize,fetchMore:e.fetchMore}):(0,m.jsx)(m.Fragment,{})]})}export{x as t};
|
|
2
|
+
//# sourceMappingURL=CUUUI6pl.chunk.js.map
|