bways-report 0.1.0
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/LICENSE +26 -0
- package/README.md +477 -0
- package/esm2022/bways-report.mjs +5 -0
- package/esm2022/lib/core/errors/index.mjs +2 -0
- package/esm2022/lib/core/errors/reporting-errors.mjs +65 -0
- package/esm2022/lib/core/index.mjs +8 -0
- package/esm2022/lib/core/models/component-event.model.mjs +8 -0
- package/esm2022/lib/core/models/index.mjs +5 -0
- package/esm2022/lib/core/models/report-component.model.mjs +10 -0
- package/esm2022/lib/core/models/report-datasource.model.mjs +9 -0
- package/esm2022/lib/core/models/report-definition.model.mjs +13 -0
- package/esm2022/lib/core/models/report-grid.model.mjs +10 -0
- package/esm2022/lib/core/models/report-layout.model.mjs +9 -0
- package/esm2022/lib/core/models/report-parameter.model.mjs +9 -0
- package/esm2022/lib/core/models/validation.model.mjs +8 -0
- package/esm2022/lib/core/registry/component-category.mjs +8 -0
- package/esm2022/lib/core/registry/component-registry.mjs +90 -0
- package/esm2022/lib/core/registry/index.mjs +2 -0
- package/esm2022/lib/core/registry/property-definition.model.mjs +10 -0
- package/esm2022/lib/core/services/dynamic-form-builder.service.mjs +55 -0
- package/esm2022/lib/core/services/index.mjs +3 -0
- package/esm2022/lib/core/services/report-session-context.service.mjs +314 -0
- package/esm2022/lib/core/tokens/index.mjs +3 -0
- package/esm2022/lib/core/tokens/reporting-config.token.mjs +26 -0
- package/esm2022/lib/core/tokens/session-context.token.mjs +18 -0
- package/esm2022/lib/core/utilities/id-generator.mjs +17 -0
- package/esm2022/lib/core/utilities/index.mjs +3 -0
- package/esm2022/lib/core/utilities/schema-migration.mjs +38 -0
- package/esm2022/lib/core/utils/identifier-humanizer.mjs +88 -0
- package/esm2022/lib/core/validation/index.mjs +2 -0
- package/esm2022/lib/core/validation/validation-factory.mjs +70 -0
- package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +107 -0
- package/esm2022/lib/data-access/adapters/http-schema-discovery.adapter.mjs +119 -0
- package/esm2022/lib/data-access/adapters/index.mjs +3 -0
- package/esm2022/lib/data-access/contracts/data-source.contract.mjs +28 -0
- package/esm2022/lib/data-access/contracts/index.mjs +7 -0
- package/esm2022/lib/data-access/contracts/lookup.contract.mjs +6 -0
- package/esm2022/lib/data-access/contracts/master-data.provider.mjs +24 -0
- package/esm2022/lib/data-access/contracts/report-persistence.contract.mjs +25 -0
- package/esm2022/lib/data-access/contracts/schema-discovery.contract.mjs +7 -0
- package/esm2022/lib/data-access/contracts/translation.contract.mjs +9 -0
- package/esm2022/lib/data-access/index.mjs +3 -0
- package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +542 -0
- package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +843 -0
- package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +556 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +845 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +185 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +452 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +350 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +175 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +137 -0
- package/esm2022/lib/features/designer/components/property-editor/property-editor.component.mjs +608 -0
- package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +225 -0
- package/esm2022/lib/features/designer/designer.component.mjs +285 -0
- package/esm2022/lib/features/designer/index.mjs +7 -0
- package/esm2022/lib/features/designer/services/designer-state.service.mjs +310 -0
- package/esm2022/lib/features/designer/services/index.mjs +2 -0
- package/esm2022/lib/features/designer/utilities/canvas-layout.util.mjs +124 -0
- package/esm2022/lib/features/export/index.mjs +2 -0
- package/esm2022/lib/features/export/models/export.models.mjs +2 -0
- package/esm2022/lib/features/export/services/report-export.service.mjs +107 -0
- package/esm2022/lib/features/index.mjs +6 -0
- package/esm2022/lib/features/persistence/index.mjs +2 -0
- package/esm2022/lib/features/persistence/services/index.mjs +4 -0
- package/esm2022/lib/features/persistence/services/report-store.service.mjs +183 -0
- package/esm2022/lib/features/persistence/services/report-versioning.service.mjs +81 -0
- package/esm2022/lib/features/persistence/services/schema-validator.service.mjs +102 -0
- package/esm2022/lib/features/routing/components/routed-report-designer.component.mjs +156 -0
- package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +163 -0
- package/esm2022/lib/features/routing/index.mjs +6 -0
- package/esm2022/lib/features/routing/models/report-route.models.mjs +2 -0
- package/esm2022/lib/features/routing/report-routes.mjs +49 -0
- package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +22 -0
- package/esm2022/lib/features/routing/services/report-menu.service.mjs +77 -0
- package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +222 -0
- package/esm2022/lib/features/runtime/index.mjs +4 -0
- package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +409 -0
- package/esm2022/lib/features/runtime/report-runtime.component.mjs +147 -0
- package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +88 -0
- package/esm2022/lib/primitives/components/chart-bridge/report-chart-bridge.component.mjs +361 -0
- package/esm2022/lib/primitives/components/checkbox/rpt-checkbox.component.mjs +86 -0
- package/esm2022/lib/primitives/components/date/rpt-date.component.mjs +91 -0
- package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +204 -0
- package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +476 -0
- package/esm2022/lib/primitives/components/index.mjs +10 -0
- package/esm2022/lib/primitives/components/input/rpt-input.component.mjs +88 -0
- package/esm2022/lib/primitives/components/kpi-card/rpt-kpi-card.component.mjs +197 -0
- package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +110 -0
- package/esm2022/lib/primitives/index.mjs +3 -0
- package/esm2022/lib/primitives/register-builtins.mjs +328 -0
- package/esm2022/lib/provide-reporting.mjs +92 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/bways-report.mjs +10360 -0
- package/fesm2022/bways-report.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/core/errors/index.d.ts +1 -0
- package/lib/core/errors/reporting-errors.d.ts +42 -0
- package/lib/core/index.d.ts +7 -0
- package/lib/core/models/component-event.model.d.ts +37 -0
- package/lib/core/models/index.d.ts +11 -0
- package/lib/core/models/report-component.model.d.ts +95 -0
- package/lib/core/models/report-datasource.model.d.ts +39 -0
- package/lib/core/models/report-definition.model.d.ts +100 -0
- package/lib/core/models/report-grid.model.d.ts +73 -0
- package/lib/core/models/report-layout.model.d.ts +43 -0
- package/lib/core/models/report-parameter.model.d.ts +22 -0
- package/lib/core/models/validation.model.d.ts +30 -0
- package/lib/core/registry/component-category.d.ts +16 -0
- package/lib/core/registry/component-registry.d.ts +101 -0
- package/lib/core/registry/index.d.ts +4 -0
- package/lib/core/registry/property-definition.model.d.ts +38 -0
- package/lib/core/services/dynamic-form-builder.service.d.ts +30 -0
- package/lib/core/services/index.d.ts +3 -0
- package/lib/core/services/report-session-context.service.d.ts +87 -0
- package/lib/core/tokens/index.d.ts +4 -0
- package/lib/core/tokens/reporting-config.token.d.ts +42 -0
- package/lib/core/tokens/session-context.token.d.ts +36 -0
- package/lib/core/utilities/id-generator.d.ts +9 -0
- package/lib/core/utilities/index.d.ts +3 -0
- package/lib/core/utilities/schema-migration.d.ts +10 -0
- package/lib/core/utils/identifier-humanizer.d.ts +22 -0
- package/lib/core/validation/index.d.ts +1 -0
- package/lib/core/validation/validation-factory.d.ts +31 -0
- package/lib/data-access/adapters/http-lookup.adapter.d.ts +19 -0
- package/lib/data-access/adapters/http-schema-discovery.adapter.d.ts +20 -0
- package/lib/data-access/adapters/index.d.ts +2 -0
- package/lib/data-access/contracts/data-source.contract.d.ts +37 -0
- package/lib/data-access/contracts/index.d.ts +9 -0
- package/lib/data-access/contracts/lookup.contract.d.ts +32 -0
- package/lib/data-access/contracts/master-data.provider.d.ts +54 -0
- package/lib/data-access/contracts/report-persistence.contract.d.ts +36 -0
- package/lib/data-access/contracts/schema-discovery.contract.d.ts +52 -0
- package/lib/data-access/contracts/translation.contract.d.ts +16 -0
- package/lib/data-access/index.d.ts +2 -0
- package/lib/features/designer/components/component-palette/component-palette.component.d.ts +39 -0
- package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +42 -0
- package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +36 -0
- package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +68 -0
- package/lib/features/designer/components/property-editor/property-editor-general.component.d.ts +20 -0
- package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +20 -0
- package/lib/features/designer/components/property-editor/property-editor-layout.component.d.ts +18 -0
- package/lib/features/designer/components/property-editor/property-editor-report.component.d.ts +15 -0
- package/lib/features/designer/components/property-editor/property-editor-validation.component.d.ts +12 -0
- package/lib/features/designer/components/property-editor/property-editor.component.d.ts +44 -0
- package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +18 -0
- package/lib/features/designer/designer.component.d.ts +36 -0
- package/lib/features/designer/index.d.ts +7 -0
- package/lib/features/designer/services/designer-state.service.d.ts +103 -0
- package/lib/features/designer/services/index.d.ts +2 -0
- package/lib/features/designer/utilities/canvas-layout.util.d.ts +55 -0
- package/lib/features/export/index.d.ts +2 -0
- package/lib/features/export/models/export.models.d.ts +16 -0
- package/lib/features/export/services/report-export.service.d.ts +27 -0
- package/lib/features/index.d.ts +5 -0
- package/lib/features/persistence/index.d.ts +1 -0
- package/lib/features/persistence/services/index.d.ts +5 -0
- package/lib/features/persistence/services/report-store.service.d.ts +53 -0
- package/lib/features/persistence/services/report-versioning.service.d.ts +29 -0
- package/lib/features/persistence/services/schema-validator.service.d.ts +34 -0
- package/lib/features/routing/components/routed-report-designer.component.d.ts +18 -0
- package/lib/features/routing/components/routed-report-runtime.component.d.ts +18 -0
- package/lib/features/routing/index.d.ts +6 -0
- package/lib/features/routing/models/report-route.models.d.ts +41 -0
- package/lib/features/routing/report-routes.d.ts +16 -0
- package/lib/features/routing/resolvers/report.resolver.d.ts +7 -0
- package/lib/features/routing/services/report-menu.service.d.ts +30 -0
- package/lib/features/runtime/dynamic-renderer.component.d.ts +30 -0
- package/lib/features/runtime/index.d.ts +3 -0
- package/lib/features/runtime/report-grid-bridge.component.d.ts +94 -0
- package/lib/features/runtime/report-runtime.component.d.ts +26 -0
- package/lib/primitives/components/button/rpt-button.component.d.ts +19 -0
- package/lib/primitives/components/chart-bridge/report-chart-bridge.component.d.ts +45 -0
- package/lib/primitives/components/checkbox/rpt-checkbox.component.d.ts +14 -0
- package/lib/primitives/components/date/rpt-date.component.d.ts +17 -0
- package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +32 -0
- package/lib/primitives/components/icon/rpt-icon.component.d.ts +41 -0
- package/lib/primitives/components/index.d.ts +12 -0
- package/lib/primitives/components/input/rpt-input.component.d.ts +16 -0
- package/lib/primitives/components/kpi-card/rpt-kpi-card.component.d.ts +43 -0
- package/lib/primitives/components/number/rpt-number.component.d.ts +20 -0
- package/lib/primitives/index.d.ts +2 -0
- package/lib/primitives/register-builtins.d.ts +11 -0
- package/lib/provide-reporting.d.ts +75 -0
- package/package.json +55 -0
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, inject, input, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { CHART_COMPONENT } from '../../../core/tokens/reporting-config.token';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
export class ReportChartBridgeComponent {
|
|
7
|
+
hostChartComponent = inject(CHART_COMPONENT, { optional: true });
|
|
8
|
+
definition = input();
|
|
9
|
+
customData = input(undefined, { alias: 'data' });
|
|
10
|
+
customChartType = input(undefined, { alias: 'chartType' });
|
|
11
|
+
customTitle = input(undefined, { alias: 'title' });
|
|
12
|
+
customOptions = input({}, { alias: 'options' });
|
|
13
|
+
defaultColors = [
|
|
14
|
+
'#2563eb',
|
|
15
|
+
'#10b981',
|
|
16
|
+
'#f59e0b',
|
|
17
|
+
'#ef4444',
|
|
18
|
+
'#8b5cf6',
|
|
19
|
+
'#06b6d4',
|
|
20
|
+
'#ec4899'
|
|
21
|
+
];
|
|
22
|
+
title = computed(() => {
|
|
23
|
+
return (this.customTitle() ??
|
|
24
|
+
this.definition()?.properties?.['title'] ??
|
|
25
|
+
this.definition()?.label ??
|
|
26
|
+
'Chart');
|
|
27
|
+
});
|
|
28
|
+
chartType = computed(() => {
|
|
29
|
+
return (this.customChartType() ??
|
|
30
|
+
this.definition()?.properties?.['chartType'] ??
|
|
31
|
+
'bar');
|
|
32
|
+
});
|
|
33
|
+
data = computed(() => {
|
|
34
|
+
if (this.customData() && this.customData().length > 0)
|
|
35
|
+
return this.customData();
|
|
36
|
+
const configData = this.definition()?.properties?.['data'];
|
|
37
|
+
return configData || [];
|
|
38
|
+
});
|
|
39
|
+
options = computed(() => {
|
|
40
|
+
return {
|
|
41
|
+
...(this.definition()?.properties || {}),
|
|
42
|
+
...this.customOptions()
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
maxValue = computed(() => {
|
|
46
|
+
const items = this.data();
|
|
47
|
+
if (items.length === 0)
|
|
48
|
+
return 1;
|
|
49
|
+
return Math.max(...items.map((d) => d.value), 1);
|
|
50
|
+
});
|
|
51
|
+
totalValue = computed(() => {
|
|
52
|
+
return this.data().reduce((acc, curr) => acc + curr.value, 0);
|
|
53
|
+
});
|
|
54
|
+
getBarPercentage(value) {
|
|
55
|
+
const max = this.maxValue();
|
|
56
|
+
return Math.round((value / max) * 100);
|
|
57
|
+
}
|
|
58
|
+
donutSegments = computed(() => {
|
|
59
|
+
const items = this.data();
|
|
60
|
+
const total = this.totalValue();
|
|
61
|
+
if (total === 0)
|
|
62
|
+
return [];
|
|
63
|
+
const circumference = 2 * Math.PI * 60; // radius = 60 => ~376.99
|
|
64
|
+
let accumulated = 0;
|
|
65
|
+
return items.map((item, idx) => {
|
|
66
|
+
const ratio = item.value / total;
|
|
67
|
+
const strokeLength = ratio * circumference;
|
|
68
|
+
const dashOffset = -(accumulated * circumference);
|
|
69
|
+
accumulated += ratio;
|
|
70
|
+
return {
|
|
71
|
+
label: item.label,
|
|
72
|
+
color: item.color || this.defaultColors[idx % this.defaultColors.length],
|
|
73
|
+
dashArray: `${strokeLength} ${circumference}`,
|
|
74
|
+
dashOffset
|
|
75
|
+
};
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
linePoints = computed(() => {
|
|
79
|
+
const items = this.data();
|
|
80
|
+
if (items.length === 0)
|
|
81
|
+
return { linePath: '', areaPath: '', points: [] };
|
|
82
|
+
const max = this.maxValue();
|
|
83
|
+
const width = 400;
|
|
84
|
+
const height = 140;
|
|
85
|
+
const padding = 20;
|
|
86
|
+
const usableWidth = width - padding * 2;
|
|
87
|
+
const usableHeight = height - padding * 2;
|
|
88
|
+
const step = items.length > 1 ? usableWidth / (items.length - 1) : 0;
|
|
89
|
+
const pts = items.map((item, idx) => {
|
|
90
|
+
const x = padding + idx * step;
|
|
91
|
+
const y = height - padding - (item.value / max) * usableHeight;
|
|
92
|
+
return { x, y, label: item.label, value: item.value };
|
|
93
|
+
});
|
|
94
|
+
const linePath = pts.reduce((acc, pt, i) => {
|
|
95
|
+
return i === 0 ? `M ${pt.x} ${pt.y}` : `${acc} L ${pt.x} ${pt.y}`;
|
|
96
|
+
}, '');
|
|
97
|
+
const firstPt = pts[0];
|
|
98
|
+
const lastPt = pts[pts.length - 1];
|
|
99
|
+
const areaPath = `${linePath} L ${lastPt.x} ${height - padding} L ${firstPt.x} ${height - padding} Z`;
|
|
100
|
+
return { linePath, areaPath, points: pts };
|
|
101
|
+
});
|
|
102
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportChartBridgeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
103
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ReportChartBridgeComponent, isStandalone: true, selector: "rpt-chart-bridge", inputs: { definition: { classPropertyName: "definition", publicName: "definition", isSignal: true, isRequired: false, transformFunction: null }, customData: { classPropertyName: "customData", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, customChartType: { classPropertyName: "customChartType", publicName: "chartType", isSignal: true, isRequired: false, transformFunction: null }, customTitle: { classPropertyName: "customTitle", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, customOptions: { classPropertyName: "customOptions", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
104
|
+
<div class="rpt-chart-bridge-container">
|
|
105
|
+
@if (hostChartComponent) {
|
|
106
|
+
<ng-container
|
|
107
|
+
*ngComponentOutlet="
|
|
108
|
+
hostChartComponent;
|
|
109
|
+
inputs: {
|
|
110
|
+
data: data(),
|
|
111
|
+
chartType: chartType(),
|
|
112
|
+
title: title(),
|
|
113
|
+
options: options()
|
|
114
|
+
}
|
|
115
|
+
"
|
|
116
|
+
/>
|
|
117
|
+
} @else {
|
|
118
|
+
<!-- Built-in fallback SVG/CSS chart -->
|
|
119
|
+
<div class="rpt-chart-fallback-card">
|
|
120
|
+
<div class="rpt-chart-fallback-header">
|
|
121
|
+
<h3 class="rpt-chart-title">{{ title() }}</h3>
|
|
122
|
+
<span class="rpt-chart-badge">{{ chartType() | uppercase }}</span>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<div class="rpt-chart-canvas-area">
|
|
126
|
+
@if (data().length === 0) {
|
|
127
|
+
<div class="rpt-chart-empty">No chart data available</div>
|
|
128
|
+
} @else if (chartType() === 'bar') {
|
|
129
|
+
<!-- Vertical Bar Chart -->
|
|
130
|
+
<div class="rpt-bar-chart">
|
|
131
|
+
@for (item of data(); track item.label) {
|
|
132
|
+
<div class="rpt-bar-column">
|
|
133
|
+
<div class="rpt-bar-track">
|
|
134
|
+
<div
|
|
135
|
+
class="rpt-bar-fill"
|
|
136
|
+
[style.height.%]="getBarPercentage(item.value)"
|
|
137
|
+
[style.background-color]="item.color || defaultColors[$index % defaultColors.length]"
|
|
138
|
+
[title]="item.label + ': ' + item.value"
|
|
139
|
+
>
|
|
140
|
+
<span class="rpt-bar-tooltip">{{ item.value }}</span>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
<span class="rpt-bar-label" [title]="item.label">{{ item.label }}</span>
|
|
144
|
+
</div>
|
|
145
|
+
}
|
|
146
|
+
</div>
|
|
147
|
+
} @else if (chartType() === 'donut') {
|
|
148
|
+
<!-- SVG Donut Chart -->
|
|
149
|
+
<div class="rpt-donut-chart-container">
|
|
150
|
+
<svg class="rpt-donut-svg" viewBox="0 0 160 160">
|
|
151
|
+
@for (segment of donutSegments(); track segment.label) {
|
|
152
|
+
<circle
|
|
153
|
+
cx="80"
|
|
154
|
+
cy="80"
|
|
155
|
+
r="60"
|
|
156
|
+
fill="transparent"
|
|
157
|
+
[attr.stroke]="segment.color"
|
|
158
|
+
stroke-width="24"
|
|
159
|
+
[attr.stroke-dasharray]="segment.dashArray"
|
|
160
|
+
[attr.stroke-dashoffset]="segment.dashOffset"
|
|
161
|
+
/>
|
|
162
|
+
}
|
|
163
|
+
<text x="80" y="76" text-anchor="middle" class="rpt-donut-total-val">
|
|
164
|
+
{{ totalValue() }}
|
|
165
|
+
</text>
|
|
166
|
+
<text x="80" y="92" text-anchor="middle" class="rpt-donut-total-lbl">
|
|
167
|
+
Total
|
|
168
|
+
</text>
|
|
169
|
+
</svg>
|
|
170
|
+
|
|
171
|
+
<div class="rpt-chart-legend">
|
|
172
|
+
@for (item of data(); track item.label) {
|
|
173
|
+
<div class="rpt-legend-item">
|
|
174
|
+
<span
|
|
175
|
+
class="rpt-legend-dot"
|
|
176
|
+
[style.background-color]="item.color || defaultColors[$index % defaultColors.length]"
|
|
177
|
+
></span>
|
|
178
|
+
<span class="rpt-legend-label">{{ item.label }}</span>
|
|
179
|
+
<span class="rpt-legend-value">{{ item.value }}</span>
|
|
180
|
+
</div>
|
|
181
|
+
}
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
} @else {
|
|
185
|
+
<!-- SVG Line / Area Chart -->
|
|
186
|
+
<div class="rpt-line-chart-container">
|
|
187
|
+
<svg class="rpt-line-svg" viewBox="0 0 400 160" preserveAspectRatio="none">
|
|
188
|
+
<defs>
|
|
189
|
+
<linearGradient id="rptLineGrad" x1="0" y1="0" x2="0" y2="1">
|
|
190
|
+
<stop offset="0%" stop-color="var(--rpt-primary, #2563eb)" stop-opacity="0.3" />
|
|
191
|
+
<stop offset="100%" stop-color="var(--rpt-primary, #2563eb)" stop-opacity="0.0" />
|
|
192
|
+
</linearGradient>
|
|
193
|
+
</defs>
|
|
194
|
+
@if (linePoints().areaPath) {
|
|
195
|
+
<path [attr.d]="linePoints().areaPath" fill="url(#rptLineGrad)" />
|
|
196
|
+
}
|
|
197
|
+
@if (linePoints().linePath) {
|
|
198
|
+
<path
|
|
199
|
+
[attr.d]="linePoints().linePath"
|
|
200
|
+
fill="none"
|
|
201
|
+
stroke="var(--rpt-primary, #2563eb)"
|
|
202
|
+
stroke-width="3"
|
|
203
|
+
stroke-linecap="round"
|
|
204
|
+
stroke-linejoin="round"
|
|
205
|
+
/>
|
|
206
|
+
}
|
|
207
|
+
@for (pt of linePoints().points; track pt.label) {
|
|
208
|
+
<circle
|
|
209
|
+
[attr.cx]="pt.x"
|
|
210
|
+
[attr.cy]="pt.y"
|
|
211
|
+
r="4"
|
|
212
|
+
fill="#ffffff"
|
|
213
|
+
stroke="var(--rpt-primary, #2563eb)"
|
|
214
|
+
stroke-width="2"
|
|
215
|
+
/>
|
|
216
|
+
}
|
|
217
|
+
</svg>
|
|
218
|
+
<div class="rpt-line-labels">
|
|
219
|
+
@for (item of data(); track item.label) {
|
|
220
|
+
<span class="rpt-line-label">{{ item.label }}</span>
|
|
221
|
+
}
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
}
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
}
|
|
228
|
+
</div>
|
|
229
|
+
`, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box}.rpt-chart-bridge-container{width:100%}.rpt-chart-fallback-card{background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-lg, 12px);padding:var(--rpt-space-md, 20px);box-shadow:0 1px 3px #0000000d;display:flex;flex-direction:column;height:100%;box-sizing:border-box;gap:16px}.rpt-chart-fallback-header{display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.rpt-chart-title{font-size:1rem;font-weight:600;color:var(--rpt-text-color, #0f172a);margin:0}.rpt-chart-badge{font-size:.6875rem;font-weight:700;padding:2px 8px;border-radius:9999px;background:var(--rpt-bg-subtle, #f1f5f9);color:var(--rpt-text-muted, #64748b);letter-spacing:.05em}.rpt-chart-canvas-area{min-height:140px;height:100%;flex:1;display:flex;align-items:center;justify-content:center}.rpt-chart-empty{color:var(--rpt-text-muted, #94a3b8);font-size:.875rem}.rpt-bar-chart{display:flex;align-items:flex-end;justify-content:space-around;gap:12px;width:100%;height:180px;padding-top:20px}.rpt-bar-column{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;max-width:48px}.rpt-bar-track{flex:1;width:100%;background:var(--rpt-bg-subtle, #f8fafc);border-radius:6px 6px 0 0;display:flex;align-items:flex-end;overflow:hidden}.rpt-bar-fill{position:relative;width:100%;min-height:4px;border-radius:6px 6px 0 0;transition:height .4s cubic-bezier(.16,1,.3,1);cursor:pointer}.rpt-bar-fill:hover .rpt-bar-tooltip{opacity:1;visibility:visible;transform:translateY(-8px)}.rpt-bar-tooltip{position:absolute;top:-24px;left:50%;transform:translate(-50%);background:#0f172a;color:#fff;font-size:.6875rem;padding:2px 6px;border-radius:4px;white-space:nowrap;opacity:0;visibility:hidden;transition:all .15s ease;pointer-events:none;z-index:10}.rpt-bar-label{font-size:.75rem;color:var(--rpt-text-muted, #64748b);margin-top:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center}.rpt-donut-chart-container{display:flex;align-items:center;justify-content:center;gap:32px;width:100%;flex-wrap:wrap}.rpt-donut-svg{width:150px;height:150px;transform:rotate(-90deg)}.rpt-donut-total-val{transform:rotate(90deg);transform-origin:80px 80px;font-size:1.25rem;font-weight:700;fill:var(--rpt-text-color, #0f172a)}.rpt-donut-total-lbl{transform:rotate(90deg);transform-origin:80px 80px;font-size:.6875rem;fill:var(--rpt-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em}.rpt-chart-legend{display:flex;flex-direction:column;gap:8px;min-width:140px}.rpt-legend-item{display:flex;align-items:center;gap:8px;font-size:.8125rem}.rpt-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.rpt-legend-label{flex:1;color:var(--rpt-text-color, #334155)}.rpt-legend-value{font-weight:600;color:var(--rpt-text-muted, #64748b)}.rpt-line-chart-container{width:100%;display:flex;flex-direction:column;gap:8px}.rpt-line-svg{width:100%;height:140px}.rpt-line-labels{display:flex;justify-content:space-between;font-size:.75rem;color:var(--rpt-text-muted, #64748b);padding:0 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"] }, { kind: "pipe", type: i1.UpperCasePipe, name: "uppercase" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
230
|
+
}
|
|
231
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportChartBridgeComponent, decorators: [{
|
|
232
|
+
type: Component,
|
|
233
|
+
args: [{ selector: 'rpt-chart-bridge', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
234
|
+
<div class="rpt-chart-bridge-container">
|
|
235
|
+
@if (hostChartComponent) {
|
|
236
|
+
<ng-container
|
|
237
|
+
*ngComponentOutlet="
|
|
238
|
+
hostChartComponent;
|
|
239
|
+
inputs: {
|
|
240
|
+
data: data(),
|
|
241
|
+
chartType: chartType(),
|
|
242
|
+
title: title(),
|
|
243
|
+
options: options()
|
|
244
|
+
}
|
|
245
|
+
"
|
|
246
|
+
/>
|
|
247
|
+
} @else {
|
|
248
|
+
<!-- Built-in fallback SVG/CSS chart -->
|
|
249
|
+
<div class="rpt-chart-fallback-card">
|
|
250
|
+
<div class="rpt-chart-fallback-header">
|
|
251
|
+
<h3 class="rpt-chart-title">{{ title() }}</h3>
|
|
252
|
+
<span class="rpt-chart-badge">{{ chartType() | uppercase }}</span>
|
|
253
|
+
</div>
|
|
254
|
+
|
|
255
|
+
<div class="rpt-chart-canvas-area">
|
|
256
|
+
@if (data().length === 0) {
|
|
257
|
+
<div class="rpt-chart-empty">No chart data available</div>
|
|
258
|
+
} @else if (chartType() === 'bar') {
|
|
259
|
+
<!-- Vertical Bar Chart -->
|
|
260
|
+
<div class="rpt-bar-chart">
|
|
261
|
+
@for (item of data(); track item.label) {
|
|
262
|
+
<div class="rpt-bar-column">
|
|
263
|
+
<div class="rpt-bar-track">
|
|
264
|
+
<div
|
|
265
|
+
class="rpt-bar-fill"
|
|
266
|
+
[style.height.%]="getBarPercentage(item.value)"
|
|
267
|
+
[style.background-color]="item.color || defaultColors[$index % defaultColors.length]"
|
|
268
|
+
[title]="item.label + ': ' + item.value"
|
|
269
|
+
>
|
|
270
|
+
<span class="rpt-bar-tooltip">{{ item.value }}</span>
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
<span class="rpt-bar-label" [title]="item.label">{{ item.label }}</span>
|
|
274
|
+
</div>
|
|
275
|
+
}
|
|
276
|
+
</div>
|
|
277
|
+
} @else if (chartType() === 'donut') {
|
|
278
|
+
<!-- SVG Donut Chart -->
|
|
279
|
+
<div class="rpt-donut-chart-container">
|
|
280
|
+
<svg class="rpt-donut-svg" viewBox="0 0 160 160">
|
|
281
|
+
@for (segment of donutSegments(); track segment.label) {
|
|
282
|
+
<circle
|
|
283
|
+
cx="80"
|
|
284
|
+
cy="80"
|
|
285
|
+
r="60"
|
|
286
|
+
fill="transparent"
|
|
287
|
+
[attr.stroke]="segment.color"
|
|
288
|
+
stroke-width="24"
|
|
289
|
+
[attr.stroke-dasharray]="segment.dashArray"
|
|
290
|
+
[attr.stroke-dashoffset]="segment.dashOffset"
|
|
291
|
+
/>
|
|
292
|
+
}
|
|
293
|
+
<text x="80" y="76" text-anchor="middle" class="rpt-donut-total-val">
|
|
294
|
+
{{ totalValue() }}
|
|
295
|
+
</text>
|
|
296
|
+
<text x="80" y="92" text-anchor="middle" class="rpt-donut-total-lbl">
|
|
297
|
+
Total
|
|
298
|
+
</text>
|
|
299
|
+
</svg>
|
|
300
|
+
|
|
301
|
+
<div class="rpt-chart-legend">
|
|
302
|
+
@for (item of data(); track item.label) {
|
|
303
|
+
<div class="rpt-legend-item">
|
|
304
|
+
<span
|
|
305
|
+
class="rpt-legend-dot"
|
|
306
|
+
[style.background-color]="item.color || defaultColors[$index % defaultColors.length]"
|
|
307
|
+
></span>
|
|
308
|
+
<span class="rpt-legend-label">{{ item.label }}</span>
|
|
309
|
+
<span class="rpt-legend-value">{{ item.value }}</span>
|
|
310
|
+
</div>
|
|
311
|
+
}
|
|
312
|
+
</div>
|
|
313
|
+
</div>
|
|
314
|
+
} @else {
|
|
315
|
+
<!-- SVG Line / Area Chart -->
|
|
316
|
+
<div class="rpt-line-chart-container">
|
|
317
|
+
<svg class="rpt-line-svg" viewBox="0 0 400 160" preserveAspectRatio="none">
|
|
318
|
+
<defs>
|
|
319
|
+
<linearGradient id="rptLineGrad" x1="0" y1="0" x2="0" y2="1">
|
|
320
|
+
<stop offset="0%" stop-color="var(--rpt-primary, #2563eb)" stop-opacity="0.3" />
|
|
321
|
+
<stop offset="100%" stop-color="var(--rpt-primary, #2563eb)" stop-opacity="0.0" />
|
|
322
|
+
</linearGradient>
|
|
323
|
+
</defs>
|
|
324
|
+
@if (linePoints().areaPath) {
|
|
325
|
+
<path [attr.d]="linePoints().areaPath" fill="url(#rptLineGrad)" />
|
|
326
|
+
}
|
|
327
|
+
@if (linePoints().linePath) {
|
|
328
|
+
<path
|
|
329
|
+
[attr.d]="linePoints().linePath"
|
|
330
|
+
fill="none"
|
|
331
|
+
stroke="var(--rpt-primary, #2563eb)"
|
|
332
|
+
stroke-width="3"
|
|
333
|
+
stroke-linecap="round"
|
|
334
|
+
stroke-linejoin="round"
|
|
335
|
+
/>
|
|
336
|
+
}
|
|
337
|
+
@for (pt of linePoints().points; track pt.label) {
|
|
338
|
+
<circle
|
|
339
|
+
[attr.cx]="pt.x"
|
|
340
|
+
[attr.cy]="pt.y"
|
|
341
|
+
r="4"
|
|
342
|
+
fill="#ffffff"
|
|
343
|
+
stroke="var(--rpt-primary, #2563eb)"
|
|
344
|
+
stroke-width="2"
|
|
345
|
+
/>
|
|
346
|
+
}
|
|
347
|
+
</svg>
|
|
348
|
+
<div class="rpt-line-labels">
|
|
349
|
+
@for (item of data(); track item.label) {
|
|
350
|
+
<span class="rpt-line-label">{{ item.label }}</span>
|
|
351
|
+
}
|
|
352
|
+
</div>
|
|
353
|
+
</div>
|
|
354
|
+
}
|
|
355
|
+
</div>
|
|
356
|
+
</div>
|
|
357
|
+
}
|
|
358
|
+
</div>
|
|
359
|
+
`, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box}.rpt-chart-bridge-container{width:100%}.rpt-chart-fallback-card{background:var(--rpt-surface-bg, #ffffff);border:1px solid var(--rpt-border-color, #e2e8f0);border-radius:var(--rpt-radius-lg, 12px);padding:var(--rpt-space-md, 20px);box-shadow:0 1px 3px #0000000d;display:flex;flex-direction:column;height:100%;box-sizing:border-box;gap:16px}.rpt-chart-fallback-header{display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.rpt-chart-title{font-size:1rem;font-weight:600;color:var(--rpt-text-color, #0f172a);margin:0}.rpt-chart-badge{font-size:.6875rem;font-weight:700;padding:2px 8px;border-radius:9999px;background:var(--rpt-bg-subtle, #f1f5f9);color:var(--rpt-text-muted, #64748b);letter-spacing:.05em}.rpt-chart-canvas-area{min-height:140px;height:100%;flex:1;display:flex;align-items:center;justify-content:center}.rpt-chart-empty{color:var(--rpt-text-muted, #94a3b8);font-size:.875rem}.rpt-bar-chart{display:flex;align-items:flex-end;justify-content:space-around;gap:12px;width:100%;height:180px;padding-top:20px}.rpt-bar-column{flex:1;display:flex;flex-direction:column;align-items:center;height:100%;max-width:48px}.rpt-bar-track{flex:1;width:100%;background:var(--rpt-bg-subtle, #f8fafc);border-radius:6px 6px 0 0;display:flex;align-items:flex-end;overflow:hidden}.rpt-bar-fill{position:relative;width:100%;min-height:4px;border-radius:6px 6px 0 0;transition:height .4s cubic-bezier(.16,1,.3,1);cursor:pointer}.rpt-bar-fill:hover .rpt-bar-tooltip{opacity:1;visibility:visible;transform:translateY(-8px)}.rpt-bar-tooltip{position:absolute;top:-24px;left:50%;transform:translate(-50%);background:#0f172a;color:#fff;font-size:.6875rem;padding:2px 6px;border-radius:4px;white-space:nowrap;opacity:0;visibility:hidden;transition:all .15s ease;pointer-events:none;z-index:10}.rpt-bar-label{font-size:.75rem;color:var(--rpt-text-muted, #64748b);margin-top:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%;text-align:center}.rpt-donut-chart-container{display:flex;align-items:center;justify-content:center;gap:32px;width:100%;flex-wrap:wrap}.rpt-donut-svg{width:150px;height:150px;transform:rotate(-90deg)}.rpt-donut-total-val{transform:rotate(90deg);transform-origin:80px 80px;font-size:1.25rem;font-weight:700;fill:var(--rpt-text-color, #0f172a)}.rpt-donut-total-lbl{transform:rotate(90deg);transform-origin:80px 80px;font-size:.6875rem;fill:var(--rpt-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em}.rpt-chart-legend{display:flex;flex-direction:column;gap:8px;min-width:140px}.rpt-legend-item{display:flex;align-items:center;gap:8px;font-size:.8125rem}.rpt-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.rpt-legend-label{flex:1;color:var(--rpt-text-color, #334155)}.rpt-legend-value{font-weight:600;color:var(--rpt-text-muted, #64748b)}.rpt-line-chart-container{width:100%;display:flex;flex-direction:column;gap:8px}.rpt-line-svg{width:100%;height:140px}.rpt-line-labels{display:flex;justify-content:space-between;font-size:.75rem;color:var(--rpt-text-muted, #64748b);padding:0 8px}\n"] }]
|
|
360
|
+
}] });
|
|
361
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNoYXJ0LWJyaWRnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9wcmltaXRpdmVzL2NvbXBvbmVudHMvY2hhcnQtYnJpZGdlL3JlcG9ydC1jaGFydC1icmlkZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxHQUVOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQThXOUUsTUFBTSxPQUFPLDBCQUEwQjtJQUM1QixrQkFBa0IsR0FBeUIsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRXZGLFVBQVUsR0FBRyxLQUFLLEVBQTZCLENBQUM7SUFDaEQsVUFBVSxHQUFHLEtBQUssQ0FBOEIsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDOUUsZUFBZSxHQUFHLEtBQUssQ0FBd0IsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDbEYsV0FBVyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdkUsYUFBYSxHQUFHLEtBQUssQ0FBc0IsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFFckUsYUFBYSxHQUFHO1FBQ3ZCLFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULFNB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QUksQ0FBQztRQUV0RyxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7d0dBckhRLDBCQUEwQjs0RkFBMUIsMEJBQTBCLDh2QkE5VjNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4SFQsNm9HQWhJUyxZQUFZOzs0RkFnV1gsMEJBQTBCO2tCQW5XdEMsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLG1CQUNOLHVCQUF1QixDQUFDLE1BQU0sWUFDckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThIVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBUeXBlLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDSEFSVF9DT01QT05FTlQgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3Rva2Vucy9yZXBvcnRpbmctY29uZmlnLnRva2VuJztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtY29tcG9uZW50Lm1vZGVsJztcblxuZXhwb3J0IGludGVyZmFjZSBDaGFydERhdGFJdGVtIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IG51bWJlcjtcbiAgY29sb3I/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENoYXJ0VHlwZSA9ICdiYXInIHwgJ2xpbmUnIHwgJ2RvbnV0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LWNoYXJ0LWJyaWRnZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicnB0LWNoYXJ0LWJyaWRnZS1jb250YWluZXJcIj5cbiAgICAgIEBpZiAoaG9zdENoYXJ0Q29tcG9uZW50KSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdDb21wb25lbnRPdXRsZXQ9XCJcbiAgICAgICAgICAgIGhvc3RDaGFydENvbXBvbmVudDtcbiAgICAgICAgICAgIGlucHV0czoge1xuICAgICAgICAgICAgICBkYXRhOiBkYXRhKCksXG4gICAgICAgICAgICAgIGNoYXJ0VHlwZTogY2hhcnRUeXBlKCksXG4gICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSgpLFxuICAgICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBcIlxuICAgICAgICAvPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDwhLS0gQnVpbHQtaW4gZmFsbGJhY2sgU1ZHL0NTUyBjaGFydCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jaGFydC1mYWxsYmFjay1jYXJkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jaGFydC1mYWxsYmFjay1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxoMyBjbGFzcz1cInJwdC1jaGFydC10aXRsZVwiPnt7IHRpdGxlKCkgfX08L2gzPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY2hhcnQtYmFkZ2VcIj57eyBjaGFydFR5cGUoKSB8IHVwcGVyY2FzZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtY2hhcnQtY2FudmFzLWFyZWFcIj5cbiAgICAgICAgICAgIEBpZiAoZGF0YSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWNoYXJ0LWVtcHR5XCI+Tm8gY2hhcnQgZGF0YSBhdmFpbGFibGU8L2Rpdj5cbiAgICAgICAgICAgIH0gQGVsc2UgaWYgKGNoYXJ0VHlwZSgpID09PSAnYmFyJykge1xuICAgICAgICAgICAgICA8IS0tIFZlcnRpY2FsIEJhciBDaGFydCAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1iYXItY2hhcnRcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGRhdGEoKTsgdHJhY2sgaXRlbS5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1iYXItY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtYmFyLXRyYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtYmFyLWZpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC4lXT1cImdldEJhclBlcmNlbnRhZ2UoaXRlbS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiaXRlbS5jb2xvciB8fCBkZWZhdWx0Q29sb3JzWyRpbmRleCAlIGRlZmF1bHRDb2xvcnMubGVuZ3RoXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiaXRlbS5sYWJlbCArICc6ICcgKyBpdGVtLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1iYXItdG9vbHRpcFwiPnt7IGl0ZW0udmFsdWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1iYXItbGFiZWxcIiBbdGl0bGVdPVwiaXRlbS5sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSBpZiAoY2hhcnRUeXBlKCkgPT09ICdkb251dCcpIHtcbiAgICAgICAgICAgICAgPCEtLSBTVkcgRG9udXQgQ2hhcnQgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtZG9udXQtY2hhcnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInJwdC1kb251dC1zdmdcIiB2aWV3Qm94PVwiMCAwIDE2MCAxNjBcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHNlZ21lbnQgb2YgZG9udXRTZWdtZW50cygpOyB0cmFjayBzZWdtZW50LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICBjeD1cIjgwXCJcbiAgICAgICAgICAgICAgICAgICAgICBjeT1cIjgwXCJcbiAgICAgICAgICAgICAgICAgICAgICByPVwiNjBcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInNlZ21lbnQuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjI0XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cInNlZ21lbnQuZGFzaEFycmF5XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaG9mZnNldF09XCJzZWdtZW50LmRhc2hPZmZzZXRcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPHRleHQgeD1cIjgwXCIgeT1cIjc2XCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIiBjbGFzcz1cInJwdC1kb251dC10b3RhbC12YWxcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgdG90YWxWYWx1ZSgpIH19XG4gICAgICAgICAgICAgICAgICA8L3RleHQ+XG4gICAgICAgICAgICAgICAgICA8dGV4dCB4PVwiODBcIiB5PVwiOTJcIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiIGNsYXNzPVwicnB0LWRvbnV0LXRvdGFsLWxibFwiPlxuICAgICAgICAgICAgICAgICAgICBUb3RhbFxuICAgICAgICAgICAgICAgICAgPC90ZXh0PlxuICAgICAgICAgICAgICAgIDwvc3ZnPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1jaGFydC1sZWdlbmRcIj5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgZGF0YSgpOyB0cmFjayBpdGVtLmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycHQtbGVnZW5kLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycHQtbGVnZW5kLWRvdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJpdGVtLmNvbG9yIHx8IGRlZmF1bHRDb2xvcnNbJGluZGV4ICUgZGVmYXVsdENvbG9ycy5sZW5ndGhdXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWxlZ2VuZC1sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtbGVnZW5kLXZhbHVlXCI+e3sgaXRlbS52YWx1ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDwhLS0gU1ZHIExpbmUgLyBBcmVhIENoYXJ0IC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicnB0LWxpbmUtY2hhcnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInJwdC1saW5lLXN2Z1wiIHZpZXdCb3g9XCIwIDAgNDAwIDE2MFwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICA8ZGVmcz5cbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicnB0TGluZUdyYWRcIiB4MT1cIjBcIiB5MT1cIjBcIiB4Mj1cIjBcIiB5Mj1cIjFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9XCIwJVwiIHN0b3AtY29sb3I9XCJ2YXIoLS1ycHQtcHJpbWFyeSwgIzI1NjNlYilcIiBzdG9wLW9wYWNpdHk9XCIwLjNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD1cIjEwMCVcIiBzdG9wLWNvbG9yPVwidmFyKC0tcnB0LXByaW1hcnksICMyNTYzZWIpXCIgc3RvcC1vcGFjaXR5PVwiMC4wXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cbiAgICAgICAgICAgICAgICAgIDwvZGVmcz5cbiAgICAgICAgICAgICAgICAgIEBpZiAobGluZVBvaW50cygpLmFyZWFQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIFthdHRyLmRdPVwibGluZVBvaW50cygpLmFyZWFQYXRoXCIgZmlsbD1cInVybCgjcnB0TGluZUdyYWQpXCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBpZiAobGluZVBvaW50cygpLmxpbmVQYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZF09XCJsaW5lUG9pbnRzKCkubGluZVBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9XCJ2YXIoLS1ycHQtcHJpbWFyeSwgIzI1NjNlYilcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjNcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBmb3IgKHB0IG9mIGxpbmVQb2ludHMoKS5wb2ludHM7IHRyYWNrIHB0LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIDxjaXJjbGVcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jeF09XCJwdC54XCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5jeV09XCJwdC55XCJcbiAgICAgICAgICAgICAgICAgICAgICByPVwiNFwiXG4gICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNmZmZmZmZcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cInZhcigtLXJwdC1wcmltYXJ5LCAjMjU2M2ViKVwiXG4gICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMlwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1saW5lLWxhYmVsc1wiPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBkYXRhKCk7IHRyYWNrIGl0ZW0ubGFiZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtbGluZS1sYWJlbFwiPnt7IGl0ZW0ubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIH1cblxuICAgIC5ycHQtY2hhcnQtYnJpZGdlLWNvbnRhaW5lciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAucnB0LWNoYXJ0LWZhbGxiYWNrLWNhcmQge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LXN1cmZhY2UtYmcsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWJvcmRlci1jb2xvciwgI2UyZThmMCk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtcmFkaXVzLWxnLCAxMnB4KTtcbiAgICAgIHBhZGRpbmc6IHZhcigtLXJwdC1zcGFjZS1tZCwgMjBweCk7XG4gICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjA1KTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIGdhcDogMTZweDtcbiAgICB9XG5cbiAgICAucnB0LWNoYXJ0LWZhbGxiYWNrLWhlYWRlciB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cblxuICAgIC5ycHQtY2hhcnQtdGl0bGUge1xuICAgICAgZm9udC1zaXplOiAxcmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtdGV4dC1jb2xvciwgIzBmMTcyYSk7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuXG4gICAgLnJwdC1jaGFydC1iYWRnZSB7XG4gICAgICBmb250LXNpemU6IDAuNjg3NXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBwYWRkaW5nOiAycHggOHB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogOTk5OXB4O1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tcnB0LWJnLXN1YnRsZSwgI2YxZjVmOSk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LXRleHQtbXV0ZWQsICM2NDc0OGIpO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcbiAgICB9XG5cbiAgICAucnB0LWNoYXJ0LWNhbnZhcy1hcmVhIHtcbiAgICAgIG1pbi1oZWlnaHQ6IDE0MHB4O1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgZmxleDogMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgfVxuXG4gICAgLnJwdC1jaGFydC1lbXB0eSB7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LXRleHQtbXV0ZWQsICM5NGEzYjgpO1xuICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICB9XG5cbiAgICAvKiBCYXIgQ2hhcnQgKi9cbiAgICAucnB0LWJhci1jaGFydCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTgwcHg7XG4gICAgICBwYWRkaW5nLXRvcDogMjBweDtcbiAgICB9XG5cbiAgICAucnB0LWJhci1jb2x1bW4ge1xuICAgICAgZmxleDogMTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIG1heC13aWR0aDogNDhweDtcbiAgICB9XG5cbiAgICAucnB0LWJhci10cmFjayB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ycHQtYmctc3VidGxlLCAjZjhmYWZjKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLnJwdC1iYXItZmlsbCB7XG4gICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIG1pbi1oZWlnaHQ6IDRweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwO1xuICAgICAgdHJhbnNpdGlvbjogaGVpZ2h0IDAuNHMgY3ViaWMtYmV6aWVyKDAuMTYsIDEsIDAuMywgMSk7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuXG4gICAgLnJwdC1iYXItZmlsbDpob3ZlciAucnB0LWJhci10b29sdGlwIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC04cHgpO1xuICAgIH1cblxuICAgIC5ycHQtYmFyLXRvb2x0aXAge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgdG9wOiAtMjRweDtcbiAgICAgIGxlZnQ6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgICAgIGJhY2tncm91bmQ6ICMwZjE3MmE7XG4gICAgICBjb2xvcjogI2ZmZmZmZjtcbiAgICAgIGZvbnQtc2l6ZTogMC42ODc1cmVtO1xuICAgICAgcGFkZGluZzogMnB4IDZweDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHotaW5kZXg6IDEwO1xuICAgIH1cblxuICAgIC5ycHQtYmFyLWxhYmVsIHtcbiAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIH1cblxuICAgIC8qIERvbnV0IENoYXJ0ICovXG4gICAgLnJwdC1kb251dC1jaGFydC1jb250YWluZXIge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGdhcDogMzJweDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZmxleC13cmFwOiB3cmFwO1xuICAgIH1cblxuICAgIC5ycHQtZG9udXQtc3ZnIHtcbiAgICAgIHdpZHRoOiAxNTBweDtcbiAgICAgIGhlaWdodDogMTUwcHg7XG4gICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtOTBkZWcpO1xuICAgIH1cblxuICAgIC5ycHQtZG9udXQtdG90YWwtdmFsIHtcbiAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTtcbiAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDgwcHggODBweDtcbiAgICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICBmaWxsOiB2YXIoLS1ycHQtdGV4dC1jb2xvciwgIzBmMTcyYSk7XG4gICAgfVxuXG4gICAgLnJwdC1kb251dC10b3RhbC1sYmwge1xuICAgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpO1xuICAgICAgdHJhbnNmb3JtLW9yaWdpbjogODBweCA4MHB4O1xuICAgICAgZm9udC1zaXplOiAwLjY4NzVyZW07XG4gICAgICBmaWxsOiB2YXIoLS1ycHQtdGV4dC1tdXRlZCwgIzY0NzQ4Yik7XG4gICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDVlbTtcbiAgICB9XG5cbiAgICAucnB0LWNoYXJ0LWxlZ2VuZCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGdhcDogOHB4O1xuICAgICAgbWluLXdpZHRoOiAxNDBweDtcbiAgICB9XG5cbiAgICAucnB0LWxlZ2VuZC1pdGVtIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBmb250LXNpemU6IDAuODEyNXJlbTtcbiAgICB9XG5cbiAgICAucnB0LWxlZ2VuZC1kb3Qge1xuICAgICAgd2lkdGg6IDEwcHg7XG4gICAgICBoZWlnaHQ6IDEwcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBmbGV4LXNocmluazogMDtcbiAgICB9XG5cbiAgICAucnB0LWxlZ2VuZC1sYWJlbCB7XG4gICAgICBmbGV4OiAxO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LWNvbG9yLCAjMzM0MTU1KTtcbiAgICB9XG5cbiAgICAucnB0LWxlZ2VuZC12YWx1ZSB7XG4gICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICB9XG5cbiAgICAvKiBMaW5lIENoYXJ0ICovXG4gICAgLnJwdC1saW5lLWNoYXJ0LWNvbnRhaW5lciB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgfVxuXG4gICAgLnJwdC1saW5lLXN2ZyB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTQwcHg7XG4gICAgfVxuXG4gICAgLnJwdC1saW5lLWxhYmVscyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZm9udC1zaXplOiAwLjc1cmVtO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIH1cbiAgYF1cbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0Q2hhcnRCcmlkZ2VDb21wb25lbnQge1xuICByZWFkb25seSBob3N0Q2hhcnRDb21wb25lbnQ6IFR5cGU8dW5rbm93bj4gfCBudWxsID0gaW5qZWN0KENIQVJUX0NPTVBPTkVOVCwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBkZWZpbml0aW9uID0gaW5wdXQ8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbj4oKTtcbiAgcmVhZG9ubHkgY3VzdG9tRGF0YSA9IGlucHV0PENoYXJ0RGF0YUl0ZW1bXSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IGFsaWFzOiAnZGF0YScgfSk7XG4gIHJlYWRvbmx5IGN1c3RvbUNoYXJ0VHlwZSA9IGlucHV0PENoYXJ0VHlwZSB8IHVuZGVmaW5lZD4odW5kZWZpbmVkLCB7IGFsaWFzOiAnY2hhcnRUeXBlJyB9KTtcbiAgcmVhZG9ubHkgY3VzdG9tVGl0bGUgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCwgeyBhbGlhczogJ3RpdGxlJyB9KTtcbiAgcmVhZG9ubHkgY3VzdG9tT3B0aW9ucyA9IGlucHV0PFJlY29yZDxzdHJpbmcsIGFueT4+KHt9LCB7IGFsaWFzOiAnb3B0aW9ucycgfSk7XG5cbiAgcmVhZG9ubHkgZGVmYXVsdENvbG9ycyA9IFtcbiAgICAnIzI1NjNlYicsXG4gICAgJyMxMGI5ODEnLFxuICAgICcjZjU5ZTBiJyxcbiAgICAnI2VmNDQ0NCcsXG4gICAgJyM4YjVjZjYnLFxuICAgICcjMDZiNmQ0JyxcbiAgICAnI2VjNDg5OSdcbiAgXTtcblxuICByZWFkb25seSB0aXRsZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXN0b21UaXRsZSgpID8/XG4gICAgICAodGhpcy5kZWZpbml0aW9uKCk/LnByb3BlcnRpZXM/LlsndGl0bGUnXSBhcyBzdHJpbmcpID8/XG4gICAgICB0aGlzLmRlZmluaXRpb24oKT8ubGFiZWwgPz9cbiAgICAgICdDaGFydCdcbiAgICApO1xuICB9KTtcblxuICByZWFkb25seSBjaGFydFR5cGUgPSBjb21wdXRlZDxDaGFydFR5cGU+KCgpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXN0b21DaGFydFR5cGUoKSA/P1xuICAgICAgKHRoaXMuZGVmaW5pdGlvbigpPy5wcm9wZXJ0aWVzPy5bJ2NoYXJ0VHlwZSddIGFzIENoYXJ0VHlwZSkgPz9cbiAgICAgICdiYXInXG4gICAgKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZGF0YSA9IGNvbXB1dGVkPENoYXJ0RGF0YUl0ZW1bXT4oKCkgPT4ge1xuICAgIGlmICh0aGlzLmN1c3RvbURhdGEoKSAmJiB0aGlzLmN1c3RvbURhdGEoKSEubGVuZ3RoID4gMCkgcmV0dXJuIHRoaXMuY3VzdG9tRGF0YSgpITtcbiAgICBjb25zdCBjb25maWdEYXRhID0gdGhpcy5kZWZpbml0aW9uKCk/LnByb3BlcnRpZXM/LlsnZGF0YSddIGFzIENoYXJ0RGF0YUl0ZW1bXTtcbiAgICByZXR1cm4gY29uZmlnRGF0YSB8fCBbXTtcbiAgfSk7XG5cblxuICByZWFkb25seSBvcHRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi4odGhpcy5kZWZpbml0aW9uKCk/LnByb3BlcnRpZXMgfHwge30pLFxuICAgICAgLi4udGhpcy5jdXN0b21PcHRpb25zKClcbiAgICB9O1xuICB9KTtcblxuXG4gIHJlYWRvbmx5IG1heFZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5kYXRhKCk7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDE7XG4gICAgcmV0dXJuIE1hdGgubWF4KC4uLml0ZW1zLm1hcCgoZCkgPT4gZC52YWx1ZSksIDEpO1xuICB9KTtcblxuICByZWFkb25seSB0b3RhbFZhbHVlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiB0aGlzLmRhdGEoKS5yZWR1Y2UoKGFjYywgY3VycikgPT4gYWNjICsgY3Vyci52YWx1ZSwgMCk7XG4gIH0pO1xuXG4gIGdldEJhclBlcmNlbnRhZ2UodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXhWYWx1ZSgpO1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh2YWx1ZSAvIG1heCkgKiAxMDApO1xuICB9XG5cbiAgcmVhZG9ubHkgZG9udXRTZWdtZW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBpdGVtcyA9IHRoaXMuZGF0YSgpO1xuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbFZhbHVlKCk7XG4gICAgaWYgKHRvdGFsID09PSAwKSByZXR1cm4gW107XG5cbiAgICBjb25zdCBjaXJjdW1mZXJlbmNlID0gMiAqIE1hdGguUEkgKiA2MDsgLy8gcmFkaXVzID0gNjAgPT4gfjM3Ni45OVxuICAgIGxldCBhY2N1bXVsYXRlZCA9IDA7XG5cbiAgICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHJhdGlvID0gaXRlbS52YWx1ZSAvIHRvdGFsO1xuICAgICAgY29uc3Qgc3Ryb2tlTGVuZ3RoID0gcmF0aW8gKiBjaXJjdW1mZXJlbmNlO1xuICAgICAgY29uc3QgZGFzaE9mZnNldCA9IC0oYWNjdW11bGF0ZWQgKiBjaXJjdW1mZXJlbmNlKTtcbiAgICAgIGFjY3VtdWxhdGVkICs9IHJhdGlvO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogaXRlbS5sYWJlbCxcbiAgICAgICAgY29sb3I6IGl0ZW0uY29sb3IgfHwgdGhpcy5kZWZhdWx0Q29sb3JzW2lkeCAlIHRoaXMuZGVmYXVsdENvbG9ycy5sZW5ndGhdLFxuICAgICAgICBkYXNoQXJyYXk6IGAke3N0cm9rZUxlbmd0aH0gJHtjaXJjdW1mZXJlbmNlfWAsXG4gICAgICAgIGRhc2hPZmZzZXRcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGxpbmVQb2ludHMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmRhdGEoKTtcbiAgICBpZiAoaXRlbXMubGVuZ3RoID09PSAwKSByZXR1cm4geyBsaW5lUGF0aDogJycsIGFyZWFQYXRoOiAnJywgcG9pbnRzOiBbXSB9O1xuXG4gICAgY29uc3QgbWF4ID0gdGhpcy5tYXhWYWx1ZSgpO1xuICAgIGNvbnN0IHdpZHRoID0gNDAwO1xuICAgIGNvbnN0IGhlaWdodCA9IDE0MDtcbiAgICBjb25zdCBwYWRkaW5nID0gMjA7XG5cbiAgICBjb25zdCB1c2FibGVXaWR0aCA9IHdpZHRoIC0gcGFkZGluZyAqIDI7XG4gICAgY29uc3QgdXNhYmxlSGVpZ2h0ID0gaGVpZ2h0IC0gcGFkZGluZyAqIDI7XG4gICAgY29uc3Qgc3RlcCA9IGl0ZW1zLmxlbmd0aCA+IDEgPyB1c2FibGVXaWR0aCAvIChpdGVtcy5sZW5ndGggLSAxKSA6IDA7XG5cbiAgICBjb25zdCBwdHMgPSBpdGVtcy5tYXAoKGl0ZW0sIGlkeCkgPT4ge1xuICAgICAgY29uc3QgeCA9IHBhZGRpbmcgKyBpZHggKiBzdGVwO1xuICAgICAgY29uc3QgeSA9IGhlaWdodCAtIHBhZGRpbmcgLSAoaXRlbS52YWx1ZSAvIG1heCkgKiB1c2FibGVIZWlnaHQ7XG4gICAgICByZXR1cm4geyB4LCB5LCBsYWJlbDogaXRlbS5sYWJlbCwgdmFsdWU6IGl0ZW0udmFsdWUgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGxpbmVQYXRoID0gcHRzLnJlZHVjZSgoYWNjLCBwdCwgaSkgPT4ge1xuICAgICAgcmV0dXJuIGkgPT09IDAgPyBgTSAke3B0Lnh9ICR7cHQueX1gIDogYCR7YWNjfSBMICR7cHQueH0gJHtwdC55fWA7XG4gICAgfSwgJycpO1xuXG4gICAgY29uc3QgZmlyc3RQdCA9IHB0c1swXTtcbiAgICBjb25zdCBsYXN0UHQgPSBwdHNbcHRzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGFyZWFQYXRoID0gYCR7bGluZVBhdGh9IEwgJHtsYXN0UHQueH0gJHtoZWlnaHQgLSBwYWRkaW5nfSBMICR7Zmlyc3RQdC54fSAke2hlaWdodCAtIHBhZGRpbmd9IFpgO1xuXG4gICAgcmV0dXJuIHsgbGluZVBhdGgsIGFyZWFQYXRoLCBwb2ludHM6IHB0cyB9O1xuICB9KTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';
|
|
2
|
+
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
+
import { getValidationMessage } from '../../../core/validation/validation-factory';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
export class RptCheckboxComponent {
|
|
7
|
+
config = input.required();
|
|
8
|
+
control = input();
|
|
9
|
+
fallbackControl = new FormControl(false);
|
|
10
|
+
formControl = computed(() => this.control() ?? this.fallbackControl);
|
|
11
|
+
elementId = computed(() => this.config().key || this.config().id);
|
|
12
|
+
isInvalid = computed(() => {
|
|
13
|
+
const ctrl = this.formControl();
|
|
14
|
+
return ctrl.invalid && (ctrl.dirty || ctrl.touched);
|
|
15
|
+
});
|
|
16
|
+
errorMessage = computed(() => {
|
|
17
|
+
const ctrl = this.formControl();
|
|
18
|
+
if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {
|
|
19
|
+
return '';
|
|
20
|
+
}
|
|
21
|
+
const errors = ctrl.errors;
|
|
22
|
+
if (!errors)
|
|
23
|
+
return '';
|
|
24
|
+
const firstKey = Object.keys(errors)[0];
|
|
25
|
+
return getValidationMessage(this.config().validation, firstKey);
|
|
26
|
+
});
|
|
27
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptCheckboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
28
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptCheckboxComponent, isStandalone: true, selector: "rpt-checkbox", inputs: { config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: true, transformFunction: null }, control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
|
|
29
|
+
<div class="rpt-checkbox-field">
|
|
30
|
+
<label [for]="elementId()" class="rpt-checkbox-label">
|
|
31
|
+
<input
|
|
32
|
+
[id]="elementId()"
|
|
33
|
+
type="checkbox"
|
|
34
|
+
[formControl]="formControl()"
|
|
35
|
+
class="rpt-checkbox-input"
|
|
36
|
+
/>
|
|
37
|
+
<span class="rpt-custom-checkbox" aria-hidden="true">
|
|
38
|
+
<svg class="rpt-check-icon" width="12" height="10" viewBox="0 0 12 10" fill="none">
|
|
39
|
+
<path d="M1 5L4.5 8.5L11 1.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
40
|
+
</svg>
|
|
41
|
+
</span>
|
|
42
|
+
<span class="rpt-checkbox-text">
|
|
43
|
+
{{ config().label }}
|
|
44
|
+
@if (config().validation?.required) {
|
|
45
|
+
<span class="rpt-required-marker">*</span>
|
|
46
|
+
}
|
|
47
|
+
</span>
|
|
48
|
+
</label>
|
|
49
|
+
|
|
50
|
+
@if (errorMessage()) {
|
|
51
|
+
<span class="rpt-error-text">{{ errorMessage() }}</span>
|
|
52
|
+
}
|
|
53
|
+
</div>
|
|
54
|
+
`, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-checkbox-field{display:flex;flex-direction:column;justify-content:flex-end;height:100%;gap:4px;padding-bottom:8px;box-sizing:border-box}.rpt-checkbox-label{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.rpt-checkbox-input{position:absolute;opacity:0;width:0;height:0;margin:0}.rpt-custom-checkbox{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);background-color:var(--rpt-color-bg, #ffffff);display:flex;align-items:center;justify-content:center;transition:all var(--rpt-transition-speed, .15s) ease;color:var(--rpt-color-text-inverse, #ffffff);flex-shrink:0}.rpt-checkbox-label:hover .rpt-custom-checkbox{border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-checkbox-input:focus-visible+.rpt-custom-checkbox{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-checkbox-input:checked+.rpt-custom-checkbox{background-color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.rpt-check-icon{opacity:0;transform:scale(.6);transition:all var(--rpt-transition-speed, .15s) ease}.rpt-checkbox-input:checked+.rpt-custom-checkbox .rpt-check-icon{opacity:1;transform:scale(1)}.rpt-checkbox-input:disabled+.rpt-custom-checkbox{background-color:var(--rpt-color-surface, #f8fafc);border-color:var(--rpt-color-border, #cbd5e1);cursor:not-allowed}.rpt-checkbox-text{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a)}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
55
|
+
}
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptCheckboxComponent, decorators: [{
|
|
57
|
+
type: Component,
|
|
58
|
+
args: [{ selector: 'rpt-checkbox', standalone: true, imports: [ReactiveFormsModule], template: `
|
|
59
|
+
<div class="rpt-checkbox-field">
|
|
60
|
+
<label [for]="elementId()" class="rpt-checkbox-label">
|
|
61
|
+
<input
|
|
62
|
+
[id]="elementId()"
|
|
63
|
+
type="checkbox"
|
|
64
|
+
[formControl]="formControl()"
|
|
65
|
+
class="rpt-checkbox-input"
|
|
66
|
+
/>
|
|
67
|
+
<span class="rpt-custom-checkbox" aria-hidden="true">
|
|
68
|
+
<svg class="rpt-check-icon" width="12" height="10" viewBox="0 0 12 10" fill="none">
|
|
69
|
+
<path d="M1 5L4.5 8.5L11 1.5" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
|
|
70
|
+
</svg>
|
|
71
|
+
</span>
|
|
72
|
+
<span class="rpt-checkbox-text">
|
|
73
|
+
{{ config().label }}
|
|
74
|
+
@if (config().validation?.required) {
|
|
75
|
+
<span class="rpt-required-marker">*</span>
|
|
76
|
+
}
|
|
77
|
+
</span>
|
|
78
|
+
</label>
|
|
79
|
+
|
|
80
|
+
@if (errorMessage()) {
|
|
81
|
+
<span class="rpt-error-text">{{ errorMessage() }}</span>
|
|
82
|
+
}
|
|
83
|
+
</div>
|
|
84
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-checkbox-field{display:flex;flex-direction:column;justify-content:flex-end;height:100%;gap:4px;padding-bottom:8px;box-sizing:border-box}.rpt-checkbox-label{display:inline-flex;align-items:center;gap:8px;cursor:pointer;-webkit-user-select:none;user-select:none}.rpt-checkbox-input{position:absolute;opacity:0;width:0;height:0;margin:0}.rpt-custom-checkbox{width:18px;height:18px;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);background-color:var(--rpt-color-bg, #ffffff);display:flex;align-items:center;justify-content:center;transition:all var(--rpt-transition-speed, .15s) ease;color:var(--rpt-color-text-inverse, #ffffff);flex-shrink:0}.rpt-checkbox-label:hover .rpt-custom-checkbox{border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-checkbox-input:focus-visible+.rpt-custom-checkbox{border-color:var(--rpt-color-border-focus, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.rpt-checkbox-input:checked+.rpt-custom-checkbox{background-color:var(--rpt-color-primary, #2563eb);border-color:var(--rpt-color-primary, #2563eb)}.rpt-check-icon{opacity:0;transform:scale(.6);transition:all var(--rpt-transition-speed, .15s) ease}.rpt-checkbox-input:checked+.rpt-custom-checkbox .rpt-check-icon{opacity:1;transform:scale(1)}.rpt-checkbox-input:disabled+.rpt-custom-checkbox{background-color:var(--rpt-color-surface, #f8fafc);border-color:var(--rpt-color-border, #cbd5e1);cursor:not-allowed}.rpt-checkbox-text{font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a)}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444)}\n"] }]
|
|
85
|
+
}] });
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LWNoZWNrYm94LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9jaGVja2JveC9ycHQtY2hlY2tib3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQXFIbkYsTUFBTSxPQUFPLG9CQUFvQjtJQUN0QixNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBNkIsQ0FBQztJQUNyRCxPQUFPLEdBQUcsS0FBSyxFQUFlLENBQUM7SUFFdkIsZUFBZSxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpELFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWxFLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQztJQUVNLFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQzt3R0F2QlEsb0JBQW9COzRGQUFwQixvQkFBb0IsNFVBL0dyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQsazVEQTNCUyxtQkFBbUI7OzRGQWdIbEIsb0JBQW9CO2tCQW5IaEMsU0FBUzsrQkFDRSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsbUJBQW1CLENBQUMsWUFDcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJULG1CQW1GZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0aW9uTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdmFsaWRhdGlvbi92YWxpZGF0aW9uLWZhY3RvcnknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtY2hlY2tib3gnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1jaGVja2JveC1maWVsZFwiPlxuICAgICAgPGxhYmVsIFtmb3JdPVwiZWxlbWVudElkKClcIiBjbGFzcz1cInJwdC1jaGVja2JveC1sYWJlbFwiPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICBbaWRdPVwiZWxlbWVudElkKClcIlxuICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sKClcIlxuICAgICAgICAgIGNsYXNzPVwicnB0LWNoZWNrYm94LWlucHV0XCJcbiAgICAgICAgLz5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY3VzdG9tLWNoZWNrYm94XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgPHN2ZyBjbGFzcz1cInJwdC1jaGVjay1pY29uXCIgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEwXCIgdmlld0JveD1cIjAgMCAxMiAxMFwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTEgNUw0LjUgOC41TDExIDEuNVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtY2hlY2tib3gtdGV4dFwiPlxuICAgICAgICAgIHt7IGNvbmZpZygpLmxhYmVsIH19XG4gICAgICAgICAgQGlmIChjb25maWcoKS52YWxpZGF0aW9uPy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcmVxdWlyZWQtbWFya2VyXCI+Kjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbGFiZWw+XG5cbiAgICAgIEBpZiAoZXJyb3JNZXNzYWdlKCkpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtZXJyb3ItdGV4dFwiPnt7IGVycm9yTWVzc2FnZSgpIH19PC9zcGFuPlxuICAgICAgfVxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICBmb250LWZhbWlseTogdmFyKC0tcnB0LWZvbnQtZmFtaWx5LCBpbmhlcml0KTtcbiAgICB9XG4gICAgLnJwdC1jaGVja2JveC1maWVsZCB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7IC8qIGFsaWduIHdpdGggbGFiZWxlZCBpbnB1dHMgYmFzZWxpbmUgKi9cbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5ycHQtY2hlY2tib3gtbGFiZWwge1xuICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB1c2VyLXNlbGVjdDogbm9uZTtcbiAgICB9XG4gICAgLnJwdC1jaGVja2JveC1pbnB1dCB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgd2lkdGg6IDA7XG4gICAgICBoZWlnaHQ6IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgfVxuICAgIC5ycHQtY3VzdG9tLWNoZWNrYm94IHtcbiAgICAgIHdpZHRoOiAxOHB4O1xuICAgICAgaGVpZ2h0OiAxOHB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cy1zbSwgNHB4KTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJwdC1jb2xvci1iZywgI2ZmZmZmZik7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dC1pbnZlcnNlLCAjZmZmZmZmKTtcbiAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIH1cbiAgICAucnB0LWNoZWNrYm94LWxhYmVsOmhvdmVyIC5ycHQtY3VzdG9tLWNoZWNrYm94IHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1ob3ZlciwgIzk0YTNiOCk7XG4gICAgfVxuICAgIC5ycHQtY2hlY2tib3gtaW5wdXQ6Zm9jdXMtdmlzaWJsZSArIC5ycHQtY3VzdG9tLWNoZWNrYm94IHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1mb2N1cywgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiB2YXIoLS1ycHQtYm94LXNoYWRvdy1mb2N1cywgMCAwIDAgM3B4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMjUpKTtcbiAgICB9XG4gICAgLnJwdC1jaGVja2JveC1pbnB1dDpjaGVja2VkICsgLnJwdC1jdXN0b20tY2hlY2tib3gge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXByaW1hcnksICMyNTYzZWIpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgfVxuICAgIC5ycHQtY2hlY2staWNvbiB7XG4gICAgICBvcGFjaXR5OiAwO1xuICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjYpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICB9XG4gICAgLnJwdC1jaGVja2JveC1pbnB1dDpjaGVja2VkICsgLnJwdC1jdXN0b20tY2hlY2tib3ggLnJwdC1jaGVjay1pY29uIHtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICAgIH1cbiAgICAucnB0LWNoZWNrYm94LWlucHV0OmRpc2FibGVkICsgLnJwdC1jdXN0b20tY2hlY2tib3gge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmOGZhZmMpO1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgfVxuICAgIC5ycHQtY2hlY2tib3gtdGV4dCB7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtYmFzZSwgMC44NzVyZW0pO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICB9XG4gICAgLnJwdC1yZXF1aXJlZC1tYXJrZXIge1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci1kYW5nZXIsICNlZjQ0NDQpO1xuICAgICAgbWFyZ2luLWxlZnQ6IDJweDtcbiAgICB9XG4gICAgLnJwdC1lcnJvci10ZXh0IHtcbiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tcnB0LWZvbnQtc2l6ZS1zbSwgMC43NXJlbSk7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLWRhbmdlciwgI2VmNDQ0NCk7XG4gICAgfVxuICBgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFJwdENoZWNrYm94Q29tcG9uZW50IHtcbiAgcmVhZG9ubHkgY29uZmlnID0gaW5wdXQucmVxdWlyZWQ8UmVwb3J0Q29tcG9uZW50RGVmaW5pdGlvbj4oKTtcbiAgcmVhZG9ubHkgY29udHJvbCA9IGlucHV0PEZvcm1Db250cm9sPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFsbGJhY2tDb250cm9sID0gbmV3IEZvcm1Db250cm9sKGZhbHNlKTtcblxuICByZWFkb25seSBmb3JtQ29udHJvbCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29udHJvbCgpID8/IHRoaXMuZmFsbGJhY2tDb250cm9sKTtcbiAgcmVhZG9ubHkgZWxlbWVudElkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb25maWcoKS5rZXkgfHwgdGhpcy5jb25maWcoKS5pZCk7XG5cbiAgcmVhZG9ubHkgaXNJbnZhbGlkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm1Db250cm9sKCk7XG4gICAgcmV0dXJuIGN0cmwuaW52YWxpZCAmJiAoY3RybC5kaXJ0eSB8fCBjdHJsLnRvdWNoZWQpO1xuICB9KTtcblxuICByZWFkb25seSBlcnJvck1lc3NhZ2UgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybUNvbnRyb2woKTtcbiAgICBpZiAoIWN0cmwuaW52YWxpZCB8fCAoIWN0cmwuZGlydHkgJiYgIWN0cmwudG91Y2hlZCkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgZXJyb3JzID0gY3RybC5lcnJvcnM7XG4gICAgaWYgKCFlcnJvcnMpIHJldHVybiAnJztcbiAgICBjb25zdCBmaXJzdEtleSA9IE9iamVjdC5rZXlzKGVycm9ycylbMF07XG4gICAgcmV0dXJuIGdldFZhbGlkYXRpb25NZXNzYWdlKHRoaXMuY29uZmlnKCkudmFsaWRhdGlvbiwgZmlyc3RLZXkpO1xuICB9KTtcbn1cbiJdfQ==
|