@yuuvis/client-framework 2.1.22 → 2.1.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/yuuvis-client-framework-list.mjs +30 -2
- package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-flavor.mjs +2 -2
- package/fesm2022/yuuvis-client-framework-object-flavor.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-object-versions.mjs +1 -1
- package/fesm2022/yuuvis-client-framework-object-versions.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-renderer.mjs +16 -22
- package/fesm2022/yuuvis-client-framework-renderer.mjs.map +1 -1
- package/fesm2022/yuuvis-client-framework-tile-list.mjs +51 -24
- package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
- package/list/lib/list.component.d.ts +6 -3
- package/package.json +4 -4
- package/renderer/lib/property-renderer/table.renderer.component.d.ts +5 -1
- package/tile-list/lib/tile-config/tile-config.component.d.ts +3 -2
|
@@ -34,11 +34,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImpo
|
|
|
34
34
|
|
|
35
35
|
class BooleanRendererComponent extends AbstractRendererComponent {
|
|
36
36
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: BooleanRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
37
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.12", type: BooleanRendererComponent, isStandalone: true, selector: "yuv-boolean-renderer", usesInheritance: true, ngImport: i0, template: ` <mat-icon>{{ value() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>`, isInline: true, styles: [":host{
|
|
37
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.12", type: BooleanRendererComponent, isStandalone: true, selector: "yuv-boolean-renderer", usesInheritance: true, ngImport: i0, template: ` <mat-icon>{{ value() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>`, isInline: true, styles: [":host{display:flex;padding:var(--tile-slot-padding)}\n"], dependencies: [{ kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
38
38
|
}
|
|
39
39
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: BooleanRendererComponent, decorators: [{
|
|
40
40
|
type: Component,
|
|
41
|
-
args: [{ selector: 'yuv-boolean-renderer', imports: [MatIcon], template: ` <mat-icon>{{ value() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>`, styles: [":host{
|
|
41
|
+
args: [{ selector: 'yuv-boolean-renderer', imports: [MatIcon], template: ` <mat-icon>{{ value() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>`, styles: [":host{display:flex;padding:var(--tile-slot-padding)}\n"] }]
|
|
42
42
|
}] });
|
|
43
43
|
|
|
44
44
|
class DateTimeRendererComponent extends AbstractRendererComponent {
|
|
@@ -164,29 +164,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImpo
|
|
|
164
164
|
class TableRendererComponent extends AbstractRendererComponent {
|
|
165
165
|
constructor() {
|
|
166
166
|
super(...arguments);
|
|
167
|
+
this.#system = inject(SystemService);
|
|
167
168
|
this.tableHeaders = computed(() => {
|
|
168
169
|
const value = this.value();
|
|
169
170
|
if (!value || !value.length)
|
|
170
171
|
return [];
|
|
171
|
-
// Extract all unique headers from the data
|
|
172
172
|
const headers = new Set();
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
});
|
|
173
|
+
const allKeys = new Set();
|
|
174
|
+
value.forEach((item) => Object.keys(item).forEach((key) => allKeys.add(key)));
|
|
175
|
+
allKeys.forEach((key) => headers.add({ key, label: this.#system.getLocalizedLabel(`${key}`) || key }));
|
|
176
176
|
return Array.from(headers);
|
|
177
177
|
});
|
|
178
178
|
this.tableData = computed(() => {
|
|
179
179
|
const data = this.value() || [];
|
|
180
|
-
|
|
181
|
-
return data.slice(0, 10);
|
|
182
|
-
}
|
|
183
|
-
return data;
|
|
180
|
+
return data.length > 10 ? data.slice(0, 10) : data;
|
|
184
181
|
});
|
|
185
182
|
this.reducedData = computed(() => {
|
|
186
183
|
const data = this.value() || [];
|
|
187
184
|
return data.length > 10;
|
|
188
185
|
});
|
|
189
186
|
}
|
|
187
|
+
#system;
|
|
190
188
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: TableRendererComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
191
189
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.12", type: TableRendererComponent, isStandalone: true, selector: "yuv-table-renderer", usesInheritance: true, ngImport: i0, template: `
|
|
192
190
|
<div class="table-container">
|
|
@@ -194,7 +192,7 @@ class TableRendererComponent extends AbstractRendererComponent {
|
|
|
194
192
|
<thead>
|
|
195
193
|
<tr>
|
|
196
194
|
@for (header of tableHeaders(); track header) {
|
|
197
|
-
<th>{{ header }}</th>
|
|
195
|
+
<th>{{ header.label }}</th>
|
|
198
196
|
}
|
|
199
197
|
</tr>
|
|
200
198
|
</thead>
|
|
@@ -202,19 +200,17 @@ class TableRendererComponent extends AbstractRendererComponent {
|
|
|
202
200
|
@for (row of tableData(); track $index) {
|
|
203
201
|
<tr>
|
|
204
202
|
@for (header of tableHeaders(); track header) {
|
|
205
|
-
<td>{{ row[header] }}</td>
|
|
203
|
+
<td>{{ row[header.key] }}</td>
|
|
206
204
|
}
|
|
207
205
|
</tr>
|
|
208
206
|
}
|
|
209
207
|
</tbody>
|
|
210
208
|
</table>
|
|
211
209
|
@if (reducedData()) {
|
|
212
|
-
<p>
|
|
213
|
-
{{ 'yuv.table.renderer.moreEntries' | translate: { count: value()?.length } }}
|
|
214
|
-
</p>
|
|
210
|
+
<p>{{ 'yuv.table.renderer.moreEntries' | translate: { count: value()?.length } }}</p>
|
|
215
211
|
}
|
|
216
212
|
</div>
|
|
217
|
-
`, isInline: true, styles: [":host{display:flex;padding:var(--tile-slot-padding);width:100%}.table-container{width:100%;overflow-x:auto;max-width:100%}table{width:100%;border-collapse:collapse;min-width:400px}th,td{padding:8px;text-align:left;border-bottom:1px solid var(--ymt-outline-variant)}th{background-color:var(--
|
|
213
|
+
`, isInline: true, styles: [":host{display:flex;padding:var(--tile-slot-padding);width:100%}.table-container{width:100%;overflow-x:auto;max-width:100%}table{width:100%;border-collapse:collapse;min-width:400px}th,td{padding:8px;text-align:left;border-bottom:1px solid var(--ymt-outline-variant);word-break:normal}th{background-color:var(--object-summary-section-background, var(--ymt-surface));font-weight:700}tr:hover{background-color:var(--ymt-hover-background)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }] }); }
|
|
218
214
|
}
|
|
219
215
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: TableRendererComponent, decorators: [{
|
|
220
216
|
type: Component,
|
|
@@ -224,7 +220,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImpo
|
|
|
224
220
|
<thead>
|
|
225
221
|
<tr>
|
|
226
222
|
@for (header of tableHeaders(); track header) {
|
|
227
|
-
<th>{{ header }}</th>
|
|
223
|
+
<th>{{ header.label }}</th>
|
|
228
224
|
}
|
|
229
225
|
</tr>
|
|
230
226
|
</thead>
|
|
@@ -232,19 +228,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImpo
|
|
|
232
228
|
@for (row of tableData(); track $index) {
|
|
233
229
|
<tr>
|
|
234
230
|
@for (header of tableHeaders(); track header) {
|
|
235
|
-
<td>{{ row[header] }}</td>
|
|
231
|
+
<td>{{ row[header.key] }}</td>
|
|
236
232
|
}
|
|
237
233
|
</tr>
|
|
238
234
|
}
|
|
239
235
|
</tbody>
|
|
240
236
|
</table>
|
|
241
237
|
@if (reducedData()) {
|
|
242
|
-
<p>
|
|
243
|
-
{{ 'yuv.table.renderer.moreEntries' | translate: { count: value()?.length } }}
|
|
244
|
-
</p>
|
|
238
|
+
<p>{{ 'yuv.table.renderer.moreEntries' | translate: { count: value()?.length } }}</p>
|
|
245
239
|
}
|
|
246
240
|
</div>
|
|
247
|
-
`, styles: [":host{display:flex;padding:var(--tile-slot-padding);width:100%}.table-container{width:100%;overflow-x:auto;max-width:100%}table{width:100%;border-collapse:collapse;min-width:400px}th,td{padding:8px;text-align:left;border-bottom:1px solid var(--ymt-outline-variant)}th{background-color:var(--
|
|
241
|
+
`, styles: [":host{display:flex;padding:var(--tile-slot-padding);width:100%}.table-container{width:100%;overflow-x:auto;max-width:100%}table{width:100%;border-collapse:collapse;min-width:400px}th,td{padding:8px;text-align:left;border-bottom:1px solid var(--ymt-outline-variant);word-break:normal}th{background-color:var(--object-summary-section-background, var(--ymt-surface));font-weight:700}tr:hover{background-color:var(--ymt-hover-background)}\n"] }]
|
|
248
242
|
}] });
|
|
249
243
|
|
|
250
244
|
class UnknownRendererComponent extends AbstractRendererComponent {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"yuuvis-client-framework-renderer.mjs","sources":["../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/abstract.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/boolean.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/datetime.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/decimal.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/filesize.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/icon.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/integer.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/organization.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/string.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/table.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/unknown.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/services/renderer/renderer.service.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/renderer.directive.ts","../../../../../libs/yuuvis/client-framework/renderer/src/yuuvis-client-framework-renderer.ts"],"sourcesContent":["import { Component, inject, input } from '@angular/core';\nimport { SchemaResponseFieldDefinition, SystemService } from '@yuuvis/client-core';\n\n/**\n * Abstract class to be extended by property renderers\n */\n@Component({\n selector: 'yuv-abstract-renderer',\n template: ''\n})\nexport abstract class AbstractRendererComponent<T = string, U = null> {\n #system = inject(SystemService);\n\n propertyName = input.required<string>();\n value = input.required<T | null>();\n meta = input<Record<string, unknown> | U>();\n\n protected getProperty(): SchemaResponseFieldDefinition | undefined {\n return this.#system.system?.allFields[this.propertyName()];\n }\n}\n","import { Component } from '@angular/core';\nimport { MatCheckbox } from '@angular/material/checkbox';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { MatIcon } from '@angular/material/icon';\n\n@Component({\n selector: 'yuv-boolean-renderer',\n imports: [MatIcon],\n template: ` <mat-icon>{{ value() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>`,\n styles: [\n `\n :host {\n --mdc-checkbox-state-layer-size: 18px;\n display: flex;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class BooleanRendererComponent extends AbstractRendererComponent {}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { LocaleDatePipe } from '@yuuvis/client-core';\n\n@Component({\n selector: 'yuv-datetime-renderer',\n imports: [LocaleDatePipe],\n template: '{{(value() || undefined) | localeDate}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class DateTimeRendererComponent extends AbstractRendererComponent<Date> {}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-decimal-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class DecimalRendererComponent extends AbstractRendererComponent<number> {\n // TODO: deal with precision and scale\n}\n","import { Component, computed } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { FileSizePipe } from '@yuuvis/client-core';\n\n@Component({\n selector: 'yuv-string-renderer',\n imports: [FileSizePipe],\n template: '{{parsedValue() | fileSize}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class FileSizeRendererComponent extends AbstractRendererComponent {\n parsedValue = computed<number>(() => {\n let n = 0;\n const v = this.value();\n if (v)\n try {\n n = parseInt(v);\n } catch (e) {\n console.error(e);\n }\n return n;\n });\n}\n","import { Component, effect, inject } from '@angular/core';\nimport { MatIcon, MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ObjectTypeIconComponent } from '@yuuvis/client-framework/icons';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-icon-renderer',\n imports: [ObjectTypeIconComponent, MatIcon],\n template: ` @let icon = value();\n @if (propertyName() !== 'custom') {\n <yuv-object-type-icon [objectTypeId]=\"icon || ''\"></yuv-object-type-icon>\n } @else if (icon !== null) {\n @let metaData = meta();\n @if (metaData && metaData['isFontIcon']) {\n <mat-icon>{{ icon }}</mat-icon>\n } @else {\n <mat-icon [svgIcon]=\"customId\"></mat-icon>\n }\n }`,\n styles: [\n `\n :host {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--tile-slot-padding);\n yuv-icon,\n yuv-object-type-icon {\n --icon-size: var(--icon-renderer-icon-size);\n width: var(--icon-size);\n height: var(--icon-size);\n }\n }\n `\n ]\n})\nexport class IconRendererComponent extends AbstractRendererComponent {\n readonly #iconRegistry = inject(MatIconRegistry);\n\n readonly #sanitizer = inject(DomSanitizer);\n protected readonly customId = crypto.randomUUID();\n\n #registerIconsEffect = effect(async () => {\n const meta = this.meta();\n this.propertyName() === 'custom' &&\n !(meta && meta['isFontIcon']) &&\n this.#iconRegistry.addSvgIconLiteral(this.customId, this.#sanitizer.bypassSecurityTrustHtml(this.value() as string));\n });\n}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-integer-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class IntegerRendererComponent extends AbstractRendererComponent<number> {}\n","import { Component, computed } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-organization-renderer',\n standalone: true,\n template: '{{resolvedValue()}}',\n styles: [\n `\n :host {\n padding: var(--tile-slot-padding);\n display: var(--yuv-renderer-display, inline-block);\n }\n `\n ]\n})\nexport class OrganizationRendererComponent extends AbstractRendererComponent {\n resolvedValue = computed<string>(() => {\n const m = this.meta();\n return (m ? m['title'] : this.value() || '') as string;\n });\n}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-string-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class StringRendererComponent extends AbstractRendererComponent {}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed } from '@angular/core';\nimport { TranslateModule } from '@yuuvis/client-core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n@Component({\n selector: 'yuv-table-renderer',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n <div class=\"table-container\">\n <table>\n <thead>\n <tr>\n @for (header of tableHeaders(); track header) {\n <th>{{ header }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track $index) {\n <tr>\n @for (header of tableHeaders(); track header) {\n <td>{{ row[header] }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (reducedData()) {\n <p>\n {{ 'yuv.table.renderer.moreEntries' | translate: { count: value()?.length } }}\n </p>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: flex;\n padding: var(--tile-slot-padding);\n width: 100%;\n }\n\n .table-container {\n width: 100%;\n overflow-x: auto;\n max-width: 100%;\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n min-width: 400px;\n }\n\n th,\n td {\n padding: 8px;\n text-align: left;\n border-bottom: 1px solid var(--ymt-outline-variant);\n }\n\n th {\n background-color: var(--_object-summary-section-background, #f2f2f2);\n font-weight: bold;\n }\n\n tr:hover {\n background-color: var(--ymt-hover-background);\n }\n `\n ]\n})\nexport class TableRendererComponent extends AbstractRendererComponent<any[]> {\n protected tableHeaders = computed(() => {\n const value = this.value();\n if (!value || !value.length) return [];\n\n // Extract all unique headers from the data\n const headers = new Set<string>();\n value.forEach((item) => {\n Object.keys(item).forEach((key) => headers.add(key));\n });\n\n return Array.from(headers);\n });\n\n protected tableData = computed(() => {\n const data = this.value() || [];\n if (data.length > 10) {\n return data.slice(0, 10);\n }\n return data;\n });\n\n protected reducedData = computed(() => {\n const data = this.value() || [];\n return data.length > 10;\n });\n}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-unknown-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class UnknownRendererComponent extends AbstractRendererComponent<any> {}\n","import { Injectable, Type, inject, signal } from '@angular/core';\nimport { ContentStreamField, InternalFieldType, RendererType, SchemaResponseFieldDefinition, SystemService } from '@yuuvis/client-core';\nimport { RendererComponent } from './renderer.interface';\nimport {\n AbstractRendererComponent,\n BooleanRendererComponent,\n DateTimeRendererComponent,\n DecimalRendererComponent,\n FileSizeRendererComponent,\n IconRendererComponent,\n IntegerRendererComponent,\n OrganizationRendererComponent,\n StringRendererComponent,\n UnknownRendererComponent\n} from '../../property-renderer';\nimport { TableRendererComponent } from '../../property-renderer/table.renderer.component';\n\n/**\n * Service for managing property type renderers. Renderers are components that will render certain\n * property types.\n *\n * You are able to register your own renderer to overwrite an existing one or provide a custom\n * renderer for your context.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RendererService {\n private system = inject(SystemService);\n\n #renderers = signal<Record<string, Type<RendererComponent>>>({});\n\n constructor() {\n const initialRenderers: Record<string, Type<RendererComponent>> = {\n integer: IntegerRendererComponent,\n decimal: DecimalRendererComponent,\n datetime: DateTimeRendererComponent,\n icon: IconRendererComponent,\n string: StringRendererComponent,\n boolean: BooleanRendererComponent,\n table: TableRendererComponent\n };\n initialRenderers[InternalFieldType.STRING_ORGANIZATION] = OrganizationRendererComponent;\n initialRenderers[ContentStreamField.LENGTH] = FileSizeRendererComponent;\n this.#renderers.set(initialRenderers);\n }\n\n getRendererByType(type: RendererType): Type<RendererComponent> {\n return this.#renderers()[type] || UnknownRendererComponent;\n }\n\n getRenderer(propertyName: string, typeName?: string): Type<RendererComponent> {\n // try to find a renderer based on property and object type\n let r = this.#renderers()[this._getKey(propertyName, typeName)];\n\n if (!r) {\n // not special renderer found so we'll try to get one for the internal type\n // of the given property\n const srf: SchemaResponseFieldDefinition | undefined = this.system.system && this.system.system.allFields[propertyName];\n if (srf) {\n r = this.getRendererByType(this.system.getInternalFormElementType(srf.propertyType, srf.classifications));\n }\n }\n\n return r || UnknownRendererComponent;\n }\n\n /**\n * Register a renderer for a particular property. Providing `typeName` will register that renderer\n * for a certain context (use same inputs when calling `getRenderer()`).\n * @param cmp The component to actually render the property\n * @param propertyName property name (used for registering the renderer for a certain context)\n * @param typeName Optional type name (used for registering the renderer for a certain context)\n */\n registerRenderer(cmp: Type<AbstractRendererComponent>, propertyName: string, typeName?: string) {\n this.#renderers.update((curr) => ({ ...curr, ...{ [this._getKey(propertyName, typeName)]: cmp } }));\n }\n\n /**\n *\n * @param type The type of property this renderer is supposed to be used for\n */\n registerRendererByType(type: RendererType, cmp: Type<RendererComponent>) {\n this.#renderers.update((curr) => ({ ...curr, ...{ [type]: cmp } }));\n }\n\n // Generate the unique key for a renderer\n private _getKey(propertyName: string, typeName?: string): string {\n const k = [propertyName];\n typeName && k.push(typeName);\n return k.join('-');\n }\n}\n","import { ComponentRef, Directive, Injector, Type, ViewContainerRef, effect, inject, input, runInInjectionContext } from '@angular/core';\nimport { RendererComponent, RendererDirectiveInput } from './services/renderer/renderer.interface';\nimport { RendererService } from './services/renderer/renderer.service';\n\n/**\n * Structural directive for rendering an obect type property\n */\n@Directive({\n selector: '[yuvRenderer]',\n standalone: true\n})\nexport class RendererDirective {\n private readonly rendererService = inject(RendererService);\n private readonly containerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n\n component!: ComponentRef<RendererComponent>;\n\n private _rendererInput?: RendererDirectiveInput;\n\n yuvRenderer = input<RendererDirectiveInput | undefined>(undefined);\n\n #yuvRendererEffect = effect(() => {\n const i = this.yuvRenderer();\n if (i && !this._alreadyRendered(i)) {\n this._rendererInput = i;\n\n if (i) {\n if (this.component) this.containerRef.clear();\n\n const cmp: Type<RendererComponent> = i.rendererType\n ? this.rendererService.getRendererByType(i.rendererType)\n : this.rendererService.getRenderer(i.propertyName);\n\n this.component = this.containerRef.createComponent(cmp);\n // pass inputs to the renderer. As they are signals they need an injection context\n // runInInjectionContext(this.injector, () => { // FOLLOWUP: this is not needed anymore with the new input() API\n this.component.setInput('propertyName', i.propertyName);\n this.component.setInput('value', i.value);\n if (i.meta) this.component.setInput('meta', i.meta);\n // });\n } else {\n this.containerRef.clear();\n }\n }\n });\n\n private _alreadyRendered(i: RendererDirectiveInput): boolean {\n return !!this._rendererInput && JSON.stringify(this._rendererInput) === JSON.stringify(i);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"yuuvis-client-framework-renderer.mjs","sources":["../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/abstract.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/boolean.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/datetime.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/decimal.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/filesize.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/icon.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/integer.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/organization.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/string.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/table.renderer.component.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/property-renderer/unknown.renderer.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/services/renderer/renderer.service.ts","../../../../../libs/yuuvis/client-framework/renderer/src/lib/renderer.directive.ts","../../../../../libs/yuuvis/client-framework/renderer/src/yuuvis-client-framework-renderer.ts"],"sourcesContent":["import { Component, inject, input } from '@angular/core';\nimport { SchemaResponseFieldDefinition, SystemService } from '@yuuvis/client-core';\n\n/**\n * Abstract class to be extended by property renderers\n */\n@Component({\n selector: 'yuv-abstract-renderer',\n template: ''\n})\nexport abstract class AbstractRendererComponent<T = string, U = null> {\n #system = inject(SystemService);\n\n propertyName = input.required<string>();\n value = input.required<T | null>();\n meta = input<Record<string, unknown> | U>();\n\n protected getProperty(): SchemaResponseFieldDefinition | undefined {\n return this.#system.system?.allFields[this.propertyName()];\n }\n}\n","import { Component } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-boolean-renderer',\n imports: [MatIcon],\n template: ` <mat-icon>{{ value() ? 'check_box' : 'check_box_outline_blank' }}</mat-icon>`,\n styles: [\n `\n :host {\n display: flex;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class BooleanRendererComponent extends AbstractRendererComponent {}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { LocaleDatePipe } from '@yuuvis/client-core';\n\n@Component({\n selector: 'yuv-datetime-renderer',\n imports: [LocaleDatePipe],\n template: '{{(value() || undefined) | localeDate}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class DateTimeRendererComponent extends AbstractRendererComponent<Date> {}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-decimal-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class DecimalRendererComponent extends AbstractRendererComponent<number> {\n // TODO: deal with precision and scale\n}\n","import { Component, computed } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\nimport { FileSizePipe } from '@yuuvis/client-core';\n\n@Component({\n selector: 'yuv-string-renderer',\n imports: [FileSizePipe],\n template: '{{parsedValue() | fileSize}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class FileSizeRendererComponent extends AbstractRendererComponent {\n parsedValue = computed<number>(() => {\n let n = 0;\n const v = this.value();\n if (v)\n try {\n n = parseInt(v);\n } catch (e) {\n console.error(e);\n }\n return n;\n });\n}\n","import { Component, effect, inject } from '@angular/core';\nimport { MatIcon, MatIconRegistry } from '@angular/material/icon';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { ObjectTypeIconComponent } from '@yuuvis/client-framework/icons';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-icon-renderer',\n imports: [ObjectTypeIconComponent, MatIcon],\n template: ` @let icon = value();\n @if (propertyName() !== 'custom') {\n <yuv-object-type-icon [objectTypeId]=\"icon || ''\"></yuv-object-type-icon>\n } @else if (icon !== null) {\n @let metaData = meta();\n @if (metaData && metaData['isFontIcon']) {\n <mat-icon>{{ icon }}</mat-icon>\n } @else {\n <mat-icon [svgIcon]=\"customId\"></mat-icon>\n }\n }`,\n styles: [\n `\n :host {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--tile-slot-padding);\n yuv-icon,\n yuv-object-type-icon {\n --icon-size: var(--icon-renderer-icon-size);\n width: var(--icon-size);\n height: var(--icon-size);\n }\n }\n `\n ]\n})\nexport class IconRendererComponent extends AbstractRendererComponent {\n readonly #iconRegistry = inject(MatIconRegistry);\n\n readonly #sanitizer = inject(DomSanitizer);\n protected readonly customId = crypto.randomUUID();\n\n #registerIconsEffect = effect(async () => {\n const meta = this.meta();\n this.propertyName() === 'custom' &&\n !(meta && meta['isFontIcon']) &&\n this.#iconRegistry.addSvgIconLiteral(this.customId, this.#sanitizer.bypassSecurityTrustHtml(this.value() as string));\n });\n}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-integer-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class IntegerRendererComponent extends AbstractRendererComponent<number> {}\n","import { Component, computed } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-organization-renderer',\n standalone: true,\n template: '{{resolvedValue()}}',\n styles: [\n `\n :host {\n padding: var(--tile-slot-padding);\n display: var(--yuv-renderer-display, inline-block);\n }\n `\n ]\n})\nexport class OrganizationRendererComponent extends AbstractRendererComponent {\n resolvedValue = computed<string>(() => {\n const m = this.meta();\n return (m ? m['title'] : this.value() || '') as string;\n });\n}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-string-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class StringRendererComponent extends AbstractRendererComponent {}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject } from '@angular/core';\nimport { SystemService, TranslateModule } from '@yuuvis/client-core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-table-renderer',\n standalone: true,\n imports: [CommonModule, TranslateModule],\n template: `\n <div class=\"table-container\">\n <table>\n <thead>\n <tr>\n @for (header of tableHeaders(); track header) {\n <th>{{ header.label }}</th>\n }\n </tr>\n </thead>\n <tbody>\n @for (row of tableData(); track $index) {\n <tr>\n @for (header of tableHeaders(); track header) {\n <td>{{ row[header.key] }}</td>\n }\n </tr>\n }\n </tbody>\n </table>\n @if (reducedData()) {\n <p>{{ 'yuv.table.renderer.moreEntries' | translate: { count: value()?.length } }}</p>\n }\n </div>\n `,\n styles: [\n `\n :host {\n display: flex;\n padding: var(--tile-slot-padding);\n width: 100%;\n }\n\n .table-container {\n width: 100%;\n overflow-x: auto;\n max-width: 100%;\n }\n\n table {\n width: 100%;\n border-collapse: collapse;\n min-width: 400px;\n }\n\n th,\n td {\n padding: 8px;\n text-align: left;\n border-bottom: 1px solid var(--ymt-outline-variant);\n word-break: normal;\n }\n\n th {\n background-color: var(--object-summary-section-background, var(--ymt-surface));\n font-weight: bold;\n }\n\n tr:hover {\n background-color: var(--ymt-hover-background);\n }\n `\n ]\n})\nexport class TableRendererComponent extends AbstractRendererComponent<any[]> {\n readonly #system = inject(SystemService);\n\n protected tableHeaders = computed(() => {\n const value = this.value() as { [key: string]: string | number }[] | undefined;\n if (!value || !value.length) return [];\n const headers = new Set<{ key: string; label: string }>();\n\n const allKeys = new Set<string>();\n value.forEach((item) => Object.keys(item).forEach((key) => allKeys.add(key)));\n allKeys.forEach((key) => headers.add({ key, label: this.#system.getLocalizedLabel(`${key}`) || key }));\n\n return Array.from(headers);\n });\n\n protected tableData = computed(() => {\n const data = this.value() || [];\n return data.length > 10 ? data.slice(0, 10) : data;\n });\n\n protected reducedData = computed(() => {\n const data = this.value() || [];\n return data.length > 10;\n });\n}\n","import { Component } from '@angular/core';\nimport { AbstractRendererComponent } from './abstract.renderer';\n\n@Component({\n selector: 'yuv-unknown-renderer',\n template: '{{value()}}',\n styles: [\n `\n :host {\n display: inline-block;\n padding: var(--tile-slot-padding);\n }\n `\n ]\n})\nexport class UnknownRendererComponent extends AbstractRendererComponent<any> {}\n","import { Injectable, Type, inject, signal } from '@angular/core';\nimport { ContentStreamField, InternalFieldType, RendererType, SchemaResponseFieldDefinition, SystemService } from '@yuuvis/client-core';\nimport { RendererComponent } from './renderer.interface';\nimport {\n AbstractRendererComponent,\n BooleanRendererComponent,\n DateTimeRendererComponent,\n DecimalRendererComponent,\n FileSizeRendererComponent,\n IconRendererComponent,\n IntegerRendererComponent,\n OrganizationRendererComponent,\n StringRendererComponent,\n UnknownRendererComponent\n} from '../../property-renderer';\nimport { TableRendererComponent } from '../../property-renderer/table.renderer.component';\n\n/**\n * Service for managing property type renderers. Renderers are components that will render certain\n * property types.\n *\n * You are able to register your own renderer to overwrite an existing one or provide a custom\n * renderer for your context.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class RendererService {\n private system = inject(SystemService);\n\n #renderers = signal<Record<string, Type<RendererComponent>>>({});\n\n constructor() {\n const initialRenderers: Record<string, Type<RendererComponent>> = {\n integer: IntegerRendererComponent,\n decimal: DecimalRendererComponent,\n datetime: DateTimeRendererComponent,\n icon: IconRendererComponent,\n string: StringRendererComponent,\n boolean: BooleanRendererComponent,\n table: TableRendererComponent\n };\n initialRenderers[InternalFieldType.STRING_ORGANIZATION] = OrganizationRendererComponent;\n initialRenderers[ContentStreamField.LENGTH] = FileSizeRendererComponent;\n this.#renderers.set(initialRenderers);\n }\n\n getRendererByType(type: RendererType): Type<RendererComponent> {\n return this.#renderers()[type] || UnknownRendererComponent;\n }\n\n getRenderer(propertyName: string, typeName?: string): Type<RendererComponent> {\n // try to find a renderer based on property and object type\n let r = this.#renderers()[this._getKey(propertyName, typeName)];\n\n if (!r) {\n // not special renderer found so we'll try to get one for the internal type\n // of the given property\n const srf: SchemaResponseFieldDefinition | undefined = this.system.system && this.system.system.allFields[propertyName];\n if (srf) {\n r = this.getRendererByType(this.system.getInternalFormElementType(srf.propertyType, srf.classifications));\n }\n }\n\n return r || UnknownRendererComponent;\n }\n\n /**\n * Register a renderer for a particular property. Providing `typeName` will register that renderer\n * for a certain context (use same inputs when calling `getRenderer()`).\n * @param cmp The component to actually render the property\n * @param propertyName property name (used for registering the renderer for a certain context)\n * @param typeName Optional type name (used for registering the renderer for a certain context)\n */\n registerRenderer(cmp: Type<AbstractRendererComponent>, propertyName: string, typeName?: string) {\n this.#renderers.update((curr) => ({ ...curr, ...{ [this._getKey(propertyName, typeName)]: cmp } }));\n }\n\n /**\n *\n * @param type The type of property this renderer is supposed to be used for\n */\n registerRendererByType(type: RendererType, cmp: Type<RendererComponent>) {\n this.#renderers.update((curr) => ({ ...curr, ...{ [type]: cmp } }));\n }\n\n // Generate the unique key for a renderer\n private _getKey(propertyName: string, typeName?: string): string {\n const k = [propertyName];\n typeName && k.push(typeName);\n return k.join('-');\n }\n}\n","import { ComponentRef, Directive, Injector, Type, ViewContainerRef, effect, inject, input, runInInjectionContext } from '@angular/core';\nimport { RendererComponent, RendererDirectiveInput } from './services/renderer/renderer.interface';\nimport { RendererService } from './services/renderer/renderer.service';\n\n/**\n * Structural directive for rendering an obect type property\n */\n@Directive({\n selector: '[yuvRenderer]',\n standalone: true\n})\nexport class RendererDirective {\n private readonly rendererService = inject(RendererService);\n private readonly containerRef = inject(ViewContainerRef);\n private readonly injector = inject(Injector);\n\n component!: ComponentRef<RendererComponent>;\n\n private _rendererInput?: RendererDirectiveInput;\n\n yuvRenderer = input<RendererDirectiveInput | undefined>(undefined);\n\n #yuvRendererEffect = effect(() => {\n const i = this.yuvRenderer();\n if (i && !this._alreadyRendered(i)) {\n this._rendererInput = i;\n\n if (i) {\n if (this.component) this.containerRef.clear();\n\n const cmp: Type<RendererComponent> = i.rendererType\n ? this.rendererService.getRendererByType(i.rendererType)\n : this.rendererService.getRenderer(i.propertyName);\n\n this.component = this.containerRef.createComponent(cmp);\n // pass inputs to the renderer. As they are signals they need an injection context\n // runInInjectionContext(this.injector, () => { // FOLLOWUP: this is not needed anymore with the new input() API\n this.component.setInput('propertyName', i.propertyName);\n this.component.setInput('value', i.value);\n if (i.meta) this.component.setInput('meta', i.meta);\n // });\n } else {\n this.containerRef.clear();\n }\n }\n });\n\n private _alreadyRendered(i: RendererDirectiveInput): boolean {\n return !!this._rendererInput && JSON.stringify(this._rendererInput) === JSON.stringify(i);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;AAGA;;AAEG;MAKmB,yBAAyB,CAAA;AAJ/C,IAAA,WAAA,GAAA;AAKE,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;AAE/B,QAAA,IAAA,CAAA,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAU;AACvC,QAAA,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAY;QAClC,IAAI,CAAA,IAAA,GAAG,KAAK,EAA+B;AAK5C;AATC,IAAA,OAAO;IAMG,WAAW,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;;+GARxC,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,qdAFnC,EAAE,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;4FAEQ,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAJ9C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,uBAAuB;AACjC,oBAAA,QAAQ,EAAE;AACX,iBAAA;;;ACQK,MAAO,wBAAyB,SAAQ,yBAAyB,CAAA;+GAA1D,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAVzB,CAA+E,6EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wDAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAD/E,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAWN,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAbpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,EACvB,OAAA,EAAA,CAAC,OAAO,CAAC,YACR,CAA+E,6EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wDAAA,CAAA,EAAA;;;ACUrF,MAAO,yBAA0B,SAAQ,yBAA+B,CAAA;+GAAjE,yBAAyB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAV1B,yCAAyC,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EADzC,cAAc,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAWb,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EACxB,OAAA,EAAA,CAAC,cAAc,CAAC,YACf,yCAAyC,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA;;;ACQ/C,MAAO,wBAAyB,SAAQ,yBAAiC,CAAA;+GAAlE,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,uGAVzB,aAAa,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA,CAAA,CAAA;;4FAUZ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAZpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,YACtB,aAAa,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA;;;ACYnB,MAAO,yBAA0B,SAAQ,yBAAyB,CAAA;AAbxE,IAAA,WAAA,GAAA;;AAcE,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAS,MAAK;YAClC,IAAI,CAAC,GAAG,CAAC;AACT,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE;AACtB,YAAA,IAAI,CAAC;AACH,gBAAA,IAAI;AACF,oBAAA,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;;gBACf,OAAO,CAAC,EAAE;AACV,oBAAA,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;;AAEpB,YAAA,OAAO,CAAC;AACV,SAAC,CAAC;AACH;+GAZY,yBAAyB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAV1B,8BAA8B,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAD9B,YAAY,EAAA,IAAA,EAAA,UAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAWX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAbrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,EACtB,OAAA,EAAA,CAAC,YAAY,CAAC,YACb,8BAA8B,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA;;;AC8BpC,MAAO,qBAAsB,SAAQ,yBAAyB,CAAA;AA/BpE,IAAA,WAAA,GAAA;;AAgCW,QAAA,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC;AAEvC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC;AACvB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE;AAEjD,QAAA,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,YAAW;AACvC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,EAAE,KAAK,QAAQ;AAC9B,gBAAA,EAAE,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC;gBAC7B,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,EAAY,CAAC,CAAC;AACxH,SAAC,CAAC;AACH;AAXU,IAAA,aAAa;AAEb,IAAA,UAAU;AAGnB,IAAA,oBAAoB;+GANT,qBAAqB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAArB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EA5BtB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA;;;;;;;;;;MAUN,EAXM,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uOAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,uBAAuB,2FAAE,OAAO,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FA6B/B,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA/BjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,WACpB,CAAC,uBAAuB,EAAE,OAAO,CAAC,EACjC,QAAA,EAAA,CAAA;;;;;;;;;;AAUN,KAAA,CAAA,EAAA,MAAA,EAAA,CAAA,uOAAA,CAAA,EAAA;;;ACJA,MAAO,wBAAyB,SAAQ,yBAAiC,CAAA;+GAAlE,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,uGAVzB,aAAa,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA,CAAA,CAAA;;4FAUZ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAZpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,YACtB,aAAa,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA;;;ACWnB,MAAO,6BAA8B,SAAQ,yBAAyB,CAAA;AAb5E,IAAA,WAAA,GAAA;;AAcE,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAS,MAAK;AACpC,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,YAAA,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC7C,SAAC,CAAC;AACH;+GALY,6BAA6B,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAA7B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,6BAA6B,4GAV9B,qBAAqB,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,6FAAA,CAAA,EAAA,CAAA,CAAA;;4FAUpB,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAbzC,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,QAAA,EACN,qBAAqB,EAAA,MAAA,EAAA,CAAA,6FAAA,CAAA,EAAA;;;ACS3B,MAAO,uBAAwB,SAAQ,yBAAyB,CAAA;+GAAzD,uBAAuB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,uBAAuB,sGAVxB,aAAa,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA,CAAA,CAAA;;4FAUZ,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAZnC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,qBAAqB,YACrB,aAAa,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA;;;ACoEnB,MAAO,sBAAuB,SAAQ,yBAAgC,CAAA;AApE5E,IAAA,WAAA,GAAA;;AAqEW,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,aAAa,CAAC;AAE9B,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,MAAK;AACrC,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAsD;AAC9E,YAAA,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,gBAAA,OAAO,EAAE;AACtC,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkC;AAEzD,YAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;AACjC,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AAC7E,YAAA,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAG,EAAA,GAAG,CAAE,CAAA,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;AAEtG,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;AAC5B,SAAC,CAAC;AAEQ,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAC,MAAK;YAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;YAC/B,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI;AACpD,SAAC,CAAC;AAEQ,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE;AAC/B,YAAA,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE;AACzB,SAAC,CAAC;AACH;AAvBU,IAAA,OAAO;+GADL,sBAAsB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,EAhEvB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBT,EAzBS,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,sbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,YAAY,8BAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;4FAiE5B,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBApElC,SAAS;+BACE,oBAAoB,EAAA,UAAA,EAClB,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,eAAe,CAAC,EAC9B,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;AAwBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,sbAAA,CAAA,EAAA;;;AClBG,MAAO,wBAAyB,SAAQ,yBAA8B,CAAA;+GAA/D,wBAAwB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,uGAVzB,aAAa,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA,CAAA,CAAA;;4FAUZ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAZpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,sBAAsB,YACtB,aAAa,EAAA,MAAA,EAAA,CAAA,gEAAA,CAAA,EAAA;;;ACYzB;;;;;;AAMG;MAIU,eAAe,CAAA;AAG1B,IAAA,UAAU;AAEV,IAAA,WAAA,GAAA;AAJQ,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0C,EAAE,CAAC;AAG9D,QAAA,MAAM,gBAAgB,GAA4C;AAChE,YAAA,OAAO,EAAE,wBAAwB;AACjC,YAAA,OAAO,EAAE,wBAAwB;AACjC,YAAA,QAAQ,EAAE,yBAAyB;AACnC,YAAA,IAAI,EAAE,qBAAqB;AAC3B,YAAA,MAAM,EAAE,uBAAuB;AAC/B,YAAA,OAAO,EAAE,wBAAwB;AACjC,YAAA,KAAK,EAAE;SACR;AACD,QAAA,gBAAgB,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,GAAG,6BAA6B;AACvF,QAAA,gBAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,yBAAyB;AACvE,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAgB,CAAC;;AAGvC,IAAA,iBAAiB,CAAC,IAAkB,EAAA;QAClC,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,wBAAwB;;IAG5D,WAAW,CAAC,YAAoB,EAAE,QAAiB,EAAA;;AAEjD,QAAA,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE/D,IAAI,CAAC,CAAC,EAAE;;;AAGN,YAAA,MAAM,GAAG,GAA8C,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC;YACvH,IAAI,GAAG,EAAE;gBACP,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;;;QAI7G,OAAO,CAAC,IAAI,wBAAwB;;AAGtC;;;;;;AAMG;AACH,IAAA,gBAAgB,CAAC,GAAoC,EAAE,YAAoB,EAAE,QAAiB,EAAA;AAC5F,QAAA,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;;AAGrG;;;AAGG;IACH,sBAAsB,CAAC,IAAkB,EAAE,GAA4B,EAAA;QACrE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,GAAG,GAAG,EAAE,EAAE,CAAC,CAAC;;;IAI7D,OAAO,CAAC,YAAoB,EAAE,QAAiB,EAAA;AACrD,QAAA,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;AACxB,QAAA,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC5B,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;+GA/DT,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA,CAAA;;4FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACtBD;;AAEG;MAKU,iBAAiB,CAAA;AAJ9B,IAAA,WAAA,GAAA;AAKmB,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AACzC,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACvC,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAM5C,QAAA,IAAA,CAAA,WAAW,GAAG,KAAK,CAAqC,SAAS,CAAC;AAElE,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,MAAK;AAC/B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE;AAClC,gBAAA,IAAI,CAAC,cAAc,GAAG,CAAC;gBAEvB,IAAI,CAAC,EAAE;oBACL,IAAI,IAAI,CAAC,SAAS;AAAE,wBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;AAE7C,oBAAA,MAAM,GAAG,GAA4B,CAAC,CAAC;0BACnC,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,YAAY;0BACrD,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;oBAEpD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,GAAG,CAAC;;;oBAGvD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC,YAAY,CAAC;oBACvD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC;oBACzC,IAAI,CAAC,CAAC,IAAI;wBAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;;;qBAE9C;AACL,oBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE;;;AAG/B,SAAC,CAAC;AAKH;AA5BC,IAAA,kBAAkB;AAyBV,IAAA,gBAAgB,CAAC,CAAyB,EAAA;QAChD,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;;+GArChF,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;mGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;4FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAJ7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;AACzB,oBAAA,UAAU,EAAE;AACb,iBAAA;;;ACVD;;AAEG;;;;"}
|
|
@@ -17,7 +17,7 @@ import { ActiveDescendantKeyManager } from '@angular/cdk/a11y';
|
|
|
17
17
|
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
18
18
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
19
19
|
import { ReactiveFormsModule, FormsModule } from '@angular/forms';
|
|
20
|
-
import { YUV_ICONS,
|
|
20
|
+
import { YUV_ICONS, ObjectTypeIconComponent } from '@yuuvis/client-framework/icons';
|
|
21
21
|
import * as i3 from '@yuuvis/client-framework/list';
|
|
22
22
|
import { ListItemDirective, YuvListModule } from '@yuuvis/client-framework/list';
|
|
23
23
|
import { YmtMatIconRegistryService, YmtButtonDirective } from '@yuuvis/material';
|
|
@@ -790,12 +790,12 @@ class PropertySelectComponent {
|
|
|
790
790
|
return this.system.getLocalizedLabel(otf.id) || otf.id;
|
|
791
791
|
}
|
|
792
792
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: PropertySelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
793
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.12", type: PropertySelectComponent, isStandalone: true, selector: "yuv-tile-property-select", inputs: { objectType: { classPropertyName: "objectType", publicName: "objectType", isSignal: true, isRequired: false, transformFunction: null }, selectedProperty: { classPropertyName: "selectedProperty", publicName: "selectedProperty", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { propertySelect: "propertySelect" }, ngImport: i0, template: "<!-- TODO: enable once filtering of properties makes sense -->\n<!-- <form class=\"filter\">\n <div class=\"filter-input\">\n <input type=\"text\" [placeholder]=\"'yuv.tile-config.property-select.filter.placeholder' | translate\" name=\"query\" [(ngModel)]=\"query\" />\n @if (query()) {\n <button class=\"icn\" (click)=\"query.set(null)\">\n <yuv-icon [svg]=\"clearIcon\"></yuv-icon>\n </button>\n }\n </div>\n</form> -->\n\n<ul class=\"properties\">\n @for (p of filteredObjectTypeFields(); track $index) {\n <li [ngClass]=\"{ baseProperty: p.baseProperty, selected: p.id === selectedProperty()?.propertyName }\" (click)=\"selectProperty(p)\">\n <div class=\"label\">{{ p.label }}</div>\n <button mat-icon-button (click)=\"removeProperty($event)\">\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n</ul>\n", styles: [":host{display:flex;flex-flow:column;max-height:100%}:host .filter{flex:0 0 auto}:host .filter .filter-input{background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline-variant);display:flex;padding:.25em;align-items:center}:host .filter .filter-input input{background-color:transparent;border:0;outline:0;flex:1;color:var(--ymt-text-color)}:host .properties{flex:1;column-count:3;column-width:30ch;column-rule:1px dotted var(--ymt-outline);column-gap:2em;margin-block-start:var(--ymt-spacing-m)}:host .properties li{border:1px solid var(--ymt-outline-variant);border-radius:0;margin-block-end:1px;display:flex;align-items:center;justify-content:space-between;cursor:default}:host .properties li:hover{background-color:var(--ymt-hover-background)}:host .properties li.baseProperty{font-style:italic}:host .properties li.selected{background-color:var(--ymt-primary);color:var(--ymt-on-primary)}:host .properties li:not(.selected) button{display:none}:host .properties li .label{padding:var(--ymt-spacing-xs) var(--ymt-spacing-m)}:host .properties li button{color:currentColor}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
793
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.12", type: PropertySelectComponent, isStandalone: true, selector: "yuv-tile-property-select", inputs: { objectType: { classPropertyName: "objectType", publicName: "objectType", isSignal: true, isRequired: false, transformFunction: null }, selectedProperty: { classPropertyName: "selectedProperty", publicName: "selectedProperty", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { propertySelect: "propertySelect" }, ngImport: i0, template: "<!-- TODO: enable once filtering of properties makes sense -->\n<!-- <form class=\"filter\">\n <div class=\"filter-input\">\n <input type=\"text\" [placeholder]=\"'yuv.tile-config.property-select.filter.placeholder' | translate\" name=\"query\" [(ngModel)]=\"query\" />\n @if (query()) {\n <button class=\"icn\" (click)=\"query.set(null)\">\n <yuv-icon [svg]=\"clearIcon\"></yuv-icon>\n </button>\n }\n </div>\n</form> -->\n\n<ul class=\"properties\">\n @for (p of filteredObjectTypeFields(); track $index) {\n <li [ngClass]=\"{ baseProperty: p.baseProperty, selected: p.id === selectedProperty()?.propertyName }\" (click)=\"selectProperty(p)\">\n <div class=\"label\">{{ p.label }}</div>\n <button mat-icon-button (click)=\"removeProperty($event)\">\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n</ul>\n", styles: [":host{display:flex;flex-flow:column;max-height:100%}:host .filter{flex:0 0 auto}:host .filter .filter-input{background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline-variant);display:flex;padding:.25em;align-items:center}:host .filter .filter-input input{background-color:transparent;border:0;outline:0;flex:1;color:var(--ymt-text-color)}:host .properties{flex:1;column-count:3;column-width:30ch;column-rule:1px dotted var(--ymt-outline);column-gap:2em;margin-block-start:var(--ymt-spacing-m)}:host .properties li{border:1px solid var(--ymt-outline-variant);border-radius:0;margin-block-end:1px;display:flex;align-items:center;justify-content:space-between;cursor:default}:host .properties li:hover{background-color:var(--ymt-hover-background)}:host .properties li.baseProperty{font-style:italic}:host .properties li.selected{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host .properties li:not(.selected) button{display:none}:host .properties li .label{padding:var(--ymt-spacing-xs) var(--ymt-spacing-m)}:host .properties li button{color:currentColor}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
794
794
|
}
|
|
795
795
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: PropertySelectComponent, decorators: [{
|
|
796
796
|
type: Component,
|
|
797
797
|
args: [{ selector: 'yuv-tile-property-select', standalone: true, imports: [NgClass, FormsModule, TranslateModule,
|
|
798
|
-
MatButtonModule, MatIconModule], template: "<!-- TODO: enable once filtering of properties makes sense -->\n<!-- <form class=\"filter\">\n <div class=\"filter-input\">\n <input type=\"text\" [placeholder]=\"'yuv.tile-config.property-select.filter.placeholder' | translate\" name=\"query\" [(ngModel)]=\"query\" />\n @if (query()) {\n <button class=\"icn\" (click)=\"query.set(null)\">\n <yuv-icon [svg]=\"clearIcon\"></yuv-icon>\n </button>\n }\n </div>\n</form> -->\n\n<ul class=\"properties\">\n @for (p of filteredObjectTypeFields(); track $index) {\n <li [ngClass]=\"{ baseProperty: p.baseProperty, selected: p.id === selectedProperty()?.propertyName }\" (click)=\"selectProperty(p)\">\n <div class=\"label\">{{ p.label }}</div>\n <button mat-icon-button (click)=\"removeProperty($event)\">\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n</ul>\n", styles: [":host{display:flex;flex-flow:column;max-height:100%}:host .filter{flex:0 0 auto}:host .filter .filter-input{background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline-variant);display:flex;padding:.25em;align-items:center}:host .filter .filter-input input{background-color:transparent;border:0;outline:0;flex:1;color:var(--ymt-text-color)}:host .properties{flex:1;column-count:3;column-width:30ch;column-rule:1px dotted var(--ymt-outline);column-gap:2em;margin-block-start:var(--ymt-spacing-m)}:host .properties li{border:1px solid var(--ymt-outline-variant);border-radius:0;margin-block-end:1px;display:flex;align-items:center;justify-content:space-between;cursor:default}:host .properties li:hover{background-color:var(--ymt-hover-background)}:host .properties li.baseProperty{font-style:italic}:host .properties li.selected{background-color:var(--ymt-primary);color:var(--ymt-on-primary)}:host .properties li:not(.selected) button{display:none}:host .properties li .label{padding:var(--ymt-spacing-xs) var(--ymt-spacing-m)}:host .properties li button{color:currentColor}\n"] }]
|
|
798
|
+
MatButtonModule, MatIconModule], template: "<!-- TODO: enable once filtering of properties makes sense -->\n<!-- <form class=\"filter\">\n <div class=\"filter-input\">\n <input type=\"text\" [placeholder]=\"'yuv.tile-config.property-select.filter.placeholder' | translate\" name=\"query\" [(ngModel)]=\"query\" />\n @if (query()) {\n <button class=\"icn\" (click)=\"query.set(null)\">\n <yuv-icon [svg]=\"clearIcon\"></yuv-icon>\n </button>\n }\n </div>\n</form> -->\n\n<ul class=\"properties\">\n @for (p of filteredObjectTypeFields(); track $index) {\n <li [ngClass]=\"{ baseProperty: p.baseProperty, selected: p.id === selectedProperty()?.propertyName }\" (click)=\"selectProperty(p)\">\n <div class=\"label\">{{ p.label }}</div>\n <button mat-icon-button (click)=\"removeProperty($event)\">\n <mat-icon>close</mat-icon>\n </button>\n </li>\n }\n</ul>\n", styles: [":host{display:flex;flex-flow:column;max-height:100%}:host .filter{flex:0 0 auto}:host .filter .filter-input{background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline-variant);display:flex;padding:.25em;align-items:center}:host .filter .filter-input input{background-color:transparent;border:0;outline:0;flex:1;color:var(--ymt-text-color)}:host .properties{flex:1;column-count:3;column-width:30ch;column-rule:1px dotted var(--ymt-outline);column-gap:2em;margin-block-start:var(--ymt-spacing-m)}:host .properties li{border:1px solid var(--ymt-outline-variant);border-radius:0;margin-block-end:1px;display:flex;align-items:center;justify-content:space-between;cursor:default}:host .properties li:hover{background-color:var(--ymt-hover-background)}:host .properties li.baseProperty{font-style:italic}:host .properties li.selected{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host .properties li:not(.selected) button{display:none}:host .properties li .label{padding:var(--ymt-spacing-xs) var(--ymt-spacing-m)}:host .properties li button{color:currentColor}\n"] }]
|
|
799
799
|
}] });
|
|
800
800
|
|
|
801
801
|
/**
|
|
@@ -824,7 +824,7 @@ class TileConfigTileComponent {
|
|
|
824
824
|
this.actions = computed(() => {
|
|
825
825
|
const actionsList = [];
|
|
826
826
|
const ocActions = this.objectConfig();
|
|
827
|
-
if (ocActions
|
|
827
|
+
if (ocActions?.actions?.length) {
|
|
828
828
|
ocActions.actions?.forEach((a) => {
|
|
829
829
|
const aa = this.actionService.getActionById(a.id);
|
|
830
830
|
if (aa)
|
|
@@ -849,13 +849,13 @@ class TileConfigTileComponent {
|
|
|
849
849
|
});
|
|
850
850
|
}
|
|
851
851
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: TileConfigTileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
852
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.12", type: TileConfigTileComponent, isStandalone: true, selector: "yuv-tile-config-tile", inputs: { disableIconSlot: { classPropertyName: "disableIconSlot", publicName: "disableIconSlot", isSignal: true, isRequired: false, transformFunction: null }, disableBadgesSlot: { classPropertyName: "disableBadgesSlot", publicName: "disableBadgesSlot", isSignal: true, isRequired: false, transformFunction: null }, objectConfig: { classPropertyName: "objectConfig", publicName: "objectConfig", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { slotSelect: "slotSelect" }, ngImport: i0, template: "@let oc = _objectConfig();\n\n<div data-slot=\"icon\" [attr.disabled]=\"disableIconSlot()\" (click)=\"selectSlot('icon')\">\n @if (oc.icon) {\n <
|
|
852
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.12", type: TileConfigTileComponent, isStandalone: true, selector: "yuv-tile-config-tile", inputs: { disableIconSlot: { classPropertyName: "disableIconSlot", publicName: "disableIconSlot", isSignal: true, isRequired: false, transformFunction: null }, disableBadgesSlot: { classPropertyName: "disableBadgesSlot", publicName: "disableBadgesSlot", isSignal: true, isRequired: false, transformFunction: null }, objectConfig: { classPropertyName: "objectConfig", publicName: "objectConfig", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { slotSelect: "slotSelect" }, ngImport: i0, template: "@let oc = _objectConfig();\n\n<div data-slot=\"icon\" [attr.disabled]=\"disableIconSlot()\" (click)=\"selectSlot('icon')\">\n @if (oc && oc.icon) {\n <mat-icon>{{ oc.icon.svg }}</mat-icon>\n } @else if (oc && oc.objectTypeId) {\n <yuv-object-type-icon [objectTypeId]=\"oc.objectTypeId\"></yuv-object-type-icon>\n }\n</div>\n<div data-slot=\"title\" (click)=\"selectSlot('title')\">{{ oc?.title?.label }}</div>\n<div data-slot=\"actions\" (click)=\"selectSlot('actions')\">\n @for (a of actions(); track a.id) {\n <button mat-icon-button [matTooltip]=\"a.label\">\n <mat-icon inert=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n</div>\n<div data-slot=\"description\" (click)=\"selectSlot('description')\">{{ oc?.description?.label }}</div>\n<div data-slot=\"aside\" (click)=\"selectSlot('aside')\">{{ oc?.aside?.label }}</div>\n<div data-slot=\"meta\" (click)=\"selectSlot('meta')\">{{ oc?.meta?.label }}</div>\n@if (!disableBadgesSlot()) {\n <div data-slot=\"badges\" (click)=\"selectSlot('badges')\">\n {{ oc?.badges }}\n </div>\n}\n", styles: [":host{--tile-item-gap: .5em;--tile-background: transparent;--tile-icon-fill: currentColor;display:grid;grid-template-rows:auto auto auto auto;grid-template-columns:3rem 1fr auto;grid-template-areas:\"icon title title actions\" \"icon description aside aside\" \"icon meta meta badges\";gap:var(--tile-item-gap);padding:var(--ymt-spacing-m);background-color:var(--tile-background)}:host:hover [data-slot=actions]{opacity:1}:host [data-slot=icon]{grid-area:icon;display:flex;align-items:center;justify-content:center}:host [data-slot=title]{grid-area:title;font-weight:700}:host [data-slot=description]{grid-area:description}:host [data-slot=meta]{grid-area:meta}:host [data-slot=aside]{flex:0 0 auto;grid-area:aside}:host [data-slot=actions]{flex:0 0 auto;display:flex;justify-self:end;grid-area:actions}:host [data-slot=actions] button{padding:0;gap:2px}:host [data-slot=badges]{grid-area:badges;justify-self:end;flex:0 0 auto}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]){display:flex;align-items:center;background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline);padding:.25em .5em;box-sizing:border-box;min-height:2.2em;border-radius:var(--ymt-corner-xs)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]){cursor:pointer}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]):hover{background-color:var(--ymt-focus-background);color:var(--ymt-on-focus-background)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]).active{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta])[disabled]{border:none;background-color:transparent}:host :where([data-slot=badges],[data-slot=actions]){min-width:3em}:host :where([data-slot=badges],[data-slot=actions]) button{width:24px;height:24px;pointer-events:none;color:currentColor}:host [data-slot=aside]{min-width:4em}:host [data-slot=icon]{height:3em;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: CommonModule }, { kind: "component", type: ObjectTypeIconComponent, selector: "yuv-object-type-icon", inputs: ["objectTypeId"] }] }); }
|
|
853
853
|
}
|
|
854
854
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: TileConfigTileComponent, decorators: [{
|
|
855
855
|
type: Component,
|
|
856
|
-
args: [{ selector: 'yuv-tile-config-tile', standalone: true, imports: [
|
|
856
|
+
args: [{ selector: 'yuv-tile-config-tile', standalone: true, imports: [MatButtonModule,
|
|
857
857
|
MatTooltipModule,
|
|
858
|
-
MatIconModule, CommonModule, ObjectTypeIconComponent], template: "@let oc = _objectConfig();\n\n<div data-slot=\"icon\" [attr.disabled]=\"disableIconSlot()\" (click)=\"selectSlot('icon')\">\n @if (oc.icon) {\n <
|
|
858
|
+
MatIconModule, CommonModule, ObjectTypeIconComponent], template: "@let oc = _objectConfig();\n\n<div data-slot=\"icon\" [attr.disabled]=\"disableIconSlot()\" (click)=\"selectSlot('icon')\">\n @if (oc && oc.icon) {\n <mat-icon>{{ oc.icon.svg }}</mat-icon>\n } @else if (oc && oc.objectTypeId) {\n <yuv-object-type-icon [objectTypeId]=\"oc.objectTypeId\"></yuv-object-type-icon>\n }\n</div>\n<div data-slot=\"title\" (click)=\"selectSlot('title')\">{{ oc?.title?.label }}</div>\n<div data-slot=\"actions\" (click)=\"selectSlot('actions')\">\n @for (a of actions(); track a.id) {\n <button mat-icon-button [matTooltip]=\"a.label\">\n <mat-icon inert=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n</div>\n<div data-slot=\"description\" (click)=\"selectSlot('description')\">{{ oc?.description?.label }}</div>\n<div data-slot=\"aside\" (click)=\"selectSlot('aside')\">{{ oc?.aside?.label }}</div>\n<div data-slot=\"meta\" (click)=\"selectSlot('meta')\">{{ oc?.meta?.label }}</div>\n@if (!disableBadgesSlot()) {\n <div data-slot=\"badges\" (click)=\"selectSlot('badges')\">\n {{ oc?.badges }}\n </div>\n}\n", styles: [":host{--tile-item-gap: .5em;--tile-background: transparent;--tile-icon-fill: currentColor;display:grid;grid-template-rows:auto auto auto auto;grid-template-columns:3rem 1fr auto;grid-template-areas:\"icon title title actions\" \"icon description aside aside\" \"icon meta meta badges\";gap:var(--tile-item-gap);padding:var(--ymt-spacing-m);background-color:var(--tile-background)}:host:hover [data-slot=actions]{opacity:1}:host [data-slot=icon]{grid-area:icon;display:flex;align-items:center;justify-content:center}:host [data-slot=title]{grid-area:title;font-weight:700}:host [data-slot=description]{grid-area:description}:host [data-slot=meta]{grid-area:meta}:host [data-slot=aside]{flex:0 0 auto;grid-area:aside}:host [data-slot=actions]{flex:0 0 auto;display:flex;justify-self:end;grid-area:actions}:host [data-slot=actions] button{padding:0;gap:2px}:host [data-slot=badges]{grid-area:badges;justify-self:end;flex:0 0 auto}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]){display:flex;align-items:center;background-color:var(--ymt-surface-panel);border:1px solid var(--ymt-outline);padding:.25em .5em;box-sizing:border-box;min-height:2.2em;border-radius:var(--ymt-corner-xs)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]){cursor:pointer}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]):hover{background-color:var(--ymt-focus-background);color:var(--ymt-on-focus-background)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta]):not([disabled]).active{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host :where([data-slot=badges],[data-slot=actions],[data-slot=aside],[data-slot=icon],[data-slot=title],[data-slot=description],[data-slot=meta])[disabled]{border:none;background-color:transparent}:host :where([data-slot=badges],[data-slot=actions]){min-width:3em}:host :where([data-slot=badges],[data-slot=actions]) button{width:24px;height:24px;pointer-events:none;color:currentColor}:host [data-slot=aside]{min-width:4em}:host [data-slot=icon]{height:3em;width:100%}\n"] }]
|
|
859
859
|
}] });
|
|
860
860
|
|
|
861
861
|
class TileConfigComponent {
|
|
@@ -880,7 +880,7 @@ class TileConfigComponent {
|
|
|
880
880
|
return [...ct.map((t) => ({ id: t.id, icon: t.icon, data: t })), ...cf.map((f) => ({ id: f.id, icon: f.icon, flavor: true, data: f }))];
|
|
881
881
|
});
|
|
882
882
|
this.save = output();
|
|
883
|
-
this.
|
|
883
|
+
this.canceled = output();
|
|
884
884
|
this.selectedTypeProperties = [];
|
|
885
885
|
this.#emptyObjectConfig = {
|
|
886
886
|
objectTypeId: '',
|
|
@@ -935,7 +935,7 @@ class TileConfigComponent {
|
|
|
935
935
|
const alreadyChanged = this.changes[t.id];
|
|
936
936
|
// load tile config
|
|
937
937
|
// if the type has been changed before load that config instead of the persisted one
|
|
938
|
-
this.objectConfig = alreadyChanged ||
|
|
938
|
+
this.objectConfig = { ...alreadyChanged || this.#objectConfigService.getObjectConfig(t, this.bucket() || '') };
|
|
939
939
|
if (!this.objectConfig) {
|
|
940
940
|
this.objectConfig = {
|
|
941
941
|
...this.#emptyObjectConfig,
|
|
@@ -971,15 +971,14 @@ class TileConfigComponent {
|
|
|
971
971
|
if (!this.selectedType)
|
|
972
972
|
return;
|
|
973
973
|
if (this.objectConfig) {
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
const idx = this.objectConfig.actions.findIndex((a) => a.id === action.id);
|
|
974
|
+
const actions = this.objectConfig?.actions ? [...this.objectConfig.actions] : [];
|
|
975
|
+
const idx = actions.findIndex((a) => a.id === action.id);
|
|
977
976
|
if (idx !== -1)
|
|
978
|
-
|
|
977
|
+
actions.splice(idx, 1);
|
|
979
978
|
else
|
|
980
|
-
|
|
981
|
-
this.objectConfig =
|
|
982
|
-
this.changes[this.selectedType.id] = this.objectConfig;
|
|
979
|
+
actions.push({ id: action.id });
|
|
980
|
+
this.objectConfig = { ...this.objectConfig, actions };
|
|
981
|
+
this.changes[this.selectedType.id] = { ...this.objectConfig };
|
|
983
982
|
}
|
|
984
983
|
}
|
|
985
984
|
saveConfig() {
|
|
@@ -989,23 +988,51 @@ class TileConfigComponent {
|
|
|
989
988
|
}
|
|
990
989
|
resetConfig() {
|
|
991
990
|
if (this.selectedType) {
|
|
992
|
-
this.
|
|
993
|
-
this.
|
|
991
|
+
const defaults = this.#objectConfigService.getRegisteredDefault(this.selectedType.id, this.bucket()) || this.#emptyObjectConfig;
|
|
992
|
+
this.changes[this.selectedType.id] = { ...defaults };
|
|
993
|
+
this.objectConfig = { ...defaults };
|
|
994
|
+
const originalConfig = this.#objectConfigService.getObjectConfig(this.selectedType, this.bucket());
|
|
995
|
+
if (this.#deepEqual(defaults, originalConfig)) {
|
|
996
|
+
this.changes[this.selectedType.id] = undefined;
|
|
997
|
+
delete this.changes[this.selectedType.id];
|
|
998
|
+
}
|
|
999
|
+
else {
|
|
1000
|
+
this.changes[this.selectedType.id] = { ...defaults };
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
cancelConfig() {
|
|
1005
|
+
this.changes = {};
|
|
1006
|
+
this.canceled.emit();
|
|
1007
|
+
}
|
|
1008
|
+
#deepEqual(a, b) {
|
|
1009
|
+
if (a === b)
|
|
1010
|
+
return true;
|
|
1011
|
+
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null)
|
|
1012
|
+
return false;
|
|
1013
|
+
const keysA = Object.keys(a);
|
|
1014
|
+
const keysB = Object.keys(b);
|
|
1015
|
+
if (keysA.length !== keysB.length)
|
|
1016
|
+
return false;
|
|
1017
|
+
for (const key of keysA) {
|
|
1018
|
+
if (!keysB.includes(key))
|
|
1019
|
+
return false;
|
|
1020
|
+
if (!this.#deepEqual(a[key], b[key]))
|
|
1021
|
+
return false;
|
|
994
1022
|
}
|
|
1023
|
+
return true;
|
|
995
1024
|
}
|
|
996
1025
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: TileConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
997
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.12", type: TileConfigComponent, isStandalone: true, selector: "yuv-tile-config", inputs: { bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null }, bucketLabel: { classPropertyName: "bucketLabel", publicName: "bucketLabel", isSignal: true, isRequired: false, transformFunction: null }, configTypes: { classPropertyName: "configTypes", publicName: "configTypes", isSignal: true, isRequired: false, transformFunction: null }, configFlavors: { classPropertyName: "configFlavors", publicName: "configFlavors", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { save: "save",
|
|
1026
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.12", type: TileConfigComponent, isStandalone: true, selector: "yuv-tile-config", inputs: { bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null }, bucketLabel: { classPropertyName: "bucketLabel", publicName: "bucketLabel", isSignal: true, isRequired: false, transformFunction: null }, configTypes: { classPropertyName: "configTypes", publicName: "configTypes", isSignal: true, isRequired: false, transformFunction: null }, configFlavors: { classPropertyName: "configFlavors", publicName: "configFlavors", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { save: "save", canceled: "canceled" }, ngImport: i0, template: "<yuv-dialog [headertitel]=\"'yuv.tile-config.title' | translate: { bucket: bucketLabel() }\">\n <main class=\"tile-config\">\n <yuv-split-view [gutterSize]=\"1\" [layoutSettingsID]=\"'yuv.framework.tile-config.layout'\">\n <!-- list of types -->\n <ng-template yuvSplitArea [size]=\"30\">\n <div class=\"types\">\n <yuv-list (itemSelect)=\"itemSelected($event)\" autoSelect>\n @for (t of types() || []; track t.id; let i = $index) {\n <div\n yuvListItem\n >\n @if (t.icon) {\n <mat-icon>{{ t.icon }}</mat-icon>\n }\n {{ t.id | translate }}\n </div>\n }\n </yuv-list>\n </div>\n </ng-template>\n\n <!-- selected type details-->\n <ng-template yuvSplitArea [size]=\"70\">\n <div class=\"details\">\n @if (selectedType) {\n <header>\n <h2>{{ selectedType.id | translate }}</h2>\n <button ymtButton=\"secondary\" (click)=\"resetConfig()\">{{ 'yuv.tile-config.button.reset' | translate }}</button>\n </header>\n <div class=\"dummy-preview\">\n <yuv-tile-config-tile\n [disableIconSlot]=\"true\"\n [disableBadgesSlot]=\"true\"\n [objectConfig]=\"objectConfig!\"\n (slotSelect)=\"slotSelect($event)\"\n ></yuv-tile-config-tile>\n </div>\n\n <main>\n @if (selectedSlot === 'icon') {\n <h3>{{ 'yuv.tile-config.slot.icon.headline' | translate }}</h3>\n <yuv-icon-select [objectType]=\"selectedType\" (iconSelect)=\"iconSelected($event)\"></yuv-icon-select>\n } @else if (selectedSlot === 'badges') {\n <div class=\"placeholder empty\">\n <p>Future feature: Select badges (like: is favorite, ratings, ...)</p>\n </div>\n } @else if (!selectedSlot) {\n } @else if (selectedSlot === 'actions') {\n <h3>{{ 'yuv.tile-config.slot.action.headline' | translate }}</h3>\n <yuv-tile-action-select\n [objectType]=\"selectedType\"\n [selectedActionIds]=\"getSelectedActions()\"\n (actionSelect)=\"actionSelected($event)\"\n ></yuv-tile-action-select>\n } @else {\n <h3>{{ 'yuv.tile-config.slot.property.headline' | translate }}</h3>\n <yuv-tile-property-select\n [objectType]=\"selectedType\"\n [selectedProperty]=\"getConfigProperty(selectedSlot)\"\n (propertySelect)=\"propertySelected(selectedSlot, $event)\"\n ></yuv-tile-property-select>\n }\n </main>\n } @else {\n <div class=\"placeholder empty\">\n <h2>{{ 'yuv.tile-config.details.empty.title' | translate }}</h2>\n <p>{{ 'yuv.tile-config.details.empty.description' | translate }}</p>\n </div>\n }\n </div>\n </ng-template>\n </yuv-split-view>\n </main>\n\n <footer>\n <button ymtButton=\"secondary\" (click)=\"cancelConfig()\">{{ 'yuv.tile-config.button.close' | translate }}</button>\n <button ymtButton=\"primary\" [disabled]=\"!configChanged\" (click)=\"saveConfig()\">{{ 'yuv.tile-config.button.save' | translate }}</button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:flex;height:100%;flex-flow:column}:host main.tile-config{height:100%;display:contents}:host yuv-split-view{--split-gutter-background-color: var(--ymt-outline-variant);flex:1}:host .details{box-sizing:border-box}:host div.types{box-sizing:border-box;height:100%;overflow-y:auto}:host div.types div[yuvListItem]{display:flex;gap:var(--ymt-spacing-m);align-items:center;padding:var(--ymt-spacing-xs) var(--ymt-spacing-m);cursor:pointer}:host div.types div[yuvListItem]:not([aria-selected=true]):hover,:host div.types div[yuvListItem]:not([aria-selected=true])[aria-current=true]{background-color:var(--ymt-focus-background)}:host div.types div[yuvListItem][aria-selected=true]{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host div.types div[yuvListItem] yuv-object-type-icon{flex:0 0 auto;color:currentColor;opacity:.54}:host .details{height:100%;display:flex;flex-flow:column;overflow:hidden}:host .details header{flex:0 0 auto;display:flex;align-items:center;border-bottom:1px solid var(--ymt-outline-variant);padding:var(--ymt-spacing-m);gap:var(--ymt-spacing-m)}:host .details header h2{flex:1;overflow:hidden;text-overflow:ellipsis;margin:0}:host .details .dummy-preview{flex:0 0 auto;padding:var(--ymt-spacing-m);background-color:var(--ymt-surface-panel);border-bottom:1px solid var(--ymt-outline-variant)}:host .details .dummy-preview yuv-tile-config-tile{border-radius:var(--ymt-corner-m);border:1px solid var(--ymt-outline);background-color:var(--ymt-surface-container)}:host .details main{flex:1;overflow-y:auto;padding:var(--ymt-spacing-m)}:host .details main h3{margin:0;padding-block-end:var(--ymt-spacing-m);font:var(--ymt-font-subhead)}:host .details .placeholder.empty{height:100%;display:grid;place-content:center;color:var(--ymt-text-color-subtle)}\n"], dependencies: [{ kind: "ngmodule", type: YuvSplitViewModule }, { kind: "directive", type: i1$3.SplitAreaDirective, selector: "[yuvSplitArea]", inputs: ["size", "minSize", "maxSize", "panelClass", "visible"] }, { kind: "component", type: i1$3.SplitViewComponent, selector: "yuv-split-view", inputs: ["direction", "gutterSize", "restrictMove", "disabled", "layoutSettingsID"], outputs: ["layoutSettingsChange", "dragStart", "dragEnd", "gutterClick", "gutterDblClick"] }, { kind: "component", type: TileConfigTileComponent, selector: "yuv-tile-config-tile", inputs: ["disableIconSlot", "disableBadgesSlot", "objectConfig"], outputs: ["slotSelect"] }, { kind: "component", type: IconSelectComponent, selector: "yuv-icon-select", inputs: ["objectType"], outputs: ["iconSelect"] }, { kind: "component", type: PropertySelectComponent, selector: "yuv-tile-property-select", inputs: ["objectType", "selectedProperty"], outputs: ["propertySelect"] }, { kind: "component", type: ActionSelectComponent, selector: "yuv-tile-action-select", inputs: ["objectType", "selectedActionIds"], outputs: ["actionSelect"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: YuvListModule }, { kind: "component", type: i3.ListComponent, selector: "yuv-list", inputs: ["multiselect", "selfHandleSelection", "autoSelect", "disableSelection"], outputs: ["itemSelect", "itemFocus"] }, { kind: "directive", type: i3.ListItemDirective, selector: "[yuvListItem]", inputs: ["disabled", "active", "selected"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: DialogComponent, selector: "yuv-dialog", inputs: ["headertitel"] }, { kind: "directive", type: YmtButtonDirective, selector: "button[ymtButton], a[ymtButton]", inputs: ["ymtButton", "disabled", "aria-disabled", "disableRipple", "disabledInteractive", "button-size"] }] }); }
|
|
998
1027
|
}
|
|
999
1028
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: TileConfigComponent, decorators: [{
|
|
1000
1029
|
type: Component,
|
|
1001
1030
|
args: [{ selector: 'yuv-tile-config', standalone: true, imports: [
|
|
1002
1031
|
YuvSplitViewModule,
|
|
1003
|
-
ObjectTypeIconComponent,
|
|
1004
1032
|
TileConfigTileComponent,
|
|
1005
1033
|
IconSelectComponent,
|
|
1006
1034
|
PropertySelectComponent,
|
|
1007
1035
|
ActionSelectComponent,
|
|
1008
|
-
YuvIconComponent,
|
|
1009
1036
|
TranslateModule,
|
|
1010
1037
|
YuvListModule,
|
|
1011
1038
|
MatIconModule,
|
|
@@ -1013,7 +1040,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImpo
|
|
|
1013
1040
|
MatButtonModule,
|
|
1014
1041
|
DialogComponent,
|
|
1015
1042
|
YmtButtonDirective
|
|
1016
|
-
], template: "<yuv-dialog [headertitel]=\"'yuv.tile-config.title' | translate: { bucket: bucketLabel() }\">\n <main class=\"tile-config\">\n <yuv-split-view [gutterSize]=\"1\" [layoutSettingsID]=\"'yuv.framework.tile-config.layout'\">\n <!-- list of types -->\n <ng-template yuvSplitArea [size]=\"30\">\n <div class=\"types\">\n <yuv-list (itemSelect)=\"itemSelected($event)\">\n @for (t of types() || []; track t.id) {\n <div
|
|
1043
|
+
], template: "<yuv-dialog [headertitel]=\"'yuv.tile-config.title' | translate: { bucket: bucketLabel() }\">\n <main class=\"tile-config\">\n <yuv-split-view [gutterSize]=\"1\" [layoutSettingsID]=\"'yuv.framework.tile-config.layout'\">\n <!-- list of types -->\n <ng-template yuvSplitArea [size]=\"30\">\n <div class=\"types\">\n <yuv-list (itemSelect)=\"itemSelected($event)\" autoSelect>\n @for (t of types() || []; track t.id; let i = $index) {\n <div\n yuvListItem\n >\n @if (t.icon) {\n <mat-icon>{{ t.icon }}</mat-icon>\n }\n {{ t.id | translate }}\n </div>\n }\n </yuv-list>\n </div>\n </ng-template>\n\n <!-- selected type details-->\n <ng-template yuvSplitArea [size]=\"70\">\n <div class=\"details\">\n @if (selectedType) {\n <header>\n <h2>{{ selectedType.id | translate }}</h2>\n <button ymtButton=\"secondary\" (click)=\"resetConfig()\">{{ 'yuv.tile-config.button.reset' | translate }}</button>\n </header>\n <div class=\"dummy-preview\">\n <yuv-tile-config-tile\n [disableIconSlot]=\"true\"\n [disableBadgesSlot]=\"true\"\n [objectConfig]=\"objectConfig!\"\n (slotSelect)=\"slotSelect($event)\"\n ></yuv-tile-config-tile>\n </div>\n\n <main>\n @if (selectedSlot === 'icon') {\n <h3>{{ 'yuv.tile-config.slot.icon.headline' | translate }}</h3>\n <yuv-icon-select [objectType]=\"selectedType\" (iconSelect)=\"iconSelected($event)\"></yuv-icon-select>\n } @else if (selectedSlot === 'badges') {\n <div class=\"placeholder empty\">\n <p>Future feature: Select badges (like: is favorite, ratings, ...)</p>\n </div>\n } @else if (!selectedSlot) {\n } @else if (selectedSlot === 'actions') {\n <h3>{{ 'yuv.tile-config.slot.action.headline' | translate }}</h3>\n <yuv-tile-action-select\n [objectType]=\"selectedType\"\n [selectedActionIds]=\"getSelectedActions()\"\n (actionSelect)=\"actionSelected($event)\"\n ></yuv-tile-action-select>\n } @else {\n <h3>{{ 'yuv.tile-config.slot.property.headline' | translate }}</h3>\n <yuv-tile-property-select\n [objectType]=\"selectedType\"\n [selectedProperty]=\"getConfigProperty(selectedSlot)\"\n (propertySelect)=\"propertySelected(selectedSlot, $event)\"\n ></yuv-tile-property-select>\n }\n </main>\n } @else {\n <div class=\"placeholder empty\">\n <h2>{{ 'yuv.tile-config.details.empty.title' | translate }}</h2>\n <p>{{ 'yuv.tile-config.details.empty.description' | translate }}</p>\n </div>\n }\n </div>\n </ng-template>\n </yuv-split-view>\n </main>\n\n <footer>\n <button ymtButton=\"secondary\" (click)=\"cancelConfig()\">{{ 'yuv.tile-config.button.close' | translate }}</button>\n <button ymtButton=\"primary\" [disabled]=\"!configChanged\" (click)=\"saveConfig()\">{{ 'yuv.tile-config.button.save' | translate }}</button>\n </footer>\n</yuv-dialog>\n", styles: [":host{display:flex;height:100%;flex-flow:column}:host main.tile-config{height:100%;display:contents}:host yuv-split-view{--split-gutter-background-color: var(--ymt-outline-variant);flex:1}:host .details{box-sizing:border-box}:host div.types{box-sizing:border-box;height:100%;overflow-y:auto}:host div.types div[yuvListItem]{display:flex;gap:var(--ymt-spacing-m);align-items:center;padding:var(--ymt-spacing-xs) var(--ymt-spacing-m);cursor:pointer}:host div.types div[yuvListItem]:not([aria-selected=true]):hover,:host div.types div[yuvListItem]:not([aria-selected=true])[aria-current=true]{background-color:var(--ymt-focus-background)}:host div.types div[yuvListItem][aria-selected=true]{background-color:var(--ymt-primary-container);color:var(--ymt-on-primary-container)}:host div.types div[yuvListItem] yuv-object-type-icon{flex:0 0 auto;color:currentColor;opacity:.54}:host .details{height:100%;display:flex;flex-flow:column;overflow:hidden}:host .details header{flex:0 0 auto;display:flex;align-items:center;border-bottom:1px solid var(--ymt-outline-variant);padding:var(--ymt-spacing-m);gap:var(--ymt-spacing-m)}:host .details header h2{flex:1;overflow:hidden;text-overflow:ellipsis;margin:0}:host .details .dummy-preview{flex:0 0 auto;padding:var(--ymt-spacing-m);background-color:var(--ymt-surface-panel);border-bottom:1px solid var(--ymt-outline-variant)}:host .details .dummy-preview yuv-tile-config-tile{border-radius:var(--ymt-corner-m);border:1px solid var(--ymt-outline);background-color:var(--ymt-surface-container)}:host .details main{flex:1;overflow-y:auto;padding:var(--ymt-spacing-m)}:host .details main h3{margin:0;padding-block-end:var(--ymt-spacing-m);font:var(--ymt-font-subhead)}:host .details .placeholder.empty{height:100%;display:grid;place-content:center;color:var(--ymt-text-color-subtle)}\n"] }]
|
|
1017
1044
|
}] });
|
|
1018
1045
|
|
|
1019
1046
|
class TileConfigTriggerComponent {
|
|
@@ -1044,11 +1071,11 @@ class TileConfigTriggerComponent {
|
|
|
1044
1071
|
this.#dialogRef.close();
|
|
1045
1072
|
}
|
|
1046
1073
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: TileConfigTriggerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1047
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.12", type: TileConfigTriggerComponent, isStandalone: true, selector: "yuv-tile-config-trigger", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null }, bucketLabel: { classPropertyName: "bucketLabel", publicName: "bucketLabel", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "tplTileConfig", first: true, predicate: ["tplTileConfig"], descendants: true, isSignal: true }], ngImport: i0, template: "<button mat-icon-button class=\"settings icon\" (click)=\"openTileConfigOverlay()\" [matTooltip]=\"'yuv.tile-config.trigger.tooltip' | translate\">\n <mat-icon>settings</mat-icon>\n</button>\n\n<ng-template #tplTileConfig>\n <yuv-tile-config\n (save)=\"onObjectConfigSave()\"\n (
|
|
1074
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.2.12", type: TileConfigTriggerComponent, isStandalone: true, selector: "yuv-tile-config-trigger", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null }, bucketLabel: { classPropertyName: "bucketLabel", publicName: "bucketLabel", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "tplTileConfig", first: true, predicate: ["tplTileConfig"], descendants: true, isSignal: true }], ngImport: i0, template: "<button mat-icon-button class=\"settings icon\" (click)=\"openTileConfigOverlay()\" [matTooltip]=\"'yuv.tile-config.trigger.tooltip' | translate\">\n <mat-icon>settings</mat-icon>\n</button>\n\n<ng-template #tplTileConfig>\n <yuv-tile-config\n (save)=\"onObjectConfigSave()\"\n (canceled)=\"onObjectConfigCancel()\"\n [bucket]=\"bucket() || undefined\"\n [bucketLabel]=\"bucketLabel()\"\n [configTypes]=\"options()?.configTypes\"\n [configFlavors]=\"options()?.configFlavors || []\"\n ></yuv-tile-config>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TileConfigComponent, selector: "yuv-tile-config", inputs: ["bucket", "bucketLabel", "configTypes", "configFlavors"], outputs: ["save", "canceled"] }, { kind: "ngmodule", type: TranslateModule$1 }, { kind: "pipe", type: i1$2.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
|
|
1048
1075
|
}
|
|
1049
1076
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.12", ngImport: i0, type: TileConfigTriggerComponent, decorators: [{
|
|
1050
1077
|
type: Component,
|
|
1051
|
-
args: [{ selector: 'yuv-tile-config-trigger', standalone: true, imports: [CommonModule, TileConfigComponent, TranslateModule$1, MatButtonModule, MatTooltipModule, MatIcon], template: "<button mat-icon-button class=\"settings icon\" (click)=\"openTileConfigOverlay()\" [matTooltip]=\"'yuv.tile-config.trigger.tooltip' | translate\">\n <mat-icon>settings</mat-icon>\n</button>\n\n<ng-template #tplTileConfig>\n <yuv-tile-config\n (save)=\"onObjectConfigSave()\"\n (
|
|
1078
|
+
args: [{ selector: 'yuv-tile-config-trigger', standalone: true, imports: [CommonModule, TileConfigComponent, TranslateModule$1, MatButtonModule, MatTooltipModule, MatIcon], template: "<button mat-icon-button class=\"settings icon\" (click)=\"openTileConfigOverlay()\" [matTooltip]=\"'yuv.tile-config.trigger.tooltip' | translate\">\n <mat-icon>settings</mat-icon>\n</button>\n\n<ng-template #tplTileConfig>\n <yuv-tile-config\n (save)=\"onObjectConfigSave()\"\n (canceled)=\"onObjectConfigCancel()\"\n [bucket]=\"bucket() || undefined\"\n [bucketLabel]=\"bucketLabel()\"\n [configTypes]=\"options()?.configTypes\"\n [configFlavors]=\"options()?.configFlavors || []\"\n ></yuv-tile-config>\n</ng-template>\n" }]
|
|
1052
1079
|
}] });
|
|
1053
1080
|
|
|
1054
1081
|
class EmailTileExtensionComponent {
|