@clickview/reports 0.85.0-rc.1 → 0.85.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 +254 -254
- package/dist/bundles.json +1 -1
- package/dist/en.json +1 -1
- package/dist/scripts/{Udxe63DQ.chunk.js → 1QInraEU.chunk.js} +2 -2
- package/dist/scripts/{Udxe63DQ.chunk.js.map → 1QInraEU.chunk.js.map} +1 -1
- package/dist/scripts/{1pdbKMyH.chunk.js → BKiOvaYB.chunk.js} +2 -2
- package/dist/scripts/{1pdbKMyH.chunk.js.map → BKiOvaYB.chunk.js.map} +1 -1
- package/dist/scripts/{3q7nyVif2.chunk.js → BLOn55yc2.chunk.js} +2 -2
- package/dist/scripts/{3q7nyVif2.chunk.js.map → BLOn55yc2.chunk.js.map} +1 -1
- package/dist/scripts/{c7dUmf3R.chunk.js → BQRq3wMq.chunk.js} +2 -2
- package/dist/scripts/{c7dUmf3R.chunk.js.map → BQRq3wMq.chunk.js.map} +1 -1
- package/dist/scripts/{ktNy7dHM2.chunk.js → BVYWFaVq2.chunk.js} +2 -2
- package/dist/scripts/{ktNy7dHM2.chunk.js.map → BVYWFaVq2.chunk.js.map} +1 -1
- package/dist/scripts/{Bua2prVk2.chunk.js → BYg4x7Hk2.chunk.js} +2 -2
- package/dist/scripts/{Bua2prVk2.chunk.js.map → BYg4x7Hk2.chunk.js.map} +1 -1
- package/dist/scripts/{BpzXy-5d.chunk.js → CCJmvNz9.chunk.js} +2 -2
- package/dist/scripts/{BpzXy-5d.chunk.js.map → CCJmvNz9.chunk.js.map} +1 -1
- package/dist/scripts/{B9S_LeFP.chunk.js → CJ_C4cSo.chunk.js} +2 -2
- package/dist/scripts/{B9S_LeFP.chunk.js.map → CJ_C4cSo.chunk.js.map} +1 -1
- package/dist/scripts/{2MxiB_er.chunk.js → CJrWNjmQ.chunk.js} +2 -2
- package/dist/scripts/{2MxiB_er.chunk.js.map → CJrWNjmQ.chunk.js.map} +1 -1
- package/dist/scripts/{BfhdSOSX2.chunk.js → CLJ99uF52.chunk.js} +2 -2
- package/dist/scripts/{BfhdSOSX2.chunk.js.map → CLJ99uF52.chunk.js.map} +1 -1
- package/dist/scripts/{Bx5qk-PZ.chunk.js → CrWahilx.chunk.js} +3 -3
- package/dist/scripts/{Bx5qk-PZ.chunk.js.map → CrWahilx.chunk.js.map} +1 -1
- package/dist/scripts/{3EzrYsbw2.chunk.js → CweBHuQE2.chunk.js} +2 -2
- package/dist/scripts/{3EzrYsbw2.chunk.js.map → CweBHuQE2.chunk.js.map} +1 -1
- package/dist/scripts/{CJIwkABI.chunk.js → D1qCdqwU.chunk.js} +2 -2
- package/dist/scripts/{CJIwkABI.chunk.js.map → D1qCdqwU.chunk.js.map} +1 -1
- package/dist/scripts/{DTy5e0Yv2.chunk.js → DLVy0r752.chunk.js} +2 -2
- package/dist/scripts/{DTy5e0Yv2.chunk.js.map → DLVy0r752.chunk.js.map} +1 -1
- package/dist/scripts/{n2iCrpxU.chunk.js → DPOQnXtj.chunk.js} +2 -2
- package/dist/scripts/{n2iCrpxU.chunk.js.map → DPOQnXtj.chunk.js.map} +1 -1
- package/dist/scripts/{DMI-Lxl02.chunk.js → DUl1SIxT2.chunk.js} +2 -2
- package/dist/scripts/{DMI-Lxl02.chunk.js.map → DUl1SIxT2.chunk.js.map} +1 -1
- package/dist/scripts/{r-dVoZ7W2.chunk.js → DX0X_jLv2.chunk.js} +2 -2
- package/dist/scripts/{r-dVoZ7W2.chunk.js.map → DX0X_jLv2.chunk.js.map} +1 -1
- package/dist/scripts/{CCLDpjnt2.chunk.js → DhuQHM9r2.chunk.js} +2 -2
- package/dist/scripts/{CCLDpjnt2.chunk.js.map → DhuQHM9r2.chunk.js.map} +1 -1
- package/dist/scripts/{CKVaLGJC.chunk.js → DuhdxQvW.chunk.js} +2 -2
- package/dist/scripts/{CKVaLGJC.chunk.js.map → DuhdxQvW.chunk.js.map} +1 -1
- package/dist/scripts/{BvNaANAO2.chunk.js → Dxn4eKcF2.chunk.js} +2 -2
- package/dist/scripts/{BvNaANAO2.chunk.js.map → Dxn4eKcF2.chunk.js.map} +1 -1
- package/dist/scripts/{BKW2JeVr.chunk.js → DzrBVuW7.chunk.js} +2 -2
- package/dist/scripts/{BKW2JeVr.chunk.js.map → DzrBVuW7.chunk.js.map} +1 -1
- package/dist/scripts/{CMKPCLR42.chunk.js → GphIKxTp2.chunk.js} +2 -2
- package/dist/scripts/{CMKPCLR42.chunk.js.map → GphIKxTp2.chunk.js.map} +1 -1
- package/dist/scripts/{CqCz1X85.chunk.js → J1C7-I-X.chunk.js} +2 -2
- package/dist/scripts/{CqCz1X85.chunk.js.map → J1C7-I-X.chunk.js.map} +1 -1
- package/dist/scripts/{BnfA2fln.chunk.js → Jx7lSD0p.chunk.js} +2 -2
- package/dist/scripts/{BnfA2fln.chunk.js.map → Jx7lSD0p.chunk.js.map} +1 -1
- package/dist/scripts/LEHDmMO5.chunk.js +1 -0
- package/dist/scripts/{Cpm-LpwK.chunk.js → VmHmm_9S.chunk.js} +2 -2
- package/dist/scripts/{Cpm-LpwK.chunk.js.map → VmHmm_9S.chunk.js.map} +1 -1
- package/dist/scripts/{app-BigOHyYp.js → app-CYtIuHZu.js} +4 -4
- package/dist/scripts/app-CYtIuHZu.js.map +1 -0
- package/dist/scripts/{DgPadkLi2.chunk.js → d-7NhDV82.chunk.js} +2 -2
- package/dist/scripts/{DgPadkLi2.chunk.js.map → d-7NhDV82.chunk.js.map} +1 -1
- package/dist/scripts/{ClOZ7MLV.chunk.js → jid_wNb7.chunk.js} +2 -2
- package/dist/scripts/{ClOZ7MLV.chunk.js.map → jid_wNb7.chunk.js.map} +1 -1
- package/dist/scripts/moDT6wFa.chunk.js +1 -0
- package/dist/scripts/{CKRKdk5U.chunk.js → qK0CbwPW.chunk.js} +2 -2
- package/dist/scripts/{CKRKdk5U.chunk.js.map → qK0CbwPW.chunk.js.map} +1 -1
- package/dist/scripts/{CowZxgkl2.chunk.js → voEp8KSU2.chunk.js} +2 -2
- package/dist/scripts/{CowZxgkl2.chunk.js.map → voEp8KSU2.chunk.js.map} +1 -1
- package/package.json +1 -1
- package/dist/scripts/Bs1YLdQb.chunk.js +0 -1
- package/dist/scripts/Cah5ISd-.chunk.js +0 -1
- package/dist/scripts/app-BigOHyYp.js.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Jn as e,N as t,P as n,Q as r,U as i,et as a,st as o,z as s}from"./CM0wW4AE.chunk.js";import{n as c,p as l}from"./dUFTODMz.chunk.js";import{t as u}from"./I5Dnl_eN.chunk.js";import{t as d}from"./CnyxksnC.chunk.js";import{t as f}from"./dSmIXyxJ.chunk.js";import{b as p,s as m}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{Jn as e,N as t,P as n,Q as r,U as i,et as a,st as o,z as s}from"./CM0wW4AE.chunk.js";import{n as c,p as l}from"./dUFTODMz.chunk.js";import{t as u}from"./I5Dnl_eN.chunk.js";import{t as d}from"./CnyxksnC.chunk.js";import{t as f}from"./dSmIXyxJ.chunk.js";import{b as p,s as m}from"./app-CYtIuHZu.js";import{t as h}from"./C1BFkCSD2.chunk.js";var g=e(o()),_=n(),v=`reports.removeLogo`,y=u.encloseNamespace(v);function b(e){let[n,o]=g.useState(!1),u=l(),b=h(),x=p();async function S(){o(!0);try{await u(m.removeLogo(e.customerId,e.logoId)),b.success(y(x?`successTertiary`:`success`)),t.logUserAction({id:e.logoId},{actionType:r.Remove,entity:s.Logo,workflowPhase:a.Complete,location:i.Popup}),e.closePopup()}catch{b.success(y(x?`errorTertiary`:`error`)),o(!1)}}return(0,_.jsxs)(d,{closePopup:e.closePopup,title:y(x?`removeSchoolCrestTertiary`:`removeSchoolCrest`),children:[(0,_.jsx)(`p`,{children:(0,_.jsx)(c,{namespace:v,phrase:x?`areYouSureTertiary`:`areYouSure`})}),(0,_.jsxs)(f,{children:[(0,_.jsx)(f.Cancel,{onClick:e.closePopup}),(0,_.jsx)(f.Submit,{onClick:S,text:y(`remove`),showSpinner:n,variant:`danger`})]})]})}export{b as RemoveLogoView};
|
|
2
|
+
//# sourceMappingURL=DzrBVuW7.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"DzrBVuW7.chunk.js","names":[],"sources":["../../src/shared/views/remove-logo/RemoveLogoView.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsHelper } from 'libs/analytics/AnalyticsHelper';\nimport { EntityType, LocationContext, UserAction, WorkflowPhase } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PopupViewProps } from 'libs/shared/interfaces';\n\nimport { LogoRequests } from 'shared/flight-requests/LogoRequests';\nimport { useIsTertiary } from 'shared/hooks/useIsTertiary';\n\nconst namespace = 'reports.removeLogo';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\ninterface RemoveLogoViewProps extends PopupViewProps {\n logoId: string;\n customerId: string;\n}\n\nexport function RemoveLogoView(props: RemoveLogoViewProps): JSX.Element {\n const [ showSpinner, setShowSpinner ] = React.useState(false);\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n const alerts = useAlerts();\n const isTertiary = useIsTertiary();\n\n async function onClickRemove(): Promise<void> {\n setShowSpinner(true);\n\n try {\n await fetchAsync(LogoRequests.removeLogo(props.customerId, props.logoId));\n\n alerts.success(getPhrase(isTertiary ? 'successTertiary' : 'success'));\n\n AnalyticsHelper.logUserAction({\n id: props.logoId\n }, {\n actionType: UserAction.Remove,\n entity: EntityType.Logo,\n workflowPhase: WorkflowPhase.Complete,\n location: LocationContext.Popup\n });\n\n props.closePopup();\n } catch {\n alerts.success(getPhrase(isTertiary ? 'errorTertiary' : 'error'));\n setShowSpinner(false);\n }\n }\n\n return (\n <Popup\n closePopup={props.closePopup}\n title={isTertiary ? getPhrase('removeSchoolCrestTertiary') : getPhrase('removeSchoolCrest')}\n >\n <p><Text namespace={namespace} phrase={isTertiary ? 'areYouSureTertiary' : 'areYouSure'} /></p>\n\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n onClick={onClickRemove}\n text={getPhrase('remove')}\n showSpinner={showSpinner}\n variant='danger'\n />\n </PopupButtons>\n </Popup>\n );\n}\n"],"mappings":"4WAiBM,EAAY,qBACZ,EAAY,EAAgB,iBAAiB,EAAU,CAO7D,SAAgB,EAAe,EAAyC,CACtE,GAAM,CAAE,EAAa,GAAA,EAAyB,SAAS,GAAM,CAEvD,EAAa,GAAyB,CAEtC,EAAS,GAAW,CACpB,EAAa,GAAe,CAElC,eAAe,GAA+B,CAC5C,EAAe,GAAK,CAEpB,GAAI,CACF,MAAM,EAAW,EAAa,WAAW,EAAM,WAAY,EAAM,OAAO,CAAC,CAEzE,EAAO,QAAQ,EAAU,EAAa,kBAAoB,UAAU,CAAC,CAErE,EAAgB,cAAc,CAC5B,GAAI,EAAM,OACX,CAAE,CACD,WAAY,EAAW,OACvB,OAAQ,EAAW,KACnB,cAAe,EAAc,SAC7B,SAAU,EAAgB,MAC3B,CAAC,CAEF,EAAM,YAAY,MACZ,CACN,EAAO,QAAQ,EAAU,EAAa,gBAAkB,QAAQ,CAAC,CACjE,EAAe,GAAM,EAIzB,OACE,EAAA,EAAA,MAAC,EAAD,CACE,WAAY,EAAM,WAClB,MAAoB,EAAb,EAAuB,4BAAyC,oBAAoB,UAF7F,EAIE,EAAA,EAAA,KAAC,IAAD,CAAA,UAAG,EAAA,EAAA,KAAC,EAAD,CAAiB,YAAW,OAAQ,EAAa,qBAAuB,aAAgB,CAAA,CAAI,CAAA,EAE/F,EAAA,EAAA,MAAC,EAAD,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,EAAa,OAAd,CAAqB,QAAS,EAAM,WAAc,CAAA,EAClD,EAAA,EAAA,KAAC,EAAa,OAAd,CACE,QAAS,EACT,KAAM,EAAU,SAAS,CACZ,cACb,QAAQ,SACR,CAAA,CACW,CAAA,CAAA,CACT"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{P as e,nn as t,st as n}from"./CM0wW4AE.chunk.js";import{v as r}from"./B01-hGyk.chunk.js";import{d as i,n as a}from"./dUFTODMz.chunk.js";import{t as o}from"./CjM_tQvd.chunk.js";import{r as s,t as c}from"./NaTUzw6f.chunk.js";import{t as l}from"./I5Dnl_eN.chunk.js";import{n as u,r as d,t as f}from"./H5KLIhR_.chunk.js";import{t as p}from"./DIAxWspB.chunk.js";import{r as m}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{P as e,nn as t,st as n}from"./CM0wW4AE.chunk.js";import{v as r}from"./B01-hGyk.chunk.js";import{d as i,n as a}from"./dUFTODMz.chunk.js";import{t as o}from"./CjM_tQvd.chunk.js";import{r as s,t as c}from"./NaTUzw6f.chunk.js";import{t as l}from"./I5Dnl_eN.chunk.js";import{n as u,r as d,t as f}from"./H5KLIhR_.chunk.js";import{t as p}from"./DIAxWspB.chunk.js";import{r as m}from"./app-CYtIuHZu.js";import{t as h}from"./BVYWFaVq2.chunk.js";import{i as g,n as _,o as v,r as y,s as b,t as x}from"./DhuQHM9r2.chunk.js";var S={image:`_image_1a110_1`};n();var C=e(),w=l.encloseNamespace(`shared.streamsBarChartCardEmptyState`);function T(){return(0,C.jsxs)(p,{className:`flex-grow-1 justify-content-center`,children:[(0,C.jsx)(p.Image,{src:f.EmptyStates.Shared.BagQuestionOrange,className:S.image}),(0,C.jsx)(p.Heading,{className:`h6`,children:w(`heading`)}),(0,C.jsx)(p.Info,{className:`w-100`,children:w(`description`)})]})}var E=c(),D=`shared.streamsBarChartCard`,O=l.encloseNamespace(D);function k(e){let n=m(`video-views`),o=_(i(e.videoId?h.videoAggregation(e.videoId,e.type,n):h.aggregation(e.type,n)).data,y(e.type)),s=o?.reduce((e,t)=>e+t.y,0);return(0,C.jsx)(`div`,{className:`d-flex flex-column h-100 bg-white overflow-hidden rounded pt-3 px-3`,children:o?(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(`div`,{className:`d-flex justify-content-between`,children:[(0,C.jsx)(`h2`,{className:`h6 mb-1`,children:(0,C.jsx)(a,{namespace:D,phrase:`totalViews`,options:{views:s}})}),e.appLink&&e.appLinkText&&(0,C.jsx)(r,{appLink:e.appLink,className:`text-info`,children:e.appLinkText})]}),o.length?(0,C.jsx)(E.Scrollbars,{className:`position-relative`,children:(0,C.jsx)(`div`,{className:`position-absolute w-100 pe-2`,children:(0,C.jsx)(b,{data:o,labelAnnotations:{"Classroom views":{onClick:()=>{t.trigger({application:d.DEFAULT,action:u.Default.CLASSROOM_VIEWS_POPUP})},tooltip:O(`classroomViewsSettings`)}}})})}):(0,C.jsx)(T,{})]}):(0,C.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=m(`video-views`),r=F(i(e.videoId?h.videoAggregationChart(e.videoId,e.type,n):h.aggregationChart(e.type,n)).data,n,e.type);return(0,C.jsx)(`div`,{className:`d-flex flex-column h-100 bg-white rounded p-3 position-relative`,children:r?(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`h2`,{className:`position-absolute h6 mb-1`,children:(0,C.jsx)(a,{namespace:I,phrase:`videoViews`})}),(0,C.jsx)(x,{categories:r.categories,data:r.data,legendAnnotations:{"Classroom views":{onClick:()=>{t.trigger({application:d.DEFAULT,action:u.Default.CLASSROOM_VIEWS_POPUP})},tooltip:L(`classroomViewsSettings`)}}})]}):(0,C.jsx)(`div`,{className:`partial-loading-background w-25`,children:`\xA0`})})}export{k as n,R as t};
|
|
2
|
+
//# sourceMappingURL=GphIKxTp2.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CMKPCLR42.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":"GphIKxTp2.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":"ojBCSM,EAAY,EAAgB,iBADhB,uCAC2C,CAI7D,SAAgB,GAAgC,CAC9C,OACE,EAAA,EAAA,MAAC,EAAD,CAAY,UAAU,8CAAtB,EACE,EAAA,EAAA,KAAC,EAAW,MAAZ,CACE,IAAK,EAAU,YAAY,OAAO,kBAClC,UAAW,EAAO,MAClB,CAAA,EACF,EAAA,EAAA,KAAC,EAAW,QAAZ,CAAoB,UAAU,cAC3B,EAAU,UAAU,CACF,CAAA,EACrB,EAAA,EAAA,KAAC,EAAW,KAAZ,CAAiB,UAAU,iBACxB,EAAU,cAAc,CACT,CAAA,CACP,aCLX,EAAY,6BACZ,EAAY,EAAgB,iBAAiB,EAAU,CAU7D,SAAgB,EAAwB,EAAmC,CACzE,IAAM,EAAgB,EAAoB,cAAc,CAMlD,EAAU,EAJE,EAA8C,EAAM,QACpE,EAAqB,iBAAiB,EAAM,QAAS,EAAM,KAAM,EAAc,CAC/E,EAAqB,YAAY,EAAM,KAAM,EAAc,CAAC,CAGlD,KACV,EAAe,EAAM,KAAK,CAC3B,CACK,EAAQ,GAAS,QAAQ,EAAK,IAAW,EAAM,EAAM,EAAI,EAAE,CAEjE,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,+EACZ,GACC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,MAAC,MAAD,CAAK,UAAU,0CAAf,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,oBAAU,EAAA,EAAA,KAAC,EAAD,CAAiB,UAAA,EAAW,OAAO,aAAa,QAAS,CAAE,MAAO,EAAO,CAAI,CAAA,CAAK,CAAA,CACzG,EAAM,SAAW,EAAM,cACtB,EAAA,EAAA,KAAC,EAAD,CACE,QAAS,EAAM,QACf,UAAU,qBAET,EAAM,YACC,CAAA,CAER,GAEL,EAAQ,QACP,EAAA,EAAA,KAAC,EAAA,WAAD,CAAY,UAAU,8BACpB,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,yCACb,EAAA,EAAA,KAAC,EAAD,CAAkB,KAAM,EAAS,iBAAkB,CACjD,kBAAmB,CACjB,YAAe,CACb,EAAmB,QAAQ,CACzB,YAAa,EAAY,QACzB,OAAQ,EAAQ,QAAQ,sBACzB,CAAC,EAEJ,QAAS,EAAU,yBAAyB,CAC7C,CACF,CAAI,CAAA,CACD,CAAA,CACK,CAAA,EACb,EAAA,EAAA,KAAC,EAAD,EAAiC,CAAA,CAElC,CAAA,CAAA,EACH,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,mDAA0C,OAAY,CAAA,CAElE,CAAA,CCxEX,IAAM,EAAoB,CACxB,MAAO,GACP,KAAM,IACP,CAEK,EAAc,CAClB,IAAK,aACL,MAAO,UACP,KAAM,OACP,CAEK,EAAiB,CACrB,IAAK,QACL,MAAO,MACP,KAAM,OACP,CASD,SAAS,EAAW,EAAgD,CAClE,IAAM,EAAQ,EAAW,YAAY,EAAc,IAAK,EAAc,MAAO,MAAM,CAQnF,OANI,EAAQ,EAAkB,KACrB,OAEL,EAAQ,EAAkB,MACrB,QAEF,MAGT,SAAS,EAAiB,EAAuC,EAA4B,CAC3F,IAAM,EAAkB,EAAE,CAEpB,EAAa,EAAW,kBAAkB,EAAc,MAAM,CAC9D,EAAW,EAAW,kBAAkB,EAAc,IAAI,CAE5D,EAAc,EAAW,OAAO,EAAY,EAAY,GAAS,CAErE,KAAO,CAAC,EAAW,QAAQ,EAAa,EAAU,EAAQ,EACxD,EAAM,KAAK,EAAY,CACvB,EAAc,EAAW,OAAO,EAAW,IAAI,EAAa,EAAG,EAAQ,CAAE,EAAY,GAAS,CAGhG,OAAO,EAGT,SAAgB,EACd,EACA,EACA,EACW,CACX,GAAI,CAAC,EAAQ,OAAO,KAEpB,IAAM,EAAU,EAAW,EAAc,CACnC,EAAgB,EAAiB,EAAe,EAAQ,CAExD,EAAU,IAAI,IAEpB,EAAO,QAAQ,GAAM,CACnB,IAAM,EAAY,EAAW,OAAO,EAAW,kBAAkB,EAAG,aAAa,CAAE,EAAY,GAAS,CAGlG,EAAO,CAAE,EAAU,OAAQ,MAAO,CAAC,SAAS,EAAG,KAAK,CAAG,KAAO,EAAG,KAEnE,EAAQ,EAAQ,IAAI,EAAK,CAExB,GACH,EAAQ,IAAI,EAAM,EAAQ,IAAI,IAAoB,CAEpD,IAAM,EAAW,EAAM,IAAI,EAAU,EAAI,EACzC,EAAM,IAAI,EAAW,EAAW,EAAG,MAAM,EACzC,CAEF,IAAM,EAAQ,CAAC,GAAG,EAAQ,MAAM,CAAC,CAEjC,GAAI,CAAC,EAAM,OAAQ,MAAO,CACxB,WAAY,EAAc,IAAI,GAAK,EAAW,OAAO,EAAG,EAAe,GAAS,CAAC,CACjF,KAAM,EAAE,CACT,CAED,IAAM,EAAc,EAAe,EAAK,CAExC,MAAO,CACL,WAAY,EAAc,IAAI,GAAK,EAAW,OAAO,EAAG,EAAe,GAAS,CAAC,CACjF,KACE,EAAM,IAAI,IAAM,CACd,KAAM,EAAY,EAAE,CACpB,KAAM,OACN,KAAM,EAAc,IAAI,GAAK,EAAQ,IAAI,EAAE,CAAC,IAAI,EAAE,EAAI,EAAE,CACxD,MAAO,EAAyB,EAAE,CACnC,EAAE,CAAC,MAAM,EAAG,IAAM,EAAkB,EAAE,KAAM,EAAE,KAAK,CAAC,CACxD,CCzFH,IAAM,EAAY,iCACZ,EAAY,EAAgB,iBAAiB,EAAU,CAS7D,SAAgB,EAAqB,EAAkC,CACrE,IAAM,EAAgB,EAAoB,cAAc,CAMlD,EAAY,EAJG,EAAmD,EAAM,QAC5E,EAAqB,sBAAsB,EAAM,QAAS,EAAM,KAAM,EAAc,CACpF,EAAqB,iBAAiB,EAAM,KAAM,EAAc,CAAC,CAEvB,KAAM,EAAe,EAAM,KAAK,CAE5E,OACE,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2EACZ,GACC,EAAA,EAAA,MAAA,EAAA,SAAA,CAAA,SAAA,EACE,EAAA,EAAA,KAAC,KAAD,CAAI,UAAU,sCAA4B,EAAA,EAAA,KAAC,EAAD,CAAiB,YAAW,OAAO,aAAe,CAAA,CAAK,CAAA,EACjG,EAAA,EAAA,KAAC,EAAD,CACE,WAAY,EAAU,WACtB,KAAM,EAAU,KAChB,kBAAmB,CACjB,kBAAmB,CACjB,YAAe,CACb,EAAmB,QAAQ,CACzB,YAAa,EAAY,QACzB,OAAQ,EAAQ,QAAQ,sBACzB,CAAC,EAEJ,QAAS,EAAU,yBAAyB,CAC7C,CACF,CACD,CAAA,CACD,CAAA,CAAA,EACH,EAAA,EAAA,KAAC,MAAD,CAAK,UAAU,2CAAkC,OAAY,CAAA,CAE3D,CAAA"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{P as e,Zt as t,st as n}from"./CM0wW4AE.chunk.js";import{i as r}from"./S6AM6CLE.chunk.js";import{b as i,d as a,n as o,p as s,t as c}from"./dUFTODMz.chunk.js";import{t as l}from"./CjM_tQvd.chunk.js";import{n as u}from"./CNQKHXPY.chunk.js";import{t as d}from"./I5Dnl_eN.chunk.js";import{t as f}from"./CO7H3BC5.chunk.js";import{t as p}from"./DGCz68te.chunk.js";import{t as m}from"./CnyxksnC.chunk.js";import{t as h}from"./dSmIXyxJ.chunk.js";import{at as g,r as _,tt as v}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{P as e,Zt as t,st as n}from"./CM0wW4AE.chunk.js";import{i as r}from"./S6AM6CLE.chunk.js";import{b as i,d as a,n as o,p as s,t as c}from"./dUFTODMz.chunk.js";import{t as l}from"./CjM_tQvd.chunk.js";import{n as u}from"./CNQKHXPY.chunk.js";import{t as d}from"./I5Dnl_eN.chunk.js";import{t as f}from"./CO7H3BC5.chunk.js";import{t as p}from"./DGCz68te.chunk.js";import{t as m}from"./CnyxksnC.chunk.js";import{t as h}from"./dSmIXyxJ.chunk.js";import{at as g,r as _,tt as v}from"./app-CYtIuHZu.js";import{t as y}from"./C1BFkCSD2.chunk.js";var b=`shared.verifiedEmailError`,x=class extends p{constructor(e,t,n){super(`VerifiedEmailRequiredError`),this.message=e,this.liteUrl=t,this.hasLite=n}get name(){return`VerifiedEmailRequiredError`}get dialogOptions(){let e=u.safeUrlConcat(this.liteUrl,`settings/account`);return{title:d.getPhrase(b,`heading`),text:this.hasLite?`${this.message} ${d.getPhrase(b,`visitSettings`,{href:e})}`:this.message,buttons:[{text:d.getPhrase(b,`close`),className:`btn btn-dark`,success:!0}]}}},S=()=>{let e=a(a(r.currentUser()).data?.isAuthenticated&&v.userProducts()),t=!e.hasCompleted;return{hasProduct:n=>t||e.hasError||!e.data?.length?!1:e.data.some(e=>e.id===n),products:e,isLoadingProducts:t}};function C(){let e=y(),{hasProduct:n,isLoadingProducts:r}=S(),i=a(g.config());function o(r,a,o){if(!r.responseJSON||r.responseJSON?.type!==`no-email`){e.error(a);return}t.throw(new x(o,i.data.liteUrl,n(f.Primary)))}return{handleGenerateReportError:o,loading:!i.hasCompleted||r}}function w(e){return{dateRange:{start:e.start,end:e.end},offsetInMin:Math.abs(new Date().getTimezoneOffset())}}var T={videoViewsReport(e,t){return{url:`{gateway}/v1/analytics/video-views/reports`,key:`video:views:report`,type:i.POST,data:{...w(e),version:t},invalidationKeys:`export`,normalize:!1}},loginsReport(e,t,n,r){return{url:`{gateway}/v1/analytics/logins/reports`,key:`logins:report`,data:w(e),type:i.POST,normalize:!1,success:t,error:n,always:r}}};n();var E=e(),D=`reportsShared.generateReport`,O=d.encloseNamespace(D);function k(e){switch(e){case j.Logins:return`loginsDescription`;case j.VideoViews:return`videosDescription`;default:return``}}function A(e){let t=l.convertUTCToLocal(e).toString();return l.format(t,`Do MMMM YYYY`)}var j=function(e){return e[e.Logins=0]=`Logins`,e[e.VideoViews=1]=`VideoViews`,e}({});function M(e){let t=_(`video-views`),n=_(`logins`),r=e.type===j.VideoViews?t:n,i=y(),{loading:a,handleGenerateReportError:l}=C(),u=s();function d(){switch(e.type){case j.Logins:return T.loginsReport(n);case j.VideoViews:return T.videoViewsReport(t,`v3`);default:return null}}function f(){u(d()).then(()=>i.success(O(`success`))).catch(e=>l(e,O(`error`),O(`noEmailError`))).finally(e.closePopup)}return(0,E.jsx)(c.Provider,{value:D,children:(0,E.jsxs)(m,{title:O(`title`),showLoadingSpinner:a,closePopup:e.closePopup,children:[(0,E.jsx)(`p`,{children:(0,E.jsx)(o,{phrase:k(e.type)})}),(0,E.jsx)(`p`,{children:(0,E.jsx)(o,{phrase:`dateRange`,options:{dateFrom:A(r.start),dateTo:A(r.end)}})}),(0,E.jsx)(`p`,{children:(0,E.jsx)(o,{phrase:`emailDescription`})}),(0,E.jsxs)(h,{children:[(0,E.jsx)(h.Cancel,{onClick:e.closePopup}),(0,E.jsx)(h.Submit,{variant:`dark`,onClick:f,text:O(`generateReport`)})]})]})})}export{M as n,A as r,j as t};
|
|
2
|
+
//# sourceMappingURL=J1C7-I-X.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CqCz1X85.chunk.js","names":[],"sources":["../../../../libs/shared/src/errors/general/verified-email/VerifiedEmailRequiredError.ts","../../../../libs/shared/src/hooks/UseProducts.ts","../../../../libs/shared/src/hooks/useVerifiedEmailRequiredErrorHandler.ts","../../src/shared/flight-requests/ReportRequests.ts","../../src/shared/views/generate-report/GenerateReportView.tsx"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.verifiedEmailError';\n\nexport class VerifiedEmailRequiredError extends DialogError {\n public message: string;\n public liteUrl: string;\n public hasLite: boolean;\n\n constructor(message: string, liteUrl: string, hasLite: boolean) {\n super('VerifiedEmailRequiredError');\n\n this.message = message;\n this.liteUrl = liteUrl;\n this.hasLite = hasLite;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'VerifiedEmailRequiredError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n const href = UrlHelper.safeUrlConcat(this.liteUrl, 'settings/account');\n\n return {\n title: LanguageService.getPhrase(namespace, 'heading'),\n text: this.hasLite ?\n `${this.message} ${LanguageService.getPhrase(namespace, 'visitSettings', { href })}` :\n this.message,\n buttons: [{\n text: LanguageService.getPhrase(namespace, 'close'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ProductRequests } from 'libs/shared/flight-requests/ProductRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, Product } from 'libs/shared/interfaces';\n\nexport type HasProductFunc = (productId: ProductId) => boolean;\n\nexport interface UseProductsResponse {\n hasProduct: (product: ProductId) => boolean;\n products: Flight.Response<Product[]>;\n isLoadingProducts: boolean;\n}\n\nexport const useProducts = (): UseProductsResponse => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const products = Flight.useBasicFetch<Product[]>(currentUser.data?.isAuthenticated && ProductRequests.userProducts());\n const isLoadingProducts = !products.hasCompleted;\n\n const hasProduct = (productId: ProductId) => {\n if (isLoadingProducts || products.hasError)\n return false;\n\n if (!products.data?.length)\n return false;\n\n return products.data.some(product => product.id === productId);\n };\n\n return {\n hasProduct,\n products,\n isLoadingProducts\n };\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { VerifiedEmailRequiredError } from 'libs/shared/errors/general/verified-email/VerifiedEmailRequiredError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces';\n\nexport function useVerifiedEmailRequiredErrorHandler() {\n const alerts = useAlerts();\n const { hasProduct, isLoadingProducts } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n function handleGenerateReportError(xhr: Xhr, message: string, noEmailError: string) {\n if (!xhr.responseJSON || xhr.responseJSON?.type !== 'no-email') {\n alerts.error(message);\n return;\n }\n\n Core.ErrorHelper.throw(\n new VerifiedEmailRequiredError(noEmailError, config.data.liteUrl, hasProduct(ProductId.Primary))\n );\n }\n\n return {\n handleGenerateReportError,\n loading: !config.hasCompleted || isLoadingProducts\n };\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\ntype ReportVersion = 'v2' | 'v3';\n\ninterface DateRange {\n start: string;\n end: string;\n}\n\ninterface ReportRequestPayload {\n dateRange: DateRange;\n offsetInMin: number;\n userIds?: number[];\n groupsIds?: number[];\n}\n\nfunction formatReportRequest(filterParams: AnalyticsRequestFilter): ReportRequestPayload {\n return {\n dateRange: {\n start: filterParams.start,\n end: filterParams.end\n },\n offsetInMin: Math.abs(new Date().getTimezoneOffset())\n };\n}\n\nexport const ReportRequests = {\n videoViewsReport(\n filterParams: AnalyticsRequestFilter,\n version: ReportVersion\n ): Flight.Request {\n return {\n url: '{gateway}/v1/analytics/video-views/reports',\n key: 'video:views:report',\n type: HttpVerbs.POST,\n data: { ...formatReportRequest(filterParams), version },\n invalidationKeys: 'export',\n normalize: false\n };\n },\n\n loginsReport(\n filterParams: AnalyticsRequestFilter,\n success?: () => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/analytics/logins/reports',\n key: 'logins:report',\n data: formatReportRequest(filterParams),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n }\n};\n","import React from 'react';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nimport { ReportRequests } from 'shared/flight-requests/ReportRequests';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\n\nconst namespace = 'reportsShared.generateReport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getLangPhrase(type: GenerateReportType): string {\n switch (type) {\n case GenerateReportType.Logins:\n return 'loginsDescription';\n\n case GenerateReportType.VideoViews:\n return 'videosDescription';\n\n default:\n return '';\n }\n}\n\nexport function getReportFriendlyDate(date: string): string {\n const localDate = DateHelper.convertUTCToLocal(date).toString();\n return DateHelper.format(localDate, 'Do MMMM YYYY');\n}\n\nexport enum GenerateReportType {\n Logins,\n VideoViews\n}\n\ninterface GenerateReportViewProps {\n type: GenerateReportType;\n}\n\nexport function GenerateReportView(props: PropsWithPopupViewProps<GenerateReportViewProps>): JSX.Element {\n const videoViewsFilter = useGetRequestFilter('video-views');\n const loginsFilter = useGetRequestFilter('logins');\n const filterQueryParams = props.type === GenerateReportType.VideoViews ? videoViewsFilter : loginsFilter;\n const alerts = useAlerts();\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n function getRequest(): Flight.Request {\n switch (props.type) {\n case GenerateReportType.Logins:\n return ReportRequests.loginsReport(loginsFilter);\n\n case GenerateReportType.VideoViews:\n return ReportRequests.videoViewsReport(videoViewsFilter, 'v3');\n\n default:\n return null;\n }\n }\n\n function onClick() {\n fetchAsync(getRequest())\n .then(() => alerts.success(getPhrase('success')))\n .catch((xhr: Xhr) => handleGenerateReportError(xhr, getPhrase('error'), getPhrase('noEmailError')))\n .finally(props.closePopup);\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getPhrase('title')}\n showLoadingSpinner={loading}\n closePopup={props.closePopup}\n >\n <p>\n <Text phrase={getLangPhrase(props.type)} />\n </p>\n <p>\n <Text phrase='dateRange' options={({\n dateFrom: getReportFriendlyDate(filterQueryParams.start),\n dateTo: getReportFriendlyDate(filterQueryParams.end)\n })} />\n </p>\n <p>\n <Text phrase='emailDescription' />\n </p>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n onClick={onClick}\n text={getPhrase('generateReport')}\n />\n </PopupButtons>\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"J1C7-I-X.chunk.js","names":[],"sources":["../../../../libs/shared/src/errors/general/verified-email/VerifiedEmailRequiredError.ts","../../../../libs/shared/src/hooks/UseProducts.ts","../../../../libs/shared/src/hooks/useVerifiedEmailRequiredErrorHandler.ts","../../src/shared/flight-requests/ReportRequests.ts","../../src/shared/views/generate-report/GenerateReportView.tsx"],"sourcesContent":["import { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { UrlHelper } from 'libs/common/backbone/utils/UrlHelper';\n\nimport { DialogError } from 'libs/shared/errors/primitives/DialogError';\nimport { DialogOptions } from 'libs/shared/interfaces';\n\nconst namespace = 'shared.verifiedEmailError';\n\nexport class VerifiedEmailRequiredError extends DialogError {\n public message: string;\n public liteUrl: string;\n public hasLite: boolean;\n\n constructor(message: string, liteUrl: string, hasLite: boolean) {\n super('VerifiedEmailRequiredError');\n\n this.message = message;\n this.liteUrl = liteUrl;\n this.hasLite = hasLite;\n }\n\n // @ts-ignore\n public get name(): string {\n return 'VerifiedEmailRequiredError';\n }\n\n // @ts-ignore\n public get dialogOptions(): DialogOptions {\n const href = UrlHelper.safeUrlConcat(this.liteUrl, 'settings/account');\n\n return {\n title: LanguageService.getPhrase(namespace, 'heading'),\n text: this.hasLite ?\n `${this.message} ${LanguageService.getPhrase(namespace, 'visitSettings', { href })}` :\n this.message,\n buttons: [{\n text: LanguageService.getPhrase(namespace, 'close'),\n className: 'btn btn-dark',\n success: true\n }]\n };\n }\n}\n","import { Flight } from 'libs/common/flight';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { ProductRequests } from 'libs/shared/flight-requests/ProductRequests';\nimport { UserRequests } from 'libs/shared/flight-requests/UserRequests';\nimport { CurrentUser, Product } from 'libs/shared/interfaces';\n\nexport type HasProductFunc = (productId: ProductId) => boolean;\n\nexport interface UseProductsResponse {\n hasProduct: (product: ProductId) => boolean;\n products: Flight.Response<Product[]>;\n isLoadingProducts: boolean;\n}\n\nexport const useProducts = (): UseProductsResponse => {\n const currentUser = Flight.useBasicFetch<CurrentUser>(UserRequests.currentUser());\n const products = Flight.useBasicFetch<Product[]>(currentUser.data?.isAuthenticated && ProductRequests.userProducts());\n const isLoadingProducts = !products.hasCompleted;\n\n const hasProduct = (productId: ProductId) => {\n if (isLoadingProducts || products.hasError)\n return false;\n\n if (!products.data?.length)\n return false;\n\n return products.data.some(product => product.id === productId);\n };\n\n return {\n hasProduct,\n products,\n isLoadingProducts\n };\n};\n","import { Core } from 'libs/common/backbone/index';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/react/index';\n\nimport { ProductId } from 'libs/shared/enums/ProductId';\nimport { VerifiedEmailRequiredError } from 'libs/shared/errors/general/verified-email/VerifiedEmailRequiredError';\nimport { ConfigRequests } from 'libs/shared/flight-requests/ConfigRequests';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useProducts } from 'libs/shared/hooks/UseProducts';\nimport { Config } from 'libs/shared/interfaces';\n\nexport function useVerifiedEmailRequiredErrorHandler() {\n const alerts = useAlerts();\n const { hasProduct, isLoadingProducts } = useProducts();\n const config = Flight.useBasicFetch<Config>(ConfigRequests.config());\n\n function handleGenerateReportError(xhr: Xhr, message: string, noEmailError: string) {\n if (!xhr.responseJSON || xhr.responseJSON?.type !== 'no-email') {\n alerts.error(message);\n return;\n }\n\n Core.ErrorHelper.throw(\n new VerifiedEmailRequiredError(noEmailError, config.data.liteUrl, hasProduct(ProductId.Primary))\n );\n }\n\n return {\n handleGenerateReportError,\n loading: !config.hasCompleted || isLoadingProducts\n };\n}\n","import { HttpVerbs } from 'libs/common/backbone/enums/HttpVerbs';\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { Flight } from 'libs/common/flight';\n\nimport { AnalyticsRequestFilter } from 'libs/shared/interfaces';\n\ntype ReportVersion = 'v2' | 'v3';\n\ninterface DateRange {\n start: string;\n end: string;\n}\n\ninterface ReportRequestPayload {\n dateRange: DateRange;\n offsetInMin: number;\n userIds?: number[];\n groupsIds?: number[];\n}\n\nfunction formatReportRequest(filterParams: AnalyticsRequestFilter): ReportRequestPayload {\n return {\n dateRange: {\n start: filterParams.start,\n end: filterParams.end\n },\n offsetInMin: Math.abs(new Date().getTimezoneOffset())\n };\n}\n\nexport const ReportRequests = {\n videoViewsReport(\n filterParams: AnalyticsRequestFilter,\n version: ReportVersion\n ): Flight.Request {\n return {\n url: '{gateway}/v1/analytics/video-views/reports',\n key: 'video:views:report',\n type: HttpVerbs.POST,\n data: { ...formatReportRequest(filterParams), version },\n invalidationKeys: 'export',\n normalize: false\n };\n },\n\n loginsReport(\n filterParams: AnalyticsRequestFilter,\n success?: () => void,\n error?: (xhr: Xhr) => void,\n always?: () => void\n ): Flight.Request {\n return {\n url: '{gateway}/v1/analytics/logins/reports',\n key: 'logins:report',\n data: formatReportRequest(filterParams),\n type: HttpVerbs.POST,\n normalize: false,\n success,\n error,\n always\n };\n }\n};\n","import React from 'react';\n\nimport { Xhr } from 'libs/common/backbone/interfaces';\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { Flight } from 'libs/common/flight';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { LanguageNamespaceContext, Text } from 'libs/shared/components/text/Text';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { useVerifiedEmailRequiredErrorHandler } from 'libs/shared/hooks/useVerifiedEmailRequiredErrorHandler';\nimport { PropsWithPopupViewProps } from 'libs/shared/interfaces';\n\nimport { ReportRequests } from 'shared/flight-requests/ReportRequests';\nimport { useGetRequestFilter } from 'shared/hooks/UseGetFilterQueryParams';\n\nconst namespace = 'reportsShared.generateReport';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nfunction getLangPhrase(type: GenerateReportType): string {\n switch (type) {\n case GenerateReportType.Logins:\n return 'loginsDescription';\n\n case GenerateReportType.VideoViews:\n return 'videosDescription';\n\n default:\n return '';\n }\n}\n\nexport function getReportFriendlyDate(date: string): string {\n const localDate = DateHelper.convertUTCToLocal(date).toString();\n return DateHelper.format(localDate, 'Do MMMM YYYY');\n}\n\nexport enum GenerateReportType {\n Logins,\n VideoViews\n}\n\ninterface GenerateReportViewProps {\n type: GenerateReportType;\n}\n\nexport function GenerateReportView(props: PropsWithPopupViewProps<GenerateReportViewProps>): JSX.Element {\n const videoViewsFilter = useGetRequestFilter('video-views');\n const loginsFilter = useGetRequestFilter('logins');\n const filterQueryParams = props.type === GenerateReportType.VideoViews ? videoViewsFilter : loginsFilter;\n const alerts = useAlerts();\n const { loading, handleGenerateReportError } = useVerifiedEmailRequiredErrorHandler();\n\n const fetchAsync = Flight.useGetFetchAsync();\n\n function getRequest(): Flight.Request {\n switch (props.type) {\n case GenerateReportType.Logins:\n return ReportRequests.loginsReport(loginsFilter);\n\n case GenerateReportType.VideoViews:\n return ReportRequests.videoViewsReport(videoViewsFilter, 'v3');\n\n default:\n return null;\n }\n }\n\n function onClick() {\n fetchAsync(getRequest())\n .then(() => alerts.success(getPhrase('success')))\n .catch((xhr: Xhr) => handleGenerateReportError(xhr, getPhrase('error'), getPhrase('noEmailError')))\n .finally(props.closePopup);\n }\n\n return (\n <LanguageNamespaceContext.Provider value={namespace}>\n <Popup\n title={getPhrase('title')}\n showLoadingSpinner={loading}\n closePopup={props.closePopup}\n >\n <p>\n <Text phrase={getLangPhrase(props.type)} />\n </p>\n <p>\n <Text phrase='dateRange' options={({\n dateFrom: getReportFriendlyDate(filterQueryParams.start),\n dateTo: getReportFriendlyDate(filterQueryParams.end)\n })} />\n </p>\n <p>\n <Text phrase='emailDescription' />\n </p>\n <PopupButtons>\n <PopupButtons.Cancel onClick={props.closePopup} />\n <PopupButtons.Submit\n variant='dark'\n onClick={onClick}\n text={getPhrase('generateReport')}\n />\n </PopupButtons>\n </Popup>\n </LanguageNamespaceContext.Provider>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Jn as e,P as t,U as n,st as r}from"./CM0wW4AE.chunk.js";import{n as i}from"./B01-hGyk.chunk.js";import{n as a}from"./dUFTODMz.chunk.js";import{t as o}from"./CjM_tQvd.chunk.js";import{t as s}from"./I5Dnl_eN.chunk.js";import{t as c}from"./CnyxksnC.chunk.js";import{l,t as u}from"./dSmIXyxJ.chunk.js";import{N as d,P as f,i as p}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{Jn as e,P as t,U as n,st as r}from"./CM0wW4AE.chunk.js";import{n as i}from"./B01-hGyk.chunk.js";import{n as a}from"./dUFTODMz.chunk.js";import{t as o}from"./CjM_tQvd.chunk.js";import{t as s}from"./I5Dnl_eN.chunk.js";import{t as c}from"./CnyxksnC.chunk.js";import{l,t as u}from"./dSmIXyxJ.chunk.js";import{N as d,P as f,i as p}from"./app-CYtIuHZu.js";import{t as m}from"./C1BFkCSD2.chunk.js";var h=e(r(),1),g=t(),_=`reportsDefault.classroomSizeSelector`,v=10,y=40;function b(e){return(0,g.jsxs)(`div`,{className:i(`border rounded-3 p-3`,e.className),children:[(0,g.jsx)(`h3`,{className:`h6 fw-semibold mb-1`,children:(0,g.jsx)(a,{namespace:_,phrase:`classroomSizeTitle`})}),(0,g.jsx)(`p`,{className:`text-secondary mb-3`,children:(0,g.jsx)(a,{namespace:_,phrase:`classroomSizeDescription`})}),(0,g.jsx)(`label`,{className:`mb-1`,htmlFor:`classroomSize`,children:(0,g.jsx)(a,{namespace:_,phrase:`classroomSizeLabel`})}),(0,g.jsx)(l.Range,{id:`classroomSize`,min:v,max:y,step:1,value:e.classroomSize,onChange:t=>e.onClassroomSizeChanged(Number(t.target.value))}),(0,g.jsxs)(`div`,{className:`d-flex justify-content-between small mb-2`,children:[(0,g.jsx)(`span`,{children:v}),(0,g.jsx)(`span`,{children:y})]}),(0,g.jsx)(`p`,{className:`text-secondary mb-0`,children:(0,g.jsx)(a,{namespace:_,phrase:`classroomSizeSummary`,options:{count:e.classroomSize}})})]})}var x=`reportsDefault.schoolHoursSelector`,S=[6,7,8,9,10,11,12,13,14,15,16,17,18],C=o.getTimezones();function w(e){let[t,n]=h.useState(!1),r=e.startHour<e.endHour;return(0,g.jsxs)(`div`,{className:i(`border rounded-3 p-3`,e.className),children:[(0,g.jsx)(`h3`,{className:`h6 fw-semibold mb-1`,children:(0,g.jsx)(a,{namespace:x,phrase:`schoolHoursTitle`})}),(0,g.jsx)(`p`,{className:`text-secondary mb-3`,children:(0,g.jsx)(a,{namespace:x,phrase:`schoolHoursDescription`})}),(0,g.jsxs)(`div`,{className:`d-flex align-items-end gap-3 mb-2`,children:[(0,g.jsxs)(`div`,{className:`flex-grow-1`,children:[(0,g.jsx)(`label`,{className:`small mb-1 d-block`,children:(0,g.jsx)(a,{namespace:x,phrase:`startTimeLabel`})}),(0,g.jsx)(`select`,{className:`form-select`,value:e.startHour,onChange:t=>e.onStartHourChanged(Number(t.target.value)),children:S.map(e=>(0,g.jsx)(`option`,{value:e,children:o.hourToFriendlyString(e)},e))})]}),(0,g.jsx)(`span`,{className:`pb-2`,children:(0,g.jsx)(a,{namespace:x,phrase:`schoolHoursTo`})}),(0,g.jsxs)(`div`,{className:`flex-grow-1`,children:[(0,g.jsx)(`label`,{className:`small mb-1 d-block`,children:(0,g.jsx)(a,{namespace:x,phrase:`endTimeLabel`})}),(0,g.jsx)(`select`,{className:`form-select`,value:e.endHour,onChange:t=>e.onEndHourChanged(Number(t.target.value)),children:S.map(e=>(0,g.jsx)(`option`,{value:e,children:o.hourToFriendlyString(e)},e))})]})]}),r?(0,g.jsx)(`p`,{className:`text-secondary mb-0`,children:(0,g.jsx)(a,{namespace:x,phrase:`schoolHoursSummary`,options:{startTime:o.hourToFriendlyString(e.startHour),endTime:o.hourToFriendlyString(e.endHour)}})}):(0,g.jsx)(`p`,{className:`text-danger mb-0`,children:(0,g.jsx)(a,{namespace:x,phrase:`schoolHoursValidation`})}),(0,g.jsx)(`div`,{className:`mt-3`,children:t?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)(`label`,{className:`mb-1 d-block`,children:(0,g.jsx)(a,{namespace:x,phrase:`timezoneLabel`})}),(0,g.jsx)(`select`,{className:`form-select`,value:e.timezone,onChange:t=>e.onTimezoneChanged(t.target.value),children:C.map(e=>(0,g.jsx)(`option`,{value:e,children:e},e))})]}):(0,g.jsxs)(`span`,{className:`text-secondary`,children:[(0,g.jsx)(a,{namespace:x,phrase:`timezoneCurrent`,options:{timezone:e.timezone}}),` — `,(0,g.jsx)(`button`,{className:`btn btn-link text-info p-0 align-baseline`,onClick:()=>n(!0),children:(0,g.jsx)(a,{namespace:x,phrase:`timezoneChange`})})]})})]})}var T=`reports.classroomViewsPopup`,E=s.encloseNamespace(T);function D(e){let t=p(n.ClassroomViewsPopup),r=m(),i=o.timeStringToHour(t.schoolStartTime),s=o.timeStringToHour(t.schoolEndTime),[l,_]=h.useState(t.classroomSize),[v,y]=h.useState(t.timezone),[x,S]=h.useState(i),[C,D]=h.useState(s),[O,k]=h.useState(!1),A=x<C&&v,j=l!==t.classroomSize||v!==t.timezone||x!==i||C!==s;async function M(){try{k(!0),await t.updateSettingsAsync({schoolStartTime:o.hourToTimeString(x),schoolEndTime:o.hourToTimeString(C),timezone:v,classroomSize:l}),r.success(E(`success`)),e.closePopup()}catch{r.error(E(`error`))}finally{k(!1)}}return(0,g.jsxs)(c,{closePopup:e.closePopup,title:E(`title`),size:`lg`,children:[(0,g.jsx)(`p`,{children:(0,g.jsx)(a,{namespace:T,phrase:`description1`})}),(0,g.jsx)(`p`,{children:(0,g.jsx)(a,{namespace:T,phrase:`description2`})}),(0,g.jsx)(b,{className:`my-3`,classroomSize:l,onClassroomSizeChanged:_}),(0,g.jsx)(w,{className:`mb-3`,startHour:x,endHour:C,timezone:v,onStartHourChanged:S,onEndHourChanged:D,onTimezoneChanged:y}),(0,g.jsxs)(u,{className:`justify-content-between`,children:[(0,g.jsx)(`a`,{href:d.getLiteArticle(f.ClassroomViews),target:`_blank`,rel:`noopener noreferrer`,className:`text-info`,children:(0,g.jsx)(a,{namespace:T,phrase:`learnMore`})}),(0,g.jsxs)(`div`,{className:`d-flex`,children:[(0,g.jsx)(u.Cancel,{onClick:e.closePopup,text:E(`close`)}),(0,g.jsx)(u.Submit,{onClick:M,text:E(`save`),showSpinner:O,variant:`dark`,disabled:!A||!j})]})]})]})}export{D as ClassroomViewsPopupView};
|
|
2
|
+
//# sourceMappingURL=Jx7lSD0p.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BnfA2fln.chunk.js","names":[],"sources":["../../src/apps/default/views/classroom-views-popup/components/classroom-size-selector/ClassroomSizeSelector.tsx","../../src/apps/default/views/classroom-views-popup/components/school-hours-selector/SchoolHoursSelector.tsx","../../src/apps/default/views/classroom-views-popup/ClassroomViewsPopupView.tsx"],"sourcesContent":["import React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'reportsDefault.classroomSizeSelector';\n\nconst MIN_CLASSROOM_SIZE = 10;\nconst MAX_CLASSROOM_SIZE = 40;\n\ninterface ClassroomSizeSelectorProps {\n className?: string;\n classroomSize: number;\n onClassroomSizeChanged: (size: number) => void;\n}\n\nexport function ClassroomSizeSelector(props: ClassroomSizeSelectorProps) {\n return (\n <div className={classNames('border rounded-3 p-3', props.className)}>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='classroomSizeTitle' /></h3>\n <p className='text-secondary mb-3'><Text namespace={namespace} phrase='classroomSizeDescription' /></p>\n\n <label className='mb-1' htmlFor='classroomSize'><Text namespace={namespace} phrase='classroomSizeLabel' /></label>\n\n <Form.Range\n id='classroomSize'\n min={MIN_CLASSROOM_SIZE}\n max={MAX_CLASSROOM_SIZE}\n step={1}\n value={props.classroomSize}\n onChange={e => props.onClassroomSizeChanged(Number(e.target.value))}\n />\n <div className='d-flex justify-content-between small mb-2'>\n <span>{MIN_CLASSROOM_SIZE}</span>\n <span>{MAX_CLASSROOM_SIZE}</span>\n </div>\n\n <p className='text-secondary mb-0'>\n <Text namespace={namespace} phrase='classroomSizeSummary' options={{ count: props.classroomSize }} />\n </p>\n </div>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'reportsDefault.schoolHoursSelector';\n\nconst SCHOOL_HOURS = [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ];\nconst ALL_TIMEZONES = DateHelper.getTimezones();\n\ninterface SchoolHoursSelectorProps {\n className?: string;\n startHour: number;\n endHour: number;\n timezone: string;\n onStartHourChanged: (hour: number) => void;\n onEndHourChanged: (hour: number) => void;\n onTimezoneChanged: (tz: string) => void;\n}\n\nexport function SchoolHoursSelector(props: SchoolHoursSelectorProps) {\n const [ showTimezoneSelect, setShowTimezoneSelect ] = React.useState(false);\n\n const isTimeRangeValid = props.startHour < props.endHour;\n\n return (\n <div className={classNames('border rounded-3 p-3', props.className)}>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='schoolHoursTitle' /></h3>\n <p className='text-secondary mb-3'><Text namespace={namespace} phrase='schoolHoursDescription' /></p>\n\n <div className='d-flex align-items-end gap-3 mb-2'>\n <div className='flex-grow-1'>\n <label className='small mb-1 d-block'><Text namespace={namespace} phrase='startTimeLabel' /></label>\n <select\n className='form-select'\n value={props.startHour}\n onChange={e => props.onStartHourChanged(Number(e.target.value))}\n >\n {SCHOOL_HOURS.map(hour => (\n <option key={hour} value={hour}>{DateHelper.hourToFriendlyString(hour)}</option>\n ))}\n </select>\n </div>\n <span className='pb-2'><Text namespace={namespace} phrase='schoolHoursTo' /></span>\n <div className='flex-grow-1'>\n <label className='small mb-1 d-block'><Text namespace={namespace} phrase='endTimeLabel' /></label>\n <select\n className='form-select'\n value={props.endHour}\n onChange={e => props.onEndHourChanged(Number(e.target.value))}\n >\n {SCHOOL_HOURS.map(hour => (\n <option key={hour} value={hour}>{DateHelper.hourToFriendlyString(hour)}</option>\n ))}\n </select>\n </div>\n </div>\n\n {isTimeRangeValid ? (\n <p className='text-secondary mb-0'>\n <Text\n namespace={namespace}\n phrase='schoolHoursSummary'\n options={{\n startTime: DateHelper.hourToFriendlyString(props.startHour),\n endTime: DateHelper.hourToFriendlyString(props.endHour)\n }}\n />\n </p>\n ) : (\n <p className='text-danger mb-0'>\n <Text namespace={namespace} phrase='schoolHoursValidation' />\n </p>\n )}\n\n <div className='mt-3'>\n {showTimezoneSelect ? (\n <>\n <label className='mb-1 d-block'><Text namespace={namespace} phrase='timezoneLabel' /></label>\n <select className='form-select' value={props.timezone} onChange={e => props.onTimezoneChanged(e.target.value)}>\n {ALL_TIMEZONES.map(tz => (\n <option key={tz} value={tz}>{tz}</option>\n ))}\n </select>\n </>\n ) : (\n <span className='text-secondary'>\n <Text namespace={namespace} phrase='timezoneCurrent' options={{ timezone: props.timezone }} />\n {' — '}\n <button className='btn btn-link text-info p-0 align-baseline' onClick={() => setShowTimezoneSelect(true)}>\n <Text namespace={namespace} phrase='timezoneChange' />\n </button>\n </span>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PopupViewProps } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { useClassroomViewsSettings } from 'shared/hooks/useClassroomViewsSettings';\n\nimport { ClassroomSizeSelector } from './components/classroom-size-selector/ClassroomSizeSelector';\nimport { SchoolHoursSelector } from './components/school-hours-selector/SchoolHoursSelector';\n\nconst namespace = 'reports.classroomViewsPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function ClassroomViewsPopupView(props: PopupViewProps): JSX.Element {\n const classroomViewsSettings = useClassroomViewsSettings(LocationContext.ClassroomViewsPopup);\n const alerts = useAlerts();\n\n const initialStartHour = DateHelper.timeStringToHour(classroomViewsSettings.schoolStartTime);\n const initialEndHour = DateHelper.timeStringToHour(classroomViewsSettings.schoolEndTime);\n \n const [ classroomSize, setClassroomSize ] = React.useState(classroomViewsSettings.classroomSize);\n const [ timezone, setTimezone ] = React.useState(classroomViewsSettings.timezone);\n const [ schoolStartHour, setSchoolStartHour ] = React.useState(initialStartHour);\n const [ schoolEndHour, setSchoolEndHour ] = React.useState(initialEndHour);\n const [ isSaving, setIsSaving ] = React.useState(false);\n \n const isFormValid = schoolStartHour < schoolEndHour && timezone;\n const isDirty = classroomSize !== classroomViewsSettings.classroomSize\n || timezone !== classroomViewsSettings.timezone\n || schoolStartHour !== initialStartHour\n || schoolEndHour !== initialEndHour;\n\n async function onSave() {\n try {\n setIsSaving(true);\n \n await classroomViewsSettings.updateSettingsAsync({\n schoolStartTime: DateHelper.hourToTimeString(schoolStartHour),\n schoolEndTime: DateHelper.hourToTimeString(schoolEndHour),\n timezone,\n classroomSize\n });\n \n alerts.success(getPhrase('success'));\n \n props.closePopup();\n } catch {\n alerts.error(getPhrase('error'));\n } finally {\n setIsSaving(false);\n }\n }\n\n return (\n <Popup\n closePopup={props.closePopup}\n title={getPhrase('title')}\n size='lg'\n >\n <p><Text namespace={namespace} phrase='description1' /></p>\n <p><Text namespace={namespace} phrase='description2' /></p>\n\n <ClassroomSizeSelector\n className='my-3'\n classroomSize={classroomSize}\n onClassroomSizeChanged={setClassroomSize}\n />\n\n <SchoolHoursSelector\n className='mb-3'\n startHour={schoolStartHour}\n endHour={schoolEndHour}\n timezone={timezone}\n onStartHourChanged={setSchoolStartHour}\n onEndHourChanged={setSchoolEndHour}\n onTimezoneChanged={setTimezone}\n />\n\n <PopupButtons className='justify-content-between'>\n <a href={ArticleHelper.getLiteArticle(LiteSupportArticle.ClassroomViews)} target='_blank' rel='noopener noreferrer' className='text-info'>\n <Text namespace={namespace} phrase='learnMore' />\n </a>\n <div className='d-flex'>\n <PopupButtons.Cancel onClick={props.closePopup} text={getPhrase('close')} />\n <PopupButtons.Submit onClick={onSave} text={getPhrase('save')} showSpinner={isSaving} variant='dark' disabled={!isFormValid || !isDirty} />\n </div>\n </PopupButtons>\n </Popup>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Jx7lSD0p.chunk.js","names":[],"sources":["../../src/apps/default/views/classroom-views-popup/components/classroom-size-selector/ClassroomSizeSelector.tsx","../../src/apps/default/views/classroom-views-popup/components/school-hours-selector/SchoolHoursSelector.tsx","../../src/apps/default/views/classroom-views-popup/ClassroomViewsPopupView.tsx"],"sourcesContent":["import React from 'react';\nimport { Form } from 'react-bootstrap';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'reportsDefault.classroomSizeSelector';\n\nconst MIN_CLASSROOM_SIZE = 10;\nconst MAX_CLASSROOM_SIZE = 40;\n\ninterface ClassroomSizeSelectorProps {\n className?: string;\n classroomSize: number;\n onClassroomSizeChanged: (size: number) => void;\n}\n\nexport function ClassroomSizeSelector(props: ClassroomSizeSelectorProps) {\n return (\n <div className={classNames('border rounded-3 p-3', props.className)}>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='classroomSizeTitle' /></h3>\n <p className='text-secondary mb-3'><Text namespace={namespace} phrase='classroomSizeDescription' /></p>\n\n <label className='mb-1' htmlFor='classroomSize'><Text namespace={namespace} phrase='classroomSizeLabel' /></label>\n\n <Form.Range\n id='classroomSize'\n min={MIN_CLASSROOM_SIZE}\n max={MAX_CLASSROOM_SIZE}\n step={1}\n value={props.classroomSize}\n onChange={e => props.onClassroomSizeChanged(Number(e.target.value))}\n />\n <div className='d-flex justify-content-between small mb-2'>\n <span>{MIN_CLASSROOM_SIZE}</span>\n <span>{MAX_CLASSROOM_SIZE}</span>\n </div>\n\n <p className='text-secondary mb-0'>\n <Text namespace={namespace} phrase='classroomSizeSummary' options={{ count: props.classroomSize }} />\n </p>\n </div>\n );\n}\n","import React from 'react';\n\nimport { classNames } from 'libs/common/react/utils/ClassNameHelper';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { Text } from 'libs/shared/components/text/Text';\n\nconst namespace = 'reportsDefault.schoolHoursSelector';\n\nconst SCHOOL_HOURS = [ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 ];\nconst ALL_TIMEZONES = DateHelper.getTimezones();\n\ninterface SchoolHoursSelectorProps {\n className?: string;\n startHour: number;\n endHour: number;\n timezone: string;\n onStartHourChanged: (hour: number) => void;\n onEndHourChanged: (hour: number) => void;\n onTimezoneChanged: (tz: string) => void;\n}\n\nexport function SchoolHoursSelector(props: SchoolHoursSelectorProps) {\n const [ showTimezoneSelect, setShowTimezoneSelect ] = React.useState(false);\n\n const isTimeRangeValid = props.startHour < props.endHour;\n\n return (\n <div className={classNames('border rounded-3 p-3', props.className)}>\n <h3 className='h6 fw-semibold mb-1'><Text namespace={namespace} phrase='schoolHoursTitle' /></h3>\n <p className='text-secondary mb-3'><Text namespace={namespace} phrase='schoolHoursDescription' /></p>\n\n <div className='d-flex align-items-end gap-3 mb-2'>\n <div className='flex-grow-1'>\n <label className='small mb-1 d-block'><Text namespace={namespace} phrase='startTimeLabel' /></label>\n <select\n className='form-select'\n value={props.startHour}\n onChange={e => props.onStartHourChanged(Number(e.target.value))}\n >\n {SCHOOL_HOURS.map(hour => (\n <option key={hour} value={hour}>{DateHelper.hourToFriendlyString(hour)}</option>\n ))}\n </select>\n </div>\n <span className='pb-2'><Text namespace={namespace} phrase='schoolHoursTo' /></span>\n <div className='flex-grow-1'>\n <label className='small mb-1 d-block'><Text namespace={namespace} phrase='endTimeLabel' /></label>\n <select\n className='form-select'\n value={props.endHour}\n onChange={e => props.onEndHourChanged(Number(e.target.value))}\n >\n {SCHOOL_HOURS.map(hour => (\n <option key={hour} value={hour}>{DateHelper.hourToFriendlyString(hour)}</option>\n ))}\n </select>\n </div>\n </div>\n\n {isTimeRangeValid ? (\n <p className='text-secondary mb-0'>\n <Text\n namespace={namespace}\n phrase='schoolHoursSummary'\n options={{\n startTime: DateHelper.hourToFriendlyString(props.startHour),\n endTime: DateHelper.hourToFriendlyString(props.endHour)\n }}\n />\n </p>\n ) : (\n <p className='text-danger mb-0'>\n <Text namespace={namespace} phrase='schoolHoursValidation' />\n </p>\n )}\n\n <div className='mt-3'>\n {showTimezoneSelect ? (\n <>\n <label className='mb-1 d-block'><Text namespace={namespace} phrase='timezoneLabel' /></label>\n <select className='form-select' value={props.timezone} onChange={e => props.onTimezoneChanged(e.target.value)}>\n {ALL_TIMEZONES.map(tz => (\n <option key={tz} value={tz}>{tz}</option>\n ))}\n </select>\n </>\n ) : (\n <span className='text-secondary'>\n <Text namespace={namespace} phrase='timezoneCurrent' options={{ timezone: props.timezone }} />\n {' — '}\n <button className='btn btn-link text-info p-0 align-baseline' onClick={() => setShowTimezoneSelect(true)}>\n <Text namespace={namespace} phrase='timezoneChange' />\n </button>\n </span>\n )}\n </div>\n </div>\n );\n}\n","import React from 'react';\n\nimport { LanguageService } from 'libs/common/backbone/services/LanguageService';\nimport { DateHelper } from 'libs/common/react/utils/DateHelper';\n\nimport { LocationContext } from 'libs/analytics/interfaces';\n\nimport { Popup } from 'libs/shared/components/popup/Popup';\nimport { PopupButtons } from 'libs/shared/components/popup/PopupButtons';\nimport { Text } from 'libs/shared/components/text/Text';\nimport { LiteSupportArticle } from 'libs/shared/enums/SupportArticle';\nimport { useAlerts } from 'libs/shared/hooks/UseAlerts';\nimport { PopupViewProps } from 'libs/shared/interfaces';\nimport { ArticleHelper } from 'libs/shared/utils/ArticleHelper';\n\nimport { useClassroomViewsSettings } from 'shared/hooks/useClassroomViewsSettings';\n\nimport { ClassroomSizeSelector } from './components/classroom-size-selector/ClassroomSizeSelector';\nimport { SchoolHoursSelector } from './components/school-hours-selector/SchoolHoursSelector';\n\nconst namespace = 'reports.classroomViewsPopup';\nconst getPhrase = LanguageService.encloseNamespace(namespace);\n\nexport function ClassroomViewsPopupView(props: PopupViewProps): JSX.Element {\n const classroomViewsSettings = useClassroomViewsSettings(LocationContext.ClassroomViewsPopup);\n const alerts = useAlerts();\n\n const initialStartHour = DateHelper.timeStringToHour(classroomViewsSettings.schoolStartTime);\n const initialEndHour = DateHelper.timeStringToHour(classroomViewsSettings.schoolEndTime);\n \n const [ classroomSize, setClassroomSize ] = React.useState(classroomViewsSettings.classroomSize);\n const [ timezone, setTimezone ] = React.useState(classroomViewsSettings.timezone);\n const [ schoolStartHour, setSchoolStartHour ] = React.useState(initialStartHour);\n const [ schoolEndHour, setSchoolEndHour ] = React.useState(initialEndHour);\n const [ isSaving, setIsSaving ] = React.useState(false);\n \n const isFormValid = schoolStartHour < schoolEndHour && timezone;\n const isDirty = classroomSize !== classroomViewsSettings.classroomSize\n || timezone !== classroomViewsSettings.timezone\n || schoolStartHour !== initialStartHour\n || schoolEndHour !== initialEndHour;\n\n async function onSave() {\n try {\n setIsSaving(true);\n \n await classroomViewsSettings.updateSettingsAsync({\n schoolStartTime: DateHelper.hourToTimeString(schoolStartHour),\n schoolEndTime: DateHelper.hourToTimeString(schoolEndHour),\n timezone,\n classroomSize\n });\n \n alerts.success(getPhrase('success'));\n \n props.closePopup();\n } catch {\n alerts.error(getPhrase('error'));\n } finally {\n setIsSaving(false);\n }\n }\n\n return (\n <Popup\n closePopup={props.closePopup}\n title={getPhrase('title')}\n size='lg'\n >\n <p><Text namespace={namespace} phrase='description1' /></p>\n <p><Text namespace={namespace} phrase='description2' /></p>\n\n <ClassroomSizeSelector\n className='my-3'\n classroomSize={classroomSize}\n onClassroomSizeChanged={setClassroomSize}\n />\n\n <SchoolHoursSelector\n className='mb-3'\n startHour={schoolStartHour}\n endHour={schoolEndHour}\n timezone={timezone}\n onStartHourChanged={setSchoolStartHour}\n onEndHourChanged={setSchoolEndHour}\n onTimezoneChanged={setTimezone}\n />\n\n <PopupButtons className='justify-content-between'>\n <a href={ArticleHelper.getLiteArticle(LiteSupportArticle.ClassroomViews)} target='_blank' rel='noopener noreferrer' className='text-info'>\n <Text namespace={namespace} phrase='learnMore' />\n </a>\n <div className='d-flex'>\n <PopupButtons.Cancel onClick={props.closePopup} text={getPhrase('close')} />\n <PopupButtons.Submit onClick={onSave} text={getPhrase('save')} showSpinner={isSaving} variant='dark' disabled={!isFormValid || !isDirty} />\n </div>\n </PopupButtons>\n </Popup>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{n as e}from"./J1C7-I-X.chunk.js";export{e as GenerateReportView};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{P as e,st as t}from"./CM0wW4AE.chunk.js";import{t as n}from"./C7xZhn-Q.chunk.js";import{t as r}from"./DIAxWspB.chunk.js";import{F as i}from"./app-
|
|
2
|
-
//# sourceMappingURL=
|
|
1
|
+
import{P as e,st as t}from"./CM0wW4AE.chunk.js";import{t as n}from"./C7xZhn-Q.chunk.js";import{t as r}from"./DIAxWspB.chunk.js";import{F as i}from"./app-CYtIuHZu.js";t();var a={container:`_container_nowrk_1`,subContainer:`_subContainer_nowrk_7`},o=e();function s(e){return n({title:e.error?.heading}),e.error?(0,o.jsx)(`div`,{style:{height:`85vh`},children:(0,o.jsx)(`div`,{style:{backgroundImage:`url(${e.imageUrl})`},className:a.container,children:(0,o.jsxs)(r,{className:a.subContainer,children:[(0,o.jsx)(r.Heading,{children:e.error.heading}),(0,o.jsx)(r.Info,{className:`w-33 mb-4`,children:e.error.description}),e.error.cta!==!1&&(0,o.jsx)(r.Cta,{text:e.error.cta.text,className:`btn btn-dark ${e.error.description?`mt-n2`:``}`,href:e.error.cta.url,icon:i,openInNewTab:!0})]})})}):(0,o.jsx)(o.Fragment,{})}export{s as NoClassroomsErrorView};
|
|
2
|
+
//# sourceMappingURL=VmHmm_9S.chunk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"VmHmm_9S.chunk.js","names":[],"sources":["../../src/apps/default/views/no-classrooms-error/no-classrooms-error.module.scss","../../src/apps/default/views/no-classrooms-error/NoClassroomsErrorView.tsx"],"sourcesContent":[":local {\n .container {\n height: 100%;\n background-size: 100%;\n background-repeat: no-repeat;\n position: relative;\n }\n \n .subContainer {\n position: absolute;\n top: 40%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 100%;\n }\n}","import React from 'react';\n\nimport { EmptyState } from 'libs/shared/components/empty-states/EmptyState';\nimport { ErrorPageError } from 'libs/shared/errors/primitives/ErrorPageError';\nimport { useSetPageMetadata } from 'libs/shared/hooks/useSetPageMetadata';\nimport { NewWindowSvg } from 'libs/shared/images/svg/actions/NewWindowSvg';\n\nimport styles from './no-classrooms-error.module.scss';\n\ninterface NoClassroomsErrorViewProps {\n error: ErrorPageError;\n imageUrl?: string;\n}\n\nexport function NoClassroomsErrorView(props: NoClassroomsErrorViewProps): React.ReactElement {\n useSetPageMetadata({ title: props.error?.heading });\n\n if (!props.error)\n return <></>;\n\n return (\n <div style={{ height: '85vh' }}>\n <div style={{ backgroundImage: `url(${props.imageUrl})` }} className={styles.container}>\n <EmptyState className={styles.subContainer}>\n <EmptyState.Heading>{props.error.heading}</EmptyState.Heading>\n\n <EmptyState.Info className='w-33 mb-4'>{props.error.description}</EmptyState.Info>\n\n {props.error.cta !== false &&\n <EmptyState.Cta\n text={props.error.cta.text}\n className={`btn btn-dark ${props.error.description ? 'mt-n2' : ''}`}\n href={props.error.cta.url}\n icon={NewWindowSvg}\n openInNewTab\n />\n }\n </EmptyState>\n </div>\n </div>\n );\n}\n"],"mappings":"4PCcA,SAAgB,EAAsB,EAAuD,CAM3F,OALA,EAAmB,CAAE,MAAO,EAAM,OAAO,QAAS,CAAC,CAE9C,EAAM,OAIT,EAAA,EAAA,KAAC,MAAD,CAAK,MAAO,CAAE,OAAQ,OAAQ,WAC5B,EAAA,EAAA,KAAC,MAAD,CAAK,MAAO,CAAE,gBAAiB,OAAO,EAAM,SAAS,GAAI,CAAE,UAAW,EAAO,oBAC3E,EAAA,EAAA,MAAC,EAAD,CAAY,UAAW,EAAO,sBAA9B,EACE,EAAA,EAAA,KAAC,EAAW,QAAZ,CAAA,SAAqB,EAAM,MAAM,QAA6B,CAAA,EAE9D,EAAA,EAAA,KAAC,EAAW,KAAZ,CAAiB,UAAU,qBAAa,EAAM,MAAM,YAA8B,CAAA,CAEjF,EAAM,MAAM,MAAQ,KACnB,EAAA,EAAA,KAAC,EAAW,IAAZ,CACE,KAAM,EAAM,MAAM,IAAI,KACtB,UAAW,gBAAgB,EAAM,MAAM,YAAc,QAAU,KAC/D,KAAM,EAAM,MAAM,IAAI,IACtB,KAAM,EACN,aAAA,GACA,CAAA,IAGF,CAAA,CACF,CAAA,EArBC,EAAA,EAAA,KAAA,EAAA,SAAA,EAAK,CAAA"}
|