@eric-emg/symphiq-components 1.2.242 → 1.2.243
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 +354 -320
- package/fesm2022/symphiq-components.mjs.map +1 -1
- package/index.d.ts +63 -61
- package/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -32218,7 +32218,7 @@ class ShadowElevationDirective {
|
|
|
32218
32218
|
selector: '[symphiqShadowElevation]',
|
|
32219
32219
|
standalone: true
|
|
32220
32220
|
}]
|
|
32221
|
-
}], () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: ScrollDepthService }, { type:
|
|
32221
|
+
}], () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: ScrollDepthService }, { type: undefined, decorators: [{
|
|
32222
32222
|
type: Inject,
|
|
32223
32223
|
args: [PLATFORM_ID]
|
|
32224
32224
|
}] }], { scrollContainer: [{
|
|
@@ -47226,7 +47226,7 @@ class SymphiqFunnelAnalysisDashboardComponent {
|
|
|
47226
47226
|
// Get the scrollable element once for all features
|
|
47227
47227
|
// Priority 1: Use the scrollElement passed directly from parent (preferred method)
|
|
47228
47228
|
// Priority 2: Fall back to querying by scrollContainerId (legacy method)
|
|
47229
|
-
|
|
47229
|
+
const scrollElement = this.scrollElement() || null;
|
|
47230
47230
|
let elementSource = 'none';
|
|
47231
47231
|
if (scrollElement) {
|
|
47232
47232
|
elementSource = 'passed-from-parent';
|
|
@@ -57157,9 +57157,7 @@ function MetricReportModalComponent_Conditional_0_Conditional_55_For_15_Template
|
|
|
57157
57157
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(metric_r4.targetValue, metric_r4.metric, false), " ");
|
|
57158
57158
|
i0.ɵɵadvance(4);
|
|
57159
57159
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatPercentage(ctx_r1.Math.abs(metric_r4.percentageIncrease), 1), " ");
|
|
57160
|
-
i0.ɵɵadvance();
|
|
57161
|
-
i0.ɵɵproperty("ngClass", metric_r4.percentageIncrease >= 0 ? "text-emerald-500" : "text-red-500");
|
|
57162
|
-
i0.ɵɵadvance();
|
|
57160
|
+
i0.ɵɵadvance(2);
|
|
57163
57161
|
i0.ɵɵattribute("d", metric_r4.percentageIncrease >= 0 ? "M5 10l7-7m0 0l7 7m-7-7v18" : "M19 14l-7 7m0 0l-7-7m7 7V3");
|
|
57164
57162
|
} }
|
|
57165
57163
|
function MetricReportModalComponent_Conditional_0_Conditional_55_Template(rf, ctx) { if (rf & 1) {
|
|
@@ -57173,10 +57171,10 @@ function MetricReportModalComponent_Conditional_0_Conditional_55_Template(rf, ct
|
|
|
57173
57171
|
i0.ɵɵtext(10, "Target");
|
|
57174
57172
|
i0.ɵɵelementEnd();
|
|
57175
57173
|
i0.ɵɵelementStart(11, "th", 43);
|
|
57176
|
-
i0.ɵɵtext(12, "
|
|
57174
|
+
i0.ɵɵtext(12, "Improve by");
|
|
57177
57175
|
i0.ɵɵelementEnd()()();
|
|
57178
57176
|
i0.ɵɵelementStart(13, "tbody");
|
|
57179
|
-
i0.ɵɵrepeaterCreate(14, MetricReportModalComponent_Conditional_0_Conditional_55_For_15_Template, 15,
|
|
57177
|
+
i0.ɵɵrepeaterCreate(14, MetricReportModalComponent_Conditional_0_Conditional_55_For_15_Template, 15, 7, "tr", 44, _forTrack0$i);
|
|
57180
57178
|
i0.ɵɵelementEnd()()()();
|
|
57181
57179
|
} if (rf & 2) {
|
|
57182
57180
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
@@ -57322,7 +57320,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57322
57320
|
i0.ɵɵadvance(4);
|
|
57323
57321
|
i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
|
|
57324
57322
|
i0.ɵɵadvance();
|
|
57325
|
-
i0.ɵɵtextInterpolate1(" Year to Date (", ctx_r1.
|
|
57323
|
+
i0.ɵɵtextInterpolate1(" Year to Date (", ctx_r1.ytdDateRangeWithYear(), ") ");
|
|
57326
57324
|
i0.ɵɵadvance();
|
|
57327
57325
|
i0.ɵɵproperty("ngClass", ctx_r1.valueClasses());
|
|
57328
57326
|
i0.ɵɵadvance();
|
|
@@ -57332,7 +57330,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57332
57330
|
i0.ɵɵadvance(2);
|
|
57333
57331
|
i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
|
|
57334
57332
|
i0.ɵɵadvance();
|
|
57335
|
-
i0.ɵɵ
|
|
57333
|
+
i0.ɵɵtextInterpolate1(" Same Period Last Year (", ctx_r1.priorYearDateRange(), ") ");
|
|
57336
57334
|
i0.ɵɵadvance();
|
|
57337
57335
|
i0.ɵɵproperty("ngClass", ctx_r1.valueClasses());
|
|
57338
57336
|
i0.ɵɵadvance();
|
|
@@ -57414,10 +57412,28 @@ class MetricReportModalComponent {
|
|
|
57414
57412
|
return calculateMetricPacing(projectedValue, metric.targetValue, increaseBad);
|
|
57415
57413
|
}, ...(ngDevMode ? [{ debugName: "pacingInfo" }] : []));
|
|
57416
57414
|
this.ytdValue = computed(() => {
|
|
57417
|
-
|
|
57415
|
+
const pacingResponse = this.pacingMetrics();
|
|
57416
|
+
const metric = this.metricData();
|
|
57417
|
+
if (!pacingResponse || !metric)
|
|
57418
|
+
return 0;
|
|
57419
|
+
const resp = pacingResponse;
|
|
57420
|
+
const soFarMetric = resp.soFarMetricValues?.find((m) => m.metric === metric.metric);
|
|
57421
|
+
if (soFarMetric?.value) {
|
|
57422
|
+
return parseFloat(soFarMetric.value);
|
|
57423
|
+
}
|
|
57424
|
+
return 0;
|
|
57418
57425
|
}, ...(ngDevMode ? [{ debugName: "ytdValue" }] : []));
|
|
57419
57426
|
this.samePeriodLastYearValue = computed(() => {
|
|
57420
|
-
|
|
57427
|
+
const pacingResponse = this.pacingMetrics();
|
|
57428
|
+
const metric = this.metricData();
|
|
57429
|
+
if (!pacingResponse || !metric)
|
|
57430
|
+
return 0;
|
|
57431
|
+
const resp = pacingResponse;
|
|
57432
|
+
const lastYearMetric = resp.lastYearMetricValuesMonthly?.find((m) => m.metric === metric.metric);
|
|
57433
|
+
if (lastYearMetric?.value) {
|
|
57434
|
+
return parseFloat(lastYearMetric.value);
|
|
57435
|
+
}
|
|
57436
|
+
return 0;
|
|
57421
57437
|
}, ...(ngDevMode ? [{ debugName: "samePeriodLastYearValue" }] : []));
|
|
57422
57438
|
this.ytdChangePercentage = computed(() => {
|
|
57423
57439
|
const current = this.ytdValue();
|
|
@@ -57428,10 +57444,28 @@ class MetricReportModalComponent {
|
|
|
57428
57444
|
}, ...(ngDevMode ? [{ debugName: "ytdChangePercentage" }] : []));
|
|
57429
57445
|
this.ytdDateRange = computed(() => {
|
|
57430
57446
|
const now = new Date();
|
|
57431
|
-
const
|
|
57432
|
-
|
|
57433
|
-
|
|
57447
|
+
const yesterday = new Date(now);
|
|
57448
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
57449
|
+
const startMonth = 'Jan';
|
|
57450
|
+
const startDay = 1;
|
|
57451
|
+
const endMonth = yesterday.toLocaleDateString('en-US', { month: 'short' });
|
|
57452
|
+
const endDay = yesterday.getDate();
|
|
57453
|
+
return `${startMonth} ${startDay} - ${endMonth} ${endDay}`;
|
|
57434
57454
|
}, ...(ngDevMode ? [{ debugName: "ytdDateRange" }] : []));
|
|
57455
|
+
this.ytdDateRangeWithYear = computed(() => {
|
|
57456
|
+
const now = new Date();
|
|
57457
|
+
const yesterday = new Date(now);
|
|
57458
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
57459
|
+
const year = this.currentYear();
|
|
57460
|
+
return `Jan 1, ${year} - ${yesterday.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}, ${year}`;
|
|
57461
|
+
}, ...(ngDevMode ? [{ debugName: "ytdDateRangeWithYear" }] : []));
|
|
57462
|
+
this.priorYearDateRange = computed(() => {
|
|
57463
|
+
const now = new Date();
|
|
57464
|
+
const yesterday = new Date(now);
|
|
57465
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
57466
|
+
const priorYear = this.priorYear();
|
|
57467
|
+
return `Jan 1, ${priorYear} - ${yesterday.toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}, ${priorYear}`;
|
|
57468
|
+
}, ...(ngDevMode ? [{ debugName: "priorYearDateRange" }] : []));
|
|
57435
57469
|
this.gapAnalysisText = computed(() => {
|
|
57436
57470
|
const pacing = this.pacingInfo();
|
|
57437
57471
|
const metric = this.metricData();
|
|
@@ -57674,8 +57708,8 @@ class MetricReportModalComponent {
|
|
|
57674
57708
|
: 'bg-slate-700 hover:bg-slate-600 text-white';
|
|
57675
57709
|
}
|
|
57676
57710
|
static { this.ɵfac = function MetricReportModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MetricReportModalComponent)(); }; }
|
|
57677
|
-
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MetricReportModalComponent, selectors: [["symphiq-metric-report-modal"]], inputs: { viewMode: [1, "viewMode"], metricEnum: [1, "metricEnum"], metricData: [1, "metricData"], contributingMetrics: [1, "contributingMetrics"], pacingMetrics: [1, "pacingMetrics"], isOpen: [1, "isOpen"] }, outputs: { closed: "closed" }, decls: 1, vars: 1, consts: [[1, "fixed", "inset-0", "overflow-y-auto", "z-50"], [1, "fixed", "inset-0", "overflow-y-auto", "z-50", 3, "click"], [1, "flex", "items-center", "justify-center", "min-h-screen", "px-4", "pt-4", "pb-20", "text-center", "sm:block", "sm:p-0"], ["aria-hidden", "true", 1, "fixed", "inset-0", "backdrop-blur-md", 3, "ngClass"], ["aria-hidden", "true", 1, "hidden", "sm:inline-block", "sm:align-middle", "sm:h-screen"], [1, "relative", "inline-block", "align-bottom", "rounded-2xl", "text-left", "overflow-hidden", "shadow-xl", "sm:my-8", "sm:align-middle", "sm:w-full", "sm:max-w-4xl", "border", "backdrop-blur-xl", 3, "click", "ngClass"], [1, "px-6", "py-5", "border-b", "backdrop-blur-sm", "sticky", "top-0", "z-10", 3, "ngClass"], [1, "flex", "items-start", "justify-between"], [1, "flex-1"], [1, "text-xl", "font-bold", "mb-2", 3, "ngClass"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "text-sm", "font-medium", "transition-colors", 3, "ngClass"], [1, "mt-3", "p-4", "rounded-lg", "border", "text-sm", "leading-relaxed", 3, "ngClass"], [1, "ml-4", "transition-all", "rounded-lg", "p-1", "hover:scale-110", "active:scale-90", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M6 18L18 6M6 6l12 12"], [1, "px-6", "py-6", "max-h-[70vh]", "overflow-y-auto", "backdrop-blur-sm", 3, "ngClass"], [1, "rounded-xl", "p-6", "mb-6", 3, "ngClass"], [1, "text-sm", "font-semibold", "uppercase", "tracking-wider", "mb-4", 3, "ngClass"], [1, "grid", "grid-cols-1", "sm:grid-cols-2", "lg:grid-cols-3", "gap-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-3xl", "font-extrabold", "mb-3", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], [1, "rounded-xl", "p-6", 3, "ngClass"], [1, "px-6", "py-4", "border-t", 3, "ngClass"], [1, "w-full", "px-4", "py-2", "rounded-lg", "transition-all", "font-medium", "hover:scale-[1.02]", "active:scale-[0.98]", 3, "click", "ngClass"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "text-sm", "font-medium", "transition-colors", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact", "showEmphasizedPercentage"], [1, "space-y-2"], [1, "flex", "justify-between", "text-xs", 3, "ngClass"], [1, "h-3", "rounded-full", "overflow-hidden", 3, "ngClass"], [1, "h-full", "transition-all", "duration-500", 3, "ngClass"], [1, "overflow-x-auto"], [1, "w-full"], [1, "border-b", 3, "ngClass"], [1, "text-left", "py-3", "px-4", "text-xs", "font-semibold", "uppercase", "tracking-wider"], [1, "text-right", "py-3", "px-4", "text-xs", "font-semibold", "uppercase", "tracking-wider"], [1, "border-b", "transition-colors", 3, "ngClass"], [1, "py-3", "px-4"], [1, "flex", "items-center", "gap-2"], [1, "text-sm", "font-medium"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-5", "h-5", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "py-3", "px-4", "text-right"], [1, "text-sm", "font-semibold", 3, "ngClass"], [1, "flex", "items-center", "justify-end", "gap-2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4",
|
|
57678
|
-
i0.ɵɵconditionalCreate(0, MetricReportModalComponent_Conditional_0_Template, 60,
|
|
57711
|
+
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MetricReportModalComponent, selectors: [["symphiq-metric-report-modal"]], inputs: { viewMode: [1, "viewMode"], metricEnum: [1, "metricEnum"], metricData: [1, "metricData"], contributingMetrics: [1, "contributingMetrics"], pacingMetrics: [1, "pacingMetrics"], isOpen: [1, "isOpen"] }, outputs: { closed: "closed" }, decls: 1, vars: 1, consts: [[1, "fixed", "inset-0", "overflow-y-auto", "z-50"], [1, "fixed", "inset-0", "overflow-y-auto", "z-50", 3, "click"], [1, "flex", "items-center", "justify-center", "min-h-screen", "px-4", "pt-4", "pb-20", "text-center", "sm:block", "sm:p-0"], ["aria-hidden", "true", 1, "fixed", "inset-0", "backdrop-blur-md", 3, "ngClass"], ["aria-hidden", "true", 1, "hidden", "sm:inline-block", "sm:align-middle", "sm:h-screen"], [1, "relative", "inline-block", "align-bottom", "rounded-2xl", "text-left", "overflow-hidden", "shadow-xl", "sm:my-8", "sm:align-middle", "sm:w-full", "sm:max-w-4xl", "border", "backdrop-blur-xl", 3, "click", "ngClass"], [1, "px-6", "py-5", "border-b", "backdrop-blur-sm", "sticky", "top-0", "z-10", 3, "ngClass"], [1, "flex", "items-start", "justify-between"], [1, "flex-1"], [1, "text-xl", "font-bold", "mb-2", 3, "ngClass"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "text-sm", "font-medium", "transition-colors", 3, "ngClass"], [1, "mt-3", "p-4", "rounded-lg", "border", "text-sm", "leading-relaxed", 3, "ngClass"], [1, "ml-4", "transition-all", "rounded-lg", "p-1", "hover:scale-110", "active:scale-90", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M6 18L18 6M6 6l12 12"], [1, "px-6", "py-6", "max-h-[70vh]", "overflow-y-auto", "backdrop-blur-sm", 3, "ngClass"], [1, "rounded-xl", "p-6", "mb-6", 3, "ngClass"], [1, "text-sm", "font-semibold", "uppercase", "tracking-wider", "mb-4", 3, "ngClass"], [1, "grid", "grid-cols-1", "sm:grid-cols-2", "lg:grid-cols-3", "gap-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "mb-4"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-2", 3, "ngClass"], [1, "text-3xl", "font-extrabold", "mb-3", 3, "ngClass"], [1, "text-sm", "leading-relaxed", 3, "ngClass"], [1, "rounded-xl", "p-6", 3, "ngClass"], [1, "px-6", "py-4", "border-t", 3, "ngClass"], [1, "w-full", "px-4", "py-2", "rounded-lg", "transition-all", "font-medium", "hover:scale-[1.02]", "active:scale-[0.98]", 3, "click", "ngClass"], ["type", "button", 1, "inline-flex", "items-center", "gap-2", "text-sm", "font-medium", "transition-colors", 3, "click", "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "transition-transform"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact", "showEmphasizedPercentage"], [1, "space-y-2"], [1, "flex", "justify-between", "text-xs", 3, "ngClass"], [1, "h-3", "rounded-full", "overflow-hidden", 3, "ngClass"], [1, "h-full", "transition-all", "duration-500", 3, "ngClass"], [1, "overflow-x-auto"], [1, "w-full"], [1, "border-b", 3, "ngClass"], [1, "text-left", "py-3", "px-4", "text-xs", "font-semibold", "uppercase", "tracking-wider"], [1, "text-right", "py-3", "px-4", "text-xs", "font-semibold", "uppercase", "tracking-wider"], [1, "border-b", "transition-colors", 3, "ngClass"], [1, "py-3", "px-4"], [1, "flex", "items-center", "gap-2"], [1, "text-sm", "font-medium"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "right", 1, "flex-shrink-0", "w-5", "h-5", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "ngClass", "libSymphiqTooltip"], [1, "py-3", "px-4", "text-right"], [1, "text-sm", "font-semibold", 3, "ngClass"], [1, "flex", "items-center", "justify-end", "gap-2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", "text-emerald-500"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3", "h-3"], [1, "min-h-[400px]"], [3, "chart", "showAxisLabels", "viewMode", "currencySymbol"], [1, "text-sm", "leading-relaxed", "mt-4", 3, "ngClass"]], template: function MetricReportModalComponent_Template(rf, ctx) { if (rf & 1) {
|
|
57712
|
+
i0.ɵɵconditionalCreate(0, MetricReportModalComponent_Conditional_0_Template, 60, 46, "div", 0);
|
|
57679
57713
|
} if (rf & 2) {
|
|
57680
57714
|
i0.ɵɵconditional(ctx.isOpen() ? 0 : -1);
|
|
57681
57715
|
} }, dependencies: [CommonModule, i1$1.NgClass, PacingStatusBadgeComponent,
|
|
@@ -57725,312 +57759,311 @@ class MetricReportModalComponent {
|
|
|
57725
57759
|
])
|
|
57726
57760
|
])
|
|
57727
57761
|
],
|
|
57728
|
-
template: `
|
|
57729
|
-
@if (isOpen()) {
|
|
57730
|
-
<div class="fixed inset-0 overflow-y-auto z-50" (click)="close()">
|
|
57731
|
-
<div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0">
|
|
57732
|
-
<div
|
|
57733
|
-
[ngClass]="backdropClasses()"
|
|
57734
|
-
class="fixed inset-0 backdrop-blur-md"
|
|
57735
|
-
aria-hidden="true"
|
|
57736
|
-
@fadeIn>
|
|
57737
|
-
</div>
|
|
57738
|
-
|
|
57739
|
-
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">​</span>
|
|
57740
|
-
|
|
57741
|
-
<div
|
|
57742
|
-
(click)="$event.stopPropagation()"
|
|
57743
|
-
[ngClass]="modalContainerClasses()"
|
|
57744
|
-
class="relative inline-block align-bottom rounded-2xl text-left overflow-hidden shadow-xl sm:my-8 sm:align-middle sm:w-full sm:max-w-4xl border backdrop-blur-xl"
|
|
57745
|
-
@slideUpFade>
|
|
57746
|
-
|
|
57747
|
-
<!-- Header -->
|
|
57748
|
-
<div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
|
|
57749
|
-
<div class="flex items-start justify-between">
|
|
57750
|
-
<div class="flex-1">
|
|
57751
|
-
<h3 [ngClass]="titleClasses()" class="text-xl font-bold mb-2">
|
|
57752
|
-
{{ metricTitle() }}
|
|
57753
|
-
</h3>
|
|
57754
|
-
@if (metricData()?.description) {
|
|
57755
|
-
<button
|
|
57756
|
-
type="button"
|
|
57757
|
-
(click)="toggleDefinition()"
|
|
57758
|
-
[ngClass]="definitionToggleClasses()"
|
|
57759
|
-
class="inline-flex items-center gap-2 text-sm font-medium transition-colors">
|
|
57760
|
-
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
57761
|
-
<path 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" />
|
|
57762
|
-
</svg>
|
|
57763
|
-
<span>What is {{ metricTitle() }}?</span>
|
|
57764
|
-
<svg
|
|
57765
|
-
[class.rotate-180]="showDefinition()"
|
|
57766
|
-
class="w-4 h-4 transition-transform"
|
|
57767
|
-
fill="none"
|
|
57768
|
-
stroke="currentColor"
|
|
57769
|
-
viewBox="0 0 24 24">
|
|
57770
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
57771
|
-
</svg>
|
|
57772
|
-
</button>
|
|
57773
|
-
}
|
|
57774
|
-
@if (showDefinition() && metricData()?.description) {
|
|
57775
|
-
<div [ngClass]="definitionBoxClasses()" class="mt-3 p-4 rounded-lg border text-sm leading-relaxed">
|
|
57776
|
-
{{ metricData()?.description }}
|
|
57777
|
-
</div>
|
|
57778
|
-
}
|
|
57779
|
-
</div>
|
|
57780
|
-
<button
|
|
57781
|
-
(click)="close()"
|
|
57782
|
-
[ngClass]="closeButtonClasses()"
|
|
57783
|
-
class="ml-4 transition-all rounded-lg p-1 hover:scale-110 active:scale-90">
|
|
57784
|
-
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
57785
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
|
57786
|
-
</svg>
|
|
57787
|
-
</button>
|
|
57788
|
-
</div>
|
|
57789
|
-
</div>
|
|
57790
|
-
|
|
57791
|
-
<!-- Content -->
|
|
57792
|
-
<div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
|
|
57793
|
-
<symphiq-tooltip-container />
|
|
57794
|
-
|
|
57795
|
-
<!-- At a Glance Summary -->
|
|
57796
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
57797
|
-
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
57798
|
-
At a Glance
|
|
57799
|
-
</h4>
|
|
57800
|
-
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
57801
|
-
<!-- YTD Value -->
|
|
57802
|
-
<div>
|
|
57803
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57804
|
-
Year to Date ({{
|
|
57805
|
-
</p>
|
|
57806
|
-
<p [ngClass]="valueClasses()" class="text-xl font-bold mb-2">
|
|
57807
|
-
{{ formatMetricValue(ytdValue(), metricData()?.metric || '') }}
|
|
57808
|
-
</p>
|
|
57809
|
-
@if (ytdChangePercentage() !== null) {
|
|
57810
|
-
<symphiq-target-change-badge
|
|
57811
|
-
[viewMode]="viewMode()"
|
|
57812
|
-
[percentageChange]="ytdChangePercentage()!"
|
|
57813
|
-
[metric]="metricData()?.metric || ''"
|
|
57814
|
-
[priorYear]="priorYear()"
|
|
57815
|
-
[isCompact]="true"
|
|
57816
|
-
/>
|
|
57817
|
-
}
|
|
57818
|
-
</div>
|
|
57819
|
-
|
|
57820
|
-
<!-- Same Period Last Year -->
|
|
57821
|
-
<div>
|
|
57822
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57823
|
-
Same Period
|
|
57824
|
-
</p>
|
|
57825
|
-
<p [ngClass]="valueClasses()" class="text-xl font-bold">
|
|
57826
|
-
{{ formatMetricValue(samePeriodLastYearValue(), metricData()?.metric || '') }}
|
|
57827
|
-
</p>
|
|
57828
|
-
</div>
|
|
57829
|
-
|
|
57830
|
-
<!-- Full Last Year -->
|
|
57831
|
-
<div>
|
|
57832
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57833
|
-
Full {{ priorYear() }} Actual
|
|
57834
|
-
</p>
|
|
57835
|
-
<p [ngClass]="valueClasses()" class="text-xl font-bold">
|
|
57836
|
-
{{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}
|
|
57837
|
-
</p>
|
|
57838
|
-
</div>
|
|
57839
|
-
|
|
57840
|
-
<!-- Current Pace -->
|
|
57841
|
-
@if (pacingInfo()) {
|
|
57842
|
-
<div>
|
|
57843
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57844
|
-
Pace for {{ currentYear() }}
|
|
57845
|
-
</p>
|
|
57846
|
-
<p [ngClass]="projectedValueClasses()" class="text-xl font-bold mb-2">
|
|
57847
|
-
{{ formatMetricValue(pacingInfo()!.projectedValue, metricData()?.metric || '', false) }}
|
|
57848
|
-
</p>
|
|
57849
|
-
<symphiq-pacing-status-badge
|
|
57850
|
-
[viewMode]="viewMode()"
|
|
57851
|
-
[pacingPercentage]="pacingInfo()!.pacingPercentage"
|
|
57852
|
-
[status]="pacingInfo()!.status"
|
|
57853
|
-
[showAsFullText]="false"
|
|
57854
|
-
[isCompact]="true"
|
|
57855
|
-
[showEmphasizedPercentage]="true"
|
|
57856
|
-
/>
|
|
57857
|
-
</div>
|
|
57858
|
-
}
|
|
57859
|
-
|
|
57860
|
-
<!-- Current Target -->
|
|
57861
|
-
<div>
|
|
57862
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57863
|
-
{{ currentYear() }} Target
|
|
57864
|
-
</p>
|
|
57865
|
-
<p [ngClass]="targetValueClasses()" class="text-xl font-bold">
|
|
57866
|
-
{{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
|
|
57867
|
-
</p>
|
|
57868
|
-
</div>
|
|
57869
|
-
</div>
|
|
57870
|
-
</div>
|
|
57871
|
-
|
|
57872
|
-
<!-- Target Analysis -->
|
|
57873
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
57874
|
-
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
57875
|
-
Target Analysis
|
|
57876
|
-
</h4>
|
|
57877
|
-
|
|
57878
|
-
<div class="mb-4">
|
|
57879
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
|
|
57880
|
-
Your Target
|
|
57881
|
-
</p>
|
|
57882
|
-
<p [ngClass]="targetValueClasses()" class="text-3xl font-extrabold mb-3">
|
|
57883
|
-
{{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
|
|
57884
|
-
</p>
|
|
57885
|
-
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
|
|
57886
|
-
Your target represents a {{ formatPercentage(Math.abs(metricData()?.percentageIncrease || 0), 1) }}
|
|
57887
|
-
{{ (metricData()?.percentageIncrease || 0) >= 0 ? 'increase' : 'decrease' }}
|
|
57888
|
-
from your {{ priorYear() }} actual of
|
|
57889
|
-
{{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}.
|
|
57890
|
-
</p>
|
|
57891
|
-
</div>
|
|
57892
|
-
|
|
57893
|
-
@if (pacingInfo()) {
|
|
57894
|
-
<div class="mb-4">
|
|
57895
|
-
<symphiq-pacing-status-badge
|
|
57896
|
-
[viewMode]="viewMode()"
|
|
57897
|
-
[pacingPercentage]="pacingInfo()!.pacingPercentage"
|
|
57898
|
-
[status]="pacingInfo()!.status"
|
|
57899
|
-
[showAsFullText]="true"
|
|
57900
|
-
[isCompact]="false"
|
|
57901
|
-
[showEmphasizedPercentage]="true"
|
|
57902
|
-
/>
|
|
57903
|
-
</div>
|
|
57904
|
-
|
|
57905
|
-
<div class="mb-4">
|
|
57906
|
-
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
|
|
57907
|
-
{{ gapAnalysisText() }}
|
|
57908
|
-
</p>
|
|
57909
|
-
</div>
|
|
57910
|
-
|
|
57911
|
-
<!-- Progress Bar -->
|
|
57912
|
-
<div class="space-y-2">
|
|
57913
|
-
<div class="flex justify-between text-xs" [ngClass]="labelClasses()">
|
|
57914
|
-
<span>Progress to Target</span>
|
|
57915
|
-
<span>{{ formatPercentage(progressToTarget(), 1) }}</span>
|
|
57916
|
-
</div>
|
|
57917
|
-
<div [ngClass]="progressBarBgClasses()" class="h-3 rounded-full overflow-hidden">
|
|
57918
|
-
<div
|
|
57919
|
-
[ngClass]="progressBarFillClasses()"
|
|
57920
|
-
[style.width.%]="Math.min(progressToTarget(), 100)"
|
|
57921
|
-
class="h-full transition-all duration-500">
|
|
57922
|
-
</div>
|
|
57923
|
-
</div>
|
|
57924
|
-
</div>
|
|
57925
|
-
}
|
|
57926
|
-
</div>
|
|
57927
|
-
|
|
57928
|
-
<!-- Contributing Metrics Table (only for funnel stage metrics) -->
|
|
57929
|
-
@if (contributingMetrics().length > 0) {
|
|
57930
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
57931
|
-
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
57932
|
-
Contributing Metrics
|
|
57933
|
-
</h4>
|
|
57934
|
-
<div class="overflow-x-auto">
|
|
57935
|
-
<table class="w-full">
|
|
57936
|
-
<thead>
|
|
57937
|
-
<tr [ngClass]="tableHeaderClasses()" class="border-b">
|
|
57938
|
-
<th class="text-left py-3 px-4 text-xs font-semibold uppercase tracking-wider">Metric</th>
|
|
57939
|
-
<th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Target</th>
|
|
57940
|
-
<th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">
|
|
57941
|
-
</tr>
|
|
57942
|
-
</thead>
|
|
57943
|
-
<tbody>
|
|
57944
|
-
@for (metric of contributingMetrics(); track metric.metric) {
|
|
57945
|
-
<tr [ngClass]="tableRowClasses()" class="border-b transition-colors">
|
|
57946
|
-
<td class="py-3 px-4">
|
|
57947
|
-
<div class="flex items-center gap-2">
|
|
57948
|
-
<span class="text-sm font-medium">{{ getMetricTitle(metric) }}</span>
|
|
57949
|
-
@if (metric.description) {
|
|
57950
|
-
<button
|
|
57951
|
-
type="button"
|
|
57952
|
-
[ngClass]="infoIconClasses()"
|
|
57953
|
-
class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
|
|
57954
|
-
[libSymphiqTooltip]="getMarkdownTooltipContent(metric.description, getMetricTitle(metric))"
|
|
57955
|
-
tooltipType="markdown"
|
|
57956
|
-
tooltipPosition="right">
|
|
57957
|
-
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
57958
|
-
<path 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" />
|
|
57959
|
-
</svg>
|
|
57960
|
-
</button>
|
|
57961
|
-
}
|
|
57962
|
-
</div>
|
|
57963
|
-
</td>
|
|
57964
|
-
<td class="py-3 px-4 text-right">
|
|
57965
|
-
<span [ngClass]="targetValueClasses()" class="text-sm font-semibold">
|
|
57966
|
-
{{ formatMetricValue(metric.targetValue, metric.metric, false) }}
|
|
57967
|
-
</span>
|
|
57968
|
-
</td>
|
|
57969
|
-
<td class="py-3 px-4 text-right">
|
|
57970
|
-
<div class="flex items-center justify-end gap-2">
|
|
57971
|
-
<span class="text-sm font-medium">
|
|
57972
|
-
{{ formatPercentage(Math.abs(metric.percentageIncrease), 1) }}
|
|
57973
|
-
</span>
|
|
57974
|
-
<svg
|
|
57975
|
-
|
|
57976
|
-
|
|
57977
|
-
|
|
57978
|
-
|
|
57979
|
-
|
|
57980
|
-
|
|
57981
|
-
stroke-
|
|
57982
|
-
stroke-
|
|
57983
|
-
|
|
57984
|
-
|
|
57985
|
-
|
|
57986
|
-
|
|
57987
|
-
|
|
57988
|
-
|
|
57989
|
-
|
|
57990
|
-
|
|
57991
|
-
|
|
57992
|
-
|
|
57993
|
-
|
|
57994
|
-
|
|
57995
|
-
|
|
57996
|
-
|
|
57997
|
-
|
|
57998
|
-
|
|
57999
|
-
|
|
58000
|
-
|
|
58001
|
-
|
|
58002
|
-
|
|
58003
|
-
|
|
58004
|
-
[
|
|
58005
|
-
[
|
|
58006
|
-
[
|
|
58007
|
-
|
|
58008
|
-
|
|
58009
|
-
|
|
58010
|
-
|
|
58011
|
-
|
|
58012
|
-
|
|
58013
|
-
|
|
58014
|
-
|
|
58015
|
-
|
|
58016
|
-
|
|
58017
|
-
|
|
58018
|
-
|
|
58019
|
-
|
|
58020
|
-
|
|
58021
|
-
[
|
|
58022
|
-
|
|
58023
|
-
|
|
58024
|
-
|
|
58025
|
-
|
|
58026
|
-
|
|
58027
|
-
|
|
58028
|
-
|
|
58029
|
-
}
|
|
57762
|
+
template: `
|
|
57763
|
+
@if (isOpen()) {
|
|
57764
|
+
<div class="fixed inset-0 overflow-y-auto z-50" (click)="close()">
|
|
57765
|
+
<div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0">
|
|
57766
|
+
<div
|
|
57767
|
+
[ngClass]="backdropClasses()"
|
|
57768
|
+
class="fixed inset-0 backdrop-blur-md"
|
|
57769
|
+
aria-hidden="true"
|
|
57770
|
+
@fadeIn>
|
|
57771
|
+
</div>
|
|
57772
|
+
|
|
57773
|
+
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">​</span>
|
|
57774
|
+
|
|
57775
|
+
<div
|
|
57776
|
+
(click)="$event.stopPropagation()"
|
|
57777
|
+
[ngClass]="modalContainerClasses()"
|
|
57778
|
+
class="relative inline-block align-bottom rounded-2xl text-left overflow-hidden shadow-xl sm:my-8 sm:align-middle sm:w-full sm:max-w-4xl border backdrop-blur-xl"
|
|
57779
|
+
@slideUpFade>
|
|
57780
|
+
|
|
57781
|
+
<!-- Header -->
|
|
57782
|
+
<div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
|
|
57783
|
+
<div class="flex items-start justify-between">
|
|
57784
|
+
<div class="flex-1">
|
|
57785
|
+
<h3 [ngClass]="titleClasses()" class="text-xl font-bold mb-2">
|
|
57786
|
+
{{ metricTitle() }}
|
|
57787
|
+
</h3>
|
|
57788
|
+
@if (metricData()?.description) {
|
|
57789
|
+
<button
|
|
57790
|
+
type="button"
|
|
57791
|
+
(click)="toggleDefinition()"
|
|
57792
|
+
[ngClass]="definitionToggleClasses()"
|
|
57793
|
+
class="inline-flex items-center gap-2 text-sm font-medium transition-colors">
|
|
57794
|
+
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
57795
|
+
<path 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" />
|
|
57796
|
+
</svg>
|
|
57797
|
+
<span>What is {{ metricTitle() }}?</span>
|
|
57798
|
+
<svg
|
|
57799
|
+
[class.rotate-180]="showDefinition()"
|
|
57800
|
+
class="w-4 h-4 transition-transform"
|
|
57801
|
+
fill="none"
|
|
57802
|
+
stroke="currentColor"
|
|
57803
|
+
viewBox="0 0 24 24">
|
|
57804
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
57805
|
+
</svg>
|
|
57806
|
+
</button>
|
|
57807
|
+
}
|
|
57808
|
+
@if (showDefinition() && metricData()?.description) {
|
|
57809
|
+
<div [ngClass]="definitionBoxClasses()" class="mt-3 p-4 rounded-lg border text-sm leading-relaxed">
|
|
57810
|
+
{{ metricData()?.description }}
|
|
57811
|
+
</div>
|
|
57812
|
+
}
|
|
57813
|
+
</div>
|
|
57814
|
+
<button
|
|
57815
|
+
(click)="close()"
|
|
57816
|
+
[ngClass]="closeButtonClasses()"
|
|
57817
|
+
class="ml-4 transition-all rounded-lg p-1 hover:scale-110 active:scale-90">
|
|
57818
|
+
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
57819
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
|
57820
|
+
</svg>
|
|
57821
|
+
</button>
|
|
57822
|
+
</div>
|
|
57823
|
+
</div>
|
|
57824
|
+
|
|
57825
|
+
<!-- Content -->
|
|
57826
|
+
<div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
|
|
57827
|
+
<symphiq-tooltip-container />
|
|
57828
|
+
|
|
57829
|
+
<!-- At a Glance Summary -->
|
|
57830
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
57831
|
+
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
57832
|
+
At a Glance
|
|
57833
|
+
</h4>
|
|
57834
|
+
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
57835
|
+
<!-- YTD Value -->
|
|
57836
|
+
<div>
|
|
57837
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57838
|
+
Year to Date ({{ ytdDateRangeWithYear() }})
|
|
57839
|
+
</p>
|
|
57840
|
+
<p [ngClass]="valueClasses()" class="text-xl font-bold mb-2">
|
|
57841
|
+
{{ formatMetricValue(ytdValue(), metricData()?.metric || '') }}
|
|
57842
|
+
</p>
|
|
57843
|
+
@if (ytdChangePercentage() !== null) {
|
|
57844
|
+
<symphiq-target-change-badge
|
|
57845
|
+
[viewMode]="viewMode()"
|
|
57846
|
+
[percentageChange]="ytdChangePercentage()!"
|
|
57847
|
+
[metric]="metricData()?.metric || ''"
|
|
57848
|
+
[priorYear]="priorYear()"
|
|
57849
|
+
[isCompact]="true"
|
|
57850
|
+
/>
|
|
57851
|
+
}
|
|
57852
|
+
</div>
|
|
57853
|
+
|
|
57854
|
+
<!-- Same Period Last Year -->
|
|
57855
|
+
<div>
|
|
57856
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57857
|
+
Same Period Last Year ({{ priorYearDateRange() }})
|
|
57858
|
+
</p>
|
|
57859
|
+
<p [ngClass]="valueClasses()" class="text-xl font-bold">
|
|
57860
|
+
{{ formatMetricValue(samePeriodLastYearValue(), metricData()?.metric || '') }}
|
|
57861
|
+
</p>
|
|
57862
|
+
</div>
|
|
57863
|
+
|
|
57864
|
+
<!-- Full Last Year -->
|
|
57865
|
+
<div>
|
|
57866
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57867
|
+
Full {{ priorYear() }} Actual
|
|
57868
|
+
</p>
|
|
57869
|
+
<p [ngClass]="valueClasses()" class="text-xl font-bold">
|
|
57870
|
+
{{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}
|
|
57871
|
+
</p>
|
|
57872
|
+
</div>
|
|
57873
|
+
|
|
57874
|
+
<!-- Current Pace -->
|
|
57875
|
+
@if (pacingInfo()) {
|
|
57876
|
+
<div>
|
|
57877
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57878
|
+
Pace for {{ currentYear() }}
|
|
57879
|
+
</p>
|
|
57880
|
+
<p [ngClass]="projectedValueClasses()" class="text-xl font-bold mb-2">
|
|
57881
|
+
{{ formatMetricValue(pacingInfo()!.projectedValue, metricData()?.metric || '', false) }}
|
|
57882
|
+
</p>
|
|
57883
|
+
<symphiq-pacing-status-badge
|
|
57884
|
+
[viewMode]="viewMode()"
|
|
57885
|
+
[pacingPercentage]="pacingInfo()!.pacingPercentage"
|
|
57886
|
+
[status]="pacingInfo()!.status"
|
|
57887
|
+
[showAsFullText]="false"
|
|
57888
|
+
[isCompact]="true"
|
|
57889
|
+
[showEmphasizedPercentage]="true"
|
|
57890
|
+
/>
|
|
57891
|
+
</div>
|
|
57892
|
+
}
|
|
57893
|
+
|
|
57894
|
+
<!-- Current Target -->
|
|
57895
|
+
<div>
|
|
57896
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
57897
|
+
{{ currentYear() }} Target
|
|
57898
|
+
</p>
|
|
57899
|
+
<p [ngClass]="targetValueClasses()" class="text-xl font-bold">
|
|
57900
|
+
{{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
|
|
57901
|
+
</p>
|
|
57902
|
+
</div>
|
|
57903
|
+
</div>
|
|
57904
|
+
</div>
|
|
57905
|
+
|
|
57906
|
+
<!-- Target Analysis -->
|
|
57907
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
57908
|
+
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
57909
|
+
Target Analysis
|
|
57910
|
+
</h4>
|
|
57911
|
+
|
|
57912
|
+
<div class="mb-4">
|
|
57913
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
|
|
57914
|
+
Your Target
|
|
57915
|
+
</p>
|
|
57916
|
+
<p [ngClass]="targetValueClasses()" class="text-3xl font-extrabold mb-3">
|
|
57917
|
+
{{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
|
|
57918
|
+
</p>
|
|
57919
|
+
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
|
|
57920
|
+
Your target represents a {{ formatPercentage(Math.abs(metricData()?.percentageIncrease || 0), 1) }}
|
|
57921
|
+
{{ (metricData()?.percentageIncrease || 0) >= 0 ? 'increase' : 'decrease' }}
|
|
57922
|
+
from your {{ priorYear() }} actual of
|
|
57923
|
+
{{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}.
|
|
57924
|
+
</p>
|
|
57925
|
+
</div>
|
|
57926
|
+
|
|
57927
|
+
@if (pacingInfo()) {
|
|
57928
|
+
<div class="mb-4">
|
|
57929
|
+
<symphiq-pacing-status-badge
|
|
57930
|
+
[viewMode]="viewMode()"
|
|
57931
|
+
[pacingPercentage]="pacingInfo()!.pacingPercentage"
|
|
57932
|
+
[status]="pacingInfo()!.status"
|
|
57933
|
+
[showAsFullText]="true"
|
|
57934
|
+
[isCompact]="false"
|
|
57935
|
+
[showEmphasizedPercentage]="true"
|
|
57936
|
+
/>
|
|
57937
|
+
</div>
|
|
57938
|
+
|
|
57939
|
+
<div class="mb-4">
|
|
57940
|
+
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
|
|
57941
|
+
{{ gapAnalysisText() }}
|
|
57942
|
+
</p>
|
|
57943
|
+
</div>
|
|
57944
|
+
|
|
57945
|
+
<!-- Progress Bar -->
|
|
57946
|
+
<div class="space-y-2">
|
|
57947
|
+
<div class="flex justify-between text-xs" [ngClass]="labelClasses()">
|
|
57948
|
+
<span>Progress to Target</span>
|
|
57949
|
+
<span>{{ formatPercentage(progressToTarget(), 1) }}</span>
|
|
57950
|
+
</div>
|
|
57951
|
+
<div [ngClass]="progressBarBgClasses()" class="h-3 rounded-full overflow-hidden">
|
|
57952
|
+
<div
|
|
57953
|
+
[ngClass]="progressBarFillClasses()"
|
|
57954
|
+
[style.width.%]="Math.min(progressToTarget(), 100)"
|
|
57955
|
+
class="h-full transition-all duration-500">
|
|
57956
|
+
</div>
|
|
57957
|
+
</div>
|
|
57958
|
+
</div>
|
|
57959
|
+
}
|
|
57960
|
+
</div>
|
|
57961
|
+
|
|
57962
|
+
<!-- Contributing Metrics Table (only for funnel stage metrics) -->
|
|
57963
|
+
@if (contributingMetrics().length > 0) {
|
|
57964
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
57965
|
+
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
57966
|
+
Contributing Metrics
|
|
57967
|
+
</h4>
|
|
57968
|
+
<div class="overflow-x-auto">
|
|
57969
|
+
<table class="w-full">
|
|
57970
|
+
<thead>
|
|
57971
|
+
<tr [ngClass]="tableHeaderClasses()" class="border-b">
|
|
57972
|
+
<th class="text-left py-3 px-4 text-xs font-semibold uppercase tracking-wider">Metric</th>
|
|
57973
|
+
<th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Target</th>
|
|
57974
|
+
<th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Improve by</th>
|
|
57975
|
+
</tr>
|
|
57976
|
+
</thead>
|
|
57977
|
+
<tbody>
|
|
57978
|
+
@for (metric of contributingMetrics(); track metric.metric) {
|
|
57979
|
+
<tr [ngClass]="tableRowClasses()" class="border-b transition-colors">
|
|
57980
|
+
<td class="py-3 px-4">
|
|
57981
|
+
<div class="flex items-center gap-2">
|
|
57982
|
+
<span class="text-sm font-medium">{{ getMetricTitle(metric) }}</span>
|
|
57983
|
+
@if (metric.description) {
|
|
57984
|
+
<button
|
|
57985
|
+
type="button"
|
|
57986
|
+
[ngClass]="infoIconClasses()"
|
|
57987
|
+
class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
|
|
57988
|
+
[libSymphiqTooltip]="getMarkdownTooltipContent(metric.description, getMetricTitle(metric))"
|
|
57989
|
+
tooltipType="markdown"
|
|
57990
|
+
tooltipPosition="right">
|
|
57991
|
+
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
57992
|
+
<path 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" />
|
|
57993
|
+
</svg>
|
|
57994
|
+
</button>
|
|
57995
|
+
}
|
|
57996
|
+
</div>
|
|
57997
|
+
</td>
|
|
57998
|
+
<td class="py-3 px-4 text-right">
|
|
57999
|
+
<span [ngClass]="targetValueClasses()" class="text-sm font-semibold">
|
|
58000
|
+
{{ formatMetricValue(metric.targetValue, metric.metric, false) }}
|
|
58001
|
+
</span>
|
|
58002
|
+
</td>
|
|
58003
|
+
<td class="py-3 px-4 text-right">
|
|
58004
|
+
<div class="flex items-center justify-end gap-2">
|
|
58005
|
+
<span class="text-sm font-medium">
|
|
58006
|
+
{{ formatPercentage(Math.abs(metric.percentageIncrease), 1) }}
|
|
58007
|
+
</span>
|
|
58008
|
+
<svg
|
|
58009
|
+
class="w-4 h-4 text-emerald-500"
|
|
58010
|
+
fill="none"
|
|
58011
|
+
stroke="currentColor"
|
|
58012
|
+
viewBox="0 0 24 24">
|
|
58013
|
+
<path
|
|
58014
|
+
stroke-linecap="round"
|
|
58015
|
+
stroke-linejoin="round"
|
|
58016
|
+
stroke-width="2"
|
|
58017
|
+
[attr.d]="metric.percentageIncrease >= 0 ? 'M5 10l7-7m0 0l7 7m-7-7v18' : 'M19 14l-7 7m0 0l-7-7m7 7V3'" />
|
|
58018
|
+
</svg>
|
|
58019
|
+
</div>
|
|
58020
|
+
</td>
|
|
58021
|
+
</tr>
|
|
58022
|
+
}
|
|
58023
|
+
</tbody>
|
|
58024
|
+
</table>
|
|
58025
|
+
</div>
|
|
58026
|
+
</div>
|
|
58027
|
+
}
|
|
58028
|
+
|
|
58029
|
+
<!-- Pacing Chart -->
|
|
58030
|
+
@if (pacingChartData()) {
|
|
58031
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6">
|
|
58032
|
+
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58033
|
+
Pace
|
|
58034
|
+
</h4>
|
|
58035
|
+
<div class="min-h-[400px]">
|
|
58036
|
+
<symphiq-line-chart
|
|
58037
|
+
[chart]="pacingChartData()!"
|
|
58038
|
+
[showAxisLabels]="true"
|
|
58039
|
+
[viewMode]="viewMode()"
|
|
58040
|
+
[currencySymbol]="'$'"
|
|
58041
|
+
/>
|
|
58042
|
+
</div>
|
|
58043
|
+
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-4">
|
|
58044
|
+
{{ chartDescriptionText() }}
|
|
58045
|
+
</p>
|
|
58046
|
+
</div>
|
|
58047
|
+
}
|
|
58048
|
+
</div>
|
|
58049
|
+
|
|
58050
|
+
<!-- Footer -->
|
|
58051
|
+
<div [ngClass]="footerClasses()" class="px-6 py-4 border-t">
|
|
58052
|
+
<button
|
|
58053
|
+
(click)="close()"
|
|
58054
|
+
[ngClass]="closeFooterButtonClasses()"
|
|
58055
|
+
class="w-full px-4 py-2 rounded-lg transition-all font-medium hover:scale-[1.02] active:scale-[0.98]">
|
|
58056
|
+
Close
|
|
58057
|
+
</button>
|
|
58058
|
+
</div>
|
|
58059
|
+
</div>
|
|
58060
|
+
</div>
|
|
58061
|
+
</div>
|
|
58062
|
+
}
|
|
58030
58063
|
`
|
|
58031
58064
|
}]
|
|
58032
58065
|
}], null, { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], metricEnum: [{ type: i0.Input, args: [{ isSignal: true, alias: "metricEnum", required: false }] }], metricData: [{ type: i0.Input, args: [{ isSignal: true, alias: "metricData", required: false }] }], contributingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "contributingMetrics", required: false }] }], pacingMetrics: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingMetrics", required: false }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] }); })();
|
|
58033
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber:
|
|
58066
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber: 344 }); })();
|
|
58034
58067
|
|
|
58035
58068
|
const _c0$q = ["absoluteInputRef"];
|
|
58036
58069
|
const _c1$b = ["percentageInputRef"];
|
|
@@ -58454,7 +58487,8 @@ class InitialTargetSettingComponent {
|
|
|
58454
58487
|
if (!selectedMetric || !selectedMetric.isFunnelStage) {
|
|
58455
58488
|
return [];
|
|
58456
58489
|
}
|
|
58457
|
-
return calcs.filter(c => !c.isFunnelStage && c.funnelMetric === metricEnum)
|
|
58490
|
+
return calcs.filter(c => !c.isFunnelStage && c.funnelMetric === metricEnum)
|
|
58491
|
+
.sort((a, b) => (a.relatedInd ?? 0) - (b.relatedInd ?? 0));
|
|
58458
58492
|
}, ...(ngDevMode ? [{ debugName: "selectedContributingMetrics" }] : []));
|
|
58459
58493
|
this.animatedIncreaseAmount = signal(0, ...(ngDevMode ? [{ debugName: "animatedIncreaseAmount" }] : []));
|
|
58460
58494
|
this.animatedPercentageGrowth = signal(0, ...(ngDevMode ? [{ debugName: "animatedPercentageGrowth" }] : []));
|