@eric-emg/symphiq-components 1.2.546 → 1.2.549

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.
@@ -175,16 +175,11 @@ class ModalService {
175
175
  this.modalState.next(newState);
176
176
  }
177
177
  openMetricModal(metric, charts = [], previousState, expandedSection) {
178
- console.log('[ModalService.openMetricModal] Called with metric:', metric?.metric);
179
- console.log('[ModalService.openMetricModal] Charts count:', charts.length);
180
- console.log('[ModalService.openMetricModal] Chart IDs:', charts.map(c => c.performanceItemId));
181
178
  const prevStack = previousState?.navigationStack || [];
182
179
  const navigationStack = previousState ? [...prevStack, previousState] : [];
183
180
  const openedFromMainBody = !previousState;
184
181
  const newState = { type: 'metric', data: metric, charts, previousState: previousState || null, expandedSection, navigationStack, openedFromMainBody };
185
- console.log('[ModalService.openMetricModal] Setting modal state with charts:', newState.charts.length);
186
182
  this.modalState.next(newState);
187
- console.log('[ModalService.openMetricModal] Modal state value after next, charts count:', this.modalState.value?.charts?.length);
188
183
  }
189
184
  openChartModal(chart, previousState) {
190
185
  const navigationStack = previousState ? [...(previousState.navigationStack || []), previousState] : [];
@@ -1938,10 +1933,6 @@ class HeaderScrollService {
1938
1933
  };
1939
1934
  }
1940
1935
  log(message, data) {
1941
- if (this.DEBUG) {
1942
- const timestamp = new Date().toISOString().split('T')[1];
1943
- console.log(`[HeaderScroll ${timestamp}] ${message}`, data ?? '');
1944
- }
1945
1936
  }
1946
1937
  configure(config) {
1947
1938
  this.config = {
@@ -3518,7 +3509,6 @@ class DataLoaderService {
3518
3509
  const url = `${this.baseUrl()}/${key}.json`;
3519
3510
  if (!this.cache.has(key)) {
3520
3511
  this.cache.set(key, this.http.get(url).pipe(shareReplay$1(1), catchError$1(err => {
3521
- console.error(`Failed to load ${key}:`, err);
3522
3512
  this.cache.delete(key);
3523
3513
  throw err;
3524
3514
  })));
@@ -8520,14 +8510,6 @@ class MetricCardComponent {
8520
8510
  }
8521
8511
  });
8522
8512
  });
8523
- effect(() => {
8524
- const metric = this.metric();
8525
- const chartsInput = this.charts();
8526
- const allChartsInput = this.allCharts();
8527
- console.log('[MetricCard] Metric:', metric.metric);
8528
- console.log('[MetricCard] charts() count:', chartsInput.length, 'IDs:', chartsInput.map(c => c.performanceItemId));
8529
- console.log('[MetricCard] allCharts() count:', allChartsInput.length);
8530
- });
8531
8513
  }
8532
8514
  animateValue(target) {
8533
8515
  if (this.animationFrame !== null) {
@@ -16616,14 +16598,11 @@ class ModalComponent {
16616
16598
  this.modalService.modalState$
16617
16599
  .pipe(takeUntilDestroyed())
16618
16600
  .subscribe(state => {
16619
- console.log('[FunnelAnalysisModal] Received modal state:', state.type, state);
16620
16601
  if (state.type === 'visualization') {
16621
- console.log('[FunnelAnalysisModal] Skipping visualization type');
16622
16602
  return;
16623
16603
  }
16624
16604
  // Delegate business insight types to Profile Analysis Modal and item-detail to Business Analysis Modal
16625
16605
  if (state.type === 'business-insight-detail' || state.type === 'goal-business-insights-list' || state.type === 'item-detail') {
16626
- console.log('[FunnelAnalysisModal] Delegating to other modal, clearing state');
16627
16606
  this.modalStateSignal.set({
16628
16607
  type: null,
16629
16608
  data: null,
@@ -16656,9 +16635,6 @@ class ModalComponent {
16656
16635
  chainDepth++;
16657
16636
  current = current.previousState;
16658
16637
  }
16659
- console.log('[FunnelAnalysisModal] Setting modalStateSignal with type:', state.type);
16660
- console.log('[FunnelAnalysisModal] Charts received from state:', state.charts?.length ?? 0, 'charts');
16661
- console.log('[FunnelAnalysisModal] Chart IDs:', state.charts?.map((c) => c.performanceItemId));
16662
16638
  this.modalStateSignal.set({
16663
16639
  type: state.type,
16664
16640
  data: data,
@@ -16668,7 +16644,6 @@ class ModalComponent {
16668
16644
  expandedSection: state.expandedSection,
16669
16645
  navigationStack: state.navigationStack || []
16670
16646
  });
16671
- console.log('[FunnelAnalysisModal] isOpen() should now be:', state.type !== null);
16672
16647
  });
16673
16648
  // Effect to trigger animations when metrics list modal opens
16674
16649
  effect(() => {
@@ -43286,7 +43261,6 @@ class ProfileAnalysisModalComponent {
43286
43261
  this.modalService.modalState$
43287
43262
  .pipe(takeUntilDestroyed())
43288
43263
  .subscribe(state => {
43289
- console.log('[ProfileAnalysisModal] Received modal state:', state.type, state);
43290
43264
  // Types that this modal handles (only update previousState for these)
43291
43265
  const handledTypes = [
43292
43266
  'goal-detail', 'goal-objectives', 'objective-strategies', 'strategy-recommendations',
@@ -43577,14 +43551,12 @@ class ProfileAnalysisModalComponent {
43577
43551
  this.currentCharts.set(state.charts || []);
43578
43552
  }
43579
43553
  else if (state.type === 'metric' && state.data) {
43580
- console.log('[ProfileAnalysisModal] Handling metric type, opening modal');
43581
43554
  const metric = state.data;
43582
43555
  this.modalData.set(metric);
43583
43556
  const formattedName = metric.metric ? this.metricFormatter.formatMetricName(metric.metric) : 'Metric Details';
43584
43557
  this.modalTitle.set(formattedName);
43585
43558
  this.modalType.set('metric');
43586
43559
  this.isOpen.set(true);
43587
- console.log('[ProfileAnalysisModal] isOpen set to true, modalType:', this.modalType());
43588
43560
  const stack = state.navigationStack || [];
43589
43561
  this.navigationStack.set(stack);
43590
43562
  this.currentCharts.set(state.charts || []);
@@ -58784,7 +58756,7 @@ class ProgressToTargetChartComponent {
58784
58756
  buildChart(chartData) {
58785
58757
  if (!this.root || !this.chart || !this.xAxis || !this.yAxis)
58786
58758
  return;
58787
- const { currentValue, paceValue, targetValue, status } = chartData;
58759
+ const { currentValue, paceValue, targetValue, status, pacingPercentage } = chartData;
58788
58760
  const xAxisMax = this.calculateXAxisMax(paceValue, targetValue, currentValue);
58789
58761
  this.xAxis.set('max', xAxisMax);
58790
58762
  const categoryDataItems = [
@@ -58795,8 +58767,8 @@ class ProgressToTargetChartComponent {
58795
58767
  }
58796
58768
  ];
58797
58769
  this.yAxis.data.setAll(categoryDataItems);
58798
- const paceColors = this.getPaceColors(status);
58799
- const currentColors = this.getCurrentColors(status);
58770
+ const paceColors = this.getPaceColors(status, pacingPercentage);
58771
+ const currentColors = this.getCurrentColors(status, pacingPercentage);
58800
58772
  const paceSeries = this.chart.series.push(ColumnSeries.new(this.root, {
58801
58773
  name: 'Pace',
58802
58774
  xAxis: this.xAxis,
@@ -58908,7 +58880,10 @@ class ProgressToTargetChartComponent {
58908
58880
  }
58909
58881
  return max * 1.1;
58910
58882
  }
58911
- getPaceColors(status) {
58883
+ getPaceColors(status, pacingPercentage) {
58884
+ if (pacingPercentage !== undefined && pacingPercentage < 0) {
58885
+ return this.getNegativePacingColors(pacingPercentage);
58886
+ }
58912
58887
  switch (status) {
58913
58888
  case 'ahead':
58914
58889
  return {
@@ -58928,7 +58903,10 @@ class ProgressToTargetChartComponent {
58928
58903
  };
58929
58904
  }
58930
58905
  }
58931
- getCurrentColors(status) {
58906
+ getCurrentColors(status, pacingPercentage) {
58907
+ if (pacingPercentage !== undefined && pacingPercentage < 0) {
58908
+ return this.getNegativePacingCurrentColors(pacingPercentage);
58909
+ }
58932
58910
  switch (status) {
58933
58911
  case 'ahead':
58934
58912
  return {
@@ -58948,6 +58926,60 @@ class ProgressToTargetChartComponent {
58948
58926
  };
58949
58927
  }
58950
58928
  }
58929
+ getNegativePacingColors(pacingPercentage) {
58930
+ const absPercent = Math.abs(pacingPercentage);
58931
+ if (absPercent < 2) {
58932
+ return {
58933
+ color1: color(0xFACC15),
58934
+ color2: color(0xEAB308)
58935
+ };
58936
+ }
58937
+ else if (absPercent < 5) {
58938
+ return {
58939
+ color1: color(0xFB923C),
58940
+ color2: color(0xF97316)
58941
+ };
58942
+ }
58943
+ else if (absPercent < 10) {
58944
+ return {
58945
+ color1: color(0xF87171),
58946
+ color2: color(0xEF4444)
58947
+ };
58948
+ }
58949
+ else {
58950
+ return {
58951
+ color1: color(0xF04438),
58952
+ color2: color(0xdc2626)
58953
+ };
58954
+ }
58955
+ }
58956
+ getNegativePacingCurrentColors(pacingPercentage) {
58957
+ const absPercent = Math.abs(pacingPercentage);
58958
+ if (absPercent < 2) {
58959
+ return {
58960
+ color1: color(0xFDE047),
58961
+ color2: color(0xFACC15)
58962
+ };
58963
+ }
58964
+ else if (absPercent < 5) {
58965
+ return {
58966
+ color1: color(0xFDBA74),
58967
+ color2: color(0xFB923C)
58968
+ };
58969
+ }
58970
+ else if (absPercent < 10) {
58971
+ return {
58972
+ color1: color(0xFCA5A5),
58973
+ color2: color(0xF87171)
58974
+ };
58975
+ }
58976
+ else {
58977
+ return {
58978
+ color1: color(0xF86C59),
58979
+ color2: color(0xE65143)
58980
+ };
58981
+ }
58982
+ }
58951
58983
  static { this.ɵfac = function ProgressToTargetChartComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ProgressToTargetChartComponent)(); }; }
58952
58984
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProgressToTargetChartComponent, selectors: [["symphiq-progress-to-target-chart"]], viewQuery: function ProgressToTargetChartComponent_Query(rf, ctx) { if (rf & 1) {
58953
58985
  i0.ɵɵviewQuery(_c0$D, 7);
@@ -58962,16 +58994,16 @@ class ProgressToTargetChartComponent {
58962
58994
  }
58963
58995
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ProgressToTargetChartComponent, [{
58964
58996
  type: Component,
58965
- args: [{ selector: 'symphiq-progress-to-target-chart', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
58966
- <div class="progress-chart-container">
58967
- <div #chartdiv class="chart" style="width: 100%; height: 160px;"></div>
58968
- </div>
58997
+ args: [{ selector: 'symphiq-progress-to-target-chart', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
58998
+ <div class="progress-chart-container">
58999
+ <div #chartdiv class="chart" style="width: 100%; height: 160px;"></div>
59000
+ </div>
58969
59001
  `, styles: [".progress-chart-container{width:100%;margin-top:50px;overflow:visible}.chart{overflow:visible}\n"] }]
58970
59002
  }], () => [], { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], chartDiv: [{
58971
59003
  type: ViewChild,
58972
59004
  args: ['chartdiv', { static: true }]
58973
59005
  }] }); })();
58974
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProgressToTargetChartComponent, { className: "ProgressToTargetChartComponent", filePath: "lib/components/revenue-calculator-dashboard/progress-to-target-chart.component.ts", lineNumber: 66 }); })();
59006
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProgressToTargetChartComponent, { className: "ProgressToTargetChartComponent", filePath: "lib/components/revenue-calculator-dashboard/progress-to-target-chart.component.ts", lineNumber: 67 }); })();
58975
59007
 
58976
59008
  const _forTrack0$z = ($index, $item) => $item.metric;
58977
59009
  function MetricReportModalComponent_Conditional_0_Conditional_9_Template(rf, ctx) { if (rf & 1) {
@@ -59627,7 +59659,8 @@ class MetricReportModalComponent {
59627
59659
  currentValue: this.ytdValue(),
59628
59660
  paceValue: pacing.projectedValue,
59629
59661
  targetValue: metric.targetValue,
59630
- status: pacing.status
59662
+ status: pacing.status,
59663
+ pacingPercentage: pacing.pacingPercentage
59631
59664
  };
59632
59665
  }, ...(ngDevMode ? [{ debugName: "progressToTargetData" }] : []));
59633
59666
  this.chartLegendDescription = computed(() => {
@@ -69723,7 +69756,7 @@ function MetricExecutiveSummaryComponent_Conditional_14_Template(rf, ctx) { if (
69723
69756
  i0.ɵɵadvance(2);
69724
69757
  i0.ɵɵproperty("ngClass", ctx_r0.metricValueClasses());
69725
69758
  i0.ɵɵadvance();
69726
- i0.ɵɵtextInterpolate1(" ", ctx_r0.summary().currentValue, " ");
69759
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatNumber(ctx_r0.summary().currentValue), " ");
69727
69760
  i0.ɵɵadvance();
69728
69761
  i0.ɵɵconditional(ctx_r0.summary().yoyChange ? 7 : -1);
69729
69762
  } }
@@ -69746,7 +69779,7 @@ function MetricExecutiveSummaryComponent_Conditional_15_Template(rf, ctx) { if (
69746
69779
  i0.ɵɵadvance(2);
69747
69780
  i0.ɵɵproperty("ngClass", ctx_r0.metricValueClasses());
69748
69781
  i0.ɵɵadvance();
69749
- i0.ɵɵtextInterpolate1(" ", ctx_r0.summary().targetValue, " ");
69782
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatNumber(ctx_r0.summary().targetValue), " ");
69750
69783
  } }
69751
69784
  function MetricExecutiveSummaryComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
69752
69785
  i0.ɵɵelementStart(0, "div", 12)(1, "div", 22);
@@ -69767,13 +69800,13 @@ function MetricExecutiveSummaryComponent_Conditional_16_Template(rf, ctx) { if (
69767
69800
  i0.ɵɵadvance(2);
69768
69801
  i0.ɵɵproperty("ngClass", ctx_r0.metricValueClasses());
69769
69802
  i0.ɵɵadvance();
69770
- i0.ɵɵtextInterpolate1(" ", ctx_r0.projectedValue(), " ");
69803
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatNumber(ctx_r0.projectedValue()), " ");
69771
69804
  } }
69772
69805
  function MetricExecutiveSummaryComponent_Conditional_17_Template(rf, ctx) { if (rf & 1) {
69773
69806
  i0.ɵɵelementStart(0, "div", 12)(1, "div", 22);
69774
69807
  i0.ɵɵelement(2, "symphiq-icon", 23);
69775
69808
  i0.ɵɵelementStart(3, "span", 24);
69776
- i0.ɵɵtext(4, " Pacing ");
69809
+ i0.ɵɵtext(4, " Pacing vs Target ");
69777
69810
  i0.ɵɵelementEnd()();
69778
69811
  i0.ɵɵelementStart(5, "div", 28);
69779
69812
  i0.ɵɵtext(6);
@@ -69826,7 +69859,7 @@ function MetricExecutiveSummaryComponent_Conditional_18_Template(rf, ctx) { if (
69826
69859
  i0.ɵɵadvance();
69827
69860
  i0.ɵɵconditional(ctx_r0.summary().metricHealthDescription ? 7 : -1);
69828
69861
  } }
69829
- function MetricExecutiveSummaryComponent_Conditional_30_Conditional_4_Template(rf, ctx) { if (rf & 1) {
69862
+ function MetricExecutiveSummaryComponent_Conditional_29_Conditional_4_Template(rf, ctx) { if (rf & 1) {
69830
69863
  i0.ɵɵelementStart(0, "div", 32);
69831
69864
  i0.ɵɵelement(1, "symphiq-napkin-visual-placeholder", 35);
69832
69865
  i0.ɵɵelementEnd();
@@ -69835,12 +69868,12 @@ function MetricExecutiveSummaryComponent_Conditional_30_Conditional_4_Template(r
69835
69868
  i0.ɵɵadvance();
69836
69869
  i0.ɵɵproperty("visual", ctx_r0.summary().napkinVisual)("viewMode", ctx_r0.viewMode());
69837
69870
  } }
69838
- function MetricExecutiveSummaryComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
69871
+ function MetricExecutiveSummaryComponent_Conditional_29_Template(rf, ctx) { if (rf & 1) {
69839
69872
  i0.ɵɵelementStart(0, "div", 19)(1, "h3", 30);
69840
69873
  i0.ɵɵtext(2, " Analysis Narrative ");
69841
69874
  i0.ɵɵelementEnd();
69842
69875
  i0.ɵɵelementStart(3, "div", 31);
69843
- i0.ɵɵconditionalCreate(4, MetricExecutiveSummaryComponent_Conditional_30_Conditional_4_Template, 2, 2, "div", 32);
69876
+ i0.ɵɵconditionalCreate(4, MetricExecutiveSummaryComponent_Conditional_29_Conditional_4_Template, 2, 2, "div", 32);
69844
69877
  i0.ɵɵelementStart(5, "p", 33);
69845
69878
  i0.ɵɵtext(6);
69846
69879
  i0.ɵɵelementEnd();
@@ -69859,7 +69892,7 @@ function MetricExecutiveSummaryComponent_Conditional_30_Template(rf, ctx) { if (
69859
69892
  i0.ɵɵadvance();
69860
69893
  i0.ɵɵtextInterpolate1(" ", ctx_r0.summary().narrative, " ");
69861
69894
  } }
69862
- function MetricExecutiveSummaryComponent_Conditional_31_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
69895
+ function MetricExecutiveSummaryComponent_Conditional_30_For_5_Conditional_8_Template(rf, ctx) { if (rf & 1) {
69863
69896
  i0.ɵɵelementStart(0, "div", 44)(1, "div", 45);
69864
69897
  i0.ɵɵelement(2, "symphiq-icon", 46);
69865
69898
  i0.ɵɵelementStart(3, "div")(4, "span", 47);
@@ -69881,10 +69914,10 @@ function MetricExecutiveSummaryComponent_Conditional_31_For_5_Conditional_8_Temp
69881
69914
  i0.ɵɵadvance();
69882
69915
  i0.ɵɵtextInterpolate1(" ", priority_r4.expectedImpact, " ");
69883
69916
  } }
69884
- function MetricExecutiveSummaryComponent_Conditional_31_For_5_Template(rf, ctx) { if (rf & 1) {
69917
+ function MetricExecutiveSummaryComponent_Conditional_30_For_5_Template(rf, ctx) { if (rf & 1) {
69885
69918
  const _r2 = i0.ɵɵgetCurrentView();
69886
69919
  i0.ɵɵelementStart(0, "button", 39);
69887
- i0.ɵɵlistener("click", function MetricExecutiveSummaryComponent_Conditional_31_For_5_Template_button_click_0_listener() { const ctx_r2 = i0.ɵɵrestoreView(_r2); const priority_r4 = ctx_r2.$implicit; const $index_r5 = ctx_r2.$index; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.priorityDetailClick.emit({ priority: priority_r4, index: $index_r5 })); });
69920
+ i0.ɵɵlistener("click", function MetricExecutiveSummaryComponent_Conditional_30_For_5_Template_button_click_0_listener() { const ctx_r2 = i0.ɵɵrestoreView(_r2); const priority_r4 = ctx_r2.$implicit; const $index_r5 = ctx_r2.$index; const ctx_r0 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r0.priorityDetailClick.emit({ priority: priority_r4, index: $index_r5 })); });
69888
69921
  i0.ɵɵelementStart(1, "div", 40)(2, "span", 41);
69889
69922
  i0.ɵɵtext(3);
69890
69923
  i0.ɵɵelementEnd();
@@ -69894,7 +69927,7 @@ function MetricExecutiveSummaryComponent_Conditional_31_For_5_Template(rf, ctx)
69894
69927
  i0.ɵɵelementStart(6, "p", 43);
69895
69928
  i0.ɵɵtext(7);
69896
69929
  i0.ɵɵelementEnd();
69897
- i0.ɵɵconditionalCreate(8, MetricExecutiveSummaryComponent_Conditional_31_For_5_Conditional_8_Template, 8, 8, "div", 44);
69930
+ i0.ɵɵconditionalCreate(8, MetricExecutiveSummaryComponent_Conditional_30_For_5_Conditional_8_Template, 8, 8, "div", 44);
69898
69931
  i0.ɵɵelementEnd();
69899
69932
  } if (rf & 2) {
69900
69933
  const priority_r4 = ctx.$implicit;
@@ -69916,12 +69949,12 @@ function MetricExecutiveSummaryComponent_Conditional_31_For_5_Template(rf, ctx)
69916
69949
  i0.ɵɵadvance();
69917
69950
  i0.ɵɵconditional(priority_r4.expectedImpact ? 8 : -1);
69918
69951
  } }
69919
- function MetricExecutiveSummaryComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
69952
+ function MetricExecutiveSummaryComponent_Conditional_30_Template(rf, ctx) { if (rf & 1) {
69920
69953
  i0.ɵɵelementStart(0, "div", 20)(1, "h3", 36);
69921
69954
  i0.ɵɵtext(2, "Top Priorities");
69922
69955
  i0.ɵɵelementEnd();
69923
69956
  i0.ɵɵelementStart(3, "div", 37);
69924
- i0.ɵɵrepeaterCreate(4, MetricExecutiveSummaryComponent_Conditional_31_For_5_Template, 9, 8, "button", 38, i0.ɵɵrepeaterTrackByIndex);
69957
+ i0.ɵɵrepeaterCreate(4, MetricExecutiveSummaryComponent_Conditional_30_For_5_Template, 9, 8, "button", 38, i0.ɵɵrepeaterTrackByIndex);
69925
69958
  i0.ɵɵelementEnd()();
69926
69959
  } if (rf & 2) {
69927
69960
  const ctx_r0 = i0.ɵɵnextContext();
@@ -69930,7 +69963,7 @@ function MetricExecutiveSummaryComponent_Conditional_31_Template(rf, ctx) { if (
69930
69963
  i0.ɵɵadvance(3);
69931
69964
  i0.ɵɵrepeater(ctx_r0.summary().topPriorities);
69932
69965
  } }
69933
- function MetricExecutiveSummaryComponent_Conditional_32_For_5_Conditional_12_Template(rf, ctx) { if (rf & 1) {
69966
+ function MetricExecutiveSummaryComponent_Conditional_31_For_5_Conditional_12_Template(rf, ctx) { if (rf & 1) {
69934
69967
  i0.ɵɵelementStart(0, "div", 57);
69935
69968
  i0.ɵɵelement(1, "symphiq-icon", 15);
69936
69969
  i0.ɵɵelementStart(2, "span");
@@ -69945,7 +69978,7 @@ function MetricExecutiveSummaryComponent_Conditional_32_For_5_Conditional_12_Tem
69945
69978
  i0.ɵɵadvance(2);
69946
69979
  i0.ɵɵtextInterpolate(win_r6.estimatedTimeframe);
69947
69980
  } }
69948
- function MetricExecutiveSummaryComponent_Conditional_32_For_5_Conditional_13_Template(rf, ctx) { if (rf & 1) {
69981
+ function MetricExecutiveSummaryComponent_Conditional_31_For_5_Conditional_13_Template(rf, ctx) { if (rf & 1) {
69949
69982
  i0.ɵɵelementStart(0, "div", 58)(1, "h4", 24);
69950
69983
  i0.ɵɵtext(2, " Related Goal ");
69951
69984
  i0.ɵɵelementEnd();
@@ -69959,7 +69992,7 @@ function MetricExecutiveSummaryComponent_Conditional_32_For_5_Conditional_13_Tem
69959
69992
  i0.ɵɵadvance(2);
69960
69993
  i0.ɵɵproperty("relatedGoalIds", i0.ɵɵpureFunction1(4, _c9, win_r6.relatedGoalId))("allGoals", ctx_r0.allGoals() || i0.ɵɵpureFunction0(6, _c10))("viewMode", ctx_r0.viewMode());
69961
69994
  } }
69962
- function MetricExecutiveSummaryComponent_Conditional_32_For_5_Template(rf, ctx) { if (rf & 1) {
69995
+ function MetricExecutiveSummaryComponent_Conditional_31_For_5_Template(rf, ctx) { if (rf & 1) {
69963
69996
  i0.ɵɵelementStart(0, "div", 51)(1, "div", 52)(2, "div", 53)(3, "span", 41);
69964
69997
  i0.ɵɵtext(4);
69965
69998
  i0.ɵɵelementEnd();
@@ -69972,8 +70005,8 @@ function MetricExecutiveSummaryComponent_Conditional_32_For_5_Template(rf, ctx)
69972
70005
  i0.ɵɵelementStart(10, "span", 56);
69973
70006
  i0.ɵɵtext(11);
69974
70007
  i0.ɵɵelementEnd()();
69975
- i0.ɵɵconditionalCreate(12, MetricExecutiveSummaryComponent_Conditional_32_For_5_Conditional_12_Template, 4, 5, "div", 57);
69976
- i0.ɵɵconditionalCreate(13, MetricExecutiveSummaryComponent_Conditional_32_For_5_Conditional_13_Template, 4, 7, "div", 58);
70008
+ i0.ɵɵconditionalCreate(12, MetricExecutiveSummaryComponent_Conditional_31_For_5_Conditional_12_Template, 4, 5, "div", 57);
70009
+ i0.ɵɵconditionalCreate(13, MetricExecutiveSummaryComponent_Conditional_31_For_5_Conditional_13_Template, 4, 7, "div", 58);
69977
70010
  i0.ɵɵelementEnd()();
69978
70011
  } if (rf & 2) {
69979
70012
  const win_r6 = ctx.$implicit;
@@ -70001,12 +70034,12 @@ function MetricExecutiveSummaryComponent_Conditional_32_For_5_Template(rf, ctx)
70001
70034
  i0.ɵɵadvance();
70002
70035
  i0.ɵɵconditional(win_r6.relatedGoalId && ctx_r0.allGoals() ? 13 : -1);
70003
70036
  } }
70004
- function MetricExecutiveSummaryComponent_Conditional_32_Template(rf, ctx) { if (rf & 1) {
70037
+ function MetricExecutiveSummaryComponent_Conditional_31_Template(rf, ctx) { if (rf & 1) {
70005
70038
  i0.ɵɵelementStart(0, "div", 21)(1, "h3", 49);
70006
70039
  i0.ɵɵtext(2, "Quick Wins");
70007
70040
  i0.ɵɵelementEnd();
70008
70041
  i0.ɵɵelementStart(3, "div", 50);
70009
- i0.ɵɵrepeaterCreate(4, MetricExecutiveSummaryComponent_Conditional_32_For_5_Template, 14, 11, "div", 51, i0.ɵɵrepeaterTrackByIndex);
70042
+ i0.ɵɵrepeaterCreate(4, MetricExecutiveSummaryComponent_Conditional_31_For_5_Template, 14, 11, "div", 51, i0.ɵɵrepeaterTrackByIndex);
70010
70043
  i0.ɵɵelementEnd()();
70011
70044
  } if (rf & 2) {
70012
70045
  const ctx_r0 = i0.ɵɵnextContext();
@@ -70118,16 +70151,11 @@ class MetricExecutiveSummaryComponent {
70118
70151
  : 'bg-blue-100 text-blue-800', ...(ngDevMode ? [{ debugName: "numberBadgeClasses" }] : []));
70119
70152
  this.quickWinTextClasses = computed(() => this.isDark() ? 'text-slate-100' : 'text-slate-900', ...(ngDevMode ? [{ debugName: "quickWinTextClasses" }] : []));
70120
70153
  this.metaTextClasses = computed(() => this.isDark() ? 'text-slate-400' : 'text-slate-600', ...(ngDevMode ? [{ debugName: "metaTextClasses" }] : []));
70121
- console.log('[MetricExecutiveSummary] Component constructed - button should be clickable!');
70122
70154
  }
70123
70155
  handleViewMetricDetailsClick() {
70124
- console.log('[MetricExecutiveSummary] View Metric Details button clicked!');
70125
- console.log('[MetricExecutiveSummary] viewMetricDetailsClick output exists:', !!this.viewMetricDetailsClick);
70126
70156
  this.viewMetricDetailsClick.emit();
70127
- console.log('[MetricExecutiveSummary] Event emitted');
70128
70157
  }
70129
70158
  handleViewReportClick() {
70130
- console.log('[MetricExecutiveSummary] View Report button clicked!');
70131
70159
  this.viewReportClick.emit();
70132
70160
  }
70133
70161
  getYoyIcon() {
@@ -70220,8 +70248,16 @@ class MetricExecutiveSummaryComponent {
70220
70248
  return '';
70221
70249
  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
70222
70250
  }
70251
+ formatNumber(value) {
70252
+ if (value === undefined || value === null || value === '')
70253
+ return '';
70254
+ const num = typeof value === 'string' ? parseFloat(value) : value;
70255
+ if (isNaN(num))
70256
+ return String(value);
70257
+ return num.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2 });
70258
+ }
70223
70259
  static { this.ɵfac = function MetricExecutiveSummaryComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MetricExecutiveSummaryComponent)(); }; }
70224
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MetricExecutiveSummaryComponent, selectors: [["symphiq-metric-executive-summary"]], inputs: { viewMode: [1, "viewMode"], summary: [1, "summary"], metricName: [1, "metricName"], allGoals: [1, "allGoals"] }, outputs: { topPrioritiesClick: "topPrioritiesClick", priorityDetailClick: "priorityDetailClick", viewMetricDetailsClick: "viewMetricDetailsClick", viewReportClick: "viewReportClick" }, decls: 33, vars: 24, consts: [["id", "section-metric-executive-summary", 1, "space-y-6", "scroll-mt-24"], [1, "rounded-2xl", "p-8", "shadow-xl", 3, "ngClass"], [1, "space-y-6"], [1, "flex", "items-start", "justify-between", "gap-4"], [1, "flex-1"], [1, "flex", "items-center", "gap-3", "mb-3"], [3, "icon", "size", "ngClass"], [1, "text-3xl", "font-bold", 3, "ngClass"], [1, "text-lg", "leading-relaxed", 3, "ngClass"], [3, "grade", "gradeRationale", "viewMode"], ["type", "button", 1, "w-full", "text-left", "cursor-pointer", "group", 3, "click"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "lg:grid-cols-4", "gap-4"], [1, "rounded-xl", "p-4", "transition-all", "duration-200", "group-hover:scale-[1.02]", "group-hover:shadow-lg", 3, "ngClass"], [1, "flex", "items-center", "justify-center", "mt-4"], [1, "inline-flex", "items-center", "gap-2", "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "duration-200", "group-hover:scale-105", 3, "ngClass"], ["size", "w-4 h-4", 3, "icon"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "px-4", "py-2.5", "rounded-lg", "font-medium", "text-sm", "transition-all", "duration-200", "hover:scale-105", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"], [1, "rounded-xl", "p-6", "mt-6", 3, "ngClass"], [1, "mt-6"], ["id", "quick-wins-section", 1, "mt-8", "scroll-mt-24"], [1, "flex", "items-center", "gap-2", "mb-2"], ["size", "w-4 h-4", 3, "icon", "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-2xl", "font-bold", 3, "ngClass"], [1, "flex", "items-center", "gap-1", "mt-2"], [1, "text-sm", "font-medium", 3, "ngClass"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "text-xs", "mt-1", "truncate", "max-w-full", "cursor-help", 3, "libSymphiqTooltip", "tooltipPosition", "ngClass"], [1, "text-lg", "font-semibold", "mb-3", 3, "ngClass"], [1, "relative"], [1, "mb-6", "lg:float-left", "lg:mr-6", "lg:mb-4", "lg:max-w-[66%]"], [1, "text-sm", "leading-relaxed", "whitespace-pre-line", 3, "ngClass"], [1, "clear-both"], [3, "visual", "viewMode"], [1, "text-xl", "font-bold", "mb-4", 3, "ngClass"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "gap-4"], ["type", "button", 1, "rounded-xl", "p-6", "text-left", "transition-all", "duration-200", "hover:scale-[1.02]", "active:scale-[0.98]", "cursor-pointer", 3, "ngClass"], ["type", "button", 1, "rounded-xl", "p-6", "text-left", "transition-all", "duration-200", "hover:scale-[1.02]", "active:scale-[0.98]", "cursor-pointer", 3, "click", "ngClass"], [1, "flex", "items-start", "gap-3", "mb-3"], [1, "flex-shrink-0", "w-8", "h-8", "rounded-full", "flex", "items-center", "justify-center", "text-sm", "font-bold", 3, "ngClass"], [1, "text-lg", "font-semibold", "flex-1", 3, "ngClass"], [1, "text-sm", "leading-relaxed", "mb-3", 3, "ngClass"], [1, "rounded-lg", "p-3", 3, "ngClass"], [1, "flex", "items-start", "gap-2"], ["size", "w-4 h-4", 1, "mt-0.5", 3, "icon", "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "block", "mb-1", 3, "ngClass"], [1, "text-xs", "leading-relaxed", 3, "ngClass"], [1, "text-xl", "font-bold", "mb-6", 3, "ngClass"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "gap-6"], [1, "rounded-xl", "p-6", "transition-all", "duration-300", 3, "ngClass"], [1, "space-y-4"], [1, "flex", "items-start", "gap-3"], [1, "font-semibold", "leading-tight", "flex-1", 3, "ngClass"], [1, "flex", "flex-wrap", "gap-2"], [1, "px-3", "py-1", "rounded-full", "text-xs", "font-semibold", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "text-sm", 3, "ngClass"], [1, "space-y-2"], [3, "relatedGoalIds", "allGoals", "viewMode"]], template: function MetricExecutiveSummaryComponent_Template(rf, ctx) { if (rf & 1) {
70260
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MetricExecutiveSummaryComponent, selectors: [["symphiq-metric-executive-summary"]], inputs: { viewMode: [1, "viewMode"], summary: [1, "summary"], metricName: [1, "metricName"], allGoals: [1, "allGoals"] }, outputs: { topPrioritiesClick: "topPrioritiesClick", priorityDetailClick: "priorityDetailClick", viewMetricDetailsClick: "viewMetricDetailsClick", viewReportClick: "viewReportClick" }, decls: 32, vars: 24, consts: [["id", "section-metric-executive-summary", 1, "space-y-6", "scroll-mt-24"], [1, "rounded-2xl", "p-8", "shadow-xl", 3, "ngClass"], [1, "space-y-6"], [1, "flex", "items-start", "justify-between", "gap-4"], [1, "flex-1"], [1, "flex", "items-center", "gap-3", "mb-3"], [3, "icon", "size", "ngClass"], [1, "text-3xl", "font-bold", 3, "ngClass"], [1, "text-lg", "leading-relaxed", 3, "ngClass"], [3, "grade", "gradeRationale", "viewMode"], ["type", "button", 1, "w-full", "text-left", "cursor-pointer", "group", 3, "click"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "lg:grid-cols-4", "gap-4"], [1, "rounded-xl", "p-4", "transition-all", "duration-200", "group-hover:scale-[1.02]", "group-hover:shadow-lg", 3, "ngClass"], [1, "flex", "flex-wrap", "items-center", "justify-center", "gap-3", "mt-4"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "px-4", "py-2.5", "rounded-lg", "text-sm", "font-semibold", "transition-all", "duration-200", "hover:scale-105", 3, "click", "ngClass"], ["size", "w-4 h-4", 3, "icon"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "px-4", "py-2.5", "rounded-lg", "font-medium", "text-sm", "transition-all", "duration-200", "hover:scale-105", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"], [1, "rounded-xl", "p-6", "mt-6", 3, "ngClass"], [1, "mt-6"], ["id", "quick-wins-section", 1, "mt-8", "scroll-mt-24"], [1, "flex", "items-center", "gap-2", "mb-2"], ["size", "w-4 h-4", 3, "icon", "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-2xl", "font-bold", 3, "ngClass"], [1, "flex", "items-center", "gap-1", "mt-2"], [1, "text-sm", "font-medium", 3, "ngClass"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "text-xs", "mt-1", "truncate", "max-w-full", "cursor-help", 3, "libSymphiqTooltip", "tooltipPosition", "ngClass"], [1, "text-lg", "font-semibold", "mb-3", 3, "ngClass"], [1, "relative"], [1, "mb-6", "lg:float-left", "lg:mr-6", "lg:mb-4", "lg:max-w-[66%]"], [1, "text-sm", "leading-relaxed", "whitespace-pre-line", 3, "ngClass"], [1, "clear-both"], [3, "visual", "viewMode"], [1, "text-xl", "font-bold", "mb-4", 3, "ngClass"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "gap-4"], ["type", "button", 1, "rounded-xl", "p-6", "text-left", "transition-all", "duration-200", "hover:scale-[1.02]", "active:scale-[0.98]", "cursor-pointer", 3, "ngClass"], ["type", "button", 1, "rounded-xl", "p-6", "text-left", "transition-all", "duration-200", "hover:scale-[1.02]", "active:scale-[0.98]", "cursor-pointer", 3, "click", "ngClass"], [1, "flex", "items-start", "gap-3", "mb-3"], [1, "flex-shrink-0", "w-8", "h-8", "rounded-full", "flex", "items-center", "justify-center", "text-sm", "font-bold", 3, "ngClass"], [1, "text-lg", "font-semibold", "flex-1", 3, "ngClass"], [1, "text-sm", "leading-relaxed", "mb-3", 3, "ngClass"], [1, "rounded-lg", "p-3", 3, "ngClass"], [1, "flex", "items-start", "gap-2"], ["size", "w-4 h-4", 1, "mt-0.5", 3, "icon", "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", "block", "mb-1", 3, "ngClass"], [1, "text-xs", "leading-relaxed", 3, "ngClass"], [1, "text-xl", "font-bold", "mb-6", 3, "ngClass"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "gap-6"], [1, "rounded-xl", "p-6", "transition-all", "duration-300", 3, "ngClass"], [1, "space-y-4"], [1, "flex", "items-start", "gap-3"], [1, "font-semibold", "leading-tight", "flex-1", 3, "ngClass"], [1, "flex", "flex-wrap", "gap-2"], [1, "px-3", "py-1", "rounded-full", "text-xs", "font-semibold", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "text-sm", 3, "ngClass"], [1, "space-y-2"], [3, "relatedGoalIds", "allGoals", "viewMode"]], template: function MetricExecutiveSummaryComponent_Template(rf, ctx) { if (rf & 1) {
70225
70261
  i0.ɵɵelementStart(0, "section", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3)(4, "div", 4)(5, "div", 5);
70226
70262
  i0.ɵɵelement(6, "symphiq-icon", 6);
70227
70263
  i0.ɵɵelementStart(7, "h2", 7);
@@ -70240,25 +70276,27 @@ class MetricExecutiveSummaryComponent {
70240
70276
  i0.ɵɵconditionalCreate(16, MetricExecutiveSummaryComponent_Conditional_16_Template, 7, 8, "div", 12);
70241
70277
  i0.ɵɵconditionalCreate(17, MetricExecutiveSummaryComponent_Conditional_17_Template, 7, 8, "div", 12);
70242
70278
  i0.ɵɵconditionalCreate(18, MetricExecutiveSummaryComponent_Conditional_18_Template, 8, 9, "div", 12);
70243
- i0.ɵɵelementEnd();
70244
- i0.ɵɵelementStart(19, "div", 13)(20, "div", 14)(21, "span");
70279
+ i0.ɵɵelementEnd()();
70280
+ i0.ɵɵelementStart(19, "div", 13)(20, "button", 14);
70281
+ i0.ɵɵlistener("click", function MetricExecutiveSummaryComponent_Template_button_click_20_listener() { return ctx.handleViewMetricDetailsClick(); });
70282
+ i0.ɵɵelementStart(21, "span");
70245
70283
  i0.ɵɵtext(22, "View Metric Details");
70246
70284
  i0.ɵɵelementEnd();
70247
70285
  i0.ɵɵelement(23, "symphiq-icon", 15);
70248
- i0.ɵɵelementEnd()()();
70249
- i0.ɵɵelementStart(24, "div", 13)(25, "button", 16);
70250
- i0.ɵɵlistener("click", function MetricExecutiveSummaryComponent_Template_button_click_25_listener() { return ctx.handleViewReportClick(); });
70286
+ i0.ɵɵelementEnd();
70287
+ i0.ɵɵelementStart(24, "button", 16);
70288
+ i0.ɵɵlistener("click", function MetricExecutiveSummaryComponent_Template_button_click_24_listener() { return ctx.handleViewReportClick(); });
70251
70289
  i0.ɵɵnamespaceSVG();
70252
- i0.ɵɵelementStart(26, "svg", 17);
70253
- i0.ɵɵelement(27, "path", 18);
70290
+ i0.ɵɵelementStart(25, "svg", 17);
70291
+ i0.ɵɵelement(26, "path", 18);
70254
70292
  i0.ɵɵelementEnd();
70255
70293
  i0.ɵɵnamespaceHTML();
70256
- i0.ɵɵelementStart(28, "span");
70257
- i0.ɵɵtext(29, "View Report");
70294
+ i0.ɵɵelementStart(27, "span");
70295
+ i0.ɵɵtext(28, "View Report");
70258
70296
  i0.ɵɵelementEnd()()();
70259
- i0.ɵɵconditionalCreate(30, MetricExecutiveSummaryComponent_Conditional_30_Template, 8, 5, "div", 19);
70260
- i0.ɵɵconditionalCreate(31, MetricExecutiveSummaryComponent_Conditional_31_Template, 6, 1, "div", 20);
70261
- i0.ɵɵconditionalCreate(32, MetricExecutiveSummaryComponent_Conditional_32_Template, 6, 1, "div", 21);
70297
+ i0.ɵɵconditionalCreate(29, MetricExecutiveSummaryComponent_Conditional_29_Template, 8, 5, "div", 19);
70298
+ i0.ɵɵconditionalCreate(30, MetricExecutiveSummaryComponent_Conditional_30_Template, 6, 1, "div", 20);
70299
+ i0.ɵɵconditionalCreate(31, MetricExecutiveSummaryComponent_Conditional_31_Template, 6, 1, "div", 21);
70262
70300
  i0.ɵɵelementEnd()()();
70263
70301
  } if (rf & 2) {
70264
70302
  let tmp_18_0;
@@ -70291,14 +70329,14 @@ class MetricExecutiveSummaryComponent {
70291
70329
  i0.ɵɵproperty("ngClass", ctx.viewDetailsButtonClasses());
70292
70330
  i0.ɵɵadvance(3);
70293
70331
  i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(22, _c1$d, ctx.iconSource));
70294
- i0.ɵɵadvance(2);
70332
+ i0.ɵɵadvance();
70295
70333
  i0.ɵɵproperty("ngClass", ctx.viewReportButtonClasses());
70296
70334
  i0.ɵɵadvance(5);
70297
- i0.ɵɵconditional(ctx.summary().narrative ? 30 : -1);
70335
+ i0.ɵɵconditional(ctx.summary().narrative ? 29 : -1);
70298
70336
  i0.ɵɵadvance();
70299
- i0.ɵɵconditional(ctx.summary().topPriorities && (((tmp_18_0 = ctx.summary().topPriorities) == null ? null : tmp_18_0.length) ?? 0) > 0 ? 31 : -1);
70337
+ i0.ɵɵconditional(ctx.summary().topPriorities && (((tmp_18_0 = ctx.summary().topPriorities) == null ? null : tmp_18_0.length) ?? 0) > 0 ? 30 : -1);
70300
70338
  i0.ɵɵadvance();
70301
- i0.ɵɵconditional(ctx.summary().quickWins && (((tmp_19_0 = ctx.summary().quickWins) == null ? null : tmp_19_0.length) ?? 0) > 0 ? 32 : -1);
70339
+ i0.ɵɵconditional(ctx.summary().quickWins && (((tmp_19_0 = ctx.summary().quickWins) == null ? null : tmp_19_0.length) ?? 0) > 0 ? 31 : -1);
70302
70340
  } }, dependencies: [CommonModule, i1$1.NgClass, GradeBadgeComponent,
70303
70341
  SymphiqIconComponent,
70304
70342
  NapkinVisualPlaceholderComponent,
@@ -70372,7 +70410,7 @@ class MetricExecutiveSummaryComponent {
70372
70410
  </span>
70373
70411
  </div>
70374
70412
  <div [ngClass]="metricValueClasses()" class="text-2xl font-bold">
70375
- {{ summary().currentValue }}
70413
+ {{ formatNumber(summary().currentValue) }}
70376
70414
  </div>
70377
70415
  @if (summary().yoyChange) {
70378
70416
  <div class="flex items-center gap-1 mt-2">
@@ -70403,7 +70441,7 @@ class MetricExecutiveSummaryComponent {
70403
70441
  </span>
70404
70442
  </div>
70405
70443
  <div [ngClass]="metricValueClasses()" class="text-2xl font-bold">
70406
- {{ summary().targetValue }}
70444
+ {{ formatNumber(summary().targetValue) }}
70407
70445
  </div>
70408
70446
  </div>
70409
70447
  }
@@ -70422,7 +70460,7 @@ class MetricExecutiveSummaryComponent {
70422
70460
  </span>
70423
70461
  </div>
70424
70462
  <div [ngClass]="metricValueClasses()" class="text-2xl font-bold">
70425
- {{ projectedValue() }}
70463
+ {{ formatNumber(projectedValue()) }}
70426
70464
  </div>
70427
70465
  </div>
70428
70466
  }
@@ -70437,7 +70475,7 @@ class MetricExecutiveSummaryComponent {
70437
70475
  [ngClass]="metricLabelClasses()"
70438
70476
  />
70439
70477
  <span [ngClass]="metricLabelClasses()" class="text-xs font-semibold uppercase tracking-wider">
70440
- Pacing
70478
+ Pacing vs Target
70441
70479
  </span>
70442
70480
  </div>
70443
70481
  <div [ngClass]="getPacingValueClasses()" class="text-xl font-bold">
@@ -70476,20 +70514,24 @@ class MetricExecutiveSummaryComponent {
70476
70514
  }
70477
70515
  </div>
70478
70516
 
70479
- <!-- View Details Button -->
70480
- <div class="flex items-center justify-center mt-4">
70481
- <div [ngClass]="viewDetailsButtonClasses()" class="inline-flex items-center gap-2 px-4 py-2 rounded-lg text-sm font-semibold transition-all duration-200 group-hover:scale-105">
70482
- <span>View Metric Details</span>
70483
- <symphiq-icon
70484
- [icon]="{ name: 'arrow-right', source: iconSource }"
70485
- size="w-4 h-4"
70486
- />
70487
- </div>
70488
- </div>
70489
70517
  </button>
70490
70518
 
70491
- <!-- View Report Button -->
70492
- <div class="flex items-center justify-center mt-4">
70519
+ <!-- Action Buttons -->
70520
+ <div class="flex flex-wrap items-center justify-center gap-3 mt-4">
70521
+ <!-- View Details Button -->
70522
+ <button
70523
+ type="button"
70524
+ (click)="handleViewMetricDetailsClick()"
70525
+ [ngClass]="viewDetailsButtonClasses()"
70526
+ class="inline-flex items-center gap-2 px-4 py-2.5 rounded-lg text-sm font-semibold transition-all duration-200 hover:scale-105">
70527
+ <span>View Metric Details</span>
70528
+ <symphiq-icon
70529
+ [icon]="{ name: 'arrow-right', source: iconSource }"
70530
+ size="w-4 h-4"
70531
+ />
70532
+ </button>
70533
+
70534
+ <!-- View Report Button -->
70493
70535
  <button
70494
70536
  type="button"
70495
70537
  (click)="handleViewReportClick()"
@@ -70637,8 +70679,8 @@ class MetricExecutiveSummaryComponent {
70637
70679
  </section>
70638
70680
  `
70639
70681
  }]
70640
- }], () => [], { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], summary: [{ type: i0.Input, args: [{ isSignal: true, alias: "summary", required: true }] }], metricName: [{ type: i0.Input, args: [{ isSignal: true, alias: "metricName", required: false }] }], allGoals: [{ type: i0.Input, args: [{ isSignal: true, alias: "allGoals", required: false }] }], topPrioritiesClick: [{ type: i0.Output, args: ["topPrioritiesClick"] }], priorityDetailClick: [{ type: i0.Output, args: ["priorityDetailClick"] }], viewMetricDetailsClick: [{ type: i0.Output, args: ["viewMetricDetailsClick"] }], viewReportClick: [{ type: i0.Output, args: ["viewReportClick"] }] }); })();
70641
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricExecutiveSummaryComponent, { className: "MetricExecutiveSummaryComponent", filePath: "lib/components/profile-analysis-shop-dashboard/metric-executive-summary.component.ts", lineNumber: 340 }); })();
70682
+ }], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], summary: [{ type: i0.Input, args: [{ isSignal: true, alias: "summary", required: true }] }], metricName: [{ type: i0.Input, args: [{ isSignal: true, alias: "metricName", required: false }] }], allGoals: [{ type: i0.Input, args: [{ isSignal: true, alias: "allGoals", required: false }] }], topPrioritiesClick: [{ type: i0.Output, args: ["topPrioritiesClick"] }], priorityDetailClick: [{ type: i0.Output, args: ["priorityDetailClick"] }], viewMetricDetailsClick: [{ type: i0.Output, args: ["viewMetricDetailsClick"] }], viewReportClick: [{ type: i0.Output, args: ["viewReportClick"] }] }); })();
70683
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricExecutiveSummaryComponent, { className: "MetricExecutiveSummaryComponent", filePath: "lib/components/profile-analysis-shop-dashboard/metric-executive-summary.component.ts", lineNumber: 344 }); })();
70642
70684
 
70643
70685
  const _c0$t = a0 => ({ name: "chevron-right", source: a0 });
70644
70686
  function GoalCardComponent_Conditional_13_Template(rf, ctx) { if (rf & 1) {
@@ -73729,7 +73771,7 @@ class KeyDriverCardComponent {
73729
73771
  }, ...(ngDevMode ? [{ debugName: "answerTextClasses" }] : []));
73730
73772
  }
73731
73773
  static { this.ɵfac = function KeyDriverCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || KeyDriverCardComponent)(); }; }
73732
- static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KeyDriverCardComponent, selectors: [["symphiq-key-driver-card"]], inputs: { driver: [1, "driver"], viewMode: [1, "viewMode"] }, decls: 13, vars: 12, consts: [[1, "rounded-xl", "p-5", "border", "transition-all", "duration-200", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "gap-3", "mb-3"], [1, "flex", "items-start", "gap-3", "flex-1", "min-w-0"], [1, "p-2", "rounded-lg", "flex-shrink-0", "mt-0.5", 3, "ngClass"], ["size", "w-4 h-4", 3, "icon"], [1, "flex-1", "min-w-0"], [1, "font-semibold", "text-sm", "mb-1", "leading-tight", 3, "ngClass"], [1, "px-2.5", "py-1", "rounded-full", "text-xs", "font-bold", "uppercase", "tracking-wider", "flex-shrink-0", 3, "ngClass"], [1, "text-sm", "leading-relaxed", "mb-4", 3, "ngClass"], [1, "rounded-lg", "p-3", "space-y-2", 3, "ngClass"], [1, "flex", "items-center", "gap-1.5", "mb-2"], ["size", "w-3.5 h-3.5", 3, "icon", "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wide", 3, "ngClass"], [1, "rounded", "p-2", 3, "ngClass"], [1, "text-xs", "leading-relaxed", "italic", 3, "ngClass"]], template: function KeyDriverCardComponent_Template(rf, ctx) { if (rf & 1) {
73774
+ static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: KeyDriverCardComponent, selectors: [["symphiq-key-driver-card"]], inputs: { driver: [1, "driver"], viewMode: [1, "viewMode"] }, decls: 13, vars: 12, consts: [[1, "rounded-xl", "p-5", "border", "transition-all", "duration-200", 3, "ngClass"], [1, "flex", "items-start", "justify-between", "gap-3", "mb-3"], [1, "flex", "items-center", "gap-3", "flex-1", "min-w-0"], [1, "p-2", "rounded-lg", "flex-shrink-0", "mt-0.5", 3, "ngClass"], ["size", "w-4 h-4", 3, "icon"], [1, "flex-1", "min-w-0"], [1, "font-semibold", "text-sm", "mb-1", "leading-tight", 3, "ngClass"], [1, "px-2.5", "py-1", "rounded-full", "text-xs", "font-bold", "uppercase", "tracking-wider", "flex-shrink-0", 3, "ngClass"], [1, "text-sm", "leading-relaxed", "mb-4", 3, "ngClass"], [1, "rounded-lg", "p-3", "space-y-2", 3, "ngClass"], [1, "flex", "items-center", "gap-1.5", "mb-2"], ["size", "w-3.5 h-3.5", 3, "icon", "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wide", 3, "ngClass"], [1, "rounded", "p-2", 3, "ngClass"], [1, "text-xs", "leading-relaxed", "italic", 3, "ngClass"]], template: function KeyDriverCardComponent_Template(rf, ctx) { if (rf & 1) {
73733
73775
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3);
73734
73776
  i0.ɵɵelement(4, "symphiq-icon", 4);
73735
73777
  i0.ɵɵelementEnd();
@@ -73776,7 +73818,7 @@ class KeyDriverCardComponent {
73776
73818
  template: `
73777
73819
  <div [ngClass]="cardClasses()" class="rounded-xl p-5 border transition-all duration-200">
73778
73820
  <div class="flex items-start justify-between gap-3 mb-3">
73779
- <div class="flex items-start gap-3 flex-1 min-w-0">
73821
+ <div class="flex items-center gap-3 flex-1 min-w-0">
73780
73822
  <div [ngClass]="iconClasses()" class="p-2 rounded-lg flex-shrink-0 mt-0.5">
73781
73823
  <symphiq-icon
73782
73824
  [icon]="{ name: 'arrow-trending-up', source: iconSource }"
@@ -75058,7 +75100,7 @@ function PerformanceMetricsCardComponent_Conditional_32_Template(rf, ctx) { if (
75058
75100
  i0.ɵɵadvance(2);
75059
75101
  i0.ɵɵproperty("ngClass", ctx_r0.valueClasses());
75060
75102
  i0.ɵɵadvance();
75061
- i0.ɵɵtextInterpolate1(" ", ctx_r0.metrics().projectedValue, " ");
75103
+ i0.ɵɵtextInterpolate1(" ", ctx_r0.formatNumber(ctx_r0.metrics().projectedValue), " ");
75062
75104
  } }
75063
75105
  class PerformanceMetricsCardComponent {
75064
75106
  constructor() {
@@ -75220,6 +75262,14 @@ class PerformanceMetricsCardComponent {
75220
75262
  this.viewMode.set(this.mode());
75221
75263
  });
75222
75264
  }
75265
+ formatNumber(value) {
75266
+ if (value === undefined || value === null || value === '')
75267
+ return '';
75268
+ const num = typeof value === 'string' ? parseFloat(value) : value;
75269
+ if (isNaN(num))
75270
+ return String(value);
75271
+ return num.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2 });
75272
+ }
75223
75273
  static { this.ɵfac = function PerformanceMetricsCardComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || PerformanceMetricsCardComponent)(); }; }
75224
75274
  static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: PerformanceMetricsCardComponent, selectors: [["symphiq-performance-metrics-card"]], inputs: { performanceMetrics: [1, "performanceMetrics"], mode: [1, "mode"] }, decls: 41, vars: 42, consts: [[1, "rounded-xl", "p-6", "shadow-lg", 3, "ngClass"], [1, "flex", "items-center", "justify-between", "mb-6"], [1, "text-lg", "font-bold", 3, "ngClass"], [1, "flex", "items-center", "gap-2"], [1, "px-3", "py-1", "rounded-full", "text-xs", "font-bold", "uppercase", "tracking-wider", 3, "ngClass"], [1, "px-3", "py-1", "rounded-full", "text-xs", "font-bold", "uppercase", "tracking-wider", "flex", "items-center", "gap-1", 3, "ngClass"], ["size", "w-3 h-3", 3, "icon"], [1, "grid", "grid-cols-1", "md:grid-cols-2", "lg:grid-cols-4", "gap-4"], [1, "rounded-lg", "p-4", 3, "ngClass"], [1, "flex", "items-center", "gap-2", "mb-2"], ["size", "w-4 h-4", 3, "icon", "ngClass"], [1, "text-xs", "font-semibold", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-2xl", "font-bold", 3, "ngClass"], [1, "mt-6"], [1, "flex", "items-center", "justify-between", "mb-2"], [1, "text-sm", "font-semibold", 3, "ngClass"], [1, "w-full", "h-3", "rounded-full", "overflow-hidden", 3, "ngClass"], [1, "h-full", "rounded-full", "transition-all", "duration-500", 3, "ngClass"]], template: function PerformanceMetricsCardComponent_Template(rf, ctx) { if (rf & 1) {
75225
75275
  i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "h3", 2);
@@ -75290,7 +75340,7 @@ class PerformanceMetricsCardComponent {
75290
75340
  i0.ɵɵadvance(2);
75291
75341
  i0.ɵɵproperty("ngClass", ctx.valueClasses());
75292
75342
  i0.ɵɵadvance();
75293
- i0.ɵɵtextInterpolate1(" ", ctx.metrics().currentValue, " ");
75343
+ i0.ɵɵtextInterpolate1(" ", ctx.formatNumber(ctx.metrics().currentValue), " ");
75294
75344
  i0.ɵɵadvance();
75295
75345
  i0.ɵɵproperty("ngClass", ctx.metricBoxClasses());
75296
75346
  i0.ɵɵadvance(2);
@@ -75300,7 +75350,7 @@ class PerformanceMetricsCardComponent {
75300
75350
  i0.ɵɵadvance(2);
75301
75351
  i0.ɵɵproperty("ngClass", ctx.valueClasses());
75302
75352
  i0.ɵɵadvance();
75303
- i0.ɵɵtextInterpolate1(" ", ctx.metrics().previousYearValue, " ");
75353
+ i0.ɵɵtextInterpolate1(" ", ctx.formatNumber(ctx.metrics().previousYearValue), " ");
75304
75354
  i0.ɵɵadvance();
75305
75355
  i0.ɵɵproperty("ngClass", ctx.metricBoxClasses());
75306
75356
  i0.ɵɵadvance(2);
@@ -75310,7 +75360,7 @@ class PerformanceMetricsCardComponent {
75310
75360
  i0.ɵɵadvance(2);
75311
75361
  i0.ɵɵproperty("ngClass", ctx.valueClasses());
75312
75362
  i0.ɵɵadvance();
75313
- i0.ɵɵtextInterpolate1(" ", ctx.metrics().targetValue, " ");
75363
+ i0.ɵɵtextInterpolate1(" ", ctx.formatNumber(ctx.metrics().targetValue), " ");
75314
75364
  i0.ɵɵadvance();
75315
75365
  i0.ɵɵconditional(ctx.metrics().projectedValue ? 32 : -1);
75316
75366
  i0.ɵɵadvance(3);
@@ -75366,7 +75416,7 @@ class PerformanceMetricsCardComponent {
75366
75416
  </span>
75367
75417
  </div>
75368
75418
  <div [ngClass]="valueClasses()" class="text-2xl font-bold">
75369
- {{ metrics().currentValue }}
75419
+ {{ formatNumber(metrics().currentValue) }}
75370
75420
  </div>
75371
75421
  </div>
75372
75422
 
@@ -75383,7 +75433,7 @@ class PerformanceMetricsCardComponent {
75383
75433
  </span>
75384
75434
  </div>
75385
75435
  <div [ngClass]="valueClasses()" class="text-2xl font-bold">
75386
- {{ metrics().previousYearValue }}
75436
+ {{ formatNumber(metrics().previousYearValue) }}
75387
75437
  </div>
75388
75438
  </div>
75389
75439
 
@@ -75400,7 +75450,7 @@ class PerformanceMetricsCardComponent {
75400
75450
  </span>
75401
75451
  </div>
75402
75452
  <div [ngClass]="valueClasses()" class="text-2xl font-bold">
75403
- {{ metrics().targetValue }}
75453
+ {{ formatNumber(metrics().targetValue) }}
75404
75454
  </div>
75405
75455
  </div>
75406
75456
 
@@ -75418,7 +75468,7 @@ class PerformanceMetricsCardComponent {
75418
75468
  </span>
75419
75469
  </div>
75420
75470
  <div [ngClass]="valueClasses()" class="text-2xl font-bold">
75421
- {{ metrics().projectedValue }}
75471
+ {{ formatNumber(metrics().projectedValue) }}
75422
75472
  </div>
75423
75473
  </div>
75424
75474
  }
@@ -86132,16 +86182,12 @@ class CollapsibleAnalysisSectionGroupComponent {
86132
86182
  }
86133
86183
  }
86134
86184
  handleViewMetricDetailsClick() {
86135
- console.log('[CollapsibleAnalysisSectionGroup] handleViewMetricDetailsClick called');
86136
86185
  const metricKey = this.metricExecutiveSummary()?.metric;
86137
- console.log('[CollapsibleAnalysisSectionGroup] metricKey:', metricKey);
86138
86186
  if (!metricKey) {
86139
- console.log('[CollapsibleAnalysisSectionGroup] No metricKey found');
86140
86187
  return;
86141
86188
  }
86142
86189
  const allMetrics = this.allMetrics();
86143
86190
  const metric = allMetrics.find(m => m.metric === metricKey);
86144
- console.log('[CollapsibleAnalysisSectionGroup] Found metric:', !!metric);
86145
86191
  if (metric) {
86146
86192
  const allCharts = this.allCharts();
86147
86193
  const metricCharts = allCharts.filter(chart => {
@@ -86149,7 +86195,6 @@ class CollapsibleAnalysisSectionGroupComponent {
86149
86195
  const metricId = metricKey.toLowerCase();
86150
86196
  return chartId.includes(metricId) || chartId.startsWith(metricId);
86151
86197
  });
86152
- console.log('[CollapsibleAnalysisSectionGroup] Opening modal with metric and', metricCharts.length, 'charts');
86153
86198
  this.modalService.openMetricModal(metric, metricCharts);
86154
86199
  }
86155
86200
  else {
@@ -86161,15 +86206,12 @@ class CollapsibleAnalysisSectionGroupComponent {
86161
86206
  targetValue: typeof summary.targetValue === 'string' ? parseFloat(summary.targetValue) || 0 : (summary.targetValue ?? 0),
86162
86207
  description: summary.gradeRationale
86163
86208
  };
86164
- console.log('[CollapsibleAnalysisSectionGroup] Opening modal with constructed metric');
86165
86209
  this.modalService.openMetricModal(constructedMetric, []);
86166
86210
  }
86167
86211
  }
86168
86212
  }
86169
86213
  handleViewReportClick() {
86170
- console.log('[CollapsibleAnalysisSectionGroup] handleViewReportClick called');
86171
86214
  const metricKey = this.metricExecutiveSummary()?.metric;
86172
- console.log('[CollapsibleAnalysisSectionGroup] Emitting viewReportClick with metricKey:', metricKey);
86173
86215
  if (metricKey) {
86174
86216
  this.viewReportClick.emit(metricKey);
86175
86217
  }
@@ -93890,21 +93932,15 @@ class SymphiqProfileShopAnalysisDashboardComponent {
93890
93932
  }
93891
93933
  }
93892
93934
  handleMetricViewDetailsClick() {
93893
- console.log('[ShopDashboard.ViewMetricDetails] Handler called');
93894
93935
  const summary = this.metricExecutiveSummary();
93895
93936
  const metricKey = summary?.metric || this.metricName();
93896
- console.log('[ShopDashboard.ViewMetricDetails] metricKey:', metricKey);
93897
93937
  if (!metricKey) {
93898
- console.log('[ShopDashboard.ViewMetricDetails] No metricKey found, returning early');
93899
93938
  return;
93900
93939
  }
93901
93940
  const allMetricsArr = this.allMetrics();
93902
- console.log('[ShopDashboard.ViewMetricDetails] allMetrics count:', allMetricsArr.length);
93903
93941
  const metric = allMetricsArr.find(m => m.metric === metricKey);
93904
- console.log('[ShopDashboard.ViewMetricDetails] Found metric:', metric?.metric);
93905
93942
  if (metric) {
93906
93943
  const charts = this.chartsForMetric(metric);
93907
- console.log('[ShopDashboard.ViewMetricDetails] Filtered charts count:', charts.length);
93908
93944
  this.modalService.openMetricModal(metric, charts);
93909
93945
  }
93910
93946
  else if (summary) {
@@ -93914,21 +93950,17 @@ class SymphiqProfileShopAnalysisDashboardComponent {
93914
93950
  targetValue: typeof summary.targetValue === 'string' ? parseFloat(summary.targetValue) || 0 : (summary.targetValue ?? 0),
93915
93951
  description: summary.gradeRationale
93916
93952
  };
93917
- console.log('[ShopDashboard.ViewMetricDetails] Using constructed metric');
93918
93953
  const charts = this.chartsForMetric(constructedMetric);
93919
- console.log('[ShopDashboard.ViewMetricDetails] Filtered charts count:', charts.length);
93920
93954
  this.modalService.openMetricModal(constructedMetric, charts);
93921
93955
  }
93922
93956
  }
93923
93957
  chartsForMetric(metric) {
93924
93958
  const metricId = metric.performanceItemId;
93925
93959
  const metricName = metric.metric;
93926
- console.log('[ShopDashboard.chartsForMetric] Called with metric:', metricName, 'performanceItemId:', metricId);
93927
93960
  if (!metricId && !metricName) {
93928
93961
  return [];
93929
93962
  }
93930
93963
  const allChartsArr = this.allCharts();
93931
- console.log('[ShopDashboard.chartsForMetric] Total allCharts:', allChartsArr.length);
93932
93964
  const matchingCharts = [];
93933
93965
  const metricNameLower = metricName?.toLowerCase() || '';
93934
93966
  const metricNameNormalized = metricNameLower.replace(/\s+/g, '_');
@@ -93946,7 +93978,6 @@ class SymphiqProfileShopAnalysisDashboardComponent {
93946
93978
  matchingCharts.push(chart);
93947
93979
  }
93948
93980
  }
93949
- console.log('[ShopDashboard.chartsForMetric] Matching charts count:', matchingCharts.length);
93950
93981
  return matchingCharts;
93951
93982
  }
93952
93983
  getCurrentModalState() {
@@ -100653,10 +100684,6 @@ class SymphiqProfileAnalysisMetricDashboardComponent {
100653
100684
  }
100654
100685
  }
100655
100686
  ngOnInit() {
100656
- console.log('[MetricDashboard] ngOnInit');
100657
- console.log('[MetricDashboard] isSimplifiedView:', this.isSimplifiedView());
100658
- console.log('[MetricDashboard] currentDisplayMode:', this.currentDisplayMode());
100659
- console.log('[MetricDashboard] metricExecutiveSummary:', !!this.metricExecutiveSummary());
100660
100687
  this.funnelAnalysisSignal.set(this.funnelAnalysis());
100661
100688
  const profileToUse = this.profile();
100662
100689
  if (profileToUse) {
@@ -100727,68 +100754,46 @@ class SymphiqProfileAnalysisMetricDashboardComponent {
100727
100754
  chartsForMetric(metric) {
100728
100755
  const metricId = metric.performanceItemId;
100729
100756
  const metricName = metric.metric;
100730
- console.log('[chartsForMetric] Called with metric:', metricName, 'performanceItemId:', metricId);
100731
100757
  if (!metricId && !metricName) {
100732
- console.log('[chartsForMetric] No metricId or metricName, returning empty');
100733
100758
  return [];
100734
100759
  }
100735
100760
  const allCharts = this.allCharts();
100736
- console.log('[chartsForMetric] Total allCharts:', allCharts.length);
100737
- console.log('[chartsForMetric] Chart performanceItemIds:', allCharts.map(c => c.performanceItemId));
100738
100761
  const matchingCharts = [];
100739
100762
  const metricNameLower = metricName?.toLowerCase() || '';
100740
100763
  const metricNameNormalized = metricNameLower.replace(/\s+/g, '_');
100741
- console.log('[chartsForMetric] metricNameNormalized:', metricNameNormalized);
100742
100764
  for (const chart of allCharts) {
100743
100765
  const chartId = chart.performanceItemId || '';
100744
100766
  const chartIdLower = chartId.toLowerCase();
100745
100767
  if (metricId) {
100746
100768
  const prefix = metricId + '_';
100747
100769
  if (chartId === metricId || chartId.startsWith(prefix)) {
100748
- console.log('[chartsForMetric] Matched by metricId:', chartId);
100749
100770
  matchingCharts.push(chart);
100750
100771
  continue;
100751
100772
  }
100752
100773
  }
100753
100774
  if (metricName && chartIdLower.includes(metricNameNormalized)) {
100754
- console.log('[chartsForMetric] Matched by name:', chartId, 'contains', metricNameNormalized);
100755
100775
  matchingCharts.push(chart);
100756
100776
  }
100757
100777
  }
100758
- console.log('[chartsForMetric] Matching charts count:', matchingCharts.length);
100759
- console.log('[chartsForMetric] Matching chart IDs:', matchingCharts.map(c => c.performanceItemId));
100760
100778
  return matchingCharts;
100761
100779
  }
100762
100780
  handleViewMetricDetailsClick() {
100763
- console.log('[ViewMetricDetails] Handler called');
100764
100781
  const funnelMetric = this.funnelMetric();
100765
100782
  let metricKey = funnelMetric?.relatedMetric;
100766
- console.log('[ViewMetricDetails] funnelMetric:', funnelMetric);
100767
- console.log('[ViewMetricDetails] metricKey from funnelMetric:', metricKey);
100768
100783
  if (!metricKey) {
100769
100784
  metricKey = this.profileAnalysis()?.profileAnalysisStructured?.metricExecutiveSummary?.metric;
100770
- console.log('[ViewMetricDetails] metricKey from profileAnalysis:', metricKey);
100771
100785
  }
100772
100786
  if (!metricKey) {
100773
- console.log('[ViewMetricDetails] No metricKey found, returning early');
100774
100787
  return;
100775
100788
  }
100776
100789
  const allMetrics = this.allMetrics();
100777
- console.log('[ViewMetricDetails] allMetrics count:', allMetrics.length);
100778
- console.log('[ViewMetricDetails] allMetrics keys:', allMetrics.map(m => m.metric));
100779
100790
  const metric = allMetrics.find(m => m.metric === metricKey);
100780
- console.log('[ViewMetricDetails] Found metric in allMetrics:', metric);
100781
100791
  if (metric) {
100782
- console.log('[ViewMetricDetails] Opening modal with metric from allMetrics');
100783
- console.log('[ViewMetricDetails] Metric performanceItemId:', metric.performanceItemId);
100784
100792
  const charts = this.chartsForMetric(metric);
100785
- console.log('[ViewMetricDetails] Filtered charts count:', charts.length);
100786
- console.log('[ViewMetricDetails] Filtered chart IDs:', charts.map((c) => c.performanceItemId));
100787
100793
  this.modalService.openMetricModal(metric, charts);
100788
100794
  }
100789
100795
  else {
100790
100796
  const summary = this.metricExecutiveSummary();
100791
- console.log('[ViewMetricDetails] metricExecutiveSummary:', summary);
100792
100797
  if (summary) {
100793
100798
  const constructedMetric = {
100794
100799
  metric: metricKey,
@@ -100796,22 +100801,15 @@ class SymphiqProfileAnalysisMetricDashboardComponent {
100796
100801
  targetValue: typeof summary.targetValue === 'string' ? parseFloat(summary.targetValue) || 0 : (summary.targetValue ?? 0),
100797
100802
  description: summary.gradeRationale
100798
100803
  };
100799
- console.log('[ViewMetricDetails] Opening modal with constructed metric:', constructedMetric);
100800
- console.log('[ViewMetricDetails] Constructed metric performanceItemId:', constructedMetric.performanceItemId);
100801
100804
  const charts = this.chartsForMetric(constructedMetric);
100802
- console.log('[ViewMetricDetails] Filtered charts count:', charts.length);
100803
- console.log('[ViewMetricDetails] Filtered chart IDs:', charts.map((c) => c.performanceItemId));
100804
100805
  this.modalService.openMetricModal(constructedMetric, charts);
100805
100806
  }
100806
100807
  else {
100807
- console.log('[ViewMetricDetails] Emitting viewMetricDetailsClick event with key:', metricKey);
100808
100808
  this.viewMetricDetailsClick.emit(metricKey);
100809
100809
  }
100810
100810
  }
100811
- console.log('[ViewMetricDetails] openMetricModal called - check FunnelAnalysisModal logs');
100812
100811
  }
100813
100812
  handleViewReportClick(metricKey) {
100814
- console.log('[ViewReport] Handler called with metricKey:', metricKey);
100815
100813
  this.openMetricReport(metricKey);
100816
100814
  }
100817
100815
  openMetricReport(metricEnum) {
@@ -100881,8 +100879,6 @@ class SymphiqProfileAnalysisMetricDashboardComponent {
100881
100879
  return null;
100882
100880
  }
100883
100881
  handleDisplayModeChange(mode) {
100884
- console.log('[MetricDashboard] handleDisplayModeChange:', mode);
100885
- console.log('[MetricDashboard] Will show MetricExecutiveSummary:', mode !== DisplayModeEnum.SIMPLIFIED);
100886
100882
  this.currentDisplayMode.set(mode);
100887
100883
  if (mode === DisplayModeEnum.EXPANDED) {
100888
100884
  this.viewModeService.setViewMode('expanded');
@@ -100954,8 +100950,8 @@ class SymphiqProfileAnalysisMetricDashboardComponent {
100954
100950
  percentageIncrease = ((targetValue - currentValue) / currentValue) * 100;
100955
100951
  }
100956
100952
  }
100957
- const funnelMetricMatch = funnelMetricsList.find(fm => fm.funnelMetric === metric && fm.funnelMetric === fm.relatedMetric);
100958
- const relatedMetricMatch = funnelMetricsList.find(fm => fm.relatedMetric === metric && fm.funnelMetric !== fm.relatedMetric);
100953
+ const funnelMetricMatch = funnelMetricsList?.find(fm => fm.funnelMetric === metric && fm.funnelMetric === fm.relatedMetric);
100954
+ const relatedMetricMatch = funnelMetricsList?.find(fm => fm.relatedMetric === metric && fm.funnelMetric !== fm.relatedMetric);
100959
100955
  if (funnelMetricMatch) {
100960
100956
  results.push({
100961
100957
  metric,
@@ -101531,7 +101527,7 @@ class SymphiqProfileAnalysisMetricDashboardComponent {
101531
101527
  type: HostListener,
101532
101528
  args: ['window:scroll', ['$event']]
101533
101529
  }] }); })();
101534
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqProfileAnalysisMetricDashboardComponent, { className: "SymphiqProfileAnalysisMetricDashboardComponent", filePath: "lib/components/profile-analysis-metric-dashboard/symphiq-profile-analysis-metric-dashboard.component.ts", lineNumber: 512 }); })();
101530
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SymphiqProfileAnalysisMetricDashboardComponent, { className: "SymphiqProfileAnalysisMetricDashboardComponent", filePath: "lib/components/profile-analysis-metric-dashboard/symphiq-profile-analysis-metric-dashboard.component.ts", lineNumber: 513 }); })();
101535
101531
 
101536
101532
  const _forTrack0$4 = ($index, $item) => $item.id;
101537
101533
  function ShopProfileCategoryListComponent_For_2_Template(rf, ctx) { if (rf & 1) {