@ministryofjustice/hmpps-digital-prison-reporting-frontend 7.1.1 → 7.1.2

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.
Files changed (39) hide show
  1. package/cjs/dpr/components/_dashboards/dashboard-section/utils.js +55 -0
  2. package/cjs/dpr/components/_dashboards/dashboard-section/utils.js.map +1 -1
  3. package/cjs/dpr/components/_dashboards/dashboard-visualisation/types.js.map +1 -1
  4. package/cjs/dpr/components/my-reports/utils.js +2 -1
  5. package/cjs/dpr/components/my-reports/utils.js.map +1 -1
  6. package/cjs/dpr/components/truncate/utils.js +5 -3
  7. package/cjs/dpr/components/truncate/utils.js.map +1 -1
  8. package/cjs/dpr/routes/journeys/request-report/filters/utils.js +133 -47
  9. package/cjs/dpr/routes/journeys/request-report/filters/utils.js.map +1 -1
  10. package/cjs/dpr/setUpNunjucksFilters.js +2 -28
  11. package/cjs/dpr/setUpNunjucksFilters.js.map +1 -1
  12. package/cjs/dpr/utils/sanitizeHtml.js +36 -0
  13. package/cjs/dpr/utils/sanitizeHtml.js.map +1 -0
  14. package/dpr/components/_dashboards/dashboard-section/utils.js +54 -1
  15. package/dpr/components/_dashboards/dashboard-section/utils.js.map +1 -1
  16. package/dpr/components/_dashboards/dashboard-visualisation/types.js.map +1 -1
  17. package/dpr/components/my-reports/my-reports-list-item/my-reports-list-item-description/view.njk +1 -1
  18. package/dpr/components/my-reports/utils.js +2 -1
  19. package/dpr/components/my-reports/utils.js.map +1 -1
  20. package/dpr/components/truncate/utils.js +5 -3
  21. package/dpr/components/truncate/utils.js.map +1 -1
  22. package/dpr/routes/journeys/request-report/filters/utils.js +133 -47
  23. package/dpr/routes/journeys/request-report/filters/utils.js.map +1 -1
  24. package/dpr/setUpNunjucksFilters.js +2 -28
  25. package/dpr/setUpNunjucksFilters.js.map +1 -1
  26. package/dpr/utils/sanitizeHtml.js +34 -0
  27. package/dpr/utils/sanitizeHtml.js.map +1 -0
  28. package/package.json +1 -1
  29. package/src/dpr/components/_dashboards/dashboard-section/utils.d.ts +16 -1
  30. package/src/dpr/components/_dashboards/dashboard-visualisation/types.d.ts +3 -0
  31. package/src/dpr/utils/sanitizeHtml.d.ts +1 -0
  32. package/test-app/mocks/mockClients/dashboards/dashboard-definitions.d.ts +22 -0
  33. package/test-app/mocks/mockClients/dashboards/definitions/parent-child/child-dashboard-1.d.ts +20 -0
  34. package/test-app/mocks/mockClients/dashboards/definitions/parent-child/child-dashboard-2.d.ts +20 -0
  35. package/test-app/mocks/mockClients/dashboards/definitions/parent-child/index.d.ts +23 -0
  36. package/test-app/mocks/mockClients/dashboards/definitions/parent-child/parent-dashboard.d.ts +42 -0
  37. package/test-app/mocks/mockClients/dashboards/mock-client.d.ts +42 -0
  38. package/test-app/mocks/mockClients/reports/mockReportDefinition.d.ts +28 -0
  39. package/test-app/mocks/mockClients/reports/mockReportingClient.d.ts +56 -0
@@ -55,6 +55,61 @@ const createDashboardSections = (dashboardDefinition, dashboardData, query, dash
55
55
  return { id, title: title || '', description: description || '', visualisations };
56
56
  });
57
57
  };
58
+ /**
59
+ * Add variant ID to section
60
+ *
61
+ * @param {components['schemas']['DashboardSectionDefinition']} section
62
+ * @param {string} variantId
63
+ * @return {*} {components['schemas']['DashboardSectionDefinition']}
64
+ */
65
+ const addVariantIdToSection = (section, variantId) => ({
66
+ ...section,
67
+ visualisations: section.visualisations.map(visualisation => ({
68
+ ...visualisation,
69
+ variantId,
70
+ })),
71
+ });
72
+ /**
73
+ * Builds a master section collection from a parent dashboard and its child variants.
74
+ *
75
+ * @param {DashboardDefintion} definition
76
+ * @return {*} {components['schemas']['DashboardSectionDefinition'][]}
77
+ */
78
+ const buildMasterSections = (definition) => {
79
+ const parentSections = definition.sections.map(section => addVariantIdToSection(section, definition.id));
80
+ return definition.childVariants.reduce((sections, childVariant) => childVariant.sections
81
+ .map(section => addVariantIdToSection(section, childVariant.id))
82
+ .reduce(mergeSection, sections), parentSections);
83
+ };
84
+ /**
85
+ * Merges the sections
86
+ *
87
+ * Rules:
88
+ * - Parent sections are added first and retain their original order.
89
+ * - Child variants are processed in array order.
90
+ * - Child sections are processed in section order within each variant.
91
+ * - If a child section ID matches an existing section ID, its visualisations are appended to that section.
92
+ * - If a child section ID does not exist, the section is appended to the end of the collection.
93
+ * - Visualisation order is preserved as defined in the source section
94
+ *
95
+ * @param {components['schemas']['DashboardSectionDefinition'][]} sections
96
+ * @param {components['schemas']['DashboardSectionDefinition']} section
97
+ * @return {*}
98
+ */
99
+ const mergeSection = (sections, section) => {
100
+ const existingIndex = sections.findIndex(existing => existing.id === section.id);
101
+ if (existingIndex === -1) {
102
+ return [...sections, section];
103
+ }
104
+ return sections.map((existing, index) => index === existingIndex
105
+ ? {
106
+ ...existing,
107
+ visualisations: [...existing.visualisations, ...section.visualisations],
108
+ }
109
+ : existing);
110
+ };
58
111
 
112
+ exports.addVariantIdToSection = addVariantIdToSection;
113
+ exports.buildMasterSections = buildMasterSections;
59
114
  exports.createDashboardSections = createDashboardSections;
60
115
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-section/utils.ts"],"sourcesContent":["import { DashboardDataResponse } from '../../../types/Metrics'\nimport { components } from '../../../types/api'\nimport { PartialDate } from '../../_filters/types'\nimport { DashboardSection, DashboardVisualisation, DashboardVisualisationType } from '../dashboard-visualisation/types'\nimport ScorecardsUtils from '../scorecard/utils'\nimport ScorecardVisualisation from '../scorecard/Scorecard'\nimport ScorecardGroupVisualisation from '../scorecard-group/ScorecardGroup'\nimport DashboardListUtils from '../dashboard-list/utils'\nimport ChartUtils from '../../_charts/utils'\nimport { getFeatureFlagVisTypeMap } from '../dashboard-visualisation/utils'\n\nexport const createDashboardSections = (\n dashboardDefinition: components['schemas']['DashboardDefinition'],\n dashboardData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n dashboardFeatureFlags: Record<string, boolean>,\n partialDate?: PartialDate,\n): DashboardSection[] => {\n return dashboardDefinition.sections.map((section: components['schemas']['DashboardSectionDefinition']) => {\n const { id, display: title, description } = section\n const featureFlagVisTypeMap = getFeatureFlagVisTypeMap(dashboardFeatureFlags)\n\n let hasScorecard = false\n const visualisations: DashboardVisualisation[] = section.visualisations.map(\n (visDefinition: components['schemas']['DashboardVisualisationDefinition']) => {\n const { type, display, description: visDescription, id: visId } = visDefinition\n const isEnabled = featureFlagVisTypeMap[type]\n\n let data: DashboardVisualisation['data'] | undefined\n\n switch (type) {\n case DashboardVisualisationType.LIST:\n data = DashboardListUtils.createList(visDefinition, dashboardData)\n break\n\n case DashboardVisualisationType.SCORECARD:\n hasScorecard = true\n data = new ScorecardVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.SCORECARD_GROUP:\n data = new ScorecardGroupVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.BAR:\n case DashboardVisualisationType.LINE:\n case DashboardVisualisationType.DONUT: {\n data = ChartUtils.createChart(visDefinition, dashboardData, type)\n break\n }\n case DashboardVisualisationType.MATRIX_TIMESERIES:\n case DashboardVisualisationType.BAR_TIMESERIES:\n case DashboardVisualisationType.LINE_TIMESERIES: {\n data = ChartUtils.createTimeseriesCharts(visDefinition, dashboardData, type, query, partialDate)\n break\n }\n default:\n break\n }\n\n return {\n id: visId,\n title: display || '',\n description: visDescription || '',\n type,\n data,\n isEnabled: isEnabled ?? true,\n }\n },\n )\n\n if (hasScorecard)\n ScorecardsUtils.mergeScorecardsIntoGroup(\n visualisations,\n featureFlagVisTypeMap[DashboardVisualisationType.SCORECARD_GROUP],\n )\n\n return { id, title: title || '', description: description || '', visualisations }\n })\n}\n"],"names":["getFeatureFlagVisTypeMap","DashboardVisualisationType","DashboardListUtils","ScorecardVisualisation","ScorecardGroupVisualisation","ChartUtils","ScorecardsUtils"],"mappings":";;;;;;;;;;AAWO,MAAM,uBAAuB,GAAG,CACrC,mBAAiE,EACjE,aAAsC,EACtC,KAAwC,EACxC,qBAA8C,EAC9C,WAAyB,KACH;IACtB,OAAO,mBAAmB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAA4D,KAAI;QACvG,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO;AACnD,QAAA,MAAM,qBAAqB,GAAGA,8BAAwB,CAAC,qBAAqB,CAAC;QAE7E,IAAI,YAAY,GAAG,KAAK;QACxB,MAAM,cAAc,GAA6B,OAAO,CAAC,cAAc,CAAC,GAAG,CACzE,CAAC,aAAwE,KAAI;AAC3E,YAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,aAAa;AAC/E,YAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,IAAI,CAAC;AAE7C,YAAA,IAAI,IAAgD;YAEpD,QAAQ,IAAI;gBACV,KAAKC,gCAA0B,CAAC,IAAI;oBAClC,IAAI,GAAGC,eAAkB,CAAC,UAAU,CAAC,aAAa,EAAE,aAAa,CAAC;oBAClE;gBAEF,KAAKD,gCAA0B,CAAC,SAAS;oBACvC,YAAY,GAAG,IAAI;AACnB,oBAAA,IAAI,GAAG,IAAIE,gCAAsB,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE;oBACjG;gBAEF,KAAKF,gCAA0B,CAAC,eAAe;AAC7C,oBAAA,IAAI,GAAG,IAAIG,0CAA2B,EAAE,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE;oBACtG;gBAEF,KAAKH,gCAA0B,CAAC,GAAG;gBACnC,KAAKA,gCAA0B,CAAC,IAAI;AACpC,gBAAA,KAAKA,gCAA0B,CAAC,KAAK,EAAE;oBACrC,IAAI,GAAGI,eAAU,CAAC,WAAW,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;oBACjE;gBACF;gBACA,KAAKJ,gCAA0B,CAAC,iBAAiB;gBACjD,KAAKA,gCAA0B,CAAC,cAAc;AAC9C,gBAAA,KAAKA,gCAA0B,CAAC,eAAe,EAAE;AAC/C,oBAAA,IAAI,GAAGI,eAAU,CAAC,sBAAsB,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC;oBAChG;gBACF;;YAKF,OAAO;AACL,gBAAA,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,OAAO,IAAI,EAAE;gBACpB,WAAW,EAAE,cAAc,IAAI,EAAE;gBACjC,IAAI;gBACJ,IAAI;gBACJ,SAAS,EAAE,SAAS,IAAI,IAAI;aAC7B;AACH,QAAA,CAAC,CACF;AAED,QAAA,IAAI,YAAY;AACd,YAAAC,eAAe,CAAC,wBAAwB,CACtC,cAAc,EACd,qBAAqB,CAACL,gCAA0B,CAAC,eAAe,CAAC,CAClE;AAEH,QAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,WAAW,EAAE,WAAW,IAAI,EAAE,EAAE,cAAc,EAAE;AACnF,IAAA,CAAC,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-section/utils.ts"],"sourcesContent":["import { DashboardDataResponse } from '../../../types/Metrics'\nimport { components } from '../../../types/api'\nimport { PartialDate } from '../../_filters/types'\nimport {\n DashboardDefintion,\n DashboardSection,\n DashboardVisualisation,\n DashboardVisualisationType,\n} from '../dashboard-visualisation/types'\nimport ScorecardsUtils from '../scorecard/utils'\nimport ScorecardVisualisation from '../scorecard/Scorecard'\nimport ScorecardGroupVisualisation from '../scorecard-group/ScorecardGroup'\nimport DashboardListUtils from '../dashboard-list/utils'\nimport ChartUtils from '../../_charts/utils'\nimport { getFeatureFlagVisTypeMap } from '../dashboard-visualisation/utils'\n\nexport const createDashboardSections = (\n dashboardDefinition: components['schemas']['DashboardDefinition'],\n dashboardData: DashboardDataResponse[],\n query: Record<string, string | string[]>,\n dashboardFeatureFlags: Record<string, boolean>,\n partialDate?: PartialDate,\n): DashboardSection[] => {\n return dashboardDefinition.sections.map((section: components['schemas']['DashboardSectionDefinition']) => {\n const { id, display: title, description } = section\n const featureFlagVisTypeMap = getFeatureFlagVisTypeMap(dashboardFeatureFlags)\n\n let hasScorecard = false\n const visualisations: DashboardVisualisation[] = section.visualisations.map(\n (visDefinition: components['schemas']['DashboardVisualisationDefinition']) => {\n const { type, display, description: visDescription, id: visId } = visDefinition\n const isEnabled = featureFlagVisTypeMap[type]\n\n let data: DashboardVisualisation['data'] | undefined\n\n switch (type) {\n case DashboardVisualisationType.LIST:\n data = DashboardListUtils.createList(visDefinition, dashboardData)\n break\n\n case DashboardVisualisationType.SCORECARD:\n hasScorecard = true\n data = new ScorecardVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.SCORECARD_GROUP:\n data = new ScorecardGroupVisualisation().withDefinition(visDefinition).withData(dashboardData).build()\n break\n\n case DashboardVisualisationType.BAR:\n case DashboardVisualisationType.LINE:\n case DashboardVisualisationType.DONUT: {\n data = ChartUtils.createChart(visDefinition, dashboardData, type)\n break\n }\n case DashboardVisualisationType.MATRIX_TIMESERIES:\n case DashboardVisualisationType.BAR_TIMESERIES:\n case DashboardVisualisationType.LINE_TIMESERIES: {\n data = ChartUtils.createTimeseriesCharts(visDefinition, dashboardData, type, query, partialDate)\n break\n }\n default:\n break\n }\n\n return {\n id: visId,\n title: display || '',\n description: visDescription || '',\n type,\n data,\n isEnabled: isEnabled ?? true,\n }\n },\n )\n\n if (hasScorecard)\n ScorecardsUtils.mergeScorecardsIntoGroup(\n visualisations,\n featureFlagVisTypeMap[DashboardVisualisationType.SCORECARD_GROUP],\n )\n\n return { id, title: title || '', description: description || '', visualisations }\n })\n}\n\n/**\n * Add variant ID to section\n *\n * @param {components['schemas']['DashboardSectionDefinition']} section\n * @param {string} variantId\n * @return {*} {components['schemas']['DashboardSectionDefinition']}\n */\nexport const addVariantIdToSection = (\n section: components['schemas']['DashboardSectionDefinition'],\n variantId: string,\n): components['schemas']['DashboardSectionDefinition'] => ({\n ...section,\n visualisations: section.visualisations.map(visualisation => ({\n ...visualisation,\n variantId,\n })),\n})\n\n/**\n * Builds a master section collection from a parent dashboard and its child variants.\n *\n * @param {DashboardDefintion} definition\n * @return {*} {components['schemas']['DashboardSectionDefinition'][]}\n */\nexport const buildMasterSections = (\n definition: DashboardDefintion, // TODO: Update this type to components['schemas']['DashboardDefinition'] when `childVariants` field is present\n): components['schemas']['DashboardSectionDefinition'][] => {\n const parentSections = definition.sections.map(section => addVariantIdToSection(section, definition.id))\n\n return definition.childVariants.reduce(\n (sections, childVariant) =>\n childVariant.sections\n .map(section => addVariantIdToSection(section, childVariant.id))\n .reduce(mergeSection, sections),\n parentSections,\n )\n}\n\n/**\n * Merges the sections\n *\n * Rules:\n * - Parent sections are added first and retain their original order.\n * - Child variants are processed in array order.\n * - Child sections are processed in section order within each variant.\n * - If a child section ID matches an existing section ID, its visualisations are appended to that section.\n * - If a child section ID does not exist, the section is appended to the end of the collection.\n * - Visualisation order is preserved as defined in the source section\n *\n * @param {components['schemas']['DashboardSectionDefinition'][]} sections\n * @param {components['schemas']['DashboardSectionDefinition']} section\n * @return {*}\n */\nconst mergeSection = (\n sections: components['schemas']['DashboardSectionDefinition'][],\n section: components['schemas']['DashboardSectionDefinition'],\n) => {\n const existingIndex = sections.findIndex(existing => existing.id === section.id)\n\n if (existingIndex === -1) {\n return [...sections, section]\n }\n\n return sections.map((existing, index) =>\n index === existingIndex\n ? {\n ...existing,\n visualisations: [...existing.visualisations, ...section.visualisations],\n }\n : existing,\n )\n}\n"],"names":["getFeatureFlagVisTypeMap","DashboardVisualisationType","DashboardListUtils","ScorecardVisualisation","ScorecardGroupVisualisation","ChartUtils","ScorecardsUtils"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-visualisation/types.ts"],"sourcesContent":["import z from 'zod'\nimport { components } from '../../../types/api'\nimport { ChartDetails } from '../../../types/Charts'\nimport { BarTimeseriesDefinitionMeasure } from '../../_charts/chart/bar-timeseries/types'\nimport { BarDefinitionMeasure } from '../../_charts/chart/bar/types'\nimport { ChartOptionsType } from '../../_charts/chart/chart-config'\nimport { DoughnutDefinitionMeasure } from '../../_charts/chart/doughnut/types'\nimport { MatrixChartData } from '../../_charts/chart/heatmap/types'\nimport { LineTimeseriesDefinitionMeasure } from '../../_charts/chart/line-timeseries/types'\nimport { LineDefinitionMeasure } from '../../_charts/chart/line/types'\nimport { PartialDate } from '../../_filters/types'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\nimport DashboardVisualisationSchemas from './Validate'\n\nexport interface DashboardSection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardVisualisation[]\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: components['schemas']['DashboardVisualisationDefinition']['type']\n title?: string | undefined\n description?: string | undefined\n isEnabled: boolean\n data:\n | Scorecard\n | Scorecard[]\n | ScorecardGroup[]\n | DashboardVisualisationCardData\n | DashboardVisualisationTable\n | undefined\n}\n\nexport interface DashboardVisualisationCardData {\n chart?: DashboardVisualisationData | undefined\n table?: MoJTable | undefined\n details?: ChartDetails | undefined\n}\n\nexport interface DashboardVisualisationData {\n type: DashboardVisualisationType\n options?: DashboardVisualisationDataOptions\n data: DashboardVisualisationDataValues\n}\n\ninterface DashboardVisualisationDataOptions {\n height?: number\n unit?: components['schemas']['DashboardVisualisationColumnDefinition']['unit']\n timeseries?: boolean\n}\n\nexport interface DashboardVisualisationDataValues {\n labels?: string[]\n datasets: DashboardVisualisationDataSet[]\n axis?: 'x' | 'y'\n config: ChartOptionsType\n partialDate?: PartialDate | undefined\n}\n\nexport interface DashboardVisualisationDataSet {\n label: string\n data: number[] | MatrixChartData[]\n total?: number\n}\n\nexport interface DashboardVisualisationTable {\n table: MoJTable\n ts?: string\n}\n\nexport interface MoJTable {\n head: MoJTableHead[]\n rows: MoJTableRow[][]\n}\n\nexport interface MoJTableRow {\n text?: string\n html?: string\n}\n\nexport interface MoJTableHead {\n text?: string\n html?: string\n classes?: string\n attributes?: Record<string, string>\n}\n\nexport enum DashboardVisualisationType {\n LIST = 'list',\n DONUT = 'doughnut',\n BAR = 'bar',\n LINE = 'line',\n MATRIX = 'matrix',\n MATRIX_TIMESERIES = 'matrix-timeseries',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE_TIMESERIES = 'line-timeseries',\n SCORECARD = 'scorecard',\n SCORECARD_GROUP = 'scorecard-group',\n}\n\nexport type DashboardVisualisationOptions = ListDashboardVisualisationOptions | BucketDashboardVisualisationOptions\n\nexport interface ListDashboardVisualisationOptions {\n showLatest?: boolean\n columnsAsList?: boolean\n}\n\nexport interface BucketDashboardVisualisationOptions {\n useRagColour?: boolean\n buckets?: DashboardVisualisationBucket[]\n baseColour?: string\n}\n\nexport interface DashboardVisualisationBucket {\n min?: number | undefined\n max?: number | undefined\n hexColour?: string | undefined\n}\n\nexport type VisualisationDefinitionType = z.infer<typeof DashboardVisualisationSchemas.DashboardVisualisationSchema>\nexport type VisualisationDefinitionKey = z.infer<typeof DashboardVisualisationSchemas.DashboardVisualisationKeySchema>\nexport type VisualisationDefinitionMeasure = z.infer<\n typeof DashboardVisualisationSchemas.DashboardVisualisationMeasureSchema\n>\n\nexport type ChartMeasure =\n | BarDefinitionMeasure\n | DoughnutDefinitionMeasure\n | LineDefinitionMeasure\n | VisualisationDefinitionMeasure\n\nexport type TimeseriesChartMeasure = LineTimeseriesDefinitionMeasure[] | BarTimeseriesDefinitionMeasure[]\n"],"names":["DashboardVisualisationType"],"mappings":";;AA0FYA;AAAZ,CAAA,UAAY,0BAA0B,EAAA;AACpC,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,0BAAA,CAAA,OAAA,CAAA,GAAA,UAAkB;AAClB,IAAA,0BAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,0BAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,0BAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,0BAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,0BAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACnC,IAAA,0BAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,0BAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACrC,CAAC,EAXWA,kCAA0B,KAA1BA,kCAA0B,GAAA,EAAA,CAAA,CAAA;;"}
1
+ {"version":3,"file":"types.js","sources":["../../../../../../../../../../../src/dpr/components/_dashboards/dashboard-visualisation/types.ts"],"sourcesContent":["import z from 'zod'\nimport { components } from '../../../types/api'\nimport { ChartDetails } from '../../../types/Charts'\nimport { BarTimeseriesDefinitionMeasure } from '../../_charts/chart/bar-timeseries/types'\nimport { BarDefinitionMeasure } from '../../_charts/chart/bar/types'\nimport { ChartOptionsType } from '../../_charts/chart/chart-config'\nimport { DoughnutDefinitionMeasure } from '../../_charts/chart/doughnut/types'\nimport { MatrixChartData } from '../../_charts/chart/heatmap/types'\nimport { LineTimeseriesDefinitionMeasure } from '../../_charts/chart/line-timeseries/types'\nimport { LineDefinitionMeasure } from '../../_charts/chart/line/types'\nimport { PartialDate } from '../../_filters/types'\nimport { Scorecard, ScorecardGroup } from '../scorecard/types'\nimport DashboardVisualisationSchemas from './Validate'\n\nexport interface DashboardSection {\n id: string\n title?: string\n description?: string\n visualisations?: DashboardVisualisation[]\n}\n\nexport interface DashboardVisualisation {\n id: string\n type: components['schemas']['DashboardVisualisationDefinition']['type']\n title?: string | undefined\n description?: string | undefined\n isEnabled: boolean\n data:\n | Scorecard\n | Scorecard[]\n | ScorecardGroup[]\n | DashboardVisualisationCardData\n | DashboardVisualisationTable\n | undefined\n}\n\nexport interface DashboardVisualisationCardData {\n chart?: DashboardVisualisationData | undefined\n table?: MoJTable | undefined\n details?: ChartDetails | undefined\n}\n\nexport interface DashboardVisualisationData {\n type: DashboardVisualisationType\n options?: DashboardVisualisationDataOptions\n data: DashboardVisualisationDataValues\n}\n\ninterface DashboardVisualisationDataOptions {\n height?: number\n unit?: components['schemas']['DashboardVisualisationColumnDefinition']['unit']\n timeseries?: boolean\n}\n\nexport interface DashboardVisualisationDataValues {\n labels?: string[]\n datasets: DashboardVisualisationDataSet[]\n axis?: 'x' | 'y'\n config: ChartOptionsType\n partialDate?: PartialDate | undefined\n}\n\nexport interface DashboardVisualisationDataSet {\n label: string\n data: number[] | MatrixChartData[]\n total?: number\n}\n\nexport interface DashboardVisualisationTable {\n table: MoJTable\n ts?: string\n}\n\nexport interface MoJTable {\n head: MoJTableHead[]\n rows: MoJTableRow[][]\n}\n\nexport interface MoJTableRow {\n text?: string\n html?: string\n}\n\nexport interface MoJTableHead {\n text?: string\n html?: string\n classes?: string\n attributes?: Record<string, string>\n}\n\nexport enum DashboardVisualisationType {\n LIST = 'list',\n DONUT = 'doughnut',\n BAR = 'bar',\n LINE = 'line',\n MATRIX = 'matrix',\n MATRIX_TIMESERIES = 'matrix-timeseries',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE_TIMESERIES = 'line-timeseries',\n SCORECARD = 'scorecard',\n SCORECARD_GROUP = 'scorecard-group',\n}\n\nexport type DashboardVisualisationOptions = ListDashboardVisualisationOptions | BucketDashboardVisualisationOptions\n\nexport interface ListDashboardVisualisationOptions {\n showLatest?: boolean\n columnsAsList?: boolean\n}\n\nexport interface BucketDashboardVisualisationOptions {\n useRagColour?: boolean\n buckets?: DashboardVisualisationBucket[]\n baseColour?: string\n}\n\nexport interface DashboardVisualisationBucket {\n min?: number | undefined\n max?: number | undefined\n hexColour?: string | undefined\n}\n\nexport type VisualisationDefinitionType = z.infer<typeof DashboardVisualisationSchemas.DashboardVisualisationSchema>\nexport type VisualisationDefinitionKey = z.infer<typeof DashboardVisualisationSchemas.DashboardVisualisationKeySchema>\nexport type VisualisationDefinitionMeasure = z.infer<\n typeof DashboardVisualisationSchemas.DashboardVisualisationMeasureSchema\n>\n\nexport type ChartMeasure =\n | BarDefinitionMeasure\n | DoughnutDefinitionMeasure\n | LineDefinitionMeasure\n | VisualisationDefinitionMeasure\n\nexport type TimeseriesChartMeasure = LineTimeseriesDefinitionMeasure[] | BarTimeseriesDefinitionMeasure[]\n\n// NOTE: This is a temporary type while to mock the new field which will be added the the schema in ticket https://dsdmoj.atlassian.net/browse/DPR2-2981\n// TODO: Remove this type and update all references to it when the components['schemas']['DashboardDefinition'] type is up to date\nexport type DashboardDefintion = components['schemas']['DashboardDefinition'] & {\n childVariants: components['schemas']['DashboardDefinition'][]\n}\n"],"names":["DashboardVisualisationType"],"mappings":";;AA0FYA;AAAZ,CAAA,UAAY,0BAA0B,EAAA;AACpC,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,0BAAA,CAAA,OAAA,CAAA,GAAA,UAAkB;AAClB,IAAA,0BAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,0BAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,0BAAA,CAAA,QAAA,CAAA,GAAA,QAAiB;AACjB,IAAA,0BAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC;AACvC,IAAA,0BAAA,CAAA,gBAAA,CAAA,GAAA,gBAAiC;AACjC,IAAA,0BAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACnC,IAAA,0BAAA,CAAA,WAAA,CAAA,GAAA,WAAuB;AACvB,IAAA,0BAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACrC,CAAC,EAXWA,kCAA0B,KAA1BA,kCAA0B,GAAA,EAAA,CAAA,CAAA;;"}
@@ -9,6 +9,7 @@ var utils$1 = require('./my-reports-list-item/utils.js');
9
9
  var logger = require('../../utils/logger.js');
10
10
  var getReportStatus = require('../../utils/ReportStatus/getReportStatus.js');
11
11
  var captureError = require('../../utils/captureError.js');
12
+ var utils$2 = require('../truncate/utils.js');
12
13
 
13
14
  /**
14
15
  * Initialises the "My Reports" component data
@@ -204,7 +205,7 @@ const buildBookmarkListItems = async (res, services) => {
204
205
  reportName,
205
206
  reportType,
206
207
  },
207
- description,
208
+ description: utils$2.renderTruncateAsHtml({ stringValue: description, classes: 'govuk-body-s', charLength: 50 }),
208
209
  actions: buildBookmarkActionsCell(bookmark, res),
209
210
  };
210
211
  });
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/my-reports/utils.ts"],"sourcesContent":["import { Request, Response } from 'express'\nimport { Services } from '../../types/Services'\nimport {\n DprMyReport,\n DprMyReportActionBookmark,\n DprMyReportActions,\n DprMyReportHeading,\n DprMyReportItem,\n DprMyReportListConfig,\n HeadingConfig,\n ListType,\n MappedBookmarks,\n MyReportsListTotals,\n MyReportsOptions,\n ViewAction,\n} from './types'\nimport LocalsHelper, { getRouteLocals } from '../../utils/localsHelper'\nimport { BookmarkStoreData } from '../../types/Bookmark'\nimport { LoadType, ReportType, RequestStatus, StoredReportData } from '../../types/UserReports'\nimport { buildMyReportListRow } from './my-reports-list-item/utils'\nimport logger from '../../utils/logger'\nimport {\n expireFinishedReports,\n recordExpiryCheck,\n shouldRunExpiryCheck,\n} from '../../utils/ReportStatus/getReportStatus'\nimport { captureDprError } from '../../utils/captureError'\n\n/**\n * Initialises the \"My Reports\" component data\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @return {*} {DprMyReport}\n */\nexport const initMyReports = async (\n req: Request,\n res: Response,\n services: Services,\n options?: MyReportsOptions | undefined,\n): Promise<DprMyReport | undefined> => {\n const { bookmarkingEnabled } = LocalsHelper.getValues(res)\n await checkExpiredAndGetReports(res, services)\n\n return {\n ...(bookmarkingEnabled && { bookmarks: await initBookmarks(res, services) }),\n requested: await initRequested(req, res, options),\n viewed: await initViewed(req, res, options),\n removedReports: res.locals['removedReports'],\n }\n}\n\nconst checkExpiredAndGetReports = async (res: Response, services: Services) => {\n const { requestedReports, recentlyViewedReports } = LocalsHelper.getValues(res)\n\n if (shouldRunExpiryCheck(res.req.session)) {\n try {\n const refreshedReports = await expireFinishedReports({\n requestedReports,\n recentlyViewedReports,\n services,\n res,\n })\n\n res.locals['requestedReports'] = refreshedReports.requestedReports\n res.locals['recentlyViewedReports'] = refreshedReports.recentlyViewedReports\n\n recordExpiryCheck(res.req.session)\n } catch (error) {\n logger.error(error)\n }\n }\n\n return {\n requestedReports,\n recentlyViewedReports,\n }\n}\n\n/**\n * Init bookmarks list\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @return {*} {DprMyReportListConfig}\n */\nconst initBookmarks = async (\n res: Response,\n services: Services,\n options?: MyReportsOptions | undefined,\n): Promise<DprMyReportListConfig> => {\n const totalItems = await buildBookmarkListItems(res, services)\n const totals = buildTotals(res, totalItems, ListType.BOOKMARKS, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Bookmarks',\n listType: ListType.BOOKMARKS,\n headings: buildHeadings(ListType.BOOKMARKS),\n items,\n totals,\n }\n}\n\n/**\n * Init Requested Reports list\n *\n * @param {Request} req\n * @param {Response} res\n * @return {*}\n */\nexport const initRequested = async (req: Request, res: Response, options?: MyReportsOptions | undefined) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const totalItems = await buildListItems(req, res, ListType.REQUESTED)\n const totals = buildTotals(res, totalItems, ListType.REQUESTED, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Requested reports',\n listType: ListType.REQUESTED,\n csrfToken,\n headings: buildHeadings(ListType.REQUESTED),\n items,\n totals,\n }\n}\n\n/**\n * Init Viewed reports list\n *\n * @param {Request} req\n * @param {Response} res\n * @return {*}\n */\nexport const initViewed = async (req: Request, res: Response, options?: MyReportsOptions | undefined) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const totalItems = await buildListItems(req, res, ListType.VIEWED)\n const totals = buildTotals(res, totalItems, ListType.VIEWED, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Recently viewed',\n listType: ListType.VIEWED,\n csrfToken,\n headings: buildHeadings(ListType.VIEWED),\n items,\n totals,\n }\n}\n\n// ----------------------------------------------\n// LIST ITEMS\n// -----------------------------------------------\n\n/**\n * Builds the requested & views list items\n *\n * @param {Request} req\n * @param {Response} res\n * @param {ListType} listType\n * @return {*} {DprMyReportItem[]}\n */\nconst buildListItems = async (req: Request, res: Response, listType: ListType): Promise<DprMyReportItem[]> => {\n const listData = await getDataForList(res, listType)\n if (!listData) {\n return []\n }\n\n return listData.map((data: StoredReportData) => {\n const status = data.status as RequestStatus\n return buildMyReportListRow(data, status, req, res, listType)\n })\n}\n\nconst cutItemsToSize = (items: DprMyReportItem[], options?: MyReportsOptions | undefined) => {\n return options?.maxRows ? items.slice(0, options.maxRows) : items\n}\n\n/**\n * Builds the list totals\n *\n * @param {Response} res\n * @param {DprMyReportItem[]} items\n * @param {ListType} listType\n * @param {(MyReportsOptions | undefined)} [options]\n * @return {*} {MyReportsListTotals}\n */\nconst buildTotals = (\n res: Response,\n items: DprMyReportItem[],\n listType: ListType,\n options?: MyReportsOptions | undefined,\n): MyReportsListTotals => {\n if (!options?.maxRows) {\n return {\n total: items.length,\n shown: items.length,\n }\n }\n\n const { maxRows } = options\n\n const total = items.length\n const shown = items.length > maxRows ? maxRows : items.length\n\n let href\n if (maxRows < total) {\n const { requestedListPath, recentlyViewedListPath, bookmarkListPath } = getRouteLocals(res)\n switch (listType) {\n case ListType.BOOKMARKS:\n href = `${bookmarkListPath}/list`\n break\n case ListType.REQUESTED:\n href = `${requestedListPath}/list`\n break\n case ListType.VIEWED:\n href = `${recentlyViewedListPath}/list`\n break\n default:\n href = `${requestedListPath}/list`\n break\n }\n }\n return {\n total: items.length,\n shown,\n href,\n maxRows,\n }\n}\n\n/**\n * Builds the bookmark list items\n *\n * @param {Response} res\n * @param {Services} services\n * @return {*} {Promise<DprMyReportItem[]>}\n */\nconst buildBookmarkListItems = async (res: Response, services: Services): Promise<DprMyReportItem[]> => {\n const { bookmarks } = LocalsHelper.getValues(res)\n\n // loop it\n if (!bookmarks) {\n return []\n }\n\n // gather data for loop.\n const mappedBookmarks: MappedBookmarks[] = await mapBookmarks(bookmarks, services, res)\n\n return mappedBookmarks.map(bookmark => {\n const { name, reportName, reportType, description } = bookmark\n return {\n title: {\n productName: name,\n reportName,\n reportType,\n },\n description,\n actions: buildBookmarkActionsCell(bookmark, res),\n }\n })\n}\n\n/**\n * Map bookmarks to display data\n *\n * @param {BookmarkStoreData[]} bookmarks\n * @param {Services} services\n * @param {Response} res\n * @return {*}\n */\nconst mapBookmarks = async (\n bookmarks: BookmarkStoreData[],\n services: Services,\n res: Response,\n): Promise<MappedBookmarks[]> => {\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n\n const mapped = await Promise.all(\n bookmarks.map(async bm => {\n try {\n const resolved = await resolveBookmarkDefinition(bm, services, token, definitionsPath)\n\n return {\n id: resolved.sourceId,\n reportId: bm.reportId,\n name: resolved.name,\n reportName: resolved.reportName,\n reportType: resolved.reportType,\n description: resolved.description,\n loadType: resolved.loadType,\n }\n } catch (error) {\n const meta = {\n reportId: bm.reportId,\n id: bm.variantId || bm.id,\n }\n captureDprError(error, `Unable to get info for bookmark`, meta)\n\n return null\n }\n }),\n )\n\n return mapped.filter((bm): bm is MappedBookmarks => bm !== null)\n}\n\n/**\n * Resolves the bookmark definition for the bookmark\n *\n * @param {BookmarkStoreData} bm\n * @param {Services} services\n * @param {string} token\n * @param {string} definitionsPath\n * @return {*}\n */\nconst resolveBookmarkDefinition = async (\n bm: BookmarkStoreData,\n services: Services,\n token: string,\n definitionsPath: string,\n) => {\n const { id, reportId, type, variantId } = bm\n const sourceId = variantId || id\n\n const summary = await services.reportingService.getDefinitionSummary(token, reportId, definitionsPath)\n\n if (!type || type === ReportType.REPORT) {\n const definition = await services.reportingService.getDefinition(token, reportId, sourceId, definitionsPath)\n const defSummary = summary.variants.find(v => v.id === sourceId)\n\n return {\n sourceId,\n reportType: ReportType.REPORT,\n reportName: definition.variant.name,\n name: definition.name,\n description: definition.variant.description || definition.description || '',\n loadType: defSummary?.loadType ? (defSummary.loadType as LoadType) : LoadType.ASYNC,\n }\n }\n\n const definition = await services.dashboardService.getDefinition(token, reportId, sourceId, definitionsPath)\n const defSummary = summary.dashboards?.find(d => d.id === sourceId)\n\n return {\n sourceId,\n reportType: type,\n reportName: definition?.name || '',\n name: summary?.name || '',\n description: definition?.description || summary?.description || '',\n loadType: defSummary?.loadType ? (defSummary.loadType as LoadType) : LoadType.ASYNC,\n }\n}\n\n/**\n * Builds the bookmark actions cell\n *\n * @param {*} data\n * @param {Response} res\n * @return {*} {DprMyReportActions}\n */\nconst buildBookmarkActionsCell = (data: MappedBookmarks, res: Response): DprMyReportActions => {\n const { load, request } = buildLoadRequestAction(res, data)\n const bookmark = buildBookmarkRemoveAction(res, data)\n\n return {\n ...(load && { load }),\n ...(request && { request }),\n bookmark,\n }\n}\n\n/**\n * Build the load/request links config\n *\n * @param {Response} res\n * @param {MappedBookmarks} data\n * @return {*}\n */\nconst buildLoadRequestAction = (res: Response, data: MappedBookmarks) => {\n const { loadType, reportType, reportId, id } = data\n const { requestReportPath, viewReportPath } = getRouteLocals(res)\n\n let load: ViewAction | undefined\n let request: ViewAction | undefined\n\n if (loadType === LoadType.SYNC) {\n const href = `${viewReportPath}/sync/${reportId}/${id}`\n load = {\n href,\n reportType,\n }\n } else {\n const href = `${requestReportPath}/${reportType}/${reportId}/${id}/filters`\n request = {\n href,\n reportType,\n }\n }\n\n return {\n load,\n request,\n }\n}\n\n/**\n * Build the bookmark link config\n *\n * @param {Response} res\n * @param {MappedBookmarks} data\n * @return {*}\n */\nconst buildBookmarkRemoveAction = (res: Response, data: MappedBookmarks): DprMyReportActionBookmark => {\n const { reportId, id, reportType } = data\n const { csrfToken } = LocalsHelper.getValues(res)\n const { bookmarkActionEndpoint } = LocalsHelper.getRouteLocals(res)\n\n return {\n reportId,\n id,\n reportType,\n csrfToken,\n bookmarkActionEndpoint,\n linkType: 'remove',\n linkText: 'Remove bookmark',\n }\n}\n\n/**\n * Gets the relevant data to build the list\n *\n * @param {Response} res\n * @param {ListType} listType\n * @return {*} {(StoredReportData[] | undefined)}\n */\nconst getDataForList = async (res: Response, listType: ListType): Promise<StoredReportData[] | undefined> => {\n const { requestedReports, recentlyViewedReports } = LocalsHelper.getValues(res)\n\n switch (listType) {\n case ListType.REQUESTED:\n // Only show reports in the list that have not been viewed\n return requestedReports.filter(report => {\n return report.timestamp ? !report.timestamp.lastViewed : false\n })\n case ListType.VIEWED:\n // Only show READY or EXPIRED reports\n return recentlyViewedReports.filter(report => {\n return Boolean(\n report.status === RequestStatus.READY ||\n Boolean(report.executionId?.length && report.status === RequestStatus.EXPIRED),\n )\n })\n default:\n return undefined\n }\n}\n\n// ----------------------------------------------\n// HEADINGS\n// -----------------------------------------------\n\n/**\n * Builds the headings\n *\n * @param {ListType} listType\n * @return {*} {DprMyReportHeading[]}\n */\nconst buildHeadings = (listType: ListType): DprMyReportHeading[] => {\n return ALL_HEADINGS.filter(heading => heading.showIn.includes(listType))\n}\n\nconst ALL_HEADINGS: HeadingConfig[] = [\n {\n key: 'title',\n name: 'Product',\n classes: 'dpr-my-reports__cell--title',\n showIn: [ListType.BOOKMARKS, ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'description',\n name: 'Description',\n classes: 'dpr-my-reports__cell--description',\n showIn: [ListType.BOOKMARKS],\n },\n {\n key: 'filters',\n name: 'Filters',\n classes: 'dpr-my-reports__cell--filters',\n showIn: [ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'status',\n name: 'Status',\n classes: 'dpr-my-reports__cell--status',\n showIn: [ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'actions',\n name: 'Actions',\n classes: 'dpr-my-reports__cell--actions',\n showIn: [ListType.BOOKMARKS, ListType.REQUESTED, ListType.VIEWED],\n },\n]\n\nexport default {\n initMyReports,\n}\n"],"names":["LocalsHelper","shouldRunExpiryCheck","expireFinishedReports","recordExpiryCheck","logger","ListType","buildMyReportListRow","getRouteLocals","captureDprError","ReportType","LoadType","RequestStatus"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/my-reports/utils.ts"],"sourcesContent":["import { Request, Response } from 'express'\nimport { Services } from '../../types/Services'\nimport {\n DprMyReport,\n DprMyReportActionBookmark,\n DprMyReportActions,\n DprMyReportHeading,\n DprMyReportItem,\n DprMyReportListConfig,\n HeadingConfig,\n ListType,\n MappedBookmarks,\n MyReportsListTotals,\n MyReportsOptions,\n ViewAction,\n} from './types'\nimport LocalsHelper, { getRouteLocals } from '../../utils/localsHelper'\nimport { BookmarkStoreData } from '../../types/Bookmark'\nimport { LoadType, ReportType, RequestStatus, StoredReportData } from '../../types/UserReports'\nimport { buildMyReportListRow } from './my-reports-list-item/utils'\nimport logger from '../../utils/logger'\nimport {\n expireFinishedReports,\n recordExpiryCheck,\n shouldRunExpiryCheck,\n} from '../../utils/ReportStatus/getReportStatus'\nimport { captureDprError } from '../../utils/captureError'\nimport { renderTruncateAsHtml } from '../truncate/utils'\n\n/**\n * Initialises the \"My Reports\" component data\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @return {*} {DprMyReport}\n */\nexport const initMyReports = async (\n req: Request,\n res: Response,\n services: Services,\n options?: MyReportsOptions | undefined,\n): Promise<DprMyReport | undefined> => {\n const { bookmarkingEnabled } = LocalsHelper.getValues(res)\n await checkExpiredAndGetReports(res, services)\n\n return {\n ...(bookmarkingEnabled && { bookmarks: await initBookmarks(res, services) }),\n requested: await initRequested(req, res, options),\n viewed: await initViewed(req, res, options),\n removedReports: res.locals['removedReports'],\n }\n}\n\nconst checkExpiredAndGetReports = async (res: Response, services: Services) => {\n const { requestedReports, recentlyViewedReports } = LocalsHelper.getValues(res)\n\n if (shouldRunExpiryCheck(res.req.session)) {\n try {\n const refreshedReports = await expireFinishedReports({\n requestedReports,\n recentlyViewedReports,\n services,\n res,\n })\n\n res.locals['requestedReports'] = refreshedReports.requestedReports\n res.locals['recentlyViewedReports'] = refreshedReports.recentlyViewedReports\n\n recordExpiryCheck(res.req.session)\n } catch (error) {\n logger.error(error)\n }\n }\n\n return {\n requestedReports,\n recentlyViewedReports,\n }\n}\n\n/**\n * Init bookmarks list\n *\n * @param {Request} req\n * @param {Response} res\n * @param {Services} services\n * @return {*} {DprMyReportListConfig}\n */\nconst initBookmarks = async (\n res: Response,\n services: Services,\n options?: MyReportsOptions | undefined,\n): Promise<DprMyReportListConfig> => {\n const totalItems = await buildBookmarkListItems(res, services)\n const totals = buildTotals(res, totalItems, ListType.BOOKMARKS, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Bookmarks',\n listType: ListType.BOOKMARKS,\n headings: buildHeadings(ListType.BOOKMARKS),\n items,\n totals,\n }\n}\n\n/**\n * Init Requested Reports list\n *\n * @param {Request} req\n * @param {Response} res\n * @return {*}\n */\nexport const initRequested = async (req: Request, res: Response, options?: MyReportsOptions | undefined) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const totalItems = await buildListItems(req, res, ListType.REQUESTED)\n const totals = buildTotals(res, totalItems, ListType.REQUESTED, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Requested reports',\n listType: ListType.REQUESTED,\n csrfToken,\n headings: buildHeadings(ListType.REQUESTED),\n items,\n totals,\n }\n}\n\n/**\n * Init Viewed reports list\n *\n * @param {Request} req\n * @param {Response} res\n * @return {*}\n */\nexport const initViewed = async (req: Request, res: Response, options?: MyReportsOptions | undefined) => {\n const { csrfToken } = LocalsHelper.getValues(res)\n const totalItems = await buildListItems(req, res, ListType.VIEWED)\n const totals = buildTotals(res, totalItems, ListType.VIEWED, options)\n const items = cutItemsToSize(totalItems, options)\n\n return {\n title: 'Recently viewed',\n listType: ListType.VIEWED,\n csrfToken,\n headings: buildHeadings(ListType.VIEWED),\n items,\n totals,\n }\n}\n\n// ----------------------------------------------\n// LIST ITEMS\n// -----------------------------------------------\n\n/**\n * Builds the requested & views list items\n *\n * @param {Request} req\n * @param {Response} res\n * @param {ListType} listType\n * @return {*} {DprMyReportItem[]}\n */\nconst buildListItems = async (req: Request, res: Response, listType: ListType): Promise<DprMyReportItem[]> => {\n const listData = await getDataForList(res, listType)\n if (!listData) {\n return []\n }\n\n return listData.map((data: StoredReportData) => {\n const status = data.status as RequestStatus\n return buildMyReportListRow(data, status, req, res, listType)\n })\n}\n\nconst cutItemsToSize = (items: DprMyReportItem[], options?: MyReportsOptions | undefined) => {\n return options?.maxRows ? items.slice(0, options.maxRows) : items\n}\n\n/**\n * Builds the list totals\n *\n * @param {Response} res\n * @param {DprMyReportItem[]} items\n * @param {ListType} listType\n * @param {(MyReportsOptions | undefined)} [options]\n * @return {*} {MyReportsListTotals}\n */\nconst buildTotals = (\n res: Response,\n items: DprMyReportItem[],\n listType: ListType,\n options?: MyReportsOptions | undefined,\n): MyReportsListTotals => {\n if (!options?.maxRows) {\n return {\n total: items.length,\n shown: items.length,\n }\n }\n\n const { maxRows } = options\n\n const total = items.length\n const shown = items.length > maxRows ? maxRows : items.length\n\n let href\n if (maxRows < total) {\n const { requestedListPath, recentlyViewedListPath, bookmarkListPath } = getRouteLocals(res)\n switch (listType) {\n case ListType.BOOKMARKS:\n href = `${bookmarkListPath}/list`\n break\n case ListType.REQUESTED:\n href = `${requestedListPath}/list`\n break\n case ListType.VIEWED:\n href = `${recentlyViewedListPath}/list`\n break\n default:\n href = `${requestedListPath}/list`\n break\n }\n }\n return {\n total: items.length,\n shown,\n href,\n maxRows,\n }\n}\n\n/**\n * Builds the bookmark list items\n *\n * @param {Response} res\n * @param {Services} services\n * @return {*} {Promise<DprMyReportItem[]>}\n */\nconst buildBookmarkListItems = async (res: Response, services: Services): Promise<DprMyReportItem[]> => {\n const { bookmarks } = LocalsHelper.getValues(res)\n\n // loop it\n if (!bookmarks) {\n return []\n }\n\n // gather data for loop.\n const mappedBookmarks: MappedBookmarks[] = await mapBookmarks(bookmarks, services, res)\n\n return mappedBookmarks.map(bookmark => {\n const { name, reportName, reportType, description } = bookmark\n return {\n title: {\n productName: name,\n reportName,\n reportType,\n },\n description: renderTruncateAsHtml({ stringValue: description, classes: 'govuk-body-s', charLength: 50 }),\n actions: buildBookmarkActionsCell(bookmark, res),\n }\n })\n}\n\n/**\n * Map bookmarks to display data\n *\n * @param {BookmarkStoreData[]} bookmarks\n * @param {Services} services\n * @param {Response} res\n * @return {*}\n */\nconst mapBookmarks = async (\n bookmarks: BookmarkStoreData[],\n services: Services,\n res: Response,\n): Promise<MappedBookmarks[]> => {\n const { token, definitionsPath } = LocalsHelper.getValues(res)\n\n const mapped = await Promise.all(\n bookmarks.map(async bm => {\n try {\n const resolved = await resolveBookmarkDefinition(bm, services, token, definitionsPath)\n\n return {\n id: resolved.sourceId,\n reportId: bm.reportId,\n name: resolved.name,\n reportName: resolved.reportName,\n reportType: resolved.reportType,\n description: resolved.description,\n loadType: resolved.loadType,\n }\n } catch (error) {\n const meta = {\n reportId: bm.reportId,\n id: bm.variantId || bm.id,\n }\n captureDprError(error, `Unable to get info for bookmark`, meta)\n\n return null\n }\n }),\n )\n\n return mapped.filter((bm): bm is MappedBookmarks => bm !== null)\n}\n\n/**\n * Resolves the bookmark definition for the bookmark\n *\n * @param {BookmarkStoreData} bm\n * @param {Services} services\n * @param {string} token\n * @param {string} definitionsPath\n * @return {*}\n */\nconst resolveBookmarkDefinition = async (\n bm: BookmarkStoreData,\n services: Services,\n token: string,\n definitionsPath: string,\n) => {\n const { id, reportId, type, variantId } = bm\n const sourceId = variantId || id\n\n const summary = await services.reportingService.getDefinitionSummary(token, reportId, definitionsPath)\n\n if (!type || type === ReportType.REPORT) {\n const definition = await services.reportingService.getDefinition(token, reportId, sourceId, definitionsPath)\n const defSummary = summary.variants.find(v => v.id === sourceId)\n\n return {\n sourceId,\n reportType: ReportType.REPORT,\n reportName: definition.variant.name,\n name: definition.name,\n description: definition.variant.description || definition.description || '',\n loadType: defSummary?.loadType ? (defSummary.loadType as LoadType) : LoadType.ASYNC,\n }\n }\n\n const definition = await services.dashboardService.getDefinition(token, reportId, sourceId, definitionsPath)\n const defSummary = summary.dashboards?.find(d => d.id === sourceId)\n\n return {\n sourceId,\n reportType: type,\n reportName: definition?.name || '',\n name: summary?.name || '',\n description: definition?.description || summary?.description || '',\n loadType: defSummary?.loadType ? (defSummary.loadType as LoadType) : LoadType.ASYNC,\n }\n}\n\n/**\n * Builds the bookmark actions cell\n *\n * @param {*} data\n * @param {Response} res\n * @return {*} {DprMyReportActions}\n */\nconst buildBookmarkActionsCell = (data: MappedBookmarks, res: Response): DprMyReportActions => {\n const { load, request } = buildLoadRequestAction(res, data)\n const bookmark = buildBookmarkRemoveAction(res, data)\n\n return {\n ...(load && { load }),\n ...(request && { request }),\n bookmark,\n }\n}\n\n/**\n * Build the load/request links config\n *\n * @param {Response} res\n * @param {MappedBookmarks} data\n * @return {*}\n */\nconst buildLoadRequestAction = (res: Response, data: MappedBookmarks) => {\n const { loadType, reportType, reportId, id } = data\n const { requestReportPath, viewReportPath } = getRouteLocals(res)\n\n let load: ViewAction | undefined\n let request: ViewAction | undefined\n\n if (loadType === LoadType.SYNC) {\n const href = `${viewReportPath}/sync/${reportId}/${id}`\n load = {\n href,\n reportType,\n }\n } else {\n const href = `${requestReportPath}/${reportType}/${reportId}/${id}/filters`\n request = {\n href,\n reportType,\n }\n }\n\n return {\n load,\n request,\n }\n}\n\n/**\n * Build the bookmark link config\n *\n * @param {Response} res\n * @param {MappedBookmarks} data\n * @return {*}\n */\nconst buildBookmarkRemoveAction = (res: Response, data: MappedBookmarks): DprMyReportActionBookmark => {\n const { reportId, id, reportType } = data\n const { csrfToken } = LocalsHelper.getValues(res)\n const { bookmarkActionEndpoint } = LocalsHelper.getRouteLocals(res)\n\n return {\n reportId,\n id,\n reportType,\n csrfToken,\n bookmarkActionEndpoint,\n linkType: 'remove',\n linkText: 'Remove bookmark',\n }\n}\n\n/**\n * Gets the relevant data to build the list\n *\n * @param {Response} res\n * @param {ListType} listType\n * @return {*} {(StoredReportData[] | undefined)}\n */\nconst getDataForList = async (res: Response, listType: ListType): Promise<StoredReportData[] | undefined> => {\n const { requestedReports, recentlyViewedReports } = LocalsHelper.getValues(res)\n\n switch (listType) {\n case ListType.REQUESTED:\n // Only show reports in the list that have not been viewed\n return requestedReports.filter(report => {\n return report.timestamp ? !report.timestamp.lastViewed : false\n })\n case ListType.VIEWED:\n // Only show READY or EXPIRED reports\n return recentlyViewedReports.filter(report => {\n return Boolean(\n report.status === RequestStatus.READY ||\n Boolean(report.executionId?.length && report.status === RequestStatus.EXPIRED),\n )\n })\n default:\n return undefined\n }\n}\n\n// ----------------------------------------------\n// HEADINGS\n// -----------------------------------------------\n\n/**\n * Builds the headings\n *\n * @param {ListType} listType\n * @return {*} {DprMyReportHeading[]}\n */\nconst buildHeadings = (listType: ListType): DprMyReportHeading[] => {\n return ALL_HEADINGS.filter(heading => heading.showIn.includes(listType))\n}\n\nconst ALL_HEADINGS: HeadingConfig[] = [\n {\n key: 'title',\n name: 'Product',\n classes: 'dpr-my-reports__cell--title',\n showIn: [ListType.BOOKMARKS, ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'description',\n name: 'Description',\n classes: 'dpr-my-reports__cell--description',\n showIn: [ListType.BOOKMARKS],\n },\n {\n key: 'filters',\n name: 'Filters',\n classes: 'dpr-my-reports__cell--filters',\n showIn: [ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'status',\n name: 'Status',\n classes: 'dpr-my-reports__cell--status',\n showIn: [ListType.REQUESTED, ListType.VIEWED],\n },\n {\n key: 'actions',\n name: 'Actions',\n classes: 'dpr-my-reports__cell--actions',\n showIn: [ListType.BOOKMARKS, ListType.REQUESTED, ListType.VIEWED],\n },\n]\n\nexport default {\n initMyReports,\n}\n"],"names":["LocalsHelper","shouldRunExpiryCheck","expireFinishedReports","recordExpiryCheck","logger","ListType","buildMyReportListRow","getRouteLocals","renderTruncateAsHtml","captureDprError","ReportType","LoadType","RequestStatus"],"mappings":";;;;;;;;;;;;;AA6BA;;;;;;;AAOG;AACI,MAAM,aAAa,GAAG,OAC3B,GAAY,EACZ,GAAa,EACb,QAAkB,EAClB,OAAsC,KACF;IACpC,MAAM,EAAE,kBAAkB,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AAC1D,IAAA,MAAM,yBAAyB,CAAC,GAAG,EAAE,QAAQ,CAAC;IAE9C,OAAO;AACL,QAAA,IAAI,kBAAkB,IAAI,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC5E,SAAS,EAAE,MAAM,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;QACjD,MAAM,EAAE,MAAM,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC;AAC3C,QAAA,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC;KAC7C;AACH;AAEA,MAAM,yBAAyB,GAAG,OAAO,GAAa,EAAE,QAAkB,KAAI;AAC5E,IAAA,MAAM,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;IAE/E,IAAIC,oCAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;AACzC,QAAA,IAAI;AACF,YAAA,MAAM,gBAAgB,GAAG,MAAMC,qCAAqB,CAAC;gBACnD,gBAAgB;gBAChB,qBAAqB;gBACrB,QAAQ;gBACR,GAAG;AACJ,aAAA,CAAC;YAEF,GAAG,CAAC,MAAM,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC,gBAAgB;YAClE,GAAG,CAAC,MAAM,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAAC,qBAAqB;AAE5E,YAAAC,iCAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC;QACpC;QAAE,OAAO,KAAK,EAAE;AACd,YAAAC,cAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QACrB;IACF;IAEA,OAAO;QACL,gBAAgB;QAChB,qBAAqB;KACtB;AACH,CAAC;AAED;;;;;;;AAOG;AACH,MAAM,aAAa,GAAG,OACpB,GAAa,EACb,QAAkB,EAClB,OAAsC,KACJ;IAClC,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,QAAQ,CAAC;AAC9D,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,EAAEC,cAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IACxE,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC;IAEjD,OAAO;AACL,QAAA,KAAK,EAAE,WAAW;QAClB,QAAQ,EAAEA,cAAQ,CAAC,SAAS;AAC5B,QAAA,QAAQ,EAAE,aAAa,CAACA,cAAQ,CAAC,SAAS,CAAC;QAC3C,KAAK;QACL,MAAM;KACP;AACH,CAAC;AAED;;;;;;AAMG;AACI,MAAM,aAAa,GAAG,OAAO,GAAY,EAAE,GAAa,EAAE,OAAsC,KAAI;IACzG,MAAM,EAAE,SAAS,EAAE,GAAGL,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAEK,cAAQ,CAAC,SAAS,CAAC;AACrE,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,EAAEA,cAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IACxE,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC;IAEjD,OAAO;AACL,QAAA,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAEA,cAAQ,CAAC,SAAS;QAC5B,SAAS;AACT,QAAA,QAAQ,EAAE,aAAa,CAACA,cAAQ,CAAC,SAAS,CAAC;QAC3C,KAAK;QACL,MAAM;KACP;AACH;AAEA;;;;;;AAMG;AACI,MAAM,UAAU,GAAG,OAAO,GAAY,EAAE,GAAa,EAAE,OAAsC,KAAI;IACtG,MAAM,EAAE,SAAS,EAAE,GAAGL,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AACjD,IAAA,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAEK,cAAQ,CAAC,MAAM,CAAC;AAClE,IAAA,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,UAAU,EAAEA,cAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACrE,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC;IAEjD,OAAO;AACL,QAAA,KAAK,EAAE,iBAAiB;QACxB,QAAQ,EAAEA,cAAQ,CAAC,MAAM;QACzB,SAAS;AACT,QAAA,QAAQ,EAAE,aAAa,CAACA,cAAQ,CAAC,MAAM,CAAC;QACxC,KAAK;QACL,MAAM;KACP;AACH;AAEA;AACA;AACA;AAEA;;;;;;;AAOG;AACH,MAAM,cAAc,GAAG,OAAO,GAAY,EAAE,GAAa,EAAE,QAAkB,KAAgC;IAC3G,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE;AACb,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAsB,KAAI;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAuB;AAC3C,QAAA,OAAOC,4BAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC;AAC/D,IAAA,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,KAAwB,EAAE,OAAsC,KAAI;IAC1F,OAAO,OAAO,EAAE,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,KAAK;AACnE,CAAC;AAED;;;;;;;;AAQG;AACH,MAAM,WAAW,GAAG,CAClB,GAAa,EACb,KAAwB,EACxB,QAAkB,EAClB,OAAsC,KACf;AACvB,IAAA,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE;QACrB,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,MAAM;YACnB,KAAK,EAAE,KAAK,CAAC,MAAM;SACpB;IACH;AAEA,IAAA,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO;AAE3B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM;AAC1B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,KAAK,CAAC,MAAM;AAE7D,IAAA,IAAI,IAAI;AACR,IAAA,IAAI,OAAO,GAAG,KAAK,EAAE;AACnB,QAAA,MAAM,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,GAAGC,2BAAc,CAAC,GAAG,CAAC;QAC3F,QAAQ,QAAQ;YACd,KAAKF,cAAQ,CAAC,SAAS;AACrB,gBAAA,IAAI,GAAG,CAAA,EAAG,gBAAgB,CAAA,KAAA,CAAO;gBACjC;YACF,KAAKA,cAAQ,CAAC,SAAS;AACrB,gBAAA,IAAI,GAAG,CAAA,EAAG,iBAAiB,CAAA,KAAA,CAAO;gBAClC;YACF,KAAKA,cAAQ,CAAC,MAAM;AAClB,gBAAA,IAAI,GAAG,CAAA,EAAG,sBAAsB,CAAA,KAAA,CAAO;gBACvC;AACF,YAAA;AACE,gBAAA,IAAI,GAAG,CAAA,EAAG,iBAAiB,CAAA,KAAA,CAAO;gBAClC;;IAEN;IACA,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM;QACnB,KAAK;QACL,IAAI;QACJ,OAAO;KACR;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,sBAAsB,GAAG,OAAO,GAAa,EAAE,QAAkB,KAAgC;IACrG,MAAM,EAAE,SAAS,EAAE,GAAGL,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;;IAGjD,IAAI,CAAC,SAAS,EAAE;AACd,QAAA,OAAO,EAAE;IACX;;IAGA,MAAM,eAAe,GAAsB,MAAM,YAAY,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC;AAEvF,IAAA,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,IAAG;QACpC,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,QAAQ;QAC9D,OAAO;AACL,YAAA,KAAK,EAAE;AACL,gBAAA,WAAW,EAAE,IAAI;gBACjB,UAAU;gBACV,UAAU;AACX,aAAA;AACD,YAAA,WAAW,EAAEQ,4BAAoB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;AACxG,YAAA,OAAO,EAAE,wBAAwB,CAAC,QAAQ,EAAE,GAAG,CAAC;SACjD;AACH,IAAA,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;AAOG;AACH,MAAM,YAAY,GAAG,OACnB,SAA8B,EAC9B,QAAkB,EAClB,GAAa,KACiB;AAC9B,IAAA,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,GAAGR,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;AAE9D,IAAA,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,SAAS,CAAC,GAAG,CAAC,OAAM,EAAE,KAAG;AACvB,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,yBAAyB,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC;YAEtF,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,QAAQ;gBACrB,QAAQ,EAAE,EAAE,CAAC,QAAQ;gBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,IAAI,GAAG;gBACX,QAAQ,EAAE,EAAE,CAAC,QAAQ;AACrB,gBAAA,EAAE,EAAE,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE;aAC1B;AACD,YAAAS,4BAAe,CAAC,KAAK,EAAE,iCAAiC,EAAE,IAAI,CAAC;AAE/D,YAAA,OAAO,IAAI;QACb;IACF,CAAC,CAAC,CACH;AAED,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,KAA4B,EAAE,KAAK,IAAI,CAAC;AAClE,CAAC;AAED;;;;;;;;AAQG;AACH,MAAM,yBAAyB,GAAG,OAChC,EAAqB,EACrB,QAAkB,EAClB,KAAa,EACb,eAAuB,KACrB;IACF,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE;AAC5C,IAAA,MAAM,QAAQ,GAAG,SAAS,IAAI,EAAE;AAEhC,IAAA,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,eAAe,CAAC;IAEtG,IAAI,CAAC,IAAI,IAAI,IAAI,KAAKC,sBAAU,CAAC,MAAM,EAAE;AACvC,QAAA,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC;AAC5G,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;QAEhE,OAAO;YACL,QAAQ;YACR,UAAU,EAAEA,sBAAU,CAAC,MAAM;AAC7B,YAAA,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI;YACnC,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,IAAI,UAAU,CAAC,WAAW,IAAI,EAAE;AAC3E,YAAA,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAI,UAAU,CAAC,QAAqB,GAAGC,oBAAQ,CAAC,KAAK;SACpF;IACH;AAEA,IAAA,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC;AAC5G,IAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC;IAEnE,OAAO;QACL,QAAQ;AACR,QAAA,UAAU,EAAE,IAAI;AAChB,QAAA,UAAU,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE;AAClC,QAAA,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE;QACzB,WAAW,EAAE,UAAU,EAAE,WAAW,IAAI,OAAO,EAAE,WAAW,IAAI,EAAE;AAClE,QAAA,QAAQ,EAAE,UAAU,EAAE,QAAQ,GAAI,UAAU,CAAC,QAAqB,GAAGA,oBAAQ,CAAC,KAAK;KACpF;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,wBAAwB,GAAG,CAAC,IAAqB,EAAE,GAAa,KAAwB;AAC5F,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,sBAAsB,CAAC,GAAG,EAAE,IAAI,CAAC;IAC3D,MAAM,QAAQ,GAAG,yBAAyB,CAAC,GAAG,EAAE,IAAI,CAAC;IAErD,OAAO;AACL,QAAA,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,CAAC;AACrB,QAAA,IAAI,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,QAAQ;KACT;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,sBAAsB,GAAG,CAAC,GAAa,EAAE,IAAqB,KAAI;IACtE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,IAAI;IACnD,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAGJ,2BAAc,CAAC,GAAG,CAAC;AAEjE,IAAA,IAAI,IAA4B;AAChC,IAAA,IAAI,OAA+B;AAEnC,IAAA,IAAI,QAAQ,KAAKI,oBAAQ,CAAC,IAAI,EAAE;QAC9B,MAAM,IAAI,GAAG,CAAA,EAAG,cAAc,SAAS,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE;AACvD,QAAA,IAAI,GAAG;YACL,IAAI;YACJ,UAAU;SACX;IACH;SAAO;QACL,MAAM,IAAI,GAAG,CAAA,EAAG,iBAAiB,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,EAAI,EAAE,CAAA,QAAA,CAAU;AAC3E,QAAA,OAAO,GAAG;YACR,IAAI;YACJ,UAAU;SACX;IACH;IAEA,OAAO;QACL,IAAI;QACJ,OAAO;KACR;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,yBAAyB,GAAG,CAAC,GAAa,EAAE,IAAqB,KAA+B;IACpG,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,IAAI;IACzC,MAAM,EAAE,SAAS,EAAE,GAAGX,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;IACjD,MAAM,EAAE,sBAAsB,EAAE,GAAGA,oBAAY,CAAC,cAAc,CAAC,GAAG,CAAC;IAEnE,OAAO;QACL,QAAQ;QACR,EAAE;QACF,UAAU;QACV,SAAS;QACT,sBAAsB;AACtB,QAAA,QAAQ,EAAE,QAAQ;AAClB,QAAA,QAAQ,EAAE,iBAAiB;KAC5B;AACH,CAAC;AAED;;;;;;AAMG;AACH,MAAM,cAAc,GAAG,OAAO,GAAa,EAAE,QAAkB,KAA6C;AAC1G,IAAA,MAAM,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,GAAGA,oBAAY,CAAC,SAAS,CAAC,GAAG,CAAC;IAE/E,QAAQ,QAAQ;QACd,KAAKK,cAAQ,CAAC,SAAS;;AAErB,YAAA,OAAO,gBAAgB,CAAC,MAAM,CAAC,MAAM,IAAG;AACtC,gBAAA,OAAO,MAAM,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,GAAG,KAAK;AAChE,YAAA,CAAC,CAAC;QACJ,KAAKA,cAAQ,CAAC,MAAM;;AAElB,YAAA,OAAO,qBAAqB,CAAC,MAAM,CAAC,MAAM,IAAG;gBAC3C,OAAO,OAAO,CACZ,MAAM,CAAC,MAAM,KAAKO,yBAAa,CAAC,KAAK;AACrC,oBAAA,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,IAAI,MAAM,CAAC,MAAM,KAAKA,yBAAa,CAAC,OAAO,CAAC,CAC/E;AACH,YAAA,CAAC,CAAC;AACJ,QAAA;AACE,YAAA,OAAO,SAAS;;AAEtB,CAAC;AAED;AACA;AACA;AAEA;;;;;AAKG;AACH,MAAM,aAAa,GAAG,CAAC,QAAkB,KAA0B;AACjE,IAAA,OAAO,YAAY,CAAC,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,YAAY,GAAoB;AACpC,IAAA;AACE,QAAA,GAAG,EAAE,OAAO;AACZ,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,OAAO,EAAE,6BAA6B;AACtC,QAAA,MAAM,EAAE,CAACP,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,MAAM,CAAC;AAClE,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,aAAa;AAClB,QAAA,IAAI,EAAE,aAAa;AACnB,QAAA,OAAO,EAAE,mCAAmC;AAC5C,QAAA,MAAM,EAAE,CAACA,cAAQ,CAAC,SAAS,CAAC;AAC7B,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,OAAO,EAAE,+BAA+B;QACxC,MAAM,EAAE,CAACA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,MAAM,CAAC;AAC9C,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,QAAQ;AACb,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,OAAO,EAAE,8BAA8B;QACvC,MAAM,EAAE,CAACA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,MAAM,CAAC;AAC9C,KAAA;AACD,IAAA;AACE,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,OAAO,EAAE,+BAA+B;AACxC,QAAA,MAAM,EAAE,CAACA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,SAAS,EAAEA,cAAQ,CAAC,MAAM,CAAC;AAClE,KAAA;CACF;AAED,YAAe;IACb,aAAa;CACd;;;;;;;"}
@@ -2,14 +2,16 @@
2
2
 
3
3
  var truncate = require('truncate-html');
4
4
  var nunjucks = require('nunjucks');
5
+ var sanitizeHtml = require('../../utils/sanitizeHtml.js');
5
6
 
6
7
  const initialiseTruncation = ({ stringValue, charLength = 80, showMore = true, classes, }) => {
7
- const truncatedHtml = truncate(stringValue, {
8
+ const sanitizedHtml = sanitizeHtml.sanitiseHtml(stringValue);
9
+ const truncatedHtml = truncate(sanitizedHtml, {
8
10
  length: charLength,
9
11
  });
10
- const isTruncated = truncatedHtml !== stringValue;
12
+ const isTruncated = truncatedHtml !== sanitizedHtml;
11
13
  return {
12
- fullHtml: stringValue,
14
+ fullHtml: sanitizedHtml,
13
15
  truncatedHtml,
14
16
  showMore,
15
17
  isTruncated,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/truncate/utils.ts"],"sourcesContent":["import truncate from 'truncate-html'\nimport nunjucks from 'nunjucks'\n\nexport interface TruncationOptions {\n stringValue: string\n charLength?: number\n showMore?: boolean\n classes?: string\n}\n\nexport interface TruncationModel {\n fullHtml: string\n truncatedHtml: string\n showMore: boolean\n isTruncated: boolean\n classes?: string | undefined\n}\n\nexport const initialiseTruncation = ({\n stringValue,\n charLength = 80,\n showMore = true,\n classes,\n}: TruncationOptions): TruncationModel => {\n const truncatedHtml = truncate(stringValue, {\n length: charLength,\n })\n\n const isTruncated = truncatedHtml !== stringValue\n\n return {\n fullHtml: stringValue,\n truncatedHtml,\n showMore,\n isTruncated,\n classes,\n }\n}\n\nexport const renderTruncateAsHtml = (options: TruncationOptions): string => {\n const params = initialiseTruncation(options)\n\n return nunjucks.render('dpr/components/truncate/render.njk', {\n params,\n })\n}\n"],"names":[],"mappings":";;;;;AAkBO,MAAM,oBAAoB,GAAG,CAAC,EACnC,WAAW,EACX,UAAU,GAAG,EAAE,EACf,QAAQ,GAAG,IAAI,EACf,OAAO,GACW,KAAqB;AACvC,IAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,EAAE;AAC1C,QAAA,MAAM,EAAE,UAAU;AACnB,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,aAAa,KAAK,WAAW;IAEjD,OAAO;AACL,QAAA,QAAQ,EAAE,WAAW;QACrB,aAAa;QACb,QAAQ;QACR,WAAW;QACX,OAAO;KACR;AACH;AAEO,MAAM,oBAAoB,GAAG,CAAC,OAA0B,KAAY;AACzE,IAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC;AAE5C,IAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,oCAAoC,EAAE;QAC3D,MAAM;AACP,KAAA,CAAC;AACJ;;;;;"}
1
+ {"version":3,"file":"utils.js","sources":["../../../../../../../../../../src/dpr/components/truncate/utils.ts"],"sourcesContent":["import truncate from 'truncate-html'\nimport nunjucks from 'nunjucks'\nimport { sanitiseHtml } from 'src/dpr/utils/sanitizeHtml'\n\nexport interface TruncationOptions {\n stringValue: string\n charLength?: number\n showMore?: boolean\n classes?: string\n}\n\nexport interface TruncationModel {\n fullHtml: string\n truncatedHtml: string\n showMore: boolean\n isTruncated: boolean\n classes?: string | undefined\n}\n\nexport const initialiseTruncation = ({\n stringValue,\n charLength = 80,\n showMore = true,\n classes,\n}: TruncationOptions): TruncationModel => {\n const sanitizedHtml = sanitiseHtml(stringValue)\n\n const truncatedHtml = truncate(sanitizedHtml, {\n length: charLength,\n })\n\n const isTruncated = truncatedHtml !== sanitizedHtml\n\n return {\n fullHtml: sanitizedHtml,\n truncatedHtml,\n showMore,\n isTruncated,\n classes,\n }\n}\n\nexport const renderTruncateAsHtml = (options: TruncationOptions): string => {\n const params = initialiseTruncation(options)\n\n return nunjucks.render('dpr/components/truncate/render.njk', {\n params,\n })\n}\n"],"names":["sanitiseHtml"],"mappings":";;;;;;AAmBO,MAAM,oBAAoB,GAAG,CAAC,EACnC,WAAW,EACX,UAAU,GAAG,EAAE,EACf,QAAQ,GAAG,IAAI,EACf,OAAO,GACW,KAAqB;AACvC,IAAA,MAAM,aAAa,GAAGA,yBAAY,CAAC,WAAW,CAAC;AAE/C,IAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE;AAC5C,QAAA,MAAM,EAAE,UAAU;AACnB,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,aAAa,KAAK,aAAa;IAEnD,OAAO;AACL,QAAA,QAAQ,EAAE,aAAa;QACvB,aAAa;QACb,QAAQ;QACR,WAAW;QACX,OAAO;KACR;AACH;AAEO,MAAM,oBAAoB,GAAG,CAAC,OAA0B,KAAY;AACzE,IAAA,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC;AAE5C,IAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,oCAAoC,EAAE;QAC3D,MAAM;AACP,KAAA,CAAC;AACJ;;;;;"}
@@ -2,7 +2,8 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var utils$1 = require('../../../../components/_async/async-filters-form/utils.js');
5
+ var utils$1 = require('../../../../components/_dashboards/dashboard-section/utils.js');
6
+ var utils$3 = require('../../../../components/_async/async-filters-form/utils.js');
6
7
  var localsHelper = require('../../../../utils/localsHelper.js');
7
8
  var utils = require('../../../../components/_filters/utils.js');
8
9
  var UserReports = require('../../../../types/UserReports.js');
@@ -73,79 +74,157 @@ const updateStore = async ({ req, res, services, queryData, executionData, child
73
74
  }
74
75
  await services.recentlyViewedService.removeSupersededViewedReports(removedExecutionIds, dprUser.id);
75
76
  };
76
- const requestChildReports = async (childVariants, reportingService, token, reportId, queryData, dataProductDefinitionsPath) => {
77
- let query;
78
- if (queryData) {
79
- query = queryData.query;
80
- delete query['sortColumn'];
81
- delete query['sortedAsc'];
82
- }
83
- return Promise.all(childVariants.map(childVariant => reportingService
84
- .requestAsyncReport(token, reportId, childVariant.id, {
85
- ...(query && query),
86
- ...(dataProductDefinitionsPath && { dataProductDefinitionsPath }),
87
- })
88
- .then(response => {
77
+ /**
78
+ * Request the child variants
79
+ *
80
+ * @param {(Array<components['schemas']['ChildVariantDefinition']>
81
+ * | Array<components['schemas']['DashboardDefinition']>)} childVariants
82
+ * @param {Services} services
83
+ * @param {ReportType} reportType
84
+ * @param {string} token
85
+ * @param {string} reportId
86
+ * @param {SetQueryFromFiltersResult} [queryData]
87
+ * @param {string} [dataProductDefinitionsPath]
88
+ * @return {*} {Promise<Array<ChildReportExecutionData>>}
89
+ */
90
+ const requestChildVariants = async (childVariants, services, reportType, token, reportId, queryData, dataProductDefinitionsPath) => {
91
+ const query = queryData
92
+ ? Object.fromEntries(Object.entries(queryData.query).filter(([key]) => key !== 'sortColumn' && key !== 'sortedAsc'))
93
+ : {};
94
+ const results = await Promise.all(childVariants.map(async (childVariant) => {
95
+ const queryParams = {
96
+ ...query,
97
+ ...(dataProductDefinitionsPath && { dataProductDefinitionsPath }),
98
+ };
99
+ const response = reportType === UserReports.ReportType.DASHBOARD
100
+ ? await services.dashboardService.requestAsyncDashboard(token, reportId, childVariant.id, queryParams)
101
+ : await services.reportingService.requestAsyncReport(token, reportId, childVariant.id, queryParams);
89
102
  const { executionId, tableId } = response;
90
103
  if (!executionId || !tableId) {
91
- throw new Error('requestChildReports: No execution of tableId in response');
104
+ if (reportType === UserReports.ReportType.DASHBOARD) {
105
+ return null;
106
+ }
107
+ throw new Error('requestChildVariants: No executionId or tableId in response');
92
108
  }
93
- return { executionId, tableId, variantId: childVariant.id };
94
- })));
109
+ return {
110
+ executionId,
111
+ tableId,
112
+ variantId: childVariant.id,
113
+ };
114
+ }));
115
+ return results.filter((result) => result !== null);
95
116
  };
96
- const requestProduct = async ({ req, res, token, services, }) => {
117
+ /**
118
+ * Request the dashboard - get the execution data
119
+ *
120
+ * @param {Request} req
121
+ * @param {Response} res
122
+ * @param {string} token
123
+ * @param {Services} services
124
+ * @return {*}
125
+ */
126
+ const requestDashboard = async (req, res, token, services) => {
97
127
  const { definitionsPath: dataProductDefinitionsPath, dpdPathFromQuery } = localsHelper.default.getValues(res);
98
- const { reportId, id, type } = req.body;
99
- let executionId;
100
- let tableId;
101
- let childVariants = [];
102
- let sortData;
103
- const { definition, fields } = await definitionUtils.getDefinitionByType(type, services, token, reportId, id);
128
+ const { reportId, id } = req.body;
129
+ const definition = await services.dashboardService.getDefinition(token, reportId, id, dataProductDefinitionsPath);
130
+ // TODO: Update this type to components['schemas']['DashboardDefinition'] when `childVariants` field is present
131
+ const childVariants = definition.childVariants ?? [];
132
+ const fields = definitionUtils.getDashboardFields(definition);
104
133
  const query = new ReportQuery.ReportQuery({
105
134
  fields,
106
135
  queryParams: queryMappers.formBodyToQueryObject(req.body),
107
136
  definitionsPath: dataProductDefinitionsPath,
108
- reportType: type,
137
+ reportType: UserReports.ReportType.DASHBOARD,
109
138
  }).toRecordWithFilterPrefix(true);
110
- if (type === UserReports.ReportType.REPORT) {
111
- const requestReportResponse = await services.reportingService.requestAsyncReport(token, reportId, id, {
112
- ...query,
113
- dataProductDefinitionsPath,
114
- });
115
- executionId = requestReportResponse['executionId'];
116
- tableId = requestReportResponse['tableId'];
117
- childVariants = definition.variant.childVariants ?? [];
118
- sortData = utils$1.buildSortData(req.body);
119
- sessionHelper.setActiveJourneySortSearch(req, { reportId, id, tableId }, sortData);
120
- }
121
- if (type === UserReports.ReportType.DASHBOARD) {
122
- const requestDashboardResponse = await services.dashboardService.requestAsyncDashboard(token, reportId, id, {
123
- ...query,
124
- dataProductDefinitionsPath,
125
- });
126
- executionId = requestDashboardResponse['executionId'];
127
- tableId = requestDashboardResponse['tableId'];
139
+ const requestResponse = await services.dashboardService.requestAsyncDashboard(token, reportId, id, {
140
+ ...query,
141
+ dataProductDefinitionsPath,
142
+ });
143
+ const { executionId, tableId } = requestResponse;
144
+ if (!executionId || !tableId) {
145
+ throw new Error('Execution of report request failed - no execution data returned');
128
146
  }
147
+ const executionData = {
148
+ executionId,
149
+ tableId,
150
+ ...(dpdPathFromQuery && { dataProductDefinitionsPath }),
151
+ };
129
152
  const querySummary = utils$2.buildQuerySummary(req.body, fields);
130
- const filterData = utils$1.buildFilterData(req.body);
153
+ const filterData = utils$3.buildFilterData(req.body);
131
154
  const queryData = {
132
155
  querySummary,
133
156
  filterData,
134
157
  query,
135
- ...(sortData && { sortData }),
136
158
  };
137
- const childExecutionData = await requestChildReports(childVariants, services.reportingService, token, reportId, queryData, dataProductDefinitionsPath);
159
+ const childExecutionData = await requestChildVariants(childVariants, services, UserReports.ReportType.DASHBOARD, token, reportId, queryData, dataProductDefinitionsPath);
160
+ return {
161
+ executionData,
162
+ childExecutionData,
163
+ queryData,
164
+ };
165
+ };
166
+ /**
167
+ * Request the report - get the execution data
168
+ *
169
+ * @param {Request} req
170
+ * @param {Response} res
171
+ * @param {string} token
172
+ * @param {Services} services
173
+ * @return {*}
174
+ */
175
+ const requestReport = async (req, res, token, services) => {
176
+ const { definitionsPath: dataProductDefinitionsPath, dpdPathFromQuery } = localsHelper.default.getValues(res);
177
+ const { reportId, id } = req.body;
178
+ const definition = await services.reportingService.getDefinition(token, reportId, id, dataProductDefinitionsPath);
179
+ const childVariants = definition.variant.childVariants ?? [];
180
+ const fields = definitionUtils.getFields(definition);
181
+ const query = new ReportQuery.ReportQuery({
182
+ fields,
183
+ queryParams: queryMappers.formBodyToQueryObject(req.body),
184
+ definitionsPath: dataProductDefinitionsPath,
185
+ reportType: UserReports.ReportType.REPORT,
186
+ }).toRecordWithFilterPrefix(true);
187
+ const requestResponse = await services.reportingService.requestAsyncReport(token, reportId, id, {
188
+ ...query,
189
+ dataProductDefinitionsPath,
190
+ });
191
+ const { executionId, tableId } = requestResponse;
192
+ if (!executionId || !tableId) {
193
+ throw new Error('Execution of report request failed - no execution data returned');
194
+ }
138
195
  const executionData = {
139
196
  executionId,
140
197
  tableId,
141
198
  ...(dpdPathFromQuery && { dataProductDefinitionsPath }),
142
199
  };
200
+ const sortData = utils$3.buildSortData(req.body);
201
+ sessionHelper.setActiveJourneySortSearch(req, { reportId, id, tableId }, sortData);
202
+ const querySummary = utils$2.buildQuerySummary(req.body, fields);
203
+ const filterData = utils$3.buildFilterData(req.body);
204
+ const queryData = {
205
+ querySummary,
206
+ filterData,
207
+ query,
208
+ ...(sortData && { sortData }),
209
+ };
210
+ const childExecutionData = await requestChildVariants(childVariants, services, UserReports.ReportType.REPORT, token, reportId, queryData, dataProductDefinitionsPath);
143
211
  return {
144
212
  executionData,
145
213
  childExecutionData,
146
214
  queryData,
147
215
  };
148
216
  };
217
+ const requestProduct = async ({ req, res, token, services, }) => {
218
+ const { type } = req.body;
219
+ switch (type) {
220
+ case UserReports.ReportType.REPORT:
221
+ return requestReport(req, res, token, services);
222
+ case UserReports.ReportType.DASHBOARD:
223
+ return requestDashboard(req, res, token, services);
224
+ default:
225
+ throw new Error(`Unsupported report type: ${type}`);
226
+ }
227
+ };
149
228
  // ----------------------------------------------------------------------
150
229
  // ERROR
151
230
  // ----------------------------------------------------------------------
@@ -228,7 +307,14 @@ const renderRequest = async ({ req, res, services, next, }) => {
228
307
  const renderDashboardRequestData = async ({ req, token, reportId, definitionPath, services, definition, }) => {
229
308
  const productDefinitions = req.session['allDefinitions'] ?? (await services.reportingService.getDefinitions(token, definitionPath));
230
309
  const productDefinition = productDefinitions.find((def) => def.id === reportId);
231
- const { name, description, sections, filterFields: fields } = definition;
310
+ // TODO: Remove the "as" when components['schemas']['DashboardDefinition'] includes the `childVariants` field
311
+ const { childVariants } = definition;
312
+ const masterDefintion = definition;
313
+ if (childVariants?.length) {
314
+ // TODO: Remove the casting of definition when components['schemas']['DashboardDefinition'] includes the `childVariants` field
315
+ masterDefintion.sections = utils$1.buildMasterSections(definition);
316
+ }
317
+ const { name, description, sections, filterFields: fields } = masterDefintion;
232
318
  return {
233
319
  reportName: productDefinition?.name || '',
234
320
  name: name || '',