@clickview/exchange 0.63.0-rc.0 → 0.63.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 +525 -525
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{XXzDL37Y.chunk.js → -x9MMtVv.chunk.js} +2 -2
- package/dist/scripts/{XXzDL37Y.chunk.js.map → -x9MMtVv.chunk.js.map} +1 -1
- package/dist/scripts/{BRJldyG42.chunk.js → 4oWF2EyV2.chunk.js} +2 -2
- package/dist/scripts/{BRJldyG42.chunk.js.map → 4oWF2EyV2.chunk.js.map} +1 -1
- package/dist/scripts/{Bbv7q795.chunk.js → 5Z0rGCy2.chunk.js} +2 -2
- package/dist/scripts/{Bbv7q795.chunk.js.map → 5Z0rGCy2.chunk.js.map} +1 -1
- package/dist/scripts/{Buz0cl_A2.chunk.js → 8vJGuJF-2.chunk.js} +2 -2
- package/dist/scripts/{Buz0cl_A2.chunk.js.map → 8vJGuJF-2.chunk.js.map} +1 -1
- package/dist/scripts/{DHyCd_bU2.chunk.js → B0jhFNam2.chunk.js} +3 -3
- package/dist/scripts/{DHyCd_bU2.chunk.js.map → B0jhFNam2.chunk.js.map} +1 -1
- package/dist/scripts/{C56J8vQn2.chunk.js → B3tq0EFi2.chunk.js} +2 -2
- package/dist/scripts/{C56J8vQn2.chunk.js.map → B3tq0EFi2.chunk.js.map} +1 -1
- package/dist/scripts/{z3xPIUA8.chunk.js → B6EmIhMh.chunk.js} +2 -2
- package/dist/scripts/{z3xPIUA8.chunk.js.map → B6EmIhMh.chunk.js.map} +1 -1
- package/dist/scripts/{CvGdC4sR2.chunk.js → BEgLlK2Z2.chunk.js} +2 -2
- package/dist/scripts/{CvGdC4sR2.chunk.js.map → BEgLlK2Z2.chunk.js.map} +1 -1
- package/dist/scripts/{DZzghMqE2.chunk.js → BEyI0jsC2.chunk.js} +2 -2
- package/dist/scripts/{DZzghMqE2.chunk.js.map → BEyI0jsC2.chunk.js.map} +1 -1
- package/dist/scripts/{hZmx1ZBr.chunk.js → BHzUOyzG.chunk.js} +2 -2
- package/dist/scripts/{hZmx1ZBr.chunk.js.map → BHzUOyzG.chunk.js.map} +1 -1
- package/dist/scripts/{CBskpS-O.chunk.js → BI2S4EFA.chunk.js} +2 -2
- package/dist/scripts/{CBskpS-O.chunk.js.map → BI2S4EFA.chunk.js.map} +1 -1
- package/dist/scripts/{_yGE4YHL2.chunk.js → BTsePUCN2.chunk.js} +2 -2
- package/dist/scripts/{_yGE4YHL2.chunk.js.map → BTsePUCN2.chunk.js.map} +1 -1
- package/dist/scripts/{CSI2paIO2.chunk.js → BaXT2aKo2.chunk.js} +2 -2
- package/dist/scripts/{CSI2paIO2.chunk.js.map → BaXT2aKo2.chunk.js.map} +1 -1
- package/dist/scripts/{CmvWR08f.chunk.js → BibFbDqs.chunk.js} +2 -2
- package/dist/scripts/{CmvWR08f.chunk.js.map → BibFbDqs.chunk.js.map} +1 -1
- package/dist/scripts/{DUcxhK9t.chunk.js → BjzONPz9.chunk.js} +2 -2
- package/dist/scripts/{DUcxhK9t.chunk.js.map → BjzONPz9.chunk.js.map} +1 -1
- package/dist/scripts/{DRwPcxvr.chunk.js → BnbM9YhY.chunk.js} +2 -2
- package/dist/scripts/{DRwPcxvr.chunk.js.map → BnbM9YhY.chunk.js.map} +1 -1
- package/dist/scripts/{l5SFnLQO.chunk.js → BrEvIvRP.chunk.js} +2 -2
- package/dist/scripts/{l5SFnLQO.chunk.js.map → BrEvIvRP.chunk.js.map} +1 -1
- package/dist/scripts/{CcQK2DGq2.chunk.js → C1guWVFU2.chunk.js} +2 -2
- package/dist/scripts/{CcQK2DGq2.chunk.js.map → C1guWVFU2.chunk.js.map} +1 -1
- package/dist/scripts/{BWVFXuZ42.chunk.js → C3K3VtRR2.chunk.js} +2 -2
- package/dist/scripts/{BWVFXuZ42.chunk.js.map → C3K3VtRR2.chunk.js.map} +1 -1
- package/dist/scripts/{lWeC_K_B.chunk.js → CAJOpkKZ.chunk.js} +2 -2
- package/dist/scripts/{lWeC_K_B.chunk.js.map → CAJOpkKZ.chunk.js.map} +1 -1
- package/dist/scripts/{feXppHqr.chunk.js → CAOBwDbU.chunk.js} +2 -2
- package/dist/scripts/{feXppHqr.chunk.js.map → CAOBwDbU.chunk.js.map} +1 -1
- package/dist/scripts/{BTP30DaC.chunk.js → CAQAUQMB.chunk.js} +2 -2
- package/dist/scripts/{BTP30DaC.chunk.js.map → CAQAUQMB.chunk.js.map} +1 -1
- package/dist/scripts/{4onqOCbS.chunk.js → CAoPaL8M.chunk.js} +2 -2
- package/dist/scripts/{4onqOCbS.chunk.js.map → CAoPaL8M.chunk.js.map} +1 -1
- package/dist/scripts/{YL1EBDd_.chunk.js → CCvXN2-C.chunk.js} +2 -2
- package/dist/scripts/{YL1EBDd_.chunk.js.map → CCvXN2-C.chunk.js.map} +1 -1
- package/dist/scripts/{D7MdAl-52.chunk.js → CDXcKno52.chunk.js} +2 -2
- package/dist/scripts/{D7MdAl-52.chunk.js.map → CDXcKno52.chunk.js.map} +1 -1
- package/dist/scripts/{B1_Y3iw-.chunk.js → CGLWqKaa.chunk.js} +2 -2
- package/dist/scripts/{B1_Y3iw-.chunk.js.map → CGLWqKaa.chunk.js.map} +1 -1
- package/dist/scripts/{BX4WdpiX.chunk.js → CHQN7xOX.chunk.js} +2 -2
- package/dist/scripts/{BX4WdpiX.chunk.js.map → CHQN7xOX.chunk.js.map} +1 -1
- package/dist/scripts/{3OI-aLOc.chunk.js → CSbvS-Cl.chunk.js} +2 -2
- package/dist/scripts/{3OI-aLOc.chunk.js.map → CSbvS-Cl.chunk.js.map} +1 -1
- package/dist/scripts/{CWY-sFVd.chunk.js → CYFRcx63.chunk.js} +2 -2
- package/dist/scripts/{CWY-sFVd.chunk.js.map → CYFRcx63.chunk.js.map} +1 -1
- package/dist/scripts/{DfMfBgzn2.chunk.js → CeeAb-HT2.chunk.js} +2 -2
- package/dist/scripts/{DfMfBgzn2.chunk.js.map → CeeAb-HT2.chunk.js.map} +1 -1
- package/dist/scripts/{DspWTyv22.chunk.js → Cllrumah2.chunk.js} +2 -2
- package/dist/scripts/{DspWTyv22.chunk.js.map → Cllrumah2.chunk.js.map} +1 -1
- package/dist/scripts/{CPzPIQB92.chunk.js → CoK2sqzN2.chunk.js} +2 -2
- package/dist/scripts/{CPzPIQB92.chunk.js.map → CoK2sqzN2.chunk.js.map} +1 -1
- package/dist/scripts/{DUVTdegJ.chunk.js → CsrTrVKj.chunk.js} +2 -2
- package/dist/scripts/{DUVTdegJ.chunk.js.map → CsrTrVKj.chunk.js.map} +1 -1
- package/dist/scripts/{C-mZmrh2.chunk.js → CuE3TVwa.chunk.js} +2 -2
- package/dist/scripts/{C-mZmrh2.chunk.js.map → CuE3TVwa.chunk.js.map} +1 -1
- package/dist/scripts/{D9yYpvIx.chunk.js → D-ivDlyL.chunk.js} +2 -2
- package/dist/scripts/{D9yYpvIx.chunk.js.map → D-ivDlyL.chunk.js.map} +1 -1
- package/dist/scripts/{ZgHZpHus2.chunk.js → D36Shrdb2.chunk.js} +2 -2
- package/dist/scripts/{ZgHZpHus2.chunk.js.map → D36Shrdb2.chunk.js.map} +1 -1
- package/dist/scripts/{DiivzK1E.chunk.js → D3Jgk2dT.chunk.js} +2 -2
- package/dist/scripts/{DiivzK1E.chunk.js.map → D3Jgk2dT.chunk.js.map} +1 -1
- package/dist/scripts/{DDU0lRB02.chunk.js → D6EZoO4S2.chunk.js} +2 -2
- package/dist/scripts/{DDU0lRB02.chunk.js.map → D6EZoO4S2.chunk.js.map} +1 -1
- package/dist/scripts/{Ca1aJXXk.chunk.js → DDO16-at.chunk.js} +2 -2
- package/dist/scripts/{Ca1aJXXk.chunk.js.map → DDO16-at.chunk.js.map} +1 -1
- package/dist/scripts/{DQhm12vh2.chunk.js → DGRBUJ6T2.chunk.js} +2 -2
- package/dist/scripts/{DQhm12vh2.chunk.js.map → DGRBUJ6T2.chunk.js.map} +1 -1
- package/dist/scripts/{PVFChK662.chunk.js → DGy73Ett2.chunk.js} +2 -2
- package/dist/scripts/{PVFChK662.chunk.js.map → DGy73Ett2.chunk.js.map} +1 -1
- package/dist/scripts/{BhygUKHG2.chunk.js → DHV6S1fA2.chunk.js} +2 -2
- package/dist/scripts/{BhygUKHG2.chunk.js.map → DHV6S1fA2.chunk.js.map} +1 -1
- package/dist/scripts/{ClJxBHin2.chunk.js → DM0JzOpR2.chunk.js} +2 -2
- package/dist/scripts/{ClJxBHin2.chunk.js.map → DM0JzOpR2.chunk.js.map} +1 -1
- package/dist/scripts/{Ovy1FgPr2.chunk.js → DOuiFwIH2.chunk.js} +2 -2
- package/dist/scripts/{Ovy1FgPr2.chunk.js.map → DOuiFwIH2.chunk.js.map} +1 -1
- package/dist/scripts/{C5zVzLiv.chunk.js → DRZvc_n5.chunk.js} +2 -2
- package/dist/scripts/{C5zVzLiv.chunk.js.map → DRZvc_n5.chunk.js.map} +1 -1
- package/dist/scripts/{e-cJ9kRJ.chunk.js → DUCTNoXj.chunk.js} +2 -2
- package/dist/scripts/{e-cJ9kRJ.chunk.js.map → DUCTNoXj.chunk.js.map} +1 -1
- package/dist/scripts/{MsShPjH12.chunk.js → Da2KHzN02.chunk.js} +2 -2
- package/dist/scripts/{MsShPjH12.chunk.js.map → Da2KHzN02.chunk.js.map} +1 -1
- package/dist/scripts/{VrblzwSV.chunk.js → DklryBsJ.chunk.js} +2 -2
- package/dist/scripts/{VrblzwSV.chunk.js.map → DklryBsJ.chunk.js.map} +1 -1
- package/dist/scripts/{V1sSszjJ.chunk.js → DsA2RTbF.chunk.js} +2 -2
- package/dist/scripts/{V1sSszjJ.chunk.js.map → DsA2RTbF.chunk.js.map} +1 -1
- package/dist/scripts/{kAq4UzUo.chunk.js → Dsmr6Wly.chunk.js} +2 -2
- package/dist/scripts/{kAq4UzUo.chunk.js.map → Dsmr6Wly.chunk.js.map} +1 -1
- package/dist/scripts/{PVKBLI-T2.chunk.js → DsolW3Wd2.chunk.js} +2 -2
- package/dist/scripts/{PVKBLI-T2.chunk.js.map → DsolW3Wd2.chunk.js.map} +1 -1
- package/dist/scripts/{C4y3yewN.chunk.js → UK8sD-oL.chunk.js} +2 -2
- package/dist/scripts/{C4y3yewN.chunk.js.map → UK8sD-oL.chunk.js.map} +1 -1
- package/dist/scripts/{C79TzhHV.chunk.js → aXgcldgY.chunk.js} +2 -2
- package/dist/scripts/{C79TzhHV.chunk.js.map → aXgcldgY.chunk.js.map} +1 -1
- package/dist/scripts/{app-DddMB3QD.js → app-lnmpv5W4.js} +3 -3
- package/dist/scripts/app-lnmpv5W4.js.map +1 -0
- package/dist/scripts/{CRtOlUhH.chunk.js → c2oA1XgG.chunk.js} +2 -2
- package/dist/scripts/{CRtOlUhH.chunk.js.map → c2oA1XgG.chunk.js.map} +1 -1
- package/dist/scripts/{CKC7r8Ck2.chunk.js → dkfSCDWH2.chunk.js} +2 -2
- package/dist/scripts/{CKC7r8Ck2.chunk.js.map → dkfSCDWH2.chunk.js.map} +1 -1
- package/dist/scripts/{Dwhojt8g2.chunk.js → jErHNuXU2.chunk.js} +2 -2
- package/dist/scripts/{Dwhojt8g2.chunk.js.map → jErHNuXU2.chunk.js.map} +1 -1
- package/dist/scripts/{BXh_8LxI2.chunk.js → mkasrghR2.chunk.js} +2 -2
- package/dist/scripts/{BXh_8LxI2.chunk.js.map → mkasrghR2.chunk.js.map} +1 -1
- package/dist/scripts/{D2D0ku9V2.chunk.js → s776Po8a2.chunk.js} +2 -2
- package/dist/scripts/{D2D0ku9V2.chunk.js.map → s776Po8a2.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/app-DddMB3QD.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,D as t,b as n,fn as r,s as i}from"./B1i9atik.chunk.js";import{_ as a,g as o}from"./NpQVkKE2.chunk.js";import{t as s}from"./CrBD6Z4s.chunk.js";import{t as c}from"./BIhfRmDn.chunk.js";import{n as l,r as u}from"./kh-nUTBX.chunk.js";import{I as d,T as f}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,D as t,b as n,fn as r,s as i}from"./B1i9atik.chunk.js";import{_ as a,g as o}from"./NpQVkKE2.chunk.js";import{t as s}from"./CrBD6Z4s.chunk.js";import{t as c}from"./BIhfRmDn.chunk.js";import{n as l,r as u}from"./kh-nUTBX.chunk.js";import{I as d,T as f}from"./app-lnmpv5W4.js";import{t as p}from"./DXN-HToH2.chunk.js";import{t as m}from"./BU8rJI4_2.chunk.js";import{t as h}from"./DrNTTfHX.chunk.js";import{n as g}from"./KRUU7yGI.chunk.js";import{n as _,r as v,t as y}from"./CnBbU5eq.chunk.js";var b={actions:`_actions_1psxq_1`,actionsContainer:`_actionsContainer_1psxq_14`,ownerLogo:`_ownerLogo_1psxq_24`,dropStyle:`_dropStyle_1psxq_33`,dragStyle:`_dragStyle_1psxq_38`},x=r(t()),S=e();function C(e){let t=e.folder.thumbnail?s.urlBuilder(e.folder.thumbnail.url,{size:l.Small}):null,r=e.folder?.libraries?.data?.[0]?.owner,a=e.showOwnerLogo&&r?.logo?.url?s.urlBuilder(r.logo.url,{size:l.Small}):null,c=e.getFolderActions?.(e.folder),d=e.analyticsData?{id:e.folder.id.toString(),name:e.folder.name,...e.analyticsData}:void 0,f=e.analyticsOptions?{actionType:n.Click,entity:i.Folder,...e.analyticsOptions}:void 0;return(0,S.jsx)(h,{draggable:e.drag&&{id:e.folder.id,data:e.folder},droppable:e.drop&&{id:e.folder.id,data:e.folder},dropStye:b.dropStyle,dragStyle:b.dragStyle,children:(0,S.jsxs)(`div`,{className:`position-relative`,children:[(0,S.jsxs)(o,{className:`rounded-3 d-block text-decoration-none`,appLink:e.getAppLink(e.folder),title:e.folder.name,analyticsData:d,analyticsOptions:f,children:[(0,S.jsx)(g,{data:t,imageType:u.Thumbnails,imageClassName:`rounded-top-lg`,children:(0,S.jsx)(_,{name:e.folder.name,type:v.Folder,extraClasses:`rounded-top-lg`})}),(0,S.jsx)(`h3`,{className:`bg-white border-start border-end border-bottom rounded-bottom-lg font-size-normal fw-semibold mb-0 p-2`,children:(0,S.jsx)(`span`,{className:`text-truncate d-block`,children:e.folder.name})})]}),c?.length&&(0,S.jsx)(p,{actions:c,className:b.actionsContainer,actionsDropdownClassName:b.actions,dropdownToggleSvgSize:null}),!!a&&(0,S.jsx)(`img`,{src:a,className:`rounded-circle ${b.ownerLogo}`,alt:`${r?.name} logo`,title:r?.name||``})]})})}var w=`libraries.folderList`,T=`has:expanded:library:folders`;function E(){let e=f();return e.xxl||e.xl||e.lg?6:e.md?4:3}D.defaultProps={showHeading:!0};function D(e){let[t,n]=x.useState(c.get(T)||!1),r=e.expandFolders||t,i=E();function o(){n(!r),c.set(T,!r)}let s=r?e.folders:e.folders.slice(0,i),l=e.folders.length>i&&!e.expandFolders;return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`d-flex justify-content-between align-items-center`,children:[e.showHeading&&(0,S.jsxs)(a,{className:`d-inline-flex align-items-center mb-2 px-2 ${l?``:`cursor-default`}`,onClick:o,children:[l&&(0,S.jsx)(m,{direction:r?`down`:`right`}),(0,S.jsx)(`h2`,{className:`h4 mb-0`,children:(0,S.jsx)(d,{namespace:w,phrase:`folders`,options:{count:e.folders.length}})})]}),!!(!r&&l)&&(0,S.jsx)(`div`,{className:`d-flex justify-content-end justify-self-end px-2`,children:(0,S.jsx)(a,{onClick:o,className:`text-dark hover-text-underline d-inline-block`,children:(0,S.jsx)(d,{namespace:w,phrase:`seeAll`,options:{count:e.folders.length}})})}),!!(r&&l)&&(0,S.jsx)(`div`,{className:`d-flex justify-content-end justify-self-end px-2`,children:(0,S.jsx)(a,{onClick:o,className:`text-dark hover-text-underline d-inline-block`,children:(0,S.jsx)(d,{namespace:w,phrase:`seeLess`})})}),e.extraButtons?e.extraButtons:(0,S.jsx)(S.Fragment,{})]}),(0,S.jsx)(`div`,{className:`row mx-1`,children:s.map(t=>(0,S.jsx)(`div`,{className:`col-4 col-md-3 col-lg-2 px-1 pb-3`,children:(0,S.jsx)(C,{folder:t,getAppLink:e.getAppLink,getFolderActions:e.getFolderActions,drag:e.drag,drop:e.drop})},t.id))})]})}function O(e,t){let n=e,r=t,i=y(e&&(e=>n(e).key));return(0,x.useEffect)(()=>{i&&i.shouldInitialFetch&&t&&r()},[i?.shouldInitialFetch,t]),(0,x.useEffect)(()=>{!i||!i.nextCursor||i.isFetching||!t||r(i.nextCursor)},[i?.nextCursor,i?.isFetching,t]),i}var k={partialFolderHeading:`_partialFolderHeading_1surw_1`,partialFolderThumbnail:`_partialFolderThumbnail_1surw_4`,partialFolderName:`_partialFolderName_1surw_7`},A=()=>(0,S.jsxs)(`div`,{className:`col-4 col-md-3 col-lg-2 px-1 pb-3`,children:[(0,S.jsx)(`div`,{className:`${k.partialFolderThumbnail} partial-loading-background rounded-top-lg`}),(0,S.jsx)(`div`,{className:`${k.partialFolderName} partial-loading-background border-bottom rounded-bottom-lg font-size-normal mb-0 p-2`,children:`\xA0`})]});function j({count:e=3}){return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`div`,{className:`${k.partialFolderHeading} h4 mb-2 partial-loading-background`,children:`\xA0`}),(0,S.jsx)(`div`,{className:`row mx-n1`,children:Array(e).fill(null).map((e,t)=>(0,S.jsx)(A,{},t))})]})}export{O as n,D as r,j as t};
|
|
2
|
+
//# sourceMappingURL=BI2S4EFA.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CBskpS-O.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/library-folder/library-folder.module.scss","../../../../libs/shared/src/components/library-folder/LibraryFolder.tsx","../../../../libs/shared/src/components/folder-list/FolderList.tsx","../../../../libs/shared/src/hooks/UseFetchAll.ts","../../../../libs/shared/src/components/folder-list/partial-loading/partial-folder-list.module.scss","../../../../libs/shared/src/components/folder-list/partial-loading/PartialFolderList.tsx"],"sourcesContent":[":local {\n .actions {\n background: none;\n color: $white;\n border: none;\n padding: 0;\n outline: inherit;\n border-radius: 50%;\n width: 1.5rem;\n height: 1.5rem;\n\n &:hover {\n background-color: rgba(0, 0, 0, .5);\n }\n }\n\n .actionsContainer {\n position: absolute;\n top: 0;\n right: 0;\n width: 1.5rem;\n height: 1.5rem;\n margin-top: 0.9375rem;\n margin-right: 0.9375rem;\n z-index: 10;\n }\n\n .ownerLogo {\n position: absolute;\n top: 0;\n left: 0;\n width: 2rem;\n height: 2rem;\n margin-top: 0.9375rem;\n margin-left: 0.9375rem;\n }\n\n .dropStyle {\n box-shadow: 0 0 $focus-ring-blur 2px $gray-900;\n border-radius: $border-radius-lg;\n background: $gray-900;\n }\n\n .dragStyle {\n opacity: 0.5;\n }\n}","import React from 'react';\n\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DragDropMoveWrapper } from 'libs/shared/components/drag-drop-move/DragDropMoveWrapper';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { Folder } from 'libs/shared/interfaces';\n\nimport styles from './library-folder.module.scss';\n\ninterface LibraryFolderProps {\n folder: Folder;\n showOwnerLogo?: boolean;\n drag?: boolean;\n drop?: boolean;\n getAppLink: (f: Folder) => Core.AppLink;\n getFolderActions?: (f: Folder) => ActionOptions[];\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n}\n\nexport function LibraryFolder(props: LibraryFolderProps): JSX.Element {\n const thumbnailUrl = props.folder.thumbnail ?\n UrlHelper.urlBuilder(props.folder.thumbnail.url, { size: ImageSize.Small }) :\n null;\n\n const owner = props.folder?.libraries?.data?.[0]?.owner;\n const ownerLogoUrl = props.showOwnerLogo && !!owner?.logo?.url ?\n UrlHelper.urlBuilder(owner.logo.url, { size: ImageSize.Small }) :\n null;\n\n const actions = props.getFolderActions?.(props.folder);\n\n const analyticsData = props.analyticsData ? {\n id: props.folder.id.toString(),\n name: props.folder.name,\n ...props.analyticsData\n } : undefined;\n\n const analyticsOptions = props.analyticsOptions ? {\n actionType: UserAction.Click,\n entity: EntityType.Folder,\n\n ...props.analyticsOptions\n } : undefined;\n\n return (\n <DragDropMoveWrapper\n draggable={props.drag && { id: props.folder.id, data: props.folder }}\n droppable={props.drop && { id: props.folder.id, data: props.folder }}\n dropStye={styles.dropStyle}\n dragStyle={styles.dragStyle}\n >\n <div className='position-relative'>\n <AppLink\n className='rounded-3 d-block text-decoration-none'\n appLink={props.getAppLink(props.folder)}\n title={props.folder.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <BaseImage\n data={thumbnailUrl}\n imageType={ImageType.Thumbnails}\n imageClassName='rounded-top-lg'\n >\n <ImageFallback\n name={props.folder.name}\n type={ImageFallbackType.Folder}\n extraClasses='rounded-top-lg'\n />\n </BaseImage>\n <h3 className='bg-white border-start border-end border-bottom rounded-bottom-lg font-size-normal fw-semibold mb-0 p-2'>\n <span className='text-truncate d-block'>{props.folder.name}</span>\n </h3>\n </AppLink>\n {actions?.length &&\n <Actions\n actions={actions}\n className={styles.actionsContainer}\n actionsDropdownClassName={styles.actions}\n // Intentionally setting to the default SVG size\n dropdownToggleSvgSize={null}\n />\n }\n {!!ownerLogoUrl &&\n <img src={ownerLogoUrl} className={`rounded-circle ${styles.ownerLogo}`} alt={`${owner?.name} logo`} title={owner?.name || ''} />\n }\n </div>\n </DragDropMoveWrapper>\n );\n}\n","import React from 'react';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Caret } from 'libs/shared/components/caret/Caret';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { LibraryFolder } from 'libs/shared/components/library-folder/LibraryFolder';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Folder } from 'libs/shared/interfaces';\n\nconst namespace = 'libraries.folderList';\n\nconst EXPANDED_FOLDERS_KEY = 'has:expanded:library:folders';\n\nfunction useGetFolderLimit(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl || breakpoints.xl || breakpoints.lg)\n return 6;\n\n if (breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface FolderListProps {\n folders: Folder[];\n getAppLink: (folder: Folder) => Core.AppLink;\n expandFolders?: boolean;\n showHeading?: boolean;\n getFolderActions?: (f: Folder) => ActionOptions[];\n drag?: boolean;\n drop?: boolean;\n extraButtons?: JSX.Element;\n}\n\nFolderList.defaultProps = {\n showHeading: true\n};\n\nexport function FolderList(props: FolderListProps): JSX.Element {\n const [ _hasExpandedFolders, setHasExpandedFolders ] = React.useState(\n LocalStorageHelper.get(EXPANDED_FOLDERS_KEY) || false\n );\n\n const hasExpandedFolders = props.expandFolders || _hasExpandedFolders;\n\n const folderLimit = useGetFolderLimit();\n\n function onToggleFolder(): void {\n setHasExpandedFolders(!hasExpandedFolders);\n LocalStorageHelper.set(EXPANDED_FOLDERS_KEY, !hasExpandedFolders);\n }\n\n const displayableFolders = hasExpandedFolders ? props.folders : props.folders.slice(0, folderLimit);\n\n const canToggleCollapsedView = props.folders.length > folderLimit && !props.expandFolders;\n\n return (\n <>\n <div className='d-flex justify-content-between align-items-center'>\n {props.showHeading &&\n <DivButton\n className={`d-inline-flex align-items-center mb-2 px-2 ${!canToggleCollapsedView ? 'cursor-default' : ''}`}\n onClick={onToggleFolder}\n >\n {canToggleCollapsedView && (\n <Caret direction={hasExpandedFolders ? 'down' : 'right'} />\n )}\n <h2 className='h4 mb-0'>\n <Text namespace={namespace} phrase='folders' options={{ count: props.folders.length }} />\n </h2>\n </DivButton>\n }\n\n {!!(!hasExpandedFolders && canToggleCollapsedView) && (\n <div className='d-flex justify-content-end justify-self-end px-2'>\n <DivButton onClick={onToggleFolder} className='text-dark hover-text-underline d-inline-block'>\n <Text namespace={namespace} phrase='seeAll' options={{ count: props.folders.length }} />\n </DivButton>\n </div>\n )}\n {!!(hasExpandedFolders && canToggleCollapsedView) && (\n <div className='d-flex justify-content-end justify-self-end px-2'>\n <DivButton onClick={onToggleFolder} className='text-dark hover-text-underline d-inline-block'>\n <Text namespace={namespace} phrase='seeLess' />\n </DivButton>\n </div>\n )}\n\n {props.extraButtons ? props.extraButtons : <></>}\n </div>\n\n <div className='row mx-1'>\n {displayableFolders.map(f => (\n <div key={f.id} className='col-4 col-md-3 col-lg-2 px-1 pb-3'>\n <LibraryFolder\n folder={f}\n getAppLink={props.getAppLink}\n getFolderActions={props.getFolderActions}\n drag={props.drag}\n drop={props.drop}\n />\n </div>\n ))}\n </div>\n </>\n );\n}\n","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { SelectAllPagesResult, useSelectAllPages } from './UseSelectAllPages';\n\n/**\n * Hook to fetch all pages of a collection.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useFetchAll<T = BaseObject>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false\n): SelectAllPagesResult<T> {\n const getRequestFn = getRequest as (cursor?: string) => Flight.Request;\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n const response = useSelectAllPages<T>(getRequest && ((cursor?: string) => getRequestFn(cursor).key));\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext)\n fetchNextFn();\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response || !response.nextCursor || response.isFetching || !fetchNext)\n return;\n\n fetchNextFn(response.nextCursor);\n }, [ response?.nextCursor, response?.isFetching, fetchNext ]);\n\n return response;\n}\n",":local {\n .partialFolderHeading {\n width: 6.25rem;\n }\n\n .partialFolderThumbnail {\n padding-bottom: 56.25%;\n }\n\n .partialFolderName {\n line-height: 1.2;\n }\n}","import React from 'react';\n\nimport styles from './partial-folder-list.module.scss';\n\nconst PartialFolder = () => (\n <div className='col-4 col-md-3 col-lg-2 px-1 pb-3'>\n <div className={`${styles.partialFolderThumbnail} partial-loading-background rounded-top-lg`} />\n <div className={`${styles.partialFolderName} partial-loading-background border-bottom rounded-bottom-lg font-size-normal mb-0 p-2`}>\n \n </div>\n </div>\n);\n\nexport function PartialFolderList({ count = 3 }: { count?: number }): JSX.Element {\n return (\n <>\n <div className={`${styles.partialFolderHeading} h4 mb-2 partial-loading-background`}> </div>\n <div className='row mx-n1'>\n {Array(count).fill(null).map((_, i) => <PartialFolder key={i} />)}\n </div>\n </>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BI2S4EFA.chunk.js","names":[],"sources":["../../../../libs/shared/src/components/library-folder/library-folder.module.scss","../../../../libs/shared/src/components/library-folder/LibraryFolder.tsx","../../../../libs/shared/src/components/folder-list/FolderList.tsx","../../../../libs/shared/src/hooks/UseFetchAll.ts","../../../../libs/shared/src/components/folder-list/partial-loading/partial-folder-list.module.scss","../../../../libs/shared/src/components/folder-list/partial-loading/PartialFolderList.tsx"],"sourcesContent":[":local {\n .actions {\n background: none;\n color: $white;\n border: none;\n padding: 0;\n outline: inherit;\n border-radius: 50%;\n width: 1.5rem;\n height: 1.5rem;\n\n &:hover {\n background-color: rgba(0, 0, 0, .5);\n }\n }\n\n .actionsContainer {\n position: absolute;\n top: 0;\n right: 0;\n width: 1.5rem;\n height: 1.5rem;\n margin-top: 0.9375rem;\n margin-right: 0.9375rem;\n z-index: 10;\n }\n\n .ownerLogo {\n position: absolute;\n top: 0;\n left: 0;\n width: 2rem;\n height: 2rem;\n margin-top: 0.9375rem;\n margin-left: 0.9375rem;\n }\n\n .dropStyle {\n box-shadow: 0 0 $focus-ring-blur 2px $gray-900;\n border-radius: $border-radius-lg;\n background: $gray-900;\n }\n\n .dragStyle {\n opacity: 0.5;\n }\n}","import React from 'react';\n\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Core } from 'libs/common/core';\n\nimport { AnalyticsOptions, EntityType, HashObject, UserAction } from 'libs/analytics/interfaces';\n\nimport { ActionOptions, Actions } from 'libs/shared/components/actions/Actions';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { DragDropMoveWrapper } from 'libs/shared/components/drag-drop-move/DragDropMoveWrapper';\nimport { BaseImage } from 'libs/shared/components/image/BaseImage';\nimport { ImageFallback, ImageFallbackType } from 'libs/shared/components/image/ImageFallback';\nimport { ImageSize, ImageType } from 'libs/shared/enums/Images';\nimport { Folder } from 'libs/shared/interfaces';\n\nimport styles from './library-folder.module.scss';\n\ninterface LibraryFolderProps {\n folder: Folder;\n showOwnerLogo?: boolean;\n drag?: boolean;\n drop?: boolean;\n getAppLink: (f: Folder) => Core.AppLink;\n getFolderActions?: (f: Folder) => ActionOptions[];\n analyticsOptions?: AnalyticsOptions;\n analyticsData?: HashObject;\n}\n\nexport function LibraryFolder(props: LibraryFolderProps): JSX.Element {\n const thumbnailUrl = props.folder.thumbnail ?\n UrlHelper.urlBuilder(props.folder.thumbnail.url, { size: ImageSize.Small }) :\n null;\n\n const owner = props.folder?.libraries?.data?.[0]?.owner;\n const ownerLogoUrl = props.showOwnerLogo && !!owner?.logo?.url ?\n UrlHelper.urlBuilder(owner.logo.url, { size: ImageSize.Small }) :\n null;\n\n const actions = props.getFolderActions?.(props.folder);\n\n const analyticsData = props.analyticsData ? {\n id: props.folder.id.toString(),\n name: props.folder.name,\n ...props.analyticsData\n } : undefined;\n\n const analyticsOptions = props.analyticsOptions ? {\n actionType: UserAction.Click,\n entity: EntityType.Folder,\n\n ...props.analyticsOptions\n } : undefined;\n\n return (\n <DragDropMoveWrapper\n draggable={props.drag && { id: props.folder.id, data: props.folder }}\n droppable={props.drop && { id: props.folder.id, data: props.folder }}\n dropStye={styles.dropStyle}\n dragStyle={styles.dragStyle}\n >\n <div className='position-relative'>\n <AppLink\n className='rounded-3 d-block text-decoration-none'\n appLink={props.getAppLink(props.folder)}\n title={props.folder.name}\n analyticsData={analyticsData}\n analyticsOptions={analyticsOptions}\n >\n <BaseImage\n data={thumbnailUrl}\n imageType={ImageType.Thumbnails}\n imageClassName='rounded-top-lg'\n >\n <ImageFallback\n name={props.folder.name}\n type={ImageFallbackType.Folder}\n extraClasses='rounded-top-lg'\n />\n </BaseImage>\n <h3 className='bg-white border-start border-end border-bottom rounded-bottom-lg font-size-normal fw-semibold mb-0 p-2'>\n <span className='text-truncate d-block'>{props.folder.name}</span>\n </h3>\n </AppLink>\n {actions?.length &&\n <Actions\n actions={actions}\n className={styles.actionsContainer}\n actionsDropdownClassName={styles.actions}\n // Intentionally setting to the default SVG size\n dropdownToggleSvgSize={null}\n />\n }\n {!!ownerLogoUrl &&\n <img src={ownerLogoUrl} className={`rounded-circle ${styles.ownerLogo}`} alt={`${owner?.name} logo`} title={owner?.name || ''} />\n }\n </div>\n </DragDropMoveWrapper>\n );\n}\n","import React from 'react';\n\nimport { LocalStorageHelper } from 'libs/common/backbone/utils/LocalStorageHelper';\nimport { Core } from 'libs/common/core';\n\nimport { ActionOptions } from 'libs/shared/components/actions/Actions';\nimport { Caret } from 'libs/shared/components/caret/Caret';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { LibraryFolder } from 'libs/shared/components/library-folder/LibraryFolder';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useBreakpoints } from 'libs/shared/hooks/useBreakpoints';\nimport { Folder } from 'libs/shared/interfaces';\n\nconst namespace = 'libraries.folderList';\n\nconst EXPANDED_FOLDERS_KEY = 'has:expanded:library:folders';\n\nfunction useGetFolderLimit(): number {\n const breakpoints = useBreakpoints();\n\n if (breakpoints.xxl || breakpoints.xl || breakpoints.lg)\n return 6;\n\n if (breakpoints.md)\n return 4;\n\n return 3;\n}\n\ninterface FolderListProps {\n folders: Folder[];\n getAppLink: (folder: Folder) => Core.AppLink;\n expandFolders?: boolean;\n showHeading?: boolean;\n getFolderActions?: (f: Folder) => ActionOptions[];\n drag?: boolean;\n drop?: boolean;\n extraButtons?: JSX.Element;\n}\n\nFolderList.defaultProps = {\n showHeading: true\n};\n\nexport function FolderList(props: FolderListProps): JSX.Element {\n const [ _hasExpandedFolders, setHasExpandedFolders ] = React.useState(\n LocalStorageHelper.get(EXPANDED_FOLDERS_KEY) || false\n );\n\n const hasExpandedFolders = props.expandFolders || _hasExpandedFolders;\n\n const folderLimit = useGetFolderLimit();\n\n function onToggleFolder(): void {\n setHasExpandedFolders(!hasExpandedFolders);\n LocalStorageHelper.set(EXPANDED_FOLDERS_KEY, !hasExpandedFolders);\n }\n\n const displayableFolders = hasExpandedFolders ? props.folders : props.folders.slice(0, folderLimit);\n\n const canToggleCollapsedView = props.folders.length > folderLimit && !props.expandFolders;\n\n return (\n <>\n <div className='d-flex justify-content-between align-items-center'>\n {props.showHeading &&\n <DivButton\n className={`d-inline-flex align-items-center mb-2 px-2 ${!canToggleCollapsedView ? 'cursor-default' : ''}`}\n onClick={onToggleFolder}\n >\n {canToggleCollapsedView && (\n <Caret direction={hasExpandedFolders ? 'down' : 'right'} />\n )}\n <h2 className='h4 mb-0'>\n <Text namespace={namespace} phrase='folders' options={{ count: props.folders.length }} />\n </h2>\n </DivButton>\n }\n\n {!!(!hasExpandedFolders && canToggleCollapsedView) && (\n <div className='d-flex justify-content-end justify-self-end px-2'>\n <DivButton onClick={onToggleFolder} className='text-dark hover-text-underline d-inline-block'>\n <Text namespace={namespace} phrase='seeAll' options={{ count: props.folders.length }} />\n </DivButton>\n </div>\n )}\n {!!(hasExpandedFolders && canToggleCollapsedView) && (\n <div className='d-flex justify-content-end justify-self-end px-2'>\n <DivButton onClick={onToggleFolder} className='text-dark hover-text-underline d-inline-block'>\n <Text namespace={namespace} phrase='seeLess' />\n </DivButton>\n </div>\n )}\n\n {props.extraButtons ? props.extraButtons : <></>}\n </div>\n\n <div className='row mx-1'>\n {displayableFolders.map(f => (\n <div key={f.id} className='col-4 col-md-3 col-lg-2 px-1 pb-3'>\n <LibraryFolder\n folder={f}\n getAppLink={props.getAppLink}\n getFolderActions={props.getFolderActions}\n drag={props.drag}\n drop={props.drop}\n />\n </div>\n ))}\n </div>\n </>\n );\n}\n","import { useEffect } from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { BaseObject } from 'libs/shared/interfaces';\n\nimport { SelectAllPagesResult, useSelectAllPages } from './UseSelectAllPages';\n\n/**\n * Hook to fetch all pages of a collection.\n * \n * @param getRequest - callback function to get the request for each page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n * \n * @param fetchNext - callback function to fetch a page.\n * Can be false if the request requires data that hasn't yet been fetched - e.g. user id.\n */\nexport function useFetchAll<T = BaseObject>(\n getRequest: ((cursor?: string) => Flight.Request) | false,\n fetchNext: ((cursor?: string) => void) | false\n): SelectAllPagesResult<T> {\n const getRequestFn = getRequest as (cursor?: string) => Flight.Request;\n const fetchNextFn = fetchNext as (cursor?: string) => void;\n\n const response = useSelectAllPages<T>(getRequest && ((cursor?: string) => getRequestFn(cursor).key));\n\n useEffect(() => {\n if (!response)\n return;\n\n if (response.shouldInitialFetch && fetchNext)\n fetchNextFn();\n }, [ response?.shouldInitialFetch, fetchNext ]);\n\n useEffect(() => {\n if (!response || !response.nextCursor || response.isFetching || !fetchNext)\n return;\n\n fetchNextFn(response.nextCursor);\n }, [ response?.nextCursor, response?.isFetching, fetchNext ]);\n\n return response;\n}\n",":local {\n .partialFolderHeading {\n width: 6.25rem;\n }\n\n .partialFolderThumbnail {\n padding-bottom: 56.25%;\n }\n\n .partialFolderName {\n line-height: 1.2;\n }\n}","import React from 'react';\n\nimport styles from './partial-folder-list.module.scss';\n\nconst PartialFolder = () => (\n <div className='col-4 col-md-3 col-lg-2 px-1 pb-3'>\n <div className={`${styles.partialFolderThumbnail} partial-loading-background rounded-top-lg`} />\n <div className={`${styles.partialFolderName} partial-loading-background border-bottom rounded-bottom-lg font-size-normal mb-0 p-2`}>\n \n </div>\n </div>\n);\n\nexport function PartialFolderList({ count = 3 }: { count?: number }): JSX.Element {\n return (\n <>\n <div className={`${styles.partialFolderHeading} h4 mb-2 partial-loading-background`}> </div>\n <div className='row mx-n1'>\n {Array(count).fill(null).map((_, i) => <PartialFolder key={i} />)}\n </div>\n </>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,D as t}from"./B1i9atik.chunk.js";import{t as n}from"./NpQVkKE2.chunk.js";import{l as r}from"./TJBzqR6k.chunk.js";import{t as i}from"./CzvVp9iC.chunk.js";import{t as a}from"./DRTfS6nN.chunk.js";import{I as o,M as s,S as c,U as l,Z as u}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,D as t}from"./B1i9atik.chunk.js";import{t as n}from"./NpQVkKE2.chunk.js";import{l as r}from"./TJBzqR6k.chunk.js";import{t as i}from"./CzvVp9iC.chunk.js";import{t as a}from"./DRTfS6nN.chunk.js";import{I as o,M as s,S as c,U as l,Z as u}from"./app-lnmpv5W4.js";t();var d={myVideosButton:`_myVideosButton_5ybcl_1`},f=e(),p=`shared.alreadyAdded`,m=i.encloseNamespace(p);function h(e){return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsx)(`div`,{className:`mx-auto w-75 mt-1 mb-2`,children:(0,f.jsx)(`img`,{src:a.General.CONFETTI,className:`img-fluid`,draggable:!1})}),(0,f.jsxs)(`div`,{className:`text-center pb-3`,children:[(0,f.jsx)(`h4`,{children:e.alreadyAdded?(0,f.jsx)(o,{namespace:p,phrase:`alreadyAdded`}):(0,f.jsx)(o,{namespace:p,phrase:`successfullyAdded`})}),!e.alreadyAdded&&(0,f.jsx)(`p`,{children:(0,f.jsx)(o,{namespace:p,phrase:`successfullyAddedDescription`})})]}),(0,f.jsxs)(s,{children:[(0,f.jsx)(s.Cancel,{text:m(e.alreadyAdded?`addAnyway`:`close`),onClick:e.onClickClose,variant:`link`}),(0,f.jsxs)(`a`,{href:`${e.liteUrl}${e.videoId?`/videos/`+e.videoId:`/my-videos`}`,className:`${d.myVideosButton} btn btn-dark d-flex align-items-center`,children:[(0,f.jsx)(`span`,{className:`me-1`,children:(0,f.jsx)(o,{namespace:p,phrase:e.videoId?`watchVideo`:`myVideos`})}),(0,f.jsx)(n,{svg:c})]})]})]})}var g=i.encloseNamespace(`shared.alreadyAdded`);function _(e){let{alreadyAdded:t}=e.params,n=r(u.config());return(0,f.jsx)(l,{title:g(`title`),closePopup:e.closePopup,children:(0,f.jsx)(h,{liteUrl:n.data.liteUrl,alreadyAdded:t,onClickClose:e.closePopup})})}export{_ as TvAlreadyAddedView};
|
|
2
|
+
//# sourceMappingURL=BTsePUCN2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"BTsePUCN2.chunk.js","names":[],"sources":["../../src/shared/components/already-added/already-added.module.scss","../../src/shared/components/already-added/AlreadyAdded.tsx","../../src/apps/tv/views/tv-already-added/TvAlreadyAddedView.tsx"],"sourcesContent":[":local {\n .myVideosButton {\n padding: 0.5rem 0.5rem 0.5rem 0.75rem;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { SvgContainer } from 'libs/shared/components/svg-container/SvgContainer';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { NewWindowSvg } from 'libs/shared/images/svg/actions/NewWindowSvg';\n\nimport { ImageUrls } from 'shared/constants/ImageUrls';\n\nimport styles from './already-added.module.scss';\n\nconst namespace = 'shared.alreadyAdded';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AlreadyAddedProps {\n liteUrl: string;\n videoId?: string;\n alreadyAdded?: boolean;\n onClickClose: () => void;\n}\n\nexport function AlreadyAdded(props: AlreadyAddedProps) {\n return (\n <>\n <div className='mx-auto w-75 mt-1 mb-2'>\n <img src={ImageUrls.General.CONFETTI} className='img-fluid' draggable={false} />\n </div>\n\n <div className='text-center pb-3'>\n <h4>\n {props.alreadyAdded ?\n <Text namespace={namespace} phrase='alreadyAdded' /> :\n <Text namespace={namespace} phrase='successfullyAdded' />\n }\n </h4>\n {!props.alreadyAdded && <p><Text namespace={namespace} phrase='successfullyAddedDescription' /></p>}\n </div>\n\n <PopupButtons>\n <PopupButtons.Cancel\n text={getPhrase(props.alreadyAdded ? 'addAnyway' : 'close')}\n onClick={props.onClickClose}\n variant='link'\n />\n <a\n href={`${props.liteUrl}${props.videoId ? '/videos/' + props.videoId : '/my-videos'}`}\n className={`${styles.myVideosButton} btn btn-dark d-flex align-items-center`}\n >\n <span className='me-1'>\n <Text namespace={namespace} phrase={props.videoId ? 'watchVideo' : 'myVideos'} />\n </span>\n <SvgContainer svg={NewWindowSvg} />\n </a>\n </PopupButtons>\n </>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\nimport { HashObject } from 'libs/common/react/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { Config, PopupViewProps } from 'libs/shared/interfaces';\n\nimport { AlreadyAdded } from 'shared/components/already-added/AlreadyAdded';\n\nconst namespace = 'shared.alreadyAdded';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TvAlreadyAddedViewProps extends PopupViewProps {\n params: HashObject;\n}\n\nexport function TvAlreadyAddedView(props: TvAlreadyAddedViewProps): JSX.Element {\n const { alreadyAdded } = props.params;\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n return (\n <Popup\n title={getPhrase('title')}\n closePopup={props.closePopup}\n >\n <AlreadyAdded\n liteUrl={config.data.liteUrl}\n alreadyAdded={alreadyAdded}\n onClickClose={props.closePopup}\n />\n </Popup>\n );\n}\n"],"mappings":"4UCaM,EAAY,sBACZ,EAAY,EAAgB,iBAAiB,EAAU,CAS7D,SAAgB,EAAa,EAA0B,CACrD,OACE,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mCACb,EAAA,EAAA,KAAC,MAAD,CAAK,IAAK,EAAU,QAAQ,SAAU,UAAU,YAAY,UAAW,GAAS,CAAA,CAC5E,CAAA,EAEN,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,4BAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAA,SACG,EAAM,cACL,EAAA,EAAA,KAAC,EAAD,CAAiB,YAAW,OAAO,eAAiB,CAAA,EACpD,EAAA,EAAA,KAAC,EAAD,CAAiB,YAAW,OAAO,oBAAsB,CAAA,CAExD,CAAA,CACJ,CAAC,EAAM,eAAgB,EAAA,EAAA,KAAC,IAAD,CAAA,UAAG,EAAA,EAAA,KAAC,EAAD,CAAiB,YAAW,OAAO,+BAAiC,CAAA,CAAI,CAAA,CAAA,IAGrG,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAa,OAAd,CACE,KAAM,EAAU,EAAM,aAAe,YAAc,QAAQ,CAC3D,QAAS,EAAM,aACf,QAAQ,OACR,CAAA,EACF,EAAA,EAAA,MAAC,IAAD,CACE,KAAM,GAAG,EAAM,UAAU,EAAM,QAAU,WAAa,EAAM,QAAU,eACtE,UAAW,GAAG,EAAO,eAAe,kDAFtC,EAIE,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,iBACd,EAAA,EAAA,KAAC,EAAD,CAAiB,YAAW,OAAQ,EAAM,QAAU,aAAe,WAAc,CAAA,CAC5E,CAAA,EACP,EAAA,EAAA,KAAC,EAAD,CAAc,IAAK,EAAgB,CAAA,CAAA,GAExB,CAAA,CAAA,CACd,CAAA,CAAA,CC3CP,IAAM,EAAY,EAAgB,iBADhB,sBAC2C,CAM7D,SAAgB,EAAmB,EAA6C,CAC9E,GAAM,CAAE,gBAAiB,EAAM,OAEzB,EAAS,EAA6B,EAAe,QAAQ,CAAC,CAEpE,OACE,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,EAAU,QAAQ,CACzB,WAAY,EAAM,qBAElB,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAO,KAAK,QACP,eACd,aAAc,EAAM,WACpB,CAAA,CACI,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,D as t,O as n,bt as r,fn as i}from"./B1i9atik.chunk.js";import{_ as a,r as o}from"./NpQVkKE2.chunk.js";import{d as s,l as c}from"./TJBzqR6k.chunk.js";import{t as l}from"./BG5Aor0J.chunk.js";import{t as u}from"./CzvVp9iC.chunk.js";import{t as d}from"./BBMcrXvX.chunk.js";import{t as f}from"./DzbIsgVg.chunk.js";import{t as p}from"./CrBD6Z4s.chunk.js";import{t as m}from"./DKbUI-vj.chunk.js";import{I as h,J as g,M as _,Q as v,U as y,Z as b,tt as x,z as S}from"./app-DddMB3QD.js";import{t as C}from"./Cc0tSPhP2.chunk.js";import{i as w,n as ee,r as T,t as E}from"./BXh_8LxI2.chunk.js";import{t as D}from"./DXN-HToH2.chunk.js";import{t as te}from"./BU8rJI4_2.chunk.js";import{t as O}from"./BhygUKHG2.chunk.js";import{t as k}from"./Dwhojt8g2.chunk.js";import{t as ne}from"./D2D0ku9V2.chunk.js";import{t as A}from"./DZzghMqE2.chunk.js";import{t as re}from"./CKC7r8Ck2.chunk.js";import{t as j}from"./ClJxBHin2.chunk.js";var M=C(),N=i(t());function P(e,t,n){if(d.isEqual(e.id,t))return[e,n];let r=e.children;if(!r||!r.length)return[null,null];for(let i=0;i<r.length;i++){let[a,o]=P(r[i],t,[...n,e]);if(a)return[a,o]}return[null,null]}var F={find(e,t){if(!(!e||!e.children||!e.children.length))for(let n=0;n<e.children.length;n++){let[r]=P(e.children[n],t,[]);if(r)return r}},getPath(e,t){if(!(!e||!e.children||!e.children.length))for(let n=0;n<e.children.length;n++){let[,r]=P(e.children[n],t,[]);if(r?.length)return r}},getParent(e,t){let n=F.getPath(e,t);return n?.length?n[n.length-1]:null},convertNestedObjectToTree(e){let t={...e.data,children:e.children};return t.children?.length&&(t.children=t.children.map(F.convertNestedObjectToTree)),t},findDepth(e,t,n=0){if(!e||e.length===0)return 0;let r=0;for(let i of e){if(i.data?.id?.toString()===t.toString())return n;let e=F.findDepth(i.children,t,n+1);if(e>0){r=e;break}}return r},findMaxChildDepth(e,t=0){if(!e||e.length===0)return t;let n=t;for(let r of e){let e=F.findMaxChildDepth(r.children,t+1);n=Math.max(n,e)}return n},findTargetNode(e,t){if(!e||e.length===0)return null;for(let n of e){if(n.data?.id?.toString()===t.toString())return n;let e=F.findTargetNode(n.children,t);if(e!==null)return e}return null},isMaxDepth(e,t,n,r=7){let i=F.findTargetNode(e,t);return F.findMaxChildDepth(i.children)+F.findDepth(e,n)>=r},flatten(e){if(!e)return[];let t=[];function r(e){t.push(n.omit(e,[`children`])),e.children.forEach(r)}return e.children.forEach(r),t}},I={tree:`_tree_u0qyb_1`,text:`_text_u0qyb_1`,chevron:`_chevron_u0qyb_4`,disabled:`_disabled_u0qyb_163`,root:`_root_u0qyb_166`,selected:`_selected_u0qyb_172`,actions:`_actions_u0qyb_175`,node:`_node_u0qyb_185`,noActions:`_noActions_u0qyb_188`},L=e();function R(e){function t(){let t=`${I.text} clamp-4`;return e.className&&(t+=` ${e.className}`),t}return e.isDisabled?(0,L.jsx)(o,{title:typeof e.disabledTooltip==`string`?e.disabledTooltip:e.disabledTooltip?.(e.tree),spanHack:!0,spanHackClassName:`d-inline-block flex-grow-1`,children:(0,L.jsx)(`span`,{className:`${t()} text-secondary ${I.disabled}`,children:e.text})}):(0,L.jsx)(`div`,{className:t(),children:e.text})}var z=`tree-actions`;B.defaultProps={selectedLinkClassName:I.selected};function B(e){let{tree:t,selectedIds:n,getAppLink:i,onSelect:o,isDisabled:s,isClickDisabled:c,actions:l,isDropdown:u}=e,f=N.useRef(null),p=N.useMemo(()=>n?.some(e=>F.find(t,e)),[t,n]),m=e.openDepth&&e.depth<e.openDepth,[h,g]=N.useState(p||m),_=n?.some(e=>d.isEqual(t.id,e)),v=!!t.children&&!!t.children.length;e.maxDisplayDepth&&v&&(v=e.depth<e.maxDisplayDepth),N.useEffect(()=>{if(!f.current||!u)return;let e=e=>{e.stopPropagation(),y()};return f.current.addEventListener(`click`,e),()=>{f.current&&f.current.removeEventListener(`click`,e)}},[f.current,o]),N.useEffect(()=>{e.multiSelect||h&&(p||_||!e.selectedIds?.length&&s?.(e.tree)||m||g(!1))},[n]);function y(){if(!c?.(t)){if(e.multiSelect||g(!h),i){r.trigger(i(t));return}if(s?.(t)){o(null);return}o?.(t)}}function b(t){if(t.stopPropagation(),e.multiSelect){g(!h);return}y()}function x(){let t=`py-1 d-flex align-items-center w-100 position-relative ${I.node}`;return _&&(t+=` `+e.selectedLinkClassName),l?.length||(t+=` `+I.noActions),p&&e.multiSelect&&(t+=` text-underline fst-italic`),t}return e.maxDisplayDepth&&e.depth>e.maxDisplayDepth?(0,L.jsx)(L.Fragment,{}):(0,L.jsx)(`li`,{className:`position-relative ${h?``:I.collapsed} ${e.isRoot?I.root:``}`,children:(0,L.jsxs)(`div`,{className:`position-relative`,children:[(0,L.jsxs)(a,{className:x(),onClick:u?null:y,ref:f,children:[v&&(0,L.jsx)(`div`,{className:I.chevron,onClick:b,children:(0,L.jsx)(te,{direction:h?`down`:`right`})}),(0,L.jsx)(R,{tree:t,text:t.name||t.description,isDisabled:s?.(t)||c?.(t),disabledTooltip:e.disabledTooltip})]}),!!e.actions&&(0,L.jsx)(D,{className:I.actions,actions:l?.map(e=>({...e,appLink:e.getAppLink(t)})),actionsDropdownClassName:`btn btn-light ${z} py-0`}),h&&(0,L.jsx)(V,{...e,isChild:!0,depth:e.depth+1},t.id)]})})}function V(e){let{tree:t,...n}=e;return!t||!t.children?(0,L.jsx)(L.Fragment,{}):(0,L.jsx)(`ul`,{className:`m-0 p-0 list-unstyled ${I.tree}`,children:t.children.map((t,r)=>(0,L.jsx)(B,{tree:t,...n,isRoot:!e.isChild,depth:e.depth||0},r))})}var H=`libraries.addToLibraryForm`,U=u.encloseNamespace(H);function W(e){let t=T(),n=!t.values.library.canAddContent,r=e.videoLibraries?.find(e=>e.id===t.values.library.id),i=N.useMemo(()=>({children:e.getCategoryTree(t.values.library.id).map(F.convertNestedObjectToTree)}),[t.values.library.id]);return(0,L.jsxs)(L.Fragment,{children:[r&&(0,L.jsx)(`div`,{className:`alert alert-info`,children:(0,L.jsx)(h,{namespace:H,phrase:`alreadyInLibrary`,options:{library:t.values.library.name}})}),n&&(0,L.jsx)(`p`,{children:(0,L.jsx)(h,{namespace:H,phrase:`sendLibraryRequest`,options:{video:e.video.name}})}),(0,L.jsxs)(S,{children:[e.libraries.length>1&&(0,L.jsx)(w,{as:`select`,label:U(`selectLibrary`),name:`library`,value:t.values.library?.id??``,className:t.values.library?.id?``:`text-secondary`,showRequiredStar:!0,onChange:n=>{t.setFieldValue(`folder`,null);let r=n.target.value;t.setFieldValue(`library`,e.libraries.find(e=>e.id.toString()===r.toString()))},children:e.libraries.map(e=>(0,L.jsx)(`option`,{value:e.id,className:`text-dark`,children:e.name},e.id))}),(0,L.jsx)(w,{label:U(`selectFolder`),name:`folder`,showRequiredStar:!0,disabled:!t.values.library,children:()=>(0,L.jsx)(M.Scrollbars,{autoHeight:!0,autoHeightMax:300,className:`border rounded-3`,children:(0,L.jsx)(V,{tree:i,onSelect:e=>t.setFieldValue(`folder`,e),isDisabled:e.isFolderDisabled,disabledTooltip:u.getPhrase(H,`disabledFolder`),selectedIds:t.values.folder?.id?[t.values.folder.id]:void 0,selectedLinkClassName:`bg-light`})})}),!!t.values.folder&&(0,L.jsx)(`p`,{className:`mt-n2`,children:(0,L.jsx)(h,{namespace:H,phrase:n?`requestTo`:`addTo`,options:{folder:t.values.folder.name}})}),n&&(0,L.jsx)(w,{label:u.getPhrase(H,`comment`),as:`textarea`,name:`comment`,id:`comment`,placeholder:u.getPhrase(H,`commentPlaceholder`),value:t.values.comment}),(0,L.jsxs)(_,{children:[(0,L.jsx)(_.Cancel,{onClick:e.closePopup}),(0,L.jsx)(_.Submit,{variant:`dark`,text:U(`addToLibrary`)})]})]})]})}var G={sort(e){return e?.length?e.sort((e,t)=>{let n=e.isSharedLibrary?`shared_library`:e.type,r=t.isSharedLibrary?`shared_library`:t.type;return n===r?e.name.localeCompare(t.name):n===`custom_library`||n===`shared_library`&&r!==`custom_library`||n===`hosted_library`&&r!==`custom_library`&&r!==`shared_library`?-1:1}):[]},hasTwigOrTigtag(e,t){if(!t)return{hasTwig:!1,hasTigtag:!1};if(!t.isAuthenticated){let e=t.contentRegion===f.UK||t.contentRegion===f.SCOT;return{hasTwig:e,hasTigtag:e}}if(!e)return{hasTwig:!1,hasTigtag:!1};let n=!1,r=!1;for(let t of e)if(t.id.toString()===O.Libraries.TWIG?n=!0:t.id.toString()===O.Libraries.TIGTAG&&(r=!0),n&&r)break;return{hasTwig:n,hasTigtag:r}}},K=i(E()),q=`libraries.validation`,J=(0,K.object)().shape({comment:(0,K.string)().nullable().max(512,()=>u.getPhrase(q,`commentExceeds`)),library:(0,K.object)().required(()=>u.getPhrase(q,`libraryRequired`)).nullable(),folder:(0,K.object)().required(()=>u.getPhrase(q,`folderRequired`)).nullable()}),Y=function(e){return e[e.MasterVideo=1]=`MasterVideo`,e[e.MasterClip=2]=`MasterClip`,e[e.MasterInteractive=3]=`MasterInteractive`,e}({}),X=u.encloseNamespace(`shared.errorMessageHelper`),ie={"operation-not-allowed":`operationNotAllowed`,"library-not-supported":`libraryNotSupported`,"access-denied":`accessDenied`,"library-access-denied":`libraryAccessDenied`,"library-access-denied-create":`libraryAccessDeniedCreate`,"library-access-denied-fulfil":`libraryAccessDeniedFulfill`,"library-access-denied-not-authorized":`libraryAccessDeniedNotAuthorized`,"library-request-access-denied":`accessDenied`,"library-request-access-denied-create-request":`libraryRequestAccessDeniedCreateRequest`,"library-request-access-denied-process-comment":`libraryRequestAccessDeniedProcessComment`,"customer-not-found":`customerNotFound`,"customer-not-found-current-user":`customerNotFound`,"customer-not-found-library-owner":`customerNotFoundLibraryOwner`,"customer-not-found-destination-library-owner":`customerNotFoundLibraryOwner`,"user-not-found":`userNotFound`,"library-not-found":`libraryNotFound`,"video-not-found":`videoNotFound`,"category-not-found":`categoryNotFound`,"category-not-found-destination-not-provided":`categoryNotFoundDestinationNotProvided`,"category-not-found-not-in-library":`categoryNotFoundInLibrary`,"library-request-not-found":`libraryRequestNotFound`,"invalid-category-path":`invalidCategoryPath`,"library-api-error":`somethingWentWrong`,"content-not-playable":`contentNotPlayable`,"invalid-object":`invalidObject`,"same-request-existed":`sameRequestExisted`,"unknown-error":`somethingWentWrong`,"no-email":`noEmailError`},ae={"create-invitation-failed":`createInvitationFailed`,"invitation-resend-failed":`invitationResendFailed`,"failed-to-accept":`failedToAccept`,"invitee-not-found":`inviteeNotFound`,"invitation-not-found":`invitationNotFound`,"invitation-deleted":`invitationDeleted`,"too-many-emails":`tooManyEmails`},Z={libraryApiError(e){let t=ie[e?.responseJSON?.type];return X(t||`somethingWentWrong`)},inviteColleagueError(e){let t=ae[e?.responseJSON?.type];return X(t||`somethingWentWrong`)}},Q={buildOpenAppLinkUrl(e,t,n){return p.urlBuilder(`${e}/open`,{appLink:t,product:n})},buildOpenVideoUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`video:${t}`,n)},buildOpenClipUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`clip:${t}`,n)},buildOpenInteractiveUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`interactive:${t}`,n)},buildOpenTopicUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`topic:${t}`,n)},buildOpenSeriesUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`series:${t}`,n)},buildOpenPlaylistUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`playlist:${t}`,n)},buildOpenCategoryUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`category:${t}`,n)},buildOpenLibraryFolderUrl(e,t,n){let r=`library:${t.libraryId}:folder:${t.folderId}`;return Q.buildOpenAppLinkUrl(e,r,n)}},oe={[x.Video]:Y.MasterVideo,[x.Clip]:Y.MasterClip,[x.Interactive]:Y.MasterInteractive},$=u.encloseNamespace(`libraries.addToLibrary`);function se(e){let t=c(m.currentUser()),n=c(k.librariesWithCategories()),r=c(k.libraryRequestLibraries()),i=c(j.getVideoRequest(e.id,e.typeId)),a=(j.isClip(i.data)||j.isInteractive(i.data))&&i.data?._parentVideo,o=c(a&&ne.video(a.id)),{loading:u,handleGenerateReportError:f}=re(),p=c(b.config()),h=N.useMemo(()=>G.sort(r.data),[r.data]),_=s(),x=A(),S=!!t.data&&v.getOrSetSortType(t.data.id);function C(){let e=null,t=l.first(i.data?.libraries?.data)?.id;if(t&&i.data.categories.data?.length){let n=i.data.categories.data.find(e=>e.libraries?.data?.find(e=>e.id.toString()===t.toString()));n&&(e=n.id)}if(!t&&(t=l.first(o.data?.libraries?.data)?.id,t&&o.data.categories.data?.length)){let n=o.data.categories.data.find(e=>e.libraries?.data?.find(e=>e.id.toString()===t.toString()));n&&(e=n.id)}return{sourceLibraryId:t?+t:null,sourceCategoryId:e?+e:null}}function w(t,n){let{sourceLibraryId:r,sourceCategoryId:a}=C(),o={objectId:e.id.toString(),objectType:oe[e.typeId],message:t.comment,sourceLibraryId:r,destinationLibraryId:+t.library.id,metadata:{destinationCategoryId:+t.folder.id,sourceCategoryId:a}};_(k.addToLibrary(o,S)).then(()=>{t.library.canAddContent?x.success({type:g.Success,heading:``,message:$(`addToLibrarySuccess`,{folder:t.folder.name,video:i.data.name,escapeText:!0}),...e.folderAppLink?{appLink:{...e.folderAppLink,args:[t.library.id,t.folder.id,d.slugify(t.folder.name)]},appLinkText:$(`goToFolder`,{folder:t.folder.name}),appLinkClassName:`info-link`}:{extLink:Q.buildOpenLibraryFolderUrl(p.data.launchUrl,{libraryId:t.library.id,folderId:t.folder.id}),extLinkText:$(`goToFolder`,{folder:t.folder.name}),extLinkClassName:`info-link`}}):x.success({type:g.Pending,heading:$(`pendingApproval`),message:$(`libraryRequestSent`,{library:t.library.name,escapeText:!0})})}).catch(e=>{let t=Z.libraryApiError(e);f(e,t,t),n()}).finally(()=>{e.closePopup()})}function T(e){return n.data.find(t=>t.data.id.toString()===e.toString())?.children}function E(e){return!!i.data.categories?.data?.find(t=>t.id===e.id)}let D=r.data&&i.data&&n.data;return(0,L.jsx)(y,{title:$(`addToLibrary`),closePopup:e.closePopup,showLoadingSpinner:!D||u,children:D&&(0,L.jsx)(ee,{initialValues:{library:l.first(h),folder:null,comment:``},validationSchema:J,onSubmit:w,children:(0,L.jsx)(W,{libraries:h,closePopup:e.closePopup,isFolderDisabled:E,video:i.data,videoLibraries:i.data?.libraries?.data,getCategoryTree:T})})})}export{se as AddToLibraryView};
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,D as t,O as n,bt as r,fn as i}from"./B1i9atik.chunk.js";import{_ as a,r as o}from"./NpQVkKE2.chunk.js";import{d as s,l as c}from"./TJBzqR6k.chunk.js";import{t as l}from"./BG5Aor0J.chunk.js";import{t as u}from"./CzvVp9iC.chunk.js";import{t as d}from"./BBMcrXvX.chunk.js";import{t as f}from"./DzbIsgVg.chunk.js";import{t as p}from"./CrBD6Z4s.chunk.js";import{t as m}from"./DKbUI-vj.chunk.js";import{I as h,J as g,M as _,Q as v,U as y,Z as b,tt as x,z as S}from"./app-lnmpv5W4.js";import{t as C}from"./Cc0tSPhP2.chunk.js";import{i as w,n as ee,r as T,t as E}from"./mkasrghR2.chunk.js";import{t as D}from"./DXN-HToH2.chunk.js";import{t as te}from"./BU8rJI4_2.chunk.js";import{t as O}from"./DHV6S1fA2.chunk.js";import{t as k}from"./jErHNuXU2.chunk.js";import{t as ne}from"./s776Po8a2.chunk.js";import{t as A}from"./BEyI0jsC2.chunk.js";import{t as re}from"./dkfSCDWH2.chunk.js";import{t as j}from"./DM0JzOpR2.chunk.js";var M=C(),N=i(t());function P(e,t,n){if(d.isEqual(e.id,t))return[e,n];let r=e.children;if(!r||!r.length)return[null,null];for(let i=0;i<r.length;i++){let[a,o]=P(r[i],t,[...n,e]);if(a)return[a,o]}return[null,null]}var F={find(e,t){if(!(!e||!e.children||!e.children.length))for(let n=0;n<e.children.length;n++){let[r]=P(e.children[n],t,[]);if(r)return r}},getPath(e,t){if(!(!e||!e.children||!e.children.length))for(let n=0;n<e.children.length;n++){let[,r]=P(e.children[n],t,[]);if(r?.length)return r}},getParent(e,t){let n=F.getPath(e,t);return n?.length?n[n.length-1]:null},convertNestedObjectToTree(e){let t={...e.data,children:e.children};return t.children?.length&&(t.children=t.children.map(F.convertNestedObjectToTree)),t},findDepth(e,t,n=0){if(!e||e.length===0)return 0;let r=0;for(let i of e){if(i.data?.id?.toString()===t.toString())return n;let e=F.findDepth(i.children,t,n+1);if(e>0){r=e;break}}return r},findMaxChildDepth(e,t=0){if(!e||e.length===0)return t;let n=t;for(let r of e){let e=F.findMaxChildDepth(r.children,t+1);n=Math.max(n,e)}return n},findTargetNode(e,t){if(!e||e.length===0)return null;for(let n of e){if(n.data?.id?.toString()===t.toString())return n;let e=F.findTargetNode(n.children,t);if(e!==null)return e}return null},isMaxDepth(e,t,n,r=7){let i=F.findTargetNode(e,t);return F.findMaxChildDepth(i.children)+F.findDepth(e,n)>=r},flatten(e){if(!e)return[];let t=[];function r(e){t.push(n.omit(e,[`children`])),e.children.forEach(r)}return e.children.forEach(r),t}},I={tree:`_tree_u0qyb_1`,text:`_text_u0qyb_1`,chevron:`_chevron_u0qyb_4`,disabled:`_disabled_u0qyb_163`,root:`_root_u0qyb_166`,selected:`_selected_u0qyb_172`,actions:`_actions_u0qyb_175`,node:`_node_u0qyb_185`,noActions:`_noActions_u0qyb_188`},L=e();function R(e){function t(){let t=`${I.text} clamp-4`;return e.className&&(t+=` ${e.className}`),t}return e.isDisabled?(0,L.jsx)(o,{title:typeof e.disabledTooltip==`string`?e.disabledTooltip:e.disabledTooltip?.(e.tree),spanHack:!0,spanHackClassName:`d-inline-block flex-grow-1`,children:(0,L.jsx)(`span`,{className:`${t()} text-secondary ${I.disabled}`,children:e.text})}):(0,L.jsx)(`div`,{className:t(),children:e.text})}var z=`tree-actions`;B.defaultProps={selectedLinkClassName:I.selected};function B(e){let{tree:t,selectedIds:n,getAppLink:i,onSelect:o,isDisabled:s,isClickDisabled:c,actions:l,isDropdown:u}=e,f=N.useRef(null),p=N.useMemo(()=>n?.some(e=>F.find(t,e)),[t,n]),m=e.openDepth&&e.depth<e.openDepth,[h,g]=N.useState(p||m),_=n?.some(e=>d.isEqual(t.id,e)),v=!!t.children&&!!t.children.length;e.maxDisplayDepth&&v&&(v=e.depth<e.maxDisplayDepth),N.useEffect(()=>{if(!f.current||!u)return;let e=e=>{e.stopPropagation(),y()};return f.current.addEventListener(`click`,e),()=>{f.current&&f.current.removeEventListener(`click`,e)}},[f.current,o]),N.useEffect(()=>{e.multiSelect||h&&(p||_||!e.selectedIds?.length&&s?.(e.tree)||m||g(!1))},[n]);function y(){if(!c?.(t)){if(e.multiSelect||g(!h),i){r.trigger(i(t));return}if(s?.(t)){o(null);return}o?.(t)}}function b(t){if(t.stopPropagation(),e.multiSelect){g(!h);return}y()}function x(){let t=`py-1 d-flex align-items-center w-100 position-relative ${I.node}`;return _&&(t+=` `+e.selectedLinkClassName),l?.length||(t+=` `+I.noActions),p&&e.multiSelect&&(t+=` text-underline fst-italic`),t}return e.maxDisplayDepth&&e.depth>e.maxDisplayDepth?(0,L.jsx)(L.Fragment,{}):(0,L.jsx)(`li`,{className:`position-relative ${h?``:I.collapsed} ${e.isRoot?I.root:``}`,children:(0,L.jsxs)(`div`,{className:`position-relative`,children:[(0,L.jsxs)(a,{className:x(),onClick:u?null:y,ref:f,children:[v&&(0,L.jsx)(`div`,{className:I.chevron,onClick:b,children:(0,L.jsx)(te,{direction:h?`down`:`right`})}),(0,L.jsx)(R,{tree:t,text:t.name||t.description,isDisabled:s?.(t)||c?.(t),disabledTooltip:e.disabledTooltip})]}),!!e.actions&&(0,L.jsx)(D,{className:I.actions,actions:l?.map(e=>({...e,appLink:e.getAppLink(t)})),actionsDropdownClassName:`btn btn-light ${z} py-0`}),h&&(0,L.jsx)(V,{...e,isChild:!0,depth:e.depth+1},t.id)]})})}function V(e){let{tree:t,...n}=e;return!t||!t.children?(0,L.jsx)(L.Fragment,{}):(0,L.jsx)(`ul`,{className:`m-0 p-0 list-unstyled ${I.tree}`,children:t.children.map((t,r)=>(0,L.jsx)(B,{tree:t,...n,isRoot:!e.isChild,depth:e.depth||0},r))})}var H=`libraries.addToLibraryForm`,U=u.encloseNamespace(H);function W(e){let t=T(),n=!t.values.library.canAddContent,r=e.videoLibraries?.find(e=>e.id===t.values.library.id),i=N.useMemo(()=>({children:e.getCategoryTree(t.values.library.id).map(F.convertNestedObjectToTree)}),[t.values.library.id]);return(0,L.jsxs)(L.Fragment,{children:[r&&(0,L.jsx)(`div`,{className:`alert alert-info`,children:(0,L.jsx)(h,{namespace:H,phrase:`alreadyInLibrary`,options:{library:t.values.library.name}})}),n&&(0,L.jsx)(`p`,{children:(0,L.jsx)(h,{namespace:H,phrase:`sendLibraryRequest`,options:{video:e.video.name}})}),(0,L.jsxs)(S,{children:[e.libraries.length>1&&(0,L.jsx)(w,{as:`select`,label:U(`selectLibrary`),name:`library`,value:t.values.library?.id??``,className:t.values.library?.id?``:`text-secondary`,showRequiredStar:!0,onChange:n=>{t.setFieldValue(`folder`,null);let r=n.target.value;t.setFieldValue(`library`,e.libraries.find(e=>e.id.toString()===r.toString()))},children:e.libraries.map(e=>(0,L.jsx)(`option`,{value:e.id,className:`text-dark`,children:e.name},e.id))}),(0,L.jsx)(w,{label:U(`selectFolder`),name:`folder`,showRequiredStar:!0,disabled:!t.values.library,children:()=>(0,L.jsx)(M.Scrollbars,{autoHeight:!0,autoHeightMax:300,className:`border rounded-3`,children:(0,L.jsx)(V,{tree:i,onSelect:e=>t.setFieldValue(`folder`,e),isDisabled:e.isFolderDisabled,disabledTooltip:u.getPhrase(H,`disabledFolder`),selectedIds:t.values.folder?.id?[t.values.folder.id]:void 0,selectedLinkClassName:`bg-light`})})}),!!t.values.folder&&(0,L.jsx)(`p`,{className:`mt-n2`,children:(0,L.jsx)(h,{namespace:H,phrase:n?`requestTo`:`addTo`,options:{folder:t.values.folder.name}})}),n&&(0,L.jsx)(w,{label:u.getPhrase(H,`comment`),as:`textarea`,name:`comment`,id:`comment`,placeholder:u.getPhrase(H,`commentPlaceholder`),value:t.values.comment}),(0,L.jsxs)(_,{children:[(0,L.jsx)(_.Cancel,{onClick:e.closePopup}),(0,L.jsx)(_.Submit,{variant:`dark`,text:U(`addToLibrary`)})]})]})]})}var G={sort(e){return e?.length?e.sort((e,t)=>{let n=e.isSharedLibrary?`shared_library`:e.type,r=t.isSharedLibrary?`shared_library`:t.type;return n===r?e.name.localeCompare(t.name):n===`custom_library`||n===`shared_library`&&r!==`custom_library`||n===`hosted_library`&&r!==`custom_library`&&r!==`shared_library`?-1:1}):[]},hasTwigOrTigtag(e,t){if(!t)return{hasTwig:!1,hasTigtag:!1};if(!t.isAuthenticated){let e=t.contentRegion===f.UK||t.contentRegion===f.SCOT;return{hasTwig:e,hasTigtag:e}}if(!e)return{hasTwig:!1,hasTigtag:!1};let n=!1,r=!1;for(let t of e)if(t.id.toString()===O.Libraries.TWIG?n=!0:t.id.toString()===O.Libraries.TIGTAG&&(r=!0),n&&r)break;return{hasTwig:n,hasTigtag:r}}},K=i(E()),q=`libraries.validation`,J=(0,K.object)().shape({comment:(0,K.string)().nullable().max(512,()=>u.getPhrase(q,`commentExceeds`)),library:(0,K.object)().required(()=>u.getPhrase(q,`libraryRequired`)).nullable(),folder:(0,K.object)().required(()=>u.getPhrase(q,`folderRequired`)).nullable()}),Y=function(e){return e[e.MasterVideo=1]=`MasterVideo`,e[e.MasterClip=2]=`MasterClip`,e[e.MasterInteractive=3]=`MasterInteractive`,e}({}),X=u.encloseNamespace(`shared.errorMessageHelper`),ie={"operation-not-allowed":`operationNotAllowed`,"library-not-supported":`libraryNotSupported`,"access-denied":`accessDenied`,"library-access-denied":`libraryAccessDenied`,"library-access-denied-create":`libraryAccessDeniedCreate`,"library-access-denied-fulfil":`libraryAccessDeniedFulfill`,"library-access-denied-not-authorized":`libraryAccessDeniedNotAuthorized`,"library-request-access-denied":`accessDenied`,"library-request-access-denied-create-request":`libraryRequestAccessDeniedCreateRequest`,"library-request-access-denied-process-comment":`libraryRequestAccessDeniedProcessComment`,"customer-not-found":`customerNotFound`,"customer-not-found-current-user":`customerNotFound`,"customer-not-found-library-owner":`customerNotFoundLibraryOwner`,"customer-not-found-destination-library-owner":`customerNotFoundLibraryOwner`,"user-not-found":`userNotFound`,"library-not-found":`libraryNotFound`,"video-not-found":`videoNotFound`,"category-not-found":`categoryNotFound`,"category-not-found-destination-not-provided":`categoryNotFoundDestinationNotProvided`,"category-not-found-not-in-library":`categoryNotFoundInLibrary`,"library-request-not-found":`libraryRequestNotFound`,"invalid-category-path":`invalidCategoryPath`,"library-api-error":`somethingWentWrong`,"content-not-playable":`contentNotPlayable`,"invalid-object":`invalidObject`,"same-request-existed":`sameRequestExisted`,"unknown-error":`somethingWentWrong`,"no-email":`noEmailError`},ae={"create-invitation-failed":`createInvitationFailed`,"invitation-resend-failed":`invitationResendFailed`,"failed-to-accept":`failedToAccept`,"invitee-not-found":`inviteeNotFound`,"invitation-not-found":`invitationNotFound`,"invitation-deleted":`invitationDeleted`,"too-many-emails":`tooManyEmails`},Z={libraryApiError(e){let t=ie[e?.responseJSON?.type];return X(t||`somethingWentWrong`)},inviteColleagueError(e){let t=ae[e?.responseJSON?.type];return X(t||`somethingWentWrong`)}},Q={buildOpenAppLinkUrl(e,t,n){return p.urlBuilder(`${e}/open`,{appLink:t,product:n})},buildOpenVideoUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`video:${t}`,n)},buildOpenClipUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`clip:${t}`,n)},buildOpenInteractiveUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`interactive:${t}`,n)},buildOpenTopicUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`topic:${t}`,n)},buildOpenSeriesUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`series:${t}`,n)},buildOpenPlaylistUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`playlist:${t}`,n)},buildOpenCategoryUrl(e,t,n){return Q.buildOpenAppLinkUrl(e,`category:${t}`,n)},buildOpenLibraryFolderUrl(e,t,n){let r=`library:${t.libraryId}:folder:${t.folderId}`;return Q.buildOpenAppLinkUrl(e,r,n)}},oe={[x.Video]:Y.MasterVideo,[x.Clip]:Y.MasterClip,[x.Interactive]:Y.MasterInteractive},$=u.encloseNamespace(`libraries.addToLibrary`);function se(e){let t=c(m.currentUser()),n=c(k.librariesWithCategories()),r=c(k.libraryRequestLibraries()),i=c(j.getVideoRequest(e.id,e.typeId)),a=(j.isClip(i.data)||j.isInteractive(i.data))&&i.data?._parentVideo,o=c(a&&ne.video(a.id)),{loading:u,handleGenerateReportError:f}=re(),p=c(b.config()),h=N.useMemo(()=>G.sort(r.data),[r.data]),_=s(),x=A(),S=!!t.data&&v.getOrSetSortType(t.data.id);function C(){let e=null,t=l.first(i.data?.libraries?.data)?.id;if(t&&i.data.categories.data?.length){let n=i.data.categories.data.find(e=>e.libraries?.data?.find(e=>e.id.toString()===t.toString()));n&&(e=n.id)}if(!t&&(t=l.first(o.data?.libraries?.data)?.id,t&&o.data.categories.data?.length)){let n=o.data.categories.data.find(e=>e.libraries?.data?.find(e=>e.id.toString()===t.toString()));n&&(e=n.id)}return{sourceLibraryId:t?+t:null,sourceCategoryId:e?+e:null}}function w(t,n){let{sourceLibraryId:r,sourceCategoryId:a}=C(),o={objectId:e.id.toString(),objectType:oe[e.typeId],message:t.comment,sourceLibraryId:r,destinationLibraryId:+t.library.id,metadata:{destinationCategoryId:+t.folder.id,sourceCategoryId:a}};_(k.addToLibrary(o,S)).then(()=>{t.library.canAddContent?x.success({type:g.Success,heading:``,message:$(`addToLibrarySuccess`,{folder:t.folder.name,video:i.data.name,escapeText:!0}),...e.folderAppLink?{appLink:{...e.folderAppLink,args:[t.library.id,t.folder.id,d.slugify(t.folder.name)]},appLinkText:$(`goToFolder`,{folder:t.folder.name}),appLinkClassName:`info-link`}:{extLink:Q.buildOpenLibraryFolderUrl(p.data.launchUrl,{libraryId:t.library.id,folderId:t.folder.id}),extLinkText:$(`goToFolder`,{folder:t.folder.name}),extLinkClassName:`info-link`}}):x.success({type:g.Pending,heading:$(`pendingApproval`),message:$(`libraryRequestSent`,{library:t.library.name,escapeText:!0})})}).catch(e=>{let t=Z.libraryApiError(e);f(e,t,t),n()}).finally(()=>{e.closePopup()})}function T(e){return n.data.find(t=>t.data.id.toString()===e.toString())?.children}function E(e){return!!i.data.categories?.data?.find(t=>t.id===e.id)}let D=r.data&&i.data&&n.data;return(0,L.jsx)(y,{title:$(`addToLibrary`),closePopup:e.closePopup,showLoadingSpinner:!D||u,children:D&&(0,L.jsx)(ee,{initialValues:{library:l.first(h),folder:null,comment:``},validationSchema:J,onSubmit:w,children:(0,L.jsx)(W,{libraries:h,closePopup:e.closePopup,isFolderDisabled:E,video:i.data,videoLibraries:i.data?.libraries?.data,getCategoryTree:T})})})}export{se as AddToLibraryView};
|
|
2
|
+
//# sourceMappingURL=BaXT2aKo2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CSI2paIO2.chunk.js","names":[],"sources":["../../../../libs/shared/src/utils/TreeHelper.ts","../../../../libs/shared/src/components/tree/tree.module.scss","../../../../libs/shared/src/components/tree/TreeNodeText.tsx","../../../../libs/shared/src/components/tree/TreeNode.tsx","../../../../libs/shared/src/components/tree/Tree.tsx","../../../../libs/shared/src/apps/libraries/components/add-to-library-form/AddToLibraryForm.tsx","../../../../libs/shared/src/apps/libraries/utils/LibraryHelper.ts","../../../../libs/shared/src/apps/libraries/validation/AddToLibraryValidationSchema.ts","../../../../libs/shared/src/enums/LibraryRequestObjectType.ts","../../../../libs/shared/src/utils/error-message-helper/ErrorMessageHelper.ts","../../../../libs/shared/src/utils/LaunchUrlHelper.ts","../../../../libs/shared/src/apps/libraries/views/add-to-library/AddToLibraryView.tsx"],"sourcesContent":["import { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { BaseObject, MasterNestedObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nfunction _find<T extends BaseTree<BaseObject>>(\n node: T,\n id: string | number,\n parents: T[]\n): [ T | null, T[] ] {\n if (TextHelper.isEqual(node.id, id))\n return [ node, parents ];\n\n const children = node.children;\n\n if (!children || !children.length)\n return [ null, null ];\n\n for (let i = 0; i < children.length; i++) {\n const [ child, foundParents ] = _find(children[i] as T, id, [ ...parents, node ]);\n\n if (child)\n return [ child, foundParents ];\n }\n\n return [ null, null ];\n}\n\nexport const DEFAULT_MAX_DEPTH = 7;\n\nexport const TreeHelper = {\n find<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T | null {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [child] = _find(tree.children[j] as T, id, []);\n \n if (child)\n return child;\n }\n },\n\n getPath<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T[] {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [ , path ] = _find(tree.children[j] as T, id, []);\n \n if (path?.length)\n return path;\n }\n },\n\n getParent<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T {\n const path = TreeHelper.getPath(tree, id);\n\n if (!path?.length)\n return null;\n\n return path[path.length - 1];\n },\n\n convertNestedObjectToTree<T extends BaseObject>(nestedObject: MasterNestedObject<T>): BaseTree<T> {\n const node: BaseTree<T> = {\n ...nestedObject.data,\n children: nestedObject.children\n };\n\n if (node.children?.length)\n node.children = node.children.map(TreeHelper.convertNestedObjectToTree);\n\n return node;\n },\n\n findDepth<T extends MasterNestedObject<BaseObject>>(nodes: T[], targetId: string, currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return 0;\n }\n\n let depth = 0;\n\n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return currentDepth;\n }\n\n const childDepth = TreeHelper.findDepth(node.children, targetId, currentDepth + 1);\n\n if (childDepth > 0) {\n depth = childDepth;\n break;\n }\n }\n\n return depth;\n },\n\n findMaxChildDepth<T extends BaseObject>(nodes: MasterNestedObject<T>[], currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return currentDepth;\n }\n \n let deepestLevel = currentDepth;\n \n for (const node of nodes) {\n const childLevel = TreeHelper.findMaxChildDepth(node.children, currentDepth + 1);\n deepestLevel = Math.max(deepestLevel, childLevel);\n }\n \n return deepestLevel;\n },\n\n findTargetNode<T extends BaseObject>(nodes: MasterNestedObject<T>[], targetId: string): MasterNestedObject<T> | null {\n if (!nodes || nodes.length === 0) {\n return null;\n }\n \n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return node;\n }\n \n const result = TreeHelper.findTargetNode(node.children, targetId);\n if (result !== null) {\n return result;\n }\n }\n \n return null;\n },\n\n isMaxDepth<T extends MasterNestedObject<BaseObject>>(\n nodes: T[],\n sourceId: string,\n targetId: string,\n maxDepth: number = DEFAULT_MAX_DEPTH\n ): boolean {\n const sourceTree = TreeHelper.findTargetNode(nodes, sourceId);\n const maxChildDepth = TreeHelper.findMaxChildDepth(sourceTree.children);\n const targetDepth = TreeHelper.findDepth(nodes, targetId);\n \n return maxChildDepth + targetDepth >= maxDepth;\n },\n\n flatten<T>(\n tree: BaseTree<T>\n ): T[] {\n if (!tree)\n return [];\n\n const nodes: T[] = [];\n\n function pushNode(node: BaseTree<T>): void {\n nodes.push(ObjectHelper.omit(node, ['children']));\n node.children.forEach(pushNode);\n }\n\n tree.children.forEach(pushNode);\n\n return nodes;\n }\n};\n","$chevron-container-size: $cv-svg-size;\n$chevron-visible-size: calc($chevron-container-size / 3); // The actual chevron is 1/3rd of the container size\n$chevron-root-padding: map-get($spacers, 1);\n$text-root-padding: $chevron-root-padding + $chevron-container-size;\n\n@mixin nestedFolderTree($from, $to) {\n :local .tree {\n .text {\n padding-left: $text-root-padding + ($from * ($chevron-container-size - $chevron-visible-size));\n }\n\n .chevron {\n right: auto;\n left: $chevron-root-padding + ($from * ($chevron-container-size - $chevron-visible-size));\n }\n\n @if $from != $to {\n @include nestedFolderTree($from + 1, $to)\n }\n }\n}\n\n@include nestedFolderTree(0, 20);\n\n:local {\n .chevron {\n display: inline-block;\n position: absolute;\n color: black;\n cursor: pointer;\n top: 50%;\n margin-top: -$cv-svg-size-sm*0.5;\n right: 100%;\n }\n\n .text {\n overflow-wrap: break-word;\n padding-right: $cv-svg-size;\n cursor: pointer;\n\n &.disabled {\n cursor: not-allowed;\n }\n }\n\n .root {\n .chevron {\n left: $chevron-root-padding;\n }\n\n .text {\n padding-left: $text-root-padding;\n }\n }\n\n .selected {\n font-weight: 600;\n }\n\n .actions {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n display: none !important;\n\n &:hover {\n display: flex !important;\n }\n }\n\n .node:hover {\n text-decoration: none;\n\n &.noActions {\n background-color: $light-blue;\n }\n\n :global(.dropdown) {\n display: block;\n }\n\n + .actions {\n display: block !important;\n }\n }\n}","import React from 'react';\n\nimport { BaseObject } from 'libs/analytics/interfaces';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nimport styles from './tree.module.scss';\n\ninterface TreeNodeTextProps<T extends BaseTree<BaseObject>> {\n tree: T;\n text: string;\n className?: string;\n isDisabled?: boolean;\n disabledTooltip?: string | ((tree: T) => string);\n}\n\nexport function TreeNodeText<T extends BaseTree<BaseObject>>(props: TreeNodeTextProps<T>): React.ReactElement {\n function getTextClass(): string {\n let textClassName = `${styles.text} clamp-4`;\n\n if (props.className)\n textClassName += ` ${props.className}`;\n\n return textClassName;\n }\n\n if (props.isDisabled) {\n const disabledToolTip = typeof props.disabledTooltip === 'string' ?\n props.disabledTooltip :\n props.disabledTooltip?.(props.tree);\n\n return (\n <Tooltip title={disabledToolTip} spanHack spanHackClassName='d-inline-block flex-grow-1'>\n <span className={`${getTextClass()} text-secondary ${styles.disabled}`}>\n {props.text}\n </span>\n </Tooltip>\n );\n }\n\n return (\n <div className={getTextClass()}>\n {props.text}\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { Caret } from 'libs/shared/components/caret/Caret';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { Tree } from './Tree';\nimport { TreeNodeText } from './TreeNodeText';\n\nimport styles from './tree.module.scss';\n\nconst TREE_ACTIONS_CLASS = 'tree-actions';\n\nexport interface TreeNodeAction<T extends BaseTree<BaseObject>> {\n label: string;\n getAppLink: (node: T) => Core.AppLink;\n className?: string;\n}\n\ninterface TreeNodeProps<T extends BaseTree<BaseObject>> {\n tree: T;\n selectedIds?: string[];\n getAppLink?: (item: T) => Core.AppLink;\n onSelect?: (item: T) => void;\n isDisabled?: (item: T) => boolean;\n isClickDisabled?: (item: T) => boolean;\n actions?: TreeNodeAction<T>[];\n selectedLinkClassName?: string;\n disabledTooltip?: string | ((tree: T) => string);\n isRoot?: boolean;\n isDropdown?: boolean;\n multiSelect?: boolean;\n depth: number;\n openDepth?: number;\n maxDisplayDepth?: number;\n}\n\nTreeNode.defaultProps = {\n selectedLinkClassName: styles.selected\n};\n\nexport function TreeNode<T extends BaseTree<BaseObject>>(props: TreeNodeProps<T>): React.ReactElement {\n const { tree, selectedIds, getAppLink, onSelect, isDisabled, isClickDisabled, actions, isDropdown } = props;\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n // If one of our children is selected\n const isParentOfSelected = React.useMemo(() => {\n return selectedIds?.some(id => TreeHelper.find(tree, id));\n }, [ tree, selectedIds ]);\n\n // Or we are below the initial open depth\n const initiallyOpen = props.openDepth && props.depth < props.openDepth;\n\n // We render expanded initially\n const [ isExpanded, setIsExpanded ] = React.useState(isParentOfSelected || initiallyOpen);\n\n const isSelected = selectedIds?.some(id => TextHelper.isEqual(tree.id, id));\n let hasChildren = !!tree.children && !!tree.children.length;\n\n if (props.maxDisplayDepth && hasChildren)\n hasChildren = props.depth < props.maxDisplayDepth;\n\n /**\n * We need to stop propagation of our event if our tree is rendered\n * inside of a bootstrap dropdown - Sha\n */\n React.useEffect(() => {\n if (!ref.current || !isDropdown)\n return;\n\n const onClick = (e: Event) => {\n e.stopPropagation();\n onSelectNode();\n };\n\n ref.current.addEventListener('click', onClick);\n return () => {\n if (!ref.current)\n return;\n\n ref.current.removeEventListener('click', onClick);\n };\n }, [ ref.current, onSelect ]);\n\n /**\n * Check if an expanded item should actually be collapsed\n */\n React.useEffect(() => {\n // Don't do auto collapsing for trees that support multiple selections\n if (props.multiSelect)\n return;\n\n // Skip item if it's already collapsed\n if (!isExpanded)\n return;\n\n // Parents of a selected item should remain expanded\n if (isParentOfSelected)\n return;\n\n // Selected items should remain expanded\n if (isSelected)\n return;\n\n // Disabled items can be expanded if nothing has been selected\n if (!props.selectedIds?.length && isDisabled?.(props.tree))\n return;\n\n // If we want it to be initially open\n if (initiallyOpen)\n return;\n\n setIsExpanded(false);\n }, [selectedIds]);\n\n function onSelectNode(): void {\n if (isClickDisabled?.(tree))\n return;\n\n if (!props.multiSelect)\n setIsExpanded(!isExpanded);\n\n if (getAppLink) {\n Core.AppLinkHelper.trigger(getAppLink(tree));\n return;\n }\n\n if (isDisabled?.(tree)) {\n onSelect(null);\n return;\n }\n\n onSelect?.(tree);\n }\n\n function onClickCaret(e: any): void {\n e.stopPropagation();\n\n if (props.multiSelect) {\n setIsExpanded(!isExpanded);\n return;\n }\n\n onSelectNode();\n }\n\n function getNodeClass(): string {\n let className = `py-1 d-flex align-items-center w-100 position-relative ${styles.node}`;\n\n if (isSelected)\n className += ' ' + props.selectedLinkClassName;\n\n if (!actions?.length)\n className += ' ' + styles.noActions;\n\n if (isParentOfSelected && props.multiSelect)\n className += ' text-underline fst-italic';\n\n return className;\n }\n\n if (props.maxDisplayDepth && (props.depth > props.maxDisplayDepth))\n return <></>;\n\n return (\n <li className={`position-relative ${isExpanded ? '' : styles.collapsed} ${props.isRoot ? styles.root : ''}`}>\n <div className='position-relative'>\n <DivButton\n className={getNodeClass()}\n onClick={isDropdown ? null : onSelectNode}\n ref={ref}\n >\n {hasChildren && (\n <div className={styles.chevron} onClick={onClickCaret}>\n <Caret direction={isExpanded ? 'down' : 'right'} />\n </div>\n )}\n\n <TreeNodeText\n tree={tree}\n // Always prefer name over description\n text={tree.name || tree.description}\n isDisabled={isDisabled?.(tree) || isClickDisabled?.(tree)}\n disabledTooltip={props.disabledTooltip}\n />\n </DivButton>\n\n {!!props.actions && (\n <Actions\n className={styles.actions}\n actions={actions?.map(a => ({ ...a, appLink: a.getAppLink(tree) }))}\n actionsDropdownClassName={`btn btn-light ${TREE_ACTIONS_CLASS} py-0`}\n />\n )}\n\n {isExpanded && <Tree key={tree.id} {...props} isChild depth={props.depth + 1} />}\n </div>\n </li>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nimport { TreeNode, TreeNodeAction } from './TreeNode';\n\nimport styles from './tree.module.scss';\n\nexport interface TreeProps<T extends BaseTree<BaseObject>> {\n tree: T;\n selectedIds?: string[];\n getAppLink?: (item: T) => Core.AppLink;\n onSelect?: (item: T) => void;\n isDisabled?: (item: T) => boolean;\n isClickDisabled?: (item: T) => boolean;\n actions?: TreeNodeAction<T>[];\n selectedLinkClassName?: string;\n disabledTooltip?: string | ((tree: T) => string);\n isChild?: boolean;\n depth?: number;\n multiSelect?: boolean;\n /**\n * Set to true if you are using this component inside of\n * a bootstrap dropdown menu and don't want it to close\n * on click events - Sha\n */\n isDropdown?: boolean;\n /**\n * If you want to initially render open to a certain depth\n */\n openDepth?: number;\n maxDisplayDepth?: number;\n}\n\nexport function Tree<T extends BaseTree<BaseObject>>(props: TreeProps<T>): React.ReactElement {\n const { tree, ...childProps } = props;\n\n if (!tree || !tree.children)\n return <></>;\n\n return (\n <ul className={`m-0 p-0 list-unstyled ${styles.tree}`}>\n {tree.children.map((child, key) => (\n <TreeNode key={key} tree={child} {...childProps} isRoot={!props.isChild} depth={props.depth || 0} />\n ))}\n </ul>\n );\n}\n","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AddToLibraryFormValues } from 'libs/shared/apps/libraries/views/add-to-library/AddToLibraryView';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tree } from 'libs/shared/components/tree/Tree';\nimport { BaseTree, Folder, Library, LibraryTree, PopupViewProps, VideoTypes } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nconst namespace = 'libraries.addToLibraryForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AddToLibraryFormProps extends PopupViewProps {\n libraries: Library[];\n isFolderDisabled: (folder: BaseTree<Folder>) => boolean;\n video: VideoTypes;\n videoLibraries?: Library[];\n getCategoryTree: (libraryId: string) => LibraryTree[];\n}\n\nexport function AddToLibraryForm(props: AddToLibraryFormProps): JSX.Element {\n const formikProps = useFormikContextWrapper<AddToLibraryFormValues>();\n\n const isMakingLibraryRequest = !formikProps.values.library.canAddContent;\n const isAlreadyInLibrary = props.videoLibraries?.find(l => l.id === formikProps.values.library.id);\n\n const tree = React.useMemo(() => {\n const categoryTree = props.getCategoryTree(formikProps.values.library.id);\n\n const rootBranches = categoryTree.map(TreeHelper.convertNestedObjectToTree);\n\n return {\n children: rootBranches\n } as BaseTree<Library>;\n }, [formikProps.values.library.id]);\n\n return (\n <>\n {isAlreadyInLibrary && (\n <div className='alert alert-info'>\n <Text namespace={namespace} phrase='alreadyInLibrary' options={{ library: formikProps.values.library.name }} />\n </div>\n )}\n\n {isMakingLibraryRequest && (\n <p>\n <Text namespace={namespace} phrase='sendLibraryRequest' options={{ video: props.video.name }} />\n </p>\n )}\n\n <Form>\n {props.libraries.length > 1 && (\n <FormField\n as='select'\n label={getPhrase('selectLibrary')}\n name='library'\n value={formikProps.values.library?.id ?? ''}\n className={!formikProps.values.library?.id ? 'text-secondary' : ''}\n showRequiredStar\n onChange={(e: any) => {\n formikProps.setFieldValue('folder', null);\n\n const libraryId = e.target.value;\n\n formikProps.setFieldValue('library', props.libraries.find(l => l.id.toString() === libraryId.toString()));\n }}\n >\n {props.libraries.map(library => (\n <option key={library.id} value={library.id} className='text-dark'>\n {library.name}\n </option>\n ))}\n </FormField>\n )}\n\n <FormField\n label={getPhrase('selectFolder')}\n name='folder'\n showRequiredStar\n disabled={!formikProps.values.library}\n >\n {() => (\n <Scrollbars autoHeight autoHeightMax={300} className='border rounded-3'>\n <Tree\n tree={tree}\n onSelect={(folder: Folder) => formikProps.setFieldValue('folder', folder)}\n isDisabled={props.isFolderDisabled}\n disabledTooltip={LanguageService.getPhrase(namespace, 'disabledFolder')}\n selectedIds={formikProps.values.folder?.id ? [formikProps.values.folder.id] : undefined}\n selectedLinkClassName='bg-light'\n />\n </Scrollbars>\n )}\n </FormField>\n \n {!!formikProps.values.folder && (\n <p className='mt-n2'>\n <Text\n namespace={namespace}\n phrase={isMakingLibraryRequest ? 'requestTo' : 'addTo'}\n options={{ folder: formikProps.values.folder.name }}\n />\n </p>\n )}\n\n {isMakingLibraryRequest && (\n <FormField\n label={LanguageService.getPhrase(namespace, 'comment')}\n as='textarea'\n name='comment'\n id='comment'\n placeholder={LanguageService.getPhrase(namespace, 'commentPlaceholder')}\n value={formikProps.values.comment}\n />\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit variant='dark' text={getPhrase('addToLibrary')} />\n </PopupButtons>\n </Form>\n </>\n );\n}\n","import { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { CurrentUser, Library } from 'libs/shared/interfaces';\n\ntype LibraryTypes = Library['type'] | 'shared_library';\n\nexport const LibraryHelper = {\n /**\n * Orders libraries by type (custom -> shared -> hosted).\n * Also orders libraries of same type alphabetically.\n */\n sort(libraries: Library[]): Library[] {\n if (!libraries?.length)\n return [];\n\n return libraries.sort((a: Library, b: Library) => {\n // This is required because shared libraries have a type of `custom_library`\n const aType: LibraryTypes = a.isSharedLibrary ? 'shared_library' : a.type;\n const bType: LibraryTypes = b.isSharedLibrary ? 'shared_library' : b.type;\n \n if (aType === bType)\n return a.name.localeCompare(b.name);\n \n if (aType === 'custom_library')\n return -1;\n \n if (aType === 'shared_library' && bType !== 'custom_library')\n return -1;\n\n if (aType === 'hosted_library' && bType !== 'custom_library' && bType !== 'shared_library')\n return -1;\n \n return 1;\n });\n },\n\n hasTwigOrTigtag(libraries: Library[], currentUser: CurrentUser) {\n if (!currentUser)\n return { hasTwig: false, hasTigtag: false };\n\n // Anon users can see Twig/Tigtag if they're in England.\n if (!currentUser.isAuthenticated) {\n const hasAnonAccess = (\n currentUser.contentRegion === ContentRegion.UK ||\n currentUser.contentRegion === ContentRegion.SCOT\n );\n\n return {\n hasTwig: hasAnonAccess,\n hasTigtag: hasAnonAccess\n };\n }\n\n if (!libraries)\n return { hasTwig: false, hasTigtag: false };\n \n let hasTwig = false;\n let hasTigtag = false;\n\n for (const lib of libraries) {\n if (lib.id.toString() === HardCoded.Libraries.TWIG)\n hasTwig = true;\n else if (lib.id.toString() === HardCoded.Libraries.TIGTAG)\n hasTigtag = true;\n\n // If both are true we don't need to keep searching\n if (hasTwig && hasTigtag)\n break;\n }\n\n return { hasTwig, hasTigtag };\n }\n};\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'libraries.validation';\n\nexport const AddToLibraryValidationSchema = object().shape({\n comment: string()\n .nullable()\n .max(512, () => LanguageService.getPhrase(namespace, 'commentExceeds')),\n library: object()\n .required(() => LanguageService.getPhrase(namespace, 'libraryRequired'))\n .nullable(),\n folder: object()\n .required(() => LanguageService.getPhrase(namespace, 'folderRequired'))\n .nullable()\n});\n","export enum LibraryRequestObjectType {\n MasterVideo = 1,\n MasterClip = 2,\n MasterInteractive = 3\n}\n","import { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { InviteColleagueXhr, LibraryApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\n\nconst getPhrase = LanguageService.encloseNamespace('shared.errorMessageHelper');\n\nconst LIBRARY_ERROR_PHRASE_MAPPING = {\n 'operation-not-allowed': 'operationNotAllowed',\n 'library-not-supported': 'libraryNotSupported',\n 'access-denied': 'accessDenied',\n 'library-access-denied': 'libraryAccessDenied',\n 'library-access-denied-create': 'libraryAccessDeniedCreate',\n 'library-access-denied-fulfil': 'libraryAccessDeniedFulfill',\n 'library-access-denied-not-authorized': 'libraryAccessDeniedNotAuthorized',\n 'library-request-access-denied': 'accessDenied',\n 'library-request-access-denied-create-request': 'libraryRequestAccessDeniedCreateRequest',\n 'library-request-access-denied-process-comment': 'libraryRequestAccessDeniedProcessComment',\n 'customer-not-found': 'customerNotFound',\n 'customer-not-found-current-user': 'customerNotFound',\n 'customer-not-found-library-owner': 'customerNotFoundLibraryOwner',\n 'customer-not-found-destination-library-owner': 'customerNotFoundLibraryOwner',\n 'user-not-found': 'userNotFound',\n 'library-not-found': 'libraryNotFound',\n 'video-not-found': 'videoNotFound',\n 'category-not-found': 'categoryNotFound',\n 'category-not-found-destination-not-provided': 'categoryNotFoundDestinationNotProvided',\n 'category-not-found-not-in-library': 'categoryNotFoundInLibrary',\n 'library-request-not-found': 'libraryRequestNotFound',\n 'invalid-category-path': 'invalidCategoryPath',\n 'library-api-error': 'somethingWentWrong',\n 'content-not-playable': 'contentNotPlayable',\n 'invalid-object': 'invalidObject',\n 'same-request-existed': 'sameRequestExisted',\n 'unknown-error': 'somethingWentWrong',\n 'no-email': 'noEmailError'\n};\n\nconst INVITE_COLLEAGUE_PHRASE_MAPPING = {\n 'create-invitation-failed': 'createInvitationFailed',\n 'invitation-resend-failed': 'invitationResendFailed',\n 'failed-to-accept': 'failedToAccept',\n 'invitee-not-found': 'inviteeNotFound',\n 'invitation-not-found': 'invitationNotFound',\n 'invitation-deleted': 'invitationDeleted',\n 'too-many-emails': 'tooManyEmails'\n};\n\nexport const ErrorMessageHelper = {\n libraryApiError(xhr: LibraryApiXhr): string {\n const phrase = LIBRARY_ERROR_PHRASE_MAPPING[xhr?.responseJSON?.type];\n\n if (!phrase)\n return getPhrase('somethingWentWrong');\n\n return getPhrase(phrase);\n },\n inviteColleagueError(xhr: InviteColleagueXhr): string {\n const phrase = INVITE_COLLEAGUE_PHRASE_MAPPING[xhr?.responseJSON?.type];\n\n if (!phrase)\n return getPhrase('somethingWentWrong');\n\n return getPhrase(phrase);\n }\n};\n\nexport const ErrorMessageHelperValidation = {\n libraryApiErrors(): void {\n Object.values(LIBRARY_ERROR_PHRASE_MAPPING).forEach(value => {\n const phrase = getPhrase(value);\n\n if (!phrase)\n Core.ErrorHelper.throw(new DevError(`No language mapping found for library api error type: ${value}`));\n });\n },\n inviteColleagueErrors(): void {\n Object.values(INVITE_COLLEAGUE_PHRASE_MAPPING).forEach(value => {\n const phrase = getPhrase(value);\n\n if (!phrase)\n Core.ErrorHelper.throw(new DevError(`No language mapping found for library api error type: ${value}`));\n });\n }\n};\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\ninterface OpenLibraryFolderParams {\n libraryId: string;\n folderId: string;\n}\n\nexport const LaunchUrlHelper = {\n buildOpenAppLinkUrl(baseLaunchUrl: string, appLink: string, product?: string): string {\n return UrlHelper.urlBuilder(`${baseLaunchUrl}/open`, { appLink, product });\n },\n\n buildOpenVideoUrl(baseLaunchUrl: string, videoId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `video:${videoId}`, product);\n },\n\n buildOpenClipUrl(baseLaunchUrl: string, clipId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `clip:${clipId}`, product);\n },\n\n buildOpenInteractiveUrl(baseLaunchUrl: string, interactiveId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `interactive:${interactiveId}`, product);\n },\n\n buildOpenTopicUrl(baseLaunchUrl: string, topicId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `topic:${topicId}`, product);\n },\n\n buildOpenSeriesUrl(baseLaunchUrl: string, seriesId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `series:${seriesId}`, product);\n },\n\n buildOpenPlaylistUrl(baseLaunchUrl: string, playlistId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `playlist:${playlistId}`, product);\n },\n\n buildOpenCategoryUrl(baseLaunchUrl: string, categoryId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `category:${categoryId}`, product);\n },\n\n buildOpenLibraryFolderUrl(baseLaunchUrl: string, params: OpenLibraryFolderParams, product?: string): string {\n const appLink = `library:${params.libraryId}:folder:${params.folderId}`;\n \n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, appLink, product);\n }\n};\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { AlertType } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AddToLibraryForm } from 'libs/shared/apps/libraries/components/add-to-library-form/AddToLibraryForm';\nimport { LibraryHelper } from 'libs/shared/apps/libraries/utils/LibraryHelper';\nimport { AddToLibraryValidationSchema } from 'libs/shared/apps/libraries/validation/AddToLibraryValidationSchema';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LibraryRequestObjectType } from 'libs/shared/enums/LibraryRequestObjectType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { BaseTree, Clip, Config, CurrentUser, Folder, InteractiveMetadata, Library, LibraryTree, PopupViewProps, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { AddToLibraryRequest } from 'libs/shared/interfaces/requests/AddToLibraryRequest';\nimport { LibraryApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\nimport { ErrorMessageHelper } from 'libs/shared/utils/error-message-helper/ErrorMessageHelper';\nimport { LaunchUrlHelper } from 'libs/shared/utils/LaunchUrlHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\nimport { VideoSortHelper } from 'libs/shared/utils/VideoSortHelper';\n\nexport interface AddToLibraryFormValues {\n library: Library;\n folder: Folder;\n comment?: string;\n}\n\ntype LibraryObjectType = MasterType.Video | MasterType.Clip | MasterType.Interactive;\n\ntype ObjectTypeMap = {\n [K in LibraryObjectType]: LibraryRequestObjectType;\n};\n\nconst OBJECT_TYPE_MAP: ObjectTypeMap = {\n [MasterType.Video]: LibraryRequestObjectType.MasterVideo,\n [MasterType.Clip]: LibraryRequestObjectType.MasterClip,\n [MasterType.Interactive]: LibraryRequestObjectType.MasterInteractive\n};\n\nconst namespace = 'libraries.addToLibrary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AddToLibraryViewProps extends PopupViewProps {\n id: string;\n typeId: MasterType;\n folderAppLink?: Core.AppLink;\n}\n\nexport function AddToLibraryView(props: AddToLibraryViewProps): JSX.Element {\n const user = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const librariesWithCategories = Flight.useBasicFetch<LibraryTree[]>(LibraryRequests.librariesWithCategories());\n const libraries = Flight.useBasicFetch<Library[]>(LibraryRequests.libraryRequestLibraries());\n\n const videoRequest = VideoHelper.getVideoRequest(props.id, props.typeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const isClipOrInteractive = VideoHelper.isClip(video.data) || VideoHelper.isInteractive(video.data);\n const parentVideo = isClipOrInteractive && (video.data as Clip | InteractiveMetadata)?._parentVideo;\n const parentVideoDetails = Flight.useBasicFetch<Video>(\n parentVideo && VideoRequests.video(parentVideo.id)\n );\n\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const sortedLibraries = React.useMemo(() => LibraryHelper.sort(libraries.data), [libraries.data]);\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n\n const sort = !!user.data && VideoSortHelper.getOrSetSortType(user.data.id);\n\n /**\n * We try to pull the library and category id off the video/clip/interactive.\n * If we can't, then we try to get them off the _parentVideo. \n */\n function getSourceIds() {\n let sourceCategoryId: string = null;\n let sourceLibraryId = ArrayHelper.first(video.data?.libraries?.data)?.id;\n\n if (sourceLibraryId && video.data.categories.data?.length) {\n const category = video.data.categories.data.find(category => {\n return category.libraries?.data?.find(l => l.id.toString() === sourceLibraryId.toString());\n });\n\n if (category)\n sourceCategoryId = category.id;\n }\n\n if (!sourceLibraryId) {\n sourceLibraryId = ArrayHelper.first(parentVideoDetails.data?.libraries?.data)?.id;\n\n if (sourceLibraryId && parentVideoDetails.data.categories.data?.length) {\n const category = parentVideoDetails.data.categories.data.find(category => {\n return category.libraries?.data?.find(l => l.id.toString() === sourceLibraryId.toString());\n });\n \n if (category)\n sourceCategoryId = category.id;\n }\n }\n\n return {\n sourceLibraryId: sourceLibraryId ? +sourceLibraryId : null,\n sourceCategoryId: sourceCategoryId ? +sourceCategoryId : null\n };\n }\n\n function addToLibrary(data: AddToLibraryFormValues, onDone: () => void): void {\n const { sourceLibraryId, sourceCategoryId } = getSourceIds();\n\n const request: AddToLibraryRequest = {\n objectId: props.id.toString(),\n objectType: OBJECT_TYPE_MAP[props.typeId as LibraryObjectType],\n message: data.comment,\n sourceLibraryId,\n destinationLibraryId: +data.library.id,\n metadata: {\n destinationCategoryId: +data.folder.id,\n sourceCategoryId\n }\n };\n\n fetchAsync(LibraryRequests.addToLibrary(request, sort))\n .then(() => {\n if (!data.library.canAddContent) {\n alerts.success({\n type: AlertType.Pending,\n heading: getPhrase('pendingApproval'),\n message: getPhrase('libraryRequestSent', { library: data.library.name, escapeText: true })\n });\n } else {\n alerts.success({\n type: AlertType.Success,\n heading: '',\n message: getPhrase('addToLibrarySuccess', { folder: data.folder.name, video: video.data.name, escapeText: true }),\n ...(props.folderAppLink ? {\n appLink: {\n ...props.folderAppLink,\n args: [ data.library.id, data.folder.id, TextHelper.slugify(data.folder.name) ]\n },\n appLinkText: getPhrase('goToFolder', { folder: data.folder.name }),\n appLinkClassName: 'info-link'\n } : {\n extLink: LaunchUrlHelper.buildOpenLibraryFolderUrl(config.data.launchUrl, {\n libraryId: data.library.id,\n folderId: data.folder.id\n }),\n extLinkText: getPhrase('goToFolder', { folder: data.folder.name }),\n extLinkClassName: 'info-link'\n })\n });\n }\n })\n .catch((xhr: LibraryApiXhr) => {\n const errorMessage = ErrorMessageHelper.libraryApiError(xhr);\n handleGenerateReportError(xhr, errorMessage, errorMessage);\n onDone();\n })\n .finally(() => {\n props.closePopup();\n });\n }\n\n function getCategoryTree(libraryId: string): LibraryTree[] {\n return librariesWithCategories.data.find(l => l.data.id.toString() === libraryId.toString())?.children;\n }\n\n function isFolderDisabled(folder: BaseTree<Folder>): boolean {\n return !!video.data.categories?.data?.find(category => category.id === folder.id);\n }\n\n const dataLoaded = (\n libraries.data &&\n video.data &&\n librariesWithCategories.data\n );\n\n return (\n <Popup title={getPhrase('addToLibrary')} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded || loading}>\n {dataLoaded && (\n <FormWrapper<AddToLibraryFormValues>\n initialValues={{\n library: ArrayHelper.first(sortedLibraries),\n folder: null,\n comment: ''\n }}\n validationSchema={AddToLibraryValidationSchema}\n onSubmit={addToLibrary}\n >\n <AddToLibraryForm\n libraries={sortedLibraries}\n closePopup={props.closePopup}\n isFolderDisabled={isFolderDisabled}\n video={video.data}\n videoLibraries={video.data?.libraries?.data}\n getCategoryTree={getCategoryTree}\n />\n </FormWrapper>\n )}\n </Popup>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BaXT2aKo2.chunk.js","names":[],"sources":["../../../../libs/shared/src/utils/TreeHelper.ts","../../../../libs/shared/src/components/tree/tree.module.scss","../../../../libs/shared/src/components/tree/TreeNodeText.tsx","../../../../libs/shared/src/components/tree/TreeNode.tsx","../../../../libs/shared/src/components/tree/Tree.tsx","../../../../libs/shared/src/apps/libraries/components/add-to-library-form/AddToLibraryForm.tsx","../../../../libs/shared/src/apps/libraries/utils/LibraryHelper.ts","../../../../libs/shared/src/apps/libraries/validation/AddToLibraryValidationSchema.ts","../../../../libs/shared/src/enums/LibraryRequestObjectType.ts","../../../../libs/shared/src/utils/error-message-helper/ErrorMessageHelper.ts","../../../../libs/shared/src/utils/LaunchUrlHelper.ts","../../../../libs/shared/src/apps/libraries/views/add-to-library/AddToLibraryView.tsx"],"sourcesContent":["import { ObjectHelper } from 'libs/common/react/utils/ObjectHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { BaseObject, MasterNestedObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nfunction _find<T extends BaseTree<BaseObject>>(\n node: T,\n id: string | number,\n parents: T[]\n): [ T | null, T[] ] {\n if (TextHelper.isEqual(node.id, id))\n return [ node, parents ];\n\n const children = node.children;\n\n if (!children || !children.length)\n return [ null, null ];\n\n for (let i = 0; i < children.length; i++) {\n const [ child, foundParents ] = _find(children[i] as T, id, [ ...parents, node ]);\n\n if (child)\n return [ child, foundParents ];\n }\n\n return [ null, null ];\n}\n\nexport const DEFAULT_MAX_DEPTH = 7;\n\nexport const TreeHelper = {\n find<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T | null {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [child] = _find(tree.children[j] as T, id, []);\n \n if (child)\n return child;\n }\n },\n\n getPath<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T[] {\n if (!tree || !tree.children || !tree.children.length)\n return;\n\n for (let j = 0; j < tree.children.length; j++) {\n const [ , path ] = _find(tree.children[j] as T, id, []);\n \n if (path?.length)\n return path;\n }\n },\n\n getParent<T extends BaseTree<BaseObject>>(tree: T, id: string | number): T {\n const path = TreeHelper.getPath(tree, id);\n\n if (!path?.length)\n return null;\n\n return path[path.length - 1];\n },\n\n convertNestedObjectToTree<T extends BaseObject>(nestedObject: MasterNestedObject<T>): BaseTree<T> {\n const node: BaseTree<T> = {\n ...nestedObject.data,\n children: nestedObject.children\n };\n\n if (node.children?.length)\n node.children = node.children.map(TreeHelper.convertNestedObjectToTree);\n\n return node;\n },\n\n findDepth<T extends MasterNestedObject<BaseObject>>(nodes: T[], targetId: string, currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return 0;\n }\n\n let depth = 0;\n\n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return currentDepth;\n }\n\n const childDepth = TreeHelper.findDepth(node.children, targetId, currentDepth + 1);\n\n if (childDepth > 0) {\n depth = childDepth;\n break;\n }\n }\n\n return depth;\n },\n\n findMaxChildDepth<T extends BaseObject>(nodes: MasterNestedObject<T>[], currentDepth: number = 0): number {\n if (!nodes || nodes.length === 0) {\n return currentDepth;\n }\n \n let deepestLevel = currentDepth;\n \n for (const node of nodes) {\n const childLevel = TreeHelper.findMaxChildDepth(node.children, currentDepth + 1);\n deepestLevel = Math.max(deepestLevel, childLevel);\n }\n \n return deepestLevel;\n },\n\n findTargetNode<T extends BaseObject>(nodes: MasterNestedObject<T>[], targetId: string): MasterNestedObject<T> | null {\n if (!nodes || nodes.length === 0) {\n return null;\n }\n \n for (const node of nodes) {\n if (node.data?.id?.toString() === targetId.toString()) {\n return node;\n }\n \n const result = TreeHelper.findTargetNode(node.children, targetId);\n if (result !== null) {\n return result;\n }\n }\n \n return null;\n },\n\n isMaxDepth<T extends MasterNestedObject<BaseObject>>(\n nodes: T[],\n sourceId: string,\n targetId: string,\n maxDepth: number = DEFAULT_MAX_DEPTH\n ): boolean {\n const sourceTree = TreeHelper.findTargetNode(nodes, sourceId);\n const maxChildDepth = TreeHelper.findMaxChildDepth(sourceTree.children);\n const targetDepth = TreeHelper.findDepth(nodes, targetId);\n \n return maxChildDepth + targetDepth >= maxDepth;\n },\n\n flatten<T>(\n tree: BaseTree<T>\n ): T[] {\n if (!tree)\n return [];\n\n const nodes: T[] = [];\n\n function pushNode(node: BaseTree<T>): void {\n nodes.push(ObjectHelper.omit(node, ['children']));\n node.children.forEach(pushNode);\n }\n\n tree.children.forEach(pushNode);\n\n return nodes;\n }\n};\n","$chevron-container-size: $cv-svg-size;\n$chevron-visible-size: calc($chevron-container-size / 3); // The actual chevron is 1/3rd of the container size\n$chevron-root-padding: map-get($spacers, 1);\n$text-root-padding: $chevron-root-padding + $chevron-container-size;\n\n@mixin nestedFolderTree($from, $to) {\n :local .tree {\n .text {\n padding-left: $text-root-padding + ($from * ($chevron-container-size - $chevron-visible-size));\n }\n\n .chevron {\n right: auto;\n left: $chevron-root-padding + ($from * ($chevron-container-size - $chevron-visible-size));\n }\n\n @if $from != $to {\n @include nestedFolderTree($from + 1, $to)\n }\n }\n}\n\n@include nestedFolderTree(0, 20);\n\n:local {\n .chevron {\n display: inline-block;\n position: absolute;\n color: black;\n cursor: pointer;\n top: 50%;\n margin-top: -$cv-svg-size-sm*0.5;\n right: 100%;\n }\n\n .text {\n overflow-wrap: break-word;\n padding-right: $cv-svg-size;\n cursor: pointer;\n\n &.disabled {\n cursor: not-allowed;\n }\n }\n\n .root {\n .chevron {\n left: $chevron-root-padding;\n }\n\n .text {\n padding-left: $text-root-padding;\n }\n }\n\n .selected {\n font-weight: 600;\n }\n\n .actions {\n position: absolute;\n right: 0;\n top: 0;\n bottom: 0;\n display: none !important;\n\n &:hover {\n display: flex !important;\n }\n }\n\n .node:hover {\n text-decoration: none;\n\n &.noActions {\n background-color: $light-blue;\n }\n\n :global(.dropdown) {\n display: block;\n }\n\n + .actions {\n display: block !important;\n }\n }\n}","import React from 'react';\n\nimport { BaseObject } from 'libs/analytics/interfaces';\n\nimport { Tooltip } from 'libs/shared/components/tooltip/Tooltip';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nimport styles from './tree.module.scss';\n\ninterface TreeNodeTextProps<T extends BaseTree<BaseObject>> {\n tree: T;\n text: string;\n className?: string;\n isDisabled?: boolean;\n disabledTooltip?: string | ((tree: T) => string);\n}\n\nexport function TreeNodeText<T extends BaseTree<BaseObject>>(props: TreeNodeTextProps<T>): React.ReactElement {\n function getTextClass(): string {\n let textClassName = `${styles.text} clamp-4`;\n\n if (props.className)\n textClassName += ` ${props.className}`;\n\n return textClassName;\n }\n\n if (props.isDisabled) {\n const disabledToolTip = typeof props.disabledTooltip === 'string' ?\n props.disabledTooltip :\n props.disabledTooltip?.(props.tree);\n\n return (\n <Tooltip title={disabledToolTip} spanHack spanHackClassName='d-inline-block flex-grow-1'>\n <span className={`${getTextClass()} text-secondary ${styles.disabled}`}>\n {props.text}\n </span>\n </Tooltip>\n );\n }\n\n return (\n <div className={getTextClass()}>\n {props.text}\n </div>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { Actions } from 'libs/shared/components/actions/Actions';\nimport { Caret } from 'libs/shared/components/caret/Caret';\nimport { DivButton } from 'libs/shared/components/div-button/DivButton';\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nimport { Tree } from './Tree';\nimport { TreeNodeText } from './TreeNodeText';\n\nimport styles from './tree.module.scss';\n\nconst TREE_ACTIONS_CLASS = 'tree-actions';\n\nexport interface TreeNodeAction<T extends BaseTree<BaseObject>> {\n label: string;\n getAppLink: (node: T) => Core.AppLink;\n className?: string;\n}\n\ninterface TreeNodeProps<T extends BaseTree<BaseObject>> {\n tree: T;\n selectedIds?: string[];\n getAppLink?: (item: T) => Core.AppLink;\n onSelect?: (item: T) => void;\n isDisabled?: (item: T) => boolean;\n isClickDisabled?: (item: T) => boolean;\n actions?: TreeNodeAction<T>[];\n selectedLinkClassName?: string;\n disabledTooltip?: string | ((tree: T) => string);\n isRoot?: boolean;\n isDropdown?: boolean;\n multiSelect?: boolean;\n depth: number;\n openDepth?: number;\n maxDisplayDepth?: number;\n}\n\nTreeNode.defaultProps = {\n selectedLinkClassName: styles.selected\n};\n\nexport function TreeNode<T extends BaseTree<BaseObject>>(props: TreeNodeProps<T>): React.ReactElement {\n const { tree, selectedIds, getAppLink, onSelect, isDisabled, isClickDisabled, actions, isDropdown } = props;\n\n const ref = React.useRef<HTMLDivElement>(null);\n\n // If one of our children is selected\n const isParentOfSelected = React.useMemo(() => {\n return selectedIds?.some(id => TreeHelper.find(tree, id));\n }, [ tree, selectedIds ]);\n\n // Or we are below the initial open depth\n const initiallyOpen = props.openDepth && props.depth < props.openDepth;\n\n // We render expanded initially\n const [ isExpanded, setIsExpanded ] = React.useState(isParentOfSelected || initiallyOpen);\n\n const isSelected = selectedIds?.some(id => TextHelper.isEqual(tree.id, id));\n let hasChildren = !!tree.children && !!tree.children.length;\n\n if (props.maxDisplayDepth && hasChildren)\n hasChildren = props.depth < props.maxDisplayDepth;\n\n /**\n * We need to stop propagation of our event if our tree is rendered\n * inside of a bootstrap dropdown - Sha\n */\n React.useEffect(() => {\n if (!ref.current || !isDropdown)\n return;\n\n const onClick = (e: Event) => {\n e.stopPropagation();\n onSelectNode();\n };\n\n ref.current.addEventListener('click', onClick);\n return () => {\n if (!ref.current)\n return;\n\n ref.current.removeEventListener('click', onClick);\n };\n }, [ ref.current, onSelect ]);\n\n /**\n * Check if an expanded item should actually be collapsed\n */\n React.useEffect(() => {\n // Don't do auto collapsing for trees that support multiple selections\n if (props.multiSelect)\n return;\n\n // Skip item if it's already collapsed\n if (!isExpanded)\n return;\n\n // Parents of a selected item should remain expanded\n if (isParentOfSelected)\n return;\n\n // Selected items should remain expanded\n if (isSelected)\n return;\n\n // Disabled items can be expanded if nothing has been selected\n if (!props.selectedIds?.length && isDisabled?.(props.tree))\n return;\n\n // If we want it to be initially open\n if (initiallyOpen)\n return;\n\n setIsExpanded(false);\n }, [selectedIds]);\n\n function onSelectNode(): void {\n if (isClickDisabled?.(tree))\n return;\n\n if (!props.multiSelect)\n setIsExpanded(!isExpanded);\n\n if (getAppLink) {\n Core.AppLinkHelper.trigger(getAppLink(tree));\n return;\n }\n\n if (isDisabled?.(tree)) {\n onSelect(null);\n return;\n }\n\n onSelect?.(tree);\n }\n\n function onClickCaret(e: any): void {\n e.stopPropagation();\n\n if (props.multiSelect) {\n setIsExpanded(!isExpanded);\n return;\n }\n\n onSelectNode();\n }\n\n function getNodeClass(): string {\n let className = `py-1 d-flex align-items-center w-100 position-relative ${styles.node}`;\n\n if (isSelected)\n className += ' ' + props.selectedLinkClassName;\n\n if (!actions?.length)\n className += ' ' + styles.noActions;\n\n if (isParentOfSelected && props.multiSelect)\n className += ' text-underline fst-italic';\n\n return className;\n }\n\n if (props.maxDisplayDepth && (props.depth > props.maxDisplayDepth))\n return <></>;\n\n return (\n <li className={`position-relative ${isExpanded ? '' : styles.collapsed} ${props.isRoot ? styles.root : ''}`}>\n <div className='position-relative'>\n <DivButton\n className={getNodeClass()}\n onClick={isDropdown ? null : onSelectNode}\n ref={ref}\n >\n {hasChildren && (\n <div className={styles.chevron} onClick={onClickCaret}>\n <Caret direction={isExpanded ? 'down' : 'right'} />\n </div>\n )}\n\n <TreeNodeText\n tree={tree}\n // Always prefer name over description\n text={tree.name || tree.description}\n isDisabled={isDisabled?.(tree) || isClickDisabled?.(tree)}\n disabledTooltip={props.disabledTooltip}\n />\n </DivButton>\n\n {!!props.actions && (\n <Actions\n className={styles.actions}\n actions={actions?.map(a => ({ ...a, appLink: a.getAppLink(tree) }))}\n actionsDropdownClassName={`btn btn-light ${TREE_ACTIONS_CLASS} py-0`}\n />\n )}\n\n {isExpanded && <Tree key={tree.id} {...props} isChild depth={props.depth + 1} />}\n </div>\n </li>\n );\n}\n","import * as React from 'react';\n\nimport { Core } from 'libs/common/core';\n\nimport { BaseObject } from 'libs/shared/interfaces';\nimport { BaseTree } from 'libs/shared/interfaces';\n\nimport { TreeNode, TreeNodeAction } from './TreeNode';\n\nimport styles from './tree.module.scss';\n\nexport interface TreeProps<T extends BaseTree<BaseObject>> {\n tree: T;\n selectedIds?: string[];\n getAppLink?: (item: T) => Core.AppLink;\n onSelect?: (item: T) => void;\n isDisabled?: (item: T) => boolean;\n isClickDisabled?: (item: T) => boolean;\n actions?: TreeNodeAction<T>[];\n selectedLinkClassName?: string;\n disabledTooltip?: string | ((tree: T) => string);\n isChild?: boolean;\n depth?: number;\n multiSelect?: boolean;\n /**\n * Set to true if you are using this component inside of\n * a bootstrap dropdown menu and don't want it to close\n * on click events - Sha\n */\n isDropdown?: boolean;\n /**\n * If you want to initially render open to a certain depth\n */\n openDepth?: number;\n maxDisplayDepth?: number;\n}\n\nexport function Tree<T extends BaseTree<BaseObject>>(props: TreeProps<T>): React.ReactElement {\n const { tree, ...childProps } = props;\n\n if (!tree || !tree.children)\n return <></>;\n\n return (\n <ul className={`m-0 p-0 list-unstyled ${styles.tree}`}>\n {tree.children.map((child, key) => (\n <TreeNode key={key} tree={child} {...childProps} isRoot={!props.isChild} depth={props.depth || 0} />\n ))}\n </ul>\n );\n}\n","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\nimport { Form } from 'formik';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { AddToLibraryFormValues } from 'libs/shared/apps/libraries/views/add-to-library/AddToLibraryView';\nimport { FormField } from 'libs/shared/components/forms/form-field/FormField';\nimport { useFormikContextWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { Tree } from 'libs/shared/components/tree/Tree';\nimport { BaseTree, Folder, Library, LibraryTree, PopupViewProps, VideoTypes } from 'libs/shared/interfaces';\nimport { TreeHelper } from 'libs/shared/utils/TreeHelper';\n\nconst namespace = 'libraries.addToLibraryForm';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AddToLibraryFormProps extends PopupViewProps {\n libraries: Library[];\n isFolderDisabled: (folder: BaseTree<Folder>) => boolean;\n video: VideoTypes;\n videoLibraries?: Library[];\n getCategoryTree: (libraryId: string) => LibraryTree[];\n}\n\nexport function AddToLibraryForm(props: AddToLibraryFormProps): JSX.Element {\n const formikProps = useFormikContextWrapper<AddToLibraryFormValues>();\n\n const isMakingLibraryRequest = !formikProps.values.library.canAddContent;\n const isAlreadyInLibrary = props.videoLibraries?.find(l => l.id === formikProps.values.library.id);\n\n const tree = React.useMemo(() => {\n const categoryTree = props.getCategoryTree(formikProps.values.library.id);\n\n const rootBranches = categoryTree.map(TreeHelper.convertNestedObjectToTree);\n\n return {\n children: rootBranches\n } as BaseTree<Library>;\n }, [formikProps.values.library.id]);\n\n return (\n <>\n {isAlreadyInLibrary && (\n <div className='alert alert-info'>\n <Text namespace={namespace} phrase='alreadyInLibrary' options={{ library: formikProps.values.library.name }} />\n </div>\n )}\n\n {isMakingLibraryRequest && (\n <p>\n <Text namespace={namespace} phrase='sendLibraryRequest' options={{ video: props.video.name }} />\n </p>\n )}\n\n <Form>\n {props.libraries.length > 1 && (\n <FormField\n as='select'\n label={getPhrase('selectLibrary')}\n name='library'\n value={formikProps.values.library?.id ?? ''}\n className={!formikProps.values.library?.id ? 'text-secondary' : ''}\n showRequiredStar\n onChange={(e: any) => {\n formikProps.setFieldValue('folder', null);\n\n const libraryId = e.target.value;\n\n formikProps.setFieldValue('library', props.libraries.find(l => l.id.toString() === libraryId.toString()));\n }}\n >\n {props.libraries.map(library => (\n <option key={library.id} value={library.id} className='text-dark'>\n {library.name}\n </option>\n ))}\n </FormField>\n )}\n\n <FormField\n label={getPhrase('selectFolder')}\n name='folder'\n showRequiredStar\n disabled={!formikProps.values.library}\n >\n {() => (\n <Scrollbars autoHeight autoHeightMax={300} className='border rounded-3'>\n <Tree\n tree={tree}\n onSelect={(folder: Folder) => formikProps.setFieldValue('folder', folder)}\n isDisabled={props.isFolderDisabled}\n disabledTooltip={LanguageService.getPhrase(namespace, 'disabledFolder')}\n selectedIds={formikProps.values.folder?.id ? [formikProps.values.folder.id] : undefined}\n selectedLinkClassName='bg-light'\n />\n </Scrollbars>\n )}\n </FormField>\n \n {!!formikProps.values.folder && (\n <p className='mt-n2'>\n <Text\n namespace={namespace}\n phrase={isMakingLibraryRequest ? 'requestTo' : 'addTo'}\n options={{ folder: formikProps.values.folder.name }}\n />\n </p>\n )}\n\n {isMakingLibraryRequest && (\n <FormField\n label={LanguageService.getPhrase(namespace, 'comment')}\n as='textarea'\n name='comment'\n id='comment'\n placeholder={LanguageService.getPhrase(namespace, 'commentPlaceholder')}\n value={formikProps.values.comment}\n />\n )}\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit variant='dark' text={getPhrase('addToLibrary')} />\n </PopupButtons>\n </Form>\n </>\n );\n}\n","import { HardCoded } from 'libs/shared/constants/HardCoded';\nimport { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { CurrentUser, Library } from 'libs/shared/interfaces';\n\ntype LibraryTypes = Library['type'] | 'shared_library';\n\nexport const LibraryHelper = {\n /**\n * Orders libraries by type (custom -> shared -> hosted).\n * Also orders libraries of same type alphabetically.\n */\n sort(libraries: Library[]): Library[] {\n if (!libraries?.length)\n return [];\n\n return libraries.sort((a: Library, b: Library) => {\n // This is required because shared libraries have a type of `custom_library`\n const aType: LibraryTypes = a.isSharedLibrary ? 'shared_library' : a.type;\n const bType: LibraryTypes = b.isSharedLibrary ? 'shared_library' : b.type;\n \n if (aType === bType)\n return a.name.localeCompare(b.name);\n \n if (aType === 'custom_library')\n return -1;\n \n if (aType === 'shared_library' && bType !== 'custom_library')\n return -1;\n\n if (aType === 'hosted_library' && bType !== 'custom_library' && bType !== 'shared_library')\n return -1;\n \n return 1;\n });\n },\n\n hasTwigOrTigtag(libraries: Library[], currentUser: CurrentUser) {\n if (!currentUser)\n return { hasTwig: false, hasTigtag: false };\n\n // Anon users can see Twig/Tigtag if they're in England.\n if (!currentUser.isAuthenticated) {\n const hasAnonAccess = (\n currentUser.contentRegion === ContentRegion.UK ||\n currentUser.contentRegion === ContentRegion.SCOT\n );\n\n return {\n hasTwig: hasAnonAccess,\n hasTigtag: hasAnonAccess\n };\n }\n\n if (!libraries)\n return { hasTwig: false, hasTigtag: false };\n \n let hasTwig = false;\n let hasTigtag = false;\n\n for (const lib of libraries) {\n if (lib.id.toString() === HardCoded.Libraries.TWIG)\n hasTwig = true;\n else if (lib.id.toString() === HardCoded.Libraries.TIGTAG)\n hasTigtag = true;\n\n // If both are true we don't need to keep searching\n if (hasTwig && hasTigtag)\n break;\n }\n\n return { hasTwig, hasTigtag };\n }\n};\n","import { object, string } from 'yup';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nconst namespace = 'libraries.validation';\n\nexport const AddToLibraryValidationSchema = object().shape({\n comment: string()\n .nullable()\n .max(512, () => LanguageService.getPhrase(namespace, 'commentExceeds')),\n library: object()\n .required(() => LanguageService.getPhrase(namespace, 'libraryRequired'))\n .nullable(),\n folder: object()\n .required(() => LanguageService.getPhrase(namespace, 'folderRequired'))\n .nullable()\n});\n","export enum LibraryRequestObjectType {\n MasterVideo = 1,\n MasterClip = 2,\n MasterInteractive = 3\n}\n","import { DevError } from 'libs/common/backbone/errors/DevError';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Core } from 'libs/common/core';\n\nimport { InviteColleagueXhr, LibraryApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\n\nconst getPhrase = LanguageService.encloseNamespace('shared.errorMessageHelper');\n\nconst LIBRARY_ERROR_PHRASE_MAPPING = {\n 'operation-not-allowed': 'operationNotAllowed',\n 'library-not-supported': 'libraryNotSupported',\n 'access-denied': 'accessDenied',\n 'library-access-denied': 'libraryAccessDenied',\n 'library-access-denied-create': 'libraryAccessDeniedCreate',\n 'library-access-denied-fulfil': 'libraryAccessDeniedFulfill',\n 'library-access-denied-not-authorized': 'libraryAccessDeniedNotAuthorized',\n 'library-request-access-denied': 'accessDenied',\n 'library-request-access-denied-create-request': 'libraryRequestAccessDeniedCreateRequest',\n 'library-request-access-denied-process-comment': 'libraryRequestAccessDeniedProcessComment',\n 'customer-not-found': 'customerNotFound',\n 'customer-not-found-current-user': 'customerNotFound',\n 'customer-not-found-library-owner': 'customerNotFoundLibraryOwner',\n 'customer-not-found-destination-library-owner': 'customerNotFoundLibraryOwner',\n 'user-not-found': 'userNotFound',\n 'library-not-found': 'libraryNotFound',\n 'video-not-found': 'videoNotFound',\n 'category-not-found': 'categoryNotFound',\n 'category-not-found-destination-not-provided': 'categoryNotFoundDestinationNotProvided',\n 'category-not-found-not-in-library': 'categoryNotFoundInLibrary',\n 'library-request-not-found': 'libraryRequestNotFound',\n 'invalid-category-path': 'invalidCategoryPath',\n 'library-api-error': 'somethingWentWrong',\n 'content-not-playable': 'contentNotPlayable',\n 'invalid-object': 'invalidObject',\n 'same-request-existed': 'sameRequestExisted',\n 'unknown-error': 'somethingWentWrong',\n 'no-email': 'noEmailError'\n};\n\nconst INVITE_COLLEAGUE_PHRASE_MAPPING = {\n 'create-invitation-failed': 'createInvitationFailed',\n 'invitation-resend-failed': 'invitationResendFailed',\n 'failed-to-accept': 'failedToAccept',\n 'invitee-not-found': 'inviteeNotFound',\n 'invitation-not-found': 'invitationNotFound',\n 'invitation-deleted': 'invitationDeleted',\n 'too-many-emails': 'tooManyEmails'\n};\n\nexport const ErrorMessageHelper = {\n libraryApiError(xhr: LibraryApiXhr): string {\n const phrase = LIBRARY_ERROR_PHRASE_MAPPING[xhr?.responseJSON?.type];\n\n if (!phrase)\n return getPhrase('somethingWentWrong');\n\n return getPhrase(phrase);\n },\n inviteColleagueError(xhr: InviteColleagueXhr): string {\n const phrase = INVITE_COLLEAGUE_PHRASE_MAPPING[xhr?.responseJSON?.type];\n\n if (!phrase)\n return getPhrase('somethingWentWrong');\n\n return getPhrase(phrase);\n }\n};\n\nexport const ErrorMessageHelperValidation = {\n libraryApiErrors(): void {\n Object.values(LIBRARY_ERROR_PHRASE_MAPPING).forEach(value => {\n const phrase = getPhrase(value);\n\n if (!phrase)\n Core.ErrorHelper.throw(new DevError(`No language mapping found for library api error type: ${value}`));\n });\n },\n inviteColleagueErrors(): void {\n Object.values(INVITE_COLLEAGUE_PHRASE_MAPPING).forEach(value => {\n const phrase = getPhrase(value);\n\n if (!phrase)\n Core.ErrorHelper.throw(new DevError(`No language mapping found for library api error type: ${value}`));\n });\n }\n};\n","import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\ninterface OpenLibraryFolderParams {\n libraryId: string;\n folderId: string;\n}\n\nexport const LaunchUrlHelper = {\n buildOpenAppLinkUrl(baseLaunchUrl: string, appLink: string, product?: string): string {\n return UrlHelper.urlBuilder(`${baseLaunchUrl}/open`, { appLink, product });\n },\n\n buildOpenVideoUrl(baseLaunchUrl: string, videoId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `video:${videoId}`, product);\n },\n\n buildOpenClipUrl(baseLaunchUrl: string, clipId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `clip:${clipId}`, product);\n },\n\n buildOpenInteractiveUrl(baseLaunchUrl: string, interactiveId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `interactive:${interactiveId}`, product);\n },\n\n buildOpenTopicUrl(baseLaunchUrl: string, topicId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `topic:${topicId}`, product);\n },\n\n buildOpenSeriesUrl(baseLaunchUrl: string, seriesId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `series:${seriesId}`, product);\n },\n\n buildOpenPlaylistUrl(baseLaunchUrl: string, playlistId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `playlist:${playlistId}`, product);\n },\n\n buildOpenCategoryUrl(baseLaunchUrl: string, categoryId: string, product?: string): string {\n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, `category:${categoryId}`, product);\n },\n\n buildOpenLibraryFolderUrl(baseLaunchUrl: string, params: OpenLibraryFolderParams, product?: string): string {\n const appLink = `library:${params.libraryId}:folder:${params.folderId}`;\n \n return LaunchUrlHelper.buildOpenAppLinkUrl(baseLaunchUrl, appLink, product);\n }\n};\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { AlertType } from 'libs/common/backbone/services/BaseAlertService';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { ArrayHelper } from 'libs/common/react/utils/ArrayHelper';\nimport { TextHelper } from 'libs/common/react/utils/TextHelper';\n\nimport { AddToLibraryForm } from 'libs/shared/apps/libraries/components/add-to-library-form/AddToLibraryForm';\nimport { LibraryHelper } from 'libs/shared/apps/libraries/utils/LibraryHelper';\nimport { AddToLibraryValidationSchema } from 'libs/shared/apps/libraries/validation/AddToLibraryValidationSchema';\nimport { FormWrapper } from 'libs/shared/components/forms/form-wrapper/FormWrapper';\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { LibraryRequestObjectType } from 'libs/shared/enums/LibraryRequestObjectType';\nimport { MasterType } from 'libs/shared/enums/MasterType';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { LibraryRequests } from 'libs/shared/flight-requests/LibraryRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { VideoRequests } from 'libs/shared/flight-requests/VideoRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { BaseTree, Clip, Config, CurrentUser, Folder, InteractiveMetadata, Library, LibraryTree, PopupViewProps, Video, VideoTypes } from 'libs/shared/interfaces';\nimport { AddToLibraryRequest } from 'libs/shared/interfaces/requests/AddToLibraryRequest';\nimport { LibraryApiXhr } from 'libs/shared/interfaces/responses/ErrorResponse';\nimport { ErrorMessageHelper } from 'libs/shared/utils/error-message-helper/ErrorMessageHelper';\nimport { LaunchUrlHelper } from 'libs/shared/utils/LaunchUrlHelper';\nimport { VideoHelper } from 'libs/shared/utils/VideoHelper';\nimport { VideoSortHelper } from 'libs/shared/utils/VideoSortHelper';\n\nexport interface AddToLibraryFormValues {\n library: Library;\n folder: Folder;\n comment?: string;\n}\n\ntype LibraryObjectType = MasterType.Video | MasterType.Clip | MasterType.Interactive;\n\ntype ObjectTypeMap = {\n [K in LibraryObjectType]: LibraryRequestObjectType;\n};\n\nconst OBJECT_TYPE_MAP: ObjectTypeMap = {\n [MasterType.Video]: LibraryRequestObjectType.MasterVideo,\n [MasterType.Clip]: LibraryRequestObjectType.MasterClip,\n [MasterType.Interactive]: LibraryRequestObjectType.MasterInteractive\n};\n\nconst namespace = 'libraries.addToLibrary';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface AddToLibraryViewProps extends PopupViewProps {\n id: string;\n typeId: MasterType;\n folderAppLink?: Core.AppLink;\n}\n\nexport function AddToLibraryView(props: AddToLibraryViewProps): JSX.Element {\n const user = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const librariesWithCategories = Flight.useBasicFetch<LibraryTree[]>(LibraryRequests.librariesWithCategories());\n const libraries = Flight.useBasicFetch<Library[]>(LibraryRequests.libraryRequestLibraries());\n\n const videoRequest = VideoHelper.getVideoRequest(props.id, props.typeId);\n const video = Flight.useBasicFetch<VideoTypes>(videoRequest);\n\n const isClipOrInteractive = VideoHelper.isClip(video.data) || VideoHelper.isInteractive(video.data);\n const parentVideo = isClipOrInteractive && (video.data as Clip | InteractiveMetadata)?._parentVideo;\n const parentVideoDetails = Flight.useBasicFetch<Video>(\n parentVideo && VideoRequests.video(parentVideo.id)\n );\n\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n const sortedLibraries = React.useMemo(() => LibraryHelper.sort(libraries.data), [libraries.data]);\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n\n const sort = !!user.data && VideoSortHelper.getOrSetSortType(user.data.id);\n\n /**\n * We try to pull the library and category id off the video/clip/interactive.\n * If we can't, then we try to get them off the _parentVideo. \n */\n function getSourceIds() {\n let sourceCategoryId: string = null;\n let sourceLibraryId = ArrayHelper.first(video.data?.libraries?.data)?.id;\n\n if (sourceLibraryId && video.data.categories.data?.length) {\n const category = video.data.categories.data.find(category => {\n return category.libraries?.data?.find(l => l.id.toString() === sourceLibraryId.toString());\n });\n\n if (category)\n sourceCategoryId = category.id;\n }\n\n if (!sourceLibraryId) {\n sourceLibraryId = ArrayHelper.first(parentVideoDetails.data?.libraries?.data)?.id;\n\n if (sourceLibraryId && parentVideoDetails.data.categories.data?.length) {\n const category = parentVideoDetails.data.categories.data.find(category => {\n return category.libraries?.data?.find(l => l.id.toString() === sourceLibraryId.toString());\n });\n \n if (category)\n sourceCategoryId = category.id;\n }\n }\n\n return {\n sourceLibraryId: sourceLibraryId ? +sourceLibraryId : null,\n sourceCategoryId: sourceCategoryId ? +sourceCategoryId : null\n };\n }\n\n function addToLibrary(data: AddToLibraryFormValues, onDone: () => void): void {\n const { sourceLibraryId, sourceCategoryId } = getSourceIds();\n\n const request: AddToLibraryRequest = {\n objectId: props.id.toString(),\n objectType: OBJECT_TYPE_MAP[props.typeId as LibraryObjectType],\n message: data.comment,\n sourceLibraryId,\n destinationLibraryId: +data.library.id,\n metadata: {\n destinationCategoryId: +data.folder.id,\n sourceCategoryId\n }\n };\n\n fetchAsync(LibraryRequests.addToLibrary(request, sort))\n .then(() => {\n if (!data.library.canAddContent) {\n alerts.success({\n type: AlertType.Pending,\n heading: getPhrase('pendingApproval'),\n message: getPhrase('libraryRequestSent', { library: data.library.name, escapeText: true })\n });\n } else {\n alerts.success({\n type: AlertType.Success,\n heading: '',\n message: getPhrase('addToLibrarySuccess', { folder: data.folder.name, video: video.data.name, escapeText: true }),\n ...(props.folderAppLink ? {\n appLink: {\n ...props.folderAppLink,\n args: [ data.library.id, data.folder.id, TextHelper.slugify(data.folder.name) ]\n },\n appLinkText: getPhrase('goToFolder', { folder: data.folder.name }),\n appLinkClassName: 'info-link'\n } : {\n extLink: LaunchUrlHelper.buildOpenLibraryFolderUrl(config.data.launchUrl, {\n libraryId: data.library.id,\n folderId: data.folder.id\n }),\n extLinkText: getPhrase('goToFolder', { folder: data.folder.name }),\n extLinkClassName: 'info-link'\n })\n });\n }\n })\n .catch((xhr: LibraryApiXhr) => {\n const errorMessage = ErrorMessageHelper.libraryApiError(xhr);\n handleGenerateReportError(xhr, errorMessage, errorMessage);\n onDone();\n })\n .finally(() => {\n props.closePopup();\n });\n }\n\n function getCategoryTree(libraryId: string): LibraryTree[] {\n return librariesWithCategories.data.find(l => l.data.id.toString() === libraryId.toString())?.children;\n }\n\n function isFolderDisabled(folder: BaseTree<Folder>): boolean {\n return !!video.data.categories?.data?.find(category => category.id === folder.id);\n }\n\n const dataLoaded = (\n libraries.data &&\n video.data &&\n librariesWithCategories.data\n );\n\n return (\n <Popup title={getPhrase('addToLibrary')} closePopup={props.closePopup} showLoadingSpinner={!dataLoaded || loading}>\n {dataLoaded && (\n <FormWrapper<AddToLibraryFormValues>\n initialValues={{\n library: ArrayHelper.first(sortedLibraries),\n folder: null,\n comment: ''\n }}\n validationSchema={AddToLibraryValidationSchema}\n onSubmit={addToLibrary}\n >\n <AddToLibraryForm\n libraries={sortedLibraries}\n closePopup={props.closePopup}\n isFolderDisabled={isFolderDisabled}\n video={video.data}\n videoLibraries={video.data?.libraries?.data}\n getCategoryTree={getCategoryTree}\n />\n </FormWrapper>\n )}\n </Popup>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,D as t,fn as n}from"./B1i9atik.chunk.js";import{l as r}from"./TJBzqR6k.chunk.js";import{t as i}from"./CrBD6Z4s.chunk.js";import{t as a}from"./DKbUI-vj.chunk.js";import{U as o,Z as s}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,D as t,fn as n}from"./B1i9atik.chunk.js";import{l as r}from"./TJBzqR6k.chunk.js";import{t as i}from"./CrBD6Z4s.chunk.js";import{t as a}from"./DKbUI-vj.chunk.js";import{U as o,Z as s}from"./app-lnmpv5W4.js";import{t as c}from"./4oWF2EyV2.chunk.js";import{n as l,r as u,t as d}from"./B0jhFNam2.chunk.js";import{t as f}from"./BuSq2beZ2.chunk.js";import{t as p}from"./DGRBUJ6T2.chunk.js";import{t as m}from"./CSbvS-Cl.chunk.js";var h=n(t());function g(e){let{currentUser:t,region:n,config:r,program:a}=e,o=r.tvPreviewUrls[n.code],s=a.globalId.replace(/-/g,``),c=i.safeUrlConcat(o,`/thumbnail/${s}.jpg`),l=i.safeUrlConcat(o,`/144p/${s.toUpperCase()}_144p.mp4`),u=i.safeUrlConcat(o,`/subtitle/${s.toUpperCase()}.srt`),d=i.urlBuilder(i.safeUrlConcat(r.playerApiUrl,`/api/srt-to-vtt`),{url:u});return{videoId:null,episodeNumber:0,seriesName:null,mediaId:null,mediaType:null,ratingCode:null,region:t.instanceRegion,seasonNumber:null,viewerId:t.id,viewerCustomerId:t.customerId,files:{fileToken:``,progressive:[{mimeType:`video/mp4`,profile:`144`,quality:144,url:l,label:`Preview`}]},chapters:{list:[]},instanceRegion:t.instanceRegion,localCacheAddresses:[],posterUrl:c,resources:{list:[]},settings:{showSubtitles:!1,playbackProfile:`144`,playbackProfileLocalCache:`144`,playbackQuality:`144`,playbackQualityLocalCache:`144`,playbackQualityFallback:`144`,playbackSubtitleSizeDefault:`medium`},subtitles:{list:[{url:d,isDefault:!1,language:`en-AU`,mimeType:`text/vtt`,label:`English`}]},title:a.title}}var _=e();function v(e){let t=r(f.region(e.region)),n=r(s.config()),i=r(f.program(e.id)),v=r(a.currentUser()),[y,b]=h.useState(),x=m(`preview`,t.data,y);p(t,!0),c(i.statusCode);function S(t){b(t),e.currentTime&&t.currentTime(e.currentTime)}let C=t.hasCompleted&&i.hasCompleted&&n.hasCompleted&&v.hasCompleted,w=C&&g({currentUser:v.data,region:t.data,config:n.data,program:i.data});return(0,_.jsx)(o,{title:i.data?.title,closePopup:e.closePopup,showLoadingSpinner:!C,size:`lg`,bodyClassName:`p-0 rounded-3 position-relative`,hideTitle:!0,children:C&&(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(`div`,{className:`overflow-hidden rounded-top-lg`,children:(0,_.jsx)(u,{viewKey:null,offlinePlaybackObject:w,playerApi:new URL(n.data.playerApiUrl),autoplay:!0,hotkeyElQuerySelector:`body`,onReady:S,allowFullscreen:!1})}),(0,_.jsx)(d,{program:i.data,title:i.data.title,description:i.data.description,videoActions:x(i.data)}),(0,_.jsx)(l,{closePopup:e.closePopup})]})})}export{v as TvPreviewView};
|
|
2
|
+
//# sourceMappingURL=BibFbDqs.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"BibFbDqs.chunk.js","names":[],"sources":["../../src/apps/tv/views/tv-preview/utils/getTvPlaybackObject.ts","../../src/apps/tv/views/tv-preview/TvPreviewView.tsx"],"sourcesContent":["import { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { RegionName } from 'libs/analytics/enums/RegionName';\n\nimport { CurrentUser } from 'libs/shared/interfaces';\n\nimport { PlaybackObject } from 'projects/player/interfaces/models/PlaybackObject';\n\nimport { ExchangeConfig } from 'shared/interfaces/ExchangeConfig';\n\nimport { TvProgram } from 'apps/tv/interfaces/models/TvProgram';\nimport { TvRegion } from 'apps/tv/interfaces/models/TvRegion';\n\ninterface GetTvPlaybackObjectOptions {\n currentUser: CurrentUser;\n region: TvRegion;\n config: ExchangeConfig;\n program: TvProgram;\n}\n\nexport function getTvPlaybackObject(options: GetTvPlaybackObjectOptions): PlaybackObject {\n const { currentUser, region, config, program } = options;\n\n const previewUrl = config.tvPreviewUrls[region.code];\n\n const globalId = program.globalId.replace(/-/g, '');\n\n const thumbnailUrl = UrlHelper.safeUrlConcat(\n previewUrl,\n `/thumbnail/${globalId}.jpg`\n );\n const fileUrl = UrlHelper.safeUrlConcat(\n previewUrl,\n `/144p/${globalId.toUpperCase()}_144p.mp4`\n );\n const subtitleLocation = UrlHelper.safeUrlConcat(\n previewUrl,\n `/subtitle/${globalId.toUpperCase()}.srt`\n );\n const subtitleUrl = UrlHelper.urlBuilder(\n UrlHelper.safeUrlConcat(config.playerApiUrl, `/api/srt-to-vtt`),\n { url: subtitleLocation }\n );\n\n return ({\n videoId: null,\n episodeNumber: 0,\n seriesName: null,\n mediaId: null,\n mediaType: null,\n ratingCode: null,\n region: currentUser.instanceRegion,\n seasonNumber: null,\n viewerId: currentUser.id,\n viewerCustomerId: currentUser.customerId,\n files: {\n fileToken: '',\n progressive: [{\n mimeType: 'video/mp4',\n profile: '144',\n quality: 144,\n url: fileUrl,\n label: 'Preview'\n }]\n },\n chapters: { list: []},\n instanceRegion: currentUser.instanceRegion as unknown as RegionName,\n localCacheAddresses: [],\n posterUrl: thumbnailUrl,\n resources: { list: []},\n settings: {\n showSubtitles: false,\n playbackProfile: '144',\n playbackProfileLocalCache: '144',\n playbackQuality: '144',\n playbackQualityLocalCache: '144',\n playbackQualityFallback: '144',\n playbackSubtitleSizeDefault: 'medium'\n },\n subtitles: {\n list: [{\n url: subtitleUrl,\n isDefault: false,\n language: 'en-AU',\n mimeType: 'text/vtt',\n label: 'English'\n }]\n },\n title: program.title\n });\n}\n","import React from 'react';\n\nimport { Flight } from 'libs/common/flight';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PlayerReference } from 'libs/shared/context/player-context/interfaces/PlayerReference';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { useHandleDialogError } from 'libs/shared/hooks/UseHandleDialogError';\nimport { CurrentUser, PopupViewProps } from 'libs/shared/interfaces';\n\nimport { ClickViewPlayer } from 'projects/player/react/Player';\n\nimport { PlayerOverlayButtons } from 'shared/components/player-overlay-buttons/PlayerOverlayButtons';\nimport { PreviewVideoDetails } from 'shared/components/preview-video-details/PreviewVideoDetails';\nimport { ExchangeConfig } from 'shared/interfaces/ExchangeConfig';\n\nimport { TvRequests } from 'apps/tv/flight-requests/TvRequests';\nimport { useGetTvActions } from 'apps/tv/hooks/useGetTvActions';\nimport { useHandleRegionError } from 'apps/tv/hooks/useHandleRegionError';\nimport { TvProgram } from 'apps/tv/interfaces/models/TvProgram';\nimport { TvRegion } from 'apps/tv/interfaces/models/TvRegion';\n\nimport { getTvPlaybackObject } from './utils/getTvPlaybackObject';\n\ninterface TvPreviewViewProps extends PopupViewProps {\n id: string;\n region: string;\n currentTime: number;\n}\n\nexport function TvPreviewView(props: TvPreviewViewProps): JSX.Element {\n const region = Flight.useBasicFetch<TvRegion>(TvRequests.region(props.region));\n const config = Flight.useBasicFetch<ExchangeConfig>(ConfigRequests.config());\n const program = Flight.useBasicFetch<TvProgram>(TvRequests.program(props.id));\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n\n const [ playerRef, setPlayerRef ] = React.useState<PlayerReference>();\n\n const getVideoActions = useGetTvActions('preview', region.data, playerRef);\n\n useHandleRegionError(region, true);\n useHandleDialogError(program.statusCode);\n\n // TODO: Solve analytics collection\n function onReady(player: PlayerReference): void {\n setPlayerRef(player);\n\n if (props.currentTime)\n player.currentTime(props.currentTime);\n // setupAnalytics(player);\n }\n\n const dataLoaded = (\n region.hasCompleted &&\n program.hasCompleted &&\n config.hasCompleted &&\n currentUser.hasCompleted\n );\n\n const playbackObject = dataLoaded && getTvPlaybackObject({\n currentUser: currentUser.data,\n region: region.data,\n config: config.data,\n program: program.data\n });\n\n return (\n <Popup\n title={program.data?.title}\n closePopup={props.closePopup}\n showLoadingSpinner={!dataLoaded}\n size='lg'\n bodyClassName='p-0 rounded-3 position-relative'\n hideTitle\n >\n {dataLoaded &&\n <>\n <div className='overflow-hidden rounded-top-lg'>\n <ClickViewPlayer\n viewKey={null}\n offlinePlaybackObject={playbackObject}\n playerApi={new URL(config.data.playerApiUrl)}\n autoplay\n hotkeyElQuerySelector='body'\n onReady={onReady}\n allowFullscreen={false}\n />\n </div>\n <PreviewVideoDetails\n program={program.data}\n title={program.data.title}\n description={program.data.description}\n videoActions={getVideoActions(program.data)}\n />\n <PlayerOverlayButtons closePopup={props.closePopup} />\n </>\n }\n </Popup>\n );\n}\n"],"mappings":"mcAoBA,SAAA,EAAA,EAAA,gVAwBE,MAAA,qsBCbF,SAAgB,EAAc,EAAwC,CACpE,IAAM,EAAS,EAA+B,EAAW,OAAO,EAAM,OAAO,CAAC,CACxE,EAAS,EAAqC,EAAe,QAAQ,CAAC,CACtE,EAAU,EAAgC,EAAW,QAAQ,EAAM,GAAG,CAAC,CACvE,EAAc,EAAkC,EAAa,aAAa,CAAC,CAE3E,CAAE,EAAW,GAAA,EAAuB,UAA2B,CAE/D,EAAkB,EAAgB,UAAW,EAAO,KAAM,EAAU,CAE1E,EAAqB,EAAQ,GAAK,CAClC,EAAqB,EAAQ,WAAW,CAGxC,SAAS,EAAQ,EAA+B,CAC9C,EAAa,EAAO,CAEhB,EAAM,aACR,EAAO,YAAY,EAAM,YAAY,CAIzC,IAAM,EACJ,EAAO,cACP,EAAQ,cACR,EAAO,cACP,EAAY,aAGR,EAAiB,GAAc,EAAoB,CACvD,YAAa,EAAY,KACzB,OAAQ,EAAO,KACf,OAAQ,EAAO,KACf,QAAS,EAAQ,KAClB,CAAC,CAEF,OACE,EAAA,EAAA,KAAC,EAAD,CACE,MAAO,EAAQ,MAAM,MACrB,WAAY,EAAM,WAClB,mBAAoB,CAAC,EACrB,KAAK,KACL,cAAc,kCACd,UAAA,YAEC,IACC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2CACb,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,KACT,sBAAuB,EACvB,UAAW,IAAI,IAAI,EAAO,KAAK,aAAa,CAC5C,SAAA,GACA,sBAAsB,OACb,UACT,gBAAiB,GACjB,CAAA,CACE,CAAA,EACN,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAQ,KACjB,MAAO,EAAQ,KAAK,MACpB,YAAa,EAAQ,KAAK,YAC1B,aAAc,EAAgB,EAAQ,KAAK,CAC3C,CAAA,EACF,EAAA,EAAA,KAAC,EAAD,CAAsB,WAAY,EAAM,WAAc,CAAA,CACrD,CAAA,CAAA,CAEC,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{C as e,D as t,_t as n,b as r,bt as i,d as a,fn as o,s}from"./B1i9atik.chunk.js";import{g as c,y as l}from"./NpQVkKE2.chunk.js";import{l as u}from"./TJBzqR6k.chunk.js";import{t as d}from"./BG5Aor0J.chunk.js";import{t as f}from"./CzvVp9iC.chunk.js";import{n as p,t as m}from"./Dn3hwC-o.chunk.js";import{t as h}from"./DgSFdSfV.chunk.js";import{t as g}from"./YhCzLJGK.chunk.js";import{D as _,Z as v}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{C as e,D as t,_t as n,b as r,bt as i,d as a,fn as o,s}from"./B1i9atik.chunk.js";import{g as c,y as l}from"./NpQVkKE2.chunk.js";import{l as u}from"./TJBzqR6k.chunk.js";import{t as d}from"./BG5Aor0J.chunk.js";import{t as f}from"./CzvVp9iC.chunk.js";import{n as p,t as m}from"./Dn3hwC-o.chunk.js";import{t as h}from"./DgSFdSfV.chunk.js";import{t as g}from"./YhCzLJGK.chunk.js";import{D as _,Z as v}from"./app-lnmpv5W4.js";import{t as y}from"./DyUX82Kv.chunk.js";import{t as b}from"./D-ivDlyL.chunk.js";import{t as x}from"./CAJOpkKZ.chunk.js";import{t as S}from"./UK8sD-oL.chunk.js";import{t as C}from"./BmEexpMP2.chunk.js";import{t as w}from"./B7sWLg9v2.chunk.js";import{t as T}from"./BuSq2beZ2.chunk.js";import{t as E}from"./DGRBUJ6T2.chunk.js";import{n as D,r as O,t as k}from"./CYfnBEtT2.chunk.js";import{n as A,t as j}from"./CDXcKno52.chunk.js";import{n as M,t as N}from"./CjNkj1Q92.chunk.js";import{t as P}from"./DsolW3Wd2.chunk.js";var F=o(t()),I={pillTabSelector:`_pillTabSelector_1d8n6_1`},L=e(),R=`Custom.#.A.B.C.D.E.F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z`.split(`.`),z={"#":`0`},B={actionType:r.Click,entity:s.Url,location:a.MagicTabs};function V(e,t){if(!e)return;if(e===`0`)return`#`;let n=R.find(t=>t.toUpperCase()===e.toUpperCase());if(!(n===`Custom`&&!t))return n}function H(e){return R.map(t=>{if(t===`Custom`&&!e.showCustom)return;let n=e.getItemAppLink(z[t]??t);return{name:t,appLink:n,active:e.selected===t,analyticsData:{name:t,url:i.getHref(n)},analyticsOptions:B}}).filter(Boolean)}function U(e){let t=H({selected:V(e.selected,e.showCustom),showCustom:e.showCustom,getItemAppLink:e.getItemAppLink});return(0,L.jsx)(`div`,{className:l(e.noMarginBottom?`mb-0`:`mb-3`,e.className),children:(0,L.jsx)(S,{tabs:t,className:I.pillTabSelector,enableSmallScreenSupport:e.enableSmallScreenSupport,formatDisplayText:e.formatDisplayText,forceSmallScreenDropdown:e.forceSmallScreenDropdown})})}var W={dateContainer:`_dateContainer_b9acj_1`,hover:`_hover_b9acj_4`,channelLogo:`_channelLogo_b9acj_7`,channelLogoContainer:`_channelLogoContainer_b9acj_10`,programsContainer:`_programsContainer_b9acj_13`,date:`_date_b9acj_1`,itemContainer:`_itemContainer_b9acj_19`,badgeWrapper:`_badgeWrapper_b9acj_22`,thumbnail:`_thumbnail_b9acj_27`};function G(e){function t(t){return d.findWhere(e.channels,{name:t})?.logoUrl}return(0,L.jsx)(`div`,{className:`mb-2`,children:e.groupedPrograms.map(([n,r])=>(0,L.jsxs)(`div`,{className:`border-top d-flex pt-3 pb-2`,children:[(0,L.jsx)(`div`,{className:`${W.channelLogoContainer} flex-shrink-0 mb-3`,children:(0,L.jsx)(`img`,{src:t(n),alt:n,className:`${W.channelLogo} ms-4`})}),(0,L.jsx)(`div`,{className:`w-100`,children:r.map(([t,n])=>(0,L.jsx)(K,{date:t,programs:n,tvPreviewUrls:e.tvPreviewUrls},t))})]},n))})}function K(e){let[t,n]=F.useState();function r(e){switch(e.programType){case k.Video:return{application:p.TV,action:m.Tv.PREVIEW,args:[e.regionCode,e.id]};case k.Audio:return{application:p.TV,action:m.Tv.RADIO_DOWNLOAD,args:[e.id]}}}function i(t){return`${e.tvPreviewUrls[t.regionCode]}/thumbnail/${t.globalId.split(`-`).join(``)}.jpg`}return(0,L.jsx)(`div`,{className:`${W.dateContainer} ${t?W.hover:``} py-2 px-3 rounded`,children:(0,L.jsxs)(`div`,{className:`d-flex align-items-center`,children:[(0,L.jsx)(`div`,{className:`${W.thumbnail} flex-shrink-0 me-3 partial-loading-background rounded`,children:(0,L.jsx)(y,{src:i(t||e.programs[0]),alt:g.format(e.date,`D MMM`),extraClasses:`w-100 rounded`})}),(0,L.jsxs)(`p`,{className:`${W.date} fw-semibold flex-shrink-0 mb-0`,children:[g.format(e.date,`D MMM`),`:`]}),(0,L.jsx)(`div`,{className:`${W.programsContainer} d-flex flex-wrap`,children:e.programs.map(e=>(0,L.jsx)(`div`,{onMouseEnter:()=>n(e),onMouseLeave:()=>n(null),children:(0,L.jsx)(c,{appLink:r(e),className:`text-decoration-none`,children:(0,L.jsx)(w,{program:e,showEndTime:!0})},e.id)},e.id))})]},e.date)})}var q=f.encloseNamespace(`tv.programs`),J=/^[a-zA-Z]/;function Y(e){let t=e.startsWith||`A`,r=u(v.config()),i=u(T.region(e.region)),a=u(T.regions()),o=u(T.dateRange(e.region)),s=u(i.data&&T.channels(i.data.code)),c=u(i.data&&o.data&&T.programsByLetter(i.data.code,t,o.data.startDate,o.data.endDate)),{setRegion:l}=P(),{liteUpgradeTypeCustomer:d}=_(null),f=F.useMemo(()=>{if(!c.data?.length)return[];let t={};c.data.forEach(n=>{e.startsWith===`0`&&J.test(n.title)||(t[n.title]||(t[n.title]=[]),t[n.title].push(n))});let n=Object.entries(t);return n=n.sort(([e],[t])=>e<t?-1:1),n.map(([e,t])=>{let n=t.reduce((e,t)=>{let n=t.channelName;e[n]||(e[n]={});let r=C(t.startTime,t.timeZone),i=g.format(r,`YYYY-MM-DD`);return e[n][i]||(e[n][i]=[]),e[n][i].push(t),e},{});return[e,Object.entries(n).map((([e,t])=>[e,Object.entries(t)]))]})},[c.data]);[...R,`0`].includes(t)||b(n.BadRequest),E(i),x([a,c]),h({title:q(`title`)});let y=i.hasCompleted&&a.hasCompleted&&o.hasCompleted&&c.hasCompleted&&r.hasCompleted;return(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(N,{region:i.data}),(0,L.jsxs)(`div`,{className:`d-flex justify-content-between`,children:[(0,L.jsx)(j,{active:`programs`,currentRegion:i.data,showTvGuide:!!d,config:r.data}),(0,L.jsx)(M,{currentRegion:i.data,regions:a.data,appLink:{application:p.TV,action:m.Tv.PROGRAMS,params:{startsWith:t}},onClick:l})]}),(0,L.jsx)(A,{dateRange:o.data,region:i.data}),(0,L.jsx)(U,{selected:t,getItemAppLink:e=>({application:p.TV,action:m.Tv.PROGRAMS,args:[i.data?.code],params:{startsWith:e}})}),y?(0,L.jsx)(L.Fragment,{children:(0,L.jsx)(O,{children:f.map(([e,t],n)=>(0,L.jsx)(O.Header,{title:e,children:(0,L.jsx)(G,{groupedPrograms:t,channels:s.data,tvPreviewUrls:r.data.tvPreviewUrls})},n))})}):(0,L.jsx)(D,{})]})}export{Y as TvProgramsView};
|
|
2
|
+
//# sourceMappingURL=BjzONPz9.chunk.js.map
|