@ministryofjustice/hmpps-digital-prison-reporting-frontend 4.14.2 → 4.15.1
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/dpr/all.mjs +2 -0
- package/dpr/all.scss +4 -0
- package/dpr/components/_catalogue/catalogue-list/utils.test.ts +1 -1
- package/dpr/components/_charts/chart/clientClass.mjs +4 -3
- package/dpr/components/_charts/chart/heatmap/Heatmap.js +2 -0
- package/dpr/components/_charts/chart/heatmap/Heatmap.js.map +7 -0
- package/dpr/components/_charts/chart/heatmap/Heatmap.ts +278 -0
- package/dpr/components/_charts/chart/heatmap/clientClass.mjs +175 -0
- package/dpr/components/_charts/chart/styles.scss +4 -0
- package/dpr/components/_charts/utils.js +1 -1
- package/dpr/components/_charts/utils.js.map +3 -3
- package/dpr/components/_charts/utils.test.ts +4 -1
- package/dpr/components/_charts/utils.ts +73 -27
- package/dpr/components/_dashboards/dashboard/types.js +1 -1
- package/dpr/components/_dashboards/dashboard/types.js.map +2 -2
- package/dpr/components/_dashboards/dashboard/types.ts +21 -1
- package/dpr/components/_dashboards/dashboard-list/utils.js +1 -1
- package/dpr/components/_dashboards/dashboard-list/utils.js.map +3 -3
- package/dpr/components/_dashboards/dashboard-list/utils.test.ts +1 -0
- package/dpr/components/_dashboards/dashboard-list/utils.ts +5 -1
- package/dpr/components/_filters/types.d.js.map +1 -1
- package/dpr/components/_filters/types.d.ts +12 -8
- package/dpr/components/_filters/utils.js +1 -1
- package/dpr/components/_filters/utils.js.map +3 -3
- package/dpr/components/_filters/utils.ts +24 -2
- package/dpr/components/user-reports/utils.js +1 -1
- package/dpr/components/user-reports/utils.js.map +3 -3
- package/dpr/components/user-reports/utils.ts +13 -3
- package/dpr/data/dashboardClient.js +1 -1
- package/dpr/data/dashboardClient.js.map +2 -2
- package/dpr/data/dashboardClient.ts +1 -1
- package/dpr/routes/journeys/request-report/filters/controller.js +1 -1
- package/dpr/routes/journeys/request-report/filters/controller.js.map +3 -3
- package/dpr/routes/journeys/request-report/filters/controller.ts +6 -2
- package/dpr/routes/journeys/request-report/filters/utils.js +1 -1
- package/dpr/routes/journeys/request-report/filters/utils.js.map +2 -2
- package/dpr/routes/journeys/request-report/filters/utils.ts +9 -3
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js +1 -1
- package/dpr/routes/journeys/view-report/async/dashboard/utils.js.map +3 -3
- package/dpr/routes/journeys/view-report/async/dashboard/utils.ts +12 -3
- package/dpr/routes/journeys/view-report/async/report/tests.cy.js +1 -1
- package/dpr/routes/journeys/view-report/async/report/tests.cy.js.map +2 -2
- package/dpr/routes/journeys/view-report/async/report/tests.cy.ts +44 -8
- package/dpr/routes/journeys/view-report/utils.js +1 -1
- package/dpr/routes/journeys/view-report/utils.js.map +3 -3
- package/dpr/routes/journeys/view-report/utils.ts +6 -1
- package/dpr/services/dashboardService.js +1 -1
- package/dpr/services/dashboardService.js.map +2 -2
- package/dpr/services/dashboardService.ts +1 -1
- package/dpr/types/Charts.js +1 -1
- package/dpr/types/Charts.js.map +1 -1
- package/dpr/types/Charts.ts +10 -3
- package/dpr/types/ExecutionData.d.js +1 -1
- package/dpr/types/ExecutionData.d.js.map +1 -1
- package/dpr/types/ExecutionData.d.ts +1 -0
- package/dpr/utils/DataTableBuilder/DataTableBuilder.js +1 -1
- package/dpr/utils/DataTableBuilder/DataTableBuilder.js.map +2 -2
- package/dpr/utils/DataTableBuilder/DataTableBuilder.ts +37 -19
- package/dpr/utils/DateMapper/DateMapper.js +1 -1
- package/dpr/utils/DateMapper/DateMapper.js.map +2 -2
- package/dpr/utils/DateMapper/DateMapper.ts +4 -0
- package/dpr/utils/UserStoreItemBuilder.js +1 -1
- package/dpr/utils/UserStoreItemBuilder.js.map +3 -3
- package/dpr/utils/UserStoreItemBuilder.ts +6 -4
- package/dpr/utils/requestStatusHelper.js +1 -1
- package/dpr/utils/requestStatusHelper.js.map +2 -2
- package/dpr/utils/requestStatusHelper.ts +1 -1
- package/package.json +5 -2
|
@@ -48,8 +48,8 @@ class DashboardService {
|
|
|
48
48
|
reportId: string,
|
|
49
49
|
dashboardId: string,
|
|
50
50
|
executionId: string,
|
|
51
|
-
dataProductDefinitionsPath?: string,
|
|
52
51
|
tableId?: string,
|
|
52
|
+
dataProductDefinitionsPath?: string,
|
|
53
53
|
): Promise<Dict<string>> {
|
|
54
54
|
return this.dashboardClient.getAsyncStatus(
|
|
55
55
|
token,
|
package/dpr/types/Charts.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var n=Object.defineProperty;var
|
|
1
|
+
var n=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var u=Object.getOwnPropertyNames;var h=Object.prototype.hasOwnProperty;var C=(e,t)=>{for(var r in t)n(e,r,{get:t[r],enumerable:!0})},p=(e,t,r,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of u(t))!h.call(e,a)&&a!==r&&n(e,a,{get:()=>t[a],enumerable:!(i=l(t,a))||i.enumerable});return e};var x=e=>p(n({},"__esModule",{value:!0}),e);var b={};C(b,{ChartType:()=>o,UnitType:()=>s});module.exports=x(b);var s=(r=>(r.NUMBER="number",r.PERCENTAGE="percentage",r))(s||{}),o=(a=>(a.DONUT="doughnut",a.BAR="bar",a.BAR_TIMESERIES="bar-timeseries",a.LINE="line",a))(o||{});0&&(module.exports={ChartType,UnitType});
|
|
2
2
|
//# sourceMappingURL=Charts.js.map
|
package/dpr/types/Charts.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/dpr/types/Charts.ts"],
|
|
4
|
-
"sourcesContent": ["export interface ChartData {\n type: ChartType\n unit?: UnitType\n data: ChartDataValues\n timeseries?: boolean\n}\n\nexport interface ChartDetails {\n meta?: ChartMetaData[]\n headlines?: ChartMetaData[]\n}\n\nexport interface ChartMetaData {\n label: string\n value: string | number\n legend?: string\n}\n\nexport enum UnitType {\n NUMBER = 'number',\n PERCENTAGE = 'percentage',\n}\n\nexport enum ChartType {\n DONUT = 'doughnut',\n BAR = 'bar',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE = 'line',\n}\n\nexport interface ChartCardData {\n chart: ChartData\n table?: MoJTable\n details?: ChartDetails\n}\n\nexport interface ChartDataValues {\n labels
|
|
4
|
+
"sourcesContent": ["export interface ChartData {\n type: ChartType\n unit?: UnitType\n data: ChartDataValues\n timeseries?: boolean\n}\n\nexport interface ChartDetails {\n meta?: ChartMetaData[]\n headlines?: ChartMetaData[]\n}\n\nexport interface ChartMetaData {\n label: string\n value: string | number\n legend?: string\n}\n\nexport enum UnitType {\n NUMBER = 'number',\n PERCENTAGE = 'percentage',\n}\n\nexport enum ChartType {\n DONUT = 'doughnut',\n BAR = 'bar',\n BAR_TIMESERIES = 'bar-timeseries',\n LINE = 'line',\n}\n\nexport interface ChartCardData {\n chart: ChartData\n table?: MoJTable\n details?: ChartDetails\n}\n\nexport interface ChartDataValues {\n labels?: string[]\n datasets: ChartDataset[]\n axis?: 'x' | 'y'\n}\n\nexport interface ChartDataset {\n label: string\n data: number[] | MatrixChartData[]\n total?: number\n}\n\nexport interface MatrixChartData {\n x: number | string\n y: number | string\n r?: number\n v?: number\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}\n\nexport interface ChartCardValue {\n value: string | number\n name: string\n display: string\n unit?: UnitType\n chart?: ChartType[]\n}\n\nexport interface ChartValue {\n group?: ChartGroup\n data: ChartCardValue[]\n}\n\nexport interface ChartGroup {\n name: string\n value: string\n}\n\nexport interface ChartsData {\n type: ChartType\n datasets: { data: ChartCardValue[]; group: ChartGroup }[]\n}\n"],
|
|
5
5
|
"mappings": "4ZAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,eAAAE,EAAA,aAAAC,IAAA,eAAAC,EAAAJ,GAkBO,IAAKG,OACVA,EAAA,OAAS,SACTA,EAAA,WAAa,aAFHA,OAAA,IAKAD,OACVA,EAAA,MAAQ,WACRA,EAAA,IAAM,MACNA,EAAA,eAAiB,iBACjBA,EAAA,KAAO,OAJGA,OAAA",
|
|
6
6
|
"names": ["Charts_exports", "__export", "ChartType", "UnitType", "__toCommonJS"]
|
|
7
7
|
}
|
package/dpr/types/Charts.ts
CHANGED
|
@@ -35,15 +35,22 @@ export interface ChartCardData {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
export interface ChartDataValues {
|
|
38
|
-
labels
|
|
38
|
+
labels?: string[]
|
|
39
39
|
datasets: ChartDataset[]
|
|
40
40
|
axis?: 'x' | 'y'
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
export interface ChartDataset {
|
|
44
44
|
label: string
|
|
45
|
-
data: number[]
|
|
46
|
-
total
|
|
45
|
+
data: number[] | MatrixChartData[]
|
|
46
|
+
total?: number
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface MatrixChartData {
|
|
50
|
+
x: number | string
|
|
51
|
+
y: number | string
|
|
52
|
+
r?: number
|
|
53
|
+
v?: number
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
export interface MoJTable {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var n=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var
|
|
1
|
+
var n=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var x=(e,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of c(t))!d.call(e,i)&&i!==r&&n(e,i,{get:()=>t[i],enumerable:!(a=o(t,i))||a.enumerable});return e};var s=e=>x(n({},"__esModule",{value:!0}),e);var u={};module.exports=s(u);
|
|
2
2
|
//# sourceMappingURL=ExecutionData.d.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/dpr/types/ExecutionData.d.ts"],
|
|
4
|
-
"sourcesContent": ["export interface ExecutionData {\n executionId: string\n tableId: string\n}\n\nexport interface ChildReportExecutionData extends ExecutionData {\n variantId: string\n}\n"],
|
|
4
|
+
"sourcesContent": ["export interface ExecutionData {\n executionId: string\n tableId: string\n dataProductDefinitionsPath?: string\n}\n\nexport interface ChildReportExecutionData extends ExecutionData {\n variantId: string\n}\n"],
|
|
5
5
|
"mappings": "kWAAA,IAAAA,EAAA,kBAAAC,EAAAD",
|
|
6
6
|
"names": ["ExecutionData_d_exports", "__toCommonJS"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var g=Object.create;var m=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var w=(
|
|
1
|
+
var g=Object.create;var m=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var S=Object.getPrototypeOf,C=Object.prototype.hasOwnProperty;var w=(i,e)=>{for(var t in e)m(i,t,{get:e[t],enumerable:!0})},d=(i,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of b(e))!C.call(i,a)&&a!==t&&m(i,a,{get:()=>e[a],enumerable:!(r=D(e,a))||r.enumerable});return i};var h=(i,e,t)=>(t=i!=null?g(S(i)):{},d(e||!i||!i.__esModule?m(t,"default",{value:i,enumerable:!0}):t,i)),v=i=>d(m({},"__esModule",{value:!0}),i);var K={};w(K,{DataTableBuilder:()=>u,default:()=>F});module.exports=v(K);var p=h(require("../urlHelper")),y=h(require("../DateMapper/DateMapper"));class u{constructor(e,t=!1){this.columns=[];this.reportSummaries={};this.reportQuery=null;this.currentQueryParams=null;this.dateMapper=new y.default;this.fields=e,this.sortData=t}mapDate(e){return e?this.dateMapper.toDateString(e,"local-datetime-short-year"):""}mapBoolean(e){return e?e.substring(0,1).toUpperCase()+e.substring(1).toLowerCase():""}mapRow(e,t="",r=[]){return this.fields.filter(a=>this.columns.includes(a.name)).map(a=>{const o=r.find(n=>n.name===a.name)??a;return this.mapCell(o,e,t)})}mapCell(e,t,r=""){const a=this.mapCellValue(e,t[e.name]);let s="string",o=r;e.wordWrap&&(o+=` data-table-cell-wrap-${e.wordWrap.toLowerCase()}`),e.header&&(o+=" govuk-table__header"),(e.type==="double"||e.type==="long")&&(s="numeric");const n=e.type==="HTML";return{fieldName:e.name,...n?{html:a}:{text:a},format:s,classes:o.trim()}}mapCellValue(e,t){if(e.calculated)return t;switch(e.type){case"boolean":return this.mapBoolean(t);case"date":case"time":return this.mapDate(t);default:return t}}mapHeader(e=!1,t=null){return this.fields.filter(r=>this.columns.includes(r.name)).map(r=>{if(this.reportQuery&&!e&&r.sortable){let a="none",s=(0,p.default)(this.currentQueryParams||{},{sortColumn:r.name,sortedAsc:"true"},this.fields);return r.name===this.reportQuery.sortColumn&&(a=this.reportQuery.sortedAsc?"ascending":"descending",this.reportQuery.sortedAsc&&(s=(0,p.default)(this.currentQueryParams||{},{sortColumn:r.name,sortedAsc:"false"},this.fields))),{html:`<a data-column="${r.name}" class="data-table-header-button data-table-header-button-sort-${a}" href="${s}">${r.display}</a>`,...t&&{classes:t}}}return{text:r.display,...t&&{classes:t}}})}mapData(e){const t=this.mapSummary("table-header"),r=this.mergeCells(e.map(s=>this.mapRow(s))),a=this.mapSummary("table-footer");return t.concat(r).concat(a)}mergeCells(e){const t=this.fields.filter(a=>a.mergeRows).map(a=>a.name);if(t.length===0)return e;const r={};return t.forEach(a=>{r[a]=e.reduce((s,o)=>{const n=this.getCellByFieldName(o,a);let l="";return n&&(l=n.text||n.html||""),{...s,[l]:(s[l]??0)+1}},{})}),e.map(a=>{let s=[...a];return t.forEach(o=>{const n=this.getCellByFieldName(a,o);let l,c;if(n&&r[o])switch(l=n.text||n.html||"",c=r[o][l],c){case-1:s=s.filter(f=>f.fieldName!==o);break;case 1:break;default:n.rowspan=c,r[o][l]=-1}}),s})}getCellByFieldName(e,t){return e.find(r=>r.fieldName===t)}mapSummary(e){return this.reportSummaries[e]?this.reportSummaries[e].flatMap(t=>t.data.map(r=>this.mapRow(r,`dpr-report-summary-cell dpr-report-summary-cell-${e}`,t.fields))):[]}sort(e){return this.appendSortKeyToData(e).sort(this.sortKeyComparison()).map(t=>({...t}))}sortKeyComparison(){return(e,t)=>{const r=e.sortKey,a=t.sortKey;return r===a?0:r<a?-1:1}}appendSortKeyToData(e,t=null){const r=t||this.fields;return e.map(a=>{const s=this.getSortKey(a,r);return{...a,sortKey:s}})}mapNamesToFields(e){return e.map(t=>this.fields.find(r=>r.name===t)).filter(t=>t!==void 0)}getSortKey(e,t){return t.map(r=>{const a=e[r.name];return a&&this.dateMapper.isDate(a)?this.dateMapper.toDateString(a,"iso"):this.mapCellValue(r,a)}).join("-").toLowerCase()}convertDataTableToHtml(e){const r=(e.head||[]).map(s=>`<th scope='col' class='govuk-table__header'>${s.html??s.text}</th>`),a=e.rows.map(s=>`<tr class='govuk-table__row'>${s.map(o=>`<td class='govuk-table__cell govuk-table__cell--${o.format} ${o.classes}'>${o.html??o.text}</td>`).join("")}</tr>`);return`<table class='govuk-table'><thead class='govuk-table__head'>${r.join("")}</thead><tbody class='govuk-table__body'>${a.join("")}</tbody></table>`}withHeaderOptions({reportQuery:e,columns:t,interactive:r}){return r&&e?this.withHeaderSortOptions(e):this.withNoHeaderOptions(t)}withHeaderSortOptions(e){return this.reportQuery=e,this.columns=e.columns,this.currentQueryParams=this.reportQuery.toRecordWithFilterPrefix(),this}withNoHeaderOptions(e){return this.columns=e,this}buildTable(e){const t=this.mapData(this.sortData?this.sort(e):e);return{head:this.mapHeader(),rows:t,rowCount:e.length,colCount:this.columns.length}}withSummaries(e){return this.reportSummaries=e,this}withSortedData(e=!0){return this.sortData=e,this}}var F=u;0&&(module.exports={DataTableBuilder});
|
|
2
2
|
//# sourceMappingURL=DataTableBuilder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dpr/utils/DataTableBuilder/DataTableBuilder.ts"],
|
|
4
|
-
"sourcesContent": ["import Dict = NodeJS.Dict\nimport ReportQuery from '../../types/ReportQuery'\nimport { Cell, CellFormat, DataTable, FieldDefinition, SortKey } from './types'\nimport createUrlForParameters from '../urlHelper'\nimport type { SummaryTemplate } from '../../types/Templates'\nimport { AsyncSummary } from '../../types/UserReports'\nimport DateMapper from '../DateMapper/DateMapper'\n\nclass DataTableBuilder {\n protected fields: Array<FieldDefinition>\n\n private sortData: boolean\n\n protected columns: Array<string> = []\n\n protected reportSummaries: Dict<Array<AsyncSummary>> = {}\n\n // Sortable headers only\n private reportQuery: ReportQuery | null = null\n\n private currentQueryParams: NodeJS.Dict<string | Array<string>> | null = null\n\n private dateMapper = new DateMapper()\n\n constructor(fields: Array<FieldDefinition>, sortData = false) {\n this.fields = fields\n this.sortData = sortData\n }\n\n private mapDate(isoDate?: string) {\n if (!isoDate) return ''\n\n return this.dateMapper.toDateString(isoDate, 'local-datetime-short-year')\n }\n\n private mapBoolean(value?: string) {\n if (!value) return ''\n return value.substring(0, 1).toUpperCase() + value.substring(1).toLowerCase()\n }\n\n protected mapRow(\n rowData: NodeJS.Dict<string>,\n extraClasses = '',\n overrideFields: Array<FieldDefinition> = [],\n ): Cell[] {\n return this.fields\n .filter((f) => this.columns.includes(f.name))\n .map((f) => {\n const overrideField = overrideFields.find((o) => o.name === f.name)\n const field = overrideField ?? f\n return this.mapCell(field, rowData, extraClasses)\n })\n }\n\n private mapCell(field: FieldDefinition, rowData: NodeJS.Dict<string>, extraClasses = '') {\n const textValue = this.mapCellValue(field, rowData[field.name])\n let fieldFormat: CellFormat = 'string'\n\n let classes = extraClasses\n\n if (field.wordWrap) {\n classes += ` data-table-cell-wrap-${field.wordWrap.toLowerCase()}`\n }\n\n if (field.header) {\n classes += ' govuk-table__header'\n }\n\n if (field.type === 'double' || field.type === 'long') {\n fieldFormat = 'numeric'\n }\n\n const isHtml = field.type === 'HTML'\n const cell: Cell = {\n fieldName: field.name,\n ...(isHtml ? { html: textValue } : { text: textValue }),\n format: fieldFormat,\n classes: classes.trim(),\n }\n\n return cell\n }\n\n protected mapCellValue(field: FieldDefinition, cellData?: string) {\n if (field.calculated) {\n return cellData\n }\n\n switch (field.type) {\n case 'boolean':\n return this.mapBoolean(cellData)\n\n case 'date':\n case 'time':\n return this.mapDate(cellData)\n\n default:\n return cellData\n }\n }\n\n protected mapHeader(disableSort = false, extraClasses: string | null = null): Cell[] {\n return this.fields\n .filter((field) => this.columns.includes(field.name))\n .map((f) => {\n if (this.reportQuery && !disableSort) {\n if (f.sortable) {\n let sortDirection = 'none'\n let url = createUrlForParameters(this.currentQueryParams || {}, {\n sortColumn: f.name,\n sortedAsc: 'true',\n })\n\n if (f.name === this.reportQuery.sortColumn) {\n sortDirection = this.reportQuery.sortedAsc ? 'ascending' : 'descending'\n\n if (this.reportQuery.sortedAsc) {\n url = createUrlForParameters(this.currentQueryParams || {}, {\n sortColumn: f.name,\n sortedAsc: 'false',\n })\n }\n }\n\n return {\n html:\n `<a ` +\n `data-column=\"${f.name}\" ` +\n `class=\"data-table-header-button data-table-header-button-sort-${sortDirection}\" ` +\n `href=\"${url}\"` +\n `>${f.display}</a>`,\n ...(extraClasses && { classes: extraClasses }),\n }\n }\n }\n return {\n text: f.display,\n ...(extraClasses && { classes: extraClasses }),\n }\n })\n }\n\n protected mapData(data: Array<Dict<string>>): Cell[][] {\n const mappedHeaderSummary = this.mapSummary('table-header')\n const mappedTableData = this.mergeCells(data.map((rowData) => this.mapRow(rowData)))\n const mappedFooterSummary = this.mapSummary('table-footer')\n\n return mappedHeaderSummary.concat(mappedTableData).concat(mappedFooterSummary)\n }\n\n private mergeCells(rows: Cell[][]): Cell[][] {\n const mergeFieldNames = this.fields.filter((f) => f.mergeRows).map((f) => f.name)\n\n if (mergeFieldNames.length === 0) {\n return rows\n }\n\n const occurrences: Dict<Dict<number>> = {}\n mergeFieldNames.forEach((f) => {\n occurrences[f] = rows.reduce((accumulator: Dict<number>, currentRow) => {\n const currentCell = this.getCellByFieldName(currentRow, f)\n let cellValue = ''\n if (currentCell) {\n cellValue = currentCell.text || currentCell.html || ''\n }\n\n return {\n ...accumulator,\n [cellValue]: (accumulator[cellValue] ?? 0) + 1,\n }\n }, {})\n })\n\n return rows.map((row) => {\n let mergedRow = [...row]\n\n mergeFieldNames.forEach((mergeFieldName) => {\n const currentRowCell = this.getCellByFieldName(row, mergeFieldName)\n let cellValue\n let occurrencesOfValue\n if (currentRowCell && occurrences[mergeFieldName]) {\n cellValue = currentRowCell.text || currentRowCell.html || ''\n occurrencesOfValue = occurrences[mergeFieldName][cellValue]\n\n switch (occurrencesOfValue) {\n case -1:\n mergedRow = mergedRow.filter((c) => c.fieldName !== mergeFieldName)\n break\n\n case 1:\n break\n\n default:\n currentRowCell.rowspan = occurrencesOfValue\n occurrences[mergeFieldName][cellValue] = -1\n }\n }\n })\n\n return mergedRow\n })\n }\n\n private getCellByFieldName(row: Cell[], fieldName: string) {\n return row.find((c) => c.fieldName === fieldName)\n }\n\n private mapSummary(template: SummaryTemplate): Cell[][] {\n if (this.reportSummaries[template]) {\n return this.reportSummaries[template].flatMap((reportSummary) =>\n reportSummary.data.map((rowData) =>\n this.mapRow(rowData, `dpr-report-summary-cell dpr-report-summary-cell-${template}`, reportSummary.fields),\n ),\n )\n }\n return []\n }\n\n protected sort(data: Dict<string>[]): Dict<string>[] {\n return this.appendSortKeyToData(data)\n .sort(this.sortKeyComparison())\n .map((d: SortKey) => ({\n ...d,\n }))\n }\n\n protected sortKeyComparison() {\n return (a: SortKey, b: SortKey) => {\n const aValue = a.sortKey\n const bValue = b.sortKey\n\n if (aValue === bValue) {\n return 0\n }\n\n if (aValue < bValue) {\n return -1\n }\n\n return 1\n }\n }\n\n private appendSortKeyToData(data: Dict<string>[], fields: FieldDefinition[] | null = null): SortKey[] {\n const sortFields = fields || this.fields\n\n return data.map((rowData) => {\n const sortKey = this.getSortKey(rowData, sortFields)\n\n return {\n ...rowData,\n sortKey,\n }\n })\n }\n\n protected mapNamesToFields(names: string[]): FieldDefinition[] {\n return names.map((s) => this.fields.find((f) => f.name === s)).filter((n) => n !== undefined)\n }\n\n protected getSortKey(rowData: NodeJS.Dict<string>, sortFields: FieldDefinition[]) {\n return sortFields\n .map((f) => {\n const value = rowData[f.name]\n if (value && this.dateMapper.isDate(value)) {\n return this.dateMapper.toDateString(value, 'iso')\n }\n\n return this.mapCellValue(f, value)\n })\n .join('-')\n .toLowerCase()\n }\n\n protected convertDataTableToHtml(dataTable: DataTable): string {\n const head = dataTable.head || []\n const headers = head.map((h) => `<th scope='col' class='govuk-table__header'>${h.html ?? h.text}</th>`)\n const rows = dataTable.rows.map(\n (r) =>\n `<tr class='govuk-table__row'>${r\n .map(\n (c) => `<td class='govuk-table__cell govuk-table__cell--${c.format} ${c.classes}'>${c.html ?? c.text}</td>`,\n )\n .join('')}</tr>`,\n )\n\n return (\n \"<table class='govuk-table'>\" +\n `<thead class='govuk-table__head'>${headers.join('')}</thead>` +\n `<tbody class='govuk-table__body'>${rows.join('')}</tbody>` +\n '</table>'\n )\n }\n\n withHeaderOptions({\n reportQuery,\n columns,\n interactive,\n }: {\n reportQuery?: ReportQuery\n columns: string[]\n interactive: boolean\n }) {\n if (interactive && reportQuery) {\n return this.withHeaderSortOptions(reportQuery)\n }\n return this.withNoHeaderOptions(columns)\n }\n\n withHeaderSortOptions(reportQuery: ReportQuery) {\n this.reportQuery = reportQuery\n this.columns = reportQuery.columns\n this.currentQueryParams = this.reportQuery.toRecordWithFilterPrefix()\n\n return this\n }\n\n withNoHeaderOptions(columns: string[]) {\n this.columns = columns\n return this\n }\n\n buildTable(data: Array<Dict<string>>): DataTable {\n const mappedData = this.mapData(this.sortData ? this.sort(data) : data)\n\n return {\n head: this.mapHeader(),\n rows: mappedData,\n rowCount: data.length,\n colCount: this.columns.length,\n }\n }\n\n withSummaries(reportSummaries: Dict<Array<AsyncSummary>>) {\n this.reportSummaries = reportSummaries\n return this\n }\n\n withSortedData(sortData = true) {\n this.sortData = sortData\n return this\n }\n}\n\nexport { DataTableBuilder }\nexport default DataTableBuilder\n"],
|
|
5
|
-
"mappings": "6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GAGA,IAAAK,EAAmC,2BAGnCC,EAAuB,
|
|
4
|
+
"sourcesContent": ["import Dict = NodeJS.Dict\nimport ReportQuery from '../../types/ReportQuery'\nimport { Cell, CellFormat, DataTable, SortKey } from './types'\nimport createUrlForParameters from '../urlHelper'\nimport type { SummaryTemplate } from '../../types/Templates'\nimport { AsyncSummary } from '../../types/UserReports'\nimport DateMapper from '../DateMapper/DateMapper'\nimport { components } from '../../types/api'\n\nclass DataTableBuilder {\n protected fields: components['schemas']['FieldDefinition'][]\n\n private sortData: boolean\n\n protected columns: Array<string> = []\n\n protected reportSummaries: Dict<Array<AsyncSummary>> = {}\n\n // Sortable headers only\n private reportQuery: ReportQuery | null = null\n\n private currentQueryParams: NodeJS.Dict<string | Array<string>> | null = null\n\n private dateMapper = new DateMapper()\n\n constructor(fields: components['schemas']['FieldDefinition'][], sortData = false) {\n this.fields = fields\n this.sortData = sortData\n }\n\n private mapDate(isoDate?: string) {\n if (!isoDate) return ''\n\n return this.dateMapper.toDateString(isoDate, 'local-datetime-short-year')\n }\n\n private mapBoolean(value?: string) {\n if (!value) return ''\n return value.substring(0, 1).toUpperCase() + value.substring(1).toLowerCase()\n }\n\n protected mapRow(\n rowData: NodeJS.Dict<string>,\n extraClasses = '',\n overrideFields: components['schemas']['FieldDefinition'][] = [],\n ): Cell[] {\n return this.fields\n .filter((f) => this.columns.includes(f.name))\n .map((f) => {\n const overrideField = overrideFields.find((o) => o.name === f.name)\n const field = overrideField ?? f\n return this.mapCell(field, rowData, extraClasses)\n })\n }\n\n private mapCell(field: components['schemas']['FieldDefinition'], rowData: NodeJS.Dict<string>, extraClasses = '') {\n const textValue = this.mapCellValue(field, rowData[field.name])\n let fieldFormat: CellFormat = 'string'\n\n let classes = extraClasses\n\n if (field.wordWrap) {\n classes += ` data-table-cell-wrap-${field.wordWrap.toLowerCase()}`\n }\n\n if (field.header) {\n classes += ' govuk-table__header'\n }\n\n if (field.type === 'double' || field.type === 'long') {\n fieldFormat = 'numeric'\n }\n\n const isHtml = field.type === 'HTML'\n const cell: Cell = {\n fieldName: field.name,\n ...(isHtml ? { html: textValue } : { text: textValue }),\n format: fieldFormat,\n classes: classes.trim(),\n }\n\n return cell\n }\n\n protected mapCellValue(field: components['schemas']['FieldDefinition'], cellData?: string) {\n if (field.calculated) {\n return cellData\n }\n\n switch (field.type) {\n case 'boolean':\n return this.mapBoolean(cellData)\n\n case 'date':\n case 'time':\n return this.mapDate(cellData)\n\n default:\n return cellData\n }\n }\n\n protected mapHeader(disableSort = false, extraClasses: string | null = null): Cell[] {\n return this.fields\n .filter((field) => this.columns.includes(field.name))\n .map((f) => {\n if (this.reportQuery && !disableSort) {\n if (f.sortable) {\n let sortDirection = 'none'\n let url = createUrlForParameters(\n this.currentQueryParams || {},\n {\n sortColumn: f.name,\n sortedAsc: 'true',\n },\n this.fields,\n )\n\n if (f.name === this.reportQuery.sortColumn) {\n sortDirection = this.reportQuery.sortedAsc ? 'ascending' : 'descending'\n\n if (this.reportQuery.sortedAsc) {\n url = createUrlForParameters(\n this.currentQueryParams || {},\n {\n sortColumn: f.name,\n sortedAsc: 'false',\n },\n this.fields,\n )\n }\n }\n\n return {\n html:\n `<a ` +\n `data-column=\"${f.name}\" ` +\n `class=\"data-table-header-button data-table-header-button-sort-${sortDirection}\" ` +\n `href=\"${url}\"` +\n `>${f.display}</a>`,\n ...(extraClasses && { classes: extraClasses }),\n }\n }\n }\n return {\n text: f.display,\n ...(extraClasses && { classes: extraClasses }),\n }\n })\n }\n\n protected mapData(data: Array<Dict<string>>): Cell[][] {\n const mappedHeaderSummary = this.mapSummary('table-header')\n const mappedTableData = this.mergeCells(data.map((rowData) => this.mapRow(rowData)))\n const mappedFooterSummary = this.mapSummary('table-footer')\n\n return mappedHeaderSummary.concat(mappedTableData).concat(mappedFooterSummary)\n }\n\n private mergeCells(rows: Cell[][]): Cell[][] {\n const mergeFieldNames = this.fields\n .filter((f) => (<components['schemas']['SummaryField']>f).mergeRows)\n .map((f) => f.name)\n\n if (mergeFieldNames.length === 0) {\n return rows\n }\n\n const occurrences: Dict<Dict<number>> = {}\n mergeFieldNames.forEach((f) => {\n occurrences[f] = rows.reduce((accumulator: Dict<number>, currentRow) => {\n const currentCell = this.getCellByFieldName(currentRow, f)\n let cellValue = ''\n if (currentCell) {\n cellValue = currentCell.text || currentCell.html || ''\n }\n\n return {\n ...accumulator,\n [cellValue]: (accumulator[cellValue] ?? 0) + 1,\n }\n }, {})\n })\n\n return rows.map((row) => {\n let mergedRow = [...row]\n\n mergeFieldNames.forEach((mergeFieldName) => {\n const currentRowCell = this.getCellByFieldName(row, mergeFieldName)\n let cellValue\n let occurrencesOfValue\n if (currentRowCell && occurrences[mergeFieldName]) {\n cellValue = currentRowCell.text || currentRowCell.html || ''\n occurrencesOfValue = occurrences[mergeFieldName][cellValue]\n\n switch (occurrencesOfValue) {\n case -1:\n mergedRow = mergedRow.filter((c) => c.fieldName !== mergeFieldName)\n break\n\n case 1:\n break\n\n default:\n currentRowCell.rowspan = occurrencesOfValue\n occurrences[mergeFieldName][cellValue] = -1\n }\n }\n })\n\n return mergedRow\n })\n }\n\n private getCellByFieldName(row: Cell[], fieldName: string) {\n return row.find((c) => c.fieldName === fieldName)\n }\n\n private mapSummary(template: SummaryTemplate): Cell[][] {\n if (this.reportSummaries[template]) {\n return this.reportSummaries[template].flatMap((reportSummary) =>\n reportSummary.data.map((rowData) =>\n this.mapRow(\n rowData,\n `dpr-report-summary-cell dpr-report-summary-cell-${template}`,\n <components['schemas']['FieldDefinition'][]>reportSummary.fields,\n ),\n ),\n )\n }\n return []\n }\n\n protected sort(data: Dict<string>[]): Dict<string>[] {\n return this.appendSortKeyToData(data)\n .sort(this.sortKeyComparison())\n .map((d: SortKey) => ({\n ...d,\n }))\n }\n\n protected sortKeyComparison() {\n return (a: SortKey, b: SortKey) => {\n const aValue = a.sortKey\n const bValue = b.sortKey\n\n if (aValue === bValue) {\n return 0\n }\n\n if (aValue < bValue) {\n return -1\n }\n\n return 1\n }\n }\n\n private appendSortKeyToData(\n data: Dict<string>[],\n fields: components['schemas']['FieldDefinition'][] | null = null,\n ): SortKey[] {\n const sortFields = fields || this.fields\n\n return data.map((rowData) => {\n const sortKey = this.getSortKey(rowData, sortFields)\n\n return {\n ...rowData,\n sortKey,\n }\n })\n }\n\n protected mapNamesToFields(names: string[]): components['schemas']['FieldDefinition'][] {\n return names.map((s) => this.fields.find((f) => f.name === s)).filter((n) => n !== undefined)\n }\n\n protected getSortKey(rowData: NodeJS.Dict<string>, sortFields: components['schemas']['FieldDefinition'][]) {\n return sortFields\n .map((f) => {\n const value = rowData[f.name]\n if (value && this.dateMapper.isDate(value)) {\n return this.dateMapper.toDateString(value, 'iso')\n }\n\n return this.mapCellValue(f, value)\n })\n .join('-')\n .toLowerCase()\n }\n\n protected convertDataTableToHtml(dataTable: DataTable): string {\n const head = dataTable.head || []\n const headers = head.map((h) => `<th scope='col' class='govuk-table__header'>${h.html ?? h.text}</th>`)\n const rows = dataTable.rows.map(\n (r) =>\n `<tr class='govuk-table__row'>${r\n .map(\n (c) => `<td class='govuk-table__cell govuk-table__cell--${c.format} ${c.classes}'>${c.html ?? c.text}</td>`,\n )\n .join('')}</tr>`,\n )\n\n return (\n \"<table class='govuk-table'>\" +\n `<thead class='govuk-table__head'>${headers.join('')}</thead>` +\n `<tbody class='govuk-table__body'>${rows.join('')}</tbody>` +\n '</table>'\n )\n }\n\n withHeaderOptions({\n reportQuery,\n columns,\n interactive,\n }: {\n reportQuery?: ReportQuery\n columns: string[]\n interactive: boolean\n }) {\n if (interactive && reportQuery) {\n return this.withHeaderSortOptions(reportQuery)\n }\n return this.withNoHeaderOptions(columns)\n }\n\n withHeaderSortOptions(reportQuery: ReportQuery) {\n this.reportQuery = reportQuery\n this.columns = reportQuery.columns\n this.currentQueryParams = this.reportQuery.toRecordWithFilterPrefix()\n\n return this\n }\n\n withNoHeaderOptions(columns: string[]) {\n this.columns = columns\n return this\n }\n\n buildTable(data: Array<Dict<string>>): DataTable {\n const mappedData = this.mapData(this.sortData ? this.sort(data) : data)\n\n return {\n head: this.mapHeader(),\n rows: mappedData,\n rowCount: data.length,\n colCount: this.columns.length,\n }\n }\n\n withSummaries(reportSummaries: Dict<Array<AsyncSummary>>) {\n this.reportSummaries = reportSummaries\n return this\n }\n\n withSortedData(sortData = true) {\n this.sortData = sortData\n return this\n }\n}\n\nexport { DataTableBuilder }\nexport default DataTableBuilder\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["DataTableBuilder_exports", "__export", "DataTableBuilder", "DataTableBuilder_default", "__toCommonJS", "import_urlHelper", "import_DateMapper", "fields", "sortData", "DateMapper", "isoDate", "value", "rowData", "extraClasses", "overrideFields", "f", "field", "o", "textValue", "fieldFormat", "classes", "isHtml", "cellData", "disableSort", "sortDirection", "url", "createUrlForParameters", "data", "mappedHeaderSummary", "mappedTableData", "mappedFooterSummary", "rows", "mergeFieldNames", "occurrences", "accumulator", "currentRow", "currentCell", "cellValue", "row", "mergedRow", "mergeFieldName", "currentRowCell", "occurrencesOfValue", "c", "fieldName", "template", "reportSummary", "d", "a", "b", "aValue", "bValue", "sortFields", "sortKey", "names", "s", "n", "dataTable", "headers", "h", "r", "reportQuery", "columns", "interactive", "mappedData", "reportSummaries"]
|
|
7
7
|
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import Dict = NodeJS.Dict
|
|
2
2
|
import ReportQuery from '../../types/ReportQuery'
|
|
3
|
-
import { Cell, CellFormat, DataTable,
|
|
3
|
+
import { Cell, CellFormat, DataTable, SortKey } from './types'
|
|
4
4
|
import createUrlForParameters from '../urlHelper'
|
|
5
5
|
import type { SummaryTemplate } from '../../types/Templates'
|
|
6
6
|
import { AsyncSummary } from '../../types/UserReports'
|
|
7
7
|
import DateMapper from '../DateMapper/DateMapper'
|
|
8
|
+
import { components } from '../../types/api'
|
|
8
9
|
|
|
9
10
|
class DataTableBuilder {
|
|
10
|
-
protected fields:
|
|
11
|
+
protected fields: components['schemas']['FieldDefinition'][]
|
|
11
12
|
|
|
12
13
|
private sortData: boolean
|
|
13
14
|
|
|
@@ -22,7 +23,7 @@ class DataTableBuilder {
|
|
|
22
23
|
|
|
23
24
|
private dateMapper = new DateMapper()
|
|
24
25
|
|
|
25
|
-
constructor(fields:
|
|
26
|
+
constructor(fields: components['schemas']['FieldDefinition'][], sortData = false) {
|
|
26
27
|
this.fields = fields
|
|
27
28
|
this.sortData = sortData
|
|
28
29
|
}
|
|
@@ -41,7 +42,7 @@ class DataTableBuilder {
|
|
|
41
42
|
protected mapRow(
|
|
42
43
|
rowData: NodeJS.Dict<string>,
|
|
43
44
|
extraClasses = '',
|
|
44
|
-
overrideFields:
|
|
45
|
+
overrideFields: components['schemas']['FieldDefinition'][] = [],
|
|
45
46
|
): Cell[] {
|
|
46
47
|
return this.fields
|
|
47
48
|
.filter((f) => this.columns.includes(f.name))
|
|
@@ -52,7 +53,7 @@ class DataTableBuilder {
|
|
|
52
53
|
})
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
private mapCell(field: FieldDefinition, rowData: NodeJS.Dict<string>, extraClasses = '') {
|
|
56
|
+
private mapCell(field: components['schemas']['FieldDefinition'], rowData: NodeJS.Dict<string>, extraClasses = '') {
|
|
56
57
|
const textValue = this.mapCellValue(field, rowData[field.name])
|
|
57
58
|
let fieldFormat: CellFormat = 'string'
|
|
58
59
|
|
|
@@ -81,7 +82,7 @@ class DataTableBuilder {
|
|
|
81
82
|
return cell
|
|
82
83
|
}
|
|
83
84
|
|
|
84
|
-
protected mapCellValue(field: FieldDefinition, cellData?: string) {
|
|
85
|
+
protected mapCellValue(field: components['schemas']['FieldDefinition'], cellData?: string) {
|
|
85
86
|
if (field.calculated) {
|
|
86
87
|
return cellData
|
|
87
88
|
}
|
|
@@ -106,19 +107,27 @@ class DataTableBuilder {
|
|
|
106
107
|
if (this.reportQuery && !disableSort) {
|
|
107
108
|
if (f.sortable) {
|
|
108
109
|
let sortDirection = 'none'
|
|
109
|
-
let url = createUrlForParameters(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
110
|
+
let url = createUrlForParameters(
|
|
111
|
+
this.currentQueryParams || {},
|
|
112
|
+
{
|
|
113
|
+
sortColumn: f.name,
|
|
114
|
+
sortedAsc: 'true',
|
|
115
|
+
},
|
|
116
|
+
this.fields,
|
|
117
|
+
)
|
|
113
118
|
|
|
114
119
|
if (f.name === this.reportQuery.sortColumn) {
|
|
115
120
|
sortDirection = this.reportQuery.sortedAsc ? 'ascending' : 'descending'
|
|
116
121
|
|
|
117
122
|
if (this.reportQuery.sortedAsc) {
|
|
118
|
-
url = createUrlForParameters(
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
123
|
+
url = createUrlForParameters(
|
|
124
|
+
this.currentQueryParams || {},
|
|
125
|
+
{
|
|
126
|
+
sortColumn: f.name,
|
|
127
|
+
sortedAsc: 'false',
|
|
128
|
+
},
|
|
129
|
+
this.fields,
|
|
130
|
+
)
|
|
122
131
|
}
|
|
123
132
|
}
|
|
124
133
|
|
|
@@ -149,7 +158,9 @@ class DataTableBuilder {
|
|
|
149
158
|
}
|
|
150
159
|
|
|
151
160
|
private mergeCells(rows: Cell[][]): Cell[][] {
|
|
152
|
-
const mergeFieldNames = this.fields
|
|
161
|
+
const mergeFieldNames = this.fields
|
|
162
|
+
.filter((f) => (<components['schemas']['SummaryField']>f).mergeRows)
|
|
163
|
+
.map((f) => f.name)
|
|
153
164
|
|
|
154
165
|
if (mergeFieldNames.length === 0) {
|
|
155
166
|
return rows
|
|
@@ -209,7 +220,11 @@ class DataTableBuilder {
|
|
|
209
220
|
if (this.reportSummaries[template]) {
|
|
210
221
|
return this.reportSummaries[template].flatMap((reportSummary) =>
|
|
211
222
|
reportSummary.data.map((rowData) =>
|
|
212
|
-
this.mapRow(
|
|
223
|
+
this.mapRow(
|
|
224
|
+
rowData,
|
|
225
|
+
`dpr-report-summary-cell dpr-report-summary-cell-${template}`,
|
|
226
|
+
<components['schemas']['FieldDefinition'][]>reportSummary.fields,
|
|
227
|
+
),
|
|
213
228
|
),
|
|
214
229
|
)
|
|
215
230
|
}
|
|
@@ -241,7 +256,10 @@ class DataTableBuilder {
|
|
|
241
256
|
}
|
|
242
257
|
}
|
|
243
258
|
|
|
244
|
-
private appendSortKeyToData(
|
|
259
|
+
private appendSortKeyToData(
|
|
260
|
+
data: Dict<string>[],
|
|
261
|
+
fields: components['schemas']['FieldDefinition'][] | null = null,
|
|
262
|
+
): SortKey[] {
|
|
245
263
|
const sortFields = fields || this.fields
|
|
246
264
|
|
|
247
265
|
return data.map((rowData) => {
|
|
@@ -254,11 +272,11 @@ class DataTableBuilder {
|
|
|
254
272
|
})
|
|
255
273
|
}
|
|
256
274
|
|
|
257
|
-
protected mapNamesToFields(names: string[]): FieldDefinition[] {
|
|
275
|
+
protected mapNamesToFields(names: string[]): components['schemas']['FieldDefinition'][] {
|
|
258
276
|
return names.map((s) => this.fields.find((f) => f.name === s)).filter((n) => n !== undefined)
|
|
259
277
|
}
|
|
260
278
|
|
|
261
|
-
protected getSortKey(rowData: NodeJS.Dict<string>, sortFields: FieldDefinition[]) {
|
|
279
|
+
protected getSortKey(rowData: NodeJS.Dict<string>, sortFields: components['schemas']['FieldDefinition'][]) {
|
|
262
280
|
return sortFields
|
|
263
281
|
.map((f) => {
|
|
264
282
|
const value = rowData[f.name]
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var p=Object.create;var
|
|
1
|
+
var p=Object.create;var i=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var u=Object.getPrototypeOf,d=Object.prototype.hasOwnProperty;var g=(a,t)=>{for(var e in t)i(a,e,{get:t[e],enumerable:!0})},D=(a,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let l of h(t))!d.call(a,l)&&l!==e&&i(a,l,{get:()=>t[l],enumerable:!(r=Y(t,l))||r.enumerable});return a};var m=(a,t,e)=>(e=a!=null?p(u(a)):{},D(t||!a||!a.__esModule?i(e,"default",{value:a,enumerable:!0}):e,a)),F=a=>D(i({},"__esModule",{value:!0}),a);var M={};g(M,{DateMapper:()=>s,default:()=>f});module.exports=F(M);var o=m(require("dayjs")),n=m(require("dayjs/plugin/customParseFormat")),c=m(require("../logger"));class s{constructor(){this.isoDateRegEx=/^(\d{4}[/-](0?[1-9]|1[012])[/-](0?[1-9]|[12][0-9]|3[01]))/;this.localDateRegEx=/^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\d{4}$/;this.localDateShortYearRegEx=/^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\d{2}$/;this.localDateTimeRegEx=/^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\d{4} [0-2]\d:[0-5]\d$/;this.localDateTimeShortYearRegEx=/^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\d{2} [0-2]\d:[0-5]\d$/;this.isoFormat="YYYY-MM-DD";this.localDateFormatInput="D/M/YYYY";this.localDateFormatOutput="DD/MM/YYYY";this.localDateShortYearFormatInput="D/M/YY";this.localDateShortYearFormatOutput="DD/MM/YY";this.localDateTimeFormatInput="D/M/YYYY HH:mm";this.localDateTimeFormatOutput="DD/MM/YYYY HH:mm";this.localDateTimeShortYearFormatInput="D/M/YY HH:mm";this.localDateTimeShortYearFormatOutput="DD/MM/YY HH:mm";this.localDateFormatMonthYear="MMM YY";this.localDateFormatYear="YYYY"}getDateType(t){if(t&&t.match){if(t.match(this.isoDateRegEx))return"iso";if(t.match(this.localDateRegEx))return"local-date";if(t.match(this.localDateShortYearRegEx))return"local-date-short-year";if(t.match(this.localDateTimeRegEx))return"local-datetime";if(t.match(this.localDateTimeShortYearRegEx))return"local-datetime-short-year"}return"none"}getDateWrapper(t){switch(o.default.extend(n.default),this.getDateType(t)){case"iso":return(0,o.default)(t);case"local-date":return(0,o.default)(t,this.localDateFormatInput);case"local-date-short-year":return(0,o.default)(t,this.localDateShortYearFormatInput);case"local-datetime":return(0,o.default)(t,this.localDateTimeFormatInput);case"local-datetime-short-year":return(0,o.default)(t,this.localDateTimeShortYearFormatInput);default:return null}}isDate(t){return this.getDateType(t)!=="none"}toDateString(t,e){const r=this.getDateWrapper(t);if(r)switch(e){case"iso":return r.format(this.isoFormat);case"local-date":return r.format(this.localDateFormatOutput);case"local-date-short-year":return r.format(this.localDateShortYearFormatOutput);case"local-datetime":return r.format(this.localDateTimeFormatOutput);case"local-datetime-short-year":return r.format(this.localDateTimeShortYearFormatOutput);default:return c.default.warn(`Invalid date type: ${e}`),null}return t&&c.default.warn(`Could not map non-date value : ${t}`),null}}var f=s;0&&(module.exports={DateMapper});
|
|
2
2
|
//# sourceMappingURL=DateMapper.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/dpr/utils/DateMapper/DateMapper.ts"],
|
|
4
|
-
"sourcesContent": ["import dayjs, { Dayjs } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { DateType } from './types'\nimport logger from '../logger'\n\nclass DateMapper {\n private isoDateRegEx = /^(\\d{4}[/-](0?[1-9]|1[012])[/-](0?[1-9]|[12][0-9]|3[01]))/\n\n private localDateRegEx = /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{4}$/\n\n private localDateShortYearRegEx = /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{2}$/\n\n private localDateTimeRegEx = /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{4} [0-2]\\d:[0-5]\\d$/\n\n private localDateTimeShortYearRegEx = /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{2} [0-2]\\d:[0-5]\\d$/\n\n private isoFormat = 'YYYY-MM-DD'\n\n private localDateFormatInput = 'D/M/YYYY'\n\n private localDateFormatOutput = 'DD/MM/YYYY'\n\n private localDateShortYearFormatInput = 'D/M/YY'\n\n private localDateShortYearFormatOutput = 'DD/MM/YY'\n\n private localDateTimeFormatInput = 'D/M/YYYY HH:mm'\n\n private localDateTimeFormatOutput = 'DD/MM/YYYY HH:mm'\n\n private localDateTimeShortYearFormatInput = 'D/M/YY HH:mm'\n\n private localDateTimeShortYearFormatOutput = 'DD/MM/YY HH:mm'\n\n getDateType(value: string): DateType {\n if (value && value.match) {\n if (value.match(this.isoDateRegEx)) {\n return 'iso'\n }\n\n if (value.match(this.localDateRegEx)) {\n return 'local-date'\n }\n\n if (value.match(this.localDateShortYearRegEx)) {\n return 'local-date-short-year'\n }\n\n if (value.match(this.localDateTimeRegEx)) {\n return 'local-datetime'\n }\n\n if (value.match(this.localDateTimeShortYearRegEx)) {\n return 'local-datetime-short-year'\n }\n }\n\n return 'none'\n }\n\n getDateWrapper(value: string): Dayjs | null {\n dayjs.extend(customParseFormat)\n\n switch (this.getDateType(value)) {\n case 'iso':\n return dayjs(value)\n case 'local-date':\n return dayjs(value, this.localDateFormatInput)\n case 'local-date-short-year':\n return dayjs(value, this.localDateShortYearFormatInput)\n case 'local-datetime':\n return dayjs(value, this.localDateTimeFormatInput)\n case 'local-datetime-short-year':\n return dayjs(value, this.localDateTimeShortYearFormatInput)\n default:\n return null\n }\n }\n\n isDate(value: string): boolean {\n return this.getDateType(value) !== 'none'\n }\n\n toDateString(value: string, type: DateType): string | null {\n const dateWrapper = this.getDateWrapper(value)\n\n if (dateWrapper) {\n switch (type) {\n case 'iso':\n return dateWrapper.format(this.isoFormat)\n case 'local-date':\n return dateWrapper.format(this.localDateFormatOutput)\n case 'local-date-short-year':\n return dateWrapper.format(this.localDateShortYearFormatOutput)\n case 'local-datetime':\n return dateWrapper.format(this.localDateTimeFormatOutput)\n case 'local-datetime-short-year':\n return dateWrapper.format(this.localDateTimeShortYearFormatOutput)\n default:\n logger.warn(`Invalid date type: ${type}`)\n return null\n }\n }\n\n if (value) {\n logger.warn(`Could not map non-date value : ${value}`)\n }\n return null\n }\n}\n\nexport { DateMapper }\nexport default DateMapper\n"],
|
|
5
|
-
"mappings": "6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAA6B,oBAC7BC,EAA8B,6CAE9BC,EAAmB,wBAEnB,MAAML,CAAW,CAAjB,cACE,KAAQ,aAAe,4DAEvB,KAAQ,eAAiB,2DAEzB,KAAQ,wBAA0B,2DAElC,KAAQ,mBAAqB,2EAE7B,KAAQ,4BAA8B,2EAEtC,KAAQ,UAAY,aAEpB,KAAQ,qBAAuB,WAE/B,KAAQ,sBAAwB,aAEhC,KAAQ,8BAAgC,SAExC,KAAQ,+BAAiC,WAEzC,KAAQ,yBAA2B,iBAEnC,KAAQ,0BAA4B,mBAEpC,KAAQ,kCAAoC,eAE5C,KAAQ,mCAAqC,iBAE7C,YAAYM,EAAyB,CACnC,GAAIA,GAASA,EAAM,MAAO,CACxB,GAAIA,EAAM,MAAM,KAAK,YAAY,EAC/B,MAAO,MAGT,GAAIA,EAAM,MAAM,KAAK,cAAc,EACjC,MAAO,aAGT,GAAIA,EAAM,MAAM,KAAK,uBAAuB,EAC1C,MAAO,wBAGT,GAAIA,EAAM,MAAM,KAAK,kBAAkB,EACrC,MAAO,iBAGT,GAAIA,EAAM,MAAM,KAAK,2BAA2B,EAC9C,MAAO,2BAEX,CAEA,MAAO,MACT,CAEA,eAAeA,EAA6B,CAG1C,OAFA,EAAAC,QAAM,OAAO,EAAAC,OAAiB,EAEtB,KAAK,YAAYF,CAAK,EAAG,CAC/B,IAAK,MACH,SAAO,EAAAC,SAAMD,CAAK,EACpB,IAAK,aACH,SAAO,EAAAC,SAAMD,EAAO,KAAK,oBAAoB,EAC/C,IAAK,wBACH,SAAO,EAAAC,SAAMD,EAAO,KAAK,6BAA6B,EACxD,IAAK,iBACH,SAAO,EAAAC,SAAMD,EAAO,KAAK,wBAAwB,EACnD,IAAK,4BACH,SAAO,EAAAC,SAAMD,EAAO,KAAK,iCAAiC,EAC5D,QACE,OAAO,IACX,CACF,CAEA,OAAOA,EAAwB,CAC7B,OAAO,KAAK,YAAYA,CAAK,IAAM,MACrC,CAEA,aAAaA,EAAeG,EAA+B,CACzD,MAAMC,EAAc,KAAK,eAAeJ,CAAK,EAE7C,GAAII,EACF,OAAQD,EAAM,CACZ,IAAK,MACH,OAAOC,EAAY,OAAO,KAAK,SAAS,EAC1C,IAAK,aACH,OAAOA,EAAY,OAAO,KAAK,qBAAqB,EACtD,IAAK,wBACH,OAAOA,EAAY,OAAO,KAAK,8BAA8B,EAC/D,IAAK,iBACH,OAAOA,EAAY,OAAO,KAAK,yBAAyB,EAC1D,IAAK,4BACH,OAAOA,EAAY,OAAO,KAAK,kCAAkC,EACnE,QACE,SAAAC,QAAO,KAAK,sBAAsBF,CAAI,EAAE,EACjC,IACX,CAGF,OAAIH,GACF,EAAAK,QAAO,KAAK,kCAAkCL,CAAK,EAAE,EAEhD,IACT,CACF,CAGA,IAAOL,EAAQD",
|
|
4
|
+
"sourcesContent": ["import dayjs, { Dayjs } from 'dayjs'\nimport customParseFormat from 'dayjs/plugin/customParseFormat'\nimport { DateType } from './types'\nimport logger from '../logger'\n\nclass DateMapper {\n private isoDateRegEx = /^(\\d{4}[/-](0?[1-9]|1[012])[/-](0?[1-9]|[12][0-9]|3[01]))/\n\n private localDateRegEx = /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{4}$/\n\n private localDateShortYearRegEx = /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{2}$/\n\n private localDateTimeRegEx = /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{4} [0-2]\\d:[0-5]\\d$/\n\n private localDateTimeShortYearRegEx = /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{2} [0-2]\\d:[0-5]\\d$/\n\n private isoFormat = 'YYYY-MM-DD'\n\n private localDateFormatInput = 'D/M/YYYY'\n\n private localDateFormatOutput = 'DD/MM/YYYY'\n\n private localDateShortYearFormatInput = 'D/M/YY'\n\n private localDateShortYearFormatOutput = 'DD/MM/YY'\n\n private localDateTimeFormatInput = 'D/M/YYYY HH:mm'\n\n private localDateTimeFormatOutput = 'DD/MM/YYYY HH:mm'\n\n private localDateTimeShortYearFormatInput = 'D/M/YY HH:mm'\n\n private localDateTimeShortYearFormatOutput = 'DD/MM/YY HH:mm'\n\n private localDateFormatMonthYear = 'MMM YY'\n\n private localDateFormatYear = 'YYYY'\n\n getDateType(value: string): DateType {\n if (value && value.match) {\n if (value.match(this.isoDateRegEx)) {\n return 'iso'\n }\n\n if (value.match(this.localDateRegEx)) {\n return 'local-date'\n }\n\n if (value.match(this.localDateShortYearRegEx)) {\n return 'local-date-short-year'\n }\n\n if (value.match(this.localDateTimeRegEx)) {\n return 'local-datetime'\n }\n\n if (value.match(this.localDateTimeShortYearRegEx)) {\n return 'local-datetime-short-year'\n }\n }\n\n return 'none'\n }\n\n getDateWrapper(value: string): Dayjs | null {\n dayjs.extend(customParseFormat)\n\n switch (this.getDateType(value)) {\n case 'iso':\n return dayjs(value)\n case 'local-date':\n return dayjs(value, this.localDateFormatInput)\n case 'local-date-short-year':\n return dayjs(value, this.localDateShortYearFormatInput)\n case 'local-datetime':\n return dayjs(value, this.localDateTimeFormatInput)\n case 'local-datetime-short-year':\n return dayjs(value, this.localDateTimeShortYearFormatInput)\n default:\n return null\n }\n }\n\n isDate(value: string): boolean {\n return this.getDateType(value) !== 'none'\n }\n\n toDateString(value: string, type: DateType): string | null {\n const dateWrapper = this.getDateWrapper(value)\n\n if (dateWrapper) {\n switch (type) {\n case 'iso':\n return dateWrapper.format(this.isoFormat)\n case 'local-date':\n return dateWrapper.format(this.localDateFormatOutput)\n case 'local-date-short-year':\n return dateWrapper.format(this.localDateShortYearFormatOutput)\n case 'local-datetime':\n return dateWrapper.format(this.localDateTimeFormatOutput)\n case 'local-datetime-short-year':\n return dateWrapper.format(this.localDateTimeShortYearFormatOutput)\n default:\n logger.warn(`Invalid date type: ${type}`)\n return null\n }\n }\n\n if (value) {\n logger.warn(`Could not map non-date value : ${value}`)\n }\n return null\n }\n}\n\nexport { DateMapper }\nexport default DateMapper\n"],
|
|
5
|
+
"mappings": "6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gBAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GAAA,IAAAK,EAA6B,oBAC7BC,EAA8B,6CAE9BC,EAAmB,wBAEnB,MAAML,CAAW,CAAjB,cACE,KAAQ,aAAe,4DAEvB,KAAQ,eAAiB,2DAEzB,KAAQ,wBAA0B,2DAElC,KAAQ,mBAAqB,2EAE7B,KAAQ,4BAA8B,2EAEtC,KAAQ,UAAY,aAEpB,KAAQ,qBAAuB,WAE/B,KAAQ,sBAAwB,aAEhC,KAAQ,8BAAgC,SAExC,KAAQ,+BAAiC,WAEzC,KAAQ,yBAA2B,iBAEnC,KAAQ,0BAA4B,mBAEpC,KAAQ,kCAAoC,eAE5C,KAAQ,mCAAqC,iBAE7C,KAAQ,yBAA2B,SAEnC,KAAQ,oBAAsB,OAE9B,YAAYM,EAAyB,CACnC,GAAIA,GAASA,EAAM,MAAO,CACxB,GAAIA,EAAM,MAAM,KAAK,YAAY,EAC/B,MAAO,MAGT,GAAIA,EAAM,MAAM,KAAK,cAAc,EACjC,MAAO,aAGT,GAAIA,EAAM,MAAM,KAAK,uBAAuB,EAC1C,MAAO,wBAGT,GAAIA,EAAM,MAAM,KAAK,kBAAkB,EACrC,MAAO,iBAGT,GAAIA,EAAM,MAAM,KAAK,2BAA2B,EAC9C,MAAO,2BAEX,CAEA,MAAO,MACT,CAEA,eAAeA,EAA6B,CAG1C,OAFA,EAAAC,QAAM,OAAO,EAAAC,OAAiB,EAEtB,KAAK,YAAYF,CAAK,EAAG,CAC/B,IAAK,MACH,SAAO,EAAAC,SAAMD,CAAK,EACpB,IAAK,aACH,SAAO,EAAAC,SAAMD,EAAO,KAAK,oBAAoB,EAC/C,IAAK,wBACH,SAAO,EAAAC,SAAMD,EAAO,KAAK,6BAA6B,EACxD,IAAK,iBACH,SAAO,EAAAC,SAAMD,EAAO,KAAK,wBAAwB,EACnD,IAAK,4BACH,SAAO,EAAAC,SAAMD,EAAO,KAAK,iCAAiC,EAC5D,QACE,OAAO,IACX,CACF,CAEA,OAAOA,EAAwB,CAC7B,OAAO,KAAK,YAAYA,CAAK,IAAM,MACrC,CAEA,aAAaA,EAAeG,EAA+B,CACzD,MAAMC,EAAc,KAAK,eAAeJ,CAAK,EAE7C,GAAII,EACF,OAAQD,EAAM,CACZ,IAAK,MACH,OAAOC,EAAY,OAAO,KAAK,SAAS,EAC1C,IAAK,aACH,OAAOA,EAAY,OAAO,KAAK,qBAAqB,EACtD,IAAK,wBACH,OAAOA,EAAY,OAAO,KAAK,8BAA8B,EAC/D,IAAK,iBACH,OAAOA,EAAY,OAAO,KAAK,yBAAyB,EAC1D,IAAK,4BACH,OAAOA,EAAY,OAAO,KAAK,kCAAkC,EACnE,QACE,SAAAC,QAAO,KAAK,sBAAsBF,CAAI,EAAE,EACjC,IACX,CAGF,OAAIH,GACF,EAAAK,QAAO,KAAK,kCAAkCL,CAAK,EAAE,EAEhD,IACT,CACF,CAGA,IAAOL,EAAQD",
|
|
6
6
|
"names": ["DateMapper_exports", "__export", "DateMapper", "DateMapper_default", "__toCommonJS", "import_dayjs", "import_customParseFormat", "import_logger", "value", "dayjs", "customParseFormat", "type", "dateWrapper", "logger"]
|
|
7
7
|
}
|
|
@@ -32,6 +32,10 @@ class DateMapper {
|
|
|
32
32
|
|
|
33
33
|
private localDateTimeShortYearFormatOutput = 'DD/MM/YY HH:mm'
|
|
34
34
|
|
|
35
|
+
private localDateFormatMonthYear = 'MMM YY'
|
|
36
|
+
|
|
37
|
+
private localDateFormatYear = 'YYYY'
|
|
38
|
+
|
|
35
39
|
getDateType(value: string): DateType {
|
|
36
40
|
if (value && value.match) {
|
|
37
41
|
if (value.match(this.isoDateRegEx)) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var I=Object.create;var u=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var y=Object.getOwnPropertyNames;var D=Object.getPrototypeOf,R=Object.prototype.hasOwnProperty;var q=(r,t)=>{for(var e in t)u(r,e,{get:t[e],enumerable:!0})},d=(r,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of y(t))!R.call(r,s)&&s!==e&&u(r,s,{get:()=>t[s],enumerable:!(i=g(t,s))||i.enumerable});return r};var f=(r,t,e)=>(e=r!=null?I(D(r)):{},d(t||!r||!r.__esModule?u(e,"default",{value:r,enumerable:!0}):e,r)),U=r=>d(u({},"__esModule",{value:!0}),r);var b={};q(b,{UserStoreItemBuilder:()=>h,default:()=>E});module.exports=U(b);var p=f(require("parseurl")),o=require("../types/UserReports");class h{constructor(t,e){this.build=()=>this.userStoreItem;this.addReportData=({type:t,reportId:e,reportName:i,description:s,id:m,name:n})=>({type:t,reportId:e,reportName:i,description:s,id:m,name:n,timestamp:{}});this.addExecutionData=t=>(this.userStoreItem={...this.userStoreItem,...t},this);this.addChildExecutionData=t=>(this.userStoreItem={...this.userStoreItem,childExecutionData:t},this);this.addFilters=t=>{const e=new URLSearchParams(t).toString();return this.userStoreItem={...this.userStoreItem,filters:{data:t,queryString:e}},this};this.addSortData=t=>{const e=new URLSearchParams(t).toString();return this.userStoreItem={...this.userStoreItem,sortBy:{data:t,queryString:e}},this};this.addRequestUrls=t=>{const{origin:e,pathname:i,search:s,href:m}=this.requestFormData,{executionId:n,dataProductDefinitionsPath:S,dpdPathFromQuery:l}=this.userStoreItem;let a=t.baseUrl.replace("/filters",`/${n}/status`);l&&(a=`${a}?dataProductDefinitionsPath=${S}`);const c=`${e}${a}`;return this.userStoreItem={...this.userStoreItem,url:{origin:e,request:{fullUrl:m,pathname:i,search:s},polling:{fullUrl:c,pathname:a}}},this};this.addAsyncUrls=t=>(this.userStoreItem={...this.userStoreItem,url:t},this);this.addReportUrls=t=>{const e=t.get("host"),i=`${t.protocol}://${t.get("host")}${t.originalUrl}`,s=(0,p.default)(t);return this.userStoreItem={...this.userStoreItem,url:{origin:e||this.userStoreItem.url?.origin||"",...this.userStoreItem.url?.request&&{request:this.userStoreItem.url.request},...this.userStoreItem.url?.polling&&{polling:this.userStoreItem.url.polling},report:{...this.userStoreItem.url?.report&&this.userStoreItem.url.report,fullUrl:i,...s&&s.search&&{search:s.search}}}},this};this.addLoadType=t=>(this.userStoreItem={...this.userStoreItem,loadType:t},this);this.addQuery=t=>(this.userStoreItem={...this.userStoreItem,...t&&{query:{data:t.query,summary:t.querySummary}}},this);this.addInteractiveQuery=t=>(t&&(this.userStoreItem={...this.userStoreItem,interactiveQuery:{data:t.query,summary:t.querySummary}}),this);this.addStatus=t=>(this.userStoreItem={...this.userStoreItem,status:t},this);this.addMetrics=t=>(this.userStoreItem={...this.userStoreItem,metrics:t.filter(e=>e.display).map(e=>({name:e.display||""}))},this);this.addTimestamp=()=>{const{status:t}=this.userStoreItem,e=new Date;switch(t){case o.RequestStatus.FAILED:this.userStoreItem.timestamp.failed=e;break;case o.RequestStatus.EXPIRED:this.userStoreItem.timestamp.expired=e;break;case o.RequestStatus.ABORTED:this.userStoreItem.timestamp.aborted=e;break;case o.RequestStatus.FINISHED:this.userStoreItem.timestamp.completed=e;break;case o.RequestStatus.SUBMITTED:this.userStoreItem.timestamp.requested=e;break;case o.RequestStatus.STARTED:case o.RequestStatus.PICKED:break;default:this.userStoreItem.timestamp.lastViewed=e;break}return this};this.addDefinitionsPath=(t,e)=>(t&&(this.userStoreItem={...this.userStoreItem,dataProductDefinitionsPath:t,dpdPathFromQuery:e}),this);this.requestFormData=e||{},this.userStoreItem=this.addReportData(t)}}var E=h;0&&(module.exports={UserStoreItemBuilder});
|
|
2
2
|
//# sourceMappingURL=UserStoreItemBuilder.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/dpr/utils/UserStoreItemBuilder.ts"],
|
|
4
|
-
"sourcesContent": ["import type { Request } from 'express'\nimport parseUrl from 'parseurl'\nimport {\n AsyncReportUrlData,\n LoadType,\n ReportType,\n RequestedReport,\n RequestFormData,\n RequestStatus,\n UserReportData,\n} from '../types/UserReports'\nimport Dict = NodeJS.Dict\nimport { ChildReportExecutionData, ExecutionData } from '../types/ExecutionData'\nimport { DashboardSection } from '../components/_dashboards/dashboard/types'\n\nclass UserStoreItemBuilder {\n userStoreItem: UserReportData\n\n requestFormData: RequestFormData | Record<string, never>\n\n constructor(\n reportData: {\n type: ReportType\n reportId: string\n reportName: string\n description: string\n id: string\n name: string\n },\n requestFormData?: RequestFormData,\n ) {\n this.requestFormData = requestFormData || {}\n this.userStoreItem = this.addReportData(reportData)\n }\n\n build = () => {\n return this.userStoreItem as RequestedReport\n }\n\n addReportData = ({\n type,\n reportId,\n reportName,\n description,\n id,\n name,\n }: {\n type: ReportType\n reportId: string\n reportName: string\n description: string\n id: string\n name: string\n }) => {\n return {\n type: type as ReportType,\n reportId,\n reportName,\n description,\n id,\n name,\n timestamp: {},\n }\n }\n\n addExecutionData = (executionData: ExecutionData) => {\n this.userStoreItem = {\n ...(<UserReportData>this.userStoreItem),\n ...executionData,\n }\n return this\n }\n\n addChildExecutionData = (childExecutionData: Array<ChildReportExecutionData>) => {\n this.userStoreItem = {\n ...(<UserReportData>this.userStoreItem),\n childExecutionData,\n }\n return this\n }\n\n addFilters = (filterData?: Record<string, string>) => {\n const filtersQueryString = new URLSearchParams(filterData).toString()\n this.userStoreItem = {\n ...this.userStoreItem,\n ...{\n filters: {\n data: filterData,\n queryString: filtersQueryString,\n },\n },\n }\n return this\n }\n\n addSortData = (sortData: Record<string, string>) => {\n const sortByQueryString = new URLSearchParams(sortData).toString()\n this.userStoreItem = {\n ...this.userStoreItem,\n ...{\n sortBy: {\n data: sortData,\n queryString: sortByQueryString,\n },\n },\n }\n return this\n }\n\n addRequestUrls = (req: Request) => {\n const { origin, pathname, search, href } = this.requestFormData\n const { executionId } = this.userStoreItem\n\n // Polling path\n
|
|
5
|
-
"mappings": "6iBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,0BAAAE,EAAA,YAAAC,IAAA,eAAAC,EAAAJ,GACA,IAAAK,EAAqB,uBACrBC,EAQO,gCAKP,MAAMJ,CAAqB,CAKzB,YACEK,EAQAC,EACA,CAKF,WAAQ,IACC,KAAK,cAGd,mBAAgB,CAAC,CACf,KAAAC,EACA,SAAAC,EACA,WAAAC,EACA,YAAAC,EACA,GAAAC,EACA,KAAAC,CACF,KAQS,CACL,KAAML,EACN,SAAAC,EACA,WAAAC,EACA,YAAAC,EACA,GAAAC,EACA,KAAAC,EACA,UAAW,CAAC,CACd,GAGF,sBAAoBC,IAClB,KAAK,cAAgB,CACnB,GAAoB,KAAK,cACzB,GAAGA,CACL,EACO,MAGT,2BAAyBC,IACvB,KAAK,cAAgB,CACnB,GAAoB,KAAK,cACzB,mBAAAA,CACF,EACO,MAGT,gBAAcC,GAAwC,CACpD,MAAMC,EAAqB,IAAI,gBAAgBD,CAAU,EAAE,SAAS,EACpE,YAAK,cAAgB,CACnB,GAAG,KAAK,cAEN,QAAS,CACP,KAAMA,EACN,YAAaC,CACf,CAEJ,EACO,IACT,EAEA,iBAAeC,GAAqC,CAClD,MAAMC,EAAoB,IAAI,gBAAgBD,CAAQ,EAAE,SAAS,EACjE,YAAK,cAAgB,CACnB,GAAG,KAAK,cAEN,OAAQ,CACN,KAAMA,EACN,YAAaC,CACf,CAEJ,EACO,IACT,EAEA,oBAAkBC,GAAiB,CACjC,KAAM,CAAE,OAAAC,EAAQ,SAAAC,EAAU,OAAAC,EAAQ,KAAAC,CAAK,EAAI,KAAK,gBAC1C,CAAE,YAAAC,
|
|
6
|
-
"names": ["UserStoreItemBuilder_exports", "__export", "UserStoreItemBuilder", "UserStoreItemBuilder_default", "__toCommonJS", "import_parseurl", "import_UserReports", "reportData", "requestFormData", "type", "reportId", "reportName", "description", "id", "name", "executionData", "childExecutionData", "filterData", "filtersQueryString", "sortData", "sortByQueryString", "req", "origin", "pathname", "search", "href", "executionId", "pollingPath", "pollingFullUrl", "url", "fullUrl", "urlData", "parseUrl", "loadType", "queryData", "status", "metrics", "metric", "ts", "definitionsPath"
|
|
4
|
+
"sourcesContent": ["import type { Request } from 'express'\nimport parseUrl from 'parseurl'\nimport {\n AsyncReportUrlData,\n LoadType,\n ReportType,\n RequestedReport,\n RequestFormData,\n RequestStatus,\n UserReportData,\n} from '../types/UserReports'\nimport Dict = NodeJS.Dict\nimport { ChildReportExecutionData, ExecutionData } from '../types/ExecutionData'\nimport { DashboardSection } from '../components/_dashboards/dashboard/types'\n\nclass UserStoreItemBuilder {\n userStoreItem: UserReportData\n\n requestFormData: RequestFormData | Record<string, never>\n\n constructor(\n reportData: {\n type: ReportType\n reportId: string\n reportName: string\n description: string\n id: string\n name: string\n },\n requestFormData?: RequestFormData,\n ) {\n this.requestFormData = requestFormData || {}\n this.userStoreItem = this.addReportData(reportData)\n }\n\n build = () => {\n return this.userStoreItem as RequestedReport\n }\n\n addReportData = ({\n type,\n reportId,\n reportName,\n description,\n id,\n name,\n }: {\n type: ReportType\n reportId: string\n reportName: string\n description: string\n id: string\n name: string\n }) => {\n return {\n type: type as ReportType,\n reportId,\n reportName,\n description,\n id,\n name,\n timestamp: {},\n }\n }\n\n addExecutionData = (executionData: ExecutionData) => {\n this.userStoreItem = {\n ...(<UserReportData>this.userStoreItem),\n ...executionData,\n }\n return this\n }\n\n addChildExecutionData = (childExecutionData: Array<ChildReportExecutionData>) => {\n this.userStoreItem = {\n ...(<UserReportData>this.userStoreItem),\n childExecutionData,\n }\n return this\n }\n\n addFilters = (filterData?: Record<string, string>) => {\n const filtersQueryString = new URLSearchParams(filterData).toString()\n this.userStoreItem = {\n ...this.userStoreItem,\n ...{\n filters: {\n data: filterData,\n queryString: filtersQueryString,\n },\n },\n }\n return this\n }\n\n addSortData = (sortData: Record<string, string>) => {\n const sortByQueryString = new URLSearchParams(sortData).toString()\n this.userStoreItem = {\n ...this.userStoreItem,\n ...{\n sortBy: {\n data: sortData,\n queryString: sortByQueryString,\n },\n },\n }\n return this\n }\n\n addRequestUrls = (req: Request) => {\n const { origin, pathname, search, href } = this.requestFormData\n const { executionId, dataProductDefinitionsPath, dpdPathFromQuery } = this.userStoreItem\n\n // Polling path\n let pollingPath = req.baseUrl.replace('/filters', `/${executionId}/status`)\n if (dpdPathFromQuery) {\n pollingPath = `${pollingPath}?dataProductDefinitionsPath=${dataProductDefinitionsPath}`\n }\n const pollingFullUrl = `${origin}${pollingPath}`\n this.userStoreItem = {\n ...this.userStoreItem,\n ...{\n url: {\n origin,\n request: {\n fullUrl: href,\n pathname,\n search,\n },\n polling: {\n fullUrl: pollingFullUrl,\n pathname: pollingPath,\n },\n },\n },\n }\n\n return this\n }\n\n addAsyncUrls = (url: AsyncReportUrlData) => {\n this.userStoreItem = {\n ...this.userStoreItem,\n ...{\n url,\n },\n }\n\n return this\n }\n\n addReportUrls = (req: Request) => {\n const origin = req.get('host')\n const fullUrl = `${req.protocol}://${req.get('host')}${req.originalUrl}`\n const urlData = parseUrl(req)\n\n this.userStoreItem = {\n ...this.userStoreItem,\n ...{\n url: {\n origin: origin || this.userStoreItem.url?.origin || '',\n ...(this.userStoreItem.url?.request && { request: this.userStoreItem.url.request }),\n ...(this.userStoreItem.url?.polling && { polling: this.userStoreItem.url.polling }),\n report: {\n ...(this.userStoreItem.url?.report && this.userStoreItem.url.report),\n fullUrl,\n ...(urlData && urlData.search && { search: urlData.search }),\n },\n },\n },\n }\n\n return this\n }\n\n addLoadType = (loadType: LoadType) => {\n this.userStoreItem = {\n ...this.userStoreItem,\n loadType,\n }\n\n return this\n }\n\n addQuery = (queryData?: { query: Dict<string | string[]>; querySummary: Array<Dict<string>> }) => {\n this.userStoreItem = {\n ...this.userStoreItem,\n ...(queryData && {\n query: {\n data: queryData.query,\n summary: queryData.querySummary,\n },\n }),\n }\n return this\n }\n\n addInteractiveQuery = (queryData?: { query: Dict<string | string[]>; querySummary: Array<Dict<string>> }) => {\n if (queryData) {\n this.userStoreItem = {\n ...this.userStoreItem,\n ...{\n interactiveQuery: {\n data: queryData.query,\n summary: queryData.querySummary,\n },\n },\n }\n }\n return this\n }\n\n addStatus = (status: RequestStatus) => {\n this.userStoreItem = {\n ...this.userStoreItem,\n status,\n }\n return this\n }\n\n addMetrics = (metrics: DashboardSection[]) => {\n this.userStoreItem = {\n ...this.userStoreItem,\n metrics: metrics.filter((metric) => metric.display).map((metric) => ({ name: metric.display || '' })),\n }\n return this\n }\n\n addTimestamp = () => {\n const { status } = this.userStoreItem\n const ts = new Date()\n switch (status) {\n case RequestStatus.FAILED:\n this.userStoreItem.timestamp.failed = ts\n break\n case RequestStatus.EXPIRED:\n this.userStoreItem.timestamp.expired = ts\n break\n case RequestStatus.ABORTED:\n this.userStoreItem.timestamp.aborted = ts\n break\n case RequestStatus.FINISHED:\n this.userStoreItem.timestamp.completed = ts\n break\n case RequestStatus.SUBMITTED:\n this.userStoreItem.timestamp.requested = ts\n break\n case RequestStatus.STARTED:\n case RequestStatus.PICKED:\n break\n default:\n this.userStoreItem.timestamp.lastViewed = ts\n break\n }\n return this\n }\n\n addDefinitionsPath = (definitionsPath: string, dpdPathFromQuery: boolean) => {\n if (definitionsPath) {\n this.userStoreItem = {\n ...this.userStoreItem,\n dataProductDefinitionsPath: definitionsPath,\n dpdPathFromQuery,\n }\n }\n return this\n }\n}\n\nexport { UserStoreItemBuilder }\nexport default UserStoreItemBuilder\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["UserStoreItemBuilder_exports", "__export", "UserStoreItemBuilder", "UserStoreItemBuilder_default", "__toCommonJS", "import_parseurl", "import_UserReports", "reportData", "requestFormData", "type", "reportId", "reportName", "description", "id", "name", "executionData", "childExecutionData", "filterData", "filtersQueryString", "sortData", "sortByQueryString", "req", "origin", "pathname", "search", "href", "executionId", "dataProductDefinitionsPath", "dpdPathFromQuery", "pollingPath", "pollingFullUrl", "url", "fullUrl", "urlData", "parseUrl", "loadType", "queryData", "status", "metrics", "metric", "ts", "definitionsPath"]
|
|
7
7
|
}
|
|
@@ -109,12 +109,14 @@ class UserStoreItemBuilder {
|
|
|
109
109
|
|
|
110
110
|
addRequestUrls = (req: Request) => {
|
|
111
111
|
const { origin, pathname, search, href } = this.requestFormData
|
|
112
|
-
const { executionId } = this.userStoreItem
|
|
112
|
+
const { executionId, dataProductDefinitionsPath, dpdPathFromQuery } = this.userStoreItem
|
|
113
113
|
|
|
114
114
|
// Polling path
|
|
115
|
-
|
|
115
|
+
let pollingPath = req.baseUrl.replace('/filters', `/${executionId}/status`)
|
|
116
|
+
if (dpdPathFromQuery) {
|
|
117
|
+
pollingPath = `${pollingPath}?dataProductDefinitionsPath=${dataProductDefinitionsPath}`
|
|
118
|
+
}
|
|
116
119
|
const pollingFullUrl = `${origin}${pollingPath}`
|
|
117
|
-
|
|
118
120
|
this.userStoreItem = {
|
|
119
121
|
...this.userStoreItem,
|
|
120
122
|
...{
|
|
@@ -193,7 +195,7 @@ class UserStoreItemBuilder {
|
|
|
193
195
|
return this
|
|
194
196
|
}
|
|
195
197
|
|
|
196
|
-
addInteractiveQuery = (queryData?: { query: Dict<string>; querySummary: Array<Dict<string>> }) => {
|
|
198
|
+
addInteractiveQuery = (queryData?: { query: Dict<string | string[]>; querySummary: Array<Dict<string>> }) => {
|
|
197
199
|
if (queryData) {
|
|
198
200
|
this.userStoreItem = {
|
|
199
201
|
...this.userStoreItem,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var h=Object.create;var E=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var w=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})},A=(e,t,r,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of b(t))!F.call(e,o)&&o!==r&&E(e,o,{get:()=>t[o],enumerable:!(u=v(t,o))||u.enumerable});return e};var l=(e,t,r)=>(r=e!=null?h(U(e)):{},A(t||!e||!e.__esModule?E(r,"default",{value:e,enumerable:!0}):r,e)),B=e=>A(E({},"__esModule",{value:!0}),e);var X={};w(X,{default:()=>N,getExpiredStatus:()=>M,getStatus:()=>x,shouldTimeoutRequest:()=>I});module.exports=B(X);var m=l(require("dayjs")),P=l(require("dayjs/plugin/customParseFormat")),s=require("../types/UserReports"),D=l(require("./logger")),g=l(require("./localsHelper"));m.default.extend(P.default);const L=[s.RequestStatus.ABORTED,s.RequestStatus.FAILED,s.RequestStatus.EXPIRED],O=[s.RequestStatus.SUBMITTED,s.RequestStatus.STARTED,s.RequestStatus.PICKED];function H(e){return Promise.all(e).then(t=>{const r=t.find(o=>typeof o.status=="number"||L.includes(o.status));if(r)return r;const u=t.find(o=>O.includes(o.status));return u||t[0]})}const T=async(e,t,r,u,o)=>{const{definitionsPath:R}=g.default.getValues(r),{type:d,reportId:c,executionId:a,id:i,tableId:n}=t.body,S=(await e.requestedReportService.getReportByExecutionId(a,o)).childExecutionData??[];d===s.ReportType.REPORT&&S.push({executionId:a,tableId:n,variantId:i});const q=S.map(f=>e.reportingService.getAsyncReportStatus(u,c,f.variantId,f.executionId,R,f.tableId));d===s.ReportType.DASHBOARD&&q.push(e.dashboardService.getAsyncStatus(u,c,i,a,R
|
|
1
|
+
var h=Object.create;var E=Object.defineProperty;var v=Object.getOwnPropertyDescriptor;var b=Object.getOwnPropertyNames;var U=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var w=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})},A=(e,t,r,u)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of b(t))!F.call(e,o)&&o!==r&&E(e,o,{get:()=>t[o],enumerable:!(u=v(t,o))||u.enumerable});return e};var l=(e,t,r)=>(r=e!=null?h(U(e)):{},A(t||!e||!e.__esModule?E(r,"default",{value:e,enumerable:!0}):r,e)),B=e=>A(E({},"__esModule",{value:!0}),e);var X={};w(X,{default:()=>N,getExpiredStatus:()=>M,getStatus:()=>x,shouldTimeoutRequest:()=>I});module.exports=B(X);var m=l(require("dayjs")),P=l(require("dayjs/plugin/customParseFormat")),s=require("../types/UserReports"),D=l(require("./logger")),g=l(require("./localsHelper"));m.default.extend(P.default);const L=[s.RequestStatus.ABORTED,s.RequestStatus.FAILED,s.RequestStatus.EXPIRED],O=[s.RequestStatus.SUBMITTED,s.RequestStatus.STARTED,s.RequestStatus.PICKED];function H(e){return Promise.all(e).then(t=>{const r=t.find(o=>typeof o.status=="number"||L.includes(o.status));if(r)return r;const u=t.find(o=>O.includes(o.status));return u||t[0]})}const T=async(e,t,r,u,o)=>{const{definitionsPath:R}=g.default.getValues(r),{type:d,reportId:c,executionId:a,id:i,tableId:n}=t.body,S=(await e.requestedReportService.getReportByExecutionId(a,o)).childExecutionData??[];d===s.ReportType.REPORT&&S.push({executionId:a,tableId:n,variantId:i});const q=S.map(f=>e.reportingService.getAsyncReportStatus(u,c,f.variantId,f.executionId,R,f.tableId));d===s.ReportType.DASHBOARD&&q.push(e.dashboardService.getAsyncStatus(u,c,i,a,n,R));const y=await H(q);return{status:y.status,statusResponse:y}},x=async({req:e,res:t,services:r})=>{const{token:u,dprUser:o}=g.default.getValues(t),{status:R,requestedAt:d}=e.body,c=[s.RequestStatus.READY,s.RequestStatus.EXPIRED,s.RequestStatus.FAILED];let a,i,n;try{if({status:a,statusResponse:n}=await T(r,e,t,u,o.id),I({requestedAt:d,compareTime:new Date,durationMins:15})&&!c.includes(a))throw new Error("Request taking too long. Request Halted");if(a===s.RequestStatus.FAILED){D.default.error(`Error: ${JSON.stringify(n.error)}`);const{userMessage:p,developerMessage:S}=n.error;p||S?i=n.error:i={developerMessage:n.error}}}catch(p){D.default.error(`Error: ${JSON.stringify(p)}`);const{data:S}=p;i=S||{userMessage:p.message},a=R===s.RequestStatus.FINISHED?s.RequestStatus.EXPIRED:s.RequestStatus.FAILED}return typeof a=="number"&&(a=s.RequestStatus.FAILED),{status:a,...i&&{errorMessage:i}}},M=async({req:e,res:t,services:r})=>{const{token:u,dprUser:o}=g.default.getValues(t),{executionId:R,status:d}=e.body;let c,a;try{({status:a}=await T(r,e,t,u,o.id))}catch(n){const{data:p}=n;c=(p??{}).userMessage,a=d===s.RequestStatus.READY||d===s.RequestStatus.FINISHED?s.RequestStatus.EXPIRED:s.RequestStatus.FAILED}return{isExpired:{status:a,...c&&{errorMessage:c}}.status===s.RequestStatus.EXPIRED,executionId:R}},I=({requestedAt:e,compareTime:t,durationMins:r})=>{const u=(0,m.default)(t),o=(0,m.default)(e);return u.diff(o,"minutes")>=r};var N={getStatus:x,getExpiredStatus:M,shouldTimeoutRequest:I};0&&(module.exports={getExpiredStatus,getStatus,shouldTimeoutRequest});
|
|
2
2
|
//# sourceMappingURL=requestStatusHelper.js.map
|