@verisoft/ui-govcz 21.0.1 → 21.0.2

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.
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, Pipe, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, EventEmitter, Output, Input, inject, Optional, Self, input, SimpleChange, Injectable, ChangeDetectorRef, Injector, ViewContainerRef, ViewChild, ViewEncapsulation, HostListener, NO_ERRORS_SCHEMA, output, ContentChild, ContentChildren, NgModule, Inject, effect, Directive, forwardRef, InjectionToken } from '@angular/core';
2
+ import { Component, Pipe, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, EventEmitter, Output, Input, inject, Optional, Self, input, SimpleChange, Injectable, ChangeDetectorRef, Injector, ViewContainerRef, ViewChild, HostListener, ViewEncapsulation, NO_ERRORS_SCHEMA, output, ContentChild, ContentChildren, NgModule, Inject, signal, Directive, forwardRef, InjectionToken } from '@angular/core';
3
3
  import * as i1 from '@angular/router';
4
- import { RouterModule, Router, RouterOutlet, RouterLink, RouterLinkActive, ActivatedRoute } from '@angular/router';
4
+ import { RouterModule, Router, ActivatedRoute, NavigationEnd, RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';
5
5
  import * as i2 from '@gov-design-system-ce/angular';
6
6
  import { GovDesignSystemModule } from '@gov-design-system-ce/angular';
7
7
  import * as i1$3 from '@verisoft/ui-core';
8
- import { BreadcrumbCoreComponent, BREADCRUMB_COMPONENT_TOKEN, ControlSeverity, GovControlSeverity, FieldSize, IconsComponent, IconPosition, GovButtonType, BUTTON_COMPONENT_TOKEN, SlotPosition, BaseFormInputComponent, FieldType, CALENDAR_COMPONENT_TOKEN, CHECKBOX_COMPONENT_TOKEN, UnsubscribeComponent, CONFIRM_DIALOG_COMPONENT_TOKEN, TEXTFIELD_COMPONENT_TOKEN, DROPDOWN_COMPONENT_TOKEN, DROPDOWN_BUTTON_COMPONENT_TOKEN, FORM_FIELD_COMPONENT_TOKEN, SideMenuService, HEADER_COMPONENT_TOKEN, INPUT_GROUP_COMPONENT_TOKEN, LOADER_COMPONENT_TOKEN, MULTISELECT_COMPONENT_TOKEN, NUMBER_INPUT_COMPONENT_TOKEN, PasswordStrength, PASSWORD_COMPONENT_TOKEN, RADIOBUTTON_COMPONENT_TOKEN, SECTION_COMPONENT_TOKEN, ACTION_BUTTON_GROUP_COMPONENT_TOKEN, queryListChanged, GenericFieldType, DatasourceDirective, GENERIC_FIELD_COMPONENT_TOKEN, SIDE_MENU_COMPONENT_TOKEN, MENU_TOKEN, SideMenuProviderService, SNACKBAR_COMPONENT_TOKEN, LayoutType, STEPPER_COMPONENT_TOKEN, SWITCH_COMPONENT_TOKEN, MAX_COLUMN_CHAR_COUNT, TableService, DEFAULT_PAGINATION, ColumnModel, RowModel, TableSelectionMode, TABLE_COLUMN_PROVIDER, TABLE_COMPONENT_TOKEN, TAG_COMPONENT_TOKEN, TEXTAREA_COMPONENT_TOKEN, DEFAULT_DEBOUNCE_TIME, ScreenSizeService, DialogService, isFilterEmpty, ButtonShortCutDirective, FILTER_COMPONENT_TOKEN, downloadFile, TableDatasourceDirective, TableFilterDirective, TableColumnDirective } from '@verisoft/ui-core';
8
+ import { BreadcrumbCoreComponent, BREADCRUMB_COMPONENT_TOKEN, ControlSeverity, GovControlSeverity, FieldSize, IconsComponent, IconPosition, GovButtonType, BUTTON_COMPONENT_TOKEN, SlotPosition, BaseFormInputComponent, FieldType, CALENDAR_COMPONENT_TOKEN, CHECKBOX_COMPONENT_TOKEN, UnsubscribeComponent, DialogService, CONFIRM_DIALOG_COMPONENT_TOKEN, TEXTFIELD_COMPONENT_TOKEN, DROPDOWN_COMPONENT_TOKEN, DROPDOWN_BUTTON_COMPONENT_TOKEN, FORM_FIELD_COMPONENT_TOKEN, SideMenuService, HEADER_COMPONENT_TOKEN, INPUT_GROUP_COMPONENT_TOKEN, LOADER_COMPONENT_TOKEN, MULTISELECT_COMPONENT_TOKEN, NUMBER_INPUT_COMPONENT_TOKEN, PasswordStrength, PASSWORD_COMPONENT_TOKEN, RADIOBUTTON_COMPONENT_TOKEN, SECTION_COMPONENT_TOKEN, ACTION_BUTTON_GROUP_COMPONENT_TOKEN, queryListChanged, GenericFieldType, DatasourceDirective, GENERIC_FIELD_COMPONENT_TOKEN, SIDE_MENU_COMPONENT_TOKEN, MENU_TOKEN, SideMenuProviderService, SNACKBAR_COMPONENT_TOKEN, LayoutType, STEPPER_COMPONENT_TOKEN, SWITCH_COMPONENT_TOKEN, MAX_COLUMN_CHAR_COUNT, TableService, DEFAULT_PAGINATION, ColumnModel, RowModel, TableSelectionMode, TABLE_COLUMN_PROVIDER, TABLE_COMPONENT_TOKEN, TAG_COMPONENT_TOKEN, TEXTAREA_COMPONENT_TOKEN, DEFAULT_DEBOUNCE_TIME, ScreenSizeService, isFilterEmpty, ButtonShortCutDirective, FILTER_COMPONENT_TOKEN, downloadFile, TableDatasourceDirective, TableFilterDirective, TableColumnDirective } from '@verisoft/ui-core';
9
9
  import * as i3 from '@ngx-translate/core';
10
10
  import { TranslateModule, TranslatePipe } from '@ngx-translate/core';
11
11
  import * as i1$2 from '@angular/forms';
@@ -57,6 +57,10 @@ const Icons = {
57
57
  check: 'check-lg',
58
58
  envelope: 'envelope',
59
59
  loader: 'loader',
60
+ map: 'map-empty',
61
+ file: 'file',
62
+ folder: 'folder',
63
+ arrowCounterclockwise: 'arrow-counterclockwise'
60
64
  };
61
65
 
62
66
  class BreadcrumbComponent extends BreadcrumbCoreComponent {
@@ -631,13 +635,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
631
635
  }] } });
632
636
 
633
637
  class ConfirmDialogComponent extends UnsubscribeComponent {
634
- dialogService;
635
- cdr;
636
- constructor(dialogService, cdr) {
637
- super();
638
- this.dialogService = dialogService;
639
- this.cdr = cdr;
640
- }
638
+ dialogService = inject(DialogService);
639
+ cdr = inject(ChangeDetectorRef);
641
640
  visible = false;
642
641
  closable = false;
643
642
  data = { severity: 'primary', headerIcon: 'info-circle' };
@@ -657,39 +656,46 @@ class ConfirmDialogComponent extends UnsubscribeComponent {
657
656
  this.cdr.detectChanges();
658
657
  });
659
658
  }
659
+ onKeyDown(event) {
660
+ if (!this.visible)
661
+ return;
662
+ if (event.key === 'Enter' || event.key === ' ') {
663
+ event.preventDefault();
664
+ this.dialogClick(true);
665
+ }
666
+ if (event.key === 'Escape') {
667
+ event.preventDefault();
668
+ this.dialogClick(false);
669
+ }
670
+ }
660
671
  dialogClick(confirm) {
661
672
  const { confirmButtonFn, cancelButtonFn } = this.data;
662
673
  if (confirm && confirmButtonFn) {
663
674
  confirmButtonFn();
664
675
  }
665
- if (!confirm && cancelButtonFn) {
676
+ else if (!confirm && cancelButtonFn) {
666
677
  cancelButtonFn();
667
678
  }
668
679
  this.visible = false;
669
680
  this.cdr.detectChanges();
670
681
  }
671
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ConfirmDialogComponent, deps: [{ token: i1$3.DialogService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
672
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: ConfirmDialogComponent, isStandalone: true, selector: "v-confirm-dialog", providers: [
673
- {
674
- provide: CONFIRM_DIALOG_COMPONENT_TOKEN,
675
- useExisting: ConfirmDialogComponent,
676
- },
682
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ConfirmDialogComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
683
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: ConfirmDialogComponent, isStandalone: true, selector: "v-confirm-dialog", host: { listeners: { "document:keydown": "onKeyDown($event)" }, properties: { "attr.tabindex": "visible ? \"0\" : null" } }, providers: [
684
+ { provide: CONFIRM_DIALOG_COMPONENT_TOKEN, useExisting: ConfirmDialogComponent },
677
685
  ], usesInheritance: true, ngImport: i0, template: "<gov-dialog\n [open]=\"visible\"\n [attr.block-close]=\"data.closable !== undefined ? !data.closable : false\"\n [attr.block-backdrop-close]=\"data.closable !== undefined ? !data.closable : false\" \n [style.--dialog-max-width]=\"data.width\"\n [style.--dialog-max-height]=\"data.height\"\n role=\"dialog\"\n accessible-close-label=\"Close dialog box with more information\"\n (gov-close)=\"data.cancelButtonFn ? dialogClick(false) : (visible = false)\"\n>\n <gov-icon\n type=\"components\"\n [name]=\"data.headerIcon\"\n slot=\"icon\"\n [color]=\"data.severity | govColor\"\n />\n \n <h2 slot=\"title\">{{ data.title ?? 'Title' }}</h2>\n\n @if (data && data.innerHTML) {\n <div [innerHTML]=\"data.innerHTML\"></div>\n } @else if (data.componentType) {\n <v-dynamic-component\n [componentType]=\"data.componentType\"\n [data]=\"$any(data.data)\"\n ></v-dynamic-component>\n }\n\n <gov-button\n color=\"primary\"\n size=\"m\"\n type=\"solid\"\n slot=\"footer\"\n (gov-click)=\"data.confirmButtonFn ? dialogClick(true) : (visible = false)\"\n >\n {{ data.confirmButtonText ?? 'Yes'}}\n </gov-button>\n \n <gov-button\n [ngClass]=\"!data.showCancelButton ? 'd-none' : ''\"\n color=\"primary\"\n size=\"m\"\n type=\"outlined\"\n slot=\"footer\"\n [disabled]=\"!data.showCancelButton\"\n (gov-click)=\"data.cancelButtonFn ? dialogClick(false) : (visible = false)\"\n >\n {{ data.cancelButtonText ?? 'No' }}\n </gov-button>\n</gov-dialog>\n", styles: [":host ::ng-deep dialog{max-width:var(--dialog-max-width, 95%);max-height:var(--dialog-max-height, 95%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: GovDesignSystemModule }, { kind: "component", type: i2.GovButton, selector: "gov-button", inputs: ["color", "disabled", "download", "expanded", "expandedMobile", "focusable", "href", "hreflang", "identifier", "loading", "name", "nativeType", "referrerpolicy", "rel", "size", "target", "type"] }, { kind: "component", type: i2.GovDialog, selector: "gov-dialog", inputs: ["accessibleCloseLabel", "accessibleCloseLabelledBy", "accessibleDescribedBy", "accessibleLabelledBy", "blockBackdropClose", "blockClose", "labelTag", "open", "role"] }, { kind: "component", type: i2.GovIcon, selector: "gov-icon", inputs: ["color", "name", "size", "type"] }, { kind: "component", type: DynamicComponent, selector: "v-dynamic-component", inputs: ["componentType", "data"] }, { kind: "pipe", type: GovColorPipe, name: "govColor" }] });
678
686
  }
679
687
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: ConfirmDialogComponent, decorators: [{
680
688
  type: Component,
681
- args: [{ selector: 'v-confirm-dialog', imports: [
682
- CommonModule,
683
- GovDesignSystemModule,
684
- GovColorPipe,
685
- DynamicComponent,
686
- ], providers: [
687
- {
688
- provide: CONFIRM_DIALOG_COMPONENT_TOKEN,
689
- useExisting: ConfirmDialogComponent,
690
- },
691
- ], template: "<gov-dialog\n [open]=\"visible\"\n [attr.block-close]=\"data.closable !== undefined ? !data.closable : false\"\n [attr.block-backdrop-close]=\"data.closable !== undefined ? !data.closable : false\" \n [style.--dialog-max-width]=\"data.width\"\n [style.--dialog-max-height]=\"data.height\"\n role=\"dialog\"\n accessible-close-label=\"Close dialog box with more information\"\n (gov-close)=\"data.cancelButtonFn ? dialogClick(false) : (visible = false)\"\n>\n <gov-icon\n type=\"components\"\n [name]=\"data.headerIcon\"\n slot=\"icon\"\n [color]=\"data.severity | govColor\"\n />\n \n <h2 slot=\"title\">{{ data.title ?? 'Title' }}</h2>\n\n @if (data && data.innerHTML) {\n <div [innerHTML]=\"data.innerHTML\"></div>\n } @else if (data.componentType) {\n <v-dynamic-component\n [componentType]=\"data.componentType\"\n [data]=\"$any(data.data)\"\n ></v-dynamic-component>\n }\n\n <gov-button\n color=\"primary\"\n size=\"m\"\n type=\"solid\"\n slot=\"footer\"\n (gov-click)=\"data.confirmButtonFn ? dialogClick(true) : (visible = false)\"\n >\n {{ data.confirmButtonText ?? 'Yes'}}\n </gov-button>\n \n <gov-button\n [ngClass]=\"!data.showCancelButton ? 'd-none' : ''\"\n color=\"primary\"\n size=\"m\"\n type=\"outlined\"\n slot=\"footer\"\n [disabled]=\"!data.showCancelButton\"\n (gov-click)=\"data.cancelButtonFn ? dialogClick(false) : (visible = false)\"\n >\n {{ data.cancelButtonText ?? 'No' }}\n </gov-button>\n</gov-dialog>\n", styles: [":host ::ng-deep dialog{max-width:var(--dialog-max-width, 95%);max-height:var(--dialog-max-height, 95%)}\n"] }]
692
- }], ctorParameters: () => [{ type: i1$3.DialogService }, { type: i0.ChangeDetectorRef }] });
689
+ args: [{ selector: 'v-confirm-dialog', imports: [CommonModule, GovDesignSystemModule, GovColorPipe, DynamicComponent], providers: [
690
+ { provide: CONFIRM_DIALOG_COMPONENT_TOKEN, useExisting: ConfirmDialogComponent },
691
+ ], host: {
692
+ '(document:keydown)': 'onKeyDown($event)',
693
+ '[attr.tabindex]': 'visible ? "0" : null',
694
+ }, template: "<gov-dialog\n [open]=\"visible\"\n [attr.block-close]=\"data.closable !== undefined ? !data.closable : false\"\n [attr.block-backdrop-close]=\"data.closable !== undefined ? !data.closable : false\" \n [style.--dialog-max-width]=\"data.width\"\n [style.--dialog-max-height]=\"data.height\"\n role=\"dialog\"\n accessible-close-label=\"Close dialog box with more information\"\n (gov-close)=\"data.cancelButtonFn ? dialogClick(false) : (visible = false)\"\n>\n <gov-icon\n type=\"components\"\n [name]=\"data.headerIcon\"\n slot=\"icon\"\n [color]=\"data.severity | govColor\"\n />\n \n <h2 slot=\"title\">{{ data.title ?? 'Title' }}</h2>\n\n @if (data && data.innerHTML) {\n <div [innerHTML]=\"data.innerHTML\"></div>\n } @else if (data.componentType) {\n <v-dynamic-component\n [componentType]=\"data.componentType\"\n [data]=\"$any(data.data)\"\n ></v-dynamic-component>\n }\n\n <gov-button\n color=\"primary\"\n size=\"m\"\n type=\"solid\"\n slot=\"footer\"\n (gov-click)=\"data.confirmButtonFn ? dialogClick(true) : (visible = false)\"\n >\n {{ data.confirmButtonText ?? 'Yes'}}\n </gov-button>\n \n <gov-button\n [ngClass]=\"!data.showCancelButton ? 'd-none' : ''\"\n color=\"primary\"\n size=\"m\"\n type=\"outlined\"\n slot=\"footer\"\n [disabled]=\"!data.showCancelButton\"\n (gov-click)=\"data.cancelButtonFn ? dialogClick(false) : (visible = false)\"\n >\n {{ data.cancelButtonText ?? 'No' }}\n </gov-button>\n</gov-dialog>\n", styles: [":host ::ng-deep dialog{max-width:var(--dialog-max-width, 95%);max-height:var(--dialog-max-height, 95%)}\n"] }]
695
+ }], propDecorators: { onKeyDown: [{
696
+ type: HostListener,
697
+ args: ['document:keydown', ['$event']]
698
+ }] } });
693
699
 
694
700
  class TooltipComponent {
695
701
  color = input(undefined, ...(ngDevMode ? [{ debugName: "color" }] : []));
@@ -2442,87 +2448,95 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
2442
2448
  }] } });
2443
2449
 
2444
2450
  class TabViewItemComponent {
2445
- id;
2446
- index;
2447
- disabled = false;
2448
2451
  title;
2449
- content;
2452
+ disabled = false;
2450
2453
  url;
2451
2454
  contentTemplate;
2452
2455
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabViewItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2453
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: TabViewItemComponent, isStandalone: true, selector: "v-tab-view-item", inputs: { id: "id", index: "index", disabled: "disabled", title: "title", content: "content", url: "url" }, viewQueries: [{ propertyName: "contentTemplate", first: true, predicate: ["contentTemplate"], descendants: true, static: true }], ngImport: i0, template: `<ng-template #contentTemplate>
2454
- <ng-content></ng-content>
2455
- </ng-template>`, isInline: true });
2456
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.6", type: TabViewItemComponent, isStandalone: true, selector: "v-tab-view-item", inputs: { title: "title", disabled: "disabled", url: "url" }, viewQueries: [{ propertyName: "contentTemplate", first: true, predicate: ["content"], descendants: true, static: true }], ngImport: i0, template: `
2457
+ <ng-template #content>
2458
+ <ng-content></ng-content>
2459
+ </ng-template>
2460
+ `, isInline: true });
2456
2461
  }
2457
2462
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabViewItemComponent, decorators: [{
2458
2463
  type: Component,
2459
2464
  args: [{
2460
2465
  selector: 'v-tab-view-item',
2461
- template: `<ng-template #contentTemplate>
2462
- <ng-content></ng-content>
2463
- </ng-template>`
2466
+ standalone: true,
2467
+ template: `
2468
+ <ng-template #content>
2469
+ <ng-content></ng-content>
2470
+ </ng-template>
2471
+ `,
2464
2472
  }]
2465
- }], propDecorators: { id: [{
2466
- type: Input
2467
- }], index: [{
2473
+ }], propDecorators: { title: [{
2468
2474
  type: Input
2469
2475
  }], disabled: [{
2470
2476
  type: Input
2471
- }], title: [{
2472
- type: Input
2473
- }], content: [{
2474
- type: Input
2475
2477
  }], url: [{
2476
2478
  type: Input
2477
2479
  }], contentTemplate: [{
2478
2480
  type: ViewChild,
2479
- args: ['contentTemplate', { static: true }]
2481
+ args: ['content', { static: true }]
2480
2482
  }] } });
2481
2483
 
2482
2484
  class TabViewComponent {
2483
- tabs;
2484
- highlight = false;
2485
- useRouting = false;
2485
+ projectedTabs;
2486
+ _mode = signal('content', ...(ngDevMode ? [{ debugName: "_mode" }] : []));
2486
2487
  items = [];
2487
- activeIndex = 0;
2488
+ set mode(value) {
2489
+ this._mode.set(value ?? 'content');
2490
+ }
2491
+ modeSig = this._mode.asReadonly();
2492
+ _activeIndex = signal(0, ...(ngDevMode ? [{ debugName: "_activeIndex" }] : []));
2493
+ set activeIndex(value) {
2494
+ this._activeIndex.set(value ?? 0);
2495
+ }
2496
+ activeIndexSig = this._activeIndex.asReadonly();
2488
2497
  activeIndexChange = new EventEmitter();
2489
- cd = inject(ChangeDetectorRef);
2490
- ngAfterContentInit() {
2491
- this.initTabs();
2498
+ tabs = signal([], ...(ngDevMode ? [{ debugName: "tabs" }] : []));
2499
+ route = inject(ActivatedRoute);
2500
+ router = inject(Router);
2501
+ constructor() {
2502
+ this.router.events.subscribe(event => {
2503
+ if (event instanceof NavigationEnd) {
2504
+ const idx = this.tabs().findIndex(tab => this.router.isActive(tab.url ?? '', false));
2505
+ if (idx >= 0)
2506
+ this._activeIndex.set(idx);
2507
+ }
2508
+ });
2492
2509
  }
2493
- initTabs() {
2494
- this.items = [...this.tabs.toArray(), ...this.items];
2495
- this.cd.detectChanges();
2510
+ ngAfterContentInit() {
2511
+ this.tabs.set(this.projectedTabs.toArray());
2496
2512
  }
2497
- changeTabIndex(index) {
2498
- if (this.activeIndex !== index) {
2499
- this.activeIndex = index;
2500
- this.activeIndexChange.emit(this.activeIndex);
2513
+ selectTab(index) {
2514
+ if (this.modeSig() === 'content' && this._activeIndex() !== index) {
2515
+ this._activeIndex.set(index);
2501
2516
  }
2502
- this.activeIndexChange.emit(index);
2503
- this.cd.detectChanges();
2504
2517
  }
2505
- setTabActive(options) {
2506
- options.forEach((_, index) => {
2507
- index === this.activeIndex;
2508
- });
2509
- this.cd.detectChanges();
2518
+ get relativeRoute() {
2519
+ return this.route;
2510
2520
  }
2511
2521
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2512
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TabViewComponent, isStandalone: true, selector: "v-tab-view", inputs: { highlight: "highlight", useRouting: "useRouting", items: "items", activeIndex: "activeIndex" }, outputs: { activeIndexChange: "activeIndexChange" }, queries: [{ propertyName: "tabs", predicate: TabViewItemComponent }], ngImport: i0, template: "<div class=\"gov-tabs\">\n <div class=\"gov-tabs__tabs\" role=\"tablist\">\n @for (item of items; track item; let index = $index) {\n @if (useRouting) {\n <button\n [attr.index]=\"index\"\n class=\"gov-tabs__btn\"\n [routerLink]=\"item.url\"\n [routerLinkActive]=\"'active'\"\n #rls=\"routerLinkActive\"\n [attr.aria-selected]=\"rls.isActive\"\n [disabled]=\"item.disabled\"\n role=\"tab\"\n [attr.activeIndex]=\"activeIndex\"\n (click)=\"changeTabIndex(index)\"\n >\n {{ item.title | translate }}\n </button>\n } @else {\n <button\n [attr.index]=\"index\"\n class=\"gov-tabs__btn\"\n [attr.aria-selected]=\"activeIndex === index\"\n [disabled]=\"item.disabled\"\n role=\"tab\"\n [attr.activeIndex]=\"activeIndex\"\n (click)=\"changeTabIndex(index)\"\n >\n {{ item.title | translate }}\n </button>}\n }\n </div>\n <div class=\"gov-tabs__tabs\">\n @for (item of items; track item; let index = $index) {\n <div class=\"gov-tabs__tab\" [class.active]=\"activeIndex === index\" >\n <div class=\"gov-tabs__list\">\n <div class=\"gov-tabs__content\">\n @if (item.contentTemplate) {\n <ng-container *ngTemplateOutlet=\"item.contentTemplate\"></ng-container>\n } @else if (item.content) {\n {{ item.content }}\n }\n </div>\n </div>\n </div>\n }\n @if (useRouting) {\n <router-outlet class=\"gov-tabs__content\"></router-outlet>\n }\n </div>\n</div>", styles: [".gov-tabs__tabs{position:relative;width:100%;margin-bottom:0%;overflow-x:clip}.gov-tabs__tab{display:none;opacity:0;transform:translateY(10px);transition:opacity .3s ease,transform .3s ease}.gov-tabs__tab.active{display:block;opacity:1;transform:translateY(0)}.gov-tabs__btn{font-size:medium;padding:10px 20px;border:none;border-bottom:2px solid transparent;font-weight:700}.gov-tabs__btn[aria-selected=true]:after{display:block;width:100%;height:2px;background-color:var(--border-primary);position:absolute;bottom:-2px;left:0}.gov-tabs__content{margin-top:var(--spacing-m-nudge);flex-wrap:wrap;width:100%}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None });
2522
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TabViewComponent, isStandalone: true, selector: "v-tab-view", inputs: { items: "items", mode: "mode", activeIndex: "activeIndex" }, outputs: { activeIndexChange: "activeIndexChange" }, queries: [{ propertyName: "projectedTabs", predicate: TabViewItemComponent }], ngImport: i0, template: "<div class=\"gov-tabs\">\n <div class=\"gov-tabs__tabs\" role=\"tablist\">\n @for (tab of tabs(); track tab; let i = $index) {\n <button\n class=\"gov-tabs__btn\"\n role=\"tab\"\n [disabled]=\"tab.disabled\"\n [routerLink]=\"modeSig() === 'router' ? tab.url : null\"\n [relativeTo]=\"modeSig() === 'router' ? relativeRoute : null\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n #rla=\"routerLinkActive\"\n [attr.aria-selected]=\"\n modeSig() === 'router'\n ? rla.isActive\n : activeIndexSig() === i\n \"\n (click)=\"modeSig() === 'content' && selectTab(i)\"\n >\n {{ tab.title | translate }}\n </button>\n\n }\n </div>\n <div class=\"gov-tabs__tabs\">\n @if (modeSig() === 'content') {\n <div class=\"gov-tabs__content\">\n @for (tab of tabs(); track tab; let i = $index) {\n <div class=\"gov-tabs__tab\" [class.active]=\"activeIndexSig() === i\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n </div>\n }\n </div>\n }\n\n @if (modeSig() === 'router') {\n <router-outlet></router-outlet>\n }\n </div>\n</div>\n", styles: [".gov-tabs__tabs{position:relative;width:100%;margin-bottom:0%;overflow-x:clip}.gov-tabs__tab{display:none;opacity:0;transform:translateY(10px);transition:opacity .3s ease,transform .3s ease}.gov-tabs__tab.active{display:block;opacity:1;transform:translateY(0)}.gov-tabs__btn{font-size:medium;padding:10px 20px;border:none;border-bottom:2px solid transparent;font-weight:700}.gov-tabs__btn[aria-selected=true]:after{display:block;width:100%;height:2px;background-color:var(--border-primary);position:absolute;bottom:-2px;left:0}.gov-tabs__content{margin-top:var(--spacing-m-nudge);flex-wrap:wrap;width:100%}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2513
2523
  }
2514
2524
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TabViewComponent, decorators: [{
2515
2525
  type: Component,
2516
- args: [{ selector: 'v-tab-view', imports: [NgTemplateOutlet, RouterOutlet, RouterLink, RouterLinkActive, TranslatePipe], encapsulation: ViewEncapsulation.None, template: "<div class=\"gov-tabs\">\n <div class=\"gov-tabs__tabs\" role=\"tablist\">\n @for (item of items; track item; let index = $index) {\n @if (useRouting) {\n <button\n [attr.index]=\"index\"\n class=\"gov-tabs__btn\"\n [routerLink]=\"item.url\"\n [routerLinkActive]=\"'active'\"\n #rls=\"routerLinkActive\"\n [attr.aria-selected]=\"rls.isActive\"\n [disabled]=\"item.disabled\"\n role=\"tab\"\n [attr.activeIndex]=\"activeIndex\"\n (click)=\"changeTabIndex(index)\"\n >\n {{ item.title | translate }}\n </button>\n } @else {\n <button\n [attr.index]=\"index\"\n class=\"gov-tabs__btn\"\n [attr.aria-selected]=\"activeIndex === index\"\n [disabled]=\"item.disabled\"\n role=\"tab\"\n [attr.activeIndex]=\"activeIndex\"\n (click)=\"changeTabIndex(index)\"\n >\n {{ item.title | translate }}\n </button>}\n }\n </div>\n <div class=\"gov-tabs__tabs\">\n @for (item of items; track item; let index = $index) {\n <div class=\"gov-tabs__tab\" [class.active]=\"activeIndex === index\" >\n <div class=\"gov-tabs__list\">\n <div class=\"gov-tabs__content\">\n @if (item.contentTemplate) {\n <ng-container *ngTemplateOutlet=\"item.contentTemplate\"></ng-container>\n } @else if (item.content) {\n {{ item.content }}\n }\n </div>\n </div>\n </div>\n }\n @if (useRouting) {\n <router-outlet class=\"gov-tabs__content\"></router-outlet>\n }\n </div>\n</div>", styles: [".gov-tabs__tabs{position:relative;width:100%;margin-bottom:0%;overflow-x:clip}.gov-tabs__tab{display:none;opacity:0;transform:translateY(10px);transition:opacity .3s ease,transform .3s ease}.gov-tabs__tab.active{display:block;opacity:1;transform:translateY(0)}.gov-tabs__btn{font-size:medium;padding:10px 20px;border:none;border-bottom:2px solid transparent;font-weight:700}.gov-tabs__btn[aria-selected=true]:after{display:block;width:100%;height:2px;background-color:var(--border-primary);position:absolute;bottom:-2px;left:0}.gov-tabs__content{margin-top:var(--spacing-m-nudge);flex-wrap:wrap;width:100%}\n"] }]
2517
- }], propDecorators: { tabs: [{
2526
+ args: [{ selector: 'v-tab-view', standalone: true, imports: [
2527
+ NgTemplateOutlet,
2528
+ RouterLink,
2529
+ RouterLinkActive,
2530
+ RouterOutlet,
2531
+ TranslatePipe,
2532
+ ], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"gov-tabs\">\n <div class=\"gov-tabs__tabs\" role=\"tablist\">\n @for (tab of tabs(); track tab; let i = $index) {\n <button\n class=\"gov-tabs__btn\"\n role=\"tab\"\n [disabled]=\"tab.disabled\"\n [routerLink]=\"modeSig() === 'router' ? tab.url : null\"\n [relativeTo]=\"modeSig() === 'router' ? relativeRoute : null\"\n routerLinkActive=\"active\"\n [routerLinkActiveOptions]=\"{ exact: true }\"\n #rla=\"routerLinkActive\"\n [attr.aria-selected]=\"\n modeSig() === 'router'\n ? rla.isActive\n : activeIndexSig() === i\n \"\n (click)=\"modeSig() === 'content' && selectTab(i)\"\n >\n {{ tab.title | translate }}\n </button>\n\n }\n </div>\n <div class=\"gov-tabs__tabs\">\n @if (modeSig() === 'content') {\n <div class=\"gov-tabs__content\">\n @for (tab of tabs(); track tab; let i = $index) {\n <div class=\"gov-tabs__tab\" [class.active]=\"activeIndexSig() === i\">\n <ng-container *ngTemplateOutlet=\"tab.contentTemplate\"></ng-container>\n </div>\n }\n </div>\n }\n\n @if (modeSig() === 'router') {\n <router-outlet></router-outlet>\n }\n </div>\n</div>\n", styles: [".gov-tabs__tabs{position:relative;width:100%;margin-bottom:0%;overflow-x:clip}.gov-tabs__tab{display:none;opacity:0;transform:translateY(10px);transition:opacity .3s ease,transform .3s ease}.gov-tabs__tab.active{display:block;opacity:1;transform:translateY(0)}.gov-tabs__btn{font-size:medium;padding:10px 20px;border:none;border-bottom:2px solid transparent;font-weight:700}.gov-tabs__btn[aria-selected=true]:after{display:block;width:100%;height:2px;background-color:var(--border-primary);position:absolute;bottom:-2px;left:0}.gov-tabs__content{margin-top:var(--spacing-m-nudge);flex-wrap:wrap;width:100%}\n"] }]
2533
+ }], ctorParameters: () => [], propDecorators: { projectedTabs: [{
2518
2534
  type: ContentChildren,
2519
2535
  args: [TabViewItemComponent]
2520
- }], highlight: [{
2521
- type: Input
2522
- }], useRouting: [{
2523
- type: Input
2524
2536
  }], items: [{
2525
2537
  type: Input
2538
+ }], mode: [{
2539
+ type: Input
2526
2540
  }], activeIndex: [{
2527
2541
  type: Input
2528
2542
  }], activeIndexChange: [{
@@ -2611,6 +2625,7 @@ class TableComponent {
2611
2625
  download = new EventEmitter();
2612
2626
  delete = new EventEmitter();
2613
2627
  save = new EventEmitter();
2628
+ tableRef;
2614
2629
  cdRef = inject(ChangeDetectorRef);
2615
2630
  router = inject(Router);
2616
2631
  route = inject(ActivatedRoute);
@@ -2621,6 +2636,11 @@ class TableComponent {
2621
2636
  pageSizeOptions = DEFAULT_PAGINATION.map((x) => ({ value: x.toString() }));
2622
2637
  allSelected = false;
2623
2638
  icons = Icons;
2639
+ focusedIndex = -1;
2640
+ isMouseDown = false;
2641
+ dragActive = false;
2642
+ dragStartIndex = -1;
2643
+ initialSelectionSet = new Set();
2624
2644
  get govPageSize() {
2625
2645
  return this.pageSize.toString();
2626
2646
  }
@@ -2640,11 +2660,6 @@ class TableComponent {
2640
2660
  get selectedCount() {
2641
2661
  return this.selected.length;
2642
2662
  }
2643
- constructor() {
2644
- effect(() => {
2645
- this.reactToSignals();
2646
- });
2647
- }
2648
2663
  ngOnChanges(changes) {
2649
2664
  if (changes['data']) {
2650
2665
  this.updateRowModels();
@@ -2667,18 +2682,21 @@ class TableComponent {
2667
2682
  this.updateColumnModels();
2668
2683
  this.cdRef.detectChanges();
2669
2684
  }
2685
+ this.tableRef.nativeElement.tabIndex = 0;
2686
+ this.tableRef.nativeElement.addEventListener('keydown', this.handleKeydown.bind(this));
2687
+ }
2688
+ ngOnDestroy() {
2689
+ this.tableRef.nativeElement.removeEventListener('keydown', this.handleKeydown.bind(this));
2670
2690
  }
2671
2691
  sortColumn(column) {
2672
2692
  if (column.sortable) {
2673
2693
  column.sortDirection = getNextSortDirection(column.sortDirection, this.sortMultiple);
2674
2694
  if (!this.sortMultiple) {
2675
2695
  this.tableColumns
2676
- .filter((x) => x !== column)
2677
- .forEach((x) => {
2678
- x.sortDirection = undefined;
2679
- });
2696
+ .filter(x => x !== column)
2697
+ .forEach(x => (x.sortDirection = undefined));
2680
2698
  }
2681
- const sorts = this.getSorts().map((x) => ({
2699
+ const sorts = this.getSorts().map(x => ({
2682
2700
  field: 'row.' + x.field,
2683
2701
  direction: x.direction,
2684
2702
  }));
@@ -2699,14 +2717,14 @@ class TableComponent {
2699
2717
  this.currentPage = 1;
2700
2718
  this.fireLazyLoad();
2701
2719
  }
2702
- selectRow(row, event) {
2720
+ performClickSelect(row, event) {
2703
2721
  if (event.ctrlKey || event.metaKey) {
2704
2722
  this.navigate(row, event);
2705
2723
  return;
2706
2724
  }
2707
2725
  if (this.selectionMode === 'single') {
2708
2726
  row.selected = !row.selected;
2709
- this.tableRows.forEach((x) => (x !== row ? (x.selected = false) : null));
2727
+ this.tableRows.forEach(x => (x !== row ? (x.selected = false) : null));
2710
2728
  this.fireSelectionChange();
2711
2729
  }
2712
2730
  else if (this.selectionMode === 'multiple') {
@@ -2714,10 +2732,67 @@ class TableComponent {
2714
2732
  this.fireSelectionChange();
2715
2733
  }
2716
2734
  }
2717
- navigate(row, event) {
2718
- if (this.disableCustomClicks) {
2735
+ onRowMouseDown(row, index, event) {
2736
+ if (event.button === 1) {
2737
+ this.navigateNewWindow(row, event);
2719
2738
  return;
2720
2739
  }
2740
+ if (this.selectionMode !== 'multiple') {
2741
+ return;
2742
+ }
2743
+ this.isMouseDown = true;
2744
+ this.dragActive = false;
2745
+ this.dragStartIndex = index;
2746
+ this.initialSelectionSet = new Set(this.tableRows.filter(r => r.selected).map(r => r.row));
2747
+ }
2748
+ onRowMouseEnter(index) {
2749
+ this.setFocusedIndex(index);
2750
+ if (this.isMouseDown && this.selectionMode === 'multiple') {
2751
+ this.dragActive = true;
2752
+ this.updateDragSelection(index);
2753
+ }
2754
+ }
2755
+ onRowMouseUp(row, index, event) {
2756
+ if (this.dragActive && this.selectionMode === 'multiple') {
2757
+ this.updateDragSelection(index);
2758
+ this.stopDrag();
2759
+ return;
2760
+ }
2761
+ if (!this.isMouseDown) {
2762
+ return;
2763
+ }
2764
+ if (!this.dragActive) {
2765
+ this.performClickSelect(row, event);
2766
+ }
2767
+ this.stopDrag();
2768
+ }
2769
+ updateDragSelection(endIndex) {
2770
+ const min = Math.min(this.dragStartIndex, endIndex);
2771
+ const max = Math.max(this.dragStartIndex, endIndex);
2772
+ this.tableRows.forEach((r, i) => {
2773
+ if (this.initialSelectionSet.has(r.row)) {
2774
+ r.selected = true;
2775
+ }
2776
+ else if (i >= min && i <= max) {
2777
+ r.selected = true;
2778
+ }
2779
+ else {
2780
+ r.selected = this.initialSelectionSet.has(r.row);
2781
+ }
2782
+ });
2783
+ this.fireSelectionChange();
2784
+ this.allSelected = this.tableRows.every(r => r.selected);
2785
+ this.cdRef.markForCheck();
2786
+ }
2787
+ stopDrag() {
2788
+ this.isMouseDown = false;
2789
+ this.dragActive = false;
2790
+ this.dragStartIndex = -1;
2791
+ this.initialSelectionSet = new Set();
2792
+ }
2793
+ navigate(row, event) {
2794
+ if (this.disableCustomClicks)
2795
+ return;
2721
2796
  event.preventDefault();
2722
2797
  const targetUrl = this.createUrl(row);
2723
2798
  if (event.ctrlKey || event.metaKey) {
@@ -2730,16 +2805,15 @@ class TableComponent {
2730
2805
  }
2731
2806
  }
2732
2807
  navigateNewWindow(row, event) {
2733
- if (this.disableCustomClicks || event.button !== 1) {
2808
+ if (this.disableCustomClicks || event.button !== 1)
2734
2809
  return;
2735
- }
2736
2810
  event.preventDefault();
2737
2811
  const targetUrl = this.createUrl(row);
2738
2812
  window.open(this.router.serializeUrl(this.router.createUrlTree([targetUrl], { relativeTo: this.route })), '_blank');
2739
2813
  }
2740
2814
  toggleAll(event) {
2741
2815
  this.allSelected = event.detail.checked;
2742
- this.tableRows.forEach((x) => (x.selected = this.allSelected));
2816
+ this.tableRows.forEach(x => (x.selected = this.allSelected));
2743
2817
  this.fireSelectionChange();
2744
2818
  }
2745
2819
  toggleDetail(row) {
@@ -2748,7 +2822,7 @@ class TableComponent {
2748
2822
  }
2749
2823
  selectRowCheckbox(row, event) {
2750
2824
  row.selected = event.detail.checked;
2751
- this.allSelected = this.tableRows.every((x) => x.selected);
2825
+ this.allSelected = this.tableRows.every(x => x.selected);
2752
2826
  this.fireSelectionChange();
2753
2827
  }
2754
2828
  truncate(text) {
@@ -2758,49 +2832,101 @@ class TableComponent {
2758
2832
  }
2759
2833
  deselectAll() {
2760
2834
  this.allSelected = false;
2761
- this.tableRows.forEach(x => (x.selected = this.allSelected));
2835
+ this.tableRows.forEach(x => (x.selected = false));
2836
+ this.fireSelectionChange();
2762
2837
  }
2763
- createUrl(row) {
2764
- if (row.customRoute) {
2765
- return row.customRoute;
2838
+ setFocusedIndex(index) {
2839
+ this.focusedIndex = index;
2840
+ this.cdRef.markForCheck();
2841
+ }
2842
+ handleKeydown(event) {
2843
+ const rows = this.tableRowView;
2844
+ if (rows.length === 0)
2845
+ return;
2846
+ if (event.key === ' ' || event.code === 'Space') {
2847
+ if (this.focusedIndex >= 0 && this.selectionMode) {
2848
+ this.toggleSelection(rows[this.focusedIndex]);
2849
+ }
2850
+ event.preventDefault();
2851
+ return;
2852
+ }
2853
+ let newIndex = this.focusedIndex;
2854
+ switch (event.key) {
2855
+ case 'ArrowDown':
2856
+ newIndex = Math.min(newIndex + 1, rows.length - 1);
2857
+ break;
2858
+ case 'ArrowUp':
2859
+ newIndex = Math.max(newIndex - 1, 0);
2860
+ break;
2861
+ case 'PageDown':
2862
+ newIndex = Math.min(newIndex + 5, rows.length - 1);
2863
+ break;
2864
+ case 'PageUp':
2865
+ newIndex = Math.max(newIndex - 5, 0);
2866
+ break;
2867
+ case 'Home':
2868
+ newIndex = 0;
2869
+ break;
2870
+ case 'End':
2871
+ newIndex = rows.length - 1;
2872
+ break;
2873
+ default:
2874
+ return;
2875
+ }
2876
+ if (newIndex !== this.focusedIndex) {
2877
+ this.focusedIndex = newIndex;
2878
+ this.scrollRowIntoView(newIndex);
2879
+ event.preventDefault();
2880
+ this.cdRef.markForCheck();
2766
2881
  }
2767
- return row.id.toString();
2882
+ }
2883
+ toggleSelection(row) {
2884
+ if (this.selectionMode === 'single') {
2885
+ const shouldSelect = !row.selected;
2886
+ this.tableRows.forEach(r => (r.selected = r === row && shouldSelect));
2887
+ }
2888
+ else if (this.selectionMode === 'multiple') {
2889
+ row.selected = !row.selected;
2890
+ }
2891
+ this.fireSelectionChange();
2892
+ this.allSelected = this.tableRows.every(r => r.selected);
2893
+ }
2894
+ scrollRowIntoView(index) {
2895
+ const rowEl = this.tableRef.nativeElement.querySelectorAll('tbody tr.v-table__row')[index];
2896
+ if (rowEl) {
2897
+ rowEl.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
2898
+ }
2899
+ }
2900
+ createUrl(row) {
2901
+ return row.customRoute ?? row.id.toString();
2768
2902
  }
2769
2903
  reactToSignals() {
2770
2904
  const reload = this.service.reload();
2771
- if (typeof reload === 'symbol') {
2772
- this.fireLazyLoad();
2773
- }
2774
- else if (reload.name === this.tableName) {
2905
+ if (typeof reload === 'symbol' || reload.name === this.tableName) {
2775
2906
  this.fireLazyLoad();
2776
2907
  }
2777
2908
  this.deselectAll();
2778
2909
  }
2779
2910
  updateColumnModels() {
2780
- const viewColumns = this.viewColumns
2781
- ?.toArray()
2782
- .map((x) => x.getDefinition());
2783
- this.tableColumns = [...(this._columns ?? []), ...(viewColumns ?? [])].map((x) => new ColumnModel(x));
2911
+ const viewColumns = this.viewColumns?.toArray().map(x => x.getDefinition());
2912
+ this.tableColumns = [...(this._columns ?? []), ...(viewColumns ?? [])].map(x => new ColumnModel(x));
2784
2913
  }
2785
2914
  updateRowModels() {
2786
- this.tableRows = (this.data ?? []).map((x) => new RowModel(x, false, false, undefined, undefined, undefined, this.customRoute, this.entityKey));
2915
+ this.tableRows = (this.data ?? []).map(x => new RowModel(x, false, false, undefined, undefined, undefined, this.customRoute, this.entityKey));
2916
+ this.focusedIndex = -1;
2787
2917
  }
2788
2918
  fireSelectionChange() {
2789
- const selectedRows = this.tableRows
2790
- .filter((x) => x.selected)
2791
- .map((x) => x.row);
2919
+ const selectedRows = this.tableRows.filter(x => x.selected).map(x => x.row);
2792
2920
  this.selectionChange.emit(selectedRows);
2793
2921
  }
2794
2922
  selectSelected() {
2795
2923
  if (this.selection?.length && this.selectionMode) {
2796
- const selection = this.selectionMode === TableSelectionMode.single
2797
- ? [this.selection[0]]
2798
- : this.selection;
2924
+ const selection = this.selectionMode === TableSelectionMode.single ? [this.selection[0]] : this.selection;
2799
2925
  const selectionSet = new Set(selection);
2800
- this.tableRows.forEach((item) => {
2926
+ this.tableRows.forEach(item => {
2801
2927
  item.selected = selectionSet.has(item.row);
2802
2928
  });
2803
- this.allSelected = this.tableRows.every((x) => x.selected);
2929
+ this.allSelected = this.tableRows.every(x => x.selected);
2804
2930
  }
2805
2931
  }
2806
2932
  fireLazyLoad() {
@@ -2817,23 +2943,32 @@ class TableComponent {
2817
2943
  }
2818
2944
  getSorts() {
2819
2945
  return this.tableColumns
2820
- .filter((x) => x.sortable && x.sortDirection)
2821
- .map((x) => ({
2946
+ .filter(x => x.sortable && x.sortDirection)
2947
+ .map(x => ({
2822
2948
  field: x.id,
2823
2949
  direction: x.sortDirection,
2824
2950
  }));
2825
2951
  }
2952
+ getQueryParams(column, row) {
2953
+ if (column.queryParams) {
2954
+ if (typeof column.queryParams === 'function') {
2955
+ return column.queryParams(row);
2956
+ }
2957
+ return column.queryParams;
2958
+ }
2959
+ return null;
2960
+ }
2826
2961
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2827
2962
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.6", type: TableComponent, isStandalone: true, selector: "v-table", inputs: { sorters: "sorters", data: "data", total: "total", filter: "filter", extraFilter: "extraFilter", loading: "loading", scrollable: "scrollable", pageSize: "pageSize", currentPage: "currentPage", showPaginator: "showPaginator", userTableWrapper: "userTableWrapper", sortMultiple: "sortMultiple", lazy: "lazy", selectionMode: "selectionMode", selection: "selection", showPageSizePicker: "showPageSizePicker", entityKey: "entityKey", customRoute: "customRoute", disableCustomClicks: "disableCustomClicks", tableName: "tableName", size: "size", showActionButtons: "showActionButtons", maximumColumnLength: "maximumColumnLength", columns: "columns" }, outputs: { selectionChange: "selectionChange", lazyLoad: "lazyLoad", download: "download", delete: "delete", save: "save" }, providers: [
2828
2963
  {
2829
2964
  provide: TABLE_COMPONENT_TOKEN,
2830
2965
  useExisting: TableComponent,
2831
2966
  },
2832
- ], queries: [{ propertyName: "rowDetailTemplate", first: true, predicate: ["rowDetail"], descendants: true }, { propertyName: "rowDetailButtonTemplate", first: true, predicate: ["rowDetailButton"], descendants: true }, { propertyName: "viewColumns", predicate: TABLE_COLUMN_PROVIDER }], usesOnChanges: true, ngImport: i0, template: "@if (selectionMode === 'multiple' && showActionButtons) {\n<gov-flex\n class=\"gov-table-complex__actions mt-2\"\n justify-content=\"space-between\"\n align-items=\"center\"\n>\n <div class=\"gov-table-complex__records-selected\">\n {{ selectedCount }} {{ ('TABLES.CHOSEN_RECORDS' | translate) ?? 'chosen records'}}\n </div>\n <div>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"delete.emit(selected)\">\n {{ ('BUTTONS.DELETE' | translate) ?? 'Delete'}}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"save.emit(selected)\">\n {{ ('BUTTONS.SAVE' | translate) ?? 'Save'}}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"download.emit(selected)\">\n {{ ('BUTTONS.DOWNLOAD' | translate) ?? 'Download'}}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"deselectAll()\">\n {{ ('BUTTONS.CANCEL' | translate) ?? 'Cancel'}}\n </gov-button>\n </div>\n</gov-flex>\n}\n\n<div\n class=\" v-table gov-table\"\n [attr.size]=\"size | govSize\"\n>\n <table class=\"v-table__table\">\n <thead class=\"v-table__head\">\n <tr class=\"v-table__header\">\n @if (this.rowDetailTemplate) {\n <th></th>\n } @if (selectionMode === 'multiple') {\n <th scope=\"col\">\n <gov-form-checkbox\n [checked]=\"allSelected\"\n (gov-change)=\"toggleAll($event)\"\n />\n </th>\n }\n @for (column of tableColumns; track column; let index = $index) {\n @if (column.visible && column.forceVisibility !== 'hidden') {\n <th\n scope=\"col\"\n [style]=\"{'text-align': column.textAlign}\"\n [class]=\"column.columnClass\"\n >\n <span\n class=\"gov-table--fit-width\"\n [class.v-table__sortable]=\"column.sortable\"\n [class.v-table__sortable--desc]=\"column.sortable && column.sortDirection === 'desc'\"\n [class.v-table__sortable--asc]=\"column.sortable && column.sortDirection === 'asc'\"\n (click)=\"sortColumn(column)\"\n >\n {{ column.headerGetter(column.id, index) | translate }}\n </span>\n </th>\n } @if (this.rowDetailButtonTemplate) {\n <th></th>\n }}\n </tr>\n </thead>\n @if (loading) {\n <v-loader />\n } @else {\n <tbody class=\"v-table__body\">\n @for (data of tableRowView; track data.id; let rowIndex = $index) {\n <tr\n class=\"v-table__row\"\n [class.gov-table--highlight]=\"data.selected && selectionMode\"\n (click)=\"selectRow(data, $event)\"\n (dblclick)=\"navigate(data, $event)\"\n (mousedown)=\"navigateNewWindow(data, $event)\"\n >\n @if (this.rowDetailTemplate) {\n <td>\n <gov-button\n [size]=\"size | govSize\"\n color=\"primary\"\n type=\"solid\"\n (gov-click)=\"toggleDetail(data)\"\n >\n <gov-icon\n [name]=\"data.expanded ? 'chevron-up' : 'chevron-down'\"\n [size]=\"size | govSize\"\n slot=\"icon-start\"\n ></gov-icon>\n </gov-button>\n </td>\n } @if (selectionMode === 'multiple') {\n <td class=\"gov-table--fit-content gov-table--border-right\">\n <gov-form-checkbox\n no-label\n [checked]=\"data.selected\"\n [size]=\"size | govSize\"\n (gov-change)=\"selectRowCheckbox(data, $event)\"\n />\n </td>\n }\n @for (column of tableColumns; track column; let columnIndex = $index) {\n @if (column.visible && column.forceVisibility !== 'hidden') {\n <td\n [style]=\"{'text-align': column.textAlign}\"\n [class]=\"column.columnClass!\"\n [class.v-auto-cell]=\"column.template\"\n >\n @if (column.template) {\n <ng-container\n *ngTemplateOutlet=\"\n column.template;\n context: { $implicit: data.row }\n \"\n ></ng-container>\n } @else {\n <span\n [queryParams]=\"column.queryParams ? column.queryParams : undefined\"\n [routerLink]=\"column.routerLink ? column.routerLink(data.row) : undefined\"\n [innerHTML]=\"truncate(column.valueGetter(data.row, rowIndex))\"\n [attr.title]=\"\n column.valueGetter(data.row, rowIndex).length > maximumColumnLength\n ? column.valueGetter(data.row, rowIndex)\n : null\n \"\n ></span>\n }\n </td>\n @if (this.rowDetailButtonTemplate) {\n <td scope=\"\">\n <ng-container\n *ngTemplateOutlet=\"\n this.rowDetailButtonTemplate;\n context: { $implicit: data.row }\n \"\n ></ng-container>\n </td>\n }}}\n </tr>\n @if (this.rowDetailTemplate && data.expanded) {\n <tr>\n <td [attr.colspan]=\"tableColumns.length + 1\">\n <ng-container\n class=\"w-100\"\n *ngTemplateOutlet=\"\n this.rowDetailTemplate;\n context: { $implicit: data.row }\n \"\n ></ng-container>\n </td>\n </tr>\n } } @if (!tableRows.length && !loading){\n <td [attr.colspan]=\"tableColumns.length\">\n <gov-empty align=\"center\" [size]=\"size | govSize\">\n <gov-icon slot=\"icon\" name=\"empty-file\" type=\"colored\"/>\n <p slot=\"headline\">\n {{ ('TABLES.EMPTY' | translate) ?? 'No records were found!' }}\n </p>\n </gov-empty>\n </td>\n }\n </tbody>\n }\n </table>\n @if(showPaginator) {\n <div class=\"v-table__paginator d-flex pt-3 pb-3\">\n @if (tableRows.length) {\n <div class=\"mt-2\">\n <v-table-pagination-info\n [showingText]=\"'TABLES.PAGINATION.SHOWING' | translate\"\n [toText]=\"'TABLES.PAGINATION.TO' | translate\"\n [ofText]=\"'TABLES.PAGINATION.OF' | translate\"\n [entriesText]=\"'TABLES.PAGINATION.ENTRIES' | translate\"\n [currentPage]=\"currentPage\"\n [pageSize]=\"pageSize\"\n [total]=\"total\"\n />\n </div>\n <div class=\"ms-4\">\n <gov-form-select\n [options]=\"pageSizeOptions\"\n [value]=\"govPageSize\"\n (gov-change)=\"changePageSize($event)\"\n />\n </div>\n }\n <div class=\"ms-4\">\n <gov-pagination\n [current]=\"currentPage\"\n [pageSize]=\"pageSize\"\n [total]=\"total\"\n [type]=\"'button'\"\n (gov-page)=\"changePage($event)\"\n />\n </div>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.v-table{position:relative;height:100%;display:flex;flex-direction:column}.v-table__sortable{transition:color .15s ease-in-out;cursor:pointer}.v-table__sortable:after{content:\"\\2191\\2193\";margin-left:.5rem;text-decoration:none;display:inline-block}.v-table__sortable--asc:after{content:\"\\2191\"}.v-table__sortable--desc:after{content:\"\\2193\"}.v-table__header{background-color:var(--background-block-primary);position:sticky;top:0;z-index:2}.v-table__table{width:100%}.v-table__paginator{background-color:var(--background-neutral-white);justify-content:end;position:sticky;bottom:0;z-index:3}.gov-table{width:100%;overflow-x:auto}.gov-table table{table-layout:auto;min-width:100%;border-collapse:collapse}.gov-table table tr.gov-table--highlight td{background-color:var(--background-primary-subtle)}.gov-table table th,.gov-table table td{border-bottom:1px solid var(--border-subtlest);text-align:left}.gov-table table th.gov-table--align-right,.gov-table table td.gov-table--align-right{text-align:right}.gov-table table th.gov-table--vertical-align-top,.gov-table table td.gov-table--vertical-align-top{vertical-align:top}.gov-table table th.gov-table--border-right,.gov-table table td.gov-table--border-right{border-right:1px solid var(--border-subtlest)}.gov-table table th.gov-table--border-left,.gov-table table td.gov-table--border-left{border-left:1px solid var(--border-subtlest)}.gov-table table th.gov-table--border-bottom-none,.gov-table table td.gov-table--border-bottom-none{border-bottom:none}.gov-table table th.gov-table--nowrap,.gov-table table td.gov-table--nowrap{white-space:nowrap}.gov-table table th.gov-table--fit-width,.gov-table table td.gov-table--fit-width{width:1px}.gov-table table th{color:var(--text-primary);background-color:var(--background-neutral-subtlest)}.gov-table table td{background-color:var(--background-neutral-white)}.gov-table table tr.open td{padding:var(--spacing-s) var(--spacing-m)}.gov-table summary::-webkit-details-marker{display:none}.gov-table[size=s] table{border-bottom-left-radius:var(--corner-radius-s);border-bottom-right-radius:var(--corner-radius-s)}.gov-table[size=s] table th,.gov-table[size=s] table td{height:var(--height-2xl);padding:0 var(--spacing-s);font-size:var(--font-size-body-s);line-height:150%;font-weight:400}.gov-table[size=s] table th{font-weight:700}.gov-table[size=m] table{border-bottom-left-radius:var(--corner-radius-m);border-bottom-right-radius:var(--corner-radius-m)}.gov-table[size=m] table th,.gov-table[size=m] table td{height:var(--height-3xl);padding:0 var(--spacing-m);font-size:var(--font-size-body-m);line-height:150%;font-weight:400}.gov-table[size=m] table th{font-weight:700}.gov-table[size=l] table{border-bottom-left-radius:var(--corner-radius-l);border-bottom-right-radius:var(--corner-radius-l)}.gov-table[size=l] table th,.gov-table[size=l] table td{height:var(--height-4xl);padding:0 var(--spacing-l);font-size:var(--font-size-body-l);line-height:150%;font-weight:400}.gov-table[size=l] table th{font-weight:700}.gov-table-complex__name,.gov-table-complex__description{margin:0;color:var(--text-primary)}.gov-table-complex__actions{color:var(--text-white-fixed);background-color:var(--background-primary);padding:var(--spacing-xs) var(--spacing-s)}.gov-table-complex__per-page{width:185px;white-space:nowrap}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: GovDesignSystemModule }, { kind: "component", type: i2.GovButton, selector: "gov-button", inputs: ["color", "disabled", "download", "expanded", "expandedMobile", "focusable", "href", "hreflang", "identifier", "loading", "name", "nativeType", "referrerpolicy", "rel", "size", "target", "type"] }, { kind: "component", type: i2.GovEmpty, selector: "gov-empty", inputs: ["direction", "size"] }, { kind: "component", type: i2.GovFlex, selector: "gov-flex", inputs: ["alignContent", "alignItems", "alignSelf", "direction", "gap", "justifyContent", "responsive", "wrap"] }, { kind: "component", type: i2.GovFormCheckbox, selector: "gov-form-checkbox", inputs: ["checked", "disabled", "identifier", "indeterminate", "invalid", "name", "noLabel", "required", "size", "value"] }, { kind: "component", type: i2.GovFormSelect, selector: "gov-form-select", inputs: ["disabled", "identifier", "invalid", "name", "options", "required", "size", "success", "value"] }, { kind: "component", type: i2.GovIcon, selector: "gov-icon", inputs: ["color", "name", "size", "type"] }, { kind: "component", type: i2.GovPagination, selector: "gov-pagination", inputs: ["accessiblePageLabel", "accessibleSelectLabel", "color", "current", "labelEnd", "labelNext", "labelPrev", "labelStart", "link", "maxPages", "pageSize", "selectIdentifier", "size", "total", "type"] }, { kind: "directive", type: i2.BooleanValueAccessor, selector: "gov-form-checkbox,gov-form-switch" }, { kind: "directive", type: i2.SelectValueAccessor, selector: "gov-form-select, gov-form-multi-select" }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: LoaderComponent, selector: "v-loader", inputs: ["size", "message"] }, { kind: "component", type: TablePaginationInfoComponent, selector: "v-table-pagination-info", inputs: ["showingText", "toText", "ofText", "entriesText", "currentPage", "pageSize", "total"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: GovSizePipe, name: "govSize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2967
+ ], queries: [{ propertyName: "rowDetailTemplate", first: true, predicate: ["rowDetail"], descendants: true }, { propertyName: "rowDetailButtonTemplate", first: true, predicate: ["rowDetailButton"], descendants: true }, { propertyName: "viewColumns", predicate: TABLE_COLUMN_PROVIDER }], viewQueries: [{ propertyName: "tableRef", first: true, predicate: ["tableRef"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "@if (selectionMode === 'multiple' && showActionButtons) {\n <gov-flex class=\"gov-table-complex__actions mt-2\" justify-content=\"space-between\" align-items=\"center\">\n <div class=\"gov-table-complex__records-selected\">\n {{ selectedCount }} {{ ('TABLES.CHOSEN_RECORDS' | translate) ?? 'chosen records' }}\n </div>\n <div>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"delete.emit(selected)\">\n {{ ('BUTTONS.DELETE' | translate) ?? 'Delete' }}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"save.emit(selected)\">\n {{ ('BUTTONS.SAVE' | translate) ?? 'Save' }}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"download.emit(selected)\">\n {{ ('BUTTONS.DOWNLOAD' | translate) ?? 'Download' }}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"deselectAll()\">\n {{ ('BUTTONS.CANCEL' | translate) ?? 'Cancel' }}\n </gov-button>\n </div>\n </gov-flex>\n}\n\n<div class=\"v-table gov-table\" [attr.size]=\"size | govSize\">\n <table #tableRef class=\"v-table__table\">\n <thead class=\"v-table__head\">\n <tr class=\"v-table__header\">\n @if (rowDetailTemplate) {\n <th></th>\n }\n @if (selectionMode === 'multiple') {\n <th scope=\"col\">\n <gov-form-checkbox [checked]=\"allSelected\" (gov-change)=\"toggleAll($event)\" />\n </th>\n }\n @for (column of tableColumns; track column; let index = $index) {\n @if (column.visible && column.forceVisibility !== 'hidden') {\n <th scope=\"col\" [style]=\"{'text-align': column.textAlign}\" [class]=\"column.columnClass\">\n <span\n class=\"gov-table--fit-width\"\n [class.v-table__sortable]=\"column.sortable\"\n [class.v-table__sortable--desc]=\"column.sortable && column.sortDirection === 'desc'\"\n [class.v-table__sortable--asc]=\"column.sortable && column.sortDirection === 'asc'\"\n (click)=\"sortColumn(column)\"\n >\n {{ column.headerGetter(column.id, index) | translate }}\n </span>\n </th>\n }\n }\n @if (rowDetailButtonTemplate) {\n <th></th>\n }\n </tr>\n </thead>\n\n @if (loading) {\n <v-loader />\n } @else {\n <tbody class=\"v-table__body\">\n @for (data of tableRowView; track data.id; let rowIndex = $index) {\n <tr\n class=\"v-table__row\"\n [class.gov-table--highlight]=\"data.selected && selectionMode\"\n [class.v-table__row--focused]=\"rowIndex === focusedIndex\"\n [attr.tabindex]=\"0\"\n [attr.disable-custom-clicks]=\"disableCustomClicks || null\"\n (mousedown)=\"onRowMouseDown(data, rowIndex, $event)\"\n (mouseup)=\"onRowMouseUp(data, rowIndex, $event)\"\n (mouseenter)=\"onRowMouseEnter(rowIndex)\"\n (dblclick)=\"navigate(data, $event)\"\n >\n @if (rowDetailTemplate) {\n <td>\n <gov-button [size]=\"size | govSize\" color=\"primary\" type=\"solid\" (gov-click)=\"toggleDetail(data)\">\n <gov-icon\n [name]=\"data.expanded ? 'chevron-up' : 'chevron-down'\"\n [size]=\"size | govSize\"\n slot=\"icon-start\"\n ></gov-icon>\n </gov-button>\n </td>\n }\n @if (selectionMode === 'multiple') {\n <td class=\"gov-table--fit-content gov-table--border-right\">\n <gov-form-checkbox\n no-label\n [checked]=\"data.selected\"\n [size]=\"size | govSize\"\n (gov-change)=\"selectRowCheckbox(data, $event)\"\n />\n </td>\n }\n @for (column of tableColumns; track column; let columnIndex = $index) {\n @if (column.visible && column.forceVisibility !== 'hidden') {\n <td\n [style]=\"{'text-align': column.textAlign}\"\n [class]=\"column.columnClass!\"\n [class.v-auto-cell]=\"column.template\"\n >\n @if (column.template) {\n <ng-container *ngTemplateOutlet=\"column.template; context: { $implicit: data.row }\"></ng-container>\n } @else {\n <span\n [routerLink]=\"column.routerLink ? column.routerLink(data.row) : null\"\n [queryParams]=\"getQueryParams(column, data.row)\"\n [innerHTML]=\"truncate(column.valueGetter(data.row, rowIndex))\"\n [attr.title]=\"column.valueGetter(data.row, rowIndex).length > maximumColumnLength ? column.valueGetter(data.row, rowIndex) : null\"\n ></span>\n }\n </td>\n }\n }\n @if (rowDetailButtonTemplate) {\n <td>\n <ng-container *ngTemplateOutlet=\"rowDetailButtonTemplate; context: { $implicit: data.row }\"></ng-container>\n </td>\n }\n </tr>\n\n @if (rowDetailTemplate && data.expanded) {\n <tr>\n <td [attr.colspan]=\"tableColumns.length + (selectionMode === 'multiple' ? 1 : 0) + (rowDetailTemplate ? 1 : 0) + (rowDetailButtonTemplate ? 1 : 0)\">\n <ng-container *ngTemplateOutlet=\"rowDetailTemplate; context: { $implicit: data.row }\"></ng-container>\n </td>\n </tr>\n }\n }\n\n @if (!tableRows.length && !loading) {\n <tr>\n <td [attr.colspan]=\"tableColumns.length + (selectionMode === 'multiple' ? 1 : 0) + (rowDetailTemplate ? 1 : 0) + (rowDetailButtonTemplate ? 1 : 0)\">\n <gov-empty align=\"center\" [size]=\"size | govSize\">\n <gov-icon slot=\"icon\" name=\"empty-file\" type=\"colored\" />\n <p slot=\"headline\">\n {{ ('TABLES.EMPTY' | translate) ?? 'No records were found!' }}\n </p>\n </gov-empty>\n </td>\n </tr>\n }\n </tbody>\n }\n </table>\n\n @if (showPaginator) {\n <div class=\"v-table__paginator d-flex pt-3 pb-3\">\n @if (tableRows.length) {\n <div class=\"mt-2\">\n <v-table-pagination-info\n [showingText]=\"'TABLES.PAGINATION.SHOWING' | translate\"\n [toText]=\"'TABLES.PAGINATION.TO' | translate\"\n [ofText]=\"'TABLES.PAGINATION.OF' | translate\"\n [entriesText]=\"'TABLES.PAGINATION.ENTRIES' | translate\"\n [currentPage]=\"currentPage\"\n [pageSize]=\"pageSize\"\n [total]=\"total\"\n />\n </div>\n <div class=\"ms-4\">\n <gov-form-select\n [options]=\"pageSizeOptions\"\n [value]=\"govPageSize\"\n (gov-change)=\"changePageSize($event)\"\n />\n </div>\n }\n <div class=\"ms-4\">\n <gov-pagination\n [current]=\"currentPage\"\n [pageSize]=\"pageSize\"\n [total]=\"total\"\n [type]=\"'button'\"\n (gov-page)=\"changePage($event)\"\n />\n </div>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.v-table{position:relative;height:100%;display:flex;flex-direction:column}.v-table__sortable{transition:color .15s ease-in-out;cursor:pointer}.v-table__sortable:after{content:\"\\2191\\2193\";margin-left:.5rem;text-decoration:none;display:inline-block}.v-table__sortable--asc:after{content:\"\\2191\"}.v-table__sortable--desc:after{content:\"\\2193\"}.v-table__header{background-color:var(--background-block-primary);position:sticky;top:0;z-index:2}.v-table__table{width:100%}.v-table__paginator{background-color:var(--background-neutral-white);justify-content:end;position:sticky;bottom:0;z-index:3}.gov-table{width:100%;overflow-x:auto}.gov-table table{table-layout:auto;min-width:100%;border-collapse:collapse}.gov-table table tr.gov-table--highlight td{background-color:var(--background-primary-subtle)}.gov-table table th,.gov-table table td{border-bottom:1px solid var(--border-subtlest);text-align:left}.gov-table table th.gov-table--align-right,.gov-table table td.gov-table--align-right{text-align:right}.gov-table table th.gov-table--vertical-align-top,.gov-table table td.gov-table--vertical-align-top{vertical-align:top}.gov-table table th.gov-table--border-right,.gov-table table td.gov-table--border-right{border-right:1px solid var(--border-subtlest)}.gov-table table th.gov-table--border-left,.gov-table table td.gov-table--border-left{border-left:1px solid var(--border-subtlest)}.gov-table table th.gov-table--border-bottom-none,.gov-table table td.gov-table--border-bottom-none{border-bottom:none}.gov-table table th.gov-table--nowrap,.gov-table table td.gov-table--nowrap{white-space:nowrap}.gov-table table th.gov-table--fit-width,.gov-table table td.gov-table--fit-width{width:1px}.gov-table table th{color:var(--text-primary);background-color:var(--background-neutral-subtlest)}.gov-table table td{background-color:var(--background-neutral-white)}.gov-table table tr.open td{padding:var(--spacing-s) var(--spacing-m)}.gov-table summary::-webkit-details-marker{display:none}.gov-table[size=s] table{border-bottom-left-radius:var(--corner-radius-s);border-bottom-right-radius:var(--corner-radius-s)}.gov-table[size=s] table th,.gov-table[size=s] table td{height:var(--height-2xl);padding:0 var(--spacing-s);font-size:var(--font-size-body-s);line-height:150%;font-weight:400}.gov-table[size=s] table th{font-weight:700}.gov-table[size=m] table{border-bottom-left-radius:var(--corner-radius-m);border-bottom-right-radius:var(--corner-radius-m)}.gov-table[size=m] table th,.gov-table[size=m] table td{height:var(--height-3xl);padding:0 var(--spacing-m);font-size:var(--font-size-body-m);line-height:150%;font-weight:400}.gov-table[size=m] table th{font-weight:700}.gov-table[size=l] table{border-bottom-left-radius:var(--corner-radius-l);border-bottom-right-radius:var(--corner-radius-l)}.gov-table[size=l] table th,.gov-table[size=l] table td{height:var(--height-4xl);padding:0 var(--spacing-l);font-size:var(--font-size-body-l);line-height:150%;font-weight:400}.gov-table[size=l] table th{font-weight:700}.gov-table-complex__name,.gov-table-complex__description{margin:0;color:var(--text-primary)}.gov-table-complex__actions{color:var(--text-white-fixed);background-color:var(--background-primary);padding:var(--spacing-xs) var(--spacing-s)}.gov-table-complex__per-page{width:185px;white-space:nowrap}.v-table__row{transition:background-color .18s ease;cursor:pointer}.v-table__row:hover>td{background-color:var(--gov-color-primary-50, #f5faff)!important}.v-table__row.gov-table--highlight:hover>td{background-color:var(--gov-color-primary-100, #e6f0ff)!important}.v-table__row[disable-custom-clicks],.v-table__row.disable-custom-clicks{cursor:default!important;pointer-events:auto}.v-table__row[disable-custom-clicks]:hover>td,.v-table__row.disable-custom-clicks:hover>td{background-color:transparent!important;background-color:var(--gov-color-primary-50, #c5dbf2)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: GovDesignSystemModule }, { kind: "component", type: i2.GovButton, selector: "gov-button", inputs: ["color", "disabled", "download", "expanded", "expandedMobile", "focusable", "href", "hreflang", "identifier", "loading", "name", "nativeType", "referrerpolicy", "rel", "size", "target", "type"] }, { kind: "component", type: i2.GovEmpty, selector: "gov-empty", inputs: ["direction", "size"] }, { kind: "component", type: i2.GovFlex, selector: "gov-flex", inputs: ["alignContent", "alignItems", "alignSelf", "direction", "gap", "justifyContent", "responsive", "wrap"] }, { kind: "component", type: i2.GovFormCheckbox, selector: "gov-form-checkbox", inputs: ["checked", "disabled", "identifier", "indeterminate", "invalid", "name", "noLabel", "required", "size", "value"] }, { kind: "component", type: i2.GovFormSelect, selector: "gov-form-select", inputs: ["disabled", "identifier", "invalid", "name", "options", "required", "size", "success", "value"] }, { kind: "component", type: i2.GovIcon, selector: "gov-icon", inputs: ["color", "name", "size", "type"] }, { kind: "component", type: i2.GovPagination, selector: "gov-pagination", inputs: ["accessiblePageLabel", "accessibleSelectLabel", "color", "current", "labelEnd", "labelNext", "labelPrev", "labelStart", "link", "maxPages", "pageSize", "selectIdentifier", "size", "total", "type"] }, { kind: "directive", type: i2.BooleanValueAccessor, selector: "gov-form-checkbox,gov-form-switch" }, { kind: "directive", type: i2.SelectValueAccessor, selector: "gov-form-select, gov-form-multi-select" }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: LoaderComponent, selector: "v-loader", inputs: ["size", "message"] }, { kind: "component", type: TablePaginationInfoComponent, selector: "v-table-pagination-info", inputs: ["showingText", "toText", "ofText", "entriesText", "currentPage", "pageSize", "total"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "pipe", type: GovSizePipe, name: "govSize" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2833
2968
  }
2834
2969
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImport: i0, type: TableComponent, decorators: [{
2835
2970
  type: Component,
2836
- args: [{ selector: 'v-table', imports: [
2971
+ args: [{ selector: 'v-table', standalone: true, imports: [
2837
2972
  CommonModule,
2838
2973
  RouterModule,
2839
2974
  GovDesignSystemModule,
@@ -2847,8 +2982,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
2847
2982
  provide: TABLE_COMPONENT_TOKEN,
2848
2983
  useExisting: TableComponent,
2849
2984
  },
2850
- ], template: "@if (selectionMode === 'multiple' && showActionButtons) {\n<gov-flex\n class=\"gov-table-complex__actions mt-2\"\n justify-content=\"space-between\"\n align-items=\"center\"\n>\n <div class=\"gov-table-complex__records-selected\">\n {{ selectedCount }} {{ ('TABLES.CHOSEN_RECORDS' | translate) ?? 'chosen records'}}\n </div>\n <div>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"delete.emit(selected)\">\n {{ ('BUTTONS.DELETE' | translate) ?? 'Delete'}}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"save.emit(selected)\">\n {{ ('BUTTONS.SAVE' | translate) ?? 'Save'}}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"download.emit(selected)\">\n {{ ('BUTTONS.DOWNLOAD' | translate) ?? 'Download'}}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"deselectAll()\">\n {{ ('BUTTONS.CANCEL' | translate) ?? 'Cancel'}}\n </gov-button>\n </div>\n</gov-flex>\n}\n\n<div\n class=\" v-table gov-table\"\n [attr.size]=\"size | govSize\"\n>\n <table class=\"v-table__table\">\n <thead class=\"v-table__head\">\n <tr class=\"v-table__header\">\n @if (this.rowDetailTemplate) {\n <th></th>\n } @if (selectionMode === 'multiple') {\n <th scope=\"col\">\n <gov-form-checkbox\n [checked]=\"allSelected\"\n (gov-change)=\"toggleAll($event)\"\n />\n </th>\n }\n @for (column of tableColumns; track column; let index = $index) {\n @if (column.visible && column.forceVisibility !== 'hidden') {\n <th\n scope=\"col\"\n [style]=\"{'text-align': column.textAlign}\"\n [class]=\"column.columnClass\"\n >\n <span\n class=\"gov-table--fit-width\"\n [class.v-table__sortable]=\"column.sortable\"\n [class.v-table__sortable--desc]=\"column.sortable && column.sortDirection === 'desc'\"\n [class.v-table__sortable--asc]=\"column.sortable && column.sortDirection === 'asc'\"\n (click)=\"sortColumn(column)\"\n >\n {{ column.headerGetter(column.id, index) | translate }}\n </span>\n </th>\n } @if (this.rowDetailButtonTemplate) {\n <th></th>\n }}\n </tr>\n </thead>\n @if (loading) {\n <v-loader />\n } @else {\n <tbody class=\"v-table__body\">\n @for (data of tableRowView; track data.id; let rowIndex = $index) {\n <tr\n class=\"v-table__row\"\n [class.gov-table--highlight]=\"data.selected && selectionMode\"\n (click)=\"selectRow(data, $event)\"\n (dblclick)=\"navigate(data, $event)\"\n (mousedown)=\"navigateNewWindow(data, $event)\"\n >\n @if (this.rowDetailTemplate) {\n <td>\n <gov-button\n [size]=\"size | govSize\"\n color=\"primary\"\n type=\"solid\"\n (gov-click)=\"toggleDetail(data)\"\n >\n <gov-icon\n [name]=\"data.expanded ? 'chevron-up' : 'chevron-down'\"\n [size]=\"size | govSize\"\n slot=\"icon-start\"\n ></gov-icon>\n </gov-button>\n </td>\n } @if (selectionMode === 'multiple') {\n <td class=\"gov-table--fit-content gov-table--border-right\">\n <gov-form-checkbox\n no-label\n [checked]=\"data.selected\"\n [size]=\"size | govSize\"\n (gov-change)=\"selectRowCheckbox(data, $event)\"\n />\n </td>\n }\n @for (column of tableColumns; track column; let columnIndex = $index) {\n @if (column.visible && column.forceVisibility !== 'hidden') {\n <td\n [style]=\"{'text-align': column.textAlign}\"\n [class]=\"column.columnClass!\"\n [class.v-auto-cell]=\"column.template\"\n >\n @if (column.template) {\n <ng-container\n *ngTemplateOutlet=\"\n column.template;\n context: { $implicit: data.row }\n \"\n ></ng-container>\n } @else {\n <span\n [queryParams]=\"column.queryParams ? column.queryParams : undefined\"\n [routerLink]=\"column.routerLink ? column.routerLink(data.row) : undefined\"\n [innerHTML]=\"truncate(column.valueGetter(data.row, rowIndex))\"\n [attr.title]=\"\n column.valueGetter(data.row, rowIndex).length > maximumColumnLength\n ? column.valueGetter(data.row, rowIndex)\n : null\n \"\n ></span>\n }\n </td>\n @if (this.rowDetailButtonTemplate) {\n <td scope=\"\">\n <ng-container\n *ngTemplateOutlet=\"\n this.rowDetailButtonTemplate;\n context: { $implicit: data.row }\n \"\n ></ng-container>\n </td>\n }}}\n </tr>\n @if (this.rowDetailTemplate && data.expanded) {\n <tr>\n <td [attr.colspan]=\"tableColumns.length + 1\">\n <ng-container\n class=\"w-100\"\n *ngTemplateOutlet=\"\n this.rowDetailTemplate;\n context: { $implicit: data.row }\n \"\n ></ng-container>\n </td>\n </tr>\n } } @if (!tableRows.length && !loading){\n <td [attr.colspan]=\"tableColumns.length\">\n <gov-empty align=\"center\" [size]=\"size | govSize\">\n <gov-icon slot=\"icon\" name=\"empty-file\" type=\"colored\"/>\n <p slot=\"headline\">\n {{ ('TABLES.EMPTY' | translate) ?? 'No records were found!' }}\n </p>\n </gov-empty>\n </td>\n }\n </tbody>\n }\n </table>\n @if(showPaginator) {\n <div class=\"v-table__paginator d-flex pt-3 pb-3\">\n @if (tableRows.length) {\n <div class=\"mt-2\">\n <v-table-pagination-info\n [showingText]=\"'TABLES.PAGINATION.SHOWING' | translate\"\n [toText]=\"'TABLES.PAGINATION.TO' | translate\"\n [ofText]=\"'TABLES.PAGINATION.OF' | translate\"\n [entriesText]=\"'TABLES.PAGINATION.ENTRIES' | translate\"\n [currentPage]=\"currentPage\"\n [pageSize]=\"pageSize\"\n [total]=\"total\"\n />\n </div>\n <div class=\"ms-4\">\n <gov-form-select\n [options]=\"pageSizeOptions\"\n [value]=\"govPageSize\"\n (gov-change)=\"changePageSize($event)\"\n />\n </div>\n }\n <div class=\"ms-4\">\n <gov-pagination\n [current]=\"currentPage\"\n [pageSize]=\"pageSize\"\n [total]=\"total\"\n [type]=\"'button'\"\n (gov-page)=\"changePage($event)\"\n />\n </div>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.v-table{position:relative;height:100%;display:flex;flex-direction:column}.v-table__sortable{transition:color .15s ease-in-out;cursor:pointer}.v-table__sortable:after{content:\"\\2191\\2193\";margin-left:.5rem;text-decoration:none;display:inline-block}.v-table__sortable--asc:after{content:\"\\2191\"}.v-table__sortable--desc:after{content:\"\\2193\"}.v-table__header{background-color:var(--background-block-primary);position:sticky;top:0;z-index:2}.v-table__table{width:100%}.v-table__paginator{background-color:var(--background-neutral-white);justify-content:end;position:sticky;bottom:0;z-index:3}.gov-table{width:100%;overflow-x:auto}.gov-table table{table-layout:auto;min-width:100%;border-collapse:collapse}.gov-table table tr.gov-table--highlight td{background-color:var(--background-primary-subtle)}.gov-table table th,.gov-table table td{border-bottom:1px solid var(--border-subtlest);text-align:left}.gov-table table th.gov-table--align-right,.gov-table table td.gov-table--align-right{text-align:right}.gov-table table th.gov-table--vertical-align-top,.gov-table table td.gov-table--vertical-align-top{vertical-align:top}.gov-table table th.gov-table--border-right,.gov-table table td.gov-table--border-right{border-right:1px solid var(--border-subtlest)}.gov-table table th.gov-table--border-left,.gov-table table td.gov-table--border-left{border-left:1px solid var(--border-subtlest)}.gov-table table th.gov-table--border-bottom-none,.gov-table table td.gov-table--border-bottom-none{border-bottom:none}.gov-table table th.gov-table--nowrap,.gov-table table td.gov-table--nowrap{white-space:nowrap}.gov-table table th.gov-table--fit-width,.gov-table table td.gov-table--fit-width{width:1px}.gov-table table th{color:var(--text-primary);background-color:var(--background-neutral-subtlest)}.gov-table table td{background-color:var(--background-neutral-white)}.gov-table table tr.open td{padding:var(--spacing-s) var(--spacing-m)}.gov-table summary::-webkit-details-marker{display:none}.gov-table[size=s] table{border-bottom-left-radius:var(--corner-radius-s);border-bottom-right-radius:var(--corner-radius-s)}.gov-table[size=s] table th,.gov-table[size=s] table td{height:var(--height-2xl);padding:0 var(--spacing-s);font-size:var(--font-size-body-s);line-height:150%;font-weight:400}.gov-table[size=s] table th{font-weight:700}.gov-table[size=m] table{border-bottom-left-radius:var(--corner-radius-m);border-bottom-right-radius:var(--corner-radius-m)}.gov-table[size=m] table th,.gov-table[size=m] table td{height:var(--height-3xl);padding:0 var(--spacing-m);font-size:var(--font-size-body-m);line-height:150%;font-weight:400}.gov-table[size=m] table th{font-weight:700}.gov-table[size=l] table{border-bottom-left-radius:var(--corner-radius-l);border-bottom-right-radius:var(--corner-radius-l)}.gov-table[size=l] table th,.gov-table[size=l] table td{height:var(--height-4xl);padding:0 var(--spacing-l);font-size:var(--font-size-body-l);line-height:150%;font-weight:400}.gov-table[size=l] table th{font-weight:700}.gov-table-complex__name,.gov-table-complex__description{margin:0;color:var(--text-primary)}.gov-table-complex__actions{color:var(--text-white-fixed);background-color:var(--background-primary);padding:var(--spacing-xs) var(--spacing-s)}.gov-table-complex__per-page{width:185px;white-space:nowrap}\n"] }]
2851
- }], ctorParameters: () => [], propDecorators: { viewColumns: [{
2985
+ ], template: "@if (selectionMode === 'multiple' && showActionButtons) {\n <gov-flex class=\"gov-table-complex__actions mt-2\" justify-content=\"space-between\" align-items=\"center\">\n <div class=\"gov-table-complex__records-selected\">\n {{ selectedCount }} {{ ('TABLES.CHOSEN_RECORDS' | translate) ?? 'chosen records' }}\n </div>\n <div>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"delete.emit(selected)\">\n {{ ('BUTTONS.DELETE' | translate) ?? 'Delete' }}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"save.emit(selected)\">\n {{ ('BUTTONS.SAVE' | translate) ?? 'Save' }}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"download.emit(selected)\">\n {{ ('BUTTONS.DOWNLOAD' | translate) ?? 'Download' }}\n </gov-button>\n <gov-button color=\"primary\" size=\"s\" type=\"solid\" (gov-click)=\"deselectAll()\">\n {{ ('BUTTONS.CANCEL' | translate) ?? 'Cancel' }}\n </gov-button>\n </div>\n </gov-flex>\n}\n\n<div class=\"v-table gov-table\" [attr.size]=\"size | govSize\">\n <table #tableRef class=\"v-table__table\">\n <thead class=\"v-table__head\">\n <tr class=\"v-table__header\">\n @if (rowDetailTemplate) {\n <th></th>\n }\n @if (selectionMode === 'multiple') {\n <th scope=\"col\">\n <gov-form-checkbox [checked]=\"allSelected\" (gov-change)=\"toggleAll($event)\" />\n </th>\n }\n @for (column of tableColumns; track column; let index = $index) {\n @if (column.visible && column.forceVisibility !== 'hidden') {\n <th scope=\"col\" [style]=\"{'text-align': column.textAlign}\" [class]=\"column.columnClass\">\n <span\n class=\"gov-table--fit-width\"\n [class.v-table__sortable]=\"column.sortable\"\n [class.v-table__sortable--desc]=\"column.sortable && column.sortDirection === 'desc'\"\n [class.v-table__sortable--asc]=\"column.sortable && column.sortDirection === 'asc'\"\n (click)=\"sortColumn(column)\"\n >\n {{ column.headerGetter(column.id, index) | translate }}\n </span>\n </th>\n }\n }\n @if (rowDetailButtonTemplate) {\n <th></th>\n }\n </tr>\n </thead>\n\n @if (loading) {\n <v-loader />\n } @else {\n <tbody class=\"v-table__body\">\n @for (data of tableRowView; track data.id; let rowIndex = $index) {\n <tr\n class=\"v-table__row\"\n [class.gov-table--highlight]=\"data.selected && selectionMode\"\n [class.v-table__row--focused]=\"rowIndex === focusedIndex\"\n [attr.tabindex]=\"0\"\n [attr.disable-custom-clicks]=\"disableCustomClicks || null\"\n (mousedown)=\"onRowMouseDown(data, rowIndex, $event)\"\n (mouseup)=\"onRowMouseUp(data, rowIndex, $event)\"\n (mouseenter)=\"onRowMouseEnter(rowIndex)\"\n (dblclick)=\"navigate(data, $event)\"\n >\n @if (rowDetailTemplate) {\n <td>\n <gov-button [size]=\"size | govSize\" color=\"primary\" type=\"solid\" (gov-click)=\"toggleDetail(data)\">\n <gov-icon\n [name]=\"data.expanded ? 'chevron-up' : 'chevron-down'\"\n [size]=\"size | govSize\"\n slot=\"icon-start\"\n ></gov-icon>\n </gov-button>\n </td>\n }\n @if (selectionMode === 'multiple') {\n <td class=\"gov-table--fit-content gov-table--border-right\">\n <gov-form-checkbox\n no-label\n [checked]=\"data.selected\"\n [size]=\"size | govSize\"\n (gov-change)=\"selectRowCheckbox(data, $event)\"\n />\n </td>\n }\n @for (column of tableColumns; track column; let columnIndex = $index) {\n @if (column.visible && column.forceVisibility !== 'hidden') {\n <td\n [style]=\"{'text-align': column.textAlign}\"\n [class]=\"column.columnClass!\"\n [class.v-auto-cell]=\"column.template\"\n >\n @if (column.template) {\n <ng-container *ngTemplateOutlet=\"column.template; context: { $implicit: data.row }\"></ng-container>\n } @else {\n <span\n [routerLink]=\"column.routerLink ? column.routerLink(data.row) : null\"\n [queryParams]=\"getQueryParams(column, data.row)\"\n [innerHTML]=\"truncate(column.valueGetter(data.row, rowIndex))\"\n [attr.title]=\"column.valueGetter(data.row, rowIndex).length > maximumColumnLength ? column.valueGetter(data.row, rowIndex) : null\"\n ></span>\n }\n </td>\n }\n }\n @if (rowDetailButtonTemplate) {\n <td>\n <ng-container *ngTemplateOutlet=\"rowDetailButtonTemplate; context: { $implicit: data.row }\"></ng-container>\n </td>\n }\n </tr>\n\n @if (rowDetailTemplate && data.expanded) {\n <tr>\n <td [attr.colspan]=\"tableColumns.length + (selectionMode === 'multiple' ? 1 : 0) + (rowDetailTemplate ? 1 : 0) + (rowDetailButtonTemplate ? 1 : 0)\">\n <ng-container *ngTemplateOutlet=\"rowDetailTemplate; context: { $implicit: data.row }\"></ng-container>\n </td>\n </tr>\n }\n }\n\n @if (!tableRows.length && !loading) {\n <tr>\n <td [attr.colspan]=\"tableColumns.length + (selectionMode === 'multiple' ? 1 : 0) + (rowDetailTemplate ? 1 : 0) + (rowDetailButtonTemplate ? 1 : 0)\">\n <gov-empty align=\"center\" [size]=\"size | govSize\">\n <gov-icon slot=\"icon\" name=\"empty-file\" type=\"colored\" />\n <p slot=\"headline\">\n {{ ('TABLES.EMPTY' | translate) ?? 'No records were found!' }}\n </p>\n </gov-empty>\n </td>\n </tr>\n }\n </tbody>\n }\n </table>\n\n @if (showPaginator) {\n <div class=\"v-table__paginator d-flex pt-3 pb-3\">\n @if (tableRows.length) {\n <div class=\"mt-2\">\n <v-table-pagination-info\n [showingText]=\"'TABLES.PAGINATION.SHOWING' | translate\"\n [toText]=\"'TABLES.PAGINATION.TO' | translate\"\n [ofText]=\"'TABLES.PAGINATION.OF' | translate\"\n [entriesText]=\"'TABLES.PAGINATION.ENTRIES' | translate\"\n [currentPage]=\"currentPage\"\n [pageSize]=\"pageSize\"\n [total]=\"total\"\n />\n </div>\n <div class=\"ms-4\">\n <gov-form-select\n [options]=\"pageSizeOptions\"\n [value]=\"govPageSize\"\n (gov-change)=\"changePageSize($event)\"\n />\n </div>\n }\n <div class=\"ms-4\">\n <gov-pagination\n [current]=\"currentPage\"\n [pageSize]=\"pageSize\"\n [total]=\"total\"\n [type]=\"'button'\"\n (gov-page)=\"changePage($event)\"\n />\n </div>\n </div>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.v-table{position:relative;height:100%;display:flex;flex-direction:column}.v-table__sortable{transition:color .15s ease-in-out;cursor:pointer}.v-table__sortable:after{content:\"\\2191\\2193\";margin-left:.5rem;text-decoration:none;display:inline-block}.v-table__sortable--asc:after{content:\"\\2191\"}.v-table__sortable--desc:after{content:\"\\2193\"}.v-table__header{background-color:var(--background-block-primary);position:sticky;top:0;z-index:2}.v-table__table{width:100%}.v-table__paginator{background-color:var(--background-neutral-white);justify-content:end;position:sticky;bottom:0;z-index:3}.gov-table{width:100%;overflow-x:auto}.gov-table table{table-layout:auto;min-width:100%;border-collapse:collapse}.gov-table table tr.gov-table--highlight td{background-color:var(--background-primary-subtle)}.gov-table table th,.gov-table table td{border-bottom:1px solid var(--border-subtlest);text-align:left}.gov-table table th.gov-table--align-right,.gov-table table td.gov-table--align-right{text-align:right}.gov-table table th.gov-table--vertical-align-top,.gov-table table td.gov-table--vertical-align-top{vertical-align:top}.gov-table table th.gov-table--border-right,.gov-table table td.gov-table--border-right{border-right:1px solid var(--border-subtlest)}.gov-table table th.gov-table--border-left,.gov-table table td.gov-table--border-left{border-left:1px solid var(--border-subtlest)}.gov-table table th.gov-table--border-bottom-none,.gov-table table td.gov-table--border-bottom-none{border-bottom:none}.gov-table table th.gov-table--nowrap,.gov-table table td.gov-table--nowrap{white-space:nowrap}.gov-table table th.gov-table--fit-width,.gov-table table td.gov-table--fit-width{width:1px}.gov-table table th{color:var(--text-primary);background-color:var(--background-neutral-subtlest)}.gov-table table td{background-color:var(--background-neutral-white)}.gov-table table tr.open td{padding:var(--spacing-s) var(--spacing-m)}.gov-table summary::-webkit-details-marker{display:none}.gov-table[size=s] table{border-bottom-left-radius:var(--corner-radius-s);border-bottom-right-radius:var(--corner-radius-s)}.gov-table[size=s] table th,.gov-table[size=s] table td{height:var(--height-2xl);padding:0 var(--spacing-s);font-size:var(--font-size-body-s);line-height:150%;font-weight:400}.gov-table[size=s] table th{font-weight:700}.gov-table[size=m] table{border-bottom-left-radius:var(--corner-radius-m);border-bottom-right-radius:var(--corner-radius-m)}.gov-table[size=m] table th,.gov-table[size=m] table td{height:var(--height-3xl);padding:0 var(--spacing-m);font-size:var(--font-size-body-m);line-height:150%;font-weight:400}.gov-table[size=m] table th{font-weight:700}.gov-table[size=l] table{border-bottom-left-radius:var(--corner-radius-l);border-bottom-right-radius:var(--corner-radius-l)}.gov-table[size=l] table th,.gov-table[size=l] table td{height:var(--height-4xl);padding:0 var(--spacing-l);font-size:var(--font-size-body-l);line-height:150%;font-weight:400}.gov-table[size=l] table th{font-weight:700}.gov-table-complex__name,.gov-table-complex__description{margin:0;color:var(--text-primary)}.gov-table-complex__actions{color:var(--text-white-fixed);background-color:var(--background-primary);padding:var(--spacing-xs) var(--spacing-s)}.gov-table-complex__per-page{width:185px;white-space:nowrap}.v-table__row{transition:background-color .18s ease;cursor:pointer}.v-table__row:hover>td{background-color:var(--gov-color-primary-50, #f5faff)!important}.v-table__row.gov-table--highlight:hover>td{background-color:var(--gov-color-primary-100, #e6f0ff)!important}.v-table__row[disable-custom-clicks],.v-table__row.disable-custom-clicks{cursor:default!important;pointer-events:auto}.v-table__row[disable-custom-clicks]:hover>td,.v-table__row.disable-custom-clicks:hover>td{background-color:transparent!important;background-color:var(--gov-color-primary-50, #c5dbf2)!important}\n"] }]
2986
+ }], propDecorators: { viewColumns: [{
2852
2987
  type: ContentChildren,
2853
2988
  args: [TABLE_COLUMN_PROVIDER]
2854
2989
  }], rowDetailTemplate: [{
@@ -2915,6 +3050,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.6", ngImpor
2915
3050
  type: Output
2916
3051
  }], save: [{
2917
3052
  type: Output
3053
+ }], tableRef: [{
3054
+ type: ViewChild,
3055
+ args: ['tableRef', { static: true }]
2918
3056
  }] } });
2919
3057
 
2920
3058
  var GovTagType;