@yuuvis/client-framework 2.11.2 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/actions/lib/actions.interface.d.ts +1 -1
  2. package/fesm2022/yuuvis-client-framework-actions.mjs +2 -2
  3. package/fesm2022/yuuvis-client-framework-actions.mjs.map +1 -1
  4. package/fesm2022/yuuvis-client-framework-forms.mjs +2 -2
  5. package/fesm2022/yuuvis-client-framework-forms.mjs.map +1 -1
  6. package/fesm2022/yuuvis-client-framework-master-details.mjs +3 -3
  7. package/fesm2022/yuuvis-client-framework-master-details.mjs.map +1 -1
  8. package/fesm2022/yuuvis-client-framework-object-details.mjs +44 -49
  9. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
  10. package/fesm2022/yuuvis-client-framework-object-form.mjs +3 -3
  11. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
  12. package/fesm2022/yuuvis-client-framework-object-relationship.mjs +4 -2
  13. package/fesm2022/yuuvis-client-framework-object-relationship.mjs.map +1 -1
  14. package/fesm2022/yuuvis-client-framework-popout.mjs +59 -28
  15. package/fesm2022/yuuvis-client-framework-popout.mjs.map +1 -1
  16. package/fesm2022/yuuvis-client-framework-split-view.mjs +0 -1
  17. package/fesm2022/yuuvis-client-framework-split-view.mjs.map +1 -1
  18. package/fesm2022/yuuvis-client-framework-tile-list.mjs +71 -34
  19. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  20. package/lib/assets/i18n/de.json +2 -0
  21. package/lib/assets/i18n/en.json +2 -0
  22. package/object-details/lib/object-metadata/object-metadata.component.d.ts +4 -4
  23. package/package.json +4 -4
  24. package/popout/index.d.ts +1 -0
  25. package/popout/lib/popout-trigger/popout-trigger.component.d.ts +13 -0
  26. package/popout/lib/popout.component.d.ts +2 -1
  27. package/popout/lib/popout.interface.d.ts +8 -1
  28. package/popout/lib/popout.module.d.ts +2 -1
  29. package/tile-list/lib/tile-list/tile-list.component.d.ts +1 -0
@@ -10,7 +10,7 @@ import { MatIcon, MatIconModule } from '@angular/material/icon';
10
10
  import { MatMenu, MatMenuItem, MatMenuTrigger } from '@angular/material/menu';
11
11
  import { MatPaginatorModule } from '@angular/material/paginator';
12
12
  import * as i2$1 from '@angular/material/tooltip';
13
- import { MatTooltipModule } from '@angular/material/tooltip';
13
+ import { MatTooltip, MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltipModule } from '@angular/material/tooltip';
14
14
  import { ActionsService } from '@yuuvis/client-framework/actions';
15
15
  import * as i2 from '@yuuvis/client-framework/list';
16
16
  import { YuvListModule } from '@yuuvis/client-framework/list';
@@ -43,10 +43,10 @@ class TileActionsMenuComponent {
43
43
  this.itemSelect.emit(action);
44
44
  }
45
45
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TileActionsMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: TileActionsMenuComponent, isStandalone: true, selector: "yuv-tile-actions-menu", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { itemSelect: "itemSelect" }, viewQueries: [{ propertyName: "matMenu", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
46
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: TileActionsMenuComponent, isStandalone: true, selector: "yuv-tile-actions-menu", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { itemSelect: "itemSelect" }, providers: [{ provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: { position: 'below' } }], viewQueries: [{ propertyName: "matMenu", first: true, predicate: ["menuRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
47
47
  <mat-menu #menuRef>
48
48
  @for (action of actions(); track action.id) {
49
- <button mat-menu-item (click)="itemClicked($event, action)">
49
+ <button mat-menu-item (click)="itemClicked($event, action)" [matTooltip]="action.description" [matTooltipDisabled]="!action.description">
50
50
  @if (action.icon) {
51
51
  <mat-icon>{{ action.icon }}</mat-icon>
52
52
  }
@@ -54,14 +54,14 @@ class TileActionsMenuComponent {
54
54
  </button>
55
55
  }
56
56
  </mat-menu>
57
- `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
57
+ `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
58
58
  }
59
59
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TileActionsMenuComponent, decorators: [{
60
60
  type: Component,
61
- args: [{ selector: 'yuv-tile-actions-menu', imports: [MatMenu, MatIcon, MatMenuItem], template: `
61
+ args: [{ selector: 'yuv-tile-actions-menu', imports: [MatMenu, MatIcon, MatMenuItem, MatTooltip], template: `
62
62
  <mat-menu #menuRef>
63
63
  @for (action of actions(); track action.id) {
64
- <button mat-menu-item (click)="itemClicked($event, action)">
64
+ <button mat-menu-item (click)="itemClicked($event, action)" [matTooltip]="action.description" [matTooltipDisabled]="!action.description">
65
65
  @if (action.icon) {
66
66
  <mat-icon>{{ action.icon }}</mat-icon>
67
67
  }
@@ -69,7 +69,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
69
69
  </button>
70
70
  }
71
71
  </mat-menu>
72
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}\n"] }]
72
+ `, providers: [{ provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: { position: 'below' } }], changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block}\n"] }]
73
73
  }] });
74
74
 
75
75
  class TileExtensionService {
@@ -327,20 +327,21 @@ class TileListComponent {
327
327
  executeAction(t, a, evt) {
328
328
  evt.preventDefault();
329
329
  evt.stopPropagation();
330
+ const selectedIds = this.selection();
331
+ const ids = selectedIds.includes(t.id) ? selectedIds : [t.id];
330
332
  this.#dmsService
331
- .getDmsObject(t.id)
332
- .pipe(switchMap((o) => a.run([o])))
333
+ .getDmsObjects(ids)
334
+ .pipe(switchMap((objects) => a.run(objects)))
333
335
  .subscribe();
334
336
  }
335
337
  selectById(ids) {
336
338
  if (this._busy())
337
339
  this.#preselect.set(ids);
338
340
  else {
339
- const selection = ids.map((id) => this.items().findIndex((i) => i.id === id)).filter((i) => i !== -1);
340
- this.list().multiSelect(selection);
341
+ const indices = ids.map((id) => this.items().findIndex((i) => i.id === id)).filter((i) => i !== -1);
342
+ this.list().multiSelect(indices);
341
343
  this.#elRef.nativeElement.focus();
342
- const tiles = this._selectionToTileData(selection);
343
- this.selectionChange.emit(tiles);
344
+ this.#updateSelectionState(indices);
344
345
  }
345
346
  }
346
347
  multiSelect(index) {
@@ -357,9 +358,30 @@ class TileListComponent {
357
358
  this.queryResult.emit(e);
358
359
  }
359
360
  onListItemsSelect(sel) {
360
- this._selection = sel;
361
- if (sel.length)
361
+ if (sel.length === 1) {
362
362
  this.#internalSelectByIndex(sel[0]);
363
+ return;
364
+ }
365
+ this.#updateSelectionState(sel);
366
+ }
367
+ onDragSelectChange(sel) {
368
+ this.#updateSelectionState(sel);
369
+ }
370
+ /**
371
+ * Shared method to update all selection state and emit outputs.
372
+ * Used by `onListItemsSelect`, `onDragSelectChange`, and `selectById`.
373
+ */
374
+ #updateSelectionState(sel) {
375
+ const sorted = [...sel].sort();
376
+ // skip if selection hasn't changed
377
+ if (this.#isSelectionEqual(sorted))
378
+ return;
379
+ this._selection = sorted;
380
+ this._lastSelection = this._selection.length ? this._selection[this._selection.length - 1] : undefined;
381
+ const tiles = this._selectionToTileData(this._selection);
382
+ this.selection.set(tiles.map((t) => t.id));
383
+ this.selectionChange.emit(tiles);
384
+ this.selectedTile.set(tiles);
363
385
  }
364
386
  refresh() {
365
387
  this.list().refresh();
@@ -372,6 +394,7 @@ class TileListComponent {
372
394
  .map((a) => this.#actionService.getActionById(a.id, this.options()?.actionContext))
373
395
  .filter((a) => a !== undefined)
374
396
  }));
397
+ this.items.set([...items, ...this.items()]);
375
398
  this.list().dropItems(items);
376
399
  }
377
400
  applyFlavor(flavor) {
@@ -417,6 +440,9 @@ class TileListComponent {
417
440
  if (this._selection.length) {
418
441
  this.list().clear(silent);
419
442
  this._selection = [];
443
+ this._lastSelection = undefined;
444
+ this.selection.set([]);
445
+ this.selectedTile.set([]);
420
446
  if (!silent)
421
447
  this.selectionChange.emit([]);
422
448
  }
@@ -426,9 +452,9 @@ class TileListComponent {
426
452
  * it wraps around to the first item. Does nothing if no item is currently selected.
427
453
  */
428
454
  selectNext() {
429
- if (this._lastSelection) {
455
+ if (this._lastSelection !== undefined) {
430
456
  let i = this._lastSelection + 1;
431
- if (i > this.items.length)
457
+ if (i >= this.items().length)
432
458
  i = 0;
433
459
  this.#select(i);
434
460
  }
@@ -438,24 +464,25 @@ class TileListComponent {
438
464
  * it wraps around to the last item. Does nothing if no item is currently selected.
439
465
  */
440
466
  selectPrev() {
441
- if (this._lastSelection) {
467
+ if (this._lastSelection !== undefined) {
442
468
  let i = this._lastSelection - 1;
443
469
  if (i < 0)
444
- i = this.items.length - 1;
445
- this.#select(this._lastSelection - 1);
470
+ i = this.items().length - 1;
471
+ this.#select(i);
446
472
  }
447
473
  }
448
474
  #select(index, shiftKey = false, ctrlKey = false) {
449
475
  this.#elRef.nativeElement.focus();
476
+ let newSelection;
450
477
  if (index === -1) {
451
- this._selection = [];
478
+ newSelection = [];
452
479
  }
453
480
  else {
454
481
  if (this.multiselect()) {
455
- this._selection = this._selection.filter((i) => i !== index);
482
+ newSelection = this._selection.filter((i) => i !== index);
456
483
  if (ctrlKey) {
457
484
  // if ctrl key add to selection
458
- this._selection.push(index);
485
+ newSelection.push(index);
459
486
  }
460
487
  else if (shiftKey) {
461
488
  // add range
@@ -463,28 +490,38 @@ class TileListComponent {
463
490
  const startIndex = this._lastSelection < index ? this._lastSelection : index;
464
491
  const endIndex = this._lastSelection > index ? this._lastSelection : index;
465
492
  for (let i = startIndex; i <= endIndex; i++) {
466
- this._selection.push(i);
493
+ newSelection.push(i);
467
494
  }
468
495
  }
469
496
  else {
470
- this._selection = [index];
497
+ newSelection = [index];
471
498
  }
472
499
  }
473
500
  else {
474
- this._selection = [index];
501
+ newSelection = [index];
475
502
  }
476
503
  }
477
- else
478
- this._selection = [index];
479
- this._selection = [...new Set(this._selection)];
504
+ else {
505
+ newSelection = [index];
506
+ }
507
+ newSelection = [...new Set(newSelection)];
480
508
  }
509
+ newSelection.sort();
510
+ // skip if selection hasn't changed
511
+ if (this.#isSelectionEqual(newSelection))
512
+ return;
513
+ this._selection = newSelection;
481
514
  this._lastSelection = this._selection.length === 0 ? undefined : index;
482
- this._selection.sort();
483
- // this.listItems().forEach((item: ListItemDirective, i: number) => item.selectedInput.set(this._selection.includes(i)));
484
515
  const tiles = this._selectionToTileData(this._selection);
516
+ this.selection.set(tiles.map((t) => t.id));
485
517
  this.selectionChange.emit(tiles);
486
518
  tiles.length === 1 && this.itemSelect.emit(tiles[0]);
487
- this.selectedTile.set(this._selection.map((idx) => this.items()[idx]));
519
+ this.selectedTile.set(tiles);
520
+ }
521
+ #isSelectionEqual(newSelection) {
522
+ if (newSelection.length !== this._selection.length)
523
+ return false;
524
+ return newSelection.every((v, i) => v === this._selection[i]);
488
525
  }
489
526
  _selectionToTileData(selection) {
490
527
  return selection.map((idx) => this.items()[idx]);
@@ -575,7 +612,7 @@ class TileListComponent {
575
612
  });
576
613
  }
577
614
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TileListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
578
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: TileListComponent, isStandalone: true, selector: "yuv-tile-list", inputs: { bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: true, isRequired: false, transformFunction: null }, dense: { classPropertyName: "dense", publicName: "dense", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, flavor: { classPropertyName: "flavor", publicName: "flavor", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, preselect: { classPropertyName: "preselect", publicName: "preselect", isSignal: true, isRequired: false, transformFunction: null }, highlights: { classPropertyName: "highlights", publicName: "highlights", isSignal: true, isRequired: false, transformFunction: null }, preventChangeUntil: { classPropertyName: "preventChangeUntil", publicName: "preventChangeUntil", isSignal: true, isRequired: false, transformFunction: null }, autoSelect: { classPropertyName: "autoSelect", publicName: "autoSelect", isSignal: true, isRequired: false, transformFunction: null }, disableCustomContextMenu: { classPropertyName: "disableCustomContextMenu", publicName: "disableCustomContextMenu", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelect: "itemSelect", tileCopy: "tileCopy", tileCut: "tileCut", busy: "busy", queryResult: "queryResult", selectionChange: "selectionChange", itemDblClick: "itemDblClick", ctxMenu: "ctxMenu" }, host: { listeners: { "keydown.control.c": "onCopy($event)", "keydown.control.x": "onCut($event)" }, properties: { "class.dense": "dense()" } }, providers: [], queries: [{ propertyName: "menuComponent", first: true, predicate: TileActionsMenuComponent, descendants: true, isSignal: true }, { propertyName: "emptyContent", first: true, predicate: ["empty"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }, { propertyName: "menuTriggers", predicate: MatMenuTrigger, descendants: true, isSignal: true }], ngImport: i0, template: "<yuv-query-list\n #list\n [query]=\"query()\"\n [transformer]=\"transformer\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [autoSelect]=\"autoSelect()\"\n [pageSize]=\"pageSize()\"\n [multiselect]=\"multiselect()\"\n (itemDoubleClick)=\"onItemDoubleClick($event)\"\n (itemSelect)=\"onListItemsSelect($event)\"\n (queryResult)=\"onQueryResult($event)\"\n>\n\n <ng-template #yuvQueryListItem let-item let-index=\"index\">\n <yuv-list-tile\n [class.dense]=\"dense()\"\n (contextmenu)=\"contextMenuHandler($event, index)\"\n >\n <ng-template #iconSlot><ng-container *yuvRenderer=\"item.icon\"></ng-container></ng-template>\n <ng-template #titleSlot><ng-container *yuvRenderer=\"item.title\"></ng-container></ng-template>\n <ng-template #descriptionSlot><ng-container *yuvRenderer=\"item.description\"></ng-container></ng-template>\n <ng-template #metaSlot><ng-container *yuvRenderer=\"item.meta\"></ng-container></ng-template>\n <ng-template #asideSlot><ng-container *yuvRenderer=\"item.aside\"></ng-container></ng-template>\n <ng-template #actionsSlot>\n @for (a of item.actions; track a.id) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matTooltip]=\"a.label\" (click)=\"executeAction(item, a, $event)\">\n <mat-icon inert=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n\n @if (menu()) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matTooltip]=\"'yuv.tile-list.item.actions-menu.button.tooltip' | translate\" [matMenuTriggerFor]=\"menu()\">\n <mat-icon inert=\"true\">more_vert</mat-icon>\n </button>\n }\n <ng-content select=\"yuv-tile-actions-menu, [yuv-tile-actions-menu]\"></ng-content>\n </ng-template>\n <ng-template #extensionSlot> <ng-container *yuvTileExtension=\"{ typeId: item.objectTypeId, data: item.instanceData }\"></ng-container> </ng-template>\n <ng-template #badgesSlot>{{ item.badges }}</ng-template>\n </yuv-list-tile>\n </ng-template>\n\n <ng-template #yuvQueryListEmpty>\n <div class=\"empyt-list\">\n @if (searchExecuted && emptyContent()) {\n <ng-content></ng-content>\n }\n </div>\n </ng-template>\n <div class=\"offset\" (click)=\"clearSelection()\"></div>\n</yuv-query-list>\n", styles: [":host{--paging-background: var(--ymt-surface);display:flex;flex-direction:column}:host yuv-query-list{flex:1;overflow-y:auto;display:flex;flex-flow:column;height:100%}:host yuv-query-list .offset{flex:1 1 auto}:host .empyt-list{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: YuvListModule }, { kind: "component", type: i2.ListTileComponent, selector: "yuv-list-tile" }, { kind: "ngmodule", type: YuvQueryListModule }, { kind: "component", type: i3.QueryListComponent, selector: "yuv-query-list", inputs: ["query", "idProperty", "transformer", "preventChangeUntil", "autoSelect", "pageSize", "enableDragSelect", "multiselect", "selfHandleSelection"], outputs: ["itemSelect", "dragSelectChange", "itemDoubleClick", "queryResult"] }, { kind: "directive", type: RendererDirective, selector: "[yuvRenderer]", inputs: ["yuvRenderer"] }, { kind: "directive", type: TileExtensionDirective, selector: "[yuvTileExtension]", inputs: ["yuvTileExtension"] }, { kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }] }); }
615
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.15", type: TileListComponent, isStandalone: true, selector: "yuv-tile-list", inputs: { bucket: { classPropertyName: "bucket", publicName: "bucket", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, multiselect: { classPropertyName: "multiselect", publicName: "multiselect", isSignal: true, isRequired: false, transformFunction: null }, dense: { classPropertyName: "dense", publicName: "dense", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, flavor: { classPropertyName: "flavor", publicName: "flavor", isSignal: true, isRequired: false, transformFunction: null }, query: { classPropertyName: "query", publicName: "query", isSignal: true, isRequired: false, transformFunction: null }, preselect: { classPropertyName: "preselect", publicName: "preselect", isSignal: true, isRequired: false, transformFunction: null }, highlights: { classPropertyName: "highlights", publicName: "highlights", isSignal: true, isRequired: false, transformFunction: null }, preventChangeUntil: { classPropertyName: "preventChangeUntil", publicName: "preventChangeUntil", isSignal: true, isRequired: false, transformFunction: null }, autoSelect: { classPropertyName: "autoSelect", publicName: "autoSelect", isSignal: true, isRequired: false, transformFunction: null }, disableCustomContextMenu: { classPropertyName: "disableCustomContextMenu", publicName: "disableCustomContextMenu", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { itemSelect: "itemSelect", tileCopy: "tileCopy", tileCut: "tileCut", busy: "busy", queryResult: "queryResult", selectionChange: "selectionChange", itemDblClick: "itemDblClick", ctxMenu: "ctxMenu" }, host: { listeners: { "keydown.control.c": "onCopy($event)", "keydown.control.x": "onCut($event)" }, properties: { "class.dense": "dense()" } }, providers: [], queries: [{ propertyName: "menuComponent", first: true, predicate: TileActionsMenuComponent, descendants: true, isSignal: true }, { propertyName: "emptyContent", first: true, predicate: ["empty"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "list", first: true, predicate: ["list"], descendants: true, isSignal: true }, { propertyName: "menuTriggers", predicate: MatMenuTrigger, descendants: true, isSignal: true }], ngImport: i0, template: "<yuv-query-list\n #list\n [query]=\"query()\"\n [transformer]=\"transformer\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [autoSelect]=\"autoSelect()\"\n [pageSize]=\"pageSize()\"\n [multiselect]=\"multiselect()\"\n (itemDoubleClick)=\"onItemDoubleClick($event)\"\n (itemSelect)=\"onListItemsSelect($event)\"\n (queryResult)=\"onQueryResult($event)\"\n (dragSelectChange)=\"onDragSelectChange($event)\"\n>\n\n <ng-template #yuvQueryListItem let-item let-index=\"index\">\n <yuv-list-tile\n [class.dense]=\"dense()\"\n (contextmenu)=\"contextMenuHandler($event, index)\"\n >\n <ng-template #iconSlot><ng-container *yuvRenderer=\"item.icon\"></ng-container></ng-template>\n <ng-template #titleSlot><ng-container *yuvRenderer=\"item.title\"></ng-container></ng-template>\n <ng-template #descriptionSlot><ng-container *yuvRenderer=\"item.description\"></ng-container></ng-template>\n <ng-template #metaSlot><ng-container *yuvRenderer=\"item.meta\"></ng-container></ng-template>\n <ng-template #asideSlot><ng-container *yuvRenderer=\"item.aside\"></ng-container></ng-template>\n <ng-template #actionsSlot>\n @for (a of item.actions; track a.id) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matTooltip]=\"a.label\" (click)=\"executeAction(item, a, $event)\">\n <mat-icon inert=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n\n @if (menu()) {\n <button ymt-icon-button [icon-button-size]=\"'small'\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n [matTooltip]=\"'yuv.tile-list.item.actions-menu.button.tooltip' | translate\" [matMenuTriggerFor]=\"menu()\">\n <mat-icon inert=\"true\">more_vert</mat-icon>\n </button>\n }\n <ng-content select=\"yuv-tile-actions-menu, [yuv-tile-actions-menu]\"></ng-content>\n </ng-template>\n <ng-template #extensionSlot> <ng-container *yuvTileExtension=\"{ typeId: item.objectTypeId, data: item.instanceData }\"></ng-container> </ng-template>\n <ng-template #badgesSlot>{{ item.badges }}</ng-template>\n </yuv-list-tile>\n </ng-template>\n\n <ng-template #yuvQueryListEmpty>\n <div class=\"empyt-list\">\n @if (searchExecuted && emptyContent()) {\n <ng-content></ng-content>\n }\n </div>\n </ng-template>\n <div class=\"offset\" (click)=\"clearSelection()\"></div>\n</yuv-query-list>\n", styles: [":host{--paging-background: var(--ymt-surface);display:flex;flex-direction:column}:host yuv-query-list{flex:1;overflow-y:auto;display:flex;flex-flow:column;height:100%}:host yuv-query-list .offset{flex:1 1 auto}:host .empyt-list{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: YuvListModule }, { kind: "component", type: i2.ListTileComponent, selector: "yuv-list-tile" }, { kind: "ngmodule", type: YuvQueryListModule }, { kind: "component", type: i3.QueryListComponent, selector: "yuv-query-list", inputs: ["query", "idProperty", "transformer", "preventChangeUntil", "autoSelect", "pageSize", "enableDragSelect", "multiselect", "selfHandleSelection"], outputs: ["itemSelect", "dragSelectChange", "itemDoubleClick", "queryResult"] }, { kind: "directive", type: RendererDirective, selector: "[yuvRenderer]", inputs: ["yuvRenderer"] }, { kind: "directive", type: TileExtensionDirective, selector: "[yuvTileExtension]", inputs: ["yuvTileExtension"] }, { kind: "directive", type: YmtIconButtonDirective, selector: "button[ymtIconButton],button[ymt-icon-button],a[ymtIconButton],a[ymt-icon-button]", inputs: ["disabled", "disableRipple", "aria-disabled", "disabledInteractive", "icon-button-size"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }] }); }
579
616
  }
580
617
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImport: i0, type: TileListComponent, decorators: [{
581
618
  type: Component,
@@ -591,7 +628,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.15", ngImpo
591
628
  ...MATERIAL_IMPORTS
592
629
  ], host: {
593
630
  '[class.dense]': 'dense()'
594
- }, template: "<yuv-query-list\n #list\n [query]=\"query()\"\n [transformer]=\"transformer\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [autoSelect]=\"autoSelect()\"\n [pageSize]=\"pageSize()\"\n [multiselect]=\"multiselect()\"\n (itemDoubleClick)=\"onItemDoubleClick($event)\"\n (itemSelect)=\"onListItemsSelect($event)\"\n (queryResult)=\"onQueryResult($event)\"\n>\n\n <ng-template #yuvQueryListItem let-item let-index=\"index\">\n <yuv-list-tile\n [class.dense]=\"dense()\"\n (contextmenu)=\"contextMenuHandler($event, index)\"\n >\n <ng-template #iconSlot><ng-container *yuvRenderer=\"item.icon\"></ng-container></ng-template>\n <ng-template #titleSlot><ng-container *yuvRenderer=\"item.title\"></ng-container></ng-template>\n <ng-template #descriptionSlot><ng-container *yuvRenderer=\"item.description\"></ng-container></ng-template>\n <ng-template #metaSlot><ng-container *yuvRenderer=\"item.meta\"></ng-container></ng-template>\n <ng-template #asideSlot><ng-container *yuvRenderer=\"item.aside\"></ng-container></ng-template>\n <ng-template #actionsSlot>\n @for (a of item.actions; track a.id) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matTooltip]=\"a.label\" (click)=\"executeAction(item, a, $event)\">\n <mat-icon inert=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n\n @if (menu()) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matTooltip]=\"'yuv.tile-list.item.actions-menu.button.tooltip' | translate\" [matMenuTriggerFor]=\"menu()\">\n <mat-icon inert=\"true\">more_vert</mat-icon>\n </button>\n }\n <ng-content select=\"yuv-tile-actions-menu, [yuv-tile-actions-menu]\"></ng-content>\n </ng-template>\n <ng-template #extensionSlot> <ng-container *yuvTileExtension=\"{ typeId: item.objectTypeId, data: item.instanceData }\"></ng-container> </ng-template>\n <ng-template #badgesSlot>{{ item.badges }}</ng-template>\n </yuv-list-tile>\n </ng-template>\n\n <ng-template #yuvQueryListEmpty>\n <div class=\"empyt-list\">\n @if (searchExecuted && emptyContent()) {\n <ng-content></ng-content>\n }\n </div>\n </ng-template>\n <div class=\"offset\" (click)=\"clearSelection()\"></div>\n</yuv-query-list>\n", styles: [":host{--paging-background: var(--ymt-surface);display:flex;flex-direction:column}:host yuv-query-list{flex:1;overflow-y:auto;display:flex;flex-flow:column;height:100%}:host yuv-query-list .offset{flex:1 1 auto}:host .empyt-list{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}\n"] }]
631
+ }, template: "<yuv-query-list\n #list\n [query]=\"query()\"\n [transformer]=\"transformer\"\n [preventChangeUntil]=\"preventChangeUntil()\"\n [autoSelect]=\"autoSelect()\"\n [pageSize]=\"pageSize()\"\n [multiselect]=\"multiselect()\"\n (itemDoubleClick)=\"onItemDoubleClick($event)\"\n (itemSelect)=\"onListItemsSelect($event)\"\n (queryResult)=\"onQueryResult($event)\"\n (dragSelectChange)=\"onDragSelectChange($event)\"\n>\n\n <ng-template #yuvQueryListItem let-item let-index=\"index\">\n <yuv-list-tile\n [class.dense]=\"dense()\"\n (contextmenu)=\"contextMenuHandler($event, index)\"\n >\n <ng-template #iconSlot><ng-container *yuvRenderer=\"item.icon\"></ng-container></ng-template>\n <ng-template #titleSlot><ng-container *yuvRenderer=\"item.title\"></ng-container></ng-template>\n <ng-template #descriptionSlot><ng-container *yuvRenderer=\"item.description\"></ng-container></ng-template>\n <ng-template #metaSlot><ng-container *yuvRenderer=\"item.meta\"></ng-container></ng-template>\n <ng-template #asideSlot><ng-container *yuvRenderer=\"item.aside\"></ng-container></ng-template>\n <ng-template #actionsSlot>\n @for (a of item.actions; track a.id) {\n <button ymt-icon-button [icon-button-size]=\"'small'\" [matTooltip]=\"a.label\" (click)=\"executeAction(item, a, $event)\">\n <mat-icon inert=\"true\">{{ a.icon }}</mat-icon>\n </button>\n }\n\n @if (menu()) {\n <button ymt-icon-button [icon-button-size]=\"'small'\"\n (click)=\"$event.stopPropagation(); $event.preventDefault()\"\n [matTooltip]=\"'yuv.tile-list.item.actions-menu.button.tooltip' | translate\" [matMenuTriggerFor]=\"menu()\">\n <mat-icon inert=\"true\">more_vert</mat-icon>\n </button>\n }\n <ng-content select=\"yuv-tile-actions-menu, [yuv-tile-actions-menu]\"></ng-content>\n </ng-template>\n <ng-template #extensionSlot> <ng-container *yuvTileExtension=\"{ typeId: item.objectTypeId, data: item.instanceData }\"></ng-container> </ng-template>\n <ng-template #badgesSlot>{{ item.badges }}</ng-template>\n </yuv-list-tile>\n </ng-template>\n\n <ng-template #yuvQueryListEmpty>\n <div class=\"empyt-list\">\n @if (searchExecuted && emptyContent()) {\n <ng-content></ng-content>\n }\n </div>\n </ng-template>\n <div class=\"offset\" (click)=\"clearSelection()\"></div>\n</yuv-query-list>\n", styles: [":host{--paging-background: var(--ymt-surface);display:flex;flex-direction:column}:host yuv-query-list{flex:1;overflow-y:auto;display:flex;flex-flow:column;height:100%}:host yuv-query-list .offset{flex:1 1 auto}:host .empyt-list{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}\n"] }]
595
632
  }], propDecorators: { onCopy: [{
596
633
  type: HostListener,
597
634
  args: ['keydown.control.c', ['$event']]