@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 == 'ltr' ? 'ar' :
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('default', {
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('default', {
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 = getLanguageCode();
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 ? formatNumber(total, clientConfig?.['format']) : '';
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 || borderRadius === null || borderRadius === true) {
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 = getLanguageCode();
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 = getLanguageCode();
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 || borderRadius === null || borderRadius === true) {
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 = getLanguageCode();
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 = generalConfiguration?.fontConfig?.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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 ? formatNumber(params.value, format) : '';
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 = getLanguageCode();
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 ? formatValue(value, clientConfig['format']) : '';
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}&nbsp;&nbsp;${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 = getLanguageCode();
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}&nbsp;&nbsp;${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 = getLanguageCode();
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}&nbsp;&nbsp;${formatValue(param.value, config.clientConfig?.['format'])}<br/>`
12770
- : `${param.marker} ${param.seriesName} ${formatValue(param.value, config.clientConfig?.['format'])}<br/>`;
12760
+ ? `${param.marker} ${param.seriesName}&nbsp;&nbsp;${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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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 = getLanguageCode();
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
- storeService = inject(DashboardItemStoreService);
18795
- transloco = inject(TranslocoService);
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.getLanguageCode();
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.storeService
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.storeService
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.getLanguageCode();
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, getLanguageCode, getLocalizedTitle, getNestedData, groupDatesByYearAndMonth, handleFilterForCard, handleFilterForSnapshot, handleFiltersForCustom, isMobilePlatform$1 as isMobilePlatform, sortChartData, sortDataTableView, switchAllKeysSmall$1 as switchAllKeysSmall, switchAllKeysToLower };
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