@eric-emg/symphiq-components 1.2.251 → 1.2.252
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 +918 -891
- package/fesm2022/symphiq-components.mjs.map +1 -1
- package/index.d.ts +28 -26
- package/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/styles.css +3 -0
|
@@ -54881,16 +54881,12 @@ class PacingStatusBadgeComponent {
|
|
|
54881
54881
|
return status === 'ahead' ? -1 : status === 'behind' ? 1 : 0;
|
|
54882
54882
|
}, ...(ngDevMode ? [{ debugName: "targetRotation" }] : []));
|
|
54883
54883
|
this.rotationStyle = computed(() => {
|
|
54884
|
-
const progress = this.animationProgress();
|
|
54885
54884
|
const target = this.targetRotation();
|
|
54886
|
-
|
|
54887
|
-
return `rotate(${currentRotation}deg)`;
|
|
54885
|
+
return `rotate(${target}deg)`;
|
|
54888
54886
|
}, ...(ngDevMode ? [{ debugName: "rotationStyle" }] : []));
|
|
54889
54887
|
this.fullBadgeRotationStyle = computed(() => {
|
|
54890
|
-
const progress = this.animationProgress();
|
|
54891
54888
|
const target = this.targetRotation();
|
|
54892
|
-
|
|
54893
|
-
return `rotate(${currentRotation}deg)`;
|
|
54889
|
+
return `rotate(${target}deg)`;
|
|
54894
54890
|
}, ...(ngDevMode ? [{ debugName: "fullBadgeRotationStyle" }] : []));
|
|
54895
54891
|
this.containerSizeClasses = computed(() => {
|
|
54896
54892
|
const compact = this.isCompact();
|
|
@@ -55041,37 +55037,37 @@ class PacingStatusBadgeComponent {
|
|
|
55041
55037
|
standalone: true,
|
|
55042
55038
|
imports: [CommonModule],
|
|
55043
55039
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
55044
|
-
template: `
|
|
55045
|
-
@if (showEmphasizedPercentage() && hasPercentage()) {
|
|
55046
|
-
<div
|
|
55047
|
-
[ngClass]="containerClasses()"
|
|
55048
|
-
[class]="containerSizeClasses()"
|
|
55049
|
-
[style.transform]="rotationStyle()"
|
|
55050
|
-
>
|
|
55051
|
-
<div [ngClass]="overlayBadgeClasses()" [class]="overlaySizeClasses()">
|
|
55052
|
-
<span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
|
|
55053
|
-
{{ iconSymbol() }}
|
|
55054
|
-
</span>
|
|
55055
|
-
{{ animatedPercentage() }}
|
|
55056
|
-
</div>
|
|
55057
|
-
<div
|
|
55058
|
-
[class]="sizeClasses()"
|
|
55059
|
-
>
|
|
55060
|
-
<span>{{ displayTextWithoutPercentage() }}</span>
|
|
55061
|
-
</div>
|
|
55062
|
-
</div>
|
|
55063
|
-
} @else {
|
|
55064
|
-
<div
|
|
55065
|
-
[ngClass]="badgeClasses()"
|
|
55066
|
-
[class]="fullBadgeSizeClasses()"
|
|
55067
|
-
[style.transform]="fullBadgeRotationStyle()"
|
|
55068
|
-
>
|
|
55069
|
-
<span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
|
|
55070
|
-
{{ iconSymbol() }}
|
|
55071
|
-
</span>
|
|
55072
|
-
<span>{{ displayText() }}</span>
|
|
55073
|
-
</div>
|
|
55074
|
-
}
|
|
55040
|
+
template: `
|
|
55041
|
+
@if (showEmphasizedPercentage() && hasPercentage()) {
|
|
55042
|
+
<div
|
|
55043
|
+
[ngClass]="containerClasses()"
|
|
55044
|
+
[class]="containerSizeClasses()"
|
|
55045
|
+
[style.transform]="rotationStyle()"
|
|
55046
|
+
>
|
|
55047
|
+
<div [ngClass]="overlayBadgeClasses()" [class]="overlaySizeClasses()">
|
|
55048
|
+
<span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
|
|
55049
|
+
{{ iconSymbol() }}
|
|
55050
|
+
</span>
|
|
55051
|
+
{{ animatedPercentage() }}
|
|
55052
|
+
</div>
|
|
55053
|
+
<div
|
|
55054
|
+
[class]="sizeClasses()"
|
|
55055
|
+
>
|
|
55056
|
+
<span>{{ displayTextWithoutPercentage() }}</span>
|
|
55057
|
+
</div>
|
|
55058
|
+
</div>
|
|
55059
|
+
} @else {
|
|
55060
|
+
<div
|
|
55061
|
+
[ngClass]="badgeClasses()"
|
|
55062
|
+
[class]="fullBadgeSizeClasses()"
|
|
55063
|
+
[style.transform]="fullBadgeRotationStyle()"
|
|
55064
|
+
>
|
|
55065
|
+
<span [ngClass]="iconClasses()" [class]="iconSizeClasses()">
|
|
55066
|
+
{{ iconSymbol() }}
|
|
55067
|
+
</span>
|
|
55068
|
+
<span>{{ displayText() }}</span>
|
|
55069
|
+
</div>
|
|
55070
|
+
}
|
|
55075
55071
|
`
|
|
55076
55072
|
}]
|
|
55077
55073
|
}], () => [{ type: i0.ElementRef }], { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], pacingPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "pacingPercentage", required: false }] }], status: [{ type: i0.Input, args: [{ isSignal: true, alias: "status", required: false }] }], showAsFullText: [{ type: i0.Input, args: [{ isSignal: true, alias: "showAsFullText", required: false }] }], isCompact: [{ type: i0.Input, args: [{ isSignal: true, alias: "isCompact", required: false }] }], showEmphasizedPercentage: [{ type: i0.Input, args: [{ isSignal: true, alias: "showEmphasizedPercentage", required: false }] }] }); })();
|
|
@@ -55125,10 +55121,8 @@ class TargetChangeBadgeComponent {
|
|
|
55125
55121
|
return change > 0 ? -1 : change < 0 ? 1 : 0;
|
|
55126
55122
|
}, ...(ngDevMode ? [{ debugName: "targetRotation" }] : []));
|
|
55127
55123
|
this.rotationStyle = computed(() => {
|
|
55128
|
-
const progress = this.animationProgress();
|
|
55129
55124
|
const target = this.targetRotation();
|
|
55130
|
-
|
|
55131
|
-
return `rotate(${currentRotation}deg)`;
|
|
55125
|
+
return `rotate(${target}deg)`;
|
|
55132
55126
|
}, ...(ngDevMode ? [{ debugName: "rotationStyle" }] : []));
|
|
55133
55127
|
this.containerSizeClasses = computed(() => {
|
|
55134
55128
|
const compact = this.isCompact();
|
|
@@ -55236,20 +55230,20 @@ class TargetChangeBadgeComponent {
|
|
|
55236
55230
|
standalone: true,
|
|
55237
55231
|
imports: [CommonModule],
|
|
55238
55232
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
55239
|
-
template: `
|
|
55240
|
-
<div
|
|
55241
|
-
[ngClass]="containerClasses()"
|
|
55242
|
-
[class]="containerSizeClasses()"
|
|
55243
|
-
[style.transform]="rotationStyle()"
|
|
55244
|
-
>
|
|
55245
|
-
<div [ngClass]="overlayClasses()" [class]="overlaySizeClasses()">
|
|
55246
|
-
<span [class]="iconSizeClass()">{{ iconSymbol() }}</span>
|
|
55247
|
-
{{ animatedPercentageText() }}
|
|
55248
|
-
</div>
|
|
55249
|
-
<div [class]="descriptionSizeClasses()">
|
|
55250
|
-
{{ descriptionText() }}
|
|
55251
|
-
</div>
|
|
55252
|
-
</div>
|
|
55233
|
+
template: `
|
|
55234
|
+
<div
|
|
55235
|
+
[ngClass]="containerClasses()"
|
|
55236
|
+
[class]="containerSizeClasses()"
|
|
55237
|
+
[style.transform]="rotationStyle()"
|
|
55238
|
+
>
|
|
55239
|
+
<div [ngClass]="overlayClasses()" [class]="overlaySizeClasses()">
|
|
55240
|
+
<span [class]="iconSizeClass()">{{ iconSymbol() }}</span>
|
|
55241
|
+
{{ animatedPercentageText() }}
|
|
55242
|
+
</div>
|
|
55243
|
+
<div [class]="descriptionSizeClasses()">
|
|
55244
|
+
{{ descriptionText() }}
|
|
55245
|
+
</div>
|
|
55246
|
+
</div>
|
|
55253
55247
|
`
|
|
55254
55248
|
}]
|
|
55255
55249
|
}], () => [{ type: i0.ElementRef }], { viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }], percentageChange: [{ type: i0.Input, args: [{ isSignal: true, alias: "percentageChange", required: false }] }], metric: [{ type: i0.Input, args: [{ isSignal: true, alias: "metric", required: false }] }], priorYear: [{ type: i0.Input, args: [{ isSignal: true, alias: "priorYear", required: false }] }], isCompact: [{ type: i0.Input, args: [{ isSignal: true, alias: "isCompact", required: false }] }] }); })();
|
|
@@ -56695,8 +56689,9 @@ class LineChartComponent {
|
|
|
56695
56689
|
this.showAxisLabels = input(false, ...(ngDevMode ? [{ debugName: "showAxisLabels" }] : []));
|
|
56696
56690
|
this.viewMode = input(ViewModeEnum.LIGHT, ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
|
|
56697
56691
|
this.currencySymbol = input('$', ...(ngDevMode ? [{ debugName: "currencySymbol" }] : []));
|
|
56692
|
+
this.height = input(undefined, ...(ngDevMode ? [{ debugName: "height" }] : []));
|
|
56698
56693
|
// Memoized computed signals to avoid recalculation on every change detection
|
|
56699
|
-
this.chartHeight = computed(() => this.showAxisLabels() ? '500px' : '133px', ...(ngDevMode ? [{ debugName: "chartHeight" }] : []));
|
|
56694
|
+
this.chartHeight = computed(() => this.height() ?? (this.showAxisLabels() ? '500px' : '133px'), ...(ngDevMode ? [{ debugName: "chartHeight" }] : []));
|
|
56700
56695
|
this.cursorColor = computed(() => this.viewMode() === ViewModeEnum.DARK ? 0xffffff : 0x94a3b8, ...(ngDevMode ? [{ debugName: "cursorColor" }] : []));
|
|
56701
56696
|
this.tooltipTextColor = computed(() => this.viewMode() === ViewModeEnum.DARK ? 0xffffff : 0x000000, ...(ngDevMode ? [{ debugName: "tooltipTextColor" }] : []));
|
|
56702
56697
|
this.chartHash = computed(() => this.generateChartHash(this.chart()), ...(ngDevMode ? [{ debugName: "chartHash" }] : []));
|
|
@@ -57141,7 +57136,7 @@ class LineChartComponent {
|
|
|
57141
57136
|
} if (rf & 2) {
|
|
57142
57137
|
let _t;
|
|
57143
57138
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.chartDiv = _t.first);
|
|
57144
|
-
} }, inputs: { chart: [1, "chart"], showAxisLabels: [1, "showAxisLabels"], viewMode: [1, "viewMode"], currencySymbol: [1, "currencySymbol"] }, decls: 3, vars: 4, consts: [["chartdiv", ""], [1, "chart-container"], [1, "chart", 2, "width", "100%"]], template: function LineChartComponent_Template(rf, ctx) { if (rf & 1) {
|
|
57139
|
+
} }, inputs: { chart: [1, "chart"], showAxisLabels: [1, "showAxisLabels"], viewMode: [1, "viewMode"], currencySymbol: [1, "currencySymbol"], height: [1, "height"] }, decls: 3, vars: 4, consts: [["chartdiv", ""], [1, "chart-container"], [1, "chart", 2, "width", "100%"]], template: function LineChartComponent_Template(rf, ctx) { if (rf & 1) {
|
|
57145
57140
|
i0.ɵɵdomElementStart(0, "div", 1);
|
|
57146
57141
|
i0.ɵɵdomElement(1, "div", 2, 0);
|
|
57147
57142
|
i0.ɵɵdomElementEnd();
|
|
@@ -57153,12 +57148,12 @@ class LineChartComponent {
|
|
|
57153
57148
|
}
|
|
57154
57149
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(LineChartComponent, [{
|
|
57155
57150
|
type: Component,
|
|
57156
|
-
args: [{ selector: 'symphiq-line-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
57157
|
-
<div class="chart-container" [class.mini-mode]="!showAxisLabels()">
|
|
57158
|
-
<div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
|
|
57159
|
-
</div>
|
|
57151
|
+
args: [{ selector: 'symphiq-line-chart', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
57152
|
+
<div class="chart-container" [class.mini-mode]="!showAxisLabels()">
|
|
57153
|
+
<div #chartdiv class="chart" [style.height]="chartHeight()" style="width: 100%;"></div>
|
|
57154
|
+
</div>
|
|
57160
57155
|
`, styles: [".chart-container{width:100%;padding:1rem}.chart-container.mini-mode{padding:.25rem}\n"] }]
|
|
57161
|
-
}], () => [], { 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: [{
|
|
57156
|
+
}], () => [], { 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 }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], chartDiv: [{
|
|
57162
57157
|
type: ViewChild,
|
|
57163
57158
|
args: ['chartdiv', { static: true }]
|
|
57164
57159
|
}] }); })();
|
|
@@ -57447,28 +57442,28 @@ const _forTrack0$i = ($index, $item) => $item.metric;
|
|
|
57447
57442
|
function MetricReportModalComponent_Conditional_0_Conditional_12_Template(rf, ctx) { if (rf & 1) {
|
|
57448
57443
|
i0.ɵɵelementStart(0, "button", 11);
|
|
57449
57444
|
i0.ɵɵnamespaceSVG();
|
|
57450
|
-
i0.ɵɵelementStart(1, "svg",
|
|
57451
|
-
i0.ɵɵelement(2, "path",
|
|
57445
|
+
i0.ɵɵelementStart(1, "svg", 32);
|
|
57446
|
+
i0.ɵɵelement(2, "path", 33);
|
|
57452
57447
|
i0.ɵɵelementEnd()();
|
|
57453
57448
|
} if (rf & 2) {
|
|
57454
57449
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
57455
57450
|
i0.ɵɵproperty("ngClass", ctx_r1.headerInfoIconClasses())("libSymphiqTooltip", ctx_r1.getMarkdownTooltipContent(ctx_r1.metricData().description, ctx_r1.metricTitle()));
|
|
57456
57451
|
} }
|
|
57457
|
-
function
|
|
57452
|
+
function MetricReportModalComponent_Conditional_0_Conditional_31_Template(rf, ctx) { if (rf & 1) {
|
|
57458
57453
|
i0.ɵɵelement(0, "symphiq-target-change-badge", 23);
|
|
57459
57454
|
} if (rf & 2) {
|
|
57460
57455
|
let tmp_4_0;
|
|
57461
57456
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
57462
57457
|
i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("percentageChange", ctx_r1.ytdChangePercentage())("metric", ((tmp_4_0 = ctx_r1.metricData()) == null ? null : tmp_4_0.metric) || "")("priorYear", ctx_r1.priorYear())("isCompact", true);
|
|
57463
57458
|
} }
|
|
57464
|
-
function
|
|
57465
|
-
i0.ɵɵelementStart(0, "div")(1, "p",
|
|
57459
|
+
function MetricReportModalComponent_Conditional_0_Conditional_47_Template(rf, ctx) { if (rf & 1) {
|
|
57460
|
+
i0.ɵɵelementStart(0, "div")(1, "p", 24);
|
|
57466
57461
|
i0.ɵɵtext(2);
|
|
57467
57462
|
i0.ɵɵelementEnd();
|
|
57468
57463
|
i0.ɵɵelementStart(3, "p", 22);
|
|
57469
57464
|
i0.ɵɵtext(4);
|
|
57470
57465
|
i0.ɵɵelementEnd();
|
|
57471
|
-
i0.ɵɵelement(5, "symphiq-pacing-status-badge",
|
|
57466
|
+
i0.ɵɵelement(5, "symphiq-pacing-status-badge", 34);
|
|
57472
57467
|
i0.ɵɵelementEnd();
|
|
57473
57468
|
} if (rf & 2) {
|
|
57474
57469
|
let tmp_5_0;
|
|
@@ -57484,11 +57479,24 @@ function MetricReportModalComponent_Conditional_0_Conditional_48_Template(rf, ct
|
|
|
57484
57479
|
i0.ɵɵadvance();
|
|
57485
57480
|
i0.ɵɵproperty("viewMode", ctx_r1.viewMode())("pacingPercentage", ctx_r1.pacingInfo().pacingPercentage)("status", ctx_r1.pacingInfo().status)("showAsFullText", false)("isCompact", true)("showEmphasizedPercentage", true);
|
|
57486
57481
|
} }
|
|
57482
|
+
function MetricReportModalComponent_Conditional_0_Conditional_53_Template(rf, ctx) { if (rf & 1) {
|
|
57483
|
+
i0.ɵɵelementStart(0, "div")(1, "p", 24);
|
|
57484
|
+
i0.ɵɵtext(2, " Year-over-Year Trend ");
|
|
57485
|
+
i0.ɵɵelementEnd();
|
|
57486
|
+
i0.ɵɵelement(3, "symphiq-area-chart", 35);
|
|
57487
|
+
i0.ɵɵelementEnd();
|
|
57488
|
+
} if (rf & 2) {
|
|
57489
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
57490
|
+
i0.ɵɵadvance();
|
|
57491
|
+
i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
|
|
57492
|
+
i0.ɵɵadvance(2);
|
|
57493
|
+
i0.ɵɵproperty("chart", ctx_r1.trendChartData())("showAxisLabels", false)("viewMode", ctx_r1.viewMode())("currencySymbol", "$")("height", "80px");
|
|
57494
|
+
} }
|
|
57487
57495
|
function MetricReportModalComponent_Conditional_0_Conditional_64_Template(rf, ctx) { if (rf & 1) {
|
|
57488
|
-
i0.ɵɵelementStart(0, "div",
|
|
57489
|
-
i0.ɵɵelement(1, "symphiq-pacing-status-badge",
|
|
57496
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
57497
|
+
i0.ɵɵelement(1, "symphiq-pacing-status-badge", 34);
|
|
57490
57498
|
i0.ɵɵelementEnd();
|
|
57491
|
-
i0.ɵɵelementStart(2, "div",
|
|
57499
|
+
i0.ɵɵelementStart(2, "div", 25)(3, "p", 28);
|
|
57492
57500
|
i0.ɵɵtext(4);
|
|
57493
57501
|
i0.ɵɵelementEnd()();
|
|
57494
57502
|
i0.ɵɵelement(5, "symphiq-progress-to-target-chart", 36);
|
|
@@ -57504,10 +57512,10 @@ function MetricReportModalComponent_Conditional_0_Conditional_64_Template(rf, ct
|
|
|
57504
57512
|
i0.ɵɵproperty("data", ctx_r1.progressToTargetData())("viewMode", ctx_r1.viewMode());
|
|
57505
57513
|
} }
|
|
57506
57514
|
function MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
57507
|
-
i0.ɵɵelementStart(0, "button",
|
|
57515
|
+
i0.ɵɵelementStart(0, "button", 11);
|
|
57508
57516
|
i0.ɵɵnamespaceSVG();
|
|
57509
|
-
i0.ɵɵelementStart(1, "svg",
|
|
57510
|
-
i0.ɵɵelement(2, "path",
|
|
57517
|
+
i0.ɵɵelementStart(1, "svg", 51);
|
|
57518
|
+
i0.ɵɵelement(2, "path", 33);
|
|
57511
57519
|
i0.ɵɵelementEnd()();
|
|
57512
57520
|
} if (rf & 2) {
|
|
57513
57521
|
const metric_r3 = i0.ɵɵnextContext().$implicit;
|
|
@@ -57518,17 +57526,17 @@ function MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Template
|
|
|
57518
57526
|
i0.ɵɵelementStart(0, "tr", 42)(1, "td", 43)(2, "div", 44)(3, "span", 45);
|
|
57519
57527
|
i0.ɵɵtext(4);
|
|
57520
57528
|
i0.ɵɵelementEnd();
|
|
57521
|
-
i0.ɵɵconditionalCreate(5, MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template, 3, 2, "button",
|
|
57529
|
+
i0.ɵɵconditionalCreate(5, MetricReportModalComponent_Conditional_0_Conditional_65_For_15_Conditional_5_Template, 3, 2, "button", 11);
|
|
57522
57530
|
i0.ɵɵelementEnd()();
|
|
57523
|
-
i0.ɵɵelementStart(6, "td",
|
|
57531
|
+
i0.ɵɵelementStart(6, "td", 46)(7, "span", 47);
|
|
57524
57532
|
i0.ɵɵtext(8);
|
|
57525
57533
|
i0.ɵɵelementEnd()();
|
|
57526
|
-
i0.ɵɵelementStart(9, "td",
|
|
57534
|
+
i0.ɵɵelementStart(9, "td", 46)(10, "div", 48)(11, "span", 45);
|
|
57527
57535
|
i0.ɵɵtext(12);
|
|
57528
57536
|
i0.ɵɵelementEnd();
|
|
57529
57537
|
i0.ɵɵnamespaceSVG();
|
|
57530
|
-
i0.ɵɵelementStart(13, "svg",
|
|
57531
|
-
i0.ɵɵelement(14, "path",
|
|
57538
|
+
i0.ɵɵelementStart(13, "svg", 49);
|
|
57539
|
+
i0.ɵɵelement(14, "path", 50);
|
|
57532
57540
|
i0.ɵɵelementEnd()()()();
|
|
57533
57541
|
} if (rf & 2) {
|
|
57534
57542
|
const metric_r3 = ctx.$implicit;
|
|
@@ -57574,19 +57582,19 @@ function MetricReportModalComponent_Conditional_0_Conditional_65_Template(rf, ct
|
|
|
57574
57582
|
i0.ɵɵrepeater(ctx_r1.contributingMetrics());
|
|
57575
57583
|
} }
|
|
57576
57584
|
function MetricReportModalComponent_Conditional_0_Conditional_66_Template(rf, ctx) { if (rf & 1) {
|
|
57577
|
-
i0.ɵɵelementStart(0, "div",
|
|
57585
|
+
i0.ɵɵelementStart(0, "div", 29)(1, "h4", 17);
|
|
57578
57586
|
i0.ɵɵtext(2, " Pace ");
|
|
57579
57587
|
i0.ɵɵelementEnd();
|
|
57580
|
-
i0.ɵɵelementStart(3, "div",
|
|
57581
|
-
i0.ɵɵelement(4, "symphiq-line-chart",
|
|
57588
|
+
i0.ɵɵelementStart(3, "div", 52);
|
|
57589
|
+
i0.ɵɵelement(4, "symphiq-line-chart", 35);
|
|
57582
57590
|
i0.ɵɵelementEnd();
|
|
57583
|
-
i0.ɵɵelementStart(5, "p",
|
|
57591
|
+
i0.ɵɵelementStart(5, "p", 53);
|
|
57584
57592
|
i0.ɵɵtext(6);
|
|
57585
57593
|
i0.ɵɵelementEnd();
|
|
57586
|
-
i0.ɵɵelementStart(7, "p",
|
|
57594
|
+
i0.ɵɵelementStart(7, "p", 54);
|
|
57587
57595
|
i0.ɵɵtext(8);
|
|
57588
57596
|
i0.ɵɵelementEnd();
|
|
57589
|
-
i0.ɵɵelementStart(9, "p",
|
|
57597
|
+
i0.ɵɵelementStart(9, "p", 54);
|
|
57590
57598
|
i0.ɵɵtext(10);
|
|
57591
57599
|
i0.ɵɵelementEnd()();
|
|
57592
57600
|
} if (rf & 2) {
|
|
@@ -57595,7 +57603,7 @@ function MetricReportModalComponent_Conditional_0_Conditional_66_Template(rf, ct
|
|
|
57595
57603
|
i0.ɵɵadvance();
|
|
57596
57604
|
i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
|
|
57597
57605
|
i0.ɵɵadvance(3);
|
|
57598
|
-
i0.ɵɵproperty("chart", ctx_r1.pacingChartData())("showAxisLabels", true)("viewMode", ctx_r1.viewMode())("currencySymbol", "$");
|
|
57606
|
+
i0.ɵɵproperty("chart", ctx_r1.pacingChartData())("showAxisLabels", true)("viewMode", ctx_r1.viewMode())("currencySymbol", "$")("height", "250px");
|
|
57599
57607
|
i0.ɵɵadvance();
|
|
57600
57608
|
i0.ɵɵproperty("ngClass", ctx_r1.descriptionClasses());
|
|
57601
57609
|
i0.ɵɵadvance();
|
|
@@ -57632,68 +57640,68 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57632
57640
|
i0.ɵɵelement(15, "path", 14);
|
|
57633
57641
|
i0.ɵɵelementEnd()()()();
|
|
57634
57642
|
i0.ɵɵnamespaceHTML();
|
|
57635
|
-
i0.ɵɵelementStart(16, "div", 15);
|
|
57636
|
-
i0.ɵɵ
|
|
57637
|
-
i0.ɵɵelementStart(18, "div", 16)(19, "h4", 17);
|
|
57638
|
-
i0.ɵɵtext(20, " At a Glance ");
|
|
57643
|
+
i0.ɵɵelementStart(16, "div", 15)(17, "div", 16)(18, "h4", 17);
|
|
57644
|
+
i0.ɵɵtext(19, " At a Glance ");
|
|
57639
57645
|
i0.ɵɵelementEnd();
|
|
57640
|
-
i0.ɵɵelementStart(
|
|
57641
|
-
i0.ɵɵtext(
|
|
57646
|
+
i0.ɵɵelementStart(20, "div", 18)(21, "div")(22, "div", 19)(23, "p", 20);
|
|
57647
|
+
i0.ɵɵtext(24, " Year to date ");
|
|
57642
57648
|
i0.ɵɵelementEnd();
|
|
57643
|
-
i0.ɵɵelementStart(
|
|
57644
|
-
i0.ɵɵtext(
|
|
57649
|
+
i0.ɵɵelementStart(25, "p", 21);
|
|
57650
|
+
i0.ɵɵtext(26);
|
|
57645
57651
|
i0.ɵɵelementEnd();
|
|
57646
|
-
i0.ɵɵelementStart(
|
|
57647
|
-
i0.ɵɵtext(
|
|
57652
|
+
i0.ɵɵelementStart(27, "p", 21);
|
|
57653
|
+
i0.ɵɵtext(28);
|
|
57648
57654
|
i0.ɵɵelementEnd()();
|
|
57649
|
-
i0.ɵɵelementStart(
|
|
57650
|
-
i0.ɵɵtext(
|
|
57655
|
+
i0.ɵɵelementStart(29, "p", 22);
|
|
57656
|
+
i0.ɵɵtext(30);
|
|
57651
57657
|
i0.ɵɵelementEnd();
|
|
57652
|
-
i0.ɵɵconditionalCreate(
|
|
57658
|
+
i0.ɵɵconditionalCreate(31, MetricReportModalComponent_Conditional_0_Conditional_31_Template, 1, 5, "symphiq-target-change-badge", 23);
|
|
57653
57659
|
i0.ɵɵelementEnd();
|
|
57654
|
-
i0.ɵɵelementStart(
|
|
57655
|
-
i0.ɵɵtext(
|
|
57660
|
+
i0.ɵɵelementStart(32, "div")(33, "div", 19)(34, "p", 20);
|
|
57661
|
+
i0.ɵɵtext(35, " Same period last year ");
|
|
57656
57662
|
i0.ɵɵelementEnd();
|
|
57657
|
-
i0.ɵɵelementStart(
|
|
57658
|
-
i0.ɵɵtext(
|
|
57663
|
+
i0.ɵɵelementStart(36, "p", 21);
|
|
57664
|
+
i0.ɵɵtext(37);
|
|
57659
57665
|
i0.ɵɵelementEnd();
|
|
57660
|
-
i0.ɵɵelementStart(
|
|
57661
|
-
i0.ɵɵtext(
|
|
57666
|
+
i0.ɵɵelementStart(38, "p", 21);
|
|
57667
|
+
i0.ɵɵtext(39);
|
|
57662
57668
|
i0.ɵɵelementEnd()();
|
|
57663
|
-
i0.ɵɵelementStart(
|
|
57664
|
-
i0.ɵɵtext(
|
|
57669
|
+
i0.ɵɵelementStart(40, "p", 10);
|
|
57670
|
+
i0.ɵɵtext(41);
|
|
57665
57671
|
i0.ɵɵelementEnd()();
|
|
57666
|
-
i0.ɵɵelementStart(
|
|
57667
|
-
i0.ɵɵtext(
|
|
57672
|
+
i0.ɵɵelementStart(42, "div")(43, "p", 24);
|
|
57673
|
+
i0.ɵɵtext(44);
|
|
57668
57674
|
i0.ɵɵelementEnd();
|
|
57669
|
-
i0.ɵɵelementStart(
|
|
57670
|
-
i0.ɵɵtext(
|
|
57675
|
+
i0.ɵɵelementStart(45, "p", 10);
|
|
57676
|
+
i0.ɵɵtext(46);
|
|
57671
57677
|
i0.ɵɵelementEnd()();
|
|
57672
|
-
i0.ɵɵconditionalCreate(
|
|
57673
|
-
i0.ɵɵelementStart(
|
|
57674
|
-
i0.ɵɵtext(
|
|
57678
|
+
i0.ɵɵconditionalCreate(47, MetricReportModalComponent_Conditional_0_Conditional_47_Template, 6, 10, "div");
|
|
57679
|
+
i0.ɵɵelementStart(48, "div")(49, "p", 24);
|
|
57680
|
+
i0.ɵɵtext(50);
|
|
57675
57681
|
i0.ɵɵelementEnd();
|
|
57676
|
-
i0.ɵɵelementStart(
|
|
57677
|
-
i0.ɵɵtext(
|
|
57678
|
-
i0.ɵɵelementEnd()()
|
|
57682
|
+
i0.ɵɵelementStart(51, "p", 10);
|
|
57683
|
+
i0.ɵɵtext(52);
|
|
57684
|
+
i0.ɵɵelementEnd()();
|
|
57685
|
+
i0.ɵɵconditionalCreate(53, MetricReportModalComponent_Conditional_0_Conditional_53_Template, 4, 6, "div");
|
|
57686
|
+
i0.ɵɵelementEnd()();
|
|
57679
57687
|
i0.ɵɵelementStart(54, "div", 16)(55, "h4", 17);
|
|
57680
57688
|
i0.ɵɵtext(56, " Target Analysis ");
|
|
57681
57689
|
i0.ɵɵelementEnd();
|
|
57682
|
-
i0.ɵɵelementStart(57, "div",
|
|
57690
|
+
i0.ɵɵelementStart(57, "div", 25)(58, "p", 26);
|
|
57683
57691
|
i0.ɵɵtext(59, " Your Target ");
|
|
57684
57692
|
i0.ɵɵelementEnd();
|
|
57685
|
-
i0.ɵɵelementStart(60, "p",
|
|
57693
|
+
i0.ɵɵelementStart(60, "p", 27);
|
|
57686
57694
|
i0.ɵɵtext(61);
|
|
57687
57695
|
i0.ɵɵelementEnd();
|
|
57688
|
-
i0.ɵɵelementStart(62, "p",
|
|
57696
|
+
i0.ɵɵelementStart(62, "p", 28);
|
|
57689
57697
|
i0.ɵɵtext(63);
|
|
57690
57698
|
i0.ɵɵelementEnd()();
|
|
57691
57699
|
i0.ɵɵconditionalCreate(64, MetricReportModalComponent_Conditional_0_Conditional_64_Template, 6, 10);
|
|
57692
57700
|
i0.ɵɵelementEnd();
|
|
57693
57701
|
i0.ɵɵconditionalCreate(65, MetricReportModalComponent_Conditional_0_Conditional_65_Template, 16, 3, "div", 16);
|
|
57694
|
-
i0.ɵɵconditionalCreate(66, MetricReportModalComponent_Conditional_0_Conditional_66_Template, 11,
|
|
57702
|
+
i0.ɵɵconditionalCreate(66, MetricReportModalComponent_Conditional_0_Conditional_66_Template, 11, 13, "div", 29);
|
|
57695
57703
|
i0.ɵɵelementEnd();
|
|
57696
|
-
i0.ɵɵelementStart(67, "div",
|
|
57704
|
+
i0.ɵɵelementStart(67, "div", 30)(68, "button", 31);
|
|
57697
57705
|
i0.ɵɵlistener("click", function MetricReportModalComponent_Conditional_0_Template_button_click_68_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
|
|
57698
57706
|
i0.ɵɵtext(69, " Close ");
|
|
57699
57707
|
i0.ɵɵelementEnd()()()()();
|
|
@@ -57703,8 +57711,8 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57703
57711
|
let tmp_27_0;
|
|
57704
57712
|
let tmp_31_0;
|
|
57705
57713
|
let tmp_36_0;
|
|
57706
|
-
let
|
|
57707
|
-
let
|
|
57714
|
+
let tmp_42_0;
|
|
57715
|
+
let tmp_44_0;
|
|
57708
57716
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
57709
57717
|
i0.ɵɵadvance(2);
|
|
57710
57718
|
i0.ɵɵproperty("ngClass", ctx_r1.backdropClasses())("@fadeIn", undefined);
|
|
@@ -57722,7 +57730,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57722
57730
|
i0.ɵɵproperty("ngClass", ctx_r1.closeButtonClasses());
|
|
57723
57731
|
i0.ɵɵadvance(3);
|
|
57724
57732
|
i0.ɵɵproperty("ngClass", ctx_r1.contentClasses());
|
|
57725
|
-
i0.ɵɵadvance(
|
|
57733
|
+
i0.ɵɵadvance();
|
|
57726
57734
|
i0.ɵɵproperty("ngClass", ctx_r1.sectionCardClasses());
|
|
57727
57735
|
i0.ɵɵadvance();
|
|
57728
57736
|
i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
|
|
@@ -57741,7 +57749,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57741
57749
|
i0.ɵɵadvance();
|
|
57742
57750
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(ctx_r1.ytdValue(), ((tmp_19_0 = ctx_r1.metricData()) == null ? null : tmp_19_0.metric) || ""), " ");
|
|
57743
57751
|
i0.ɵɵadvance();
|
|
57744
|
-
i0.ɵɵconditional(ctx_r1.ytdChangePercentage() !== null ?
|
|
57752
|
+
i0.ɵɵconditional(ctx_r1.ytdChangePercentage() !== null ? 31 : -1);
|
|
57745
57753
|
i0.ɵɵadvance(3);
|
|
57746
57754
|
i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
|
|
57747
57755
|
i0.ɵɵadvance(2);
|
|
@@ -57765,7 +57773,7 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57765
57773
|
i0.ɵɵadvance();
|
|
57766
57774
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(((tmp_31_0 = ctx_r1.metricData()) == null ? null : tmp_31_0.currentValue) || 0, ((tmp_31_0 = ctx_r1.metricData()) == null ? null : tmp_31_0.metric) || ""), " ");
|
|
57767
57775
|
i0.ɵɵadvance();
|
|
57768
|
-
i0.ɵɵconditional(ctx_r1.pacingInfo() ?
|
|
57776
|
+
i0.ɵɵconditional(ctx_r1.pacingInfo() ? 47 : -1);
|
|
57769
57777
|
i0.ɵɵadvance(2);
|
|
57770
57778
|
i0.ɵɵproperty("ngClass", ctx_r1.labelClasses());
|
|
57771
57779
|
i0.ɵɵadvance();
|
|
@@ -57775,6 +57783,8 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57775
57783
|
i0.ɵɵadvance();
|
|
57776
57784
|
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(((tmp_36_0 = ctx_r1.metricData()) == null ? null : tmp_36_0.targetValue) || 0, ((tmp_36_0 = ctx_r1.metricData()) == null ? null : tmp_36_0.metric) || "", false), " ");
|
|
57777
57785
|
i0.ɵɵadvance();
|
|
57786
|
+
i0.ɵɵconditional(ctx_r1.trendChartData() ? 53 : -1);
|
|
57787
|
+
i0.ɵɵadvance();
|
|
57778
57788
|
i0.ɵɵproperty("ngClass", ctx_r1.sectionCardClasses());
|
|
57779
57789
|
i0.ɵɵadvance();
|
|
57780
57790
|
i0.ɵɵproperty("ngClass", ctx_r1.sectionTitleClasses());
|
|
@@ -57783,11 +57793,11 @@ function MetricReportModalComponent_Conditional_0_Template(rf, ctx) { if (rf & 1
|
|
|
57783
57793
|
i0.ɵɵadvance(2);
|
|
57784
57794
|
i0.ɵɵproperty("ngClass", ctx_r1.targetValueClasses());
|
|
57785
57795
|
i0.ɵɵadvance();
|
|
57786
|
-
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(((
|
|
57796
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.formatMetricValue(((tmp_42_0 = ctx_r1.metricData()) == null ? null : tmp_42_0.targetValue) || 0, ((tmp_42_0 = ctx_r1.metricData()) == null ? null : tmp_42_0.metric) || "", false), " ");
|
|
57787
57797
|
i0.ɵɵadvance();
|
|
57788
57798
|
i0.ɵɵproperty("ngClass", ctx_r1.descriptionClasses());
|
|
57789
57799
|
i0.ɵɵadvance();
|
|
57790
|
-
i0.ɵɵtextInterpolate4(" Your target represents a ", ctx_r1.formatPercentage(ctx_r1.Math.abs(((
|
|
57800
|
+
i0.ɵɵtextInterpolate4(" Your target represents a ", ctx_r1.formatPercentage(ctx_r1.Math.abs(((tmp_44_0 = ctx_r1.metricData()) == null ? null : tmp_44_0.percentageIncrease) || 0), 1), " ", (((tmp_44_0 = ctx_r1.metricData()) == null ? null : tmp_44_0.percentageIncrease) || 0) >= 0 ? "increase" : "decrease", " from your ", ctx_r1.priorYear(), " actual of ", ctx_r1.formatMetricValue(((tmp_44_0 = ctx_r1.metricData()) == null ? null : tmp_44_0.currentValue) || 0, ((tmp_44_0 = ctx_r1.metricData()) == null ? null : tmp_44_0.metric) || ""), ". ");
|
|
57791
57801
|
i0.ɵɵadvance();
|
|
57792
57802
|
i0.ɵɵconditional(ctx_r1.pacingInfo() ? 64 : -1);
|
|
57793
57803
|
i0.ɵɵadvance();
|
|
@@ -57806,6 +57816,7 @@ class MetricReportModalComponent {
|
|
|
57806
57816
|
this.metricData = input(undefined, ...(ngDevMode ? [{ debugName: "metricData" }] : []));
|
|
57807
57817
|
this.contributingMetrics = input([], ...(ngDevMode ? [{ debugName: "contributingMetrics" }] : []));
|
|
57808
57818
|
this.pacingMetrics = input(undefined, ...(ngDevMode ? [{ debugName: "pacingMetrics" }] : []));
|
|
57819
|
+
this.trendChartData = input(null, ...(ngDevMode ? [{ debugName: "trendChartData" }] : []));
|
|
57809
57820
|
this.isOpen = input(false, ...(ngDevMode ? [{ debugName: "isOpen" }] : []));
|
|
57810
57821
|
this.closed = output();
|
|
57811
57822
|
this.showDefinition = signal(false, ...(ngDevMode ? [{ debugName: "showDefinition" }] : []));
|
|
@@ -57963,7 +57974,7 @@ class MetricReportModalComponent {
|
|
|
57963
57974
|
const metric = this.metricTitle();
|
|
57964
57975
|
const currentYear = this.currentYear();
|
|
57965
57976
|
const priorYear = this.priorYear();
|
|
57966
|
-
return `This chart shows the ${metric} performance trend for ${currentYear} (solid yellow line, this month includes projections), compared to ${priorYear} (dashed green line), with the target projection (dotted blue line) for the remainder of the year.`;
|
|
57977
|
+
return `This chart shows the ${metric} performance trend for ${currentYear} (solid yellow line, this month includes projections for the remaining days of the month), compared to ${priorYear} (dashed green line), with the target projection (dotted blue line) for the remainder of the year.`;
|
|
57967
57978
|
}, ...(ngDevMode ? [{ debugName: "chartLegendDescription" }] : []));
|
|
57968
57979
|
this.chartDescriptionSentence1 = computed(() => {
|
|
57969
57980
|
const metricData = this.metricData();
|
|
@@ -57998,7 +58009,7 @@ class MetricReportModalComponent {
|
|
|
57998
58009
|
lineChartData: {
|
|
57999
58010
|
series: [
|
|
58000
58011
|
{
|
|
58001
|
-
name: '
|
|
58012
|
+
name: '2026 Projected',
|
|
58002
58013
|
data: projectionData
|
|
58003
58014
|
},
|
|
58004
58015
|
{
|
|
@@ -58220,15 +58231,15 @@ class MetricReportModalComponent {
|
|
|
58220
58231
|
: 'bg-slate-700 hover:bg-slate-600 text-white';
|
|
58221
58232
|
}
|
|
58222
58233
|
static { this.ɵfac = function MetricReportModalComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MetricReportModalComponent)(); }; }
|
|
58223
|
-
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, "flex", "items-center", "gap-
|
|
58224
|
-
i0.ɵɵconditionalCreate(0, MetricReportModalComponent_Conditional_0_Template, 70,
|
|
58234
|
+
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"], trendChartData: [1, "trendChartData"], 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, "flex", "items-center", "gap-2", "mb-2"], [1, "text-xl", "font-bold", 3, "ngClass"], ["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, "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-6"], [1, "mb-1.5"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-xs", 3, "ngClass"], [1, "text-xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewMode", "percentageChange", "metric", "priorYear", "isCompact"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1.5", 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"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3.5", "h-3.5"], ["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"], [3, "viewMode", "pacingPercentage", "status", "showAsFullText", "isCompact", "showEmphasizedPercentage"], [3, "chart", "showAxisLabels", "viewMode", "currencySymbol", "height"], [3, "data", "viewMode"], [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"], [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-[250px]"], [1, "text-sm", "leading-relaxed", "mt-4", 3, "ngClass"], [1, "text-sm", "leading-relaxed", "mt-2", 3, "ngClass"]], template: function MetricReportModalComponent_Template(rf, ctx) { if (rf & 1) {
|
|
58235
|
+
i0.ɵɵconditionalCreate(0, MetricReportModalComponent_Conditional_0_Template, 70, 52, "div", 0);
|
|
58225
58236
|
} if (rf & 2) {
|
|
58226
58237
|
i0.ɵɵconditional(ctx.isOpen() ? 0 : -1);
|
|
58227
58238
|
} }, dependencies: [CommonModule, i1$1.NgClass, PacingStatusBadgeComponent,
|
|
58228
58239
|
TargetChangeBadgeComponent,
|
|
58229
58240
|
TooltipDirective,
|
|
58230
|
-
TooltipContainerComponent,
|
|
58231
58241
|
LineChartComponent,
|
|
58242
|
+
AreaChartComponent,
|
|
58232
58243
|
ProgressToTargetChartComponent], encapsulation: 2, data: { animation: [
|
|
58233
58244
|
trigger('fadeIn', [
|
|
58234
58245
|
transition(':enter', [
|
|
@@ -58254,8 +58265,8 @@ class MetricReportModalComponent {
|
|
|
58254
58265
|
PacingStatusBadgeComponent,
|
|
58255
58266
|
TargetChangeBadgeComponent,
|
|
58256
58267
|
TooltipDirective,
|
|
58257
|
-
TooltipContainerComponent,
|
|
58258
58268
|
LineChartComponent,
|
|
58269
|
+
AreaChartComponent,
|
|
58259
58270
|
ProgressToTargetChartComponent
|
|
58260
58271
|
],
|
|
58261
58272
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
@@ -58273,376 +58284,391 @@ class MetricReportModalComponent {
|
|
|
58273
58284
|
])
|
|
58274
58285
|
])
|
|
58275
58286
|
],
|
|
58276
|
-
template: `
|
|
58277
|
-
@if (isOpen()) {
|
|
58278
|
-
<div class="fixed inset-0 overflow-y-auto z-50" (click)="close()">
|
|
58279
|
-
<div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0">
|
|
58280
|
-
<div
|
|
58281
|
-
[ngClass]="backdropClasses()"
|
|
58282
|
-
class="fixed inset-0 backdrop-blur-md"
|
|
58283
|
-
aria-hidden="true"
|
|
58284
|
-
@fadeIn>
|
|
58285
|
-
</div>
|
|
58286
|
-
|
|
58287
|
-
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">​</span>
|
|
58288
|
-
|
|
58289
|
-
<div
|
|
58290
|
-
(click)="$event.stopPropagation()"
|
|
58291
|
-
[ngClass]="modalContainerClasses()"
|
|
58292
|
-
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"
|
|
58293
|
-
@slideUpFade>
|
|
58294
|
-
|
|
58295
|
-
<!-- Header -->
|
|
58296
|
-
<div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
|
|
58297
|
-
<div class="flex items-start justify-between">
|
|
58298
|
-
<div class="flex-1">
|
|
58299
|
-
<div class="flex items-center gap-3 mb-2">
|
|
58300
|
-
<h3 [ngClass]="titleClasses()" class="text-xl font-bold leading-none">
|
|
58301
|
-
{{ metricTitle() }}
|
|
58302
|
-
</h3>
|
|
58303
|
-
@if (metricData()?.description) {
|
|
58304
|
-
<button
|
|
58305
|
-
type="button"
|
|
58306
|
-
[ngClass]="headerInfoIconClasses()"
|
|
58307
|
-
class="flex-shrink-0 w-7 h-7 rounded-full inline-flex items-center justify-center transition-colors"
|
|
58308
|
-
[libSymphiqTooltip]="getMarkdownTooltipContent(metricData()!.description!, metricTitle())"
|
|
58309
|
-
tooltipType="markdown"
|
|
58310
|
-
tooltipPosition="right">
|
|
58311
|
-
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
58312
|
-
<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" />
|
|
58313
|
-
</svg>
|
|
58314
|
-
</button>
|
|
58315
|
-
}
|
|
58316
|
-
</div>
|
|
58317
|
-
</div>
|
|
58318
|
-
<button
|
|
58319
|
-
(click)="close()"
|
|
58320
|
-
[ngClass]="closeButtonClasses()"
|
|
58321
|
-
class="ml-4 transition-all rounded-lg p-1 hover:scale-110 active:scale-90">
|
|
58322
|
-
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
58323
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
|
58324
|
-
</svg>
|
|
58325
|
-
</button>
|
|
58326
|
-
</div>
|
|
58327
|
-
</div>
|
|
58328
|
-
|
|
58329
|
-
<!-- Content -->
|
|
58330
|
-
<div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
|
|
58331
|
-
<symphiq-tooltip-container />
|
|
58332
|
-
|
|
58333
|
-
<!-- At a Glance Summary -->
|
|
58334
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
58335
|
-
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58336
|
-
At a Glance
|
|
58337
|
-
</h4>
|
|
58338
|
-
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
58339
|
-
<!-- YTD Value -->
|
|
58340
|
-
<div>
|
|
58341
|
-
<div class="mb-1.5">
|
|
58342
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
58343
|
-
Year to date
|
|
58344
|
-
</p>
|
|
58345
|
-
<p [ngClass]="dateLabelClasses()" class="text-xs">
|
|
58346
|
-
{{ ytdStartDate() }}
|
|
58347
|
-
</p>
|
|
58348
|
-
<p [ngClass]="dateLabelClasses()" class="text-xs">
|
|
58349
|
-
{{ ytdEndDate() }}
|
|
58350
|
-
</p>
|
|
58351
|
-
</div>
|
|
58352
|
-
<p [ngClass]="valueClasses()" class="text-xl font-bold mb-2">
|
|
58353
|
-
{{ formatMetricValue(ytdValue(), metricData()?.metric || '') }}
|
|
58354
|
-
</p>
|
|
58355
|
-
@if (ytdChangePercentage() !== null) {
|
|
58356
|
-
<symphiq-target-change-badge
|
|
58357
|
-
[viewMode]="viewMode()"
|
|
58358
|
-
[percentageChange]="ytdChangePercentage()!"
|
|
58359
|
-
[metric]="metricData()?.metric || ''"
|
|
58360
|
-
[priorYear]="priorYear()"
|
|
58361
|
-
[isCompact]="true"
|
|
58362
|
-
/>
|
|
58363
|
-
}
|
|
58364
|
-
</div>
|
|
58365
|
-
|
|
58366
|
-
<!-- Same Period Last Year -->
|
|
58367
|
-
<div>
|
|
58368
|
-
<div class="mb-1.5">
|
|
58369
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
58370
|
-
Same period last year
|
|
58371
|
-
</p>
|
|
58372
|
-
<p [ngClass]="dateLabelClasses()" class="text-xs">
|
|
58373
|
-
{{ priorYearStartDate() }}
|
|
58374
|
-
</p>
|
|
58375
|
-
<p [ngClass]="dateLabelClasses()" class="text-xs">
|
|
58376
|
-
{{ priorYearEndDate() }}
|
|
58377
|
-
</p>
|
|
58378
|
-
</div>
|
|
58379
|
-
<p [ngClass]="valueClasses()" class="text-xl font-bold">
|
|
58380
|
-
{{ formatMetricValue(samePeriodLastYearValue(), metricData()?.metric || '') }}
|
|
58381
|
-
</p>
|
|
58382
|
-
</div>
|
|
58383
|
-
|
|
58384
|
-
<!-- Full Last Year -->
|
|
58385
|
-
<div>
|
|
58386
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
58387
|
-
Full {{ priorYear() }} Actual
|
|
58388
|
-
</p>
|
|
58389
|
-
<p [ngClass]="valueClasses()" class="text-xl font-bold">
|
|
58390
|
-
{{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}
|
|
58391
|
-
</p>
|
|
58392
|
-
</div>
|
|
58393
|
-
|
|
58394
|
-
<!-- Current Pace -->
|
|
58395
|
-
@if (pacingInfo()) {
|
|
58396
|
-
<div>
|
|
58397
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
58398
|
-
Pace for {{ currentYear() }}
|
|
58399
|
-
</p>
|
|
58400
|
-
<p [ngClass]="projectedValueClasses()" class="text-xl font-bold mb-2">
|
|
58401
|
-
{{ formatMetricValue(pacingInfo()!.projectedValue, metricData()?.metric || '', false) }}
|
|
58402
|
-
</p>
|
|
58403
|
-
<symphiq-pacing-status-badge
|
|
58404
|
-
[viewMode]="viewMode()"
|
|
58405
|
-
[pacingPercentage]="pacingInfo()!.pacingPercentage"
|
|
58406
|
-
[status]="pacingInfo()!.status"
|
|
58407
|
-
[showAsFullText]="false"
|
|
58408
|
-
[isCompact]="true"
|
|
58409
|
-
[showEmphasizedPercentage]="true"
|
|
58410
|
-
/>
|
|
58411
|
-
</div>
|
|
58412
|
-
}
|
|
58413
|
-
|
|
58414
|
-
<!-- Current Target -->
|
|
58415
|
-
<div>
|
|
58416
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
58417
|
-
{{ currentYear() }} Target
|
|
58418
|
-
</p>
|
|
58419
|
-
<p [ngClass]="targetValueClasses()" class="text-xl font-bold">
|
|
58420
|
-
{{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
|
|
58421
|
-
</p>
|
|
58422
|
-
</div>
|
|
58423
|
-
</div>
|
|
58424
|
-
</div>
|
|
58425
|
-
|
|
58426
|
-
<!-- Target Analysis -->
|
|
58427
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
58428
|
-
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58429
|
-
Target Analysis
|
|
58430
|
-
</h4>
|
|
58431
|
-
|
|
58432
|
-
<div class="mb-4">
|
|
58433
|
-
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
|
|
58434
|
-
Your Target
|
|
58435
|
-
</p>
|
|
58436
|
-
<p [ngClass]="targetValueClasses()" class="text-3xl font-extrabold mb-3">
|
|
58437
|
-
{{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
|
|
58438
|
-
</p>
|
|
58439
|
-
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
|
|
58440
|
-
Your target represents a {{ formatPercentage(Math.abs(metricData()?.percentageIncrease || 0), 1) }}
|
|
58441
|
-
{{ (metricData()?.percentageIncrease || 0) >= 0 ? 'increase' : 'decrease' }}
|
|
58442
|
-
from your {{ priorYear() }} actual of
|
|
58443
|
-
{{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}.
|
|
58444
|
-
</p>
|
|
58445
|
-
</div>
|
|
58446
|
-
|
|
58447
|
-
@if (pacingInfo()) {
|
|
58448
|
-
<div class="mb-4">
|
|
58449
|
-
<symphiq-pacing-status-badge
|
|
58450
|
-
[viewMode]="viewMode()"
|
|
58451
|
-
[pacingPercentage]="pacingInfo()!.pacingPercentage"
|
|
58452
|
-
[status]="pacingInfo()!.status"
|
|
58453
|
-
[showAsFullText]="true"
|
|
58454
|
-
[isCompact]="false"
|
|
58455
|
-
[showEmphasizedPercentage]="true"
|
|
58456
|
-
/>
|
|
58457
|
-
</div>
|
|
58458
|
-
|
|
58459
|
-
<div class="mb-4">
|
|
58460
|
-
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
|
|
58461
|
-
{{ gapAnalysisText() }}
|
|
58462
|
-
</p>
|
|
58463
|
-
</div>
|
|
58464
|
-
|
|
58465
|
-
<!-- Progress to Target Chart -->
|
|
58466
|
-
<symphiq-progress-to-target-chart
|
|
58467
|
-
[data]="progressToTargetData()"
|
|
58468
|
-
[viewMode]="viewMode()"
|
|
58469
|
-
/>
|
|
58470
|
-
}
|
|
58471
|
-
</div>
|
|
58472
|
-
|
|
58473
|
-
<!-- Contributing Metrics Table (only for funnel stage metrics) -->
|
|
58474
|
-
@if (contributingMetrics().length > 0) {
|
|
58475
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
58476
|
-
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58477
|
-
Contributing Metric Targets
|
|
58478
|
-
</h4>
|
|
58479
|
-
<div class="overflow-x-auto">
|
|
58480
|
-
<table class="w-full">
|
|
58481
|
-
<thead>
|
|
58482
|
-
<tr [ngClass]="tableHeaderClasses()" class="border-b">
|
|
58483
|
-
<th class="text-left py-3 px-4 text-xs font-semibold uppercase tracking-wider">Metric</th>
|
|
58484
|
-
<th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Target</th>
|
|
58485
|
-
<th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Improve by</th>
|
|
58486
|
-
</tr>
|
|
58487
|
-
</thead>
|
|
58488
|
-
<tbody>
|
|
58489
|
-
@for (metric of contributingMetrics(); track metric.metric) {
|
|
58490
|
-
<tr [ngClass]="tableRowClasses()" class="border-b transition-colors">
|
|
58491
|
-
<td class="py-3 px-4">
|
|
58492
|
-
<div class="flex items-center gap-2">
|
|
58493
|
-
<span class="text-sm font-medium">{{ getMetricTitle(metric) }}</span>
|
|
58494
|
-
@if (metric.description) {
|
|
58495
|
-
<button
|
|
58496
|
-
type="button"
|
|
58497
|
-
[ngClass]="infoIconClasses()"
|
|
58498
|
-
class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
|
|
58499
|
-
[libSymphiqTooltip]="getMarkdownTooltipContent(metric.description, getMetricTitle(metric))"
|
|
58500
|
-
tooltipType="markdown"
|
|
58501
|
-
tooltipPosition="right">
|
|
58502
|
-
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
58503
|
-
<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" />
|
|
58504
|
-
</svg>
|
|
58505
|
-
</button>
|
|
58506
|
-
}
|
|
58507
|
-
</div>
|
|
58508
|
-
</td>
|
|
58509
|
-
<td class="py-3 px-4 text-right">
|
|
58510
|
-
<span [ngClass]="targetValueClasses()" class="text-sm font-semibold">
|
|
58511
|
-
{{ formatMetricValue(metric.targetValue, metric.metric, false) }}
|
|
58512
|
-
</span>
|
|
58513
|
-
</td>
|
|
58514
|
-
<td class="py-3 px-4 text-right">
|
|
58515
|
-
<div class="flex items-center justify-end gap-2">
|
|
58516
|
-
<span class="text-sm font-medium">
|
|
58517
|
-
{{ formatPercentage(Math.abs(metric.percentageIncrease), 1) }}
|
|
58518
|
-
</span>
|
|
58519
|
-
<svg
|
|
58520
|
-
class="w-4 h-4 text-emerald-500"
|
|
58521
|
-
fill="none"
|
|
58522
|
-
stroke="currentColor"
|
|
58523
|
-
viewBox="0 0 24 24">
|
|
58524
|
-
<path
|
|
58525
|
-
stroke-linecap="round"
|
|
58526
|
-
stroke-linejoin="round"
|
|
58527
|
-
stroke-width="2"
|
|
58528
|
-
[attr.d]="metric.percentageIncrease >= 0 ? 'M5 10l7-7m0 0l7 7m-7-7v18' : 'M19 14l-7 7m0 0l-7-7m7 7V3'" />
|
|
58529
|
-
</svg>
|
|
58530
|
-
</div>
|
|
58531
|
-
</td>
|
|
58532
|
-
</tr>
|
|
58533
|
-
}
|
|
58534
|
-
</tbody>
|
|
58535
|
-
</table>
|
|
58536
|
-
</div>
|
|
58537
|
-
</div>
|
|
58538
|
-
}
|
|
58539
|
-
|
|
58540
|
-
<!-- Pacing Chart -->
|
|
58541
|
-
@if (pacingChartData()) {
|
|
58542
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6">
|
|
58543
|
-
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58544
|
-
Pace
|
|
58545
|
-
</h4>
|
|
58546
|
-
<div class="min-h-[400px]">
|
|
58547
|
-
<symphiq-line-chart
|
|
58548
|
-
[chart]="pacingChartData()!"
|
|
58549
|
-
[showAxisLabels]="true"
|
|
58550
|
-
[viewMode]="viewMode()"
|
|
58551
|
-
[currencySymbol]="'$'"
|
|
58552
|
-
/>
|
|
58553
|
-
</div>
|
|
58554
|
-
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-4">
|
|
58555
|
-
{{ chartLegendDescription() }}
|
|
58556
|
-
</p>
|
|
58557
|
-
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-2">
|
|
58558
|
-
{{ chartDescriptionSentence1() }}
|
|
58559
|
-
</p>
|
|
58560
|
-
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-2">
|
|
58561
|
-
{{ chartDescriptionSentence2() }}
|
|
58562
|
-
</p>
|
|
58563
|
-
</div>
|
|
58564
|
-
}
|
|
58565
|
-
</div>
|
|
58566
|
-
|
|
58567
|
-
<!-- Footer -->
|
|
58568
|
-
<div [ngClass]="footerClasses()" class="px-6 py-4 border-t">
|
|
58569
|
-
<button
|
|
58570
|
-
(click)="close()"
|
|
58571
|
-
[ngClass]="closeFooterButtonClasses()"
|
|
58572
|
-
class="w-full px-4 py-2 rounded-lg transition-all font-medium hover:scale-[1.02] active:scale-[0.98]">
|
|
58573
|
-
Close
|
|
58574
|
-
</button>
|
|
58575
|
-
</div>
|
|
58576
|
-
</div>
|
|
58577
|
-
</div>
|
|
58578
|
-
</div>
|
|
58579
|
-
}
|
|
58580
|
-
`
|
|
58581
|
-
}]
|
|
58582
|
-
}], 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"] }] }); })();
|
|
58583
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber: 349 }); })();
|
|
58287
|
+
template: `
|
|
58288
|
+
@if (isOpen()) {
|
|
58289
|
+
<div class="fixed inset-0 overflow-y-auto z-50" (click)="close()">
|
|
58290
|
+
<div class="flex items-center justify-center min-h-screen px-4 pt-4 pb-20 text-center sm:block sm:p-0">
|
|
58291
|
+
<div
|
|
58292
|
+
[ngClass]="backdropClasses()"
|
|
58293
|
+
class="fixed inset-0 backdrop-blur-md"
|
|
58294
|
+
aria-hidden="true"
|
|
58295
|
+
@fadeIn>
|
|
58296
|
+
</div>
|
|
58584
58297
|
|
|
58585
|
-
|
|
58586
|
-
|
|
58587
|
-
|
|
58588
|
-
|
|
58589
|
-
|
|
58590
|
-
|
|
58591
|
-
|
|
58592
|
-
|
|
58593
|
-
|
|
58594
|
-
|
|
58595
|
-
|
|
58596
|
-
|
|
58597
|
-
|
|
58598
|
-
|
|
58599
|
-
|
|
58600
|
-
|
|
58601
|
-
|
|
58602
|
-
|
|
58603
|
-
|
|
58604
|
-
|
|
58605
|
-
|
|
58606
|
-
|
|
58607
|
-
|
|
58608
|
-
|
|
58609
|
-
|
|
58610
|
-
|
|
58611
|
-
|
|
58612
|
-
|
|
58613
|
-
|
|
58614
|
-
|
|
58615
|
-
|
|
58616
|
-
|
|
58617
|
-
|
|
58618
|
-
|
|
58619
|
-
|
|
58620
|
-
|
|
58621
|
-
|
|
58622
|
-
|
|
58623
|
-
|
|
58624
|
-
|
|
58625
|
-
|
|
58626
|
-
|
|
58627
|
-
|
|
58628
|
-
|
|
58629
|
-
|
|
58630
|
-
|
|
58631
|
-
|
|
58632
|
-
|
|
58633
|
-
|
|
58634
|
-
|
|
58635
|
-
|
|
58636
|
-
|
|
58637
|
-
|
|
58638
|
-
|
|
58639
|
-
|
|
58640
|
-
|
|
58641
|
-
|
|
58642
|
-
|
|
58643
|
-
|
|
58644
|
-
|
|
58645
|
-
|
|
58298
|
+
<span class="hidden sm:inline-block sm:align-middle sm:h-screen" aria-hidden="true">​</span>
|
|
58299
|
+
|
|
58300
|
+
<div
|
|
58301
|
+
(click)="$event.stopPropagation()"
|
|
58302
|
+
[ngClass]="modalContainerClasses()"
|
|
58303
|
+
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"
|
|
58304
|
+
@slideUpFade>
|
|
58305
|
+
|
|
58306
|
+
<!-- Header -->
|
|
58307
|
+
<div [ngClass]="headerClasses()" class="px-6 py-5 border-b backdrop-blur-sm sticky top-0 z-10">
|
|
58308
|
+
<div class="flex items-start justify-between">
|
|
58309
|
+
<div class="flex-1">
|
|
58310
|
+
<div class="flex items-center gap-2 mb-2">
|
|
58311
|
+
<h3 [ngClass]="titleClasses()" class="text-xl font-bold">
|
|
58312
|
+
{{ metricTitle() }}
|
|
58313
|
+
</h3>
|
|
58314
|
+
@if (metricData()?.description) {
|
|
58315
|
+
<button
|
|
58316
|
+
type="button"
|
|
58317
|
+
[ngClass]="headerInfoIconClasses()"
|
|
58318
|
+
class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
|
|
58319
|
+
[libSymphiqTooltip]="getMarkdownTooltipContent(metricData()!.description!, metricTitle())"
|
|
58320
|
+
tooltipType="markdown"
|
|
58321
|
+
tooltipPosition="right">
|
|
58322
|
+
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
58323
|
+
<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" />
|
|
58324
|
+
</svg>
|
|
58325
|
+
</button>
|
|
58326
|
+
}
|
|
58327
|
+
</div>
|
|
58328
|
+
</div>
|
|
58329
|
+
<button
|
|
58330
|
+
(click)="close()"
|
|
58331
|
+
[ngClass]="closeButtonClasses()"
|
|
58332
|
+
class="ml-4 transition-all rounded-lg p-1 hover:scale-110 active:scale-90">
|
|
58333
|
+
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
58334
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path>
|
|
58335
|
+
</svg>
|
|
58336
|
+
</button>
|
|
58337
|
+
</div>
|
|
58338
|
+
</div>
|
|
58339
|
+
|
|
58340
|
+
<!-- Content -->
|
|
58341
|
+
<div [ngClass]="contentClasses()" class="px-6 py-6 max-h-[70vh] overflow-y-auto backdrop-blur-sm">
|
|
58342
|
+
<!-- At a Glance Summary -->
|
|
58343
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
58344
|
+
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58345
|
+
At a Glance
|
|
58346
|
+
</h4>
|
|
58347
|
+
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
58348
|
+
<!-- YTD Value -->
|
|
58349
|
+
<div>
|
|
58350
|
+
<div class="mb-1.5">
|
|
58351
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
58352
|
+
Year to date
|
|
58353
|
+
</p>
|
|
58354
|
+
<p [ngClass]="dateLabelClasses()" class="text-xs">
|
|
58355
|
+
{{ ytdStartDate() }}
|
|
58356
|
+
</p>
|
|
58357
|
+
<p [ngClass]="dateLabelClasses()" class="text-xs">
|
|
58358
|
+
{{ ytdEndDate() }}
|
|
58359
|
+
</p>
|
|
58360
|
+
</div>
|
|
58361
|
+
<p [ngClass]="valueClasses()" class="text-xl font-bold mb-2">
|
|
58362
|
+
{{ formatMetricValue(ytdValue(), metricData()?.metric || '') }}
|
|
58363
|
+
</p>
|
|
58364
|
+
@if (ytdChangePercentage() !== null) {
|
|
58365
|
+
<symphiq-target-change-badge
|
|
58366
|
+
[viewMode]="viewMode()"
|
|
58367
|
+
[percentageChange]="ytdChangePercentage()!"
|
|
58368
|
+
[metric]="metricData()?.metric || ''"
|
|
58369
|
+
[priorYear]="priorYear()"
|
|
58370
|
+
[isCompact]="true"
|
|
58371
|
+
/>
|
|
58372
|
+
}
|
|
58373
|
+
</div>
|
|
58374
|
+
|
|
58375
|
+
<!-- Same Period Last Year -->
|
|
58376
|
+
<div>
|
|
58377
|
+
<div class="mb-1.5">
|
|
58378
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
58379
|
+
Same period last year
|
|
58380
|
+
</p>
|
|
58381
|
+
<p [ngClass]="dateLabelClasses()" class="text-xs">
|
|
58382
|
+
{{ priorYearStartDate() }}
|
|
58383
|
+
</p>
|
|
58384
|
+
<p [ngClass]="dateLabelClasses()" class="text-xs">
|
|
58385
|
+
{{ priorYearEndDate() }}
|
|
58386
|
+
</p>
|
|
58387
|
+
</div>
|
|
58388
|
+
<p [ngClass]="valueClasses()" class="text-xl font-bold">
|
|
58389
|
+
{{ formatMetricValue(samePeriodLastYearValue(), metricData()?.metric || '') }}
|
|
58390
|
+
</p>
|
|
58391
|
+
</div>
|
|
58392
|
+
|
|
58393
|
+
<!-- Full Last Year -->
|
|
58394
|
+
<div>
|
|
58395
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
58396
|
+
Full {{ priorYear() }} Actual
|
|
58397
|
+
</p>
|
|
58398
|
+
<p [ngClass]="valueClasses()" class="text-xl font-bold">
|
|
58399
|
+
{{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}
|
|
58400
|
+
</p>
|
|
58401
|
+
</div>
|
|
58402
|
+
|
|
58403
|
+
<!-- Current Pace -->
|
|
58404
|
+
@if (pacingInfo()) {
|
|
58405
|
+
<div>
|
|
58406
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
58407
|
+
Pace for {{ currentYear() }}
|
|
58408
|
+
</p>
|
|
58409
|
+
<p [ngClass]="projectedValueClasses()" class="text-xl font-bold mb-2">
|
|
58410
|
+
{{ formatMetricValue(pacingInfo()!.projectedValue, metricData()?.metric || '', false) }}
|
|
58411
|
+
</p>
|
|
58412
|
+
<symphiq-pacing-status-badge
|
|
58413
|
+
[viewMode]="viewMode()"
|
|
58414
|
+
[pacingPercentage]="pacingInfo()!.pacingPercentage"
|
|
58415
|
+
[status]="pacingInfo()!.status"
|
|
58416
|
+
[showAsFullText]="false"
|
|
58417
|
+
[isCompact]="true"
|
|
58418
|
+
[showEmphasizedPercentage]="true"
|
|
58419
|
+
/>
|
|
58420
|
+
</div>
|
|
58421
|
+
}
|
|
58422
|
+
|
|
58423
|
+
<!-- Current Target -->
|
|
58424
|
+
<div>
|
|
58425
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
58426
|
+
{{ currentYear() }} Target
|
|
58427
|
+
</p>
|
|
58428
|
+
<p [ngClass]="targetValueClasses()" class="text-xl font-bold">
|
|
58429
|
+
{{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
|
|
58430
|
+
</p>
|
|
58431
|
+
</div>
|
|
58432
|
+
|
|
58433
|
+
<!-- Year-over-Year Trend Chart -->
|
|
58434
|
+
@if (trendChartData()) {
|
|
58435
|
+
<div>
|
|
58436
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1.5">
|
|
58437
|
+
Year-over-Year Trend
|
|
58438
|
+
</p>
|
|
58439
|
+
<symphiq-area-chart
|
|
58440
|
+
[chart]="trendChartData()!"
|
|
58441
|
+
[showAxisLabels]="false"
|
|
58442
|
+
[viewMode]="viewMode()"
|
|
58443
|
+
[currencySymbol]="'$'"
|
|
58444
|
+
[height]="'80px'"
|
|
58445
|
+
/>
|
|
58446
|
+
</div>
|
|
58447
|
+
}
|
|
58448
|
+
</div>
|
|
58449
|
+
</div>
|
|
58450
|
+
|
|
58451
|
+
<!-- Target Analysis -->
|
|
58452
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
58453
|
+
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58454
|
+
Target Analysis
|
|
58455
|
+
</h4>
|
|
58456
|
+
|
|
58457
|
+
<div class="mb-4">
|
|
58458
|
+
<p [ngClass]="labelClasses()" class="text-xs font-medium uppercase tracking-wider mb-2">
|
|
58459
|
+
Your Target
|
|
58460
|
+
</p>
|
|
58461
|
+
<p [ngClass]="targetValueClasses()" class="text-3xl font-extrabold mb-3">
|
|
58462
|
+
{{ formatMetricValue(metricData()?.targetValue || 0, metricData()?.metric || '', false) }}
|
|
58463
|
+
</p>
|
|
58464
|
+
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
|
|
58465
|
+
Your target represents a {{ formatPercentage(Math.abs(metricData()?.percentageIncrease || 0), 1) }}
|
|
58466
|
+
{{ (metricData()?.percentageIncrease || 0) >= 0 ? 'increase' : 'decrease' }}
|
|
58467
|
+
from your {{ priorYear() }} actual of
|
|
58468
|
+
{{ formatMetricValue(metricData()?.currentValue || 0, metricData()?.metric || '') }}.
|
|
58469
|
+
</p>
|
|
58470
|
+
</div>
|
|
58471
|
+
|
|
58472
|
+
@if (pacingInfo()) {
|
|
58473
|
+
<div class="mb-4">
|
|
58474
|
+
<symphiq-pacing-status-badge
|
|
58475
|
+
[viewMode]="viewMode()"
|
|
58476
|
+
[pacingPercentage]="pacingInfo()!.pacingPercentage"
|
|
58477
|
+
[status]="pacingInfo()!.status"
|
|
58478
|
+
[showAsFullText]="true"
|
|
58479
|
+
[isCompact]="false"
|
|
58480
|
+
[showEmphasizedPercentage]="true"
|
|
58481
|
+
/>
|
|
58482
|
+
</div>
|
|
58483
|
+
|
|
58484
|
+
<div class="mb-4">
|
|
58485
|
+
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed">
|
|
58486
|
+
{{ gapAnalysisText() }}
|
|
58487
|
+
</p>
|
|
58488
|
+
</div>
|
|
58489
|
+
|
|
58490
|
+
<!-- Progress to Target Chart -->
|
|
58491
|
+
<symphiq-progress-to-target-chart
|
|
58492
|
+
[data]="progressToTargetData()"
|
|
58493
|
+
[viewMode]="viewMode()"
|
|
58494
|
+
/>
|
|
58495
|
+
}
|
|
58496
|
+
</div>
|
|
58497
|
+
|
|
58498
|
+
<!-- Contributing Metrics Table (only for funnel stage metrics) -->
|
|
58499
|
+
@if (contributingMetrics().length > 0) {
|
|
58500
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6 mb-6">
|
|
58501
|
+
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58502
|
+
Contributing Metric Targets
|
|
58503
|
+
</h4>
|
|
58504
|
+
<div class="overflow-x-auto">
|
|
58505
|
+
<table class="w-full">
|
|
58506
|
+
<thead>
|
|
58507
|
+
<tr [ngClass]="tableHeaderClasses()" class="border-b">
|
|
58508
|
+
<th class="text-left py-3 px-4 text-xs font-semibold uppercase tracking-wider">Metric</th>
|
|
58509
|
+
<th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Target</th>
|
|
58510
|
+
<th class="text-right py-3 px-4 text-xs font-semibold uppercase tracking-wider">Improve by</th>
|
|
58511
|
+
</tr>
|
|
58512
|
+
</thead>
|
|
58513
|
+
<tbody>
|
|
58514
|
+
@for (metric of contributingMetrics(); track metric.metric) {
|
|
58515
|
+
<tr [ngClass]="tableRowClasses()" class="border-b transition-colors">
|
|
58516
|
+
<td class="py-3 px-4">
|
|
58517
|
+
<div class="flex items-center gap-2">
|
|
58518
|
+
<span class="text-sm font-medium">{{ getMetricTitle(metric) }}</span>
|
|
58519
|
+
@if (metric.description) {
|
|
58520
|
+
<button
|
|
58521
|
+
type="button"
|
|
58522
|
+
[ngClass]="infoIconClasses()"
|
|
58523
|
+
class="flex-shrink-0 w-5 h-5 rounded-full inline-flex items-center justify-center transition-colors"
|
|
58524
|
+
[libSymphiqTooltip]="getMarkdownTooltipContent(metric.description, getMetricTitle(metric))"
|
|
58525
|
+
tooltipType="markdown"
|
|
58526
|
+
tooltipPosition="right">
|
|
58527
|
+
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
58528
|
+
<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" />
|
|
58529
|
+
</svg>
|
|
58530
|
+
</button>
|
|
58531
|
+
}
|
|
58532
|
+
</div>
|
|
58533
|
+
</td>
|
|
58534
|
+
<td class="py-3 px-4 text-right">
|
|
58535
|
+
<span [ngClass]="targetValueClasses()" class="text-sm font-semibold">
|
|
58536
|
+
{{ formatMetricValue(metric.targetValue, metric.metric, false) }}
|
|
58537
|
+
</span>
|
|
58538
|
+
</td>
|
|
58539
|
+
<td class="py-3 px-4 text-right">
|
|
58540
|
+
<div class="flex items-center justify-end gap-2">
|
|
58541
|
+
<span class="text-sm font-medium">
|
|
58542
|
+
{{ formatPercentage(Math.abs(metric.percentageIncrease), 1) }}
|
|
58543
|
+
</span>
|
|
58544
|
+
<svg
|
|
58545
|
+
class="w-4 h-4 text-emerald-500"
|
|
58546
|
+
fill="none"
|
|
58547
|
+
stroke="currentColor"
|
|
58548
|
+
viewBox="0 0 24 24">
|
|
58549
|
+
<path
|
|
58550
|
+
stroke-linecap="round"
|
|
58551
|
+
stroke-linejoin="round"
|
|
58552
|
+
stroke-width="2"
|
|
58553
|
+
[attr.d]="metric.percentageIncrease >= 0 ? 'M5 10l7-7m0 0l7 7m-7-7v18' : 'M19 14l-7 7m0 0l-7-7m7 7V3'" />
|
|
58554
|
+
</svg>
|
|
58555
|
+
</div>
|
|
58556
|
+
</td>
|
|
58557
|
+
</tr>
|
|
58558
|
+
}
|
|
58559
|
+
</tbody>
|
|
58560
|
+
</table>
|
|
58561
|
+
</div>
|
|
58562
|
+
</div>
|
|
58563
|
+
}
|
|
58564
|
+
|
|
58565
|
+
<!-- Pacing Chart -->
|
|
58566
|
+
@if (pacingChartData()) {
|
|
58567
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-xl p-6">
|
|
58568
|
+
<h4 [ngClass]="sectionTitleClasses()" class="text-sm font-semibold uppercase tracking-wider mb-4">
|
|
58569
|
+
Pace
|
|
58570
|
+
</h4>
|
|
58571
|
+
<div class="min-h-[250px]">
|
|
58572
|
+
<symphiq-line-chart
|
|
58573
|
+
[chart]="pacingChartData()!"
|
|
58574
|
+
[showAxisLabels]="true"
|
|
58575
|
+
[viewMode]="viewMode()"
|
|
58576
|
+
[currencySymbol]="'$'"
|
|
58577
|
+
[height]="'250px'"
|
|
58578
|
+
/>
|
|
58579
|
+
</div>
|
|
58580
|
+
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-4">
|
|
58581
|
+
{{ chartLegendDescription() }}
|
|
58582
|
+
</p>
|
|
58583
|
+
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-2">
|
|
58584
|
+
{{ chartDescriptionSentence1() }}
|
|
58585
|
+
</p>
|
|
58586
|
+
<p [ngClass]="descriptionClasses()" class="text-sm leading-relaxed mt-2">
|
|
58587
|
+
{{ chartDescriptionSentence2() }}
|
|
58588
|
+
</p>
|
|
58589
|
+
</div>
|
|
58590
|
+
}
|
|
58591
|
+
</div>
|
|
58592
|
+
|
|
58593
|
+
<!-- Footer -->
|
|
58594
|
+
<div [ngClass]="footerClasses()" class="px-6 py-4 border-t">
|
|
58595
|
+
<button
|
|
58596
|
+
(click)="close()"
|
|
58597
|
+
[ngClass]="closeFooterButtonClasses()"
|
|
58598
|
+
class="w-full px-4 py-2 rounded-lg transition-all font-medium hover:scale-[1.02] active:scale-[0.98]">
|
|
58599
|
+
Close
|
|
58600
|
+
</button>
|
|
58601
|
+
</div>
|
|
58602
|
+
</div>
|
|
58603
|
+
</div>
|
|
58604
|
+
</div>
|
|
58605
|
+
}
|
|
58606
|
+
`
|
|
58607
|
+
}]
|
|
58608
|
+
}], 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 }] }], trendChartData: [{ type: i0.Input, args: [{ isSignal: true, alias: "trendChartData", required: false }] }], isOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "isOpen", required: false }] }], closed: [{ type: i0.Output, args: ["closed"] }] }); })();
|
|
58609
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MetricReportModalComponent, { className: "MetricReportModalComponent", filePath: "lib/components/revenue-calculator-dashboard/metric-report-modal.component.ts", lineNumber: 364 }); })();
|
|
58610
|
+
|
|
58611
|
+
const _c0$q = ["absoluteInputRef"];
|
|
58612
|
+
const _c1$b = ["percentageInputRef"];
|
|
58613
|
+
function InitialTargetSettingComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
58614
|
+
i0.ɵɵtext(0);
|
|
58615
|
+
} if (rf & 2) {
|
|
58616
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
58617
|
+
i0.ɵɵtextInterpolate1(" Your ", ctx_r0.currentYear(), " Revenue Target ");
|
|
58618
|
+
} }
|
|
58619
|
+
function InitialTargetSettingComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
|
|
58620
|
+
i0.ɵɵtext(0);
|
|
58621
|
+
} if (rf & 2) {
|
|
58622
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
58623
|
+
i0.ɵɵtextInterpolate1(" Calculate Your ", ctx_r0.currentYear(), " Revenue Target ");
|
|
58624
|
+
} }
|
|
58625
|
+
function InitialTargetSettingComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
58626
|
+
i0.ɵɵnamespaceSVG();
|
|
58627
|
+
i0.ɵɵelementStart(0, "svg", 34);
|
|
58628
|
+
i0.ɵɵelement(1, "path", 35);
|
|
58629
|
+
i0.ɵɵelementEnd();
|
|
58630
|
+
} if (rf & 2) {
|
|
58631
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
58632
|
+
i0.ɵɵclassProp("chevron-rotate-expanded", ctx_r0.detailsExpanded());
|
|
58633
|
+
i0.ɵɵproperty("ngClass", ctx_r0.chevronClasses());
|
|
58634
|
+
} }
|
|
58635
|
+
function InitialTargetSettingComponent_Conditional_21_Template(rf, ctx) { if (rf & 1) {
|
|
58636
|
+
const _r2 = i0.ɵɵgetCurrentView();
|
|
58637
|
+
i0.ɵɵelementStart(0, "div", 11);
|
|
58638
|
+
i0.ɵɵnamespaceSVG();
|
|
58639
|
+
i0.ɵɵelementStart(1, "svg", 12);
|
|
58640
|
+
i0.ɵɵelement(2, "path", 36);
|
|
58641
|
+
i0.ɵɵelementEnd();
|
|
58642
|
+
i0.ɵɵnamespaceHTML();
|
|
58643
|
+
i0.ɵɵelementStart(3, "div")(4, "div", 37)(5, "p", 14);
|
|
58644
|
+
i0.ɵɵtext(6, " Current Pace Projection ");
|
|
58645
|
+
i0.ɵɵelementEnd();
|
|
58646
|
+
i0.ɵɵelementStart(7, "button", 38);
|
|
58647
|
+
i0.ɵɵlistener("click", function InitialTargetSettingComponent_Conditional_21_Template_button_click_7_listener($event) { i0.ɵɵrestoreView(_r2); return i0.ɵɵresetView($event.stopPropagation()); });
|
|
58648
|
+
i0.ɵɵnamespaceSVG();
|
|
58649
|
+
i0.ɵɵelementStart(8, "svg", 39);
|
|
58650
|
+
i0.ɵɵelement(9, "path", 40);
|
|
58651
|
+
i0.ɵɵelementEnd()()();
|
|
58652
|
+
i0.ɵɵnamespaceHTML();
|
|
58653
|
+
i0.ɵɵelementStart(10, "p", 15);
|
|
58654
|
+
i0.ɵɵtext(11);
|
|
58655
|
+
i0.ɵɵelementEnd()()();
|
|
58656
|
+
} if (rf & 2) {
|
|
58657
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
58658
|
+
i0.ɵɵadvance();
|
|
58659
|
+
i0.ɵɵproperty("ngClass", ctx_r0.projectionIconClasses());
|
|
58660
|
+
i0.ɵɵadvance(4);
|
|
58661
|
+
i0.ɵɵproperty("ngClass", ctx_r0.projectionLabelClasses());
|
|
58662
|
+
i0.ɵɵadvance(2);
|
|
58663
|
+
i0.ɵɵproperty("ngClass", ctx_r0.infoIconClasses())("libSymphiqTooltip", ctx_r0.currentPaceProjectionTooltip);
|
|
58664
|
+
i0.ɵɵadvance(3);
|
|
58665
|
+
i0.ɵɵproperty("ngClass", ctx_r0.projectionValueClasses());
|
|
58666
|
+
i0.ɵɵadvance();
|
|
58667
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r0.formatCurrency(ctx_r0.currentPaceProjection()), " ");
|
|
58668
|
+
} }
|
|
58669
|
+
function InitialTargetSettingComponent_Conditional_25_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
58670
|
+
const _r4 = i0.ɵɵgetCurrentView();
|
|
58671
|
+
i0.ɵɵelementStart(0, "div", 43)(1, "span", 45);
|
|
58646
58672
|
i0.ɵɵtext(2, " $ ");
|
|
58647
58673
|
i0.ɵɵelementEnd();
|
|
58648
58674
|
i0.ɵɵelementStart(3, "input", 46, 0);
|
|
@@ -58908,7 +58934,7 @@ function InitialTargetSettingComponent_Conditional_37_Conditional_4_Template(rf,
|
|
|
58908
58934
|
i0.ɵɵelement(0, "symphiq-area-chart", 23);
|
|
58909
58935
|
} if (rf & 2) {
|
|
58910
58936
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
58911
|
-
i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "
|
|
58937
|
+
i0.ɵɵproperty("chart", ctx_r0.revenueChartData())("showAxisLabels", true)("viewMode", ctx_r0.viewMode())("currencySymbol", "$")("height", "200px");
|
|
58912
58938
|
} }
|
|
58913
58939
|
function InitialTargetSettingComponent_Conditional_37_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
58914
58940
|
i0.ɵɵelementStart(0, "div", 24)(1, "p", 50);
|
|
@@ -59530,7 +59556,7 @@ class InitialTargetSettingComponent {
|
|
|
59530
59556
|
let _t;
|
|
59531
59557
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.absoluteInputRef = _t.first);
|
|
59532
59558
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.percentageInputRef = _t.first);
|
|
59533
|
-
} }, inputs: { viewMode: [1, "viewMode"], funnelMetrics: [1, "funnelMetrics"], mainUiData: [1, "mainUiData"], trendUiData: [1, "trendUiData"], shopId: [1, "shopId"], pacingMetrics: [1, "pacingMetrics"], dataResults: [1, "dataResults"], reverseCalculationResponse: [1, "reverseCalculationResponse"], targets: [1, "targets"] }, outputs: { targetsCreated: "targetsCreated", calculateRevenueRequest: "calculateRevenueRequest" }, decls: 43, vars:
|
|
59559
|
+
} }, inputs: { viewMode: [1, "viewMode"], funnelMetrics: [1, "funnelMetrics"], mainUiData: [1, "mainUiData"], trendUiData: [1, "trendUiData"], shopId: [1, "shopId"], pacingMetrics: [1, "pacingMetrics"], dataResults: [1, "dataResults"], reverseCalculationResponse: [1, "reverseCalculationResponse"], targets: [1, "targets"] }, outputs: { targetsCreated: "targetsCreated", calculateRevenueRequest: "calculateRevenueRequest" }, decls: 43, vars: 51, consts: [["absoluteInputRef", ""], ["percentageInputRef", ""], [1, "space-y-8", "pb-32"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "click", "ngClass"], [1, "flex", "items-center", "justify-between", "mb-6"], [1, "text-2xl", "font-bold", 3, "ngClass"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6", "chevron-rotate", 3, "chevron-rotate-expanded", "ngClass"], [1, "flex", "flex-col", "gap-4"], [1, "grid", "lg:grid-cols-2", "gap-4"], [1, "p-6", "rounded-xl", "border-2", 3, "click", "ngClass"], [1, "flex", "flex-wrap", "gap-4", "place-content-between"], [1, "flex", "items-center", "gap-2"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-4", "h-4", 3, "ngClass"], ["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, "text-xs", "font-medium", "uppercase", "tracking-wider", 3, "ngClass"], [1, "text-lg", "font-bold", 3, "ngClass"], [1, "form-area-collapse"], [1, "form-area-content"], [1, "space-y-6"], [1, "chart-in-column"], [1, "chart-in-column-content"], [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"], [1, "calculated-card-enter", "order-first", "lg:order-last"], [1, "calculated-card-content"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass", "h-full"], [1, "w-full"], [1, "metrics-section-enter"], [1, "metrics-section-content"], [1, "rounded-2xl", "border", "shadow-lg", "p-8", 3, "ngClass"], [3, "submitClick", "cancelClick", "viewMode", "isValid", "isSubmitting", "validationMessage", "buttonText", "showCancelButton"], [3, "closed", "viewMode", "metricEnum", "metricData", "contributingMetrics", "pacingMetrics", "trendChartData", "isOpen"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-6", "h-6", "chevron-rotate", 3, "ngClass"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M19 9l-7 7-7-7"], ["stroke-linecap", "round", "stroke-linejoin", "round", "stroke-width", "2", "d", "M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"], [1, "flex", "items-center", "gap-1"], ["type", "button", "tooltipType", "markdown", "tooltipPosition", "top", 1, "flex-shrink-0", "w-4", "h-4", "rounded-full", "inline-flex", "items-center", "justify-center", "transition-colors", 3, "click", "ngClass", "libSymphiqTooltip"], ["fill", "none", "stroke", "currentColor", "viewBox", "0 0 24 24", 1, "w-3", "h-3"], ["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", "gap-2"], [1, "flex-1", "py-2", "px-4", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "relative"], [1, "flex", "justify-end"], [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, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", 3, "click", "ngClass"], [1, "text-sm", 3, "ngClass"], [1, "p-6", "rounded-xl", "border-2", 3, "ngClass"], [1, "flex", "items-center", "justify-between"], [1, "font-bold", "transition-all", "duration-300", "text-lg", 3, "ngClass"], [1, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "whitespace-nowrap", 3, "ngClass"], [1, "details-collapse"], [1, "details-collapse-content"], [1, "relative", "pt-6", "mt-6"], [1, "absolute", "top-0", "left-0", "right-0", "flex", "items-center", "-translate-y-1/2"], [1, "flex-1", "h-px", 3, "ngClass"], [1, "px-3", "py-1", "rounded-full", "text-xs", "font-semibold", "whitespace-nowrap", 3, "ngClass"], [1, "grid", "grid-cols-2", "gap-4", "pt-2"], [1, "text-xs", "font-medium", "uppercase", "tracking-wider", "mb-1", 3, "ngClass"], [1, "text-xl", "font-bold", 3, "ngClass"], [1, "px-4", "py-2", "rounded-lg", "text-sm", "font-semibold", "transition-all", "whitespace-nowrap", 3, "click", "ngClass"], [1, "flex", "items-center", "gap-1", "mb-1"], [1, "mb-6"], [1, "text-2xl", "font-bold", "mb-2", 3, "ngClass"], [3, "viewStageReport", "viewRelatedMetricReport", "viewMode", "calculations", "pacingMetrics"]], template: function InitialTargetSettingComponent_Template(rf, ctx) { if (rf & 1) {
|
|
59534
59560
|
i0.ɵɵelementStart(0, "div", 2);
|
|
59535
59561
|
i0.ɵɵelement(1, "symphiq-tooltip-container");
|
|
59536
59562
|
i0.ɵɵelementStart(2, "div", 3);
|
|
@@ -59630,7 +59656,7 @@ class InitialTargetSettingComponent {
|
|
|
59630
59656
|
i0.ɵɵadvance();
|
|
59631
59657
|
i0.ɵɵproperty("viewMode", ctx.viewMode())("isValid", ctx.isValid())("isSubmitting", ctx.isCalculating())("validationMessage", ctx.validationMessage())("buttonText", ctx.submitButtonText())("showCancelButton", ctx.calculationState() === "input" && ctx.hasStoredResponse());
|
|
59632
59658
|
i0.ɵɵadvance();
|
|
59633
|
-
i0.ɵɵproperty("viewMode", ctx.viewMode())("metricEnum", ctx.selectedMetricEnum())("metricData", ctx.selectedMetricData())("contributingMetrics", ctx.selectedContributingMetrics())("pacingMetrics", ctx.pacingMetrics())("isOpen", ctx.isMetricReportOpen());
|
|
59659
|
+
i0.ɵɵproperty("viewMode", ctx.viewMode())("metricEnum", ctx.selectedMetricEnum())("metricData", ctx.selectedMetricData())("contributingMetrics", ctx.selectedContributingMetrics())("pacingMetrics", ctx.pacingMetrics())("trendChartData", ctx.revenueChartData())("isOpen", ctx.isMetricReportOpen());
|
|
59634
59660
|
} }, dependencies: [CommonModule, i1$1.NgClass, FormsModule, i2$1.DefaultValueAccessor, i2$1.NumberValueAccessor, i2$1.NgControlStatus, i2$1.MinValidator, i2$1.MaxValidator, i2$1.NgModel, FunnelMetricsVisualizationComponent,
|
|
59635
59661
|
StickySubmitBarComponent,
|
|
59636
59662
|
AreaChartComponent,
|
|
@@ -59649,390 +59675,391 @@ class InitialTargetSettingComponent {
|
|
|
59649
59675
|
TooltipDirective,
|
|
59650
59676
|
TooltipContainerComponent,
|
|
59651
59677
|
MetricReportModalComponent
|
|
59652
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
59653
|
-
<div class="space-y-8 pb-32">
|
|
59654
|
-
<symphiq-tooltip-container />
|
|
59655
|
-
<div [ngClass]="sectionCardClasses(true)" class="rounded-2xl border shadow-lg p-8"
|
|
59656
|
-
[class.cursor-pointer]="calculationState() === 'results'"
|
|
59657
|
-
[class.lg:sticky]="calculationState() === 'results'"
|
|
59658
|
-
[style.top]="calculationState() === 'results' ? '148px' : 'auto'"
|
|
59659
|
-
[class.z-30]="calculationState() === 'results'"
|
|
59660
|
-
(click)="onCardClick()">
|
|
59661
|
-
<div class="flex items-center justify-between mb-6">
|
|
59662
|
-
<h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold">
|
|
59663
|
-
@if (calculationState() === 'results') {
|
|
59664
|
-
Your {{ currentYear() }} Revenue Target
|
|
59665
|
-
} @else {
|
|
59666
|
-
Calculate Your {{ currentYear() }} Revenue Target
|
|
59667
|
-
}
|
|
59668
|
-
</h2>
|
|
59669
|
-
@if (calculationState() === 'results') {
|
|
59670
|
-
<svg
|
|
59671
|
-
class="w-6 h-6 chevron-rotate"
|
|
59672
|
-
[class.chevron-rotate-expanded]="detailsExpanded()"
|
|
59673
|
-
[ngClass]="chevronClasses()"
|
|
59674
|
-
fill="none"
|
|
59675
|
-
stroke="currentColor"
|
|
59676
|
-
viewBox="0 0 24 24">
|
|
59677
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
59678
|
-
</svg>
|
|
59679
|
-
}
|
|
59680
|
-
</div>
|
|
59681
|
-
|
|
59682
|
-
<div class="flex flex-col gap-4">
|
|
59683
|
-
<div class="grid lg:grid-cols-2 gap-4">
|
|
59684
|
-
<div class="flex flex-col gap-4">
|
|
59685
|
-
<div [ngClass]="formAreaClasses()" class="p-6 rounded-xl border-2" [class.cursor-pointer]="calculationState() === 'results'" (click)="onCardClick(); $event.stopPropagation()">
|
|
59686
|
-
<div class="flex flex-wrap gap-4 place-content-between">
|
|
59687
|
-
<div class="flex items-center gap-2">
|
|
59688
|
-
<svg class="w-4 h-4" [ngClass]="baselineIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
59689
|
-
<path 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"></path>
|
|
59690
|
-
</svg>
|
|
59691
|
-
<div>
|
|
59692
|
-
<p [ngClass]="baselineLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
59693
|
-
{{ priorYear() }} Revenue
|
|
59694
|
-
</p>
|
|
59695
|
-
<p [ngClass]="baselineValueClasses()" class="text-lg font-bold">
|
|
59696
|
-
{{ formatCurrency(priorYearRevenue()) }}
|
|
59697
|
-
</p>
|
|
59698
|
-
</div>
|
|
59699
|
-
</div>
|
|
59700
|
-
@if (currentPaceProjection() > 0) {
|
|
59701
|
-
<div class="flex items-center gap-2">
|
|
59702
|
-
<svg class="w-4 h-4" [ngClass]="projectionIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
59703
|
-
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
|
|
59704
|
-
</svg>
|
|
59705
|
-
<div>
|
|
59706
|
-
<div class="flex items-center gap-1">
|
|
59707
|
-
<p [ngClass]="projectionLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
59708
|
-
Current Pace Projection
|
|
59709
|
-
</p>
|
|
59710
|
-
<button
|
|
59711
|
-
type="button"
|
|
59712
|
-
[ngClass]="infoIconClasses()"
|
|
59713
|
-
class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
|
|
59714
|
-
[libSymphiqTooltip]="currentPaceProjectionTooltip"
|
|
59715
|
-
tooltipType="markdown"
|
|
59716
|
-
tooltipPosition="top"
|
|
59717
|
-
(click)="$event.stopPropagation()">
|
|
59718
|
-
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
59719
|
-
<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" />
|
|
59720
|
-
</svg>
|
|
59721
|
-
</button>
|
|
59722
|
-
</div>
|
|
59723
|
-
<p [ngClass]="projectionValueClasses()" class="text-lg font-bold">
|
|
59724
|
-
{{ formatCurrency(currentPaceProjection()) }}
|
|
59725
|
-
</p>
|
|
59726
|
-
</div>
|
|
59727
|
-
</div>
|
|
59728
|
-
}
|
|
59729
|
-
</div>
|
|
59730
|
-
|
|
59731
|
-
<div class="form-area-collapse" [class.form-area-collapse-hidden]="calculationState() === 'results'" [class.mt-6]="calculationState() !== 'results'">
|
|
59732
|
-
<div class="form-area-content">
|
|
59733
|
-
<div class="space-y-6">
|
|
59734
|
-
@if (calculationState() !== 'results') {
|
|
59735
|
-
<div class="flex gap-2">
|
|
59736
|
-
<button
|
|
59737
|
-
(click)="setInputMode('absolute')"
|
|
59738
|
-
[ngClass]="inputModeButtonClasses('absolute')"
|
|
59739
|
-
class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
|
|
59740
|
-
Absolute Amount
|
|
59741
|
-
</button>
|
|
59742
|
-
<button
|
|
59743
|
-
(click)="setInputMode('percentage')"
|
|
59744
|
-
[ngClass]="inputModeButtonClasses('percentage')"
|
|
59745
|
-
class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
|
|
59746
|
-
% Increase
|
|
59747
|
-
</button>
|
|
59748
|
-
</div>
|
|
59749
|
-
|
|
59750
|
-
@if (inputMode() === 'absolute') {
|
|
59751
|
-
<div class="relative">
|
|
59752
|
-
<span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
|
|
59753
|
-
$
|
|
59754
|
-
</span>
|
|
59755
|
-
<input
|
|
59756
|
-
#absoluteInputRef
|
|
59757
|
-
type="number"
|
|
59758
|
-
[(ngModel)]="absoluteInput"
|
|
59759
|
-
(ngModelChange)="onAbsoluteInputChange()"
|
|
59760
|
-
[ngClass]="inputClasses()"
|
|
59761
|
-
class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
|
|
59762
|
-
placeholder="0"
|
|
59763
|
-
min="0"
|
|
59764
|
-
step="1000">
|
|
59765
|
-
</div>
|
|
59766
|
-
} @else {
|
|
59767
|
-
<div class="relative">
|
|
59768
|
-
<input
|
|
59769
|
-
#percentageInputRef
|
|
59770
|
-
type="number"
|
|
59771
|
-
[(ngModel)]="percentageInput"
|
|
59772
|
-
(ngModelChange)="onPercentageInputChange()"
|
|
59773
|
-
[ngClass]="inputClasses()"
|
|
59774
|
-
class="w-full pr-10 pl-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
|
|
59775
|
-
placeholder="0"
|
|
59776
|
-
min="0"
|
|
59777
|
-
max="1000"
|
|
59778
|
-
step="0.1">
|
|
59779
|
-
<span [ngClass]="inputSuffixClasses()" class="absolute right-4 top-1/2 -translate-y-1/2 text-xl font-bold">
|
|
59780
|
-
%
|
|
59781
|
-
</span>
|
|
59782
|
-
</div>
|
|
59783
|
-
}
|
|
59784
|
-
|
|
59785
|
-
@if (hasStoredResponse()) {
|
|
59786
|
-
<div class="flex justify-end">
|
|
59787
|
-
<button
|
|
59788
|
-
(click)="handleCancel()"
|
|
59789
|
-
[ngClass]="cancelButtonClasses()"
|
|
59790
|
-
class="px-4 py-2 rounded-lg text-sm font-semibold transition-all">
|
|
59791
|
-
Cancel
|
|
59792
|
-
</button>
|
|
59793
|
-
</div>
|
|
59794
|
-
}
|
|
59795
|
-
}
|
|
59796
|
-
</div>
|
|
59797
|
-
</div>
|
|
59798
|
-
</div>
|
|
59799
|
-
</div>
|
|
59800
|
-
|
|
59801
|
-
<div class="chart-in-column" [class.chart-in-column-active]="calculationState() === 'results' && detailsExpanded()">
|
|
59802
|
-
<div class="chart-in-column-content">
|
|
59803
|
-
<div>
|
|
59804
|
-
<p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
|
|
59805
|
-
Year-over-Year Revenue Trend
|
|
59806
|
-
</p>
|
|
59807
|
-
<div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
|
|
59808
|
-
@if (revenueChartData()) {
|
|
59809
|
-
<symphiq-area-chart
|
|
59810
|
-
[chart]="revenueChartData()!"
|
|
59811
|
-
[showAxisLabels]="true"
|
|
59812
|
-
[viewMode]="viewMode()"
|
|
59813
|
-
[currencySymbol]="'$'"
|
|
59814
|
-
[height]="'108px'"
|
|
59815
|
-
/>
|
|
59816
|
-
} @else {
|
|
59817
|
-
<div class="h-64 flex items-center justify-center">
|
|
59818
|
-
<p [ngClass]="noDataClasses()" class="text-sm">
|
|
59819
|
-
No revenue data available
|
|
59820
|
-
</p>
|
|
59821
|
-
</div>
|
|
59822
|
-
}
|
|
59823
|
-
</div>
|
|
59824
|
-
</div>
|
|
59825
|
-
</div>
|
|
59826
|
-
</div>
|
|
59827
|
-
</div>
|
|
59828
|
-
|
|
59829
|
-
<div class="calculated-card-enter order-first lg:order-last" [class.calculated-card-enter-active]="calculatedRevenue() > 0">
|
|
59830
|
-
<div class="calculated-card-content">
|
|
59831
|
-
@if (calculatedRevenue() > 0) {
|
|
59832
|
-
<div [ngClass]="calculatedValuesCardClasses()" class="p-6 rounded-xl border-2"
|
|
59833
|
-
[class.h-full]="calculationState() !== 'results' || detailsExpanded()">
|
|
59834
|
-
<div>
|
|
59835
|
-
<div class="flex items-center justify-between">
|
|
59836
|
-
<div>
|
|
59837
|
-
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
59838
|
-
{{ currentYear() }} Revenue Target
|
|
59839
|
-
</p>
|
|
59840
|
-
<p [ngClass]="calculatedValueClasses()" class="font-bold transition-all duration-300 text-lg"
|
|
59841
|
-
[class.lg:text-3xl]="calculationState() !== 'results' || detailsExpanded()">
|
|
59842
|
-
@if (calculationState() === 'results' && targets() === undefined && submittedAbsoluteInput() !== null) {
|
|
59843
|
-
> {{ formatCurrency(submittedAbsoluteInput()!) }}
|
|
59844
|
-
} @else {
|
|
59845
|
-
{{ formatCurrency(displayedTargetRevenue()) }}
|
|
59846
|
-
}
|
|
59847
|
-
</p>
|
|
59848
|
-
</div>
|
|
59849
|
-
@if (calculationState() === 'results' && targets() === undefined) {
|
|
59850
|
-
<button
|
|
59851
|
-
(click)="handleAdjustTarget(); $event.stopPropagation()"
|
|
59852
|
-
[ngClass]="secondaryButtonClasses()"
|
|
59853
|
-
class="px-4 py-2 rounded-lg text-sm font-semibold transition-all whitespace-nowrap">
|
|
59854
|
-
Adjust Revenue Target
|
|
59855
|
-
</button>
|
|
59856
|
-
}
|
|
59857
|
-
</div>
|
|
59858
|
-
|
|
59859
|
-
<div class="details-collapse" [class.details-collapse-expanded]="calculationState() !== 'results' || detailsExpanded()">
|
|
59860
|
-
<div class="details-collapse-content">
|
|
59861
|
-
<div class="relative pt-6 mt-6">
|
|
59862
|
-
<div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
|
|
59863
|
-
<div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
|
|
59864
|
-
<span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
|
|
59865
|
-
vs. {{ priorYear() }}
|
|
59866
|
-
</span>
|
|
59867
|
-
<div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
|
|
59868
|
-
</div>
|
|
59869
|
-
<div class="grid grid-cols-2 gap-4 pt-2">
|
|
59870
|
-
<div>
|
|
59871
|
-
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
59872
|
-
Increase Amount
|
|
59873
|
-
</p>
|
|
59874
|
-
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
59875
|
-
@if (isTargetValid()) {
|
|
59876
|
-
{{ formatCurrency(animatedIncreaseAmount()) }}
|
|
59877
|
-
} @else {
|
|
59878
|
-
--
|
|
59879
|
-
}
|
|
59880
|
-
</p>
|
|
59881
|
-
</div>
|
|
59882
|
-
<div>
|
|
59883
|
-
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
59884
|
-
% Growth
|
|
59885
|
-
</p>
|
|
59886
|
-
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
59887
|
-
@if (isTargetValid()) {
|
|
59888
|
-
+{{ formatPercentage(animatedPercentageGrowth(), 1) }}
|
|
59889
|
-
} @else {
|
|
59890
|
-
--
|
|
59891
|
-
}
|
|
59892
|
-
</p>
|
|
59893
|
-
</div>
|
|
59894
|
-
</div>
|
|
59895
|
-
</div>
|
|
59896
|
-
|
|
59897
|
-
@if (currentPaceProjection() > 0) {
|
|
59898
|
-
<div class="relative pt-6 mt-6">
|
|
59899
|
-
<div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
|
|
59900
|
-
<div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
|
|
59901
|
-
<span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
|
|
59902
|
-
{{ currentYear() }} YTD Gap
|
|
59903
|
-
</span>
|
|
59904
|
-
<div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
|
|
59905
|
-
</div>
|
|
59906
|
-
<div class="grid grid-cols-2 gap-4 pt-2">
|
|
59907
|
-
<div>
|
|
59908
|
-
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
59909
|
-
Gap to Close
|
|
59910
|
-
</p>
|
|
59911
|
-
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
59912
|
-
@if (isTargetValid()) {
|
|
59913
|
-
{{ formatCurrency(animatedGapAmount()) }}
|
|
59914
|
-
} @else {
|
|
59915
|
-
--
|
|
59916
|
-
}
|
|
59917
|
-
</p>
|
|
59918
|
-
</div>
|
|
59919
|
-
<div>
|
|
59920
|
-
<div class="flex items-center gap-1 mb-1">
|
|
59921
|
-
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
59922
|
-
Additional Growth Needed
|
|
59923
|
-
</p>
|
|
59924
|
-
<button
|
|
59925
|
-
type="button"
|
|
59926
|
-
[ngClass]="infoIconClasses()"
|
|
59927
|
-
class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
|
|
59928
|
-
[libSymphiqTooltip]="additionalGrowthTooltip"
|
|
59929
|
-
tooltipType="markdown"
|
|
59930
|
-
tooltipPosition="top"
|
|
59931
|
-
(click)="$event.stopPropagation()">
|
|
59932
|
-
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
59933
|
-
<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" />
|
|
59934
|
-
</svg>
|
|
59935
|
-
</button>
|
|
59936
|
-
</div>
|
|
59937
|
-
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
59938
|
-
@if (isTargetValid()) {
|
|
59939
|
-
{{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(animatedGapPercentage(), 1) }}
|
|
59940
|
-
} @else {
|
|
59941
|
-
--
|
|
59942
|
-
}
|
|
59943
|
-
</p>
|
|
59944
|
-
</div>
|
|
59945
|
-
</div>
|
|
59946
|
-
</div>
|
|
59947
|
-
}
|
|
59948
|
-
|
|
59949
|
-
</div>
|
|
59950
|
-
</div>
|
|
59951
|
-
</div>
|
|
59952
|
-
</div>
|
|
59953
|
-
}
|
|
59954
|
-
</div>
|
|
59955
|
-
</div>
|
|
59956
|
-
</div>
|
|
59957
|
-
|
|
59958
|
-
@if (calculationState() !== 'results') {
|
|
59959
|
-
<div class="w-full">
|
|
59960
|
-
<p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
|
|
59961
|
-
Year-over-Year Revenue Trend
|
|
59962
|
-
</p>
|
|
59963
|
-
<div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
|
|
59964
|
-
@if (revenueChartData()) {
|
|
59965
|
-
<symphiq-area-chart
|
|
59966
|
-
[chart]="revenueChartData()!"
|
|
59967
|
-
[showAxisLabels]="true"
|
|
59968
|
-
[viewMode]="viewMode()"
|
|
59969
|
-
[currencySymbol]="'$'"
|
|
59970
|
-
[height]="'
|
|
59971
|
-
/>
|
|
59972
|
-
} @else {
|
|
59973
|
-
<div class="h-64 flex items-center justify-center">
|
|
59974
|
-
<p [ngClass]="noDataClasses()" class="text-sm">
|
|
59975
|
-
No revenue data available
|
|
59976
|
-
</p>
|
|
59977
|
-
</div>
|
|
59978
|
-
}
|
|
59979
|
-
</div>
|
|
59980
|
-
</div>
|
|
59981
|
-
}
|
|
59982
|
-
</div>
|
|
59983
|
-
</div>
|
|
59984
|
-
|
|
59985
|
-
<div class="metrics-section-enter" [class.metrics-section-enter-active]="showMetricsVisualization()">
|
|
59986
|
-
<div class="metrics-section-content">
|
|
59987
|
-
@if (showMetricsVisualization()) {
|
|
59988
|
-
<div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
|
|
59989
|
-
<div class="mb-6">
|
|
59990
|
-
<h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-2">
|
|
59991
|
-
Contributing Metrics
|
|
59992
|
-
</h2>
|
|
59993
|
-
<p [ngClass]="sectionDescriptionClasses()" class="text-sm">
|
|
59994
|
-
@if (targets() === undefined && submittedAbsoluteInput() !== null) {
|
|
59995
|
-
To achieve your revenue target of over {{ formatCurrency(submittedAbsoluteInput()!) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
|
|
59996
|
-
} @else {
|
|
59997
|
-
To achieve your revenue target of {{ formatCurrency(displayedTargetRevenue()) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
|
|
59998
|
-
}
|
|
59999
|
-
</p>
|
|
60000
|
-
</div>
|
|
60001
|
-
|
|
60002
|
-
<symphiq-funnel-metrics-visualization
|
|
60003
|
-
[viewMode]="viewMode()"
|
|
60004
|
-
[calculations]="displayedMetricCalculations()"
|
|
60005
|
-
[pacingMetrics]="pacingMetrics()"
|
|
60006
|
-
(viewStageReport)="openMetricReport($event)"
|
|
60007
|
-
(viewRelatedMetricReport)="openMetricReport($event)"
|
|
60008
|
-
/>
|
|
60009
|
-
</div>
|
|
60010
|
-
}
|
|
60011
|
-
</div>
|
|
60012
|
-
</div>
|
|
60013
|
-
|
|
60014
|
-
<symphiq-sticky-submit-bar
|
|
60015
|
-
[viewMode]="viewMode()"
|
|
60016
|
-
[isValid]="isValid()"
|
|
60017
|
-
[isSubmitting]="isCalculating()"
|
|
60018
|
-
[validationMessage]="validationMessage()"
|
|
60019
|
-
[buttonText]="submitButtonText()"
|
|
60020
|
-
[showCancelButton]="calculationState() === 'input' && hasStoredResponse()"
|
|
60021
|
-
(submitClick)="handleSubmitClick()"
|
|
60022
|
-
(cancelClick)="handleCancel()"
|
|
60023
|
-
/>
|
|
60024
|
-
|
|
60025
|
-
<!-- Metric Report Modal -->
|
|
60026
|
-
<symphiq-metric-report-modal
|
|
60027
|
-
[viewMode]="viewMode()"
|
|
60028
|
-
[metricEnum]="selectedMetricEnum()"
|
|
60029
|
-
[metricData]="selectedMetricData()"
|
|
60030
|
-
[contributingMetrics]="selectedContributingMetrics()"
|
|
60031
|
-
[pacingMetrics]="pacingMetrics()"
|
|
60032
|
-
[
|
|
60033
|
-
|
|
60034
|
-
|
|
60035
|
-
|
|
59678
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
59679
|
+
<div class="space-y-8 pb-32">
|
|
59680
|
+
<symphiq-tooltip-container />
|
|
59681
|
+
<div [ngClass]="sectionCardClasses(true)" class="rounded-2xl border shadow-lg p-8"
|
|
59682
|
+
[class.cursor-pointer]="calculationState() === 'results'"
|
|
59683
|
+
[class.lg:sticky]="calculationState() === 'results'"
|
|
59684
|
+
[style.top]="calculationState() === 'results' ? '148px' : 'auto'"
|
|
59685
|
+
[class.z-30]="calculationState() === 'results'"
|
|
59686
|
+
(click)="onCardClick()">
|
|
59687
|
+
<div class="flex items-center justify-between mb-6">
|
|
59688
|
+
<h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold">
|
|
59689
|
+
@if (calculationState() === 'results') {
|
|
59690
|
+
Your {{ currentYear() }} Revenue Target
|
|
59691
|
+
} @else {
|
|
59692
|
+
Calculate Your {{ currentYear() }} Revenue Target
|
|
59693
|
+
}
|
|
59694
|
+
</h2>
|
|
59695
|
+
@if (calculationState() === 'results') {
|
|
59696
|
+
<svg
|
|
59697
|
+
class="w-6 h-6 chevron-rotate"
|
|
59698
|
+
[class.chevron-rotate-expanded]="detailsExpanded()"
|
|
59699
|
+
[ngClass]="chevronClasses()"
|
|
59700
|
+
fill="none"
|
|
59701
|
+
stroke="currentColor"
|
|
59702
|
+
viewBox="0 0 24 24">
|
|
59703
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
|
|
59704
|
+
</svg>
|
|
59705
|
+
}
|
|
59706
|
+
</div>
|
|
59707
|
+
|
|
59708
|
+
<div class="flex flex-col gap-4">
|
|
59709
|
+
<div class="grid lg:grid-cols-2 gap-4">
|
|
59710
|
+
<div class="flex flex-col gap-4">
|
|
59711
|
+
<div [ngClass]="formAreaClasses()" class="p-6 rounded-xl border-2" [class.cursor-pointer]="calculationState() === 'results'" (click)="onCardClick(); $event.stopPropagation()">
|
|
59712
|
+
<div class="flex flex-wrap gap-4 place-content-between">
|
|
59713
|
+
<div class="flex items-center gap-2">
|
|
59714
|
+
<svg class="w-4 h-4" [ngClass]="baselineIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
59715
|
+
<path 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"></path>
|
|
59716
|
+
</svg>
|
|
59717
|
+
<div>
|
|
59718
|
+
<p [ngClass]="baselineLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
59719
|
+
{{ priorYear() }} Revenue
|
|
59720
|
+
</p>
|
|
59721
|
+
<p [ngClass]="baselineValueClasses()" class="text-lg font-bold">
|
|
59722
|
+
{{ formatCurrency(priorYearRevenue()) }}
|
|
59723
|
+
</p>
|
|
59724
|
+
</div>
|
|
59725
|
+
</div>
|
|
59726
|
+
@if (currentPaceProjection() > 0) {
|
|
59727
|
+
<div class="flex items-center gap-2">
|
|
59728
|
+
<svg class="w-4 h-4" [ngClass]="projectionIconClasses()" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
59729
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
|
|
59730
|
+
</svg>
|
|
59731
|
+
<div>
|
|
59732
|
+
<div class="flex items-center gap-1">
|
|
59733
|
+
<p [ngClass]="projectionLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
59734
|
+
Current Pace Projection
|
|
59735
|
+
</p>
|
|
59736
|
+
<button
|
|
59737
|
+
type="button"
|
|
59738
|
+
[ngClass]="infoIconClasses()"
|
|
59739
|
+
class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
|
|
59740
|
+
[libSymphiqTooltip]="currentPaceProjectionTooltip"
|
|
59741
|
+
tooltipType="markdown"
|
|
59742
|
+
tooltipPosition="top"
|
|
59743
|
+
(click)="$event.stopPropagation()">
|
|
59744
|
+
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
59745
|
+
<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" />
|
|
59746
|
+
</svg>
|
|
59747
|
+
</button>
|
|
59748
|
+
</div>
|
|
59749
|
+
<p [ngClass]="projectionValueClasses()" class="text-lg font-bold">
|
|
59750
|
+
{{ formatCurrency(currentPaceProjection()) }}
|
|
59751
|
+
</p>
|
|
59752
|
+
</div>
|
|
59753
|
+
</div>
|
|
59754
|
+
}
|
|
59755
|
+
</div>
|
|
59756
|
+
|
|
59757
|
+
<div class="form-area-collapse" [class.form-area-collapse-hidden]="calculationState() === 'results'" [class.mt-6]="calculationState() !== 'results'">
|
|
59758
|
+
<div class="form-area-content">
|
|
59759
|
+
<div class="space-y-6">
|
|
59760
|
+
@if (calculationState() !== 'results') {
|
|
59761
|
+
<div class="flex gap-2">
|
|
59762
|
+
<button
|
|
59763
|
+
(click)="setInputMode('absolute')"
|
|
59764
|
+
[ngClass]="inputModeButtonClasses('absolute')"
|
|
59765
|
+
class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
|
|
59766
|
+
Absolute Amount
|
|
59767
|
+
</button>
|
|
59768
|
+
<button
|
|
59769
|
+
(click)="setInputMode('percentage')"
|
|
59770
|
+
[ngClass]="inputModeButtonClasses('percentage')"
|
|
59771
|
+
class="flex-1 py-2 px-4 rounded-lg text-sm font-semibold transition-all">
|
|
59772
|
+
% Increase
|
|
59773
|
+
</button>
|
|
59774
|
+
</div>
|
|
59775
|
+
|
|
59776
|
+
@if (inputMode() === 'absolute') {
|
|
59777
|
+
<div class="relative">
|
|
59778
|
+
<span [ngClass]="inputPrefixClasses()" class="absolute left-4 top-1/2 -translate-y-1/2 text-xl font-bold">
|
|
59779
|
+
$
|
|
59780
|
+
</span>
|
|
59781
|
+
<input
|
|
59782
|
+
#absoluteInputRef
|
|
59783
|
+
type="number"
|
|
59784
|
+
[(ngModel)]="absoluteInput"
|
|
59785
|
+
(ngModelChange)="onAbsoluteInputChange()"
|
|
59786
|
+
[ngClass]="inputClasses()"
|
|
59787
|
+
class="w-full pl-10 pr-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
|
|
59788
|
+
placeholder="0"
|
|
59789
|
+
min="0"
|
|
59790
|
+
step="1000">
|
|
59791
|
+
</div>
|
|
59792
|
+
} @else {
|
|
59793
|
+
<div class="relative">
|
|
59794
|
+
<input
|
|
59795
|
+
#percentageInputRef
|
|
59796
|
+
type="number"
|
|
59797
|
+
[(ngModel)]="percentageInput"
|
|
59798
|
+
(ngModelChange)="onPercentageInputChange()"
|
|
59799
|
+
[ngClass]="inputClasses()"
|
|
59800
|
+
class="w-full pr-10 pl-4 py-4 rounded-xl text-2xl font-bold border-2 transition-all"
|
|
59801
|
+
placeholder="0"
|
|
59802
|
+
min="0"
|
|
59803
|
+
max="1000"
|
|
59804
|
+
step="0.1">
|
|
59805
|
+
<span [ngClass]="inputSuffixClasses()" class="absolute right-4 top-1/2 -translate-y-1/2 text-xl font-bold">
|
|
59806
|
+
%
|
|
59807
|
+
</span>
|
|
59808
|
+
</div>
|
|
59809
|
+
}
|
|
59810
|
+
|
|
59811
|
+
@if (hasStoredResponse()) {
|
|
59812
|
+
<div class="flex justify-end">
|
|
59813
|
+
<button
|
|
59814
|
+
(click)="handleCancel()"
|
|
59815
|
+
[ngClass]="cancelButtonClasses()"
|
|
59816
|
+
class="px-4 py-2 rounded-lg text-sm font-semibold transition-all">
|
|
59817
|
+
Cancel
|
|
59818
|
+
</button>
|
|
59819
|
+
</div>
|
|
59820
|
+
}
|
|
59821
|
+
}
|
|
59822
|
+
</div>
|
|
59823
|
+
</div>
|
|
59824
|
+
</div>
|
|
59825
|
+
</div>
|
|
59826
|
+
|
|
59827
|
+
<div class="chart-in-column" [class.chart-in-column-active]="calculationState() === 'results' && detailsExpanded()">
|
|
59828
|
+
<div class="chart-in-column-content">
|
|
59829
|
+
<div>
|
|
59830
|
+
<p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
|
|
59831
|
+
Year-over-Year Revenue Trend
|
|
59832
|
+
</p>
|
|
59833
|
+
<div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
|
|
59834
|
+
@if (revenueChartData()) {
|
|
59835
|
+
<symphiq-area-chart
|
|
59836
|
+
[chart]="revenueChartData()!"
|
|
59837
|
+
[showAxisLabels]="true"
|
|
59838
|
+
[viewMode]="viewMode()"
|
|
59839
|
+
[currencySymbol]="'$'"
|
|
59840
|
+
[height]="'108px'"
|
|
59841
|
+
/>
|
|
59842
|
+
} @else {
|
|
59843
|
+
<div class="h-64 flex items-center justify-center">
|
|
59844
|
+
<p [ngClass]="noDataClasses()" class="text-sm">
|
|
59845
|
+
No revenue data available
|
|
59846
|
+
</p>
|
|
59847
|
+
</div>
|
|
59848
|
+
}
|
|
59849
|
+
</div>
|
|
59850
|
+
</div>
|
|
59851
|
+
</div>
|
|
59852
|
+
</div>
|
|
59853
|
+
</div>
|
|
59854
|
+
|
|
59855
|
+
<div class="calculated-card-enter order-first lg:order-last" [class.calculated-card-enter-active]="calculatedRevenue() > 0">
|
|
59856
|
+
<div class="calculated-card-content">
|
|
59857
|
+
@if (calculatedRevenue() > 0) {
|
|
59858
|
+
<div [ngClass]="calculatedValuesCardClasses()" class="p-6 rounded-xl border-2"
|
|
59859
|
+
[class.h-full]="calculationState() !== 'results' || detailsExpanded()">
|
|
59860
|
+
<div>
|
|
59861
|
+
<div class="flex items-center justify-between">
|
|
59862
|
+
<div>
|
|
59863
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
59864
|
+
{{ currentYear() }} Revenue Target
|
|
59865
|
+
</p>
|
|
59866
|
+
<p [ngClass]="calculatedValueClasses()" class="font-bold transition-all duration-300 text-lg"
|
|
59867
|
+
[class.lg:text-3xl]="calculationState() !== 'results' || detailsExpanded()">
|
|
59868
|
+
@if (calculationState() === 'results' && targets() === undefined && submittedAbsoluteInput() !== null) {
|
|
59869
|
+
> {{ formatCurrency(submittedAbsoluteInput()!) }}
|
|
59870
|
+
} @else {
|
|
59871
|
+
{{ formatCurrency(displayedTargetRevenue()) }}
|
|
59872
|
+
}
|
|
59873
|
+
</p>
|
|
59874
|
+
</div>
|
|
59875
|
+
@if (calculationState() === 'results' && targets() === undefined) {
|
|
59876
|
+
<button
|
|
59877
|
+
(click)="handleAdjustTarget(); $event.stopPropagation()"
|
|
59878
|
+
[ngClass]="secondaryButtonClasses()"
|
|
59879
|
+
class="px-4 py-2 rounded-lg text-sm font-semibold transition-all whitespace-nowrap">
|
|
59880
|
+
Adjust Revenue Target
|
|
59881
|
+
</button>
|
|
59882
|
+
}
|
|
59883
|
+
</div>
|
|
59884
|
+
|
|
59885
|
+
<div class="details-collapse" [class.details-collapse-expanded]="calculationState() !== 'results' || detailsExpanded()">
|
|
59886
|
+
<div class="details-collapse-content">
|
|
59887
|
+
<div class="relative pt-6 mt-6">
|
|
59888
|
+
<div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
|
|
59889
|
+
<div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
|
|
59890
|
+
<span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
|
|
59891
|
+
vs. {{ priorYear() }}
|
|
59892
|
+
</span>
|
|
59893
|
+
<div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
|
|
59894
|
+
</div>
|
|
59895
|
+
<div class="grid grid-cols-2 gap-4 pt-2">
|
|
59896
|
+
<div>
|
|
59897
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
59898
|
+
Increase Amount
|
|
59899
|
+
</p>
|
|
59900
|
+
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
59901
|
+
@if (isTargetValid()) {
|
|
59902
|
+
{{ formatCurrency(animatedIncreaseAmount()) }}
|
|
59903
|
+
} @else {
|
|
59904
|
+
--
|
|
59905
|
+
}
|
|
59906
|
+
</p>
|
|
59907
|
+
</div>
|
|
59908
|
+
<div>
|
|
59909
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
59910
|
+
% Growth
|
|
59911
|
+
</p>
|
|
59912
|
+
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
59913
|
+
@if (isTargetValid()) {
|
|
59914
|
+
+{{ formatPercentage(animatedPercentageGrowth(), 1) }}
|
|
59915
|
+
} @else {
|
|
59916
|
+
--
|
|
59917
|
+
}
|
|
59918
|
+
</p>
|
|
59919
|
+
</div>
|
|
59920
|
+
</div>
|
|
59921
|
+
</div>
|
|
59922
|
+
|
|
59923
|
+
@if (currentPaceProjection() > 0) {
|
|
59924
|
+
<div class="relative pt-6 mt-6">
|
|
59925
|
+
<div class="absolute top-0 left-0 right-0 flex items-center -translate-y-1/2">
|
|
59926
|
+
<div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
|
|
59927
|
+
<span [ngClass]="dividerLabelClasses()" class="px-3 py-1 rounded-full text-xs font-semibold whitespace-nowrap">
|
|
59928
|
+
{{ currentYear() }} YTD Gap
|
|
59929
|
+
</span>
|
|
59930
|
+
<div class="flex-1 h-px" [ngClass]="dividerBorderClasses()"></div>
|
|
59931
|
+
</div>
|
|
59932
|
+
<div class="grid grid-cols-2 gap-4 pt-2">
|
|
59933
|
+
<div>
|
|
59934
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider mb-1">
|
|
59935
|
+
Gap to Close
|
|
59936
|
+
</p>
|
|
59937
|
+
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
59938
|
+
@if (isTargetValid()) {
|
|
59939
|
+
{{ formatCurrency(animatedGapAmount()) }}
|
|
59940
|
+
} @else {
|
|
59941
|
+
--
|
|
59942
|
+
}
|
|
59943
|
+
</p>
|
|
59944
|
+
</div>
|
|
59945
|
+
<div>
|
|
59946
|
+
<div class="flex items-center gap-1 mb-1">
|
|
59947
|
+
<p [ngClass]="calculatedLabelClasses()" class="text-xs font-medium uppercase tracking-wider">
|
|
59948
|
+
Additional Growth Needed
|
|
59949
|
+
</p>
|
|
59950
|
+
<button
|
|
59951
|
+
type="button"
|
|
59952
|
+
[ngClass]="infoIconClasses()"
|
|
59953
|
+
class="flex-shrink-0 w-4 h-4 rounded-full inline-flex items-center justify-center transition-colors"
|
|
59954
|
+
[libSymphiqTooltip]="additionalGrowthTooltip"
|
|
59955
|
+
tooltipType="markdown"
|
|
59956
|
+
tooltipPosition="top"
|
|
59957
|
+
(click)="$event.stopPropagation()">
|
|
59958
|
+
<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
59959
|
+
<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" />
|
|
59960
|
+
</svg>
|
|
59961
|
+
</button>
|
|
59962
|
+
</div>
|
|
59963
|
+
<p [ngClass]="calculatedSecondaryClasses()" class="text-xl font-bold">
|
|
59964
|
+
@if (isTargetValid()) {
|
|
59965
|
+
{{ gapToClose().amount > 0 ? '+' : '' }}{{ formatPercentage(animatedGapPercentage(), 1) }}
|
|
59966
|
+
} @else {
|
|
59967
|
+
--
|
|
59968
|
+
}
|
|
59969
|
+
</p>
|
|
59970
|
+
</div>
|
|
59971
|
+
</div>
|
|
59972
|
+
</div>
|
|
59973
|
+
}
|
|
59974
|
+
|
|
59975
|
+
</div>
|
|
59976
|
+
</div>
|
|
59977
|
+
</div>
|
|
59978
|
+
</div>
|
|
59979
|
+
}
|
|
59980
|
+
</div>
|
|
59981
|
+
</div>
|
|
59982
|
+
</div>
|
|
59983
|
+
|
|
59984
|
+
@if (calculationState() !== 'results') {
|
|
59985
|
+
<div class="w-full">
|
|
59986
|
+
<p [ngClass]="chartTitleClasses()" class="text-sm font-semibold mb-3">
|
|
59987
|
+
Year-over-Year Revenue Trend
|
|
59988
|
+
</p>
|
|
59989
|
+
<div [ngClass]="chartContainerClasses()" class="rounded-xl border p-4">
|
|
59990
|
+
@if (revenueChartData()) {
|
|
59991
|
+
<symphiq-area-chart
|
|
59992
|
+
[chart]="revenueChartData()!"
|
|
59993
|
+
[showAxisLabels]="true"
|
|
59994
|
+
[viewMode]="viewMode()"
|
|
59995
|
+
[currencySymbol]="'$'"
|
|
59996
|
+
[height]="'200px'"
|
|
59997
|
+
/>
|
|
59998
|
+
} @else {
|
|
59999
|
+
<div class="h-64 flex items-center justify-center">
|
|
60000
|
+
<p [ngClass]="noDataClasses()" class="text-sm">
|
|
60001
|
+
No revenue data available
|
|
60002
|
+
</p>
|
|
60003
|
+
</div>
|
|
60004
|
+
}
|
|
60005
|
+
</div>
|
|
60006
|
+
</div>
|
|
60007
|
+
}
|
|
60008
|
+
</div>
|
|
60009
|
+
</div>
|
|
60010
|
+
|
|
60011
|
+
<div class="metrics-section-enter" [class.metrics-section-enter-active]="showMetricsVisualization()">
|
|
60012
|
+
<div class="metrics-section-content">
|
|
60013
|
+
@if (showMetricsVisualization()) {
|
|
60014
|
+
<div [ngClass]="sectionCardClasses()" class="rounded-2xl border shadow-lg p-8">
|
|
60015
|
+
<div class="mb-6">
|
|
60016
|
+
<h2 [ngClass]="sectionTitleClasses()" class="text-2xl font-bold mb-2">
|
|
60017
|
+
Contributing Metrics
|
|
60018
|
+
</h2>
|
|
60019
|
+
<p [ngClass]="sectionDescriptionClasses()" class="text-sm">
|
|
60020
|
+
@if (targets() === undefined && submittedAbsoluteInput() !== null) {
|
|
60021
|
+
To achieve your revenue target of over {{ formatCurrency(submittedAbsoluteInput()!) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
|
|
60022
|
+
} @else {
|
|
60023
|
+
To achieve your revenue target of {{ formatCurrency(displayedTargetRevenue()) }}, the following metrics need to improve by these amounts. These improvements compound through your funnel to drive revenue growth.
|
|
60024
|
+
}
|
|
60025
|
+
</p>
|
|
60026
|
+
</div>
|
|
60027
|
+
|
|
60028
|
+
<symphiq-funnel-metrics-visualization
|
|
60029
|
+
[viewMode]="viewMode()"
|
|
60030
|
+
[calculations]="displayedMetricCalculations()"
|
|
60031
|
+
[pacingMetrics]="pacingMetrics()"
|
|
60032
|
+
(viewStageReport)="openMetricReport($event)"
|
|
60033
|
+
(viewRelatedMetricReport)="openMetricReport($event)"
|
|
60034
|
+
/>
|
|
60035
|
+
</div>
|
|
60036
|
+
}
|
|
60037
|
+
</div>
|
|
60038
|
+
</div>
|
|
60039
|
+
|
|
60040
|
+
<symphiq-sticky-submit-bar
|
|
60041
|
+
[viewMode]="viewMode()"
|
|
60042
|
+
[isValid]="isValid()"
|
|
60043
|
+
[isSubmitting]="isCalculating()"
|
|
60044
|
+
[validationMessage]="validationMessage()"
|
|
60045
|
+
[buttonText]="submitButtonText()"
|
|
60046
|
+
[showCancelButton]="calculationState() === 'input' && hasStoredResponse()"
|
|
60047
|
+
(submitClick)="handleSubmitClick()"
|
|
60048
|
+
(cancelClick)="handleCancel()"
|
|
60049
|
+
/>
|
|
60050
|
+
|
|
60051
|
+
<!-- Metric Report Modal -->
|
|
60052
|
+
<symphiq-metric-report-modal
|
|
60053
|
+
[viewMode]="viewMode()"
|
|
60054
|
+
[metricEnum]="selectedMetricEnum()"
|
|
60055
|
+
[metricData]="selectedMetricData()"
|
|
60056
|
+
[contributingMetrics]="selectedContributingMetrics()"
|
|
60057
|
+
[pacingMetrics]="pacingMetrics()"
|
|
60058
|
+
[trendChartData]="revenueChartData()"
|
|
60059
|
+
[isOpen]="isMetricReportOpen()"
|
|
60060
|
+
(closed)="closeMetricReport()"
|
|
60061
|
+
/>
|
|
60062
|
+
</div>
|
|
60036
60063
|
`, styles: [".calculated-card-enter{display:grid;grid-template-rows:0fr;transition:grid-template-rows .3s ease-out}.calculated-card-enter-active{grid-template-rows:1fr}.calculated-card-content{overflow:hidden}.form-area-collapse{display:grid;grid-template-rows:1fr;transition:grid-template-rows .4s ease-out}.form-area-collapse-hidden{grid-template-rows:0fr}.form-area-content{overflow:hidden}.chart-section-collapse{display:grid;grid-template-rows:1fr;transition:grid-template-rows .4s ease-out}.chart-section-collapse-hidden{grid-template-rows:0fr}.chart-section-content{overflow:hidden}.chart-in-column{display:grid;grid-template-rows:0fr;transition:grid-template-rows .4s ease-out}.chart-in-column-active{grid-template-rows:1fr}.chart-in-column-content{overflow:hidden}.metrics-section-enter{display:grid;grid-template-rows:0fr;transition:grid-template-rows .5s ease-out}.metrics-section-enter-active{grid-template-rows:1fr}.metrics-section-content{overflow:hidden}.details-collapse{display:grid;grid-template-rows:0fr;transition:grid-template-rows .4s ease-out}.details-collapse-expanded{grid-template-rows:1fr}.details-collapse-content{overflow:hidden}.chevron-rotate{transition:transform .3s ease-out}.chevron-rotate-expanded{transform:rotate(180deg)}\n"] }]
|
|
60037
60064
|
}], () => [], { absoluteInputRef: [{
|
|
60038
60065
|
type: ViewChild,
|
|
@@ -60041,7 +60068,7 @@ class InitialTargetSettingComponent {
|
|
|
60041
60068
|
type: ViewChild,
|
|
60042
60069
|
args: ['percentageInputRef']
|
|
60043
60070
|
}], 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 }] }], reverseCalculationResponse: [{ type: i0.Input, args: [{ isSignal: true, alias: "reverseCalculationResponse", required: false }] }], targets: [{ type: i0.Input, args: [{ isSignal: true, alias: "targets", required: false }] }], targetsCreated: [{ type: i0.Output, args: ["targetsCreated"] }], calculateRevenueRequest: [{ type: i0.Output, args: ["calculateRevenueRequest"] }] }); })();
|
|
60044
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber:
|
|
60071
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(InitialTargetSettingComponent, { className: "InitialTargetSettingComponent", filePath: "lib/components/revenue-calculator-dashboard/initial-target-setting.component.ts", lineNumber: 536 }); })();
|
|
60045
60072
|
|
|
60046
60073
|
function IndeterminateSpinnerComponent_For_5_Template(rf, ctx) { if (rf & 1) {
|
|
60047
60074
|
i0.ɵɵelement(0, "div", 5);
|