@clickview/lite 0.48.0-rc.7 → 0.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/scripts/{170-1f815b85a1-lite.chunk.js → 170-2d124965b7-lite.chunk.js} +2 -2
- package/dist/scripts/{170-1f815b85a1-lite.chunk.js.map → 170-2d124965b7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js → 1818-72409e60a9-lite.chunk.js} +1 -1
- package/dist/scripts/{1818-b9f9297d6d-lite.chunk.js.map → 1818-72409e60a9-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1863-cf9df40052-lite.chunk.js → 1863-e7c4a6f342-lite.chunk.js} +1 -1
- package/dist/scripts/{1863-cf9df40052-lite.chunk.js.map → 1863-e7c4a6f342-lite.chunk.js.map} +1 -1
- package/dist/scripts/{1958-9889c1ad24-lite.chunk.js → 1958-5336189397-lite.chunk.js} +1 -1
- package/dist/scripts/{1958-9889c1ad24-lite.chunk.js.map → 1958-5336189397-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2086-a247f6e201-lite.chunk.js → 2086-f7082703d0-lite.chunk.js} +1 -1
- package/dist/scripts/{2086-a247f6e201-lite.chunk.js.map → 2086-f7082703d0-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2118-462a279c5a-lite.chunk.js → 2118-ec2a5f1e9b-lite.chunk.js} +2 -2
- package/dist/scripts/{2118-462a279c5a-lite.chunk.js.map → 2118-ec2a5f1e9b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js → 2182-8e4d603a1b-lite.chunk.js} +1 -1
- package/dist/scripts/{2182-5c9db07f5b-lite.chunk.js.map → 2182-8e4d603a1b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2279-5e92c84310-lite.chunk.js → 2279-252e92e1d8-lite.chunk.js} +1 -1
- package/dist/scripts/{2279-5e92c84310-lite.chunk.js.map → 2279-252e92e1d8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js → 2355-c588dc3ce2-lite.chunk.js} +1 -1
- package/dist/scripts/{2355-6cd89fa80d-lite.chunk.js.map → 2355-c588dc3ce2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js → 2469-46411b862e-lite.chunk.js} +1 -1
- package/dist/scripts/{2469-aa5bbbb17f-lite.chunk.js.map → 2469-46411b862e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js → 2672-b01985cee8-lite.chunk.js} +1 -1
- package/dist/scripts/{2672-0fc559f1d1-lite.chunk.js.map → 2672-b01985cee8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js → 2734-6a7beb2ce2-lite.chunk.js} +1 -1
- package/dist/scripts/{2734-6c6d57d0f3-lite.chunk.js.map → 2734-6a7beb2ce2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{287-ba98be7f21-lite.chunk.js → 287-3cbed16363-lite.chunk.js} +1 -1
- package/dist/scripts/{287-ba98be7f21-lite.chunk.js.map → 287-3cbed16363-lite.chunk.js.map} +1 -1
- package/dist/scripts/{2875-0e5f209e47-lite.chunk.js → 2875-aefd69a61f-lite.chunk.js} +1 -1
- package/dist/scripts/{2875-0e5f209e47-lite.chunk.js.map → 2875-aefd69a61f-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3042-6650521d8b-lite.chunk.js → 3042-7c1b5e4ff7-lite.chunk.js} +1 -1
- package/dist/scripts/{3042-6650521d8b-lite.chunk.js.map → 3042-7c1b5e4ff7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3158-31baada6cc-lite.chunk.js → 3158-2147de456d-lite.chunk.js} +1 -1
- package/dist/scripts/{3158-31baada6cc-lite.chunk.js.map → 3158-2147de456d-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js → 3296-f3732c93d9-lite.chunk.js} +1 -1
- package/dist/scripts/{3296-6d80e4dd56-lite.chunk.js.map → 3296-f3732c93d9-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3541-7ebd9db295-lite.chunk.js → 3541-15581012d3-lite.chunk.js} +1 -1
- package/dist/scripts/{3541-7ebd9db295-lite.chunk.js.map → 3541-15581012d3-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3841-95df66e647-lite.chunk.js → 3841-bfae79638b-lite.chunk.js} +2 -2
- package/dist/scripts/{3841-95df66e647-lite.chunk.js.map → 3841-bfae79638b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{3888-0bee9a9309-lite.chunk.js → 3888-87c1075a1b-lite.chunk.js} +1 -1
- package/dist/scripts/{3888-0bee9a9309-lite.chunk.js.map → 3888-87c1075a1b-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js → 4138-b9b03c9900-lite.chunk.js} +1 -1
- package/dist/scripts/{4138-75a2bb69ab-lite.chunk.js.map → 4138-b9b03c9900-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4778-ebe369973c-lite.chunk.js → 4778-3c9f2b7f76-lite.chunk.js} +2 -2
- package/dist/scripts/{4778-ebe369973c-lite.chunk.js.map → 4778-3c9f2b7f76-lite.chunk.js.map} +1 -1
- package/dist/scripts/{4942-a27a31e79e-lite.chunk.js → 4942-acce40b333-lite.chunk.js} +2 -2
- package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.map → 4942-acce40b333-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5075-f8719465be-lite.chunk.js → 5075-53172298fe-lite.chunk.js} +1 -1
- package/dist/scripts/{5075-f8719465be-lite.chunk.js.map → 5075-53172298fe-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5157-cd12e2e443-lite.chunk.js → 5157-47a0f5c088-lite.chunk.js} +1 -1
- package/dist/scripts/{5157-cd12e2e443-lite.chunk.js.map → 5157-47a0f5c088-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5268-f4db3933ff-lite.chunk.js → 5268-9b7560f3b1-lite.chunk.js} +2 -2
- package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.map → 5268-9b7560f3b1-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5442-01ffd95162-lite.chunk.js → 5442-5ddfa2d951-lite.chunk.js} +1 -1
- package/dist/scripts/{5442-01ffd95162-lite.chunk.js.map → 5442-5ddfa2d951-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js → 5591-119d72ede5-lite.chunk.js} +1 -1
- package/dist/scripts/{5591-98cfe6c6e5-lite.chunk.js.map → 5591-119d72ede5-lite.chunk.js.map} +1 -1
- package/dist/scripts/{5595-3763b14d77-lite.chunk.js → 5595-628d4f252c-lite.chunk.js} +2 -2
- package/dist/scripts/5595-628d4f252c-lite.chunk.js.map +1 -0
- package/dist/scripts/{6102-4d948a5e48-lite.chunk.js → 6102-751dbbbf33-lite.chunk.js} +3 -3
- package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.map → 6102-751dbbbf33-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6158-0c5e44f800-lite.chunk.js → 6158-d123add596-lite.chunk.js} +1 -1
- package/dist/scripts/{6158-0c5e44f800-lite.chunk.js.map → 6158-d123add596-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6263-8957d50afe-lite.chunk.js → 6263-24e67b7df2-lite.chunk.js} +1 -1
- package/dist/scripts/{6263-8957d50afe-lite.chunk.js.map → 6263-24e67b7df2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{6330-c66465bd6d-lite.chunk.js → 6330-9a2a5fc07e-lite.chunk.js} +1 -1
- package/dist/scripts/{6330-c66465bd6d-lite.chunk.js.map → 6330-9a2a5fc07e-lite.chunk.js.map} +1 -1
- package/dist/scripts/{671-003843ca84-lite.chunk.js → 671-5571f33165-lite.chunk.js} +1 -1
- package/dist/scripts/{671-003843ca84-lite.chunk.js.map → 671-5571f33165-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7167-efe85af16e-lite.chunk.js → 7167-dc4c954c2b-lite.chunk.js} +1 -1
- package/dist/scripts/{7167-efe85af16e-lite.chunk.js.map → 7167-dc4c954c2b-lite.chunk.js.map} +1 -1
- package/dist/scripts/7293-58f4a7cf47-lite.chunk.js +2 -0
- package/dist/scripts/{7293-afd3349468-lite.chunk.js.map → 7293-58f4a7cf47-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js → 7301-7c9342ef0c-lite.chunk.js} +1 -1
- package/dist/scripts/{7301-f20e4bdb8f-lite.chunk.js.map → 7301-7c9342ef0c-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7708-ece31b78a9-lite.chunk.js → 7708-e91903481a-lite.chunk.js} +1 -1
- package/dist/scripts/{7708-ece31b78a9-lite.chunk.js.map → 7708-e91903481a-lite.chunk.js.map} +1 -1
- package/dist/scripts/{771-eb60e33941-lite.chunk.js → 771-5612b4ffc2-lite.chunk.js} +2 -2
- package/dist/scripts/{771-eb60e33941-lite.chunk.js.map → 771-5612b4ffc2-lite.chunk.js.map} +1 -1
- package/dist/scripts/{7855-37bcdd134e-lite.chunk.js → 7855-4b69540a71-lite.chunk.js} +1 -1
- package/dist/scripts/{7855-37bcdd134e-lite.chunk.js.map → 7855-4b69540a71-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8024-66413cc05b-lite.chunk.js → 8024-765a4170c7-lite.chunk.js} +2 -2
- package/dist/scripts/{8024-66413cc05b-lite.chunk.js.map → 8024-765a4170c7-lite.chunk.js.map} +1 -1
- package/dist/scripts/{823-58d27c255b-lite.chunk.js → 823-33c5207c68-lite.chunk.js} +1 -1
- package/dist/scripts/{823-58d27c255b-lite.chunk.js.map → 823-33c5207c68-lite.chunk.js.map} +1 -1
- package/dist/scripts/8261-69854ff4d5-lite.chunk.js +2 -0
- package/dist/scripts/8261-69854ff4d5-lite.chunk.js.map +1 -0
- package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js → 8466-cea62163e8-lite.chunk.js} +1 -1
- package/dist/scripts/{8466-ee9d40ee97-lite.chunk.js.map → 8466-cea62163e8-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8681-41edd08b98-lite.chunk.js → 8681-49db3daae6-lite.chunk.js} +2 -2
- package/dist/scripts/{8681-41edd08b98-lite.chunk.js.map → 8681-49db3daae6-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8772-9ae4d77363-lite.chunk.js → 8772-6c11095cea-lite.chunk.js} +1 -1
- package/dist/scripts/{8772-9ae4d77363-lite.chunk.js.map → 8772-6c11095cea-lite.chunk.js.map} +1 -1
- package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js → 8906-2f6b5e4c5c-lite.chunk.js} +2 -2
- package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.map → 8906-2f6b5e4c5c-lite.chunk.js.map} +1 -1
- package/dist/scripts/{920-4de8efbcf1-lite.chunk.js → 920-acc6596891-lite.chunk.js} +1 -1
- package/dist/scripts/{920-4de8efbcf1-lite.chunk.js.map → 920-acc6596891-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js → 9212-cc987a13bf-lite.chunk.js} +1 -1
- package/dist/scripts/{9212-8f95fbd9b9-lite.chunk.js.map → 9212-cc987a13bf-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js → 9242-144e7728ad-lite.chunk.js} +1 -1
- package/dist/scripts/{9242-2e533bdc0d-lite.chunk.js.map → 9242-144e7728ad-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9264-d2285d4310-lite.chunk.js → 9264-518952f13f-lite.chunk.js} +1 -1
- package/dist/scripts/{9264-d2285d4310-lite.chunk.js.map → 9264-518952f13f-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js → 9478-4b3c088537-lite.chunk.js} +2 -2
- package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.map → 9478-4b3c088537-lite.chunk.js.map} +1 -1
- package/dist/scripts/{9484-be04a34bbf-lite.chunk.js → 9484-b85011dbea-lite.chunk.js} +2 -2
- package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.map → 9484-b85011dbea-lite.chunk.js.map} +1 -1
- package/dist/scripts/{bundle-8f540a1154.min.js → bundle-c158cdd3a9.min.js} +3 -3
- package/dist/scripts/{bundle-8f540a1154.min.js.map → bundle-c158cdd3a9.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/5595-3763b14d77-lite.chunk.js.map +0 -1
- package/dist/scripts/7293-afd3349468-lite.chunk.js +0 -2
- package/dist/scripts/8261-72453f1978-lite.chunk.js +0 -2
- package/dist/scripts/8261-72453f1978-lite.chunk.js.map +0 -1
- /package/dist/scripts/{170-1f815b85a1-lite.chunk.js.LICENSE.txt → 170-2d124965b7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{2118-462a279c5a-lite.chunk.js.LICENSE.txt → 2118-ec2a5f1e9b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{3841-95df66e647-lite.chunk.js.LICENSE.txt → 3841-bfae79638b-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4778-ebe369973c-lite.chunk.js.LICENSE.txt → 4778-3c9f2b7f76-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{4942-a27a31e79e-lite.chunk.js.LICENSE.txt → 4942-acce40b333-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{5268-f4db3933ff-lite.chunk.js.LICENSE.txt → 5268-9b7560f3b1-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{6102-4d948a5e48-lite.chunk.js.LICENSE.txt → 6102-751dbbbf33-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{771-eb60e33941-lite.chunk.js.LICENSE.txt → 771-5612b4ffc2-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8024-66413cc05b-lite.chunk.js.LICENSE.txt → 8024-765a4170c7-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8681-41edd08b98-lite.chunk.js.LICENSE.txt → 8681-49db3daae6-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{8906-b75b51bd0f-lite.chunk.js.LICENSE.txt → 8906-2f6b5e4c5c-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9478-8eacf2fe47-lite.chunk.js.LICENSE.txt → 9478-4b3c088537-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{9484-be04a34bbf-lite.chunk.js.LICENSE.txt → 9484-b85011dbea-lite.chunk.js.LICENSE.txt} +0 -0
- /package/dist/scripts/{bundle-8f540a1154.min.js.LICENSE.txt → bundle-c158cdd3a9.min.js.LICENSE.txt} +0 -0
package/dist/scripts/{7167-efe85af16e-lite.chunk.js.map → 7167-dc4c954c2b-lite.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scripts/7167-efe85af16e-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/forms/form-buttons/FormButtons.tsx","file:///app/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///app/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/components/rostering/rostering-header/RosteringSettingHeader.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-action-button-group/sync-action-button-group.scss","file:///app/packages/libs/shared/src/components/rostering/sync-action-button-group/SyncActionButtonGroup.tsx","file:///app/packages/libs/shared/src/components/rostering/utils/RosteringHelper.ts","file:///app/packages/libs/shared/src/flight-requests/RosteringRequests.ts","file:///app/packages/libs/shared/src/utils/FormHelper.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-list/requires-set-up-empty-state/RequiresSetUpEmptyState.tsx","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/schedule-setting.scss","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/ScheduleForm.tsx","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/ScheduleSetting.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-settings/rostering-sync-settings.scss","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-settings/RosteringSyncSettingsView.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/utils/useSyncRostering.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n);\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length;\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useCanSubmitForm } from 'libs/shared/hooks/UseCanSubmitForm';\n\nconst namespace = 'shared.formButtons';\n\ninterface FormButtonsProps {\n isNew?: boolean;\n submitText?: string;\n variant?: ButtonProps['variant'];\n size?: FormSize;\n className?: string;\n}\n\nexport function FormButtons<Values extends HashObject>(props: FormButtonsProps): JSX.Element {\n const formikProps = useFormikContext<Values>();\n\n const canSubmit = useCanSubmitForm(formikProps);\n\n return (\n <SpinnerButton\n variant={props.variant || 'primary'}\n type='submit'\n disabled={!canSubmit}\n size={props.size}\n className={props.className ? props.className : ''}\n showSpinner={formikProps.isSubmitting}\n >\n {props.submitText\n ? <>{props.submitText}</>\n : <Text namespace={namespace} phrase={props.isNew ? 'create' : 'save'} />}\n </SpinnerButton>\n );\n}\n","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span> </span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = values[props.fieldName];\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className='form-group'>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className='d-flex align-items-center'>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'> <Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n\n <FieldWrapper {...fieldWrapperProps} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback type='invalid'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './pill-tab-selector.scss';\n\nexport interface PillTab {\n name: string;\n active: boolean;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n className?: string;\n}\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''}>\n <ul className={`list-unstyled d-inline-block m-0 ${styles.pillTabSelector}`}>\n {props.tabs.map(tab => {\n return (\n <li className={`p-0 ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}`} key={tab.name}>\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`cursor-pointer d-flex justify-content-center text-decoration-none text-reset px-2 ${styles.pillItem}`}\n >\n {tab.name}\n\n {typeof (tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={tab.count} />\n </div>\n )}\n </AppLink>\n ) : (\n <DivButton className={`${styles.pillItem} d-flex justify-content-center p-2`} onClick={() => onSelectTab(tab)}>\n {tab.name}\n\n {typeof (tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={tab.count} />\n </div>\n )}\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\n\nconst namespace = 'rostering.settingHeader';\n\nexport interface RosteringSettingHeaderAppLinks {\n syncJobs: Core.AppLink;\n settings: Core.AppLink;\n}\n\ninterface RosteringSettingHeaderProps {\n appLinks?: RosteringSettingHeaderAppLinks;\n active: keyof RosteringSettingHeaderAppLinks;\n}\n\nexport function RosteringSettingHeader(props: RosteringSettingHeaderProps): JSX.Element {\n const tabs = [{\n name: LanguageService.getPhrase(namespace, 'syncJobs'),\n appLink: props.appLinks?.syncJobs,\n active: props.active === 'syncJobs'\n \n }, {\n name: LanguageService.getPhrase(namespace, 'settings'),\n appLink: props.appLinks?.settings,\n active: props.active === 'settings'\n \n }];\n\n return (\n <div>\n <PillTabSelector tabs={tabs} />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"rightButton\":\"GcqRT\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport styles from './sync-action-button-group.scss';\n\nconst namespace = 'rostering.syncActionButtonGroup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncActionButtonGroupProps {\n onSyncNow?: () => void;\n onFullSync?: () => void;\n}\n\nexport function SyncActionButtonGroup(props: SyncActionButtonGroupProps): JSX.Element {\n return (\n <div className='btn-group px-2' role='group'>\n <Tooltip title={getPhrase('syncNowTooltip')} spanHack placement='left' spanHackClassName={styles.buttonBorder}>\n <button type='button' className={`btn btn-outline-dark ${styles.leftButton}`} onClick={props?.onSyncNow}>{getPhrase('syncNow')}</button>\n </Tooltip>\n {/* todo hide the dropdown for v1 */}\n {/* <button type='button' className={`btn dropdown-toggle btn-outline-dark ${styles.rightButton}`} data-bs-toggle='dropdown'>\n </button>\n <div className='dropdown-menu'>\n <Tooltip title={getPhrase('fullSyncTooltip')} spanHack placement='left' >\n <div className='dropdown-item cursor-pointer' onClick={props?.onFullSync}>{getPhrase('fullSync')}</div>\n </Tooltip>\n </div> */}\n </div>\n );\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nconst now = new Date();\n\nexport const RosteringHelper = {\n parseUTCToLocal(\n {\n utcHour,\n utcWeekdays,\n utcMinute = 0\n }: {\n utcHour: number,\n utcWeekdays: number[],\n utcMinute: number\n }\n ) {\n const local = utcWeekdays.map(weekday => DateHelper.buildLocalDateFromUTC(weekday, utcHour, utcMinute));\n\n const localWeekdays = local.map(w => w.getDay());\n const localHour = DateHelper.format(ArrayHelper.first(local), 'HH');\n return { hour: +localHour, daysOfWeek: localWeekdays, minute: utcMinute };\n },\n\n // calculating next scheduled job by schedule setting\n getScheduledJobBySetting (setting: ScheduleSettingResponse): Date | null {\n if (!setting || !setting.fullSyncSchedule || !setting.fullSyncSchedule.enabled)\n return null;\n\n const schedule = RosteringHelper.parseUTCToLocal({\n utcHour: setting.fullSyncSchedule.hour,\n utcWeekdays: setting.fullSyncSchedule.daysOfWeek,\n utcMinute: setting.fullSyncSchedule.minute\n });\n const scheduledDate = new Date();\n const weekdayOfToday = now.getDay();\n\n const scheduledWeekday = schedule.daysOfWeek.sort((a, b) => a - b);\n const scheduledToday = schedule.daysOfWeek.includes(weekdayOfToday);\n const hour = schedule.hour;\n const minute = schedule?.minute ?? 0;\n\n if (scheduledToday) {\n scheduledDate.setHours(hour, minute, 0, 0);\n if (now < scheduledDate) {\n return scheduledDate;\n }\n }\n\n const nextScheduledDate = new Date();\n let nextScheduledWeekday = scheduledWeekday.find(d => d > weekdayOfToday);\n if (!nextScheduledWeekday) {\n // cannot find next scheduled date in the current week, must be next week\n nextScheduledWeekday = scheduledWeekday[0];\n }\n // use absolute value of gap to make sure next scheduled date is in the futrue\n const gap = Math.abs(nextScheduledWeekday - weekdayOfToday);\n nextScheduledDate.setDate(now.getDate() + gap);\n nextScheduledDate.setHours(hour, 0, 0, 0);\n return nextScheduledDate;\n }\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkJobsQueryParams } from 'libs/shared/components/bulk-jobs-filters/BulkJobsFilters';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { BatchJob, ScheduleSettingRequest } from 'libs/shared/interfaces';\nimport { CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const RosteringRequests = {\n getRostering(): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/rostering`,\n key: `rostering`\n };\n },\n\n getSyncList(queryParams: BulkJobsQueryParams): Flight.Request {\n const params: HashObject = {};\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.jobStatus) {\n const statuses = [];\n if (queryParams.jobStatus.includes('completed')) {\n statuses.push(...[ BatchJobStatus.Completed, BatchJobStatus.CompletedWithError ]);\n }\n if (queryParams.jobStatus.includes('failed')) {\n statuses.push(BatchJobStatus.Failed);\n }\n if (queryParams.jobStatus.includes('inProgress')) {\n statuses.push(...[\n BatchJobStatus.Submitted,\n BatchJobStatus.Queued,\n BatchJobStatus.Pending,\n BatchJobStatus.InProgress ]);\n }\n params.status = statuses;\n }\n\n params.type = BatchJobType.Rostering;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `rostering:sync:${queryParams.cursor}:${queryParams.sort}:${queryParams.jobStatus}`\n };\n },\n\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'rostering:sync',\n type: HttpVerbs.POST,\n invalidationKeys: ['rostering:sync'],\n data,\n success,\n error\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n },\n\n getSyncScheduleSettings(integrationId: string): Flight.SimulatedRequest {\n return {\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `sync-settings:${integrationId}`\n };\n },\n\n updateScheduleSetting(\n data: ScheduleSettingRequest,\n integrationId: string,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n type: HttpVerbs.PUT,\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `update:sync-settings:${data.customerId}:${integrationId}`,\n invalidationKeys: [`sync-settings:${integrationId}`],\n data,\n success,\n error,\n always\n };\n }\n};","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'rostering.requiresSetUp';\n\nexport function RequiresSetUpEmptyState(): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Rostering.REQUIRES_SET_UP} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Info className='w-50 mb-3'><Text namespace={namespace} phrase='emptyInfo' /></EmptyState.Info>\n \n {/* <EmptyState.Cta\n href={href}\n text={getPhrase('emptyCta')}\n className='btn btn-link info-link'\n openInNewTab\n /> */}\n \n <ExternalLink\n className='btn btn-dark'\n href={ArticleHelper.getSupportRequestUrl()}\n newTab\n >\n <Text namespace={namespace} phrase='button'/>\n </ExternalLink>\n \n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"select\":\"eHERO\",\"sourceLabel\":\"P7yI8\",\"source\":\"dsINO\",\"logoWrapper\":\"kPI9A\",\"wrapper\":\"PYTsc\",\"weekdaysPicker\":\"W8qyy\"};","import React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { IScheduleSetting } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleSetting';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './schedule-setting.scss';\n\nconst namespace = 'rostering.settings.schedule';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// constant to build dropdown\nconst TIMES = new Array(24).fill(0).map((_, i) => i);\nconst REPEATS = [ 'daily', 'weekly' ];\nconst WEEK_DAYS = [ 1, 2, 3, 4, 5, 6, 0 ];\nconst date = new Date();\nconst offsetHours = new Date().getTimezoneOffset() / 60;\n\nfunction formatTime (number: number) {\n if (number === 0)\n return '12:00 AM';\n\n const isAm = number / 12 < 1;\n const time = number === 12 ? 12 : number % 12;\n\n if (isAm)\n return time < 10 ? `0${time}:00 AM` : `${time}:00 AM`;\n \n\n return time < 10 ? `0${time}:00 PM` : `${time}:00 PM`;\n}\n\nfunction parseWeekdayNumber(w: number): string {\n return DateHelper.format(DateHelper.weekday(date, w), 'ddd');\n}\n\nfunction getAlertContent(values: IScheduleSetting): string {\n switch (values.repeat) {\n case 'daily':\n return getPhrase('summary', { time: formatTime(values.startAt), repeat: values.repeat });\n case 'weekly':\n const sortedWeekDays = WEEK_DAYS.filter(v => values.daysOfWeek.includes(v)).map(w => parseWeekdayNumber(w));\n\n let str = '';\n if (sortedWeekDays.length >= 2) {\n const firstPart = sortedWeekDays.slice(0, sortedWeekDays.length - 1).join(', ');\n const lastPart = 'and ' + sortedWeekDays[sortedWeekDays.length - 1];\n str = firstPart + ', ' + lastPart;\n } else {\n str = sortedWeekDays.join(', ');\n }\n\n return getPhrase('weeklySummary', {\n weekdays: str,\n time: formatTime(values.startAt),\n repeat: values.repeat\n });\n }\n}\n\nexport function ScheduleForm(): JSX.Element {\n const formikProps = useFormikContext<IScheduleSetting>();\n\n function getButtonClassName(day: number): string {\n let className = 'btn border';\n\n if (formikProps.values.daysOfWeek.includes(day))\n className += ' btn-dark';\n else\n className += ' btn-outline-dark';\n\n return className;\n }\n\n function onClick(e: React.MouseEvent, day: number): void {\n e.preventDefault();\n\n const nextValue = formikProps.values.daysOfWeek.includes(day)\n ? formikProps.values.daysOfWeek.filter(v => v !== day)\n : [ ...formikProps.values.daysOfWeek, day ];\n // don't allow an empty array, user have to select at least one weekday\n if (nextValue.length === 0) return;\n\n formikProps.setFieldValue('daysOfWeek', nextValue);\n }\n\n return (\n <Form>\n <div>\n <p><Text namespace={namespace} phrase='info' /></p>\n\n <div className='row'>\n {/* todo waiting for decision if we going to keep it since we only support single source */}\n {/* <p className={`col col-3 ${styles.sourceLabel}`}>{getPhrase('from')}</p>\n <div className={`col d-flex align-items-center ${styles.source}`}>\n <div className={`${styles.logoWrapper} bg-white rounded-circle border d-flex align-items-center justify-content-center me-2`}>\n <img src='https://img.clickviewapp.com/v2/logos/LqlKgd'/>\n </div> \n <p className='fw-semibold mb-0'>Clever</p>\n </div>*/}\n </div>\n\n <div className='row align-items-center'>\n <p className='col col-3'>{getPhrase('start')}</p>\n <div className='col'>\n <div className='d-flex align-items-center flex-gap'>\n <FormField\n className={`${styles.select} me-2`}\n id='start'\n name='startAt'\n as='select'\n value={formikProps.values.startAt ?? 2}\n >\n {TIMES.map(i => <option className='text-dark' value={i} key={i}>{formatTime(i)}</option>)}\n </FormField>\n {/* display current timezone based on browser */}\n <p>(EST UTC{`${offsetHours}`}) {Intl.DateTimeFormat().resolvedOptions().timeZone.replace('/', ' - ')}</p>\n </div>\n </div>\n \n </div>\n\n <div className='row align-items-center'>\n <p className='col col-3'>{getPhrase('repeat')}</p>\n <div className={`col ${styles.wrapper} position-relative`}>\n <FormField\n className={`${styles.select} d-inline-block`}\n id='repeat'\n name='repeat'\n as='select'\n value={formikProps.values.repeat}\n >\n {REPEATS.map(i => <option className='text-dark' value={i} key={i}>{TextHelper.toTitleCase(i)}</option>)}\n </FormField>\n\n {formikProps.values.repeat === 'weekly' && (\n <div className={`d-flex align-items-center position-absolute ${styles.weekdaysPicker}`}>\n <span className='ms-2 me-3'>{getPhrase('on')}</span>\n <div className='btn-group mb-1'>\n {WEEK_DAYS.map(option => {\n return (\n <button\n key={option}\n className={getButtonClassName(option)}\n onClick={e => {\n onClick(e, option);\n }}\n type='button'\n >\n {parseWeekdayNumber(option).charAt(0)}\n </button>\n );\n })}\n </div>\n </div>)}\n </div>\n </div>\n </div>\n\n <div className='rounded p-2 bg-light-blue text-info fw-semibold mb-3'>\n {getAlertContent(formikProps.values)}\n </div>\n\n <FormButtons<IScheduleSetting>\n isNew={false}\n variant='outline-dark'\n />\n </Form>\n\n );\n}","import React from 'react';\nimport * as Yup from 'yup';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ScheduleForm } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleForm';\nimport { RosteringHelper } from 'libs/shared/components/rostering/utils/RosteringHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FullRosterSyncSchedule, ScheduleSettingRequest, ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nconst namespace = 'rostering.settings.schedule';\n\ninterface ScheduleSettingProps {\n onSave: (val: Partial<ScheduleSettingRequest>, onDone?: () => void) => any;\n settings: ScheduleSettingResponse;\n}\n\nconst ScheduleSchema = Yup.object().shape<IScheduleSetting>({\n daysOfWeek: Yup.array<number>().min(1),\n startAt: Yup.number().min(0).max(23).required(),\n repeat: Yup.mixed<'daily' | 'weekly'>().oneOf([ 'daily', 'weekly' ]).default('daily')\n});\n\nexport interface IScheduleSetting {\n startAt: number;\n repeat: 'daily' | 'weekly';\n daysOfWeek: number[];\n}\n\nfunction parseLocalToUTC(\n {\n hour,\n weekdays,\n minute\n }: {\n hour: number,\n weekdays: number[],\n minute: number\n}\n): Omit<FullRosterSyncSchedule, 'enabled'> {\n const utc = weekdays.map(weekday => DateHelper.buildUTCDate(weekday, hour, minute));\n const utcHour = DateHelper.format(ArrayHelper.first(utc), 'HH');\n const utcWeekday = utc.map(w => w.getDay());\n const utcMinute = DateHelper.format(ArrayHelper.first(utc), 'mm');\n\n return { hour: +utcHour, daysOfWeek: utcWeekday, minute: +utcMinute };\n}\n\nfunction parseValueToForm(schedule: FullRosterSyncSchedule): IScheduleSetting {\n const { hour, daysOfWeek } = RosteringHelper.parseUTCToLocal({\n utcHour: schedule.hour,\n utcWeekdays: schedule.daysOfWeek,\n utcMinute: schedule.minute\n });\n\n return {\n startAt: hour,\n daysOfWeek: daysOfWeek,\n repeat: schedule.daysOfWeek.length === 7 ? 'daily' : 'weekly'\n };\n}\n\nfunction parseFormToPayload(val: IScheduleSetting, schedule: FullRosterSyncSchedule): Omit<ScheduleSettingRequest, 'userId'|'customerId'> {\n const utc = parseLocalToUTC({ hour: val.startAt, weekdays: val.daysOfWeek, minute: 0 });\n\n return {\n fullSyncSchedule: {\n daysOfWeek: val.repeat === 'daily' ? [ 0, 1, 2, 3, 4, 5, 6 ] : utc.daysOfWeek,\n hour: utc.hour,\n minute: utc.minute,\n enabled: schedule.enabled\n }\n };\n}\n\nexport function ScheduleSetting(props: ScheduleSettingProps): JSX.Element {\n function onSave(val: IScheduleSetting, onDone: () => void) {\n props.onSave(parseFormToPayload(val, props.settings.fullSyncSchedule), onDone);\n }\n return (\n <div className='py-3 border-bottom w-100'>\n <h2 className='h4'><Text namespace={namespace} phrase='heading' /></h2>\n\n <FormWrapper<IScheduleSetting>\n initialValues={parseValueToForm(props.settings.fullSyncSchedule)}\n onSubmit={onSave}\n validationSchema={ScheduleSchema}\n >\n <ScheduleForm />\n </FormWrapper>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"settings\":\"K6Qs1\",\"spinner\":\"PDZWp\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { RosteringSettingHeader } from 'libs/shared/components/rostering/rostering-header/RosteringSettingHeader';\nimport { ScheduleSetting } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleSetting';\nimport { SyncActionButtonGroup } from 'libs/shared/components/rostering/sync-action-button-group/SyncActionButtonGroup';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, RosteringResponse, ScheduleSettingRequest, ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { RequiresSetUpEmptyState } from 'apps/settings/views/rostering/rostering-sync-list/requires-set-up-empty-state/RequiresSetUpEmptyState';\nimport { useSyncRostering } from 'apps/settings/views/rostering/utils/useSyncRostering';\n\nimport styles from './rostering-sync-settings.scss';\n\nconst namespace = 'rostering.rosteringSyncSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function RosteringSyncSettingsView(): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const rostering = Flight.useBasicFetch<RosteringResponse>(RosteringRequests.getRostering());\n const settings = Flight.useBasicFetch<ScheduleSettingResponse>(rostering.data?.id &&\n RosteringRequests.getSyncScheduleSettings(rostering.data.id));\n\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n function onSave(val: Omit<ScheduleSettingRequest, 'userId'|'customerId'>, onDone?: () => void) {\n const payload = { ...val, userId: currentUser.data.id, customerId: currentUser.data.customerId };\n\n fetch(\n RosteringRequests.updateScheduleSetting(\n payload,\n rostering.data.id,\n () => alerts.success(getPhrase('success')),\n () => alerts.error(getPhrase('error')),\n () => onDone?.()\n )\n );\n }\n\n const { syncNow, fullSync } = useSyncRostering(currentUser.data);\n\n function renderButton() {\n if (rostering.data?.status !== 'Active')\n return <></>;\n return <SyncActionButtonGroup onSyncNow={syncNow} onFullSync={fullSync}/>;\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n headingButton={renderButton}\n requiredPermissions={PermissionName.Rostering}\n >\n \n {rostering.data?.status === 'Active' && (\n <RosteringSettingHeader\n active='settings'\n appLinks={{\n syncJobs: { application: AppChannels.SETTINGS, action: Actions.Settings.ROSTERING },\n settings: { application: AppChannels.SETTINGS, action: Actions.Settings.ROSTERING_SETTINGS }\n }}\n />\n )}\n {rostering.data?.status !== 'Active' ? (\n <RequiresSetUpEmptyState />\n ) : (\n <div className={`d-flex flex-column align-items-center justify-content-center ${styles.settings}`}>\n {settings.data ? (\n <>\n <ScheduleSetting onSave={onSave} settings={settings.data}/>\n \n {/* todo uncomment these form when backend supports */}\n {/* <CheckUpdatesSetting onSave={onSave}/>\n <ClassroomCreationSetting onSave={onSave}/>\n <EmailNotificationSetting onSave={onSave}/> */}\n </>\n ) : (\n <div className={styles.spinner}>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n </div>\n )}\n \n\n </SettingsLayout>\n );\n}","import { AlertType, BaseAlert } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nconst namespace = 'rostering.syncUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const useSyncRostering = (currentUser: CurrentUser) => {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n\n if (!currentUser) {\n return { syncNow: () => {}, fullSync: () => {} };\n }\n\n function syncNow() {\n const alert: BaseAlert = {\n type: AlertType.Success,\n heading: getPhrase('startSyncAlertHeading'),\n message: getPhrase('startSyncAlertBody'),\n appLinkText: getPhrase('startSyncAlertAppLinkText'),\n appLinkClassName: 'info-link'\n };\n\n const data = {\n name: BatchJobName.Rostering,\n type: BatchJobType.Rostering,\n metadata: {\n targetMasterId: currentUser.customerId,\n targetMasterType: MasterType.Customer\n },\n customerId: currentUser.customerId,\n dataType: BatchDataType.Learner\n };\n fetchAsync(RosteringRequests.createJob(\n data,\n () => {\n alerts.success(alert);\n },\n () => {\n alerts.error(getPhrase('error'));\n }\n ));\n }\n\n function fullSync() {\n // todo\n }\n return { fullSync, syncNow };\n};","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"pillItem\":\"hUJx1\"};"],"names":["BreadcrumbItem","breadcrumb","name","appLink","active","withBackIcon","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","length","map","b","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","namespace","FormButtons","props","formikProps","canSubmit","variant","type","disabled","showSpinner","isSubmitting","submitText","phrase","isNew","FormCheckbox","label","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","Form","FieldWrapper","htmlFor","id","checkboxAppLink","checkboxAppLinkText","AppLink","CharacterCounter","field","values","fieldName","limit","children","showLoadingSpinner","setType","resolvedChildren","FunctionHelper","f","ObjectHelper","Spinner","animation","containerClassName","SvgContainer","onClick","FormField","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","errors","touched","disabledOnChange","_props","onChange","fieldWrapperProps","FormHelper","as","title","tooltipPlacement","tooltipSpanHack","Text","maxLength","errorMessage","defaultProps","autoComplete","FormWrapper","castInitialValues","castValuesOnSubmit","initialValues","onSubmit","formattedInitialValues","validationSchema","cast","omitChildValues","child","Object","keys","forEach","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","entries","value","useFormikContextWrapper","PillTabSelector","tabs","tab","analyticsData","analyticsOptions","count","data","onSelect","onSelectTab","RosteringSettingHeader","appLinks","syncJobs","settings","getPhrase","LanguageService","SyncActionButtonGroup","role","Tooltip","spanHack","placement","spanHackClassName","onSyncNow","now","Date","RosteringHelper","parseUTCToLocal","utcHour","utcWeekdays","utcMinute","local","weekday","localWeekdays","w","getDay","hour","daysOfWeek","minute","getScheduledJobBySetting","setting","fullSyncSchedule","enabled","schedule","scheduledDate","weekdayOfToday","scheduledWeekday","sort","a","scheduledToday","includes","setHours","nextScheduledDate","nextScheduledWeekday","find","d","gap","Math","abs","setDate","getDate","RosteringRequests","getRostering","url","getSyncList","queryParams","params","cursor","order","jobStatus","statuses","push","status","createJob","success","error","invalidationKeys","getJobSummary","getSyncScheduleSettings","integrationId","updateScheduleSetting","always","customerId","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","opts","Array","max","floor","random","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","action","SettingsLayout","canAccess","replace","i","heading","headingButton","description","RequiresSetUpEmptyState","src","href","newTab","TIMES","fill","_","REPEATS","WEEK_DAYS","date","offsetHours","getTimezoneOffset","formatTime","number","time","parseWeekdayNumber","DateHelper","ScheduleForm","startAt","Intl","DateTimeFormat","resolvedOptions","timeZone","repeat","TextHelper","option","day","e","preventDefault","nextValue","filter","v","setFieldValue","charAt","str","sortedWeekDays","slice","join","firstPart","weekdays","getAlertContent","ScheduleSchema","shape","min","required","oneOf","ScheduleSetting","val","onDone","onSave","utc","ArrayHelper","parseLocalToUTC","parseFormToPayload","RosteringSyncSettingsView","currentUser","UserRequests","rostering","fetch","alerts","useSetPageMetadata","useSyncRostering","syncNow","fullSync","onFullSync","PermissionName","payload","userId","fetchAsync","alert","message","appLinkText","appLinkClassName","metadata","targetMasterId","targetMasterType","dataType","B"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"scripts/7167-dc4c954c2b-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/components/breadcrumbs/Breadcrumbs.tsx","file:///app/packages/libs/shared/src/components/forms/form-buttons/FormButtons.tsx","file:///app/packages/libs/shared/src/components/forms/form-checkbox/FormCheckbox.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/CharacterCounter.tsx","file:///app/packages/libs/shared/src/components/forms/form-field/form-field.scss","file:///app/packages/libs/shared/src/components/forms/form-field/FormField.tsx","file:///app/packages/libs/shared/src/components/forms/form-wrapper/FormWrapper.tsx","file:///app/packages/libs/shared/src/components/pill-tab-selector/PillTabSelector.tsx","file:///app/packages/libs/shared/src/components/rostering/rostering-header/RosteringSettingHeader.tsx","file:///app/packages/libs/shared/src/components/rostering/sync-action-button-group/sync-action-button-group.scss","file:///app/packages/libs/shared/src/components/rostering/sync-action-button-group/SyncActionButtonGroup.tsx","file:///app/packages/libs/shared/src/components/rostering/utils/RosteringHelper.ts","file:///app/packages/libs/shared/src/flight-requests/RosteringRequests.ts","file:///app/packages/libs/shared/src/utils/FormHelper.ts","file:///app/packages/libs/shared/src/utils/PartialLoadingHelper.ts","file:///app/packages/projects/lite/src/apps/settings/components/settings-layout/SettingsLayout.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-list/requires-set-up-empty-state/RequiresSetUpEmptyState.tsx","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/schedule-setting.scss","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/ScheduleForm.tsx","file:///app/packages/libs/shared/src/components/rostering/settings/schedule-setting/ScheduleSetting.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-settings/rostering-sync-settings.scss","file:///app/packages/projects/lite/src/apps/settings/views/rostering/rostering-sync-settings/RosteringSyncSettingsView.tsx","file:///app/packages/projects/lite/src/apps/settings/views/rostering/utils/useSyncRostering.ts","file:///app/packages/libs/shared/src/components/pill-tab-selector/pill-tab-selector.scss"],"sourcesContent":["import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { MediaQueryStrings } from 'libs/shared/enums/MediaQueries';\nimport { useMediaQuery } from 'libs/shared/hooks/UseMediaQuery';\nimport { PartialLoadingHelper } from 'libs/shared/utils/PartialLoadingHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { SvgContainer, SvgContainerSize } from '../svg-container/SvgContainer';\n\nexport interface Breadcrumb {\n name: string;\n appLink?: Core.AppLink;\n active?: boolean;\n}\n\ninterface BreadcrumbItemProps {\n breadcrumb: Breadcrumb;\n withBackIcon?: boolean;\n}\n\nexport const BreadcrumbItem = ({ breadcrumb: { name, appLink, active }, withBackIcon }: BreadcrumbItemProps) => (\n <li className={`breadcrumb-item${active ? ' active' : ''}`}>\n {active\n ? <strong>{name}</strong>\n : <AppLink appLink={appLink}>\n {withBackIcon && <SvgContainer svgName={cvSvgLibrary.ChevronLeft} size={SvgContainerSize.Small} />}\n <span className={withBackIcon ? 'ms-2' : ''}>{name}</span>\n </AppLink>\n }\n </li>\n);\n\ninterface BreadcrumbsProps {\n breadcrumbs: Breadcrumb[];\n}\n\nexport const Breadcrumbs = ({ breadcrumbs }: BreadcrumbsProps) => {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n const length = breadcrumbs?.length;\n\n if (!length || (isMobile && length < 2))\n return <></>;\n\n if (isMobile)\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n <BreadcrumbItem breadcrumb={breadcrumbs[length - 2]} withBackIcon />\n </ol>\n </nav>\n );\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {breadcrumbs.map((b, idx) => <BreadcrumbItem key={idx} breadcrumb={b} />)}\n </ol>\n </nav>\n );\n};\n\nexport const PartialBreadcrumbs = React.memo(function({ numItems = 3 }: { numItems?: number; }) {\n const isMobile = useMediaQuery(MediaQueryStrings.XS);\n\n if (isMobile) {\n return (\n <div className='partial-loading-background' style={{ height: '1.3125rem', width: '6rem' }} />\n );\n }\n\n return (\n <nav aria-label='breadcrumb'>\n <ol className='breadcrumb m-0 p-0'>\n {PartialLoadingHelper.getPartialLoadingItems({ numItems }).map(({ width }, idx) => (\n <li key={idx} className='breadcrumb-item'>\n <span className='d-inline-block partial-loading-background' style={{ width }} dangerouslySetInnerHTML={{ __html: ' ' }} />\n </li>\n ))}\n </ol>\n </nav>\n );\n});","import * as React from 'react';\nimport { ButtonProps } from 'react-bootstrap';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\nimport { SpinnerButton } from 'libs/shared/components/spinner-button/SpinnerButton';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useCanSubmitForm } from 'libs/shared/hooks/UseCanSubmitForm';\n\nconst namespace = 'shared.formButtons';\n\ninterface FormButtonsProps {\n isNew?: boolean;\n submitText?: string;\n variant?: ButtonProps['variant'];\n size?: FormSize;\n className?: string;\n}\n\nexport function FormButtons<Values extends HashObject>(props: FormButtonsProps): JSX.Element {\n const formikProps = useFormikContext<Values>();\n\n const canSubmit = useCanSubmitForm(formikProps);\n\n return (\n <SpinnerButton\n variant={props.variant || 'primary'}\n type='submit'\n disabled={!canSubmit}\n size={props.size}\n className={props.className ? props.className : ''}\n showSpinner={formikProps.isSubmitting}\n >\n {props.submitText\n ? <>{props.submitText}</>\n : <Text namespace={namespace} phrase={props.isNew ? 'create' : 'save'} />}\n </SpinnerButton>\n );\n}\n","import * as React from 'react';\nimport { Form } from 'react-bootstrap';\nimport { FieldAttributes } from 'formik';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\n\nimport { FieldWrapper, FormFieldProps } from '../form-field/FormField';\n\n/**\n * Use this checkbox within Formik contexts\n */\nexport function FormCheckbox(props: FieldAttributes<FormFieldProps>): JSX.Element {\n const { label, checkboxLabelClassName, checkboxLabelFontWeight, className, ...fieldProps } = props;\n\n return (\n <Form.Group className='form-group'>\n <div className={`form-check ${className || ''}`}>\n <FieldWrapper className='form-check-input' {...fieldProps} />\n <Form.Label\n className={`form-check-label cursor-pointer ${checkboxLabelFontWeight === 'normal' ? 'fw-normal' : ''} \n ${checkboxLabelClassName}`}\n htmlFor={fieldProps.id}\n >\n {label}\n </Form.Label>\n {props.checkboxAppLink && props.checkboxAppLinkText && (\n <>\n <span> </span>\n <AppLink appLink={props.checkboxAppLink} className='info-link'>\n {props.checkboxAppLinkText}\n </AppLink>\n </>\n )}\n </div>\n </Form.Group>\n );\n}\n\n","import * as React from 'react';\nimport { useFormikContext } from 'formik';\n\nimport { HashObject } from 'libs/common/react/interfaces';\n\ninterface CharacterCounterProps<Values extends HashObject> {\n fieldName: keyof Values;\n limit: number;\n}\n\nexport function CharacterCounter<Values extends HashObject>(props: CharacterCounterProps<Values>): JSX.Element {\n const { values } = useFormikContext<Values>();\n\n const field = values[props.fieldName];\n\n if (typeof field !== 'string')\n return <></>;\n\n return (\n <div className='float-end text-secondary fw-normal'>\n {field.length}/{props.limit} characters\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"revealPassword\":\"jCfI0\",\"passwordInput\":\"RBJnf\",\"passwordContainer\":\"d78lK\",\"passwordContainerDisabled\":\"asbVo\",\"infoTooltip\":\"wzyOG\",\"spinner\":\"CycFx\"};","import * as React from 'react';\nimport { Form, Spinner } from 'react-bootstrap';\nimport { Placement } from 'react-bootstrap/esm/types';\nimport { ErrorMessage, Field, FieldAttributes, FieldProps, useFormikContext } from 'formik';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormCheckbox } from 'libs/shared/components/forms/form-checkbox/FormCheckbox';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FormHelper } from 'libs/shared/utils/FormHelper';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\n\nimport { CharacterCounter } from './CharacterCounter';\n\nimport styles from './form-field.scss';\n\nconst namespace = 'shared.formField';\n\nexport type FormSize = 'lg' | 'sm';\n\n// If checkboxLabelFontWeight is not specified, it will be bold by default\nexport type CheckboxLabelFontWeight = 'normal' | 'bold'\n\nexport interface FormFieldProps {\n /**\n * The name prop MUST be the same as the attribute\n * name of the value that the field is bound to.\n */\n name: string;\n label?: string;\n children?: any;\n showCharacterCounter?: boolean;\n showRequiredStar?: boolean;\n checkboxAppLink?: Core.AppLink;\n checkboxAppLinkText?: string;\n checkboxLabelClassName?: string;\n checkboxLabelFontWeight?: CheckboxLabelFontWeight\n infoTooltip?: string;\n infoTooltipPlacement?: Placement;\n infoText?: string;\n formSize?: FormSize;\n showOptionalLabel?: boolean;\n showLoadingSpinner?: boolean;\n}\n\nFieldWrapper.defaultProps = {\n autoComplete: 'off'\n};\n\nexport function FieldWrapper(\n props: FieldAttributes<FormFieldProps> & { className: string }\n): React.ReactElement {\n const { children, showLoadingSpinner, ...fieldProps } = props;\n\n const [ type, setType ] = React.useState(props.type);\n\n function onClickTogglePassword(): void {\n if (type === 'password')\n setType('text');\n else\n setType('password');\n }\n\n const resolvedChildren = FunctionHelper.isFunction(children)\n ? (f: FieldProps) => children(f)\n : React.Children.count(children) ? children : null;\n\n if (fieldProps.type !== 'password') {\n if (showLoadingSpinner) {\n return (\n <div className='position-relative'>\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n\n <div className={styles.spinner}>\n <Spinner animation='border' size='sm' />\n </div>\n </div>\n );\n }\n\n return (\n <Field {...(ObjectHelper.omit(fieldProps, ['formSize']))}>\n {resolvedChildren}\n </Field>\n );\n }\n\n let containerClassName = `position-relative ${styles.passwordContainer}`;\n\n if (fieldProps.className)\n containerClassName += ` ${fieldProps.className}`;\n\n if (fieldProps.disabled)\n containerClassName += ` ${styles.passwordContainerDisabled}`;\n\n /**\n * We need to wrap out input with a relatively positioned element in order to absolutely\n * position our visibility icon to reveal the password - Sha\n */\n return (\n <div className={containerClassName}>\n <Field\n {...(ObjectHelper.omit(fieldProps, [ 'formSize', 'type', 'className' ]))}\n type={type}\n className={`${styles.passwordInput} border-0 w-100 h-100 outline-none rounded`}\n >\n {resolvedChildren}\n </Field>\n {fieldProps.type === 'password' &&\n <SvgContainer\n svgName={type === 'password' ? cvSvgLibrary.VisibleOn : cvSvgLibrary.VisibleOff}\n className={`svg-container cursor-pointer ${styles.revealPassword}`}\n onClick={onClickTogglePassword}\n />\n }\n </div>\n );\n}\n\nFormField.defaultProps = {\n autoComplete: 'off',\n infoTooltipPlacement: 'top'\n};\n\nexport function FormField<Values extends HashObject>(props: FieldAttributes<FormFieldProps>): React.ReactElement {\n const {\n label,\n className,\n showCharacterCounter,\n showRequiredStar,\n infoTooltip,\n infoTooltipPlacement,\n infoText,\n formSize,\n showOptionalLabel,\n ...fieldProps\n } = props;\n\n const { errors, touched } = useFormikContext<Values>();\n\n // This function overwrites the default `onChange` function whenever `props.disabled` is set.\n // This prevents users from \"undisabling\" form fields via inspect element, then editing the field.\n const disabledOnChange = () => {};\n\n if (fieldProps.type === 'checkbox') {\n const _props = ObjectHelper.omit(props, [ 'formSize', 'infoTooltipPlacement' ]);\n\n if (props.disabled)\n _props.onChange = disabledOnChange;\n\n return <FormCheckbox {..._props} />;\n }\n\n const fieldWrapperProps = {\n ...fieldProps,\n className: FormHelper.getCustomFormControlClassName(\n errors,\n touched,\n fieldProps.name,\n formSize,\n className,\n typeof props.as === 'string' ? props.as : null\n )\n };\n\n if (props.disabled)\n fieldWrapperProps.onChange = disabledOnChange;\n\n return (\n <Form.Group className='form-group'>\n {!!label && (\n <Form.Label htmlFor={fieldProps.id} className='d-flex align-items-center'>\n {label}\n {showRequiredStar && <span className='text-danger'>*</span>}\n {infoTooltip && (\n <SvgContainer\n className={`svg-container text-secondary ${styles.infoTooltip}`}\n svgName={cvSvgLibrary.Info}\n title={infoTooltip}\n tooltipPlacement={infoTooltipPlacement}\n tooltipSpanHack\n />\n )}\n {showOptionalLabel && <span className='text-secondary'> <Text namespace={namespace} phrase='optional' /></span>}\n \n {!!showCharacterCounter && !!(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength &&\n <div className='ms-auto'>\n <CharacterCounter\n fieldName={(fieldProps.name as keyof Values)}\n limit={(fieldProps as React.HTMLProps<HTMLInputElement>).maxLength}\n />\n </div>\n }\n </Form.Label>\n )}\n\n <FieldWrapper {...fieldWrapperProps} />\n\n {!!infoText &&\n <Form.Text className='text-secondary'>\n {infoText}\n </Form.Text>\n }\n\n <ErrorMessage name={fieldProps.name}>\n {(errorMessage: string) => <Form.Control.Feedback type='invalid'>{errorMessage}</Form.Control.Feedback>}\n </ErrorMessage>\n </Form.Group>\n );\n}","import * as React from 'react';\nimport { Formik, FormikConfig, FormikContextType, FormikErrors, FormikHelpers, FormikProps, FormikValues, useFormikContext } from 'formik';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\n/**\n * Note: This currently doesn't support arrays, but the need for arrays as initial\n * form data has not yet come up\n */\nfunction omitNullInitialValues<Values extends FormikValues>(initialValues: Values): Values {\n if (!initialValues)\n return {} as Values;\n\n const values = ObjectHelper.deepClone(initialValues);\n\n function omitChildValues(child: Values): void {\n Object.keys(values).forEach((key: keyof Values) => {\n if (!values.hasOwnProperty(key))\n return;\n \n if (ObjectHelper.isObject(child[key]))\n omitChildValues(child[key]);\n else if (values[key] === null)\n delete values[key];\n });\n }\n\n omitChildValues(values);\n return values;\n}\n\n// Omit attributes from FormikConfig that are defined in FormWrapperProps.\ntype ModifiedFormikConfig<Values extends FormikValues> = Omit<FormikConfig<Values>, 'initialValues' | 'onSubmit'>;\n\ninterface InitialStatus {\n allowInitialSubmit: boolean;\n}\n\nexport type FormSubmissionOptions<FormValues = FormikValues> = {\n reset?: boolean;\n errors?: FormikErrors<FormValues>;\n};\n\ninterface FormWrapperProps<FormValues extends FormikValues, ApiValues extends FormikValues> {\n initialValues: Partial<FormValues | ApiValues>;\n onSubmit: (data: FormValues, onDone: (options?: FormSubmissionOptions<FormValues>) => void) => void;\n castInitialValues?: boolean; // cast to validationSchema\n castValuesOnSubmit?: boolean; // cast to validationSchema\n allowInitialSubmit?: boolean; // if true, useCanSubmitForm will allow submit without any user changes.\n}\n\nFormWrapper.defaultProps = {\n castInitialValues: true,\n castValuesOnSubmit: true\n};\n\nexport function FormWrapper<\n FormValues extends FormikValues = FormikValues,\n ApiValues extends FormikValues = FormValues,\n ExtraProps = HashObject\n>(props: ModifiedFormikConfig<FormValues> & ExtraProps & FormWrapperProps<FormValues, ApiValues>): JSX.Element {\n const { castInitialValues, castValuesOnSubmit, initialValues, onSubmit, ...formikProps } = props;\n\n /**\n * If castInitialValues is true, cast initialValues to the validationSchema.\n * This will ensure that any data fetched from the api conforms to the expected form data shape.\n */\n const formattedInitialValues: FormValues = castInitialValues && props.validationSchema\n ? props.validationSchema.cast(omitNullInitialValues(initialValues))\n : initialValues;\n\n const onSubmitHandler = (\n values: FormValues,\n { setSubmitting, resetForm, setFieldError }: FormikHelpers<FormValues>\n ) => {\n /**\n * validationSchema.cast will coerce the values to the types defined in validationSchema.\n * This is useful for trimming inputs:\n * e.g. if a value field has type Yup.string().trim(), it will be automatically trimmed.\n */\n const formattedData = castValuesOnSubmit && props.validationSchema\n ? props.validationSchema.cast(values)\n : values;\n\n onSubmit(formattedData, (options: FormSubmissionOptions<FormValues> = {}) => {\n options.reset && resetForm();\n\n if (options.errors) {\n for (const [ key, value ] of Object.entries(options.errors)) {\n setFieldError(key, value);\n }\n }\n\n setSubmitting(false);\n });\n };\n\n const initialStatus: InitialStatus = {\n allowInitialSubmit: props.allowInitialSubmit\n };\n\n return (\n <Formik<FormValues, ExtraProps>\n enableReinitialize\n {...(formikProps as ModifiedFormikConfig<FormValues> & ExtraProps)}\n initialValues={formattedInitialValues}\n onSubmit={onSubmitHandler}\n initialStatus={initialStatus}\n >\n {FunctionHelper.isFunction(props.children)\n ? (f: FormikProps<FormValues>) => (props.children as (f: FormikProps<FormValues>) => React.ReactNode)(f)\n : React.Children.count(props.children) ? props.children : null\n }\n </Formik>\n );\n}\n\nexport function useFormikContextWrapper<T>(): FormikContextType<T> {\n return useFormikContext<T>();\n}","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { AnalyticsOptions } from 'libs/analytics/interfaces';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Badge, BadgeType } from 'libs/shared/components/badges/Badge';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\n\nimport styles from './pill-tab-selector.scss';\n\nexport interface PillTab {\n name: string;\n active: boolean;\n\n appLink?: Core.AppLink;\n onSelect?: () => void;\n\n analyticsData?: HashObject;\n analyticsOptions?: AnalyticsOptions;\n\n count?: number;\n}\n\ninterface PillTabSelectorProps {\n tabs: PillTab[];\n className?: string;\n}\n\nexport function PillTabSelector(props: PillTabSelectorProps): JSX.Element {\n function onSelectTab(tab: PillTab): void {\n if (tab.active || !tab.onSelect)\n return;\n\n tab.onSelect();\n\n if (tab.analyticsData && tab.analyticsOptions)\n AnalyticsHelper.logUserAction(tab.analyticsData, tab.analyticsOptions);\n }\n\n return (\n <nav className={props.className ?? ''}>\n <ul className={`list-unstyled d-inline-block m-0 ${styles.pillTabSelector}`}>\n {props.tabs.map(tab => {\n return (\n <li className={`p-0 ${tab.active ? 'btn btn-dark' : 'btn btn-outline-dark'}`} key={tab.name}>\n {tab.appLink ? (\n <AppLink\n appLink={tab.appLink}\n analyticsData={tab.analyticsData}\n analyticsOptions={tab.analyticsOptions}\n className={`cursor-pointer d-flex justify-content-center text-decoration-none text-reset px-2 ${styles.pillItem}`}\n >\n {tab.name}\n\n {typeof (tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={tab.count} />\n </div>\n )}\n </AppLink>\n ) : (\n <DivButton className={`${styles.pillItem} d-flex justify-content-center p-2`} onClick={() => onSelectTab(tab)}>\n {tab.name}\n\n {typeof (tab.count) === 'number' && (\n <div className='ps-2'>\n <Badge type={BadgeType.Count} data={tab.count} />\n </div>\n )}\n </DivButton>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n );\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PillTabSelector } from 'libs/shared/components/pill-tab-selector/PillTabSelector';\n\nconst namespace = 'rostering.settingHeader';\n\nexport interface RosteringSettingHeaderAppLinks {\n syncJobs: Core.AppLink;\n settings: Core.AppLink;\n}\n\ninterface RosteringSettingHeaderProps {\n appLinks?: RosteringSettingHeaderAppLinks;\n active: keyof RosteringSettingHeaderAppLinks;\n}\n\nexport function RosteringSettingHeader(props: RosteringSettingHeaderProps): JSX.Element {\n const tabs = [{\n name: LanguageService.getPhrase(namespace, 'syncJobs'),\n appLink: props.appLinks?.syncJobs,\n active: props.active === 'syncJobs'\n \n }, {\n name: LanguageService.getPhrase(namespace, 'settings'),\n appLink: props.appLinks?.settings,\n active: props.active === 'settings'\n \n }];\n\n return (\n <div>\n <PillTabSelector tabs={tabs} />\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"rightButton\":\"GcqRT\"};","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\n\nimport styles from './sync-action-button-group.scss';\n\nconst namespace = 'rostering.syncActionButtonGroup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface SyncActionButtonGroupProps {\n onSyncNow?: () => void;\n onFullSync?: () => void;\n}\n\nexport function SyncActionButtonGroup(props: SyncActionButtonGroupProps): JSX.Element {\n return (\n <div className='btn-group px-2' role='group'>\n <Tooltip title={getPhrase('syncNowTooltip')} spanHack placement='left' spanHackClassName={styles.buttonBorder}>\n <button type='button' className={`btn btn-outline-dark ${styles.leftButton}`} onClick={props?.onSyncNow}>{getPhrase('syncNow')}</button>\n </Tooltip>\n {/* todo hide the dropdown for v1 */}\n {/* <button type='button' className={`btn dropdown-toggle btn-outline-dark ${styles.rightButton}`} data-bs-toggle='dropdown'>\n </button>\n <div className='dropdown-menu'>\n <Tooltip title={getPhrase('fullSyncTooltip')} spanHack placement='left' >\n <div className='dropdown-item cursor-pointer' onClick={props?.onFullSync}>{getPhrase('fullSync')}</div>\n </Tooltip>\n </div> */}\n </div>\n );\n}","import { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nconst now = new Date();\n\nexport const RosteringHelper = {\n parseUTCToLocal(\n {\n utcHour,\n utcWeekdays,\n utcMinute = 0\n }: {\n utcHour: number,\n utcWeekdays: number[],\n utcMinute: number\n }\n ) {\n const local = utcWeekdays.map(weekday => DateHelper.buildLocalDateFromUTC(weekday, utcHour, utcMinute));\n\n const localWeekdays = local.map(w => w.getDay());\n const localHour = DateHelper.format(ArrayHelper.first(local), 'HH');\n return { hour: +localHour, daysOfWeek: localWeekdays, minute: utcMinute };\n },\n\n // calculating next scheduled job by schedule setting\n getScheduledJobBySetting (setting: ScheduleSettingResponse): Date | null {\n if (!setting || !setting.fullSyncSchedule || !setting.fullSyncSchedule.enabled)\n return null;\n\n const schedule = RosteringHelper.parseUTCToLocal({\n utcHour: setting.fullSyncSchedule.hour,\n utcWeekdays: setting.fullSyncSchedule.daysOfWeek,\n utcMinute: setting.fullSyncSchedule.minute\n });\n const scheduledDate = new Date();\n const weekdayOfToday = now.getDay();\n\n const scheduledWeekday = schedule.daysOfWeek.sort((a, b) => a - b);\n const scheduledToday = schedule.daysOfWeek.includes(weekdayOfToday);\n const hour = schedule.hour;\n const minute = schedule?.minute ?? 0;\n\n if (scheduledToday) {\n scheduledDate.setHours(hour, minute, 0, 0);\n if (now < scheduledDate) {\n return scheduledDate;\n }\n }\n\n const nextScheduledDate = new Date();\n let nextScheduledWeekday = scheduledWeekday.find(d => d > weekdayOfToday);\n if (!nextScheduledWeekday) {\n // cannot find next scheduled date in the current week, must be next week\n nextScheduledWeekday = scheduledWeekday[0];\n }\n // use absolute value of gap to make sure next scheduled date is in the futrue\n const gap = Math.abs(nextScheduledWeekday - weekdayOfToday);\n nextScheduledDate.setDate(now.getDate() + gap);\n nextScheduledDate.setHours(hour, 0, 0, 0);\n return nextScheduledDate;\n }\n};","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/flight';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { BulkJobsQueryParams } from 'libs/shared/components/bulk-jobs-filters/BulkJobsFilters';\nimport { BatchJobStatus } from 'libs/shared/enums/BatchJobStatus';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { BatchJob, ScheduleSettingRequest } from 'libs/shared/interfaces';\nimport { CreateBatchJobRequest } from 'libs/shared/interfaces';\n\nexport const RosteringRequests = {\n getRostering(): Flight.Request {\n return {\n url: `{gateway}/v1/users/me/rostering`,\n key: `rostering`\n };\n },\n\n getSyncList(queryParams: BulkJobsQueryParams): Flight.Request {\n const params: HashObject = {};\n if (queryParams.cursor)\n params.cursor = queryParams.cursor;\n\n if (queryParams.sort) {\n if (queryParams.sort === 'oldest')\n params.order = 'ASC';\n else\n params.order = 'DESC';\n }\n\n if (queryParams.jobStatus) {\n const statuses = [];\n if (queryParams.jobStatus.includes('completed')) {\n statuses.push(...[ BatchJobStatus.Completed, BatchJobStatus.CompletedWithError ]);\n }\n if (queryParams.jobStatus.includes('failed')) {\n statuses.push(BatchJobStatus.Failed);\n }\n if (queryParams.jobStatus.includes('inProgress')) {\n statuses.push(...[\n BatchJobStatus.Submitted,\n BatchJobStatus.Queued,\n BatchJobStatus.Pending,\n BatchJobStatus.InProgress ]);\n }\n params.status = statuses;\n }\n\n params.type = BatchJobType.Rostering;\n\n return {\n url: UrlHelper.urlBuilder('{gateway}/v1/batch/jobs', params),\n key: `rostering:sync:${queryParams.cursor}:${queryParams.sort}:${queryParams.jobStatus}`\n };\n },\n\n createJob(\n data: CreateBatchJobRequest,\n success?: (job: BatchJob) => void,\n error?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/batch/jobs',\n key: 'rostering:sync',\n type: HttpVerbs.POST,\n invalidationKeys: ['rostering:sync'],\n data,\n success,\n error\n };\n },\n\n getJobSummary(id: string): Flight.Request {\n return {\n url: `{gateway}/v1/batch/jobs/${id}/summary`,\n key: `job:summary:${id}`\n };\n },\n\n getSyncScheduleSettings(integrationId: string): Flight.SimulatedRequest {\n return {\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `sync-settings:${integrationId}`\n };\n },\n\n updateScheduleSetting(\n data: ScheduleSettingRequest,\n integrationId: string,\n success?: () => void,\n error?: () => void,\n always?: () => void\n ): Flight.Request {\n return {\n type: HttpVerbs.PUT,\n url: `{gateway}/v1/rostering/${integrationId}/schedule`,\n key: `update:sync-settings:${data.customerId}:${integrationId}`,\n invalidationKeys: [`sync-settings:${integrationId}`],\n data,\n success,\n error,\n always\n };\n }\n};","import { FormikErrors, FormikTouched, getIn } from 'formik';\n\nimport { FormSize } from 'libs/shared/components/forms/form-field/FormField';\n\nfunction getTypeSize(type: string, size: FormSize) {\n let className = '';\n\n switch (type) {\n case 'select':\n className = 'form-select';\n break;\n default:\n className = 'form-control';\n }\n\n if (size === 'sm')\n className += ` ${className}-sm`;\n\n if (size === 'lg')\n className += ` ${className}-lg`;\n\n return className;\n}\n\nexport const FormHelper = {\n getCustomFormControlClassName<T>(\n errors: FormikErrors<T>,\n touched: FormikTouched<T>,\n attribute: string,\n size?: FormSize,\n additionalClassName?: string,\n type?: string\n ): string {\n let className = '';\n\n className = getTypeSize(type, size);\n\n // Using getIn as it supports dot notation\n if (getIn(touched, attribute) && getIn(errors, attribute))\n className += ' is-invalid';\n\n if (additionalClassName)\n className += ` ${additionalClassName}`;\n\n return className;\n }\n};","const DEFAULT_PARTIAL_LOADING_OPTIONS: PartialLoadingOptions = {\n numItems: 5,\n minWidth: 50, // px\n maxWidth: 100 // px\n};\n\nexport interface PartialLoadingOptions {\n numItems?: number;\n minWidth?: number;\n maxWidth?: number;\n}\n\ninterface PartialLoadingItem {\n width: string;\n}\n\nexport const PartialLoadingHelper = {\n getPartialLoadingItems(options: PartialLoadingOptions = {}): PartialLoadingItem[] {\n const opts = {\n ...DEFAULT_PARTIAL_LOADING_OPTIONS,\n ...options\n };\n\n const getRandomFilterWidth = () => Math.max(Math.floor(Math.random() * opts.maxWidth), opts.minWidth);\n\n return [...Array(opts.numItems)].map(() => ({ width: `${getRandomFilterWidth()}px` }));\n }\n};","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { useGetSettingsGroups } from 'apps/settings/hooks/useGetSettingsGroups';\n\nconst namespace = 'settings.settingsLayout';\n\n/**\n * Checks if the current user has permission to access the settings module\n */\nexport const useCanAccessSettings = (requiredPermissions: PermissionName | PermissionName[]): boolean => {\n const { hasPermissions } = usePermissions();\n const settingsGroups = useGetSettingsGroups();\n\n /**\n * TODO: Update all settings pages to pasas required permissions, because checking the \n * `useGetSettingsGroups()` values clearly doesnt work for settings pages with multiple\n * applinks inside of them. - Sha\n */\n if (requiredPermissions)\n return hasPermissions(requiredPermissions);\n\n const currentRoute = Core.AppLinkHelper.getCurrentAppLink();\n\n /**\n * Allows us to have popups sitting in other locations be used\n * by our settings pages. For example the manage video access popup\n * in the \"videos with restricted access\" page - Sha\n */\n if (currentRoute.application !== AppChannels.SETTINGS)\n return true;\n\n return settingsGroups.some(group => {\n return group.modules.some(settingsModule => {\n if ('appLink' in settingsModule) {\n return settingsModule.appLink.action === currentRoute.action;\n }\n\n return false;\n });\n });\n};\n\ninterface SettingsLayoutProps {\n heading: string;\n breadcrumbs: string[];\n description?: string;\n requiredPermissions?: PermissionName | PermissionName[];\n headingButton?: () => JSX.Element;\n}\n\nexport function SettingsLayout(props: React.PropsWithChildren<SettingsLayoutProps>): JSX.Element {\n const canAccess = useCanAccessSettings(props.requiredPermissions);\n\n React.useEffect(() => {\n if (!canAccess) {\n Core.AppLinkHelper.trigger({\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }, { replace: true });\n }\n }, [canAccess]);\n\n if (!canAccess)\n return <></>;\n\n const breadcrumbs = props.breadcrumbs.map((name, i) => ({\n name,\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n },\n active: i === props.breadcrumbs.length - 1\n }));\n\n return (\n <div className='px-3'>\n <div className='d-flex align-items-center justify-content-between'>\n <h1 className='h2'>{props.heading}</h1>\n {props.headingButton?.()}\n </div>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={[\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n ...breadcrumbs\n ]}\n />\n </div>\n {props.description &&\n <>\n <p>{props.description}</p>\n <hr />\n </>\n }\n\n {props.children}\n </div>\n );\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { ExternalLink } from 'libs/shared/components/external-link/ExternalLink';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nconst namespace = 'rostering.requiresSetUp';\n\nexport function RequiresSetUpEmptyState(): JSX.Element {\n return (\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.Rostering.REQUIRES_SET_UP} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Info className='w-50 mb-3'><Text namespace={namespace} phrase='emptyInfo' /></EmptyState.Info>\n \n {/* <EmptyState.Cta\n href={href}\n text={getPhrase('emptyCta')}\n className='btn btn-link info-link'\n openInNewTab\n /> */}\n \n <ExternalLink\n className='btn btn-dark'\n href={ArticleHelper.getSupportRequestUrl()}\n newTab\n >\n <Text namespace={namespace} phrase='button'/>\n </ExternalLink>\n \n </EmptyState>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"select\":\"eHERO\",\"sourceLabel\":\"P7yI8\",\"source\":\"dsINO\",\"logoWrapper\":\"kPI9A\",\"wrapper\":\"PYTsc\",\"weekdaysPicker\":\"W8qyy\"};","import React from 'react';\nimport { Form, useFormikContext } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { FormButtons } from 'libs/shared/components/forms/form-buttons/FormButtons';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { IScheduleSetting } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleSetting';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport styles from './schedule-setting.scss';\n\nconst namespace = 'rostering.settings.schedule';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\n// constant to build dropdown\nconst TIMES = new Array(24).fill(0).map((_, i) => i);\nconst REPEATS = [ 'daily', 'weekly' ];\nconst WEEK_DAYS = [ 1, 2, 3, 4, 5, 6, 0 ];\nconst date = new Date();\nconst offsetHours = new Date().getTimezoneOffset() / 60;\n\nfunction formatTime (number: number) {\n if (number === 0)\n return '12:00 AM';\n\n const isAm = number / 12 < 1;\n const time = number === 12 ? 12 : number % 12;\n\n if (isAm)\n return time < 10 ? `0${time}:00 AM` : `${time}:00 AM`;\n \n\n return time < 10 ? `0${time}:00 PM` : `${time}:00 PM`;\n}\n\nfunction parseWeekdayNumber(w: number): string {\n return DateHelper.format(DateHelper.weekday(date, w), 'ddd');\n}\n\nfunction getAlertContent(values: IScheduleSetting): string {\n switch (values.repeat) {\n case 'daily':\n return getPhrase('summary', { time: formatTime(values.startAt), repeat: values.repeat });\n case 'weekly':\n const sortedWeekDays = WEEK_DAYS.filter(v => values.daysOfWeek.includes(v)).map(w => parseWeekdayNumber(w));\n\n let str = '';\n if (sortedWeekDays.length >= 2) {\n const firstPart = sortedWeekDays.slice(0, sortedWeekDays.length - 1).join(', ');\n const lastPart = 'and ' + sortedWeekDays[sortedWeekDays.length - 1];\n str = firstPart + ', ' + lastPart;\n } else {\n str = sortedWeekDays.join(', ');\n }\n\n return getPhrase('weeklySummary', {\n weekdays: str,\n time: formatTime(values.startAt),\n repeat: values.repeat\n });\n }\n}\n\nexport function ScheduleForm(): JSX.Element {\n const formikProps = useFormikContext<IScheduleSetting>();\n\n function getButtonClassName(day: number): string {\n let className = 'btn border';\n\n if (formikProps.values.daysOfWeek.includes(day))\n className += ' btn-dark';\n else\n className += ' btn-outline-dark';\n\n return className;\n }\n\n function onClick(e: React.MouseEvent, day: number): void {\n e.preventDefault();\n\n const nextValue = formikProps.values.daysOfWeek.includes(day)\n ? formikProps.values.daysOfWeek.filter(v => v !== day)\n : [ ...formikProps.values.daysOfWeek, day ];\n // don't allow an empty array, user have to select at least one weekday\n if (nextValue.length === 0) return;\n\n formikProps.setFieldValue('daysOfWeek', nextValue);\n }\n\n return (\n <Form>\n <div>\n <p><Text namespace={namespace} phrase='info' /></p>\n\n <div className='row'>\n {/* todo waiting for decision if we going to keep it since we only support single source */}\n {/* <p className={`col col-3 ${styles.sourceLabel}`}>{getPhrase('from')}</p>\n <div className={`col d-flex align-items-center ${styles.source}`}>\n <div className={`${styles.logoWrapper} bg-white rounded-circle border d-flex align-items-center justify-content-center me-2`}>\n <img src='https://img.clickviewapp.com/v2/logos/LqlKgd'/>\n </div> \n <p className='fw-semibold mb-0'>Clever</p>\n </div>*/}\n </div>\n\n <div className='row align-items-center'>\n <p className='col col-3'>{getPhrase('start')}</p>\n <div className='col'>\n <div className='d-flex align-items-center flex-gap'>\n <FormField\n className={`${styles.select} me-2`}\n id='start'\n name='startAt'\n as='select'\n value={formikProps.values.startAt ?? 2}\n >\n {TIMES.map(i => <option className='text-dark' value={i} key={i}>{formatTime(i)}</option>)}\n </FormField>\n {/* display current timezone based on browser */}\n <p>(EST UTC{`${offsetHours}`}) {Intl.DateTimeFormat().resolvedOptions().timeZone.replace('/', ' - ')}</p>\n </div>\n </div>\n \n </div>\n\n <div className='row align-items-center'>\n <p className='col col-3'>{getPhrase('repeat')}</p>\n <div className={`col ${styles.wrapper} position-relative`}>\n <FormField\n className={`${styles.select} d-inline-block`}\n id='repeat'\n name='repeat'\n as='select'\n value={formikProps.values.repeat}\n >\n {REPEATS.map(i => <option className='text-dark' value={i} key={i}>{TextHelper.toTitleCase(i)}</option>)}\n </FormField>\n\n {formikProps.values.repeat === 'weekly' && (\n <div className={`d-flex align-items-center position-absolute ${styles.weekdaysPicker}`}>\n <span className='ms-2 me-3'>{getPhrase('on')}</span>\n <div className='btn-group mb-1'>\n {WEEK_DAYS.map(option => {\n return (\n <button\n key={option}\n className={getButtonClassName(option)}\n onClick={e => {\n onClick(e, option);\n }}\n type='button'\n >\n {parseWeekdayNumber(option).charAt(0)}\n </button>\n );\n })}\n </div>\n </div>)}\n </div>\n </div>\n </div>\n\n <div className='rounded p-2 bg-light-blue text-info fw-semibold mb-3'>\n {getAlertContent(formikProps.values)}\n </div>\n\n <FormButtons<IScheduleSetting>\n isNew={false}\n variant='outline-dark'\n />\n </Form>\n\n );\n}","import React from 'react';\nimport * as Yup from 'yup';\n\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { ScheduleForm } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleForm';\nimport { RosteringHelper } from 'libs/shared/components/rostering/utils/RosteringHelper';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { FullRosterSyncSchedule, ScheduleSettingRequest, ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nconst namespace = 'rostering.settings.schedule';\n\ninterface ScheduleSettingProps {\n onSave: (val: Partial<ScheduleSettingRequest>, onDone?: () => void) => any;\n settings: ScheduleSettingResponse;\n}\n\nconst ScheduleSchema = Yup.object().shape<IScheduleSetting>({\n daysOfWeek: Yup.array<number>().min(1),\n startAt: Yup.number().min(0).max(23).required(),\n repeat: Yup.mixed<'daily' | 'weekly'>().oneOf([ 'daily', 'weekly' ]).default('daily')\n});\n\nexport interface IScheduleSetting {\n startAt: number;\n repeat: 'daily' | 'weekly';\n daysOfWeek: number[];\n}\n\nfunction parseLocalToUTC(\n {\n hour,\n weekdays,\n minute\n }: {\n hour: number,\n weekdays: number[],\n minute: number\n}\n): Omit<FullRosterSyncSchedule, 'enabled'> {\n const utc = weekdays.map(weekday => DateHelper.buildUTCDate(weekday, hour, minute));\n const utcHour = DateHelper.format(ArrayHelper.first(utc), 'HH');\n const utcWeekday = utc.map(w => w.getDay());\n const utcMinute = DateHelper.format(ArrayHelper.first(utc), 'mm');\n\n return { hour: +utcHour, daysOfWeek: utcWeekday, minute: +utcMinute };\n}\n\nfunction parseValueToForm(schedule: FullRosterSyncSchedule): IScheduleSetting {\n const { hour, daysOfWeek } = RosteringHelper.parseUTCToLocal({\n utcHour: schedule.hour,\n utcWeekdays: schedule.daysOfWeek,\n utcMinute: schedule.minute\n });\n\n return {\n startAt: hour,\n daysOfWeek: daysOfWeek,\n repeat: schedule.daysOfWeek.length === 7 ? 'daily' : 'weekly'\n };\n}\n\nfunction parseFormToPayload(val: IScheduleSetting, schedule: FullRosterSyncSchedule): Omit<ScheduleSettingRequest, 'userId'|'customerId'> {\n const utc = parseLocalToUTC({ hour: val.startAt, weekdays: val.daysOfWeek, minute: 0 });\n\n return {\n fullSyncSchedule: {\n daysOfWeek: val.repeat === 'daily' ? [ 0, 1, 2, 3, 4, 5, 6 ] : utc.daysOfWeek,\n hour: utc.hour,\n minute: utc.minute,\n enabled: schedule.enabled\n }\n };\n}\n\nexport function ScheduleSetting(props: ScheduleSettingProps): JSX.Element {\n function onSave(val: IScheduleSetting, onDone: () => void) {\n props.onSave(parseFormToPayload(val, props.settings.fullSyncSchedule), onDone);\n }\n return (\n <div className='py-3 border-bottom w-100'>\n <h2 className='h4'><Text namespace={namespace} phrase='heading' /></h2>\n\n <FormWrapper<IScheduleSetting>\n initialValues={parseValueToForm(props.settings.fullSyncSchedule)}\n onSubmit={onSave}\n validationSchema={ScheduleSchema}\n >\n <ScheduleForm />\n </FormWrapper>\n </div>\n );\n}","// extracted by mini-css-extract-plugin\nexport default {\"settings\":\"K6Qs1\",\"spinner\":\"PDZWp\"};","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { RosteringSettingHeader } from 'libs/shared/components/rostering/rostering-header/RosteringSettingHeader';\nimport { ScheduleSetting } from 'libs/shared/components/rostering/settings/schedule-setting/ScheduleSetting';\nimport { SyncActionButtonGroup } from 'libs/shared/components/rostering/sync-action-button-group/SyncActionButtonGroup';\nimport { PermissionName } from 'libs/shared/enums/PermissionName';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { CurrentUser, RosteringResponse, ScheduleSettingRequest, ScheduleSettingResponse } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\n\nimport { SettingsLayout } from 'apps/settings/components/settings-layout/SettingsLayout';\nimport { RequiresSetUpEmptyState } from 'apps/settings/views/rostering/rostering-sync-list/requires-set-up-empty-state/RequiresSetUpEmptyState';\nimport { useSyncRostering } from 'apps/settings/views/rostering/utils/useSyncRostering';\n\nimport styles from './rostering-sync-settings.scss';\n\nconst namespace = 'rostering.rosteringSyncSettings';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function RosteringSyncSettingsView(): JSX.Element {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const rostering = Flight.useBasicFetch<RosteringResponse>(RosteringRequests.getRostering());\n const settings = Flight.useBasicFetch<ScheduleSettingResponse>(rostering.data?.id &&\n RosteringRequests.getSyncScheduleSettings(rostering.data.id));\n\n const fetch = Flight.useGetFetch();\n const alerts = useAlerts();\n\n useSetPageMetadata({ title: getPhrase('pageTitle') });\n\n function onSave(val: Omit<ScheduleSettingRequest, 'userId'|'customerId'>, onDone?: () => void) {\n const payload = { ...val, userId: currentUser.data.id, customerId: currentUser.data.customerId };\n\n fetch(\n RosteringRequests.updateScheduleSetting(\n payload,\n rostering.data.id,\n () => alerts.success(getPhrase('success')),\n () => alerts.error(getPhrase('error')),\n () => onDone?.()\n )\n );\n }\n\n const { syncNow, fullSync } = useSyncRostering(currentUser.data);\n\n function renderButton() {\n if (rostering.data?.status !== 'Active')\n return <></>;\n return <SyncActionButtonGroup onSyncNow={syncNow} onFullSync={fullSync}/>;\n }\n\n return (\n <SettingsLayout\n heading={getPhrase('heading')}\n breadcrumbs={[getPhrase('breadcrumb')]}\n headingButton={renderButton}\n requiredPermissions={PermissionName.Rostering}\n >\n \n {rostering.data?.status === 'Active' && (\n <RosteringSettingHeader\n active='settings'\n appLinks={{\n syncJobs: { application: AppChannels.SETTINGS, action: Actions.Settings.ROSTERING },\n settings: { application: AppChannels.SETTINGS, action: Actions.Settings.ROSTERING_SETTINGS }\n }}\n />\n )}\n {rostering.data?.status !== 'Active' ? (\n <RequiresSetUpEmptyState />\n ) : (\n <div className={`d-flex flex-column align-items-center justify-content-center ${styles.settings}`}>\n {settings.data ? (\n <>\n <ScheduleSetting onSave={onSave} settings={settings.data}/>\n \n {/* todo uncomment these form when backend supports */}\n {/* <CheckUpdatesSetting onSave={onSave}/>\n <ClassroomCreationSetting onSave={onSave}/>\n <EmailNotificationSetting onSave={onSave}/> */}\n </>\n ) : (\n <div className={styles.spinner}>\n <Spinner as='div' animation='border' role='status' />\n </div>\n )}\n </div>\n )}\n \n\n </SettingsLayout>\n );\n}","import { AlertType, BaseAlert } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { BatchDataType } from 'libs/shared/enums/BatchDataType';\nimport { BatchJobName } from 'libs/shared/enums/BatchJobName';\nimport { BatchJobType } from 'libs/shared/enums/BatchJobType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { RosteringRequests } from 'libs/shared/flight-requests/RosteringRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nconst namespace = 'rostering.syncUtils';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport const useSyncRostering = (currentUser: CurrentUser) => {\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n\n if (!currentUser) {\n return { syncNow: () => {}, fullSync: () => {} };\n }\n\n function syncNow() {\n const alert: BaseAlert = {\n type: AlertType.Success,\n heading: getPhrase('startSyncAlertHeading'),\n message: getPhrase('startSyncAlertBody'),\n appLinkText: getPhrase('startSyncAlertAppLinkText'),\n appLinkClassName: 'info-link'\n };\n\n const data = {\n name: BatchJobName.Rostering,\n type: BatchJobType.Rostering,\n metadata: {\n targetMasterId: currentUser.customerId,\n targetMasterType: MasterType.Customer\n },\n customerId: currentUser.customerId,\n dataType: BatchDataType.Learner\n };\n fetchAsync(RosteringRequests.createJob(\n data,\n () => {\n alerts.success(alert);\n },\n () => {\n alerts.error(getPhrase('error'));\n }\n ));\n }\n\n function fullSync() {\n // todo\n }\n return { fullSync, syncNow };\n};","// extracted by mini-css-extract-plugin\nexport default {\"pillTabSelector\":\"Hdi6o\",\"pillItem\":\"hUJx1\"};"],"names":["BreadcrumbItem","breadcrumb","name","appLink","active","withBackIcon","className","svgName","size","S","Breadcrumbs","breadcrumbs","isMobile","length","map","b","idx","key","PartialBreadcrumbs","numItems","style","height","width","dangerouslySetInnerHTML","__html","namespace","FormButtons","props","formikProps","canSubmit","variant","type","disabled","showSpinner","isSubmitting","submitText","phrase","isNew","FormCheckbox","label","checkboxLabelClassName","checkboxLabelFontWeight","fieldProps","Form","FieldWrapper","htmlFor","id","checkboxAppLink","checkboxAppLinkText","AppLink","CharacterCounter","field","values","fieldName","limit","children","showLoadingSpinner","setType","resolvedChildren","FunctionHelper","f","ObjectHelper","Spinner","animation","containerClassName","SvgContainer","onClick","FormField","showCharacterCounter","showRequiredStar","infoTooltip","infoTooltipPlacement","infoText","formSize","showOptionalLabel","errors","touched","disabledOnChange","_props","onChange","fieldWrapperProps","FormHelper","as","title","tooltipPlacement","tooltipSpanHack","Text","maxLength","errorMessage","defaultProps","autoComplete","FormWrapper","castInitialValues","castValuesOnSubmit","initialValues","onSubmit","formattedInitialValues","validationSchema","cast","omitChildValues","child","Object","keys","forEach","hasOwnProperty","omitNullInitialValues","initialStatus","allowInitialSubmit","enableReinitialize","setSubmitting","resetForm","setFieldError","formattedData","options","reset","entries","value","useFormikContextWrapper","PillTabSelector","tabs","tab","analyticsData","analyticsOptions","count","data","onSelect","onSelectTab","RosteringSettingHeader","appLinks","syncJobs","settings","getPhrase","LanguageService","SyncActionButtonGroup","role","Tooltip","spanHack","placement","spanHackClassName","onSyncNow","now","Date","RosteringHelper","parseUTCToLocal","utcHour","utcWeekdays","utcMinute","local","weekday","localWeekdays","w","getDay","hour","daysOfWeek","minute","getScheduledJobBySetting","setting","fullSyncSchedule","enabled","schedule","scheduledDate","weekdayOfToday","scheduledWeekday","sort","a","scheduledToday","includes","setHours","nextScheduledDate","nextScheduledWeekday","find","d","gap","Math","abs","setDate","getDate","RosteringRequests","getRostering","url","getSyncList","queryParams","params","cursor","order","jobStatus","statuses","push","status","createJob","success","error","invalidationKeys","getJobSummary","getSyncScheduleSettings","integrationId","updateScheduleSetting","always","customerId","getCustomFormControlClassName","attribute","additionalClassName","getTypeSize","DEFAULT_PARTIAL_LOADING_OPTIONS","minWidth","maxWidth","PartialLoadingHelper","getPartialLoadingItems","opts","Array","max","floor","random","useCanAccessSettings","requiredPermissions","hasPermissions","settingsGroups","currentRoute","application","some","group","modules","settingsModule","action","SettingsLayout","canAccess","replace","i","heading","headingButton","description","RequiresSetUpEmptyState","src","href","newTab","TIMES","fill","_","REPEATS","WEEK_DAYS","date","offsetHours","getTimezoneOffset","formatTime","number","time","parseWeekdayNumber","DateHelper","ScheduleForm","startAt","Intl","DateTimeFormat","resolvedOptions","timeZone","repeat","TextHelper","option","day","e","preventDefault","nextValue","filter","v","setFieldValue","charAt","str","sortedWeekDays","slice","join","firstPart","weekdays","getAlertContent","ScheduleSchema","shape","min","required","oneOf","ScheduleSetting","val","onDone","onSave","utc","ArrayHelper","parseLocalToUTC","parseFormToPayload","RosteringSyncSettingsView","currentUser","UserRequests","rostering","fetch","alerts","useSetPageMetadata","useSyncRostering","syncNow","fullSync","onFullSync","PermissionName","payload","userId","fetchAsync","alert","message","appLinkText","appLinkClassName","metadata","targetMasterId","targetMasterType","dataType","B"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[7293],{91200:(e,t,a)=>{a.d(t,{Y:()=>c});var n=a(32735),i=a(68050),r=a(69111),l=a(84231);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=new Array(t);a<t;a++)n[a]=e[a];return n}function c(e){var t,a=function(e){if(Array.isArray(e))return s(e)}(t=Array(e.numItems))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?s(e,t):void 0}}(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),c=e.itemClassName||"";return n.createElement(n.Fragment,null,e.showHeading&&n.createElement("div",{className:"".concat(l.Z.partialHeading," mb-1 partial-loading-background")}),n.createElement(i.Z,{className:"mx-n1 mb-n2"},a.map((function(e,t){return n.createElement(r.Z,{key:t,xs:6,sm:4,lg:3,className:"".concat(c," px-1 pb-2")},n.createElement("div",{className:"".concat(l.Z.playlistItem," partial-loading-background rounded-3")}))}))))}c.defaultProps={numItems:8}},48745:(e,t,a)=>{a.d(t,{t:()=>k});var n=a(32735),i=a(82602),r=a(23481),l=a(110),s=a(65858),c=a(83345);const o={fontSmall:"OYBRp"};var m="playlists.playlistCount";function d(e){var t=function(e){var t,a,n,i,r,l;return!!e&&(null!==(a=null===(t=e.videos)||void 0===t?void 0:t.count)&&void 0!==a?a:0)+(null!==(i=null===(n=e.interactives)||void 0===n?void 0:n.count)&&void 0!==i?i:0)+(null!==(l=null===(r=e.clips)||void 0===r?void 0:r.count)&&void 0!==l?l:0)}(e.playlist);return!1===t||Number.isNaN(t)?n.createElement(n.Fragment,null):n.createElement("span",{className:o.fontSmall},n.createElement(c.x,{namespace:m,phrase:"count",options:{smartCount:t}}))}var u=a(20789),p=a(89725),v=a(64818);function g(e){var t,a,i,r=e.playlist._liteOwner;if(null===(t=e.playlist._isClickViewCurated)||void 0===t?void 0:t.value)return n.createElement(p.F,null);if(!(null==r?void 0:r.id)||!(null===(a=e.currentUser)||void 0===a?void 0:a.id))return n.createElement(n.Fragment,null);if(r.id.toString()===e.currentUser.id.toString())return n.createElement(n.Fragment,null);var l="string"==typeof r.avatar?r.avatar:null===(i=r.avatar)||void 0===i?void 0:i.url;return n.createElement(u.q,{imageUrl:l,imageCdnUrl:e.imageCdnUrl,initials:v.l.getInitials(r.name,r.surname)})}var y=a(36848),f=a(40955),b=a(75163),E=a(5465),h=a(54610),C=a(80143),N=a(9085),S=a(67453),w=a(84231),x="playlists.playlistList";function k(e){var t,a,c=S.j.createUrl(e.data.cover&&e.data.cover.url,{size:h.h2.Medium,resizeType:h.Nq.Cover}),o=e.data.subjectPresentationAudiences&&e.data.subjectPresentationAudiences.data,m=(0,C.n)(o,e.presentationAudiences),u=w.Z.playlistItem,p=!!c||!!e.showFallbackImage;p&&(u+=" ".concat(w.Z.playlistItemGradient)),!p&&e.bgColourClassNames&&(u+=" ".concat(w.Z.playlistItem," ").concat((0,N.x)(e.data.name,e.bgColourClassNames))),"round"===e.itemStyle&&(u+=" rounded-3 overflow-hidden"),"round-left"===e.itemStyle&&(u+=" rounded-start-lg overflow-hidden");var v=Object.assign(Object.assign({},e.analyticsData),{id:null===(t=e.data)||void 0===t?void 0:t.id,name:null===(a=e.data)||void 0===a?void 0:a.name}),k=Object.assign(Object.assign({},e.analyticsOptions),{entity:s.py.Playlist});return n.createElement(y.F,{appLink:e.appLink,analyticsData:v,analyticsOptions:k,title:function(){var t;return!e.data.contentModifiedDate||(null===(t=e.data._isClickViewCurated)||void 0===t?void 0:t.value)?"":r.T.getPhrase(x,"lastUpdated",{timeago:(0,i.WU)(l.O.convertUTCToLocal(e.data.contentModifiedDate))})}()},n.createElement(b.Z,{data:c,alt:e.data.name,className:u},!!e.showFallbackImage&&n.createElement(E.oy,{type:E.mS.Playlist}),n.createElement("div",{className:"text-white ".concat(w.Z.playlistMetadata)},!!e.showCount&&n.createElement(d,{playlist:e.data}),n.createElement("h5",{className:"mb-0 ".concat(e.titleClassName||"")},n.createElement("span",{className:"clamp-2"},e.data.name)),!!o&&!!o.length&&!!m&&n.createElement(f.P,{className:"".concat(e.audienceLabelClass?e.audienceLabelClass:""," mt-1"),audience:m,border:"white"})),!!e.showOwner&&!!e.imageCdnUrl&&n.createElement("div",{className:w.Z.ownerAvatarContainer},n.createElement(g,{playlist:e.data,currentUser:e.currentUser,imageCdnUrl:e.imageCdnUrl}))))}k.defaultProps={itemStyle:"square"}},31273:(e,t,a)=>{a.d(t,{P:()=>o});var n=a(32735),i=a(68050),r=a(69111),l=a(65858),s=a(48745),c={actionType:l.Vw.Click,entity:l.py.Playlist,location:l.LZ.PlaylistListItem,descriptor:l._S.Cover};function o(e){return n.createElement(i.Z,{className:"mx-n1"},e.extraPlaylistItem&&n.createElement(r.Z,{key:"extra-playlist-item",xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},e.extraPlaylistItem),e.playlists.map((function(t){return n.createElement(r.Z,{key:t.id,xs:6,sm:4,lg:3,className:"mb-2 px-1 ".concat(e.itemContainerClassName?e.itemContainerClassName:"")},n.createElement(s.t,{data:t,appLink:e.getPlaylistAppLink(t),imageCdnUrl:e.imageCdnUrl,currentUser:e.currentUser,presentationAudiences:e.presentationAudiences,bgColourClassNames:e.bgColourClassNames,showCount:e.showCount,showOwner:e.showOwner,showFallbackImage:e.showFallbackImage,titleClassName:e.itemTitleClassName,itemStyle:e.itemStyle,analyticsData:e.analyticsData,analyticsOptions:Object.assign(Object.assign({},e.analyticsOptions),c)}))})))}},98981:(e,t,a)=>{a.d(t,{YA:()=>n.Y,tN:()=>i.t});var n=a(91200),i=(a(31273),a(48745))},3626:(e,t,a)=>{a.d(t,{J:()=>S});var n=a(32735),i=a(68050),r=a(69111),l=a(49985),s=a(65858),c=a(40955),o=a(18559),m=a(17464),d=a(72355),u=a(66190),p=a(77590),v=a(85784),g=a(70872),y=a(11882),f=a(54610),b=a(68626),E=a(80143),h=a(59598),C=a(31908);const N={partialHeroThumbnail:"z0_Sm",partialSeriesText:"xuWtC",partialVideoTitleText:"fXYdC",partialBadge:"FlUpr",partialDescription:"YgWxP",partialSubject:"QBKwQ",partialHeading:"S__E9",guidance:"Ax9h2",description:"zejMP",details:"MRyVe"};function S(e){var t,a,S,w=e.video,x=e.presentationAudiences,k=e.getVideoAppLink,I=e.subTextAppLink,O=e.hideInteractiveBadge,A=null===(t=null==w?void 0:w.subjectPresentationAudiences)||void 0===t?void 0:t.data,j=(0,E.n)(A,x),L=l.k.mergeOptions(e.analyticsOptions,{location:s.LZ.ClassificationHero,entity:C.M.getAnalyticsEntity(w)}),P=n.useRef();return w?n.createElement(i.Z,null,n.createElement(r.Z,{xs:12,md:6},n.createElement("div",{ref:P},n.createElement(d.u,{analyticsData:e.analyticsData,analyticsOptions:L,video:w,appLink:null==k?void 0:k(e.video,{}),imageOptions:{size:f.h2.Medium},textPosition:b.z.Independent,type:"static",setFavourite:e.setFavourite,canFavourite:e.canFavourite,audience:"thumbnail"===e.badgePosition?j:null,newDurationStyle:e.newDurationStyle,hideRating:"thumbnail"!==e.badgePosition||!!j,companyLogoFallbackUrl:e.companyLogoFallbackUrl,subTextType:"none"}))),n.createElement(r.Z,{xs:12,md:6,className:"".concat(N.details," position-relative")},n.createElement(v.Q,{analyticsData:e.analyticsData,analyticsOptions:L,video:w}),n.createElement(y.$,{type:e.subTextType,analyticsData:e.analyticsData,analyticsOptions:L,video:w,appLink:I,className:"text-reset"}),n.createElement(g.u,{video:w,analyticsData:e.analyticsData,analyticsOptions:L,appLink:null==k?void 0:k(e.video,{}),linkClassName:"d-inline-block",textClassName:"h4",yearGroups:e.yearGroups}),"info-panel"===e.badgePosition&&n.createElement(m.c,{className:"pb-1"},!O&&n.createElement(o.C,{type:o.g.Interactive,data:w.interactives}),n.createElement(o.C,{type:o.g.Rating,data:w.rating}),n.createElement(o.C,{type:o.g.ProductionYear,data:w.productionYear})),n.createElement("p",{className:"mb-1"},n.createElement("span",{className:N.description},w.description)),"info-panel"===e.badgePosition&&n.createElement(c.P,{audience:j,className:"mt-1",border:"dark"}),e.showVideoGuidance&&n.createElement("div",{className:"d-flex ".concat(N.guidance)},n.createElement(u.Y,{video:w,appLink:null===(a=e.getVideoAppLink)||void 0===a?void 0:a.call(e,w,{scrollToPosition:h.K.Interactives}),analyticsData:e.analyticsData,analyticsOptions:L}),n.createElement(p.x,{video:w,appLink:null===(S=e.getVideoAppLink)||void 0===S?void 0:S.call(e,w,{scrollToPosition:h.K.Resources}),analyticsData:e.analyticsData,analyticsOptions:L})))):n.createElement(n.Fragment,null)}S.defaultProps={newDurationStyle:!0,badgePosition:"thumbnail"}},34004:(e,t,a)=>{a.d(t,{r:()=>p});var n=a(32735),i=a(40955),r=a(18559),l=a(75163),s=a(5465),c=a(54610),o=a(49439),m=a(80143);const d={labelContainer:"ieonz",hoverActive:"vqHCl",mask:"qEOPN",largeHoverTitle:"ZYApF",smallHoverTitle:"qcfHO",largeHoverDescription:"Uh4gM",smallHoverDescription:"TiqqV"};function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=new Array(t);a<t;a++)n[a]=e[a];return n}function p(e){var t,a,p=(t=(0,o.L)({className:d.hoverActive}),a=2,function(e){if(Array.isArray(e))return e}(t)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,i,r,l,s=[],c=!0,o=!1;try{if(r=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=r.call(a)).done)&&(s.push(n.value),s.length!==t);c=!0);}catch(e){o=!0,i=e}finally{try{if(!c&&null!=a.return&&(l=a.return(),Object(l)!==l))return}finally{if(o)throw i}}return s}}(t,a)||function(e,t){if(e){if("string"==typeof e)return u(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?u(e,t):void 0}}(t,a)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),v=p[0],g=p[1],y=e.series&&e.series.subjectPresentationAudiences&&e.series.subjectPresentationAudiences.data||[],f=(0,m.n)(y,e.presentationAudiences),b=!!(y&&y.length&&f);return n.createElement("div",{ref:v},g&&n.createElement("div",{className:"py-3 text-white text-center mb-3 ".concat(d.mask)},n.createElement("h3",{className:"fw-semibold ".concat(d.hoverTitle," ").concat(e.isSmall?d.smallHoverTitle:d.largeHoverTitle)},n.createElement("span",{className:"clamp-3"},e.series.name)),!!e.series.description&&n.createElement("p",{className:"".concat(d.hoverDescription," ").concat(e.isSmall?d.smallHoverDescription:d.largeHoverDescription," mb-0")},e.series.description)),n.createElement(l.Z,{data:e.series.tallPoster,alt:e.series.name,imageType:c.__.TallPosters,preload:e.preloadImage,imageOptions:{size:c.h2.Large},imageClassName:e.imageClass?e.imageClass:"rounded-3"},n.createElement(s.oy,{type:s.mS.Series}),n.createElement("div",{className:"position-absolute text-white ".concat(d.labelContainer)},b?n.createElement(i.P,{audience:f,border:"white"}):n.createElement(r.C,{type:r.g.Rating,data:e.series.rating}))))}},2192:(e,t,a)=>{a.d(t,{M:()=>y,Q:()=>f});var n=a(32735),i=a(45157),r=a(36848),l=a(60376),s=a(5465),c=a(83914),o=a(83345),m=a(54610),d=a(67453),u=a(35223),p=a(92038),v=function(e){var t=e.name,a=e.multiline,i="".concat(p.Z.comingSoonPanel," \n d-flex flex-column align-items-center justify-content-center px-3 text-center"),r="";return a?r+=" ".concat(p.Z.clamped," clamp-2"):(i+=" text-nowrap",r+=" text-truncate"),n.createElement("div",{className:i},n.createElement("small",{className:"text-secondary"},n.createElement(o.x,{namespace:"shared.subjectWidgetItem",phrase:"comingSoon"})),n.createElement("p",{className:"".concat(p.Z.name," h6")},n.createElement("span",{className:r},t)))},g=function(e){var t=e.name,a=e.multiline,i=e.subtitle,r="px-3 d-flex flex-column justify-content-center",l="".concat(p.Z.name," h6");return a?l+=" clamp-3 text-start":(r+=" text-nowrap text-truncate",l+=" text-truncate mb-0 pb-1"),n.createElement("div",{className:r},i&&n.createElement("div",{className:"text-secondary clamp-1 ".concat(p.Z.text)},i),n.createElement("div",{className:l,title:t},t))};function y(e){var t=d.j.createUrl(e.coverUrl,{size:e.isLarge?m.h2.Medium:m.h2.Small}),a={name:e.data.name,multiline:e.isLarge||e.multiline,subtitle:e.subtitle};return n.createElement("div",{className:"border d-flex position-relative ".concat(e.className," ").concat(p.Z.widgetItem," ").concat(e.isSelected?"border-success border-2":""),id:"".concat(e.data.id,"-").concat(i.Y.getRandomInt())},e.isSelected&&n.createElement("div",{className:"".concat(p.Z.selectedMask," border-2")}),n.createElement("div",{className:"".concat(p.Z.imagePanel," ").concat(e.isLarge?p.Z.large:"")},e.isSelected&&!e.hideCheckmark&&n.createElement("div",{className:p.Z.selected},n.createElement(l.f,{svgName:u.vn.Check,svgSize:c.S.Large,textVariant:"white",variant:"green"})),n.createElement("div",{className:"".concat(p.Z.image," ").concat(e.imageClassName),style:e.coverUrl?{backgroundImage:"url('".concat(t,"')")}:{}}),!e.hideFallback&&n.createElement(s.oy,{type:s.mS.Subject,extraClasses:e.isLarge?p.Z.large:""})),e.isComingSoon?n.createElement(v,Object.assign({},a)):n.createElement(g,Object.assign({},a)))}function f(e){var t,a=e.getChildAppLink?e.getChildAppLink(e.data):null;return n.createElement(n.Fragment,null,a?n.createElement(r.F,{className:p.Z.appLink,appLink:a,analyticsData:e.analyticsData,analyticsOptions:e.analyticsOptions,appLinkOptions:null===(t=e.getChildAppLinkOptions)||void 0===t?void 0:t.call(e)},n.createElement(y,Object.assign({},e))):n.createElement(y,Object.assign({},e)))}},43741:(e,t,a)=>{a.d(t,{M:()=>o,Q:()=>c});var n=a(32735),i=a(45157),r=a(5465),l=a(92038);function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var a=0,n=new Array(t);a<t;a++)n[a]=e[a];return n}var c=function(){var e,t,a=(e=n.useState(i.Y.getRandomInt(5)+3+"rem"),t=1,function(e){if(Array.isArray(e))return e}(e)||function(e,t){var a=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=a){var n,i,r,l,s=[],c=!0,o=!1;try{if(r=(a=a.call(e)).next,0===t){if(Object(a)!==a)return;c=!1}else for(;!(c=(n=r.call(a)).done)&&(s.push(n.value),s.length!==t);c=!0);}catch(e){o=!0,i=e}finally{try{if(!c&&null!=a.return&&(l=a.return(),Object(l)!==l))return}finally{if(o)throw i}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return s(e,t);var a=Object.prototype.toString.call(e).slice(8,-1);return"Object"===a&&e.constructor&&(a=e.constructor.name),"Map"===a||"Set"===a?Array.from(e):"Arguments"===a||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(a)?s(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())[0];return n.createElement("div",{className:"border d-flex position-relative me-2 ".concat(l.Z.widgetItem)},n.createElement("div",{className:l.Z.imagePanel}),n.createElement("div",{className:"px-2",style:{width:a}}),n.createElement("div",{className:l.Z.partialIcon},n.createElement(r.oy,{type:r.mS.Subject})))},o=function(){return n.createElement("div",{className:"border d-flex position-relative me-2 ".concat(l.Z.widgetItem)},n.createElement("div",{className:"".concat(l.Z.partialLargeImage)}),n.createElement("div",{className:"px-2"}),n.createElement("div",{className:l.Z.partialIcon},n.createElement(r.oy,{type:r.mS.Subject,extraClasses:l.Z.partialLargeFallback})))}},91028:(e,t,a)=>{a.d(t,{V:()=>c});var n=a(32735),i=a(65858),r=a(2192),l=a(52641),s=a(2284),c=n.memo((function(e){var t,a,c,o,m,d=(null===(t=e.data)||void 0===t?void 0:t.status)===s.W.ComingSoon,u=function(e,t){var a;if((null==t?void 0:t.length)>=l._.MULTI_PRESENTATION_THRESHOLD)return null===(a=null==t?void 0:t.find((function(t){return t.id===e})))||void 0===a?void 0:a.name}(e.data.presentationId,null==e?void 0:e.availablePresentations),p=Object.assign(Object.assign({},e.analyticsData),{id:null===(a=e.data)||void 0===a?void 0:a.id,name:null===(c=e.data)||void 0===c?void 0:c.name,presentationId:e.data.presentationId,comingSoon:!!d}),v=Object.assign(Object.assign({location:i.LZ.ClassificationListItem},e.analyticsOptions),{actionType:i.Vw.Click,entity:i.py.Classification,descriptor:i._S.Cover});return n.createElement(r.Q,Object.assign({},e,{analyticsData:p,analyticsOptions:v,coverUrl:null===(o=e.data.cover)||void 0===o?void 0:o.url,subtitle:(null===(m=e.getSubtitle)||void 0===m?void 0:m.call(e,e.data))||u,isComingSoon:d}))}))},9513:(e,t,a)=>{a.d(t,{Ml:()=>i.M,Qh:()=>i.Q,Vz:()=>n.V});var n=a(91028),i=a(43741),r=(a(32735),a(65858));a(36848),a(83914),a(83345),a(35223),a(92038),r.Vw.Click,r.py.UserSetting,r._S.Tile,a(2786),r.Vw.Click,r.py.Url,r._S.Tile},2284:(e,t,a)=>{var n;a.d(t,{W:()=>n}),function(e){e.Draft="Draft",e.ComingSoon="ComingSoon",e.Published="Published"}(n||(n={}))},84231:(e,t,a)=>{a.d(t,{Z:()=>n});const n={playlistItem:"CaRJx",playlistItemGradient:"BI7p2",playlistMetadata:"eDk1l",partialHeading:"w4lWh",ownerAvatarContainer:"JImqE"}},92038:(e,t,a)=>{a.d(t,{Z:()=>n});const n={appLink:"fFjKN",name:"A_by9",selectedMask:"xSQtR",widgetItem:"Ys9W_",text:"JfAoy",imagePanel:"aUNDc",partialLargeImage:"RuLxv",selected:"BViJb",image:"LkTep",dragHandle:"CJqvP",large:"R5clw",comingSoonPanel:"Wa2PG",editSubjectsItem:"gGNFD",allSubjectsItem:"IHdlJ",logoContainer:"Nzaes",draggingItem:"zUOye",partialLargeFallback:"FmJP9",partialIcon:"sdZuo"}},82602:(e,t,a)=>{a.d(t,{WU:()=>o});var n=["second","minute","hour","day","week","month","year"],i=["秒","分钟","小时","天","周","个月","年"],r={},l=function(e,t){r[e]=t},s=[60,60,24,7,365/7/12,12];function c(e){return e instanceof Date?e:!isNaN(e)||/^\d+$/.test(e)?new Date(parseInt(e)):(e=(e||"").trim().replace(/\.\d+/,"").replace(/-/,"/").replace(/-/,"/").replace(/(\d)T(\d)/,"$1 $2").replace(/Z/," UTC").replace(/([+-]\d\d):?(\d\d)/," $1$2"),new Date(e))}var o=function(e,t,a){var n=function(e,t){return(+(t?c(t):new Date)-+c(e))/1e3}(e,a&&a.relativeDate);return function(e,t){for(var a=e<0?1:0,n=e=Math.abs(e),i=0;e>=s[i]&&i<s.length;i++)e/=s[i];return(e=Math.floor(e))>(0==(i*=2)?9:1)&&(i+=1),t(e,i,n)[a].replace("%s",e.toString())}(n,function(e){return r[e]||r.en_US}(t))};l("en_US",(function(e,t){if(0===t)return["just now","right now"];var a=n[Math.floor(t/2)];return e>1&&(a+="s"),[e+" "+a+" ago","in "+e+" "+a]})),l("zh_CN",(function(e,t){if(0===t)return["刚刚","片刻后"];var a=i[~~(t/2)];return[e+" "+a+"前",e+" "+a+"后"]}))}}]);
|
|
2
|
+
//# sourceMappingURL=7293-58f4a7cf47-lite.chunk.js.map
|