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,350 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, computed, input, output, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
export class PropertyEditorLayoutComponent {
|
|
7
|
+
comp = input.required();
|
|
8
|
+
maxColumns = input(12);
|
|
9
|
+
updateLayout = output();
|
|
10
|
+
updateHeight = output();
|
|
11
|
+
resetDimensions = output();
|
|
12
|
+
columnList = computed(() => {
|
|
13
|
+
return Array.from({ length: this.maxColumns() }, (_, i) => i + 1);
|
|
14
|
+
});
|
|
15
|
+
onLayoutChange(key, value) {
|
|
16
|
+
this.updateLayout.emit({ key, value });
|
|
17
|
+
}
|
|
18
|
+
alignRight() {
|
|
19
|
+
const span = this.comp().layout?.columnSpan || (this.comp().type === 'button' ? 2 : 4);
|
|
20
|
+
const startCol = Math.max(1, this.maxColumns() - span + 1);
|
|
21
|
+
this.onLayoutChange('column', startCol);
|
|
22
|
+
}
|
|
23
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
24
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: PropertyEditorLayoutComponent, isStandalone: true, selector: "rpt-property-editor-layout", inputs: { comp: { classPropertyName: "comp", publicName: "comp", isSignal: true, isRequired: true, transformFunction: null }, maxColumns: { classPropertyName: "maxColumns", publicName: "maxColumns", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { updateLayout: "updateLayout", updateHeight: "updateHeight", resetDimensions: "resetDimensions" }, ngImport: i0, template: `
|
|
25
|
+
<div class="property-group">
|
|
26
|
+
<div class="group-title">Layout & Dimensions</div>
|
|
27
|
+
|
|
28
|
+
<!-- Column Span -->
|
|
29
|
+
<div class="field-row">
|
|
30
|
+
<div class="field-label-row">
|
|
31
|
+
<label class="field-label">Column Span</label>
|
|
32
|
+
<span class="field-badge-val">{{ comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4) }} / {{ maxColumns() }} cols</span>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="span-slider-row">
|
|
35
|
+
<input
|
|
36
|
+
type="range"
|
|
37
|
+
class="field-slider"
|
|
38
|
+
min="1"
|
|
39
|
+
[max]="maxColumns()"
|
|
40
|
+
[ngModel]="comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)"
|
|
41
|
+
(ngModelChange)="onLayoutChange('columnSpan', +$event)"
|
|
42
|
+
/>
|
|
43
|
+
<input
|
|
44
|
+
type="number"
|
|
45
|
+
class="field-input field-input-sm"
|
|
46
|
+
min="1"
|
|
47
|
+
[max]="maxColumns()"
|
|
48
|
+
[ngModel]="comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)"
|
|
49
|
+
(ngModelChange)="onLayoutChange('columnSpan', +$event)"
|
|
50
|
+
/>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<!-- Start Column Position (Independent Placement) -->
|
|
55
|
+
<div class="field-row">
|
|
56
|
+
<div class="field-label-row">
|
|
57
|
+
<label class="field-label">Start Column (Position)</label>
|
|
58
|
+
<span class="field-badge-val">{{ comp().layout?.column ? 'Col ' + comp().layout?.column : 'Auto' }}</span>
|
|
59
|
+
</div>
|
|
60
|
+
<select
|
|
61
|
+
class="field-select"
|
|
62
|
+
[ngModel]="comp().layout?.column ?? 0"
|
|
63
|
+
(ngModelChange)="onLayoutChange('column', +$event === 0 ? undefined : +$event)"
|
|
64
|
+
>
|
|
65
|
+
<option [value]="0">Auto (Flow naturally)</option>
|
|
66
|
+
@for (colNum of columnList(); track colNum) {
|
|
67
|
+
<option [value]="colNum">Column {{ colNum }}</option>
|
|
68
|
+
}
|
|
69
|
+
</select>
|
|
70
|
+
<div class="preset-pill-group">
|
|
71
|
+
<button type="button" class="preset-pill" (click)="onLayoutChange('column', undefined)">Auto Flow</button>
|
|
72
|
+
<button type="button" class="preset-pill" (click)="onLayoutChange('column', 1)">Start (Col 1)</button>
|
|
73
|
+
<button type="button" class="preset-pill" (click)="alignRight()">Align Right</button>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<!-- Row Span for multi-row items -->
|
|
78
|
+
<div class="field-row">
|
|
79
|
+
<div class="field-label-row">
|
|
80
|
+
<label class="field-label">Row Span</label>
|
|
81
|
+
<span class="field-badge-val">{{ comp().layout?.rowSpan || 1 }} {{ (comp().layout?.rowSpan || 1) === 1 ? 'row' : 'rows' }}</span>
|
|
82
|
+
</div>
|
|
83
|
+
<input
|
|
84
|
+
type="number"
|
|
85
|
+
class="field-input"
|
|
86
|
+
min="1"
|
|
87
|
+
max="6"
|
|
88
|
+
[ngModel]="comp().layout?.rowSpan || 1"
|
|
89
|
+
(ngModelChange)="onLayoutChange('rowSpan', +$event)"
|
|
90
|
+
/>
|
|
91
|
+
</div>
|
|
92
|
+
|
|
93
|
+
<!-- Component Width -->
|
|
94
|
+
<div class="field-row">
|
|
95
|
+
<label class="field-label">Component Width</label>
|
|
96
|
+
<input
|
|
97
|
+
type="text"
|
|
98
|
+
class="field-input"
|
|
99
|
+
placeholder="e.g. 100% or 200px"
|
|
100
|
+
[ngModel]="comp().layout?.width || ''"
|
|
101
|
+
(ngModelChange)="onLayoutChange('width', $event || undefined)"
|
|
102
|
+
/>
|
|
103
|
+
</div>
|
|
104
|
+
|
|
105
|
+
<!-- Component Height Control -->
|
|
106
|
+
<div class="field-row">
|
|
107
|
+
<div class="field-label-row">
|
|
108
|
+
<label class="field-label">Component Height</label>
|
|
109
|
+
<span class="field-badge-val">{{ comp().layout?.height || 'Auto' }}</span>
|
|
110
|
+
</div>
|
|
111
|
+
<div class="preset-pill-group">
|
|
112
|
+
<button
|
|
113
|
+
type="button"
|
|
114
|
+
class="preset-pill"
|
|
115
|
+
[class.preset-pill-active]="!comp().layout?.height || comp().layout?.height === 'auto'"
|
|
116
|
+
(click)="updateHeight.emit('auto')"
|
|
117
|
+
>
|
|
118
|
+
Auto
|
|
119
|
+
</button>
|
|
120
|
+
<button
|
|
121
|
+
type="button"
|
|
122
|
+
class="preset-pill"
|
|
123
|
+
[class.preset-pill-active]="comp().layout?.height === '36px'"
|
|
124
|
+
(click)="updateHeight.emit('36px')"
|
|
125
|
+
>
|
|
126
|
+
36px
|
|
127
|
+
</button>
|
|
128
|
+
<button
|
|
129
|
+
type="button"
|
|
130
|
+
class="preset-pill"
|
|
131
|
+
[class.preset-pill-active]="comp().layout?.height === '44px'"
|
|
132
|
+
(click)="updateHeight.emit('44px')"
|
|
133
|
+
>
|
|
134
|
+
44px
|
|
135
|
+
</button>
|
|
136
|
+
<button
|
|
137
|
+
type="button"
|
|
138
|
+
class="preset-pill"
|
|
139
|
+
[class.preset-pill-active]="comp().layout?.height === '60px'"
|
|
140
|
+
(click)="updateHeight.emit('60px')"
|
|
141
|
+
>
|
|
142
|
+
60px
|
|
143
|
+
</button>
|
|
144
|
+
<button
|
|
145
|
+
type="button"
|
|
146
|
+
class="preset-pill"
|
|
147
|
+
[class.preset-pill-active]="comp().layout?.height === '80px'"
|
|
148
|
+
(click)="updateHeight.emit('80px')"
|
|
149
|
+
>
|
|
150
|
+
80px
|
|
151
|
+
</button>
|
|
152
|
+
<button
|
|
153
|
+
type="button"
|
|
154
|
+
class="preset-pill"
|
|
155
|
+
[class.preset-pill-active]="comp().layout?.height === '120px'"
|
|
156
|
+
(click)="updateHeight.emit('120px')"
|
|
157
|
+
>
|
|
158
|
+
120px
|
|
159
|
+
</button>
|
|
160
|
+
</div>
|
|
161
|
+
<input
|
|
162
|
+
type="text"
|
|
163
|
+
class="field-input"
|
|
164
|
+
placeholder="e.g. 80px or 100%"
|
|
165
|
+
style="margin-top: 4px;"
|
|
166
|
+
[ngModel]="comp().layout?.height || ''"
|
|
167
|
+
(ngModelChange)="updateHeight.emit($event)"
|
|
168
|
+
/>
|
|
169
|
+
</div>
|
|
170
|
+
|
|
171
|
+
<!-- Reset Dimensions Pill Button -->
|
|
172
|
+
<div class="field-row" style="margin-top: 4px;">
|
|
173
|
+
<button
|
|
174
|
+
type="button"
|
|
175
|
+
class="preset-pill preset-pill-reset"
|
|
176
|
+
style="width: 100%; text-align: center; padding: 6px 10px; font-size: 0.725rem;"
|
|
177
|
+
(click)="resetDimensions.emit()"
|
|
178
|
+
title="Reset column span and height to standard defaults"
|
|
179
|
+
>
|
|
180
|
+
↺ Reset Size & Height
|
|
181
|
+
</button>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
`, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".span-slider-row{display:flex;align-items:center;gap:8px}.field-slider{flex:1;height:4px;accent-color:var(--rpt-color-primary, #2563eb);cursor:pointer}.field-input-sm{width:50px!important;text-align:center;padding:4px 6px!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { 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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
185
|
+
}
|
|
186
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorLayoutComponent, decorators: [{
|
|
187
|
+
type: Component,
|
|
188
|
+
args: [{ selector: 'rpt-property-editor-layout', standalone: true, imports: [CommonModule, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
189
|
+
<div class="property-group">
|
|
190
|
+
<div class="group-title">Layout & Dimensions</div>
|
|
191
|
+
|
|
192
|
+
<!-- Column Span -->
|
|
193
|
+
<div class="field-row">
|
|
194
|
+
<div class="field-label-row">
|
|
195
|
+
<label class="field-label">Column Span</label>
|
|
196
|
+
<span class="field-badge-val">{{ comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4) }} / {{ maxColumns() }} cols</span>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="span-slider-row">
|
|
199
|
+
<input
|
|
200
|
+
type="range"
|
|
201
|
+
class="field-slider"
|
|
202
|
+
min="1"
|
|
203
|
+
[max]="maxColumns()"
|
|
204
|
+
[ngModel]="comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)"
|
|
205
|
+
(ngModelChange)="onLayoutChange('columnSpan', +$event)"
|
|
206
|
+
/>
|
|
207
|
+
<input
|
|
208
|
+
type="number"
|
|
209
|
+
class="field-input field-input-sm"
|
|
210
|
+
min="1"
|
|
211
|
+
[max]="maxColumns()"
|
|
212
|
+
[ngModel]="comp().layout?.columnSpan || (comp().type === 'button' ? 2 : 4)"
|
|
213
|
+
(ngModelChange)="onLayoutChange('columnSpan', +$event)"
|
|
214
|
+
/>
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
<!-- Start Column Position (Independent Placement) -->
|
|
219
|
+
<div class="field-row">
|
|
220
|
+
<div class="field-label-row">
|
|
221
|
+
<label class="field-label">Start Column (Position)</label>
|
|
222
|
+
<span class="field-badge-val">{{ comp().layout?.column ? 'Col ' + comp().layout?.column : 'Auto' }}</span>
|
|
223
|
+
</div>
|
|
224
|
+
<select
|
|
225
|
+
class="field-select"
|
|
226
|
+
[ngModel]="comp().layout?.column ?? 0"
|
|
227
|
+
(ngModelChange)="onLayoutChange('column', +$event === 0 ? undefined : +$event)"
|
|
228
|
+
>
|
|
229
|
+
<option [value]="0">Auto (Flow naturally)</option>
|
|
230
|
+
@for (colNum of columnList(); track colNum) {
|
|
231
|
+
<option [value]="colNum">Column {{ colNum }}</option>
|
|
232
|
+
}
|
|
233
|
+
</select>
|
|
234
|
+
<div class="preset-pill-group">
|
|
235
|
+
<button type="button" class="preset-pill" (click)="onLayoutChange('column', undefined)">Auto Flow</button>
|
|
236
|
+
<button type="button" class="preset-pill" (click)="onLayoutChange('column', 1)">Start (Col 1)</button>
|
|
237
|
+
<button type="button" class="preset-pill" (click)="alignRight()">Align Right</button>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
|
|
241
|
+
<!-- Row Span for multi-row items -->
|
|
242
|
+
<div class="field-row">
|
|
243
|
+
<div class="field-label-row">
|
|
244
|
+
<label class="field-label">Row Span</label>
|
|
245
|
+
<span class="field-badge-val">{{ comp().layout?.rowSpan || 1 }} {{ (comp().layout?.rowSpan || 1) === 1 ? 'row' : 'rows' }}</span>
|
|
246
|
+
</div>
|
|
247
|
+
<input
|
|
248
|
+
type="number"
|
|
249
|
+
class="field-input"
|
|
250
|
+
min="1"
|
|
251
|
+
max="6"
|
|
252
|
+
[ngModel]="comp().layout?.rowSpan || 1"
|
|
253
|
+
(ngModelChange)="onLayoutChange('rowSpan', +$event)"
|
|
254
|
+
/>
|
|
255
|
+
</div>
|
|
256
|
+
|
|
257
|
+
<!-- Component Width -->
|
|
258
|
+
<div class="field-row">
|
|
259
|
+
<label class="field-label">Component Width</label>
|
|
260
|
+
<input
|
|
261
|
+
type="text"
|
|
262
|
+
class="field-input"
|
|
263
|
+
placeholder="e.g. 100% or 200px"
|
|
264
|
+
[ngModel]="comp().layout?.width || ''"
|
|
265
|
+
(ngModelChange)="onLayoutChange('width', $event || undefined)"
|
|
266
|
+
/>
|
|
267
|
+
</div>
|
|
268
|
+
|
|
269
|
+
<!-- Component Height Control -->
|
|
270
|
+
<div class="field-row">
|
|
271
|
+
<div class="field-label-row">
|
|
272
|
+
<label class="field-label">Component Height</label>
|
|
273
|
+
<span class="field-badge-val">{{ comp().layout?.height || 'Auto' }}</span>
|
|
274
|
+
</div>
|
|
275
|
+
<div class="preset-pill-group">
|
|
276
|
+
<button
|
|
277
|
+
type="button"
|
|
278
|
+
class="preset-pill"
|
|
279
|
+
[class.preset-pill-active]="!comp().layout?.height || comp().layout?.height === 'auto'"
|
|
280
|
+
(click)="updateHeight.emit('auto')"
|
|
281
|
+
>
|
|
282
|
+
Auto
|
|
283
|
+
</button>
|
|
284
|
+
<button
|
|
285
|
+
type="button"
|
|
286
|
+
class="preset-pill"
|
|
287
|
+
[class.preset-pill-active]="comp().layout?.height === '36px'"
|
|
288
|
+
(click)="updateHeight.emit('36px')"
|
|
289
|
+
>
|
|
290
|
+
36px
|
|
291
|
+
</button>
|
|
292
|
+
<button
|
|
293
|
+
type="button"
|
|
294
|
+
class="preset-pill"
|
|
295
|
+
[class.preset-pill-active]="comp().layout?.height === '44px'"
|
|
296
|
+
(click)="updateHeight.emit('44px')"
|
|
297
|
+
>
|
|
298
|
+
44px
|
|
299
|
+
</button>
|
|
300
|
+
<button
|
|
301
|
+
type="button"
|
|
302
|
+
class="preset-pill"
|
|
303
|
+
[class.preset-pill-active]="comp().layout?.height === '60px'"
|
|
304
|
+
(click)="updateHeight.emit('60px')"
|
|
305
|
+
>
|
|
306
|
+
60px
|
|
307
|
+
</button>
|
|
308
|
+
<button
|
|
309
|
+
type="button"
|
|
310
|
+
class="preset-pill"
|
|
311
|
+
[class.preset-pill-active]="comp().layout?.height === '80px'"
|
|
312
|
+
(click)="updateHeight.emit('80px')"
|
|
313
|
+
>
|
|
314
|
+
80px
|
|
315
|
+
</button>
|
|
316
|
+
<button
|
|
317
|
+
type="button"
|
|
318
|
+
class="preset-pill"
|
|
319
|
+
[class.preset-pill-active]="comp().layout?.height === '120px'"
|
|
320
|
+
(click)="updateHeight.emit('120px')"
|
|
321
|
+
>
|
|
322
|
+
120px
|
|
323
|
+
</button>
|
|
324
|
+
</div>
|
|
325
|
+
<input
|
|
326
|
+
type="text"
|
|
327
|
+
class="field-input"
|
|
328
|
+
placeholder="e.g. 80px or 100%"
|
|
329
|
+
style="margin-top: 4px;"
|
|
330
|
+
[ngModel]="comp().layout?.height || ''"
|
|
331
|
+
(ngModelChange)="updateHeight.emit($event)"
|
|
332
|
+
/>
|
|
333
|
+
</div>
|
|
334
|
+
|
|
335
|
+
<!-- Reset Dimensions Pill Button -->
|
|
336
|
+
<div class="field-row" style="margin-top: 4px;">
|
|
337
|
+
<button
|
|
338
|
+
type="button"
|
|
339
|
+
class="preset-pill preset-pill-reset"
|
|
340
|
+
style="width: 100%; text-align: center; padding: 6px 10px; font-size: 0.725rem;"
|
|
341
|
+
(click)="resetDimensions.emit()"
|
|
342
|
+
title="Reset column span and height to standard defaults"
|
|
343
|
+
>
|
|
344
|
+
↺ Reset Size & Height
|
|
345
|
+
</button>
|
|
346
|
+
</div>
|
|
347
|
+
</div>
|
|
348
|
+
`, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".span-slider-row{display:flex;align-items:center;gap:8px}.field-slider{flex:1;height:4px;accent-color:var(--rpt-color-primary, #2563eb);cursor:pointer}.field-input-sm{width:50px!important;text-align:center;padding:4px 6px!important}\n"] }]
|
|
349
|
+
}] });
|
|
350
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLWxheW91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Byb3BlcnR5LWVkaXRvci9wcm9wZXJ0eS1lZGl0b3ItbGF5b3V0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUE4TDdDLE1BQU0sT0FBTyw2QkFBNkI7SUFDL0IsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQTZCLENBQUM7SUFDbkQsVUFBVSxHQUFHLEtBQUssQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUUvQixZQUFZLEdBQUcsTUFBTSxFQUE0RCxDQUFDO0lBQ2xGLFlBQVksR0FBRyxNQUFNLEVBQVUsQ0FBQztJQUNoQyxlQUFlLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFFakMsVUFBVSxHQUFHLFFBQVEsQ0FBVyxHQUFHLEVBQUU7UUFDNUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUMsQ0FBQyxDQUFDO0lBRUgsY0FBYyxDQUFDLEdBQW9DLEVBQUUsS0FBYztRQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7d0dBcEJVLDZCQUE2Qjs0RkFBN0IsNkJBQTZCLDBjQXBMOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnS1QsK3JGQW5LUyxZQUFZLDhCQUFFLFdBQVc7OzRGQXVMeEIsNkJBQTZCO2tCQTFMekMsU0FBUzsrQkFDRSw0QkFBNEIsY0FDMUIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxtQkFDbkIsdUJBQXVCLENBQUMsTUFBTSxZQUVyQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdLVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbnB1dCxcbiAgb3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlcG9ydENvbXBvbmVudERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7IENvbXBvbmVudExheW91dERlZmluaXRpb24gfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL21vZGVscy9yZXBvcnQtbGF5b3V0Lm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXByb3BlcnR5LWVkaXRvci1sYXlvdXQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcyddLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+TGF5b3V0ICYgRGltZW5zaW9uczwvZGl2PlxuXG4gICAgICA8IS0tIENvbHVtbiBTcGFuIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5Db2x1bW4gU3BhbjwvbGFiZWw+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1iYWRnZS12YWxcIj57eyBjb21wKCkubGF5b3V0Py5jb2x1bW5TcGFuIHx8IChjb21wKCkudHlwZSA9PT0gJ2J1dHRvbicgPyAyIDogNCkgfX0gLyB7eyBtYXhDb2x1bW5zKCkgfX0gY29sczwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGFuLXNsaWRlci1yb3dcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJyYW5nZVwiXG4gICAgICAgICAgICBjbGFzcz1cImZpZWxkLXNsaWRlclwiXG4gICAgICAgICAgICBtaW49XCIxXCJcbiAgICAgICAgICAgIFttYXhdPVwibWF4Q29sdW1ucygpXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImNvbXAoKS5sYXlvdXQ/LmNvbHVtblNwYW4gfHwgKGNvbXAoKS50eXBlID09PSAnYnV0dG9uJyA/IDIgOiA0KVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkxheW91dENoYW5nZSgnY29sdW1uU3BhbicsICskZXZlbnQpXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0IGZpZWxkLWlucHV0LXNtXCJcbiAgICAgICAgICAgIG1pbj1cIjFcIlxuICAgICAgICAgICAgW21heF09XCJtYXhDb2x1bW5zKClcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwiY29tcCgpLmxheW91dD8uY29sdW1uU3BhbiB8fCAoY29tcCgpLnR5cGUgPT09ICdidXR0b24nID8gMiA6IDQpXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uTGF5b3V0Q2hhbmdlKCdjb2x1bW5TcGFuJywgKyRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RhcnQgQ29sdW1uIFBvc2l0aW9uIChJbmRlcGVuZGVudCBQbGFjZW1lbnQpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtbGFiZWwtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5TdGFydCBDb2x1bW4gKFBvc2l0aW9uKTwvbGFiZWw+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWVsZC1iYWRnZS12YWxcIj57eyBjb21wKCkubGF5b3V0Py5jb2x1bW4gPyAnQ29sICcgKyBjb21wKCkubGF5b3V0Py5jb2x1bW4gOiAnQXV0bycgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cImNvbXAoKS5sYXlvdXQ/LmNvbHVtbiA/PyAwXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkxheW91dENoYW5nZSgnY29sdW1uJywgKyRldmVudCA9PT0gMCA/IHVuZGVmaW5lZCA6ICskZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjBcIj5BdXRvIChGbG93IG5hdHVyYWxseSk8L29wdGlvbj5cbiAgICAgICAgICBAZm9yIChjb2xOdW0gb2YgY29sdW1uTGlzdCgpOyB0cmFjayBjb2xOdW0pIHtcbiAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImNvbE51bVwiPkNvbHVtbiB7eyBjb2xOdW0gfX08L29wdGlvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJlc2V0LXBpbGwtZ3JvdXBcIj5cbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInByZXNldC1waWxsXCIgKGNsaWNrKT1cIm9uTGF5b3V0Q2hhbmdlKCdjb2x1bW4nLCB1bmRlZmluZWQpXCI+QXV0byBGbG93PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtcGlsbFwiIChjbGljayk9XCJvbkxheW91dENoYW5nZSgnY29sdW1uJywgMSlcIj5TdGFydCAoQ29sIDEpPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJwcmVzZXQtcGlsbFwiIChjbGljayk9XCJhbGlnblJpZ2h0KClcIj5BbGlnbiBSaWdodDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFJvdyBTcGFuIGZvciBtdWx0aS1yb3cgaXRlbXMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPlJvdyBTcGFuPC9sYWJlbD5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpZWxkLWJhZGdlLXZhbFwiPnt7IGNvbXAoKS5sYXlvdXQ/LnJvd1NwYW4gfHwgMSB9fSB7eyAoY29tcCgpLmxheW91dD8ucm93U3BhbiB8fCAxKSA9PT0gMSA/ICdyb3cnIDogJ3Jvd3MnIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgbWluPVwiMVwiXG4gICAgICAgICAgbWF4PVwiNlwiXG4gICAgICAgICAgW25nTW9kZWxdPVwiY29tcCgpLmxheW91dD8ucm93U3BhbiB8fCAxXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkxheW91dENoYW5nZSgncm93U3BhbicsICskZXZlbnQpXCJcbiAgICAgICAgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENvbXBvbmVudCBXaWR0aCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5Db21wb25lbnQgV2lkdGg8L2xhYmVsPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIDEwMCUgb3IgMjAwcHhcIlxuICAgICAgICAgIFtuZ01vZGVsXT1cImNvbXAoKS5sYXlvdXQ/LndpZHRoIHx8ICcnXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbkxheW91dENoYW5nZSgnd2lkdGgnLCAkZXZlbnQgfHwgdW5kZWZpbmVkKVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDb21wb25lbnQgSGVpZ2h0IENvbnRyb2wgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1sYWJlbC1yb3dcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPkNvbXBvbmVudCBIZWlnaHQ8L2xhYmVsPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmllbGQtYmFkZ2UtdmFsXCI+e3sgY29tcCgpLmxheW91dD8uaGVpZ2h0IHx8ICdBdXRvJyB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcmVzZXQtcGlsbC1ncm91cFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtcGlsbFwiXG4gICAgICAgICAgICBbY2xhc3MucHJlc2V0LXBpbGwtYWN0aXZlXT1cIiFjb21wKCkubGF5b3V0Py5oZWlnaHQgfHwgY29tcCgpLmxheW91dD8uaGVpZ2h0ID09PSAnYXV0bydcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZUhlaWdodC5lbWl0KCdhdXRvJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEF1dG9cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LXBpbGxcIlxuICAgICAgICAgICAgW2NsYXNzLnByZXNldC1waWxsLWFjdGl2ZV09XCJjb21wKCkubGF5b3V0Py5oZWlnaHQgPT09ICczNnB4J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlSGVpZ2h0LmVtaXQoJzM2cHgnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgMzZweFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtcGlsbFwiXG4gICAgICAgICAgICBbY2xhc3MucHJlc2V0LXBpbGwtYWN0aXZlXT1cImNvbXAoKS5sYXlvdXQ/LmhlaWdodCA9PT0gJzQ0cHgnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ1cGRhdGVIZWlnaHQuZW1pdCgnNDRweCcpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA0NHB4XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInByZXNldC1waWxsXCJcbiAgICAgICAgICAgIFtjbGFzcy5wcmVzZXQtcGlsbC1hY3RpdmVdPVwiY29tcCgpLmxheW91dD8uaGVpZ2h0ID09PSAnNjBweCdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInVwZGF0ZUhlaWdodC5lbWl0KCc2MHB4JylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDYwcHhcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwicHJlc2V0LXBpbGxcIlxuICAgICAgICAgICAgW2NsYXNzLnByZXNldC1waWxsLWFjdGl2ZV09XCJjb21wKCkubGF5b3V0Py5oZWlnaHQgPT09ICc4MHB4J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlSGVpZ2h0LmVtaXQoJzgwcHgnKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgODBweFxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwcmVzZXQtcGlsbFwiXG4gICAgICAgICAgICBbY2xhc3MucHJlc2V0LXBpbGwtYWN0aXZlXT1cImNvbXAoKS5sYXlvdXQ/LmhlaWdodCA9PT0gJzEyMHB4J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlSGVpZ2h0LmVtaXQoJzEyMHB4JylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDEyMHB4XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgcGxhY2Vob2xkZXI9XCJlLmcuIDgwcHggb3IgMTAwJVwiXG4gICAgICAgICAgc3R5bGU9XCJtYXJnaW4tdG9wOiA0cHg7XCJcbiAgICAgICAgICBbbmdNb2RlbF09XCJjb21wKCkubGF5b3V0Py5oZWlnaHQgfHwgJydcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUhlaWdodC5lbWl0KCRldmVudClcIlxuICAgICAgICAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUmVzZXQgRGltZW5zaW9ucyBQaWxsIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWVsZC1yb3dcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDRweDtcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwicHJlc2V0LXBpbGwgcHJlc2V0LXBpbGwtcmVzZXRcIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC43MjVyZW07XCJcbiAgICAgICAgICAoY2xpY2spPVwicmVzZXREaW1lbnNpb25zLmVtaXQoKVwiXG4gICAgICAgICAgdGl0bGU9XCJSZXNldCBjb2x1bW4gc3BhbiBhbmQgaGVpZ2h0IHRvIHN0YW5kYXJkIGRlZmF1bHRzXCJcbiAgICAgICAgPlxuICAgICAgICAgIOKGuiBSZXNldCBTaXplICYgSGVpZ2h0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW2BcbiAgICAuc3Bhbi1zbGlkZXItcm93IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgZ2FwOiA4cHg7XG4gICAgfVxuICAgIC5maWVsZC1zbGlkZXIge1xuICAgICAgZmxleDogMTtcbiAgICAgIGhlaWdodDogNHB4O1xuICAgICAgYWNjZW50LWNvbG9yOiB2YXIoLS1ycHQtY29sb3ItcHJpbWFyeSwgIzI1NjNlYik7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICAgIC5maWVsZC1pbnB1dC1zbSB7XG4gICAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgcGFkZGluZzogNHB4IDZweCAhaW1wb3J0YW50O1xuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yTGF5b3V0Q29tcG9uZW50IHtcbiAgcmVhZG9ubHkgY29tcCA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydENvbXBvbmVudERlZmluaXRpb24+KCk7XG4gIHJlYWRvbmx5IG1heENvbHVtbnMgPSBpbnB1dDxudW1iZXI+KDEyKTtcblxuICByZWFkb25seSB1cGRhdGVMYXlvdXQgPSBvdXRwdXQ8eyBrZXk6IGtleW9mIENvbXBvbmVudExheW91dERlZmluaXRpb247IHZhbHVlOiB1bmtub3duIH0+KCk7XG4gIHJlYWRvbmx5IHVwZGF0ZUhlaWdodCA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IHJlc2V0RGltZW5zaW9ucyA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IGNvbHVtbkxpc3QgPSBjb21wdXRlZDxudW1iZXJbXT4oKCkgPT4ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0aGlzLm1heENvbHVtbnMoKSB9LCAoXywgaSkgPT4gaSArIDEpO1xuICB9KTtcblxuICBvbkxheW91dENoYW5nZShrZXk6IGtleW9mIENvbXBvbmVudExheW91dERlZmluaXRpb24sIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVMYXlvdXQuZW1pdCh7IGtleSwgdmFsdWUgfSk7XG4gIH1cblxuICBhbGlnblJpZ2h0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNwYW4gPSB0aGlzLmNvbXAoKS5sYXlvdXQ/LmNvbHVtblNwYW4gfHwgKHRoaXMuY29tcCgpLnR5cGUgPT09ICdidXR0b24nID8gMiA6IDQpO1xuICAgIGNvbnN0IHN0YXJ0Q29sID0gTWF0aC5tYXgoMSwgdGhpcy5tYXhDb2x1bW5zKCkgLSBzcGFuICsgMSk7XG4gICAgdGhpcy5vbkxheW91dENoYW5nZSgnY29sdW1uJywgc3RhcnRDb2wpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { FormsModule } from '@angular/forms';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
export class PropertyEditorReportComponent {
|
|
7
|
+
definition = input.required();
|
|
8
|
+
updateReport = output();
|
|
9
|
+
updateLayout = output();
|
|
10
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorReportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
11
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: PropertyEditorReportComponent, isStandalone: true, selector: "rpt-property-editor-report", inputs: { definition: { classPropertyName: "definition", publicName: "definition", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { updateReport: "updateReport", updateLayout: "updateLayout" }, ngImport: i0, template: `
|
|
12
|
+
<div class="props-form">
|
|
13
|
+
<div class="property-group">
|
|
14
|
+
<div class="group-title">Report Definition</div>
|
|
15
|
+
|
|
16
|
+
<div class="field-row">
|
|
17
|
+
<label class="field-label">Report Name</label>
|
|
18
|
+
<input
|
|
19
|
+
type="text"
|
|
20
|
+
class="field-input"
|
|
21
|
+
[ngModel]="definition().name"
|
|
22
|
+
(ngModelChange)="updateReport.emit({ field: 'name', value: $event })"
|
|
23
|
+
/>
|
|
24
|
+
</div>
|
|
25
|
+
|
|
26
|
+
<div class="field-row">
|
|
27
|
+
<label class="field-label">Description</label>
|
|
28
|
+
<textarea
|
|
29
|
+
class="field-textarea"
|
|
30
|
+
rows="3"
|
|
31
|
+
[ngModel]="definition().description"
|
|
32
|
+
(ngModelChange)="updateReport.emit({ field: 'description', value: $event })"
|
|
33
|
+
></textarea>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div class="property-group">
|
|
38
|
+
<div class="group-title">Page Grid Layout</div>
|
|
39
|
+
|
|
40
|
+
<div class="field-row">
|
|
41
|
+
<label class="field-label">Total Columns</label>
|
|
42
|
+
<select
|
|
43
|
+
class="field-select"
|
|
44
|
+
[ngModel]="definition().layout.columns"
|
|
45
|
+
(ngModelChange)="updateLayout.emit({ field: 'columns', value: +$event })"
|
|
46
|
+
>
|
|
47
|
+
<option [value]="12">12 Columns (Standard)</option>
|
|
48
|
+
<option [value]="16">16 Columns (Dense)</option>
|
|
49
|
+
<option [value]="24">24 Columns (Ultra-wide)</option>
|
|
50
|
+
</select>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<div class="field-row">
|
|
54
|
+
<label class="field-label">Cell Gap (px)</label>
|
|
55
|
+
<input
|
|
56
|
+
type="number"
|
|
57
|
+
class="field-input"
|
|
58
|
+
min="0"
|
|
59
|
+
max="64"
|
|
60
|
+
[ngModel]="definition().layout.gap ?? 16"
|
|
61
|
+
(ngModelChange)="updateLayout.emit({ field: 'gap', value: +$event })"
|
|
62
|
+
/>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<div class="field-row">
|
|
66
|
+
<label class="field-label">Padding (px)</label>
|
|
67
|
+
<input
|
|
68
|
+
type="number"
|
|
69
|
+
class="field-input"
|
|
70
|
+
min="0"
|
|
71
|
+
max="64"
|
|
72
|
+
[ngModel]="definition().layout.padding ?? 24"
|
|
73
|
+
(ngModelChange)="updateLayout.emit({ field: 'padding', value: +$event })"
|
|
74
|
+
/>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div class="field-row">
|
|
78
|
+
<label class="field-label">Direction</label>
|
|
79
|
+
<select
|
|
80
|
+
class="field-select"
|
|
81
|
+
[ngModel]="definition().layout.direction ?? 'ltr'"
|
|
82
|
+
(ngModelChange)="updateLayout.emit({ field: 'direction', value: $event })"
|
|
83
|
+
>
|
|
84
|
+
<option value="ltr">Left to Right (LTR)</option>
|
|
85
|
+
<option value="rtl">Right to Left (RTL)</option>
|
|
86
|
+
</select>
|
|
87
|
+
</div>
|
|
88
|
+
</div>
|
|
89
|
+
</div>
|
|
90
|
+
`, isInline: true, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".props-form{display:flex;flex-direction:column;gap:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { 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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { 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.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
91
|
+
}
|
|
92
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PropertyEditorReportComponent, decorators: [{
|
|
93
|
+
type: Component,
|
|
94
|
+
args: [{ selector: 'rpt-property-editor-report', standalone: true, imports: [CommonModule, FormsModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
95
|
+
<div class="props-form">
|
|
96
|
+
<div class="property-group">
|
|
97
|
+
<div class="group-title">Report Definition</div>
|
|
98
|
+
|
|
99
|
+
<div class="field-row">
|
|
100
|
+
<label class="field-label">Report Name</label>
|
|
101
|
+
<input
|
|
102
|
+
type="text"
|
|
103
|
+
class="field-input"
|
|
104
|
+
[ngModel]="definition().name"
|
|
105
|
+
(ngModelChange)="updateReport.emit({ field: 'name', value: $event })"
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<div class="field-row">
|
|
110
|
+
<label class="field-label">Description</label>
|
|
111
|
+
<textarea
|
|
112
|
+
class="field-textarea"
|
|
113
|
+
rows="3"
|
|
114
|
+
[ngModel]="definition().description"
|
|
115
|
+
(ngModelChange)="updateReport.emit({ field: 'description', value: $event })"
|
|
116
|
+
></textarea>
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
119
|
+
|
|
120
|
+
<div class="property-group">
|
|
121
|
+
<div class="group-title">Page Grid Layout</div>
|
|
122
|
+
|
|
123
|
+
<div class="field-row">
|
|
124
|
+
<label class="field-label">Total Columns</label>
|
|
125
|
+
<select
|
|
126
|
+
class="field-select"
|
|
127
|
+
[ngModel]="definition().layout.columns"
|
|
128
|
+
(ngModelChange)="updateLayout.emit({ field: 'columns', value: +$event })"
|
|
129
|
+
>
|
|
130
|
+
<option [value]="12">12 Columns (Standard)</option>
|
|
131
|
+
<option [value]="16">16 Columns (Dense)</option>
|
|
132
|
+
<option [value]="24">24 Columns (Ultra-wide)</option>
|
|
133
|
+
</select>
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
<div class="field-row">
|
|
137
|
+
<label class="field-label">Cell Gap (px)</label>
|
|
138
|
+
<input
|
|
139
|
+
type="number"
|
|
140
|
+
class="field-input"
|
|
141
|
+
min="0"
|
|
142
|
+
max="64"
|
|
143
|
+
[ngModel]="definition().layout.gap ?? 16"
|
|
144
|
+
(ngModelChange)="updateLayout.emit({ field: 'gap', value: +$event })"
|
|
145
|
+
/>
|
|
146
|
+
</div>
|
|
147
|
+
|
|
148
|
+
<div class="field-row">
|
|
149
|
+
<label class="field-label">Padding (px)</label>
|
|
150
|
+
<input
|
|
151
|
+
type="number"
|
|
152
|
+
class="field-input"
|
|
153
|
+
min="0"
|
|
154
|
+
max="64"
|
|
155
|
+
[ngModel]="definition().layout.padding ?? 24"
|
|
156
|
+
(ngModelChange)="updateLayout.emit({ field: 'padding', value: +$event })"
|
|
157
|
+
/>
|
|
158
|
+
</div>
|
|
159
|
+
|
|
160
|
+
<div class="field-row">
|
|
161
|
+
<label class="field-label">Direction</label>
|
|
162
|
+
<select
|
|
163
|
+
class="field-select"
|
|
164
|
+
[ngModel]="definition().layout.direction ?? 'ltr'"
|
|
165
|
+
(ngModelChange)="updateLayout.emit({ field: 'direction', value: $event })"
|
|
166
|
+
>
|
|
167
|
+
<option value="ltr">Left to Right (LTR)</option>
|
|
168
|
+
<option value="rtl">Right to Left (RTL)</option>
|
|
169
|
+
</select>
|
|
170
|
+
</div>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
`, styles: [".property-group{display:flex;flex-direction:column;gap:12px}.group-title{font-size:.7rem;font-weight:700;color:var(--rpt-color-text-muted, #64748b);text-transform:uppercase;letter-spacing:.05em;border-bottom:1px solid var(--rpt-color-border, #e2e8f0);padding-bottom:4px}.field-row{display:flex;flex-direction:column;gap:4px}.field-label-row{display:flex;align-items:center;justify-content:space-between}.field-badge-val{font-size:.65rem;font-weight:600;color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border:1px solid #bfdbfe;padding:1px 6px;border-radius:9999px}.field-label{font-size:.7rem;font-weight:600;color:var(--rpt-color-text, #0f172a)}.field-input,.field-select,.field-textarea{width:100%;box-sizing:border-box;border:1px solid var(--rpt-color-border, #cbd5e1);border-radius:var(--rpt-border-radius-sm, 4px);padding:6px 10px;font-size:var(--rpt-font-size-sm, .75rem);color:var(--rpt-color-text, #0f172a);background:#fff;outline:none;transition:all var(--rpt-transition-speed, .15s) ease}.field-select{appearance:none;-webkit-appearance:none;background-image:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E\");background-repeat:no-repeat;background-position:right 10px center;background-size:13px 13px;padding-right:28px;cursor:pointer}.field-input:focus,.field-select:focus,.field-textarea:focus{border-color:var(--rpt-color-primary, #2563eb);box-shadow:var(--rpt-box-shadow-focus, 0 0 0 3px rgba(37, 99, 235, .25))}.checkbox-toggle{display:inline-flex;align-items:center;gap:8px;font-size:.75rem;font-weight:500;color:var(--rpt-color-text, #0f172a);cursor:pointer}.preset-pill-group{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.preset-pill{background:#f1f5f9;border:1px solid #e2e8f0;border-radius:4px;padding:2px 8px;font-size:.65rem;font-weight:600;color:#475569;cursor:pointer;transition:all .12s ease}.preset-pill:hover{background:#e2e8f0;color:#0f172a;border-color:#cbd5e1}.preset-pill-active{background:var(--rpt-color-primary, #2563eb)!important;color:#fff!important;border-color:var(--rpt-color-primary, #2563eb)!important}.preset-pill-reset{color:var(--rpt-color-primary, #2563eb);background:#eff6ff;border-color:#bfdbfe}.preset-pill-reset:hover{background:#dbeafe;color:#1d4ed8;border-color:#93c5fd}\n", ".props-form{display:flex;flex-direction:column;gap:20px}\n"] }]
|
|
174
|
+
}] });
|
|
175
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvcGVydHktZWRpdG9yLXJlcG9ydC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL3Byb3BlcnR5LWVkaXRvci9wcm9wZXJ0eS1lZGl0b3ItcmVwb3J0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBaUc3QyxNQUFNLE9BQU8sNkJBQTZCO0lBQy9CLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFvQixDQUFDO0lBRWhELFlBQVksR0FBRyxNQUFNLEVBQXFDLENBQUM7SUFDM0QsWUFBWSxHQUFHLE1BQU0sRUFBcUMsQ0FBQzt3R0FKekQsNkJBQTZCOzRGQUE3Qiw2QkFBNkIsaVRBeEY5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStFVCwrZ0ZBbEZTLFlBQVksOEJBQUUsV0FBVzs7NEZBMkZ4Qiw2QkFBNkI7a0JBOUZ6QyxTQUFTOytCQUNFLDRCQUE0QixjQUMxQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLG1CQUNuQix1QkFBdUIsQ0FBQyxNQUFNLFlBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0VUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgaW5wdXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUmVwb3J0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uLy4uLy4uL2NvcmUvbW9kZWxzL3JlcG9ydC1kZWZpbml0aW9uLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncnB0LXByb3BlcnR5LWVkaXRvci1yZXBvcnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdHlsZVVybHM6IFsnLi9wcm9wZXJ0eS1lZGl0b3IuY29tbW9uLmNzcyddLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJwcm9wcy1mb3JtXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHJvcGVydHktZ3JvdXBcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdyb3VwLXRpdGxlXCI+UmVwb3J0IERlZmluaXRpb248L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5SZXBvcnQgTmFtZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cImZpZWxkLWlucHV0XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImRlZmluaXRpb24oKS5uYW1lXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZVJlcG9ydC5lbWl0KHsgZmllbGQ6ICduYW1lJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC10ZXh0YXJlYVwiXG4gICAgICAgICAgICByb3dzPVwiM1wiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJkZWZpbml0aW9uKCkuZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidXBkYXRlUmVwb3J0LmVtaXQoeyBmaWVsZDogJ2Rlc2NyaXB0aW9uJywgdmFsdWU6ICRldmVudCB9KVwiXG4gICAgICAgICAgPjwvdGV4dGFyZWE+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwcm9wZXJ0eS1ncm91cFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj5QYWdlIEdyaWQgTGF5b3V0PC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+VG90YWwgQ29sdW1uczwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1zZWxlY3RcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwiZGVmaW5pdGlvbigpLmxheW91dC5jb2x1bW5zXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxheW91dC5lbWl0KHsgZmllbGQ6ICdjb2x1bW5zJywgdmFsdWU6ICskZXZlbnQgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cIjEyXCI+MTIgQ29sdW1ucyAoU3RhbmRhcmQpPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCIxNlwiPjE2IENvbHVtbnMgKERlbnNlKTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiMjRcIj4yNCBDb2x1bW5zIChVbHRyYS13aWRlKTwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5DZWxsIEdhcCAocHgpPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgIG1heD1cIjY0XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImRlZmluaXRpb24oKS5sYXlvdXQuZ2FwID8/IDE2XCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxheW91dC5lbWl0KHsgZmllbGQ6ICdnYXAnLCB2YWx1ZTogKyRldmVudCB9KVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpZWxkLXJvd1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+UGFkZGluZyAocHgpPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgY2xhc3M9XCJmaWVsZC1pbnB1dFwiXG4gICAgICAgICAgICBtaW49XCIwXCJcbiAgICAgICAgICAgIG1heD1cIjY0XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImRlZmluaXRpb24oKS5sYXlvdXQucGFkZGluZyA/PyAyNFwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVMYXlvdXQuZW1pdCh7IGZpZWxkOiAncGFkZGluZycsIHZhbHVlOiArJGV2ZW50IH0pXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGQtcm93XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj5EaXJlY3Rpb248L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgIGNsYXNzPVwiZmllbGQtc2VsZWN0XCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cImRlZmluaXRpb24oKS5sYXlvdXQuZGlyZWN0aW9uID8/ICdsdHInXCJcbiAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUxheW91dC5lbWl0KHsgZmllbGQ6ICdkaXJlY3Rpb24nLCB2YWx1ZTogJGV2ZW50IH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibHRyXCI+TGVmdCB0byBSaWdodCAoTFRSKTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJ0bFwiPlJpZ2h0IHRvIExlZnQgKFJUTCk8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbYFxuICAgIC5wcm9wcy1mb3JtIHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgZ2FwOiAyMHB4O1xuICAgIH1cbiAgYF0sXG59KVxuZXhwb3J0IGNsYXNzIFByb3BlcnR5RWRpdG9yUmVwb3J0Q29tcG9uZW50IHtcbiAgcmVhZG9ubHkgZGVmaW5pdGlvbiA9IGlucHV0LnJlcXVpcmVkPFJlcG9ydERlZmluaXRpb24+KCk7XG5cbiAgcmVhZG9ubHkgdXBkYXRlUmVwb3J0ID0gb3V0cHV0PHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbiAgcmVhZG9ubHkgdXBkYXRlTGF5b3V0ID0gb3V0cHV0PHsgZmllbGQ6IHN0cmluZzsgdmFsdWU6IHVua25vd24gfT4oKTtcbn1cbiJdfQ==
|