@eric-emg/symphiq-components 1.2.192 → 1.2.194
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/symphiq-components.mjs +915 -880
- package/fesm2022/symphiq-components.mjs.map +1 -1
- package/index.d.ts +82 -3
- package/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/styles.css +0 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ViewModeEnum, MetricStatusEnum, TrendDirectionEnum, CompetitiveScoreEnum, ChartTypeEnum, IconSourceEnum, ProfileAnalysisRecommendationPriorityEnum, ProfileItemTypeEnum, PriceVsCompetitorsEnum, DifferentiationStrengthEnum, ThreatLevelEnum, normalizeToV3,
|
|
1
|
+
import { ViewModeEnum, MetricStatusEnum, TrendDirectionEnum, CompetitiveScoreEnum, MetricEnum, DimensionEnum, UiDataPeriodEnum, UiDataComparePeriodEnum, ChartTypeEnum, IconSourceEnum, ProfileAnalysisRecommendationPriorityEnum, ProfileItemTypeEnum, PriceVsCompetitorsEnum, DifferentiationStrengthEnum, ThreatLevelEnum, normalizeToV3, FocusAreaDetailStatusEnum, FocusAreaDomainEnumUtil, FocusAreaDomainEnum, ShopDataLoadStatusEnum, AiDynamicContentStatusEnum, FocusAreaHealthEnum, ProfileAnalysisPriorityEnum, CapabilityStateEnum, QuadrantEnum, AdvantageEnum, OverallGradeEnum, OperationalMaturityEnum, ProfileAnalysisEffortLevelEnum, ProfileAnalysisImpactLevelEnum, ProfileAnalysisTypeEnum, LineChartUseCaseEnum, BarChartUseCaseEnum } from '@jebgem/model';
|
|
2
2
|
export * from '@jebgem/model';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
4
|
import { Injectable, signal, computed, input, ChangeDetectionStrategy, Component, output, inject, ElementRef, Renderer2, effect, Directive, HostListener, untracked, ViewChild, PLATFORM_ID, Inject, Input } from '@angular/core';
|
|
@@ -2535,8 +2535,613 @@ class ConfettiService {
|
|
|
2535
2535
|
}]
|
|
2536
2536
|
}], null, null); })();
|
|
2537
2537
|
|
|
2538
|
+
function getCurrentYearStart() {
|
|
2539
|
+
const now = new Date();
|
|
2540
|
+
return new Date(now.getFullYear(), 0, 1, 0, 0, 0, 0);
|
|
2541
|
+
}
|
|
2542
|
+
function getCurrentYearEnd() {
|
|
2543
|
+
const now = new Date();
|
|
2544
|
+
return new Date(now.getFullYear(), 11, 31, 23, 59, 59, 999);
|
|
2545
|
+
}
|
|
2546
|
+
function getPriorYearStart() {
|
|
2547
|
+
const now = new Date();
|
|
2548
|
+
return new Date(now.getFullYear() - 1, 0, 1, 0, 0, 0, 0);
|
|
2549
|
+
}
|
|
2550
|
+
function getPriorYearEnd() {
|
|
2551
|
+
const now = new Date();
|
|
2552
|
+
return new Date(now.getFullYear() - 1, 11, 31, 23, 59, 59, 999);
|
|
2553
|
+
}
|
|
2554
|
+
function isCurrentYearTarget(target) {
|
|
2555
|
+
if (!target.startDate || !target.endDate) {
|
|
2556
|
+
return false;
|
|
2557
|
+
}
|
|
2558
|
+
const currentYearStart = getCurrentYearStart();
|
|
2559
|
+
const currentYearEnd = getCurrentYearEnd();
|
|
2560
|
+
const targetStart = new Date(target.startDate);
|
|
2561
|
+
const targetEnd = new Date(target.endDate);
|
|
2562
|
+
return (targetStart.getTime() === currentYearStart.getTime() &&
|
|
2563
|
+
targetEnd.getTime() === currentYearEnd.getTime());
|
|
2564
|
+
}
|
|
2565
|
+
function formatCurrency(value, currencySymbol = '$') {
|
|
2566
|
+
return `${currencySymbol}${value.toLocaleString('en-US', {
|
|
2567
|
+
minimumFractionDigits: 0,
|
|
2568
|
+
maximumFractionDigits: 0
|
|
2569
|
+
})}`;
|
|
2570
|
+
}
|
|
2571
|
+
function formatPercentage(value, decimals = 1) {
|
|
2572
|
+
return `${value.toFixed(decimals)}%`;
|
|
2573
|
+
}
|
|
2574
|
+
function formatNumber(value) {
|
|
2575
|
+
return value.toLocaleString('en-US', {
|
|
2576
|
+
minimumFractionDigits: 0,
|
|
2577
|
+
maximumFractionDigits: 0
|
|
2578
|
+
});
|
|
2579
|
+
}
|
|
2580
|
+
|
|
2581
|
+
function calculateMetricTargetsFromRevenue(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues) {
|
|
2582
|
+
const revenuePercentageIncrease = ((revenueTarget - priorYearRevenue) / priorYearRevenue) * 100;
|
|
2583
|
+
const metricCalculations = [];
|
|
2584
|
+
const sortedFunnelMetrics = [...funnelMetrics].sort((a, b) => {
|
|
2585
|
+
const aFunnel = a.funnelInd ?? 999;
|
|
2586
|
+
const bFunnel = b.funnelInd ?? 999;
|
|
2587
|
+
if (aFunnel !== bFunnel)
|
|
2588
|
+
return aFunnel - bFunnel;
|
|
2589
|
+
const aRelated = a.relatedInd ?? 999;
|
|
2590
|
+
const bRelated = b.relatedInd ?? 999;
|
|
2591
|
+
return aRelated - bRelated;
|
|
2592
|
+
});
|
|
2593
|
+
const funnelStages = getUniqueFunnelStages(sortedFunnelMetrics);
|
|
2594
|
+
const numFunnelStages = funnelStages.length;
|
|
2595
|
+
const revenueIncreaseFactor = revenueTarget / priorYearRevenue;
|
|
2596
|
+
const perStageFactor = Math.pow(revenueIncreaseFactor, 1 / numFunnelStages);
|
|
2597
|
+
const funnelStageMetrics = new Map();
|
|
2598
|
+
sortedFunnelMetrics.forEach(fm => {
|
|
2599
|
+
if (fm.funnelMetric) {
|
|
2600
|
+
if (!funnelStageMetrics.has(fm.funnelMetric)) {
|
|
2601
|
+
funnelStageMetrics.set(fm.funnelMetric, []);
|
|
2602
|
+
}
|
|
2603
|
+
funnelStageMetrics.get(fm.funnelMetric).push(fm);
|
|
2604
|
+
}
|
|
2605
|
+
});
|
|
2606
|
+
const stagePercentageIncrease = (perStageFactor - 1) * 100;
|
|
2607
|
+
sortedFunnelMetrics.forEach((funnelMetric) => {
|
|
2608
|
+
const metric = funnelMetric.relatedMetric;
|
|
2609
|
+
if (!metric)
|
|
2610
|
+
return;
|
|
2611
|
+
const currentValue = baselineValues.get(metric) || 0;
|
|
2612
|
+
const isFunnelStage = funnelMetric.funnelMetric === metric;
|
|
2613
|
+
let percentageIncrease;
|
|
2614
|
+
let targetValue;
|
|
2615
|
+
if (metric === MetricEnum.BOUNCE_RATE) {
|
|
2616
|
+
percentageIncrease = -stagePercentageIncrease;
|
|
2617
|
+
targetValue = currentValue * (1 + percentageIncrease / 100);
|
|
2618
|
+
}
|
|
2619
|
+
else if (isDerivedMetric$1(metric)) {
|
|
2620
|
+
percentageIncrease = 0;
|
|
2621
|
+
targetValue = currentValue;
|
|
2622
|
+
}
|
|
2623
|
+
else {
|
|
2624
|
+
percentageIncrease = stagePercentageIncrease;
|
|
2625
|
+
targetValue = currentValue * perStageFactor;
|
|
2626
|
+
}
|
|
2627
|
+
metricCalculations.push({
|
|
2628
|
+
metric,
|
|
2629
|
+
funnelMetric: funnelMetric.funnelMetric,
|
|
2630
|
+
currentValue,
|
|
2631
|
+
targetValue,
|
|
2632
|
+
percentageIncrease,
|
|
2633
|
+
isFunnelStage,
|
|
2634
|
+
funnelInd: funnelMetric.funnelInd,
|
|
2635
|
+
relatedInd: funnelMetric.relatedInd,
|
|
2636
|
+
description: funnelMetric.relatedMetricDescription
|
|
2637
|
+
});
|
|
2638
|
+
});
|
|
2639
|
+
return {
|
|
2640
|
+
revenueTarget,
|
|
2641
|
+
revenuePercentageIncrease,
|
|
2642
|
+
metricCalculations
|
|
2643
|
+
};
|
|
2644
|
+
}
|
|
2645
|
+
function getUniqueFunnelStages(funnelMetrics) {
|
|
2646
|
+
const stages = [];
|
|
2647
|
+
const seen = new Set();
|
|
2648
|
+
funnelMetrics.forEach(fm => {
|
|
2649
|
+
if (fm.funnelMetric && fm.funnelMetric === fm.relatedMetric && !seen.has(fm.funnelMetric)) {
|
|
2650
|
+
seen.add(fm.funnelMetric);
|
|
2651
|
+
stages.push(fm.funnelMetric);
|
|
2652
|
+
}
|
|
2653
|
+
});
|
|
2654
|
+
return stages;
|
|
2655
|
+
}
|
|
2656
|
+
const DERIVED_METRICS$1 = new Set([
|
|
2657
|
+
MetricEnum.REVENUE_PER_PRODUCT_VIEW,
|
|
2658
|
+
MetricEnum.REVENUE_PER_ADD_TO_CART,
|
|
2659
|
+
MetricEnum.REVENUE_PER_CHECKOUT
|
|
2660
|
+
]);
|
|
2661
|
+
function isDerivedMetric$1(metric) {
|
|
2662
|
+
return DERIVED_METRICS$1.has(metric);
|
|
2663
|
+
}
|
|
2664
|
+
function generateTargetsFromCalculations(shopId, calculations) {
|
|
2665
|
+
const startDate = getCurrentYearStart();
|
|
2666
|
+
const endDate = getCurrentYearEnd();
|
|
2667
|
+
return calculations.map((calc) => ({
|
|
2668
|
+
shopId,
|
|
2669
|
+
metric: calc.metric,
|
|
2670
|
+
amount: calc.targetValue,
|
|
2671
|
+
startDate,
|
|
2672
|
+
endDate
|
|
2673
|
+
}));
|
|
2674
|
+
}
|
|
2675
|
+
function groupMetricsByFunnelStage(calculations) {
|
|
2676
|
+
const grouped = new Map();
|
|
2677
|
+
calculations.forEach((calc) => {
|
|
2678
|
+
if (calc.funnelMetric) {
|
|
2679
|
+
if (!grouped.has(calc.funnelMetric)) {
|
|
2680
|
+
grouped.set(calc.funnelMetric, []);
|
|
2681
|
+
}
|
|
2682
|
+
grouped.get(calc.funnelMetric).push(calc);
|
|
2683
|
+
}
|
|
2684
|
+
});
|
|
2685
|
+
return grouped;
|
|
2686
|
+
}
|
|
2687
|
+
function getFunnelStageMetrics(calculations) {
|
|
2688
|
+
return calculations.filter((calc) => calc.isFunnelStage);
|
|
2689
|
+
}
|
|
2690
|
+
|
|
2691
|
+
function transformUiDataToChartSeries(mainUiData, ytdComparisonUiData, metricToExtract) {
|
|
2692
|
+
const series = [];
|
|
2693
|
+
if (ytdComparisonUiData?.convertedDataResults) {
|
|
2694
|
+
const priorYearSeries = extractSeriesFromConvertedData(ytdComparisonUiData.convertedDataResults, metricToExtract, 'Prior Year');
|
|
2695
|
+
if (priorYearSeries) {
|
|
2696
|
+
series.push(priorYearSeries);
|
|
2697
|
+
}
|
|
2698
|
+
}
|
|
2699
|
+
if (mainUiData?.convertedDataResults) {
|
|
2700
|
+
const currentYearSeries = extractSeriesFromConvertedData(mainUiData.convertedDataResults, metricToExtract, 'Current Year');
|
|
2701
|
+
if (currentYearSeries) {
|
|
2702
|
+
series.push(currentYearSeries);
|
|
2703
|
+
}
|
|
2704
|
+
}
|
|
2705
|
+
return series;
|
|
2706
|
+
}
|
|
2707
|
+
function extractSeriesFromConvertedData(convertedData, metricToExtract, seriesName) {
|
|
2708
|
+
const metricIndex = convertedData.metrics?.indexOf(metricToExtract);
|
|
2709
|
+
if (metricIndex === undefined || metricIndex === -1)
|
|
2710
|
+
return null;
|
|
2711
|
+
const dimensionIndex = convertedData.dimensions?.indexOf(DimensionEnum.MONTH);
|
|
2712
|
+
if (dimensionIndex === undefined || dimensionIndex === -1)
|
|
2713
|
+
return null;
|
|
2714
|
+
const dataPoints = [];
|
|
2715
|
+
convertedData.rows?.forEach((row) => {
|
|
2716
|
+
const monthValue = row.dimensionValues?.[dimensionIndex];
|
|
2717
|
+
const metricValue = parseFloat(row.metricValues?.[metricIndex] || '0');
|
|
2718
|
+
if (monthValue) {
|
|
2719
|
+
dataPoints.push({
|
|
2720
|
+
category: monthValue,
|
|
2721
|
+
value: metricValue,
|
|
2722
|
+
displayLabel: formatMonthLabel(monthValue)
|
|
2723
|
+
});
|
|
2724
|
+
}
|
|
2725
|
+
});
|
|
2726
|
+
return {
|
|
2727
|
+
name: seriesName,
|
|
2728
|
+
data: sortDataByMonth(dataPoints)
|
|
2729
|
+
};
|
|
2730
|
+
}
|
|
2731
|
+
function formatMonthLabel(monthValue) {
|
|
2732
|
+
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
2733
|
+
const monthNum = parseInt(monthValue, 10);
|
|
2734
|
+
if (monthNum >= 1 && monthNum <= 12) {
|
|
2735
|
+
return months[monthNum - 1];
|
|
2736
|
+
}
|
|
2737
|
+
return monthValue;
|
|
2738
|
+
}
|
|
2739
|
+
function sortDataByMonth(data) {
|
|
2740
|
+
return data.sort((a, b) => {
|
|
2741
|
+
const aMonth = parseInt(a.category, 10);
|
|
2742
|
+
const bMonth = parseInt(b.category, 10);
|
|
2743
|
+
return aMonth - bMonth;
|
|
2744
|
+
});
|
|
2745
|
+
}
|
|
2746
|
+
function transformTrendUiDataToChartSeries(trendUiData, metricToExtract) {
|
|
2747
|
+
if (!trendUiData?.convertedDataResults) {
|
|
2748
|
+
return [];
|
|
2749
|
+
}
|
|
2750
|
+
const convertedData = trendUiData.convertedDataResults;
|
|
2751
|
+
const metricIndex = convertedData.metrics?.indexOf(metricToExtract);
|
|
2752
|
+
if (metricIndex === undefined || metricIndex === -1)
|
|
2753
|
+
return [];
|
|
2754
|
+
const dateIndex = convertedData.dimensions?.indexOf(DimensionEnum.DATE);
|
|
2755
|
+
const monthIndex = convertedData.dimensions?.indexOf(DimensionEnum.MONTH);
|
|
2756
|
+
const dimensionIndex = dateIndex !== undefined && dateIndex !== -1
|
|
2757
|
+
? dateIndex
|
|
2758
|
+
: (monthIndex !== undefined && monthIndex !== -1 ? monthIndex : -1);
|
|
2759
|
+
if (dimensionIndex === -1)
|
|
2760
|
+
return [];
|
|
2761
|
+
const currentYear = new Date().getFullYear();
|
|
2762
|
+
const priorYear = currentYear - 1;
|
|
2763
|
+
const priorYearPoints = [];
|
|
2764
|
+
const currentYearPoints = [];
|
|
2765
|
+
convertedData.rows?.forEach((row) => {
|
|
2766
|
+
const dimValue = row.dimensionValues?.[dimensionIndex];
|
|
2767
|
+
const metricValue = parseFloat(row.metricValues?.[metricIndex] || '0');
|
|
2768
|
+
if (dimValue) {
|
|
2769
|
+
let year;
|
|
2770
|
+
let month;
|
|
2771
|
+
if (dimValue.includes('-')) {
|
|
2772
|
+
const parts = dimValue.split('-');
|
|
2773
|
+
year = parseInt(parts[0], 10);
|
|
2774
|
+
month = parseInt(parts[1], 10);
|
|
2775
|
+
}
|
|
2776
|
+
else if (dimValue.length >= 6) {
|
|
2777
|
+
year = parseInt(dimValue.substring(0, 4), 10);
|
|
2778
|
+
month = parseInt(dimValue.substring(4, 6), 10);
|
|
2779
|
+
}
|
|
2780
|
+
else {
|
|
2781
|
+
month = parseInt(dimValue, 10);
|
|
2782
|
+
year = currentYear;
|
|
2783
|
+
}
|
|
2784
|
+
const point = {
|
|
2785
|
+
category: String(month),
|
|
2786
|
+
value: metricValue,
|
|
2787
|
+
displayLabel: formatMonthLabel(String(month))
|
|
2788
|
+
};
|
|
2789
|
+
if (year === priorYear) {
|
|
2790
|
+
priorYearPoints.push(point);
|
|
2791
|
+
}
|
|
2792
|
+
else if (year === currentYear) {
|
|
2793
|
+
currentYearPoints.push(point);
|
|
2794
|
+
}
|
|
2795
|
+
}
|
|
2796
|
+
});
|
|
2797
|
+
const series = [];
|
|
2798
|
+
if (priorYearPoints.length > 0) {
|
|
2799
|
+
series.push({
|
|
2800
|
+
name: String(priorYear),
|
|
2801
|
+
data: aggregateAndSortByMonth(priorYearPoints)
|
|
2802
|
+
});
|
|
2803
|
+
}
|
|
2804
|
+
if (currentYearPoints.length > 0) {
|
|
2805
|
+
series.push({
|
|
2806
|
+
name: String(currentYear),
|
|
2807
|
+
data: aggregateAndSortByMonth(currentYearPoints)
|
|
2808
|
+
});
|
|
2809
|
+
}
|
|
2810
|
+
return series;
|
|
2811
|
+
}
|
|
2812
|
+
function aggregateAndSortByMonth(points) {
|
|
2813
|
+
const monthMap = new Map();
|
|
2814
|
+
points.forEach(point => {
|
|
2815
|
+
const existing = monthMap.get(point.category);
|
|
2816
|
+
if (existing) {
|
|
2817
|
+
existing.value += point.value;
|
|
2818
|
+
}
|
|
2819
|
+
else {
|
|
2820
|
+
monthMap.set(point.category, { ...point });
|
|
2821
|
+
}
|
|
2822
|
+
});
|
|
2823
|
+
return sortDataByMonth(Array.from(monthMap.values()));
|
|
2824
|
+
}
|
|
2825
|
+
function getConvertedDataForSource(uiData, source) {
|
|
2826
|
+
if (!uiData)
|
|
2827
|
+
return undefined;
|
|
2828
|
+
const periodInfo = uiData.periodInfo;
|
|
2829
|
+
let result;
|
|
2830
|
+
switch (source) {
|
|
2831
|
+
case 'current':
|
|
2832
|
+
result = uiData.convertedDataResults;
|
|
2833
|
+
break;
|
|
2834
|
+
case 'compare':
|
|
2835
|
+
result = uiData.convertedDataResultsCompare;
|
|
2836
|
+
break;
|
|
2837
|
+
case 'priorYear':
|
|
2838
|
+
if (periodInfo?.period === UiDataPeriodEnum.THIS_YEAR &&
|
|
2839
|
+
periodInfo?.comparePeriod === UiDataComparePeriodEnum.PREVIOUS_PERIOD) {
|
|
2840
|
+
result = uiData.convertedDataResultsCompare;
|
|
2841
|
+
}
|
|
2842
|
+
else if (periodInfo?.period === UiDataPeriodEnum.THIS_AND_LAST_YEAR) {
|
|
2843
|
+
result = uiData.convertedDataResults;
|
|
2844
|
+
}
|
|
2845
|
+
else if (periodInfo?.comparePeriod === UiDataComparePeriodEnum.SAME_PERIOD_LAST_YEAR) {
|
|
2846
|
+
result = uiData.convertedDataResultsCompare;
|
|
2847
|
+
}
|
|
2848
|
+
else if (periodInfo?.comparePeriod === UiDataComparePeriodEnum.PREVIOUS_PERIOD) {
|
|
2849
|
+
result = uiData.convertedDataResultsCompare;
|
|
2850
|
+
}
|
|
2851
|
+
else {
|
|
2852
|
+
result = uiData.convertedDataResultsCompare;
|
|
2853
|
+
}
|
|
2854
|
+
break;
|
|
2855
|
+
}
|
|
2856
|
+
return result;
|
|
2857
|
+
}
|
|
2858
|
+
function sumMetricFromUiData(uiData, metricToSum, source = 'current') {
|
|
2859
|
+
const convertedData = getConvertedDataForSource(uiData, source);
|
|
2860
|
+
if (!convertedData) {
|
|
2861
|
+
return 0;
|
|
2862
|
+
}
|
|
2863
|
+
let total = 0;
|
|
2864
|
+
const metricIndex = convertedData.metrics?.indexOf(metricToSum);
|
|
2865
|
+
if (metricIndex === undefined || metricIndex === -1) {
|
|
2866
|
+
return 0;
|
|
2867
|
+
}
|
|
2868
|
+
convertedData.rows?.forEach((row) => {
|
|
2869
|
+
const rawValue = row.metricValues?.[metricIndex];
|
|
2870
|
+
const metricValue = parseFloat(rawValue || '0');
|
|
2871
|
+
total += metricValue;
|
|
2872
|
+
});
|
|
2873
|
+
return total;
|
|
2874
|
+
}
|
|
2875
|
+
|
|
2876
|
+
function calculateFunnelRatios(funnelMetrics, baselineValues) {
|
|
2877
|
+
const ratios = new Map();
|
|
2878
|
+
const stages = funnelMetrics
|
|
2879
|
+
.filter(fm => fm.funnelMetric === fm.relatedMetric)
|
|
2880
|
+
.sort((a, b) => (a.funnelInd ?? 0) - (b.funnelInd ?? 0));
|
|
2881
|
+
for (let i = 0; i < stages.length - 1; i++) {
|
|
2882
|
+
const fromStage = stages[i].relatedMetric;
|
|
2883
|
+
const toStage = stages[i + 1].relatedMetric;
|
|
2884
|
+
if (fromStage && toStage) {
|
|
2885
|
+
const fromValue = baselineValues.get(fromStage) || 0;
|
|
2886
|
+
const toValue = baselineValues.get(toStage) || 0;
|
|
2887
|
+
if (fromValue > 0) {
|
|
2888
|
+
const ratio = toValue / fromValue;
|
|
2889
|
+
const key = `${fromStage}_to_${toStage}`;
|
|
2890
|
+
ratios.set(key, ratio);
|
|
2891
|
+
}
|
|
2892
|
+
}
|
|
2893
|
+
}
|
|
2894
|
+
return ratios;
|
|
2895
|
+
}
|
|
2896
|
+
function calculateRelatedMetricRatios(funnelMetrics, baselineValues) {
|
|
2897
|
+
const ratios = new Map();
|
|
2898
|
+
const stageGroups = new Map();
|
|
2899
|
+
funnelMetrics.forEach(fm => {
|
|
2900
|
+
if (fm.funnelMetric && fm.relatedMetric && fm.funnelMetric !== fm.relatedMetric) {
|
|
2901
|
+
if (!stageGroups.has(fm.funnelMetric)) {
|
|
2902
|
+
stageGroups.set(fm.funnelMetric, []);
|
|
2903
|
+
}
|
|
2904
|
+
stageGroups.get(fm.funnelMetric).push(fm);
|
|
2905
|
+
}
|
|
2906
|
+
});
|
|
2907
|
+
stageGroups.forEach((relatedMetrics, funnelStage) => {
|
|
2908
|
+
const funnelValue = baselineValues.get(funnelStage) || 0;
|
|
2909
|
+
if (funnelValue > 0) {
|
|
2910
|
+
relatedMetrics.forEach(fm => {
|
|
2911
|
+
if (fm.relatedMetric) {
|
|
2912
|
+
const relatedValue = baselineValues.get(fm.relatedMetric) || 0;
|
|
2913
|
+
const ratio = relatedValue / funnelValue;
|
|
2914
|
+
const key = `${fm.relatedMetric}_to_${funnelStage}`;
|
|
2915
|
+
ratios.set(key, ratio);
|
|
2916
|
+
}
|
|
2917
|
+
});
|
|
2918
|
+
}
|
|
2919
|
+
});
|
|
2920
|
+
return ratios;
|
|
2921
|
+
}
|
|
2922
|
+
function calculateMetricTargetsFromRevenueReverse(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues) {
|
|
2923
|
+
const revenuePercentageIncrease = ((revenueTarget - priorYearRevenue) / priorYearRevenue) * 100;
|
|
2924
|
+
const funnelRatios = calculateFunnelRatios(funnelMetrics, baselineValues);
|
|
2925
|
+
const relatedRatios = calculateRelatedMetricRatios(funnelMetrics, baselineValues);
|
|
2926
|
+
const sortedFunnelMetrics = [...funnelMetrics].sort((a, b) => {
|
|
2927
|
+
const aFunnel = a.funnelInd ?? 999;
|
|
2928
|
+
const bFunnel = b.funnelInd ?? 999;
|
|
2929
|
+
if (aFunnel !== bFunnel)
|
|
2930
|
+
return aFunnel - bFunnel;
|
|
2931
|
+
const aRelated = a.relatedInd ?? 999;
|
|
2932
|
+
const bRelated = b.relatedInd ?? 999;
|
|
2933
|
+
return aRelated - bRelated;
|
|
2934
|
+
});
|
|
2935
|
+
const stages = sortedFunnelMetrics
|
|
2936
|
+
.filter(fm => fm.funnelMetric === fm.relatedMetric)
|
|
2937
|
+
.map(fm => fm.relatedMetric)
|
|
2938
|
+
.filter(Boolean);
|
|
2939
|
+
const stageTargets = new Map();
|
|
2940
|
+
let currentRevenue = revenueTarget;
|
|
2941
|
+
for (let i = stages.length - 1; i >= 0; i--) {
|
|
2942
|
+
const stage = stages[i];
|
|
2943
|
+
const baseline = baselineValues.get(stage) || 0;
|
|
2944
|
+
if (i === stages.length - 1) {
|
|
2945
|
+
stageTargets.set(stage, currentRevenue);
|
|
2946
|
+
}
|
|
2947
|
+
else {
|
|
2948
|
+
const nextStage = stages[i + 1];
|
|
2949
|
+
const ratioKey = `${stage}_to_${nextStage}`;
|
|
2950
|
+
const ratio = funnelRatios.get(ratioKey) || 0;
|
|
2951
|
+
if (ratio > 0) {
|
|
2952
|
+
const nextStageTarget = stageTargets.get(nextStage) || 0;
|
|
2953
|
+
currentRevenue = nextStageTarget / ratio;
|
|
2954
|
+
stageTargets.set(stage, currentRevenue);
|
|
2955
|
+
}
|
|
2956
|
+
else {
|
|
2957
|
+
const increaseNeeded = revenueTarget / baseline;
|
|
2958
|
+
stageTargets.set(stage, baseline * increaseNeeded);
|
|
2959
|
+
}
|
|
2960
|
+
}
|
|
2961
|
+
}
|
|
2962
|
+
const metricCalculations = [];
|
|
2963
|
+
const stageGroups = new Map();
|
|
2964
|
+
sortedFunnelMetrics.forEach(fm => {
|
|
2965
|
+
if (fm.funnelMetric) {
|
|
2966
|
+
if (!stageGroups.has(fm.funnelMetric)) {
|
|
2967
|
+
stageGroups.set(fm.funnelMetric, []);
|
|
2968
|
+
}
|
|
2969
|
+
stageGroups.get(fm.funnelMetric).push(fm);
|
|
2970
|
+
}
|
|
2971
|
+
});
|
|
2972
|
+
stageGroups.forEach((metrics, funnelStage) => {
|
|
2973
|
+
const stageTarget = stageTargets.get(funnelStage);
|
|
2974
|
+
const stageBaseline = baselineValues.get(funnelStage) || 0;
|
|
2975
|
+
const stageIncrease = stageTarget ? stageTarget - stageBaseline : 0;
|
|
2976
|
+
metrics.forEach(fm => {
|
|
2977
|
+
if (!fm.relatedMetric)
|
|
2978
|
+
return;
|
|
2979
|
+
const currentValue = baselineValues.get(fm.relatedMetric) || 0;
|
|
2980
|
+
const isFunnelStage = fm.funnelMetric === fm.relatedMetric;
|
|
2981
|
+
let targetValue;
|
|
2982
|
+
let percentageIncrease;
|
|
2983
|
+
if (isFunnelStage && stageTarget !== undefined) {
|
|
2984
|
+
targetValue = stageTarget;
|
|
2985
|
+
percentageIncrease = currentValue > 0 ? ((targetValue - currentValue) / currentValue) * 100 : 0;
|
|
2986
|
+
}
|
|
2987
|
+
else if (fm.relatedMetric === MetricEnum.BOUNCE_RATE) {
|
|
2988
|
+
const stageTargetValue = stageTargets.get(funnelStage) || stageBaseline;
|
|
2989
|
+
const stageIncreaseRatio = stageBaseline > 0 ? stageTargetValue / stageBaseline : 1;
|
|
2990
|
+
targetValue = currentValue / stageIncreaseRatio;
|
|
2991
|
+
percentageIncrease = currentValue > 0 ? ((targetValue - currentValue) / currentValue) * 100 : 0;
|
|
2992
|
+
}
|
|
2993
|
+
else if (isDerivedMetric(fm.relatedMetric)) {
|
|
2994
|
+
targetValue = currentValue;
|
|
2995
|
+
percentageIncrease = 0;
|
|
2996
|
+
}
|
|
2997
|
+
else {
|
|
2998
|
+
const ratioKey = `${fm.relatedMetric}_to_${funnelStage}`;
|
|
2999
|
+
const impactRatio = relatedRatios.get(ratioKey) || 1;
|
|
3000
|
+
const relatedMetrics = metrics.filter(m => m.relatedMetric &&
|
|
3001
|
+
m.relatedMetric !== funnelStage &&
|
|
3002
|
+
!isDerivedMetric(m.relatedMetric) &&
|
|
3003
|
+
m.relatedMetric !== MetricEnum.BOUNCE_RATE);
|
|
3004
|
+
const numRelatedMetrics = relatedMetrics.length;
|
|
3005
|
+
if (numRelatedMetrics > 0 && stageBaseline > 0) {
|
|
3006
|
+
const avgIncreaseNeeded = stageIncrease / numRelatedMetrics;
|
|
3007
|
+
const metricIncreaseNeeded = impactRatio > 0 ? avgIncreaseNeeded / impactRatio : avgIncreaseNeeded;
|
|
3008
|
+
targetValue = currentValue + metricIncreaseNeeded;
|
|
3009
|
+
percentageIncrease = currentValue > 0 ? ((targetValue - currentValue) / currentValue) * 100 : 0;
|
|
3010
|
+
}
|
|
3011
|
+
else {
|
|
3012
|
+
const stageTargetValue = stageTargets.get(funnelStage) || stageBaseline;
|
|
3013
|
+
const stageIncreaseRatio = stageBaseline > 0 ? stageTargetValue / stageBaseline : 1;
|
|
3014
|
+
targetValue = currentValue * stageIncreaseRatio;
|
|
3015
|
+
percentageIncrease = currentValue > 0 ? ((targetValue - currentValue) / currentValue) * 100 : 0;
|
|
3016
|
+
}
|
|
3017
|
+
}
|
|
3018
|
+
metricCalculations.push({
|
|
3019
|
+
metric: fm.relatedMetric,
|
|
3020
|
+
funnelMetric: fm.funnelMetric,
|
|
3021
|
+
currentValue,
|
|
3022
|
+
targetValue,
|
|
3023
|
+
percentageIncrease,
|
|
3024
|
+
isFunnelStage,
|
|
3025
|
+
funnelInd: fm.funnelInd,
|
|
3026
|
+
relatedInd: fm.relatedInd,
|
|
3027
|
+
description: fm.relatedMetricDescription
|
|
3028
|
+
});
|
|
3029
|
+
});
|
|
3030
|
+
});
|
|
3031
|
+
const validation = validateRevenueTarget(revenueTarget, metricCalculations, baselineValues, funnelRatios);
|
|
3032
|
+
let adjustmentApplied = 0;
|
|
3033
|
+
if (Math.abs(validation.difference) > 0.01) {
|
|
3034
|
+
metricCalculations.forEach(calc => {
|
|
3035
|
+
if (calc.isFunnelStage && calc.metric !== MetricEnum.BOUNCE_RATE) {
|
|
3036
|
+
calc.targetValue += validation.difference / stages.length;
|
|
3037
|
+
calc.percentageIncrease = calc.currentValue > 0
|
|
3038
|
+
? ((calc.targetValue - calc.currentValue) / calc.currentValue) * 100
|
|
3039
|
+
: 0;
|
|
3040
|
+
}
|
|
3041
|
+
});
|
|
3042
|
+
adjustmentApplied = validation.difference;
|
|
3043
|
+
}
|
|
3044
|
+
return {
|
|
3045
|
+
revenueTarget,
|
|
3046
|
+
revenuePercentageIncrease,
|
|
3047
|
+
metricCalculations,
|
|
3048
|
+
adjustmentApplied
|
|
3049
|
+
};
|
|
3050
|
+
}
|
|
3051
|
+
const DERIVED_METRICS = new Set([
|
|
3052
|
+
MetricEnum.REVENUE_PER_PRODUCT_VIEW,
|
|
3053
|
+
MetricEnum.REVENUE_PER_ADD_TO_CART,
|
|
3054
|
+
MetricEnum.REVENUE_PER_CHECKOUT
|
|
3055
|
+
]);
|
|
3056
|
+
function isDerivedMetric(metric) {
|
|
3057
|
+
return DERIVED_METRICS.has(metric);
|
|
3058
|
+
}
|
|
3059
|
+
function validateRevenueTarget(targetRevenue, calculations, baselineValues, funnelRatios) {
|
|
3060
|
+
const stages = calculations
|
|
3061
|
+
.filter(c => c.isFunnelStage)
|
|
3062
|
+
.sort((a, b) => (a.funnelInd ?? 0) - (b.funnelInd ?? 0));
|
|
3063
|
+
let calculatedRevenue = 0;
|
|
3064
|
+
if (stages.length > 0) {
|
|
3065
|
+
calculatedRevenue = stages[stages.length - 1].targetValue;
|
|
3066
|
+
}
|
|
3067
|
+
const difference = targetRevenue - calculatedRevenue;
|
|
3068
|
+
const percentageDifference = targetRevenue > 0 ? (difference / targetRevenue) * 100 : 0;
|
|
3069
|
+
const withinTolerance = Math.abs(difference) < 0.01 || Math.abs(percentageDifference) < 0.001;
|
|
3070
|
+
return {
|
|
3071
|
+
calculatedRevenue,
|
|
3072
|
+
difference,
|
|
3073
|
+
percentageDifference,
|
|
3074
|
+
withinTolerance
|
|
3075
|
+
};
|
|
3076
|
+
}
|
|
3077
|
+
|
|
3078
|
+
class RevenueCalculatorService {
|
|
3079
|
+
calculateTargetsFromRevenue(revenueTarget, mainUiData, funnelMetrics) {
|
|
3080
|
+
const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
|
|
3081
|
+
const baselineValues = this.extractBaselineValues(mainUiData, funnelMetrics);
|
|
3082
|
+
return calculateMetricTargetsFromRevenue(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues);
|
|
3083
|
+
}
|
|
3084
|
+
calculateTargetsFromPercentage(percentageIncrease, mainUiData, funnelMetrics) {
|
|
3085
|
+
const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
|
|
3086
|
+
const revenueTarget = priorYearRevenue * (1 + percentageIncrease / 100);
|
|
3087
|
+
return this.calculateTargetsFromRevenue(revenueTarget, mainUiData, funnelMetrics);
|
|
3088
|
+
}
|
|
3089
|
+
calculateTargetsFromRevenueWithRatios(revenueTarget, mainUiData, funnelMetrics) {
|
|
3090
|
+
const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
|
|
3091
|
+
const baselineValues = this.extractBaselineValues(mainUiData, funnelMetrics);
|
|
3092
|
+
return calculateMetricTargetsFromRevenueReverse(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues);
|
|
3093
|
+
}
|
|
3094
|
+
calculateTargetsFromPercentageWithRatios(percentageIncrease, mainUiData, funnelMetrics) {
|
|
3095
|
+
const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
|
|
3096
|
+
const revenueTarget = priorYearRevenue * (1 + percentageIncrease / 100);
|
|
3097
|
+
return this.calculateTargetsFromRevenueWithRatios(revenueTarget, mainUiData, funnelMetrics);
|
|
3098
|
+
}
|
|
3099
|
+
extractPriorYearRevenue(mainUiData) {
|
|
3100
|
+
return sumMetricFromUiData(mainUiData, MetricEnum.PURCHASE_REVENUE, 'priorYear');
|
|
3101
|
+
}
|
|
3102
|
+
extractBaselineValues(mainUiData, funnelMetrics) {
|
|
3103
|
+
const baselineValues = new Map();
|
|
3104
|
+
if (!mainUiData) {
|
|
3105
|
+
return baselineValues;
|
|
3106
|
+
}
|
|
3107
|
+
funnelMetrics.forEach(fm => {
|
|
3108
|
+
if (fm.relatedMetric) {
|
|
3109
|
+
const value = sumMetricFromUiData(mainUiData, fm.relatedMetric, 'priorYear');
|
|
3110
|
+
baselineValues.set(fm.relatedMetric, value);
|
|
3111
|
+
}
|
|
3112
|
+
});
|
|
3113
|
+
return baselineValues;
|
|
3114
|
+
}
|
|
3115
|
+
getMetricsByFunnelStage(calculations) {
|
|
3116
|
+
const grouped = new Map();
|
|
3117
|
+
calculations.forEach(calc => {
|
|
3118
|
+
if (calc.isFunnelStage) {
|
|
3119
|
+
if (!grouped.has(calc.metric)) {
|
|
3120
|
+
grouped.set(calc.metric, []);
|
|
3121
|
+
}
|
|
3122
|
+
grouped.get(calc.metric).push(calc);
|
|
3123
|
+
}
|
|
3124
|
+
else if (calc.funnelMetric) {
|
|
3125
|
+
if (!grouped.has(calc.funnelMetric)) {
|
|
3126
|
+
grouped.set(calc.funnelMetric, []);
|
|
3127
|
+
}
|
|
3128
|
+
grouped.get(calc.funnelMetric).push(calc);
|
|
3129
|
+
}
|
|
3130
|
+
});
|
|
3131
|
+
return grouped;
|
|
3132
|
+
}
|
|
3133
|
+
static { this.ɵfac = function RevenueCalculatorService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RevenueCalculatorService)(); }; }
|
|
3134
|
+
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: RevenueCalculatorService, factory: RevenueCalculatorService.ɵfac, providedIn: 'root' }); }
|
|
3135
|
+
}
|
|
3136
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RevenueCalculatorService, [{
|
|
3137
|
+
type: Injectable,
|
|
3138
|
+
args: [{
|
|
3139
|
+
providedIn: 'root'
|
|
3140
|
+
}]
|
|
3141
|
+
}], null, null); })();
|
|
3142
|
+
|
|
2538
3143
|
const _c0$16 = a0 => ["skeleton-loader", "rounded-lg", "relative", "overflow-hidden", a0];
|
|
2539
|
-
const _c1$
|
|
3144
|
+
const _c1$D = a0 => ["skeleton-shimmer-overlay", "absolute", "inset-0", "bg-gradient-to-r", a0];
|
|
2540
3145
|
class SkeletonLoaderComponent {
|
|
2541
3146
|
constructor() {
|
|
2542
3147
|
this.width = input('100%', ...(ngDevMode ? [{ debugName: "width" }] : []));
|
|
@@ -2554,7 +3159,7 @@ class SkeletonLoaderComponent {
|
|
|
2554
3159
|
i0.ɵɵclassProp("skeleton-shimmer", true)("skeleton-pulse", ctx.pulse());
|
|
2555
3160
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(10, _c0$16, ctx.isLightMode() ? "bg-slate-200/80" : "bg-slate-700/80"));
|
|
2556
3161
|
i0.ɵɵadvance();
|
|
2557
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(12, _c1$
|
|
3162
|
+
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(12, _c1$D, ctx.isLightMode() ? "from-transparent via-white/60 to-transparent" : "from-transparent via-slate-500/40 to-transparent"));
|
|
2558
3163
|
} }, dependencies: [NgClass], styles: [".skeleton-loader[_ngcontent-%COMP%]{position:relative;overflow:hidden}.skeleton-shimmer-overlay[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_shimmer 2s infinite cubic-bezier(.4,0,.6,1);transform:translate(-100%)}@keyframes _ngcontent-%COMP%_shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.skeleton-pulse[_ngcontent-%COMP%]{animation:_ngcontent-%COMP%_pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes _ngcontent-%COMP%_pulse{0%,to{opacity:1}50%{opacity:.6}}"], changeDetection: 0 }); }
|
|
2559
3164
|
}
|
|
2560
3165
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(SkeletonLoaderComponent, [{
|
|
@@ -5496,7 +6101,7 @@ class OverallAssessmentComponent {
|
|
|
5496
6101
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(OverallAssessmentComponent, { className: "OverallAssessmentComponent", filePath: "lib/components/funnel-analysis-dashboard/overall-assessment.component.ts", lineNumber: 303 }); })();
|
|
5497
6102
|
|
|
5498
6103
|
const _c0$13 = () => [1, 2, 3];
|
|
5499
|
-
const _c1$
|
|
6104
|
+
const _c1$C = () => [1, 2, 3, 4];
|
|
5500
6105
|
const _c2$q = () => [];
|
|
5501
6106
|
function InsightCardComponent_Conditional_0_Conditional_0_For_7_Template(rf, ctx) { if (rf & 1) {
|
|
5502
6107
|
i0.ɵɵelementStart(0, "div", 7);
|
|
@@ -5535,7 +6140,7 @@ function InsightCardComponent_Conditional_0_Conditional_0_Template(rf, ctx) { if
|
|
|
5535
6140
|
i0.ɵɵadvance();
|
|
5536
6141
|
i0.ɵɵrepeater(i0.ɵɵpureFunction0(8, _c0$13));
|
|
5537
6142
|
i0.ɵɵadvance(3);
|
|
5538
|
-
i0.ɵɵrepeater(i0.ɵɵpureFunction0(9, _c1$
|
|
6143
|
+
i0.ɵɵrepeater(i0.ɵɵpureFunction0(9, _c1$C));
|
|
5539
6144
|
} }
|
|
5540
6145
|
function InsightCardComponent_Conditional_0_Conditional_1_Conditional_7_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
5541
6146
|
i0.ɵɵnamespaceSVG();
|
|
@@ -8234,7 +8839,7 @@ class MetricCardComponent {
|
|
|
8234
8839
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricCardComponent, { className: "MetricCardComponent", filePath: "lib/components/funnel-analysis-dashboard/metric-card.component.ts", lineNumber: 537 }); })();
|
|
8235
8840
|
|
|
8236
8841
|
const _c0$12 = () => [1, 2, 3];
|
|
8237
|
-
const _c1$
|
|
8842
|
+
const _c1$B = (a0, a1, a2) => [a0, a1, a2];
|
|
8238
8843
|
const _c2$p = (a0, a1) => [a0, a1];
|
|
8239
8844
|
const _forTrack0$O = ($index, $item) => $item.metric;
|
|
8240
8845
|
const _forTrack1$7 = ($index, $item) => $item.dimensionValue;
|
|
@@ -8446,7 +9051,7 @@ function BreakdownSectionComponent_Conditional_1_For_9_For_27_Template(rf, ctx)
|
|
|
8446
9051
|
const ɵ$index_133_r9 = ctx.$index;
|
|
8447
9052
|
const group_r5 = i0.ɵɵnextContext().$implicit;
|
|
8448
9053
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
8449
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(31, _c1$
|
|
9054
|
+
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction3(31, _c1$B, ctx_r0.getRowBackgroundClass(metric_r8, ɵ$index_133_r9), ctx_r0.getPriorityDividerClass(metric_r8, ɵ$index_133_r9, group_r5.values), ctx_r0.isLightMode() ? "hover:bg-blue-50" : "hover:bg-slate-700/30"));
|
|
8450
9055
|
i0.ɵɵadvance(3);
|
|
8451
9056
|
i0.ɵɵproperty("ngClass", ctx_r0.isLightMode() ? "text-slate-600 group-hover:text-slate-900" : "text-slate-400 group-hover:text-white")("libSymphiqTooltip", ctx_r0.getBreakdownRowTooltip(metric_r8))("tooltipPosition", "auto");
|
|
8452
9057
|
i0.ɵɵadvance();
|
|
@@ -13834,20 +14439,12 @@ class ProfileItemLookupService {
|
|
|
13834
14439
|
return undefined;
|
|
13835
14440
|
}
|
|
13836
14441
|
findItemsByIds(ids) {
|
|
13837
|
-
console.log('[ProfileItemLookupService] findItemsByIds called:', {
|
|
13838
|
-
inputIds: ids,
|
|
13839
|
-
hasProfileData: !!this.profileData(),
|
|
13840
|
-
hasProfileStructured: !!this.profileData()?.profileStructured,
|
|
13841
|
-
hasSections: !!this.profileData()?.profileStructured?.sections
|
|
13842
|
-
});
|
|
13843
14442
|
const results = ids
|
|
13844
14443
|
.map(id => {
|
|
13845
14444
|
const found = this.findItemById(id);
|
|
13846
|
-
console.log('[ProfileItemLookupService] findItemById:', { id, found: !!found });
|
|
13847
14445
|
return found;
|
|
13848
14446
|
})
|
|
13849
14447
|
.filter((item) => item !== undefined);
|
|
13850
|
-
console.log('[ProfileItemLookupService] findItemsByIds result:', { inputCount: ids.length, foundCount: results.length });
|
|
13851
14448
|
return results;
|
|
13852
14449
|
}
|
|
13853
14450
|
findItemWithContext(id) {
|
|
@@ -13924,11 +14521,6 @@ class RelatedAreaChipsComponent {
|
|
|
13924
14521
|
this.relatedItems = computed(() => {
|
|
13925
14522
|
const ids = this.relatedAreaIds();
|
|
13926
14523
|
const items = this.lookupService.findItemsByIds(ids);
|
|
13927
|
-
console.log('[RelatedAreaChips] relatedItems computed:', {
|
|
13928
|
-
inputIds: ids,
|
|
13929
|
-
foundItems: items,
|
|
13930
|
-
foundCount: items.length
|
|
13931
|
-
});
|
|
13932
14524
|
return items;
|
|
13933
14525
|
}, ...(ngDevMode ? [{ debugName: "relatedItems" }] : []));
|
|
13934
14526
|
}
|
|
@@ -14032,16 +14624,8 @@ class CompetitorChipListComponent {
|
|
|
14032
14624
|
this.modalService = inject(ModalService);
|
|
14033
14625
|
this.competitorItems = computed(() => {
|
|
14034
14626
|
const ids = this.relatedCompetitorIds();
|
|
14035
|
-
console.log('[CompetitorChipList] competitorItems computed:', {
|
|
14036
|
-
inputIds: ids,
|
|
14037
|
-
hasIds: ids && ids.length > 0
|
|
14038
|
-
});
|
|
14039
14627
|
if (ids && ids.length > 0) {
|
|
14040
14628
|
const items = this.lookupService.findItemsByIds(ids);
|
|
14041
|
-
console.log('[CompetitorChipList] lookupService.findItemsByIds result:', {
|
|
14042
|
-
foundItems: items,
|
|
14043
|
-
foundCount: items.length
|
|
14044
|
-
});
|
|
14045
14629
|
return items;
|
|
14046
14630
|
}
|
|
14047
14631
|
return [];
|
|
@@ -14049,11 +14633,9 @@ class CompetitorChipListComponent {
|
|
|
14049
14633
|
this.displayItems = computed(() => {
|
|
14050
14634
|
const items = this.competitorItems();
|
|
14051
14635
|
if (items.length > 0) {
|
|
14052
|
-
console.log('[CompetitorChipList] displayItems: using competitorItems', { count: items.length });
|
|
14053
14636
|
return items;
|
|
14054
14637
|
}
|
|
14055
14638
|
const fallbackItems = this.competitors().map(name => ({ label: name }));
|
|
14056
|
-
console.log('[CompetitorChipList] displayItems: using fallback competitors', { count: fallbackItems.length, fallbackItems });
|
|
14057
14639
|
return fallbackItems;
|
|
14058
14640
|
}, ...(ngDevMode ? [{ debugName: "displayItems" }] : []));
|
|
14059
14641
|
}
|
|
@@ -14599,7 +15181,6 @@ class RelatedRecommendationChipsComponent {
|
|
|
14599
15181
|
scrollToRecommendation(recommendationId) {
|
|
14600
15182
|
const targetElement = document.getElementById(`recommendation-${recommendationId}`);
|
|
14601
15183
|
if (!targetElement) {
|
|
14602
|
-
console.warn(`Recommendation element not found: recommendation-${recommendationId}`);
|
|
14603
15184
|
const recommendationsSection = document.querySelector('[data-subsection-id="recommendations"]');
|
|
14604
15185
|
if (recommendationsSection) {
|
|
14605
15186
|
const expandButton = recommendationsSection.querySelector('[aria-expanded="false"]');
|
|
@@ -15422,29 +16003,13 @@ class RecommendationCardComponent {
|
|
|
15422
16003
|
let result;
|
|
15423
16004
|
if (this.recommendation()) {
|
|
15424
16005
|
result = this.recommendation();
|
|
15425
|
-
console.log('[RecommendationCard] detailedRecommendation: using direct recommendation input', {
|
|
15426
|
-
id: result?.id,
|
|
15427
|
-
hasRelatedCompetitorIds: !!result?.relatedCompetitorIds,
|
|
15428
|
-
relatedCompetitorIds: result?.relatedCompetitorIds,
|
|
15429
|
-
hasRelatedProfileItemIds: !!result?.relatedProfileItemIds,
|
|
15430
|
-
relatedProfileItemIds: result?.relatedProfileItemIds
|
|
15431
|
-
});
|
|
15432
16006
|
return result;
|
|
15433
16007
|
}
|
|
15434
16008
|
const item = this.item();
|
|
15435
16009
|
if (!item?.id) {
|
|
15436
|
-
console.log('[RecommendationCard] detailedRecommendation: no item id');
|
|
15437
16010
|
return undefined;
|
|
15438
16011
|
}
|
|
15439
16012
|
result = this.profileContextService.getRecommendationById(item.id);
|
|
15440
|
-
console.log('[RecommendationCard] detailedRecommendation: from profileContextService', {
|
|
15441
|
-
itemId: item.id,
|
|
15442
|
-
found: !!result,
|
|
15443
|
-
hasRelatedCompetitorIds: !!result?.relatedCompetitorIds,
|
|
15444
|
-
relatedCompetitorIds: result?.relatedCompetitorIds,
|
|
15445
|
-
hasRelatedProfileItemIds: !!result?.relatedProfileItemIds,
|
|
15446
|
-
relatedProfileItemIds: result?.relatedProfileItemIds
|
|
15447
|
-
});
|
|
15448
16013
|
return result;
|
|
15449
16014
|
}, ...(ngDevMode ? [{ debugName: "detailedRecommendation" }] : []));
|
|
15450
16015
|
this.businessContextItems = computed(() => {
|
|
@@ -15507,13 +16072,6 @@ class RecommendationCardComponent {
|
|
|
15507
16072
|
const hasCompetitors = !!(detailed?.relatedCompetitorIds && detailed.relatedCompetitorIds.length > 0);
|
|
15508
16073
|
const isExpanded = this.isActuallyExpanded();
|
|
15509
16074
|
const shouldShow = hasCompetitors && isExpanded;
|
|
15510
|
-
console.log('[RecommendationCard] shouldShowRelatedCompetitors:', {
|
|
15511
|
-
hasDetailedRec: !!detailed,
|
|
15512
|
-
relatedCompetitorIds: detailed?.relatedCompetitorIds,
|
|
15513
|
-
hasCompetitors,
|
|
15514
|
-
isExpanded,
|
|
15515
|
-
shouldShow
|
|
15516
|
-
});
|
|
15517
16075
|
return shouldShow;
|
|
15518
16076
|
}, ...(ngDevMode ? [{ debugName: "shouldShowRelatedCompetitors" }] : []));
|
|
15519
16077
|
this.shouldShowRelatedAreas = computed(() => {
|
|
@@ -15521,13 +16079,6 @@ class RecommendationCardComponent {
|
|
|
15521
16079
|
const hasAreas = !!(detailed?.relatedProfileItemIds && detailed.relatedProfileItemIds.length > 0);
|
|
15522
16080
|
const isExpanded = this.isActuallyExpanded();
|
|
15523
16081
|
const shouldShow = hasAreas && isExpanded;
|
|
15524
|
-
console.log('[RecommendationCard] shouldShowRelatedAreas:', {
|
|
15525
|
-
hasDetailedRec: !!detailed,
|
|
15526
|
-
relatedProfileItemIds: detailed?.relatedProfileItemIds,
|
|
15527
|
-
hasAreas,
|
|
15528
|
-
isExpanded,
|
|
15529
|
-
shouldShow
|
|
15530
|
-
});
|
|
15531
16082
|
return shouldShow;
|
|
15532
16083
|
}, ...(ngDevMode ? [{ debugName: "shouldShowRelatedAreas" }] : []));
|
|
15533
16084
|
this.shouldShowRelatedFocusAreas = computed(() => {
|
|
@@ -15701,23 +16252,9 @@ class RecommendationCardComponent {
|
|
|
15701
16252
|
return detailed?.relatedFocusAreas || [];
|
|
15702
16253
|
}
|
|
15703
16254
|
logCompetitorData() {
|
|
15704
|
-
const detailed = this.detailedRecommendation();
|
|
15705
|
-
console.log('[RecommendationCard] logCompetitorData:', {
|
|
15706
|
-
recommendationId: this.item()?.id,
|
|
15707
|
-
recommendationLabel: this.displayItem()?.label,
|
|
15708
|
-
relatedCompetitorIds: detailed?.relatedCompetitorIds,
|
|
15709
|
-
hasCompetitors: !!(detailed?.relatedCompetitorIds && detailed.relatedCompetitorIds.length > 0)
|
|
15710
|
-
});
|
|
15711
16255
|
return false;
|
|
15712
16256
|
}
|
|
15713
16257
|
logAreaData() {
|
|
15714
|
-
const detailed = this.detailedRecommendation();
|
|
15715
|
-
console.log('[RecommendationCard] logAreaData:', {
|
|
15716
|
-
recommendationId: this.item()?.id,
|
|
15717
|
-
recommendationLabel: this.displayItem()?.label,
|
|
15718
|
-
relatedProfileItemIds: detailed?.relatedProfileItemIds,
|
|
15719
|
-
hasAreas: !!(detailed?.relatedProfileItemIds && detailed.relatedProfileItemIds.length > 0)
|
|
15720
|
-
});
|
|
15721
16258
|
return false;
|
|
15722
16259
|
}
|
|
15723
16260
|
onCardClick(event) {
|
|
@@ -24531,9 +25068,6 @@ class FloatingTocComponent {
|
|
|
24531
25068
|
if (element) {
|
|
24532
25069
|
this.scrollToElement(element);
|
|
24533
25070
|
}
|
|
24534
|
-
else {
|
|
24535
|
-
console.warn('[FloatingTOC] Element not found for section:', sectionId);
|
|
24536
|
-
}
|
|
24537
25071
|
if (!this.isPinned()) {
|
|
24538
25072
|
this.isHovered.set(false);
|
|
24539
25073
|
}
|
|
@@ -24543,9 +25077,6 @@ class FloatingTocComponent {
|
|
|
24543
25077
|
if (element) {
|
|
24544
25078
|
this.scrollToElement(element);
|
|
24545
25079
|
}
|
|
24546
|
-
else {
|
|
24547
|
-
console.warn('[FloatingTOC] Element not found for subsection:', subsectionId);
|
|
24548
|
-
}
|
|
24549
25080
|
if (!this.isPinned()) {
|
|
24550
25081
|
this.isHovered.set(false);
|
|
24551
25082
|
}
|
|
@@ -26775,7 +27306,7 @@ class FunnelWelcomeBannerComponent {
|
|
|
26775
27306
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FunnelWelcomeBannerComponent, { className: "FunnelWelcomeBannerComponent", filePath: "lib/components/funnel-analysis-dashboard/funnel-welcome-banner.component.ts", lineNumber: 113 }); })();
|
|
26776
27307
|
|
|
26777
27308
|
const _c0$W = [[["", "slot", "overall-performance"]], [["", "slot", "performance-metrics"]], [["", "slot", "performance-breakdowns"]], [["", "slot", "competitive-intelligence"]]];
|
|
26778
|
-
const _c1$
|
|
27309
|
+
const _c1$A = ["[slot=overall-performance]", "[slot=performance-metrics]", "[slot=performance-breakdowns]", "[slot=competitive-intelligence]"];
|
|
26779
27310
|
class CollapsibleFunnelSectionGroupComponent {
|
|
26780
27311
|
constructor() {
|
|
26781
27312
|
this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
|
|
@@ -26906,7 +27437,7 @@ class CollapsibleFunnelSectionGroupComponent {
|
|
|
26906
27437
|
: 'border-slate-200';
|
|
26907
27438
|
}
|
|
26908
27439
|
static { this.ɵfac = function CollapsibleFunnelSectionGroupComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || CollapsibleFunnelSectionGroupComponent)(); }; }
|
|
26909
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollapsibleFunnelSectionGroupComponent, selectors: [["symphiq-collapsible-funnel-section-group"]], inputs: { viewMode: [1, "viewMode"] }, ngContentSelectors: _c1$
|
|
27440
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: CollapsibleFunnelSectionGroupComponent, selectors: [["symphiq-collapsible-funnel-section-group"]], inputs: { viewMode: [1, "viewMode"] }, ngContentSelectors: _c1$A, decls: 90, vars: 58, consts: [[1, "rounded-2xl", "border", "shadow-lg", "overflow-hidden", 3, "ngClass"], [1, "px-6", "py-5", "border-b", 3, "ngClass"], [1, "flex", "items-center", "justify-between"], [1, "flex", "items-center", "gap-3"], [1, "p-2.5", "rounded-lg", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M9 17v-2m3 2v-4m3 4v-6m2 10H7a2 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, "text-xl", "font-bold", 3, "ngClass"], [1, "text-sm", "mt-0.5", 3, "ngClass"], [1, "p-6", 3, "ngClass"], [1, "mb-6", "p-4", "rounded-xl", "border", "flex", "items-start", "gap-3", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-5", "h-5", "flex-shrink-0", "mt-0.5", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], [1, "flex-1"], [1, "font-semibold", "text-sm", "mb-1", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], [1, "space-y-3"], [1, "rounded-xl", "border", "overflow-hidden", "transition-all", "duration-200", 3, "id", "ngClass"], ["type", "button", 1, "cursor-pointer", "w-full", "px-5", "py-4", "flex", "items-center", "justify-between", "gap-4", "text-left", "transition-colors", "duration-200", 3, "click", "ngClass"], [1, "flex", "items-center", "gap-3", "flex-1", "min-w-0"], [1, "p-2", "rounded-lg", "flex-shrink-0", "transition-colors", "duration-200", 3, "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 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"], [1, "flex-1", "min-w-0"], [1, "font-semibold", "transition-colors", "duration-200", 3, "ngClass"], [1, "text-sm", "mt-0.5", "transition-colors", "duration-200", 3, "ngClass"], [1, "w-5", "h-5", "flex-shrink-0", "transition-transform", "duration-200", 3, "ngClass"], ["stroke", "currentColor", "stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], [1, "grid", "transition-[grid-template-rows]", "duration-300", "ease-in-out"], [1, "overflow-hidden"], [1, "border-t", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M7 12l3-3 3 3 4-4M8 21l4-4 4 4M3 4h18M4 4h16v12a1 1 0 01-1 1H5a1 1 0 01-1-1V4z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M4 5a1 1 0 011-1h14a1 1 0 011 1v2a1 1 0 01-1 1H5a1 1 0 01-1-1V5zM4 13a1 1 0 011-1h6a1 1 0 011 1v6a1 1 0 01-1 1H5a1 1 0 01-1-1v-6zM16 13a1 1 0 011-1h2a1 1 0 011 1v6a1 1 0 01-1 1h-2a1 1 0 01-1-1v-6z"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4"]], template: function CollapsibleFunnelSectionGroupComponent_Template(rf, ctx) { if (rf & 1) {
|
|
26910
27441
|
i0.ɵɵprojectionDef(_c0$W);
|
|
26911
27442
|
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "div", 3)(4, "div", 4);
|
|
26912
27443
|
i0.ɵɵnamespaceSVG();
|
|
@@ -27751,7 +28282,7 @@ class ViewModeSwitcherModalComponent {
|
|
|
27751
28282
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ViewModeSwitcherModalComponent, { className: "ViewModeSwitcherModalComponent", filePath: "lib/components/shared/view-mode-switcher-modal.component.ts", lineNumber: 160 }); })();
|
|
27752
28283
|
|
|
27753
28284
|
const _c0$V = a0 => ({ name: "check-badge", source: a0 });
|
|
27754
|
-
const _c1$
|
|
28285
|
+
const _c1$z = a0 => ({ name: "check-circle", source: a0 });
|
|
27755
28286
|
const _c2$o = a0 => ({ name: "chevron-right", source: a0 });
|
|
27756
28287
|
const _forTrack0$z = ($index, $item) => $item.area;
|
|
27757
28288
|
function KeyStrengthsListModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -27812,7 +28343,7 @@ function KeyStrengthsListModalContentComponent_Conditional_2_For_2_Template(rf,
|
|
|
27812
28343
|
i0.ɵɵadvance();
|
|
27813
28344
|
i0.ɵɵtextInterpolate1(" ", strength_r3.description, " ");
|
|
27814
28345
|
i0.ɵɵadvance(3);
|
|
27815
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$
|
|
28346
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$z, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses());
|
|
27816
28347
|
i0.ɵɵadvance();
|
|
27817
28348
|
i0.ɵɵproperty("ngClass", ctx_r0.countClasses());
|
|
27818
28349
|
i0.ɵɵadvance();
|
|
@@ -27983,7 +28514,7 @@ class KeyStrengthsListModalContentComponent {
|
|
|
27983
28514
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KeyStrengthsListModalContentComponent, { className: "KeyStrengthsListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/key-strengths-list-modal-content.component.ts", lineNumber: 79 }); })();
|
|
27984
28515
|
|
|
27985
28516
|
const _c0$U = a0 => ({ name: "shield-check", source: a0 });
|
|
27986
|
-
const _c1$
|
|
28517
|
+
const _c1$y = a0 => ({ name: "exclamation-triangle", source: a0 });
|
|
27987
28518
|
const _c2$n = a0 => ({ name: "document-text", source: a0 });
|
|
27988
28519
|
const _c3$h = a0 => ({ name: "chevron-right", source: a0 });
|
|
27989
28520
|
const _forTrack0$y = ($index, $item) => $item.area;
|
|
@@ -28053,7 +28584,7 @@ function CriticalGapsListModalContentComponent_Conditional_2_For_2_Template(rf,
|
|
|
28053
28584
|
i0.ɵɵadvance();
|
|
28054
28585
|
i0.ɵɵproperty("ngClass", ctx_r0.impactContainerClasses());
|
|
28055
28586
|
i0.ɵɵadvance(2);
|
|
28056
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(19, _c1$
|
|
28587
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(19, _c1$y, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.impactIconClasses(gap_r3.urgency));
|
|
28057
28588
|
i0.ɵɵadvance(2);
|
|
28058
28589
|
i0.ɵɵproperty("ngClass", ctx_r0.impactLabelClasses());
|
|
28059
28590
|
i0.ɵɵadvance(2);
|
|
@@ -28299,7 +28830,7 @@ class CriticalGapsListModalContentComponent {
|
|
|
28299
28830
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CriticalGapsListModalContentComponent, { className: "CriticalGapsListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/critical-gaps-list-modal-content.component.ts", lineNumber: 98 }); })();
|
|
28300
28831
|
|
|
28301
28832
|
const _c0$T = a0 => ({ name: "check-circle", source: a0 });
|
|
28302
|
-
const _c1$
|
|
28833
|
+
const _c1$x = a0 => ({ name: "chat-bubble-left-right", source: a0 });
|
|
28303
28834
|
const _forTrack0$x = ($index, $item) => $item.questionId;
|
|
28304
28835
|
function KeyStrengthDetailModalContentComponent_Conditional_13_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
28305
28836
|
i0.ɵɵelementStart(0, "div", 19)(1, "span", 20);
|
|
@@ -28329,7 +28860,7 @@ function KeyStrengthDetailModalContentComponent_Conditional_13_For_6_Template(rf
|
|
|
28329
28860
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
28330
28861
|
i0.ɵɵproperty("ngClass", ctx_r1.answerCardClasses());
|
|
28331
28862
|
i0.ɵɵadvance(2);
|
|
28332
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(8, _c1$
|
|
28863
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(8, _c1$x, ctx_r1.IconSourceEnum.HEROICONS))("ngClass", ctx_r1.answerIconClasses());
|
|
28333
28864
|
i0.ɵɵadvance(2);
|
|
28334
28865
|
i0.ɵɵproperty("ngClass", ctx_r1.questionClasses());
|
|
28335
28866
|
i0.ɵɵadvance();
|
|
@@ -28540,7 +29071,7 @@ class KeyStrengthDetailModalContentComponent {
|
|
|
28540
29071
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(KeyStrengthDetailModalContentComponent, { className: "KeyStrengthDetailModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/key-strength-detail-modal-content.component.ts", lineNumber: 79 }); })();
|
|
28541
29072
|
|
|
28542
29073
|
const _c0$S = a0 => ({ name: "exclamation-triangle", source: a0 });
|
|
28543
|
-
const _c1$
|
|
29074
|
+
const _c1$w = a0 => ({ name: "document-text", source: a0 });
|
|
28544
29075
|
const _c2$m = a0 => ({ name: "chat-bubble-left-right", source: a0 });
|
|
28545
29076
|
const _forTrack0$w = ($index, $item) => $item.questionId;
|
|
28546
29077
|
function CriticalGapDetailModalContentComponent_Conditional_20_For_6_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -28618,7 +29149,7 @@ function CriticalGapDetailModalContentComponent_Conditional_20_Template(rf, ctx)
|
|
|
28618
29149
|
i0.ɵɵclassMap(ctx_r1.isLightMode() ? "border-slate-200" : "border-slate-700");
|
|
28619
29150
|
i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
|
|
28620
29151
|
i0.ɵɵadvance();
|
|
28621
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(5, _c1$
|
|
29152
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(5, _c1$w, ctx_r1.IconSourceEnum.HEROICONS))("ngClass", ctx_r1.sectionIconClasses());
|
|
28622
29153
|
i0.ɵɵadvance(3);
|
|
28623
29154
|
i0.ɵɵrepeater(ctx_r1.gap().supportingAnswers);
|
|
28624
29155
|
} }
|
|
@@ -30403,7 +30934,7 @@ class TopPriorityDetailModalContentComponent {
|
|
|
30403
30934
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TopPriorityDetailModalContentComponent, { className: "TopPriorityDetailModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/top-priority-detail-modal-content.component.ts", lineNumber: 72 }); })();
|
|
30404
30935
|
|
|
30405
30936
|
const _c0$R = a0 => ({ name: "check-badge", source: a0 });
|
|
30406
|
-
const _c1$
|
|
30937
|
+
const _c1$v = a0 => ({ name: "check-circle", source: a0 });
|
|
30407
30938
|
const _c2$l = a0 => ({ name: "chevron-right", source: a0 });
|
|
30408
30939
|
const _c3$g = a0 => ({ name: "chart-bar", source: a0 });
|
|
30409
30940
|
const _forTrack0$v = ($index, $item) => $item.capability;
|
|
@@ -30511,7 +31042,7 @@ function FocusAreaStrengthsListModalContentComponent_Conditional_2_For_2_Templat
|
|
|
30511
31042
|
i0.ɵɵadvance(2);
|
|
30512
31043
|
i0.ɵɵconditional(ctx_r0.getLinkedMetricsCount(strength_r3) > 0 ? 9 : -1);
|
|
30513
31044
|
i0.ɵɵadvance(2);
|
|
30514
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$
|
|
31045
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$v, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses());
|
|
30515
31046
|
i0.ɵɵadvance();
|
|
30516
31047
|
i0.ɵɵproperty("ngClass", ctx_r0.countClasses());
|
|
30517
31048
|
i0.ɵɵadvance();
|
|
@@ -30726,7 +31257,7 @@ class FocusAreaStrengthsListModalContentComponent {
|
|
|
30726
31257
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FocusAreaStrengthsListModalContentComponent, { className: "FocusAreaStrengthsListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/focus-area-strengths-list-modal-content.component.ts", lineNumber: 109 }); })();
|
|
30727
31258
|
|
|
30728
31259
|
const _c0$Q = a0 => ({ name: "exclamation-triangle", source: a0 });
|
|
30729
|
-
const _c1$
|
|
31260
|
+
const _c1$u = a0 => ({ name: "exclamation-circle", source: a0 });
|
|
30730
31261
|
const _c2$k = a0 => ({ name: "chevron-right", source: a0 });
|
|
30731
31262
|
function _forTrack0$u($index, $item) { return this.getGapTitle($item); }
|
|
30732
31263
|
function FocusAreaGapsListModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -30835,7 +31366,7 @@ function FocusAreaGapsListModalContentComponent_Conditional_2_For_2_Template(rf,
|
|
|
30835
31366
|
i0.ɵɵadvance();
|
|
30836
31367
|
i0.ɵɵconditional(ctx_r0.getImpactOnMetric(gap_r3) ? 8 : -1);
|
|
30837
31368
|
i0.ɵɵadvance(3);
|
|
30838
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$
|
|
31369
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(14, _c1$u, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.iconClasses(gap_r3));
|
|
30839
31370
|
i0.ɵɵadvance();
|
|
30840
31371
|
i0.ɵɵproperty("ngClass", ctx_r0.countClasses());
|
|
30841
31372
|
i0.ɵɵadvance();
|
|
@@ -31120,7 +31651,7 @@ class FocusAreaGapsListModalContentComponent {
|
|
|
31120
31651
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FocusAreaGapsListModalContentComponent, { className: "FocusAreaGapsListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/focus-area-gaps-list-modal-content.component.ts", lineNumber: 106 }); })();
|
|
31121
31652
|
|
|
31122
31653
|
const _c0$P = a0 => ({ name: "light-bulb", source: a0 });
|
|
31123
|
-
const _c1$
|
|
31654
|
+
const _c1$t = a0 => ({ name: "chevron-right", source: a0 });
|
|
31124
31655
|
const _c2$j = a0 => ({ name: "chart-bar", source: a0 });
|
|
31125
31656
|
const _forTrack0$t = ($index, $item) => $item.opportunity;
|
|
31126
31657
|
function FocusAreaOpportunitiesListModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -31209,7 +31740,7 @@ function FocusAreaOpportunitiesListModalContentComponent_Conditional_2_For_2_Tem
|
|
|
31209
31740
|
i0.ɵɵadvance(2);
|
|
31210
31741
|
i0.ɵɵconditional(ctx_r0.getLinkedMetricsCount(opportunity_r3) > 0 ? 8 : -1);
|
|
31211
31742
|
i0.ɵɵadvance(2);
|
|
31212
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(9, _c1$
|
|
31743
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(9, _c1$t, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.chevronClasses());
|
|
31213
31744
|
} }
|
|
31214
31745
|
function FocusAreaOpportunitiesListModalContentComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
31215
31746
|
i0.ɵɵelementStart(0, "div", 2);
|
|
@@ -31389,7 +31920,7 @@ class FocusAreaOpportunitiesListModalContentComponent {
|
|
|
31389
31920
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FocusAreaOpportunitiesListModalContentComponent, { className: "FocusAreaOpportunitiesListModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/focus-area-opportunities-list-modal-content.component.ts", lineNumber: 90 }); })();
|
|
31390
31921
|
|
|
31391
31922
|
const _c0$O = a0 => ({ name: "chevron-right", source: a0 });
|
|
31392
|
-
const _c1$
|
|
31923
|
+
const _c1$s = a0 => ({ name: "chat-bubble-left-right", source: a0 });
|
|
31393
31924
|
const _forTrack0$s = ($index, $item) => $item.performanceItemId;
|
|
31394
31925
|
function FocusAreaStrengthDetailModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
31395
31926
|
i0.ɵɵelementStart(0, "div")(1, "p", 2);
|
|
@@ -31512,7 +32043,7 @@ function FocusAreaStrengthDetailModalContentComponent_Conditional_6_For_5_Templa
|
|
|
31512
32043
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
31513
32044
|
i0.ɵɵproperty("ngClass", ctx_r0.answerClasses());
|
|
31514
32045
|
i0.ɵɵadvance(2);
|
|
31515
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$
|
|
32046
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$s, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.answerIconClasses());
|
|
31516
32047
|
i0.ɵɵadvance();
|
|
31517
32048
|
i0.ɵɵproperty("ngClass", ctx_r0.answerQuestionClasses());
|
|
31518
32049
|
i0.ɵɵadvance();
|
|
@@ -32110,7 +32641,7 @@ class FocusAreaGapDetailModalContentComponent {
|
|
|
32110
32641
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FocusAreaGapDetailModalContentComponent, { className: "FocusAreaGapDetailModalContentComponent", filePath: "lib/components/profile-analysis-dashboard/modals/focus-area-gap-detail-modal-content.component.ts", lineNumber: 98 }); })();
|
|
32111
32642
|
|
|
32112
32643
|
const _c0$M = a0 => ({ name: "chevron-right", source: a0 });
|
|
32113
|
-
const _c1$
|
|
32644
|
+
const _c1$r = () => [];
|
|
32114
32645
|
const _forTrack0$r = ($index, $item) => $item.performanceItemId;
|
|
32115
32646
|
function FocusAreaOpportunityDetailModalContentComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
32116
32647
|
i0.ɵɵelementStart(0, "div")(1, "p", 2);
|
|
@@ -32199,7 +32730,7 @@ function FocusAreaOpportunityDetailModalContentComponent_Conditional_4_Template(
|
|
|
32199
32730
|
i0.ɵɵadvance();
|
|
32200
32731
|
i0.ɵɵproperty("ngClass", ctx_r0.sectionTitleClasses());
|
|
32201
32732
|
i0.ɵɵadvance(3);
|
|
32202
|
-
i0.ɵɵrepeater(ctx_r0.opportunity().linkedGoalIds || i0.ɵɵpureFunction0(2, _c1$
|
|
32733
|
+
i0.ɵɵrepeater(ctx_r0.opportunity().linkedGoalIds || i0.ɵɵpureFunction0(2, _c1$r));
|
|
32203
32734
|
} }
|
|
32204
32735
|
function FocusAreaOpportunityDetailModalContentComponent_Conditional_5_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
32205
32736
|
i0.ɵɵelementStart(0, "span", 10);
|
|
@@ -32225,7 +32756,7 @@ function FocusAreaOpportunityDetailModalContentComponent_Conditional_5_Template(
|
|
|
32225
32756
|
i0.ɵɵadvance();
|
|
32226
32757
|
i0.ɵɵproperty("ngClass", ctx_r0.sectionTitleClasses());
|
|
32227
32758
|
i0.ɵɵadvance(3);
|
|
32228
|
-
i0.ɵɵrepeater(ctx_r0.opportunity().linkedFunnelStrengthIds || i0.ɵɵpureFunction0(2, _c1$
|
|
32759
|
+
i0.ɵɵrepeater(ctx_r0.opportunity().linkedFunnelStrengthIds || i0.ɵɵpureFunction0(2, _c1$r));
|
|
32229
32760
|
} }
|
|
32230
32761
|
class FocusAreaOpportunityDetailModalContentComponent {
|
|
32231
32762
|
constructor() {
|
|
@@ -32562,7 +33093,7 @@ class CircularProgressComponent {
|
|
|
32562
33093
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CircularProgressComponent, { className: "CircularProgressComponent", filePath: "lib/components/business-analysis-dashboard/visualizations/circular-progress.component.ts", lineNumber: 41 }); })();
|
|
32563
33094
|
|
|
32564
33095
|
const _c0$L = ["*"];
|
|
32565
|
-
const _c1$
|
|
33096
|
+
const _c1$q = (a0, a1) => [a0, a1];
|
|
32566
33097
|
function VisualizationContainerComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
32567
33098
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
32568
33099
|
i0.ɵɵelementStart(0, "button", 3);
|
|
@@ -32573,7 +33104,7 @@ function VisualizationContainerComponent_Conditional_1_Template(rf, ctx) { if (r
|
|
|
32573
33104
|
i0.ɵɵelementEnd()();
|
|
32574
33105
|
} if (rf & 2) {
|
|
32575
33106
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
32576
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(1, _c1$
|
|
33107
|
+
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction2(1, _c1$q, ctx_r1.iconClass(), ctx_r1.isLightMode() ? "bg-white/90 hover:bg-white" : "bg-slate-800/90 hover:bg-slate-800"));
|
|
32577
33108
|
} }
|
|
32578
33109
|
class VisualizationContainerComponent {
|
|
32579
33110
|
constructor() {
|
|
@@ -32728,7 +33259,7 @@ class MetricBadgeComponent {
|
|
|
32728
33259
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricBadgeComponent, { className: "MetricBadgeComponent", filePath: "lib/components/business-analysis-dashboard/badges/metric-badge.component.ts", lineNumber: 22 }); })();
|
|
32729
33260
|
|
|
32730
33261
|
const _c0$K = a0 => ({ name: "light-bulb", source: a0 });
|
|
32731
|
-
const _c1$
|
|
33262
|
+
const _c1$p = a0 => ({ name: "chevron-right", source: a0 });
|
|
32732
33263
|
function OpportunityHighlightBannerComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
32733
33264
|
i0.ɵɵelementStart(0, "p", 7);
|
|
32734
33265
|
i0.ɵɵtext(1);
|
|
@@ -32803,7 +33334,7 @@ class OpportunityHighlightBannerComponent {
|
|
|
32803
33334
|
i0.ɵɵconditional(ctx.message() ? 9 : -1);
|
|
32804
33335
|
i0.ɵɵadvance();
|
|
32805
33336
|
i0.ɵɵclassProp("rotate-90", ctx.isExpanded());
|
|
32806
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(13, _c1$
|
|
33337
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(13, _c1$p, ctx.iconSource))("ngClass", ctx.chevronClasses());
|
|
32807
33338
|
} }, dependencies: [CommonModule, i1$1.NgClass, SymphiqIconComponent], encapsulation: 2, changeDetection: 0 }); }
|
|
32808
33339
|
}
|
|
32809
33340
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(OpportunityHighlightBannerComponent, [{
|
|
@@ -33429,7 +33960,7 @@ class ViewportAnimationDirective {
|
|
|
33429
33960
|
}] }); })();
|
|
33430
33961
|
|
|
33431
33962
|
const _c0$I = a0 => ({ name: "star", source: a0 });
|
|
33432
|
-
const _c1$
|
|
33963
|
+
const _c1$o = a0 => ({ name: "globe-americas", source: a0 });
|
|
33433
33964
|
const _c2$i = a0 => ({ name: "academic-cap", source: a0 });
|
|
33434
33965
|
const _c3$f = a0 => ({ name: "information-circle", source: a0 });
|
|
33435
33966
|
const _c4$b = a0 => ({ name: "signal", source: a0 });
|
|
@@ -33537,7 +34068,7 @@ function RegionCardComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
|
33537
34068
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
33538
34069
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSectionClasses());
|
|
33539
34070
|
i0.ɵɵadvance(2);
|
|
33540
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$
|
|
34071
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$o, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
|
|
33541
34072
|
i0.ɵɵadvance();
|
|
33542
34073
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedTitleClasses());
|
|
33543
34074
|
i0.ɵɵadvance(2);
|
|
@@ -34507,7 +35038,7 @@ class CompetitiveInsightBadgeComponent {
|
|
|
34507
35038
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompetitiveInsightBadgeComponent, { className: "CompetitiveInsightBadgeComponent", filePath: "lib/components/business-analysis-dashboard/badges/competitive-insight-badge.component.ts", lineNumber: 25 }); })();
|
|
34508
35039
|
|
|
34509
35040
|
const _c0$H = a0 => ({ name: "calendar-days", source: a0 });
|
|
34510
|
-
const _c1$
|
|
35041
|
+
const _c1$n = a0 => ({ name: "chart-bar", source: a0 });
|
|
34511
35042
|
const _c2$h = a0 => ({ name: "academic-cap", source: a0 });
|
|
34512
35043
|
const _c3$e = a0 => ({ name: "information-circle", source: a0 });
|
|
34513
35044
|
const _c4$a = a0 => ({ name: "signal", source: a0 });
|
|
@@ -34623,7 +35154,7 @@ function SeasonCardComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
|
34623
35154
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
34624
35155
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSectionClasses());
|
|
34625
35156
|
i0.ɵɵadvance(2);
|
|
34626
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$
|
|
35157
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$n, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
|
|
34627
35158
|
i0.ɵɵadvance();
|
|
34628
35159
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedTitleClasses());
|
|
34629
35160
|
i0.ɵɵadvance(2);
|
|
@@ -35345,7 +35876,7 @@ class SeasonCardComponent {
|
|
|
35345
35876
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SeasonCardComponent, { className: "SeasonCardComponent", filePath: "lib/components/business-analysis-dashboard/cards/season-card.component.ts", lineNumber: 270 }); })();
|
|
35346
35877
|
|
|
35347
35878
|
const _c0$G = a0 => ({ name: "currency-dollar", source: a0 });
|
|
35348
|
-
const _c1$
|
|
35879
|
+
const _c1$m = a0 => ({ name: "chart-bar", source: a0 });
|
|
35349
35880
|
const _c2$g = a0 => ({ name: "academic-cap", source: a0 });
|
|
35350
35881
|
const _c3$d = a0 => ({ name: "information-circle", source: a0 });
|
|
35351
35882
|
const _c4$9 = a0 => ({ name: "signal", source: a0 });
|
|
@@ -35634,7 +36165,7 @@ function CustomerSegmentCardComponent_Conditional_23_Template(rf, ctx) { if (rf
|
|
|
35634
36165
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
35635
36166
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSectionClasses());
|
|
35636
36167
|
i0.ɵɵadvance(2);
|
|
35637
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(12, _c1$
|
|
36168
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(12, _c1$m, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
|
|
35638
36169
|
i0.ɵɵadvance();
|
|
35639
36170
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedTitleClasses());
|
|
35640
36171
|
i0.ɵɵadvance(2);
|
|
@@ -36462,7 +36993,7 @@ class CustomerSegmentCardComponent {
|
|
|
36462
36993
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CustomerSegmentCardComponent, { className: "CustomerSegmentCardComponent", filePath: "lib/components/business-analysis-dashboard/cards/customer-segment-card.component.ts", lineNumber: 366 }); })();
|
|
36463
36994
|
|
|
36464
36995
|
const _c0$F = a0 => ({ name: "currency-dollar", source: a0 });
|
|
36465
|
-
const _c1$
|
|
36996
|
+
const _c1$l = a0 => ({ name: "document-text", source: a0 });
|
|
36466
36997
|
const _c2$f = a0 => ({ name: "academic-cap", source: a0 });
|
|
36467
36998
|
const _c3$c = a0 => ({ name: "information-circle", source: a0 });
|
|
36468
36999
|
const _c4$8 = a0 => ({ name: "signal", source: a0 });
|
|
@@ -36582,7 +37113,7 @@ function PriceTierCardComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
|
36582
37113
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
36583
37114
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSectionClasses());
|
|
36584
37115
|
i0.ɵɵadvance(2);
|
|
36585
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$
|
|
37116
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$l, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
|
|
36586
37117
|
i0.ɵɵadvance();
|
|
36587
37118
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedTitleClasses());
|
|
36588
37119
|
i0.ɵɵadvance(2);
|
|
@@ -37299,7 +37830,7 @@ class PriceTierCardComponent {
|
|
|
37299
37830
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(PriceTierCardComponent, { className: "PriceTierCardComponent", filePath: "lib/components/business-analysis-dashboard/cards/price-tier-card.component.ts", lineNumber: 261 }); })();
|
|
37300
37831
|
|
|
37301
37832
|
const _c0$E = () => ({ name: "cube", source: "HEROICONS" });
|
|
37302
|
-
const _c1$
|
|
37833
|
+
const _c1$k = () => ({ name: "currency-dollar", source: "HEROICONS" });
|
|
37303
37834
|
const _c2$e = () => ({ name: "chart-bar", source: "HEROICONS" });
|
|
37304
37835
|
const _c3$b = a0 => ({ name: "chart-bar", source: a0 });
|
|
37305
37836
|
const _c4$7 = a0 => ({ name: "academic-cap", source: a0 });
|
|
@@ -37366,7 +37897,7 @@ function ProductCategoryCardComponent_Conditional_14_Conditional_3_Template(rf,
|
|
|
37366
37897
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
37367
37898
|
i0.ɵɵproperty("ngClass", ctx_r0.getStatBoxClasses());
|
|
37368
37899
|
i0.ɵɵadvance(2);
|
|
37369
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction0(6, _c1$
|
|
37900
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction0(6, _c1$k))("ngClass", ctx_r0.getStatIconClasses());
|
|
37370
37901
|
i0.ɵɵadvance(2);
|
|
37371
37902
|
i0.ɵɵproperty("ngClass", ctx_r0.getStatLabelClasses());
|
|
37372
37903
|
i0.ɵɵadvance(2);
|
|
@@ -38456,7 +38987,7 @@ function getCategoryBadgeClasses(category, isDark) {
|
|
|
38456
38987
|
}
|
|
38457
38988
|
|
|
38458
38989
|
const _c0$C = a0 => ({ name: "shield-check", source: a0 });
|
|
38459
|
-
const _c1$
|
|
38990
|
+
const _c1$j = a0 => ({ name: "building-storefront", source: a0 });
|
|
38460
38991
|
const _c2$d = a0 => ({ name: "academic-cap", source: a0 });
|
|
38461
38992
|
const _c3$a = a0 => ({ name: "information-circle", source: a0 });
|
|
38462
38993
|
const _c4$6 = a0 => ({ name: "signal", source: a0 });
|
|
@@ -38506,7 +39037,7 @@ function EnhancedListItemCardComponent_Conditional_21_Conditional_7_Template(rf,
|
|
|
38506
39037
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
38507
39038
|
i0.ɵɵclassProp("mt-3", ctx_r0.getCompetitorPositioning() || ((tmp_2_0 = ctx_r0.item()) == null ? null : tmp_2_0.differentiationStrength));
|
|
38508
39039
|
i0.ɵɵadvance(2);
|
|
38509
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$
|
|
39040
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(7, _c1$j, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.getExpandedIconClasses());
|
|
38510
39041
|
i0.ɵɵadvance();
|
|
38511
39042
|
i0.ɵɵproperty("ngClass", ctx_r0.getExpandedSubtitleClasses());
|
|
38512
39043
|
i0.ɵɵadvance(2);
|
|
@@ -39172,7 +39703,7 @@ class EnhancedListItemCardComponent {
|
|
|
39172
39703
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EnhancedListItemCardComponent, { className: "EnhancedListItemCardComponent", filePath: "lib/components/business-analysis-dashboard/cards/enhanced-list-item-card.component.ts", lineNumber: 221 }); })();
|
|
39173
39704
|
|
|
39174
39705
|
const _c0$B = a0 => ({ name: "academic-cap", source: a0 });
|
|
39175
|
-
const _c1$
|
|
39706
|
+
const _c1$i = a0 => ({ name: "information-circle", source: a0 });
|
|
39176
39707
|
const _c2$c = a0 => ({ name: "signal", source: a0 });
|
|
39177
39708
|
const _c3$9 = a0 => ({ name: "wrench-screwdriver", source: a0 });
|
|
39178
39709
|
function FocusAreaDetailCardComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -39273,7 +39804,7 @@ function FocusAreaDetailCardComponent_Conditional_16_Conditional_6_Template(rf,
|
|
|
39273
39804
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
39274
39805
|
i0.ɵɵproperty("ngClass", ctx_r0.getCompetitiveGapSectionClasses());
|
|
39275
39806
|
i0.ɵɵadvance(2);
|
|
39276
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$
|
|
39807
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$i, ctx_r0.IconSourceEnum.HEROICONS))("ngClass", ctx_r0.expandedIconClasses());
|
|
39277
39808
|
i0.ɵɵadvance();
|
|
39278
39809
|
i0.ɵɵproperty("ngClass", ctx_r0.expandedTitleClasses());
|
|
39279
39810
|
i0.ɵɵadvance(2);
|
|
@@ -40639,7 +41170,6 @@ class CompetitorAnalysisCardComponent {
|
|
|
40639
41170
|
return;
|
|
40640
41171
|
const context = this.lookupService.findItemWithContext(item.id);
|
|
40641
41172
|
if (!context) {
|
|
40642
|
-
console.warn(`Item not found: ${item.id}`);
|
|
40643
41173
|
return;
|
|
40644
41174
|
}
|
|
40645
41175
|
// Check if an item-detail modal is currently open
|
|
@@ -42220,7 +42750,7 @@ class ProfileItemCardComponent {
|
|
|
42220
42750
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProfileItemCardComponent, { className: "ProfileItemCardComponent", filePath: "lib/components/business-analysis-dashboard/profile-item-card.component.ts", lineNumber: 171 }); })();
|
|
42221
42751
|
|
|
42222
42752
|
const _c0$z = ["scrollContainer"];
|
|
42223
|
-
const _c1$
|
|
42753
|
+
const _c1$h = a0 => ({ name: "arrow-right", source: a0 });
|
|
42224
42754
|
function ItemDetailModalComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
42225
42755
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
42226
42756
|
i0.ɵɵelementStart(0, "button", 7);
|
|
@@ -42232,7 +42762,7 @@ function ItemDetailModalComponent_Conditional_7_Template(rf, ctx) { if (rf & 1)
|
|
|
42232
42762
|
const ctx_r2 = i0.ɵɵnextContext();
|
|
42233
42763
|
i0.ɵɵproperty("ngClass", ctx_r2.getPrimaryButtonClasses());
|
|
42234
42764
|
i0.ɵɵadvance();
|
|
42235
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(2, _c1$
|
|
42765
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(2, _c1$h, ctx_r2.IconSourceEnum.HEROICONS));
|
|
42236
42766
|
} }
|
|
42237
42767
|
class ItemDetailModalComponent {
|
|
42238
42768
|
constructor() {
|
|
@@ -42419,7 +42949,7 @@ class ItemDetailModalComponent {
|
|
|
42419
42949
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ItemDetailModalComponent, { className: "ItemDetailModalComponent", filePath: "lib/components/business-analysis-dashboard/modals/item-detail-modal.component.ts", lineNumber: 53 }); })();
|
|
42420
42950
|
|
|
42421
42951
|
const _c0$y = ["modalContent"];
|
|
42422
|
-
const _c1$
|
|
42952
|
+
const _c1$g = ["modalWrapper"];
|
|
42423
42953
|
const _c2$b = ["*"];
|
|
42424
42954
|
const ProfileAnalysisModalComponent_Conditional_0_Conditional_31_Conditional_3_Defer_2_DepsFn = () => [Promise.resolve().then(function () { return lineChart_component; }).then(m => m.LineChartComponent)];
|
|
42425
42955
|
const ProfileAnalysisModalComponent_Conditional_0_Conditional_31_Conditional_4_Defer_2_DepsFn = () => [Promise.resolve().then(function () { return barChart_component; }).then(m => m.BarChartComponent)];
|
|
@@ -44645,57 +45175,12 @@ class ProfileAnalysisModalComponent {
|
|
|
44645
45175
|
return undefined;
|
|
44646
45176
|
}
|
|
44647
45177
|
logContainingBlockInfo() {
|
|
44648
|
-
console.group('[ProfileAnalysisModal] Containing Block Debug Info');
|
|
44649
|
-
let element = this.hostElement.nativeElement;
|
|
44650
|
-
const containingBlockTriggers = [];
|
|
44651
|
-
while (element && element !== this.document.body) {
|
|
44652
|
-
const styles = window.getComputedStyle(element);
|
|
44653
|
-
const transform = styles.transform;
|
|
44654
|
-
const willChange = styles.willChange;
|
|
44655
|
-
const contain = styles.contain;
|
|
44656
|
-
const filter = styles.filter;
|
|
44657
|
-
const perspective = styles.perspective;
|
|
44658
|
-
const backdropFilter = styles.backdropFilter || styles.getPropertyValue('backdrop-filter');
|
|
44659
|
-
if (transform && transform !== 'none') {
|
|
44660
|
-
containingBlockTriggers.push({ element, property: 'transform', value: transform });
|
|
44661
|
-
}
|
|
44662
|
-
if (willChange && (willChange.includes('transform') || willChange.includes('perspective') || willChange.includes('filter'))) {
|
|
44663
|
-
containingBlockTriggers.push({ element, property: 'will-change', value: willChange });
|
|
44664
|
-
}
|
|
44665
|
-
if (contain && contain !== 'none') {
|
|
44666
|
-
containingBlockTriggers.push({ element, property: 'contain', value: contain });
|
|
44667
|
-
}
|
|
44668
|
-
if (filter && filter !== 'none') {
|
|
44669
|
-
containingBlockTriggers.push({ element, property: 'filter', value: filter });
|
|
44670
|
-
}
|
|
44671
|
-
if (perspective && perspective !== 'none') {
|
|
44672
|
-
containingBlockTriggers.push({ element, property: 'perspective', value: perspective });
|
|
44673
|
-
}
|
|
44674
|
-
if (backdropFilter && backdropFilter !== 'none') {
|
|
44675
|
-
containingBlockTriggers.push({ element, property: 'backdrop-filter', value: backdropFilter });
|
|
44676
|
-
}
|
|
44677
|
-
element = element.parentElement;
|
|
44678
|
-
}
|
|
44679
|
-
if (containingBlockTriggers.length > 0) {
|
|
44680
|
-
console.warn('Found CSS properties that create containing blocks for fixed positioning:');
|
|
44681
|
-
containingBlockTriggers.forEach(({ element, property, value }) => {
|
|
44682
|
-
console.log(` Element:`, element);
|
|
44683
|
-
console.log(` ${property}: ${value}`);
|
|
44684
|
-
});
|
|
44685
|
-
}
|
|
44686
|
-
else {
|
|
44687
|
-
console.log('No containing block triggers found in ancestor chain');
|
|
44688
|
-
}
|
|
44689
|
-
console.log('Host element:', this.hostElement.nativeElement);
|
|
44690
|
-
console.log('Modal wrapper ref:', this.modalWrapper);
|
|
44691
|
-
console.groupEnd();
|
|
44692
45178
|
}
|
|
44693
45179
|
moveModalToBody() {
|
|
44694
45180
|
if (this.modalMovedToBody || !this.modalWrapper?.nativeElement) {
|
|
44695
45181
|
return;
|
|
44696
45182
|
}
|
|
44697
45183
|
const modalEl = this.modalWrapper.nativeElement;
|
|
44698
|
-
console.log('[ProfileAnalysisModal] Moving modal to document.body');
|
|
44699
45184
|
this.renderer.appendChild(this.document.body, modalEl);
|
|
44700
45185
|
this.modalMovedToBody = true;
|
|
44701
45186
|
}
|
|
@@ -44704,7 +45189,6 @@ class ProfileAnalysisModalComponent {
|
|
|
44704
45189
|
return;
|
|
44705
45190
|
}
|
|
44706
45191
|
const modalEl = this.modalWrapper.nativeElement;
|
|
44707
|
-
console.log('[ProfileAnalysisModal] Returning modal to host element');
|
|
44708
45192
|
this.renderer.appendChild(this.hostElement.nativeElement, modalEl);
|
|
44709
45193
|
this.modalMovedToBody = false;
|
|
44710
45194
|
}
|
|
@@ -44714,7 +45198,7 @@ class ProfileAnalysisModalComponent {
|
|
|
44714
45198
|
static { this.ɵfac = function ProfileAnalysisModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ProfileAnalysisModalComponent)(); }; }
|
|
44715
45199
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ProfileAnalysisModalComponent, selectors: [["symphiq-profile-analysis-modal"]], viewQuery: function ProfileAnalysisModalComponent_Query(rf, ctx) { if (rf & 1) {
|
|
44716
45200
|
i0.ɵɵviewQuery(_c0$y, 5);
|
|
44717
|
-
i0.ɵɵviewQuery(_c1$
|
|
45201
|
+
i0.ɵɵviewQuery(_c1$g, 5);
|
|
44718
45202
|
} if (rf & 2) {
|
|
44719
45203
|
let _t;
|
|
44720
45204
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.modalContent = _t.first);
|
|
@@ -45269,7 +45753,7 @@ class ProfileAnalysisModalComponent {
|
|
|
45269
45753
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ProfileAnalysisModalComponent, { className: "ProfileAnalysisModalComponent", filePath: "lib/components/profile-analysis-dashboard/profile-analysis-modal.component.ts", lineNumber: 554 }); })();
|
|
45270
45754
|
|
|
45271
45755
|
const _c0$x = a0 => ({ name: "light-bulb", source: a0 });
|
|
45272
|
-
const _c1$
|
|
45756
|
+
const _c1$f = a0 => ({ name: "trophy", source: a0 });
|
|
45273
45757
|
const _c2$a = a0 => ({ name: "academic-cap", source: a0 });
|
|
45274
45758
|
const _c3$7 = a0 => ({ name: "signal", source: a0 });
|
|
45275
45759
|
const _c4$4 = a0 => ({ name: "wrench-screwdriver", source: a0 });
|
|
@@ -45307,7 +45791,7 @@ function CompetitiveGapModalComponent_Conditional_10_Template(rf, ctx) { if (rf
|
|
|
45307
45791
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
45308
45792
|
i0.ɵɵproperty("ngClass", ctx_r0.sectionClasses());
|
|
45309
45793
|
i0.ɵɵadvance(2);
|
|
45310
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$
|
|
45794
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(6, _c1$f, ctx_r0.iconSource))("ngClass", ctx_r0.sectionIconClasses());
|
|
45311
45795
|
i0.ɵɵadvance();
|
|
45312
45796
|
i0.ɵɵproperty("ngClass", ctx_r0.sectionTitleClasses());
|
|
45313
45797
|
i0.ɵɵadvance(2);
|
|
@@ -45600,7 +46084,7 @@ class CompetitiveGapModalComponent {
|
|
|
45600
46084
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(CompetitiveGapModalComponent, { className: "CompetitiveGapModalComponent", filePath: "lib/components/business-analysis-dashboard/modals/competitive-gap-modal.component.ts", lineNumber: 101 }); })();
|
|
45601
46085
|
|
|
45602
46086
|
const _c0$w = a0 => ({ name: "list-bullet", source: a0 });
|
|
45603
|
-
const _c1$
|
|
46087
|
+
const _c1$e = a0 => ({ name: "arrow-right", source: a0 });
|
|
45604
46088
|
const _c2$9 = a0 => ({ name: "check-circle", source: a0 });
|
|
45605
46089
|
const _c3$6 = a0 => ({ name: "exclamation-circle", source: a0 });
|
|
45606
46090
|
const _forTrack0$o = ($index, $item) => $item.order;
|
|
@@ -45672,7 +46156,7 @@ function RecommendationActionStepsModalComponent_For_4_Template(rf, ctx) { if (r
|
|
|
45672
46156
|
i0.ɵɵadvance();
|
|
45673
46157
|
i0.ɵɵtextInterpolate1(" ", step_r2.order, " ");
|
|
45674
46158
|
i0.ɵɵadvance(4);
|
|
45675
|
-
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(9, _c1$
|
|
46159
|
+
i0.ɵɵproperty("icon", i0.ɵɵpureFunction1(9, _c1$e, ctx_r0.iconSource))("ngClass", ctx_r0.actionIconClasses());
|
|
45676
46160
|
i0.ɵɵadvance();
|
|
45677
46161
|
i0.ɵɵproperty("ngClass", ctx_r0.actionTitleClasses());
|
|
45678
46162
|
i0.ɵɵadvance(2);
|
|
@@ -45840,7 +46324,7 @@ class RecommendationActionStepsModalComponent {
|
|
|
45840
46324
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RecommendationActionStepsModalComponent, { className: "RecommendationActionStepsModalComponent", filePath: "lib/components/business-analysis-dashboard/modals/recommendation-action-steps-modal.component.ts", lineNumber: 69 }); })();
|
|
45841
46325
|
|
|
45842
46326
|
const _c0$v = ["modalContent"];
|
|
45843
|
-
const _c1$
|
|
46327
|
+
const _c1$d = ["modalWrapper"];
|
|
45844
46328
|
function BusinessAnalysisModalComponent_Conditional_0_Conditional_10_For_6_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
45845
46329
|
const _r4 = i0.ɵɵgetCurrentView();
|
|
45846
46330
|
i0.ɵɵelementStart(0, "button", 28);
|
|
@@ -46363,7 +46847,7 @@ class BusinessAnalysisModalComponent {
|
|
|
46363
46847
|
static { this.ɵfac = function BusinessAnalysisModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || BusinessAnalysisModalComponent)(); }; }
|
|
46364
46848
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: BusinessAnalysisModalComponent, selectors: [["symphiq-business-analysis-modal"]], viewQuery: function BusinessAnalysisModalComponent_Query(rf, ctx) { if (rf & 1) {
|
|
46365
46849
|
i0.ɵɵviewQuery(_c0$v, 5);
|
|
46366
|
-
i0.ɵɵviewQuery(_c1$
|
|
46850
|
+
i0.ɵɵviewQuery(_c1$d, 5);
|
|
46367
46851
|
} if (rf & 2) {
|
|
46368
46852
|
let _t;
|
|
46369
46853
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.modalContent = _t.first);
|
|
@@ -46548,7 +47032,7 @@ class BusinessAnalysisModalComponent {
|
|
|
46548
47032
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(BusinessAnalysisModalComponent, { className: "BusinessAnalysisModalComponent", filePath: "lib/components/business-analysis-dashboard/business-analysis-modal.component.ts", lineNumber: 171 }); })();
|
|
46549
47033
|
|
|
46550
47034
|
const _c0$u = ["dashboardContainer"];
|
|
46551
|
-
const _c1$
|
|
47035
|
+
const _c1$c = () => ({});
|
|
46552
47036
|
const _c2$8 = () => [1, 2, 3, 4, 5, 6];
|
|
46553
47037
|
const _c3$5 = () => [1, 2, 3];
|
|
46554
47038
|
const _c4$3 = () => [1, 2, 3, 4];
|
|
@@ -46855,7 +47339,7 @@ function SymphiqFunnelAnalysisDashboardComponent_Conditional_50_Conditional_8_Co
|
|
|
46855
47339
|
i0.ɵɵelementEnd();
|
|
46856
47340
|
} if (rf & 2) {
|
|
46857
47341
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
46858
|
-
i0.ɵɵproperty("assessment", ctx_r2.performanceOverview().overallAssessment || i0.ɵɵpureFunction0(11, _c1$
|
|
47342
|
+
i0.ɵɵproperty("assessment", ctx_r2.performanceOverview().overallAssessment || i0.ɵɵpureFunction0(11, _c1$c))("revenueMetric", ctx_r2.revenueMetric())("charts", ctx_r2.chartsForItem("OVERALL_ASSESSMENT"))("metrics", ctx_r2.allMetrics())("isLightMode", ctx_r2.isLightMode())("isLoading", ctx_r2.isOverallAssessmentLoading())("isCompactMode", true)("isChartsLoading", ctx_r2.areChartsLoading())("strengths", ctx_r2.strengths())("weaknesses", ctx_r2.weaknesses())("currencySymbol", ctx_r2.currencySymbol());
|
|
46859
47343
|
} }
|
|
46860
47344
|
function SymphiqFunnelAnalysisDashboardComponent_Conditional_50_Conditional_8_Template(rf, ctx) { if (rf & 1) {
|
|
46861
47345
|
i0.ɵɵelementStart(0, "div", 72);
|
|
@@ -47005,7 +47489,7 @@ function SymphiqFunnelAnalysisDashboardComponent_Conditional_51_Conditional_2_Co
|
|
|
47005
47489
|
i0.ɵɵelementEnd();
|
|
47006
47490
|
} if (rf & 2) {
|
|
47007
47491
|
const ctx_r2 = i0.ɵɵnextContext(3);
|
|
47008
|
-
i0.ɵɵproperty("assessment", ctx_r2.performanceOverview().overallAssessment || i0.ɵɵpureFunction0(11, _c1$
|
|
47492
|
+
i0.ɵɵproperty("assessment", ctx_r2.performanceOverview().overallAssessment || i0.ɵɵpureFunction0(11, _c1$c))("revenueMetric", ctx_r2.revenueMetric())("charts", ctx_r2.chartsForItem("OVERALL_ASSESSMENT"))("metrics", ctx_r2.allMetrics())("isLightMode", ctx_r2.isLightMode())("isLoading", ctx_r2.isOverallAssessmentLoading())("isCompactMode", ctx_r2.viewModeService.isCompact())("isChartsLoading", ctx_r2.areChartsLoading())("strengths", ctx_r2.strengths())("weaknesses", ctx_r2.weaknesses())("currencySymbol", ctx_r2.currencySymbol());
|
|
47009
47493
|
} }
|
|
47010
47494
|
function SymphiqFunnelAnalysisDashboardComponent_Conditional_51_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
47011
47495
|
i0.ɵɵelementStart(0, "div", 93);
|
|
@@ -55740,49 +56224,6 @@ class RevenueCalculatorWelcomeBannerComponent {
|
|
|
55740
56224
|
}], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], dataLoadStatus: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataLoadStatus", required: false }] }], hasTargets: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasTargets", required: false }] }] }); })();
|
|
55741
56225
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(RevenueCalculatorWelcomeBannerComponent, { className: "RevenueCalculatorWelcomeBannerComponent", filePath: "lib/components/revenue-calculator-dashboard/revenue-calculator-welcome-banner.component.ts", lineNumber: 85 }); })();
|
|
55742
56226
|
|
|
55743
|
-
function getCurrentYearStart() {
|
|
55744
|
-
const now = new Date();
|
|
55745
|
-
return new Date(now.getFullYear(), 0, 1, 0, 0, 0, 0);
|
|
55746
|
-
}
|
|
55747
|
-
function getCurrentYearEnd() {
|
|
55748
|
-
const now = new Date();
|
|
55749
|
-
return new Date(now.getFullYear(), 11, 31, 23, 59, 59, 999);
|
|
55750
|
-
}
|
|
55751
|
-
function getPriorYearStart() {
|
|
55752
|
-
const now = new Date();
|
|
55753
|
-
return new Date(now.getFullYear() - 1, 0, 1, 0, 0, 0, 0);
|
|
55754
|
-
}
|
|
55755
|
-
function getPriorYearEnd() {
|
|
55756
|
-
const now = new Date();
|
|
55757
|
-
return new Date(now.getFullYear() - 1, 11, 31, 23, 59, 59, 999);
|
|
55758
|
-
}
|
|
55759
|
-
function isCurrentYearTarget(target) {
|
|
55760
|
-
if (!target.startDate || !target.endDate) {
|
|
55761
|
-
return false;
|
|
55762
|
-
}
|
|
55763
|
-
const currentYearStart = getCurrentYearStart();
|
|
55764
|
-
const currentYearEnd = getCurrentYearEnd();
|
|
55765
|
-
const targetStart = new Date(target.startDate);
|
|
55766
|
-
const targetEnd = new Date(target.endDate);
|
|
55767
|
-
return (targetStart.getTime() === currentYearStart.getTime() &&
|
|
55768
|
-
targetEnd.getTime() === currentYearEnd.getTime());
|
|
55769
|
-
}
|
|
55770
|
-
function formatCurrency(value, currencySymbol = '$') {
|
|
55771
|
-
return `${currencySymbol}${value.toLocaleString('en-US', {
|
|
55772
|
-
minimumFractionDigits: 0,
|
|
55773
|
-
maximumFractionDigits: 0
|
|
55774
|
-
})}`;
|
|
55775
|
-
}
|
|
55776
|
-
function formatPercentage(value, decimals = 1) {
|
|
55777
|
-
return `${value.toFixed(decimals)}%`;
|
|
55778
|
-
}
|
|
55779
|
-
function formatNumber(value) {
|
|
55780
|
-
return value.toLocaleString('en-US', {
|
|
55781
|
-
minimumFractionDigits: 0,
|
|
55782
|
-
maximumFractionDigits: 0
|
|
55783
|
-
});
|
|
55784
|
-
}
|
|
55785
|
-
|
|
55786
56227
|
function calculatePacingStatus(currentValue, priorValue, targetValue) {
|
|
55787
56228
|
if (targetValue !== undefined && targetValue > 0) {
|
|
55788
56229
|
const targetGrowth = ((targetValue - priorValue) / priorValue) * 100;
|
|
@@ -57267,390 +57708,10 @@ var areaChart_component = /*#__PURE__*/Object.freeze({
|
|
|
57267
57708
|
AreaChartComponent: AreaChartComponent
|
|
57268
57709
|
});
|
|
57269
57710
|
|
|
57270
|
-
function calculateMetricTargetsFromRevenue(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues) {
|
|
57271
|
-
const revenuePercentageIncrease = ((revenueTarget - priorYearRevenue) / priorYearRevenue) * 100;
|
|
57272
|
-
const metricCalculations = [];
|
|
57273
|
-
const sortedFunnelMetrics = [...funnelMetrics].sort((a, b) => {
|
|
57274
|
-
const aFunnel = a.funnelInd ?? 999;
|
|
57275
|
-
const bFunnel = b.funnelInd ?? 999;
|
|
57276
|
-
if (aFunnel !== bFunnel)
|
|
57277
|
-
return aFunnel - bFunnel;
|
|
57278
|
-
const aRelated = a.relatedInd ?? 999;
|
|
57279
|
-
const bRelated = b.relatedInd ?? 999;
|
|
57280
|
-
return aRelated - bRelated;
|
|
57281
|
-
});
|
|
57282
|
-
const funnelStages = getUniqueFunnelStages(sortedFunnelMetrics);
|
|
57283
|
-
const numFunnelStages = funnelStages.length;
|
|
57284
|
-
const revenueIncreaseFactor = revenueTarget / priorYearRevenue;
|
|
57285
|
-
const perStageFactor = Math.pow(revenueIncreaseFactor, 1 / numFunnelStages);
|
|
57286
|
-
const funnelStageMetrics = new Map();
|
|
57287
|
-
sortedFunnelMetrics.forEach(fm => {
|
|
57288
|
-
if (fm.funnelMetric) {
|
|
57289
|
-
if (!funnelStageMetrics.has(fm.funnelMetric)) {
|
|
57290
|
-
funnelStageMetrics.set(fm.funnelMetric, []);
|
|
57291
|
-
}
|
|
57292
|
-
funnelStageMetrics.get(fm.funnelMetric).push(fm);
|
|
57293
|
-
}
|
|
57294
|
-
});
|
|
57295
|
-
const stagePercentageIncrease = (perStageFactor - 1) * 100;
|
|
57296
|
-
sortedFunnelMetrics.forEach((funnelMetric) => {
|
|
57297
|
-
const metric = funnelMetric.relatedMetric;
|
|
57298
|
-
if (!metric)
|
|
57299
|
-
return;
|
|
57300
|
-
const currentValue = baselineValues.get(metric) || 0;
|
|
57301
|
-
const isFunnelStage = funnelMetric.funnelMetric === metric;
|
|
57302
|
-
let percentageIncrease;
|
|
57303
|
-
let targetValue;
|
|
57304
|
-
if (metric === MetricEnum.BOUNCE_RATE) {
|
|
57305
|
-
percentageIncrease = -stagePercentageIncrease;
|
|
57306
|
-
targetValue = currentValue * (1 + percentageIncrease / 100);
|
|
57307
|
-
}
|
|
57308
|
-
else if (isDerivedMetric(metric)) {
|
|
57309
|
-
percentageIncrease = 0;
|
|
57310
|
-
targetValue = currentValue;
|
|
57311
|
-
}
|
|
57312
|
-
else {
|
|
57313
|
-
percentageIncrease = stagePercentageIncrease;
|
|
57314
|
-
targetValue = currentValue * perStageFactor;
|
|
57315
|
-
}
|
|
57316
|
-
metricCalculations.push({
|
|
57317
|
-
metric,
|
|
57318
|
-
funnelMetric: funnelMetric.funnelMetric,
|
|
57319
|
-
currentValue,
|
|
57320
|
-
targetValue,
|
|
57321
|
-
percentageIncrease,
|
|
57322
|
-
isFunnelStage,
|
|
57323
|
-
funnelInd: funnelMetric.funnelInd,
|
|
57324
|
-
relatedInd: funnelMetric.relatedInd,
|
|
57325
|
-
description: funnelMetric.relatedMetricDescription
|
|
57326
|
-
});
|
|
57327
|
-
});
|
|
57328
|
-
return {
|
|
57329
|
-
revenueTarget,
|
|
57330
|
-
revenuePercentageIncrease,
|
|
57331
|
-
metricCalculations
|
|
57332
|
-
};
|
|
57333
|
-
}
|
|
57334
|
-
function getUniqueFunnelStages(funnelMetrics) {
|
|
57335
|
-
const stages = [];
|
|
57336
|
-
const seen = new Set();
|
|
57337
|
-
funnelMetrics.forEach(fm => {
|
|
57338
|
-
if (fm.funnelMetric && fm.funnelMetric === fm.relatedMetric && !seen.has(fm.funnelMetric)) {
|
|
57339
|
-
seen.add(fm.funnelMetric);
|
|
57340
|
-
stages.push(fm.funnelMetric);
|
|
57341
|
-
}
|
|
57342
|
-
});
|
|
57343
|
-
return stages;
|
|
57344
|
-
}
|
|
57345
|
-
const DERIVED_METRICS = new Set([
|
|
57346
|
-
MetricEnum.REVENUE_PER_PRODUCT_VIEW,
|
|
57347
|
-
MetricEnum.REVENUE_PER_ADD_TO_CART,
|
|
57348
|
-
MetricEnum.REVENUE_PER_CHECKOUT
|
|
57349
|
-
]);
|
|
57350
|
-
function isDerivedMetric(metric) {
|
|
57351
|
-
return DERIVED_METRICS.has(metric);
|
|
57352
|
-
}
|
|
57353
|
-
function generateTargetsFromCalculations(shopId, calculations) {
|
|
57354
|
-
const startDate = getCurrentYearStart();
|
|
57355
|
-
const endDate = getCurrentYearEnd();
|
|
57356
|
-
return calculations.map((calc) => ({
|
|
57357
|
-
shopId,
|
|
57358
|
-
metric: calc.metric,
|
|
57359
|
-
amount: calc.targetValue,
|
|
57360
|
-
startDate,
|
|
57361
|
-
endDate
|
|
57362
|
-
}));
|
|
57363
|
-
}
|
|
57364
|
-
function groupMetricsByFunnelStage(calculations) {
|
|
57365
|
-
const grouped = new Map();
|
|
57366
|
-
calculations.forEach((calc) => {
|
|
57367
|
-
if (calc.funnelMetric) {
|
|
57368
|
-
if (!grouped.has(calc.funnelMetric)) {
|
|
57369
|
-
grouped.set(calc.funnelMetric, []);
|
|
57370
|
-
}
|
|
57371
|
-
grouped.get(calc.funnelMetric).push(calc);
|
|
57372
|
-
}
|
|
57373
|
-
});
|
|
57374
|
-
return grouped;
|
|
57375
|
-
}
|
|
57376
|
-
function getFunnelStageMetrics(calculations) {
|
|
57377
|
-
return calculations.filter((calc) => calc.isFunnelStage);
|
|
57378
|
-
}
|
|
57379
|
-
|
|
57380
|
-
function transformUiDataToChartSeries(mainUiData, ytdComparisonUiData, metricToExtract) {
|
|
57381
|
-
const series = [];
|
|
57382
|
-
if (ytdComparisonUiData?.convertedDataResults) {
|
|
57383
|
-
const priorYearSeries = extractSeriesFromConvertedData(ytdComparisonUiData.convertedDataResults, metricToExtract, 'Prior Year');
|
|
57384
|
-
if (priorYearSeries) {
|
|
57385
|
-
series.push(priorYearSeries);
|
|
57386
|
-
}
|
|
57387
|
-
}
|
|
57388
|
-
if (mainUiData?.convertedDataResults) {
|
|
57389
|
-
const currentYearSeries = extractSeriesFromConvertedData(mainUiData.convertedDataResults, metricToExtract, 'Current Year');
|
|
57390
|
-
if (currentYearSeries) {
|
|
57391
|
-
series.push(currentYearSeries);
|
|
57392
|
-
}
|
|
57393
|
-
}
|
|
57394
|
-
return series;
|
|
57395
|
-
}
|
|
57396
|
-
function extractSeriesFromConvertedData(convertedData, metricToExtract, seriesName) {
|
|
57397
|
-
const metricIndex = convertedData.metrics?.indexOf(metricToExtract);
|
|
57398
|
-
if (metricIndex === undefined || metricIndex === -1)
|
|
57399
|
-
return null;
|
|
57400
|
-
const dimensionIndex = convertedData.dimensions?.indexOf(DimensionEnum.MONTH);
|
|
57401
|
-
if (dimensionIndex === undefined || dimensionIndex === -1)
|
|
57402
|
-
return null;
|
|
57403
|
-
const dataPoints = [];
|
|
57404
|
-
convertedData.rows?.forEach((row) => {
|
|
57405
|
-
const monthValue = row.dimensionValues?.[dimensionIndex];
|
|
57406
|
-
const metricValue = parseFloat(row.metricValues?.[metricIndex] || '0');
|
|
57407
|
-
if (monthValue) {
|
|
57408
|
-
dataPoints.push({
|
|
57409
|
-
category: monthValue,
|
|
57410
|
-
value: metricValue,
|
|
57411
|
-
displayLabel: formatMonthLabel(monthValue)
|
|
57412
|
-
});
|
|
57413
|
-
}
|
|
57414
|
-
});
|
|
57415
|
-
return {
|
|
57416
|
-
name: seriesName,
|
|
57417
|
-
data: sortDataByMonth(dataPoints)
|
|
57418
|
-
};
|
|
57419
|
-
}
|
|
57420
|
-
function formatMonthLabel(monthValue) {
|
|
57421
|
-
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
|
|
57422
|
-
const monthNum = parseInt(monthValue, 10);
|
|
57423
|
-
if (monthNum >= 1 && monthNum <= 12) {
|
|
57424
|
-
return months[monthNum - 1];
|
|
57425
|
-
}
|
|
57426
|
-
return monthValue;
|
|
57427
|
-
}
|
|
57428
|
-
function sortDataByMonth(data) {
|
|
57429
|
-
return data.sort((a, b) => {
|
|
57430
|
-
const aMonth = parseInt(a.category, 10);
|
|
57431
|
-
const bMonth = parseInt(b.category, 10);
|
|
57432
|
-
return aMonth - bMonth;
|
|
57433
|
-
});
|
|
57434
|
-
}
|
|
57435
|
-
function transformTrendUiDataToChartSeries(trendUiData, metricToExtract) {
|
|
57436
|
-
if (!trendUiData?.convertedDataResults) {
|
|
57437
|
-
return [];
|
|
57438
|
-
}
|
|
57439
|
-
const convertedData = trendUiData.convertedDataResults;
|
|
57440
|
-
const metricIndex = convertedData.metrics?.indexOf(metricToExtract);
|
|
57441
|
-
if (metricIndex === undefined || metricIndex === -1)
|
|
57442
|
-
return [];
|
|
57443
|
-
const dateIndex = convertedData.dimensions?.indexOf(DimensionEnum.DATE);
|
|
57444
|
-
const monthIndex = convertedData.dimensions?.indexOf(DimensionEnum.MONTH);
|
|
57445
|
-
const dimensionIndex = dateIndex !== undefined && dateIndex !== -1
|
|
57446
|
-
? dateIndex
|
|
57447
|
-
: (monthIndex !== undefined && monthIndex !== -1 ? monthIndex : -1);
|
|
57448
|
-
if (dimensionIndex === -1)
|
|
57449
|
-
return [];
|
|
57450
|
-
const currentYear = new Date().getFullYear();
|
|
57451
|
-
const priorYear = currentYear - 1;
|
|
57452
|
-
const priorYearPoints = [];
|
|
57453
|
-
const currentYearPoints = [];
|
|
57454
|
-
convertedData.rows?.forEach((row) => {
|
|
57455
|
-
const dimValue = row.dimensionValues?.[dimensionIndex];
|
|
57456
|
-
const metricValue = parseFloat(row.metricValues?.[metricIndex] || '0');
|
|
57457
|
-
if (dimValue) {
|
|
57458
|
-
let year;
|
|
57459
|
-
let month;
|
|
57460
|
-
if (dimValue.includes('-')) {
|
|
57461
|
-
const parts = dimValue.split('-');
|
|
57462
|
-
year = parseInt(parts[0], 10);
|
|
57463
|
-
month = parseInt(parts[1], 10);
|
|
57464
|
-
}
|
|
57465
|
-
else if (dimValue.length >= 6) {
|
|
57466
|
-
year = parseInt(dimValue.substring(0, 4), 10);
|
|
57467
|
-
month = parseInt(dimValue.substring(4, 6), 10);
|
|
57468
|
-
}
|
|
57469
|
-
else {
|
|
57470
|
-
month = parseInt(dimValue, 10);
|
|
57471
|
-
year = currentYear;
|
|
57472
|
-
}
|
|
57473
|
-
const point = {
|
|
57474
|
-
category: String(month),
|
|
57475
|
-
value: metricValue,
|
|
57476
|
-
displayLabel: formatMonthLabel(String(month))
|
|
57477
|
-
};
|
|
57478
|
-
if (year === priorYear) {
|
|
57479
|
-
priorYearPoints.push(point);
|
|
57480
|
-
}
|
|
57481
|
-
else if (year === currentYear) {
|
|
57482
|
-
currentYearPoints.push(point);
|
|
57483
|
-
}
|
|
57484
|
-
}
|
|
57485
|
-
});
|
|
57486
|
-
const series = [];
|
|
57487
|
-
if (priorYearPoints.length > 0) {
|
|
57488
|
-
series.push({
|
|
57489
|
-
name: String(priorYear),
|
|
57490
|
-
data: aggregateAndSortByMonth(priorYearPoints)
|
|
57491
|
-
});
|
|
57492
|
-
}
|
|
57493
|
-
if (currentYearPoints.length > 0) {
|
|
57494
|
-
series.push({
|
|
57495
|
-
name: String(currentYear),
|
|
57496
|
-
data: aggregateAndSortByMonth(currentYearPoints)
|
|
57497
|
-
});
|
|
57498
|
-
}
|
|
57499
|
-
return series;
|
|
57500
|
-
}
|
|
57501
|
-
function aggregateAndSortByMonth(points) {
|
|
57502
|
-
const monthMap = new Map();
|
|
57503
|
-
points.forEach(point => {
|
|
57504
|
-
const existing = monthMap.get(point.category);
|
|
57505
|
-
if (existing) {
|
|
57506
|
-
existing.value += point.value;
|
|
57507
|
-
}
|
|
57508
|
-
else {
|
|
57509
|
-
monthMap.set(point.category, { ...point });
|
|
57510
|
-
}
|
|
57511
|
-
});
|
|
57512
|
-
return sortDataByMonth(Array.from(monthMap.values()));
|
|
57513
|
-
}
|
|
57514
|
-
function getConvertedDataForSource(uiData, source) {
|
|
57515
|
-
if (!uiData)
|
|
57516
|
-
return undefined;
|
|
57517
|
-
const periodInfo = uiData.periodInfo;
|
|
57518
|
-
console.group('[getConvertedDataForSource] Debug');
|
|
57519
|
-
console.log('source:', source);
|
|
57520
|
-
console.log('periodInfo:', periodInfo);
|
|
57521
|
-
console.log('period:', periodInfo?.period);
|
|
57522
|
-
console.log('comparePeriod:', periodInfo?.comparePeriod);
|
|
57523
|
-
let result;
|
|
57524
|
-
switch (source) {
|
|
57525
|
-
case 'current':
|
|
57526
|
-
result = uiData.convertedDataResults;
|
|
57527
|
-
console.log('Using convertedDataResults (current period)');
|
|
57528
|
-
break;
|
|
57529
|
-
case 'compare':
|
|
57530
|
-
result = uiData.convertedDataResultsCompare;
|
|
57531
|
-
console.log('Using convertedDataResultsCompare (compare period)');
|
|
57532
|
-
break;
|
|
57533
|
-
case 'priorYear':
|
|
57534
|
-
if (periodInfo?.period === UiDataPeriodEnum.THIS_YEAR &&
|
|
57535
|
-
periodInfo?.comparePeriod === UiDataComparePeriodEnum.PREVIOUS_PERIOD) {
|
|
57536
|
-
result = uiData.convertedDataResultsCompare;
|
|
57537
|
-
console.log('THIS_YEAR + PREVIOUS_PERIOD: Using convertedDataResultsCompare (all of last year)');
|
|
57538
|
-
}
|
|
57539
|
-
else if (periodInfo?.period === UiDataPeriodEnum.THIS_AND_LAST_YEAR) {
|
|
57540
|
-
console.log('THIS_AND_LAST_YEAR: Need to filter by year from convertedDataResults');
|
|
57541
|
-
result = uiData.convertedDataResults;
|
|
57542
|
-
}
|
|
57543
|
-
else if (periodInfo?.comparePeriod === UiDataComparePeriodEnum.SAME_PERIOD_LAST_YEAR) {
|
|
57544
|
-
result = uiData.convertedDataResultsCompare;
|
|
57545
|
-
console.log('SAME_PERIOD_LAST_YEAR: Using convertedDataResultsCompare');
|
|
57546
|
-
}
|
|
57547
|
-
else if (periodInfo?.comparePeriod === UiDataComparePeriodEnum.PREVIOUS_PERIOD) {
|
|
57548
|
-
result = uiData.convertedDataResultsCompare;
|
|
57549
|
-
console.log('PREVIOUS_PERIOD: Using convertedDataResultsCompare');
|
|
57550
|
-
}
|
|
57551
|
-
else {
|
|
57552
|
-
console.log('No matching period config for priorYear, falling back to convertedDataResultsCompare');
|
|
57553
|
-
result = uiData.convertedDataResultsCompare;
|
|
57554
|
-
}
|
|
57555
|
-
break;
|
|
57556
|
-
}
|
|
57557
|
-
console.log('Result exists:', !!result);
|
|
57558
|
-
console.groupEnd();
|
|
57559
|
-
return result;
|
|
57560
|
-
}
|
|
57561
|
-
function sumMetricFromUiData(uiData, metricToSum, source = 'current') {
|
|
57562
|
-
console.group('[sumMetricFromUiData] Debug');
|
|
57563
|
-
console.log('metricToSum:', metricToSum);
|
|
57564
|
-
console.log('source:', source);
|
|
57565
|
-
const convertedData = getConvertedDataForSource(uiData, source);
|
|
57566
|
-
if (!convertedData) {
|
|
57567
|
-
console.log('EARLY RETURN: convertedData is falsy');
|
|
57568
|
-
console.log('convertedDataResults exists:', !!uiData?.convertedDataResults);
|
|
57569
|
-
console.log('convertedDataResultsCompare exists:', !!uiData?.convertedDataResultsCompare);
|
|
57570
|
-
console.groupEnd();
|
|
57571
|
-
return 0;
|
|
57572
|
-
}
|
|
57573
|
-
let total = 0;
|
|
57574
|
-
const metricIndex = convertedData.metrics?.indexOf(metricToSum);
|
|
57575
|
-
console.log('Available metrics:', convertedData.metrics);
|
|
57576
|
-
console.log('metricIndex for', metricToSum, ':', metricIndex);
|
|
57577
|
-
if (metricIndex === undefined || metricIndex === -1) {
|
|
57578
|
-
console.log('EARLY RETURN: metricIndex is undefined or -1');
|
|
57579
|
-
console.groupEnd();
|
|
57580
|
-
return 0;
|
|
57581
|
-
}
|
|
57582
|
-
console.log('Number of rows:', convertedData.rows?.length ?? 0);
|
|
57583
|
-
convertedData.rows?.forEach((row, idx) => {
|
|
57584
|
-
const rawValue = row.metricValues?.[metricIndex];
|
|
57585
|
-
const metricValue = parseFloat(rawValue || '0');
|
|
57586
|
-
if (idx < 3) {
|
|
57587
|
-
console.log(`Row ${idx}: raw="${rawValue}", parsed=${metricValue}`);
|
|
57588
|
-
}
|
|
57589
|
-
total += metricValue;
|
|
57590
|
-
});
|
|
57591
|
-
console.log('Final total:', total);
|
|
57592
|
-
console.groupEnd();
|
|
57593
|
-
return total;
|
|
57594
|
-
}
|
|
57595
|
-
|
|
57596
|
-
class RevenueCalculatorService {
|
|
57597
|
-
calculateTargetsFromRevenue(revenueTarget, mainUiData, funnelMetrics) {
|
|
57598
|
-
const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
|
|
57599
|
-
const baselineValues = this.extractBaselineValues(mainUiData, funnelMetrics);
|
|
57600
|
-
return calculateMetricTargetsFromRevenue(revenueTarget, priorYearRevenue, funnelMetrics, baselineValues);
|
|
57601
|
-
}
|
|
57602
|
-
calculateTargetsFromPercentage(percentageIncrease, mainUiData, funnelMetrics) {
|
|
57603
|
-
const priorYearRevenue = this.extractPriorYearRevenue(mainUiData);
|
|
57604
|
-
const revenueTarget = priorYearRevenue * (1 + percentageIncrease / 100);
|
|
57605
|
-
return this.calculateTargetsFromRevenue(revenueTarget, mainUiData, funnelMetrics);
|
|
57606
|
-
}
|
|
57607
|
-
extractPriorYearRevenue(mainUiData) {
|
|
57608
|
-
return sumMetricFromUiData(mainUiData, MetricEnum.PURCHASE_REVENUE, 'priorYear');
|
|
57609
|
-
}
|
|
57610
|
-
extractBaselineValues(mainUiData, funnelMetrics) {
|
|
57611
|
-
const baselineValues = new Map();
|
|
57612
|
-
if (!mainUiData) {
|
|
57613
|
-
return baselineValues;
|
|
57614
|
-
}
|
|
57615
|
-
funnelMetrics.forEach(fm => {
|
|
57616
|
-
if (fm.relatedMetric) {
|
|
57617
|
-
const value = sumMetricFromUiData(mainUiData, fm.relatedMetric, 'priorYear');
|
|
57618
|
-
baselineValues.set(fm.relatedMetric, value);
|
|
57619
|
-
}
|
|
57620
|
-
});
|
|
57621
|
-
return baselineValues;
|
|
57622
|
-
}
|
|
57623
|
-
getMetricsByFunnelStage(calculations) {
|
|
57624
|
-
const grouped = new Map();
|
|
57625
|
-
calculations.forEach(calc => {
|
|
57626
|
-
if (calc.isFunnelStage) {
|
|
57627
|
-
if (!grouped.has(calc.metric)) {
|
|
57628
|
-
grouped.set(calc.metric, []);
|
|
57629
|
-
}
|
|
57630
|
-
grouped.get(calc.metric).push(calc);
|
|
57631
|
-
}
|
|
57632
|
-
else if (calc.funnelMetric) {
|
|
57633
|
-
if (!grouped.has(calc.funnelMetric)) {
|
|
57634
|
-
grouped.set(calc.funnelMetric, []);
|
|
57635
|
-
}
|
|
57636
|
-
grouped.get(calc.funnelMetric).push(calc);
|
|
57637
|
-
}
|
|
57638
|
-
});
|
|
57639
|
-
return grouped;
|
|
57640
|
-
}
|
|
57641
|
-
static { this.ɵfac = function RevenueCalculatorService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || RevenueCalculatorService)(); }; }
|
|
57642
|
-
static { this.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: RevenueCalculatorService, factory: RevenueCalculatorService.ɵfac, providedIn: 'root' }); }
|
|
57643
|
-
}
|
|
57644
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(RevenueCalculatorService, [{
|
|
57645
|
-
type: Injectable,
|
|
57646
|
-
args: [{
|
|
57647
|
-
providedIn: 'root'
|
|
57648
|
-
}]
|
|
57649
|
-
}], null, null); })();
|
|
57650
|
-
|
|
57651
57711
|
const _c0$r = ["absoluteInputRef"];
|
|
57712
|
+
const _c1$b = ["percentageInputRef"];
|
|
57652
57713
|
function InitialTargetSettingComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
57653
|
-
i0.ɵɵelementStart(0, "p",
|
|
57714
|
+
i0.ɵɵelementStart(0, "p", 9);
|
|
57654
57715
|
i0.ɵɵtext(1);
|
|
57655
57716
|
i0.ɵɵelementEnd();
|
|
57656
57717
|
} if (rf & 2) {
|
|
@@ -57661,10 +57722,10 @@ function InitialTargetSettingComponent_Conditional_12_Template(rf, ctx) { if (rf
|
|
|
57661
57722
|
} }
|
|
57662
57723
|
function InitialTargetSettingComponent_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
57663
57724
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
57664
|
-
i0.ɵɵelementStart(0, "div",
|
|
57725
|
+
i0.ɵɵelementStart(0, "div", 12)(1, "span", 19);
|
|
57665
57726
|
i0.ɵɵtext(2, " $ ");
|
|
57666
57727
|
i0.ɵɵelementEnd();
|
|
57667
|
-
i0.ɵɵelementStart(3, "input",
|
|
57728
|
+
i0.ɵɵelementStart(3, "input", 20, 0);
|
|
57668
57729
|
i0.ɵɵtwoWayListener("ngModelChange", function InitialTargetSettingComponent_Conditional_18_Template_input_ngModelChange_3_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.absoluteInput, $event) || (ctx_r0.absoluteInput = $event); return i0.ɵɵresetView($event); });
|
|
57669
57730
|
i0.ɵɵlistener("ngModelChange", function InitialTargetSettingComponent_Conditional_18_Template_input_ngModelChange_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onAbsoluteInputChange()); });
|
|
57670
57731
|
i0.ɵɵelementEnd()();
|
|
@@ -57678,32 +57739,32 @@ function InitialTargetSettingComponent_Conditional_18_Template(rf, ctx) { if (rf
|
|
|
57678
57739
|
} }
|
|
57679
57740
|
function InitialTargetSettingComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
|
|
57680
57741
|
const _r3 = i0.ɵɵgetCurrentView();
|
|
57681
|
-
i0.ɵɵelementStart(0, "div",
|
|
57742
|
+
i0.ɵɵelementStart(0, "div", 12)(1, "input", 21, 1);
|
|
57682
57743
|
i0.ɵɵtwoWayListener("ngModelChange", function InitialTargetSettingComponent_Conditional_19_Template_input_ngModelChange_1_listener($event) { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r0.percentageInput, $event) || (ctx_r0.percentageInput = $event); return i0.ɵɵresetView($event); });
|
|
57683
57744
|
i0.ɵɵlistener("ngModelChange", function InitialTargetSettingComponent_Conditional_19_Template_input_ngModelChange_1_listener() { i0.ɵɵrestoreView(_r3); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.onPercentageInputChange()); });
|
|
57684
57745
|
i0.ɵɵelementEnd();
|
|
57685
|
-
i0.ɵɵelementStart(
|
|
57686
|
-
i0.ɵɵtext(
|
|
57746
|
+
i0.ɵɵelementStart(3, "span", 22);
|
|
57747
|
+
i0.ɵɵtext(4, " % ");
|
|
57687
57748
|
i0.ɵɵelementEnd()();
|
|
57688
57749
|
} if (rf & 2) {
|
|
57689
57750
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
57690
57751
|
i0.ɵɵadvance();
|
|
57691
57752
|
i0.ɵɵtwoWayProperty("ngModel", ctx_r0.percentageInput);
|
|
57692
57753
|
i0.ɵɵproperty("ngClass", ctx_r0.inputClasses());
|
|
57693
|
-
i0.ɵɵadvance();
|
|
57754
|
+
i0.ɵɵadvance(2);
|
|
57694
57755
|
i0.ɵɵproperty("ngClass", ctx_r0.inputSuffixClasses());
|
|
57695
57756
|
} }
|
|
57696
57757
|
function InitialTargetSettingComponent_Conditional_20_Conditional_18_Template(rf, ctx) { if (rf & 1) {
|
|
57697
|
-
i0.ɵɵelementStart(0, "div",
|
|
57758
|
+
i0.ɵɵelementStart(0, "div", 26)(1, "div")(2, "p", 24);
|
|
57698
57759
|
i0.ɵɵtext(3, " Gap to Close ");
|
|
57699
57760
|
i0.ɵɵelementEnd();
|
|
57700
|
-
i0.ɵɵelementStart(4, "p",
|
|
57761
|
+
i0.ɵɵelementStart(4, "p", 27);
|
|
57701
57762
|
i0.ɵɵtext(5);
|
|
57702
57763
|
i0.ɵɵelementEnd()();
|
|
57703
|
-
i0.ɵɵelementStart(6, "div")(7, "p",
|
|
57764
|
+
i0.ɵɵelementStart(6, "div")(7, "p", 24);
|
|
57704
57765
|
i0.ɵɵtext(8, " Additional Growth Needed ");
|
|
57705
57766
|
i0.ɵɵelementEnd();
|
|
57706
|
-
i0.ɵɵelementStart(9, "p",
|
|
57767
|
+
i0.ɵɵelementStart(9, "p", 27);
|
|
57707
57768
|
i0.ɵɵtext(10);
|
|
57708
57769
|
i0.ɵɵelementEnd()()();
|
|
57709
57770
|
} if (rf & 2) {
|
|
@@ -57723,25 +57784,25 @@ function InitialTargetSettingComponent_Conditional_20_Conditional_18_Template(rf
|
|
|
57723
57784
|
i0.ɵɵtextInterpolate2(" ", ctx_r0.gapToClose().amount > 0 ? "+" : "", "", ctx_r0.formatPercentage(ctx_r0.gapToClose().percentage, 1), " ");
|
|
57724
57785
|
} }
|
|
57725
57786
|
function InitialTargetSettingComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
|
|
57726
|
-
i0.ɵɵelementStart(0, "div",
|
|
57787
|
+
i0.ɵɵelementStart(0, "div", 13)(1, "div", 23)(2, "div")(3, "p", 24);
|
|
57727
57788
|
i0.ɵɵtext(4);
|
|
57728
57789
|
i0.ɵɵelementEnd();
|
|
57729
|
-
i0.ɵɵelementStart(5, "p",
|
|
57790
|
+
i0.ɵɵelementStart(5, "p", 25);
|
|
57730
57791
|
i0.ɵɵtext(6);
|
|
57731
57792
|
i0.ɵɵelementEnd()();
|
|
57732
|
-
i0.ɵɵelementStart(7, "div",
|
|
57793
|
+
i0.ɵɵelementStart(7, "div", 26)(8, "div")(9, "p", 24);
|
|
57733
57794
|
i0.ɵɵtext(10, " Increase Amount ");
|
|
57734
57795
|
i0.ɵɵelementEnd();
|
|
57735
|
-
i0.ɵɵelementStart(11, "p",
|
|
57796
|
+
i0.ɵɵelementStart(11, "p", 27);
|
|
57736
57797
|
i0.ɵɵtext(12);
|
|
57737
57798
|
i0.ɵɵelementEnd()();
|
|
57738
|
-
i0.ɵɵelementStart(13, "div")(14, "p",
|
|
57799
|
+
i0.ɵɵelementStart(13, "div")(14, "p", 24);
|
|
57739
57800
|
i0.ɵɵtext(15, " % Growth ");
|
|
57740
57801
|
i0.ɵɵelementEnd();
|
|
57741
|
-
i0.ɵɵelementStart(16, "p",
|
|
57802
|
+
i0.ɵɵelementStart(16, "p", 27);
|
|
57742
57803
|
i0.ɵɵtext(17);
|
|
57743
57804
|
i0.ɵɵelementEnd()()();
|
|
57744
|
-
i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_20_Conditional_18_Template, 11, 8, "div",
|
|
57805
|
+
i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_20_Conditional_18_Template, 11, 8, "div", 26);
|
|
57745
57806
|
i0.ɵɵelementEnd()();
|
|
57746
57807
|
} if (rf & 2) {
|
|
57747
57808
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -57772,13 +57833,13 @@ function InitialTargetSettingComponent_Conditional_20_Template(rf, ctx) { if (rf
|
|
|
57772
57833
|
i0.ɵɵconditional(ctx_r0.currentPaceProjection() > 0 && ctx_r0.gapToClose().amount !== 0 ? 18 : -1);
|
|
57773
57834
|
} }
|
|
57774
57835
|
function InitialTargetSettingComponent_Conditional_25_Template(rf, ctx) { if (rf & 1) {
|
|
57775
|
-
i0.ɵɵelement(0, "symphiq-area-chart",
|
|
57836
|
+
i0.ɵɵelement(0, "symphiq-area-chart", 16);
|
|
57776
57837
|
} if (rf & 2) {
|
|
57777
57838
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
57778
57839
|
i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "320px");
|
|
57779
57840
|
} }
|
|
57780
57841
|
function InitialTargetSettingComponent_Conditional_26_Template(rf, ctx) { if (rf & 1) {
|
|
57781
|
-
i0.ɵɵelementStart(0, "div",
|
|
57842
|
+
i0.ɵɵelementStart(0, "div", 17)(1, "p", 28);
|
|
57782
57843
|
i0.ɵɵtext(2, " No revenue data available ");
|
|
57783
57844
|
i0.ɵɵelementEnd()();
|
|
57784
57845
|
} if (rf & 2) {
|
|
@@ -57787,13 +57848,13 @@ function InitialTargetSettingComponent_Conditional_26_Template(rf, ctx) { if (rf
|
|
|
57787
57848
|
i0.ɵɵproperty("ngClass", ctx_r0.noDataClasses());
|
|
57788
57849
|
} }
|
|
57789
57850
|
function InitialTargetSettingComponent_Conditional_27_Template(rf, ctx) { if (rf & 1) {
|
|
57790
|
-
i0.ɵɵelementStart(0, "div",
|
|
57851
|
+
i0.ɵɵelementStart(0, "div", 3)(1, "div", 29)(2, "h2", 30);
|
|
57791
57852
|
i0.ɵɵtext(3, " Contributing Metrics ");
|
|
57792
57853
|
i0.ɵɵelementEnd();
|
|
57793
|
-
i0.ɵɵelementStart(4, "p",
|
|
57854
|
+
i0.ɵɵelementStart(4, "p", 28);
|
|
57794
57855
|
i0.ɵɵtext(5);
|
|
57795
57856
|
i0.ɵɵelementEnd()();
|
|
57796
|
-
i0.ɵɵelement(6, "symphiq-funnel-metrics-visualization",
|
|
57857
|
+
i0.ɵɵelement(6, "symphiq-funnel-metrics-visualization", 31);
|
|
57797
57858
|
i0.ɵɵelementEnd();
|
|
57798
57859
|
} if (rf & 2) {
|
|
57799
57860
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
@@ -57820,7 +57881,7 @@ class InitialTargetSettingComponent {
|
|
|
57820
57881
|
this.targetsCreated = output();
|
|
57821
57882
|
this.inputMode = signal('absolute', ...(ngDevMode ? [{ debugName: "inputMode" }] : []));
|
|
57822
57883
|
this.absoluteInput = signal(null, ...(ngDevMode ? [{ debugName: "absoluteInput" }] : []));
|
|
57823
|
-
this.percentageInput = signal(
|
|
57884
|
+
this.percentageInput = signal(null, ...(ngDevMode ? [{ debugName: "percentageInput" }] : []));
|
|
57824
57885
|
this.isSubmitting = signal(false, ...(ngDevMode ? [{ debugName: "isSubmitting" }] : []));
|
|
57825
57886
|
this.priorYearRevenue = computed(() => {
|
|
57826
57887
|
return sumMetricFromUiData(this.mainUiData(), MetricEnum.PURCHASE_REVENUE, 'priorYear');
|
|
@@ -57849,6 +57910,8 @@ class InitialTargetSettingComponent {
|
|
|
57849
57910
|
}
|
|
57850
57911
|
else {
|
|
57851
57912
|
const pct = this.percentageInput();
|
|
57913
|
+
if (pct === null)
|
|
57914
|
+
return 0;
|
|
57852
57915
|
return priorRevenue * (1 + pct / 100);
|
|
57853
57916
|
}
|
|
57854
57917
|
}, ...(ngDevMode ? [{ debugName: "calculatedRevenue" }] : []));
|
|
@@ -57870,7 +57933,10 @@ class InitialTargetSettingComponent {
|
|
|
57870
57933
|
return this.revenueCalcService.calculateTargetsFromRevenue(revenue, mainData, metrics).metricCalculations;
|
|
57871
57934
|
}
|
|
57872
57935
|
else {
|
|
57873
|
-
|
|
57936
|
+
const pct = this.percentageInput();
|
|
57937
|
+
if (pct === null)
|
|
57938
|
+
return [];
|
|
57939
|
+
return this.revenueCalcService.calculateTargetsFromPercentage(pct, mainData, metrics).metricCalculations;
|
|
57874
57940
|
}
|
|
57875
57941
|
}, ...(ngDevMode ? [{ debugName: "metricCalculations" }] : []));
|
|
57876
57942
|
this.isValid = computed(() => {
|
|
@@ -57912,31 +57978,6 @@ class InitialTargetSettingComponent {
|
|
|
57912
57978
|
}, ...(ngDevMode ? [{ debugName: "revenueChartData" }] : []));
|
|
57913
57979
|
this.currentYear = computed(() => new Date().getFullYear(), ...(ngDevMode ? [{ debugName: "currentYear" }] : []));
|
|
57914
57980
|
this.priorYear = computed(() => new Date().getFullYear() - 1, ...(ngDevMode ? [{ debugName: "priorYear" }] : []));
|
|
57915
|
-
effect(() => {
|
|
57916
|
-
const mainData = this.mainUiData();
|
|
57917
|
-
console.group('[InitialTargetSetting] mainUiData Debug');
|
|
57918
|
-
console.log('mainUiData exists:', !!mainData);
|
|
57919
|
-
console.log('mainUiData:', mainData);
|
|
57920
|
-
if (mainData) {
|
|
57921
|
-
console.log('convertedDataResults exists:', !!mainData.convertedDataResults);
|
|
57922
|
-
if (mainData.convertedDataResults) {
|
|
57923
|
-
const converted = mainData.convertedDataResults;
|
|
57924
|
-
console.log('metrics array:', converted.metrics);
|
|
57925
|
-
console.log('dimensions array:', converted.dimensions);
|
|
57926
|
-
console.log('rows count:', converted.rows?.length ?? 0);
|
|
57927
|
-
console.log('first 3 rows:', converted.rows?.slice(0, 3));
|
|
57928
|
-
const metricIndex = converted.metrics?.indexOf(MetricEnum.PURCHASE_REVENUE);
|
|
57929
|
-
console.log('PURCHASE_REVENUE enum value:', MetricEnum.PURCHASE_REVENUE);
|
|
57930
|
-
console.log('PURCHASE_REVENUE index in metrics:', metricIndex);
|
|
57931
|
-
if (metricIndex !== undefined && metricIndex !== -1 && converted.rows?.length) {
|
|
57932
|
-
const sampleValues = converted.rows.slice(0, 5).map(r => r.metricValues?.[metricIndex]);
|
|
57933
|
-
console.log('Sample metric values at index', metricIndex, ':', sampleValues);
|
|
57934
|
-
}
|
|
57935
|
-
}
|
|
57936
|
-
}
|
|
57937
|
-
console.log('Computed priorYearRevenue:', this.priorYearRevenue());
|
|
57938
|
-
console.groupEnd();
|
|
57939
|
-
});
|
|
57940
57981
|
}
|
|
57941
57982
|
ngAfterViewInit() {
|
|
57942
57983
|
setTimeout(() => {
|
|
@@ -57945,6 +57986,14 @@ class InitialTargetSettingComponent {
|
|
|
57945
57986
|
}
|
|
57946
57987
|
setInputMode(mode) {
|
|
57947
57988
|
this.inputMode.set(mode);
|
|
57989
|
+
setTimeout(() => {
|
|
57990
|
+
if (mode === 'absolute' && this.absoluteInput() === null) {
|
|
57991
|
+
this.absoluteInputRef?.nativeElement?.focus();
|
|
57992
|
+
}
|
|
57993
|
+
else if (mode === 'percentage' && this.percentageInput() === null) {
|
|
57994
|
+
this.percentageInputRef?.nativeElement?.focus();
|
|
57995
|
+
}
|
|
57996
|
+
});
|
|
57948
57997
|
}
|
|
57949
57998
|
onAbsoluteInputChange() {
|
|
57950
57999
|
const value = this.absoluteInput() ?? 0;
|
|
@@ -57955,7 +58004,7 @@ class InitialTargetSettingComponent {
|
|
|
57955
58004
|
}
|
|
57956
58005
|
onPercentageInputChange() {
|
|
57957
58006
|
const pct = this.percentageInput();
|
|
57958
|
-
if (pct >= 0 && this.priorYearRevenue() > 0) {
|
|
58007
|
+
if (pct !== null && pct >= 0 && this.priorYearRevenue() > 0) {
|
|
57959
58008
|
const absolute = this.priorYearRevenue() * (1 + pct / 100);
|
|
57960
58009
|
this.absoluteInput.set(absolute);
|
|
57961
58010
|
}
|
|
@@ -58074,41 +58123,43 @@ class InitialTargetSettingComponent {
|
|
|
58074
58123
|
static { this.ɵfac = function InitialTargetSettingComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || InitialTargetSettingComponent)(); }; }
|
|
58075
58124
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: InitialTargetSettingComponent, selectors: [["symphiq-initial-target-setting"]], viewQuery: function InitialTargetSettingComponent_Query(rf, ctx) { if (rf & 1) {
|
|
58076
58125
|
i0.ɵɵviewQuery(_c0$r, 5);
|
|
58126
|
+
i0.ɵɵviewQuery(_c1$b, 5);
|
|
58077
58127
|
} if (rf & 2) {
|
|
58078
58128
|
let _t;
|
|
58079
58129
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.absoluteInputRef = _t.first);
|
|
58080
|
-
|
|
58081
|
-
|
|
58130
|
+
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.percentageInputRef = _t.first);
|
|
58131
|
+
} }, inputs: { viewMode: [1, "viewMode"], funnelMetrics: [1, "funnelMetrics"], mainUiData: [1, "mainUiData"], trendUiData: [1, "trendUiData"], shopId: [1, "shopId"], pacingMetrics: [1, "pacingMetrics"], dataResults: [1, "dataResults"] }, outputs: { targetsCreated: "targetsCreated" }, decls: 29, vars: 21, consts: [["absoluteInputRef", ""], ["percentageInputRef", ""], [1, "space-y-8", "pb-32"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "ngClass"], [1, "text-2xl", "font-bold", "mb-6", 3, "ngClass"], [1, "grid", "lg:grid-cols-2", "gap-8"], [1, "space-y-6"], [1, "block", "text-sm", "font-semibold", "mb-2", 3, "ngClass"], [1, "space-y-1", "mb-4"], [1, "text-xs", 3, "ngClass"], [1, "flex", "gap-2", "mb-4"], [1, "flex-1", "py-2", "px-4", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "relative"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass"], [1, "text-sm", "font-semibold", "mb-3", 3, "ngClass"], [1, "rounded-xl", "border", "p-4", 3, "ngClass"], [3, "chart", "showAxisLabels", "viewMode", "currencySymbol", "height"], [1, "h-64", "flex", "items-center", "justify-center"], [3, "submitClick", "viewMode", "isValid", "isSubmitting", "validationMessage", "buttonText"], [1, "absolute", "left-4", "top-1/2", "-translate-y-1/2", "text-xl", "font-bold", 3, "ngClass"], ["type", "number", "placeholder", "0", "min", "0", "step", "1000", 1, "w-full", "pl-10", "pr-4", "py-4", "rounded-xl", "text-2xl", "font-bold", "border-2", "transition-all", 3, "ngModelChange", "ngModel", "ngClass"], ["type", "number", "placeholder", "0", "min", "0", "max", "1000", "step", "0.1", 1, "w-full", "pr-10", "pl-4", "py-4", "rounded-xl", "text-2xl", "font-bold", "border-2", "transition-all", 3, "ngModelChange", "ngModel", "ngClass"], [1, "absolute", "right-4", "top-1/2", "-translate-y-1/2", "text-xl", "font-bold", 3, "ngClass"], [1, "space-y-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [1, "text-3xl", "font-bold", 3, "ngClass"], [1, "grid", "grid-cols-2", "gap-4", "pt-4", 3, "ngClass"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "mb-6"], [1, "text-2xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "calculations", "pacingMetrics"]], template: function InitialTargetSettingComponent_Template(rf, ctx) { if (rf & 1) {
|
|
58132
|
+
i0.ɵɵelementStart(0, "div", 2)(1, "div", 3)(2, "h2", 4);
|
|
58082
58133
|
i0.ɵɵtext(3, " Calculate Your Revenue Target ");
|
|
58083
58134
|
i0.ɵɵelementEnd();
|
|
58084
|
-
i0.ɵɵelementStart(4, "div",
|
|
58135
|
+
i0.ɵɵelementStart(4, "div", 5)(5, "div", 6)(6, "div")(7, "label", 7);
|
|
58085
58136
|
i0.ɵɵtext(8);
|
|
58086
58137
|
i0.ɵɵelementEnd();
|
|
58087
|
-
i0.ɵɵelementStart(9, "div",
|
|
58138
|
+
i0.ɵɵelementStart(9, "div", 8)(10, "p", 9);
|
|
58088
58139
|
i0.ɵɵtext(11);
|
|
58089
58140
|
i0.ɵɵelementEnd();
|
|
58090
|
-
i0.ɵɵconditionalCreate(12, InitialTargetSettingComponent_Conditional_12_Template, 2, 2, "p",
|
|
58141
|
+
i0.ɵɵconditionalCreate(12, InitialTargetSettingComponent_Conditional_12_Template, 2, 2, "p", 9);
|
|
58091
58142
|
i0.ɵɵelementEnd();
|
|
58092
|
-
i0.ɵɵelementStart(13, "div",
|
|
58143
|
+
i0.ɵɵelementStart(13, "div", 10)(14, "button", 11);
|
|
58093
58144
|
i0.ɵɵlistener("click", function InitialTargetSettingComponent_Template_button_click_14_listener() { return ctx.setInputMode("absolute"); });
|
|
58094
58145
|
i0.ɵɵtext(15, " Absolute Amount ");
|
|
58095
58146
|
i0.ɵɵelementEnd();
|
|
58096
|
-
i0.ɵɵelementStart(16, "button",
|
|
58147
|
+
i0.ɵɵelementStart(16, "button", 11);
|
|
58097
58148
|
i0.ɵɵlistener("click", function InitialTargetSettingComponent_Template_button_click_16_listener() { return ctx.setInputMode("percentage"); });
|
|
58098
58149
|
i0.ɵɵtext(17, " % Increase ");
|
|
58099
58150
|
i0.ɵɵelementEnd()();
|
|
58100
|
-
i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_18_Template, 5, 3, "div",
|
|
58151
|
+
i0.ɵɵconditionalCreate(18, InitialTargetSettingComponent_Conditional_18_Template, 5, 3, "div", 12)(19, InitialTargetSettingComponent_Conditional_19_Template, 5, 3, "div", 12);
|
|
58101
58152
|
i0.ɵɵelementEnd();
|
|
58102
|
-
i0.ɵɵconditionalCreate(20, InitialTargetSettingComponent_Conditional_20_Template, 19, 13, "div",
|
|
58153
|
+
i0.ɵɵconditionalCreate(20, InitialTargetSettingComponent_Conditional_20_Template, 19, 13, "div", 13);
|
|
58103
58154
|
i0.ɵɵelementEnd();
|
|
58104
|
-
i0.ɵɵelementStart(21, "div")(22, "p",
|
|
58155
|
+
i0.ɵɵelementStart(21, "div")(22, "p", 14);
|
|
58105
58156
|
i0.ɵɵtext(23, " Year-over-Year Revenue Trend ");
|
|
58106
58157
|
i0.ɵɵelementEnd();
|
|
58107
|
-
i0.ɵɵelementStart(24, "div",
|
|
58108
|
-
i0.ɵɵconditionalCreate(25, InitialTargetSettingComponent_Conditional_25_Template, 1, 5, "symphiq-area-chart",
|
|
58158
|
+
i0.ɵɵelementStart(24, "div", 15);
|
|
58159
|
+
i0.ɵɵconditionalCreate(25, InitialTargetSettingComponent_Conditional_25_Template, 1, 5, "symphiq-area-chart", 16)(26, InitialTargetSettingComponent_Conditional_26_Template, 3, 1, "div", 17);
|
|
58109
58160
|
i0.ɵɵelementEnd()()()();
|
|
58110
|
-
i0.ɵɵconditionalCreate(27, InitialTargetSettingComponent_Conditional_27_Template, 7, 7, "div",
|
|
58111
|
-
i0.ɵɵelementStart(28, "symphiq-sticky-submit-bar",
|
|
58161
|
+
i0.ɵɵconditionalCreate(27, InitialTargetSettingComponent_Conditional_27_Template, 7, 7, "div", 3);
|
|
58162
|
+
i0.ɵɵelementStart(28, "symphiq-sticky-submit-bar", 18);
|
|
58112
58163
|
i0.ɵɵlistener("submitClick", function InitialTargetSettingComponent_Template_symphiq_sticky_submit_bar_submitClick_28_listener() { return ctx.handleSubmit(); });
|
|
58113
58164
|
i0.ɵɵelementEnd()();
|
|
58114
58165
|
} if (rf & 2) {
|
|
@@ -58161,194 +58212,198 @@ class InitialTargetSettingComponent {
|
|
|
58161
58212
|
AreaChartComponent
|
|
58162
58213
|
],
|
|
58163
58214
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
58164
|
-
template: `
|
|
58165
|
-
<div class="space-y-8 pb-32">
|
|
58166
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
|
|
58167
|
-
<h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-6">
|
|
58168
|
-
Calculate Your Revenue Target
|
|
58169
|
-
</h2>
|
|
58170
|
-
|
|
58171
|
-
<div class="grid lg:grid-cols-2 gap-8">
|
|
58172
|
-
<div class="space-y-6">
|
|
58173
|
-
<div>
|
|
58174
|
-
<label [ngClass]="labelClasses()" class="block text-sm font-semibold mb-2">
|
|
58175
|
-
{{ currentYear() }} Revenue
|
|
58176
|
-
</label>
|
|
58177
|
-
<div class="space-y-1 mb-4">
|
|
58178
|
-
<p [ngClass]="priorYearLabelClasses()" class="text-xs">
|
|
58179
|
-
{{ priorYear() }} Revenue: {{ formatCurrency(priorYearRevenue()) }}
|
|
58180
|
-
</p>
|
|
58181
|
-
@if (currentPaceProjection() > 0) {
|
|
58182
|
-
<p [ngClass]="priorYearLabelClasses()" class="text-xs">
|
|
58183
|
-
Current Pace Projection: {{ formatCurrency(currentPaceProjection()) }}
|
|
58184
|
-
</p>
|
|
58185
|
-
}
|
|
58186
|
-
</div>
|
|
58187
|
-
|
|
58188
|
-
<div class="flex gap-2 mb-4">
|
|
58189
|
-
<button
|
|
58190
|
-
(click)="setInputMode('absolute')"
|
|
58191
|
-
[ngClass]="inputModeButtonClasses('absolute')"
|
|
58192
|
-
class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
|
|
58193
|
-
Absolute Amount
|
|
58194
|
-
</button>
|
|
58195
|
-
<button
|
|
58196
|
-
(click)="setInputMode('percentage')"
|
|
58197
|
-
[ngClass]="inputModeButtonClasses('percentage')"
|
|
58198
|
-
class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
|
|
58199
|
-
% Increase
|
|
58200
|
-
</button>
|
|
58201
|
-
</div>
|
|
58202
|
-
|
|
58203
|
-
@if (inputMode() === 'absolute') {
|
|
58204
|
-
<div class="relative">
|
|
58205
|
-
<span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
|
|
58206
|
-
$
|
|
58207
|
-
</span>
|
|
58208
|
-
<input
|
|
58209
|
-
#absoluteInputRef
|
|
58210
|
-
type="number"
|
|
58211
|
-
[(ngModel)]="absoluteInput"
|
|
58212
|
-
(ngModelChange)="onAbsoluteInputChange()"
|
|
58213
|
-
[ngClass]="inputClasses()"
|
|
58214
|
-
class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
|
|
58215
|
-
placeholder="0"
|
|
58216
|
-
min="0"
|
|
58217
|
-
step="1000">
|
|
58218
|
-
</div>
|
|
58219
|
-
} @else {
|
|
58220
|
-
<div class="relative">
|
|
58221
|
-
<input
|
|
58222
|
-
|
|
58223
|
-
|
|
58224
|
-
(
|
|
58225
|
-
|
|
58226
|
-
|
|
58227
|
-
|
|
58228
|
-
|
|
58229
|
-
|
|
58230
|
-
|
|
58231
|
-
|
|
58232
|
-
|
|
58233
|
-
|
|
58234
|
-
|
|
58235
|
-
|
|
58236
|
-
|
|
58237
|
-
|
|
58238
|
-
|
|
58239
|
-
|
|
58240
|
-
|
|
58241
|
-
|
|
58242
|
-
|
|
58243
|
-
|
|
58244
|
-
|
|
58245
|
-
|
|
58246
|
-
|
|
58247
|
-
|
|
58248
|
-
|
|
58249
|
-
|
|
58250
|
-
|
|
58251
|
-
|
|
58252
|
-
|
|
58253
|
-
|
|
58254
|
-
|
|
58255
|
-
|
|
58256
|
-
|
|
58257
|
-
|
|
58258
|
-
|
|
58259
|
-
|
|
58260
|
-
|
|
58261
|
-
|
|
58262
|
-
|
|
58263
|
-
|
|
58264
|
-
|
|
58265
|
-
|
|
58266
|
-
|
|
58267
|
-
|
|
58268
|
-
|
|
58269
|
-
|
|
58270
|
-
|
|
58271
|
-
|
|
58272
|
-
|
|
58273
|
-
|
|
58274
|
-
|
|
58275
|
-
|
|
58276
|
-
|
|
58277
|
-
|
|
58278
|
-
|
|
58279
|
-
|
|
58280
|
-
|
|
58281
|
-
|
|
58282
|
-
|
|
58283
|
-
|
|
58284
|
-
|
|
58285
|
-
|
|
58286
|
-
|
|
58287
|
-
|
|
58288
|
-
|
|
58289
|
-
|
|
58290
|
-
|
|
58291
|
-
|
|
58292
|
-
|
|
58293
|
-
|
|
58294
|
-
|
|
58295
|
-
|
|
58296
|
-
|
|
58297
|
-
|
|
58298
|
-
|
|
58299
|
-
|
|
58300
|
-
[
|
|
58301
|
-
[
|
|
58302
|
-
[
|
|
58303
|
-
[
|
|
58304
|
-
|
|
58305
|
-
|
|
58306
|
-
|
|
58307
|
-
|
|
58308
|
-
|
|
58309
|
-
|
|
58310
|
-
|
|
58311
|
-
|
|
58312
|
-
|
|
58313
|
-
|
|
58314
|
-
|
|
58315
|
-
|
|
58316
|
-
|
|
58317
|
-
|
|
58318
|
-
|
|
58319
|
-
|
|
58320
|
-
|
|
58321
|
-
|
|
58322
|
-
|
|
58323
|
-
|
|
58324
|
-
|
|
58325
|
-
|
|
58326
|
-
|
|
58327
|
-
|
|
58328
|
-
|
|
58329
|
-
|
|
58330
|
-
[
|
|
58331
|
-
[
|
|
58332
|
-
|
|
58333
|
-
|
|
58334
|
-
|
|
58335
|
-
|
|
58336
|
-
|
|
58337
|
-
|
|
58338
|
-
[
|
|
58339
|
-
[
|
|
58340
|
-
[
|
|
58341
|
-
[
|
|
58342
|
-
|
|
58343
|
-
|
|
58344
|
-
|
|
58215
|
+
template: `
|
|
58216
|
+
<div class="space-y-8 pb-32">
|
|
58217
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
|
|
58218
|
+
<h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-6">
|
|
58219
|
+
Calculate Your Revenue Target
|
|
58220
|
+
</h2>
|
|
58221
|
+
|
|
58222
|
+
<div class="grid lg:grid-cols-2 gap-8">
|
|
58223
|
+
<div class="space-y-6">
|
|
58224
|
+
<div>
|
|
58225
|
+
<label [ngClass]="labelClasses()" class="block text-sm font-semibold mb-2">
|
|
58226
|
+
{{ currentYear() }} Revenue
|
|
58227
|
+
</label>
|
|
58228
|
+
<div class="space-y-1 mb-4">
|
|
58229
|
+
<p [ngClass]="priorYearLabelClasses()" class="text-xs">
|
|
58230
|
+
{{ priorYear() }} Revenue: {{ formatCurrency(priorYearRevenue()) }}
|
|
58231
|
+
</p>
|
|
58232
|
+
@if (currentPaceProjection() > 0) {
|
|
58233
|
+
<p [ngClass]="priorYearLabelClasses()" class="text-xs">
|
|
58234
|
+
Current Pace Projection: {{ formatCurrency(currentPaceProjection()) }}
|
|
58235
|
+
</p>
|
|
58236
|
+
}
|
|
58237
|
+
</div>
|
|
58238
|
+
|
|
58239
|
+
<div class="flex gap-2 mb-4">
|
|
58240
|
+
<button
|
|
58241
|
+
(click)="setInputMode('absolute')"
|
|
58242
|
+
[ngClass]="inputModeButtonClasses('absolute')"
|
|
58243
|
+
class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
|
|
58244
|
+
Absolute Amount
|
|
58245
|
+
</button>
|
|
58246
|
+
<button
|
|
58247
|
+
(click)="setInputMode('percentage')"
|
|
58248
|
+
[ngClass]="inputModeButtonClasses('percentage')"
|
|
58249
|
+
class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
|
|
58250
|
+
% Increase
|
|
58251
|
+
</button>
|
|
58252
|
+
</div>
|
|
58253
|
+
|
|
58254
|
+
@if (inputMode() === 'absolute') {
|
|
58255
|
+
<div class="relative">
|
|
58256
|
+
<span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
|
|
58257
|
+
$
|
|
58258
|
+
</span>
|
|
58259
|
+
<input
|
|
58260
|
+
#absoluteInputRef
|
|
58261
|
+
type="number"
|
|
58262
|
+
[(ngModel)]="absoluteInput"
|
|
58263
|
+
(ngModelChange)="onAbsoluteInputChange()"
|
|
58264
|
+
[ngClass]="inputClasses()"
|
|
58265
|
+
class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
|
|
58266
|
+
placeholder="0"
|
|
58267
|
+
min="0"
|
|
58268
|
+
step="1000">
|
|
58269
|
+
</div>
|
|
58270
|
+
} @else {
|
|
58271
|
+
<div class="relative">
|
|
58272
|
+
<input
|
|
58273
|
+
#percentageInputRef
|
|
58274
|
+
type="number"
|
|
58275
|
+
[(ngModel)]="percentageInput"
|
|
58276
|
+
(ngModelChange)="onPercentageInputChange()"
|
|
58277
|
+
[ngClass]="inputClasses()"
|
|
58278
|
+
class="w-full pr-10 pl-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
|
|
58279
|
+
placeholder="0"
|
|
58280
|
+
min="0"
|
|
58281
|
+
max="1000"
|
|
58282
|
+
step="0.1">
|
|
58283
|
+
<span [ngClass]="inputSuffixClasses()" class="absolute right-4 top-1/2 -translate-y-1/2 text-xl font-bold">
|
|
58284
|
+
%
|
|
58285
|
+
</span>
|
|
58286
|
+
</div>
|
|
58287
|
+
}
|
|
58288
|
+
</div>
|
|
58289
|
+
|
|
58290
|
+
@if (calculatedRevenue() > 0) {
|
|
58291
|
+
<div [ngClass]="calculatedValuesCardClasses()" class="p-6 rounded-xl border-2">
|
|
58292
|
+
<div class="space-y-4">
|
|
58293
|
+
<div>
|
|
58294
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
58295
|
+
{{ currentYear() }} Revenue Target
|
|
58296
|
+
</p>
|
|
58297
|
+
<p [ngClass]="calculatedValueClasses()" class="text-3xl font-bold">
|
|
58298
|
+
{{ formatCurrency(calculatedRevenue()) }}
|
|
58299
|
+
</p>
|
|
58300
|
+
</div>
|
|
58301
|
+
<div class="grid grid-cols-2 gap-4 pt-4" [ngClass]="calculatedDividerClasses()">
|
|
58302
|
+
<div>
|
|
58303
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
58304
|
+
Increase Amount
|
|
58305
|
+
</p>
|
|
58306
|
+
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
58307
|
+
{{ formatCurrency(calculatedRevenue() - priorYearRevenue()) }}
|
|
58308
|
+
</p>
|
|
58309
|
+
</div>
|
|
58310
|
+
<div>
|
|
58311
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
58312
|
+
% Growth
|
|
58313
|
+
</p>
|
|
58314
|
+
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
58315
|
+
+{{ formatPercentage(percentageIncrease(), 1) }}
|
|
58316
|
+
</p>
|
|
58317
|
+
</div>
|
|
58318
|
+
</div>
|
|
58319
|
+
@if (currentPaceProjection() > 0 && gapToClose().amount !== 0) {
|
|
58320
|
+
<div class="grid grid-cols-2 gap-4 pt-4" [ngClass]="calculatedDividerClasses()">
|
|
58321
|
+
<div>
|
|
58322
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
58323
|
+
Gap to Close
|
|
58324
|
+
</p>
|
|
58325
|
+
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
58326
|
+
{{ formatCurrency(absValue(gapToClose().amount)) }}
|
|
58327
|
+
</p>
|
|
58328
|
+
</div>
|
|
58329
|
+
<div>
|
|
58330
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
58331
|
+
Additional Growth Needed
|
|
58332
|
+
</p>
|
|
58333
|
+
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
58334
|
+
{{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(gapToClose().percentage, 1) }}
|
|
58335
|
+
</p>
|
|
58336
|
+
</div>
|
|
58337
|
+
</div>
|
|
58338
|
+
}
|
|
58339
|
+
</div>
|
|
58340
|
+
</div>
|
|
58341
|
+
}
|
|
58342
|
+
</div>
|
|
58343
|
+
|
|
58344
|
+
<div>
|
|
58345
|
+
<p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
|
|
58346
|
+
Year-over-Year Revenue Trend
|
|
58347
|
+
</p>
|
|
58348
|
+
<div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
|
|
58349
|
+
@if (revenueChartData()) {
|
|
58350
|
+
<symphiq-area-chart
|
|
58351
|
+
[chart]="revenueChartData()!"
|
|
58352
|
+
[showAxisLabels]="true"
|
|
58353
|
+
[viewMode]="viewMode()"
|
|
58354
|
+
[currencySymbol]="'$'"
|
|
58355
|
+
[height]="'320px'"
|
|
58356
|
+
/>
|
|
58357
|
+
} @else {
|
|
58358
|
+
<div class="h-64 flex items-center justify-center">
|
|
58359
|
+
<p [ngClass]="noDataClasses()" class="text-sm">
|
|
58360
|
+
No revenue data available
|
|
58361
|
+
</p>
|
|
58362
|
+
</div>
|
|
58363
|
+
}
|
|
58364
|
+
</div>
|
|
58365
|
+
</div>
|
|
58366
|
+
</div>
|
|
58367
|
+
</div>
|
|
58368
|
+
|
|
58369
|
+
@if (showMetricsVisualization()) {
|
|
58370
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
|
|
58371
|
+
<div class="mb-6">
|
|
58372
|
+
<h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-2">
|
|
58373
|
+
Contributing Metrics
|
|
58374
|
+
</h2>
|
|
58375
|
+
<p [ngClass]="sectionDescriptionClasses()" class="text-sm">
|
|
58376
|
+
To achieve your revenue target of {{ formatCurrency(calculatedRevenue()) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
|
|
58377
|
+
</p>
|
|
58378
|
+
</div>
|
|
58379
|
+
|
|
58380
|
+
<symphiq-funnel-metrics-visualization
|
|
58381
|
+
[viewMode]="viewMode()"
|
|
58382
|
+
[calculations]="metricCalculations()"
|
|
58383
|
+
[pacingMetrics]="pacingMetrics()"
|
|
58384
|
+
/>
|
|
58385
|
+
</div>
|
|
58386
|
+
}
|
|
58387
|
+
|
|
58388
|
+
<symphiq-sticky-submit-bar
|
|
58389
|
+
[viewMode]="viewMode()"
|
|
58390
|
+
[isValid]="isValid()"
|
|
58391
|
+
[isSubmitting]="isSubmitting()"
|
|
58392
|
+
[validationMessage]="validationMessage()"
|
|
58393
|
+
[buttonText]="'Set Revenue Targets'"
|
|
58394
|
+
(submitClick)="handleSubmit()"
|
|
58395
|
+
/>
|
|
58396
|
+
</div>
|
|
58345
58397
|
`
|
|
58346
58398
|
}]
|
|
58347
58399
|
}], () => [], { absoluteInputRef: [{
|
|
58348
58400
|
type: ViewChild,
|
|
58349
58401
|
args: ['absoluteInputRef']
|
|
58402
|
+
}], percentageInputRef: [{
|
|
58403
|
+
type: ViewChild,
|
|
58404
|
+
args: ['percentageInputRef']
|
|
58350
58405
|
}], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], funnelMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "funnelMetrics", required: false }] }], mainUiData: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainUiData", required: false }] }], trendUiData: [{ type: i0.Input, args: [{ isSignal: true, alias: "trendUiData", required: false }] }], shopId: [{ type: i0.Input, args: [{ isSignal: true, alias: "shopId", required: false }] }], pacingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingMetrics", required: false }] }], dataResults: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataResults", required: false }] }], targetsCreated: [{ type: i0.Output, args: ["targetsCreated"] }] }); })();
|
|
58351
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber:
|
|
58406
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 218 }); })();
|
|
58352
58407
|
|
|
58353
58408
|
function IndeterminateSpinnerComponent_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
58354
58409
|
i0.ɵɵelement(0, "div", 5);
|
|
@@ -63054,7 +63109,6 @@ class SymphiqBusinessAnalysisDashboardComponent {
|
|
|
63054
63109
|
const HEADER_OFFSET = 120;
|
|
63055
63110
|
const targetElement = document.querySelector(`[data-id="${event.itemId}"]`);
|
|
63056
63111
|
if (!targetElement) {
|
|
63057
|
-
console.warn(`Item not found: ${event.itemId}`);
|
|
63058
63112
|
return;
|
|
63059
63113
|
}
|
|
63060
63114
|
const elementPosition = targetElement.getBoundingClientRect().top + window.scrollY;
|
|
@@ -84201,15 +84255,8 @@ class SymphiqProfileAnalysisDashboardComponent {
|
|
|
84201
84255
|
modal.setMetricsAndInsights(this.allMetrics(), [], this.allCharts());
|
|
84202
84256
|
}
|
|
84203
84257
|
});
|
|
84204
|
-
// Update ProfileItemLookupService when profile changes
|
|
84205
|
-
// This enables competitor and focus area chip lookups in business insights
|
|
84206
84258
|
effect(() => {
|
|
84207
84259
|
const profileValue = this.profile();
|
|
84208
|
-
console.log('[ProfileAnalysisDashboard] profile effect triggered:', {
|
|
84209
|
-
hasProfile: !!profileValue,
|
|
84210
|
-
hasProfileStructured: !!profileValue?.profileStructured,
|
|
84211
|
-
hasSections: !!profileValue?.profileStructured?.sections
|
|
84212
|
-
});
|
|
84213
84260
|
if (profileValue) {
|
|
84214
84261
|
this.profileItemLookupService.setProfile(profileValue);
|
|
84215
84262
|
}
|
|
@@ -85281,10 +85328,6 @@ class LineChartComponent {
|
|
|
85281
85328
|
});
|
|
85282
85329
|
}
|
|
85283
85330
|
ngOnInit() {
|
|
85284
|
-
const chartData = this.chart().lineChartData;
|
|
85285
|
-
if (!chartData) {
|
|
85286
|
-
console.error('LineChartComponent: chart input with lineChartData is required');
|
|
85287
|
-
}
|
|
85288
85331
|
}
|
|
85289
85332
|
/**
|
|
85290
85333
|
* Generate a hash of the chart data to detect actual changes
|
|
@@ -85706,10 +85749,10 @@ class LineChartComponent {
|
|
|
85706
85749
|
}
|
|
85707
85750
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LineChartComponent, [{
|
|
85708
85751
|
type: Component,
|
|
85709
|
-
args: [{ selector: 'symphiq-line-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
85710
|
-
<div class="chart-container" [class.mini-mode]="!showAxisLabels()">
|
|
85711
|
-
<div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
|
|
85712
|
-
</div>
|
|
85752
|
+
args: [{ selector: 'symphiq-line-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
85753
|
+
<div class="chart-container" [class.mini-mode]="!showAxisLabels()">
|
|
85754
|
+
<div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
|
|
85755
|
+
</div>
|
|
85713
85756
|
`, styles: [".chart-container{width:100%;padding:1rem}.chart-container.mini-mode{padding:.25rem}\n"] }]
|
|
85714
85757
|
}], () => [], { chart: [{ type: i0.Input, args: [{ isSignal: true, alias: "chart", required: false }] }], showAxisLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAxisLabels", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], currencySymbol: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencySymbol", required: false }] }], chartDiv: [{
|
|
85715
85758
|
type: ViewChild,
|
|
@@ -86380,10 +86423,6 @@ class PieChartComponent {
|
|
|
86380
86423
|
});
|
|
86381
86424
|
}
|
|
86382
86425
|
ngOnInit() {
|
|
86383
|
-
const chartData = this.chart().pieChartData;
|
|
86384
|
-
if (!chartData) {
|
|
86385
|
-
console.error('PieChartComponent: chart input with pieChartData is required');
|
|
86386
|
-
}
|
|
86387
86426
|
}
|
|
86388
86427
|
/**
|
|
86389
86428
|
* Generate a hash of the chart data to detect actual changes
|
|
@@ -86497,17 +86536,13 @@ class PieChartComponent {
|
|
|
86497
86536
|
}
|
|
86498
86537
|
createChart() {
|
|
86499
86538
|
const chartData = this.chart().pieChartData;
|
|
86500
|
-
// Debug logging
|
|
86501
86539
|
if (!chartData || Object.keys(chartData).length === 0) {
|
|
86502
|
-
console.warn('PieChartComponent: No data provided');
|
|
86503
86540
|
return;
|
|
86504
86541
|
}
|
|
86505
86542
|
if (!this.chartDiv) {
|
|
86506
|
-
console.error('PieChartComponent: chartDiv reference not found');
|
|
86507
86543
|
return;
|
|
86508
86544
|
}
|
|
86509
86545
|
if (!chartData.series || chartData.series.length === 0) {
|
|
86510
|
-
console.warn('PieChartComponent: No series data', { chartData });
|
|
86511
86546
|
return;
|
|
86512
86547
|
}
|
|
86513
86548
|
this.root = Root.new(this.chartDiv.nativeElement);
|
|
@@ -86643,10 +86678,10 @@ class PieChartComponent {
|
|
|
86643
86678
|
}
|
|
86644
86679
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(PieChartComponent, [{
|
|
86645
86680
|
type: Component,
|
|
86646
|
-
args: [{ selector: 'symphiq-pie-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
86647
|
-
<div class="chart-container" [class.mini-mode]="!showAxisLabels()">
|
|
86648
|
-
<div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
|
|
86649
|
-
</div>
|
|
86681
|
+
args: [{ selector: 'symphiq-pie-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
86682
|
+
<div class="chart-container" [class.mini-mode]="!showAxisLabels()">
|
|
86683
|
+
<div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
|
|
86684
|
+
</div>
|
|
86650
86685
|
`, styles: [".chart-container{width:100%;padding:1rem}.chart-container.mini-mode{padding:.25rem}\n"] }]
|
|
86651
86686
|
}], () => [], { chart: [{ type: i0.Input, args: [{ isSignal: true, alias: "chart", required: false }] }], showAxisLabels: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAxisLabels", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], currencySymbol: [{ type: i0.Input, args: [{ isSignal: true, alias: "currencySymbol", required: false }] }], chartDiv: [{
|
|
86652
86687
|
type: ViewChild,
|
|
@@ -108806,5 +108841,5 @@ const PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS = ({
|
|
|
108806
108841
|
* Generated bundle index. Do not edit.
|
|
108807
108842
|
*/
|
|
108808
108843
|
|
|
108809
|
-
export { AreaChartComponent, BUSINESS_PROFILE, BarChartComponent, BreakdownSectionComponent, BusinessAnalysisModalComponent, BusinessProfileSearchService, ChartCardComponent, ChartContainerComponent, ChartThemeService, CircularProgressComponent, CompetitivePositioningSummaryComponent, CompetitorAnalysisCardComponent, ConfettiService, ConfidenceLevelCardComponent, ContentGenerationProgressComponent, ContentGenerationProgressWithConfettiComponent, CrossDashboardRelationshipsService, FUNNEL_ANALYSIS, FloatingBackButtonComponent, FloatingTocComponent, FocusAreaDetailCardComponent, FocusAreaExecutiveSummaryComponent, FocusAreaQuestionComponent, FocusAreaToolsModalComponent, FunnelOrderService, GradeBadgeComponent, HeaderScrollService, HierarchyDisplayComponent, HorizontalBarComponent, IconService, IndeterminateSpinnerComponent, InsightCardComponent, JourneyProgressIndicatorComponent, JourneyStepIdEnum, LineChartComponent, MetricCardComponent, MetricExecutiveSummaryComponent, MetricFormatterService, MetricListItemComponent, MetricWelcomeBannerComponent, MobileBottomNavComponent, MobileFABComponent, ModalComponent, ModalService, NapkinVisualPlaceholderComponent, NavigationStateService, OpportunityHighlightBannerComponent, OverallAssessmentComponent, PROFILE_ANALYSIS_FOCUS_AREA_AFFILIATE, PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS, PROFILE_ANALYSIS_SHOP, PieChartComponent, ProfileItemCardComponent, ProfileSectionComponent, ProfileSubsectionComponent, RelatedContentSidebarComponent, RevenueCalculatorWelcomeBannerComponent, ScrollDepthService, ScrollProgressBarComponent, SearchButtonComponent, SearchModalComponent, SectionDividerComponent, SectionNavigationComponent, ShadowElevationDirective, ShopPlatformEnum, ShopWelcomeBannerComponent, SkeletonBarComponent, SkeletonCardBaseComponent, SkeletonCircleComponent, SkeletonCompetitorCardComponent, SkeletonCustomerSegmentCardComponent, SkeletonFocusAreaCardComponent, SkeletonGenericCardComponent, SkeletonLoaderComponent, SkeletonPriceTierCardComponent, SkeletonProductCategoryCardComponent, SkeletonRegionCardComponent, SkeletonSeasonCardComponent, SymphiqBusinessAnalysisDashboardComponent, SymphiqConnectGaDashboardComponent, SymphiqCreateAccountDashboardComponent, SymphiqFunnelAnalysisDashboardComponent, SymphiqFunnelAnalysisPreviewComponent, SymphiqIconComponent, SymphiqProfileAnalysisDashboardComponent, SymphiqRevenueCalculatorDashboardComponent, SymphiqWelcomeDashboardComponent, TooltipContainerComponent, TooltipDataService, TooltipDirective, TooltipService, ViewModeService, ViewportAnimationDirective, VisualizationContainerComponent, getBadgeLabelClasses, getButtonClasses, getCategoryBadgeClasses, getCategoryColor, getCompetitiveBadgeClasses, getContainerClasses, getFooterClasses, getGradeBadgeClasses, getHeaderClasses, getInsightsBadgeClasses, getInsightsCardClasses, getMetricLabelClasses, getMetricMiniCardClasses, getMetricValueClasses, getNarrativeTextClasses, getRevenueCardClasses, getRevenueIconClasses, getStatusBadgeClasses, getStatusDotClasses, getStatusIconClasses, getStatusSummaryClasses, getSubtitleClasses, getTitleClasses, getTrendClasses, getTrendIconClasses, getTrendValueClasses, isLightMode };
|
|
108844
|
+
export { AreaChartComponent, BUSINESS_PROFILE, BarChartComponent, BreakdownSectionComponent, BusinessAnalysisModalComponent, BusinessProfileSearchService, ChartCardComponent, ChartContainerComponent, ChartThemeService, CircularProgressComponent, CompetitivePositioningSummaryComponent, CompetitorAnalysisCardComponent, ConfettiService, ConfidenceLevelCardComponent, ContentGenerationProgressComponent, ContentGenerationProgressWithConfettiComponent, CrossDashboardRelationshipsService, FUNNEL_ANALYSIS, FloatingBackButtonComponent, FloatingTocComponent, FocusAreaDetailCardComponent, FocusAreaExecutiveSummaryComponent, FocusAreaQuestionComponent, FocusAreaToolsModalComponent, FunnelOrderService, GradeBadgeComponent, HeaderScrollService, HierarchyDisplayComponent, HorizontalBarComponent, IconService, IndeterminateSpinnerComponent, InsightCardComponent, JourneyProgressIndicatorComponent, JourneyStepIdEnum, LineChartComponent, MetricCardComponent, MetricExecutiveSummaryComponent, MetricFormatterService, MetricListItemComponent, MetricWelcomeBannerComponent, MobileBottomNavComponent, MobileFABComponent, ModalComponent, ModalService, NapkinVisualPlaceholderComponent, NavigationStateService, OpportunityHighlightBannerComponent, OverallAssessmentComponent, PROFILE_ANALYSIS_FOCUS_AREA_AFFILIATE, PROFILE_ANALYSIS_METRIC_SCREEN_PAGE_VIEWS, PROFILE_ANALYSIS_SHOP, PieChartComponent, ProfileItemCardComponent, ProfileSectionComponent, ProfileSubsectionComponent, RelatedContentSidebarComponent, RevenueCalculatorService, RevenueCalculatorWelcomeBannerComponent, ScrollDepthService, ScrollProgressBarComponent, SearchButtonComponent, SearchModalComponent, SectionDividerComponent, SectionNavigationComponent, ShadowElevationDirective, ShopPlatformEnum, ShopWelcomeBannerComponent, SkeletonBarComponent, SkeletonCardBaseComponent, SkeletonCircleComponent, SkeletonCompetitorCardComponent, SkeletonCustomerSegmentCardComponent, SkeletonFocusAreaCardComponent, SkeletonGenericCardComponent, SkeletonLoaderComponent, SkeletonPriceTierCardComponent, SkeletonProductCategoryCardComponent, SkeletonRegionCardComponent, SkeletonSeasonCardComponent, SymphiqBusinessAnalysisDashboardComponent, SymphiqConnectGaDashboardComponent, SymphiqCreateAccountDashboardComponent, SymphiqFunnelAnalysisDashboardComponent, SymphiqFunnelAnalysisPreviewComponent, SymphiqIconComponent, SymphiqProfileAnalysisDashboardComponent, SymphiqRevenueCalculatorDashboardComponent, SymphiqWelcomeDashboardComponent, TooltipContainerComponent, TooltipDataService, TooltipDirective, TooltipService, ViewModeService, ViewportAnimationDirective, VisualizationContainerComponent, calculateFunnelRatios, calculateMetricTargetsFromRevenue, calculateMetricTargetsFromRevenueReverse, calculateRelatedMetricRatios, generateTargetsFromCalculations, getBadgeLabelClasses, getButtonClasses, getCategoryBadgeClasses, getCategoryColor, getCompetitiveBadgeClasses, getContainerClasses, getFooterClasses, getFunnelStageMetrics, getGradeBadgeClasses, getHeaderClasses, getInsightsBadgeClasses, getInsightsCardClasses, getMetricLabelClasses, getMetricMiniCardClasses, getMetricValueClasses, getNarrativeTextClasses, getRevenueCardClasses, getRevenueIconClasses, getStatusBadgeClasses, getStatusDotClasses, getStatusIconClasses, getStatusSummaryClasses, getSubtitleClasses, getTitleClasses, getTrendClasses, getTrendIconClasses, getTrendValueClasses, groupMetricsByFunnelStage, isLightMode, validateRevenueTarget };
|
|
108810
108845
|
//# sourceMappingURL=symphiq-components.mjs.map
|