@isoftdata/utility-dashboard-backend 4.0.0-beta.1 → 4.0.0-beta.3
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/README.md +201 -185
- package/dist/chart-helper.d.ts +3 -2
- package/dist/chart-helper.js +57 -27
- package/dist/index.d.ts +25 -12
- package/dist/index.js +66 -38
- package/dist/style-templates.d.ts +1 -1
- package/dist/style-templates.js +16 -4
- package/dist/types/chart.d.ts +59 -44
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.js +2 -0
- package/dist/types/parameter.d.ts +9 -5
- package/dist/types/report.d.ts +2 -2
- package/dist/types/session.d.ts +1 -0
- package/package.json +20 -10
package/dist/index.d.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import { DatabaseConnectionInterface, QueryCommand, RowDataPacket } from '@isoftdata/utility-db';
|
|
2
|
+
export type * from './types/index.js';
|
|
3
|
+
export * from './types/index.js';
|
|
4
|
+
export { queryWithFields } from './chart-helper.js';
|
|
2
5
|
import { QueryFieldsObject } from './chart-helper.js';
|
|
3
|
-
import type { DashboardReportParameter } from './types/parameter';
|
|
4
|
-
import type { Session, SiteType } from './types/session';
|
|
5
|
-
import type { MultiSeriesOptions, Formatting, Chart, Table, GoogleDataTable, ProcessedFormatting } from './types/chart';
|
|
6
|
-
import type { Report, ReportInput } from './types/report';
|
|
6
|
+
import type { DashboardReportParameter, DashboardReportParameterInput } from './types/parameter.js';
|
|
7
|
+
import type { Session, SiteType } from './types/session.js';
|
|
8
|
+
import type { MultiSeriesOptions, Formatting, Chart, Table, GoogleDataTable, ProcessedFormatting, ChartJson } from './types/chart.js';
|
|
9
|
+
import type { Report, ReportInput } from './types/report.js';
|
|
10
|
+
import type { PartialDeep } from 'type-fest';
|
|
7
11
|
export * as formatterTemplates from './formatting-templates.js';
|
|
8
12
|
export { handleFormattingTemplates } from './chart-helper.js';
|
|
9
|
-
export type { ReportInput } from './types/report';
|
|
10
13
|
export type CustomDataSourceFunction = (query: string, values?: unknown[]) => Promise<{
|
|
11
14
|
results: RowDataPacket[];
|
|
12
15
|
fields: QueryFieldsObject;
|
|
16
|
+
jsonOverride?: PartialDeep<ChartJson>;
|
|
13
17
|
}>;
|
|
14
18
|
export type LoadDataTableAndProcessedFormattingOptions = {
|
|
15
19
|
query: QueryCommand;
|
|
@@ -24,6 +28,7 @@ export declare function loadDataTableAndProcessedFormatting(mysqlConnection: Dat
|
|
|
24
28
|
dataTable: GoogleDataTable | Table;
|
|
25
29
|
processedFormatting: ProcessedFormatting;
|
|
26
30
|
fields: QueryFieldsObject;
|
|
31
|
+
jsonOverride?: PartialDeep<ChartJson>;
|
|
27
32
|
}>;
|
|
28
33
|
export type loadDataTableOptions = {
|
|
29
34
|
query: QueryCommand;
|
|
@@ -32,18 +37,26 @@ export type loadDataTableOptions = {
|
|
|
32
37
|
chartType: string;
|
|
33
38
|
};
|
|
34
39
|
export declare function loadDataTable(mysqlConnection: DatabaseConnectionInterface, { query: queryObject, multiSeries, formatting, chartType }: loadDataTableOptions): Promise<GoogleDataTable>;
|
|
35
|
-
type
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
type SelectionParameter = {
|
|
41
|
+
name: string;
|
|
42
|
+
value: string;
|
|
43
|
+
dates?: {
|
|
44
|
+
from: string;
|
|
45
|
+
to: string;
|
|
46
|
+
} | null;
|
|
47
|
+
};
|
|
48
|
+
type LoadOutputParameterValuesOptions = {
|
|
49
|
+
definitionList: Array<DashboardReportParameterInput>;
|
|
50
|
+
selectionList?: Array<SelectionParameter>;
|
|
38
51
|
forClient?: boolean;
|
|
39
52
|
session: Session;
|
|
40
53
|
site?: SiteType;
|
|
41
54
|
siteIdColumn?: string;
|
|
42
55
|
siteNameColumn?: string;
|
|
43
56
|
};
|
|
44
|
-
export declare function loadOutputParameterValues(mysqlConnection: DatabaseConnectionInterface, { definitionList, selectionList, forClient, session, site, siteIdColumn, siteNameColumn }:
|
|
57
|
+
export declare function loadOutputParameterValues(mysqlConnection: DatabaseConnectionInterface, { definitionList, selectionList, forClient, session, site, siteIdColumn, siteNameColumn }: LoadOutputParameterValuesOptions): Promise<DashboardReportParameter[]>;
|
|
45
58
|
export declare const parameterRegex: RegExp;
|
|
46
|
-
export declare function parameterizeQuery(queryString: string, parameterValues: DashboardReportParameter[]): QueryCommand;
|
|
59
|
+
export declare function parameterizeQuery(queryString: string | undefined, parameterValues: DashboardReportParameter[]): QueryCommand;
|
|
47
60
|
export declare function parameterizeUrl(url: string, parameterValues: DashboardReportParameter[]): string;
|
|
48
61
|
type FormatReportMetadataOptions = {
|
|
49
62
|
report: ReportInput;
|
|
@@ -55,7 +68,7 @@ type FormatReportMetadataOptions = {
|
|
|
55
68
|
};
|
|
56
69
|
export declare function formatReportMetadata(mysqlConnection: DatabaseConnectionInterface, { report, chartsInReport, session, site, siteIdColumn, siteNameColumn }: FormatReportMetadataOptions): Promise<Report>;
|
|
57
70
|
export type FormatChartDataForReportOptions = {
|
|
58
|
-
reportParameters:
|
|
71
|
+
reportParameters: Array<DashboardReportParameterInput>;
|
|
59
72
|
chart: Chart;
|
|
60
73
|
reportChart: {
|
|
61
74
|
chartId: number;
|
|
@@ -64,7 +77,7 @@ export type FormatChartDataForReportOptions = {
|
|
|
64
77
|
rank: number;
|
|
65
78
|
reportChartId: number;
|
|
66
79
|
};
|
|
67
|
-
parameterSelectionList:
|
|
80
|
+
parameterSelectionList: SelectionParameter[];
|
|
68
81
|
session: Session;
|
|
69
82
|
site: SiteType;
|
|
70
83
|
siteIdColumn?: string;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
export * from './types/index.js';
|
|
2
|
+
export { queryWithFields } from './chart-helper.js';
|
|
3
|
+
import { getMultiSeriesData, makeNegativeNumericValuesZero, coerceNullColumn, handleFormattingTemplates, getDataTableFormat, queryWithFields, makeDataCumulative, getSvelteDataTableFormat, } from './chart-helper.js';
|
|
2
4
|
import { datesFromRange } from '@isoftdata/utility-date-time';
|
|
3
5
|
import { format as formatDate } from 'date-fns';
|
|
4
6
|
import camelCase from 'camelcase';
|
|
@@ -24,7 +26,7 @@ const handleChartTypeSpecificQuirks = (chartType, resultSet) => {
|
|
|
24
26
|
return resultSet;
|
|
25
27
|
};
|
|
26
28
|
async function loadChartData(mysqlConnection, chart, queryObject, customDataSource) {
|
|
27
|
-
let { formatting, chartWrapper, multiSeries, table,
|
|
29
|
+
let { formatting, chartWrapper, multiSeries, table, cumulative, url, ...theRest } = chart;
|
|
28
30
|
if (!chartWrapper) {
|
|
29
31
|
throw new Error('No chartWrapper found in chart!');
|
|
30
32
|
}
|
|
@@ -35,31 +37,33 @@ async function loadChartData(mysqlConnection, chart, queryObject, customDataSour
|
|
|
35
37
|
query: queryObject,
|
|
36
38
|
multiSeries,
|
|
37
39
|
formatting,
|
|
38
|
-
chartType: chartWrapper.chartType,
|
|
40
|
+
chartType: chartWrapper.chartType ?? chart.supertype,
|
|
39
41
|
cumulative,
|
|
40
42
|
table,
|
|
41
43
|
customDataSource,
|
|
42
44
|
});
|
|
43
45
|
dataTable = dataTableAndProcessedFormatting.dataTable;
|
|
44
46
|
processedFormatting = dataTableAndProcessedFormatting.processedFormatting;
|
|
47
|
+
if (dataTableAndProcessedFormatting.jsonOverride) {
|
|
48
|
+
chart = deepmerge(chart, dataTableAndProcessedFormatting.jsonOverride);
|
|
49
|
+
chartWrapper = chart.chartWrapper;
|
|
50
|
+
}
|
|
45
51
|
}
|
|
46
52
|
catch (err) {
|
|
47
53
|
console.error('Error loading dataTable / processedFormatting');
|
|
48
54
|
throw err;
|
|
49
55
|
}
|
|
50
|
-
if (supertype === 'table') {
|
|
56
|
+
if (theRest.supertype === 'table') {
|
|
51
57
|
return {
|
|
52
58
|
...theRest,
|
|
53
|
-
supertype,
|
|
54
59
|
chartWrapper,
|
|
55
60
|
table: { ...table, ...dataTable },
|
|
56
61
|
formatting: processedFormatting,
|
|
57
62
|
};
|
|
58
63
|
}
|
|
59
|
-
else if (supertype === 'embed') {
|
|
64
|
+
else if (theRest.supertype === 'embed') {
|
|
60
65
|
return {
|
|
61
66
|
...theRest,
|
|
62
|
-
supertype,
|
|
63
67
|
chartWrapper,
|
|
64
68
|
url: url ?? '',
|
|
65
69
|
formatting: processedFormatting,
|
|
@@ -69,7 +73,6 @@ async function loadChartData(mysqlConnection, chart, queryObject, customDataSour
|
|
|
69
73
|
return {
|
|
70
74
|
...theRest,
|
|
71
75
|
cumulative,
|
|
72
|
-
supertype,
|
|
73
76
|
chartWrapper: {
|
|
74
77
|
...chartWrapper,
|
|
75
78
|
dataTable: dataTable,
|
|
@@ -81,9 +84,10 @@ async function loadChartData(mysqlConnection, chart, queryObject, customDataSour
|
|
|
81
84
|
export async function loadDataTableAndProcessedFormatting(mysqlConnection, { query: queryObject, multiSeries, formatting, chartType, cumulative = false, table = {}, customDataSource }) {
|
|
82
85
|
let results = [];
|
|
83
86
|
let fields = {};
|
|
87
|
+
let jsonOverride = undefined;
|
|
84
88
|
if (typeof customDataSource === 'function') {
|
|
85
89
|
;
|
|
86
|
-
({ results, fields } = await customDataSource(queryObject.sql, queryObject.values));
|
|
90
|
+
({ results, fields, jsonOverride } = await customDataSource(queryObject.sql, queryObject.values));
|
|
87
91
|
}
|
|
88
92
|
else if (queryObject?.sql) {
|
|
89
93
|
;
|
|
@@ -101,13 +105,23 @@ export async function loadDataTableAndProcessedFormatting(mysqlConnection, { que
|
|
|
101
105
|
}
|
|
102
106
|
const processedFormatting = handleFormattingTemplates(formatting);
|
|
103
107
|
if (chartType?.toLowerCase() === 'table') {
|
|
104
|
-
return {
|
|
108
|
+
return {
|
|
109
|
+
dataTable: getSvelteDataTableFormat(data, fields, processedFormatting, table?.style),
|
|
110
|
+
processedFormatting,
|
|
111
|
+
fields,
|
|
112
|
+
jsonOverride,
|
|
113
|
+
};
|
|
105
114
|
}
|
|
106
115
|
let dataTable = getDataTableFormat(data, fields, multiSeries);
|
|
107
116
|
if (cumulative || chartType === 'AreaChart') {
|
|
108
117
|
dataTable = makeDataCumulative(dataTable, cumulative);
|
|
109
118
|
}
|
|
110
|
-
return {
|
|
119
|
+
return {
|
|
120
|
+
dataTable,
|
|
121
|
+
processedFormatting,
|
|
122
|
+
fields,
|
|
123
|
+
jsonOverride,
|
|
124
|
+
};
|
|
111
125
|
}
|
|
112
126
|
export async function loadDataTable(mysqlConnection, { query: queryObject, multiSeries, formatting, chartType }) {
|
|
113
127
|
const { dataTable } = await loadDataTableAndProcessedFormatting(mysqlConnection, { query: queryObject, multiSeries, formatting, chartType });
|
|
@@ -118,24 +132,25 @@ const loadOptionList = async (mysqlConnection, optionListQuery, optionList = [])
|
|
|
118
132
|
return [...optionList, ...optionsFromQuery.map((option) => ({ ...option, fromQuery: true }))];
|
|
119
133
|
};
|
|
120
134
|
const isValidDateRangeValue = (value) => {
|
|
121
|
-
return
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
135
|
+
return (!!value &&
|
|
136
|
+
[
|
|
137
|
+
'Always',
|
|
138
|
+
'Today',
|
|
139
|
+
'Yesterday',
|
|
140
|
+
'Last 7 Days',
|
|
141
|
+
'Last 30 Days',
|
|
142
|
+
'Last 90 Days',
|
|
143
|
+
'Last 365 Days',
|
|
144
|
+
'This Week',
|
|
145
|
+
'This Month',
|
|
146
|
+
'This Quarter',
|
|
147
|
+
'This Year',
|
|
148
|
+
'Previous Week',
|
|
149
|
+
'Previous Month',
|
|
150
|
+
'Previous Quarter',
|
|
151
|
+
'Previous Year',
|
|
152
|
+
'Custom',
|
|
153
|
+
].includes(value));
|
|
139
154
|
};
|
|
140
155
|
export async function loadOutputParameterValues(mysqlConnection, { definitionList = [], selectionList = [], forClient = false, session, site = 'store', siteIdColumn, siteNameColumn }) {
|
|
141
156
|
if (!(definitionList instanceof Array) || !definitionList.length) {
|
|
@@ -144,17 +159,26 @@ export async function loadOutputParameterValues(mysqlConnection, { definitionLis
|
|
|
144
159
|
const parameterValues = [];
|
|
145
160
|
for (const definition of definitionList) {
|
|
146
161
|
const matchingParameterSelection = selectionList.find(param => param.name === definition.name);
|
|
147
|
-
let typedParameter =
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
162
|
+
let typedParameter = definition.type === 'dateRange'
|
|
163
|
+
? {
|
|
164
|
+
...definition,
|
|
165
|
+
title: definition.title || definition.name,
|
|
166
|
+
queryValues: {},
|
|
167
|
+
value: null,
|
|
168
|
+
dates: { from: '', to: '' },
|
|
169
|
+
}
|
|
170
|
+
: {
|
|
171
|
+
...definition,
|
|
172
|
+
title: definition.title || definition.name,
|
|
173
|
+
queryValues: {},
|
|
174
|
+
value: null,
|
|
175
|
+
};
|
|
152
176
|
const value = matchingParameterSelection?.value ?? definition.default;
|
|
153
177
|
if (typedParameter.type !== 'dateRange') {
|
|
154
178
|
typedParameter.value = value;
|
|
155
179
|
}
|
|
156
180
|
if (typedParameter.type === 'dateRange') {
|
|
157
|
-
const validDateRangeValue = isValidDateRangeValue(value) ? value : 'Last 30 Days';
|
|
181
|
+
const validDateRangeValue = value && isValidDateRangeValue(value) ? value : definition.default && isValidDateRangeValue(definition.default) ? definition.default : 'Last 30 Days';
|
|
158
182
|
typedParameter = {
|
|
159
183
|
...typedParameter,
|
|
160
184
|
value: validDateRangeValue,
|
|
@@ -193,7 +217,7 @@ export async function loadOutputParameterValues(mysqlConnection, { definitionLis
|
|
|
193
217
|
permission: definition?.permission,
|
|
194
218
|
optionList: [],
|
|
195
219
|
};
|
|
196
|
-
typedParameter.value = typedParameter.value ?? session.siteId ?? session[`${site}Id`];
|
|
220
|
+
typedParameter.value = typedParameter.value ?? session.siteId?.toString() ?? session[`${site}Id`]?.toString() ?? null;
|
|
197
221
|
siteIdColumn = siteIdColumn ? mysqlConnection.escapeId(siteIdColumn) : mysqlConnection.escapeId(`${site}id`);
|
|
198
222
|
siteNameColumn = siteNameColumn ? mysqlConnection.escapeId(siteNameColumn) : 'name';
|
|
199
223
|
const siteTableName = mysqlConnection.escapeId(site);
|
|
@@ -209,9 +233,10 @@ export async function loadOutputParameterValues(mysqlConnection, { definitionLis
|
|
|
209
233
|
values: [session.userAccountId],
|
|
210
234
|
});
|
|
211
235
|
}
|
|
236
|
+
typedParameter.optionList = typedParameter.optionList.map(option => ({ id: option.id?.toString(), name: option.name }));
|
|
212
237
|
if (typedParameter.optionList.length > 1) {
|
|
213
238
|
typedParameter.optionList = typedParameter.optionList.map(option => ({ ...option, fromQuery: true }));
|
|
214
|
-
typedParameter.optionList.unshift({ id: 0, name: 'All', fromQuery: true });
|
|
239
|
+
typedParameter.optionList.unshift({ id: '0', name: 'All', fromQuery: true });
|
|
215
240
|
}
|
|
216
241
|
if (!typedParameter.optionList.some(option => option.id?.toString() === typedParameter.value?.toString())) {
|
|
217
242
|
typedParameter.value = typedParameter.optionList?.[0]?.id.toString();
|
|
@@ -319,6 +344,9 @@ export async function formatChartDataForReport(mysqlConnection, { reportParamete
|
|
|
319
344
|
reportChart.jsonOverride.chartWrapper = chartWrapper;
|
|
320
345
|
}
|
|
321
346
|
const combinedChart = deepmerge(chart, reportChart.jsonOverride ?? {});
|
|
347
|
+
if (combinedChart.supertype === 'embed' && combinedChart.url) {
|
|
348
|
+
combinedChart.formattedUrl = parameterizeUrl(combinedChart.url, parameterValues);
|
|
349
|
+
}
|
|
322
350
|
return await loadChartData(mysqlConnection, {
|
|
323
351
|
...combinedChart,
|
|
324
352
|
rank: reportChart.rank,
|
|
@@ -331,4 +359,4 @@ export async function formatChartDataForReport(mysqlConnection, { reportParamete
|
|
|
331
359
|
throw err;
|
|
332
360
|
}
|
|
333
361
|
}
|
|
334
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUNOLGtCQUFrQixFQUNsQiw2QkFBNkIsRUFDN0IsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQix5QkFBeUIsR0FFekIsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDN0QsT0FBTyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFBO0FBRWpDLE9BQU8sU0FBUyxNQUFNLFdBQVcsQ0FBQTtBQU1qQyxPQUFPLEtBQUssa0JBQWtCLE1BQU0sMkJBQTJCLENBQUE7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFNN0QsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLFNBQWlCLEVBQUUsU0FBMEIsRUFBRSxFQUFFO0lBQ3ZGLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RCLFFBQVEsU0FBUyxFQUFFLENBQUM7WUFDbkIsS0FBSyxVQUFVO2dCQUVkLFNBQVMsR0FBRyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDcEQsTUFBSztZQUNOLEtBQUssU0FBUztnQkFFYixTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQTtnQkFDckUsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUM1QixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLFNBQVMsQ0FBQTtnQkFDNUIsQ0FBQztnQkFD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
|
|
362
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsY0FBYyxrQkFBa0IsQ0FBQTtBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDbkQsT0FBTyxFQUNOLGtCQUFrQixFQUNsQiw2QkFBNkIsRUFDN0IsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUN6QixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLGtCQUFrQixFQUNsQix3QkFBd0IsR0FFeEIsTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDN0QsT0FBTyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDL0MsT0FBTyxTQUFTLE1BQU0sV0FBVyxDQUFBO0FBQ2pDLE9BQU8sU0FBUyxNQUFNLFdBQVcsQ0FBQTtBQU1qQyxPQUFPLEtBQUssa0JBQWtCLE1BQU0sMkJBQTJCLENBQUE7QUFDL0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFnQjdELE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxTQUFpQixFQUFFLFNBQTBCLEVBQUUsRUFBRTtJQUN2RixJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUN0QixRQUFRLFNBQVMsRUFBRSxDQUFDO1lBQ25CLEtBQUssVUFBVTtnQkFFZCxTQUFTLEdBQUcsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ3BELE1BQUs7WUFDTixLQUFLLFNBQVM7Z0JBRWIsU0FBUyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUE7Z0JBQ3JFLElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztv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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { RowDataPacket } from '@isoftdata/utility-db';
|
|
2
|
-
import type { TableStyleTemplateObject } from './types/chart';
|
|
2
|
+
import type { TableStyleTemplateObject } from './types/chart.js';
|
|
3
3
|
declare function styleRow(row: RowDataPacket, templates: TableStyleTemplateObject): RowDataPacket;
|
|
4
4
|
export default styleRow;
|
package/dist/style-templates.js
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
import { create, all } from 'mathjs';
|
|
2
|
-
import
|
|
3
|
-
import { klona } from 'klona';
|
|
2
|
+
import toSnakeCase from 'to-snake-case';
|
|
4
3
|
const math = create(all);
|
|
5
4
|
math.import({
|
|
6
5
|
locale: (value) => value.toLocaleString(),
|
|
7
6
|
includes: (value, search) => value.includes(search),
|
|
7
|
+
icon: (icon, text) => {
|
|
8
|
+
if (!/fa\w+/.test(icon)) {
|
|
9
|
+
icon = `fas ${icon}`;
|
|
10
|
+
}
|
|
11
|
+
return `<i class="${icon}"></i> ${text}`;
|
|
12
|
+
},
|
|
13
|
+
link: (link, text, target = 'dashboard-link') => {
|
|
14
|
+
return `<a target="${target}" href="${link}">${text}</a>`;
|
|
15
|
+
},
|
|
8
16
|
});
|
|
9
17
|
function handleMathJsCellStyleTemplate(row, columnToStyle, templates) {
|
|
10
18
|
const outCell = { value: row[columnToStyle] };
|
|
11
19
|
if (columnToStyle in templates) {
|
|
12
|
-
const scope =
|
|
20
|
+
const scope = getScopeObject(row, outCell.value);
|
|
13
21
|
for (const key in templates[columnToStyle]) {
|
|
14
22
|
try {
|
|
15
23
|
const expression = templates[columnToStyle][key] ?? '';
|
|
@@ -17,11 +25,15 @@ function handleMathJsCellStyleTemplate(row, columnToStyle, templates) {
|
|
|
17
25
|
}
|
|
18
26
|
catch (err) {
|
|
19
27
|
console.error(`Error evaluating expression: '${templates[columnToStyle][key]}'\n`, err);
|
|
28
|
+
outCell.error = err.message;
|
|
20
29
|
}
|
|
21
30
|
}
|
|
22
31
|
}
|
|
23
32
|
return outCell;
|
|
24
33
|
}
|
|
34
|
+
function getScopeObject(row, cellValue) {
|
|
35
|
+
return Object.fromEntries(Object.entries({ ...row, value: cellValue }).map(([key, value]) => [toSnakeCase(key), value ?? '']));
|
|
36
|
+
}
|
|
25
37
|
function styleRow(row, templates) {
|
|
26
38
|
const outRow = {};
|
|
27
39
|
for (const columnName in row) {
|
|
@@ -30,4 +42,4 @@ function styleRow(row, templates) {
|
|
|
30
42
|
return outRow;
|
|
31
43
|
}
|
|
32
44
|
export default styleRow;
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3R5bGUtdGVtcGxhdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N0eWxlLXRlbXBsYXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQTtBQUNwQyxPQUFPLFdBQVcsTUFBTSxlQUFlLENBQUE7QUFFdkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDWCxNQUFNLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUU7SUFDakQsUUFBUSxFQUFFLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7SUFDbkUsSUFBSSxFQUFFLENBQUMsSUFBWSxFQUFFLElBQWEsRUFBRSxFQUFFO1FBQ3JDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekIsSUFBSSxHQUFHLE9BQU8sSUFBSSxFQUFFLENBQUE7UUFDckIsQ0FBQztRQUNELE9BQU8sYUFBYSxJQUFJLFVBQVUsSUFBSSxFQUFFLENBQUE7SUFDekMsQ0FBQztJQUNELElBQUksRUFBRSxDQUFDLElBQVksRUFBRSxJQUFZLEVBQUUsTUFBTSxHQUFHLGdCQUFnQixFQUFFLEVBQUU7UUFDL0QsT0FBTyxjQUFjLE1BQU0sV0FBVyxJQUFJLEtBQUssSUFBSSxNQUFNLENBQUE7SUFDMUQsQ0FBQztDQUNELENBQUMsQ0FBQTtBQUVGLFNBQVMsNkJBQTZCLENBQUMsR0FBa0IsRUFBRSxhQUFxQixFQUFFLFNBQW1DO0lBQ3BILE1BQU0sT0FBTyxHQUFvQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQTtJQUM5RSxJQUFJLGFBQWEsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEtBQUssR0FBRyxjQUFjLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQztnQkFDSixNQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFBO2dCQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDaEQsQ0FBQztZQUFDLE9BQU8sR0FBUSxFQUFFLENBQUM7Z0JBQ25CLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUV2RixPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUE7WUFDNUIsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBQ0QsT0FBTyxPQUFPLENBQUE7QUFDZixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsR0FBa0IsRUFBRSxTQUEwQjtJQUVyRSxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFBO0FBQy9ILENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUFrQixFQUFFLFNBQW1DO0lBQ3hFLE1BQU0sTUFBTSxHQUFHLEVBQW1CLENBQUE7SUFDbEMsS0FBSyxNQUFNLFVBQVUsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsNkJBQTZCLENBQUMsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUMvRSxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUE7QUFDZCxDQUFDO0FBRUQsZUFBZSxRQUFRLENBQUEifQ==
|
package/dist/types/chart.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { MergeDeep } from 'type-fest';
|
|
2
|
+
import type { NumberFormatOptions, MediumDateFormatOptions, LongDateFormatOptions } from '../formatting-templates.js';
|
|
2
3
|
export type GoogleDataTableCell = {
|
|
3
4
|
v?: unknown;
|
|
4
5
|
f?: string | undefined;
|
|
@@ -27,71 +28,71 @@ interface WidthAndHeight {
|
|
|
27
28
|
export type ChartWrapper = {
|
|
28
29
|
options: google.visualization.TreeMapOptions & WidthAndHeight;
|
|
29
30
|
dataTable?: GoogleDataTable;
|
|
30
|
-
chartType:
|
|
31
|
+
chartType: 'TreeMap';
|
|
31
32
|
} | {
|
|
32
33
|
options: google.visualization.GeoChartOptions & WidthAndHeight;
|
|
33
34
|
dataTable?: GoogleDataTable;
|
|
34
|
-
chartType:
|
|
35
|
+
chartType: 'GeoChart';
|
|
35
36
|
} | {
|
|
36
37
|
options: google.visualization.ScatterChartOptions & WidthAndHeight;
|
|
37
38
|
dataTable?: GoogleDataTable;
|
|
38
|
-
chartType:
|
|
39
|
+
chartType: 'ScatterChart';
|
|
39
40
|
} | {
|
|
40
41
|
options: google.visualization.ColumnChartOptions & WidthAndHeight;
|
|
41
42
|
dataTable?: GoogleDataTable;
|
|
42
|
-
chartType:
|
|
43
|
+
chartType: 'ColumnChart';
|
|
43
44
|
} | {
|
|
44
45
|
options: google.visualization.HistogramOptions & WidthAndHeight;
|
|
45
46
|
dataTable?: GoogleDataTable;
|
|
46
|
-
chartType:
|
|
47
|
+
chartType: 'Histogram';
|
|
47
48
|
} | {
|
|
48
49
|
options: google.visualization.BarChartOptions & WidthAndHeight;
|
|
49
50
|
dataTable?: GoogleDataTable;
|
|
50
|
-
chartType:
|
|
51
|
+
chartType: 'BarChart';
|
|
51
52
|
} | {
|
|
52
53
|
options: google.visualization.ComboChartOptions & WidthAndHeight;
|
|
53
54
|
dataTable?: GoogleDataTable;
|
|
54
|
-
chartType:
|
|
55
|
+
chartType: 'ComboChart';
|
|
55
56
|
} | {
|
|
56
57
|
options: google.visualization.AreaChartOptions & WidthAndHeight;
|
|
57
58
|
dataTable?: GoogleDataTable;
|
|
58
|
-
chartType:
|
|
59
|
+
chartType: 'AreaChart';
|
|
59
60
|
} | {
|
|
60
61
|
options: google.visualization.SteppedAreaChartOptions & WidthAndHeight;
|
|
61
62
|
dataTable?: GoogleDataTable;
|
|
62
|
-
chartType:
|
|
63
|
+
chartType: 'SteppedAreaChart';
|
|
63
64
|
} | {
|
|
64
65
|
options: google.visualization.LineChartOptions & WidthAndHeight;
|
|
65
66
|
dataTable?: GoogleDataTable;
|
|
66
|
-
chartType:
|
|
67
|
+
chartType: 'LineChart';
|
|
67
68
|
} | {
|
|
68
69
|
options: google.visualization.PieChartOptions & WidthAndHeight;
|
|
69
70
|
dataTable?: GoogleDataTable;
|
|
70
|
-
chartType:
|
|
71
|
+
chartType: 'PieChart';
|
|
71
72
|
} | {
|
|
72
73
|
options: google.visualization.BubbleChartOptions & WidthAndHeight;
|
|
73
74
|
dataTable?: GoogleDataTable;
|
|
74
|
-
chartType:
|
|
75
|
+
chartType: 'BubbleChart';
|
|
75
76
|
} | {
|
|
76
77
|
options: google.visualization.OrgChartOptions & WidthAndHeight;
|
|
77
78
|
dataTable?: GoogleDataTable;
|
|
78
|
-
chartType:
|
|
79
|
+
chartType: 'OrgChart';
|
|
79
80
|
} | {
|
|
80
81
|
options: google.visualization.TimelineOptions & WidthAndHeight;
|
|
81
82
|
dataTable?: GoogleDataTable;
|
|
82
|
-
chartType:
|
|
83
|
+
chartType: 'Timeline';
|
|
83
84
|
} | {
|
|
84
85
|
options: google.visualization.GaugeChartOptions & WidthAndHeight;
|
|
85
86
|
dataTable?: GoogleDataTable;
|
|
86
|
-
chartType:
|
|
87
|
+
chartType: 'Gauge';
|
|
87
88
|
} | {
|
|
88
89
|
options: google.visualization.CandlestickChartOptions & WidthAndHeight;
|
|
89
90
|
dataTable?: GoogleDataTable;
|
|
90
|
-
chartType:
|
|
91
|
+
chartType: 'CandlestickChart';
|
|
91
92
|
} | {
|
|
92
93
|
options: google.visualization.TableOptions & WidthAndHeight;
|
|
93
94
|
dataTable?: GoogleDataTable;
|
|
94
|
-
chartType:
|
|
95
|
+
chartType: 'Table';
|
|
95
96
|
};
|
|
96
97
|
export type MultiSeriesOptions = {
|
|
97
98
|
value: string;
|
|
@@ -99,12 +100,12 @@ export type MultiSeriesOptions = {
|
|
|
99
100
|
groupXAxisBy: string;
|
|
100
101
|
tooltip?: string;
|
|
101
102
|
};
|
|
102
|
-
export type FormattingType =
|
|
103
|
+
export type FormattingType = 'DateFormat' | 'NumberFormat';
|
|
103
104
|
export type FormattingRule = {
|
|
104
|
-
type:
|
|
105
|
+
type: 'DateFormat';
|
|
105
106
|
format: LongDateFormatOptions | MediumDateFormatOptions;
|
|
106
107
|
} | {
|
|
107
|
-
type:
|
|
108
|
+
type: 'NumberFormat';
|
|
108
109
|
format: NumberFormatOptions;
|
|
109
110
|
};
|
|
110
111
|
export type Formatting = Record<string, FormattingRule>;
|
|
@@ -130,6 +131,7 @@ export type TableRow = {
|
|
|
130
131
|
value: string | number;
|
|
131
132
|
class?: string;
|
|
132
133
|
html?: string;
|
|
134
|
+
error?: string;
|
|
133
135
|
};
|
|
134
136
|
};
|
|
135
137
|
export type Table = {
|
|
@@ -147,18 +149,9 @@ export type TableStyleTemplate = {
|
|
|
147
149
|
html?: string;
|
|
148
150
|
[key: string]: string | undefined;
|
|
149
151
|
};
|
|
150
|
-
export type ChartSuperType =
|
|
151
|
-
export
|
|
152
|
+
export type ChartSuperType = 'google' | 'table' | 'embed';
|
|
153
|
+
export interface ChartBase extends ChartJson {
|
|
152
154
|
chartId: number;
|
|
153
|
-
query: string;
|
|
154
|
-
multiSeries?: MultiSeriesOptions;
|
|
155
|
-
formatting?: Formatting;
|
|
156
|
-
chartWrapper: ChartWrapper;
|
|
157
|
-
table?: Table;
|
|
158
|
-
cumulative?: boolean;
|
|
159
|
-
greedyHeight?: boolean;
|
|
160
|
-
greedyWidth?: boolean;
|
|
161
|
-
hideTitle?: boolean;
|
|
162
155
|
name: string;
|
|
163
156
|
showChart: boolean;
|
|
164
157
|
supertype: ChartSuperType;
|
|
@@ -167,18 +160,40 @@ export type ChartBase = {
|
|
|
167
160
|
dataSourceName?: string;
|
|
168
161
|
rank?: number;
|
|
169
162
|
reportChartId?: number;
|
|
163
|
+
}
|
|
164
|
+
export interface ChartJson {
|
|
165
|
+
allowExport?: boolean;
|
|
166
|
+
chartWrapper: MergeDeep<ChartWrapper, {
|
|
167
|
+
options: {
|
|
168
|
+
width: number;
|
|
169
|
+
height: number;
|
|
170
|
+
};
|
|
171
|
+
}>;
|
|
172
|
+
cumulative?: boolean;
|
|
173
|
+
formatting?: Formatting;
|
|
174
|
+
greedyHeight?: boolean;
|
|
175
|
+
greedyWidth?: boolean;
|
|
176
|
+
hideTitle?: boolean;
|
|
177
|
+
multiSeries?: MultiSeriesOptions;
|
|
178
|
+
query?: string;
|
|
179
|
+
showFooter?: boolean;
|
|
180
|
+
table?: Table;
|
|
170
181
|
url?: string;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
182
|
+
}
|
|
183
|
+
interface GoogleChart extends ChartBase {
|
|
184
|
+
query: string;
|
|
185
|
+
supertype: 'google';
|
|
186
|
+
}
|
|
187
|
+
interface TableChart extends ChartBase {
|
|
188
|
+
query: string;
|
|
189
|
+
supertype: 'table';
|
|
190
|
+
table: NonNullable<ChartBase['table']>;
|
|
191
|
+
}
|
|
192
|
+
interface EmbedChart extends ChartBase {
|
|
193
|
+
supertype: 'embed';
|
|
194
|
+
url: NonNullable<ChartBase['url']>;
|
|
195
|
+
formattedUrl?: string;
|
|
196
|
+
query?: never;
|
|
197
|
+
}
|
|
183
198
|
export type Chart = GoogleChart | TableChart | EmbedChart;
|
|
184
199
|
export {};
|