@masterteam/dashboard-builder 0.0.21 → 0.0.23
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.
|
@@ -439,8 +439,7 @@ class DashboardStoreService {
|
|
|
439
439
|
/** Dynamic key-value store */
|
|
440
440
|
dynamicStore = signal({}, ...(ngDevMode ? [{ debugName: "dynamicStore" }] : /* istanbul ignore next */ []));
|
|
441
441
|
/** Language code */
|
|
442
|
-
languageCode = signal(document.dir == '
|
|
443
|
-
'en', ...(ngDevMode ? [{ debugName: "languageCode" }] : /* istanbul ignore next */ []));
|
|
442
|
+
languageCode = signal(document.dir == 'rtl' ? 'ar' : 'en', ...(ngDevMode ? [{ debugName: "languageCode" }] : /* istanbul ignore next */ []));
|
|
444
443
|
/** Direction */
|
|
445
444
|
direction = signal(document.dir || 'ltr', ...(ngDevMode ? [{ debugName: "direction" }] : /* istanbul ignore next */ []));
|
|
446
445
|
/** Inside Report Viewer flag - controls text truncation in charts */
|
|
@@ -7749,16 +7748,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
7749
7748
|
*
|
|
7750
7749
|
* Number, currency, and date formatting utilities.
|
|
7751
7750
|
*/
|
|
7752
|
-
/**
|
|
7753
|
-
* Get current language code from localStorage
|
|
7754
|
-
*/
|
|
7755
|
-
function getLanguageCode() {
|
|
7756
|
-
return localStorage.getItem('langCode') || 'en';
|
|
7757
|
-
}
|
|
7758
7751
|
/**
|
|
7759
7752
|
* Format large numbers with suffixes (K, M, B, T)
|
|
7760
7753
|
*/
|
|
7761
|
-
function formatCurrency(value, config) {
|
|
7754
|
+
function formatCurrency(value, config, langCode = 'en') {
|
|
7762
7755
|
if (value === null || value === undefined) {
|
|
7763
7756
|
return '_';
|
|
7764
7757
|
}
|
|
@@ -7766,7 +7759,6 @@ function formatCurrency(value, config) {
|
|
|
7766
7759
|
if (isNaN(numValue)) {
|
|
7767
7760
|
return String(value);
|
|
7768
7761
|
}
|
|
7769
|
-
const langCode = getLanguageCode();
|
|
7770
7762
|
const decimals = config?.decimals ?? 1;
|
|
7771
7763
|
const arabicSuffixes = {
|
|
7772
7764
|
thousand: ' ألف',
|
|
@@ -7830,7 +7822,7 @@ function formatPercentage(value, decimals = 1) {
|
|
|
7830
7822
|
/**
|
|
7831
7823
|
* Format number with locale
|
|
7832
7824
|
*/
|
|
7833
|
-
function formatNumber(value, options) {
|
|
7825
|
+
function formatNumber(value, options, langCode = 'en') {
|
|
7834
7826
|
if (value === null || value === undefined) {
|
|
7835
7827
|
return '_';
|
|
7836
7828
|
}
|
|
@@ -7838,14 +7830,13 @@ function formatNumber(value, options) {
|
|
|
7838
7830
|
if (isNaN(numValue)) {
|
|
7839
7831
|
return String(value);
|
|
7840
7832
|
}
|
|
7841
|
-
const langCode = getLanguageCode();
|
|
7842
7833
|
const locale = langCode === 'ar' ? 'ar-SA' : 'en-US';
|
|
7843
7834
|
return new Intl.NumberFormat(locale, options).format(numValue);
|
|
7844
7835
|
}
|
|
7845
7836
|
/**
|
|
7846
7837
|
* Format date
|
|
7847
7838
|
*/
|
|
7848
|
-
function formatDate(value, format) {
|
|
7839
|
+
function formatDate(value, format, langCode = 'en') {
|
|
7849
7840
|
if (!value) {
|
|
7850
7841
|
return '_';
|
|
7851
7842
|
}
|
|
@@ -7853,7 +7844,6 @@ function formatDate(value, format) {
|
|
|
7853
7844
|
if (isNaN(date.getTime())) {
|
|
7854
7845
|
return String(value);
|
|
7855
7846
|
}
|
|
7856
|
-
const langCode = getLanguageCode();
|
|
7857
7847
|
const locale = langCode === 'ar' ? 'ar-SA' : 'en-US';
|
|
7858
7848
|
const formatOptions = {
|
|
7859
7849
|
short: { day: 'numeric', month: 'numeric', year: '2-digit' },
|
|
@@ -7880,15 +7870,15 @@ function createAxisFormatter(config) {
|
|
|
7880
7870
|
/**
|
|
7881
7871
|
* Formatter for ECharts tooltip values
|
|
7882
7872
|
*/
|
|
7883
|
-
function createTooltipFormatter(config) {
|
|
7873
|
+
function createTooltipFormatter(config, langCode = 'en') {
|
|
7884
7874
|
return (value) => {
|
|
7885
7875
|
switch (config?.type) {
|
|
7886
7876
|
case 'currency':
|
|
7887
|
-
return formatCurrency(value, { handleLang: true });
|
|
7877
|
+
return formatCurrency(value, { handleLang: true }, langCode);
|
|
7888
7878
|
case 'percentage':
|
|
7889
7879
|
return formatPercentage(value);
|
|
7890
7880
|
default:
|
|
7891
|
-
return formatNumber(value);
|
|
7881
|
+
return formatNumber(value, undefined, langCode);
|
|
7892
7882
|
}
|
|
7893
7883
|
};
|
|
7894
7884
|
}
|
|
@@ -7945,13 +7935,13 @@ function formatWordsUnderBar(text, maxCharsPerLine = 10, insideReport = false) {
|
|
|
7945
7935
|
/**
|
|
7946
7936
|
* Format date to month name
|
|
7947
7937
|
*/
|
|
7948
|
-
function formatDateToMonth(dateValue, shortFormat = false) {
|
|
7938
|
+
function formatDateToMonth(dateValue, shortFormat = false, langCode = 'en') {
|
|
7949
7939
|
try {
|
|
7950
7940
|
const date = dateValue instanceof Date ? dateValue : new Date(dateValue);
|
|
7951
7941
|
if (isNaN(date.getTime())) {
|
|
7952
7942
|
return String(dateValue);
|
|
7953
7943
|
}
|
|
7954
|
-
return date.toLocaleString('
|
|
7944
|
+
return date.toLocaleString(langCode === 'ar' ? 'ar-SA' : 'en-US', {
|
|
7955
7945
|
month: shortFormat ? 'short' : 'long',
|
|
7956
7946
|
});
|
|
7957
7947
|
}
|
|
@@ -7965,21 +7955,20 @@ function formatDateToMonth(dateValue, shortFormat = false) {
|
|
|
7965
7955
|
* @param value - The X-axis category value (typically a date string)
|
|
7966
7956
|
* @param configFormat - Configuration object with type and format options
|
|
7967
7957
|
*/
|
|
7968
|
-
function formatXAxis(value, configFormat) {
|
|
7958
|
+
function formatXAxis(value, configFormat, langCode = 'en') {
|
|
7969
7959
|
if (!configFormat || !configFormat.type) {
|
|
7970
7960
|
return String(value);
|
|
7971
7961
|
}
|
|
7972
7962
|
switch (configFormat.type) {
|
|
7973
7963
|
case 'dateToMonth':
|
|
7974
7964
|
case 'month':
|
|
7975
|
-
return formatDateToMonth(value, configFormat.shortFormate);
|
|
7965
|
+
return formatDateToMonth(value, configFormat.shortFormate, langCode);
|
|
7976
7966
|
case 'date':
|
|
7977
7967
|
try {
|
|
7978
7968
|
const date = value instanceof Date ? value : new Date(value);
|
|
7979
7969
|
if (isNaN(date.getTime())) {
|
|
7980
7970
|
return String(value);
|
|
7981
7971
|
}
|
|
7982
|
-
const langCode = getLanguageCode();
|
|
7983
7972
|
const locale = langCode === 'ar' ? 'ar-SA' : 'en-US';
|
|
7984
7973
|
// Use Intl.DateTimeFormat for custom formatting
|
|
7985
7974
|
if (configFormat.customDateFormat) {
|
|
@@ -8028,9 +8017,9 @@ const generalConfiguration = {
|
|
|
8028
8017
|
/**
|
|
8029
8018
|
* Format value based on config format (matches old Formater function)
|
|
8030
8019
|
*/
|
|
8031
|
-
function formatValue(value, configFormat) {
|
|
8020
|
+
function formatValue(value, configFormat, langCode = 'en') {
|
|
8032
8021
|
if (configFormat?.type === 'currency') {
|
|
8033
|
-
return formatCurrency(value, configFormat);
|
|
8022
|
+
return formatCurrency(value, configFormat, langCode);
|
|
8034
8023
|
}
|
|
8035
8024
|
else if (configFormat?.type === 'percentage') {
|
|
8036
8025
|
return ((value ? Number(value.toFixed(2)) : value) || 0) + '%';
|
|
@@ -8048,7 +8037,7 @@ function formatValue(value, configFormat) {
|
|
|
8048
8037
|
return value;
|
|
8049
8038
|
}
|
|
8050
8039
|
const shortMonth = configFormat?.shortFormate !== false;
|
|
8051
|
-
return date.toLocaleString('
|
|
8040
|
+
return date.toLocaleString(langCode === 'ar' ? 'ar-SA' : 'en-US', {
|
|
8052
8041
|
month: shortMonth ? 'short' : 'long',
|
|
8053
8042
|
});
|
|
8054
8043
|
}
|
|
@@ -8236,12 +8225,11 @@ function sortDataTableView(data, sortConfig) {
|
|
|
8236
8225
|
/**
|
|
8237
8226
|
* Get localized title from object
|
|
8238
8227
|
*/
|
|
8239
|
-
function getLocalizedTitle(titleObj) {
|
|
8228
|
+
function getLocalizedTitle(titleObj, langCode = 'en') {
|
|
8240
8229
|
if (!titleObj)
|
|
8241
8230
|
return '';
|
|
8242
8231
|
if (typeof titleObj === 'string')
|
|
8243
8232
|
return titleObj;
|
|
8244
|
-
const langCode = getLanguageCode();
|
|
8245
8233
|
return titleObj[langCode] || titleObj.en || '';
|
|
8246
8234
|
}
|
|
8247
8235
|
/**
|
|
@@ -8985,7 +8973,7 @@ class BarChartHandler {
|
|
|
8985
8973
|
* Returns ECharts option directly (exactly like old BarChartService.handleBarChart)
|
|
8986
8974
|
*/
|
|
8987
8975
|
handleBarChart(dataResponse, config) {
|
|
8988
|
-
const languageCode =
|
|
8976
|
+
const languageCode = this.storeService.languageCode();
|
|
8989
8977
|
const insideReportViewer = this.storeService.insideReportViewer();
|
|
8990
8978
|
const clientConfig = config.clientConfig || {};
|
|
8991
8979
|
const configAsType = clientConfig.configAsType || {};
|
|
@@ -9148,7 +9136,9 @@ class BarChartHandler {
|
|
|
9148
9136
|
fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.label,
|
|
9149
9137
|
formatter: (params) => {
|
|
9150
9138
|
const total = params.value;
|
|
9151
|
-
return total
|
|
9139
|
+
return total
|
|
9140
|
+
? formatNumber(total, clientConfig?.['format'], languageCode)
|
|
9141
|
+
: '';
|
|
9152
9142
|
},
|
|
9153
9143
|
},
|
|
9154
9144
|
showBackground: configAsType?.['Background']?.show,
|
|
@@ -9163,7 +9153,7 @@ class BarChartHandler {
|
|
|
9163
9153
|
formatter: (params) => {
|
|
9164
9154
|
return params
|
|
9165
9155
|
.map((param) => {
|
|
9166
|
-
const value = formatNumber(param.value, clientConfig?.['format']);
|
|
9156
|
+
const value = formatNumber(param.value, clientConfig?.['format'], languageCode);
|
|
9167
9157
|
const showValueOnlyInTooltip = barOverride?.showValueOnlyInTooltip;
|
|
9168
9158
|
if (showValueOnlyInTooltip) {
|
|
9169
9159
|
return value;
|
|
@@ -9215,29 +9205,14 @@ class BarChartHandler {
|
|
|
9215
9205
|
}
|
|
9216
9206
|
if (isHorizontal) {
|
|
9217
9207
|
if (languageCode === 'ar') {
|
|
9218
|
-
lastItem.itemStyle.borderRadius = [
|
|
9219
|
-
borderRadius,
|
|
9220
|
-
0,
|
|
9221
|
-
0,
|
|
9222
|
-
borderRadius,
|
|
9223
|
-
];
|
|
9208
|
+
lastItem.itemStyle.borderRadius = [borderRadius, 0, 0, borderRadius];
|
|
9224
9209
|
}
|
|
9225
9210
|
else {
|
|
9226
|
-
lastItem.itemStyle.borderRadius = [
|
|
9227
|
-
0,
|
|
9228
|
-
borderRadius,
|
|
9229
|
-
borderRadius,
|
|
9230
|
-
0,
|
|
9231
|
-
];
|
|
9211
|
+
lastItem.itemStyle.borderRadius = [0, borderRadius, borderRadius, 0];
|
|
9232
9212
|
}
|
|
9233
9213
|
}
|
|
9234
9214
|
else {
|
|
9235
|
-
lastItem.itemStyle.borderRadius = [
|
|
9236
|
-
borderRadius,
|
|
9237
|
-
borderRadius,
|
|
9238
|
-
0,
|
|
9239
|
-
0,
|
|
9240
|
-
];
|
|
9215
|
+
lastItem.itemStyle.borderRadius = [borderRadius, borderRadius, 0, 0];
|
|
9241
9216
|
}
|
|
9242
9217
|
}
|
|
9243
9218
|
const xAxisLabels = xAxisData;
|
|
@@ -9271,7 +9246,7 @@ class BarChartHandler {
|
|
|
9271
9246
|
* Format X axis value using the formatXAxis utility
|
|
9272
9247
|
*/
|
|
9273
9248
|
formatXAxisValue(value, formatConfig) {
|
|
9274
|
-
return formatXAxis(value, formatConfig);
|
|
9249
|
+
return formatXAxis(value, formatConfig, this.storeService.languageCode());
|
|
9275
9250
|
}
|
|
9276
9251
|
/**
|
|
9277
9252
|
* Resolve bar corner radius with backward-compatible values:
|
|
@@ -9280,7 +9255,9 @@ class BarChartHandler {
|
|
|
9280
9255
|
* - number/string => that numeric value
|
|
9281
9256
|
*/
|
|
9282
9257
|
resolveBarBorderRadius(borderRadius) {
|
|
9283
|
-
if (borderRadius === undefined ||
|
|
9258
|
+
if (borderRadius === undefined ||
|
|
9259
|
+
borderRadius === null ||
|
|
9260
|
+
borderRadius === true) {
|
|
9284
9261
|
return 8;
|
|
9285
9262
|
}
|
|
9286
9263
|
if (borderRadius === false) {
|
|
@@ -9336,7 +9313,7 @@ class BarChartHandler {
|
|
|
9336
9313
|
type: 'currency',
|
|
9337
9314
|
showCurrency: barOverride.showCurrency || false,
|
|
9338
9315
|
handleLang: true,
|
|
9339
|
-
});
|
|
9316
|
+
}, this.storeService.languageCode());
|
|
9340
9317
|
case 'percentage':
|
|
9341
9318
|
return ((value ? Math.round(value) : value) || 0) + '%';
|
|
9342
9319
|
case 'number':
|
|
@@ -9509,7 +9486,7 @@ class BarChartHandler {
|
|
|
9509
9486
|
* Transforms bar chart data into entity preview format (flat array of properties)
|
|
9510
9487
|
*/
|
|
9511
9488
|
handleEntityPreviewWithFormula(dataResponse, config) {
|
|
9512
|
-
const languageCode =
|
|
9489
|
+
const languageCode = this.storeService.languageCode();
|
|
9513
9490
|
const clientConfig = config.clientConfig || {};
|
|
9514
9491
|
const configAsType = clientConfig.configAsType || {};
|
|
9515
9492
|
const defaultColor = configAsType?.['defaultColors']?.[0] || '#4caf50';
|
|
@@ -9548,7 +9525,7 @@ class BarChartHandler {
|
|
|
9548
9525
|
label = labelMap.get(key?.toLowerCase());
|
|
9549
9526
|
}
|
|
9550
9527
|
// Format the value using the configured format
|
|
9551
|
-
const formattedValue = formatValue(bar.value, clientConfig?.['format']);
|
|
9528
|
+
const formattedValue = formatValue(bar.value, clientConfig?.['format'], languageCode);
|
|
9552
9529
|
// Get color from barTypes array or defaultColors
|
|
9553
9530
|
const barColor = bar.color ||
|
|
9554
9531
|
colorMap.get(key?.toLowerCase()) ||
|
|
@@ -9585,12 +9562,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
9585
9562
|
* Exactly matches old DountChartService.handleDonutChart implementation.
|
|
9586
9563
|
*/
|
|
9587
9564
|
class PieChartHandler {
|
|
9565
|
+
storeService = inject(DashboardStoreService);
|
|
9588
9566
|
/**
|
|
9589
9567
|
* handleDonutChart - matches functionName from CHART_TYPES
|
|
9590
9568
|
* Returns ECharts option directly (exactly like old DountChartService.handleDonutChart)
|
|
9591
9569
|
*/
|
|
9592
9570
|
handleDonutChart(dataResponse, config) {
|
|
9593
|
-
const languageCode =
|
|
9571
|
+
const languageCode = this.storeService.languageCode();
|
|
9594
9572
|
const clientConfig = config.clientConfig || {};
|
|
9595
9573
|
const configAsType = clientConfig.configAsType || {};
|
|
9596
9574
|
const pieOverride = clientConfig.pieConfigOverried;
|
|
@@ -9661,7 +9639,7 @@ class PieChartHandler {
|
|
|
9661
9639
|
// Calculate total and remaining value
|
|
9662
9640
|
const actualTotal = seriesData.reduce((sum, item) => (item.isStaticProperty === true ? sum : sum + item.value), 0);
|
|
9663
9641
|
const remainingValue = actualTotal;
|
|
9664
|
-
const formattedTotal = formatNumber(remainingValue, clientConfig?.['format']);
|
|
9642
|
+
const formattedTotal = formatNumber(remainingValue, clientConfig?.['format'], languageCode);
|
|
9665
9643
|
// Apply color and label overrides based on conditions for all slices (before building legends)
|
|
9666
9644
|
seriesData.forEach((item, index) => {
|
|
9667
9645
|
if (item.isStaticProperty)
|
|
@@ -9711,7 +9689,7 @@ class PieChartHandler {
|
|
|
9711
9689
|
if (params.data?.isStaticProperty === true && isPercentage) {
|
|
9712
9690
|
return ''; // Hide label for remaining area
|
|
9713
9691
|
}
|
|
9714
|
-
return formatNumber(params.value, clientConfig?.['format']);
|
|
9692
|
+
return formatNumber(params.value, clientConfig?.['format'], languageCode);
|
|
9715
9693
|
}),
|
|
9716
9694
|
};
|
|
9717
9695
|
// Build legends
|
|
@@ -9784,7 +9762,7 @@ class PieChartHandler {
|
|
|
9784
9762
|
if (params.data?.isStaticProperty === true && isPercentage) {
|
|
9785
9763
|
return ''; // Hide tooltip for remaining area
|
|
9786
9764
|
}
|
|
9787
|
-
const value = formatNumber(params.value, clientConfig?.['format']);
|
|
9765
|
+
const value = formatNumber(params.value, clientConfig?.['format'], languageCode);
|
|
9788
9766
|
return `${params.name}: ${value} (${params.percent}%)`;
|
|
9789
9767
|
},
|
|
9790
9768
|
backgroundColor: '#fff',
|
|
@@ -10123,7 +10101,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
10123
10101
|
class StackBarChartHandler {
|
|
10124
10102
|
storeService = inject(DashboardStoreService);
|
|
10125
10103
|
resolveStackBarBorderRadius(borderRadius) {
|
|
10126
|
-
if (borderRadius === undefined ||
|
|
10104
|
+
if (borderRadius === undefined ||
|
|
10105
|
+
borderRadius === null ||
|
|
10106
|
+
borderRadius === true) {
|
|
10127
10107
|
return 8;
|
|
10128
10108
|
}
|
|
10129
10109
|
if (borderRadius === false) {
|
|
@@ -10164,7 +10144,7 @@ class StackBarChartHandler {
|
|
|
10164
10144
|
* handleStackBarChart - matches functionName from CHART_TYPES
|
|
10165
10145
|
*/
|
|
10166
10146
|
handleStackBarChart(dataResponse, config) {
|
|
10167
|
-
const languageCode =
|
|
10147
|
+
const languageCode = this.storeService.languageCode();
|
|
10168
10148
|
const isNormalization = config.clientConfig?.configAsType?.['isNormalization'];
|
|
10169
10149
|
const valuesArray = dataResponse.values || [];
|
|
10170
10150
|
const isSingleDefault = valuesArray?.some((value) => value.category === 'Default');
|
|
@@ -10464,7 +10444,7 @@ class StackBarChartHandler {
|
|
|
10464
10444
|
const rawValue = params.data.originalValue;
|
|
10465
10445
|
if (rawValue === 0)
|
|
10466
10446
|
return '';
|
|
10467
|
-
return formatNumber(rawValue, clientConfig?.['format']);
|
|
10447
|
+
return formatNumber(rawValue, clientConfig?.['format'], languageCode);
|
|
10468
10448
|
},
|
|
10469
10449
|
fontFamily: generalConfiguration?.fontConfig?.fontFamily,
|
|
10470
10450
|
fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.label,
|
|
@@ -10521,7 +10501,7 @@ class StackBarChartHandler {
|
|
|
10521
10501
|
show: configAsType?.['label']?.['showTotalInTop'],
|
|
10522
10502
|
position: isHorizontal ? 'right' : 'top',
|
|
10523
10503
|
formatter: (params) => {
|
|
10524
|
-
return formatNumber(params.data.originalTotal, clientConfig?.['format']);
|
|
10504
|
+
return formatNumber(params.data.originalTotal, clientConfig?.['format'], languageCode);
|
|
10525
10505
|
},
|
|
10526
10506
|
fontFamily: generalConfiguration?.fontConfig?.fontFamily,
|
|
10527
10507
|
fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.label,
|
|
@@ -10562,7 +10542,7 @@ class StackBarChartHandler {
|
|
|
10562
10542
|
return;
|
|
10563
10543
|
const series = allSeriesData[param.seriesIndex];
|
|
10564
10544
|
const rawValue = param.data?.originalValue ?? param.value;
|
|
10565
|
-
const formattedValue = formatNumber(rawValue, clientConfig?.['format']);
|
|
10545
|
+
const formattedValue = formatNumber(rawValue, clientConfig?.['format'], languageCode);
|
|
10566
10546
|
if (series?.barType === 'lineAccumulated') {
|
|
10567
10547
|
tooltipHtml +=
|
|
10568
10548
|
languageCode === 'ar'
|
|
@@ -10622,7 +10602,7 @@ class StackBarChartHandler {
|
|
|
10622
10602
|
formatter: (value) => {
|
|
10623
10603
|
const yAxisFormat = clientConfig?.['stackBarConfigOverride']?.['yAxisFormat'];
|
|
10624
10604
|
if (yAxisFormat) {
|
|
10625
|
-
return formatNumber(value, yAxisFormat);
|
|
10605
|
+
return formatNumber(value, yAxisFormat, languageCode);
|
|
10626
10606
|
}
|
|
10627
10607
|
return value;
|
|
10628
10608
|
},
|
|
@@ -10785,12 +10765,13 @@ class StackBarChartHandler {
|
|
|
10785
10765
|
if (!yAxis.axisLabel) {
|
|
10786
10766
|
yAxis.axisLabel = {};
|
|
10787
10767
|
}
|
|
10788
|
-
yAxis.axisLabel.fontFamily =
|
|
10768
|
+
yAxis.axisLabel.fontFamily =
|
|
10769
|
+
generalConfiguration?.fontConfig?.fontFamily;
|
|
10789
10770
|
if (!yAxis.axisLabel.formatter) {
|
|
10790
10771
|
yAxis.axisLabel.formatter = (value) => {
|
|
10791
10772
|
const yAxisFormat = stackBarOverride?.yAxisFormat;
|
|
10792
10773
|
if (yAxisFormat) {
|
|
10793
|
-
return formatNumber(value, yAxisFormat);
|
|
10774
|
+
return formatNumber(value, yAxisFormat, languageCode);
|
|
10794
10775
|
}
|
|
10795
10776
|
return value;
|
|
10796
10777
|
};
|
|
@@ -11070,12 +11051,13 @@ function groupDatesByYearAndMonth(data, valueAggregator = (values) => values.red
|
|
|
11070
11051
|
* Matches exactly the old GaugeChartService behavior.
|
|
11071
11052
|
*/
|
|
11072
11053
|
class GaugeChartHandler {
|
|
11054
|
+
storeService = inject(DashboardStoreService);
|
|
11073
11055
|
/**
|
|
11074
11056
|
* handleGaugeChart - matches functionName from CHART_TYPES
|
|
11075
11057
|
* Returns ECharts config directly (exactly like old GaugeChartService)
|
|
11076
11058
|
*/
|
|
11077
11059
|
handleGaugeChart(dataResponse, config) {
|
|
11078
|
-
const languageCode =
|
|
11060
|
+
const languageCode = this.storeService.languageCode();
|
|
11079
11061
|
const clientConfig = config.clientConfig || {};
|
|
11080
11062
|
const configAsType = clientConfig.configAsType || {};
|
|
11081
11063
|
const overrideLabels = configAsType?.['overrideLabels'];
|
|
@@ -11127,7 +11109,7 @@ class GaugeChartHandler {
|
|
|
11127
11109
|
labelFontSize: 11,
|
|
11128
11110
|
totalValueFontSize: 30,
|
|
11129
11111
|
labelFormatter: (params) => {
|
|
11130
|
-
return formatNumber(params.value, clientConfig?.['format']);
|
|
11112
|
+
return formatNumber(params.value, clientConfig?.['format'], languageCode);
|
|
11131
11113
|
},
|
|
11132
11114
|
};
|
|
11133
11115
|
const noData = seriesData.length === 0;
|
|
@@ -11184,6 +11166,7 @@ const generalConfig = {
|
|
|
11184
11166
|
},
|
|
11185
11167
|
};
|
|
11186
11168
|
class TableViewHandler {
|
|
11169
|
+
storeService = inject(DashboardStoreService);
|
|
11187
11170
|
/**
|
|
11188
11171
|
* handleTableView - matches functionName from CHART_TYPES
|
|
11189
11172
|
* Returns data directly (not wrapped in { type, data, config })
|
|
@@ -11203,7 +11186,7 @@ class TableViewHandler {
|
|
|
11203
11186
|
* Returns eCharts bar chart config directly (like old HandleProjectsByExecutionPeriod)
|
|
11204
11187
|
*/
|
|
11205
11188
|
handleProjectsByExecutionPeriod(dataResponse, config) {
|
|
11206
|
-
const languageCode =
|
|
11189
|
+
const languageCode = this.storeService.languageCode();
|
|
11207
11190
|
const projects = dataResponse.values || [];
|
|
11208
11191
|
const ONE_DAY = 1000 * 3600 * 24;
|
|
11209
11192
|
const today = new Date();
|
|
@@ -11341,7 +11324,7 @@ class TableViewHandler {
|
|
|
11341
11324
|
fontFamily: generalConfig?.fontConfig?.fontFamily,
|
|
11342
11325
|
fontSize: generalConfig?.fontConfig?.fontSizeConfig?.label,
|
|
11343
11326
|
formatter: (params) => {
|
|
11344
|
-
return formatNumber(params.value, format);
|
|
11327
|
+
return formatNumber(params.value, format, languageCode);
|
|
11345
11328
|
},
|
|
11346
11329
|
},
|
|
11347
11330
|
startDateForPeriod: item?.startDateForPeriod,
|
|
@@ -11358,7 +11341,7 @@ class TableViewHandler {
|
|
|
11358
11341
|
axisPointer: { type: 'shadow' },
|
|
11359
11342
|
formatter: (params) => {
|
|
11360
11343
|
const groupData = groupedProjects[params[0].dataIndex];
|
|
11361
|
-
let tooltip = `${params[0].marker} ${groupData.label?.[languageCode]}: ${formatNumber(params[0].value, format)}<br/>`;
|
|
11344
|
+
let tooltip = `${params[0].marker} ${groupData.label?.[languageCode]}: ${formatNumber(params[0].value, format, languageCode)}<br/>`;
|
|
11362
11345
|
if (groupData.projects.length > 0) {
|
|
11363
11346
|
tooltip +=
|
|
11364
11347
|
languageCode === 'ar' ? ' المشاريع <br/>' : 'Projects:<br/>';
|
|
@@ -11396,12 +11379,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
11396
11379
|
* Returns EXACT same format as old OverviewCardService.
|
|
11397
11380
|
*/
|
|
11398
11381
|
class OverviewCardHandler {
|
|
11382
|
+
storeService = inject(DashboardStoreService);
|
|
11399
11383
|
/**
|
|
11400
11384
|
* handleOverviewCard - matches functionName from CHART_TYPES
|
|
11401
11385
|
* Returns EXACT same format as old OverviewCardService
|
|
11402
11386
|
*/
|
|
11403
11387
|
handleOverviewCard(data, config) {
|
|
11404
|
-
const languageCode =
|
|
11388
|
+
const languageCode = this.storeService.languageCode();
|
|
11405
11389
|
const clientConfig = config.clientConfig || {};
|
|
11406
11390
|
const configAsType = clientConfig.configAsType || {};
|
|
11407
11391
|
const format = clientConfig?.['format'];
|
|
@@ -11464,7 +11448,7 @@ class OverviewCardHandler {
|
|
|
11464
11448
|
const resultObj = getConfig(clientConfig.title?.[languageCode] || '', configAsType?.['subTitle']?.[languageCode] || '', value, isClickable, value);
|
|
11465
11449
|
// Format the value
|
|
11466
11450
|
if (value !== null && value !== undefined) {
|
|
11467
|
-
resultObj.value = formatNumber(value, format);
|
|
11451
|
+
resultObj.value = formatNumber(value, format, languageCode);
|
|
11468
11452
|
}
|
|
11469
11453
|
// Handle currency tooltip (same as old)
|
|
11470
11454
|
if (format?.type === 'currency' && format?.showCurrencyTooltip) {
|
|
@@ -12053,12 +12037,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
12053
12037
|
* Returns ECharts config directly (not wrapped in { type, data, chartOptions }).
|
|
12054
12038
|
*/
|
|
12055
12039
|
class LineChartHandler {
|
|
12040
|
+
storeService = inject(DashboardStoreService);
|
|
12056
12041
|
/**
|
|
12057
12042
|
* handleLineChart - matches functionName from CHART_TYPES
|
|
12058
12043
|
* Returns ECharts config directly with noData, width, divClass properties
|
|
12059
12044
|
*/
|
|
12060
12045
|
handleLineChart(dataResponse, config) {
|
|
12061
|
-
const languageCode =
|
|
12046
|
+
const languageCode = this.storeService.languageCode();
|
|
12062
12047
|
const clientConfig = config.clientConfig || {};
|
|
12063
12048
|
const configAsType = clientConfig.configAsType || {};
|
|
12064
12049
|
const format = clientConfig?.['format'];
|
|
@@ -12109,7 +12094,9 @@ class LineChartHandler {
|
|
|
12109
12094
|
show: configAsType?.['label']?.show,
|
|
12110
12095
|
position: 'top',
|
|
12111
12096
|
formatter: (params) => {
|
|
12112
|
-
return params.value
|
|
12097
|
+
return params.value
|
|
12098
|
+
? formatNumber(params.value, format, languageCode)
|
|
12099
|
+
: '';
|
|
12113
12100
|
},
|
|
12114
12101
|
},
|
|
12115
12102
|
};
|
|
@@ -12183,7 +12170,7 @@ class LineChartHandler {
|
|
|
12183
12170
|
fontSize: 11,
|
|
12184
12171
|
fontFamily: 'inherit',
|
|
12185
12172
|
color: '#666',
|
|
12186
|
-
formatter: (value) => formatNumber(value, format),
|
|
12173
|
+
formatter: (value) => formatNumber(value, format, languageCode),
|
|
12187
12174
|
},
|
|
12188
12175
|
splitLine: {
|
|
12189
12176
|
lineStyle: {
|
|
@@ -12207,7 +12194,7 @@ class LineChartHandler {
|
|
|
12207
12194
|
params.forEach((param) => {
|
|
12208
12195
|
result += `<div style="display: flex; align-items: center; gap: 6px">`;
|
|
12209
12196
|
result += `<span style="display: inline-block; width: 10px; height: 10px; border-radius: 50%; background: ${param.color}"></span>`;
|
|
12210
|
-
result += `<span>${param.seriesName}: ${formatNumber(param.value, format)}</span>`;
|
|
12197
|
+
result += `<span>${param.seriesName}: ${formatNumber(param.value, format, languageCode)}</span>`;
|
|
12211
12198
|
result += `</div>`;
|
|
12212
12199
|
});
|
|
12213
12200
|
return result;
|
|
@@ -12293,6 +12280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
12293
12280
|
* Returns ECharts options directly (matching old SnapShotService format).
|
|
12294
12281
|
*/
|
|
12295
12282
|
class SnapshotHandler {
|
|
12283
|
+
storeService = inject(DashboardStoreService);
|
|
12296
12284
|
/**
|
|
12297
12285
|
* handleSnapShot - matches functionName from CHART_TYPES
|
|
12298
12286
|
* Returns ECharts option directly (same as old SnapShotService)
|
|
@@ -12314,7 +12302,7 @@ class SnapshotHandler {
|
|
|
12314
12302
|
handleSnapShotLineChart(data, config) {
|
|
12315
12303
|
const propsForView = config.serviceConfig?.query?.['selectedProperties'] || [];
|
|
12316
12304
|
const xAxisLabels = data.map((item) => item.timeFrame?.key || '');
|
|
12317
|
-
const languageCode =
|
|
12305
|
+
const languageCode = this.storeService.languageCode();
|
|
12318
12306
|
const clientConfig = config.clientConfig || {};
|
|
12319
12307
|
const configAsType = clientConfig['configAsType'] || {};
|
|
12320
12308
|
const overrideLabels = configAsType['overrideLabels'];
|
|
@@ -12347,7 +12335,9 @@ class SnapshotHandler {
|
|
|
12347
12335
|
position: 'top',
|
|
12348
12336
|
formatter: (params) => {
|
|
12349
12337
|
const value = params.value;
|
|
12350
|
-
return value
|
|
12338
|
+
return value
|
|
12339
|
+
? formatValue(value, clientConfig['format'], languageCode)
|
|
12340
|
+
: '';
|
|
12351
12341
|
},
|
|
12352
12342
|
},
|
|
12353
12343
|
};
|
|
@@ -12394,7 +12384,7 @@ class SnapshotHandler {
|
|
|
12394
12384
|
formatter: function (params) {
|
|
12395
12385
|
let tooltipHtml = `${params[0].name}<br/>`;
|
|
12396
12386
|
params.forEach((param) => {
|
|
12397
|
-
const value = formatValue(param?.value, clientConfig['format']);
|
|
12387
|
+
const value = formatValue(param?.value, clientConfig['format'], languageCode);
|
|
12398
12388
|
tooltipHtml +=
|
|
12399
12389
|
languageCode === 'ar'
|
|
12400
12390
|
? `${param.marker} ${param.seriesName} ${value}<br/>`
|
|
@@ -12491,7 +12481,7 @@ class SnapshotHandler {
|
|
|
12491
12481
|
const configAsType = clientConfig['configAsType'] || {};
|
|
12492
12482
|
const propsForView = configAsType['propsForView'] || [];
|
|
12493
12483
|
const xAxisLabels = data.map((item) => item.timeFrame?.key || '');
|
|
12494
|
-
const languageCode =
|
|
12484
|
+
const languageCode = this.storeService.languageCode();
|
|
12495
12485
|
const seriesData = propsForView.map((prop) => {
|
|
12496
12486
|
const dataValues = data.map((item) => item[prop?.key]?.rawValue);
|
|
12497
12487
|
return {
|
|
@@ -12539,7 +12529,7 @@ class SnapshotHandler {
|
|
|
12539
12529
|
formatter: function (params) {
|
|
12540
12530
|
let tooltipHtml = `${params[0].name}<br/>`;
|
|
12541
12531
|
params.forEach((param) => {
|
|
12542
|
-
const value = formatValue(param?.value, clientConfig['format']);
|
|
12532
|
+
const value = formatValue(param?.value, clientConfig['format'], languageCode);
|
|
12543
12533
|
tooltipHtml +=
|
|
12544
12534
|
languageCode === 'ar'
|
|
12545
12535
|
? `${param.marker} ${param.seriesName} ${value}<br/>`
|
|
@@ -12644,13 +12634,14 @@ function convertDateToString(date) {
|
|
|
12644
12634
|
return `${year}-${month}-${day}`;
|
|
12645
12635
|
}
|
|
12646
12636
|
class ComparisonChartHandler {
|
|
12637
|
+
storeService = inject(DashboardStoreService);
|
|
12647
12638
|
/**
|
|
12648
12639
|
* Main handler for comparison charts
|
|
12649
12640
|
* Returns ECharts config directly with noData, width, divClass properties
|
|
12650
12641
|
* (matches old ComparisonChartService.handleComparisonChart format)
|
|
12651
12642
|
*/
|
|
12652
12643
|
handle(dataResponse, config) {
|
|
12653
|
-
const languageCode =
|
|
12644
|
+
const languageCode = this.storeService.languageCode();
|
|
12654
12645
|
const labels = dataResponse?.labels || [];
|
|
12655
12646
|
const values = dataResponse?.values || [];
|
|
12656
12647
|
const noData = values?.length === 0;
|
|
@@ -12691,7 +12682,7 @@ class ComparisonChartHandler {
|
|
|
12691
12682
|
fontFamily: generalConfiguration?.fontConfig?.fontFamily,
|
|
12692
12683
|
fontSize: generalConfiguration?.fontConfig?.fontSizeConfig?.label,
|
|
12693
12684
|
formatter: (params) => {
|
|
12694
|
-
return formatValue(params.value, config.clientConfig?.['format']);
|
|
12685
|
+
return formatValue(params.value, config.clientConfig?.['format'], languageCode);
|
|
12695
12686
|
},
|
|
12696
12687
|
},
|
|
12697
12688
|
});
|
|
@@ -12766,8 +12757,8 @@ class ComparisonChartHandler {
|
|
|
12766
12757
|
params.forEach((param) => {
|
|
12767
12758
|
tooltipHtml +=
|
|
12768
12759
|
languageCode === 'ar'
|
|
12769
|
-
? `${param.marker} ${param.seriesName} ${formatValue(param.value, config.clientConfig?.['format'])}<br/>`
|
|
12770
|
-
: `${param.marker} ${param.seriesName} ${formatValue(param.value, config.clientConfig?.['format'])}<br/>`;
|
|
12760
|
+
? `${param.marker} ${param.seriesName} ${formatValue(param.value, config.clientConfig?.['format'], languageCode)}<br/>`
|
|
12761
|
+
: `${param.marker} ${param.seriesName} ${formatValue(param.value, config.clientConfig?.['format'], languageCode)}<br/>`;
|
|
12771
12762
|
});
|
|
12772
12763
|
return tooltipHtml;
|
|
12773
12764
|
},
|
|
@@ -12883,7 +12874,7 @@ class ComparisonChartHandler {
|
|
|
12883
12874
|
*/
|
|
12884
12875
|
parseComparisonData(dataResponse, config) {
|
|
12885
12876
|
const items = [];
|
|
12886
|
-
const languageCode =
|
|
12877
|
+
const languageCode = this.storeService.languageCode();
|
|
12887
12878
|
const _configAsType = config.clientConfig?.configAsType || {};
|
|
12888
12879
|
if (Array.isArray(dataResponse?.categories)) {
|
|
12889
12880
|
dataResponse.categories.forEach((cat, index) => {
|
|
@@ -12926,7 +12917,6 @@ class ComparisonChartHandler {
|
|
|
12926
12917
|
*/
|
|
12927
12918
|
parseYoYData(dataResponse, _config) {
|
|
12928
12919
|
const items = [];
|
|
12929
|
-
const _languageCode = getLanguageCode();
|
|
12930
12920
|
if (dataResponse?.years) {
|
|
12931
12921
|
Object.entries(dataResponse.years).forEach(([year, data]) => {
|
|
12932
12922
|
if (Array.isArray(data)) {
|
|
@@ -12955,7 +12945,6 @@ class ComparisonChartHandler {
|
|
|
12955
12945
|
*/
|
|
12956
12946
|
parsePlannedActualData(dataResponse, config) {
|
|
12957
12947
|
const items = [];
|
|
12958
|
-
const _languageCode = getLanguageCode();
|
|
12959
12948
|
const configAsType = config.clientConfig?.configAsType || {};
|
|
12960
12949
|
const plannedKey = configAsType['plannedKey'] || 'planned';
|
|
12961
12950
|
const actualKey = configAsType['actualKey'] || 'actual';
|
|
@@ -12982,7 +12971,7 @@ class ComparisonChartHandler {
|
|
|
12982
12971
|
* Build comparison bar chart
|
|
12983
12972
|
*/
|
|
12984
12973
|
buildComparisonChart(items, config) {
|
|
12985
|
-
const languageCode =
|
|
12974
|
+
const languageCode = this.storeService.languageCode();
|
|
12986
12975
|
const isRTL = languageCode === 'ar';
|
|
12987
12976
|
const configAsType = config.clientConfig?.configAsType || {};
|
|
12988
12977
|
const colors = configAsType['defaultColors'] || [
|
|
@@ -13013,14 +13002,14 @@ class ComparisonChartHandler {
|
|
|
13013
13002
|
return '';
|
|
13014
13003
|
let result = `<div style="font-weight:bold;margin-bottom:4px">${params[0].axisValue}</div>`;
|
|
13015
13004
|
params.forEach((p) => {
|
|
13016
|
-
result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value)}</div>`;
|
|
13005
|
+
result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value, undefined, languageCode)}</div>`;
|
|
13017
13006
|
});
|
|
13018
13007
|
// Add variance if available
|
|
13019
13008
|
const item = items.find((i) => i.category === params[0].axisValue);
|
|
13020
13009
|
if (item?.variance !== undefined) {
|
|
13021
13010
|
const sign = item.variance >= 0 ? '+' : '';
|
|
13022
13011
|
const color = item.variance >= 0 ? '#4caf50' : '#f44336';
|
|
13023
|
-
result += `<div style="margin-top:4px;color:${color}">Variance: ${sign}${formatNumber(item.variance)} (${sign}${item.variancePercent?.toFixed(1)}%)</div>`;
|
|
13012
|
+
result += `<div style="margin-top:4px;color:${color}">Variance: ${sign}${formatNumber(item.variance, undefined, languageCode)} (${sign}${item.variancePercent?.toFixed(1)}%)</div>`;
|
|
13024
13013
|
}
|
|
13025
13014
|
return result;
|
|
13026
13015
|
},
|
|
@@ -13048,7 +13037,7 @@ class ComparisonChartHandler {
|
|
|
13048
13037
|
yAxis: {
|
|
13049
13038
|
type: 'value',
|
|
13050
13039
|
axisLabel: {
|
|
13051
|
-
formatter: (value) => formatNumber(value),
|
|
13040
|
+
formatter: (value) => formatNumber(value, undefined, languageCode),
|
|
13052
13041
|
fontFamily: '"Cairo", sans-serif',
|
|
13053
13042
|
},
|
|
13054
13043
|
},
|
|
@@ -13084,7 +13073,7 @@ class ComparisonChartHandler {
|
|
|
13084
13073
|
return '';
|
|
13085
13074
|
let result = `<div style="font-weight:bold">${params[0].axisValue}</div>`;
|
|
13086
13075
|
params.forEach((p) => {
|
|
13087
|
-
result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value)}</div>`;
|
|
13076
|
+
result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value, undefined, this.storeService.languageCode())}</div>`;
|
|
13088
13077
|
});
|
|
13089
13078
|
return result;
|
|
13090
13079
|
},
|
|
@@ -13110,7 +13099,7 @@ class ComparisonChartHandler {
|
|
|
13110
13099
|
yAxis: {
|
|
13111
13100
|
type: 'value',
|
|
13112
13101
|
axisLabel: {
|
|
13113
|
-
formatter: (value) => formatNumber(value),
|
|
13102
|
+
formatter: (value) => formatNumber(value, undefined, this.storeService.languageCode()),
|
|
13114
13103
|
fontFamily: '"Cairo", sans-serif',
|
|
13115
13104
|
},
|
|
13116
13105
|
},
|
|
@@ -13121,7 +13110,7 @@ class ComparisonChartHandler {
|
|
|
13121
13110
|
* Build Planned vs Actual chart with variance indicators
|
|
13122
13111
|
*/
|
|
13123
13112
|
buildPlannedActualChart(items, config) {
|
|
13124
|
-
const languageCode =
|
|
13113
|
+
const languageCode = this.storeService.languageCode();
|
|
13125
13114
|
const isRTL = languageCode === 'ar';
|
|
13126
13115
|
const configAsType = config.clientConfig?.configAsType || {};
|
|
13127
13116
|
const plannedColor = configAsType['plannedColor'] || '#2196f3';
|
|
@@ -13137,13 +13126,13 @@ class ComparisonChartHandler {
|
|
|
13137
13126
|
const item = items.find((i) => i.category === params[0].axisValue);
|
|
13138
13127
|
let result = `<div style="font-weight:bold;margin-bottom:4px">${params[0].axisValue}</div>`;
|
|
13139
13128
|
params.forEach((p) => {
|
|
13140
|
-
result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value)}</div>`;
|
|
13129
|
+
result += `<div>${p.marker} ${p.seriesName}: ${formatNumber(p.value, undefined, languageCode)}</div>`;
|
|
13141
13130
|
});
|
|
13142
13131
|
if (item?.variance !== undefined) {
|
|
13143
13132
|
const sign = item.variance >= 0 ? '+' : '';
|
|
13144
13133
|
const color = item.variance >= 0 ? '#4caf50' : '#f44336';
|
|
13145
13134
|
result += `<div style="margin-top:4px;padding-top:4px;border-top:1px solid #eee;color:${color}">`;
|
|
13146
|
-
result += `Variance: ${sign}${formatNumber(item.variance)} (${sign}${item.variancePercent?.toFixed(1)}%)`;
|
|
13135
|
+
result += `Variance: ${sign}${formatNumber(item.variance, undefined, languageCode)} (${sign}${item.variancePercent?.toFixed(1)}%)`;
|
|
13147
13136
|
result += `</div>`;
|
|
13148
13137
|
}
|
|
13149
13138
|
return result;
|
|
@@ -13176,7 +13165,7 @@ class ComparisonChartHandler {
|
|
|
13176
13165
|
yAxis: {
|
|
13177
13166
|
type: 'value',
|
|
13178
13167
|
axisLabel: {
|
|
13179
|
-
formatter: (value) => formatNumber(value),
|
|
13168
|
+
formatter: (value) => formatNumber(value, undefined, languageCode),
|
|
13180
13169
|
fontFamily: '"Cairo", sans-serif',
|
|
13181
13170
|
},
|
|
13182
13171
|
},
|
|
@@ -13278,6 +13267,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
13278
13267
|
* Used for listOfLevelCards, levelCardsWithFilter components.
|
|
13279
13268
|
*/
|
|
13280
13269
|
class LevelCardHandler {
|
|
13270
|
+
storeService = inject(DashboardStoreService);
|
|
13281
13271
|
/**
|
|
13282
13272
|
* handlelevelCards - matches functionName from CHART_TYPES
|
|
13283
13273
|
* Returns data directly like old LevelCardService:
|
|
@@ -13377,7 +13367,7 @@ class LevelCardHandler {
|
|
|
13377
13367
|
* Parse level cards with filter (values array format)
|
|
13378
13368
|
*/
|
|
13379
13369
|
parseLevelCardsWithFilter(dataResponse, _config) {
|
|
13380
|
-
const languageCode =
|
|
13370
|
+
const languageCode = this.storeService.languageCode();
|
|
13381
13371
|
const cards = [];
|
|
13382
13372
|
if (dataResponse?.values && Array.isArray(dataResponse.values)) {
|
|
13383
13373
|
dataResponse.values.forEach((value, index) => {
|
|
@@ -13412,7 +13402,7 @@ class LevelCardHandler {
|
|
|
13412
13402
|
* Parse a single card detail
|
|
13413
13403
|
*/
|
|
13414
13404
|
parseCardDetail(detail, _config, index) {
|
|
13415
|
-
const languageCode =
|
|
13405
|
+
const languageCode = this.storeService.languageCode();
|
|
13416
13406
|
if (!detail)
|
|
13417
13407
|
return null;
|
|
13418
13408
|
// Extract level info
|
|
@@ -13780,13 +13770,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
13780
13770
|
* Returns ECharts options directly (matching old RingGaugeChartService format).
|
|
13781
13771
|
*/
|
|
13782
13772
|
class RingGaugeChartHandler {
|
|
13773
|
+
storeService = inject(DashboardStoreService);
|
|
13783
13774
|
colorByPropMap = null;
|
|
13784
13775
|
/**
|
|
13785
13776
|
* handleRingGaugeChart - matches functionName from CHART_TYPES
|
|
13786
13777
|
* Returns ECharts option directly (same as old RingGaugeChartService)
|
|
13787
13778
|
*/
|
|
13788
13779
|
handleRingGaugeChart(dataResponse, config) {
|
|
13789
|
-
const languageCode =
|
|
13780
|
+
const languageCode = this.storeService.languageCode();
|
|
13790
13781
|
const clientConfig = config.clientConfig || {};
|
|
13791
13782
|
const configAsType = clientConfig['configAsType'] || {};
|
|
13792
13783
|
const showLegend = configAsType['legend']?.show;
|
|
@@ -13906,7 +13897,7 @@ class RingGaugeChartHandler {
|
|
|
13906
13897
|
color: 'inherit',
|
|
13907
13898
|
fontSize: 14,
|
|
13908
13899
|
formatter: (value) => {
|
|
13909
|
-
return formatValue(value, clientConfig['format']);
|
|
13900
|
+
return formatValue(value, clientConfig['format'], languageCode);
|
|
13910
13901
|
},
|
|
13911
13902
|
},
|
|
13912
13903
|
radius: [`${innerRadius}%`, `${outerRadius}%`],
|
|
@@ -13938,7 +13929,7 @@ class RingGaugeChartHandler {
|
|
|
13938
13929
|
</div>`;
|
|
13939
13930
|
});
|
|
13940
13931
|
if (centerValue !== null && centerProperty) {
|
|
13941
|
-
const formattedCenterValue = formatValue(centerValue, clientConfig['format']);
|
|
13932
|
+
const formattedCenterValue = formatValue(centerValue, clientConfig['format'], languageCode);
|
|
13942
13933
|
tooltipContent += `<div style="margin: 5px 0; margin-top: 10px; border-top: 1px solid #ddd; padding-top: 5px;">
|
|
13943
13934
|
<span style="display:inline-block;width:10px;height:10px;background-color:${statusColor};border-radius:50%;margin-right:8px;"></span>
|
|
13944
13935
|
<span>${centerLabel}: ${formattedCenterValue}</span>
|
|
@@ -13995,7 +13986,7 @@ class RingGaugeChartHandler {
|
|
|
13995
13986
|
};
|
|
13996
13987
|
// Add center value graphic if centerProperty exists
|
|
13997
13988
|
if (centerValue !== null && centerProperty) {
|
|
13998
|
-
const formattedCenterValue = formatValue(centerValue, clientConfig['format']);
|
|
13989
|
+
const formattedCenterValue = formatValue(centerValue, clientConfig['format'], languageCode);
|
|
13999
13990
|
const itemSpacing = 15;
|
|
14000
13991
|
const totalItems = visibleIndex + 1;
|
|
14001
13992
|
const totalSpacing = (totalItems - 1) * itemSpacing;
|
|
@@ -14211,6 +14202,7 @@ function lowercaseFirstLetter(str) {
|
|
|
14211
14202
|
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
14212
14203
|
}
|
|
14213
14204
|
class SPlusChartHandler {
|
|
14205
|
+
storeService = inject(DashboardStoreService);
|
|
14214
14206
|
generalService = inject(GeneralService);
|
|
14215
14207
|
/**
|
|
14216
14208
|
* Handle S+ Gauge Chart - returns ECharts option directly
|
|
@@ -14441,7 +14433,7 @@ class SPlusChartHandler {
|
|
|
14441
14433
|
* Parse progress data
|
|
14442
14434
|
*/
|
|
14443
14435
|
parseProgressData(dataResponse, _config) {
|
|
14444
|
-
const languageCode =
|
|
14436
|
+
const languageCode = this.storeService.languageCode();
|
|
14445
14437
|
const items = [];
|
|
14446
14438
|
const dataArray = Array.isArray(dataResponse)
|
|
14447
14439
|
? dataResponse
|
|
@@ -14475,7 +14467,7 @@ class SPlusChartHandler {
|
|
|
14475
14467
|
* Parse KPI data
|
|
14476
14468
|
*/
|
|
14477
14469
|
parseKPIData(dataResponse, _config) {
|
|
14478
|
-
const languageCode =
|
|
14470
|
+
const languageCode = this.storeService.languageCode();
|
|
14479
14471
|
const kpis = [];
|
|
14480
14472
|
const dataArray = Array.isArray(dataResponse)
|
|
14481
14473
|
? dataResponse
|
|
@@ -14510,7 +14502,7 @@ class SPlusChartHandler {
|
|
|
14510
14502
|
* Parse milestone data
|
|
14511
14503
|
*/
|
|
14512
14504
|
parseMilestoneData(dataResponse, _config) {
|
|
14513
|
-
const languageCode =
|
|
14505
|
+
const languageCode = this.storeService.languageCode();
|
|
14514
14506
|
const milestones = [];
|
|
14515
14507
|
const dataArray = Array.isArray(dataResponse)
|
|
14516
14508
|
? dataResponse
|
|
@@ -14531,7 +14523,7 @@ class SPlusChartHandler {
|
|
|
14531
14523
|
* Build progress bar chart
|
|
14532
14524
|
*/
|
|
14533
14525
|
buildProgressChart(items, config) {
|
|
14534
|
-
const languageCode =
|
|
14526
|
+
const languageCode = this.storeService.languageCode();
|
|
14535
14527
|
const isRTL = languageCode === 'ar';
|
|
14536
14528
|
const configAsType = config.clientConfig?.configAsType || {};
|
|
14537
14529
|
const plannedColor = configAsType['plannedColor'] || '#90caf9';
|
|
@@ -14624,7 +14616,7 @@ class SPlusChartHandler {
|
|
|
14624
14616
|
* Build weighted progress chart with summary gauge
|
|
14625
14617
|
*/
|
|
14626
14618
|
buildWeightedProgressChart(items, weightedPlanned, weightedActual, _config) {
|
|
14627
|
-
const languageCode =
|
|
14619
|
+
const languageCode = this.storeService.languageCode();
|
|
14628
14620
|
const variance = weightedActual - weightedPlanned;
|
|
14629
14621
|
const gaugeColor = variance >= 0 ? '#4caf50' : variance >= -10 ? '#ff9800' : '#f44336';
|
|
14630
14622
|
return {
|
|
@@ -14767,6 +14759,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
14767
14759
|
* Shows current phase, completed phases, and upcoming phases.
|
|
14768
14760
|
*/
|
|
14769
14761
|
class PhaseGateStepperHandler {
|
|
14762
|
+
storeService = inject(DashboardStoreService);
|
|
14770
14763
|
/**
|
|
14771
14764
|
* handlePhaseGateStepperCard - matches functionName from CHART_TYPES
|
|
14772
14765
|
* Returns data directly matching old PhaseGateStepperService format
|
|
@@ -14804,7 +14797,7 @@ class PhaseGateStepperHandler {
|
|
|
14804
14797
|
* Parse phase gate data from API response
|
|
14805
14798
|
*/
|
|
14806
14799
|
parsePhaseGateData(dataResponse, _config) {
|
|
14807
|
-
const languageCode =
|
|
14800
|
+
const languageCode = this.storeService.languageCode();
|
|
14808
14801
|
const steps = [];
|
|
14809
14802
|
// Handle array format
|
|
14810
14803
|
const dataArray = Array.isArray(dataResponse)
|
|
@@ -14960,7 +14953,7 @@ class PhaseGateStepperHandler {
|
|
|
14960
14953
|
* Build table columns from steps
|
|
14961
14954
|
*/
|
|
14962
14955
|
buildTableColumns(steps, _config) {
|
|
14963
|
-
const languageCode =
|
|
14956
|
+
const languageCode = this.storeService.languageCode();
|
|
14964
14957
|
const columns = [
|
|
14965
14958
|
{
|
|
14966
14959
|
key: 'property',
|
|
@@ -14984,7 +14977,7 @@ class PhaseGateStepperHandler {
|
|
|
14984
14977
|
* Build table rows from steps
|
|
14985
14978
|
*/
|
|
14986
14979
|
buildTableRows(steps) {
|
|
14987
|
-
const languageCode =
|
|
14980
|
+
const languageCode = this.storeService.languageCode();
|
|
14988
14981
|
const rows = [];
|
|
14989
14982
|
// Collect all unique property keys
|
|
14990
14983
|
const allProperties = new Set();
|
|
@@ -15075,7 +15068,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
15075
15068
|
*/
|
|
15076
15069
|
class ChartDataService {
|
|
15077
15070
|
http = inject(LimitedHttpService);
|
|
15078
|
-
transloco = inject(TranslocoService);
|
|
15079
15071
|
itemStore = inject(DashboardItemStoreService);
|
|
15080
15072
|
// URL Configuration from localStorage
|
|
15081
15073
|
urlPrefix = '';
|
|
@@ -15471,12 +15463,6 @@ class ChartDataService {
|
|
|
15471
15463
|
console.warn(`Unknown handler function: ${handlerKey}`);
|
|
15472
15464
|
return this.createPassthroughResult(data, config);
|
|
15473
15465
|
}
|
|
15474
|
-
/**
|
|
15475
|
-
* Get language code
|
|
15476
|
-
*/
|
|
15477
|
-
getLanguageCode() {
|
|
15478
|
-
return (this.transloco.getActiveLang() || localStorage.getItem('langCode') || 'en');
|
|
15479
|
-
}
|
|
15480
15466
|
/**
|
|
15481
15467
|
* Trigger refresh for a specific item
|
|
15482
15468
|
*/
|
|
@@ -18791,8 +18777,8 @@ function isMobilePlatform() {
|
|
|
18791
18777
|
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
|
|
18792
18778
|
}
|
|
18793
18779
|
class EntityPreviewCardComponent {
|
|
18794
|
-
|
|
18795
|
-
|
|
18780
|
+
itemStoreService = inject(DashboardItemStoreService);
|
|
18781
|
+
dashboardStoreService = inject(DashboardStoreService);
|
|
18796
18782
|
subscription = new Subscription();
|
|
18797
18783
|
/** Dashboard ID for this card */
|
|
18798
18784
|
dashboardId = input.required(...(ngDevMode ? [{ debugName: "dashboardId" }] : /* istanbul ignore next */ []));
|
|
@@ -18802,7 +18788,7 @@ class EntityPreviewCardComponent {
|
|
|
18802
18788
|
props = signal([], ...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
|
|
18803
18789
|
/** Card title */
|
|
18804
18790
|
title = computed(() => {
|
|
18805
|
-
const languageCode = this.
|
|
18791
|
+
const languageCode = this.dashboardStoreService.languageCode();
|
|
18806
18792
|
return this.configurationItem()?.clientConfig?.title?.[languageCode] || '';
|
|
18807
18793
|
}, ...(ngDevMode ? [{ debugName: "title" }] : /* istanbul ignore next */ []));
|
|
18808
18794
|
ngOnInit() {
|
|
@@ -18816,13 +18802,13 @@ class EntityPreviewCardComponent {
|
|
|
18816
18802
|
*/
|
|
18817
18803
|
subscribeToStore(dashboardId) {
|
|
18818
18804
|
// Subscribe to ConfigurationItem
|
|
18819
|
-
this.subscription.add(this.
|
|
18805
|
+
this.subscription.add(this.itemStoreService
|
|
18820
18806
|
.selectItemProperty$(dashboardId, 'ConfigurationItem')
|
|
18821
18807
|
.subscribe((config) => {
|
|
18822
18808
|
this.configurationItem.set(config || null);
|
|
18823
18809
|
}));
|
|
18824
18810
|
// Subscribe to DataHandled
|
|
18825
|
-
this.subscription.add(this.
|
|
18811
|
+
this.subscription.add(this.itemStoreService
|
|
18826
18812
|
.selectItemProperty$(dashboardId, 'DataHandled')
|
|
18827
18813
|
.subscribe((data) => {
|
|
18828
18814
|
const values = data?.values;
|
|
@@ -18857,12 +18843,6 @@ class EntityPreviewCardComponent {
|
|
|
18857
18843
|
this.props.set(processedProps);
|
|
18858
18844
|
}));
|
|
18859
18845
|
}
|
|
18860
|
-
/**
|
|
18861
|
-
* Get current language code
|
|
18862
|
-
*/
|
|
18863
|
-
getLanguageCode() {
|
|
18864
|
-
return (this.transloco.getActiveLang() || localStorage.getItem('langCode') || 'en');
|
|
18865
|
-
}
|
|
18866
18846
|
normalizeEntityProperty(prop) {
|
|
18867
18847
|
const resolvedName = this.resolveEntityName(prop);
|
|
18868
18848
|
if (!resolvedName) {
|
|
@@ -18892,7 +18872,7 @@ class EntityPreviewCardComponent {
|
|
|
18892
18872
|
}
|
|
18893
18873
|
if (value && typeof value === 'object') {
|
|
18894
18874
|
const localized = value;
|
|
18895
|
-
const languageCode = this.
|
|
18875
|
+
const languageCode = this.dashboardStoreService.languageCode();
|
|
18896
18876
|
const candidate = localized[languageCode] ?? localized['en'] ?? localized['ar'];
|
|
18897
18877
|
if (typeof candidate === 'string') {
|
|
18898
18878
|
return candidate.trim();
|
|
@@ -21509,5 +21489,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.8", ngImpor
|
|
|
21509
21489
|
* Generated bundle index. Do not edit.
|
|
21510
21490
|
*/
|
|
21511
21491
|
|
|
21512
|
-
export { ActionsSettings, BarChartHandler, BarControlUi, CHART_TYPES, CardContentComponent, CardFilterComponent, CardInfoComponent, ChartCardComponent, ChartDataService, ChartSettingsDrawer, ChartViewer, ComparisonChartHandler, DashboardBuilder, DashboardBuilderService, DashboardItem, DashboardItemStoreService, DashboardList, DashboardStoreService, DashboardViewer, DataSourceSettings, DefaultControlUi, DisplaySettings, DynamicFiltersComponent, DynamicFiltersConfig, EChartComponent, PropertiesCardComponent as EntitiesPreviewCardComponent, EntityInfoComponent, EntityPreviewCardComponent, FilterByGroupPipe, GaugeChartHandler, GeneralSettings, GetChartActionsPipe, HTTPMethod, HeaderCardComponent, LevelCardHandler, LineChartHandler, ListStatisticCardComponent, ManageBreadcrumb, ManageFilterOnPage, ManageItem, ManageItemService, ManagePages, MapChartHandler, OverviewCardHandler, PhaseGateStepperHandler, PieChartHandler, PieControlUi, PropertiesCardComponent, RingGaugeChartHandler, SPlusChartHandler, SkeletonCardComponent, SnapshotHandler, SplitterChartHandler, StackBarChartHandler, StackBarControlUi, StaticFiltersComponent, StatisticCardComponent, TableCardComponent, TableViewHandler, TimelineHandler, TopbarCardComponent, addCommasToNumber, axisFormatters, cloneDeep$1 as cloneDeep, createAxisFormatter, createTooltipFormatter, dynamicReorder, dynamicTextReplace, formatCurrency, formatDate, formatNumber, formatPercentage, formatValue, formatWordsUnderBar, formatXAxis, generalConfiguration, getColorFromConditions,
|
|
21492
|
+
export { ActionsSettings, BarChartHandler, BarControlUi, CHART_TYPES, CardContentComponent, CardFilterComponent, CardInfoComponent, ChartCardComponent, ChartDataService, ChartSettingsDrawer, ChartViewer, ComparisonChartHandler, DashboardBuilder, DashboardBuilderService, DashboardItem, DashboardItemStoreService, DashboardList, DashboardStoreService, DashboardViewer, DataSourceSettings, DefaultControlUi, DisplaySettings, DynamicFiltersComponent, DynamicFiltersConfig, EChartComponent, PropertiesCardComponent as EntitiesPreviewCardComponent, EntityInfoComponent, EntityPreviewCardComponent, FilterByGroupPipe, GaugeChartHandler, GeneralSettings, GetChartActionsPipe, HTTPMethod, HeaderCardComponent, LevelCardHandler, LineChartHandler, ListStatisticCardComponent, ManageBreadcrumb, ManageFilterOnPage, ManageItem, ManageItemService, ManagePages, MapChartHandler, OverviewCardHandler, PhaseGateStepperHandler, PieChartHandler, PieControlUi, PropertiesCardComponent, RingGaugeChartHandler, SPlusChartHandler, SkeletonCardComponent, SnapshotHandler, SplitterChartHandler, StackBarChartHandler, StackBarControlUi, StaticFiltersComponent, StatisticCardComponent, TableCardComponent, TableViewHandler, TimelineHandler, TopbarCardComponent, addCommasToNumber, axisFormatters, cloneDeep$1 as cloneDeep, createAxisFormatter, createTooltipFormatter, dynamicReorder, dynamicTextReplace, formatCurrency, formatDate, formatNumber, formatPercentage, formatValue, formatWordsUnderBar, formatXAxis, generalConfiguration, getColorFromConditions, getLocalizedTitle, getNestedData, groupDatesByYearAndMonth, handleFilterForCard, handleFilterForSnapshot, handleFiltersForCustom, isMobilePlatform$1 as isMobilePlatform, sortChartData, sortDataTableView, switchAllKeysSmall$1 as switchAllKeysSmall, switchAllKeysToLower };
|
|
21513
21493
|
//# sourceMappingURL=masterteam-dashboard-builder.mjs.map
|