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,91 @@
|
|
|
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 RptDateComponent {
|
|
7
|
+
config = input.required();
|
|
8
|
+
control = input();
|
|
9
|
+
fallbackControl = new FormControl('');
|
|
10
|
+
formControl = computed(() => this.control() ?? this.fallbackControl);
|
|
11
|
+
elementId = computed(() => this.config().key || this.config().id);
|
|
12
|
+
dateType = computed(() => (this.config().properties?.['includeTime'] ? 'datetime-local' : 'date'));
|
|
13
|
+
minDate = computed(() => this.config().properties?.['minDate'] || null);
|
|
14
|
+
maxDate = computed(() => this.config().properties?.['maxDate'] || null);
|
|
15
|
+
isInvalid = computed(() => {
|
|
16
|
+
const ctrl = this.formControl();
|
|
17
|
+
return ctrl.invalid && (ctrl.dirty || ctrl.touched);
|
|
18
|
+
});
|
|
19
|
+
errorMessage = computed(() => {
|
|
20
|
+
const ctrl = this.formControl();
|
|
21
|
+
if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {
|
|
22
|
+
return '';
|
|
23
|
+
}
|
|
24
|
+
const errors = ctrl.errors;
|
|
25
|
+
if (!errors)
|
|
26
|
+
return '';
|
|
27
|
+
const firstKey = Object.keys(errors)[0];
|
|
28
|
+
return getValidationMessage(this.config().validation, firstKey);
|
|
29
|
+
});
|
|
30
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
31
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptDateComponent, isStandalone: true, selector: "rpt-date", 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: `
|
|
32
|
+
<div class="rpt-field-group">
|
|
33
|
+
@if (config().label) {
|
|
34
|
+
<label [for]="elementId()" class="rpt-label">
|
|
35
|
+
{{ config().label }}
|
|
36
|
+
@if (config().validation?.required) {
|
|
37
|
+
<span class="rpt-required-marker">*</span>
|
|
38
|
+
}
|
|
39
|
+
</label>
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
<div class="rpt-date-wrapper">
|
|
43
|
+
<input
|
|
44
|
+
[id]="elementId()"
|
|
45
|
+
[type]="dateType()"
|
|
46
|
+
[formControl]="formControl()"
|
|
47
|
+
[min]="minDate()"
|
|
48
|
+
[max]="maxDate()"
|
|
49
|
+
[class.rpt-invalid]="isInvalid()"
|
|
50
|
+
class="rpt-date-input"
|
|
51
|
+
/>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
@if (errorMessage()) {
|
|
55
|
+
<span class="rpt-error-text">{{ errorMessage() }}</span>
|
|
56
|
+
}
|
|
57
|
+
</div>
|
|
58
|
+
`, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-date-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-date-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-date-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-date-input:focus{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-date-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-date-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { 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 });
|
|
59
|
+
}
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDateComponent, decorators: [{
|
|
61
|
+
type: Component,
|
|
62
|
+
args: [{ selector: 'rpt-date', standalone: true, imports: [ReactiveFormsModule], template: `
|
|
63
|
+
<div class="rpt-field-group">
|
|
64
|
+
@if (config().label) {
|
|
65
|
+
<label [for]="elementId()" class="rpt-label">
|
|
66
|
+
{{ config().label }}
|
|
67
|
+
@if (config().validation?.required) {
|
|
68
|
+
<span class="rpt-required-marker">*</span>
|
|
69
|
+
}
|
|
70
|
+
</label>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
<div class="rpt-date-wrapper">
|
|
74
|
+
<input
|
|
75
|
+
[id]="elementId()"
|
|
76
|
+
[type]="dateType()"
|
|
77
|
+
[formControl]="formControl()"
|
|
78
|
+
[min]="minDate()"
|
|
79
|
+
[max]="maxDate()"
|
|
80
|
+
[class.rpt-invalid]="isInvalid()"
|
|
81
|
+
class="rpt-date-input"
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
@if (errorMessage()) {
|
|
86
|
+
<span class="rpt-error-text">{{ errorMessage() }}</span>
|
|
87
|
+
}
|
|
88
|
+
</div>
|
|
89
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-date-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex}.rpt-date-input{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease;outline:none}.rpt-date-input:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-date-input:focus{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-date-input:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-date-input.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-date-input.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"] }]
|
|
90
|
+
}] });
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LWRhdGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvcHJpbWl0aXZlcy9jb21wb25lbnRzL2RhdGUvcnB0LWRhdGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwRixPQUFPLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7OztBQTJHbkYsTUFBTSxPQUFPLGdCQUFnQjtJQUNsQixNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBNkIsQ0FBQztJQUNyRCxPQUFPLEdBQUcsS0FBSyxFQUFlLENBQUM7SUFFdkIsZUFBZSxHQUFHLElBQUksV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTlDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNyRSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25HLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBWSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBQ3BGLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLFNBQVMsQ0FBWSxJQUFJLElBQUksQ0FBQyxDQUFDO0lBRXBGLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxPQUFPLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQztJQUVNLFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3BELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN2QixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUMsQ0FBQzt3R0ExQlEsZ0JBQWdCOzRGQUFoQixnQkFBZ0Isd1VBckdqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJULHFsREE1QlMsbUJBQW1COzs0RkFzR2xCLGdCQUFnQjtrQkF6RzVCLFNBQVM7K0JBQ0UsVUFBVSxjQUNSLElBQUksV0FDUCxDQUFDLG1CQUFtQixDQUFDLFlBQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyQlQsbUJBd0VnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgY29tcHV0ZWQsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IGdldFZhbGlkYXRpb25NZXNzYWdlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS92YWxpZGF0aW9uL3ZhbGlkYXRpb24tZmFjdG9yeSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1kYXRlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGVdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJycHQtZmllbGQtZ3JvdXBcIj5cbiAgICAgIEBpZiAoY29uZmlnKCkubGFiZWwpIHtcbiAgICAgICAgPGxhYmVsIFtmb3JdPVwiZWxlbWVudElkKClcIiBjbGFzcz1cInJwdC1sYWJlbFwiPlxuICAgICAgICAgIHt7IGNvbmZpZygpLmxhYmVsIH19XG4gICAgICAgICAgQGlmIChjb25maWcoKS52YWxpZGF0aW9uPy5yZXF1aXJlZCkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJycHQtcmVxdWlyZWQtbWFya2VyXCI+Kjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICB9XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJycHQtZGF0ZS13cmFwcGVyXCI+XG4gICAgICAgIDxpbnB1dFxuICAgICAgICAgIFtpZF09XCJlbGVtZW50SWQoKVwiXG4gICAgICAgICAgW3R5cGVdPVwiZGF0ZVR5cGUoKVwiXG4gICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm1Db250cm9sKClcIlxuICAgICAgICAgIFttaW5dPVwibWluRGF0ZSgpXCJcbiAgICAgICAgICBbbWF4XT1cIm1heERhdGUoKVwiXG4gICAgICAgICAgW2NsYXNzLnJwdC1pbnZhbGlkXT1cImlzSW52YWxpZCgpXCJcbiAgICAgICAgICBjbGFzcz1cInJwdC1kYXRlLWlucHV0XCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKGVycm9yTWVzc2FnZSgpKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWVycm9yLXRleHRcIj57eyBlcnJvck1lc3NhZ2UoKSB9fTwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5ycHQtZmllbGQtZ3JvdXAge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5ycHQtbGFiZWwge1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC5ycHQtcmVxdWlyZWQtbWFya2VyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItZGFuZ2VyLCAjZWY0NDQ0KTtcbiAgICAgIG1hcmdpbi1sZWZ0OiAycHg7XG4gICAgfVxuICAgIC5ycHQtZGF0ZS13cmFwcGVyIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgZmxleDogMTtcbiAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgIH1cbiAgICAucnB0LWRhdGUtaW5wdXQge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBtaW4taGVpZ2h0OiAzOHB4O1xuICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgIHBhZGRpbmc6IDZweCAxMnB4O1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLWJhc2UsIDAuODc1cmVtKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItdGV4dCwgIzBmMTcyYSk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItYmcsICNmZmZmZmYpO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tcnB0LWNvbG9yLWJvcmRlciwgI2NiZDVlMSk7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1ycHQtYm9yZGVyLXJhZGl1cywgNnB4KTtcbiAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2UsXG4gICAgICAgICAgICAgICAgICBib3gtc2hhZG93IHZhcigtLXJwdC10cmFuc2l0aW9uLXNwZWVkLCAxNTBtcykgZWFzZTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgfVxuICAgIC5ycHQtZGF0ZS1pbnB1dDpob3Zlcjpub3QoOmRpc2FibGVkKSB7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1ib3JkZXItaG92ZXIsICM5NGEzYjgpO1xuICAgIH1cbiAgICAucnB0LWRhdGUtaW5wdXQ6Zm9jdXMge1xuICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLWZvY3VzLCAjMjU2M2ViKTtcbiAgICAgIGJveC1zaGFkb3c6IHZhcigtLXJwdC1ib3gtc2hhZG93LWZvY3VzLCAwIDAgMCAzcHggcmdiYSgzNywgOTksIDIzNSwgMC4yNSkpO1xuICAgIH1cbiAgICAucnB0LWRhdGUtaW5wdXQ6ZGlzYWJsZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmOGZhZmMpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgfVxuICAgIC5ycHQtZGF0ZS1pbnB1dC5ycHQtaW52YWxpZCB7XG4gICAgICBib3JkZXItY29sb3I6IHZhcigtLXJwdC1jb2xvci1kYW5nZXIsICNlZjQ0NDQpO1xuICAgIH1cbiAgICAucnB0LWRhdGUtaW5wdXQucnB0LWludmFsaWQ6Zm9jdXMge1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHJnYmEoMjM5LCA2OCwgNjgsIDAuMjUpO1xuICAgIH1cbiAgICAucnB0LWVycm9yLXRleHQge1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItZGFuZ2VyLCAjZWY0NDQ0KTtcbiAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUnB0RGF0ZUNvbXBvbmVudCB7XG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+KCk7XG4gIHJlYWRvbmx5IGNvbnRyb2wgPSBpbnB1dDxGb3JtQ29udHJvbD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZhbGxiYWNrQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG5cbiAgcmVhZG9ubHkgZm9ybUNvbnRyb2wgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbnRyb2woKSA/PyB0aGlzLmZhbGxiYWNrQ29udHJvbCk7XG4gIHJlYWRvbmx5IGVsZW1lbnRJZCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY29uZmlnKCkua2V5IHx8IHRoaXMuY29uZmlnKCkuaWQpO1xuICByZWFkb25seSBkYXRlVHlwZSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsnaW5jbHVkZVRpbWUnXSA/ICdkYXRldGltZS1sb2NhbCcgOiAnZGF0ZScpKTtcbiAgcmVhZG9ubHkgbWluRGF0ZSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLmNvbmZpZygpLnByb3BlcnRpZXM/LlsnbWluRGF0ZSddIGFzIHN0cmluZykgfHwgbnVsbCk7XG4gIHJlYWRvbmx5IG1heERhdGUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5jb25maWcoKS5wcm9wZXJ0aWVzPy5bJ21heERhdGUnXSBhcyBzdHJpbmcpIHx8IG51bGwpO1xuXG4gIHJlYWRvbmx5IGlzSW52YWxpZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjdHJsID0gdGhpcy5mb3JtQ29udHJvbCgpO1xuICAgIHJldHVybiBjdHJsLmludmFsaWQgJiYgKGN0cmwuZGlydHkgfHwgY3RybC50b3VjaGVkKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZXJyb3JNZXNzYWdlID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGN0cmwgPSB0aGlzLmZvcm1Db250cm9sKCk7XG4gICAgaWYgKCFjdHJsLmludmFsaWQgfHwgKCFjdHJsLmRpcnR5ICYmICFjdHJsLnRvdWNoZWQpKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGNvbnN0IGVycm9ycyA9IGN0cmwuZXJyb3JzO1xuICAgIGlmICghZXJyb3JzKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZmlyc3RLZXkgPSBPYmplY3Qua2V5cyhlcnJvcnMpWzBdO1xuICAgIHJldHVybiBnZXRWYWxpZGF0aW9uTWVzc2FnZSh0aGlzLmNvbmZpZygpLnZhbGlkYXRpb24sIGZpcnN0S2V5KTtcbiAgfSk7XG59XG4iXX0=
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, effect, inject, input, signal, } from '@angular/core';
|
|
2
|
+
import { FormControl, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
+
import { getValidationMessage } from '../../../core/validation/validation-factory';
|
|
4
|
+
import { MasterDataProvider } from '../../../data-access/contracts/master-data.provider';
|
|
5
|
+
import { ReportLookupAdapter } from '../../../data-access/contracts/lookup.contract';
|
|
6
|
+
import { ReportSessionContextService } from '../../../core/services/report-session-context.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "@angular/forms";
|
|
9
|
+
export class RptDropdownComponent {
|
|
10
|
+
masterDataProvider = inject(MasterDataProvider, { optional: true });
|
|
11
|
+
lookupAdapter = inject(ReportLookupAdapter, { optional: true });
|
|
12
|
+
sessionService = inject(ReportSessionContextService, { optional: true });
|
|
13
|
+
config = input.required();
|
|
14
|
+
control = input();
|
|
15
|
+
fallbackControl = new FormControl('');
|
|
16
|
+
dynamicOptions = signal([]);
|
|
17
|
+
lookupSub;
|
|
18
|
+
masterDataSub;
|
|
19
|
+
formControl = computed(() => this.control() ?? this.fallbackControl);
|
|
20
|
+
elementId = computed(() => this.config().key || this.config().id);
|
|
21
|
+
placeholder = computed(() => this.config().properties?.['placeholder'] ?? '-- Select --');
|
|
22
|
+
staticOptions = computed(() => {
|
|
23
|
+
const opts = this.config().properties?.['options'];
|
|
24
|
+
if (Array.isArray(opts)) {
|
|
25
|
+
return opts;
|
|
26
|
+
}
|
|
27
|
+
return [];
|
|
28
|
+
});
|
|
29
|
+
allOptions = computed(() => {
|
|
30
|
+
const dynamic = this.dynamicOptions();
|
|
31
|
+
if (dynamic.length > 0) {
|
|
32
|
+
return dynamic;
|
|
33
|
+
}
|
|
34
|
+
return this.staticOptions();
|
|
35
|
+
});
|
|
36
|
+
isInvalid = computed(() => {
|
|
37
|
+
const ctrl = this.formControl();
|
|
38
|
+
return ctrl.invalid && (ctrl.dirty || ctrl.touched);
|
|
39
|
+
});
|
|
40
|
+
errorMessage = computed(() => {
|
|
41
|
+
const ctrl = this.formControl();
|
|
42
|
+
if (!ctrl.invalid || (!ctrl.dirty && !ctrl.touched)) {
|
|
43
|
+
return '';
|
|
44
|
+
}
|
|
45
|
+
const errors = ctrl.errors;
|
|
46
|
+
if (!errors)
|
|
47
|
+
return '';
|
|
48
|
+
const firstKey = Object.keys(errors)[0];
|
|
49
|
+
return getValidationMessage(this.config().validation, firstKey);
|
|
50
|
+
});
|
|
51
|
+
constructor() {
|
|
52
|
+
effect(() => {
|
|
53
|
+
const session = this.sessionService?.sessionContext() ?? {};
|
|
54
|
+
// Reading config registers dependency on component configuration
|
|
55
|
+
const _ = this.config();
|
|
56
|
+
this.reloadDataSourceOptions(session);
|
|
57
|
+
}, { allowSignalWrites: true });
|
|
58
|
+
}
|
|
59
|
+
ngOnInit() {
|
|
60
|
+
// Initial fetch handled cleanly by the constructor effect
|
|
61
|
+
}
|
|
62
|
+
ngOnDestroy() {
|
|
63
|
+
this.lookupSub?.unsubscribe();
|
|
64
|
+
this.masterDataSub?.unsubscribe();
|
|
65
|
+
}
|
|
66
|
+
reloadDataSourceOptions(session) {
|
|
67
|
+
const ds = this.config().dataSource;
|
|
68
|
+
if (!ds)
|
|
69
|
+
return;
|
|
70
|
+
// 1. Database Table / Stored Procedure Lookup
|
|
71
|
+
if ((ds.sourceType === 'table' || ds.sourceType === 'procedure' || ds.entityName) && this.lookupAdapter) {
|
|
72
|
+
let resolvedParams = { ...session };
|
|
73
|
+
if (ds.parameterMappings) {
|
|
74
|
+
for (const [key, rawVal] of Object.entries(ds.parameterMappings)) {
|
|
75
|
+
if (typeof rawVal === 'string' && rawVal.startsWith('{{session.') && rawVal.endsWith('}}')) {
|
|
76
|
+
const sessionKey = rawVal.slice(10, -2).trim();
|
|
77
|
+
const sessionVal = session[sessionKey];
|
|
78
|
+
if (sessionVal !== undefined) {
|
|
79
|
+
resolvedParams[key] = sessionVal;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
resolvedParams[key] = rawVal;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.lookupSub?.unsubscribe();
|
|
87
|
+
this.lookupSub = this.lookupAdapter
|
|
88
|
+
.fetchOptions({
|
|
89
|
+
sourceType: ds.sourceType ?? 'table',
|
|
90
|
+
entityName: ds.entityName,
|
|
91
|
+
schema: ds.schema ?? 'dbo',
|
|
92
|
+
valueField: ds.valueField || 'id',
|
|
93
|
+
displayField: ds.displayField || 'name',
|
|
94
|
+
filter: ds.filter,
|
|
95
|
+
parameters: resolvedParams,
|
|
96
|
+
})
|
|
97
|
+
.subscribe({
|
|
98
|
+
next: (items) => {
|
|
99
|
+
this.dynamicOptions.set(items.map((it) => ({
|
|
100
|
+
key: String(it.value),
|
|
101
|
+
label: it.label,
|
|
102
|
+
})));
|
|
103
|
+
},
|
|
104
|
+
error: (err) => {
|
|
105
|
+
console.error(`[RptDropdown] Failed to load lookup options for ${ds.entityName}:`, err);
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// 2. Legacy Master Data Provider
|
|
111
|
+
if (ds.masterName && this.masterDataProvider && !this.masterDataSub) {
|
|
112
|
+
this.masterDataSub = this.masterDataProvider.getMasterData(ds.masterName).subscribe({
|
|
113
|
+
next: (items) => {
|
|
114
|
+
this.dynamicOptions.set(items.map((it) => ({
|
|
115
|
+
key: String(it.value ?? it['id'] ?? ''),
|
|
116
|
+
label: String(it.label ?? it['name'] ?? ''),
|
|
117
|
+
})));
|
|
118
|
+
},
|
|
119
|
+
error: (err) => {
|
|
120
|
+
console.error(`[RptDropdown] Failed to load master data for ${ds.masterName}:`, err);
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
126
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RptDropdownComponent, isStandalone: true, selector: "rpt-dropdown", 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: `
|
|
127
|
+
<div class="rpt-field-group">
|
|
128
|
+
@if (config().label) {
|
|
129
|
+
<label [for]="elementId()" class="rpt-label">
|
|
130
|
+
{{ config().label }}
|
|
131
|
+
@if (config().validation?.required) {
|
|
132
|
+
<span class="rpt-required-marker">*</span>
|
|
133
|
+
}
|
|
134
|
+
</label>
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
<div class="rpt-select-wrapper">
|
|
138
|
+
<select
|
|
139
|
+
[id]="elementId()"
|
|
140
|
+
[formControl]="formControl()"
|
|
141
|
+
[class.rpt-invalid]="isInvalid()"
|
|
142
|
+
class="rpt-select"
|
|
143
|
+
>
|
|
144
|
+
@if (placeholder()) {
|
|
145
|
+
<option value="" [disabled]="config().validation?.required">{{ placeholder() }}</option>
|
|
146
|
+
}
|
|
147
|
+
@for (opt of allOptions(); track opt.key) {
|
|
148
|
+
<option [value]="opt.key">{{ opt.label }}</option>
|
|
149
|
+
}
|
|
150
|
+
</select>
|
|
151
|
+
<div class="rpt-select-arrow" aria-hidden="true">
|
|
152
|
+
<svg width="12" height="8" viewBox="0 0 12 8" fill="none">
|
|
153
|
+
<path d="M1 1.5L6 6.5L11 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
154
|
+
</svg>
|
|
155
|
+
</div>
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
@if (errorMessage()) {
|
|
159
|
+
<span class="rpt-error-text">{{ errorMessage() }}</span>
|
|
160
|
+
}
|
|
161
|
+
</div>
|
|
162
|
+
`, isInline: true, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{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-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { 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 });
|
|
163
|
+
}
|
|
164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RptDropdownComponent, decorators: [{
|
|
165
|
+
type: Component,
|
|
166
|
+
args: [{ selector: 'rpt-dropdown', standalone: true, imports: [ReactiveFormsModule], template: `
|
|
167
|
+
<div class="rpt-field-group">
|
|
168
|
+
@if (config().label) {
|
|
169
|
+
<label [for]="elementId()" class="rpt-label">
|
|
170
|
+
{{ config().label }}
|
|
171
|
+
@if (config().validation?.required) {
|
|
172
|
+
<span class="rpt-required-marker">*</span>
|
|
173
|
+
}
|
|
174
|
+
</label>
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
<div class="rpt-select-wrapper">
|
|
178
|
+
<select
|
|
179
|
+
[id]="elementId()"
|
|
180
|
+
[formControl]="formControl()"
|
|
181
|
+
[class.rpt-invalid]="isInvalid()"
|
|
182
|
+
class="rpt-select"
|
|
183
|
+
>
|
|
184
|
+
@if (placeholder()) {
|
|
185
|
+
<option value="" [disabled]="config().validation?.required">{{ placeholder() }}</option>
|
|
186
|
+
}
|
|
187
|
+
@for (opt of allOptions(); track opt.key) {
|
|
188
|
+
<option [value]="opt.key">{{ opt.label }}</option>
|
|
189
|
+
}
|
|
190
|
+
</select>
|
|
191
|
+
<div class="rpt-select-arrow" aria-hidden="true">
|
|
192
|
+
<svg width="12" height="8" viewBox="0 0 12 8" fill="none">
|
|
193
|
+
<path d="M1 1.5L6 6.5L11 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
194
|
+
</svg>
|
|
195
|
+
</div>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
@if (errorMessage()) {
|
|
199
|
+
<span class="rpt-error-text">{{ errorMessage() }}</span>
|
|
200
|
+
}
|
|
201
|
+
</div>
|
|
202
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;width:100%;height:100%;box-sizing:border-box;font-family:var(--rpt-font-family, inherit)}.rpt-field-group{display:flex;flex-direction:column;height:100%;gap:4px;box-sizing:border-box}.rpt-label{font-size:var(--rpt-font-size-sm, .75rem);font-weight:500;color:var(--rpt-color-text, #0f172a);flex-shrink:0}.rpt-required-marker{color:var(--rpt-color-danger, #ef4444);margin-left:2px}.rpt-select-wrapper{position:relative;width:100%;flex:1;min-height:0;display:flex;align-items:center}.rpt-select{width:100%;height:100%;min-height:38px;box-sizing:border-box;padding:6px 36px 6px 12px;font-size:var(--rpt-font-size-base, .875rem);color:var(--rpt-color-text, #0f172a);background-color:var(--rpt-color-bg, #ffffff);border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius, 6px);appearance:none;-webkit-appearance:none;outline:none;cursor:pointer;transition:border-color var(--rpt-transition-speed, .15s) ease,box-shadow var(--rpt-transition-speed, .15s) ease}.rpt-select:hover:not(:disabled){border-color:var(--rpt-color-border-hover, #94a3b8)}.rpt-select:focus{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-select:disabled{background-color:var(--rpt-color-surface, #f8fafc);color:var(--rpt-color-text-muted, #64748b);cursor:not-allowed}.rpt-select.rpt-invalid{border-color:var(--rpt-color-danger, #ef4444)}.rpt-select.rpt-invalid:focus{box-shadow:0 0 0 3px #ef444440}.rpt-select-arrow{position:absolute;right:12px;top:50%;transform:translateY(-50%);pointer-events:none;color:var(--rpt-color-text-muted, #64748b);display:flex;align-items:center}.rpt-error-text{font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-danger, #ef4444);margin-top:2px}\n"] }]
|
|
203
|
+
}], ctorParameters: () => [] });
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnB0LWRyb3Bkb3duLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2J3YXlzLXJlcG9ydC9zcmMvbGliL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9kcm9wZG93bi9ycHQtZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR2xFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHVEQUF1RCxDQUFDOzs7QUF3SXBHLE1BQU0sT0FBTyxvQkFBb0I7SUFDZCxrQkFBa0IsR0FBRyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNwRSxhQUFhLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDaEUsY0FBYyxHQUFHLE1BQU0sQ0FBQywyQkFBMkIsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRWpGLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUE2QixDQUFDO0lBQ3JELE9BQU8sR0FBRyxLQUFLLEVBQWUsQ0FBQztJQUV2QixlQUFlLEdBQUcsSUFBSSxXQUFXLENBQUMsRUFB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Q0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDbEYsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQ3JCLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7d0JBQ2pCLEdBQUcsRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUN2QyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztxQkFDNUMsQ0FBQyxDQUFDLENBQ0osQ0FBQztnQkFDSixDQUFDO2dCQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0RBQWdELEVBQUUsQ0FBQyxVQUFVLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDdkYsQ0FBQzthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO3dHQXpJVSxvQkFBb0I7NEZBQXBCLG9CQUFvQiw0VUE1SHJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQ1QsbTBEQXJDUyxtQkFBbUI7OzRGQTZIbEIsb0JBQW9CO2tCQWhJaEMsU0FBUzsrQkFDRSxjQUFjLGNBQ1osSUFBSSxXQUNQLENBQUMsbUJBQW1CLENBQUMsWUFDcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DVCxtQkFzRmdCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbmplY3QsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBSZXBvcnRDb21wb25lbnREZWZpbml0aW9uIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbHMvcmVwb3J0LWNvbXBvbmVudC5tb2RlbCc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0aW9uTWVzc2FnZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdmFsaWRhdGlvbi92YWxpZGF0aW9uLWZhY3RvcnknO1xuaW1wb3J0IHsgTWFzdGVyRGF0YVByb3ZpZGVyIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS1hY2Nlc3MvY29udHJhY3RzL21hc3Rlci1kYXRhLnByb3ZpZGVyJztcbmltcG9ydCB7IFJlcG9ydExvb2t1cEFkYXB0ZXIgfSBmcm9tICcuLi8uLi8uLi9kYXRhLWFjY2Vzcy9jb250cmFjdHMvbG9va3VwLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlcG9ydFNlc3Npb25Db250ZXh0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcmVwb3J0LXNlc3Npb24tY29udGV4dC5zZXJ2aWNlJztcbmltcG9ydCB7IFNlc3Npb25Db250ZXh0TWFwIH0gZnJvbSAnLi4vLi4vLi4vY29yZS90b2tlbnMvc2Vzc2lvbi1jb250ZXh0LnRva2VuJztcblxuZXhwb3J0IGludGVyZmFjZSBEcm9wZG93bk9wdGlvbiB7XG4gIGtleTogc3RyaW5nIHwgbnVtYmVyO1xuICBsYWJlbDogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtZHJvcGRvd24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJwdC1maWVsZC1ncm91cFwiPlxuICAgICAgQGlmIChjb25maWcoKS5sYWJlbCkge1xuICAgICAgICA8bGFiZWwgW2Zvcl09XCJlbGVtZW50SWQoKVwiIGNsYXNzPVwicnB0LWxhYmVsXCI+XG4gICAgICAgICAge3sgY29uZmlnKCkubGFiZWwgfX1cbiAgICAgICAgICBAaWYgKGNvbmZpZygpLnZhbGlkYXRpb24/LnJlcXVpcmVkKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJwdC1yZXF1aXJlZC1tYXJrZXJcIj4qPC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIH1cblxuICAgICAgPGRpdiBjbGFzcz1cInJwdC1zZWxlY3Qtd3JhcHBlclwiPlxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgW2lkXT1cImVsZW1lbnRJZCgpXCJcbiAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwiZm9ybUNvbnRyb2woKVwiXG4gICAgICAgICAgW2NsYXNzLnJwdC1pbnZhbGlkXT1cImlzSW52YWxpZCgpXCJcbiAgICAgICAgICBjbGFzcz1cInJwdC1zZWxlY3RcIlxuICAgICAgICA+XG4gICAgICAgICAgQGlmIChwbGFjZWhvbGRlcigpKSB7XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCIgW2Rpc2FibGVkXT1cImNvbmZpZygpLnZhbGlkYXRpb24/LnJlcXVpcmVkXCI+e3sgcGxhY2Vob2xkZXIoKSB9fTwvb3B0aW9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICBAZm9yIChvcHQgb2YgYWxsT3B0aW9ucygpOyB0cmFjayBvcHQua2V5KSB7XG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJvcHQua2V5XCI+e3sgb3B0LmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgfVxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJwdC1zZWxlY3QtYXJyb3dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCI4XCIgdmlld0JveD1cIjAgMCAxMiA4XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMSAxLjVMNiA2LjVMMTEgMS41XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKGVycm9yTWVzc2FnZSgpKSB7XG4gICAgICAgIDxzcGFuIGNsYXNzPVwicnB0LWVycm9yLXRleHRcIj57eyBlcnJvck1lc3NhZ2UoKSB9fTwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIDpob3N0IHtcbiAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgZm9udC1mYW1pbHk6IHZhcigtLXJwdC1mb250LWZhbWlseSwgaW5oZXJpdCk7XG4gICAgfVxuICAgIC5ycHQtZmllbGQtZ3JvdXAge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBnYXA6IDRweDtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAgIC5ycHQtbGFiZWwge1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICBjb2xvcjogdmFyKC0tcnB0LWNvbG9yLXRleHQsICMwZjE3MmEpO1xuICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgfVxuICAgIC5ycHQtcmVxdWlyZWQtbWFya2VyIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItZGFuZ2VyLCAjZWY0NDQ0KTtcbiAgICAgIG1hcmdpbi1sZWZ0OiAycHg7XG4gICAgfVxuICAgIC5ycHQtc2VsZWN0LXdyYXBwZXIge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBmbGV4OiAxO1xuICAgICAgbWluLWhlaWdodDogMDtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgICAucnB0LXNlbGVjdCB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIG1pbi1oZWlnaHQ6IDM4cHg7XG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgcGFkZGluZzogNnB4IDM2cHggNnB4IDEycHg7XG4gICAgICBmb250LXNpemU6IHZhcigtLXJwdC1mb250LXNpemUtYmFzZSwgMC44NzVyZW0pO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LCAjMGYxNzJhKTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJwdC1jb2xvci1iZywgI2ZmZmZmZik7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ycHQtY29sb3ItYm9yZGVyLCAjY2JkNWUxKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLXJwdC1ib3JkZXItcmFkaXVzLCA2cHgpO1xuICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgdmFyKC0tcnB0LXRyYW5zaXRpb24tc3BlZWQsIDE1MG1zKSBlYXNlLFxuICAgICAgICAgICAgICAgICAgYm94LXNoYWRvdyB2YXIoLS1ycHQtdHJhbnNpdGlvbi1zcGVlZCwgMTUwbXMpIGVhc2U7XG4gICAgfVxuICAgIC5ycHQtc2VsZWN0OmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1ob3ZlciwgIzk0YTNiOCk7XG4gICAgfVxuICAgIC5ycHQtc2VsZWN0OmZvY3VzIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLWJvcmRlci1mb2N1cywgIzI1NjNlYik7XG4gICAgICBib3gtc2hhZG93OiB2YXIoLS1ycHQtYm94LXNoYWRvdy1mb2N1cywgMCAwIDAgM3B4IHJnYmEoMzcsIDk5LCAyMzUsIDAuMjUpKTtcbiAgICB9XG4gICAgLnJwdC1zZWxlY3Q6ZGlzYWJsZWQge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLXN1cmZhY2UsICNmOGZhZmMpO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgfVxuICAgIC5ycHQtc2VsZWN0LnJwdC1pbnZhbGlkIHtcbiAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcnB0LWNvbG9yLWRhbmdlciwgI2VmNDQ0NCk7XG4gICAgfVxuICAgIC5ycHQtc2VsZWN0LnJwdC1pbnZhbGlkOmZvY3VzIHtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDIzOSwgNjgsIDY4LCAwLjI1KTtcbiAgICB9XG4gICAgLnJwdC1zZWxlY3QtYXJyb3cge1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgcmlnaHQ6IDEycHg7XG4gICAgICB0b3A6IDUwJTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgY29sb3I6IHZhcigtLXJwdC1jb2xvci10ZXh0LW11dGVkLCAjNjQ3NDhiKTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cbiAgICAucnB0LWVycm9yLXRleHQge1xuICAgICAgZm9udC1zaXplOiB2YXIoLS1ycHQtZm9udC1zaXplLXNtLCAwLjc1cmVtKTtcbiAgICAgIGNvbG9yOiB2YXIoLS1ycHQtY29sb3ItZGFuZ2VyLCAjZWY0NDQ0KTtcbiAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICB9XG4gIGBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgUnB0RHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWFzdGVyRGF0YVByb3ZpZGVyID0gaW5qZWN0KE1hc3RlckRhdGFQcm92aWRlciwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb29rdXBBZGFwdGVyID0gaW5qZWN0KFJlcG9ydExvb2t1cEFkYXB0ZXIsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvblNlcnZpY2UgPSBpbmplY3QoUmVwb3J0U2Vzc2lvbkNvbnRleHRTZXJ2aWNlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIHJlYWRvbmx5IGNvbmZpZyA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+KCk7XG4gIHJlYWRvbmx5IGNvbnRyb2wgPSBpbnB1dDxGb3JtQ29udHJvbD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZhbGxiYWNrQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHluYW1pY09wdGlvbnMgPSBzaWduYWw8RHJvcGRvd25PcHRpb25bXT4oW10pO1xuICBwcml2YXRlIGxvb2t1cFN1Yj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBtYXN0ZXJEYXRhU3ViPzogU3Vic2NyaXB0aW9uO1xuXG4gIHJlYWRvbmx5IGZvcm1Db250cm9sID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb250cm9sKCkgPz8gdGhpcy5mYWxsYmFja0NvbnRyb2wpO1xuICByZWFkb25seSBlbGVtZW50SWQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbmZpZygpLmtleSB8fCB0aGlzLmNvbmZpZygpLmlkKTtcbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXIgPSBjb21wdXRlZChcbiAgICAoKSA9PiAodGhpcy5jb25maWcoKS5wcm9wZXJ0aWVzPy5bJ3BsYWNlaG9sZGVyJ10gYXMgc3RyaW5nKSA/PyAnLS0gU2VsZWN0IC0tJ1xuICApO1xuXG4gIHJlYWRvbmx5IHN0YXRpY09wdGlvbnMgPSBjb21wdXRlZDxEcm9wZG93bk9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9IHRoaXMuY29uZmlnKCkucHJvcGVydGllcz8uWydvcHRpb25zJ107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0cykpIHtcbiAgICAgIHJldHVybiBvcHRzO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFsbE9wdGlvbnMgPSBjb21wdXRlZDxEcm9wZG93bk9wdGlvbltdPigoKSA9PiB7XG4gICAgY29uc3QgZHluYW1pYyA9IHRoaXMuZHluYW1pY09wdGlvbnMoKTtcbiAgICBpZiAoZHluYW1pYy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZHluYW1pYztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdGljT3B0aW9ucygpO1xuICB9KTtcblxuICByZWFkb25seSBpc0ludmFsaWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybUNvbnRyb2woKTtcbiAgICByZXR1cm4gY3RybC5pbnZhbGlkICYmIChjdHJsLmRpcnR5IHx8IGN0cmwudG91Y2hlZCk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGVycm9yTWVzc2FnZSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjdHJsID0gdGhpcy5mb3JtQ29udHJvbCgpO1xuICAgIGlmICghY3RybC5pbnZhbGlkIHx8ICghY3RybC5kaXJ0eSAmJiAhY3RybC50b3VjaGVkKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBlcnJvcnMgPSBjdHJsLmVycm9ycztcbiAgICBpZiAoIWVycm9ycykgcmV0dXJuICcnO1xuICAgIGNvbnN0IGZpcnN0S2V5ID0gT2JqZWN0LmtleXMoZXJyb3JzKVswXTtcbiAgICByZXR1cm4gZ2V0VmFsaWRhdGlvbk1lc3NhZ2UodGhpcy5jb25maWcoKS52YWxpZGF0aW9uLCBmaXJzdEtleSk7XG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMuc2Vzc2lvblNlcnZpY2U/LnNlc3Npb25Db250ZXh0KCkgPz8ge307XG4gICAgICAgIC8vIFJlYWRpbmcgY29uZmlnIHJlZ2lzdGVycyBkZXBlbmRlbmN5IG9uIGNvbXBvbmVudCBjb25maWd1cmF0aW9uXG4gICAgICAgIGNvbnN0IF8gPSB0aGlzLmNvbmZpZygpO1xuICAgICAgICB0aGlzLnJlbG9hZERhdGFTb3VyY2VPcHRpb25zKHNlc3Npb24pO1xuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBJbml0aWFsIGZldGNoIGhhbmRsZWQgY2xlYW5seSBieSB0aGUgY29uc3RydWN0b3IgZWZmZWN0XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvb2t1cFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm1hc3RlckRhdGFTdWI/LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbG9hZERhdGFTb3VyY2VPcHRpb25zKHNlc3Npb246IFNlc3Npb25Db250ZXh0TWFwKTogdm9pZCB7XG4gICAgY29uc3QgZHMgPSB0aGlzLmNvbmZpZygpLmRhdGFTb3VyY2U7XG4gICAgaWYgKCFkcykgcmV0dXJuO1xuXG4gICAgLy8gMS4gRGF0YWJhc2UgVGFibGUgLyBTdG9yZWQgUHJvY2VkdXJlIExvb2t1cFxuICAgIGlmICgoZHMuc291cmNlVHlwZSA9PT0gJ3RhYmxlJyB8fCBkcy5zb3VyY2VUeXBlID09PSAncHJvY2VkdXJlJyB8fCBkcy5lbnRpdHlOYW1lKSAmJiB0aGlzLmxvb2t1cEFkYXB0ZXIpIHtcbiAgICAgIGxldCByZXNvbHZlZFBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLnNlc3Npb24gfTtcblxuICAgICAgaWYgKGRzLnBhcmFtZXRlck1hcHBpbmdzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgcmF3VmFsXSBvZiBPYmplY3QuZW50cmllcyhkcy5wYXJhbWV0ZXJNYXBwaW5ncykpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJhd1ZhbCA9PT0gJ3N0cmluZycgJiYgcmF3VmFsLnN0YXJ0c1dpdGgoJ3t7c2Vzc2lvbi4nKSAmJiByYXdWYWwuZW5kc1dpdGgoJ319JykpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlc3Npb25LZXkgPSByYXdWYWwuc2xpY2UoMTAsIC0yKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCBzZXNzaW9uVmFsID0gc2Vzc2lvbltzZXNzaW9uS2V5XTtcbiAgICAgICAgICAgIGlmIChzZXNzaW9uVmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZWRQYXJhbXNba2V5XSA9IHNlc3Npb25WYWw7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXNvbHZlZFBhcmFtc1trZXldID0gcmF3VmFsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9va3VwU3ViPy51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy5sb29rdXBTdWIgPSB0aGlzLmxvb2t1cEFkYXB0ZXJcbiAgICAgICAgLmZldGNoT3B0aW9ucyh7XG4gICAgICAgICAgc291cmNlVHlwZTogZHMuc291cmNlVHlwZSA/PyAndGFibGUnLFxuICAgICAgICAgIGVudGl0eU5hbWU6IGRzLmVudGl0eU5hbWUsXG4gICAgICAgICAgc2NoZW1hOiBkcy5zY2hlbWEgPz8gJ2RibycsXG4gICAgICAgICAgdmFsdWVGaWVsZDogZHMudmFsdWVGaWVsZCB8fCAnaWQnLFxuICAgICAgICAgIGRpc3BsYXlGaWVsZDogZHMuZGlzcGxheUZpZWxkIHx8ICduYW1lJyxcbiAgICAgICAgICBmaWx0ZXI6IGRzLmZpbHRlcixcbiAgICAgICAgICBwYXJhbWV0ZXJzOiByZXNvbHZlZFBhcmFtcyxcbiAgICAgICAgfSlcbiAgICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmR5bmFtaWNPcHRpb25zLnNldChcbiAgICAgICAgICAgICAgaXRlbXMubWFwKChpdCkgPT4gKHtcbiAgICAgICAgICAgICAgICBrZXk6IFN0cmluZyhpdC52YWx1ZSksXG4gICAgICAgICAgICAgICAgbGFiZWw6IGl0LmxhYmVsLFxuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW1JwdERyb3Bkb3duXSBGYWlsZWQgdG8gbG9hZCBsb29rdXAgb3B0aW9ucyBmb3IgJHtkcy5lbnRpdHlOYW1lfTpgLCBlcnIpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDIuIExlZ2FjeSBNYXN0ZXIgRGF0YSBQcm92aWRlclxuICAgIGlmIChkcy5tYXN0ZXJOYW1lICYmIHRoaXMubWFzdGVyRGF0YVByb3ZpZGVyICYmICF0aGlzLm1hc3RlckRhdGFTdWIpIHtcbiAgICAgIHRoaXMubWFzdGVyRGF0YVN1YiA9IHRoaXMubWFzdGVyRGF0YVByb3ZpZGVyLmdldE1hc3RlckRhdGEoZHMubWFzdGVyTmFtZSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgdGhpcy5keW5hbWljT3B0aW9ucy5zZXQoXG4gICAgICAgICAgICBpdGVtcy5tYXAoKGl0KSA9PiAoe1xuICAgICAgICAgICAgICBrZXk6IFN0cmluZyhpdC52YWx1ZSA/PyBpdFsnaWQnXSA/PyAnJyksXG4gICAgICAgICAgICAgIGxhYmVsOiBTdHJpbmcoaXQubGFiZWwgPz8gaXRbJ25hbWUnXSA/PyAnJyksXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtScHREcm9wZG93bl0gRmFpbGVkIHRvIGxvYWQgbWFzdGVyIGRhdGEgZm9yICR7ZHMubWFzdGVyTmFtZX06YCwgZXJyKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19
|