@clickview/curator 1.101.0-rc.4 → 1.101.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.
Files changed (61) hide show
  1. package/dist/.vite/manifest.json +475 -475
  2. package/dist/Assets/js/dist/scripts/{Bs1Y6-vh.chunk.js → -OUl3n-W.chunk.js} +2 -2
  3. package/dist/Assets/js/dist/scripts/{Bs1Y6-vh.chunk.js.map → -OUl3n-W.chunk.js.map} +1 -1
  4. package/dist/Assets/js/dist/scripts/5FGdlWcH.chunk.js +9 -0
  5. package/dist/Assets/js/dist/scripts/5FGdlWcH.chunk.js.map +1 -0
  6. package/dist/Assets/js/dist/scripts/B0UOCPE6.chunk.js +2 -0
  7. package/dist/Assets/js/dist/scripts/{r-zw-56e.chunk.js.map → B0UOCPE6.chunk.js.map} +1 -1
  8. package/dist/Assets/js/dist/scripts/{Ds6WvphR2.chunk.js → BD2aIccu2.chunk.js} +2 -2
  9. package/dist/Assets/js/dist/scripts/{Ds6WvphR2.chunk.js.map → BD2aIccu2.chunk.js.map} +1 -1
  10. package/dist/Assets/js/dist/scripts/{BwpzKPd12.chunk.js → BJJeLngO2.chunk.js} +2 -2
  11. package/dist/Assets/js/dist/scripts/{BwpzKPd12.chunk.js.map → BJJeLngO2.chunk.js.map} +1 -1
  12. package/dist/Assets/js/dist/scripts/{CaG8Cjey2.chunk.js → BKQIzKcF2.chunk.js} +2 -2
  13. package/dist/Assets/js/dist/scripts/{CaG8Cjey2.chunk.js.map → BKQIzKcF2.chunk.js.map} +1 -1
  14. package/dist/Assets/js/dist/scripts/{BEw27Jf3.chunk.js → BOrAaHLK.chunk.js} +2 -2
  15. package/dist/Assets/js/dist/scripts/{BEw27Jf3.chunk.js.map → BOrAaHLK.chunk.js.map} +1 -1
  16. package/dist/Assets/js/dist/scripts/BSMzg7zU.chunk.js.map +1 -1
  17. package/dist/Assets/js/dist/scripts/{CO69n5GB2.chunk.js → BUWsFXQp2.chunk.js} +2 -2
  18. package/dist/Assets/js/dist/scripts/{CO69n5GB2.chunk.js.map → BUWsFXQp2.chunk.js.map} +1 -1
  19. package/dist/Assets/js/dist/scripts/{BZU4ADoQ2.chunk.js → C1xOGHlL2.chunk.js} +2 -2
  20. package/dist/Assets/js/dist/scripts/{BZU4ADoQ2.chunk.js.map → C1xOGHlL2.chunk.js.map} +1 -1
  21. package/dist/Assets/js/dist/scripts/{CbaobIxf2.chunk.js → CAo_C8em2.chunk.js} +2 -2
  22. package/dist/Assets/js/dist/scripts/{CbaobIxf2.chunk.js.map → CAo_C8em2.chunk.js.map} +1 -1
  23. package/dist/Assets/js/dist/scripts/{D_e7ctVq.chunk.js → COH92JF5.chunk.js} +2 -2
  24. package/dist/Assets/js/dist/scripts/{D_e7ctVq.chunk.js.map → COH92JF5.chunk.js.map} +1 -1
  25. package/dist/Assets/js/dist/scripts/{CJpr073K.chunk.js → CR-5nCWm.chunk.js} +2 -2
  26. package/dist/Assets/js/dist/scripts/{CJpr073K.chunk.js.map → CR-5nCWm.chunk.js.map} +1 -1
  27. package/dist/Assets/js/dist/scripts/{CqhZ98rZ2.chunk.js → CW1ea_Kx2.chunk.js} +2 -2
  28. package/dist/Assets/js/dist/scripts/{CqhZ98rZ2.chunk.js.map → CW1ea_Kx2.chunk.js.map} +1 -1
  29. package/dist/Assets/js/dist/scripts/{DPA1azNU2.chunk.js → Cbwl04yH2.chunk.js} +2 -2
  30. package/dist/Assets/js/dist/scripts/{DPA1azNU2.chunk.js.map → Cbwl04yH2.chunk.js.map} +1 -1
  31. package/dist/Assets/js/dist/scripts/{DsHVJvUP.chunk.js → CpqMUVVi.chunk.js} +2 -2
  32. package/dist/Assets/js/dist/scripts/{DsHVJvUP.chunk.js.map → CpqMUVVi.chunk.js.map} +1 -1
  33. package/dist/Assets/js/dist/scripts/{I_gdFDV7.chunk.js → CqZqlJSF.chunk.js} +2 -2
  34. package/dist/Assets/js/dist/scripts/{I_gdFDV7.chunk.js.map → CqZqlJSF.chunk.js.map} +1 -1
  35. package/dist/Assets/js/dist/scripts/{CofA9RRF.chunk.js → CzCUe0Ej.chunk.js} +2 -2
  36. package/dist/Assets/js/dist/scripts/{CofA9RRF.chunk.js.map → CzCUe0Ej.chunk.js.map} +1 -1
  37. package/dist/Assets/js/dist/scripts/{DhN_Jc2z.chunk.js → DTUkmChD.chunk.js} +3 -3
  38. package/dist/Assets/js/dist/scripts/{DhN_Jc2z.chunk.js.map → DTUkmChD.chunk.js.map} +1 -1
  39. package/dist/Assets/js/dist/scripts/{C8YkY0we.chunk.js → DW7-la-i.chunk.js} +2 -2
  40. package/dist/Assets/js/dist/scripts/{C8YkY0we.chunk.js.map → DW7-la-i.chunk.js.map} +1 -1
  41. package/dist/Assets/js/dist/scripts/{ecehd0o7.chunk.js → Dhnl-PB5.chunk.js} +2 -2
  42. package/dist/Assets/js/dist/scripts/{ecehd0o7.chunk.js.map → Dhnl-PB5.chunk.js.map} +1 -1
  43. package/dist/Assets/js/dist/scripts/{jdQzplq1.chunk.js → DuU4GBw5.chunk.js} +2 -2
  44. package/dist/Assets/js/dist/scripts/{jdQzplq1.chunk.js.map → DuU4GBw5.chunk.js.map} +1 -1
  45. package/dist/Assets/js/dist/scripts/{CvMpxc4j2.chunk.js → LmwQmHZz2.chunk.js} +2 -2
  46. package/dist/Assets/js/dist/scripts/{CvMpxc4j2.chunk.js.map → LmwQmHZz2.chunk.js.map} +1 -1
  47. package/dist/Assets/js/dist/scripts/{app-D2seXuq-.js → app-DHtN6XkT.js} +3 -3
  48. package/dist/Assets/js/dist/scripts/{app-D2seXuq-.js.map → app-DHtN6XkT.js.map} +1 -1
  49. package/dist/Assets/js/dist/scripts/{DUsXdKYh.chunk.js → eKSK4iyn.chunk.js} +2 -2
  50. package/dist/Assets/js/dist/scripts/{DUsXdKYh.chunk.js.map → eKSK4iyn.chunk.js.map} +1 -1
  51. package/dist/Assets/js/dist/scripts/{BdXsbiX1.chunk.js → esASf9N4.chunk.js} +2 -2
  52. package/dist/Assets/js/dist/scripts/{BdXsbiX1.chunk.js.map → esASf9N4.chunk.js.map} +1 -1
  53. package/dist/Assets/js/dist/scripts/{De-ohgjE.chunk.js → x1pOfdJd.chunk.js} +2 -2
  54. package/dist/Assets/js/dist/scripts/x1pOfdJd.chunk.js.map +1 -0
  55. package/dist/bundles.json +1 -1
  56. package/dist/en.json +1 -1
  57. package/package.json +1 -1
  58. package/dist/Assets/js/dist/scripts/C7Rwn3_U.chunk.js +0 -9
  59. package/dist/Assets/js/dist/scripts/C7Rwn3_U.chunk.js.map +0 -1
  60. package/dist/Assets/js/dist/scripts/De-ohgjE.chunk.js.map +0 -1
  61. package/dist/Assets/js/dist/scripts/r-zw-56e.chunk.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"CO69n5GB2.chunk.js","names":[],"sources":["../../../../../src/apps/dashboard-editor/errors/widget-not-supported-error/WidgetNotSupportedError.ts","../../../../../src/apps/dashboard-editor/views/wizard/dashboard-wizard-add-content/DashboardWizardAddContentContainerView.tsx"],"sourcesContent":["import { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nexport class WidgetNotSupportedError extends DialogError {\n private id: string;\n\n constructor(id: string) {\n super('WidgetNotSupportedError');\n\n this.id = id;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'WidgetNotSupportedError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: 'Widget not supported',\n text: `Widget with ID <strong>${this.id}</strong> is not in the wizard. Please contact the Product team for support.`,\n buttons: [{\n text: 'Okay',\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Classification, CuratedDashboard, CuratedWidget, CuratedWidgetContent, DashboardTargetType, MultimediaWidgetData, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { DashboardRequests } from 'shared/flight-requests/DashboardRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { useCommonVideoProps } from 'shared/hooks/UseCommonVideoProps';\nimport { ContentPartnerProfile } from 'shared/interfaces/models/ContentPartnerProfile';\n\nimport { ContentPartnerRequests } from 'apps/content-partners/flight-requests/ContentPartnerRequests';\nimport { DashboardWizardLayout } from 'apps/dashboard-editor/components/wizard/layout/DashboardWizardLayout';\nimport { CURATOR_HARD_CODED_SETTINGS } from 'apps/dashboard-editor/constants/CuratorHardCodedSettings';\nimport { CuratorWidgetTypeIdConfig } from 'apps/dashboard-editor/constants/CuratorWidgetTypeIdConfig';\nimport { WidgetNotSupportedError } from 'apps/dashboard-editor/errors/widget-not-supported-error/WidgetNotSupportedError';\nimport { useFetchDashboard } from 'apps/dashboard-editor/hooks/useFetchDashboard';\nimport { WidgetContentPreviewResponse } from 'apps/dashboard-editor/interfaces/data-requests/WidgetContentPreviewResponse';\nimport { getDashboardWizardValidationSchema } from 'apps/dashboard-editor/validation/DashboardWizardValidationSchema';\n\nconst NAV_LOCK_ID = 'dashboard-wizard';\n// backend will set the fixed widget index to number that equal or bigger than this\nconst FIXED_WIDGET_INDEX = 9999;\n\ninterface WidgetFormWrapperProps {\n templateId: WidgetTemplate;\n widgetTypeId: WidgetTypeId;\n onSubmit: (widget: CuratedWidget, setShowSpinner: (val: boolean) => void) => void;\n presentation: Presentation;\n audiences: PresentationAudience[];\n classification: Classification;\n dashboard: CuratedDashboard;\n imageCdnUrl: string;\n availablePresentations: Presentation[];\n settings: SettingsHash;\n commonVideoProps: CommonVideoProps;\n customResultRequest?: Flight.Request;\n}\n\nfunction WidgetFormWrapper(props: WidgetFormWrapperProps): JSX.Element {\n const { setOnClickConfirm, disableNext, setDisableNext, setShowSpinner } = React.useContext(WizardLayoutContext);\n const formikProps = useFormikContextWrapper<CuratedWidget>();\n\n const [ content, setContent ] = React.useState<CuratedWidgetContent>(null);\n\n const widgetConfig = CuratorWidgetTypeIdConfig[props.widgetTypeId];\n\n const contentPreview = Flight.useBasicFetch<WidgetContentPreviewResponse<CuratedWidgetContent>>(\n widgetConfig.canFetchPreview(\n formikProps.values.data,\n CuratedDashboardHelper.getDashboardTargetInfo(props.dashboard)\n ) &&\n DashboardRequests.previewWidget(\n formikProps.values.widgetId,\n formikProps.values.data,\n CuratedDashboardHelper.getWidgetParams(\n formikProps.values.widgetId,\n formikProps.values.templateId,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard)\n )\n )\n );\n\n React.useEffect(() => {\n if (contentPreview.isFetching || !contentPreview.data)\n return;\n\n setContent(contentPreview.data.content);\n }, [ contentPreview.isFetching, contentPreview.data ]);\n\n const previousValues = usePrevious(formikProps.values);\n\n React.useEffect(() => {\n setDisableNext(true);\n }, []);\n\n React.useEffect(() => {\n if (!formikProps.dirty || ObjectHelper.isEqual(formikProps.values, previousValues))\n return;\n\n setOnClickConfirm(() => () => {\n props.onSubmit(formikProps.values, setShowSpinner);\n });\n\n formikProps.validateForm().then(errors => {\n const isValid = !Object.keys(errors).length;\n\n if (disableNext === isValid)\n setDisableNext(!isValid);\n });\n }, [ formikProps.values, disableNext ]);\n\n function onReorderWidgets(content: Classification[]): void {\n setContent(content);\n\n if (props.widgetTypeId === WidgetTypeId.CuratedMultimedia) {\n const currentData = formikProps.values.data as MultimediaWidgetData;\n const newData = content.map(v => {\n return currentData.multimedias.find(m => m.objectId.toString() === v.id.toString());\n });\n formikProps.setFieldValue('data.multimedias', newData);\n\n return;\n }\n\n formikProps.setFieldValue('data.objectIds', content.map(v => v.id));\n }\n\n const WidgetFormView = CuratorWidgetTypeIdConfig[props.widgetTypeId].formView;\n\n if (!WidgetFormView)\n return <></>;\n\n return (\n <WidgetFormView\n dashboard={props.dashboard}\n audiences={props.audiences}\n presentation={props.presentation}\n classification={props.classification}\n imageCdnUrl={props.imageCdnUrl}\n content={content}\n isEditing={!!formikProps.values.id}\n onReorderWidgets={onReorderWidgets}\n availablePresentations={props.availablePresentations}\n settings={props.settings}\n commonVideoProps={props.commonVideoProps}\n customResultRequest={props.customResultRequest}\n />\n );\n}\n\ninterface DashboardWizardAddContentContainerViewProps {\n dashboardId: string;\n widgetTypeId: WidgetTypeId;\n templateId: WidgetTemplate;\n widgetId?: string;\n}\n\nexport function DashboardWizardAddContentContainerView(\n props: DashboardWizardAddContentContainerViewProps\n): JSX.Element {\n const isEditing = !!props.widgetId;\n\n const dashboard = useFetchDashboard(props.dashboardId);\n\n const targetInfo = CuratedDashboardHelper.getDashboardTargetInfo(dashboard.data);\n const isTopicDashboard = CuratedDashboardHelper.isClassificationDashboard(targetInfo);\n const isContentPartnerDashboard = CuratedDashboardHelper.isContentPartnerDashboard(targetInfo);\n const contentPartner = Flight.useBasicFetch<ContentPartnerProfile>(\n isContentPartnerDashboard &&\n ContentPartnerRequests.getContentPartnerBySlug(targetInfo.slug)\n );\n const customResultRequest = isContentPartnerDashboard\n && ContentPartnerRequests.getSeriesInContentPartner(contentPartner.data?.id);\n\n const widget = dashboard.data?.widgets?.find(w => w.id === props.widgetId);\n\n const { commonVideoProps } = useCommonVideoProps();\n \n const classification = Flight.useBasicFetch<Classification>(\n isTopicDashboard &&\n SubjectRequests.classification(targetInfo.classificationId)\n );\n\n let slug: string = '';\n if (targetInfo?.targetType === DashboardTargetType.PartnerProfile) {\n slug = targetInfo.slug;\n }\n\n let presentationId = classification.data?.presentationId;\n if (\n targetInfo?.targetType === DashboardTargetType.Discover ||\n targetInfo?.targetType === DashboardTargetType.MoviesAndTv ||\n targetInfo?.targetType === DashboardTargetType.Company\n ) {\n presentationId = targetInfo.presentationId;\n }\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n presentationId && SubjectRequests.presentationAudiences(presentationId)\n );\n const presentation = Flight.useBasicFetch<Presentation>(\n presentationId && SubjectRequests.presentation(presentationId)\n );\n const availablePresentations = Flight.useBasicFetch<Presentation[]>(\n ClassificationRequests.availablePresentations(PresentationType.Subject)\n );\n\n const navLock = useNavLock();\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n\n // If the template is invalid for some reason, redirect back a step\n React.useEffect(() => {\n if (!CuratorWidgetTypeIdConfig[props.widgetTypeId].formView) {\n Core.ErrorHelper.throw(new WidgetNotSupportedError(props.widgetTypeId));\n return;\n }\n\n navLock.lock({\n id: NAV_LOCK_ID,\n title: 'Are you sure you want to leave?',\n text: 'All of your progress will be discarded.',\n appLinkWhitelist: [\n {\n application: AppChannels.DASHBOARD_EDITOR,\n action: Actions.DashboardEditor.WIDGET_CONTENT_GUIDELINE\n },\n {\n application: AppChannels.DASHBOARD_EDITOR,\n action: Actions.DashboardEditor.ADD_CONTENT_IMAGE_UPLOAD\n }\n ]\n });\n }, [props.templateId]);\n\n function onSubmit(widget: CuratedWidget, setShowSpinner: (val: boolean) => void): void {\n const body = ObjectHelper.omit<CuratedWidget>(widget, ['content']);\n\n if (!body.data.presentationId)\n body.data.presentationId = presentation.data?.id;\n\n setShowSpinner(true);\n\n fetchAsync(isEditing ? DashboardRequests.editWidget(body) : DashboardRequests.addWidget(body))\n .then(() => {\n alerts.success(`Successfully ${isEditing ? 'updated' : 'created'} widget.`);\n\n navLock.unlock(NAV_LOCK_ID);\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.DASHBOARD_EDITOR,\n action: Actions.DashboardEditor.EDIT_DASHBOARD,\n args: [props.dashboardId]\n });\n })\n .catch(() => {\n alerts.error(`Something went wrong while we were trying to ${isEditing ? 'update' : 'add'} your widget. Please try again.`);\n setShowSpinner(false);\n });\n }\n\n function getInitialValues(): CuratedWidget {\n if (isEditing) {\n return {\n id: widget.id,\n name: widget.name,\n description: widget.description,\n widgetId: widget.widgetId,\n templateId: widget.templateId,\n dashboardId: widget.dashboardId,\n status: widget.status,\n data: widget.data,\n index: widget.index,\n metadata: widget.metadata,\n curriculumIds: widget.curriculumIds\n };\n }\n \n return {\n id: null,\n name: '',\n description: '',\n widgetId: props.widgetTypeId,\n templateId: props.templateId,\n dashboardId: props.dashboardId,\n status: WidgetStatus.Published,\n data: {\n presentationId: presentation.data?.id,\n slug,\n ...(CuratorWidgetTypeIdConfig[props.widgetTypeId].getInitialData?.(targetInfo, props.templateId) ?? {})\n },\n // find the last widget with non-fixed index\n index: (ArrayHelper.findLast(dashboard.data.widgets, w => w.index < FIXED_WIDGET_INDEX)?.index ?? -1) + 1,\n metadata: CuratorWidgetTypeIdConfig[props.widgetTypeId].getInitialMetadata?.(targetInfo, props.templateId) ?? {},\n curriculumIds: []\n };\n }\n\n function isLoading(): boolean {\n if (isContentPartnerDashboard && !dashboard.hasCompleted) {\n return true;\n }\n\n if (!dashboard.hasCompleted || (!presentation.data && !isContentPartnerDashboard))\n return true;\n\n if (isTopicDashboard && !classification.hasCompleted)\n return true;\n\n return false;\n }\n\n return (\n <HoverToPortalContainer.ReferenceContainer>\n <DashboardWizardLayout\n dashboard={dashboard.data}\n templateId={props.templateId}\n widgetTypeId={props.widgetTypeId}\n currentStep='add-content'\n isEditing={isEditing}\n >\n <h2 className='h4'>\n {isEditing ? 'Edit content' : 'Add content'}\n </h2>\n\n {!isLoading() && (\n <FormWrapper<CuratedWidget>\n initialValues={getInitialValues()}\n // The `onSubmit` handler is triggered by `DashboardWizardContinueButton` instead of through Formik\n onSubmit={null}\n validationSchema={getDashboardWizardValidationSchema(\n props.widgetTypeId,\n props.templateId,\n targetInfo?.targetType\n )}\n >\n <WidgetFormWrapper\n widgetTypeId={props.widgetTypeId}\n audiences={audiences.data}\n templateId={props.templateId}\n onSubmit={onSubmit}\n classification={classification.data}\n presentation={presentation.data}\n dashboard={dashboard.data}\n imageCdnUrl={ClickView.Config.Urls.ImageAPI}\n availablePresentations={availablePresentations.data}\n settings={CURATOR_HARD_CODED_SETTINGS}\n commonVideoProps={commonVideoProps}\n customResultRequest={customResultRequest}\n />\n </FormWrapper>\n )}\n </DashboardWizardLayout>\n </HoverToPortalContainer.ReferenceContainer>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"BUWsFXQp2.chunk.js","names":[],"sources":["../../../../../src/apps/dashboard-editor/errors/widget-not-supported-error/WidgetNotSupportedError.ts","../../../../../src/apps/dashboard-editor/views/wizard/dashboard-wizard-add-content/DashboardWizardAddContentContainerView.tsx"],"sourcesContent":["import { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nexport class WidgetNotSupportedError extends DialogError {\n private id: string;\n\n constructor(id: string) {\n super('WidgetNotSupportedError');\n\n this.id = id;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'WidgetNotSupportedError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n return {\n title: 'Widget not supported',\n text: `Widget with ID <strong>${this.id}</strong> is not in the wizard. Please contact the Product team for support.`,\n buttons: [{\n text: 'Okay',\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { FormWrapper, useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { HoverToPortalContainer } from 'libs/shared/components/hover-to-portal-container/HoverToPortalContainer';\nimport { WizardLayoutContext } from 'libs/shared/context/WizardLayoutContext';\nimport { PresentationType } from 'libs/shared/enums/PresentationType';\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { ClassificationRequests } from 'libs/shared/flight-requests/ClassificationRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useNavLock } from 'libs/shared/hooks/useNavLock';\nimport { usePrevious } from 'libs/shared/hooks/usePrevious';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { Classification, CuratedDashboard, CuratedWidget, CuratedWidgetContent, DashboardTargetType, MultimediaWidgetData, Presentation, PresentationAudience } from 'libs/shared/interfaces';\nimport { CommonVideoProps } from 'libs/shared/interfaces/CommonVideoProps';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\n\nimport { Actions, AppChannels } from 'shared/constants';\nimport { DashboardRequests } from 'shared/flight-requests/DashboardRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { useCommonVideoProps } from 'shared/hooks/UseCommonVideoProps';\nimport { ContentPartnerProfile } from 'shared/interfaces/models/ContentPartnerProfile';\n\nimport { ContentPartnerRequests } from 'apps/content-partners/flight-requests/ContentPartnerRequests';\nimport { DashboardWizardLayout } from 'apps/dashboard-editor/components/wizard/layout/DashboardWizardLayout';\nimport { CURATOR_HARD_CODED_SETTINGS } from 'apps/dashboard-editor/constants/CuratorHardCodedSettings';\nimport { CuratorWidgetTypeIdConfig } from 'apps/dashboard-editor/constants/CuratorWidgetTypeIdConfig';\nimport { WidgetNotSupportedError } from 'apps/dashboard-editor/errors/widget-not-supported-error/WidgetNotSupportedError';\nimport { useFetchDashboard } from 'apps/dashboard-editor/hooks/useFetchDashboard';\nimport { WidgetContentPreviewResponse } from 'apps/dashboard-editor/interfaces/data-requests/WidgetContentPreviewResponse';\nimport { getDashboardWizardValidationSchema } from 'apps/dashboard-editor/validation/DashboardWizardValidationSchema';\n\nconst NAV_LOCK_ID = 'dashboard-wizard';\n// backend will set the fixed widget index to number that equal or bigger than this\nconst FIXED_WIDGET_INDEX = 9999;\n\ninterface WidgetFormWrapperProps {\n templateId: WidgetTemplate;\n widgetTypeId: WidgetTypeId;\n onSubmit: (widget: CuratedWidget, setShowSpinner: (val: boolean) => void) => void;\n presentation: Presentation;\n audiences: PresentationAudience[];\n classification: Classification;\n dashboard: CuratedDashboard;\n imageCdnUrl: string;\n availablePresentations: Presentation[];\n settings: SettingsHash;\n commonVideoProps: CommonVideoProps;\n customResultRequest?: Flight.Request;\n}\n\nfunction WidgetFormWrapper(props: WidgetFormWrapperProps): JSX.Element {\n const { setOnClickConfirm, disableNext, setDisableNext, setShowSpinner } = React.useContext(WizardLayoutContext);\n const formikProps = useFormikContextWrapper<CuratedWidget>();\n\n const [ content, setContent ] = React.useState<CuratedWidgetContent>(null);\n\n const widgetConfig = CuratorWidgetTypeIdConfig[props.widgetTypeId];\n\n const contentPreview = Flight.useBasicFetch<WidgetContentPreviewResponse<CuratedWidgetContent>>(\n widgetConfig.canFetchPreview(\n formikProps.values.data,\n CuratedDashboardHelper.getDashboardTargetInfo(props.dashboard)\n ) &&\n DashboardRequests.previewWidget(\n formikProps.values.widgetId,\n formikProps.values.data,\n CuratedDashboardHelper.getWidgetParams(\n formikProps.values.widgetId,\n formikProps.values.templateId,\n CuratedDashboardHelper.getDashboardTargetType(props.dashboard)\n )\n )\n );\n\n React.useEffect(() => {\n if (contentPreview.isFetching || !contentPreview.data)\n return;\n\n setContent(contentPreview.data.content);\n }, [ contentPreview.isFetching, contentPreview.data ]);\n\n const previousValues = usePrevious(formikProps.values);\n\n React.useEffect(() => {\n setDisableNext(true);\n }, []);\n\n React.useEffect(() => {\n if (!formikProps.dirty || ObjectHelper.isEqual(formikProps.values, previousValues))\n return;\n\n setOnClickConfirm(() => () => {\n props.onSubmit(formikProps.values, setShowSpinner);\n });\n\n formikProps.validateForm().then(errors => {\n const isValid = !Object.keys(errors).length;\n\n if (disableNext === isValid)\n setDisableNext(!isValid);\n });\n }, [ formikProps.values, disableNext ]);\n\n function onReorderWidgets(content: Classification[]): void {\n setContent(content);\n\n if (props.widgetTypeId === WidgetTypeId.CuratedMultimedia) {\n const currentData = formikProps.values.data as MultimediaWidgetData;\n const newData = content.map(v => {\n return currentData.multimedias.find(m => m.objectId.toString() === v.id.toString());\n });\n formikProps.setFieldValue('data.multimedias', newData);\n\n return;\n }\n\n formikProps.setFieldValue('data.objectIds', content.map(v => v.id));\n }\n\n const WidgetFormView = CuratorWidgetTypeIdConfig[props.widgetTypeId].formView;\n\n if (!WidgetFormView)\n return <></>;\n\n return (\n <WidgetFormView\n dashboard={props.dashboard}\n audiences={props.audiences}\n presentation={props.presentation}\n classification={props.classification}\n imageCdnUrl={props.imageCdnUrl}\n content={content}\n isEditing={!!formikProps.values.id}\n onReorderWidgets={onReorderWidgets}\n availablePresentations={props.availablePresentations}\n settings={props.settings}\n commonVideoProps={props.commonVideoProps}\n customResultRequest={props.customResultRequest}\n />\n );\n}\n\ninterface DashboardWizardAddContentContainerViewProps {\n dashboardId: string;\n widgetTypeId: WidgetTypeId;\n templateId: WidgetTemplate;\n widgetId?: string;\n}\n\nexport function DashboardWizardAddContentContainerView(\n props: DashboardWizardAddContentContainerViewProps\n): JSX.Element {\n const isEditing = !!props.widgetId;\n\n const dashboard = useFetchDashboard(props.dashboardId);\n\n const targetInfo = CuratedDashboardHelper.getDashboardTargetInfo(dashboard.data);\n const isTopicDashboard = CuratedDashboardHelper.isClassificationDashboard(targetInfo);\n const isContentPartnerDashboard = CuratedDashboardHelper.isContentPartnerDashboard(targetInfo);\n const contentPartner = Flight.useBasicFetch<ContentPartnerProfile>(\n isContentPartnerDashboard &&\n ContentPartnerRequests.getContentPartnerBySlug(targetInfo.slug)\n );\n const customResultRequest = isContentPartnerDashboard\n && ContentPartnerRequests.getSeriesInContentPartner(contentPartner.data?.id);\n\n const widget = dashboard.data?.widgets?.find(w => w.id === props.widgetId);\n\n const { commonVideoProps } = useCommonVideoProps();\n \n const classification = Flight.useBasicFetch<Classification>(\n isTopicDashboard &&\n SubjectRequests.classification(targetInfo.classificationId)\n );\n\n let slug: string = '';\n if (targetInfo?.targetType === DashboardTargetType.PartnerProfile) {\n slug = targetInfo.slug;\n }\n\n let presentationId = classification.data?.presentationId;\n if (\n targetInfo?.targetType === DashboardTargetType.Discover ||\n targetInfo?.targetType === DashboardTargetType.MoviesAndTv ||\n targetInfo?.targetType === DashboardTargetType.Company\n ) {\n presentationId = targetInfo.presentationId;\n }\n\n const audiences = Flight.useBasicFetch<PresentationAudience[]>(\n presentationId && SubjectRequests.presentationAudiences(presentationId)\n );\n const presentation = Flight.useBasicFetch<Presentation>(\n presentationId && SubjectRequests.presentation(presentationId)\n );\n const availablePresentations = Flight.useBasicFetch<Presentation[]>(\n ClassificationRequests.availablePresentations(PresentationType.Subject)\n );\n\n const navLock = useNavLock();\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n\n // If the template is invalid for some reason, redirect back a step\n React.useEffect(() => {\n if (!CuratorWidgetTypeIdConfig[props.widgetTypeId].formView) {\n Core.ErrorHelper.throw(new WidgetNotSupportedError(props.widgetTypeId));\n return;\n }\n\n navLock.lock({\n id: NAV_LOCK_ID,\n title: 'Are you sure you want to leave?',\n text: 'All of your progress will be discarded.',\n appLinkWhitelist: [\n {\n application: AppChannels.DASHBOARD_EDITOR,\n action: Actions.DashboardEditor.WIDGET_CONTENT_GUIDELINE\n },\n {\n application: AppChannels.DASHBOARD_EDITOR,\n action: Actions.DashboardEditor.ADD_CONTENT_IMAGE_UPLOAD\n }\n ]\n });\n }, [props.templateId]);\n\n function onSubmit(widget: CuratedWidget, setShowSpinner: (val: boolean) => void): void {\n const body = ObjectHelper.omit<CuratedWidget>(widget, ['content']);\n\n if (!body.data.presentationId)\n body.data.presentationId = presentation.data?.id;\n\n setShowSpinner(true);\n\n fetchAsync(isEditing ? DashboardRequests.editWidget(body) : DashboardRequests.addWidget(body))\n .then(() => {\n alerts.success(`Successfully ${isEditing ? 'updated' : 'created'} widget.`);\n\n navLock.unlock(NAV_LOCK_ID);\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.DASHBOARD_EDITOR,\n action: Actions.DashboardEditor.EDIT_DASHBOARD,\n args: [props.dashboardId]\n });\n })\n .catch(() => {\n alerts.error(`Something went wrong while we were trying to ${isEditing ? 'update' : 'add'} your widget. Please try again.`);\n setShowSpinner(false);\n });\n }\n\n function getInitialValues(): CuratedWidget {\n if (isEditing) {\n return {\n id: widget.id,\n name: widget.name,\n description: widget.description,\n widgetId: widget.widgetId,\n templateId: widget.templateId,\n dashboardId: widget.dashboardId,\n status: widget.status,\n data: widget.data,\n index: widget.index,\n metadata: widget.metadata,\n curriculumIds: widget.curriculumIds\n };\n }\n \n return {\n id: null,\n name: '',\n description: '',\n widgetId: props.widgetTypeId,\n templateId: props.templateId,\n dashboardId: props.dashboardId,\n status: WidgetStatus.Published,\n data: {\n presentationId: presentation.data?.id,\n slug,\n ...(CuratorWidgetTypeIdConfig[props.widgetTypeId].getInitialData?.(targetInfo, props.templateId) ?? {})\n },\n // find the last widget with non-fixed index\n index: (ArrayHelper.findLast(dashboard.data.widgets, w => w.index < FIXED_WIDGET_INDEX)?.index ?? -1) + 1,\n metadata: CuratorWidgetTypeIdConfig[props.widgetTypeId].getInitialMetadata?.(targetInfo, props.templateId) ?? {},\n curriculumIds: []\n };\n }\n\n function isLoading(): boolean {\n if (isContentPartnerDashboard && !dashboard.hasCompleted) {\n return true;\n }\n\n if (!dashboard.hasCompleted || (!presentation.data && !isContentPartnerDashboard))\n return true;\n\n if (isTopicDashboard && !classification.hasCompleted)\n return true;\n\n return false;\n }\n\n return (\n <HoverToPortalContainer.ReferenceContainer>\n <DashboardWizardLayout\n dashboard={dashboard.data}\n templateId={props.templateId}\n widgetTypeId={props.widgetTypeId}\n currentStep='add-content'\n isEditing={isEditing}\n >\n <h2 className='h4'>\n {isEditing ? 'Edit content' : 'Add content'}\n </h2>\n\n {!isLoading() && (\n <FormWrapper<CuratedWidget>\n initialValues={getInitialValues()}\n // The `onSubmit` handler is triggered by `DashboardWizardContinueButton` instead of through Formik\n onSubmit={null}\n validationSchema={getDashboardWizardValidationSchema(\n props.widgetTypeId,\n props.templateId,\n targetInfo?.targetType\n )}\n >\n <WidgetFormWrapper\n widgetTypeId={props.widgetTypeId}\n audiences={audiences.data}\n templateId={props.templateId}\n onSubmit={onSubmit}\n classification={classification.data}\n presentation={presentation.data}\n dashboard={dashboard.data}\n imageCdnUrl={ClickView.Config.Urls.ImageAPI}\n availablePresentations={availablePresentations.data}\n settings={CURATOR_HARD_CODED_SETTINGS}\n commonVideoProps={commonVideoProps}\n customResultRequest={customResultRequest}\n />\n </FormWrapper>\n )}\n </DashboardWizardLayout>\n </HoverToPortalContainer.ReferenceContainer>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{C as r}from"./DqUkhPat.chunk.js";import{t as i}from"./BSMzg7zU.chunk.js";import{t as a}from"./C7Rwn3_U.chunk.js";import{c as o}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as s}from"./DalFHGv7.chunk.js";import{t as c}from"./DyKk_C_Y.chunk.js";import{t as l}from"./CzALYUiA.chunk.js";import{t as u}from"./D0eIqCPp.chunk.js";import{t as d}from"./BFkT3692.chunk.js";var f=t(e()),p={animatedBorder:`_animatedBorder_1g9h4_1`,borderRotate:`_borderRotate_1g9h4_1`,animatedBorderContent:`_animatedBorderContent_1g9h4_10`},m=n();function h({enabled:e,children:t}){return e?(0,m.jsx)(`div`,{className:p.animatedBorder,children:(0,m.jsx)(`div`,{className:`${p.animatedBorderContent} p-2`,children:t})}):(0,m.jsx)(m.Fragment,{children:t})}var g={anchor:`_anchor_gda43_1`,widgetHighlight:`_widgetHighlight_gda43_4`,blinker:`_blinker_gda43_1`};function _(e,t){return!i.hasNoContent(e)&&!!(!t||Array.isArray(t)&&!t.length)}function v(e){let t=f.createRef(),[n,p]=f.useState([]),v=l.isWidgetTypeEnabled(e.widgetTypeId,e?.settingsHash,e?.dashboardTarget),{ref:y,inView:b}=u({prevent:!(e.lazyLoad??!0)}),x=v&&r.isFunction(e.getContentRequest),S=o(!!(b&&v&&e.getContentRequest)&&e.getContentRequest(e.id,e.widgetTypeId,e.templateId)),{content:C}=i.useGetContent(e.content||S.data?.content,e.widgetTypeId,e.isPreviewing,S.data?.preferences,n),w=S.data?.name||e.name,T=d(),E=_(e.widgetTypeId,C),D=!i.canDisplayOnScreenSize(T,e.widgetTypeId,e.templateId);f.useEffect(()=>{x&&!S.hasCompleted||e.setIsEmpty?.(e.id,E||D)},[S.hasCompleted,E,D,x,e.setIsEmpty]),f.useEffect(()=>{!e.isScrollToTargetWidget||!t.current||t.current.scrollIntoView({behavior:`smooth`,block:`start`})},[e.isScrollToTargetWidget,t.current]);function O(t,r){if(e.onClickRemoveItem)return p([...n,t]),e.onClickRemoveItem(t,r,e.id,e.widgetTypeId)}let k=e.appLinks?{...e.appLinks}:null;k?.videoType&&(k.videoType=(t,n)=>e.appLinks?.videoType(t,{...n,contextId:e.id,includeContext:n.includeContext}));let A={...e.analyticsData,widgetId:e.widgetTypeId,templateId:e.templateId,dashboardTarget:e?.dashboardTarget,widgetIndex:e?.widgetIndex,widgetName:w},j=x&&!S.hasCompleted||e.isEditing&&E,M=a[e.templateId];if(!M||!j&&(E||D))return(0,m.jsx)(m.Fragment,{});let N=M.partialLoading,P=M.getComponent(e.widgetTypeId),F=s(M.className,e.className),I=e.isEditing&&e.metadata.aiAddedVideo;return(0,m.jsx)(`div`,{id:e.widgetTypeId===c.ContinueWatching?`continue-watching-videos-widget`:null,ref:t,className:`curated-widget ${F} ${w?`has-heading`:``} ${e.isScrollToTargetWidget?`my-n2 mx-n3`:``}`,children:(0,m.jsx)(h,{enabled:I,children:(0,m.jsxs)(`div`,{className:e.isScrollToTargetWidget?`py-2 px-3 rounded-3 ${g.widgetHighlight}`:``,children:[i.isWidgetInTableOfContents(e.metadata)&&(0,m.jsx)(`a`,{href:`#${e.id}`,id:`${e.id}`,className:`${g.anchor}`,ref:t=>{t&&e.headingElementRef?.current&&e.headingElementRef.current.add(t)}}),j?(0,m.jsx)(`div`,{ref:y,children:(0,m.jsx)(N,{name:w,description:e.description,isPreviewing:e.isPreviewing})}):(0,m.jsx)(P,{...e,appLinks:k,name:w,content:C,preferences:S.data?.preferences,analyticsData:A,showHighlight:e.isScrollToTargetWidget,isPreviewing:e.isPreviewing,onClickRemoveItem:O})]})})})}export{v as t};
2
- //# sourceMappingURL=BZU4ADoQ2.chunk.js.map
1
+ import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{C as r}from"./DqUkhPat.chunk.js";import{t as i}from"./BSMzg7zU.chunk.js";import{t as a}from"./5FGdlWcH.chunk.js";import{c as o}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as s}from"./DalFHGv7.chunk.js";import{t as c}from"./DyKk_C_Y.chunk.js";import{t as l}from"./CzALYUiA.chunk.js";import{t as u}from"./D0eIqCPp.chunk.js";import{t as d}from"./BFkT3692.chunk.js";var f=t(e()),p={animatedBorder:`_animatedBorder_1g9h4_1`,borderRotate:`_borderRotate_1g9h4_1`,animatedBorderContent:`_animatedBorderContent_1g9h4_10`},m=n();function h({enabled:e,children:t}){return e?(0,m.jsx)(`div`,{className:p.animatedBorder,children:(0,m.jsx)(`div`,{className:`${p.animatedBorderContent} p-2`,children:t})}):(0,m.jsx)(m.Fragment,{children:t})}var g={anchor:`_anchor_gda43_1`,widgetHighlight:`_widgetHighlight_gda43_4`,blinker:`_blinker_gda43_1`};function _(e,t){return!i.hasNoContent(e)&&!!(!t||Array.isArray(t)&&!t.length)}function v(e){let t=f.createRef(),[n,p]=f.useState([]),v=l.isWidgetTypeEnabled(e.widgetTypeId,e?.settingsHash,e?.dashboardTarget),{ref:y,inView:b}=u({prevent:!(e.lazyLoad??!0)}),x=v&&r.isFunction(e.getContentRequest),S=o(!!(b&&v&&e.getContentRequest)&&e.getContentRequest(e.id,e.widgetTypeId,e.templateId)),{content:C}=i.useGetContent(e.content||S.data?.content,e.widgetTypeId,e.isPreviewing,S.data?.preferences,n),w=S.data?.name||e.name,T=d(),E=_(e.widgetTypeId,C),D=!i.canDisplayOnScreenSize(T,e.widgetTypeId,e.templateId);f.useEffect(()=>{x&&!S.hasCompleted||e.setIsEmpty?.(e.id,E||D)},[S.hasCompleted,E,D,x,e.setIsEmpty]),f.useEffect(()=>{!e.isScrollToTargetWidget||!t.current||t.current.scrollIntoView({behavior:`smooth`,block:`start`})},[e.isScrollToTargetWidget,t.current]);function O(t,r){if(e.onClickRemoveItem)return p([...n,t]),e.onClickRemoveItem(t,r,e.id,e.widgetTypeId)}let k=e.appLinks?{...e.appLinks}:null;k?.videoType&&(k.videoType=(t,n)=>e.appLinks?.videoType(t,{...n,contextId:e.id,includeContext:n.includeContext}));let A={...e.analyticsData,widgetId:e.widgetTypeId,templateId:e.templateId,dashboardTarget:e?.dashboardTarget,widgetIndex:e?.widgetIndex,widgetName:w},j=x&&!S.hasCompleted||e.isEditing&&E,M=a[e.templateId];if(!M||!j&&(E||D))return(0,m.jsx)(m.Fragment,{});let N=M.partialLoading,P=M.getComponent(e.widgetTypeId),F=s(M.className,e.className),I=e.isEditing&&e.metadata.aiAddedVideo;return(0,m.jsx)(`div`,{id:e.widgetTypeId===c.ContinueWatching?`continue-watching-videos-widget`:null,ref:t,className:`curated-widget ${F} ${w?`has-heading`:``} ${e.isScrollToTargetWidget?`my-n2 mx-n3`:``}`,children:(0,m.jsx)(h,{enabled:I,children:(0,m.jsxs)(`div`,{className:e.isScrollToTargetWidget?`py-2 px-3 rounded-3 ${g.widgetHighlight}`:``,children:[i.isWidgetInTableOfContents(e.metadata)&&(0,m.jsx)(`a`,{href:`#${e.id}`,id:`${e.id}`,className:`${g.anchor}`,ref:t=>{t&&e.headingElementRef?.current&&e.headingElementRef.current.add(t)}}),j?(0,m.jsx)(`div`,{ref:y,children:(0,m.jsx)(N,{name:w,description:e.description,isPreviewing:e.isPreviewing})}):(0,m.jsx)(P,{...e,appLinks:k,name:w,content:C,preferences:S.data?.preferences,analyticsData:A,showHighlight:e.isScrollToTargetWidget,isPreviewing:e.isPreviewing,onClickRemoveItem:O})]})})})}export{v as t};
2
+ //# sourceMappingURL=C1xOGHlL2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BZU4ADoQ2.chunk.js","names":[],"sources":["../../../../../../../libs/shared/src/components/widgets/curated-widgets/components/animated-border/animated-border.module.scss","../../../../../../../libs/shared/src/components/widgets/curated-widgets/components/animated-border/AnimatedBorder.tsx","../../../../../../../libs/shared/src/components/widgets/curated-widgets/widget-container-view.module.scss","../../../../../../../libs/shared/src/components/widgets/curated-widgets/WidgetContainerView.tsx"],"sourcesContent":[":local {\n .animatedBorder {\n position: relative;\n padding: 0.25rem;\n border-radius: 1rem;\n background: linear-gradient(\n 90deg,\n #ff6ec4,\n #7873f5,\n #4facfe,\n #00f2fe,\n #4facfe,\n #7873f5,\n #ff6ec4\n );\n background-size: 200% 200%;\n animation: borderRotate 3s ease infinite;\n box-sizing: border-box;\n }\n\n .animatedBorderContent {\n background-color: white;\n border-radius: 0.875rem;\n overflow: hidden;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n\n @keyframes :local(borderRotate) {\n 0% {\n background-position: 0% 50%;\n }\n 50% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0% 50%;\n }\n }\n}","import React from 'react';\n\nimport styles from './animated-border.module.scss';\n\ninterface AnimatedBorderProps {\n enabled: boolean;\n children: React.ReactNode;\n}\n\nexport function AnimatedBorder({ enabled, children }: AnimatedBorderProps): JSX.Element {\n if (!enabled) {\n return <>{children}</>;\n }\n\n return (\n <div className={styles.animatedBorder}>\n <div className={`${styles.animatedBorderContent} p-2`}>\n {children}\n </div>\n </div>\n );\n}\n",":local {\n .anchor {\n scroll-margin-top: 4.18rem;\n }\n\n .widgetHighlight {\n animation: blinker 4s linear 1;\n border-radius: $border-radius-lg;\n position: relative;\n z-index: 1;\n background-color: white;\n }\n\n @keyframes :local(blinker) {\n from {\n box-shadow: 0 0 1.75rem $blue;\n }\n to {\n box-shadow: none;\n }\n }\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnimatedBorder } from 'libs/shared/components/widgets/curated-widgets/components/animated-border/AnimatedBorder';\nimport { AllClassificationWidgetTemplates, AllCompanyWidgetTemplates, AllDiscoverWidgetTemplates, AllMoviesAndTvWidgetTemplates, AllPartnerProfileWidgetTemplates, AllSearchWidgetTemplates, AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTemplateConfig } from 'libs/shared/constants/WidgetTemplateConfig';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { HasLocalPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { CuratedWidget, CuratedWidgetContent, DashboardTargetType, Video, WidgetMetadata } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport styles from './widget-container-view.module.scss';\n\nfunction isEmptyWidget<TContent = CuratedWidgetContent>(widgetTypeId: WidgetTypeId, content: TContent): boolean {\n if (WidgetHelper.hasNoContent(widgetTypeId))\n return false;\n \n if (!content)\n return true;\n\n if (Array.isArray(content) && !content.length)\n return true;\n\n return false;\n}\n\n/**\n * Type mapping from DashboardTargetType to their corresponding Widget Template Props\n * This makes it easy to extract the correct widget template type based on dashboard target\n */\nexport type DashboardTargetToWidgetTemplateMap = {\n [DashboardTargetType.Classification]: AllClassificationWidgetTemplates,\n [DashboardTargetType.Discover]: AllDiscoverWidgetTemplates,\n [DashboardTargetType.Company]: AllCompanyWidgetTemplates,\n [DashboardTargetType.MoviesAndTv]: AllMoviesAndTvWidgetTemplates,\n [DashboardTargetType.Search]: AllSearchWidgetTemplates,\n [DashboardTargetType.PartnerProfile]: AllPartnerProfileWidgetTemplates,\n [DashboardTargetType.DiscoverPartnerProfiles]: AllPartnerProfileWidgetTemplates,\n // Add defaults for other dashboard targets that don't have specific templates\n [DashboardTargetType.ClassificationDirectory]: AllClassificationWidgetTemplates,\n [DashboardTargetType.ClassificationCurriculum]: AllClassificationWidgetTemplates,\n [DashboardTargetType.PartnerProfileHub]: AllPartnerProfileWidgetTemplates\n};\n\n/**\n * Helper type to extract widget template props for a specific dashboard target\n */\nexport type WidgetTemplatePropsForTarget<T extends DashboardTargetType> =\n T extends keyof DashboardTargetToWidgetTemplateMap ?\n DashboardTargetToWidgetTemplateMap[T] :\n AllWidgetTemplateProps;\n\ninterface BaseWidgetContainerViewProps {\n id: string;\n name: string;\n description: string;\n templateId: WidgetTemplate;\n \n /**\n * This is different from `settings` props \n * which is union of all settings used \n * within different widgets. \n */\n settingsHash?: SettingsHash;\n widgetIndex?: number;\n widgetTypeId: WidgetTypeId;\n setIsEmpty?: (id: string, isEmpty: boolean) => void;\n onClickRemoveItem?: (itemId: string, itemName: string, widgetId: string, widgetTypeId: WidgetTypeId) => void;\n isEditing?: boolean;\n isScrollToTargetWidget?: boolean;\n headingElementRef?: React.MutableRefObject<Set<Element>>;\n lazyLoad?: boolean;\n metadata: Partial<WidgetMetadata>;\n isPreviewing?: boolean;\n dashboardTarget?: DashboardTargetType;\n className?: string;\n hasLocalPermissions?: HasLocalPermissionsFunc;\n isUpselling?: boolean;\n}\n\ntype WidgetContainerViewPropsForTarget<T extends DashboardTargetType> =\n BaseWidgetContainerViewProps &\n Omit<WidgetTemplatePropsForTarget<T>, 'content' | 'metadata'> &\n { widgetCollection?: T };\n\ntype ClassificationWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.Classification>;\ntype DiscoverWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.Discover>;\ntype CompanyWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.Company>;\ntype MoviesAndTvWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.MoviesAndTv>;\ntype SearchWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.Search>;\ntype PartnerProfileDashboardWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.PartnerProfile>;\ntype PartnerProfileDiscoverWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.DiscoverPartnerProfiles>;\n\ntype CuratorWidgetContainerViewProps = Omit<Partial<AllWidgetTemplateProps>, 'content' | 'metadata'> &\n { location: 'curator' };\n\ntype CommonContainerViewProps =\n BaseWidgetContainerViewProps & (\n ClassificationWidgetContainerViewProps |\n DiscoverWidgetContainerViewProps |\n CompanyWidgetContainerViewProps |\n MoviesAndTvWidgetContainerViewProps |\n CuratorWidgetContainerViewProps |\n SearchWidgetContainerViewProps |\n PartnerProfileDashboardWidgetContainerViewProps |\n PartnerProfileDiscoverWidgetContainerViewProps\n );\n\ntype PropsWithFetch = CommonContainerViewProps & {\n getContentRequest: (id: string, widgetTypeId: WidgetTypeId, templateId: WidgetTemplate) => Flight.Request,\n content?: never\n};\n\ntype PropsWithoutFetch = CommonContainerViewProps & {\n content: CuratedWidgetContent,\n getContentRequest?: never\n};\n\ntype WidgetContainerViewProps = PropsWithFetch | PropsWithoutFetch;\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function WidgetContainerView(props: WidgetContainerViewProps): JSX.Element {\n const scrollToRef = React.createRef<HTMLDivElement>();\n\n const [ removedItemIds, setRemovedItemIds ] = React.useState<string[]>([]);\n\n const isWidgetEnabled = CuratedDashboardHelper.isWidgetTypeEnabled(\n props.widgetTypeId,\n props?.settingsHash,\n props?.dashboardTarget\n );\n\n const shouldLazyLoad = props.lazyLoad ?? true;\n\n const { ref: partialLoadingRef, inView } = useLazyLoad({ prevent: !shouldLazyLoad });\n \n const willFetch = isWidgetEnabled && FunctionHelper.isFunction(props.getContentRequest);\n\n const lazyWidget = Flight.useBasicFetch<CuratedWidget>(!!(inView && isWidgetEnabled && props.getContentRequest) &&\n props.getContentRequest(props.id, props.widgetTypeId, props.templateId));\n\n const { content } = WidgetHelper.useGetContent(\n props.content || lazyWidget.data?.content,\n props.widgetTypeId,\n props.isPreviewing,\n lazyWidget.data?.preferences,\n removedItemIds\n );\n\n const name = lazyWidget.data?.name || props.name;\n\n const breakpoints = useBreakpoints();\n\n const isEmpty = isEmptyWidget(props.widgetTypeId, content);\n const shouldHideWidget = !WidgetHelper.canDisplayOnScreenSize(breakpoints, props.widgetTypeId, props.templateId);\n\n React.useEffect(() => {\n if ((willFetch && !lazyWidget.hasCompleted))\n return;\n\n props.setIsEmpty?.(props.id, isEmpty || shouldHideWidget);\n }, [ lazyWidget.hasCompleted, isEmpty, shouldHideWidget, willFetch, props.setIsEmpty ]);\n\n React.useEffect(() => {\n if (!props.isScrollToTargetWidget || !scrollToRef.current)\n return;\n\n scrollToRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start'\n });\n }, [ props.isScrollToTargetWidget, scrollToRef.current ]);\n\n function onClickRemoveItem(itemId: string, itemName: string): void {\n if (!props.onClickRemoveItem)\n return;\n\n setRemovedItemIds([ ...removedItemIds, itemId ]);\n return props.onClickRemoveItem(itemId, itemName, props.id, props.widgetTypeId);\n }\n\n /**\n * Our videos require widget id for context, so we're enclosing the video type applink function here.\n */\n const appLinks = props.appLinks ? { ...props.appLinks } : null;\n if (appLinks?.videoType) {\n const getVideoTypeAppLink = (video: Video, options: GetVideoAppLinkOptions) => {\n return props.appLinks?.videoType(\n video,\n { ...options, contextId: props.id, includeContext: options.includeContext }\n );\n };\n \n appLinks.videoType = getVideoTypeAppLink;\n }\n\n const analyticsData = {\n ...props.analyticsData,\n widgetId: props.widgetTypeId,\n templateId: props.templateId,\n dashboardTarget: props?.dashboardTarget,\n widgetIndex: props?.widgetIndex,\n widgetName: name\n };\n\n const showPartialLoadingComponent = (willFetch && !lazyWidget.hasCompleted) || (props.isEditing && isEmpty);\n\n const template = WidgetTemplateConfig[props.templateId];\n\n if (!template || !showPartialLoadingComponent && (isEmpty || shouldHideWidget))\n return <></>;\n \n const PartialTemplate = template.partialLoading;\n const Template = template.getComponent(props.widgetTypeId);\n const widgetTemplateClass = classNames(template.className, props.className);\n\n const hasNewVideoHighlight = props.isEditing && props.metadata.aiAddedVideo;\n\n return (\n <div\n id={props.widgetTypeId === WidgetTypeId.ContinueWatching ? 'continue-watching-videos-widget' : null}\n ref={scrollToRef}\n className={`curated-widget ${widgetTemplateClass} ${name ? 'has-heading' : ''} ${props.isScrollToTargetWidget ? 'my-n2 mx-n3' : ''}`}\n >\n <AnimatedBorder enabled={hasNewVideoHighlight}>\n <div className={props.isScrollToTargetWidget ? `py-2 px-3 rounded-3 ${styles.widgetHighlight}` : ''}>\n {WidgetHelper.isWidgetInTableOfContents(props.metadata) && (\n <a\n href={`#${props.id}`}\n id={`${props.id}`}\n className={`${styles.anchor}`}\n ref={el => { (el && props.headingElementRef?.current) && props.headingElementRef.current.add(el); }}\n />\n )}\n\n {showPartialLoadingComponent ? (\n <div ref={partialLoadingRef}>\n <PartialTemplate\n name={name}\n description={props.description}\n isPreviewing={props.isPreviewing}\n />\n </div>\n ) : (\n <Template\n {...props}\n appLinks={appLinks}\n name={name}\n content={content}\n preferences={lazyWidget.data?.preferences}\n analyticsData={analyticsData}\n showHighlight={props.isScrollToTargetWidget}\n isPreviewing={props.isPreviewing}\n onClickRemoveItem={onClickRemoveItem}\n />\n )}\n </div>\n </AnimatedBorder>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"C1xOGHlL2.chunk.js","names":[],"sources":["../../../../../../../libs/shared/src/components/widgets/curated-widgets/components/animated-border/animated-border.module.scss","../../../../../../../libs/shared/src/components/widgets/curated-widgets/components/animated-border/AnimatedBorder.tsx","../../../../../../../libs/shared/src/components/widgets/curated-widgets/widget-container-view.module.scss","../../../../../../../libs/shared/src/components/widgets/curated-widgets/WidgetContainerView.tsx"],"sourcesContent":[":local {\n .animatedBorder {\n position: relative;\n padding: 0.25rem;\n border-radius: 1rem;\n background: linear-gradient(\n 90deg,\n #ff6ec4,\n #7873f5,\n #4facfe,\n #00f2fe,\n #4facfe,\n #7873f5,\n #ff6ec4\n );\n background-size: 200% 200%;\n animation: borderRotate 3s ease infinite;\n box-sizing: border-box;\n }\n\n .animatedBorderContent {\n background-color: white;\n border-radius: 0.875rem;\n overflow: hidden;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n }\n\n @keyframes :local(borderRotate) {\n 0% {\n background-position: 0% 50%;\n }\n 50% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0% 50%;\n }\n }\n}","import React from 'react';\n\nimport styles from './animated-border.module.scss';\n\ninterface AnimatedBorderProps {\n enabled: boolean;\n children: React.ReactNode;\n}\n\nexport function AnimatedBorder({ enabled, children }: AnimatedBorderProps): JSX.Element {\n if (!enabled) {\n return <>{children}</>;\n }\n\n return (\n <div className={styles.animatedBorder}>\n <div className={`${styles.animatedBorderContent} p-2`}>\n {children}\n </div>\n </div>\n );\n}\n",":local {\n .anchor {\n scroll-margin-top: 4.18rem;\n }\n\n .widgetHighlight {\n animation: blinker 4s linear 1;\n border-radius: $border-radius-lg;\n position: relative;\n z-index: 1;\n background-color: white;\n }\n\n @keyframes :local(blinker) {\n from {\n box-shadow: 0 0 1.75rem $blue;\n }\n to {\n box-shadow: none;\n }\n }\n}","import React from 'react';\n\nimport { FunctionHelper } from 'libs/common/backbone/utils/FunctionHelper';\nimport { Flight } from 'libs/common/flight';\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { AnimatedBorder } from 'libs/shared/components/widgets/curated-widgets/components/animated-border/AnimatedBorder';\nimport { AllClassificationWidgetTemplates, AllCompanyWidgetTemplates, AllDiscoverWidgetTemplates, AllMoviesAndTvWidgetTemplates, AllPartnerProfileWidgetTemplates, AllSearchWidgetTemplates, AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTemplateConfig } from 'libs/shared/constants/WidgetTemplateConfig';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { useLazyLoad } from 'libs/shared/hooks/UseLazyLoad';\nimport { HasLocalPermissionsFunc } from 'libs/shared/hooks/usePermissions';\nimport { SettingsHash } from 'libs/shared/hooks/useSettings';\nimport { CuratedWidget, CuratedWidgetContent, DashboardTargetType, Video, WidgetMetadata } from 'libs/shared/interfaces';\nimport { GetVideoAppLinkOptions } from 'libs/shared/interfaces/VideoAppLinkOptions';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\nimport { WidgetHelper } from 'libs/shared/utils/WidgetHelper';\n\nimport styles from './widget-container-view.module.scss';\n\nfunction isEmptyWidget<TContent = CuratedWidgetContent>(widgetTypeId: WidgetTypeId, content: TContent): boolean {\n if (WidgetHelper.hasNoContent(widgetTypeId))\n return false;\n \n if (!content)\n return true;\n\n if (Array.isArray(content) && !content.length)\n return true;\n\n return false;\n}\n\n/**\n * Type mapping from DashboardTargetType to their corresponding Widget Template Props\n * This makes it easy to extract the correct widget template type based on dashboard target\n */\nexport type DashboardTargetToWidgetTemplateMap = {\n [DashboardTargetType.Classification]: AllClassificationWidgetTemplates,\n [DashboardTargetType.Discover]: AllDiscoverWidgetTemplates,\n [DashboardTargetType.Company]: AllCompanyWidgetTemplates,\n [DashboardTargetType.MoviesAndTv]: AllMoviesAndTvWidgetTemplates,\n [DashboardTargetType.Search]: AllSearchWidgetTemplates,\n [DashboardTargetType.PartnerProfile]: AllPartnerProfileWidgetTemplates,\n [DashboardTargetType.DiscoverPartnerProfiles]: AllPartnerProfileWidgetTemplates,\n // Add defaults for other dashboard targets that don't have specific templates\n [DashboardTargetType.ClassificationDirectory]: AllClassificationWidgetTemplates,\n [DashboardTargetType.ClassificationCurriculum]: AllClassificationWidgetTemplates,\n [DashboardTargetType.PartnerProfileHub]: AllPartnerProfileWidgetTemplates\n};\n\n/**\n * Helper type to extract widget template props for a specific dashboard target\n */\nexport type WidgetTemplatePropsForTarget<T extends DashboardTargetType> =\n T extends keyof DashboardTargetToWidgetTemplateMap ?\n DashboardTargetToWidgetTemplateMap[T] :\n AllWidgetTemplateProps;\n\ninterface BaseWidgetContainerViewProps {\n id: string;\n name: string;\n description: string;\n templateId: WidgetTemplate;\n \n /**\n * This is different from `settings` props \n * which is union of all settings used \n * within different widgets. \n */\n settingsHash?: SettingsHash;\n widgetIndex?: number;\n widgetTypeId: WidgetTypeId;\n setIsEmpty?: (id: string, isEmpty: boolean) => void;\n onClickRemoveItem?: (itemId: string, itemName: string, widgetId: string, widgetTypeId: WidgetTypeId) => void;\n isEditing?: boolean;\n isScrollToTargetWidget?: boolean;\n headingElementRef?: React.MutableRefObject<Set<Element>>;\n lazyLoad?: boolean;\n metadata: Partial<WidgetMetadata>;\n isPreviewing?: boolean;\n dashboardTarget?: DashboardTargetType;\n className?: string;\n hasLocalPermissions?: HasLocalPermissionsFunc;\n isUpselling?: boolean;\n}\n\ntype WidgetContainerViewPropsForTarget<T extends DashboardTargetType> =\n BaseWidgetContainerViewProps &\n Omit<WidgetTemplatePropsForTarget<T>, 'content' | 'metadata'> &\n { widgetCollection?: T };\n\ntype ClassificationWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.Classification>;\ntype DiscoverWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.Discover>;\ntype CompanyWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.Company>;\ntype MoviesAndTvWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.MoviesAndTv>;\ntype SearchWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.Search>;\ntype PartnerProfileDashboardWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.PartnerProfile>;\ntype PartnerProfileDiscoverWidgetContainerViewProps =\n WidgetContainerViewPropsForTarget<DashboardTargetType.DiscoverPartnerProfiles>;\n\ntype CuratorWidgetContainerViewProps = Omit<Partial<AllWidgetTemplateProps>, 'content' | 'metadata'> &\n { location: 'curator' };\n\ntype CommonContainerViewProps =\n BaseWidgetContainerViewProps & (\n ClassificationWidgetContainerViewProps |\n DiscoverWidgetContainerViewProps |\n CompanyWidgetContainerViewProps |\n MoviesAndTvWidgetContainerViewProps |\n CuratorWidgetContainerViewProps |\n SearchWidgetContainerViewProps |\n PartnerProfileDashboardWidgetContainerViewProps |\n PartnerProfileDiscoverWidgetContainerViewProps\n );\n\ntype PropsWithFetch = CommonContainerViewProps & {\n getContentRequest: (id: string, widgetTypeId: WidgetTypeId, templateId: WidgetTemplate) => Flight.Request,\n content?: never\n};\n\ntype PropsWithoutFetch = CommonContainerViewProps & {\n content: CuratedWidgetContent,\n getContentRequest?: never\n};\n\ntype WidgetContainerViewProps = PropsWithFetch | PropsWithoutFetch;\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function WidgetContainerView(props: WidgetContainerViewProps): JSX.Element {\n const scrollToRef = React.createRef<HTMLDivElement>();\n\n const [ removedItemIds, setRemovedItemIds ] = React.useState<string[]>([]);\n\n const isWidgetEnabled = CuratedDashboardHelper.isWidgetTypeEnabled(\n props.widgetTypeId,\n props?.settingsHash,\n props?.dashboardTarget\n );\n\n const shouldLazyLoad = props.lazyLoad ?? true;\n\n const { ref: partialLoadingRef, inView } = useLazyLoad({ prevent: !shouldLazyLoad });\n \n const willFetch = isWidgetEnabled && FunctionHelper.isFunction(props.getContentRequest);\n\n const lazyWidget = Flight.useBasicFetch<CuratedWidget>(!!(inView && isWidgetEnabled && props.getContentRequest) &&\n props.getContentRequest(props.id, props.widgetTypeId, props.templateId));\n\n const { content } = WidgetHelper.useGetContent(\n props.content || lazyWidget.data?.content,\n props.widgetTypeId,\n props.isPreviewing,\n lazyWidget.data?.preferences,\n removedItemIds\n );\n\n const name = lazyWidget.data?.name || props.name;\n\n const breakpoints = useBreakpoints();\n\n const isEmpty = isEmptyWidget(props.widgetTypeId, content);\n const shouldHideWidget = !WidgetHelper.canDisplayOnScreenSize(breakpoints, props.widgetTypeId, props.templateId);\n\n React.useEffect(() => {\n if ((willFetch && !lazyWidget.hasCompleted))\n return;\n\n props.setIsEmpty?.(props.id, isEmpty || shouldHideWidget);\n }, [ lazyWidget.hasCompleted, isEmpty, shouldHideWidget, willFetch, props.setIsEmpty ]);\n\n React.useEffect(() => {\n if (!props.isScrollToTargetWidget || !scrollToRef.current)\n return;\n\n scrollToRef.current.scrollIntoView({\n behavior: 'smooth',\n block: 'start'\n });\n }, [ props.isScrollToTargetWidget, scrollToRef.current ]);\n\n function onClickRemoveItem(itemId: string, itemName: string): void {\n if (!props.onClickRemoveItem)\n return;\n\n setRemovedItemIds([ ...removedItemIds, itemId ]);\n return props.onClickRemoveItem(itemId, itemName, props.id, props.widgetTypeId);\n }\n\n /**\n * Our videos require widget id for context, so we're enclosing the video type applink function here.\n */\n const appLinks = props.appLinks ? { ...props.appLinks } : null;\n if (appLinks?.videoType) {\n const getVideoTypeAppLink = (video: Video, options: GetVideoAppLinkOptions) => {\n return props.appLinks?.videoType(\n video,\n { ...options, contextId: props.id, includeContext: options.includeContext }\n );\n };\n \n appLinks.videoType = getVideoTypeAppLink;\n }\n\n const analyticsData = {\n ...props.analyticsData,\n widgetId: props.widgetTypeId,\n templateId: props.templateId,\n dashboardTarget: props?.dashboardTarget,\n widgetIndex: props?.widgetIndex,\n widgetName: name\n };\n\n const showPartialLoadingComponent = (willFetch && !lazyWidget.hasCompleted) || (props.isEditing && isEmpty);\n\n const template = WidgetTemplateConfig[props.templateId];\n\n if (!template || !showPartialLoadingComponent && (isEmpty || shouldHideWidget))\n return <></>;\n \n const PartialTemplate = template.partialLoading;\n const Template = template.getComponent(props.widgetTypeId);\n const widgetTemplateClass = classNames(template.className, props.className);\n\n const hasNewVideoHighlight = props.isEditing && props.metadata.aiAddedVideo;\n\n return (\n <div\n id={props.widgetTypeId === WidgetTypeId.ContinueWatching ? 'continue-watching-videos-widget' : null}\n ref={scrollToRef}\n className={`curated-widget ${widgetTemplateClass} ${name ? 'has-heading' : ''} ${props.isScrollToTargetWidget ? 'my-n2 mx-n3' : ''}`}\n >\n <AnimatedBorder enabled={hasNewVideoHighlight}>\n <div className={props.isScrollToTargetWidget ? `py-2 px-3 rounded-3 ${styles.widgetHighlight}` : ''}>\n {WidgetHelper.isWidgetInTableOfContents(props.metadata) && (\n <a\n href={`#${props.id}`}\n id={`${props.id}`}\n className={`${styles.anchor}`}\n ref={el => { (el && props.headingElementRef?.current) && props.headingElementRef.current.add(el); }}\n />\n )}\n\n {showPartialLoadingComponent ? (\n <div ref={partialLoadingRef}>\n <PartialTemplate\n name={name}\n description={props.description}\n isPreviewing={props.isPreviewing}\n />\n </div>\n ) : (\n <Template\n {...props}\n appLinks={appLinks}\n name={name}\n content={content}\n preferences={lazyWidget.data?.preferences}\n analyticsData={analyticsData}\n showHighlight={props.isScrollToTargetWidget}\n isPreviewing={props.isPreviewing}\n onClickRemoveItem={onClickRemoveItem}\n />\n )}\n </div>\n </AnimatedBorder>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{C as e,a as t,b as n,ln as r,r as i}from"./BlDu0qdC.chunk.js";import{a,n as o,r as s,t as c}from"./DqUkhPat.chunk.js";import{t as l}from"./DEBg-sxL.chunk.js";import{t as u}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{t as d}from"./M97_Ztsu.chunk.js";import{r as f}from"./DkstLT1W.chunk.js";import{H as p,K as m,P as h,at as g,t as _}from"./BjSaXG862.chunk.js";import{c as v,d as ee,r as y}from"./BIZf7Q462.chunk.js";import{t as te}from"./Dms5O1Sn2.chunk.js";import{t as b}from"./CgYigCRf2.chunk.js";import"./COkf8IPk2.chunk.js";import{t as x}from"./C1PTqhPY2.chunk.js";import{t as ne}from"./Bt5qHBoM2.chunk.js";import{r as S}from"./lFyCTjyz2.chunk.js";import{C}from"./CSSol6ro.chunk.js";import{t as w}from"./C-KuBn_h.chunk.js";import{n as T}from"./DalFHGv7.chunk.js";import{t as E}from"./jjwEJLK1.chunk.js";import{t as D}from"./DX5LfwTl.chunk.js";import{t as O}from"./_2D0GS5_.chunk.js";import"./DRXsy0be2.chunk.js";import{t as re}from"./DLDFNrWX2.chunk.js";import{t as k}from"./CVBPygL42.chunk.js";import{t as A}from"./Bidcjyrx.chunk.js";import{t as ie}from"./wbPvk2s42.chunk.js";import{t as j}from"./Hprw1_Va.chunk.js";import{t as M}from"./_SkcfB2b.chunk.js";import{t as ae}from"./C8hLOeBc2.chunk.js";import{n as oe,t as se}from"./BXZW3SN2.chunk.js";import{r as N,t as P}from"./v-3x6QfN.chunk.js";import{t as ce}from"./CJ7nWaoU.chunk.js";import{t as le}from"./DyO4gCJR.chunk.js";import{t as ue}from"./CEetwDE1.chunk.js";import{t as de}from"./CBc53qwJ.chunk.js";import{t as F}from"./C2ex5xMc.chunk.js";import{n as I,r as L,t as R}from"./r-zw-56e.chunk.js";import{t as z}from"./YEFuJN4z2.chunk.js";var B=r(p()),V=r(t()),H=i(),U=V.forwardRef(({bsPrefix:e,bg:t=`primary`,pill:n=!1,text:r,className:i,as:a=`span`,...o},s)=>{let c=h(e,`badge`);return(0,H.jsx)(a,{ref:s,...o,className:(0,B.default)(i,c,n&&`rounded-pill`,r&&`text-${r}`,t&&`bg-${t}`)})});U.displayName=`Badge`;var W=`YYYY-MM-DD`,fe=e=>{let t=e.user.dateCreated?D.fromNow(e.user.dateCreated):`-`,n=e.user.dateModified?D.fromNow(e.user.dateModified):`-`;return(0,H.jsxs)(`div`,{children:[(0,H.jsxs)(`div`,{className:`d-flex flex-column`,children:[(0,H.jsx)(`small`,{children:`Date created`}),(0,H.jsx)(a,{title:D.format(e.user.dateCreated,W),spanHack:!0,spanHackClassName:`w-fit`,children:t})]}),(0,H.jsx)(`hr`,{}),(0,H.jsxs)(`div`,{className:`d-flex flex-column`,children:[`Date modified`,(0,H.jsx)(a,{title:D.format(e.user.dateModified,W),spanHack:!0,spanHackClassName:`w-fit`,children:n})]})]})},G=E.encloseNamespace(`userManager.userUpdatedSuccess`);function K(e){switch(e){case`activation`:return G(`activationEmailSentTitle`);case`verification`:return G(`verificationEmailSentTitle`);case`reset-password`:return G(`resetPasswordEmailSentTitle`)}}function q(e){switch(e){case`activation`:return G(`activationEmailSentBody`);case`verification`:return G(`verificationEmailSentBody`);case`reset-password`:return G(`resetPasswordEmailSentBody`)}}function pe(e){return(0,H.jsxs)(w,{title:K(e.emailType),closePopup:e.closePopup,children:[(0,H.jsx)(`div`,{className:`d-flex justify-content-center w-50 mx-auto pb-3`,children:(0,H.jsx)(`img`,{src:e.emailSentImageUrl,alt:``,role:`presentation`,className:`w-100`})}),(0,H.jsx)(`p`,{children:q(e.emailType)})]})}function me(e){return(0,H.jsxs)(`div`,{className:`mt-2`,children:[(0,H.jsx)(`hr`,{}),(0,H.jsx)(`h6`,{children:`Daily credit limit`}),(0,H.jsx)(`p`,{children:e.userCredit.creditLimit})]})}function he(e){let t=`An error occurred.`;return e.user.statusCode===n.NotFound&&(t=`User could not be found`),e.customer.statusCode===n.NotFound&&(t=`Customer could not be found`),(0,H.jsxs)(H.Fragment,{children:[e.customer.data&&(0,H.jsxs)(`h1`,{className:`h6 mb-0`,children:[e.customer.data.name,` - `,e.customer.data.crmId]}),(0,H.jsx)(`div`,{className:`my-2`,children:(0,H.jsx)(C,{appLink:e.customerAppLink})}),(0,H.jsx)(`div`,{className:`py-3`,children:t})]})}var J=13;function ge(e){if(!e.customers.data||e.customers.data.length===0||e.customers.data.length===1&&b.first(e.customers.data).id.toString()===e.currentCustomer.id.toString())return(0,H.jsx)(H.Fragment,{});function t(t){return{application:u.CUSTOMERS,action:l.Customers.EDIT_USER,args:[t.id,e.userId],params:{userType:e.userType}}}function n(t){return{application:u.CUSTOMERS,action:l.Customers.REMOVE_USER_FROM_CUSTOMER,args:[t.id,e.userId]}}let r=({items:r,right:i})=>(0,H.jsx)(`ul`,{className:`list-unstyled`,children:r.map((l,u)=>{let d=u+1===r.length,f=`border w-100 p-2 d-flex justify-content-between`;return d||(f+=` border-bottom-0`),i&&(f+=` border-start-0`),(0,H.jsxs)(`li`,{className:f,children:[(0,H.jsxs)(c,{appLink:t(l),children:[l.name,` (`,l.crmId,`)`,l.id.toString()===e.currentCustomer.id.toString()&&(0,H.jsx)(U,{bg:`secondary`,className:`ms-1`,children:`Current customer`})]}),(0,H.jsx)(a,{title:`Remove user from ${l.name}`,spanHack:!0,spanHackClassName:`ms-1`,children:(0,H.jsx)(c,{appLink:n(l),children:(0,H.jsx)(o,{svg:j,size:s.Small})})})]},u)})}),i={application:u.CUSTOMERS,action:l.Customers.ADD_USER_TO_CUSTOMER,args:[e.currentCustomer.id,e.userId]};return(0,H.jsxs)(`div`,{className:`mt-2`,children:[(0,H.jsx)(`h6`,{children:`User's other customers`}),(0,H.jsxs)(`p`,{children:[`This user exists in multiple customers. This user's details are currently scoped to\xA0`,(0,H.jsx)(`strong`,{children:e.currentCustomer.name}),` (`,e.currentCustomer.crmId,`). Details such as year level are representative of this user's data within this customer.`]}),(0,H.jsxs)(`div`,{className:`row m-0 p-0`,children:[(0,H.jsx)(`div`,{className:`col m-0 p-0`,children:(0,H.jsx)(r,{items:e.customers.data.slice(0,J)})}),(0,H.jsx)(`div`,{className:`col m-0 p-0`,children:(0,H.jsx)(r,{items:e.customers.data.slice(J),right:!0})})]}),(0,H.jsxs)(`div`,{className:`d-flex justify-content-between mt-1`,children:[(0,H.jsxs)(c,{appLink:i,children:[(0,H.jsx)(o,{svg:O,size:s.Small}),`Add user to another customer`]}),(e.customers.pagination?.cursors?.next||e.customers.pagination?.cursors?.previous)&&(0,H.jsx)(M,{cursors:e.customers.pagination?.cursors,buttonVariant:`outline-dark`,onClick:e.setCursor})]}),(0,H.jsx)(`hr`,{})]})}var Y=2**53-1;function X(e){let{allocationInBytes:t=0,sizeInBytes:n=0}=e.userWorkspaceUsage.workspaceSizeAllocation||{},r=t===Y,i=(t/1024/1024/1024).toFixed(0),a=(n/1024/1024/1024).toFixed(2),o=(n/t*100).toFixed(2);return(0,H.jsxs)(`div`,{className:`mt-2`,children:[(0,H.jsx)(`hr`,{}),(0,H.jsx)(`h6`,{children:`Workspace`}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`No. of videos: `,e.userWorkspaceUsage.videoCount]}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`No. of clips: `,e.userWorkspaceUsage.clipCount]}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`No. of interactives: `,e.userWorkspaceUsage.interactiveCount]}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`Allocation: `,r?`Unlimited`:`${i} GB`]}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`Allocation used: `,a,` GB`]}),!r&&(0,H.jsxs)(`p`,{className:`m-0`,children:[`Percentage of allocation used: `,o,`%`]})]})}var Z=E.encloseNamespace(`userManager.editUser`);function Q(t){let[n,r]=V.useState(null),[i,a]=V.useState(``),o=k(),s=te(),c=ee(),{hasPermissions:l}=re(),u=P.getUser(t.customerId,t.id),p=v(P.otherCustomers(t.customerId,t.id,i)),h=v(P.customer(t.customerId)),b=v(u),w=v(ne.currentUser()),E=v(P.yearGroups(t.customerId)),D=v(A.userPlaylistsAll(t.id)),O=v(A.userWorkspaceUsage(t.customerId,t.id)),j=v(P.passwordPolicy(t.customerId)),M=v(P.getAuthenticationMethodsByUserIds(t.customerId,[t.id],u.normalizeOptions?.namespace)),B=v(P.getCustomerProducts(t.customerId)),U=h.data?.contentRegion&&h.data?.contentRegion.systemName!==d.US,W=v(U&&P.getCustomerUserCredit(t.customerId,t.id)),G=l(f.UserCreditUpdate),K=b.data?.userType,q=R(t.customerId,K,t.returnAppLinkCursor);L(b,t.customerId,t.returnAppLinkCursor);function J(e){let n=N.formatCreateOrValidateUserRequest([e],K,t.customerId);return c(P.bulkValidate(n,!1,t.customerId))}async function Y(e,n){if(b.data.status===S.Disabled)return;let r=await J(e);if(!N.handleAsyncErrors(r,e,b.data,n))return;let i=N.formatEditUserRequest(e);y(s,P.updateUser(t.customerId,i,w.data.id,e=>{if(_.logUserAction(e,t.analyticsOptions),b.data.email!==e.email){e.status===S.Inactive&&Q(e),e.status===S.Active&&$(e);return}o.success(Z(`success`))},()=>{o.error(Z(`error`))},()=>{},b.data?.masterYearGroup?.value===0&&e.masterYearGroup?.value!==0))}function Q(e){y(s,P.resendActivationEmail(t.customerId,e.id,()=>{_.logUserAction(e,{...t.analyticsOptions,actionType:g.SendEmail,descriptor:m.ActivateUser}),r(`activation`)},()=>{o.error(Z(`activationEmailError`))}))}function _e(e){y(s,P.sendPasswordResetEmail(t.customerId,e.id,()=>{_.logUserAction(e,{...t.analyticsOptions,actionType:g.SendEmail,descriptor:m.ResetPasswordEmail}),r(`reset-password`)},()=>{o.error(Z(`passwordResetEmailError`))}))}function $(e){y(s,P.resendVerificationEmail(t.customerId,e.id,()=>{_.logUserAction(e,{...t.analyticsOptions,actionType:g.SendEmail,descriptor:m.VerifyEmail}),r(`verification`)},()=>{o.error(Z(`verificationEmailError`))}))}let ve=!!h.data&&!!b.data&&!!w.data&&!!E.data&&!!j.data&&!!M.data&&(!U||!!W.data);return h.hasError||b.hasError||w.hasError||E.hasError||j.hasError||M.hasError?(0,H.jsx)(he,{customer:h,user:b,customerAppLink:q}):ve?(0,H.jsxs)(ce.Provider,{value:se.Curator,children:[p.data?(0,H.jsx)(ge,{customers:p.data,currentCustomer:h.data,userType:K,userId:t.id,setCursor:a}):(0,H.jsxs)(`div`,{className:`d-flex justify-content-center align-items-center`,style:{height:`100px`},children:[` `,(0,H.jsx)(T,{as:`div`,animation:`border`,role:`status`})]}),(0,H.jsxs)(`h1`,{className:`h6 mb-0`,children:[h.data.name,` - `,h.data.crmId]}),(0,H.jsx)(`div`,{className:`my-2`,children:(0,H.jsx)(C,{appLink:q,backToName:K===x.Learner?`Students`:`Staff`})}),(0,H.jsx)(`div`,{className:`d-flex`,children:(0,H.jsx)(oe,{user:b.data,currentUser:w.data,className:`mb-2`})}),(0,H.jsx)(ue,{user:b.data,userType:K,yearGroups:K===x.Learner?E.data:null,initialValues:I(b.data,t.customerId),initialErrors:N.getInitialErrorsForInvalidYearGroups(b.data.masterYearGroup),onSubmit:Y,onClickCancel:()=>e.trigger(q),currentUser:w.data,emailRequired:K===x.Staff,showActions:!0,appLinks:le(t.customerId,K),onClickResendActivationEmail:Q,onClickSendResetEmail:_e,onClickSendVerificationEmail:$,showDisplayNameField:K===x.Staff,passwordPolicy:j.data,canEditSsoFields:l(f.UsersSsoUpdate),products:B.data?.map(e=>e.id)??[],hasUserCredit:U&&G,hasOrg:!!h.data?.organisation,canEditSuperAdmin:!0}),G&&W.data&&(0,H.jsx)(me,{userCredit:W.data}),(0,H.jsx)(`hr`,{}),(0,H.jsx)(F,{user:b.data}),(0,H.jsx)(`hr`,{}),(0,H.jsx)(fe,{user:b.data}),(0,H.jsx)(`hr`,{}),(0,H.jsx)(de,{user:b.data}),!!O.data&&(0,H.jsx)(X,{userWorkspaceUsage:O.data}),!!D.data&&(0,H.jsx)(z,{playlists:D.data}),!!n&&(0,H.jsx)(pe,{emailType:n,emailSentImageUrl:ae.UserManager.EMAIL_SENT,closePopup:()=>r(null)})]}):(0,H.jsx)(`div`,{className:`py-5`,children:(0,H.jsx)(ie,{})})}export{Q as EditUserView};
2
- //# sourceMappingURL=CbaobIxf2.chunk.js.map
1
+ import{C as e,a as t,b as n,ln as r,r as i}from"./BlDu0qdC.chunk.js";import{a,n as o,r as s,t as c}from"./DqUkhPat.chunk.js";import{t as l}from"./DEBg-sxL.chunk.js";import{t as u}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{t as d}from"./M97_Ztsu.chunk.js";import{r as f}from"./DkstLT1W.chunk.js";import{H as p,K as m,P as h,at as g,t as _}from"./BjSaXG862.chunk.js";import{c as v,d as ee,r as y}from"./BIZf7Q462.chunk.js";import{t as te}from"./Dms5O1Sn2.chunk.js";import{t as b}from"./CgYigCRf2.chunk.js";import"./COkf8IPk2.chunk.js";import{t as x}from"./C1PTqhPY2.chunk.js";import{t as ne}from"./Bt5qHBoM2.chunk.js";import{r as S}from"./lFyCTjyz2.chunk.js";import{C}from"./CSSol6ro.chunk.js";import{t as w}from"./C-KuBn_h.chunk.js";import{n as T}from"./DalFHGv7.chunk.js";import{t as E}from"./jjwEJLK1.chunk.js";import{t as D}from"./DX5LfwTl.chunk.js";import{t as O}from"./_2D0GS5_.chunk.js";import"./DRXsy0be2.chunk.js";import{t as re}from"./DLDFNrWX2.chunk.js";import{t as k}from"./CVBPygL42.chunk.js";import{t as A}from"./Bidcjyrx.chunk.js";import{t as ie}from"./wbPvk2s42.chunk.js";import{t as j}from"./Hprw1_Va.chunk.js";import{t as M}from"./_SkcfB2b.chunk.js";import{t as ae}from"./C8hLOeBc2.chunk.js";import{n as oe,t as se}from"./BXZW3SN2.chunk.js";import{r as N,t as P}from"./v-3x6QfN.chunk.js";import{t as ce}from"./CJ7nWaoU.chunk.js";import{t as le}from"./DyO4gCJR.chunk.js";import{t as ue}from"./CEetwDE1.chunk.js";import{t as de}from"./CBc53qwJ.chunk.js";import{t as F}from"./C2ex5xMc.chunk.js";import{n as I,r as L,t as R}from"./B0UOCPE6.chunk.js";import{t as z}from"./YEFuJN4z2.chunk.js";var B=r(p()),V=r(t()),H=i(),U=V.forwardRef(({bsPrefix:e,bg:t=`primary`,pill:n=!1,text:r,className:i,as:a=`span`,...o},s)=>{let c=h(e,`badge`);return(0,H.jsx)(a,{ref:s,...o,className:(0,B.default)(i,c,n&&`rounded-pill`,r&&`text-${r}`,t&&`bg-${t}`)})});U.displayName=`Badge`;var W=`YYYY-MM-DD`,fe=e=>{let t=e.user.dateCreated?D.fromNow(e.user.dateCreated):`-`,n=e.user.dateModified?D.fromNow(e.user.dateModified):`-`;return(0,H.jsxs)(`div`,{children:[(0,H.jsxs)(`div`,{className:`d-flex flex-column`,children:[(0,H.jsx)(`small`,{children:`Date created`}),(0,H.jsx)(a,{title:D.format(e.user.dateCreated,W),spanHack:!0,spanHackClassName:`w-fit`,children:t})]}),(0,H.jsx)(`hr`,{}),(0,H.jsxs)(`div`,{className:`d-flex flex-column`,children:[`Date modified`,(0,H.jsx)(a,{title:D.format(e.user.dateModified,W),spanHack:!0,spanHackClassName:`w-fit`,children:n})]})]})},G=E.encloseNamespace(`userManager.userUpdatedSuccess`);function K(e){switch(e){case`activation`:return G(`activationEmailSentTitle`);case`verification`:return G(`verificationEmailSentTitle`);case`reset-password`:return G(`resetPasswordEmailSentTitle`)}}function q(e){switch(e){case`activation`:return G(`activationEmailSentBody`);case`verification`:return G(`verificationEmailSentBody`);case`reset-password`:return G(`resetPasswordEmailSentBody`)}}function pe(e){return(0,H.jsxs)(w,{title:K(e.emailType),closePopup:e.closePopup,children:[(0,H.jsx)(`div`,{className:`d-flex justify-content-center w-50 mx-auto pb-3`,children:(0,H.jsx)(`img`,{src:e.emailSentImageUrl,alt:``,role:`presentation`,className:`w-100`})}),(0,H.jsx)(`p`,{children:q(e.emailType)})]})}function me(e){return(0,H.jsxs)(`div`,{className:`mt-2`,children:[(0,H.jsx)(`hr`,{}),(0,H.jsx)(`h6`,{children:`Daily credit limit`}),(0,H.jsx)(`p`,{children:e.userCredit.creditLimit})]})}function he(e){let t=`An error occurred.`;return e.user.statusCode===n.NotFound&&(t=`User could not be found`),e.customer.statusCode===n.NotFound&&(t=`Customer could not be found`),(0,H.jsxs)(H.Fragment,{children:[e.customer.data&&(0,H.jsxs)(`h1`,{className:`h6 mb-0`,children:[e.customer.data.name,` - `,e.customer.data.crmId]}),(0,H.jsx)(`div`,{className:`my-2`,children:(0,H.jsx)(C,{appLink:e.customerAppLink})}),(0,H.jsx)(`div`,{className:`py-3`,children:t})]})}var J=13;function ge(e){if(!e.customers.data||e.customers.data.length===0||e.customers.data.length===1&&b.first(e.customers.data).id.toString()===e.currentCustomer.id.toString())return(0,H.jsx)(H.Fragment,{});function t(t){return{application:u.CUSTOMERS,action:l.Customers.EDIT_USER,args:[t.id,e.userId],params:{userType:e.userType}}}function n(t){return{application:u.CUSTOMERS,action:l.Customers.REMOVE_USER_FROM_CUSTOMER,args:[t.id,e.userId]}}let r=({items:r,right:i})=>(0,H.jsx)(`ul`,{className:`list-unstyled`,children:r.map((l,u)=>{let d=u+1===r.length,f=`border w-100 p-2 d-flex justify-content-between`;return d||(f+=` border-bottom-0`),i&&(f+=` border-start-0`),(0,H.jsxs)(`li`,{className:f,children:[(0,H.jsxs)(c,{appLink:t(l),children:[l.name,` (`,l.crmId,`)`,l.id.toString()===e.currentCustomer.id.toString()&&(0,H.jsx)(U,{bg:`secondary`,className:`ms-1`,children:`Current customer`})]}),(0,H.jsx)(a,{title:`Remove user from ${l.name}`,spanHack:!0,spanHackClassName:`ms-1`,children:(0,H.jsx)(c,{appLink:n(l),children:(0,H.jsx)(o,{svg:j,size:s.Small})})})]},u)})}),i={application:u.CUSTOMERS,action:l.Customers.ADD_USER_TO_CUSTOMER,args:[e.currentCustomer.id,e.userId]};return(0,H.jsxs)(`div`,{className:`mt-2`,children:[(0,H.jsx)(`h6`,{children:`User's other customers`}),(0,H.jsxs)(`p`,{children:[`This user exists in multiple customers. This user's details are currently scoped to\xA0`,(0,H.jsx)(`strong`,{children:e.currentCustomer.name}),` (`,e.currentCustomer.crmId,`). Details such as year level are representative of this user's data within this customer.`]}),(0,H.jsxs)(`div`,{className:`row m-0 p-0`,children:[(0,H.jsx)(`div`,{className:`col m-0 p-0`,children:(0,H.jsx)(r,{items:e.customers.data.slice(0,J)})}),(0,H.jsx)(`div`,{className:`col m-0 p-0`,children:(0,H.jsx)(r,{items:e.customers.data.slice(J),right:!0})})]}),(0,H.jsxs)(`div`,{className:`d-flex justify-content-between mt-1`,children:[(0,H.jsxs)(c,{appLink:i,children:[(0,H.jsx)(o,{svg:O,size:s.Small}),`Add user to another customer`]}),(e.customers.pagination?.cursors?.next||e.customers.pagination?.cursors?.previous)&&(0,H.jsx)(M,{cursors:e.customers.pagination?.cursors,buttonVariant:`outline-dark`,onClick:e.setCursor})]}),(0,H.jsx)(`hr`,{})]})}var Y=2**53-1;function X(e){let{allocationInBytes:t=0,sizeInBytes:n=0}=e.userWorkspaceUsage.workspaceSizeAllocation||{},r=t===Y,i=(t/1024/1024/1024).toFixed(0),a=(n/1024/1024/1024).toFixed(2),o=(n/t*100).toFixed(2);return(0,H.jsxs)(`div`,{className:`mt-2`,children:[(0,H.jsx)(`hr`,{}),(0,H.jsx)(`h6`,{children:`Workspace`}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`No. of videos: `,e.userWorkspaceUsage.videoCount]}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`No. of clips: `,e.userWorkspaceUsage.clipCount]}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`No. of interactives: `,e.userWorkspaceUsage.interactiveCount]}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`Allocation: `,r?`Unlimited`:`${i} GB`]}),(0,H.jsxs)(`p`,{className:`m-0`,children:[`Allocation used: `,a,` GB`]}),!r&&(0,H.jsxs)(`p`,{className:`m-0`,children:[`Percentage of allocation used: `,o,`%`]})]})}var Z=E.encloseNamespace(`userManager.editUser`);function Q(t){let[n,r]=V.useState(null),[i,a]=V.useState(``),o=k(),s=te(),c=ee(),{hasPermissions:l}=re(),u=P.getUser(t.customerId,t.id),p=v(P.otherCustomers(t.customerId,t.id,i)),h=v(P.customer(t.customerId)),b=v(u),w=v(ne.currentUser()),E=v(P.yearGroups(t.customerId)),D=v(A.userPlaylistsAll(t.id)),O=v(A.userWorkspaceUsage(t.customerId,t.id)),j=v(P.passwordPolicy(t.customerId)),M=v(P.getAuthenticationMethodsByUserIds(t.customerId,[t.id],u.normalizeOptions?.namespace)),B=v(P.getCustomerProducts(t.customerId)),U=h.data?.contentRegion&&h.data?.contentRegion.systemName!==d.US,W=v(U&&P.getCustomerUserCredit(t.customerId,t.id)),G=l(f.UserCreditUpdate),K=b.data?.userType,q=R(t.customerId,K,t.returnAppLinkCursor);L(b,t.customerId,t.returnAppLinkCursor);function J(e){let n=N.formatCreateOrValidateUserRequest([e],K,t.customerId);return c(P.bulkValidate(n,!1,t.customerId))}async function Y(e,n){if(b.data.status===S.Disabled)return;let r=await J(e);if(!N.handleAsyncErrors(r,e,b.data,n))return;let i=N.formatEditUserRequest(e);y(s,P.updateUser(t.customerId,i,w.data.id,e=>{if(_.logUserAction(e,t.analyticsOptions),b.data.email!==e.email){e.status===S.Inactive&&Q(e),e.status===S.Active&&$(e);return}o.success(Z(`success`))},()=>{o.error(Z(`error`))},()=>{},b.data?.masterYearGroup?.value===0&&e.masterYearGroup?.value!==0))}function Q(e){y(s,P.resendActivationEmail(t.customerId,e.id,()=>{_.logUserAction(e,{...t.analyticsOptions,actionType:g.SendEmail,descriptor:m.ActivateUser}),r(`activation`)},()=>{o.error(Z(`activationEmailError`))}))}function _e(e){y(s,P.sendPasswordResetEmail(t.customerId,e.id,()=>{_.logUserAction(e,{...t.analyticsOptions,actionType:g.SendEmail,descriptor:m.ResetPasswordEmail}),r(`reset-password`)},()=>{o.error(Z(`passwordResetEmailError`))}))}function $(e){y(s,P.resendVerificationEmail(t.customerId,e.id,()=>{_.logUserAction(e,{...t.analyticsOptions,actionType:g.SendEmail,descriptor:m.VerifyEmail}),r(`verification`)},()=>{o.error(Z(`verificationEmailError`))}))}let ve=!!h.data&&!!b.data&&!!w.data&&!!E.data&&!!j.data&&!!M.data&&(!U||!!W.data);return h.hasError||b.hasError||w.hasError||E.hasError||j.hasError||M.hasError?(0,H.jsx)(he,{customer:h,user:b,customerAppLink:q}):ve?(0,H.jsxs)(ce.Provider,{value:se.Curator,children:[p.data?(0,H.jsx)(ge,{customers:p.data,currentCustomer:h.data,userType:K,userId:t.id,setCursor:a}):(0,H.jsxs)(`div`,{className:`d-flex justify-content-center align-items-center`,style:{height:`100px`},children:[` `,(0,H.jsx)(T,{as:`div`,animation:`border`,role:`status`})]}),(0,H.jsxs)(`h1`,{className:`h6 mb-0`,children:[h.data.name,` - `,h.data.crmId]}),(0,H.jsx)(`div`,{className:`my-2`,children:(0,H.jsx)(C,{appLink:q,backToName:K===x.Learner?`Students`:`Staff`})}),(0,H.jsx)(`div`,{className:`d-flex`,children:(0,H.jsx)(oe,{user:b.data,currentUser:w.data,className:`mb-2`})}),(0,H.jsx)(ue,{user:b.data,userType:K,yearGroups:K===x.Learner?E.data:null,initialValues:I(b.data,t.customerId),initialErrors:N.getInitialErrorsForInvalidYearGroups(b.data.masterYearGroup),onSubmit:Y,onClickCancel:()=>e.trigger(q),currentUser:w.data,emailRequired:K===x.Staff,showActions:!0,appLinks:le(t.customerId,K),onClickResendActivationEmail:Q,onClickSendResetEmail:_e,onClickSendVerificationEmail:$,showDisplayNameField:K===x.Staff,passwordPolicy:j.data,canEditSsoFields:l(f.UsersSsoUpdate),products:B.data?.map(e=>e.id)??[],hasUserCredit:U&&G,hasOrg:!!h.data?.organisation,canEditSuperAdmin:!0}),G&&W.data&&(0,H.jsx)(me,{userCredit:W.data}),(0,H.jsx)(`hr`,{}),(0,H.jsx)(F,{user:b.data}),(0,H.jsx)(`hr`,{}),(0,H.jsx)(fe,{user:b.data}),(0,H.jsx)(`hr`,{}),(0,H.jsx)(de,{user:b.data}),!!O.data&&(0,H.jsx)(X,{userWorkspaceUsage:O.data}),!!D.data&&(0,H.jsx)(z,{playlists:D.data}),!!n&&(0,H.jsx)(pe,{emailType:n,emailSentImageUrl:ae.UserManager.EMAIL_SENT,closePopup:()=>r(null)})]}):(0,H.jsx)(`div`,{className:`py-5`,children:(0,H.jsx)(ie,{})})}export{Q as EditUserView};
2
+ //# sourceMappingURL=CAo_C8em2.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CbaobIxf2.chunk.js","names":[],"sources":["../../../../../../../../node_modules/react-bootstrap/esm/Badge.js","../../../../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/UserCreatedDate.tsx","../../../../../../../libs/shared/src/apps/user-manager/components/user-updated-success/UserUpdatedSuccess.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/components/user-credit/UserCredit.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/components/edit-user-error-view/EditUserErrorView.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/components/other-customers/OtherCustomers.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/components/user-workspace-usage-summary/UserWorkspaceUsageSummary.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/EditUserView.tsx"],"sourcesContent":["\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Badge = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n bg = 'primary',\n pill = false,\n text,\n className,\n as: Component = 'span',\n ...props\n}, ref) => {\n const prefix = useBootstrapPrefix(bsPrefix, 'badge');\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, prefix, pill && `rounded-pill`, text && `text-${text}`, bg && `bg-${bg}`)\n });\n});\nBadge.displayName = 'Badge';\nexport default Badge;","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { User } from 'libs/shared/interfaces';\n\ninterface UserCreatedDateProps {\n user: User;\n}\n\nconst FORMATTER = 'YYYY-MM-DD';\n\nexport const UserCreatedDate = (props: UserCreatedDateProps) => {\n const createdfromNow = props.user.dateCreated ? DateHelper.fromNow(props.user.dateCreated) : '-';\n const modifiedfromNow = props.user.dateModified ? DateHelper.fromNow(props.user.dateModified) : '-';\n\n return (\n <div>\n <div className='d-flex flex-column'>\n <small>\n Date created\n </small>\n <Tooltip title={DateHelper.format(props.user.dateCreated, FORMATTER)} spanHack spanHackClassName='w-fit'>\n {createdfromNow}\n </Tooltip>\n </div>\n <hr/>\n <div className='d-flex flex-column'>\n Date modified\n <Tooltip title={DateHelper.format(props.user.dateModified, FORMATTER)} spanHack spanHackClassName='w-fit'>\n {modifiedfromNow}\n </Tooltip>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'userManager.userUpdatedSuccess';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport type UserEmailType = 'activation' | 'verification' | 'reset-password';\n\nfunction getTitle(emailType: UserEmailType): string {\n switch (emailType) {\n case 'activation':\n return getPhrase('activationEmailSentTitle');\n case 'verification':\n return getPhrase('verificationEmailSentTitle');\n case 'reset-password':\n return getPhrase('resetPasswordEmailSentTitle');\n }\n}\n\nfunction getBody(emailType: UserEmailType): string {\n switch (emailType) {\n case 'activation':\n return getPhrase('activationEmailSentBody');\n case 'verification':\n return getPhrase('verificationEmailSentBody');\n case 'reset-password':\n return getPhrase('resetPasswordEmailSentBody');\n }\n}\n\ninterface UserUpdatedSuccessProps {\n emailType: UserEmailType;\n emailSentImageUrl: string;\n}\n\nexport function UserUpdatedSuccess(props: PropsWithPopupViewProps<UserUpdatedSuccessProps>): JSX.Element {\n return (\n <Popup\n title={getTitle(props.emailType)}\n closePopup={props.closePopup}\n >\n <div className='d-flex justify-content-center w-50 mx-auto pb-3'>\n <img\n src={props.emailSentImageUrl}\n alt=''\n role='presentation'\n className='w-100'\n />\n </div>\n <p>\n {getBody(props.emailType)}\n </p>\n </Popup>\n );\n}\n","import React from 'react';\n\nimport { UserCredit } from 'libs/shared/interfaces';\n\ninterface UserCreditSectionProps {\n userCredit: UserCredit;\n}\n\nexport function UserCreditSection(props: UserCreditSectionProps): JSX.Element {\n return (\n <div className='mt-2'>\n <hr />\n <h6>Daily credit limit</h6>\n <p>{props.userCredit.creditLimit}</p>\n </div>\n );\n}\n","import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { Customer, User } from 'libs/shared/interfaces';\n\nimport { BackButton } from 'shared/components';\n\ninterface EditUserErrorViewProps {\n customer: Flight.Response<Customer>;\n user: Flight.Response<User>;\n customerAppLink: Core.AppLink;\n}\n\nexport function EditUserErrorView(props: EditUserErrorViewProps): JSX.Element {\n let errorMessage = 'An error occurred.';\n\n if (props.user.statusCode === HttpStatus.NotFound)\n errorMessage = 'User could not be found';\n\n if (props.customer.statusCode === HttpStatus.NotFound)\n errorMessage = 'Customer could not be found';\n\n return (\n <>\n {props.customer.data && <h1 className='h6 mb-0'>{props.customer.data.name} - {props.customer.data.crmId}</h1>}\n <div className='my-2'>\n <BackButton appLink={props.customerAppLink} />\n </div>\n <div className='py-3'>\n {errorMessage}\n </div>\n </>\n );\n}\n","import React from 'react';\nimport { Badge } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { Customer, CustomerCollection } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels } from 'shared/constants';\n\nconst SPLIT_LIST_NUMBER = 13;\n\ninterface OtherCustomersProps {\n customers: CustomerCollection;\n currentCustomer: Customer;\n userType: UserGroup;\n userId: string;\n setCursor: (cursor: string) => void;\n}\n\nexport function OtherCustomers(props: OtherCustomersProps): JSX.Element {\n if (!props.customers.data || props.customers.data.length === 0)\n return <></>;\n\n if (props.customers.data.length === 1) {\n const customer = ArrayHelper.first(props.customers.data);\n\n if (customer.id.toString() === props.currentCustomer.id.toString())\n return <></>;\n }\n\n function getAppLink(customer: Customer): Core.AppLink {\n return {\n application: AppChannels.CUSTOMERS,\n action: Actions.Customers.EDIT_USER,\n args: [ customer.id, props.userId ],\n params: { userType: props.userType }\n };\n }\n\n function getRemoveFromCustomerAppLink(customer: Customer): Core.AppLink {\n return {\n application: AppChannels.CUSTOMERS,\n action: Actions.Customers.REMOVE_USER_FROM_CUSTOMER,\n args: [ customer.id, props.userId ]\n };\n }\n\n const Items = ({ items, right }: { items: Customer[], right?: boolean }) => {\n return (\n <ul className='list-unstyled'>\n {items.map((c, i) => {\n const last = i + 1 === items.length;\n let className = 'border w-100 p-2 d-flex justify-content-between';\n\n if (!last)\n className += ' border-bottom-0';\n\n if (right)\n className += ' border-start-0';\n\n return (\n <li key={i} className={className}>\n <AppLink appLink={getAppLink(c)}>\n {c.name} ({c.crmId})\n {c.id.toString() === props.currentCustomer.id.toString() &&\n <Badge bg='secondary' className='ms-1'>Current customer</Badge>\n }\n </AppLink>\n <Tooltip title={`Remove user from ${c.name}`} spanHack spanHackClassName='ms-1'>\n <AppLink appLink={getRemoveFromCustomerAppLink(c)}>\n <SvgContainer svg={DeleteSvg} size={SvgContainerSize.Small}/>\n </AppLink>\n </Tooltip>\n </li>\n );\n })}\n </ul>\n );\n };\n\n const addToAnotherCustomerAppLink: Core.AppLink = {\n application: AppChannels.CUSTOMERS,\n action: Actions.Customers.ADD_USER_TO_CUSTOMER,\n args: [ props.currentCustomer.id, props.userId ]\n };\n\n return (\n <div className='mt-2'>\n <h6>User's other customers</h6>\n <p>\n This user exists in multiple customers. This user's details are currently scoped to&nbsp;\n <strong>{props.currentCustomer.name}</strong> ({props.currentCustomer.crmId}).\n Details such as year level are representative of this user's data within this customer.\n </p>\n <div className='row m-0 p-0'>\n <div className='col m-0 p-0'>\n <Items items={props.customers.data.slice(0, SPLIT_LIST_NUMBER)} />\n </div>\n <div className='col m-0 p-0'>\n <Items items={props.customers.data.slice(SPLIT_LIST_NUMBER)} right />\n </div>\n </div>\n \n <div className='d-flex justify-content-between mt-1'>\n <AppLink appLink={addToAnotherCustomerAppLink}>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small}/>\n Add user to another customer\n </AppLink>\n {(props.customers.pagination?.cursors?.next || props.customers.pagination?.cursors?.previous) &&\n <Pagination\n cursors={props.customers.pagination?.cursors}\n buttonVariant='outline-dark'\n onClick={props.setCursor}\n />\n }\n </div>\n <hr />\n </div>\n );\n}\n","import React from 'react';\n\nimport { UserWorkspaceUsage } from 'shared/interfaces';\n\nconst INFINITE_ALLOCATION = Number.MAX_SAFE_INTEGER;\n\ninterface UserWorkspaceUsageSummaryProps {\n userWorkspaceUsage: UserWorkspaceUsage;\n}\n\nexport function UserWorkspaceUsageSummary(props: UserWorkspaceUsageSummaryProps): JSX.Element {\n const { allocationInBytes = 0, sizeInBytes = 0 } = props.userWorkspaceUsage.workspaceSizeAllocation || {};\n\n const hasInfiniteAllocation = allocationInBytes === INFINITE_ALLOCATION;\n\n const allocationInGb = (allocationInBytes / 1024 / 1024 / 1024).toFixed(0);\n const usageInGb = (sizeInBytes / 1024 / 1024 / 1024).toFixed(2);\n\n const percentageUsed = (sizeInBytes / allocationInBytes * 100).toFixed(2);\n\n return (\n <div className='mt-2'>\n <hr />\n <h6>Workspace</h6>\n <p className='m-0'>No. of videos: {props.userWorkspaceUsage.videoCount}</p>\n <p className='m-0'>No. of clips: {props.userWorkspaceUsage.clipCount}</p>\n <p className='m-0'>No. of interactives: {props.userWorkspaceUsage.interactiveCount}</p>\n <p className='m-0'>Allocation: {hasInfiniteAllocation ? 'Unlimited' : `${allocationInGb} GB`}</p>\n <p className='m-0'>Allocation used: {usageInGb} GB</p>\n {!hasInfiniteAllocation &&\n <p className='m-0'>Percentage of allocation used: {percentageUsed}%</p>\n }\n </div>\n );\n}\n","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EmailDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { EditUserDetails } from 'libs/shared/apps/user-manager/components/edit-user-details/EditUserDetails';\nimport { JobTitle } from 'libs/shared/apps/user-manager/components/user-list-items/components/JobTitle';\nimport { LastActive } from 'libs/shared/apps/user-manager/components/user-list-items/components/LastActive';\nimport { UserCreatedDate } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserCreatedDate';\nimport { UserStatusBadge } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserStatusBadge';\nimport { UserEmailType, UserUpdatedSuccess } from 'libs/shared/apps/user-manager/components/user-updated-success/UserUpdatedSuccess';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { FormSubmissionOptions } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CuratorUser, CurrentUser, Customer, CustomerCollection, Playlist, Product, PropsWithAnalyticsOptions, User, UserCredit, YearGroup } from 'libs/shared/interfaces';\n\nimport { BackButton } from 'shared/components';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { UserWorkspaceUsage } from 'shared/interfaces';\n\nimport { CustomerRequests } from 'apps/crm-studio/flight-requests/CustomerRequests';\nimport { getUserManagerAppLinks } from 'apps/crm-studio/helpers/CuratorUserManagerAppLinks';\nimport { UserCreditSection } from 'apps/crm-studio/views/users/edit-user/components/user-credit/UserCredit';\nimport { CuratorUserRequests } from 'apps/users/flight-requests/CuratorUserRequests';\n\nimport { EditUserErrorView } from './components/edit-user-error-view/EditUserErrorView';\nimport { OtherCustomers } from './components/other-customers/OtherCustomers';\nimport { UserPlaylistsSummary } from './components/user-playlists-summary/UserPlaylistsSummary';\nimport { UserWorkspaceUsageSummary } from './components/user-workspace-usage-summary/UserWorkspaceUsageSummary';\nimport { getCustomerAppLink, getUserInitialValues, useRedirectOnDelete } from './EditUserUtils';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.editUser');\n\ntype EditUserViewProps = PropsWithAnalyticsOptions<{\n customerId: string,\n id: string,\n returnAppLinkCursor?: string\n}>;\n\nexport function EditUserView(props: EditUserViewProps): React.ReactElement {\n const [ emailType, setEmailType ] = React.useState<UserEmailType>(null);\n const [ otherCustomersCursor, setOtherCustomersCursor ] = React.useState('');\n\n const alerts = useAlerts();\n const dispatch = useDispatch();\n const fetchAsync = Flight.useGetFetchAsync();\n const { hasPermissions } = useCuratorPermissions();\n\n const userRequest = CustomerRequests.getUser(props.customerId, props.id);\n\n const otherCustomers = Flight.useBasicFetch<CustomerCollection>(\n CustomerRequests.otherCustomers(props.customerId, props.id, otherCustomersCursor)\n );\n const customer = Flight.useBasicFetch<Customer>(CustomerRequests.customer(props.customerId));\n const user = Flight.useBasicFetch<User>(userRequest);\n const currentUser = Flight.useBasicFetch<CurrentUser | CuratorUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(CustomerRequests.yearGroups(props.customerId));\n const playlists = Flight.useBasicFetch<Playlist[]>(CuratorUserRequests.userPlaylistsAll(props.id));\n const workspaceUsage = Flight.useBasicFetch<UserWorkspaceUsage>(\n CuratorUserRequests.userWorkspaceUsage(props.customerId, props.id)\n );\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(\n CustomerRequests.passwordPolicy(props.customerId)\n );\n const authMethods = Flight.useBasicFetch(CustomerRequests.getAuthenticationMethodsByUserIds(\n props.customerId,\n [props.id],\n userRequest.normalizeOptions?.namespace\n ));\n const products = Flight.useBasicFetch<Product[]>(CustomerRequests.getCustomerProducts(props.customerId));\n \n // US customers are not supported to have user credit\n const isNotUs = customer.data?.contentRegion && customer.data?.contentRegion.systemName !== ContentRegion.US;\n const userCredit = Flight.useBasicFetch<UserCredit>(\n isNotUs && CustomerRequests.getCustomerUserCredit(props.customerId, props.id)\n );\n const canEditUserCredit = hasPermissions(CuratorPermissionName.UserCreditUpdate);\n\n const userType = user.data?.userType;\n\n const customerAppLink = getCustomerAppLink(props.customerId, userType, props.returnAppLinkCursor);\n\n useRedirectOnDelete(user, props.customerId, props.returnAppLinkCursor);\n\n function validateUser(_user: EditUserRequest): Promise<ErroredUsers> {\n const data = UserManagerHelper.formatCreateOrValidateUserRequest([_user], userType, props.customerId);\n\n return fetchAsync(CustomerRequests.bulkValidate(data, false, props.customerId));\n }\n\n async function saveUser(_user: EditUserRequest, onDone: (options?: FormSubmissionOptions) => void): Promise<void> {\n if (user.data.status === ObjectStatus.Disabled)\n return;\n\n const errors = await validateUser(_user);\n\n const isValid = UserManagerHelper.handleAsyncErrors(errors, _user, user.data, onDone);\n\n if (!isValid)\n return;\n\n const data = UserManagerHelper.formatEditUserRequest(_user);\n\n Flight.fetch(dispatch, CustomerRequests.updateUser(\n props.customerId,\n data,\n currentUser.data.id,\n updatedUser => {\n AnalyticsHelper.logUserAction(updatedUser, props.analyticsOptions);\n\n const emailHasChanged = user.data.email !== updatedUser.email;\n\n if (emailHasChanged) {\n if (updatedUser.status === ObjectStatus.Inactive)\n resendActivationEmail(updatedUser);\n\n if (updatedUser.status === ObjectStatus.Active)\n resendVerificationEmail(updatedUser);\n \n return;\n }\n\n alerts.success(getPhrase('success'));\n },\n () => {\n alerts.error(getPhrase('error'));\n },\n () => {},\n user.data?.masterYearGroup?.value === 0 && _user.masterYearGroup?.value !== 0\n ));\n }\n\n function resendActivationEmail(_user: User): void {\n Flight.fetch(dispatch, CustomerRequests.resendActivationEmail(props.customerId, _user.id, () => {\n AnalyticsHelper.logUserAction(_user, {\n ...props.analyticsOptions,\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.ActivateUser\n });\n\n setEmailType('activation');\n }, () => {\n alerts.error(getPhrase('activationEmailError'));\n }));\n }\n\n function onClickSendResetEmail(_user: User): void {\n Flight.fetch(dispatch, CustomerRequests.sendPasswordResetEmail(props.customerId, _user.id, () => {\n AnalyticsHelper.logUserAction(_user, {\n ...props.analyticsOptions,\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.ResetPasswordEmail\n });\n\n setEmailType('reset-password');\n }, () => {\n alerts.error(getPhrase('passwordResetEmailError'));\n }));\n }\n\n function resendVerificationEmail(_user: User): void {\n Flight.fetch(dispatch, CustomerRequests.resendVerificationEmail(props.customerId, _user.id, () => {\n AnalyticsHelper.logUserAction(_user, {\n ...props.analyticsOptions,\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.VerifyEmail\n });\n\n setEmailType('verification');\n }, () => {\n alerts.error(getPhrase('verificationEmailError'));\n }));\n }\n\n const isLoaded =\n !!customer.data &&\n !!user.data &&\n !!currentUser.data &&\n !!yearGroups.data &&\n !!passwordPolicy.data &&\n !!authMethods.data &&\n (!isNotUs || !!userCredit.data);\n\n const hasError =\n customer.hasError ||\n user.hasError ||\n currentUser.hasError ||\n yearGroups.hasError ||\n passwordPolicy.hasError ||\n authMethods.hasError;\n\n if (hasError)\n return <EditUserErrorView customer={customer} user={user} customerAppLink={customerAppLink} />;\n\n if (!isLoaded)\n return <div className='py-5'><PopupLoadingSpinner /></div>;\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Curator}>\n {otherCustomers.data ?\n <OtherCustomers\n customers={otherCustomers.data}\n currentCustomer={customer.data}\n userType={userType}\n userId={props.id}\n setCursor={setOtherCustomersCursor}\n /> :\n <div\n className='d-flex justify-content-center align-items-center'\n style={{ height: '100px' }}> {/* Known height of 25 items */}\n <Spinner as='div' animation='border' role='status' />\n </div>\n }\n \n <h1 className='h6 mb-0'>{customer.data.name} - {customer.data.crmId}</h1>\n <div className='my-2'>\n <BackButton\n appLink={customerAppLink}\n backToName={userType === UserGroup.Learner ? 'Students' : 'Staff'}\n />\n </div>\n <div className='d-flex'>\n <UserStatusBadge user={user.data} currentUser={currentUser.data as CurrentUser} className='mb-2' />\n </div>\n <EditUserDetails\n user={user.data}\n userType={userType}\n yearGroups={userType === UserGroup.Learner ? yearGroups.data : null}\n initialValues={getUserInitialValues(user.data, props.customerId)}\n initialErrors={UserManagerHelper.getInitialErrorsForInvalidYearGroups(user.data.masterYearGroup)}\n onSubmit={saveUser}\n onClickCancel={() => Core.AppLinkHelper.trigger(customerAppLink)}\n currentUser={currentUser.data as CurrentUser}\n // TODO: Update to require this based on if the customer has primary product access\n emailRequired={userType === UserGroup.Staff}\n \n showActions\n appLinks={getUserManagerAppLinks(props.customerId, userType)}\n onClickResendActivationEmail={resendActivationEmail}\n onClickSendResetEmail={onClickSendResetEmail}\n onClickSendVerificationEmail={resendVerificationEmail}\n showDisplayNameField={userType === UserGroup.Staff}\n passwordPolicy={passwordPolicy.data}\n canEditSsoFields={hasPermissions(CuratorPermissionName.UsersSsoUpdate)}\n products={products.data?.map(p => p.id) ?? []}\n hasUserCredit={isNotUs && canEditUserCredit}\n hasOrg={!!customer.data?.organisation}\n canEditSuperAdmin\n />\n\n {canEditUserCredit && userCredit.data && <UserCreditSection userCredit={userCredit.data} />}\n\n <hr />\n <LastActive user={user.data} />\n <hr />\n\n <UserCreatedDate user={user.data} />\n <hr />\n\n <JobTitle user={user.data} />\n {!!workspaceUsage.data &&\n <UserWorkspaceUsageSummary userWorkspaceUsage={workspaceUsage.data} />\n }\n {!!playlists.data &&\n <UserPlaylistsSummary playlists={playlists.data} />\n }\n {!!emailType &&\n <UserUpdatedSuccess\n emailType={emailType}\n emailSentImageUrl={ImageUrls.UserManager.EMAIL_SENT}\n closePopup={() => setEmailType(null)}\n />\n }\n </UserManagerClientContext.Provider>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
1
+ {"version":3,"file":"CAo_C8em2.chunk.js","names":[],"sources":["../../../../../../../../node_modules/react-bootstrap/esm/Badge.js","../../../../../../../libs/shared/src/apps/user-manager/components/user-list-items/components/UserCreatedDate.tsx","../../../../../../../libs/shared/src/apps/user-manager/components/user-updated-success/UserUpdatedSuccess.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/components/user-credit/UserCredit.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/components/edit-user-error-view/EditUserErrorView.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/components/other-customers/OtherCustomers.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/components/user-workspace-usage-summary/UserWorkspaceUsageSummary.tsx","../../../../../src/apps/crm-studio/views/users/edit-user/EditUserView.tsx"],"sourcesContent":["\"use client\";\n\nimport classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Badge = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n bg = 'primary',\n pill = false,\n text,\n className,\n as: Component = 'span',\n ...props\n}, ref) => {\n const prefix = useBootstrapPrefix(bsPrefix, 'badge');\n return /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, prefix, pill && `rounded-pill`, text && `text-${text}`, bg && `bg-${bg}`)\n });\n});\nBadge.displayName = 'Badge';\nexport default Badge;","import React from 'react';\n\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { User } from 'libs/shared/interfaces';\n\ninterface UserCreatedDateProps {\n user: User;\n}\n\nconst FORMATTER = 'YYYY-MM-DD';\n\nexport const UserCreatedDate = (props: UserCreatedDateProps) => {\n const createdfromNow = props.user.dateCreated ? DateHelper.fromNow(props.user.dateCreated) : '-';\n const modifiedfromNow = props.user.dateModified ? DateHelper.fromNow(props.user.dateModified) : '-';\n\n return (\n <div>\n <div className='d-flex flex-column'>\n <small>\n Date created\n </small>\n <Tooltip title={DateHelper.format(props.user.dateCreated, FORMATTER)} spanHack spanHackClassName='w-fit'>\n {createdfromNow}\n </Tooltip>\n </div>\n <hr/>\n <div className='d-flex flex-column'>\n Date modified\n <Tooltip title={DateHelper.format(props.user.dateModified, FORMATTER)} spanHack spanHackClassName='w-fit'>\n {modifiedfromNow}\n </Tooltip>\n </div>\n </div>\n );\n};\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nconst namespace = 'userManager.userUpdatedSuccess';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport type UserEmailType = 'activation' | 'verification' | 'reset-password';\n\nfunction getTitle(emailType: UserEmailType): string {\n switch (emailType) {\n case 'activation':\n return getPhrase('activationEmailSentTitle');\n case 'verification':\n return getPhrase('verificationEmailSentTitle');\n case 'reset-password':\n return getPhrase('resetPasswordEmailSentTitle');\n }\n}\n\nfunction getBody(emailType: UserEmailType): string {\n switch (emailType) {\n case 'activation':\n return getPhrase('activationEmailSentBody');\n case 'verification':\n return getPhrase('verificationEmailSentBody');\n case 'reset-password':\n return getPhrase('resetPasswordEmailSentBody');\n }\n}\n\ninterface UserUpdatedSuccessProps {\n emailType: UserEmailType;\n emailSentImageUrl: string;\n}\n\nexport function UserUpdatedSuccess(props: PropsWithPopupViewProps<UserUpdatedSuccessProps>): JSX.Element {\n return (\n <Popup\n title={getTitle(props.emailType)}\n closePopup={props.closePopup}\n >\n <div className='d-flex justify-content-center w-50 mx-auto pb-3'>\n <img\n src={props.emailSentImageUrl}\n alt=''\n role='presentation'\n className='w-100'\n />\n </div>\n <p>\n {getBody(props.emailType)}\n </p>\n </Popup>\n );\n}\n","import React from 'react';\n\nimport { UserCredit } from 'libs/shared/interfaces';\n\ninterface UserCreditSectionProps {\n userCredit: UserCredit;\n}\n\nexport function UserCreditSection(props: UserCreditSectionProps): JSX.Element {\n return (\n <div className='mt-2'>\n <hr />\n <h6>Daily credit limit</h6>\n <p>{props.userCredit.creditLimit}</p>\n </div>\n );\n}\n","import React from 'react';\n\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { Customer, User } from 'libs/shared/interfaces';\n\nimport { BackButton } from 'shared/components';\n\ninterface EditUserErrorViewProps {\n customer: Flight.Response<Customer>;\n user: Flight.Response<User>;\n customerAppLink: Core.AppLink;\n}\n\nexport function EditUserErrorView(props: EditUserErrorViewProps): JSX.Element {\n let errorMessage = 'An error occurred.';\n\n if (props.user.statusCode === HttpStatus.NotFound)\n errorMessage = 'User could not be found';\n\n if (props.customer.statusCode === HttpStatus.NotFound)\n errorMessage = 'Customer could not be found';\n\n return (\n <>\n {props.customer.data && <h1 className='h6 mb-0'>{props.customer.data.name} - {props.customer.data.crmId}</h1>}\n <div className='my-2'>\n <BackButton appLink={props.customerAppLink} />\n </div>\n <div className='py-3'>\n {errorMessage}\n </div>\n </>\n );\n}\n","import React from 'react';\nimport { Badge } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/core';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { DeleteSvg } from 'libs/shared/images/svg/actions/DeleteSvg';\nimport { PlusSvg } from 'libs/shared/images/svg/actions/PlusSvg';\nimport { Customer, CustomerCollection } from 'libs/shared/interfaces';\n\nimport { Actions, AppChannels } from 'shared/constants';\n\nconst SPLIT_LIST_NUMBER = 13;\n\ninterface OtherCustomersProps {\n customers: CustomerCollection;\n currentCustomer: Customer;\n userType: UserGroup;\n userId: string;\n setCursor: (cursor: string) => void;\n}\n\nexport function OtherCustomers(props: OtherCustomersProps): JSX.Element {\n if (!props.customers.data || props.customers.data.length === 0)\n return <></>;\n\n if (props.customers.data.length === 1) {\n const customer = ArrayHelper.first(props.customers.data);\n\n if (customer.id.toString() === props.currentCustomer.id.toString())\n return <></>;\n }\n\n function getAppLink(customer: Customer): Core.AppLink {\n return {\n application: AppChannels.CUSTOMERS,\n action: Actions.Customers.EDIT_USER,\n args: [ customer.id, props.userId ],\n params: { userType: props.userType }\n };\n }\n\n function getRemoveFromCustomerAppLink(customer: Customer): Core.AppLink {\n return {\n application: AppChannels.CUSTOMERS,\n action: Actions.Customers.REMOVE_USER_FROM_CUSTOMER,\n args: [ customer.id, props.userId ]\n };\n }\n\n const Items = ({ items, right }: { items: Customer[], right?: boolean }) => {\n return (\n <ul className='list-unstyled'>\n {items.map((c, i) => {\n const last = i + 1 === items.length;\n let className = 'border w-100 p-2 d-flex justify-content-between';\n\n if (!last)\n className += ' border-bottom-0';\n\n if (right)\n className += ' border-start-0';\n\n return (\n <li key={i} className={className}>\n <AppLink appLink={getAppLink(c)}>\n {c.name} ({c.crmId})\n {c.id.toString() === props.currentCustomer.id.toString() &&\n <Badge bg='secondary' className='ms-1'>Current customer</Badge>\n }\n </AppLink>\n <Tooltip title={`Remove user from ${c.name}`} spanHack spanHackClassName='ms-1'>\n <AppLink appLink={getRemoveFromCustomerAppLink(c)}>\n <SvgContainer svg={DeleteSvg} size={SvgContainerSize.Small}/>\n </AppLink>\n </Tooltip>\n </li>\n );\n })}\n </ul>\n );\n };\n\n const addToAnotherCustomerAppLink: Core.AppLink = {\n application: AppChannels.CUSTOMERS,\n action: Actions.Customers.ADD_USER_TO_CUSTOMER,\n args: [ props.currentCustomer.id, props.userId ]\n };\n\n return (\n <div className='mt-2'>\n <h6>User's other customers</h6>\n <p>\n This user exists in multiple customers. This user's details are currently scoped to&nbsp;\n <strong>{props.currentCustomer.name}</strong> ({props.currentCustomer.crmId}).\n Details such as year level are representative of this user's data within this customer.\n </p>\n <div className='row m-0 p-0'>\n <div className='col m-0 p-0'>\n <Items items={props.customers.data.slice(0, SPLIT_LIST_NUMBER)} />\n </div>\n <div className='col m-0 p-0'>\n <Items items={props.customers.data.slice(SPLIT_LIST_NUMBER)} right />\n </div>\n </div>\n \n <div className='d-flex justify-content-between mt-1'>\n <AppLink appLink={addToAnotherCustomerAppLink}>\n <SvgContainer svg={PlusSvg} size={SvgContainerSize.Small}/>\n Add user to another customer\n </AppLink>\n {(props.customers.pagination?.cursors?.next || props.customers.pagination?.cursors?.previous) &&\n <Pagination\n cursors={props.customers.pagination?.cursors}\n buttonVariant='outline-dark'\n onClick={props.setCursor}\n />\n }\n </div>\n <hr />\n </div>\n );\n}\n","import React from 'react';\n\nimport { UserWorkspaceUsage } from 'shared/interfaces';\n\nconst INFINITE_ALLOCATION = Number.MAX_SAFE_INTEGER;\n\ninterface UserWorkspaceUsageSummaryProps {\n userWorkspaceUsage: UserWorkspaceUsage;\n}\n\nexport function UserWorkspaceUsageSummary(props: UserWorkspaceUsageSummaryProps): JSX.Element {\n const { allocationInBytes = 0, sizeInBytes = 0 } = props.userWorkspaceUsage.workspaceSizeAllocation || {};\n\n const hasInfiniteAllocation = allocationInBytes === INFINITE_ALLOCATION;\n\n const allocationInGb = (allocationInBytes / 1024 / 1024 / 1024).toFixed(0);\n const usageInGb = (sizeInBytes / 1024 / 1024 / 1024).toFixed(2);\n\n const percentageUsed = (sizeInBytes / allocationInBytes * 100).toFixed(2);\n\n return (\n <div className='mt-2'>\n <hr />\n <h6>Workspace</h6>\n <p className='m-0'>No. of videos: {props.userWorkspaceUsage.videoCount}</p>\n <p className='m-0'>No. of clips: {props.userWorkspaceUsage.clipCount}</p>\n <p className='m-0'>No. of interactives: {props.userWorkspaceUsage.interactiveCount}</p>\n <p className='m-0'>Allocation: {hasInfiniteAllocation ? 'Unlimited' : `${allocationInGb} GB`}</p>\n <p className='m-0'>Allocation used: {usageInGb} GB</p>\n {!hasInfiniteAllocation &&\n <p className='m-0'>Percentage of allocation used: {percentageUsed}%</p>\n }\n </div>\n );\n}\n","import React from 'react';\nimport { Spinner } from 'react-bootstrap';\nimport { useDispatch } from 'react-redux';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EmailDescriptor, UserAction } from 'libs/analytics/interfaces';\n\nimport { EditUserDetails } from 'libs/shared/apps/user-manager/components/edit-user-details/EditUserDetails';\nimport { JobTitle } from 'libs/shared/apps/user-manager/components/user-list-items/components/JobTitle';\nimport { LastActive } from 'libs/shared/apps/user-manager/components/user-list-items/components/LastActive';\nimport { UserCreatedDate } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserCreatedDate';\nimport { UserStatusBadge } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserStatusBadge';\nimport { UserEmailType, UserUpdatedSuccess } from 'libs/shared/apps/user-manager/components/user-updated-success/UserUpdatedSuccess';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { EditUserRequest, ErroredUsers } from 'libs/shared/apps/user-manager/interfaces';\nimport { SecuritySettingsResponse } from 'libs/shared/apps/user-manager/interfaces/SecuritySettingsResponse';\nimport { UserManagerHelper } from 'libs/shared/apps/user-manager/utils/UserManagerHelper';\nimport { FormSubmissionOptions } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CuratorUser, CurrentUser, Customer, CustomerCollection, Playlist, Product, PropsWithAnalyticsOptions, User, UserCredit, YearGroup } from 'libs/shared/interfaces';\n\nimport { BackButton } from 'shared/components';\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks';\nimport { UserWorkspaceUsage } from 'shared/interfaces';\n\nimport { CustomerRequests } from 'apps/crm-studio/flight-requests/CustomerRequests';\nimport { getUserManagerAppLinks } from 'apps/crm-studio/helpers/CuratorUserManagerAppLinks';\nimport { UserCreditSection } from 'apps/crm-studio/views/users/edit-user/components/user-credit/UserCredit';\nimport { CuratorUserRequests } from 'apps/users/flight-requests/CuratorUserRequests';\n\nimport { EditUserErrorView } from './components/edit-user-error-view/EditUserErrorView';\nimport { OtherCustomers } from './components/other-customers/OtherCustomers';\nimport { UserPlaylistsSummary } from './components/user-playlists-summary/UserPlaylistsSummary';\nimport { UserWorkspaceUsageSummary } from './components/user-workspace-usage-summary/UserWorkspaceUsageSummary';\nimport { getCustomerAppLink, getUserInitialValues, useRedirectOnDelete } from './EditUserUtils';\n\nconst getPhrase = LanguageService.encloseNamespace('userManager.editUser');\n\ntype EditUserViewProps = PropsWithAnalyticsOptions<{\n customerId: string,\n id: string,\n returnAppLinkCursor?: string\n}>;\n\nexport function EditUserView(props: EditUserViewProps): React.ReactElement {\n const [ emailType, setEmailType ] = React.useState<UserEmailType>(null);\n const [ otherCustomersCursor, setOtherCustomersCursor ] = React.useState('');\n\n const alerts = useAlerts();\n const dispatch = useDispatch();\n const fetchAsync = Flight.useGetFetchAsync();\n const { hasPermissions } = useCuratorPermissions();\n\n const userRequest = CustomerRequests.getUser(props.customerId, props.id);\n\n const otherCustomers = Flight.useBasicFetch<CustomerCollection>(\n CustomerRequests.otherCustomers(props.customerId, props.id, otherCustomersCursor)\n );\n const customer = Flight.useBasicFetch<Customer>(CustomerRequests.customer(props.customerId));\n const user = Flight.useBasicFetch<User>(userRequest);\n const currentUser = Flight.useBasicFetch<CurrentUser | CuratorUser>(UserRequests.currentUser());\n const yearGroups = Flight.useBasicFetch<YearGroup[]>(CustomerRequests.yearGroups(props.customerId));\n const playlists = Flight.useBasicFetch<Playlist[]>(CuratorUserRequests.userPlaylistsAll(props.id));\n const workspaceUsage = Flight.useBasicFetch<UserWorkspaceUsage>(\n CuratorUserRequests.userWorkspaceUsage(props.customerId, props.id)\n );\n const passwordPolicy = Flight.useBasicFetch<SecuritySettingsResponse>(\n CustomerRequests.passwordPolicy(props.customerId)\n );\n const authMethods = Flight.useBasicFetch(CustomerRequests.getAuthenticationMethodsByUserIds(\n props.customerId,\n [props.id],\n userRequest.normalizeOptions?.namespace\n ));\n const products = Flight.useBasicFetch<Product[]>(CustomerRequests.getCustomerProducts(props.customerId));\n \n // US customers are not supported to have user credit\n const isNotUs = customer.data?.contentRegion && customer.data?.contentRegion.systemName !== ContentRegion.US;\n const userCredit = Flight.useBasicFetch<UserCredit>(\n isNotUs && CustomerRequests.getCustomerUserCredit(props.customerId, props.id)\n );\n const canEditUserCredit = hasPermissions(CuratorPermissionName.UserCreditUpdate);\n\n const userType = user.data?.userType;\n\n const customerAppLink = getCustomerAppLink(props.customerId, userType, props.returnAppLinkCursor);\n\n useRedirectOnDelete(user, props.customerId, props.returnAppLinkCursor);\n\n function validateUser(_user: EditUserRequest): Promise<ErroredUsers> {\n const data = UserManagerHelper.formatCreateOrValidateUserRequest([_user], userType, props.customerId);\n\n return fetchAsync(CustomerRequests.bulkValidate(data, false, props.customerId));\n }\n\n async function saveUser(_user: EditUserRequest, onDone: (options?: FormSubmissionOptions) => void): Promise<void> {\n if (user.data.status === ObjectStatus.Disabled)\n return;\n\n const errors = await validateUser(_user);\n\n const isValid = UserManagerHelper.handleAsyncErrors(errors, _user, user.data, onDone);\n\n if (!isValid)\n return;\n\n const data = UserManagerHelper.formatEditUserRequest(_user);\n\n Flight.fetch(dispatch, CustomerRequests.updateUser(\n props.customerId,\n data,\n currentUser.data.id,\n updatedUser => {\n AnalyticsHelper.logUserAction(updatedUser, props.analyticsOptions);\n\n const emailHasChanged = user.data.email !== updatedUser.email;\n\n if (emailHasChanged) {\n if (updatedUser.status === ObjectStatus.Inactive)\n resendActivationEmail(updatedUser);\n\n if (updatedUser.status === ObjectStatus.Active)\n resendVerificationEmail(updatedUser);\n \n return;\n }\n\n alerts.success(getPhrase('success'));\n },\n () => {\n alerts.error(getPhrase('error'));\n },\n () => {},\n user.data?.masterYearGroup?.value === 0 && _user.masterYearGroup?.value !== 0\n ));\n }\n\n function resendActivationEmail(_user: User): void {\n Flight.fetch(dispatch, CustomerRequests.resendActivationEmail(props.customerId, _user.id, () => {\n AnalyticsHelper.logUserAction(_user, {\n ...props.analyticsOptions,\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.ActivateUser\n });\n\n setEmailType('activation');\n }, () => {\n alerts.error(getPhrase('activationEmailError'));\n }));\n }\n\n function onClickSendResetEmail(_user: User): void {\n Flight.fetch(dispatch, CustomerRequests.sendPasswordResetEmail(props.customerId, _user.id, () => {\n AnalyticsHelper.logUserAction(_user, {\n ...props.analyticsOptions,\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.ResetPasswordEmail\n });\n\n setEmailType('reset-password');\n }, () => {\n alerts.error(getPhrase('passwordResetEmailError'));\n }));\n }\n\n function resendVerificationEmail(_user: User): void {\n Flight.fetch(dispatch, CustomerRequests.resendVerificationEmail(props.customerId, _user.id, () => {\n AnalyticsHelper.logUserAction(_user, {\n ...props.analyticsOptions,\n actionType: UserAction.SendEmail,\n descriptor: EmailDescriptor.VerifyEmail\n });\n\n setEmailType('verification');\n }, () => {\n alerts.error(getPhrase('verificationEmailError'));\n }));\n }\n\n const isLoaded =\n !!customer.data &&\n !!user.data &&\n !!currentUser.data &&\n !!yearGroups.data &&\n !!passwordPolicy.data &&\n !!authMethods.data &&\n (!isNotUs || !!userCredit.data);\n\n const hasError =\n customer.hasError ||\n user.hasError ||\n currentUser.hasError ||\n yearGroups.hasError ||\n passwordPolicy.hasError ||\n authMethods.hasError;\n\n if (hasError)\n return <EditUserErrorView customer={customer} user={user} customerAppLink={customerAppLink} />;\n\n if (!isLoaded)\n return <div className='py-5'><PopupLoadingSpinner /></div>;\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Curator}>\n {otherCustomers.data ?\n <OtherCustomers\n customers={otherCustomers.data}\n currentCustomer={customer.data}\n userType={userType}\n userId={props.id}\n setCursor={setOtherCustomersCursor}\n /> :\n <div\n className='d-flex justify-content-center align-items-center'\n style={{ height: '100px' }}> {/* Known height of 25 items */}\n <Spinner as='div' animation='border' role='status' />\n </div>\n }\n \n <h1 className='h6 mb-0'>{customer.data.name} - {customer.data.crmId}</h1>\n <div className='my-2'>\n <BackButton\n appLink={customerAppLink}\n backToName={userType === UserGroup.Learner ? 'Students' : 'Staff'}\n />\n </div>\n <div className='d-flex'>\n <UserStatusBadge user={user.data} currentUser={currentUser.data as CurrentUser} className='mb-2' />\n </div>\n <EditUserDetails\n user={user.data}\n userType={userType}\n yearGroups={userType === UserGroup.Learner ? yearGroups.data : null}\n initialValues={getUserInitialValues(user.data, props.customerId)}\n initialErrors={UserManagerHelper.getInitialErrorsForInvalidYearGroups(user.data.masterYearGroup)}\n onSubmit={saveUser}\n onClickCancel={() => Core.AppLinkHelper.trigger(customerAppLink)}\n currentUser={currentUser.data as CurrentUser}\n // TODO: Update to require this based on if the customer has primary product access\n emailRequired={userType === UserGroup.Staff}\n \n showActions\n appLinks={getUserManagerAppLinks(props.customerId, userType)}\n onClickResendActivationEmail={resendActivationEmail}\n onClickSendResetEmail={onClickSendResetEmail}\n onClickSendVerificationEmail={resendVerificationEmail}\n showDisplayNameField={userType === UserGroup.Staff}\n passwordPolicy={passwordPolicy.data}\n canEditSsoFields={hasPermissions(CuratorPermissionName.UsersSsoUpdate)}\n products={products.data?.map(p => p.id) ?? []}\n hasUserCredit={isNotUs && canEditUserCredit}\n hasOrg={!!customer.data?.organisation}\n canEditSuperAdmin\n />\n\n {canEditUserCredit && userCredit.data && <UserCreditSection userCredit={userCredit.data} />}\n\n <hr />\n <LastActive user={user.data} />\n <hr />\n\n <UserCreatedDate user={user.data} />\n <hr />\n\n <JobTitle user={user.data} />\n {!!workspaceUsage.data &&\n <UserWorkspaceUsageSummary userWorkspaceUsage={workspaceUsage.data} />\n }\n {!!playlists.data &&\n <UserPlaylistsSummary playlists={playlists.data} />\n }\n {!!emailType &&\n <UserUpdatedSuccess\n emailType={emailType}\n emailSentImageUrl={ImageUrls.UserManager.EMAIL_SENT}\n closePopup={() => setEmailType(null)}\n />\n }\n </UserManagerClientContext.Provider>\n );\n}\n"],"x_google_ignoreList":[0],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{t as r}from"./DEBg-sxL.chunk.js";import{t as i}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{G as a,K as o}from"./CN0FW5R_2.chunk.js";import{c as s}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as c}from"./Bt5qHBoM2.chunk.js";import{t as l}from"./Bv9Em12_.chunk.js";import{b as u}from"./CSSol6ro.chunk.js";import{n as d}from"./DalFHGv7.chunk.js";import{t as f}from"./OMMvCI-u.chunk.js";import{t as p}from"./BDwjs8qz.chunk.js";import{t as m}from"./BPLykIUZ.chunk.js";import{R as h,z as g}from"./DhN_Jc2z.chunk.js";import{t as _}from"./DUsXdKYh.chunk.js";import{t as v}from"./BPS1avvv.chunk.js";import"./DWYlfnTA.chunk.js";var y=t(e()),b=n();function x(e){let[t,n]=y.useState(!1),x=s(c.currentUser()),S=s(m.video(e.id)),C=s(o.getAssemblyLineVideo(e.id)),w=s(S.data&&h.createViewKey(S.data.id,g.MasterObject));return!S.data||!x.data||!w.hasCompleted||!C.hasCompleted?(0,b.jsx)(`div`,{className:`text-center py-5`,children:(0,b.jsx)(d,{as:`div`,animation:`border`})}):(0,b.jsxs)(`div`,{children:[!!x.data&&(0,b.jsx)(v,{videoId:e.id,activeAction:r.Videos.PREVIEW_VIDEO,currentUser:x.data}),!w.hasError&&S.data.status===p.Published&&(0,b.jsxs)(l,{variant:`info`,className:`mt-3 mb-1`,children:[`This video is `,(0,b.jsx)(`strong`,{children:`published`}),` and cannot be edited or deleted. You may archive it if you believe it should no longer be in use.`]}),!w.hasError&&S.data.status===p.Archived&&(0,b.jsxs)(l,{variant:`info`,className:`mt-3 mb-1`,children:[`This video is `,(0,b.jsx)(`strong`,{children:`archived`}),`. You may publish it again from the options menu.`]}),w.hasError&&(0,b.jsxs)(l,{variant:`danger`,className:`mt-3 mb-1`,children:[(0,b.jsx)(`p`,{children:`Your account doesn't have access to watch this video. Please login to an account with one of the following libraries`}),(0,b.jsx)(`ul`,{children:S.data?.libraries?.data?.map(e=>(0,b.jsx)(`li`,{children:e.description},e.id))})]}),(0,b.jsxs)(`div`,{className:`${t&&w.data?.viewKey?``:`d-none`}`,children:[(0,b.jsx)(u,{object:{name:S.data.name,status:S.data.status},actions:[{label:`Open in Content Pipeline`,svg:f,appLink:{application:i.ASSEMBLY_LINE,action:a.mapStageToAction(C.data?.stage),params:{query:S.data?.id}},button:!0,disabled:!C.data,tooltip:C.data?``:`Videp is not in the content pipeline`,className:`btn btn-outline-dark me-2`,openInNewTab:!0}],actionsDropdownClassName:`btn btn-outline-dark`,showStatus:!0}),(0,b.jsx)(_,{viewKey:w.data?.viewKey,playerApi:new URL(ClickView.Config.Urls.PlayerApi),hotkeyElQuerySelector:`body`,onReady:()=>n(!0),eventLogging:!1})]})]})}export{x as PreviewVideoView};
2
- //# sourceMappingURL=D_e7ctVq.chunk.js.map
1
+ import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{t as r}from"./DEBg-sxL.chunk.js";import{t as i}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{G as a,K as o}from"./CN0FW5R_2.chunk.js";import{c as s}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as c}from"./Bt5qHBoM2.chunk.js";import{t as l}from"./Bv9Em12_.chunk.js";import{b as u}from"./CSSol6ro.chunk.js";import{n as d}from"./DalFHGv7.chunk.js";import{t as f}from"./OMMvCI-u.chunk.js";import{t as p}from"./BDwjs8qz.chunk.js";import{t as m}from"./BPLykIUZ.chunk.js";import{R as h,z as g}from"./DTUkmChD.chunk.js";import{t as _}from"./eKSK4iyn.chunk.js";import{t as v}from"./BPS1avvv.chunk.js";import"./DWYlfnTA.chunk.js";var y=t(e()),b=n();function x(e){let[t,n]=y.useState(!1),x=s(c.currentUser()),S=s(m.video(e.id)),C=s(o.getAssemblyLineVideo(e.id)),w=s(S.data&&h.createViewKey(S.data.id,g.MasterObject));return!S.data||!x.data||!w.hasCompleted||!C.hasCompleted?(0,b.jsx)(`div`,{className:`text-center py-5`,children:(0,b.jsx)(d,{as:`div`,animation:`border`})}):(0,b.jsxs)(`div`,{children:[!!x.data&&(0,b.jsx)(v,{videoId:e.id,activeAction:r.Videos.PREVIEW_VIDEO,currentUser:x.data}),!w.hasError&&S.data.status===p.Published&&(0,b.jsxs)(l,{variant:`info`,className:`mt-3 mb-1`,children:[`This video is `,(0,b.jsx)(`strong`,{children:`published`}),` and cannot be edited or deleted. You may archive it if you believe it should no longer be in use.`]}),!w.hasError&&S.data.status===p.Archived&&(0,b.jsxs)(l,{variant:`info`,className:`mt-3 mb-1`,children:[`This video is `,(0,b.jsx)(`strong`,{children:`archived`}),`. You may publish it again from the options menu.`]}),w.hasError&&(0,b.jsxs)(l,{variant:`danger`,className:`mt-3 mb-1`,children:[(0,b.jsx)(`p`,{children:`Your account doesn't have access to watch this video. Please login to an account with one of the following libraries`}),(0,b.jsx)(`ul`,{children:S.data?.libraries?.data?.map(e=>(0,b.jsx)(`li`,{children:e.description},e.id))})]}),(0,b.jsxs)(`div`,{className:`${t&&w.data?.viewKey?``:`d-none`}`,children:[(0,b.jsx)(u,{object:{name:S.data.name,status:S.data.status},actions:[{label:`Open in Content Pipeline`,svg:f,appLink:{application:i.ASSEMBLY_LINE,action:a.mapStageToAction(C.data?.stage),params:{query:S.data?.id}},button:!0,disabled:!C.data,tooltip:C.data?``:`Videp is not in the content pipeline`,className:`btn btn-outline-dark me-2`,openInNewTab:!0}],actionsDropdownClassName:`btn btn-outline-dark`,showStatus:!0}),(0,b.jsx)(_,{viewKey:w.data?.viewKey,playerApi:new URL(ClickView.Config.Urls.PlayerApi),hotkeyElQuerySelector:`body`,onReady:()=>n(!0),eventLogging:!1})]})]})}export{x as PreviewVideoView};
2
+ //# sourceMappingURL=COH92JF5.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"D_e7ctVq.chunk.js","names":[],"sources":["../../../../../src/apps/videos/views/preview-video/PreviewVideoView.tsx"],"sourcesContent":["import React from 'react';\nimport { Alert, Spinner } from 'react-bootstrap';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\nimport { CuratorUser, PlayerViewKey, Video } from 'libs/shared/interfaces';\n\nimport { ClickViewPlayer } from 'projects/player/react/Player';\n\nimport { ObjectHeader } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\n\nimport { AssemblyLineRequests } from 'apps/assembly-line/flight-requests/AssemblyLineRequests';\nimport { AssemblyLineVideoResponse } from 'apps/assembly-line/interfaces/responses/AssemblyLineVideoResponse';\nimport { AssemblyLineHelper } from 'apps/assembly-line/utils/AssemblyLineHelper';\nimport { EditVideoNav } from 'apps/videos/components/edit-video-nav';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\ninterface PreviewVideoViewProps {\n id: string;\n}\n\nexport function PreviewVideoView(props: PreviewVideoViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(VideoRequests.video(props.id));\n const contentPipelineVideo = Flight.useBasicFetch<AssemblyLineVideoResponse>(\n AssemblyLineRequests.getAssemblyLineVideo(props.id)\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n video.data &&\n PlayerRequests.createViewKey(video.data.id, MediaIdType.MasterObject)\n );\n\n if (!video.data || !currentUser.data || !viewKey.hasCompleted || !contentPipelineVideo.hasCompleted) {\n return (\n <div className='text-center py-5'>\n <Spinner as='div' animation='border' />\n </div>\n );\n }\n\n return (\n <div>\n {!!currentUser.data &&\n <EditVideoNav\n videoId={props.id}\n activeAction={Actions.Videos.PREVIEW_VIDEO}\n currentUser={currentUser.data}\n />\n }\n {!viewKey.hasError && video.data.status === CurationStatus.Published && (\n <Alert variant='info' className='mt-3 mb-1'>\n This video is <strong>published</strong> and cannot be edited or deleted.\n You may archive it if you believe it should no longer be in use.\n </Alert>\n )}\n\n {!viewKey.hasError && video.data.status === CurationStatus.Archived && (\n <Alert variant='info' className='mt-3 mb-1'>\n This video is <strong>archived</strong>. You may publish it again\n from the options menu.\n </Alert>\n )}\n\n {viewKey.hasError && (\n <Alert variant='danger' className='mt-3 mb-1'>\n <p>\n Your account doesn't have access to watch this video.\n Please login to an account with one of the following libraries\n </p>\n <ul>\n {video.data?.libraries?.data?.map(l => {\n return (\n <li key={l.id}>\n {l.description}\n </li>\n );\n })}\n </ul>\n </Alert>\n )}\n\n <div className={`${(ready && viewKey.data?.viewKey) ? '' : 'd-none'}`}>\n <ObjectHeader\n object={{ name: video.data.name, status: video.data.status }}\n actions={[{\n label: 'Open in Content Pipeline',\n svg: VisibleOnSvg,\n appLink: {\n application: AppChannels.ASSEMBLY_LINE,\n action: AssemblyLineHelper.mapStageToAction(contentPipelineVideo.data?.stage),\n params: { query: video.data?.id }\n },\n button: true,\n disabled: !contentPipelineVideo.data,\n tooltip: !contentPipelineVideo.data ? 'Videp is not in the content pipeline' : '',\n className: 'btn btn-outline-dark me-2',\n openInNewTab: true\n }]}\n actionsDropdownClassName='btn btn-outline-dark'\n showStatus\n />\n <ClickViewPlayer\n viewKey={viewKey.data?.viewKey}\n playerApi={new URL(ClickView.Config.Urls.PlayerApi)}\n hotkeyElQuerySelector='body'\n onReady={() => setReady(true)}\n eventLogging={false}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"guBA2BA,SAAgB,EAAiB,EAA2C,CAC1E,GAAM,CAAE,EAAO,GAAA,EAAmB,SAAS,EAAK,EAE1C,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAQ,EAA4B,EAAc,MAAM,EAAM,EAAE,CAAC,EACjE,EAAuB,EAC3B,EAAqB,qBAAqB,EAAM,EAAE,CACpD,EAEM,EAAU,EACd,EAAM,MACN,EAAe,cAAc,EAAM,KAAK,GAAI,EAAY,YAAY,CACtE,EAUA,MARI,CAAC,EAAM,MAAQ,CAAC,EAAY,MAAQ,CAAC,EAAQ,cAAgB,CAAC,EAAqB,cAEnF,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAG,MAAM,UAAU,QAAU,CAAA,CACnC,CAAA,GAKP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,CACG,CAAC,CAAC,EAAY,OACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAM,GACf,aAAc,EAAQ,OAAO,cAC7B,YAAa,EAAY,IAC1B,CAAA,EAEF,CAAC,EAAQ,UAAY,EAAM,KAAK,SAAW,EAAe,YACzD,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,kBAC5B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,WAAiB,CAAA,EAAC,oGAEnC,IAGR,CAAC,EAAQ,UAAY,EAAM,KAAK,SAAW,EAAe,WACzD,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,kBAC5B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,UAAgB,CAAA,EAAC,mDAElC,IAGR,EAAQ,WACP,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,SAAS,UAAU,qBAAlC,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,sHAGA,CAAA,GACH,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACG,EAAM,MAAM,WAAW,MAAM,IAAI,IAE9B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACG,EAAE,WACD,EAFK,EAAE,EAEP,CAEP,CACC,CAAA,CACC,KAGT,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAI,GAAS,EAAQ,MAAM,QAAW,GAAK,oBAA3D,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,CAAE,KAAM,EAAM,KAAK,KAAM,OAAQ,EAAM,KAAK,MAAO,EAC3D,QAAS,CAAC,CACR,MAAO,2BACP,IAAK,EACL,QAAS,CACP,YAAa,EAAY,cACzB,OAAQ,EAAmB,iBAAiB,EAAqB,MAAM,KAAK,EAC5E,OAAQ,CAAE,MAAO,EAAM,MAAM,EAAG,CAClC,EACA,OAAQ,GACR,SAAU,CAAC,EAAqB,KAChC,QAAU,EAAqB,KAAgD,GAAzC,uCACtC,UAAW,4BACX,aAAc,EAChB,CAAC,EACD,yBAAyB,uBACzB,WAAA,EACD,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAQ,MAAM,QACvB,UAAW,IAAI,IAAI,UAAU,OAAO,KAAK,SAAS,EAClD,sBAAsB,OACtB,YAAe,EAAS,EAAI,EAC5B,aAAc,EACf,CAAA,CACE,GACF,CAAA,CAAA,CAET"}
1
+ {"version":3,"file":"COH92JF5.chunk.js","names":[],"sources":["../../../../../src/apps/videos/views/preview-video/PreviewVideoView.tsx"],"sourcesContent":["import React from 'react';\nimport { Alert, Spinner } from 'react-bootstrap';\n\nimport { Flight } from 'libs/common/react/index';\n\nimport { CurationStatus } from 'libs/shared/enums/CurationStatus';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VisibleOnSvg } from 'libs/shared/images/svg/actions/VisibleOnSvg';\nimport { CuratorUser, PlayerViewKey, Video } from 'libs/shared/interfaces';\n\nimport { ClickViewPlayer } from 'projects/player/react/Player';\n\nimport { ObjectHeader } from 'shared/components';\nimport { Actions, AppChannels } from 'shared/constants';\n\nimport { AssemblyLineRequests } from 'apps/assembly-line/flight-requests/AssemblyLineRequests';\nimport { AssemblyLineVideoResponse } from 'apps/assembly-line/interfaces/responses/AssemblyLineVideoResponse';\nimport { AssemblyLineHelper } from 'apps/assembly-line/utils/AssemblyLineHelper';\nimport { EditVideoNav } from 'apps/videos/components/edit-video-nav';\nimport { VideoRequests } from 'apps/videos/flight-requests/CuratorVideoRequests';\n\ninterface PreviewVideoViewProps {\n id: string;\n}\n\nexport function PreviewVideoView(props: PreviewVideoViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n const video = Flight.useBasicFetch<Video>(VideoRequests.video(props.id));\n const contentPipelineVideo = Flight.useBasicFetch<AssemblyLineVideoResponse>(\n AssemblyLineRequests.getAssemblyLineVideo(props.id)\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n video.data &&\n PlayerRequests.createViewKey(video.data.id, MediaIdType.MasterObject)\n );\n\n if (!video.data || !currentUser.data || !viewKey.hasCompleted || !contentPipelineVideo.hasCompleted) {\n return (\n <div className='text-center py-5'>\n <Spinner as='div' animation='border' />\n </div>\n );\n }\n\n return (\n <div>\n {!!currentUser.data &&\n <EditVideoNav\n videoId={props.id}\n activeAction={Actions.Videos.PREVIEW_VIDEO}\n currentUser={currentUser.data}\n />\n }\n {!viewKey.hasError && video.data.status === CurationStatus.Published && (\n <Alert variant='info' className='mt-3 mb-1'>\n This video is <strong>published</strong> and cannot be edited or deleted.\n You may archive it if you believe it should no longer be in use.\n </Alert>\n )}\n\n {!viewKey.hasError && video.data.status === CurationStatus.Archived && (\n <Alert variant='info' className='mt-3 mb-1'>\n This video is <strong>archived</strong>. You may publish it again\n from the options menu.\n </Alert>\n )}\n\n {viewKey.hasError && (\n <Alert variant='danger' className='mt-3 mb-1'>\n <p>\n Your account doesn't have access to watch this video.\n Please login to an account with one of the following libraries\n </p>\n <ul>\n {video.data?.libraries?.data?.map(l => {\n return (\n <li key={l.id}>\n {l.description}\n </li>\n );\n })}\n </ul>\n </Alert>\n )}\n\n <div className={`${(ready && viewKey.data?.viewKey) ? '' : 'd-none'}`}>\n <ObjectHeader\n object={{ name: video.data.name, status: video.data.status }}\n actions={[{\n label: 'Open in Content Pipeline',\n svg: VisibleOnSvg,\n appLink: {\n application: AppChannels.ASSEMBLY_LINE,\n action: AssemblyLineHelper.mapStageToAction(contentPipelineVideo.data?.stage),\n params: { query: video.data?.id }\n },\n button: true,\n disabled: !contentPipelineVideo.data,\n tooltip: !contentPipelineVideo.data ? 'Videp is not in the content pipeline' : '',\n className: 'btn btn-outline-dark me-2',\n openInNewTab: true\n }]}\n actionsDropdownClassName='btn btn-outline-dark'\n showStatus\n />\n <ClickViewPlayer\n viewKey={viewKey.data?.viewKey}\n playerApi={new URL(ClickView.Config.Urls.PlayerApi)}\n hotkeyElQuerySelector='body'\n onReady={() => setReady(true)}\n eventLogging={false}\n />\n </div>\n </div>\n );\n}\n"],"mappings":"guBA2BA,SAAgB,EAAiB,EAA2C,CAC1E,GAAM,CAAE,EAAO,GAAA,EAAmB,SAAS,EAAK,EAE1C,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAQ,EAA4B,EAAc,MAAM,EAAM,EAAE,CAAC,EACjE,EAAuB,EAC3B,EAAqB,qBAAqB,EAAM,EAAE,CACpD,EAEM,EAAU,EACd,EAAM,MACN,EAAe,cAAc,EAAM,KAAK,GAAI,EAAY,YAAY,CACtE,EAUA,MARI,CAAC,EAAM,MAAQ,CAAC,EAAY,MAAQ,CAAC,EAAQ,cAAgB,CAAC,EAAqB,cAEnF,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAG,MAAM,UAAU,QAAU,CAAA,CACnC,CAAA,GAKP,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,CACG,CAAC,CAAC,EAAY,OACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAM,GACf,aAAc,EAAQ,OAAO,cAC7B,YAAa,EAAY,IAC1B,CAAA,EAEF,CAAC,EAAQ,UAAY,EAAM,KAAK,SAAW,EAAe,YACzD,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,kBAC5B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,WAAiB,CAAA,EAAC,oGAEnC,IAGR,CAAC,EAAQ,UAAY,EAAM,KAAK,SAAW,EAAe,WACzD,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,kBAC5B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,UAAgB,CAAA,EAAC,mDAElC,IAGR,EAAQ,WACP,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,SAAS,UAAU,qBAAlC,EACE,EAAA,EAAA,IAAA,CAAC,IAAD,CAAA,SAAG,sHAGA,CAAA,GACH,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACG,EAAM,MAAM,WAAW,MAAM,IAAI,IAE9B,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SACG,EAAE,WACD,EAFK,EAAE,EAEP,CAEP,CACC,CAAA,CACC,KAGT,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAI,GAAS,EAAQ,MAAM,QAAW,GAAK,oBAA3D,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,CAAE,KAAM,EAAM,KAAK,KAAM,OAAQ,EAAM,KAAK,MAAO,EAC3D,QAAS,CAAC,CACR,MAAO,2BACP,IAAK,EACL,QAAS,CACP,YAAa,EAAY,cACzB,OAAQ,EAAmB,iBAAiB,EAAqB,MAAM,KAAK,EAC5E,OAAQ,CAAE,MAAO,EAAM,MAAM,EAAG,CAClC,EACA,OAAQ,GACR,SAAU,CAAC,EAAqB,KAChC,QAAU,EAAqB,KAAgD,GAAzC,uCACtC,UAAW,4BACX,aAAc,EAChB,CAAC,EACD,yBAAyB,uBACzB,WAAA,EACD,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAQ,MAAM,QACvB,UAAW,IAAI,IAAI,UAAU,OAAO,KAAK,SAAS,EAClD,sBAAsB,OACtB,YAAe,EAAS,EAAI,EAC5B,aAAc,EACf,CAAA,CACE,GACF,CAAA,CAAA,CAET"}
@@ -1,2 +1,2 @@
1
- import{C as e,a as t,ln as n,r}from"./BlDu0qdC.chunk.js";import{t as i}from"./DEBg-sxL.chunk.js";import{t as a}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{c as o}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as s}from"./jjwEJLK1.chunk.js";import{n as c}from"./D_lHfDx8.chunk.js";import{t as l}from"./BXA4Zr4z.chunk.js";import{t as u}from"./ZldWg3nr.chunk.js";import{t as d}from"./BPLykIUZ.chunk.js";import{n as f}from"./SkqOfrUt2.chunk.js";import{L as p,R as m,n as h,t as g,z as _}from"./DhN_Jc2z.chunk.js";var v=n(t()),y=r(),b=`shared.clipTimeForm`,x=s.encloseNamespace(b);function S(e){if(isNaN(e.startTime)||isNaN(e.endTime))return(0,y.jsx)(y.Fragment,{});let t=Math.floor(e.endTime)-Math.floor(e.startTime);return(0,y.jsxs)(`div`,{className:`px-3`,children:[(0,y.jsxs)(`form`,{className:`d-flex align-items-center justify-content-center pb-4`,children:[(0,y.jsx)(`div`,{children:(0,y.jsx)(u,{value:e.startTime,setTime:e.setStartTime,duration:e.duration})}),(0,y.jsx)(`span`,{className:`px-2`,children:`-`}),(0,y.jsx)(`div`,{className:`me-2`,children:(0,y.jsx)(u,{value:e.endTime,setTime:e.setEndTime,duration:e.duration})}),(0,y.jsxs)(`span`,{children:[(0,y.jsx)(`strong`,{children:(0,y.jsx)(c,{namespace:b,phrase:`duration`})}),`\xA0`,l.ToDisplayDuration(t*1e3)]})]}),(0,y.jsxs)(`div`,{className:`d-flex justify-content-end`,children:[(0,y.jsx)(`button`,{className:`btn btn-link`,onClick:e.onCancel,children:x(`cancel`)}),(0,y.jsx)(`button`,{className:`btn btn-dark`,onClick:e.onSubmit,children:x(`next`)})]})]})}var C=p.getComponent(`Component`),w=`<svg viewBox="0 0 5 14" pointer-events="none"><g id="Clips" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Clip-2" transform="translate(-835.000000, -632.000000)" fill="#FFFFFF"><g id="Video-Copy" transform="translate(275.000000, 96.000000)"><g id="Handles" transform="translate(560.000000, 536.000000)"><circle id="Oval" cx="1" cy="1" r="1"></circle><circle id="Oval-Copy-2" cx="1" cy="5" r="1"></circle><circle id="Oval-Copy-4" cx="1" cy="9" r="1"></circle><circle id="Oval-Copy-8" cx="1" cy="13" r="1"></circle><circle id="Oval-Copy" cx="4" cy="1" r="1"></circle><circle id="Oval-Copy-3" cx="4" cy="5" r="1"></circle><circle id="Oval-Copy-5" cx="4" cy="9" r="1"></circle><circle id="Oval-Copy-9" cx="4" cy="13" r="1"></circle></g></g></g></g></svg>`,T=class extends C{buildCSSClass(){return`cv-clip-timepoint-handle ${super.buildCSSClass()}`}createEl(e,t,n){return super.createEl(e,{...t,className:this.buildCSSClass(),innerHTML:w},n)}isEventTarget(e){return this.el().contains(e.target)}},E=p.getComponent(`Component`),D=class extends E{constructor(e,t){super(e,t),this.dragStartActive=!1,this.dragEndActive=!1,this.dragSliderActive=!1,this.dragSliderCurrentPosition=null,this.minDuration=Math.min(e.duration(),this.options_.minDuration),this.setStartTime(t.startTime,!1),this.setEndTime(t.endTime,!1),this.startHandle=new T(this.player(),t),this.startHandle.addClass(`cv-clip-start-handle`),this.addChild(this.startHandle),this.endHandle=new T(this.player(),t),this.endHandle.addClass(`cv-clip-end-handle`),this.addChild(this.endHandle),this.on(this.player(),`update:clip:start:time`,({time:e})=>this.setStartTime(e)),this.on(this.player(),`update:clip:end:time`,({time:e})=>this.setEndTime(e)),this.bindListeners(),this.update()}createEl(){return super.createEl(`div`,{className:`cv-clip-timepoint-selector`},{})}update(){this.options_.onChangeStartTime(this.startTime),this.options_.onChangeEndTime(this.endTime),this.requestAnimationFrame(()=>{this.setStartOffset(),this.setWidth()})}setStartTime(e,t=!0){if(isNaN(e))return;let n=this.hasStartTime()&&this.hasEndTime()&&this.endTime-this.startTime,r=this.player().duration()-this.minDuration;if(e>r&&(e=r),e<0&&(e=0),this.startTime=e,this.endTime&&this.endTime-this.startTime<this.minDuration){let e=typeof n==`number`?this.startTime+n:this.startTime+this.minDuration;this.setEndTime(e)}this.player().currentTime(this.startTime),t&&this.update()}setEndTime(e,t=!0){if(isNaN(e))return;let n=this.hasStartTime()&&this.hasEndTime()&&this.endTime-this.startTime,r=this.minDuration;if(e<r&&(e=r),e>this.player().duration()&&(e=this.player().duration()),this.endTime=e,this.startTime&&this.endTime-this.startTime<this.minDuration){let e=typeof n==`number`?this.endTime-n:this.endTime-this.minDuration;this.setStartTime(e)}t&&this.update()}bindListeners(){this.onTimeupdate=this.onTimeupdate.bind(this),this.player().on(`timeupdate`,this.onTimeupdate),this.on(`mousedown`,this.dragStart),this.on(`touchstart`,this.dragStart),this.player().on(`dispose`,()=>{this.player().off(`timeupdate`,this.onTimeupdate),this.off(`mousedown`,this.dragStart),this.off(`touchstart`,this.dragStart)})}hasStartTime(){return typeof this.startTime==`number`}hasEndTime(){return typeof this.endTime==`number`}onTimeupdate(){let e=this.player().currentTime();e>this.endTime&&e<this.endTime+.5&&this.player().pause()}dragStart(e){this.startHandle.isEventTarget(e)&&(e.stopImmediatePropagation(),this.dragStartActive=!0),this.endHandle.isEventTarget(e)&&(e.stopImmediatePropagation(),this.dragEndActive=!0),e.target===this.el()&&(e.stopImmediatePropagation(),this.dragSliderActive=!0,this.dragSliderCurrentPosition=this.getPosition(e));let t=this.el().ownerDocument;this.on(t,`mousemove`,this.drag),this.on(t,`mouseup`,this.dragEnd),this.on(t,`touchmove`,this.drag),this.on(t,`touchend`,this.dragEnd),this.drag(e)}dragEnd(){this.dragStartActive=!1,this.dragEndActive=!1,this.dragSliderActive=!1,this.dragSliderCurrentPosition=null;let e=this.el().ownerDocument;this.off(e,`mousemove`,this.drag),this.off(e,`mouseup`,this.dragEnd),this.off(e,`touchmove`,this.drag),this.off(e,`touchend`,this.dragEnd)}drag(e){if(!this.dragStartActive&&!this.dragEndActive&&!this.dragSliderActive||!p.dom.isSingleLeftClick(e))return;let t=this.getPosition(e),n=t*this.player().duration();this.dragStartActive&&this.handleStartHandleDrag(n),this.dragEndActive&&this.handleEndHandleDrag(n),this.dragSliderActive&&this.handleSliderDrag(t)}handleStartHandleDrag(e){this.setStartTime(e)}handleEndHandleDrag(e){this.setEndTime(e)}handleSliderDrag(e){let t=(e-this.dragSliderCurrentPosition)*this.player().duration(),n=this.startTime+t,r=this.endTime+t;n<=0||r>=this.player().duration()||(this.dragSliderCurrentPosition=e,this.setStartTime(n),this.setEndTime(r))}getPosition(e){return p.dom.getPointerPosition(this.el_.parentNode,e).x}setStartOffset(){this.el_.style.marginLeft=`${this.getPercentage(this.startTime)}%`}setWidth(){this.el_.style.width=`${this.getPercentage(this.endTime-this.startTime)}%`}getPercentage(e){return+(e/this.player().duration()*100).toFixed(4)}},O=p.getComponent(`Component`),k=class extends O{constructor(e,t){super(e,t),this.seekBar_=t.seekBar,this.playProgressBar_=t.playProgressBar,this.bindListeners(),this.player_.one(`dispose`,()=>{this.unbindListeners()})}createEl(e,t,n){return super.createEl(e,{...t,className:`cv-create-clip-progress-indicator`},n)}bindListeners(){this.on(`mousedown`,this.handleMouseDown),this.on(`touchstart`,this.handleMouseDown)}unbindListeners(){let e=this.el_.ownerDocument;this.off(`mousedown`,this.handleMouseDown),this.off(`touchstart`,this.handleMouseDown),this.off(e,`mousemove`,this.handleMouseMove),this.off(e,`mouseup`,this.handleMouseUp),this.off(e,`touchmove`,this.handleMouseMove),this.off(e,`touchend`,this.handleMouseUp)}handleMouseDown(e){if(!p.dom.isSingleLeftClick(e))return;e.stopPropagation(),e.type===`mousedown`&&e.preventDefault(),e.type===`touchstart`&&!p.browser.IS_CHROME&&e.preventDefault(),this.player_.scrubbing(!0),this.videoWasPlaying_=!this.player_.paused(),this.player_.pause(),p.dom.blockTextSelection();let t=this.el_.ownerDocument;this.on(t,`mousemove`,this.handleMouseMove),this.on(t,`mouseup`,this.handleMouseUp),this.on(t,`touchmove`,this.handleMouseMove),this.on(t,`touchend`,this.handleMouseUp),this.handleMouseMove(e),this.player_.addClass(`cv-hide-mouse-time`)}handleMouseMove(e){if(!p.dom.isSingleLeftClick(e))return;let t=p.dom.getPointerPosition(this.seekBar_.el_,e).x*this.player_.duration();t===this.player_.duration()&&(t-=.1),this.player_.currentTime(t),this.playProgressBar_.update()}handleMouseUp(e){p.dom.unblockTextSelection();let t=this.el_.ownerDocument;this.off(t,`mousemove`,this.handleMouseMove),this.off(t,`mouseup`,this.handleMouseUp),this.off(t,`touchmove`,this.handleMouseMove),this.off(t,`touchend`,this.handleMouseUp),e?.stopPropagation(),this.player_.scrubbing(!1),this.player_.trigger({type:`timeupdate`,target:this,manuallyTriggered:!0}),this.videoWasPlaying_&&this.player_.play(),this.seekBar_.update(),this.player_.removeClass(`cv-hide-mouse-time`)}};p.registerComponent(`CreateClipProgressIndicator`,k);var A=p.getComponent(`SeekBar`),j=class extends A{constructor(e,t){super(e,t),this.addClass(`cv-create-clip-seek-bar`)}initialize(e){let t=new D(this.player(),e);this.addChild(t);let n=this.getChild(`playProgressBar`),r=new k(this.player_,{seekBar:this,playProgressBar:n});n.addChild(r)}};j.prototype.options_={children:[`playProgressBar`],barName:`playProgressBar`},!p.browser.IS_IOS&&!p.browser.IS_ANDROID&&j.prototype.options_.children.splice(1,0,`mouseTimeDisplay`),p.registerComponent(`CreateClipSeekBar`,j);var M=p.getPlugin(`plugin`),N=5,P=class extends M{constructor(e,t){super(e,t),this.options=t,this.initCreateClipSeekBar=this.initCreateClipSeekBar.bind(this),this.player.one(`loadedmetadata`,()=>this.player.ready(this.initCreateClipSeekBar))}initCreateClipSeekBar(){let e=this.player.controlBar.getChild(`ProgressControl`)?.getChild(`SeekBar`);if(!e)return;let t=!isNaN(this.options.startTime)&&this.options.startTime>=0?this.options.startTime:0,n=!isNaN(this.options.endTime)&&this.options.endTime<=this.player.duration()?this.options.endTime:this.player.duration(),r=Math.min(this.options.minDuration||N,this.player.duration());e.initialize({startTime:t,endTime:n,minDuration:r,onChangeStartTime:this.options.onChangeStartTime,onChangeEndTime:this.options.onChangeEndTime})}dispose(){this.player.off(`loadedmetadata`,this.initCreateClipSeekBar),super.dispose()}};p.registerPlugin(`createClipPlugin`,P);var F=class extends h{constructor(e,t){super(e,{allowFullscreen:!0,...t,playbackRates:null,enableLocalCache:!1})}getPlayerClassName(){return`cv-create-clip-player`}configurePlugins(){let{startTime:e,endTime:t,minDuration:n,onChangeStartTime:r,onChangeEndTime:i}=this.options;this.player.createClipPlugin({startTime:e,endTime:t,minDuration:n,onChangeStartTime:r,onChangeEndTime:i})}getPlayerOptions(){let e=super.getPlayerOptions();return e.inactivityTimeout=0,e}getSeekBarName(){return`CreateClipSeekBar`}getAnalyticsPlayerType(){return`create-clip-player`}};function I(e){let{onReady:t,onDispose:n}=e,r=v.useRef(null),i=v.useRef(null);return v.useEffect(()=>{if(i.current?.dispose(),r)return i.current=new F(r.current,e),t&&i.current.ready(()=>{t(g(i.current))}),n&&i.current.one(`dispose`,n),()=>{i.current?.dispose()}},[e.viewKey]),v.useEffect(()=>{i.current?.trigger({type:`update:clip:start:time`,time:e.startTime})},[e.startTime]),v.useEffect(()=>{i.current?.trigger({type:`update:clip:end:time`,time:e.endTime})},[e.endTime]),(0,y.jsx)(`div`,{ref:r})}var L=`clip-nav-lock`,R=5;function z(t){let n=v.useRef(null),[r,s]=v.useState(0),[c,l]=v.useState(30),u=o(d.video(t.videoId)),p=o(m.createViewKey(t.videoId,_.MasterObject)),[h,g]=v.useState(0),b=f();v.useEffect(()=>{b.lock({id:L,title:`Are you sure you want to leave?`,text:`The clip you are currently creating will not be saved.`})},[]);function x(e){n.current=e,e.on(`durationchange`,()=>g(e.duration()))}function C(){b.unlock(L),e.trigger({application:a.CLIPS,action:i.Clips.CREATE_CLIP_DETAILS,args:[t.videoId],params:{startTime:r,endTime:c}})}function w(){e.trigger({application:a.VIDEOS,action:i.Videos.EDIT_VIDEO_CLIPS,args:[t.videoId]})}return(0,y.jsx)(`div`,{className:`px-3`,children:!!p.data&&!!u.data&&(0,y.jsxs)(`div`,{className:`pb-3`,children:[(0,y.jsx)(`div`,{className:`mb-3`,children:(0,y.jsx)(I,{onReady:x,playerApi:new URL(ClickView.Config.Urls.PlayerApi),viewKey:p.data.viewKey,startTime:r,endTime:c,onChangeStartTime:s,onChangeEndTime:l,minDuration:R,autoplay:!0})}),(0,y.jsx)(S,{startTime:r,endTime:c,setStartTime:s,setEndTime:l,onSubmit:C,onCancel:w,duration:h})]})})}export{z as CreateClipView};
2
- //# sourceMappingURL=CJpr073K.chunk.js.map
1
+ import{C as e,a as t,ln as n,r}from"./BlDu0qdC.chunk.js";import{t as i}from"./DEBg-sxL.chunk.js";import{t as a}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{c as o}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as s}from"./jjwEJLK1.chunk.js";import{n as c}from"./D_lHfDx8.chunk.js";import{t as l}from"./BXA4Zr4z.chunk.js";import{t as u}from"./ZldWg3nr.chunk.js";import{t as d}from"./BPLykIUZ.chunk.js";import{n as f}from"./SkqOfrUt2.chunk.js";import{L as p,R as m,n as h,t as g,z as _}from"./DTUkmChD.chunk.js";var v=n(t()),y=r(),b=`shared.clipTimeForm`,x=s.encloseNamespace(b);function S(e){if(isNaN(e.startTime)||isNaN(e.endTime))return(0,y.jsx)(y.Fragment,{});let t=Math.floor(e.endTime)-Math.floor(e.startTime);return(0,y.jsxs)(`div`,{className:`px-3`,children:[(0,y.jsxs)(`form`,{className:`d-flex align-items-center justify-content-center pb-4`,children:[(0,y.jsx)(`div`,{children:(0,y.jsx)(u,{value:e.startTime,setTime:e.setStartTime,duration:e.duration})}),(0,y.jsx)(`span`,{className:`px-2`,children:`-`}),(0,y.jsx)(`div`,{className:`me-2`,children:(0,y.jsx)(u,{value:e.endTime,setTime:e.setEndTime,duration:e.duration})}),(0,y.jsxs)(`span`,{children:[(0,y.jsx)(`strong`,{children:(0,y.jsx)(c,{namespace:b,phrase:`duration`})}),`\xA0`,l.ToDisplayDuration(t*1e3)]})]}),(0,y.jsxs)(`div`,{className:`d-flex justify-content-end`,children:[(0,y.jsx)(`button`,{className:`btn btn-link`,onClick:e.onCancel,children:x(`cancel`)}),(0,y.jsx)(`button`,{className:`btn btn-dark`,onClick:e.onSubmit,children:x(`next`)})]})]})}var C=p.getComponent(`Component`),w=`<svg viewBox="0 0 5 14" pointer-events="none"><g id="Clips" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="Clip-2" transform="translate(-835.000000, -632.000000)" fill="#FFFFFF"><g id="Video-Copy" transform="translate(275.000000, 96.000000)"><g id="Handles" transform="translate(560.000000, 536.000000)"><circle id="Oval" cx="1" cy="1" r="1"></circle><circle id="Oval-Copy-2" cx="1" cy="5" r="1"></circle><circle id="Oval-Copy-4" cx="1" cy="9" r="1"></circle><circle id="Oval-Copy-8" cx="1" cy="13" r="1"></circle><circle id="Oval-Copy" cx="4" cy="1" r="1"></circle><circle id="Oval-Copy-3" cx="4" cy="5" r="1"></circle><circle id="Oval-Copy-5" cx="4" cy="9" r="1"></circle><circle id="Oval-Copy-9" cx="4" cy="13" r="1"></circle></g></g></g></g></svg>`,T=class extends C{buildCSSClass(){return`cv-clip-timepoint-handle ${super.buildCSSClass()}`}createEl(e,t,n){return super.createEl(e,{...t,className:this.buildCSSClass(),innerHTML:w},n)}isEventTarget(e){return this.el().contains(e.target)}},E=p.getComponent(`Component`),D=class extends E{constructor(e,t){super(e,t),this.dragStartActive=!1,this.dragEndActive=!1,this.dragSliderActive=!1,this.dragSliderCurrentPosition=null,this.minDuration=Math.min(e.duration(),this.options_.minDuration),this.setStartTime(t.startTime,!1),this.setEndTime(t.endTime,!1),this.startHandle=new T(this.player(),t),this.startHandle.addClass(`cv-clip-start-handle`),this.addChild(this.startHandle),this.endHandle=new T(this.player(),t),this.endHandle.addClass(`cv-clip-end-handle`),this.addChild(this.endHandle),this.on(this.player(),`update:clip:start:time`,({time:e})=>this.setStartTime(e)),this.on(this.player(),`update:clip:end:time`,({time:e})=>this.setEndTime(e)),this.bindListeners(),this.update()}createEl(){return super.createEl(`div`,{className:`cv-clip-timepoint-selector`},{})}update(){this.options_.onChangeStartTime(this.startTime),this.options_.onChangeEndTime(this.endTime),this.requestAnimationFrame(()=>{this.setStartOffset(),this.setWidth()})}setStartTime(e,t=!0){if(isNaN(e))return;let n=this.hasStartTime()&&this.hasEndTime()&&this.endTime-this.startTime,r=this.player().duration()-this.minDuration;if(e>r&&(e=r),e<0&&(e=0),this.startTime=e,this.endTime&&this.endTime-this.startTime<this.minDuration){let e=typeof n==`number`?this.startTime+n:this.startTime+this.minDuration;this.setEndTime(e)}this.player().currentTime(this.startTime),t&&this.update()}setEndTime(e,t=!0){if(isNaN(e))return;let n=this.hasStartTime()&&this.hasEndTime()&&this.endTime-this.startTime,r=this.minDuration;if(e<r&&(e=r),e>this.player().duration()&&(e=this.player().duration()),this.endTime=e,this.startTime&&this.endTime-this.startTime<this.minDuration){let e=typeof n==`number`?this.endTime-n:this.endTime-this.minDuration;this.setStartTime(e)}t&&this.update()}bindListeners(){this.onTimeupdate=this.onTimeupdate.bind(this),this.player().on(`timeupdate`,this.onTimeupdate),this.on(`mousedown`,this.dragStart),this.on(`touchstart`,this.dragStart),this.player().on(`dispose`,()=>{this.player().off(`timeupdate`,this.onTimeupdate),this.off(`mousedown`,this.dragStart),this.off(`touchstart`,this.dragStart)})}hasStartTime(){return typeof this.startTime==`number`}hasEndTime(){return typeof this.endTime==`number`}onTimeupdate(){let e=this.player().currentTime();e>this.endTime&&e<this.endTime+.5&&this.player().pause()}dragStart(e){this.startHandle.isEventTarget(e)&&(e.stopImmediatePropagation(),this.dragStartActive=!0),this.endHandle.isEventTarget(e)&&(e.stopImmediatePropagation(),this.dragEndActive=!0),e.target===this.el()&&(e.stopImmediatePropagation(),this.dragSliderActive=!0,this.dragSliderCurrentPosition=this.getPosition(e));let t=this.el().ownerDocument;this.on(t,`mousemove`,this.drag),this.on(t,`mouseup`,this.dragEnd),this.on(t,`touchmove`,this.drag),this.on(t,`touchend`,this.dragEnd),this.drag(e)}dragEnd(){this.dragStartActive=!1,this.dragEndActive=!1,this.dragSliderActive=!1,this.dragSliderCurrentPosition=null;let e=this.el().ownerDocument;this.off(e,`mousemove`,this.drag),this.off(e,`mouseup`,this.dragEnd),this.off(e,`touchmove`,this.drag),this.off(e,`touchend`,this.dragEnd)}drag(e){if(!this.dragStartActive&&!this.dragEndActive&&!this.dragSliderActive||!p.dom.isSingleLeftClick(e))return;let t=this.getPosition(e),n=t*this.player().duration();this.dragStartActive&&this.handleStartHandleDrag(n),this.dragEndActive&&this.handleEndHandleDrag(n),this.dragSliderActive&&this.handleSliderDrag(t)}handleStartHandleDrag(e){this.setStartTime(e)}handleEndHandleDrag(e){this.setEndTime(e)}handleSliderDrag(e){let t=(e-this.dragSliderCurrentPosition)*this.player().duration(),n=this.startTime+t,r=this.endTime+t;n<=0||r>=this.player().duration()||(this.dragSliderCurrentPosition=e,this.setStartTime(n),this.setEndTime(r))}getPosition(e){return p.dom.getPointerPosition(this.el_.parentNode,e).x}setStartOffset(){this.el_.style.marginLeft=`${this.getPercentage(this.startTime)}%`}setWidth(){this.el_.style.width=`${this.getPercentage(this.endTime-this.startTime)}%`}getPercentage(e){return+(e/this.player().duration()*100).toFixed(4)}},O=p.getComponent(`Component`),k=class extends O{constructor(e,t){super(e,t),this.seekBar_=t.seekBar,this.playProgressBar_=t.playProgressBar,this.bindListeners(),this.player_.one(`dispose`,()=>{this.unbindListeners()})}createEl(e,t,n){return super.createEl(e,{...t,className:`cv-create-clip-progress-indicator`},n)}bindListeners(){this.on(`mousedown`,this.handleMouseDown),this.on(`touchstart`,this.handleMouseDown)}unbindListeners(){let e=this.el_.ownerDocument;this.off(`mousedown`,this.handleMouseDown),this.off(`touchstart`,this.handleMouseDown),this.off(e,`mousemove`,this.handleMouseMove),this.off(e,`mouseup`,this.handleMouseUp),this.off(e,`touchmove`,this.handleMouseMove),this.off(e,`touchend`,this.handleMouseUp)}handleMouseDown(e){if(!p.dom.isSingleLeftClick(e))return;e.stopPropagation(),e.type===`mousedown`&&e.preventDefault(),e.type===`touchstart`&&!p.browser.IS_CHROME&&e.preventDefault(),this.player_.scrubbing(!0),this.videoWasPlaying_=!this.player_.paused(),this.player_.pause(),p.dom.blockTextSelection();let t=this.el_.ownerDocument;this.on(t,`mousemove`,this.handleMouseMove),this.on(t,`mouseup`,this.handleMouseUp),this.on(t,`touchmove`,this.handleMouseMove),this.on(t,`touchend`,this.handleMouseUp),this.handleMouseMove(e),this.player_.addClass(`cv-hide-mouse-time`)}handleMouseMove(e){if(!p.dom.isSingleLeftClick(e))return;let t=p.dom.getPointerPosition(this.seekBar_.el_,e).x*this.player_.duration();t===this.player_.duration()&&(t-=.1),this.player_.currentTime(t),this.playProgressBar_.update()}handleMouseUp(e){p.dom.unblockTextSelection();let t=this.el_.ownerDocument;this.off(t,`mousemove`,this.handleMouseMove),this.off(t,`mouseup`,this.handleMouseUp),this.off(t,`touchmove`,this.handleMouseMove),this.off(t,`touchend`,this.handleMouseUp),e?.stopPropagation(),this.player_.scrubbing(!1),this.player_.trigger({type:`timeupdate`,target:this,manuallyTriggered:!0}),this.videoWasPlaying_&&this.player_.play(),this.seekBar_.update(),this.player_.removeClass(`cv-hide-mouse-time`)}};p.registerComponent(`CreateClipProgressIndicator`,k);var A=p.getComponent(`SeekBar`),j=class extends A{constructor(e,t){super(e,t),this.addClass(`cv-create-clip-seek-bar`)}initialize(e){let t=new D(this.player(),e);this.addChild(t);let n=this.getChild(`playProgressBar`),r=new k(this.player_,{seekBar:this,playProgressBar:n});n.addChild(r)}};j.prototype.options_={children:[`playProgressBar`],barName:`playProgressBar`},!p.browser.IS_IOS&&!p.browser.IS_ANDROID&&j.prototype.options_.children.splice(1,0,`mouseTimeDisplay`),p.registerComponent(`CreateClipSeekBar`,j);var M=p.getPlugin(`plugin`),N=5,P=class extends M{constructor(e,t){super(e,t),this.options=t,this.initCreateClipSeekBar=this.initCreateClipSeekBar.bind(this),this.player.one(`loadedmetadata`,()=>this.player.ready(this.initCreateClipSeekBar))}initCreateClipSeekBar(){let e=this.player.controlBar.getChild(`ProgressControl`)?.getChild(`SeekBar`);if(!e)return;let t=!isNaN(this.options.startTime)&&this.options.startTime>=0?this.options.startTime:0,n=!isNaN(this.options.endTime)&&this.options.endTime<=this.player.duration()?this.options.endTime:this.player.duration(),r=Math.min(this.options.minDuration||N,this.player.duration());e.initialize({startTime:t,endTime:n,minDuration:r,onChangeStartTime:this.options.onChangeStartTime,onChangeEndTime:this.options.onChangeEndTime})}dispose(){this.player.off(`loadedmetadata`,this.initCreateClipSeekBar),super.dispose()}};p.registerPlugin(`createClipPlugin`,P);var F=class extends h{constructor(e,t){super(e,{allowFullscreen:!0,...t,playbackRates:null,enableLocalCache:!1})}getPlayerClassName(){return`cv-create-clip-player`}configurePlugins(){let{startTime:e,endTime:t,minDuration:n,onChangeStartTime:r,onChangeEndTime:i}=this.options;this.player.createClipPlugin({startTime:e,endTime:t,minDuration:n,onChangeStartTime:r,onChangeEndTime:i})}getPlayerOptions(){let e=super.getPlayerOptions();return e.inactivityTimeout=0,e}getSeekBarName(){return`CreateClipSeekBar`}getAnalyticsPlayerType(){return`create-clip-player`}};function I(e){let{onReady:t,onDispose:n}=e,r=v.useRef(null),i=v.useRef(null);return v.useEffect(()=>{if(i.current?.dispose(),r)return i.current=new F(r.current,e),t&&i.current.ready(()=>{t(g(i.current))}),n&&i.current.one(`dispose`,n),()=>{i.current?.dispose()}},[e.viewKey]),v.useEffect(()=>{i.current?.trigger({type:`update:clip:start:time`,time:e.startTime})},[e.startTime]),v.useEffect(()=>{i.current?.trigger({type:`update:clip:end:time`,time:e.endTime})},[e.endTime]),(0,y.jsx)(`div`,{ref:r})}var L=`clip-nav-lock`,R=5;function z(t){let n=v.useRef(null),[r,s]=v.useState(0),[c,l]=v.useState(30),u=o(d.video(t.videoId)),p=o(m.createViewKey(t.videoId,_.MasterObject)),[h,g]=v.useState(0),b=f();v.useEffect(()=>{b.lock({id:L,title:`Are you sure you want to leave?`,text:`The clip you are currently creating will not be saved.`})},[]);function x(e){n.current=e,e.on(`durationchange`,()=>g(e.duration()))}function C(){b.unlock(L),e.trigger({application:a.CLIPS,action:i.Clips.CREATE_CLIP_DETAILS,args:[t.videoId],params:{startTime:r,endTime:c}})}function w(){e.trigger({application:a.VIDEOS,action:i.Videos.EDIT_VIDEO_CLIPS,args:[t.videoId]})}return(0,y.jsx)(`div`,{className:`px-3`,children:!!p.data&&!!u.data&&(0,y.jsxs)(`div`,{className:`pb-3`,children:[(0,y.jsx)(`div`,{className:`mb-3`,children:(0,y.jsx)(I,{onReady:x,playerApi:new URL(ClickView.Config.Urls.PlayerApi),viewKey:p.data.viewKey,startTime:r,endTime:c,onChangeStartTime:s,onChangeEndTime:l,minDuration:R,autoplay:!0})}),(0,y.jsx)(S,{startTime:r,endTime:c,setStartTime:s,setEndTime:l,onSubmit:C,onCancel:w,duration:h})]})})}export{z as CreateClipView};
2
+ //# sourceMappingURL=CR-5nCWm.chunk.js.map