@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.
- package/cjs/dpr/components/_dashboards/dashboard-section/utils.js +55 -0
- package/cjs/dpr/components/_dashboards/dashboard-section/utils.js.map +1 -1
- package/cjs/dpr/components/_dashboards/dashboard-visualisation/types.js.map +1 -1
- package/cjs/dpr/components/my-reports/utils.js +2 -1
- package/cjs/dpr/components/my-reports/utils.js.map +1 -1
- package/cjs/dpr/components/truncate/utils.js +5 -3
- package/cjs/dpr/components/truncate/utils.js.map +1 -1
- package/cjs/dpr/routes/journeys/request-report/filters/utils.js +133 -47
- package/cjs/dpr/routes/journeys/request-report/filters/utils.js.map +1 -1
- package/cjs/dpr/setUpNunjucksFilters.js +2 -28
- package/cjs/dpr/setUpNunjucksFilters.js.map +1 -1
- package/cjs/dpr/utils/sanitizeHtml.js +36 -0
- package/cjs/dpr/utils/sanitizeHtml.js.map +1 -0
- package/dpr/components/_dashboards/dashboard-section/utils.js +54 -1
- package/dpr/components/_dashboards/dashboard-section/utils.js.map +1 -1
- package/dpr/components/_dashboards/dashboard-visualisation/types.js.map +1 -1
- package/dpr/components/my-reports/my-reports-list-item/my-reports-list-item-description/view.njk +1 -1
- package/dpr/components/my-reports/utils.js +2 -1
- package/dpr/components/my-reports/utils.js.map +1 -1
- package/dpr/components/truncate/utils.js +5 -3
- package/dpr/components/truncate/utils.js.map +1 -1
- package/dpr/routes/journeys/request-report/filters/utils.js +133 -47
- package/dpr/routes/journeys/request-report/filters/utils.js.map +1 -1
- package/dpr/setUpNunjucksFilters.js +2 -28
- package/dpr/setUpNunjucksFilters.js.map +1 -1
- package/dpr/utils/sanitizeHtml.js +34 -0
- package/dpr/utils/sanitizeHtml.js.map +1 -0
- package/package.json +1 -1
- package/src/dpr/components/_dashboards/dashboard-section/utils.d.ts +16 -1
- package/src/dpr/components/_dashboards/dashboard-visualisation/types.d.ts +3 -0
- package/src/dpr/utils/sanitizeHtml.d.ts +1 -0
- package/test-app/mocks/mockClients/dashboards/dashboard-definitions.d.ts +22 -0
- package/test-app/mocks/mockClients/dashboards/definitions/parent-child/child-dashboard-1.d.ts +20 -0
- package/test-app/mocks/mockClients/dashboards/definitions/parent-child/child-dashboard-2.d.ts +20 -0
- package/test-app/mocks/mockClients/dashboards/definitions/parent-child/index.d.ts +23 -0
- package/test-app/mocks/mockClients/dashboards/definitions/parent-child/parent-dashboard.d.ts +42 -0
- package/test-app/mocks/mockClients/dashboards/mock-client.d.ts +42 -0
- package/test-app/mocks/mockClients/reports/mockReportDefinition.d.ts +28 -0
- 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 {
|
|
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":"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"}
|
|
@@ -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
|
|
8
|
+
const sanitizedHtml = sanitizeHtml.sanitiseHtml(stringValue);
|
|
9
|
+
const truncatedHtml = truncate(sanitizedHtml, {
|
|
8
10
|
length: charLength,
|
|
9
11
|
});
|
|
10
|
-
const isTruncated = truncatedHtml !==
|
|
12
|
+
const isTruncated = truncatedHtml !== sanitizedHtml;
|
|
11
13
|
return {
|
|
12
|
-
fullHtml:
|
|
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(
|
|
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/
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
-
|
|
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 {
|
|
94
|
-
|
|
109
|
+
return {
|
|
110
|
+
executionId,
|
|
111
|
+
tableId,
|
|
112
|
+
variantId: childVariant.id,
|
|
113
|
+
};
|
|
114
|
+
}));
|
|
115
|
+
return results.filter((result) => result !== null);
|
|
95
116
|
};
|
|
96
|
-
|
|
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
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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:
|
|
137
|
+
reportType: UserReports.ReportType.DASHBOARD,
|
|
109
138
|
}).toRecordWithFilterPrefix(true);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
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$
|
|
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
|
|
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
|
-
|
|
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 || '',
|