@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.
- package/dist/.vite/manifest.json +475 -475
- package/dist/Assets/js/dist/scripts/{Bs1Y6-vh.chunk.js → -OUl3n-W.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Bs1Y6-vh.chunk.js.map → -OUl3n-W.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/5FGdlWcH.chunk.js +9 -0
- package/dist/Assets/js/dist/scripts/5FGdlWcH.chunk.js.map +1 -0
- package/dist/Assets/js/dist/scripts/B0UOCPE6.chunk.js +2 -0
- package/dist/Assets/js/dist/scripts/{r-zw-56e.chunk.js.map → B0UOCPE6.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{Ds6WvphR2.chunk.js → BD2aIccu2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{Ds6WvphR2.chunk.js.map → BD2aIccu2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BwpzKPd12.chunk.js → BJJeLngO2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BwpzKPd12.chunk.js.map → BJJeLngO2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CaG8Cjey2.chunk.js → BKQIzKcF2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CaG8Cjey2.chunk.js.map → BKQIzKcF2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BEw27Jf3.chunk.js → BOrAaHLK.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BEw27Jf3.chunk.js.map → BOrAaHLK.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/BSMzg7zU.chunk.js.map +1 -1
- package/dist/Assets/js/dist/scripts/{CO69n5GB2.chunk.js → BUWsFXQp2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CO69n5GB2.chunk.js.map → BUWsFXQp2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BZU4ADoQ2.chunk.js → C1xOGHlL2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BZU4ADoQ2.chunk.js.map → C1xOGHlL2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CbaobIxf2.chunk.js → CAo_C8em2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CbaobIxf2.chunk.js.map → CAo_C8em2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{D_e7ctVq.chunk.js → COH92JF5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{D_e7ctVq.chunk.js.map → COH92JF5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CJpr073K.chunk.js → CR-5nCWm.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CJpr073K.chunk.js.map → CR-5nCWm.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CqhZ98rZ2.chunk.js → CW1ea_Kx2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CqhZ98rZ2.chunk.js.map → CW1ea_Kx2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DPA1azNU2.chunk.js → Cbwl04yH2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DPA1azNU2.chunk.js.map → Cbwl04yH2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DsHVJvUP.chunk.js → CpqMUVVi.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DsHVJvUP.chunk.js.map → CpqMUVVi.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{I_gdFDV7.chunk.js → CqZqlJSF.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{I_gdFDV7.chunk.js.map → CqZqlJSF.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CofA9RRF.chunk.js → CzCUe0Ej.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CofA9RRF.chunk.js.map → CzCUe0Ej.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DhN_Jc2z.chunk.js → DTUkmChD.chunk.js} +3 -3
- package/dist/Assets/js/dist/scripts/{DhN_Jc2z.chunk.js.map → DTUkmChD.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{C8YkY0we.chunk.js → DW7-la-i.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{C8YkY0we.chunk.js.map → DW7-la-i.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{ecehd0o7.chunk.js → Dhnl-PB5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{ecehd0o7.chunk.js.map → Dhnl-PB5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{jdQzplq1.chunk.js → DuU4GBw5.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{jdQzplq1.chunk.js.map → DuU4GBw5.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{CvMpxc4j2.chunk.js → LmwQmHZz2.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{CvMpxc4j2.chunk.js.map → LmwQmHZz2.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{app-D2seXuq-.js → app-DHtN6XkT.js} +3 -3
- package/dist/Assets/js/dist/scripts/{app-D2seXuq-.js.map → app-DHtN6XkT.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{DUsXdKYh.chunk.js → eKSK4iyn.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{DUsXdKYh.chunk.js.map → eKSK4iyn.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{BdXsbiX1.chunk.js → esASf9N4.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/{BdXsbiX1.chunk.js.map → esASf9N4.chunk.js.map} +1 -1
- package/dist/Assets/js/dist/scripts/{De-ohgjE.chunk.js → x1pOfdJd.chunk.js} +2 -2
- package/dist/Assets/js/dist/scripts/x1pOfdJd.chunk.js.map +1 -0
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/package.json +1 -1
- package/dist/Assets/js/dist/scripts/C7Rwn3_U.chunk.js +0 -9
- package/dist/Assets/js/dist/scripts/C7Rwn3_U.chunk.js.map +0 -1
- package/dist/Assets/js/dist/scripts/De-ohgjE.chunk.js.map +0 -1
- package/dist/Assets/js/dist/scripts/r-zw-56e.chunk.js +0 -2
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{C as e,a as t,b as n,ln as r}from"./BlDu0qdC.chunk.js";import{t as i}from"./DEBg-sxL.chunk.js";import{t as a}from"./BvMTtGLi.chunk.js";import{t as o}from"./C1PTqhPY2.chunk.js";var s=r(t());function c(e,t){return{userId:e.id,firstName:e.name,surname:e.surname,userType:e.userType,customerId:t,email:e.email||``,masterYearGroup:e.masterYearGroup??null,username:e.username,masterRole:e.userProfile?.role,status:e.status,displayName:e.metadata?.displayName??``}}function l(e,t,n){return{application:a.CUSTOMERS,action:t===o.Learner?i.Customers.MANAGE_STUDENTS:i.Customers.MANAGE_STAFF,args:[e],params:{cursor:n}}}function u(t,r,i){let[a,o]=(0,s.useState)(!1),[c,u]=(0,s.useState)(null);(0,s.useEffect)(()=>{t.statusCode===n.Ok&&(o(!0),u(t.data.userType)),t.statusCode===n.NotFound&&a&&e.trigger(l(r,c,i))},[t.statusCode])}export{c as n,u as r,l as t};
|
|
2
|
+
//# sourceMappingURL=B0UOCPE6.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"B0UOCPE6.chunk.js","names":[],"sources":["../../../../../src/apps/crm-studio/views/users/edit-user/EditUserUtils.ts"],"sourcesContent":["import { useEffect, useState } 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 { EditUserRequest } from 'libs/shared/apps/user-manager/interfaces';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { User } from 'libs/shared/interfaces';\n\nimport { Actions } from 'shared/constants/CuratorActions';\nimport { AppChannels } from 'shared/constants/RadioChannels';\n\nexport function getUserInitialValues(user: User, customerId: string): EditUserRequest {\n return {\n userId: user.id,\n firstName: user.name,\n surname: user.surname,\n userType: user.userType,\n customerId,\n email: user.email || '',\n masterYearGroup: user.masterYearGroup ?? null,\n username: user.username,\n masterRole: user.userProfile?.role,\n status: user.status,\n displayName: user.metadata?.displayName ?? ''\n };\n}\n\nexport function getCustomerAppLink(customerId: string, userType: UserGroup, cursor?: string): Core.AppLink {\n return {\n application: AppChannels.CUSTOMERS,\n action: userType === UserGroup.Learner ?\n Actions.Customers.MANAGE_STUDENTS :\n Actions.Customers.MANAGE_STAFF,\n args: [customerId],\n params: { cursor }\n };\n}\n\nexport function useRedirectOnDelete(user: Flight.Response<User>, customerId: string, cursor?: string): void {\n const [ userLoaded, setUserLoaded ] = useState(false);\n // We store userType in state as it won't be accessible from Flight once the user is deleted.\n const [ userType, setUserType ] = useState(null);\n\n useEffect(() => {\n if (user.statusCode === HttpStatus.Ok) {\n setUserLoaded(true);\n setUserType(user.data.userType);\n }\n\n if (user.statusCode === HttpStatus.NotFound && userLoaded)\n Core.AppLinkHelper.trigger(getCustomerAppLink(customerId, userType, cursor));\n }, [user.statusCode]);\n}\n"],"mappings":"oMAaA,SAAgB,EAAqB,EAAY,EAAqC,CACpF,MAAO,CACL,OAAQ,EAAK,GACb,UAAW,EAAK,KAChB,QAAS,EAAK,QACd,SAAU,EAAK,SACf,aACA,MAAO,EAAK,OAAS,GACrB,gBAAiB,EAAK,iBAAmB,KACzC,SAAU,EAAK,SACf,WAAY,EAAK,aAAa,KAC9B,OAAQ,EAAK,OACb,YAAa,EAAK,UAAU,aAAe,EAC7C,CACF,CAEA,SAAgB,EAAmB,EAAoB,EAAqB,EAA+B,CACzG,MAAO,CACL,YAAa,EAAY,UACzB,OAAQ,IAAa,EAAU,QAC7B,EAAQ,UAAU,gBAClB,EAAQ,UAAU,aACpB,KAAM,CAAC,CAAU,EACjB,OAAQ,CAAE,QAAO,CACnB,CACF,CAEA,SAAgB,EAAoB,EAA6B,EAAoB,EAAuB,CAC1G,GAAM,CAAE,EAAY,IAAA,EAAA,EAAA,SAAA,CAA2B,EAAK,EAE9C,CAAE,EAAU,IAAA,EAAA,EAAA,SAAA,CAAyB,IAAI,GAE/C,EAAA,EAAA,UAAA,KAAgB,CACV,EAAK,aAAe,EAAW,KACjC,EAAc,EAAI,EAClB,EAAY,EAAK,KAAK,QAAQ,GAG5B,EAAK,aAAe,EAAW,UAAY,GAC7C,EAAmB,QAAQ,EAAmB,EAAY,EAAU,CAAM,CAAC,CAC/E,EAAG,CAAC,EAAK,UAAU,CAAC,CACtB"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{n as r}from"./CFoexGFe.chunk.js";import{t as i}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{n as r}from"./CFoexGFe.chunk.js";import{t as i}from"./x1pOfdJd.chunk.js";import{c as a}from"./BIZf7Q462.chunk.js";import{t as o}from"./CgYigCRf2.chunk.js";import"./COkf8IPk2.chunk.js";import{t as s}from"./Bt5qHBoM2.chunk.js";import{n as c}from"./DalFHGv7.chunk.js";import{t as l}from"./DyKk_C_Y.chunk.js";import{t as u}from"./CzALYUiA.chunk.js";import{t as d}from"./RVXazxrl.chunk.js";import{t as f}from"./CVg7lnul.chunk.js";import{t as p}from"./CUVnn-Rk.chunk.js";import{t as m}from"./QCFxJYkI.chunk.js";import{t as h}from"./BHEVDLt9.chunk.js";import{t as g}from"./D_xjtP8a.chunk.js";import{t as _}from"./h8NvpGLQ2.chunk.js";import{t as v}from"./CIep1gDJ2.chunk.js";import{t as y}from"./W4Ji-YW82.chunk.js";var b=t(e()),x=n(),S=[l.CuratedMedia,l.LatestReleasedVideos,l.ClassificationLatestReleasedVideosV2,l.SeasonalClassificationMedia,l.TrendingClassificationsMedia,l.ContentPartnerAllVideos,l.PlaylistMedia,l.SeriesMedia,l.ClassificationMedia,l.CuratedClassifications,l.Classifications,l.ClassificationLatestReleasedVideos,l.LatestReleasedClassifications,l.TrendingClassifications,l.SpecialEventClassifications,l.CuratedSeries,l.CuratedMultimedia,l.Blurb,l.CuratedContentPartners,l.SpotlightContentPartners,l.AuthorReviewer,l.Faq,l.Feedback,l.CuratedCompanies,l.Ratings,l.ContinueWatching,l.PersonalisedTopics,l.BecauseYouWatched,l.DynamicBlurb,l.CompanyLatestReleasedVideo,l.CompanyVideos,l.UpcomingLivestreams,l.ClassificationLatestReleasedVideo,l.CompanyClassificationVideos,l.ContentPartnerLatestReleasedVideos,l.ContentPartnerVideos,l.ContentPartnerSeries,l.TrendingContentPartnersVideo];function C(e){switch(e){case l.ClassificationMedia:return`This widget type cannot be selected as this topic has no videos.`;case l.Classifications:return`This widget type cannot be selected as this topic has no child topics.`}}function w(e){let t=a(f.widgetTypes()),n=_(e.dashboardId),[w,T]=b.useState(),E=u.getDashboardTargetInfo(n.data),D=u.isClassificationDashboard(E),O=a(D&&D&&d.classification(E.classificationId)),k=a(D&&d.classificationMembers(E.classificationId,r.Videos)),A=a(D&&d.classificationMembers(E.classificationId,r.Playlists)),j=a(D&&d.classificationMembers(E.classificationId,r.Series)),M=a(D&&d.classificationChildren(E.classificationId)),N=a(p.cvLivePresentation()),P=a(s.currentUser());function F(e){if(!D)return!1;switch(e){case l.ClassificationMedia:return!k.data?.data?.length;case l.Classifications:return!M.data?.length;default:return!1}}function I(e){let t=i[e.id];if(!t||!E||!n.hasCompleted)return!1;let r=g.isProduct(n.data,m.StreamableLearning,N.data?.id),a=o.toObject(P.data?.groups??[],`name`);return t.groups.some(e=>a[e])?(!r&&u.isClassificationDashboard(E)&&(r=O.data?.presentationId===N.data?.id),r?!!t.targets[m.StreamableLearning]?.[E.targetType]:!!t.targets[m.Primary]?.[E.targetType]):!1}function L(){return t.data?t.data.filter(e=>S.includes(e.id)).filter(I).map(e=>{let t=i[e.id],n=F(e.id);return{id:e.id,name:t.displayName,icon:t.icon,groupName:t.groupName,fontSize:`sm`,order:S.indexOf(e.id),infoComponent:()=>(0,x.jsx)(y,{description:e.description}),disabled:n,tooltip:n&&C(e.id)}}):[]}let R=t.hasCompleted&&(!D||k.hasCompleted&&j.hasCompleted&&A.hasCompleted&&O.hasCompleted&&N.hasCompleted);return(0,x.jsxs)(v,{dashboard:n.data,widgetTypeId:w,currentStep:`select-widget`,children:[(0,x.jsx)(`h2`,{className:`h4 mb-4`,children:`Select a widget`}),R?(0,x.jsx)(h,{options:L(),selectedAction:w,setOption:e=>T(e)}):(0,x.jsx)(`div`,{className:`text-center pt-5`,children:(0,x.jsx)(c,{as:`div`,animation:`border`,role:`status`})})]})}export{w as DashboardWizardSelectWidgetView};
|
|
2
|
+
//# sourceMappingURL=BD2aIccu2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Ds6WvphR2.chunk.js","names":[],"sources":["../../../../../src/apps/dashboard-editor/views/wizard/dashboard-wizard-select-widget/DashboardWizardSelectWidgetView.tsx"],"sourcesContent":["import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { WizardOptionHash, WizardOptions } from 'libs/shared/components/wizard/options/WizardOptions';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { Classification, CuratorUser, PlaylistCollection, Presentation, SeriesCollection, VideoCollection } from 'libs/shared/interfaces';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\n\nimport { SubjectMemberType } from 'shared/enums';\nimport { DashboardRequests } from 'shared/flight-requests/DashboardRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { DashboardHelper } from 'shared/utils/DashboardHelper';\n\nimport { PresentationRequests } from 'apps/cv-live/flight-requests/CvLivePresentationRequests';\nimport { DashboardWizardLayout } from 'apps/dashboard-editor/components/wizard/layout/DashboardWizardLayout';\nimport { WizardItemDescription } from 'apps/dashboard-editor/components/wizard/wizard-item-description/WizardItemDescription';\nimport { CuratorWidgetTypeIdConfig } from 'apps/dashboard-editor/constants/CuratorWidgetTypeIdConfig';\nimport { useFetchDashboard } from 'apps/dashboard-editor/hooks/useFetchDashboard';\nimport { WidgetType, WidgetTypesResponse } from 'apps/dashboard-editor/interfaces/data-requests/WidgetsTypesResponse';\n\nconst ORDERED_SELECTABLE_WIDGET_TYPES: WidgetTypeId[] = [\n WidgetTypeId.CuratedMedia,\n WidgetTypeId.LatestReleasedVideos,\n WidgetTypeId.ClassificationLatestReleasedVideosV2,\n WidgetTypeId.SeasonalClassificationMedia,\n WidgetTypeId.TrendingClassificationsMedia,\n WidgetTypeId.ContentPartnerAllVideos,\n WidgetTypeId.PlaylistMedia,\n WidgetTypeId.SeriesMedia,\n WidgetTypeId.ClassificationMedia,\n WidgetTypeId.CuratedClassifications,\n WidgetTypeId.Classifications,\n WidgetTypeId.ClassificationLatestReleasedVideos,\n WidgetTypeId.LatestReleasedClassifications,\n WidgetTypeId.TrendingClassifications,\n WidgetTypeId.SpecialEventClassifications,\n WidgetTypeId.CuratedSeries,\n WidgetTypeId.CuratedMultimedia,\n WidgetTypeId.Blurb,\n WidgetTypeId.CuratedContentPartners,\n WidgetTypeId.SpotlightContentPartners,\n WidgetTypeId.AuthorReviewer,\n WidgetTypeId.Faq,\n WidgetTypeId.Feedback,\n WidgetTypeId.CuratedCompanies,\n WidgetTypeId.Ratings,\n WidgetTypeId.ContinueWatching,\n WidgetTypeId.PersonalisedTopics,\n WidgetTypeId.BecauseYouWatched,\n WidgetTypeId.DynamicBlurb,\n WidgetTypeId.CompanyLatestReleasedVideo,\n WidgetTypeId.CompanyVideos,\n WidgetTypeId.UpcomingLivestreams,\n WidgetTypeId.ClassificationLatestReleasedVideo,\n WidgetTypeId.CompanyClassificationVideos,\n WidgetTypeId.ContentPartnerLatestReleasedVideos,\n WidgetTypeId.ContentPartnerVideos,\n WidgetTypeId.ContentPartnerSeries,\n WidgetTypeId.TrendingContentPartnersVideo\n];\n\nfunction getDisabledTooltip(widgetType: WidgetTypeId): string {\n switch (widgetType) {\n case WidgetTypeId.ClassificationMedia:\n return 'This widget type cannot be selected as this topic has no videos.';\n\n case WidgetTypeId.Classifications:\n return 'This widget type cannot be selected as this topic has no child topics.';\n }\n}\n\ninterface DashboardWizardSelectWidgetViewProps {\n dashboardId: string;\n}\n\nexport function DashboardWizardSelectWidgetView(props: DashboardWizardSelectWidgetViewProps): JSX.Element {\n const widgetTypes = Flight.useBasicFetch<WidgetTypesResponse>(DashboardRequests.widgetTypes());\n const dashboard = useFetchDashboard(props.dashboardId);\n\n const [ widgetId, setWidgetTypeId ] = React.useState<WidgetTypeId>();\n\n const targetInfo = CuratedDashboardHelper.getDashboardTargetInfo(dashboard.data);\n const isTopicDashboard = CuratedDashboardHelper.isClassificationDashboard(targetInfo);\n\n const classification = Flight.useBasicFetch<Classification>(isTopicDashboard &&\n isTopicDashboard &&\n SubjectRequests.classification(targetInfo.classificationId));\n\n const videos = Flight.useBasicFetch<VideoCollection>(\n isTopicDashboard &&\n SubjectRequests.classificationMembers(targetInfo.classificationId, SubjectMemberType.Videos)\n );\n const playlists = Flight.useBasicFetch<PlaylistCollection>(\n isTopicDashboard &&\n SubjectRequests.classificationMembers(targetInfo.classificationId, SubjectMemberType.Playlists)\n );\n const series = Flight.useBasicFetch<SeriesCollection>(\n isTopicDashboard &&\n SubjectRequests.classificationMembers(targetInfo.classificationId, SubjectMemberType.Series)\n );\n const childTopics = Flight.useBasicFetch<Classification[]>(\n isTopicDashboard &&\n SubjectRequests.classificationChildren(targetInfo.classificationId)\n );\n const cvLivePresentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.cvLivePresentation()\n );\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n\n function isDisabled(widgetType: WidgetTypeId): boolean {\n if (!isTopicDashboard)\n return false;\n\n switch (widgetType) {\n case WidgetTypeId.ClassificationMedia:\n return !videos.data?.data?.length;\n\n case WidgetTypeId.Classifications:\n return !childTopics.data?.length;\n\n default:\n return false;\n }\n }\n\n function widgetsTypesFilter(type: WidgetType): boolean {\n const config = CuratorWidgetTypeIdConfig[type.id];\n\n if (!config || !targetInfo || !dashboard.hasCompleted)\n return false;\n\n let isStreamable = DashboardHelper.isProduct(\n dashboard.data,\n ProductId.StreamableLearning,\n cvLivePresentation.data?.id\n );\n\n const userCuratorGroups = ArrayHelper.toObject(currentUser.data?.groups ?? [], 'name');\n\n if (!config.groups.some(group => userCuratorGroups[group]))\n return false;\n\n if (!isStreamable && CuratedDashboardHelper.isClassificationDashboard(targetInfo))\n isStreamable = classification.data?.presentationId === cvLivePresentation.data?.id;\n\n if (isStreamable)\n return !!config.targets[ProductId.StreamableLearning]?.[targetInfo.targetType];\n\n return !!config.targets[ProductId.Primary]?.[targetInfo.targetType];\n }\n\n function getOptions(): WizardOptionHash<WidgetTypeId>[] {\n if (!widgetTypes.data)\n return [];\n\n const selectableWidgetTypes = widgetTypes.data.filter(type => ORDERED_SELECTABLE_WIDGET_TYPES.includes(type.id));\n\n return selectableWidgetTypes\n .filter(widgetsTypesFilter)\n .map(type => {\n const widgetTypeConfig = CuratorWidgetTypeIdConfig[type.id];\n const disabled = isDisabled(type.id);\n\n return {\n id: type.id,\n name: widgetTypeConfig.displayName,\n icon: widgetTypeConfig.icon,\n groupName: widgetTypeConfig.groupName,\n fontSize: 'sm',\n order: ORDERED_SELECTABLE_WIDGET_TYPES.indexOf(type.id),\n infoComponent: () => <WizardItemDescription description={type.description} />,\n disabled,\n tooltip: disabled && getDisabledTooltip(type.id)\n };\n });\n }\n\n const dataLoaded = (\n widgetTypes.hasCompleted &&\n (!isTopicDashboard ||\n (videos.hasCompleted &&\n series.hasCompleted &&\n playlists.hasCompleted &&\n classification.hasCompleted &&\n cvLivePresentation.hasCompleted\n )\n )\n );\n\n return (\n <DashboardWizardLayout\n dashboard={dashboard.data}\n widgetTypeId={widgetId}\n currentStep='select-widget'\n >\n <h2 className='h4 mb-4'>\n Select a widget\n </h2>\n \n {!dataLoaded ? (\n <div className='text-center pt-5'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n ) : (\n <WizardOptions\n options={getOptions()}\n selectedAction={widgetId}\n setOption={option => setWidgetTypeId(option)}\n />\n )}\n </DashboardWizardLayout>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BD2aIccu2.chunk.js","names":[],"sources":["../../../../../src/apps/dashboard-editor/views/wizard/dashboard-wizard-select-widget/DashboardWizardSelectWidgetView.tsx"],"sourcesContent":["import React from 'react';\nimport { Spinner } from 'react-bootstrap';\n\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\n\nimport { WizardOptionHash, WizardOptions } from 'libs/shared/components/wizard/options/WizardOptions';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { Classification, CuratorUser, PlaylistCollection, Presentation, SeriesCollection, VideoCollection } from 'libs/shared/interfaces';\nimport { CuratedDashboardHelper } from 'libs/shared/utils/DashboardHelper';\n\nimport { SubjectMemberType } from 'shared/enums';\nimport { DashboardRequests } from 'shared/flight-requests/DashboardRequests';\nimport { SubjectRequests } from 'shared/flight-requests/SubjectRequests';\nimport { DashboardHelper } from 'shared/utils/DashboardHelper';\n\nimport { PresentationRequests } from 'apps/cv-live/flight-requests/CvLivePresentationRequests';\nimport { DashboardWizardLayout } from 'apps/dashboard-editor/components/wizard/layout/DashboardWizardLayout';\nimport { WizardItemDescription } from 'apps/dashboard-editor/components/wizard/wizard-item-description/WizardItemDescription';\nimport { CuratorWidgetTypeIdConfig } from 'apps/dashboard-editor/constants/CuratorWidgetTypeIdConfig';\nimport { useFetchDashboard } from 'apps/dashboard-editor/hooks/useFetchDashboard';\nimport { WidgetType, WidgetTypesResponse } from 'apps/dashboard-editor/interfaces/data-requests/WidgetsTypesResponse';\n\nconst ORDERED_SELECTABLE_WIDGET_TYPES: WidgetTypeId[] = [\n WidgetTypeId.CuratedMedia,\n WidgetTypeId.LatestReleasedVideos,\n WidgetTypeId.ClassificationLatestReleasedVideosV2,\n WidgetTypeId.SeasonalClassificationMedia,\n WidgetTypeId.TrendingClassificationsMedia,\n WidgetTypeId.ContentPartnerAllVideos,\n WidgetTypeId.PlaylistMedia,\n WidgetTypeId.SeriesMedia,\n WidgetTypeId.ClassificationMedia,\n WidgetTypeId.CuratedClassifications,\n WidgetTypeId.Classifications,\n WidgetTypeId.ClassificationLatestReleasedVideos,\n WidgetTypeId.LatestReleasedClassifications,\n WidgetTypeId.TrendingClassifications,\n WidgetTypeId.SpecialEventClassifications,\n WidgetTypeId.CuratedSeries,\n WidgetTypeId.CuratedMultimedia,\n WidgetTypeId.Blurb,\n WidgetTypeId.CuratedContentPartners,\n WidgetTypeId.SpotlightContentPartners,\n WidgetTypeId.AuthorReviewer,\n WidgetTypeId.Faq,\n WidgetTypeId.Feedback,\n WidgetTypeId.CuratedCompanies,\n WidgetTypeId.Ratings,\n WidgetTypeId.ContinueWatching,\n WidgetTypeId.PersonalisedTopics,\n WidgetTypeId.BecauseYouWatched,\n WidgetTypeId.DynamicBlurb,\n WidgetTypeId.CompanyLatestReleasedVideo,\n WidgetTypeId.CompanyVideos,\n WidgetTypeId.UpcomingLivestreams,\n WidgetTypeId.ClassificationLatestReleasedVideo,\n WidgetTypeId.CompanyClassificationVideos,\n WidgetTypeId.ContentPartnerLatestReleasedVideos,\n WidgetTypeId.ContentPartnerVideos,\n WidgetTypeId.ContentPartnerSeries,\n WidgetTypeId.TrendingContentPartnersVideo\n];\n\nfunction getDisabledTooltip(widgetType: WidgetTypeId): string {\n switch (widgetType) {\n case WidgetTypeId.ClassificationMedia:\n return 'This widget type cannot be selected as this topic has no videos.';\n\n case WidgetTypeId.Classifications:\n return 'This widget type cannot be selected as this topic has no child topics.';\n }\n}\n\ninterface DashboardWizardSelectWidgetViewProps {\n dashboardId: string;\n}\n\nexport function DashboardWizardSelectWidgetView(props: DashboardWizardSelectWidgetViewProps): JSX.Element {\n const widgetTypes = Flight.useBasicFetch<WidgetTypesResponse>(DashboardRequests.widgetTypes());\n const dashboard = useFetchDashboard(props.dashboardId);\n\n const [ widgetId, setWidgetTypeId ] = React.useState<WidgetTypeId>();\n\n const targetInfo = CuratedDashboardHelper.getDashboardTargetInfo(dashboard.data);\n const isTopicDashboard = CuratedDashboardHelper.isClassificationDashboard(targetInfo);\n\n const classification = Flight.useBasicFetch<Classification>(isTopicDashboard &&\n isTopicDashboard &&\n SubjectRequests.classification(targetInfo.classificationId));\n\n const videos = Flight.useBasicFetch<VideoCollection>(\n isTopicDashboard &&\n SubjectRequests.classificationMembers(targetInfo.classificationId, SubjectMemberType.Videos)\n );\n const playlists = Flight.useBasicFetch<PlaylistCollection>(\n isTopicDashboard &&\n SubjectRequests.classificationMembers(targetInfo.classificationId, SubjectMemberType.Playlists)\n );\n const series = Flight.useBasicFetch<SeriesCollection>(\n isTopicDashboard &&\n SubjectRequests.classificationMembers(targetInfo.classificationId, SubjectMemberType.Series)\n );\n const childTopics = Flight.useBasicFetch<Classification[]>(\n isTopicDashboard &&\n SubjectRequests.classificationChildren(targetInfo.classificationId)\n );\n const cvLivePresentation = Flight.useBasicFetch<Presentation>(\n PresentationRequests.cvLivePresentation()\n );\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n\n function isDisabled(widgetType: WidgetTypeId): boolean {\n if (!isTopicDashboard)\n return false;\n\n switch (widgetType) {\n case WidgetTypeId.ClassificationMedia:\n return !videos.data?.data?.length;\n\n case WidgetTypeId.Classifications:\n return !childTopics.data?.length;\n\n default:\n return false;\n }\n }\n\n function widgetsTypesFilter(type: WidgetType): boolean {\n const config = CuratorWidgetTypeIdConfig[type.id];\n\n if (!config || !targetInfo || !dashboard.hasCompleted)\n return false;\n\n let isStreamable = DashboardHelper.isProduct(\n dashboard.data,\n ProductId.StreamableLearning,\n cvLivePresentation.data?.id\n );\n\n const userCuratorGroups = ArrayHelper.toObject(currentUser.data?.groups ?? [], 'name');\n\n if (!config.groups.some(group => userCuratorGroups[group]))\n return false;\n\n if (!isStreamable && CuratedDashboardHelper.isClassificationDashboard(targetInfo))\n isStreamable = classification.data?.presentationId === cvLivePresentation.data?.id;\n\n if (isStreamable)\n return !!config.targets[ProductId.StreamableLearning]?.[targetInfo.targetType];\n\n return !!config.targets[ProductId.Primary]?.[targetInfo.targetType];\n }\n\n function getOptions(): WizardOptionHash<WidgetTypeId>[] {\n if (!widgetTypes.data)\n return [];\n\n const selectableWidgetTypes = widgetTypes.data.filter(type => ORDERED_SELECTABLE_WIDGET_TYPES.includes(type.id));\n\n return selectableWidgetTypes\n .filter(widgetsTypesFilter)\n .map(type => {\n const widgetTypeConfig = CuratorWidgetTypeIdConfig[type.id];\n const disabled = isDisabled(type.id);\n\n return {\n id: type.id,\n name: widgetTypeConfig.displayName,\n icon: widgetTypeConfig.icon,\n groupName: widgetTypeConfig.groupName,\n fontSize: 'sm',\n order: ORDERED_SELECTABLE_WIDGET_TYPES.indexOf(type.id),\n infoComponent: () => <WizardItemDescription description={type.description} />,\n disabled,\n tooltip: disabled && getDisabledTooltip(type.id)\n };\n });\n }\n\n const dataLoaded = (\n widgetTypes.hasCompleted &&\n (!isTopicDashboard ||\n (videos.hasCompleted &&\n series.hasCompleted &&\n playlists.hasCompleted &&\n classification.hasCompleted &&\n cvLivePresentation.hasCompleted\n )\n )\n );\n\n return (\n <DashboardWizardLayout\n dashboard={dashboard.data}\n widgetTypeId={widgetId}\n currentStep='select-widget'\n >\n <h2 className='h4 mb-4'>\n Select a widget\n </h2>\n \n {!dataLoaded ? (\n <div className='text-center pt-5'>\n <Spinner as='div' animation='border' role='status' />\n </div>\n ) : (\n <WizardOptions\n options={getOptions()}\n selectedAction={widgetId}\n setOption={option => setWidgetTypeId(option)}\n />\n )}\n </DashboardWizardLayout>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,r as t}from"./BlDu0qdC.chunk.js";import{t as n}from"./DqUkhPat.chunk.js";import{t as r}from"./DEBg-sxL.chunk.js";import{t as i}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{t as a}from"./M97_Ztsu.chunk.js";import{r as o}from"./DkstLT1W.chunk.js";import{c as s,d as c}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as l}from"./C1PTqhPY2.chunk.js";import{t as u}from"./Bt5qHBoM2.chunk.js";import{n as d,r as f,t as p}from"./lFyCTjyz2.chunk.js";import{n as m}from"./BwAM2wHw.chunk.js";import{t as h}from"./CWbBaJAA.chunk.js";import{t as g}from"./DLDFNrWX2.chunk.js";import{t as _}from"./CVBPygL42.chunk.js";import{t as v}from"./C0g24IgE.chunk.js";import{t as y}from"./BDnQ3Dqe.chunk.js";import{t as b}from"./wbPvk2s42.chunk.js";import{i as x}from"./jrW8casn.chunk.js";import{n as S,t as C}from"./BXZW3SN2.chunk.js";import{t as w}from"./v-3x6QfN.chunk.js";import{t as T}from"./CJ7nWaoU.chunk.js";import{t as E}from"./DyO4gCJR.chunk.js";import{t as D}from"./C7dlHt1F.chunk.js";import{t as O}from"./DiC2MXI5.chunk.js";import{t as k}from"./BkB6-4E82.chunk.js";import{n as A,t as j}from"./7_JVCgAt2.chunk.js";import{t as M}from"./gzUId2LV2.chunk.js";import{n as N}from"./C2ex5xMc.chunk.js";import{t as P}from"./DpqKiNuw.chunk.js";import{n as F}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{a as e,r as t}from"./BlDu0qdC.chunk.js";import{t as n}from"./DqUkhPat.chunk.js";import{t as r}from"./DEBg-sxL.chunk.js";import{t as i}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{t as a}from"./M97_Ztsu.chunk.js";import{r as o}from"./DkstLT1W.chunk.js";import{c as s,d as c}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as l}from"./C1PTqhPY2.chunk.js";import{t as u}from"./Bt5qHBoM2.chunk.js";import{n as d,r as f,t as p}from"./lFyCTjyz2.chunk.js";import{n as m}from"./BwAM2wHw.chunk.js";import{t as h}from"./CWbBaJAA.chunk.js";import{t as g}from"./DLDFNrWX2.chunk.js";import{t as _}from"./CVBPygL42.chunk.js";import{t as v}from"./C0g24IgE.chunk.js";import{t as y}from"./BDnQ3Dqe.chunk.js";import{t as b}from"./wbPvk2s42.chunk.js";import{i as x}from"./jrW8casn.chunk.js";import{n as S,t as C}from"./BXZW3SN2.chunk.js";import{t as w}from"./v-3x6QfN.chunk.js";import{t as T}from"./CJ7nWaoU.chunk.js";import{t as E}from"./DyO4gCJR.chunk.js";import{t as D}from"./C7dlHt1F.chunk.js";import{t as O}from"./DiC2MXI5.chunk.js";import{t as k}from"./BkB6-4E82.chunk.js";import{n as A,t as j}from"./7_JVCgAt2.chunk.js";import{t as M}from"./gzUId2LV2.chunk.js";import{n as N}from"./C2ex5xMc.chunk.js";import{t as P}from"./DpqKiNuw.chunk.js";import{n as F}from"./B0UOCPE6.chunk.js";e();var I=t(),L=(e,t,n)=>({...E(e,t),client:C.Curator,removeUser:{application:i.CRM_STUDIO,action:r.CrmStudio.REMOVE_USER_FROM_CUSTOMER,args:[e,n]},toggleStatus:{application:i.CRM_STUDIO,action:r.CrmStudio.TOGGLE_USER_STATUS,args:[e,n]},changePassword:{application:i.CRM_STUDIO,action:r.CrmStudio.CHANGE_PASSWORD,args:[e,n]},userCredit:{application:i.CRM_STUDIO,action:r.CrmStudio.EDIT_USER_CREDIT,args:[e,n]},manageYearGroup:{application:i.CRM_STUDIO,action:r.CrmStudio.MANAGE_YEAR_GROUP,args:[e,n]}}),R=m(),z={status:e=>R.accessor(`status`,{id:`status`,header:`Status`,cell:t=>(0,I.jsx)(`div`,{className:`d-flex gap-1`,children:(0,I.jsx)(S,{user:{...t.row.original.user,id:t.row.original.userId},currentUser:e,className:`rounded p-1`,showActiveBadge:!0})}),size:200}),customerName:()=>R.accessor(`customerName`,{id:`customerName`,header:`Customer name`,cell:e=>(0,I.jsx)(n,{appLink:{application:i.CRM_STUDIO,action:r.CrmStudio.CUSTOMER_OVERVIEW,args:[e.row.original.customerId]},className:`text-info`,children:e.getValue()}),size:350}),crmId:()=>R.accessor(e=>e.customer?.crmId,{id:`crmId`,header:`CVC ID`,cell:e=>(0,I.jsx)(n,{appLink:{application:i.CRM_STUDIO,action:r.CrmStudio.CUSTOMER_OVERVIEW,args:[e.row.original.customerId]},className:`text-info`,children:e.getValue()}),size:100}),yearGroup:e=>R.accessor(`yearGroup`,{id:`yearGroup`,header:`Year group`,cell:t=>(0,I.jsx)(x,{userType:e,badgeText:t.getValue()}),size:150}),admin:(e,t,n,r)=>R.accessor(e=>e,{id:`admin`,header:`Admin`,cell:i=>{let a=p.getUserStatusFromValue(i.row.original.status)===f.Active&&!t;return(0,I.jsx)(`div`,{className:`w-100 d-flex justify-content-start`,children:r===l.Learner||t?(0,I.jsx)(y,{on:i.row.original.role===d.Admin,onClick:()=>{},showStateWhenDisabled:!0,disabled:!0,tooltipText:`Cannot toggle admin when editing current user`}):(0,I.jsx)(v,{initialValues:{...F(i.row.original.user,i.row.original.customerId),masterRole:i.row.original.role},onSubmit:null,children:(0,I.jsx)(O,{user:i.row.original.user,userType:r,countryCode:i.row.original.customer?.country?.code,isEditingCurrentUser:t,isDisabled:!a,isValidatingEmail:!1,editSsoFields:n,hasOrg:!!i.row.original.customer?.organisation,canEditSuperAdmin:!0,onRoleChange:t=>e(i.row.original.customerId,t),hideLabel:!0})})})},size:100}),actions:e=>R.accessor(e=>e,{id:`actions`,header:`Actions`,cell:t=>{let n=t.row.original.customerId,r=t.row.original.customer,i=r.contentRegion&&r.contentRegion.systemName!==a.US,o=!!r._integrations?.rostered;return(0,I.jsx)(`div`,{className:`w-100 d-flex justify-content-center`,children:(0,I.jsx)(D,{user:{...t.row.original.user,id:t.row.original.userId},userType:e.userType,appLinks:L(n,e.userType,t.row.original.userId),onClickSendResetEmail:e.onClickSendResetEmail,onClickResendActivationEmail:e.onClickResendActivationEmail,onClickSendVerificationEmail:e.onClickSendVerificationEmail,currentUser:e.currentUser,products:e.products,isEditUserForm:!0,hasRostering:o,hasUserCredit:i&&e.canEditUserCredit,filterActions:e=>[`Remove user`,`Reactivate account`,`Deactivate account`,`Change password`,`Update user credit limit`,`Manage year group`].includes(typeof e.label==`string`?e.label:``)})})},size:100})};function B({data:e,userType:t,onAdminToggle:n,user:r,currentUser:i,products:a,hasUserCredit:o,hasRostering:s,canEditUserCredit:c,isEditingCurrentUser:u,canEditSsoFields:d}){return(0,I.jsx)(h,{data:e,columns:[z.status(i),z.crmId(),z.customerName(),...t===l.Staff?[z.admin(n,!!u,d,t)]:[z.yearGroup(t)],z.actions({userType:t,hasRostering:s,currentUser:i,products:a,hasUserCredit:o,canEditUserCredit:c,client:C.Curator,user:r})],theme:{...M,row:``,cell:`py-2 px-3`,header:`text-left`}})}function V(e){let t=c(),n=_(),{hasPermissions:a}=g(),d=a(o.UserCreditUpdate),m=a(o.UsersSsoUpdate),h=s(w.getUserWithCustomers(e.id)),v=h.data?{...h.data,status:p.getUserStatusFromValue(h.data?.status)}:void 0,y=v?.userProfile?.customer?.id,x=s(u.currentUser()),S=v?.userProfiles?.data.length===0,E=v&&p.getUserType(v),D=!e.id||x?.data?.id?.toString()===e.id?.toString();async function O(e,r){try{if(p.getUserType(v)!==l.Staff||D||v.status===f.Disabled)return;let i={...v,masterRole:r,customerId:e,firstName:v?.name,userId:v?.id,email:v?.email,displayName:v?.metadata?.displayName};await t(w.updateUser(e,i,x.data?.id)),n.success(`User role successfully updated`)}catch{n.error(`Failed to update user role`)}}let M=e.id,F=Array.isArray(v?.userProfiles?.data)?v.userProfiles.data.filter(e=>e&&e.customer&&e.customer.id&&e.customer.name).map((e,t)=>({customerName:e.customer.name,customerId:e.customer.id,userId:M,yearGroup:v?.yearGroups.data[t]?.name,role:p.getUserRoleFromValue(e.role),isEditingCurrentUser:D,customer:e.customer,status:e.status,user:{...v,...e,status:p.getUserStatusFromValue(v?.status)===f.Inactive?f.Inactive:e.status,metadata:{...v?.metadata,...e?.metadata}}})):[];s(y&&w.getAuthenticationMethodsByUserIds(y,F.map(e=>e.userId).sort()));let L=y?h.hasCompleted&&F.length>0&&x.hasCompleted:x.hasCompleted&&h.hasCompleted;return(0,I.jsx)(T.Provider,{value:C.Curator,children:(0,I.jsx)(j,{view:A.Users,children:(0,I.jsxs)(P,{title:`Customer schools`,id:e.id,loading:!1,currentTabId:`schools`,children:[h.hasCompleted&&v&&(0,I.jsx)(`div`,{className:`mb-3`,children:(0,I.jsx)(k,{heading:`User details`,children:(0,I.jsxs)(`div`,{className:`p-3`,children:[(0,I.jsxs)(`div`,{className:`row mb-3`,children:[(0,I.jsx)(`div`,{className:`font-label col col-3`,children:`Full name`}),(0,I.jsxs)(`div`,{className:`col`,children:[v.name,` `,v.surname]})]}),(0,I.jsxs)(`div`,{className:`row`,children:[(0,I.jsx)(`div`,{className:`font-label col col-3`,children:`Last active`}),(0,I.jsx)(`div`,{className:`col`,children:N(v.metadata?.lastSignInTime,v.status)})]})]})})}),(0,I.jsx)(k,{heading:`Customer schools`,disableCollapse:!0,buttonText:`Add user to another customer`,buttonAppLink:v?.status!==f.Inactive&&{application:i.CRM_STUDIO,action:r.CrmStudio.ADD_USER_TO_CUSTOMER,args:[y,e.id]},children:S?(0,I.jsx)(`div`,{className:`m-3`,children:`No other customer schools found.`}):L?(0,I.jsx)(`div`,{className:`d-flex flex-column`,id:`customer-schools-portal`,children:(0,I.jsx)(B,{data:F,userType:E,onAdminToggle:O,user:v,currentUser:x.data,hasRostering:!1,canEditUserCredit:d,isEditingCurrentUser:D,canEditSsoFields:m})}):(0,I.jsx)(b,{})})]})})})}export{V as UsersCustomerSchoolsView};
|
|
2
|
+
//# sourceMappingURL=BJJeLngO2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BwpzKPd12.chunk.js","names":[],"sources":["../../../../../src/apps/crm-studio/components/tables/UsersCustomerSchoolsTable.tsx","../../../../../src/apps/crm-studio/views/users/UsersCustomerSchoolsView.tsx"],"sourcesContent":["import React from 'react';\nimport { createColumnHelper } from '@tanstack/react-table';\n\nimport { RoleOrYearGroup } from 'libs/shared/apps/user-manager/components/user-list-items/components/RoleOrYearGroup';\nimport { UserItemActions } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserItemActions';\nimport { UserStatusBadge } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserStatusBadge';\nimport { UserRoleField } from 'libs/shared/apps/user-manager/components/user-role/UserRoleField';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { EditUserRequest, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { TableV2 } from 'libs/shared/components/table-v2/TableV2';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { CurrentUser, User } from 'libs/shared/interfaces/models/User';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions as CuratorActions } from 'shared/constants';\nimport { AppChannels } from 'shared/constants';\n\nimport { getUserManagerAppLinks } from 'apps/crm-studio/helpers/CuratorUserManagerAppLinks';\nimport { getUserInitialValues } from 'apps/crm-studio/views/users/edit-user/EditUserUtils';\nimport { UsersCustomerSchoolsRow } from 'apps/crm-studio/views/users/UsersCustomerSchoolsView';\n\nimport { CrmStudioTableTheme } from './CrmStudioTableTheme';\n\nconst getApplinks = (customerId: string, userType: UserGroup, userId: string): UserManagerAppLinks => {\n return {\n ...getUserManagerAppLinks(customerId, userType),\n client: UserManagerClient.Curator,\n removeUser: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.REMOVE_USER_FROM_CUSTOMER,\n args: [ customerId, userId ]\n },\n toggleStatus: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.TOGGLE_USER_STATUS,\n args: [ customerId, userId ]\n },\n changePassword: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.CHANGE_PASSWORD,\n args: [ customerId, userId ]\n },\n userCredit: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.EDIT_USER_CREDIT,\n args: [ customerId, userId ]\n },\n manageYearGroup: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.MANAGE_YEAR_GROUP,\n args: [ customerId, userId ]\n }\n };\n};\n\nexport interface UsersCustomerSchoolsTableProps {\n data: UsersCustomerSchoolsRow[];\n userType: UserGroup;\n onAdminToggle?: (customerId: string, role: UserRole) => void;\n user?: User;\n currentUser?: CurrentUser;\n products?: ProductId[];\n hasUserCredit?: boolean;\n hasRostering?: boolean;\n canEditUserCredit?: boolean;\n isEditingCurrentUser?: boolean;\n isTogglingAdmin?: boolean;\n yearGroups?: YearGroup[];\n canEditSsoFields?: boolean;\n}\n\nconst columnHelper = createColumnHelper<UsersCustomerSchoolsRow>();\nconst UsersCustomerSchoolsColumns = {\n status: (currentUser: CurrentUser) =>\n columnHelper.accessor('status', {\n id: 'status',\n header: 'Status',\n cell: props => {\n return (\n <div className='d-flex gap-1'>\n <UserStatusBadge\n // Get id of base User not the individual UserProfile\n user={{ ...props.row.original.user, id: props.row.original.userId }}\n currentUser={currentUser}\n className='rounded p-1'\n showActiveBadge\n />\n </div>\n );\n },\n size: 200\n }),\n customerName: () =>\n columnHelper.accessor('customerName', {\n id: 'customerName',\n header: 'Customer name',\n cell: props => (\n <AppLink\n appLink={{\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.CUSTOMER_OVERVIEW,\n args: [props.row.original.customerId]\n }}\n className='text-info'\n >\n {props.getValue()}\n </AppLink>\n ),\n size: 350\n }),\n crmId: () =>\n columnHelper.accessor(row => row.customer?.crmId, {\n id: 'crmId',\n header: 'CVC ID',\n cell: props => (\n <AppLink\n appLink={{\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.CUSTOMER_OVERVIEW,\n args: [props.row.original.customerId]\n }}\n className='text-info'\n >\n {props.getValue()}\n </AppLink>\n ),\n size: 100\n }),\n yearGroup: (userType: UserGroup) =>\n columnHelper.accessor('yearGroup', {\n id: 'yearGroup',\n header: 'Year group',\n cell: props => {\n return <RoleOrYearGroup userType={userType} badgeText={props.getValue()} />;\n },\n size: 150\n }),\n admin: (\n onAdminToggle: (customerId: string, role: UserRole) => void,\n isEditingCurrentUser: boolean,\n canEditSsoFields: boolean,\n userType: UserGroup\n ) =>\n columnHelper.accessor(row => row, {\n id: 'admin',\n header: 'Admin',\n cell: props => {\n const enabled = UserHelper.getUserStatusFromValue(props.row.original.status) === ObjectStatus.Active;\n const canToggle = enabled && !isEditingCurrentUser;\n return (\n <div className='w-100 d-flex justify-content-start'>\n {userType === UserGroup.Learner || isEditingCurrentUser ?\n <ToggleSwitch\n on={props.row.original.role === UserRole.Admin}\n onClick={() => {}}\n showStateWhenDisabled={true}\n disabled={true}\n tooltipText='Cannot toggle admin when editing current user'\n /> :\n <FormWrapper<EditUserRequest>\n initialValues={{ ...getUserInitialValues(\n props.row.original.user,\n props.row.original.customerId\n ), masterRole: props.row.original.role }}\n onSubmit={null}\n >\n <UserRoleField\n user={props.row.original.user}\n userType={userType}\n countryCode={props.row.original.customer?.country?.code}\n isEditingCurrentUser={isEditingCurrentUser}\n isDisabled={!canToggle}\n isValidatingEmail={false}\n editSsoFields={canEditSsoFields}\n hasOrg={!!props.row.original.customer?.organisation}\n canEditSuperAdmin\n onRoleChange={(newRole: UserRole) => onAdminToggle(\n props.row.original.customerId,\n newRole\n )}\n hideLabel\n />\n </FormWrapper>}\n </div>\n );\n },\n size: 100\n }),\n actions: (userProps: any) =>\n columnHelper.accessor(row => row, {\n id: 'actions',\n header: 'Actions',\n cell: props => {\n const customerId = props.row.original.customerId;\n const customer = props.row.original.customer;\n const isNotUs = customer.contentRegion && customer.contentRegion.systemName !== ContentRegion.US;\n const hasRostering = !!customer._integrations?.rostered;\n return (\n <div className='w-100 d-flex justify-content-center'>\n <UserItemActions\n user={{ ...props.row.original.user, id: props.row.original.userId }}\n userType={userProps.userType}\n appLinks={getApplinks(customerId, userProps.userType, props.row.original.userId)}\n onClickSendResetEmail={userProps.onClickSendResetEmail}\n onClickResendActivationEmail={userProps.onClickResendActivationEmail}\n onClickSendVerificationEmail={userProps.onClickSendVerificationEmail}\n currentUser={userProps.currentUser}\n products={userProps.products}\n isEditUserForm\n hasRostering={hasRostering}\n hasUserCredit={isNotUs && userProps.canEditUserCredit}\n filterActions={action => [\n 'Remove user',\n 'Reactivate account',\n 'Deactivate account',\n 'Change password',\n 'Update user credit limit',\n 'Manage year group'\n ].includes(typeof action.label === 'string' ? action.label : '')}\n />\n </div>\n );\n },\n size: 100\n })\n};\n\nexport function UsersCustomerSchoolsTable({\n data,\n userType,\n onAdminToggle,\n user,\n currentUser,\n products,\n hasUserCredit,\n hasRostering,\n canEditUserCredit,\n isEditingCurrentUser,\n canEditSsoFields\n}: UsersCustomerSchoolsTableProps) {\n const columns = [\n UsersCustomerSchoolsColumns.status(currentUser),\n UsersCustomerSchoolsColumns.crmId(),\n UsersCustomerSchoolsColumns.customerName(),\n ...(userType !== UserGroup.Staff ?\n [UsersCustomerSchoolsColumns.yearGroup(userType)] :\n [UsersCustomerSchoolsColumns.admin(\n onAdminToggle,\n !!isEditingCurrentUser,\n canEditSsoFields,\n userType\n )]\n ),\n UsersCustomerSchoolsColumns.actions({\n userType,\n hasRostering,\n currentUser,\n products,\n hasUserCredit,\n canEditUserCredit,\n client: UserManagerClient.Curator,\n user\n })\n ];\n\n const theme = {\n ...CrmStudioTableTheme,\n row: '',\n cell: 'py-2 px-3',\n header: 'text-left'\n };\n\n return (\n <TableV2\n data={data}\n columns={columns}\n theme={theme}\n />\n );\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { getLastActiveDate } from 'libs/shared/apps/user-manager/components/user-list-items/components/LastActive';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { DropdownContainer } from 'libs/shared/components/dropdown-container/DropdownContainer';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CuratorUser, CurrentUser, Customer, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions } from 'shared/constants/CuratorActions';\nimport { AppChannels } from 'shared/constants/RadioChannels';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks/UseCuratorPermissions';\n\nimport { UsersCustomerSchoolsTable } from 'apps/crm-studio/components/tables/UsersCustomerSchoolsTable';\nimport { CustomerRequests } from 'apps/crm-studio/flight-requests/CustomerRequests';\nimport { CrmStudioLayoutView, CrmStudioLayoutViewPage } from 'apps/crm-studio/views/layout/CrmStudioLayout';\nimport { CrmStudioUserLayout } from 'apps/crm-studio/views/layout/CrmStudioUserLayout';\n\ninterface UsersCustomerSchoolsViewProps {\n id: string;\n}\n\nexport type UsersCustomerSchoolsRow = {\n status: ObjectStatus,\n customerName: string,\n customerId: string,\n yearGroup: string,\n isEditingCurrentUser: boolean,\n customer: Customer,\n user?: User,\n role?: UserRole,\n userId: string,\n onAdminToggle?: (customerId: string, role: UserRole) => void\n};\n\nexport function UsersCustomerSchoolsView(props: UsersCustomerSchoolsViewProps) {\n const fetchAsync = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n const { hasPermissions } = useCuratorPermissions();\n\n const canEditUserCredit = hasPermissions(CuratorPermissionName.UserCreditUpdate);\n const canEditSsoFields = hasPermissions(CuratorPermissionName.UsersSsoUpdate);\n \n const userRaw = Flight.useBasicFetch<User>(CustomerRequests.getUserWithCustomers(props.id));\n const user = userRaw.data ?\n { ...userRaw.data, status: UserHelper.getUserStatusFromValue(userRaw.data?.status) } :\n undefined;\n\n const customerId = user?.userProfile?.customer?.id;\n const currentUser = Flight.useBasicFetch<CurrentUser | CuratorUser>(UserRequests.currentUser());\n \n const noOtherSchools = user?.userProfiles?.data.length === 0;\n const userType = user && UserHelper.getUserType(user);\n const isEditingCurrentUser = !props.id || (currentUser?.data?.id?.toString() === props.id?.toString());\n\n async function handleAdminToggle(targetCustomerId: string, role: UserRole): Promise<void> {\n try {\n if (UserHelper.getUserType(user) !== UserGroup.Staff || isEditingCurrentUser) return;\n if (user.status === ObjectStatus.Disabled) return;\n\n const updatedUser = {\n ...user,\n masterRole: role,\n customerId: targetCustomerId,\n firstName: user?.name,\n userId: user?.id,\n email: user?.email,\n displayName: user?.metadata?.displayName\n };\n\n await fetchAsync(CustomerRequests.updateUser(\n targetCustomerId,\n updatedUser,\n currentUser.data?.id\n ));\n alerts.success(`User role successfully updated`);\n } catch {\n alerts.error('Failed to update user role');\n }\n }\n\n const userId = props.id;\n const usersCustomerSchoolsRows: UsersCustomerSchoolsRow[] = Array.isArray(user?.userProfiles?.data) ?\n user.userProfiles.data\n .filter(profile => profile && profile.customer && profile.customer.id && profile.customer.name)\n .map((profile, idx) => ({\n customerName: profile.customer.name,\n customerId: profile.customer.id,\n userId: userId,\n yearGroup: user?.yearGroups.data[idx]?.name,\n role: UserHelper.getUserRoleFromValue(profile.role),\n isEditingCurrentUser,\n customer: profile.customer,\n status: profile.status,\n user: {\n ...user,\n ...profile,\n // Base user and userProfile have different statuses when user is pending.\n // Userprofile is Active, but user is Inactive. So set userprofile status to Inactive\n // while user is pending\n status: UserHelper.getUserStatusFromValue(user?.status) !== ObjectStatus.Inactive ?\n profile.status :\n ObjectStatus.Inactive,\n metadata: {\n ...user?.metadata,\n ...profile?.metadata\n }\n }\n })) :\n [];\n // fetch authentication methods for user\n Flight.useBasicFetch(\n customerId && CustomerRequests.getAuthenticationMethodsByUserIds(\n customerId,\n usersCustomerSchoolsRows.map(row => row.userId).sort()\n )\n );\n\n const isLoaded = customerId ? (\n userRaw.hasCompleted &&\n usersCustomerSchoolsRows.length > 0 &&\n currentUser.hasCompleted\n ) : (\n currentUser.hasCompleted &&\n userRaw.hasCompleted\n );\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Curator}>\n <CrmStudioLayoutView view={CrmStudioLayoutViewPage.Users}>\n <CrmStudioUserLayout\n title='Customer schools'\n id={props.id}\n loading={false}\n currentTabId='schools'\n >\n {userRaw.hasCompleted && user && (\n <div className='mb-3'>\n <DropdownContainer heading='User details'>\n <div className='p-3'>\n <div className='row mb-3'>\n <div className='font-label col col-3'>Full name</div>\n <div className='col'>{user.name} {user.surname}</div>\n </div>\n <div className='row'>\n <div className='font-label col col-3'>Last active</div>\n <div className='col'>{getLastActiveDate(user.metadata?.lastSignInTime, user.status)}</div>\n </div>\n </div>\n \n </DropdownContainer>\n </div>\n )}\n <DropdownContainer\n heading='Customer schools'\n disableCollapse\n buttonText='Add user to another customer'\n buttonAppLink={user?.status !== ObjectStatus.Inactive && {\n application: AppChannels.CRM_STUDIO,\n action: Actions.CrmStudio.ADD_USER_TO_CUSTOMER,\n args: [ customerId, props.id ]\n }}\n >\n {noOtherSchools ? (\n <div className='m-3'>No other customer schools found.</div>\n ) : isLoaded ? (\n <div className='d-flex flex-column' id='customer-schools-portal'>\n <UsersCustomerSchoolsTable\n data={usersCustomerSchoolsRows}\n userType={userType}\n onAdminToggle={handleAdminToggle}\n user={user}\n currentUser={currentUser.data as CurrentUser}\n hasRostering={false}\n canEditUserCredit={canEditUserCredit}\n isEditingCurrentUser={isEditingCurrentUser}\n canEditSsoFields={canEditSsoFields}\n />\n </div>\n ) : (\n <PopupLoadingSpinner />\n )}\n </DropdownContainer>\n </CrmStudioUserLayout>\n </CrmStudioLayoutView>\n </UserManagerClientContext.Provider>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BJJeLngO2.chunk.js","names":[],"sources":["../../../../../src/apps/crm-studio/components/tables/UsersCustomerSchoolsTable.tsx","../../../../../src/apps/crm-studio/views/users/UsersCustomerSchoolsView.tsx"],"sourcesContent":["import React from 'react';\nimport { createColumnHelper } from '@tanstack/react-table';\n\nimport { RoleOrYearGroup } from 'libs/shared/apps/user-manager/components/user-list-items/components/RoleOrYearGroup';\nimport { UserItemActions } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserItemActions';\nimport { UserStatusBadge } from 'libs/shared/apps/user-manager/components/user-list-items/components/UserStatusBadge';\nimport { UserRoleField } from 'libs/shared/apps/user-manager/components/user-role/UserRoleField';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { EditUserRequest, UserManagerAppLinks } from 'libs/shared/apps/user-manager/interfaces';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { TableV2 } from 'libs/shared/components/table-v2/TableV2';\nimport { ToggleSwitch } from 'libs/shared/components/toggle-switch/ToggleSwitch';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { YearGroup } from 'libs/shared/interfaces';\nimport { CurrentUser, User } from 'libs/shared/interfaces/models/User';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions as CuratorActions } from 'shared/constants';\nimport { AppChannels } from 'shared/constants';\n\nimport { getUserManagerAppLinks } from 'apps/crm-studio/helpers/CuratorUserManagerAppLinks';\nimport { getUserInitialValues } from 'apps/crm-studio/views/users/edit-user/EditUserUtils';\nimport { UsersCustomerSchoolsRow } from 'apps/crm-studio/views/users/UsersCustomerSchoolsView';\n\nimport { CrmStudioTableTheme } from './CrmStudioTableTheme';\n\nconst getApplinks = (customerId: string, userType: UserGroup, userId: string): UserManagerAppLinks => {\n return {\n ...getUserManagerAppLinks(customerId, userType),\n client: UserManagerClient.Curator,\n removeUser: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.REMOVE_USER_FROM_CUSTOMER,\n args: [ customerId, userId ]\n },\n toggleStatus: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.TOGGLE_USER_STATUS,\n args: [ customerId, userId ]\n },\n changePassword: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.CHANGE_PASSWORD,\n args: [ customerId, userId ]\n },\n userCredit: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.EDIT_USER_CREDIT,\n args: [ customerId, userId ]\n },\n manageYearGroup: {\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.MANAGE_YEAR_GROUP,\n args: [ customerId, userId ]\n }\n };\n};\n\nexport interface UsersCustomerSchoolsTableProps {\n data: UsersCustomerSchoolsRow[];\n userType: UserGroup;\n onAdminToggle?: (customerId: string, role: UserRole) => void;\n user?: User;\n currentUser?: CurrentUser;\n products?: ProductId[];\n hasUserCredit?: boolean;\n hasRostering?: boolean;\n canEditUserCredit?: boolean;\n isEditingCurrentUser?: boolean;\n isTogglingAdmin?: boolean;\n yearGroups?: YearGroup[];\n canEditSsoFields?: boolean;\n}\n\nconst columnHelper = createColumnHelper<UsersCustomerSchoolsRow>();\nconst UsersCustomerSchoolsColumns = {\n status: (currentUser: CurrentUser) =>\n columnHelper.accessor('status', {\n id: 'status',\n header: 'Status',\n cell: props => {\n return (\n <div className='d-flex gap-1'>\n <UserStatusBadge\n // Get id of base User not the individual UserProfile\n user={{ ...props.row.original.user, id: props.row.original.userId }}\n currentUser={currentUser}\n className='rounded p-1'\n showActiveBadge\n />\n </div>\n );\n },\n size: 200\n }),\n customerName: () =>\n columnHelper.accessor('customerName', {\n id: 'customerName',\n header: 'Customer name',\n cell: props => (\n <AppLink\n appLink={{\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.CUSTOMER_OVERVIEW,\n args: [props.row.original.customerId]\n }}\n className='text-info'\n >\n {props.getValue()}\n </AppLink>\n ),\n size: 350\n }),\n crmId: () =>\n columnHelper.accessor(row => row.customer?.crmId, {\n id: 'crmId',\n header: 'CVC ID',\n cell: props => (\n <AppLink\n appLink={{\n application: AppChannels.CRM_STUDIO,\n action: CuratorActions.CrmStudio.CUSTOMER_OVERVIEW,\n args: [props.row.original.customerId]\n }}\n className='text-info'\n >\n {props.getValue()}\n </AppLink>\n ),\n size: 100\n }),\n yearGroup: (userType: UserGroup) =>\n columnHelper.accessor('yearGroup', {\n id: 'yearGroup',\n header: 'Year group',\n cell: props => {\n return <RoleOrYearGroup userType={userType} badgeText={props.getValue()} />;\n },\n size: 150\n }),\n admin: (\n onAdminToggle: (customerId: string, role: UserRole) => void,\n isEditingCurrentUser: boolean,\n canEditSsoFields: boolean,\n userType: UserGroup\n ) =>\n columnHelper.accessor(row => row, {\n id: 'admin',\n header: 'Admin',\n cell: props => {\n const enabled = UserHelper.getUserStatusFromValue(props.row.original.status) === ObjectStatus.Active;\n const canToggle = enabled && !isEditingCurrentUser;\n return (\n <div className='w-100 d-flex justify-content-start'>\n {userType === UserGroup.Learner || isEditingCurrentUser ?\n <ToggleSwitch\n on={props.row.original.role === UserRole.Admin}\n onClick={() => {}}\n showStateWhenDisabled={true}\n disabled={true}\n tooltipText='Cannot toggle admin when editing current user'\n /> :\n <FormWrapper<EditUserRequest>\n initialValues={{ ...getUserInitialValues(\n props.row.original.user,\n props.row.original.customerId\n ), masterRole: props.row.original.role }}\n onSubmit={null}\n >\n <UserRoleField\n user={props.row.original.user}\n userType={userType}\n countryCode={props.row.original.customer?.country?.code}\n isEditingCurrentUser={isEditingCurrentUser}\n isDisabled={!canToggle}\n isValidatingEmail={false}\n editSsoFields={canEditSsoFields}\n hasOrg={!!props.row.original.customer?.organisation}\n canEditSuperAdmin\n onRoleChange={(newRole: UserRole) => onAdminToggle(\n props.row.original.customerId,\n newRole\n )}\n hideLabel\n />\n </FormWrapper>}\n </div>\n );\n },\n size: 100\n }),\n actions: (userProps: any) =>\n columnHelper.accessor(row => row, {\n id: 'actions',\n header: 'Actions',\n cell: props => {\n const customerId = props.row.original.customerId;\n const customer = props.row.original.customer;\n const isNotUs = customer.contentRegion && customer.contentRegion.systemName !== ContentRegion.US;\n const hasRostering = !!customer._integrations?.rostered;\n return (\n <div className='w-100 d-flex justify-content-center'>\n <UserItemActions\n user={{ ...props.row.original.user, id: props.row.original.userId }}\n userType={userProps.userType}\n appLinks={getApplinks(customerId, userProps.userType, props.row.original.userId)}\n onClickSendResetEmail={userProps.onClickSendResetEmail}\n onClickResendActivationEmail={userProps.onClickResendActivationEmail}\n onClickSendVerificationEmail={userProps.onClickSendVerificationEmail}\n currentUser={userProps.currentUser}\n products={userProps.products}\n isEditUserForm\n hasRostering={hasRostering}\n hasUserCredit={isNotUs && userProps.canEditUserCredit}\n filterActions={action => [\n 'Remove user',\n 'Reactivate account',\n 'Deactivate account',\n 'Change password',\n 'Update user credit limit',\n 'Manage year group'\n ].includes(typeof action.label === 'string' ? action.label : '')}\n />\n </div>\n );\n },\n size: 100\n })\n};\n\nexport function UsersCustomerSchoolsTable({\n data,\n userType,\n onAdminToggle,\n user,\n currentUser,\n products,\n hasUserCredit,\n hasRostering,\n canEditUserCredit,\n isEditingCurrentUser,\n canEditSsoFields\n}: UsersCustomerSchoolsTableProps) {\n const columns = [\n UsersCustomerSchoolsColumns.status(currentUser),\n UsersCustomerSchoolsColumns.crmId(),\n UsersCustomerSchoolsColumns.customerName(),\n ...(userType !== UserGroup.Staff ?\n [UsersCustomerSchoolsColumns.yearGroup(userType)] :\n [UsersCustomerSchoolsColumns.admin(\n onAdminToggle,\n !!isEditingCurrentUser,\n canEditSsoFields,\n userType\n )]\n ),\n UsersCustomerSchoolsColumns.actions({\n userType,\n hasRostering,\n currentUser,\n products,\n hasUserCredit,\n canEditUserCredit,\n client: UserManagerClient.Curator,\n user\n })\n ];\n\n const theme = {\n ...CrmStudioTableTheme,\n row: '',\n cell: 'py-2 px-3',\n header: 'text-left'\n };\n\n return (\n <TableV2\n data={data}\n columns={columns}\n theme={theme}\n />\n );\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { getLastActiveDate } from 'libs/shared/apps/user-manager/components/user-list-items/components/LastActive';\nimport { UserManagerClientContext } from 'libs/shared/apps/user-manager/context/UserManagerClientContext';\nimport { UserManagerClient } from 'libs/shared/apps/user-manager/enums/UserManagerClient';\nimport { DropdownContainer } from 'libs/shared/components/dropdown-container/DropdownContainer';\nimport { PopupLoadingSpinner } from 'libs/shared/components/popup/PopupLoadingSpinner';\nimport { ObjectStatus } from 'libs/shared/enums/ObjectStatus';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { UserRole } from 'libs/shared/enums/UserRole';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { CuratorUser, CurrentUser, Customer, User } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\n\nimport { Actions } from 'shared/constants/CuratorActions';\nimport { AppChannels } from 'shared/constants/RadioChannels';\nimport { CuratorPermissionName } from 'shared/enums/CuratorPermissionName';\nimport { useCuratorPermissions } from 'shared/hooks/UseCuratorPermissions';\n\nimport { UsersCustomerSchoolsTable } from 'apps/crm-studio/components/tables/UsersCustomerSchoolsTable';\nimport { CustomerRequests } from 'apps/crm-studio/flight-requests/CustomerRequests';\nimport { CrmStudioLayoutView, CrmStudioLayoutViewPage } from 'apps/crm-studio/views/layout/CrmStudioLayout';\nimport { CrmStudioUserLayout } from 'apps/crm-studio/views/layout/CrmStudioUserLayout';\n\ninterface UsersCustomerSchoolsViewProps {\n id: string;\n}\n\nexport type UsersCustomerSchoolsRow = {\n status: ObjectStatus,\n customerName: string,\n customerId: string,\n yearGroup: string,\n isEditingCurrentUser: boolean,\n customer: Customer,\n user?: User,\n role?: UserRole,\n userId: string,\n onAdminToggle?: (customerId: string, role: UserRole) => void\n};\n\nexport function UsersCustomerSchoolsView(props: UsersCustomerSchoolsViewProps) {\n const fetchAsync = Flight.useGetFetchAsync();\n const alerts = useAlerts();\n const { hasPermissions } = useCuratorPermissions();\n\n const canEditUserCredit = hasPermissions(CuratorPermissionName.UserCreditUpdate);\n const canEditSsoFields = hasPermissions(CuratorPermissionName.UsersSsoUpdate);\n \n const userRaw = Flight.useBasicFetch<User>(CustomerRequests.getUserWithCustomers(props.id));\n const user = userRaw.data ?\n { ...userRaw.data, status: UserHelper.getUserStatusFromValue(userRaw.data?.status) } :\n undefined;\n\n const customerId = user?.userProfile?.customer?.id;\n const currentUser = Flight.useBasicFetch<CurrentUser | CuratorUser>(UserRequests.currentUser());\n \n const noOtherSchools = user?.userProfiles?.data.length === 0;\n const userType = user && UserHelper.getUserType(user);\n const isEditingCurrentUser = !props.id || (currentUser?.data?.id?.toString() === props.id?.toString());\n\n async function handleAdminToggle(targetCustomerId: string, role: UserRole): Promise<void> {\n try {\n if (UserHelper.getUserType(user) !== UserGroup.Staff || isEditingCurrentUser) return;\n if (user.status === ObjectStatus.Disabled) return;\n\n const updatedUser = {\n ...user,\n masterRole: role,\n customerId: targetCustomerId,\n firstName: user?.name,\n userId: user?.id,\n email: user?.email,\n displayName: user?.metadata?.displayName\n };\n\n await fetchAsync(CustomerRequests.updateUser(\n targetCustomerId,\n updatedUser,\n currentUser.data?.id\n ));\n alerts.success(`User role successfully updated`);\n } catch {\n alerts.error('Failed to update user role');\n }\n }\n\n const userId = props.id;\n const usersCustomerSchoolsRows: UsersCustomerSchoolsRow[] = Array.isArray(user?.userProfiles?.data) ?\n user.userProfiles.data\n .filter(profile => profile && profile.customer && profile.customer.id && profile.customer.name)\n .map((profile, idx) => ({\n customerName: profile.customer.name,\n customerId: profile.customer.id,\n userId: userId,\n yearGroup: user?.yearGroups.data[idx]?.name,\n role: UserHelper.getUserRoleFromValue(profile.role),\n isEditingCurrentUser,\n customer: profile.customer,\n status: profile.status,\n user: {\n ...user,\n ...profile,\n // Base user and userProfile have different statuses when user is pending.\n // Userprofile is Active, but user is Inactive. So set userprofile status to Inactive\n // while user is pending\n status: UserHelper.getUserStatusFromValue(user?.status) !== ObjectStatus.Inactive ?\n profile.status :\n ObjectStatus.Inactive,\n metadata: {\n ...user?.metadata,\n ...profile?.metadata\n }\n }\n })) :\n [];\n // fetch authentication methods for user\n Flight.useBasicFetch(\n customerId && CustomerRequests.getAuthenticationMethodsByUserIds(\n customerId,\n usersCustomerSchoolsRows.map(row => row.userId).sort()\n )\n );\n\n const isLoaded = customerId ? (\n userRaw.hasCompleted &&\n usersCustomerSchoolsRows.length > 0 &&\n currentUser.hasCompleted\n ) : (\n currentUser.hasCompleted &&\n userRaw.hasCompleted\n );\n\n return (\n <UserManagerClientContext.Provider value={UserManagerClient.Curator}>\n <CrmStudioLayoutView view={CrmStudioLayoutViewPage.Users}>\n <CrmStudioUserLayout\n title='Customer schools'\n id={props.id}\n loading={false}\n currentTabId='schools'\n >\n {userRaw.hasCompleted && user && (\n <div className='mb-3'>\n <DropdownContainer heading='User details'>\n <div className='p-3'>\n <div className='row mb-3'>\n <div className='font-label col col-3'>Full name</div>\n <div className='col'>{user.name} {user.surname}</div>\n </div>\n <div className='row'>\n <div className='font-label col col-3'>Last active</div>\n <div className='col'>{getLastActiveDate(user.metadata?.lastSignInTime, user.status)}</div>\n </div>\n </div>\n \n </DropdownContainer>\n </div>\n )}\n <DropdownContainer\n heading='Customer schools'\n disableCollapse\n buttonText='Add user to another customer'\n buttonAppLink={user?.status !== ObjectStatus.Inactive && {\n application: AppChannels.CRM_STUDIO,\n action: Actions.CrmStudio.ADD_USER_TO_CUSTOMER,\n args: [ customerId, props.id ]\n }}\n >\n {noOtherSchools ? (\n <div className='m-3'>No other customer schools found.</div>\n ) : isLoaded ? (\n <div className='d-flex flex-column' id='customer-schools-portal'>\n <UsersCustomerSchoolsTable\n data={usersCustomerSchoolsRows}\n userType={userType}\n onAdminToggle={handleAdminToggle}\n user={user}\n currentUser={currentUser.data as CurrentUser}\n hasRostering={false}\n canEditUserCredit={canEditUserCredit}\n isEditingCurrentUser={isEditingCurrentUser}\n canEditSsoFields={canEditSsoFields}\n />\n </div>\n ) : (\n <PopupLoadingSpinner />\n )}\n </DropdownContainer>\n </CrmStudioUserLayout>\n </CrmStudioLayoutView>\n </UserManagerClientContext.Provider>\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{t as r}from"./BdvdGLvp.chunk.js";import{c as i,d as a}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as o}from"./Bt5qHBoM2.chunk.js";import{t as s}from"./CVBPygL42.chunk.js";import{t as c}from"./CZYfGOZQ2.chunk.js";import{t as l}from"./CoqIP93V2.chunk.js";import{t as u}from"./B2JmsSAI2.chunk.js";import{t as d}from"./ChgGIEsg2.chunk.js";import{t as f}from"./FBRb9Ucn2.chunk.js";import{t as p}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{a as e,ln as t,r as n}from"./BlDu0qdC.chunk.js";import{t as r}from"./BdvdGLvp.chunk.js";import{c as i,d as a}from"./BIZf7Q462.chunk.js";import"./COkf8IPk2.chunk.js";import{t as o}from"./Bt5qHBoM2.chunk.js";import{t as s}from"./CVBPygL42.chunk.js";import{t as c}from"./CZYfGOZQ2.chunk.js";import{t as l}from"./CoqIP93V2.chunk.js";import{t as u}from"./B2JmsSAI2.chunk.js";import{t as d}from"./ChgGIEsg2.chunk.js";import{t as f}from"./FBRb9Ucn2.chunk.js";import{t as p}from"./LmwQmHZz2.chunk.js";var m=t(e()),h=n();function g(e){let t=s(),n=a(),g=i(c.getContentPartner(e.contentPartnerId)),_=i(o.currentUser()),v=i(l.contentRegions()),[y,b]=m.useState(null);async function x(e){b(e)}async function S(i,a){let o=f.getPartnerLinkObjectByType(g.data.links,`website`),s=!!i.websiteLink?.length,l={...r.omit(i,[`contentRegions`,`parent`,`websiteLink`]),contentRegionIds:i.contentRegions.map(e=>e.id),websiteLink:s?i.websiteLink:null,parentId:i.parent?.id};try{if(await n(c.updateContentPartner(e.contentPartnerId,l,a,a)),o?.id&&!s&&await n(c.deleteContentPartnerLink(e.contentPartnerId,o.id)),!l.videoBanner&&g.data.videoBanner&&await n(c.deleteContentPartnerVideoBanner(e.contentPartnerId,g.data.videoBanner.id)),y)if(y.masterVideoId&&y.pendingProcessId)await n(c.updateVideoBanner(g.data._slug.value,y.masterVideoId,y.pendingProcessId)),b(null);else throw Error(`Pending video banner is not valid.`);t.success(`Successfully updated the content partner.`)}catch(e){t.error(e.responseJSON?.message||`There was an error updating the content partner. Please try again.`)}}let C=u();return(0,h.jsxs)(h.Fragment,{children:[!!_.data&&(0,h.jsx)(d,{contentPartnerId:e.contentPartnerId,activeAction:C.editContentPartner(e.contentPartnerId).action,currentUser:_.data}),!!g.data&&!!_.data&&(0,h.jsx)(p,{currentUser:_.data,contentPartner:g.data,contentRegions:v.data?.data,onSave:S,onVideoUploadComplete:x})]})}export{g as EditContentPartnerView};
|
|
2
|
+
//# sourceMappingURL=BKQIzKcF2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"BKQIzKcF2.chunk.js","names":[],"sources":["../../../../../src/apps/content-partners/views/edit-content-partner/EditContentPartnerView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { ContentPartnersHelper } from 'libs/shared/apps/content-partners/utils/ContentPartnersHelper';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { ContentRegionCollection, CurrentUser } from 'libs/shared/interfaces';\n\nimport { PendingItem } from 'shared/components/upload-video/UploadVideo';\nimport { ContentRegionRequests } from 'shared/flight-requests/ContentRegionRequests';\nimport { ContentPartnerProfile } from 'shared/interfaces/models/ContentPartnerProfile';\n\nimport { EditContentPartner } from 'apps/content-partners/components/edit-content-partner/EditContentPartner';\nimport { EditContentPartnerNav } from 'apps/content-partners/components/edit-content-partner-nav/EditContentPartnerNav';\nimport { ContentPartnerRequests } from 'apps/content-partners/flight-requests/ContentPartnerRequests';\nimport { EditPartnerFormData } from 'apps/content-partners/interfaces/EditPartnerFormData';\nimport { getContentPartnerAppLinks } from 'apps/content-partners/utils/getContentPartnerAppLinks';\n\ninterface EditContentPartnerViewProps {\n contentPartnerId: string;\n}\n\nexport function EditContentPartnerView(props: EditContentPartnerViewProps): JSX.Element {\n const alerts = useAlerts();\n const fetchAsync = Flight.useGetFetchAsync();\n\n const contentPartner = Flight.useBasicFetch<ContentPartnerProfile>(\n ContentPartnerRequests.getContentPartner(props.contentPartnerId)\n );\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const contentRegions = Flight.useBasicFetch<ContentRegionCollection>(ContentRegionRequests.contentRegions());\n\n const [ pendingVideoBanner, setPendingVideoBanner ] = React.useState<PendingItem | null>(null);\n\n async function onVideoUploadComplete(pendingItem: PendingItem) {\n setPendingVideoBanner(pendingItem);\n }\n\n async function saveContentPartner(\n data: EditPartnerFormData,\n onDone?: () => void\n ) {\n const existingWebsiteLink = ContentPartnersHelper.getPartnerLinkObjectByType(contentPartner.data.links, 'website');\n const hasCurrentWebsiteLink = !!data.websiteLink?.length;\n\n const payload = {\n ...ObjectHelper.omit(data, [ 'contentRegions', 'parent', 'websiteLink' ]),\n contentRegionIds: data.contentRegions.map(cr => cr.id),\n websiteLink: !hasCurrentWebsiteLink ? null : data.websiteLink,\n parentId: data.parent?.id\n };\n try {\n await fetchAsync(ContentPartnerRequests.updateContentPartner(\n props.contentPartnerId,\n payload,\n onDone,\n onDone\n ));\n\n // Delete the existing website link if it exists and the current website link is not set\n if (existingWebsiteLink?.id && !hasCurrentWebsiteLink) {\n await fetchAsync(ContentPartnerRequests.deleteContentPartnerLink(\n props.contentPartnerId,\n existingWebsiteLink.id\n ));\n }\n\n if (!payload.videoBanner && contentPartner.data.videoBanner) {\n await fetchAsync(ContentPartnerRequests.deleteContentPartnerVideoBanner(\n props.contentPartnerId,\n contentPartner.data.videoBanner.id\n ));\n }\n\n if (pendingVideoBanner) {\n if (pendingVideoBanner.masterVideoId && pendingVideoBanner.pendingProcessId) {\n await fetchAsync(ContentPartnerRequests.updateVideoBanner(\n contentPartner.data._slug.value,\n pendingVideoBanner.masterVideoId,\n pendingVideoBanner.pendingProcessId\n ));\n\n setPendingVideoBanner(null);\n } else {\n throw new Error('Pending video banner is not valid.');\n }\n }\n\n alerts.success('Successfully updated the content partner.');\n } catch (xhr) {\n alerts.error(xhr.responseJSON?.message || 'There was an error updating the content partner. Please try again.');\n }\n }\n\n const appLinks = getContentPartnerAppLinks();\n\n return (\n <>\n {!!currentUser.data &&\n <EditContentPartnerNav\n contentPartnerId={props.contentPartnerId}\n activeAction={appLinks.editContentPartner(props.contentPartnerId).action}\n currentUser={currentUser.data}\n />\n }\n {!!contentPartner.data && !!currentUser.data && (\n <EditContentPartner\n currentUser={currentUser.data}\n contentPartner={contentPartner.data}\n contentRegions={contentRegions.data?.data}\n onSave={saveContentPartner}\n onVideoUploadComplete={onVideoUploadComplete}\n />\n )}\n </>\n );\n}\n"],"mappings":"ugBAwBA,SAAgB,EAAuB,EAAiD,CACtF,IAAM,EAAS,EAAU,EACnB,EAAa,EAAwB,EAErC,EAAiB,EACrB,EAAuB,kBAAkB,EAAM,gBAAgB,CACjE,EACM,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAiB,EAA8C,EAAsB,eAAe,CAAC,EAErG,CAAE,EAAoB,GAAA,EAAgC,SAA6B,IAAI,EAE7F,eAAe,EAAsB,EAA0B,CAC7D,EAAsB,CAAW,CACnC,CAEA,eAAe,EACb,EACA,EACA,CACA,IAAM,EAAsB,EAAsB,2BAA2B,EAAe,KAAK,MAAO,SAAS,EAC3G,EAAwB,CAAC,CAAC,EAAK,aAAa,OAE5C,EAAU,CACd,GAAG,EAAa,KAAK,EAAM,CAAE,iBAAkB,SAAU,aAAc,CAAC,EACxE,iBAAkB,EAAK,eAAe,IAAI,GAAM,EAAG,EAAE,EACrD,YAAc,EAA+B,EAAK,YAAZ,KACtC,SAAU,EAAK,QAAQ,EACzB,EACA,GAAI,CAuBF,GAtBA,MAAM,EAAW,EAAuB,qBACtC,EAAM,iBACN,EACA,EACA,CACF,CAAC,EAGG,GAAqB,IAAM,CAAC,GAC9B,MAAM,EAAW,EAAuB,yBACtC,EAAM,iBACN,EAAoB,EACtB,CAAC,EAGC,CAAC,EAAQ,aAAe,EAAe,KAAK,aAC9C,MAAM,EAAW,EAAuB,gCACtC,EAAM,iBACN,EAAe,KAAK,YAAY,EAClC,CAAC,EAGC,EACF,GAAI,EAAmB,eAAiB,EAAmB,iBACzD,MAAM,EAAW,EAAuB,kBACtC,EAAe,KAAK,MAAM,MAC1B,EAAmB,cACnB,EAAmB,gBACrB,CAAC,EAED,EAAsB,IAAI,OAE1B,MAAU,MAAM,oCAAoC,EAIxD,EAAO,QAAQ,2CAA2C,CAC5D,OAAS,EAAK,CACZ,EAAO,MAAM,EAAI,cAAc,SAAW,oEAAoE,CAChH,CACF,CAEA,IAAM,EAAW,EAA0B,EAE3C,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,CAAC,CAAC,EAAY,OACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,iBAAkB,EAAM,iBACxB,aAAc,EAAS,mBAAmB,EAAM,gBAAgB,CAAC,CAAC,OAClE,YAAa,EAAY,IAC1B,CAAA,EAEF,CAAC,CAAC,EAAe,MAAQ,CAAC,CAAC,EAAY,OACtC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,YAAa,EAAY,KACzB,eAAgB,EAAe,KAC/B,eAAgB,EAAe,MAAM,KACrC,OAAQ,EACe,uBACxB,CAAA,CAEH,CAAA,CAAA,CAEN"}
|
|
@@ -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{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"./BDwjs8qz.chunk.js";import{t as p}from"./CVBPygL42.chunk.js";import{t as m}from"./B1A2sB9e.chunk.js";import{R as h,z as g}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
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{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"./BDwjs8qz.chunk.js";import{t as p}from"./CVBPygL42.chunk.js";import{t as m}from"./B1A2sB9e.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"./BmKj9R6-.chunk.js";import{t as y}from"./BILAUsUD.chunk.js";var b=n(t()),x=r();function S(t){let[n,r]=b.useState(!1),S=p(),C=s(c.currentUser()),w=s(m.clip(t.id)),T=s(o.getAssemblyLineVideo(t.id)),E=s(w.data&&h.createViewKey(w.data.id,g.MasterObject));return b.useEffect(()=>{E.hasError&&(S.error(`You cannot preview this clip as it has been created on a video from a different region. You have been redirected to the edit details page.`),e.trigger({application:a.CLIPS,action:i.Clips.EDIT_CLIP_DETAILS,args:[t.id]},{replace:!0}))},[E.hasError]),!w.data||!C.data||!E.hasCompleted?(0,x.jsx)(`div`,{className:`text-center py-5`,children:(0,x.jsx)(d,{as:`div`,animation:`border`})}):E.hasError?(0,x.jsx)(x.Fragment,{}):(0,x.jsxs)(`div`,{children:[!!C.data&&(0,x.jsx)(v,{clipId:t.id,activeAction:i.Clips.PREVIEW_CLIP,currentUser:C.data}),w.data.status===f.Published&&(0,x.jsxs)(l,{variant:`info`,className:`mt-3 mb-1`,children:[`This clip is `,(0,x.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.data.status===f.Archived&&(0,x.jsxs)(l,{variant:`info`,className:`mt-3 mb-1`,children:[`This clip is `,(0,x.jsx)(`strong`,{children:`archived`}),`. You may publish it again from the options menu.`]}),(0,x.jsxs)(`div`,{className:`${n?``:`d-none`}`,children:[(0,x.jsx)(u,{object:{name:w.data.name,status:w.data.status},actions:y.getClipActions(w.data,T.data),actionsDropdownClassName:`btn btn-outline-dark`,showStatus:!0}),(0,x.jsx)(_,{viewKey:E.data.viewKey,playerApi:new URL(ClickView.Config.Urls.PlayerApi),hotkeyElQuerySelector:`body`,onReady:()=>r(!0),eventLogging:!1})]})]})}export{S as PreviewClipView};
|
|
2
|
+
//# sourceMappingURL=BOrAaHLK.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"BOrAaHLK.chunk.js","names":[],"sources":["../../../../../src/apps/clips/views/preview-clip/PreviewClipView.tsx"],"sourcesContent":["import React from 'react';\nimport { Alert, Spinner } from 'react-bootstrap';\n\nimport { Core } from 'libs/common/backbone/index';\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 { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { Clip, CuratorUser, PlayerViewKey } 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 { EditClipNav } from 'apps/clips/components/edit-clip-nav/EditClipNav';\nimport { ClipRequests } from 'apps/clips/flight-requests/CuratorClipRequests';\nimport { ClipActionsHelper } from 'apps/clips/utils/ClipActionsHelper';\n\ninterface PreviewClipViewProps {\n id: string;\n}\n\nexport function PreviewClipView(props: PreviewClipViewProps): JSX.Element {\n const [ ready, setReady ] = React.useState(false);\n\n const alerts = useAlerts();\n\n const currentUser = Flight.useBasicFetch<CuratorUser>(UserRequests.currentUser());\n const clip = Flight.useBasicFetch<Clip>(ClipRequests.clip(props.id));\n const contentPipelineClip = Flight.useBasicFetch<AssemblyLineVideoResponse>(\n AssemblyLineRequests.getAssemblyLineVideo(props.id)\n );\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(\n clip.data &&\n PlayerRequests.createViewKey(clip.data.id, MediaIdType.MasterObject)\n );\n\n React.useEffect(() => {\n if (!viewKey.hasError)\n return;\n\n alerts.error(`You cannot preview this clip as it has been created on a video from a different region. You have been redirected to the edit details page.`);\n\n Core.AppLinkHelper.trigger({\n application: AppChannels.CLIPS,\n action: Actions.Clips.EDIT_CLIP_DETAILS,\n args: [props.id]\n }, { replace: true });\n }, [viewKey.hasError]);\n\n if (!clip.data || !currentUser.data || !viewKey.hasCompleted) {\n return (\n <div className='text-center py-5'>\n <Spinner as='div' animation='border' />\n </div>\n );\n }\n\n if (viewKey.hasError)\n return <></>;\n\n return (\n <div>\n {!!currentUser.data &&\n <EditClipNav\n clipId={props.id}\n activeAction={Actions.Clips.PREVIEW_CLIP}\n currentUser={currentUser.data}\n />\n }\n {clip.data.status === CurationStatus.Published && (\n <Alert variant='info' className='mt-3 mb-1'>\n This clip 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 {clip.data.status === CurationStatus.Archived && (\n <Alert variant='info' className='mt-3 mb-1'>\n This clip is <strong>archived</strong>. You may publish it again\n from the options menu.\n </Alert>\n )}\n\n <div className={`${ready ? '' : 'd-none'}`}>\n <ObjectHeader\n object={{ name: clip.data.name, status: clip.data.status }}\n actions={ClipActionsHelper.getClipActions(clip.data, contentPipelineClip.data)}\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":"wuBA4BA,SAAgB,EAAgB,EAA0C,CACxE,GAAM,CAAE,EAAO,GAAA,EAAmB,SAAS,EAAK,EAE1C,EAAS,EAAU,EAEnB,EAAc,EAAkC,EAAa,YAAY,CAAC,EAC1E,EAAO,EAA2B,EAAa,KAAK,EAAM,EAAE,CAAC,EAC7D,EAAsB,EAC1B,EAAqB,qBAAqB,EAAM,EAAE,CACpD,EAEM,EAAU,EACd,EAAK,MACL,EAAe,cAAc,EAAK,KAAK,GAAI,EAAY,YAAY,CACrE,EA0BA,OAxBA,EAAM,cAAgB,CACf,EAAQ,WAGb,EAAO,MAAM,4IAA4I,EAEzJ,EAAmB,QAAQ,CACzB,YAAa,EAAY,MACzB,OAAQ,EAAQ,MAAM,kBACtB,KAAM,CAAC,EAAM,EAAE,CACjB,EAAG,CAAE,QAAS,EAAK,CAAC,EACtB,EAAG,CAAC,EAAQ,QAAQ,CAAC,EAEjB,CAAC,EAAK,MAAQ,CAAC,EAAY,MAAQ,CAAC,EAAQ,cAE5C,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,6BACb,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,GAAG,MAAM,UAAU,QAAU,CAAA,CACnC,CAAA,EAIL,EAAQ,UACH,EAAA,EAAA,IAAA,CAAA,EAAA,SAAA,CAAI,CAAA,GAGX,EAAA,EAAA,KAAA,CAAC,MAAD,CAAA,SAAA,CACG,CAAC,CAAC,EAAY,OACb,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,EAAM,GACd,aAAc,EAAQ,MAAM,aAC5B,YAAa,EAAY,IAC1B,CAAA,EAEF,EAAK,KAAK,SAAW,EAAe,YACnC,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,iBAC7B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,WAAiB,CAAA,EAAC,oGAElC,IAGR,EAAK,KAAK,SAAW,EAAe,WACnC,EAAA,EAAA,KAAA,CAAC,EAAD,CAAO,QAAQ,OAAO,UAAU,qBAAhC,CAA4C,iBAC7B,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAQ,UAAgB,CAAA,EAAC,mDAEjC,KAGT,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAQ,GAAK,oBAAhC,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,OAAQ,CAAE,KAAM,EAAK,KAAK,KAAM,OAAQ,EAAK,KAAK,MAAO,EACzD,QAAS,EAAkB,eAAe,EAAK,KAAM,EAAoB,IAAI,EAC7E,yBAAyB,uBACzB,WAAA,EACD,CAAA,GACD,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,QAAS,EAAQ,KAAK,QACtB,UAAW,IAAI,IAAI,UAAU,OAAO,KAAK,SAAS,EAClD,sBAAsB,OACtB,YAAe,EAAS,EAAI,EAC5B,aAAc,EACf,CAAA,CACE,GACF,CAAA,CAAA,CAET"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BSMzg7zU.chunk.js","names":[],"sources":["../../../../../../../libs/shared/src/interfaces/models/curated-widget/CuratedWidget.ts","../../../../../../../libs/shared/src/enums/WidgetStatus.ts","../../../../../../../libs/shared/src/utils/WidgetHelper.ts"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\n\nimport { AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { ButtonIcon } from 'libs/shared/constants/WidgetThemingConstants';\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { CuratedObjectsWidgetData, CuratedWidgetContent, CuratedWidgetData } from 'libs/shared/interfaces';\n\nexport enum CuratedDashboardAppLink {\n LatestReleases = 'latest-releases',\n ExploreAllTopics = 'explore-all-topics',\n ClassificationLatestReleases = 'classification-latest-releases',\n ClassificationDirectory = 'classification-directory'\n}\n\nexport enum CuratedWidgetCtaAppLink {\n TopicDirectory = 'topic-directory',\n TopicNewReleases = 'topic-new-releases',\n CuratedTopic = 'curated-topic'\n}\n\nexport interface BaseWidget<TContent extends HashObject = HashObject> {\n id: string;\n index: number;\n templateId: WidgetTemplate;\n widgetId: WidgetTypeId;\n name: string;\n description?: string;\n content?: TContent;\n}\n\nexport interface WidgetCta {\n text?: string;\n href?: string;\n icon?: ButtonIcon;\n appLink?: CuratedWidgetCtaAppLink;\n}\n\nexport type WidgetMetadata = AllWidgetTemplateProps['metadata'] & {\n showInTableOfContents: boolean,\n tocIndentation: number,\n headingOptional: boolean,\n aiAddedVideo: boolean\n};\n\nexport interface WidgetPreference {\n id: string;\n index?: number;\n hidden?: boolean;\n}\n\nexport interface CuratedWidget<\n TData extends CuratedWidgetData = CuratedWidgetData,\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BaseWidget<TContent> {\n id: string;\n dashboardId: string;\n data: TData;\n status: WidgetStatus;\n metadata?: Partial<WidgetMetadata>;\n preferences?: WidgetPreference[];\n cursor?: string;\n\n // If a widget has curriculum IDs set, then it won't be accessible to anyone who doesn't have one of those curriculums\n curriculumIds?: string[];\n}\n\nexport type CuratedMediaWidget<\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> = CuratedWidget<CuratedObjectsWidgetData, TContent>;\n","export enum WidgetStatus {\n Draft = 0,\n Published = 1,\n Archived = 2\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { UseTransformerFunc } from 'libs/shared/hooks/useTransformer';\nimport { BaseWidget, CuratedDashboardAppLink, CuratedWidget, CuratedWidgetContent, Playlist, Presentation, Series, Video, VideoTypes, VideoWidgetTemplateContent, WidgetMetadata, WidgetPreference } from 'libs/shared/interfaces';\n\nimport { AnyWidgetTemplateProps } from '../components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeIdConfig } from '../constants/WidgetTypeIdConfig';\nimport { MasterType } from '../enums/MasterType';\n\nimport { MasterTypeHelper } from './MasterTypeHelper';\n\nenum WidgetStatusString {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport const WidgetHelper = {\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Slide\n }),\n\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderItemAnalyticsOptions: (): AnalyticsOptions => ({\n location: LocationContext.SlidingListItem\n }),\n\n getSliderHeadingAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Title\n }),\n\n useGetContent(\n content: CuratedWidgetContent,\n widgetTypeId: WidgetTypeId,\n isPreviewing: boolean,\n preferences: WidgetPreference[],\n removedItemIds: string[]\n ): { content: CuratedWidgetContent, unfilteredContent: CuratedWidgetContent } {\n return React.useMemo(() => {\n if (!content)\n return { content: null, unfilteredContent: null };\n\n if (!Array.isArray(content))\n return { content, unfilteredContent: content };\n\n const preferencesHash = preferences?.reduce((acc: HashObject, current) => {\n acc[current.id] = current;\n return acc;\n }, {}) ?? {};\n\n const removedItemIdsHash = removedItemIds.reduce((acc: HashObject, current) => {\n acc[current] = true;\n return acc;\n }, {});\n\n const contentCopy = [...content];\n \n const sortedContent = contentCopy.sort((a, b) => {\n if (!('id' in a) || !('id' in b))\n return 0;\n\n const aIndex = preferencesHash[a.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === a.id);\n const bIndex = preferencesHash[b.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === b.id);\n\n if (aIndex < bIndex)\n return -1;\n\n if (aIndex > bIndex)\n return 1;\n\n return 0;\n });\n\n if (WidgetHelper.isBelowContentMinimum(sortedContent, widgetTypeId) && !isPreviewing) {\n return {\n content: [],\n unfilteredContent: sortedContent\n };\n }\n\n const filteredContent = sortedContent.filter(item => {\n if (preferencesHash['id' in item && item.id]?.hidden)\n return false;\n\n if (removedItemIdsHash['id' in item && item.id])\n return false;\n\n return true;\n });\n\n return {\n content: filteredContent,\n unfilteredContent: sortedContent\n };\n }, [ content, preferences ]);\n },\n\n isBelowContentMinimum(content: CuratedWidgetContent, widgetTypeId: WidgetTypeId): boolean {\n const minContent = WidgetTypeIdConfig[widgetTypeId]?.minContent || 0;\n return content?.length < minContent;\n },\n\n getCustomAppLink(props: AnyWidgetTemplateProps): Core.AppLink | null {\n if (\n !('metadata' in props) ||\n !('appLinks' in props) ||\n !('appLink' in props.metadata)\n ) {\n return null;\n }\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.LatestReleases && 'latestReleases' in props.appLinks)\n return props.appLinks?.latestReleases?.();\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.ExploreAllTopics && 'allTopics' in props.appLinks && 'presentation' in props)\n return props.appLinks?.allTopics?.(props.presentation.id);\n\n return null;\n },\n\n getWidgetStatus(widget: CuratedWidget): WidgetStatus {\n let status = widget.status;\n\n if (typeof (status) === 'string') {\n switch (status) {\n case WidgetStatusString.Archived:\n status = WidgetStatus.Archived;\n break;\n case WidgetStatusString.Published:\n status = WidgetStatus.Published;\n break;\n case WidgetStatusString.Draft:\n status = WidgetStatus.Draft;\n break;\n }\n }\n\n return status;\n },\n\n formatResponseData(widget: CuratedWidget, presentation?: Presentation): CuratedWidget {\n const content = widget.content;\n\n if (!content)\n return widget;\n\n if ('author' in content) {\n widget.content = [content] as CuratedWidgetContent;\n return widget;\n }\n\n if ('data' in content)\n widget.content = content.data as CuratedWidgetContent;\n else if (!Array.isArray(content))\n widget.content = [content]; // Handle `classification_featured_video` widgets, which don't return content as an array\n\n switch (widget.widgetId) {\n case WidgetTypeId.ClassificationSeries:\n widget.content = widget.content.filter((c): c is Series => 'tallPoster' in c && !!c.tallPoster?.id);\n break;\n case WidgetTypeId.ClassificationPlaylists:\n widget.content = widget.content.filter((c): c is Playlist => 'cover' in c && !!c.cover?.id);\n break;\n case WidgetTypeId.ContinueWatching:\n widget.content = widget.content.map(c => 'object' in c && c.object);\n default:\n break;\n case WidgetTypeId.Presentations:\n widget.content = widget.content.filter((c): c is Presentation => 'id' in c && c.id.toString() !== presentation?.id?.toString());\n break;\n }\n\n return widget;\n },\n \n isWidgetInTableOfContents(metadata: Partial<WidgetMetadata>): boolean {\n return !!metadata?.showInTableOfContents;\n },\n\n /**\n * Widget container view won't render a widget with no content typically,\n * but some widgets (such as blurbs) have no content, but should render anyway.\n */\n hasNoContent(widgetTypeId: WidgetTypeId): boolean {\n if ([ WidgetTypeId.Blurb, WidgetTypeId.Feedback ].includes(widgetTypeId)) return true;\n\n return false;\n },\n\n /**\n * If any widgets should be hidden on smaller screen sizes, add them here.\n * If this needs to be more flexible at some point, it should be added to\n * the widget settings and metadata object.\n */\n canDisplayOnScreenSize(\n breakpoints: Breakpoints,\n widgetTypeId: WidgetTypeId,\n widgetTemplate: WidgetTemplate\n ): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb && widgetTemplate === WidgetTemplate.HeroBannerSmall)\n return !breakpoints.xs && !breakpoints.sm;\n\n return true;\n },\n\n isCompanyWidget(widgetTypeId: WidgetTypeId): boolean {\n switch (widgetTypeId) {\n case WidgetTypeId.CompanyLatestReleasedVideo:\n case WidgetTypeId.CompanyVideos:\n case WidgetTypeId.UpcomingLivestreams:\n return true;\n default:\n return false;\n }\n },\n\n getVideoContent(content: VideoWidgetTemplateContent): VideoTypes[] {\n const firstItem = ArrayHelper.first<Video | Series>(content);\n\n if (MasterTypeHelper.isType<Series>(firstItem, MasterType.Series))\n return firstItem.videos.data;\n\n return content as VideoTypes[];\n },\n\n showRemoveButton(widgetTypeId: WidgetTypeId): boolean {\n return widgetTypeId === WidgetTypeId.ContinueWatching;\n },\n\n /**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id,\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n * \n * For example:\n * Say we receive these widgets for a query:\n * - topics widget\n * - related results widget\n * \n * If a user scrolls down to the end of page we fetch more items from the last widget\n * which in this case is 'related results widget'. \n * Now our overall response looks like this\n * - topics widget\n * - related results widget\n * - related results widget\n * \n * Since this is a new widget item entry it will be rendered as a new widget with seprate headings etc.\n * In this case we want to combine these two widgets data into one so its looks like this again:\n * - topics widget\n * - related results widget (data is combined)\n * \n * But what if widget we get recieve has a different widget template id. This currently happens for\n * the 'series widget' - series widget can have the tall poster template or the thumbnail like template.\n * \n * so to visualize this it can be like:\n * - topics widget\n * - top results widget\n * - series widget (template: tall poster)\n * - series widget (template: thumbnail)\n * \n * Since they technically will look different based on the template id we will not merge the data in this case.\n * It will merge the data to the same widget as long as the combination of widget Id + template Id is the same.\n * \n * Since they are separate widgets they will render duplicate headings - we handle this in css instead which\n * checks for adjacent siblings and if its the same widget - it hides the widget heading so it will look\n * like its a single widget rather than separate widgets.\n * \n * - Nish\n */\n mergeWidgets<T extends BaseWidget>(\n items: T[],\n mergeContent: (target: T, source: T) => void\n ): T[] {\n const widgets = ObjectHelper.deepClone(items);\n const groupedWidgets = ArrayHelper.groupBy(widgets, 'widgetId');\n const mergedWidgets: T[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: T | null = null;\n const groupMergedWidgets: T[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n if (widget.templateId !== currentMergedWidget.templateId) {\n groupMergedWidgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n mergeContent(currentMergedWidget, widget);\n }\n\n if (currentMergedWidget) {\n groupMergedWidgets.push(currentMergedWidget);\n }\n mergedWidgets.push(...groupMergedWidgets);\n }\n\n return mergedWidgets;\n },\n\n mergeCuratedWidgets(data: CuratedWidget[]): CuratedWidget[] {\n if (!data) return data;\n\n return WidgetHelper.mergeWidgets(data, (target, source) => {\n target.content = [\n ...(target.content || []),\n ...source.content\n ];\n });\n },\n\n getWidgetResultsTransformers(): Array<UseTransformerFunc<CuratedWidget[]>> {\n return [\n data => WidgetHelper.mergeCuratedWidgets(data)\n ];\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BSMzg7zU.chunk.js","names":[],"sources":["../../../../../../../libs/shared/src/interfaces/models/curated-widget/CuratedWidget.ts","../../../../../../../libs/shared/src/enums/WidgetStatus.ts","../../../../../../../libs/shared/src/utils/WidgetHelper.ts"],"sourcesContent":["import { HashObject } from 'libs/common/react/interfaces';\n\nimport { AllWidgetTemplateProps } from 'libs/shared/components/widgets/curated-widgets/WidgetProps';\nimport { ButtonIcon } from 'libs/shared/constants/WidgetThemingConstants';\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { CuratedObjectsWidgetData, CuratedWidgetContent, CuratedWidgetData } from 'libs/shared/interfaces';\n\nexport enum CuratedDashboardAppLink {\n LatestReleases = 'latest-releases',\n ExploreAllTopics = 'explore-all-topics',\n ClassificationLatestReleases = 'classification-latest-releases',\n ClassificationDirectory = 'classification-directory'\n}\n\nexport enum CuratedWidgetCtaAppLink {\n TopicDirectory = 'topic-directory',\n TopicNewReleases = 'topic-new-releases',\n CuratedTopic = 'curated-topic'\n}\n\nexport interface BaseWidget<TContent extends HashObject = HashObject> {\n id: string;\n index: number;\n templateId: WidgetTemplate;\n widgetId: WidgetTypeId;\n name: string;\n description?: string;\n content?: TContent;\n}\n\nexport interface WidgetCta {\n text?: string;\n href?: string;\n icon?: ButtonIcon;\n appLink?: CuratedWidgetCtaAppLink;\n style?: string;\n}\n\nexport interface WidgetSubtitle {\n text?: string;\n href?: string;\n}\n\nexport type WidgetMetadata = AllWidgetTemplateProps['metadata'] & {\n showInTableOfContents: boolean,\n tocIndentation: number,\n headingOptional: boolean,\n aiAddedVideo: boolean\n};\n\nexport interface WidgetPreference {\n id: string;\n index?: number;\n hidden?: boolean;\n}\n\nexport interface CuratedWidget<\n TData extends CuratedWidgetData = CuratedWidgetData,\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BaseWidget<TContent> {\n id: string;\n dashboardId: string;\n data: TData;\n status: WidgetStatus;\n metadata?: Partial<WidgetMetadata>;\n preferences?: WidgetPreference[];\n cursor?: string;\n\n // If a widget has curriculum IDs set, then it won't be accessible to anyone who doesn't have one of those curriculums\n curriculumIds?: string[];\n}\n\nexport type CuratedMediaWidget<\n TContent extends CuratedWidgetContent = CuratedWidgetContent\n> = CuratedWidget<CuratedObjectsWidgetData, TContent>;\n","export enum WidgetStatus {\n Draft = 0,\n Published = 1,\n Archived = 2\n}\n\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { HashObject } from 'libs/common/react/interfaces';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\n\nimport { AnalyticsOptions, ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { WidgetStatus } from 'libs/shared/enums/WidgetStatus';\nimport { WidgetTemplate } from 'libs/shared/enums/WidgetTemplate';\nimport { WidgetTypeId } from 'libs/shared/enums/WidgetTypeId';\nimport { Breakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { UseTransformerFunc } from 'libs/shared/hooks/useTransformer';\nimport { BaseWidget, CuratedDashboardAppLink, CuratedWidget, CuratedWidgetContent, Playlist, Presentation, Series, Video, VideoTypes, VideoWidgetTemplateContent, WidgetMetadata, WidgetPreference } from 'libs/shared/interfaces';\n\nimport { AnyWidgetTemplateProps } from '../components/widgets/curated-widgets/WidgetProps';\nimport { WidgetTypeIdConfig } from '../constants/WidgetTypeIdConfig';\nimport { MasterType } from '../enums/MasterType';\n\nimport { MasterTypeHelper } from './MasterTypeHelper';\n\nenum WidgetStatusString {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport const WidgetHelper = {\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Slide\n }),\n\n /**\n * Used by both the FixedWidget and DynamicWidget\n */\n getSliderItemAnalyticsOptions: (): AnalyticsOptions => ({\n location: LocationContext.SlidingListItem\n }),\n\n getSliderHeadingAnalyticsOptions: (): AnalyticsOptions => ({\n actionType: UserAction.Click,\n location: LocationContext.SlidingList,\n entity: EntityType.Widget,\n descriptor: ClickDescriptor.Title\n }),\n\n useGetContent(\n content: CuratedWidgetContent,\n widgetTypeId: WidgetTypeId,\n isPreviewing: boolean,\n preferences: WidgetPreference[],\n removedItemIds: string[]\n ): { content: CuratedWidgetContent, unfilteredContent: CuratedWidgetContent } {\n return React.useMemo(() => {\n if (!content)\n return { content: null, unfilteredContent: null };\n\n if (!Array.isArray(content))\n return { content, unfilteredContent: content };\n\n const preferencesHash = preferences?.reduce((acc: HashObject, current) => {\n acc[current.id] = current;\n return acc;\n }, {}) ?? {};\n\n const removedItemIdsHash = removedItemIds.reduce((acc: HashObject, current) => {\n acc[current] = true;\n return acc;\n }, {});\n\n const contentCopy = [...content];\n \n const sortedContent = contentCopy.sort((a, b) => {\n if (!('id' in a) || !('id' in b))\n return 0;\n\n const aIndex = preferencesHash[a.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === a.id);\n const bIndex = preferencesHash[b.id]?.index ?? contentCopy.findIndex(c => 'id' in c && c.id === b.id);\n\n if (aIndex < bIndex)\n return -1;\n\n if (aIndex > bIndex)\n return 1;\n\n return 0;\n });\n\n if (WidgetHelper.isBelowContentMinimum(sortedContent, widgetTypeId) && !isPreviewing) {\n return {\n content: [],\n unfilteredContent: sortedContent\n };\n }\n\n const filteredContent = sortedContent.filter(item => {\n if (preferencesHash['id' in item && item.id]?.hidden)\n return false;\n\n if (removedItemIdsHash['id' in item && item.id])\n return false;\n\n return true;\n });\n\n return {\n content: filteredContent,\n unfilteredContent: sortedContent\n };\n }, [ content, preferences ]);\n },\n\n isBelowContentMinimum(content: CuratedWidgetContent, widgetTypeId: WidgetTypeId): boolean {\n const minContent = WidgetTypeIdConfig[widgetTypeId]?.minContent || 0;\n return content?.length < minContent;\n },\n\n getCustomAppLink(props: AnyWidgetTemplateProps): Core.AppLink | null {\n if (\n !('metadata' in props) ||\n !('appLinks' in props) ||\n !('appLink' in props.metadata)\n ) {\n return null;\n }\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.LatestReleases && 'latestReleases' in props.appLinks)\n return props.appLinks?.latestReleases?.();\n\n if (props.metadata?.appLink === CuratedDashboardAppLink.ExploreAllTopics && 'allTopics' in props.appLinks && 'presentation' in props)\n return props.appLinks?.allTopics?.(props.presentation.id);\n\n return null;\n },\n\n getWidgetStatus(widget: CuratedWidget): WidgetStatus {\n let status = widget.status;\n\n if (typeof (status) === 'string') {\n switch (status) {\n case WidgetStatusString.Archived:\n status = WidgetStatus.Archived;\n break;\n case WidgetStatusString.Published:\n status = WidgetStatus.Published;\n break;\n case WidgetStatusString.Draft:\n status = WidgetStatus.Draft;\n break;\n }\n }\n\n return status;\n },\n\n formatResponseData(widget: CuratedWidget, presentation?: Presentation): CuratedWidget {\n const content = widget.content;\n\n if (!content)\n return widget;\n\n if ('author' in content) {\n widget.content = [content] as CuratedWidgetContent;\n return widget;\n }\n\n if ('data' in content)\n widget.content = content.data as CuratedWidgetContent;\n else if (!Array.isArray(content))\n widget.content = [content]; // Handle `classification_featured_video` widgets, which don't return content as an array\n\n switch (widget.widgetId) {\n case WidgetTypeId.ClassificationSeries:\n widget.content = widget.content.filter((c): c is Series => 'tallPoster' in c && !!c.tallPoster?.id);\n break;\n case WidgetTypeId.ClassificationPlaylists:\n widget.content = widget.content.filter((c): c is Playlist => 'cover' in c && !!c.cover?.id);\n break;\n case WidgetTypeId.ContinueWatching:\n widget.content = widget.content.map(c => 'object' in c && c.object);\n default:\n break;\n case WidgetTypeId.Presentations:\n widget.content = widget.content.filter((c): c is Presentation => 'id' in c && c.id.toString() !== presentation?.id?.toString());\n break;\n }\n\n return widget;\n },\n \n isWidgetInTableOfContents(metadata: Partial<WidgetMetadata>): boolean {\n return !!metadata?.showInTableOfContents;\n },\n\n /**\n * Widget container view won't render a widget with no content typically,\n * but some widgets (such as blurbs) have no content, but should render anyway.\n */\n hasNoContent(widgetTypeId: WidgetTypeId): boolean {\n if ([ WidgetTypeId.Blurb, WidgetTypeId.Feedback ].includes(widgetTypeId)) return true;\n\n return false;\n },\n\n /**\n * If any widgets should be hidden on smaller screen sizes, add them here.\n * If this needs to be more flexible at some point, it should be added to\n * the widget settings and metadata object.\n */\n canDisplayOnScreenSize(\n breakpoints: Breakpoints,\n widgetTypeId: WidgetTypeId,\n widgetTemplate: WidgetTemplate\n ): boolean {\n if (widgetTypeId === WidgetTypeId.Blurb && widgetTemplate === WidgetTemplate.HeroBannerSmall)\n return !breakpoints.xs && !breakpoints.sm;\n\n return true;\n },\n\n isCompanyWidget(widgetTypeId: WidgetTypeId): boolean {\n switch (widgetTypeId) {\n case WidgetTypeId.CompanyLatestReleasedVideo:\n case WidgetTypeId.CompanyVideos:\n case WidgetTypeId.UpcomingLivestreams:\n return true;\n default:\n return false;\n }\n },\n\n getVideoContent(content: VideoWidgetTemplateContent): VideoTypes[] {\n const firstItem = ArrayHelper.first<Video | Series>(content);\n\n if (MasterTypeHelper.isType<Series>(firstItem, MasterType.Series))\n return firstItem.videos.data;\n\n return content as VideoTypes[];\n },\n\n showRemoveButton(widgetTypeId: WidgetTypeId): boolean {\n return widgetTypeId === WidgetTypeId.ContinueWatching;\n },\n\n /**\n * Paginated data returns more widgets so if we dont merge the widget content by widget type id,\n * it would add another widget to the page rather than appending content to the relevant\n * search result index\n * \n * For example:\n * Say we receive these widgets for a query:\n * - topics widget\n * - related results widget\n * \n * If a user scrolls down to the end of page we fetch more items from the last widget\n * which in this case is 'related results widget'. \n * Now our overall response looks like this\n * - topics widget\n * - related results widget\n * - related results widget\n * \n * Since this is a new widget item entry it will be rendered as a new widget with seprate headings etc.\n * In this case we want to combine these two widgets data into one so its looks like this again:\n * - topics widget\n * - related results widget (data is combined)\n * \n * But what if widget we get recieve has a different widget template id. This currently happens for\n * the 'series widget' - series widget can have the tall poster template or the thumbnail like template.\n * \n * so to visualize this it can be like:\n * - topics widget\n * - top results widget\n * - series widget (template: tall poster)\n * - series widget (template: thumbnail)\n * \n * Since they technically will look different based on the template id we will not merge the data in this case.\n * It will merge the data to the same widget as long as the combination of widget Id + template Id is the same.\n * \n * Since they are separate widgets they will render duplicate headings - we handle this in css instead which\n * checks for adjacent siblings and if its the same widget - it hides the widget heading so it will look\n * like its a single widget rather than separate widgets.\n * \n * - Nish\n */\n mergeWidgets<T extends BaseWidget>(\n items: T[],\n mergeContent: (target: T, source: T) => void\n ): T[] {\n const widgets = ObjectHelper.deepClone(items);\n const groupedWidgets = ArrayHelper.groupBy(widgets, 'widgetId');\n const mergedWidgets: T[] = [];\n\n for (const widgetGroup of Object.values(groupedWidgets)) {\n let currentMergedWidget: T | null = null;\n const groupMergedWidgets: T[] = [];\n\n for (const widget of widgetGroup) {\n if (!currentMergedWidget) {\n currentMergedWidget = widget;\n continue;\n }\n\n if (widget.templateId !== currentMergedWidget.templateId) {\n groupMergedWidgets.push(currentMergedWidget);\n currentMergedWidget = widget;\n continue;\n }\n\n mergeContent(currentMergedWidget, widget);\n }\n\n if (currentMergedWidget) {\n groupMergedWidgets.push(currentMergedWidget);\n }\n mergedWidgets.push(...groupMergedWidgets);\n }\n\n return mergedWidgets;\n },\n\n mergeCuratedWidgets(data: CuratedWidget[]): CuratedWidget[] {\n if (!data) return data;\n\n return WidgetHelper.mergeWidgets(data, (target, source) => {\n target.content = [\n ...(target.content || []),\n ...source.content\n ];\n });\n },\n\n getWidgetResultsTransformers(): Array<UseTransformerFunc<CuratedWidget[]>> {\n return [\n data => WidgetHelper.mergeCuratedWidgets(data)\n ];\n }\n};\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,a as t,ln as n,r,v as i}from"./BlDu0qdC.chunk.js";import{t as a}from"./BdvdGLvp.chunk.js";import{t as o}from"./DEBg-sxL.chunk.js";import{t as s}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{n as c}from"./BSMzg7zU.chunk.js";import{n as l,t as u}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,a as t,ln as n,r,v as i}from"./BlDu0qdC.chunk.js";import{t as a}from"./BdvdGLvp.chunk.js";import{t as o}from"./DEBg-sxL.chunk.js";import{t as s}from"./BvMTtGLi.chunk.js";import"./BjggjRoR.chunk.js";import{n as c}from"./BSMzg7zU.chunk.js";import{n as l,t as u}from"./x1pOfdJd.chunk.js";import{r as d}from"./BKtR2N4K.chunk.js";import{t as f}from"./cwPDEI372.chunk.js";import{c as p,d as m}from"./BIZf7Q462.chunk.js";import{t as h}from"./CgYigCRf2.chunk.js";import"./COkf8IPk2.chunk.js";import{t as g}from"./DyKk_C_Y.chunk.js";import{t as _}from"./CzALYUiA.chunk.js";import{t as v}from"./CVBPygL42.chunk.js";import{t as y}from"./RVXazxrl.chunk.js";import{n as b,t as x}from"./C0g24IgE.chunk.js";import{t as S}from"./BjWoFp882.chunk.js";import{o as C}from"./Cwfi7NWC.chunk.js";import{t as w}from"./CZYfGOZQ2.chunk.js";import{n as T}from"./SkqOfrUt2.chunk.js";import{n as E}from"./CEHZyVr22.chunk.js";import{t as D}from"./CVg7lnul.chunk.js";import{t as O}from"./CBagkP1H2.chunk.js";import{t as k}from"./h8NvpGLQ2.chunk.js";import{n as A,t as j}from"./Pwy3-zgZ.chunk.js";import{t as M}from"./C67_KJGi2.chunk.js";import{t as N}from"./CIep1gDJ2.chunk.js";var P=n(t()),F=class extends S{constructor(e){super(`WidgetNotSupportedError`),this.id=e}get name(){return`WidgetNotSupportedError`}get dialogOptions(){return{title:`Widget not supported`,text:`Widget with ID <strong>${this.id}</strong> is not in the wizard. Please contact the Product team for support.`,buttons:[{text:`Okay`,className:`btn btn-dark`,success:!0}]}}},I=r(),L=`dashboard-wizard`,R=9999;function z(e){let{setOnClickConfirm:t,disableNext:n,setDisableNext:r,setShowSpinner:i}=P.useContext(O),o=b(),[s,c]=P.useState(null),l=u[e.widgetTypeId],d=p(l.canFetchPreview(o.values.data,_.getDashboardTargetInfo(e.dashboard))&&D.previewWidget(o.values.widgetId,o.values.data,_.getWidgetParams(o.values.widgetId,o.values.templateId,_.getDashboardTargetType(e.dashboard))));P.useEffect(()=>{d.isFetching||!d.data||c(d.data.content)},[d.isFetching,d.data]);let f=E(o.values);P.useEffect(()=>{r(!0)},[]),P.useEffect(()=>{!o.dirty||a.isEqual(o.values,f)||(t(()=>()=>{e.onSubmit(o.values,i)}),o.validateForm().then(e=>{let t=!Object.keys(e).length;n===t&&r(!t)}))},[o.values,n]);function m(t){if(c(t),e.widgetTypeId===g.CuratedMultimedia){let e=o.values.data,n=t.map(t=>e.multimedias.find(e=>e.objectId.toString()===t.id.toString()));o.setFieldValue(`data.multimedias`,n);return}o.setFieldValue(`data.objectIds`,t.map(e=>e.id))}let h=u[e.widgetTypeId].formView;return h?(0,I.jsx)(h,{dashboard:e.dashboard,audiences:e.audiences,presentation:e.presentation,classification:e.classification,imageCdnUrl:e.imageCdnUrl,content:s,isEditing:!!o.values.id,onReorderWidgets:m,availablePresentations:e.availablePresentations,settings:e.settings,commonVideoProps:e.commonVideoProps,customResultRequest:e.customResultRequest}):(0,I.jsx)(I.Fragment,{})}function B(t){let n=!!t.widgetId,r=k(t.dashboardId),g=_.getDashboardTargetInfo(r.data),b=_.isClassificationDashboard(g),S=_.isContentPartnerDashboard(g),E=p(S&&w.getContentPartnerBySlug(g.slug)),O=S&&w.getSeriesInContentPartner(E.data?.id),B=r.data?.widgets?.find(e=>e.id===t.widgetId),{commonVideoProps:V}=M(),H=p(b&&y.classification(g.classificationId)),U=``;g?.targetType===d.PartnerProfile&&(U=g.slug);let W=H.data?.presentationId;(g?.targetType===d.Discover||g?.targetType===d.MoviesAndTv||g?.targetType===d.Company)&&(W=g.presentationId);let G=p(W&&y.presentationAudiences(W)),K=p(W&&y.presentation(W)),q=p(A.availablePresentations(f.Subject)),J=T(),Y=v(),X=m();P.useEffect(()=>{if(!u[t.widgetTypeId].formView){i.throw(new F(t.widgetTypeId));return}J.lock({id:L,title:`Are you sure you want to leave?`,text:`All of your progress will be discarded.`,appLinkWhitelist:[{application:s.DASHBOARD_EDITOR,action:o.DashboardEditor.WIDGET_CONTENT_GUIDELINE},{application:s.DASHBOARD_EDITOR,action:o.DashboardEditor.ADD_CONTENT_IMAGE_UPLOAD}]})},[t.templateId]);function Z(r,i){let c=a.omit(r,[`content`]);c.data.presentationId||(c.data.presentationId=K.data?.id),i(!0),X(n?D.editWidget(c):D.addWidget(c)).then(()=>{Y.success(`Successfully ${n?`updated`:`created`} widget.`),J.unlock(L),e.trigger({application:s.DASHBOARD_EDITOR,action:o.DashboardEditor.EDIT_DASHBOARD,args:[t.dashboardId]})}).catch(()=>{Y.error(`Something went wrong while we were trying to ${n?`update`:`add`} your widget. Please try again.`),i(!1)})}function Q(){return n?{id:B.id,name:B.name,description:B.description,widgetId:B.widgetId,templateId:B.templateId,dashboardId:B.dashboardId,status:B.status,data:B.data,index:B.index,metadata:B.metadata,curriculumIds:B.curriculumIds}:{id:null,name:``,description:``,widgetId:t.widgetTypeId,templateId:t.templateId,dashboardId:t.dashboardId,status:c.Published,data:{presentationId:K.data?.id,slug:U,...u[t.widgetTypeId].getInitialData?.(g,t.templateId)??{}},index:(h.findLast(r.data.widgets,e=>e.index<R)?.index??-1)+1,metadata:u[t.widgetTypeId].getInitialMetadata?.(g,t.templateId)??{},curriculumIds:[]}}function $(){return!!(S&&!r.hasCompleted||!r.hasCompleted||!K.data&&!S||b&&!H.hasCompleted)}return(0,I.jsx)(C.ReferenceContainer,{children:(0,I.jsxs)(N,{dashboard:r.data,templateId:t.templateId,widgetTypeId:t.widgetTypeId,currentStep:`add-content`,isEditing:n,children:[(0,I.jsx)(`h2`,{className:`h4`,children:n?`Edit content`:`Add content`}),!$()&&(0,I.jsx)(x,{initialValues:Q(),onSubmit:null,validationSchema:l(t.widgetTypeId,t.templateId,g?.targetType),children:(0,I.jsx)(z,{widgetTypeId:t.widgetTypeId,audiences:G.data,templateId:t.templateId,onSubmit:Z,classification:H.data,presentation:K.data,dashboard:r.data,imageCdnUrl:ClickView.Config.Urls.ImageAPI,availablePresentations:q.data,settings:j,commonVideoProps:V,customResultRequest:O})})]})})}export{B as DashboardWizardAddContentContainerView};
|
|
2
|
+
//# sourceMappingURL=BUWsFXQp2.chunk.js.map
|