@clickview/lite 0.68.0-rc.2 → 0.68.0-rc.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundles.json +1 -1
- package/dist/languages/en.json +1 -1
- package/dist/scripts/4061-f0b1ca5ab4-lite.chunk.js +2 -0
- package/dist/scripts/4061-f0b1ca5ab4-lite.chunk.js.map +1 -0
- package/dist/scripts/8724-df7abe6b38-lite.chunk.js +2 -0
- package/dist/scripts/8724-df7abe6b38-lite.chunk.js.map +1 -0
- package/dist/scripts/{bundle-20ee24bb57.min.js → bundle-b974fa6810.min.js} +3 -3
- package/dist/scripts/{bundle-20ee24bb57.min.js.map → bundle-b974fa6810.min.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/4061-dc57bc76ce-lite.chunk.js +0 -2
- package/dist/scripts/4061-dc57bc76ce-lite.chunk.js.map +0 -1
- package/dist/scripts/8724-f277ba36c4-lite.chunk.js +0 -2
- package/dist/scripts/8724-f277ba36c4-lite.chunk.js.map +0 -1
- /package/dist/scripts/{bundle-20ee24bb57.min.js.LICENSE.txt → bundle-b974fa6810.min.js.LICENSE.txt} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[4061],{94644:(e,a,t)=>{t.d(a,{r:()=>c});var n=t(50242),i=t(81886),r=t(67058),s=t(14553),o=t(49267),d=t(49075),l={notFound:r.d,forbidden:{rating:s.q,yearLevel:s.q,region:o.a,privacy:s.q},badRequest:d._,internalServerError:d._};function c(e){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var r;r="number"==typeof e?e:e.status;var s=Object.assign(Object.assign({},l),a);r&&i.Q.Ry.isStatusCodeError(r)&&(r!==n.o.InternalServer?r!==n.o.NotFound?r!==n.o.Forbidden?t.badRequest||i.Q.Ry.throw(new s.badRequest):t.forbidden||i.Q.Ry.throw(new s.forbidden.privacy):t.notFound||i.Q.Ry.throw(new s.notFound):t.internalServerError||i.Q.Ry.throw(new d._))}}},91286:(e,a,t)=>{t.d(a,{v:()=>s});var n=t(32735),i=t(94644);function r(e){return e.map((function(e){return e.statusCode})).join(":")}function s(e,a,t){var s=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){s.forEach((function(e){(0,i.r)(e.statusCode,a,t)}))}),[r(s),a,t])}},74061:(e,a,t)=>{t.r(a),t.d(a,{StudentsVideosView:()=>V});var n=t(32735),i=t(23481),r=t(20354),s=t(65858),o=t(49935),d=t(23232),l=t(37395),c=t(83345),u=t(74696),p=t(13231),m=t(51365),g=t(91286),v=t(22902),E=t(79612),y=t(64818),h=t(31908),O=t(99742),S=t(14070),b=t(97291),f=t(51855),k=t(10741),w=t(22490),A=t(47288),N="userManager.studentsVideos",T=i.T.encloseNamespace(N);function V(e){var a,t,V,D,I,L,R=r.a.useBasicFetch(A.N.getUser(e.id)),G=r.a.useBasicFetch(A.N.getStudentVideos(e.id,e.cursor));(0,E.M)({title:R.data?i.T.getPhrase(N,"pageTitle",{name:y.l.getFullName(R.data)}):""});var _=(0,v.T)().hasPermissions,M=(0,f.G)().isPlugin;return(0,g.v)(R),R.hasCompleted&&G.hasCompleted?n.createElement(m.M.Provider,{value:{getVideoActions:function(a,t){var n=Object.assign(Object.assign({},t.analyticsOptions),{entity:h.M.getAnalyticsEntity(a),location:s.LZ.ViewStudentVideos}),i=Object.assign(Object.assign({},t.analyticsData),{id:a.id}),r=[];return h.M.isVideo(a)&&r.push({order:1,label:T("download"),appLink:{application:b.O.VIDEOS,action:S.e.Videos.DOWNLOAD_VIDEO,args:[a.id]},analyticsOptions:Object.assign(Object.assign({},n),{actionType:s.Vw.Download,workflowPhase:s.eu.Start}),analyticsData:i}),r.push({order:2,label:T("delete"),appLink:{application:b.O.USER_MANAGER,action:S.e.UserManager.DELETE_STUDENTS_VIDEO,args:[e.id,a.id],params:{typeId:a.typeId}},className:"text-danger",analyticsOptions:Object.assign(Object.assign({},n),{actionType:s.Vw.Delete,workflowPhase:s.eu.Start}),analyticsData:i}),r}}},n.createElement("div",{className:"px-3"},n.createElement("h1",{className:"h2"},T("heading",{name:y.l.getFullName(R.data),yearGroup:null===(a=R.data.masterYearGroup)||void 0===a?void 0:a.name})),n.createElement("div",{className:"pb-3"},n.createElement(o.Oo,{breadcrumbs:function(){var e;return[{name:i.T.getPhrase(N,"settingsBreadcrumb"),appLink:{application:b.O.SETTINGS,action:S.e.Settings.HOME}},{name:i.T.getPhrase(N,"studentsBreadcrumb"),appLink:{application:b.O.USER_MANAGER,action:S.e.UserManager.STUDENTS}},{name:T("heading",{name:y.l.getFullName(R.data),yearGroup:null===(e=R.data.masterYearGroup)||void 0===e?void 0:e.name}),active:!0}]}()})),(null===(V=null===(t=G.data)||void 0===t?void 0:t.data)||void 0===V?void 0:V.length)?n.createElement(p.E4,{videos:null===(D=G.data)||void 0===D?void 0:D.data,getVideoAppLink:function(a){return{application:b.O.USER_MANAGER,action:S.e.UserManager.STUDENTS_VIDEO,args:[e.id,a.id],params:{typeId:a.typeId}}},hasPermissions:_,getPreviewQuestionsAppLink:function(e){return k.j.getPreviewQuestionsAppLink(e)},yearGroups:null,presentationAudiences:null,isPlugin:M,getClassroomGuideAppLink:w.W.getClassroomGuideAppLink,getInteractiveGuidanceAppLink:w.W.getInteractiveGuidanceAppLink,getResourceGuidanceAppLink:w.W.getResourceGuidanceAppLink}):n.createElement(d.u,null,n.createElement(d.u.Image,{src:O.W.EmptyStates.MY_VIDEOS,altText:T("emptyInfo")}),n.createElement(d.u.Heading,null,n.createElement(c.x,{namespace:N,phrase:"emptyHeading"})),n.createElement(d.u.Info,null,n.createElement(c.x,{namespace:N,phrase:"emptyInfo",options:{name:R.data.name}}))),!!(null===(L=null===(I=G.data)||void 0===I?void 0:I.pagination)||void 0===L?void 0:L.cursors)&&n.createElement(l.t,{appLink:{application:b.O.USER_MANAGER,action:S.e.UserManager.STUDENTS_VIDEOS},cursors:{next:G.data.pagination.cursors.next,previous:e.cursor},buttonVariant:"outline-dark",className:"py-2 float-end",prevHack:!0}))):n.createElement("div",{className:"mx-n2"},n.createElement(u.S,{allowBulkActions:!0}))}}}]);
|
|
2
|
+
//# sourceMappingURL=4061-f0b1ca5ab4-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/4061-f0b1ca5ab4-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/projects/lite/src/apps/user-manager/views/students-videos/StudentsVideosView.tsx"],"sourcesContent":["import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsOptions, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Breadcrumb, Breadcrumbs } from 'libs/shared/components/breadcrumbs/Breadcrumbs';\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { Pagination } from 'libs/shared/components/pagination/Pagination';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { PartialVideoList } from 'libs/shared/components/video-list/partial-loading/PartialVideoList';\nimport { VideoList } from 'libs/shared/components/video-list/VideoList';\nimport { VideoActionsContext, VideoActionsOptions } from 'libs/shared/context/VideoActionsContext';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { usePermissions } from 'libs/shared/hooks/usePermissions';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { BasePaginatedCollection, User, VideoTypes } from 'libs/shared/interfaces';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { usePluginHelper } from 'shared/hooks/use-plugin-helper/usePluginHelper';\nimport { InteractiveHelpers } from 'shared/utils/InteractiveHelper';\nimport { VideoAppLinkHelper } from 'shared/utils/VideoAppLinkHelper';\n\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nconst namespace = 'userManager.studentsVideos';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StudentsVideosViewProps {\n id: string;\n cursor: string;\n}\n\nexport function StudentsVideosView(props: StudentsVideosViewProps): JSX.Element {\n const user = Flight.useBasicFetch<User>(UserManagerRequests.getUser(props.id));\n\n const videos = Flight.useBasicFetch<BasePaginatedCollection<VideoTypes>>(\n UserManagerRequests.getStudentVideos(props.id, props.cursor)\n );\n\n useSetPageMetadata({\n title: user.data\n ? LanguageService.getPhrase(namespace, 'pageTitle', { name: UserHelper.getFullName(user.data) })\n : ''\n });\n\n const { hasPermissions } = usePermissions();\n\n const { isPlugin } = usePluginHelper();\n\n useHandleObjectError(user);\n\n function getBreadcrumbs(): Breadcrumb[] {\n return [\n {\n name: LanguageService.getPhrase(namespace, 'settingsBreadcrumb'),\n appLink: {\n application: AppChannels.SETTINGS,\n action: Actions.Settings.HOME\n }\n },\n {\n name: LanguageService.getPhrase(namespace, 'studentsBreadcrumb'),\n appLink: {\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.STUDENTS\n }\n },\n {\n name: getPhrase('heading', { name: UserHelper.getFullName(user.data), yearGroup: user.data.masterYearGroup?.name }),\n active: true\n }\n ];\n }\n\n function getVideoActions(video: VideoTypes, options: VideoActionsOptions): ActionOptions[] {\n const analyticsOptions: AnalyticsOptions = {\n ...options.analyticsOptions,\n entity: VideoHelper.getAnalyticsEntity(video),\n location: LocationContext.ViewStudentVideos\n };\n\n const analyticsData = {\n ...options.analyticsData,\n id: video.id\n };\n\n const actions: ActionOptions[] = [];\n\n if (VideoHelper.isVideo(video)) {\n actions.push({\n order: 1,\n label: getPhrase('download'),\n appLink: { application: AppChannels.VIDEOS, action: Actions.Videos.DOWNLOAD_VIDEO, args: [video.id]},\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Download,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData\n });\n }\n\n actions.push({\n order: 2,\n label: getPhrase('delete'),\n appLink: {\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.DELETE_STUDENTS_VIDEO,\n args: [ props.id, video.id ],\n params: { typeId: video.typeId }\n },\n className: 'text-danger',\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Delete,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData\n });\n\n return actions;\n }\n\n const dataLoaded = (\n user.hasCompleted &&\n videos.hasCompleted\n );\n\n /**\n * TODO: Flesh out with a better empty state\n */\n if (!dataLoaded)\n return <div className='mx-n2'><PartialVideoList allowBulkActions /></div>;\n\n return (\n <VideoActionsContext.Provider value={{ getVideoActions }}>\n <div className='px-3'>\n <h1 className='h2'>{getPhrase('heading', { name: UserHelper.getFullName(user.data), yearGroup: user.data.masterYearGroup?.name })}</h1>\n <div className='pb-3'>\n <Breadcrumbs\n breadcrumbs={getBreadcrumbs()}\n />\n </div>\n {videos.data?.data?.length ?\n <VideoList\n videos={videos.data?.data}\n getVideoAppLink={video => ({\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.STUDENTS_VIDEO,\n args: [ props.id, video.id ],\n params: { typeId: video.typeId }\n })}\n hasPermissions={hasPermissions}\n getPreviewQuestionsAppLink={interactive => InteractiveHelpers.getPreviewQuestionsAppLink(interactive)}\n yearGroups={null}\n presentationAudiences={null}\n isPlugin={isPlugin}\n getClassroomGuideAppLink={VideoAppLinkHelper.getClassroomGuideAppLink}\n getInteractiveGuidanceAppLink={VideoAppLinkHelper.getInteractiveGuidanceAppLink}\n getResourceGuidanceAppLink={VideoAppLinkHelper.getResourceGuidanceAppLink}\n /> :\n <EmptyState>\n <EmptyState.Image src={ImageUrls.EmptyStates.MY_VIDEOS} altText={getPhrase('emptyInfo')} />\n <EmptyState.Heading><Text namespace={namespace} phrase='emptyHeading' /></EmptyState.Heading>\n <EmptyState.Info><Text namespace={namespace} phrase='emptyInfo' options={{ name: user.data.name }} /></EmptyState.Info>\n </EmptyState>\n }\n {!!videos.data?.pagination?.cursors && (\n <Pagination\n appLink={{\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.STUDENTS_VIDEOS\n }}\n cursors={{ next: videos.data.pagination.cursors.next, previous: props.cursor }}\n buttonVariant='outline-dark'\n className='py-2 float-end'\n prevHack\n />\n )}\n </div>\n </VideoActionsContext.Provider>\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","namespace","getPhrase","StudentsVideosView","props","user","id","videos","cursor","title","data","name","hasPermissions","isPlugin","hasCompleted","value","getVideoActions","video","options","analyticsOptions","entity","location","analyticsData","actions","push","order","label","appLink","application","action","args","actionType","workflowPhase","params","typeId","className","yearGroup","masterYearGroup","breadcrumbs","active","getBreadcrumbs","length","getVideoAppLink","getPreviewQuestionsAppLink","interactive","yearGroups","presentationAudiences","getClassroomGuideAppLink","getInteractiveGuidanceAppLink","getResourceGuidanceAppLink","src","altText","phrase","pagination","cursors","next","previous","buttonVariant","prevHack","allowBulkActions"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_clickview_lite=self.webpackChunk_clickview_lite||[]).push([[8724],{94644:(e,t,a)=>{a.d(t,{r:()=>d});var n=a(50242),i=a(81886),r=a(67058),o=a(14553),s=a(49267),l=a(49075),c={notFound:r.d,forbidden:{rating:o.q,yearLevel:o.q,region:s.a,privacy:o.q},badRequest:l._,internalServerError:l._};function d(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(e){var r;r="number"==typeof e?e:e.status;var o=Object.assign(Object.assign({},c),t);r&&i.Q.Ry.isStatusCodeError(r)&&(r!==n.o.InternalServer?r!==n.o.NotFound?r!==n.o.Forbidden?a.badRequest||i.Q.Ry.throw(new o.badRequest):a.forbidden||i.Q.Ry.throw(new o.forbidden.privacy):a.notFound||i.Q.Ry.throw(new o.notFound):a.internalServerError||i.Q.Ry.throw(new l._))}}},91286:(e,t,a)=>{a.d(t,{v:()=>o});var n=a(32735),i=a(94644);function r(e){return e.map((function(e){return e.statusCode})).join(":")}function o(e,t,a){var o=Array.isArray(e)?e:[e];(0,n.useEffect)((function(){o.forEach((function(e){(0,i.r)(e.statusCode,t,a)}))}),[r(o),t,a])}},98724:(e,t,a)=>{a.r(t),a.d(t,{StudentsVideoView:()=>H});var n=a(32735),i=a(23481),r=a(20354),o=a(65858),s=a(83657),l=a(83914),c=a(42648),d=a(110),m=a(78259),u=a(11607),p=a(25723),v=a(87311),g=a(91743),E=a(83345),b=a(40178),h=a(31908),f=a(8730);const N={closeButton:"ZwHXo",descriptionBorder:"J_Z5i"};var y="shared.videoDetails",w=i.T.encloseNamespace(y);function C(e){var t=e.label,a=e.items,i=e.className;if(!(a&&a.data&&a.data.length))return n.createElement(n.Fragment,null);var r=a.data.map((function(e){return e.name})).join(", ");return n.createElement("div",{className:i},t,": ",r)}function x(e){var t,a,i,r,o,s,l,c,m=e.video;if(!h.M.isVideo(m)&&!h.M.isClip(m))return n.createElement(n.Fragment,null);var u=h.M.getParentVideo(m);return n.createElement("div",{className:m.description?"col-md-5 ps-md-3 pt-3 pt-md-0":"col-12"},n.createElement("h2",{className:"h6 mb-1"},n.createElement(E.x,{phrase:"details"})),!!u.productionYear&&n.createElement("div",{className:"mb-1"},n.createElement(E.x,{phrase:"productionYear",options:{year:u.productionYear}})),n.createElement(C,{label:w("productionCompanies",{smartCount:null===(a=null===(t=u.productionCompanies)||void 0===t?void 0:t.data)||void 0===a?void 0:a.length}),items:u.productionCompanies,className:"mb-1"}),n.createElement(C,{label:w("distributors",{smartCount:null===(r=null===(i=u.distributors)||void 0===i?void 0:i.data)||void 0===r?void 0:r.length}),items:u.distributors,className:"mb-1"}),n.createElement(C,{label:w("producers",{smartCount:null===(s=null===(o=u.producers)||void 0===o?void 0:o.data)||void 0===s?void 0:s.length}),items:u.producers,className:"mb-1"}),n.createElement(C,{label:w("directors",{smartCount:null===(c=null===(l=u.directors)||void 0===l?void 0:l.data)||void 0===c?void 0:c.length}),items:u.directors,className:"mb-1"}),!!u.dateBroadcast&&n.createElement("div",{className:"mb-1"},n.createElement(E.x,{phrase:"dateBroadcast",options:{date:d.O.format(u.dateBroadcast,"DD/MM/YYYY")}})),!!u.channel&&n.createElement("div",{className:"mb-1"},n.createElement(E.x,{phrase:"channel",options:{channel:u.channel.name}})),h.M.canViewUploadDate(e.video)&&n.createElement("div",{className:"mb-1"},n.createElement(E.x,{phrase:"dateUploaded",options:{date:d.O.format(m.dateCreated,"DD/MM/YYYY")}})))}function k(e){var t,a,i=e.video,r=e.maxHeight,s=void 0===r?b.x:r,l=h.M.getParentVideo(i),d=!!e.video.description,w=(0,f._)(e.video)||!!l.productionYear||!!l.dateBroadcast||!!l.channel||h.M.canViewUploadDate(e.video),C="function"==typeof e.onClickClose,k="function"==typeof e.onClickShowCurriculumLinks;return d||w?n.createElement(E.D.Provider,{value:y},n.createElement("div",{className:"rounded border p-3 mb-3 position-relative"},n.createElement(c.$B,{autoHeight:!0,autoHeightMax:s},n.createElement("div",{className:"row g-0"},d&&n.createElement("div",{className:w?"".concat(N.descriptionBorder," pe-3 col-md-7"):"col-12"},n.createElement("div",{className:"d-flex align-items-center"},n.createElement("h2",{className:"h6 mb-1"},n.createElement(E.x,{phrase:"description"})),n.createElement(p.m,{text:i.description,title:i.name,className:"ps-2",onLaunch:e.onLaunchImmersiveReader,onExit:e.onExitImmersiveReader,analyticsOptions:{location:o.LZ.PlayPage,entity:o.py.Video,actionType:o.Vw.Click,descriptor:o._S.LaunchImmersiveReader},analyticsData:{id:i.id,type:"description"}})),n.createElement("p",{className:"mb-0",dangerouslySetInnerHTML:{__html:m.O.linkifyText(e.video.description,{nl2br:!0})}}),n.createElement(g.P,Object.assign({tags:e.hideTags||h.M.isInteractive(e.video)||!(null===(a=null===(t=e.video.tags)||void 0===t?void 0:t.data)||void 0===a?void 0:a.length)?null:e.video.tags.data},v.G.getTagActionProps(e.getTagAppLink,null,e.suppressInteractivity),{className:"mt-1"})),k&&n.createElement(u.L,{onClick:e.onClickShowCurriculumLinks,className:"cursor-pointer d-inline-block fw-semibold text-info mt-2 mb-1"},n.createElement(E.x,{namespace:y,phrase:"seeCurriculumLinks"}))),w&&n.createElement(x,Object.assign({},e)))),C&&n.createElement("button",{type:"button",className:"btn-close ".concat(N.closeButton),"aria-label":"Close",onClick:e.onClickClose}))):n.createElement(n.Fragment,null)}var S=a(4594),O=a(60051),D=a(43012),M=a(39151),V=a(20768),I=a(47812),L=a(31949),_=a(1575),F=a(91286),T=a(79612),B=a(35223),R=a(64818),j=a(14070),Y=a(97291),P=a(57245),U=a(47288),A="userManager.studentsVideo",q=i.T.encloseNamespace(A);function H(e){var t,a,c,d,m,u,p=r.a.useBasicFetch(U.N.getUser(e.userId)),v=r.a.useBasicFetch((a=e.id,(c=e.typeId).toString()===S.E.Clip.toString()?D.e.clip(a):c.toString()===S.E.Interactive.toString()?V.b.interactiveMetadata(a):_.R.video(a))),g=r.a.useBasicFetch(I.k.createViewKey(e.id,O.f.MasterObject)),E=r.a.useBasicFetch(M.L.config()),b=r.a.useBasicFetch(L.N.currentUser());return(0,F.v)([p,v]),(0,T.M)({title:p.data?i.T.getPhrase(A,"pageTitle",{name:R.l.getFullName(p.data)}):""}),p.hasCompleted&&v.hasCompleted&&g.hasCompleted&&E.hasCompleted&&b.hasCompleted?n.createElement("div",{className:"px-3"},n.createElement("div",{className:"alert text-dark bg-light-blue px-2 rounded d-flex flex-column flex-lg-row justify-content-between mb-3 align-items-center",role:"alert"},n.createElement("div",{className:"d-flex align-items-center"},n.createElement(l.x,{svgName:B.vn.Info,size:l.S.Standard,className:"me-2 svg-container"}),n.createElement("div",{className:"w-100"},n.createElement("p",{className:"fw-semibold mb-0"},q(function(e){return e.toString()===S.E.Clip.toString()?"messageClip":e.toString()===S.E.Interactive.toString()?"messageInteractive":"messageVideo"}(e.typeId),{name:R.l.getFullName(p.data),yearGroup:null===(t=p.data.masterYearGroup)||void 0===t?void 0:t.name}))))),n.createElement("div",{className:"mb-3"},n.createElement(P._,{config:E.data,video:v.data,currentUser:b.data,viewKey:g.data})),n.createElement("div",{className:"d-flex justify-content-between align-items-center mb-2"},n.createElement("div",null,n.createElement("h1",{className:"h3 d-inline-flex m-0 mb-2"},v.data.name)),n.createElement(s.e,{actions:(d={entity:h.M.getAnalyticsEntity(v.data),location:o.LZ.ViewStudentVideos},m={id:v.data.id},u=[],h.M.isVideo(v.data)&&u.push({order:1,label:q("download"),appLink:{application:Y.O.VIDEOS,action:j.e.Videos.DOWNLOAD_VIDEO,args:[v.data.id]},analyticsOptions:Object.assign(Object.assign({},d),{actionType:o.Vw.Download,workflowPhase:o.eu.Start}),analyticsData:m}),u.push({order:2,label:q("delete"),appLink:{application:Y.O.USER_MANAGER,action:j.e.UserManager.DELETE_STUDENTS_VIDEO,args:[e.id,v.data.id],params:{typeId:v.data.typeId}},className:"text-danger",analyticsOptions:Object.assign(Object.assign({},d),{actionType:o.Vw.Delete,workflowPhase:o.eu.Start}),analyticsData:m}),u),actionsDropdownClassName:"btn btn-outline-dark"})),n.createElement(k,{video:v.data})):n.createElement(n.Fragment,null)}}}]);
|
|
2
|
+
//# sourceMappingURL=8724-df7abe6b38-lite.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scripts/8724-df7abe6b38-lite.chunk.js","mappings":"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","sources":["file:///app/packages/libs/shared/src/errors/handlers/HttpErrorHandlers.ts","file:///app/packages/libs/shared/src/hooks/UseHandleObjectError.ts","file:///app/packages/libs/shared/src/components/video-details/video-details.scss","file:///app/packages/libs/shared/src/components/video-details/VideoDetails.tsx","file:///app/packages/projects/lite/src/apps/user-manager/views/students-video/StudentsVideoView.tsx"],"sourcesContent":["import { BaseError } from 'libs/common/backbone/core/BaseError';\nimport { HttpStatus } from 'libs/common/backbone/enums/HttpStatus';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Core } from 'libs/common/core';\n\nimport { NotFoundError } from 'libs/shared/errors/general/not-found/NotFoundError';\nimport { PrivateResourceError } from 'libs/shared/errors/general/private-resource/PrivateResourceError';\nimport { RegionLockedResourceError } from 'libs/shared/errors/general/region-locked-resource/RegionLockedResourceError';\nimport { UnspecifiedError } from 'libs/shared/errors/general/unspecified-error/UnspecifiedError';\nimport { VideoTypes } from 'libs/shared/interfaces';\n\nexport interface HttpErrorMap {\n notFound?: new () => BaseError;\n forbidden?: {\n rating?: new (description: string) => BaseError;\n yearLevel?: new (description: string) => BaseError;\n region?: new () => BaseError;\n privacy?: new (video?: VideoTypes) => BaseError;\n };\n badRequest?: new () => BaseError;\n internalServerError?: new () => BaseError;\n}\n\nexport type IgnoreHttpErrorMap = {\n [key in keyof HttpErrorMap]: boolean;\n};\n\nconst defaultErrors: HttpErrorMap = {\n notFound: NotFoundError,\n forbidden: {\n rating: PrivateResourceError,\n yearLevel: PrivateResourceError,\n region: RegionLockedResourceError,\n privacy: PrivateResourceError\n },\n badRequest: UnspecifiedError,\n internalServerError: UnspecifiedError\n};\n\nexport function handleHttpError(\n info: HttpStatus | Xhr,\n customErrorMap: HttpErrorMap = {},\n /**\n * Prevent certain errors in the errorMap from being thrown\n * so that you may implement your own handler\n */\n ignoreMap: IgnoreHttpErrorMap = {}\n): void {\n if (!info)\n return;\n\n let statusCode: HttpStatus;\n\n if (typeof(info) === 'number') {\n statusCode = info;\n } else {\n statusCode = info.status;\n }\n\n const errorMap = {\n ...defaultErrors,\n ...customErrorMap\n };\n\n if (!statusCode)\n return;\n\n if (!Core.ErrorHelper.isStatusCodeError(statusCode))\n return;\n\n if (statusCode === HttpStatus.InternalServer) {\n if (!ignoreMap.internalServerError)\n Core.ErrorHelper.throw(new UnspecifiedError());\n return;\n }\n\n if (statusCode === HttpStatus.NotFound) {\n if (!ignoreMap.notFound)\n Core.ErrorHelper.throw(new errorMap.notFound());\n return;\n }\n\n if (statusCode === HttpStatus.Forbidden) {\n /**\n * TODO: Work out how to go about handling all forbidden errors, such as region locking, year levels,\n * ratings, and privacy.\n */\n if (!ignoreMap.forbidden)\n Core.ErrorHelper.throw(new errorMap.forbidden.privacy());\n return;\n }\n\n if (!ignoreMap.badRequest)\n Core.ErrorHelper.throw(new errorMap.badRequest());\n}\n\nexport function handleXhrError(xhr: Xhr, customErrorMap?: HttpErrorMap): void {\n handleHttpError(xhr.status, customErrorMap);\n}","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { handleHttpError, HttpErrorMap, IgnoreHttpErrorMap } from 'libs/shared/errors/handlers/HttpErrorHandlers';\n\nfunction generateCacheKey(flightObjs: Array<Flight.Response<any>>): string {\n return flightObjs.map(obj => obj.statusCode).join(':');\n}\n\n// TODO: Change this to just `useHandleHttpError` and only accept a status code.\nexport function useHandleObjectError(\n _flightObjs: Flight.Response<any> | Array<Flight.Response<any>>,\n customErrors?: HttpErrorMap,\n ignoreErrors?: IgnoreHttpErrorMap\n): void {\n const flightObjs = Array.isArray(_flightObjs) ? _flightObjs : [_flightObjs];\n\n useEffect(() => {\n flightObjs.forEach(obj => {\n handleHttpError(obj.statusCode, customErrors, ignoreErrors);\n });\n }, [ generateCacheKey(flightObjs), customErrors, ignoreErrors ]);\n}","// extracted by mini-css-extract-plugin\nexport default {\"closeButton\":\"ZwHXo\",\"descriptionBorder\":\"J_Z5i\"};","import * as React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\nimport { LinkifyHelper } from 'libs/common/react/utils/LinkifyHelper';\n\nimport { ClickDescriptor, EntityType, LocationContext, UserAction } from 'libs/analytics/interfaces';\n\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { ImmersiveReader } from 'libs/shared/components/immersive-reader/ImmersiveReader';\nimport { TagHelper } from 'libs/shared/components/tags/TagHelper';\nimport { TagList } from 'libs/shared/components/tags/TagList';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { MINIMUM_GLANCE_HEIGHT } from 'libs/shared/constants/MinimumGlanceHeight';\nimport { BaseObject, BasePaginatedCollection, CurrentUser, Tag, VideoTypes } from 'libs/shared/interfaces';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { hasPPDD } from './VideoDetailsUtils';\n\nimport styles from './video-details.scss';\n\nconst namespace = 'shared.videoDetails';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface CommaListProps {\n label: string;\n items: BasePaginatedCollection<BaseObject>;\n className?: string;\n}\n\nfunction CommaList(props: CommaListProps): React.ReactElement {\n const { label, items, className } = props;\n\n const hasItems = items && items.data && items.data.length;\n\n if (!hasItems)\n return <></>;\n\n const commaSeperated = items.data.map(i => i.name).join(', ');\n\n return (\n <div className={className}>{label}: {commaSeperated}</div>\n );\n}\n\nfunction DetailsSection(props: VideoDetailsWithScrollbarProps): React.ReactElement {\n const { video } = props;\n\n if (!VideoHelper.isVideo(video) && !VideoHelper.isClip(video))\n return <></>;\n\n const parentVideo = VideoHelper.getParentVideo(video);\n\n return (\n <div className={video.description ? 'col-md-5 ps-md-3 pt-3 pt-md-0' : 'col-12'}>\n <h2 className='h6 mb-1'><Text phrase='details' /></h2>\n {!!parentVideo.productionYear && (\n <div className='mb-1'>\n <Text phrase='productionYear' options={{ year: parentVideo.productionYear }} />\n </div>\n )}\n <CommaList\n label={getPhrase('productionCompanies', { smartCount: parentVideo.productionCompanies?.data?.length })}\n items={parentVideo.productionCompanies}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('distributors', { smartCount: parentVideo.distributors?.data?.length })}\n items={parentVideo.distributors}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('producers', { smartCount: parentVideo.producers?.data?.length })}\n items={parentVideo.producers}\n className='mb-1'\n />\n <CommaList\n label={getPhrase('directors', { smartCount: parentVideo.directors?.data?.length })}\n items={parentVideo.directors}\n className='mb-1'\n />\n {!!parentVideo.dateBroadcast && (\n <div className='mb-1'>\n <Text phrase='dateBroadcast' options={{ date: DateHelper.format(parentVideo.dateBroadcast, 'DD/MM/YYYY') }} />\n </div>\n )}\n {!!parentVideo.channel && (\n <div className='mb-1'>\n <Text phrase='channel' options={{ channel: parentVideo.channel.name }} />\n </div>\n )}\n {VideoHelper.canViewUploadDate(props.video) && (\n <div className='mb-1'>\n <Text phrase='dateUploaded' options={{ date: DateHelper.format(video.dateCreated, 'DD/MM/YYYY') }} />\n </div>\n )}\n </div>\n );\n}\n\ninterface VideoDetailsWithScrollbarProps {\n video: VideoTypes;\n currentUser?: CurrentUser;\n getTagAppLink?: (tag: Tag) => Core.AppLink;\n onLaunchImmersiveReader?: () => void;\n onExitImmersiveReader?: () => void;\n onClickClose?: () => void;\n onClickShowCurriculumLinks?: () => void;\n maxHeight?: number;\n suppressInteractivity?: boolean;\n hideTags?: boolean;\n}\n\nexport function VideoDetailsWithScrollbar(props: VideoDetailsWithScrollbarProps): React.ReactElement {\n const { video, maxHeight = MINIMUM_GLANCE_HEIGHT } = props;\n\n const parentVideo = VideoHelper.getParentVideo(video);\n\n const showDescription = !!props.video.description;\n\n const showDetails = (\n hasPPDD(props.video) ||\n !!parentVideo.productionYear ||\n !!parentVideo.dateBroadcast ||\n !!parentVideo.channel ||\n VideoHelper.canViewUploadDate(props.video)\n );\n\n const canClose = typeof props.onClickClose === 'function';\n const showCurriculumLinks = typeof props.onClickShowCurriculumLinks === 'function';\n\n function getTags(): Tag[] {\n if (props.hideTags || VideoHelper.isInteractive(props.video) || !props.video.tags?.data?.length)\n return null;\n\n return props.video.tags.data;\n }\n\n if (!showDescription && !showDetails)\n return <></>;\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <div className='rounded border p-3 mb-3 position-relative'>\n <Scrollbars autoHeight autoHeightMax={maxHeight}>\n <div className='row g-0'>\n {showDescription && (\n <div className={showDetails ? `${styles.descriptionBorder} pe-3 col-md-7` : 'col-12'}>\n <div className='d-flex align-items-center'>\n <h2 className='h6 mb-1'>\n <Text phrase='description' />\n </h2>\n <ImmersiveReader\n text={video.description}\n title={video.name}\n className='ps-2'\n onLaunch={props.onLaunchImmersiveReader}\n onExit={props.onExitImmersiveReader}\n analyticsOptions={{\n location: LocationContext.PlayPage,\n entity: EntityType.Video,\n actionType: UserAction.Click,\n descriptor: ClickDescriptor.LaunchImmersiveReader\n }}\n analyticsData={{ id: video.id, type: 'description' }}\n />\n </div>\n <p className='mb-0' dangerouslySetInnerHTML={{ __html: LinkifyHelper.linkifyText(props.video.description, { nl2br: true }) }} />\n <TagList\n tags={getTags()}\n {...TagHelper.getTagActionProps(props.getTagAppLink, null, props.suppressInteractivity)}\n className='mt-1'\n />\n {showCurriculumLinks && (\n <DivButton\n onClick={props.onClickShowCurriculumLinks}\n className='cursor-pointer d-inline-block fw-semibold text-info mt-2 mb-1'\n >\n <Text namespace={namespace} phrase='seeCurriculumLinks' />\n </DivButton>\n )}\n </div>\n )}\n\n {showDetails && (\n <DetailsSection {...props} />\n )}\n </div>\n </Scrollbars>\n\n {canClose && (\n <button\n type='button'\n className={`btn-close ${styles.closeButton}`}\n aria-label='Close'\n onClick={props.onClickClose}\n />\n )}\n </div>\n </LanguageNamespaceContext.Provider>\n );\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { AnalyticsOptions, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Actions as ActionsButtons } from 'libs/shared/components/actions/Actions';\nimport { SvgContainer, SvgContainerSize } from 'libs/shared/components/svg-container/SvgContainer';\nimport { VideoDetailsWithScrollbar } from 'libs/shared/components/video-details/VideoDetails';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { MediaIdType } from 'libs/shared/enums/MediaIdType';\nimport { ClipRequests } from 'libs/shared/flight-requests/ClipRequests';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { InteractiveRequests } from 'libs/shared/flight-requests/InteractiveRequests';\nimport { PlayerRequests } from 'libs/shared/flight-requests/PlayerRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useHandleObjectError } from 'libs/shared/hooks/UseHandleObjectError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { Config, CurrentUser, PlayerViewKey, User, VideoTypes } from 'libs/shared/interfaces';\nimport { cvSvgLibrary } from 'libs/shared/utils/SvgHelper';\nimport { UserHelper } from 'libs/shared/utils/UserHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\n\nimport { Actions } from 'shared/constants/LiteActions';\nimport { AppChannels } from 'shared/constants/LiteRadioChannels';\nimport { LitePlayerView } from 'shared/views/lite-player/LitePlayerView';\n\nimport { UserManagerRequests } from 'apps/user-manager/flight-requests/UserManagerRequests';\n\nconst namespace = 'userManager.studentsVideo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getRequest(id: string, typeId: string): Flight.Request {\n if (typeId.toString() === MasterType.Clip.toString())\n return ClipRequests.clip(id);\n\n if (typeId.toString() === MasterType.Interactive.toString())\n return InteractiveRequests.interactiveMetadata(id);\n\n return VideoRequests.video(id);\n}\n\nfunction getMessagePhrase(typeId: string): string {\n if (typeId.toString() === MasterType.Clip.toString())\n return 'messageClip';\n\n if (typeId.toString() === MasterType.Interactive.toString())\n return 'messageInteractive';\n\n return 'messageVideo';\n}\n\ninterface StudentsVideoProps {\n userId: string;\n id: string;\n typeId: string;\n}\n\nexport function StudentsVideoView(props: StudentsVideoProps): JSX.Element {\n const user = Flight.useBasicFetch<User>(UserManagerRequests.getUser(props.userId));\n\n const video = Flight.useBasicFetch<VideoTypes>(getRequest(props.id, props.typeId));\n\n const viewKey = Flight.useBasicFetch<PlayerViewKey>(PlayerRequests.createViewKey(props.id, MediaIdType.MasterObject));\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n useHandleObjectError([ user, video ]);\n useSetPageMetadata({\n title: user.data\n ? LanguageService.getPhrase(\n namespace,\n 'pageTitle',\n { name: UserHelper.getFullName(user.data) }\n )\n : ''\n });\n\n function getVideoActions(): ActionOptions[] {\n const analyticsOptions: AnalyticsOptions = {\n entity: VideoHelper.getAnalyticsEntity(video.data),\n location: LocationContext.ViewStudentVideos\n };\n \n const analyticsData = {\n id: video.data.id\n };\n \n const actions: ActionOptions[] = [];\n \n if (VideoHelper.isVideo(video.data)) {\n actions.push({\n order: 1,\n label: getPhrase('download'),\n appLink: { application: AppChannels.VIDEOS, action: Actions.Videos.DOWNLOAD_VIDEO, args: [video.data.id]},\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Download,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData\n });\n }\n \n actions.push({\n order: 2,\n label: getPhrase('delete'),\n appLink: {\n application: AppChannels.USER_MANAGER,\n action: Actions.UserManager.DELETE_STUDENTS_VIDEO,\n args: [ props.id, video.data.id ],\n params: { typeId: video.data.typeId }\n },\n className: 'text-danger',\n analyticsOptions: {\n ...analyticsOptions,\n actionType: UserAction.Delete,\n workflowPhase: WorkflowPhase.Start\n },\n analyticsData\n });\n \n return actions;\n }\n\n const dataLoaded = (\n user.hasCompleted &&\n video.hasCompleted &&\n viewKey.hasCompleted &&\n config.hasCompleted &&\n currentUser.hasCompleted\n );\n\n if (!dataLoaded)\n return <></>;\n\n return (\n <div className='px-3'>\n <div className='alert text-dark bg-light-blue px-2 rounded d-flex flex-column flex-lg-row justify-content-between mb-3 align-items-center' role='alert'>\n <div className='d-flex align-items-center'>\n <SvgContainer\n svgName={cvSvgLibrary.Info}\n size={SvgContainerSize.Standard}\n className='me-2 svg-container'\n />\n \n <div className='w-100'>\n <p className='fw-semibold mb-0'>\n {getPhrase(\n getMessagePhrase(props.typeId),\n { name: UserHelper.getFullName(user.data), yearGroup: user.data.masterYearGroup?.name }\n )}\n </p>\n </div>\n </div>\n </div>\n <div className='mb-3'>\n <LitePlayerView\n config={config.data}\n video={video.data}\n currentUser={currentUser.data}\n viewKey={viewKey.data}\n />\n </div>\n <div className='d-flex justify-content-between align-items-center mb-2'>\n <div>\n <h1 className='h3 d-inline-flex m-0 mb-2'>\n {video.data.name}\n </h1>\n </div>\n <ActionsButtons\n actions={getVideoActions()}\n actionsDropdownClassName='btn btn-outline-dark'\n />\n </div>\n <VideoDetailsWithScrollbar video={video.data} />\n </div>\n );\n}"],"names":["defaultErrors","notFound","forbidden","rating","yearLevel","region","privacy","badRequest","internalServerError","handleHttpError","info","customErrorMap","ignoreMap","statusCode","status","errorMap","generateCacheKey","flightObjs","map","obj","join","useHandleObjectError","_flightObjs","customErrors","ignoreErrors","Array","isArray","useEffect","forEach","namespace","getPhrase","LanguageService","CommaList","props","label","items","className","data","length","commaSeperated","i","name","DetailsSection","video","VideoHelper","parentVideo","description","Text","phrase","productionYear","options","year","smartCount","productionCompanies","distributors","producers","directors","dateBroadcast","date","DateHelper","channel","dateCreated","VideoDetailsWithScrollbar","maxHeight","showDescription","showDetails","canClose","onClickClose","showCurriculumLinks","onClickShowCurriculumLinks","value","autoHeight","autoHeightMax","ImmersiveReader","text","title","onLaunch","onLaunchImmersiveReader","onExit","onExitImmersiveReader","analyticsOptions","location","entity","actionType","descriptor","analyticsData","id","type","dangerouslySetInnerHTML","__html","LinkifyHelper","nl2br","TagList","tags","hideTags","TagHelper","getTagAppLink","suppressInteractivity","DivButton","onClick","StudentsVideoView","typeId","actions","user","UserManagerRequests","userId","toString","MasterType","ClipRequests","InteractiveRequests","VideoRequests","viewKey","PlayerRequests","MediaIdType","config","ConfigRequests","currentUser","UserRequests","useSetPageMetadata","UserHelper","hasCompleted","role","SvgContainer","svgName","size","S","getMessagePhrase","yearGroup","masterYearGroup","LitePlayerView","Actions","push","order","appLink","application","action","args","workflowPhase","params","actionsDropdownClassName"],"sourceRoot":""}
|