@clickview/reports 0.90.0-rc.4 → 0.90.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 +210 -210
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{med1nnv82.chunk.js → B2NaDejJ2.chunk.js} +2 -2
- package/dist/scripts/{med1nnv82.chunk.js.map → B2NaDejJ2.chunk.js.map} +1 -1
- package/dist/scripts/{DATsYYMP.chunk.js → B7UvjDWk.chunk.js} +2 -2
- package/dist/scripts/{DATsYYMP.chunk.js.map → B7UvjDWk.chunk.js.map} +1 -1
- package/dist/scripts/{CGYMpd9x2.chunk.js → BBC0heb12.chunk.js} +2 -2
- package/dist/scripts/{CGYMpd9x2.chunk.js.map → BBC0heb12.chunk.js.map} +1 -1
- package/dist/scripts/{BcjF3S7y.chunk.js → BBromGRt.chunk.js} +2 -2
- package/dist/scripts/{BcjF3S7y.chunk.js.map → BBromGRt.chunk.js.map} +1 -1
- package/dist/scripts/{CEM-Xsc32.chunk.js → BM1rCX722.chunk.js} +2 -2
- package/dist/scripts/{CEM-Xsc32.chunk.js.map → BM1rCX722.chunk.js.map} +1 -1
- package/dist/scripts/{D63nJT6V.chunk.js → BT26h7xG.chunk.js} +2 -2
- package/dist/scripts/{D63nJT6V.chunk.js.map → BT26h7xG.chunk.js.map} +1 -1
- package/dist/scripts/{B9syewbL.chunk.js → BhnToJrk.chunk.js} +2 -2
- package/dist/scripts/{B9syewbL.chunk.js.map → BhnToJrk.chunk.js.map} +1 -1
- package/dist/scripts/{CXyHtApp2.chunk.js → Bq-KpJWX2.chunk.js} +2 -2
- package/dist/scripts/{CXyHtApp2.chunk.js.map → Bq-KpJWX2.chunk.js.map} +1 -1
- package/dist/scripts/{C_gBUP2y2.chunk.js → Bzfy_cw32.chunk.js} +2 -2
- package/dist/scripts/{C_gBUP2y2.chunk.js.map → Bzfy_cw32.chunk.js.map} +1 -1
- package/dist/scripts/{DGuSwgQf2.chunk.js → C3yKN7vY2.chunk.js} +2 -2
- package/dist/scripts/{DGuSwgQf2.chunk.js.map → C3yKN7vY2.chunk.js.map} +1 -1
- package/dist/scripts/{DqX2L2fn2.chunk.js → CEL9EOPh2.chunk.js} +2 -2
- package/dist/scripts/{DqX2L2fn2.chunk.js.map → CEL9EOPh2.chunk.js.map} +1 -1
- package/dist/scripts/{BHwx99h9.chunk.js → COeneeRO.chunk.js} +2 -2
- package/dist/scripts/{BHwx99h9.chunk.js.map → COeneeRO.chunk.js.map} +1 -1
- package/dist/scripts/{C5nG9HKq2.chunk.js → CiMD5u2s2.chunk.js} +2 -2
- package/dist/scripts/{C5nG9HKq2.chunk.js.map → CiMD5u2s2.chunk.js.map} +1 -1
- package/dist/scripts/{q1iKm4P4.chunk.js → Coxg-CDT.chunk.js} +2 -2
- package/dist/scripts/{q1iKm4P4.chunk.js.map → Coxg-CDT.chunk.js.map} +1 -1
- package/dist/scripts/{DKgzSSZ12.chunk.js → D5JcKzGf2.chunk.js} +2 -2
- package/dist/scripts/{DKgzSSZ12.chunk.js.map → D5JcKzGf2.chunk.js.map} +1 -1
- package/dist/scripts/{DBpZNnAI2.chunk.js → DDXdEuUF2.chunk.js} +2 -2
- package/dist/scripts/{DBpZNnAI2.chunk.js.map → DDXdEuUF2.chunk.js.map} +1 -1
- package/dist/scripts/{C_nTmCTH2.chunk.js → DLWxPapJ2.chunk.js} +2 -2
- package/dist/scripts/{C_nTmCTH2.chunk.js.map → DLWxPapJ2.chunk.js.map} +1 -1
- package/dist/scripts/{CeSe3AP62.chunk.js → Da6u6D2M2.chunk.js} +3 -3
- package/dist/scripts/{CeSe3AP62.chunk.js.map → Da6u6D2M2.chunk.js.map} +1 -1
- package/dist/scripts/{CWVwHN-C2.chunk.js → DhSEOAnJ2.chunk.js} +2 -2
- package/dist/scripts/{CWVwHN-C2.chunk.js.map → DhSEOAnJ2.chunk.js.map} +1 -1
- package/dist/scripts/{Cv7tjWWS.chunk.js → IG-rboYg.chunk.js} +2 -2
- package/dist/scripts/{Cv7tjWWS.chunk.js.map → IG-rboYg.chunk.js.map} +1 -1
- package/dist/scripts/{CDx9_B5h2.chunk.js → KkZBQL3G2.chunk.js} +2 -2
- package/dist/scripts/{CDx9_B5h2.chunk.js.map → KkZBQL3G2.chunk.js.map} +1 -1
- package/dist/scripts/{CCdxPE8F.chunk.js → TJTvGoAZ.chunk.js} +2 -2
- package/dist/scripts/{CCdxPE8F.chunk.js.map → TJTvGoAZ.chunk.js.map} +1 -1
- package/dist/scripts/{app-F8o5al1q.js → app-DW-nP8r1.js} +3 -3
- package/dist/scripts/{app-F8o5al1q.js.map → app-DW-nP8r1.js.map} +1 -1
- package/dist/scripts/{DJpo4rMq2.chunk.js → i1FSKHH62.chunk.js} +2 -2
- package/dist/scripts/{DJpo4rMq2.chunk.js.map → i1FSKHH62.chunk.js.map} +1 -1
- package/dist/scripts/{B_QHbZ3D2.chunk.js → niZatQNI2.chunk.js} +2 -2
- package/dist/scripts/{B_QHbZ3D2.chunk.js.map → niZatQNI2.chunk.js.map} +1 -1
- package/dist/scripts/{BDLgF915.chunk.js → nup2thXk.chunk.js} +2 -2
- package/dist/scripts/{BDLgF915.chunk.js.map → nup2thXk.chunk.js.map} +1 -1
- package/dist/scripts/{r68VJd6w.chunk.js → qhfEmD0O.chunk.js} +2 -2
- package/dist/scripts/{r68VJd6w.chunk.js.map → qhfEmD0O.chunk.js.map} +1 -1
- package/dist/scripts/{J0H9O8cX.chunk.js → t8ONdKoR.chunk.js} +2 -2
- package/dist/scripts/{J0H9O8cX.chunk.js.map → t8ONdKoR.chunk.js.map} +1 -1
- package/dist/scripts/{CLDXLTBe.chunk.js → v01tmPE-.chunk.js} +2 -2
- package/dist/scripts/{CLDXLTBe.chunk.js.map → v01tmPE-.chunk.js.map} +1 -1
- package/dist/scripts/{DHz5C_j8.chunk.js → xV42YE03.chunk.js} +2 -2
- package/dist/scripts/{DHz5C_j8.chunk.js.map → xV42YE03.chunk.js.map} +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Dr as e,at as t}from"./CrTgNROp.chunk.js";import{n}from"./HeoWyBUD.chunk.js";import{I as r}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{Dr as e,at as t}from"./CrTgNROp.chunk.js";import{n}from"./HeoWyBUD.chunk.js";import{I as r}from"./app-DW-nP8r1.js";var i=e(t());function a(e){let[,t]=n(r.HEADER_TITLE);(0,i.useEffect)(()=>(t(e),()=>{t(null)}),[e])}function o(e,t,n){if(!t)return e;let r=`${e}:${t.start}:${t.end}`,i=Array.isArray(t.userId)?t.userId.sort().join(`:`):t.userId,a=Array.isArray(t.groupId)?t.groupId.sort().join(`:`):t.groupId,o=Array.isArray(t.customerId)?t.customerId.sort().join(`:`):t.customerId;return i&&(r+=`:${i}`),a&&(r+=`:${a}`),o&&(r+=`:${o}`),t.classroomSize&&(r+=`:cs${t.classroomSize}`),t.schoolStartTime&&(r+=`:ss${t.schoolStartTime}`),t.schoolEndTime&&(r+=`:se${t.schoolEndTime}`),t.timezone&&(r+=`:tz${t.timezone}`),n&&(r+=`:${n}`),r}export{a as n,o as t};
|
|
2
|
+
//# sourceMappingURL=qhfEmD0O.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"qhfEmD0O.chunk.js","names":[],"sources":["../../src/shared/hooks/UseSetHeaderTitle.ts","../../../../libs/shared/src/utils/AnalyticsRequestUtils.ts"],"sourcesContent":["import { useEffect } from 'react';\n\nimport { useViewModel } from 'libs/common/react/hooks/UseViewModel';\n\nimport { ViewModelKeys } from 'shared/constants/ReportsViewModels';\n\nexport function useSetHeaderTitle(title?: string): void {\n const [ , setTitle ] = useViewModel<string>(ViewModelKeys.HEADER_TITLE);\n\n useEffect(() => {\n setTitle(title);\n\n return () => {\n setTitle(null);\n };\n }, [title]);\n}\n","import { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nexport function getAnalyticsRequestKey(baseKey: string, filter: AnalyticsRequestFilter, extra?: string): string {\n if (!filter)\n return baseKey;\n\n let key = `${baseKey}:${filter.start}:${filter.end}`;\n\n const userIdKey = Array.isArray(filter.userId) ? filter.userId.sort().join(':') : filter.userId;\n const groupIdKey = Array.isArray(filter.groupId) ? filter.groupId.sort().join(':') : filter.groupId;\n const customerIdKey = Array.isArray(filter.customerId) ? filter.customerId.sort().join(':') : filter.customerId;\n\n if (userIdKey)\n key += `:${userIdKey}`;\n\n if (groupIdKey)\n key += `:${groupIdKey}`;\n\n if (customerIdKey)\n key += `:${customerIdKey}`;\n\n if (filter.classroomSize)\n key += `:cs${filter.classroomSize}`;\n\n if (filter.schoolStartTime)\n key += `:ss${filter.schoolStartTime}`;\n\n if (filter.schoolEndTime)\n key += `:se${filter.schoolEndTime}`;\n\n if (filter.timezone)\n key += `:tz${filter.timezone}`;\n\n if (extra)\n key += `:${extra}`;\n\n return key;\n}\n"],"mappings":"uIAMA,SAAgB,EAAkB,EAAsB,CACtD,GAAM,EAAI,GAAa,EAAqB,EAAc,YAAY,GAEtE,EAAA,EAAA,UAAA,MACE,EAAS,CAAK,MAED,CACX,EAAS,IAAI,CACf,GACC,CAAC,CAAK,CAAC,CACZ,CCdA,SAAgB,EAAuB,EAAiB,EAAgC,EAAwB,CAC9G,GAAI,CAAC,EACH,OAAO,EAET,IAAI,EAAM,GAAG,EAAQ,GAAG,EAAO,MAAM,GAAG,EAAO,MAEzC,EAAY,MAAM,QAAQ,EAAO,MAAM,EAAI,EAAO,OAAO,KAAK,CAAC,CAAC,KAAK,GAAG,EAAI,EAAO,OACnF,EAAa,MAAM,QAAQ,EAAO,OAAO,EAAI,EAAO,QAAQ,KAAK,CAAC,CAAC,KAAK,GAAG,EAAI,EAAO,QACtF,EAAgB,MAAM,QAAQ,EAAO,UAAU,EAAI,EAAO,WAAW,KAAK,CAAC,CAAC,KAAK,GAAG,EAAI,EAAO,WA0BrG,OAxBI,IACF,GAAO,IAAI,KAET,IACF,GAAO,IAAI,KAET,IACF,GAAO,IAAI,KAET,EAAO,gBACT,GAAO,MAAM,EAAO,iBAElB,EAAO,kBACT,GAAO,MAAM,EAAO,mBAElB,EAAO,gBACT,GAAO,MAAM,EAAO,iBAElB,EAAO,WACT,GAAO,MAAM,EAAO,YAElB,IACF,GAAO,IAAI,KAEN,CACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Dr as e,Sr as t,at as n,on as r}from"./CrTgNROp.chunk.js";import{n as i}from"./28VvvkVW.chunk.js";import{t as a}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{Dr as e,Sr as t,at as n,on as r}from"./CrTgNROp.chunk.js";import{n as i}from"./28VvvkVW.chunk.js";import{t as a}from"./qhfEmD0O.chunk.js";var o=function(e){return e.Draft=`Draft`,e.Published=`Published`,e.Archived=`Archived`,e}({}),s=function(e){return e.Discover=`discover`,e.Classification=`classification`,e.ClassificationDirectory=`classification-directory`,e.ClassificationCurriculum=`classification-curriculum`,e.MoviesAndTv=`movies-and-tv`,e.Company=`company`,e.Search=`search`,e.PartnerProfile=`partner-profile`,e.PartnerProfileHub=`partner-profile-hub`,e.DiscoverPartnerProfiles=`discover-partner-profiles`,e}({});r();var c=(e,t,n)=>{e=e.toString();let r=t-e.length;return r<=0?e:Array(r+1).join(n)+e},l={ToDisplayDuration(e,n){if(!t(e))return``;let r=new Date(e),i=r.getUTCHours(),a=c(r.getUTCMinutes(),2,`0`),o=c(r.getUTCSeconds(),2,`0`);return n||i>0?`${i}:${a}:${o}`:`${a}:${o}`},ToDisplayDurationNewStyle(e,n){if(!t(e))return``;let r=new Date(e),i=r.getUTCHours(),a=r.getUTCMinutes(),o=r.getUTCSeconds();if((i>0||a>0)&&o>=30&&(a+=1,a>=60&&(i+=1,a=0)),i>0){let e=i>1?`hrs`:`hr`;return a>0?n&&o>0?`${i}${e} ${a}m ${o}s`:`${i}${e} ${a}m `:`${i} ${e}`}return a>0?n&&o>0?`${a}m ${o}s`:`${a}m`:`${o}s`},ToDisplayTimeRange(e,n){if(!t(e)||!t(n))return``;let r=new Date(n).getUTCHours()>0;return`${l.ToDisplayDuration(e,r)} - ${l.ToDisplayDuration(n,r)}`}},u=e(n(),1),d=new Map,f=new WeakMap,p=0,m=void 0;function h(e){return e?f.has(e)?f.get(e):(p+=1,f.set(e,p.toString()),f.get(e)):`0`}function g(e){return Object.keys(e).sort().filter(t=>e[t]!==void 0).map(t=>`${t}_${t===`root`?h(e.root):e[t]}`).toString()}function _(e){let t=g(e),n=d.get(t);if(!n){let r=new Map,i,a=new IntersectionObserver(t=>{t.forEach(t=>{var n;let a=t.isIntersecting&&i.some(e=>t.intersectionRatio>=e);e.trackVisibility&&t.isVisible===void 0&&(t.isVisible=a),(n=r.get(t.target))==null||n.forEach(e=>{e(a,t)})})},e);i=a.thresholds||(Array.isArray(e.threshold)?e.threshold:[e.threshold||0]),n={id:t,observer:a,elements:r},d.set(t,n)}return n}function v(e,t,n={},r=m){if(window.IntersectionObserver===void 0&&r!==void 0){let i=e.getBoundingClientRect();return t(r,{isIntersecting:r,target:e,intersectionRatio:typeof n.threshold==`number`?n.threshold:0,time:0,boundingClientRect:i,intersectionRect:i,rootBounds:i}),()=>{}}let{id:i,observer:a,elements:o}=_(n),s=o.get(e)||[];return o.has(e)||o.set(e,s),s.push(t),a.observe(e),function(){s.splice(s.indexOf(t),1),s.length===0&&(o.delete(e),a.unobserve(e)),o.size===0&&(a.disconnect(),d.delete(i))}}u.Component;function y({threshold:e,delay:t,trackVisibility:n,rootMargin:r,root:i,triggerOnce:a,skip:o,initialInView:s,fallbackInView:c,onChange:l}={}){let[d,f]=u.useState(null),p=u.useRef(),[m,h]=u.useState({inView:!!s,entry:void 0});p.current=l,u.useEffect(()=>{if(o||!d)return;let s;return s=v(d,(e,t)=>{h({inView:e,entry:t}),p.current&&p.current(e,t),t.isIntersecting&&a&&s&&(s(),s=void 0)},{root:i,rootMargin:r,threshold:e,trackVisibility:n,delay:t},c),()=>{s&&s()}},[Array.isArray(e)?e.toString():e,d,i,r,a,o,n,c,t]);let g=m.entry?.target,_=u.useRef();!d&&g&&!a&&!o&&_.current!==g&&(_.current=g,h({inView:!!s,entry:void 0}));let y=[f,m.inView,m.entry];return y.ref=y[0],y.inView=y[1],y.entry=y[2],y}var b=`Streamable Learning content`,x=`ClickView Live content`;function S(e){return Array.isArray(e)?e.map(e=>e.contentType===b?{...e,contentType:x}:e):e}function C(e){let{userId:t,customerId:n,...r}=e;return{...r,uid:t,cid:n}}var w={aggregation(e,t){return{url:i.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${e}`,C(t)),key:a(`video:views:v2:aggregation`,t,e),normalize:!1}},videoAggregation(e,t,n){return{url:i.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/${t}`,C(n)),key:a(`video:views:v2:aggregation:${e}`,n,t),normalize:!1}},aggregationChart(e,t){return{url:i.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${e}/chart`,C(t)),key:a(`video:views:v2:aggregation:chart`,t,e),normalize:!1}},videoAggregationChart(e,t,n){return{url:i.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/${t}/chart`,C(n)),key:a(`video:views:v2:aggregation:chart:${e}`,n,t),normalize:!1}},topStreams(e,t){return{url:i.urlBuilder(`{gateway}/v2/analytics/streams/top`,{...C(t),limit:e}),key:a(`video:views:v2:top:streams:${e}`,t),normalize:!1,formatData:S}},videoHeatMap(e,t,n){return{url:i.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/heat-map`,{...C(t),cursor:n}),key:a(`video:views:v2:heatmap:${e}`,t,n),normalize:!1}},videoHeatMapAggregation(e,t){return{url:i.urlBuilder(`{gateway}/v2/analytics/streams/videos/${e}/aggregation/heat-map`,C(t)),key:a(`video:views:v2:aggregation:heatmap:${e}`,t),normalize:!1}}};export{s as a,o as i,y as n,l as r,w as t};
|
|
2
|
+
//# sourceMappingURL=t8ONdKoR.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"J0H9O8cX.chunk.js","names":[],"sources":["../../../../libs/shared/src/interfaces/models/Dashboard.ts","../../../../libs/shared/src/utils/DurationHelper.ts","../../../../../node_modules/react-intersection-observer/index.mjs","../../src/shared/flight-requests/VideoViewsV2Requests.ts"],"sourcesContent":["import { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { CustomerType } from 'libs/shared/enums/CustomerType';\nimport { LibraryType } from 'libs/shared/enums/LibraryType';\nimport {\n BaseObject,\n BasePaginatedCollection,\n CuratedWidget,\n CuratedWidgetContent,\n CuratedWidgetData\n} from 'libs/shared/interfaces';\n\nexport enum DashboardLearningLevel {\n Any = 'Any',\n Level_1 = 'Level_1',\n Level_2 = 'Level_2',\n Level_3 = 'Level_3',\n Level_4 = 'Level_4'\n}\n\nexport enum DashboardUserType {\n Any = 'Any',\n Staff = 'Staff',\n Learner = 'Learner'\n}\n\nexport enum DashboardStatus {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport interface Dashboard extends BaseObject {\n libraryType: LibraryType;\n customerType: CustomerType;\n userRole: number;\n}\n\nexport interface CuratedDashboardMetadata {\n systemGenerated?: boolean;\n channelId?: string;\n}\n\nexport interface CuratedDashboard<\n TWidgetData extends CuratedWidgetData = CuratedWidgetData,\n TWidgetContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BaseObject {\n contentRegion: ContentRegion;\n description: string;\n learningLevel: DashboardLearningLevel;\n userType: DashboardUserType;\n status: DashboardStatus;\n target: string;\n widgets: CuratedWidget<TWidgetData, TWidgetContent>[];\n metadata: CuratedDashboardMetadata;\n datePublished: string;\n}\n\nexport interface CuratedDashboardCollection<\n TWidgetData extends CuratedWidgetData = CuratedWidgetData,\n TWidgetContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BasePaginatedCollection<CuratedDashboard<TWidgetData, TWidgetContent>> {}\n\n/**\n * Dashboard identification below\n */\nexport enum DashboardTargetType {\n Discover = 'discover',\n Classification = 'classification',\n ClassificationDirectory = 'classification-directory',\n ClassificationCurriculum = 'classification-curriculum',\n MoviesAndTv = 'movies-and-tv',\n Company = 'company',\n Search = 'search',\n PartnerProfile = 'partner-profile',\n PartnerProfileHub = 'partner-profile-hub',\n DiscoverPartnerProfiles = 'discover-partner-profiles'\n}\n\ninterface DiscoverDashboardInfo {\n targetType: DashboardTargetType.Discover;\n presentationId: string;\n}\n\nexport interface ClassificationDashboardInfo {\n targetType: DashboardTargetType.Classification;\n classificationId: string;\n}\n\nexport interface ClassificationDirectoryInfo {\n targetType: DashboardTargetType.ClassificationDirectory;\n classificationId: string;\n}\n\nexport interface ClassificationCurriculumInfo {\n targetType: DashboardTargetType.ClassificationCurriculum;\n classificationId: string;\n}\n\ninterface MoviesAndTvDashboardInfo {\n targetType: DashboardTargetType.MoviesAndTv;\n presentationId: string;\n}\n\nexport interface CompanyDashboardInfo {\n targetType: DashboardTargetType.Company;\n companyId: string;\n presentationId: string;\n}\n\nexport interface PartnerProfileDashboardInfo {\n targetType: DashboardTargetType.PartnerProfile;\n slug: string;\n}\n\nexport interface PartnerProfileHubDashboardInfo {\n targetType: DashboardTargetType.PartnerProfileHub;\n}\n\nexport interface PartnerProfileDiscoverDashboardInfo {\n targetType: DashboardTargetType.DiscoverPartnerProfiles;\n}\n\nexport type DashboardTargetInfo =\n | DiscoverDashboardInfo |\n ClassificationDashboardInfo |\n ClassificationDirectoryInfo |\n ClassificationCurriculumInfo |\n MoviesAndTvDashboardInfo |\n CompanyDashboardInfo |\n PartnerProfileDashboardInfo |\n PartnerProfileHubDashboardInfo |\n PartnerProfileDiscoverDashboardInfo;\nexport interface UnknownDashboardTargetInfo {\n targetType: DashboardTargetType;\n presentationId: string;\n classificationId: string;\n companyId: string;\n slug: string;\n}\n","import * as _ from 'underscore';\n\nconst padLeft = (value: string | number, totalLength: number, padChar: string) => {\n value = value.toString();\n\n const diff = totalLength - value.length;\n\n if (diff <= 0)\n return value;\n\n return new Array(diff + 1).join(padChar) + value;\n};\n\nconst DurationHelper = {\n /**\n * Copypasta from Online. Feel free to improve it if you see fit - Sha\n */\n ToDisplayDuration(milliseconds: number, showAll?: boolean): string {\n if (!_.isNumber(milliseconds))\n return '';\n \n const time = new Date(milliseconds);\n \n const h = time.getUTCHours();\n const m = padLeft(time.getUTCMinutes(), 2, '0');\n const s = padLeft(time.getUTCSeconds(), 2, '0');\n \n if (showAll || h > 0) {\n return `${h}:${m}:${s}`;\n }\n \n return `${m}:${s}`;\n },\n\n ToDisplayDurationNewStyle(milliseconds: number, includeSeconds?: boolean): string {\n if (!_.isNumber(milliseconds))\n return '';\n\n const time = new Date(milliseconds);\n\n let h = time.getUTCHours();\n let m = time.getUTCMinutes();\n const s = time.getUTCSeconds();\n\n // Round up 1m when >= 30s\n if ((h > 0 || m > 0) && s >= 30) {\n m = m + 1;\n // Handle minute overflow (e.g., 59m + 1 = 60m -> 1hr)\n if (m >= 60) {\n h = h + 1;\n m = 0;\n }\n }\n \n if (h > 0) {\n const hourUnit = h > 1 ? 'hrs' : 'hr';\n\n if (m > 0) {\n if (includeSeconds && s > 0) {\n return `${h}${hourUnit} ${m}m ${s}s`;\n }\n\n return `${h}${hourUnit} ${m}m `;\n }\n \n return `${h} ${hourUnit}`;\n }\n\n if (m > 0) {\n if (includeSeconds && s > 0) {\n return `${m}m ${s}s`;\n }\n\n return `${m}m`;\n }\n\n return `${s}s`;\n },\n\n ToDisplayTimeRange(startMilliseconds: number, endMilliseconds: number) {\n if (!_.isNumber(startMilliseconds) || !_.isNumber(endMilliseconds))\n return '';\n\n const showAll = new Date(endMilliseconds).getUTCHours() > 0;\n\n return `${DurationHelper.ToDisplayDuration(startMilliseconds, showAll)} - ${DurationHelper.ToDisplayDuration(endMilliseconds, showAll)}`;\n }\n};\n\nexport { DurationHelper };\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root)\n return \"0\";\n if (RootIds.has(root))\n return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip)\n return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef();\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (skip || !ref)\n return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current)\n callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n const previousEntryTarget = React2.useRef();\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView\n};\n//# sourceMappingURL=index.mjs.map","\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/react/index';\n\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nimport { TopVideoV2 } from 'shared/interfaces';\n\nconst LEGACY_CV_LIVE_CONTENT_TYPE = 'Streamable Learning content';\nconst CV_LIVE_CONTENT_TYPE = 'ClickView Live content';\n\n/**\n * The Videoviews API still reports ClickView Live streams under the product's\n * former name, so relabel them before they are rendered.\n */\nfunction formatCvLiveContentType(data: TopVideoV2[]): TopVideoV2[] {\n if (!Array.isArray(data)) return data;\n\n return data.map(video => (\n video.contentType === LEGACY_CV_LIVE_CONTENT_TYPE ?\n { ...video, contentType: CV_LIVE_CONTENT_TYPE } :\n video\n ));\n}\n\n/**\n * Becasue the V2 endpoints take the user context,\n * userId and customerId cannot be used for these values so instead\n * we are using uid and cid - sha\n */\nfunction formatFilter(filter: AnalyticsRequestFilter) {\n const { userId, customerId, ...rest } = filter;\n return { ...rest, uid: userId, cid: customerId };\n}\n\nexport const VideoViewsV2Requests = {\n aggregation(\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${type}`, formatFilter(filter)),\n key: getAnalyticsRequestKey('video:views:v2:aggregation', filter, type),\n normalize: false\n };\n },\n\n videoAggregation(\n videoId: string,\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/${type}`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:${videoId}`, filter, type),\n normalize: false\n };\n },\n\n aggregationChart(\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${type}/chart`, formatFilter(filter)),\n key: getAnalyticsRequestKey('video:views:v2:aggregation:chart', filter, type),\n normalize: false\n };\n },\n\n videoAggregationChart(\n videoId: string,\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/${type}/chart`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:chart:${videoId}`, filter, type),\n normalize: false\n };\n },\n\n topStreams(limit: number, filter: AnalyticsRequestFilter): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/top`, { ...formatFilter(filter), limit }),\n key: getAnalyticsRequestKey(`video:views:v2:top:streams:${limit}`, filter),\n normalize: false,\n formatData: formatCvLiveContentType\n };\n },\n\n videoHeatMap(\n videoId: string,\n filter: AnalyticsRequestFilter,\n cursor?: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/heat-map`, { ...formatFilter(filter), cursor }),\n key: getAnalyticsRequestKey(`video:views:v2:heatmap:${videoId}`, filter, cursor),\n normalize: false\n };\n },\n\n videoHeatMapAggregation(\n videoId: string,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/heat-map`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:heatmap:${videoId}`, filter),\n normalize: false\n };\n }\n};\n"],"x_google_ignoreList":[2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"t8ONdKoR.chunk.js","names":[],"sources":["../../../../libs/shared/src/interfaces/models/Dashboard.ts","../../../../libs/shared/src/utils/DurationHelper.ts","../../../../../node_modules/react-intersection-observer/index.mjs","../../src/shared/flight-requests/VideoViewsV2Requests.ts"],"sourcesContent":["import { ContentRegion } from 'libs/shared/enums/ContentRegion';\nimport { CustomerType } from 'libs/shared/enums/CustomerType';\nimport { LibraryType } from 'libs/shared/enums/LibraryType';\nimport {\n BaseObject,\n BasePaginatedCollection,\n CuratedWidget,\n CuratedWidgetContent,\n CuratedWidgetData\n} from 'libs/shared/interfaces';\n\nexport enum DashboardLearningLevel {\n Any = 'Any',\n Level_1 = 'Level_1',\n Level_2 = 'Level_2',\n Level_3 = 'Level_3',\n Level_4 = 'Level_4'\n}\n\nexport enum DashboardUserType {\n Any = 'Any',\n Staff = 'Staff',\n Learner = 'Learner'\n}\n\nexport enum DashboardStatus {\n Draft = 'Draft',\n Published = 'Published',\n Archived = 'Archived'\n}\n\nexport interface Dashboard extends BaseObject {\n libraryType: LibraryType;\n customerType: CustomerType;\n userRole: number;\n}\n\nexport interface CuratedDashboardMetadata {\n systemGenerated?: boolean;\n channelId?: string;\n}\n\nexport interface CuratedDashboard<\n TWidgetData extends CuratedWidgetData = CuratedWidgetData,\n TWidgetContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BaseObject {\n contentRegion: ContentRegion;\n description: string;\n learningLevel: DashboardLearningLevel;\n userType: DashboardUserType;\n status: DashboardStatus;\n target: string;\n widgets: CuratedWidget<TWidgetData, TWidgetContent>[];\n metadata: CuratedDashboardMetadata;\n datePublished: string;\n}\n\nexport interface CuratedDashboardCollection<\n TWidgetData extends CuratedWidgetData = CuratedWidgetData,\n TWidgetContent extends CuratedWidgetContent = CuratedWidgetContent\n> extends BasePaginatedCollection<CuratedDashboard<TWidgetData, TWidgetContent>> {}\n\n/**\n * Dashboard identification below\n */\nexport enum DashboardTargetType {\n Discover = 'discover',\n Classification = 'classification',\n ClassificationDirectory = 'classification-directory',\n ClassificationCurriculum = 'classification-curriculum',\n MoviesAndTv = 'movies-and-tv',\n Company = 'company',\n Search = 'search',\n PartnerProfile = 'partner-profile',\n PartnerProfileHub = 'partner-profile-hub',\n DiscoverPartnerProfiles = 'discover-partner-profiles'\n}\n\ninterface DiscoverDashboardInfo {\n targetType: DashboardTargetType.Discover;\n presentationId: string;\n}\n\nexport interface ClassificationDashboardInfo {\n targetType: DashboardTargetType.Classification;\n classificationId: string;\n}\n\nexport interface ClassificationDirectoryInfo {\n targetType: DashboardTargetType.ClassificationDirectory;\n classificationId: string;\n}\n\nexport interface ClassificationCurriculumInfo {\n targetType: DashboardTargetType.ClassificationCurriculum;\n classificationId: string;\n}\n\ninterface MoviesAndTvDashboardInfo {\n targetType: DashboardTargetType.MoviesAndTv;\n presentationId: string;\n}\n\nexport interface CompanyDashboardInfo {\n targetType: DashboardTargetType.Company;\n companyId: string;\n presentationId: string;\n}\n\nexport interface PartnerProfileDashboardInfo {\n targetType: DashboardTargetType.PartnerProfile;\n slug: string;\n}\n\nexport interface PartnerProfileHubDashboardInfo {\n targetType: DashboardTargetType.PartnerProfileHub;\n}\n\nexport interface PartnerProfileDiscoverDashboardInfo {\n targetType: DashboardTargetType.DiscoverPartnerProfiles;\n}\n\nexport type DashboardTargetInfo =\n | DiscoverDashboardInfo |\n ClassificationDashboardInfo |\n ClassificationDirectoryInfo |\n ClassificationCurriculumInfo |\n MoviesAndTvDashboardInfo |\n CompanyDashboardInfo |\n PartnerProfileDashboardInfo |\n PartnerProfileHubDashboardInfo |\n PartnerProfileDiscoverDashboardInfo;\nexport interface UnknownDashboardTargetInfo {\n targetType: DashboardTargetType;\n presentationId: string;\n classificationId: string;\n companyId: string;\n slug: string;\n}\n","import * as _ from 'underscore';\n\nconst padLeft = (value: string | number, totalLength: number, padChar: string) => {\n value = value.toString();\n\n const diff = totalLength - value.length;\n\n if (diff <= 0)\n return value;\n\n return new Array(diff + 1).join(padChar) + value;\n};\n\nconst DurationHelper = {\n /**\n * Copypasta from Online. Feel free to improve it if you see fit - Sha\n */\n ToDisplayDuration(milliseconds: number, showAll?: boolean): string {\n if (!_.isNumber(milliseconds))\n return '';\n \n const time = new Date(milliseconds);\n \n const h = time.getUTCHours();\n const m = padLeft(time.getUTCMinutes(), 2, '0');\n const s = padLeft(time.getUTCSeconds(), 2, '0');\n \n if (showAll || h > 0) {\n return `${h}:${m}:${s}`;\n }\n \n return `${m}:${s}`;\n },\n\n ToDisplayDurationNewStyle(milliseconds: number, includeSeconds?: boolean): string {\n if (!_.isNumber(milliseconds))\n return '';\n\n const time = new Date(milliseconds);\n\n let h = time.getUTCHours();\n let m = time.getUTCMinutes();\n const s = time.getUTCSeconds();\n\n // Round up 1m when >= 30s\n if ((h > 0 || m > 0) && s >= 30) {\n m = m + 1;\n // Handle minute overflow (e.g., 59m + 1 = 60m -> 1hr)\n if (m >= 60) {\n h = h + 1;\n m = 0;\n }\n }\n \n if (h > 0) {\n const hourUnit = h > 1 ? 'hrs' : 'hr';\n\n if (m > 0) {\n if (includeSeconds && s > 0) {\n return `${h}${hourUnit} ${m}m ${s}s`;\n }\n\n return `${h}${hourUnit} ${m}m `;\n }\n \n return `${h} ${hourUnit}`;\n }\n\n if (m > 0) {\n if (includeSeconds && s > 0) {\n return `${m}m ${s}s`;\n }\n\n return `${m}m`;\n }\n\n return `${s}s`;\n },\n\n ToDisplayTimeRange(startMilliseconds: number, endMilliseconds: number) {\n if (!_.isNumber(startMilliseconds) || !_.isNumber(endMilliseconds))\n return '';\n\n const showAll = new Date(endMilliseconds).getUTCHours() > 0;\n\n return `${DurationHelper.ToDisplayDuration(startMilliseconds, showAll)} - ${DurationHelper.ToDisplayDuration(endMilliseconds, showAll)}`;\n }\n};\n\nexport { DurationHelper };\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\n\n// src/InView.tsx\nimport * as React from \"react\";\n\n// src/observe.ts\nvar observerMap = /* @__PURE__ */ new Map();\nvar RootIds = /* @__PURE__ */ new WeakMap();\nvar rootId = 0;\nvar unsupportedValue = void 0;\nfunction defaultFallbackInView(inView) {\n unsupportedValue = inView;\n}\nfunction getRootId(root) {\n if (!root)\n return \"0\";\n if (RootIds.has(root))\n return RootIds.get(root);\n rootId += 1;\n RootIds.set(root, rootId.toString());\n return RootIds.get(root);\n}\nfunction optionsToId(options) {\n return Object.keys(options).sort().filter(\n (key) => options[key] !== void 0\n ).map((key) => {\n return `${key}_${key === \"root\" ? getRootId(options.root) : options[key]}`;\n }).toString();\n}\nfunction createObserver(options) {\n const id = optionsToId(options);\n let instance = observerMap.get(id);\n if (!instance) {\n const elements = /* @__PURE__ */ new Map();\n let thresholds;\n const observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n var _a;\n const inView = entry.isIntersecting && thresholds.some((threshold) => entry.intersectionRatio >= threshold);\n if (options.trackVisibility && typeof entry.isVisible === \"undefined\") {\n entry.isVisible = inView;\n }\n (_a = elements.get(entry.target)) == null ? void 0 : _a.forEach((callback) => {\n callback(inView, entry);\n });\n });\n }, options);\n thresholds = observer.thresholds || (Array.isArray(options.threshold) ? options.threshold : [options.threshold || 0]);\n instance = {\n id,\n observer,\n elements\n };\n observerMap.set(id, instance);\n }\n return instance;\n}\nfunction observe(element, callback, options = {}, fallbackInView = unsupportedValue) {\n if (typeof window.IntersectionObserver === \"undefined\" && fallbackInView !== void 0) {\n const bounds = element.getBoundingClientRect();\n callback(fallbackInView, {\n isIntersecting: fallbackInView,\n target: element,\n intersectionRatio: typeof options.threshold === \"number\" ? options.threshold : 0,\n time: 0,\n boundingClientRect: bounds,\n intersectionRect: bounds,\n rootBounds: bounds\n });\n return () => {\n };\n }\n const { id, observer, elements } = createObserver(options);\n const callbacks = elements.get(element) || [];\n if (!elements.has(element)) {\n elements.set(element, callbacks);\n }\n callbacks.push(callback);\n observer.observe(element);\n return function unobserve() {\n callbacks.splice(callbacks.indexOf(callback), 1);\n if (callbacks.length === 0) {\n elements.delete(element);\n observer.unobserve(element);\n }\n if (elements.size === 0) {\n observer.disconnect();\n observerMap.delete(id);\n }\n };\n}\n\n// src/InView.tsx\nfunction isPlainChildren(props) {\n return typeof props.children !== \"function\";\n}\nvar InView = class extends React.Component {\n constructor(props) {\n super(props);\n __publicField(this, \"node\", null);\n __publicField(this, \"_unobserveCb\", null);\n __publicField(this, \"handleNode\", (node) => {\n if (this.node) {\n this.unobserve();\n if (!node && !this.props.triggerOnce && !this.props.skip) {\n this.setState({ inView: !!this.props.initialInView, entry: void 0 });\n }\n }\n this.node = node ? node : null;\n this.observeNode();\n });\n __publicField(this, \"handleChange\", (inView, entry) => {\n if (inView && this.props.triggerOnce) {\n this.unobserve();\n }\n if (!isPlainChildren(this.props)) {\n this.setState({ inView, entry });\n }\n if (this.props.onChange) {\n this.props.onChange(inView, entry);\n }\n });\n this.state = {\n inView: !!props.initialInView,\n entry: void 0\n };\n }\n componentDidMount() {\n this.unobserve();\n this.observeNode();\n }\n componentDidUpdate(prevProps) {\n if (prevProps.rootMargin !== this.props.rootMargin || prevProps.root !== this.props.root || prevProps.threshold !== this.props.threshold || prevProps.skip !== this.props.skip || prevProps.trackVisibility !== this.props.trackVisibility || prevProps.delay !== this.props.delay) {\n this.unobserve();\n this.observeNode();\n }\n }\n componentWillUnmount() {\n this.unobserve();\n }\n observeNode() {\n if (!this.node || this.props.skip)\n return;\n const {\n threshold,\n root,\n rootMargin,\n trackVisibility,\n delay,\n fallbackInView\n } = this.props;\n this._unobserveCb = observe(\n this.node,\n this.handleChange,\n {\n threshold,\n root,\n rootMargin,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n }\n unobserve() {\n if (this._unobserveCb) {\n this._unobserveCb();\n this._unobserveCb = null;\n }\n }\n render() {\n const { children } = this.props;\n if (typeof children === \"function\") {\n const { inView, entry } = this.state;\n return children({ inView, entry, ref: this.handleNode });\n }\n const {\n as,\n triggerOnce,\n threshold,\n root,\n rootMargin,\n onChange,\n skip,\n trackVisibility,\n delay,\n initialInView,\n fallbackInView,\n ...props\n } = this.props;\n return React.createElement(\n as || \"div\",\n { ref: this.handleNode, ...props },\n children\n );\n }\n};\n\n// src/useInView.tsx\nimport * as React2 from \"react\";\nfunction useInView({\n threshold,\n delay,\n trackVisibility,\n rootMargin,\n root,\n triggerOnce,\n skip,\n initialInView,\n fallbackInView,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = React2.useState(null);\n const callback = React2.useRef();\n const [state, setState] = React2.useState({\n inView: !!initialInView,\n entry: void 0\n });\n callback.current = onChange;\n React2.useEffect(\n () => {\n if (skip || !ref)\n return;\n let unobserve;\n unobserve = observe(\n ref,\n (inView, entry) => {\n setState({\n inView,\n entry\n });\n if (callback.current)\n callback.current(inView, entry);\n if (entry.isIntersecting && triggerOnce && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n },\n {\n root,\n rootMargin,\n threshold,\n // @ts-ignore\n trackVisibility,\n // @ts-ignore\n delay\n },\n fallbackInView\n );\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n },\n // We break the rule here, because we aren't including the actual `threshold` variable\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n // If the threshold is an array, convert it to a string, so it won't change between renders.\n Array.isArray(threshold) ? threshold.toString() : threshold,\n ref,\n root,\n rootMargin,\n triggerOnce,\n skip,\n trackVisibility,\n fallbackInView,\n delay\n ]\n );\n const entryTarget = (_a = state.entry) == null ? void 0 : _a.target;\n const previousEntryTarget = React2.useRef();\n if (!ref && entryTarget && !triggerOnce && !skip && previousEntryTarget.current !== entryTarget) {\n previousEntryTarget.current = entryTarget;\n setState({\n inView: !!initialInView,\n entry: void 0\n });\n }\n const result = [setRef, state.inView, state.entry];\n result.ref = result[0];\n result.inView = result[1];\n result.entry = result[2];\n return result;\n}\nexport {\n InView,\n defaultFallbackInView,\n observe,\n useInView\n};\n//# sourceMappingURL=index.mjs.map","\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\nimport { Flight } from 'libs/common/react/index';\n\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\nimport { getAnalyticsRequestKey } from 'libs/shared/utils/AnalyticsRequestUtils';\n\nimport { TopVideoV2 } from 'shared/interfaces';\n\nconst LEGACY_CV_LIVE_CONTENT_TYPE = 'Streamable Learning content';\nconst CV_LIVE_CONTENT_TYPE = 'ClickView Live content';\n\n/**\n * The Videoviews API still reports ClickView Live streams under the product's\n * former name, so relabel them before they are rendered.\n */\nfunction formatCvLiveContentType(data: TopVideoV2[]): TopVideoV2[] {\n if (!Array.isArray(data)) return data;\n\n return data.map(video => (\n video.contentType === LEGACY_CV_LIVE_CONTENT_TYPE ?\n { ...video, contentType: CV_LIVE_CONTENT_TYPE } :\n video\n ));\n}\n\n/**\n * Becasue the V2 endpoints take the user context,\n * userId and customerId cannot be used for these values so instead\n * we are using uid and cid - sha\n */\nfunction formatFilter(filter: AnalyticsRequestFilter) {\n const { userId, customerId, ...rest } = filter;\n return { ...rest, uid: userId, cid: customerId };\n}\n\nexport const VideoViewsV2Requests = {\n aggregation(\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${type}`, formatFilter(filter)),\n key: getAnalyticsRequestKey('video:views:v2:aggregation', filter, type),\n normalize: false\n };\n },\n\n videoAggregation(\n videoId: string,\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/${type}`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:${videoId}`, filter, type),\n normalize: false\n };\n },\n\n aggregationChart(\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/aggregation/${type}/chart`, formatFilter(filter)),\n key: getAnalyticsRequestKey('video:views:v2:aggregation:chart', filter, type),\n normalize: false\n };\n },\n\n videoAggregationChart(\n videoId: string,\n type: StreamAggregationType,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/${type}/chart`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:chart:${videoId}`, filter, type),\n normalize: false\n };\n },\n\n topStreams(limit: number, filter: AnalyticsRequestFilter): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/top`, { ...formatFilter(filter), limit }),\n key: getAnalyticsRequestKey(`video:views:v2:top:streams:${limit}`, filter),\n normalize: false,\n formatData: formatCvLiveContentType\n };\n },\n\n videoHeatMap(\n videoId: string,\n filter: AnalyticsRequestFilter,\n cursor?: string\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/heat-map`, { ...formatFilter(filter), cursor }),\n key: getAnalyticsRequestKey(`video:views:v2:heatmap:${videoId}`, filter, cursor),\n normalize: false\n };\n },\n\n videoHeatMapAggregation(\n videoId: string,\n filter: AnalyticsRequestFilter\n ): Flight.Request {\n return {\n url: UrlHelper.urlBuilder(`{gateway}/v2/analytics/streams/videos/${videoId}/aggregation/heat-map`, formatFilter(filter)),\n key: getAnalyticsRequestKey(`video:views:v2:aggregation:heatmap:${videoId}`, filter),\n normalize: false\n };\n }\n};\n"],"x_google_ignoreList":[2],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{N as e,Qt as t,at as n}from"./CrTgNROp.chunk.js";import{v as r}from"./CxNc1BDX.chunk.js";import{m as i,n as a}from"./Dwe-4MVf.chunk.js";import{t as o}from"./Dsv_eF8a.chunk.js";import{r as s,t as c}from"./2zJwW9wb.chunk.js";import{t as l}from"./BIVEB8w0.chunk.js";import{t as u}from"./
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{N as e,Qt as t,at as n}from"./CrTgNROp.chunk.js";import{v as r}from"./CxNc1BDX.chunk.js";import{m as i,n as a}from"./Dwe-4MVf.chunk.js";import{t as o}from"./Dsv_eF8a.chunk.js";import{r as s,t as c}from"./2zJwW9wb.chunk.js";import{t as l}from"./BIVEB8w0.chunk.js";import{t as u}from"./t8ONdKoR.chunk.js";import{a as d,kt as f,r as p,wt as m,xt as h}from"./app-DW-nP8r1.js";import{i as g,n as _,o as v,r as y,s as b,t as x}from"./BhnToJrk.chunk.js";n();var S=e(),C=c(),w={image:`_image_1a110_1`},T=l.encloseNamespace(`shared.streamsBarChartCardEmptyState`);function E(){return(0,S.jsxs)(p,{className:`flex-grow-1 justify-content-center`,children:[(0,S.jsx)(p.Image,{src:h.EmptyStates.Shared.BagQuestionOrange,className:w.image}),(0,S.jsx)(p.Heading,{className:`h6`,children:T(`heading`)}),(0,S.jsx)(p.Info,{className:`w-100`,children:T(`description`)})]})}var D=`shared.streamsBarChartCard`,O=l.encloseNamespace(D);function k(e){let n=d(`video-views`),o=_(i(e.videoId?u.videoAggregation(e.videoId,e.type,n):u.aggregation(e.type,n)).data,y(e.type)),s=o?.reduce((e,t)=>e+t.y,0);return(0,S.jsx)(`div`,{className:`d-flex flex-column h-100 bg-white overflow-hidden rounded pt-3 px-3`,children:o?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsxs)(`div`,{className:`d-flex justify-content-between`,children:[(0,S.jsx)(`h2`,{className:`h6 mb-1`,children:(0,S.jsx)(a,{namespace:D,phrase:`totalViews`,options:{views:s}})}),e.appLink&&e.appLinkText&&(0,S.jsx)(r,{appLink:e.appLink,className:`text-info`,children:e.appLinkText})]}),o.length?(0,S.jsx)(C.Scrollbars,{className:`position-relative`,children:(0,S.jsx)(`div`,{className:`position-absolute w-100 pe-2`,children:(0,S.jsx)(b,{data:o,labelAnnotations:{"Classroom views":{onClick:()=>{t.trigger({application:f.DEFAULT,action:m.Default.CLASSROOM_VIEWS_POPUP})},tooltip:O(`classroomViewsSettings`)}}})})}):(0,S.jsx)(E,{})]}):(0,S.jsx)(`div`,{className:`partial-loading-background d-block w-50`,children:`\xA0`})})}var A={MONTH:35,YEAR:365},j={day:`YYYY-MM-DD`,month:`YYYY-MM`,year:`YYYY`},M={day:`D MMM`,month:`MMM`,year:`YYYY`};function N(e){let t=o.diffBetween(e.end,e.start,`day`);return t>A.YEAR?`year`:t>A.MONTH?`month`:`day`}function P(e,t){let n=[],r=o.convertUTCToLocal(e.start),i=o.convertUTCToLocal(e.end),a=o.format(r,j[t]);for(;!o.isAfter(a,i,t);)n.push(a),a=o.format(o.add(a,1,t),j[t]);return n}function F(e,t,n){if(!e)return null;let r=N(t),i=P(t,r),a=new Map;e.forEach(e=>{let t=o.format(o.convertUTCToLocal(e.dateStreamed),j[r]),n=[s.System,`255`].includes(e.name)?null:e.name,i=a.get(n);i||a.set(n,i=new Map);let c=i.get(t)??0;i.set(t,c+e.count)});let c=[...a.keys()];if(!c.length)return{categories:i.map(e=>o.format(e,M[r])),data:[]};let l=y(n);return{categories:i.map(e=>o.format(e,M[r])),data:c.map(e=>({name:l(e),type:`line`,data:i.map(t=>a.get(e).get(t)??0),color:g(e)})).sort((e,t)=>v(e.name,t.name))}}var I=`reportsShared.streamsChartCard`,L=l.encloseNamespace(I);function R(e){let n=d(`video-views`),r=F(i(e.videoId?u.videoAggregationChart(e.videoId,e.type,n):u.aggregationChart(e.type,n)).data,n,e.type);return(0,S.jsx)(`div`,{className:`d-flex flex-column h-100 bg-white rounded p-3 position-relative`,children:r?(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(`h2`,{className:`position-absolute h6 mb-1`,children:(0,S.jsx)(a,{namespace:I,phrase:`videoViews`})}),(0,S.jsx)(x,{categories:r.categories,data:r.data,legendAnnotations:{"Classroom views":{onClick:()=>{t.trigger({application:f.DEFAULT,action:m.Default.CLASSROOM_VIEWS_POPUP})},tooltip:L(`classroomViewsSettings`)}}})]}):(0,S.jsx)(`div`,{className:`partial-loading-background w-25`,children:`\xA0`})})}export{k as n,R as t};
|
|
2
|
+
//# sourceMappingURL=v01tmPE-.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CLDXLTBe.chunk.js","names":[],"sources":["../../src/shared/views/overview-cards/streams-bar-chart-card/empty-state/total-views-by-group-card-empty-state.module.scss","../../src/shared/views/overview-cards/streams-bar-chart-card/empty-state/StreamsBarChartCardEmptyState.tsx","../../src/shared/views/overview-cards/streams-bar-chart-card/StreamsBarChartCardView.tsx","../../src/shared/views/overview-cards/streams-chart-card/StreamsChartCardViewUtils.ts","../../src/shared/views/overview-cards/streams-chart-card/StreamsChartCardView.tsx"],"sourcesContent":[":local {\n .image {\n width: 12.5rem;\n height: auto;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nimport { ImageUrls } from 'shared/constants/ReportsImageUrls';\n\nconst namespace = 'shared.streamsBarChartCardEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nimport styles from './total-views-by-group-card-empty-state.module.scss';\n\nexport function StreamsBarChartCardEmptyState() {\n return (\n <EmptyState className='flex-grow-1 justify-content-center'>\n <EmptyState.Image\n src={ImageUrls.EmptyStates.Shared.BagQuestionOrange}\n className={styles.image}\n />\n <EmptyState.Heading className='h6'>\n {getPhrase('heading')}\n </EmptyState.Heading>\n <EmptyState.Info className='w-100'>\n {getPhrase('description')}\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { VerticalBarChart } from 'shared/components/vertical-bar-chart/VerticalBarChart';\nimport { Actions } from 'shared/constants/ReportsActions';\nimport { AppChannels } from 'shared/constants/ReportsRadioChannels';\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\nimport { getCountByGroup } from 'shared/utils/BarChartByGroupUtils';\nimport { getLabelMapper } from 'shared/utils/UserUtils';\nimport { StreamsBarChartCardEmptyState } from 'shared/views/overview-cards/streams-bar-chart-card/empty-state/StreamsBarChartCardEmptyState';\n\nconst namespace = 'shared.streamsBarChartCard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TotalViewsByGroupViewProps {\n type: StreamAggregationType;\n videoId?: string;\n appLink?: Core.AppLink;\n appLinkText?: string;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function StreamsBarChartCardView(props: TotalViewsByGroupViewProps) {\n const requestFilter = useGetRequestFilter('video-views');\n\n const chartData = Flight.useBasicFetch<GroupedAnalyticsCount[]>(props.videoId ?\n VideoViewsV2Requests.videoAggregation(props.videoId, props.type, requestFilter) :\n VideoViewsV2Requests.aggregation(props.type, requestFilter));\n\n const grouped = getCountByGroup(\n chartData.data,\n getLabelMapper(props.type)\n );\n const total = grouped?.reduce((acc, group) => (acc + group.y), 0);\n\n return (\n <div className='d-flex flex-column h-100 bg-white overflow-hidden rounded pt-3 px-3'>\n {grouped ?\n <>\n <div className='d-flex justify-content-between'>\n <h2 className='h6 mb-1'><Text namespace={namespace} phrase='totalViews' options={{ views: total }} /></h2>\n {props.appLink && props.appLinkText &&\n <AppLink\n appLink={props.appLink}\n className='text-info'\n >\n {props.appLinkText}\n </AppLink>\n }\n </div>\n\n {grouped.length ?\n <Scrollbars className='position-relative'>\n <div className='position-absolute w-100 pe-2'>\n <VerticalBarChart data={grouped} labelAnnotations={{\n 'Classroom views': {\n onClick: () => {\n Core.AppLinkHelper.trigger({\n application: AppChannels.DEFAULT,\n action: Actions.Default.CLASSROOM_VIEWS_POPUP\n });\n },\n tooltip: getPhrase('classroomViewsSettings')\n }\n }} />\n </div>\n </Scrollbars> :\n <StreamsBarChartCardEmptyState />\n }\n </> :\n <div className='partial-loading-background d-block w-50'> </div>\n }\n </div >\n );\n}\n","import { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { GroupedAnalyticsChartCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nimport { compareGroupNames } from 'shared/utils/GroupSortUtils';\nimport { getLabelMapper, mapUserTypeToChartColour } from 'shared/utils/UserUtils';\n\nconst GroupByThresholds = {\n MONTH: 35,\n YEAR: 365\n};\n\nconst DateFormats = {\n day: 'YYYY-MM-DD',\n month: 'YYYY-MM',\n year: 'YYYY'\n};\n\nconst DisplayFormats = {\n day: 'D MMM',\n month: 'MMM',\n year: 'YYYY'\n};\n\ntype GroupBy = 'day' | 'month' | 'year';\n\ninterface ChartData {\n categories: string[];\n data: Highcharts.SeriesLineOptions[];\n}\n\nfunction getGroupBy(requestFilter: AnalyticsRequestFilter): GroupBy {\n const range = DateHelper.diffBetween(requestFilter.end, requestFilter.start, 'day');\n\n if (range > GroupByThresholds.YEAR)\n return 'year';\n\n if (range > GroupByThresholds.MONTH)\n return 'month';\n\n return 'day';\n}\n\nfunction getFullDateRange(requestFilter: AnalyticsRequestFilter, groupBy: GroupBy): string[] {\n const range: string[] = [];\n\n const localStart = DateHelper.convertUTCToLocal(requestFilter.start);\n const localEnd = DateHelper.convertUTCToLocal(requestFilter.end);\n\n let currentDate = DateHelper.format(localStart, DateFormats[groupBy]);\n\n while (!DateHelper.isAfter(currentDate, localEnd, groupBy)) {\n range.push(currentDate);\n currentDate = DateHelper.format(DateHelper.add(currentDate, 1, groupBy), DateFormats[groupBy]);\n }\n\n return range;\n}\n\nexport function getChartData(\n events: GroupedAnalyticsChartCount[],\n requestFilter: AnalyticsRequestFilter,\n type: StreamAggregationType\n): ChartData {\n if (!events) return null;\n\n const groupBy = getGroupBy(requestFilter);\n const fullDateRange = getFullDateRange(requestFilter, groupBy);\n \n const grouped = new Map<string, Map<string, number>>();\n \n events.forEach(ev => {\n const eventDate = DateHelper.format(DateHelper.convertUTCToLocal(ev.dateStreamed), DateFormats[groupBy]);\n \n // Bucketing System user data as Anonymous\n const name = [ UserGroup.System, '255' ].includes(ev.name) ? null : ev.name;\n\n let group = grouped.get(name);\n\n if (!group)\n grouped.set(name, group = new Map<string, number>);\n\n const oldCount = group.get(eventDate) ?? 0;\n group.set(eventDate, oldCount + ev.count);\n });\n\n const roles = [...grouped.keys()] as UserGroup[];\n\n if (!roles.length) return {\n categories: fullDateRange.map(d => DateHelper.format(d, DisplayFormats[groupBy])),\n data: []\n };\n\n const labelMapper = getLabelMapper(type);\n\n return {\n categories: fullDateRange.map(d => DateHelper.format(d, DisplayFormats[groupBy])),\n data:\n roles.map(r => ({\n name: labelMapper(r),\n type: 'line' as const,\n data: fullDateRange.map(d => grouped.get(r).get(d) ?? 0),\n color: mapUserTypeToChartColour(r)\n })).sort((a, b) => compareGroupNames(a.name, b.name))\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsChartCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { LineChart } from 'shared/components/line-chart/LineChart';\nimport { Actions } from 'shared/constants/ReportsActions';\nimport { AppChannels } from 'shared/constants/ReportsRadioChannels';\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\n\nimport { getChartData } from './StreamsChartCardViewUtils';\n\nconst namespace = 'reportsShared.streamsChartCard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StreamsChartCardViewProps {\n type: StreamAggregationType;\n videoId?: string;\n className?: string;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function StreamsChartCardView(props: StreamsChartCardViewProps) {\n const requestFilter = useGetRequestFilter('video-views');\n\n const viewsByGroup = Flight.useBasicFetch<GroupedAnalyticsChartCount[]>(props.videoId ?\n VideoViewsV2Requests.videoAggregationChart(props.videoId, props.type, requestFilter) :\n VideoViewsV2Requests.aggregationChart(props.type, requestFilter));\n\n const chartData = getChartData(viewsByGroup.data, requestFilter, props.type);\n\n return (\n <div className='d-flex flex-column h-100 bg-white rounded p-3 position-relative'>\n {chartData ?\n <>\n <h2 className='position-absolute h6 mb-1'><Text namespace={namespace} phrase='videoViews' /></h2>\n <LineChart\n categories={chartData.categories}\n data={chartData.data}\n legendAnnotations={{\n 'Classroom views': {\n onClick: () => {\n Core.AppLinkHelper.trigger({\n application: AppChannels.DEFAULT,\n action: Actions.Default.CLASSROOM_VIEWS_POPUP\n });\n },\n tooltip: getPhrase('classroomViewsSettings')\n }\n }}\n />\n </> :\n <div className='partial-loading-background w-25'> </div>\n }\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"v01tmPE-.chunk.js","names":[],"sources":["../../src/shared/views/overview-cards/streams-bar-chart-card/empty-state/total-views-by-group-card-empty-state.module.scss","../../src/shared/views/overview-cards/streams-bar-chart-card/empty-state/StreamsBarChartCardEmptyState.tsx","../../src/shared/views/overview-cards/streams-bar-chart-card/StreamsBarChartCardView.tsx","../../src/shared/views/overview-cards/streams-chart-card/StreamsChartCardViewUtils.ts","../../src/shared/views/overview-cards/streams-chart-card/StreamsChartCardView.tsx"],"sourcesContent":[":local {\n .image {\n width: 12.5rem;\n height: auto;\n }\n}","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\n\nimport { ImageUrls } from 'shared/constants/ReportsImageUrls';\n\nconst namespace = 'shared.streamsBarChartCardEmptyState';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nimport styles from './total-views-by-group-card-empty-state.module.scss';\n\nexport function StreamsBarChartCardEmptyState() {\n return (\n <EmptyState className='flex-grow-1 justify-content-center'>\n <EmptyState.Image\n src={ImageUrls.EmptyStates.Shared.BagQuestionOrange}\n className={styles.image}\n />\n <EmptyState.Heading className='h6'>\n {getPhrase('heading')}\n </EmptyState.Heading>\n <EmptyState.Info className='w-100'>\n {getPhrase('description')}\n </EmptyState.Info>\n </EmptyState>\n );\n}\n","import React from 'react';\nimport { Scrollbars } from 'react-custom-scrollbars-2';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { AppLink } from 'libs/shared/components/app-link/AppLink';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { VerticalBarChart } from 'shared/components/vertical-bar-chart/VerticalBarChart';\nimport { Actions } from 'shared/constants/ReportsActions';\nimport { AppChannels } from 'shared/constants/ReportsRadioChannels';\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\nimport { getCountByGroup } from 'shared/utils/BarChartByGroupUtils';\nimport { getLabelMapper } from 'shared/utils/UserUtils';\nimport { StreamsBarChartCardEmptyState } from 'shared/views/overview-cards/streams-bar-chart-card/empty-state/StreamsBarChartCardEmptyState';\n\nconst namespace = 'shared.streamsBarChartCard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface TotalViewsByGroupViewProps {\n type: StreamAggregationType;\n videoId?: string;\n appLink?: Core.AppLink;\n appLinkText?: string;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function StreamsBarChartCardView(props: TotalViewsByGroupViewProps) {\n const requestFilter = useGetRequestFilter('video-views');\n\n const chartData = Flight.useBasicFetch<GroupedAnalyticsCount[]>(props.videoId ?\n VideoViewsV2Requests.videoAggregation(props.videoId, props.type, requestFilter) :\n VideoViewsV2Requests.aggregation(props.type, requestFilter));\n\n const grouped = getCountByGroup(\n chartData.data,\n getLabelMapper(props.type)\n );\n const total = grouped?.reduce((acc, group) => (acc + group.y), 0);\n\n return (\n <div className='d-flex flex-column h-100 bg-white overflow-hidden rounded pt-3 px-3'>\n {grouped ?\n <>\n <div className='d-flex justify-content-between'>\n <h2 className='h6 mb-1'><Text namespace={namespace} phrase='totalViews' options={{ views: total }} /></h2>\n {props.appLink && props.appLinkText &&\n <AppLink\n appLink={props.appLink}\n className='text-info'\n >\n {props.appLinkText}\n </AppLink>\n }\n </div>\n\n {grouped.length ?\n <Scrollbars className='position-relative'>\n <div className='position-absolute w-100 pe-2'>\n <VerticalBarChart data={grouped} labelAnnotations={{\n 'Classroom views': {\n onClick: () => {\n Core.AppLinkHelper.trigger({\n application: AppChannels.DEFAULT,\n action: Actions.Default.CLASSROOM_VIEWS_POPUP\n });\n },\n tooltip: getPhrase('classroomViewsSettings')\n }\n }} />\n </div>\n </Scrollbars> :\n <StreamsBarChartCardEmptyState />\n }\n </> :\n <div className='partial-loading-background d-block w-50'> </div>\n }\n </div >\n );\n}\n","import { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { GroupedAnalyticsChartCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { UserGroup } from 'libs/shared/enums/UserGroup';\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\nimport { compareGroupNames } from 'shared/utils/GroupSortUtils';\nimport { getLabelMapper, mapUserTypeToChartColour } from 'shared/utils/UserUtils';\n\nconst GroupByThresholds = {\n MONTH: 35,\n YEAR: 365\n};\n\nconst DateFormats = {\n day: 'YYYY-MM-DD',\n month: 'YYYY-MM',\n year: 'YYYY'\n};\n\nconst DisplayFormats = {\n day: 'D MMM',\n month: 'MMM',\n year: 'YYYY'\n};\n\ntype GroupBy = 'day' | 'month' | 'year';\n\ninterface ChartData {\n categories: string[];\n data: Highcharts.SeriesLineOptions[];\n}\n\nfunction getGroupBy(requestFilter: AnalyticsRequestFilter): GroupBy {\n const range = DateHelper.diffBetween(requestFilter.end, requestFilter.start, 'day');\n\n if (range > GroupByThresholds.YEAR)\n return 'year';\n\n if (range > GroupByThresholds.MONTH)\n return 'month';\n\n return 'day';\n}\n\nfunction getFullDateRange(requestFilter: AnalyticsRequestFilter, groupBy: GroupBy): string[] {\n const range: string[] = [];\n\n const localStart = DateHelper.convertUTCToLocal(requestFilter.start);\n const localEnd = DateHelper.convertUTCToLocal(requestFilter.end);\n\n let currentDate = DateHelper.format(localStart, DateFormats[groupBy]);\n\n while (!DateHelper.isAfter(currentDate, localEnd, groupBy)) {\n range.push(currentDate);\n currentDate = DateHelper.format(DateHelper.add(currentDate, 1, groupBy), DateFormats[groupBy]);\n }\n\n return range;\n}\n\nexport function getChartData(\n events: GroupedAnalyticsChartCount[],\n requestFilter: AnalyticsRequestFilter,\n type: StreamAggregationType\n): ChartData {\n if (!events) return null;\n\n const groupBy = getGroupBy(requestFilter);\n const fullDateRange = getFullDateRange(requestFilter, groupBy);\n \n const grouped = new Map<string, Map<string, number>>();\n \n events.forEach(ev => {\n const eventDate = DateHelper.format(DateHelper.convertUTCToLocal(ev.dateStreamed), DateFormats[groupBy]);\n \n // Bucketing System user data as Anonymous\n const name = [ UserGroup.System, '255' ].includes(ev.name) ? null : ev.name;\n\n let group = grouped.get(name);\n\n if (!group)\n grouped.set(name, group = new Map<string, number>);\n\n const oldCount = group.get(eventDate) ?? 0;\n group.set(eventDate, oldCount + ev.count);\n });\n\n const roles = [...grouped.keys()] as UserGroup[];\n\n if (!roles.length) return {\n categories: fullDateRange.map(d => DateHelper.format(d, DisplayFormats[groupBy])),\n data: []\n };\n\n const labelMapper = getLabelMapper(type);\n\n return {\n categories: fullDateRange.map(d => DateHelper.format(d, DisplayFormats[groupBy])),\n data:\n roles.map(r => ({\n name: labelMapper(r),\n type: 'line' as const,\n data: fullDateRange.map(d => grouped.get(r).get(d) ?? 0),\n color: mapUserTypeToChartColour(r)\n })).sort((a, b) => compareGroupNames(a.name, b.name))\n };\n}\n","import React from 'react';\n\nimport { Core } from 'libs/common/backbone/index';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/react/index';\n\nimport { GroupedAnalyticsChartCount } from 'libs/shared/apps/analytics/interfaces/BaseAnalyticsEvent';\nimport { StreamAggregationType } from 'libs/shared/apps/analytics/interfaces/StreamAggregationType';\nimport { Text } from 'libs/shared/components/text/Text';\n\nimport { LineChart } from 'shared/components/line-chart/LineChart';\nimport { Actions } from 'shared/constants/ReportsActions';\nimport { AppChannels } from 'shared/constants/ReportsRadioChannels';\nimport { VideoViewsV2Requests } from 'shared/flight-requests/VideoViewsV2Requests';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\n\nimport { getChartData } from './StreamsChartCardViewUtils';\n\nconst namespace = 'reportsShared.streamsChartCard';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface StreamsChartCardViewProps {\n type: StreamAggregationType;\n videoId?: string;\n className?: string;\n}\n\n// eslint-disable-next-line rulesdir/require-view-title\nexport function StreamsChartCardView(props: StreamsChartCardViewProps) {\n const requestFilter = useGetRequestFilter('video-views');\n\n const viewsByGroup = Flight.useBasicFetch<GroupedAnalyticsChartCount[]>(props.videoId ?\n VideoViewsV2Requests.videoAggregationChart(props.videoId, props.type, requestFilter) :\n VideoViewsV2Requests.aggregationChart(props.type, requestFilter));\n\n const chartData = getChartData(viewsByGroup.data, requestFilter, props.type);\n\n return (\n <div className='d-flex flex-column h-100 bg-white rounded p-3 position-relative'>\n {chartData ?\n <>\n <h2 className='position-absolute h6 mb-1'><Text namespace={namespace} phrase='videoViews' /></h2>\n <LineChart\n categories={chartData.categories}\n data={chartData.data}\n legendAnnotations={{\n 'Classroom views': {\n onClick: () => {\n Core.AppLinkHelper.trigger({\n application: AppChannels.DEFAULT,\n action: Actions.Default.CLASSROOM_VIEWS_POPUP\n });\n },\n tooltip: getPhrase('classroomViewsSettings')\n }\n }}\n />\n </> :\n <div className='partial-loading-background w-25'> </div>\n }\n </div>\n );\n}\n"],"mappings":"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"}
|