{"version":3,"file":"sebgroup-green-angular-src-v-angular-table.mjs","sources":["../../../../libs/angular/src/v-angular/table/table.directive.ts","../../../../libs/angular/src/v-angular/table/table.tools.ts","../../../../libs/angular/src/v-angular/table/tr-thook.pipe.ts","../../../../libs/angular/src/v-angular/table/table.component.ts","../../../../libs/angular/src/v-angular/table/table.component.html","../../../../libs/angular/src/v-angular/table/table.module.ts","../../../../libs/angular/src/v-angular/table/index.ts","../../../../libs/angular/src/v-angular/table/sebgroup-green-angular-src-v-angular-table.ts"],"sourcesContent":["import { Directive, HostBinding, Input, TemplateRef } from '@angular/core'\n\nconst enum ColumnCSSClass {\n  Primary = 'gds-table__primary-col',\n  Sortable = 'gds-table__sortable-col',\n  Numeric = 'gds-table__numeric-col',\n  Negative = 'gds-table__negative-col',\n  Ascending = 'gds-table__sortable-col--asc',\n  Descending = 'gds-table__sortable-col--desc',\n}\n\n@Directive({\n    // eslint-disable-next-line @angular-eslint/directive-selector\n    selector: '[columnType]',\n    standalone: false\n})\nexport class TableDirective {\n  @Input() columnType: 'numeric' | 'text' | undefined = 'text'\n  @Input() sortable?: boolean\n  @Input() sortOrder?: 'desc' | 'asc'\n  @Input() value: any\n\n  @HostBinding('attr.data-thook') @Input() thook: string | null | undefined =\n    'table'\n\n  @HostBinding('class.' + ColumnCSSClass.Numeric) get numericColumn(): boolean {\n    return this.columnType === 'numeric'\n  }\n\n  @HostBinding('class.' + ColumnCSSClass.Sortable) get isSortable(): boolean {\n    return !!this.sortable\n  }\n\n  @HostBinding('class.' + ColumnCSSClass.Ascending)\n  get orderAscending(): boolean {\n    return this.sortOrder === 'asc' && !!this.sortable\n  }\n\n  @HostBinding('class.' + ColumnCSSClass.Descending)\n  get orderDescending(): boolean {\n    return this.sortOrder === 'desc' && !!this.sortable\n  }\n\n  @HostBinding('class.' + ColumnCSSClass.Negative)\n  get negativeValue(): boolean {\n    if (!isNaN(this.value)) return +this.value < 0\n    return false\n  }\n}\n\n@Directive({\n    // eslint-disable-next-line @angular-eslint/directive-selector\n    selector: '[tableColumn]',\n    standalone: false\n})\nexport class TableTemplateDirective<K = string> {\n  @Input() tableColumn!: K\n  @Input() tableColumnTarget?: 'th' | 'td' | 'both' = 'both'\n\n  constructor(public templateRef: TemplateRef<any>) {}\n}\n\n@Directive({\n    // eslint-disable-next-line @angular-eslint/directive-selector\n    selector: '[tableFooter]',\n    standalone: false\n})\nexport class TableFooterTemplateDirective {\n  constructor(public templateRef: TemplateRef<any>) {}\n}\n\n@Directive({\n    // eslint-disable-next-line @angular-eslint/directive-selector\n    selector: '[tableAppendableRows]',\n    standalone: false\n})\nexport class TableAppendableRowsTemplateDirective {\n  constructor(public templateRef: TemplateRef<any>) {}\n}\n","const getKeyValue = <T, K extends keyof T>(obj: T, key: K): T[K] => obj[key]\n\nexport const pick = (\n  propertyArray: Array<string>,\n  object: { [key: string]: unknown },\n): object => {\n  if (object instanceof Object) {\n    return propertyArray.reduce(\n      (acc: object, curr: string) => ({\n        ...acc,\n        [curr]: getKeyValue(object, curr),\n      }),\n      {},\n    )\n  }\n  throw Error('The value for argument \"object\" must be an object')\n}\n\nexport const orderByDescending = <T>(\n  property: keyof T | string,\n): ((a: any, b: any) => number) => {\n  return (a: any, b: any) => {\n    if (a[property] > b[property]) return -1\n    if (a[property] < b[property]) return 1\n    return 0\n  }\n}\n\nexport const orderByAscending = <T>(\n  property: keyof T | string,\n): ((a: any, b: any) => number) => {\n  return (a: any, b: any) => {\n    if (a[property] < b[property]) return -1\n    if (a[property] > b[property]) return 1\n    return 0\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core'\n\n@Pipe({\n  name: 'trThook',\n  standalone: true,\n})\nexport class TrThookPipe implements PipeTransform {\n  transform<V>(\n    value: V,\n    index: number,\n    thookFn?: (rowData: V) => string,\n  ): string {\n    // call thook fn to set thook for active row\n    if (thookFn != null) {\n      return thookFn(value)\n    }\n\n    // default thook\n    return `table-row-${index}`\n  }\n}\n","import {\n  AfterContentInit,\n  Component,\n  ContentChild,\n  ContentChildren,\n  EventEmitter,\n  Input,\n  OnChanges,\n  OnDestroy,\n  OnInit,\n  Output,\n  QueryList,\n  SimpleChanges,\n  TemplateRef,\n} from '@angular/core'\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms'\nimport { Subscription } from 'rxjs'\nimport { debounceTime, map } from 'rxjs/operators'\n\nimport {\n  TableAppendableRowsTemplateDirective,\n  TableFooterTemplateDirective,\n  TableTemplateDirective,\n} from './table.directive'\nimport {\n  ariaLabelsOrderBy,\n  OrderBy,\n  TableColumn,\n  TableRow,\n} from './table.models'\nimport { orderByAscending, orderByDescending, pick } from './table.tools'\n\nlet staticInitId = 0\n\nfunction objectFromEntries(entryMap: Map<any, any>): { [key: string]: any } {\n  const fromEntries: { [key: string]: any } = {}\n  for (const [key, value] of entryMap) {\n    fromEntries[key] = value\n  }\n  return fromEntries\n}\n\n/**\n * A table component with built-in sorting and selecting functionality.\n * By default, table cells (i.e. `<td>` elements) and table headers (i.e. `<th>` elements) are populated with text only values.\n *\n * To customize the contents of either the `<td>` or `<th>` elements (like adding color, icons, form fields, extra padding etc.), provide\n * the customized content within a `<ng-template>`-tag, and place the ng-template in the html between the start and ending tag of\n * the `<nggv-table>`. Add a `tableColumn`-attribute to the `<ng-template>`-element, and set the value to the specific column property.\n * Set `tableColumnTarget` to either `th`, `td` or `both` (default) depending on target element type.\n * The entire row from the `@Input() tableData` is available from the context `$implicit` variable.\n *\n * @example\n * <!-- for table cells i.e. td-elements -->\n * <ng-template tableColumn=\"status\" tableColumnTarget=\"td\" let-myDataVar=\"$implicit\" let-status=\"$implicit.status\">\n *  <!-- my custom status element -->\n * </ng-template>\n *\n * @example\n * <!-- for table headers i.e. th-elements -->\n * <ng-template tableColumn=\"status\" tableColumnTarget=\"th\" let-myDataVar=\"$implicit\" let-status=\"$implicit.status\">\n *  <!-- my custom status element -->\n * </ng-template>\n *\n * It is possible to add custom rows that are appended below data row. Use `<ng-template>`-tag and place the ng-template in the html between the start and ending tag of\n * the `<nggv-table>`. Add a `tableAppendableRows`-attribute to the `<ng-template>`-element. Any `tr` elements that exist within `<ng-template tableAppendableRows>` and `</ng-template>` tags will be put below data row's `tr` element in the table.\n *\n * @example\n * <!-- custom appended rows -->\n * <ng-template tableAppendableRows let-myDataVar=\"$implicit\" let-status=\"$implicit.status\">\n *  <tr>\n *   <!-- first row's columns -->\n *  </tr>\n *  <!-- more rows if needed -->\n * </ng-template>\n *\n * If custom styling is needed for data row that has appended rows, you can use data attribute `data-hasrowspan` to distinguish it from data row without appended rows.\n * You can pass your own custom method with conditional logic to define what value will be passed to data-hasrowspan.\n * In addition, hasRowSpan function accepts item from `@Input() tableData` as argument which is of the same type as value passed to context `$implicit` variable.\n * IMPORTANT: use arrow function style for defining function inside component, i.e. `hasRowSpan = (value) => output;`. If regular function will be defined, i.e. `hasRowSpan(value) { return output; }`, binding will not work.\n *\n * @example\n * <!-- inside component\n * class CustomComponent {\n *  customHasRowSpanFunction = (item: CustomDataType) => item.appendedRowsData.length > 0 ? true : false;\n * }\n * -->\n * <!-- inside stylesheets\n * [data-hasrowspan=\"true\"] {\n *  color: blue;\n * }\n * .appended-row {\n *  color: blue;\n * }\n * -->\n * <nggv-table [hasRowSpan]=\"customHasRowSpanFunction\">\n *  <!-- custom appended rows -->\n *  <ng-template tableAppendableRows let-appendedRowsData=\"$implicit.appendedRowsData\">\n *   <tr *ngFor=\"let appendedRowItem of appendedRowsData\" class=\"appended-row\">\n *    <td>{{ appendedRowItem }}</td>\n *    <!-- other row's columns -->\n *   </tr>\n *  </ng-template>\n * </nggv-table>\n *\n * In addition, it is possible to add footer for the table. Similarly to adding custom columns, use `<ng-template>`-tag and place the ng-template in the html between the start and ending tag of\n * the `<nggv-table>`. Add a `tableFooter`-attribute to the `<ng-template>`-element. Any elements that exist within `<ng-template tableFooter>` and `</ng-template>` tags will be put to tfoot element inside the table.\n *\n * @example\n * <!-- for table footer i.e. tfoot-element -->\n * <ng-template tableFooter>\n *  <tr>\n *   <!-- first row's columns -->\n *  </tr>\n *  <!-- more rows if needed -->\n * </ng-template>\n *\n */\n@Component({\n    selector: 'nggv-table',\n    templateUrl: './table.component.html',\n    styleUrls: ['./table.component.scss'],\n    standalone: false\n})\nexport class TableComponent<T extends TableRow>\n  implements OnInit, OnChanges, AfterContentInit, OnDestroy {\n  /**\n   * @internal\n   * Custom templates defined in the html.\n   */\n  @ContentChildren(TableTemplateDirective, { descendants: true })\n  customTemplates!: QueryList<TableTemplateDirective<keyof T>>\n\n  /**\n   * @internal\n   * Custom appended rows template defined in the html.\n   */\n  @ContentChild(TableAppendableRowsTemplateDirective)\n  appendedRowsTemplate!: TableAppendableRowsTemplateDirective\n\n  /**\n   * @internal\n   * Custom footer template defined in the html.\n   */\n  @ContentChild(TableFooterTemplateDirective)\n  customFooterTemplate!: TableFooterTemplateDirective\n\n  /** Emits the table row that was clicked. Works on all columns if not preventDefaultEmit is set for that column. */\n  @Output() ngvRowClick = new EventEmitter<T | any>()\n\n  /**\n   * Emits currently selected and deselected items in the table as key-value pairs.\n   * Uses each item`s itemId as key, and a boolean value to describe selected status.\n   */\n  @Output() ngvRowSelect = new EventEmitter<string[]>()\n\n  /**\n   * Emits event to signal that the table should be reordered.\n   */\n  @Output() ngvOrderBy = new EventEmitter<OrderBy<T>>()\n\n  /**\n   * An array of items describing how the table header should be rendered,\n   * together with instructions for how each row should be displayed in that column.\n   */\n  @Input() tableColumns!: TableColumn<T>[]\n\n  /** Data array to display data in the table. Each item <T> in the array represents a row in the table. */\n  @Input() tableData!: T[]\n\n  /**\n   * Property name used to uniquely describe each item (i.e. row) in the data table.\n   * Defaults to \\'id\\'.\n   * Is required if selectable is true.\n   */\n  @Input() rowId = 'id'\n\n  /**\n   * Function's return value is used for data attribute \\'data-hasrowspan\\'.\n   * If custom hasRowSpan function is not passed to the table,\n   * then this function returns undefined value by default which results in \\'data-hasrowspan\\' attribute being omitted in html\n   * (angular omits attributes that contain null or undefined value).\n   * IMPORTANT: use arrow function style for defining function inside component, i.e. `hasRowSpan = (value) => output;`. If regular function will be defined, i.e. `hasRowSpan(value) { return output; }`, binding will not work.\n   */\n  @Input() hasRowSpan: (item: T) => any = (_) => undefined\n\n  /**\n   * Used to enable/disable the left-side checkbox column.\n   * Defaults to true.\n   */\n  @Input() selectable = true\n\n  /**\n   * Array of row id's (as defined by rowId property) that should not have a checkbox even if selectable is true.\n   */\n  @Input() hiddenCheckboxRowIds: string[] = []\n\n  /**\n   * Used to enable/disable expandable rows.\n   * Defaults to false.\n   */\n  @Input() expandable = false\n\n  /**\n   * Used to enable/disable the right-side expand icon column.\n   * Defaults to true.\n   */\n  @Input() expandedByDefault = true\n\n  /**\n   * Property name used to describe the subItems in the data table.\n   */\n  @Input() subItemsProp = 'subItems'\n\n  /**\n   * Allow nggv-table to attempt sorting the data in the table. Not recommended if only a subset is loaded or if the dataset is very large.\n   * Disabled by default.\n   */\n  @Input() allowLocalSort = false\n\n  /** Special property used for selecting DOM elements during automated UI testing. */\n  @Input() thook = 'table-select-all'\n\n  /** Function to overwrite generated thook for each row. */\n  @Input() trThookFn?: (item: T) => string\n\n  /** Aria label for the checkbox in the table header */\n  @Input() ariaLabelCheckboxTh?: string\n\n  /** Aria label for the checkbox in the table header */\n  @Input() ariaLabelCheckboxTr?: string\n\n  /** Aria labels for sorting in the table header */\n  @Input() ariaLabelsOrderBy?: ariaLabelsOrderBy\n\n  /**\n   * @internal\n   * Internal data structure used to keep track of added content templates used in td elements.\n   */\n  customRowTemplates = new Map<keyof T, TemplateRef<any>>()\n\n  /**\n   * @internal\n   * Internal data structure used to keep track of added content templates used in th elements.\n   */\n  customHeaderTemplates = new Map<keyof T, TemplateRef<any>>()\n\n  /**\n   * @internal\n   * Internal data structure used to hold custom appended rows i.e. tr elements (rows).\n   */\n  appendedRowsTemplateRef!: TemplateRef<any>\n\n  /**\n   * @internal\n   * Internal data structure used to hold tfoot element children i.e. tr elements (rows).\n   */\n  customFooterTemplateRef!: TemplateRef<any>\n\n  /**\n   * @internal\n   * Incremental id.\n   */\n  initId!: number\n\n  /**\n   * @internal\n   * FormGroup containing all row id\\'s as controls, and whether these are selected or not as values.\n   */\n  rowSelectors: UntypedFormGroup = new UntypedFormGroup({})\n\n  /**\n   * @internal\n   * Master selector for selecting or deselecting all row selectors.\n   */\n  groupSelector: UntypedFormControl = new UntypedFormControl(false)\n\n  private selected: string[] = []\n  private subs: Subscription[] = []\n\n  ngOnChanges(changes: SimpleChanges) {\n    // Update selectable or expandable rows if table data or settings change\n    if (\n      (this.selectable || this.expandable) && changes.tableData?.currentValue ||\n      (changes.selectable?.currentValue || changes.expandable?.currentValue) && this.tableData\n    ) {\n      const wasChanged = this.registerSelectableRows(\n        changes.tableData.currentValue,\n      )\n      if (wasChanged && !this.subs.length) {\n        // first time this is run\n        const groupSelectorSub = this.groupValueSubscription\n        const rowSelectorSub = this.rowValueSubscription\n        this.subs.push(groupSelectorSub, rowSelectorSub)\n      } else if (wasChanged) {\n        this.rowSelectors.updateValueAndValidity()\n      }\n    }\n\n    // sort any incoming data\n    if (\n      this.allowLocalSort &&\n      (changes.tableData?.currentValue || changes.tableColumns?.currentValue)\n    ) {\n      const orderedByColumn: TableColumn<T> | undefined =\n        this.tableColumns?.find((el) => el.order !== undefined)\n      if (orderedByColumn) this.sortItemsBy(orderedByColumn)\n    }\n  }\n\n  ngOnInit(): void {\n    this.initId = staticInitId++\n  }\n\n  ngAfterContentInit() {\n    // if any custom templates were defined in the template\n    if (this.customTemplates.length) {\n      // for each template found\n      this.customTemplates.map((tableTemplate) => {\n        // if target is either 'td' or 'both'\n        if (\n          ['td', 'both'].includes(tableTemplate.tableColumnTarget as string)\n        ) {\n          // add to custom row templates\n          this.customRowTemplates.set(\n            tableTemplate.tableColumn,\n            tableTemplate.templateRef,\n          )\n        }\n        // if target is either 'th' or 'both'\n        if (\n          ['th', 'both'].includes(tableTemplate.tableColumnTarget as string)\n        ) {\n          // add to custom header templates\n          this.customHeaderTemplates.set(\n            tableTemplate.tableColumn,\n            tableTemplate.templateRef,\n          )\n        }\n      })\n    }\n\n    // if appended rows' template is defined in the template\n    if (this.appendedRowsTemplate) {\n      // set templateRef of appended rows' template to variable\n      this.appendedRowsTemplateRef = this.appendedRowsTemplate.templateRef\n    }\n\n    // if custom footer template is defined in the template\n    if (this.customFooterTemplate) {\n      // set templateRef of table footer to variable\n      this.customFooterTemplateRef = this.customFooterTemplate.templateRef\n    }\n\n    // if expandedByDefault is true, then expand all rows\n    if (this.expandedByDefault && this.expandable && this.tableData) {\n      this.tableData.forEach((item) => {\n        this.toggleRowToExpand(item[this.rowId])\n      })\n    }\n  }\n\n  ngOnDestroy() {\n    this.subs.forEach((sub) => sub.unsubscribe())\n  }\n\n  /**\n   * @internal\n   * Returns a subscription to the master selector control that either selects or deselects all row controls.\n   */\n  get groupValueSubscription(): Subscription {\n    return this.groupSelector.valueChanges.subscribe({\n      next: (value: boolean) => {\n        const selectMap = new Map(Object.entries(this.rowSelectorsValue))\n        selectMap.forEach((_, key) => selectMap.set(key, value))\n        const patchValue = objectFromEntries(selectMap)\n        this.rowSelectors.patchValue(patchValue)\n      },\n    })\n  }\n\n  /**\n   * @internal\n   * Returns a subscription to all individual row selectors and update the master selector if all are selected.\n   */\n  get rowValueSubscription(): Subscription {\n    return this.rowSelectors.valueChanges\n      .pipe(\n        debounceTime(0), // to limit the number of events and to wait for all sub controls to update\n        map((val: { [key: string]: boolean }) => {\n          // get a filtered array of keys for all rows that are selected\n          const selected = Object.keys(val).filter((key) => {\n            return val[key] === true && this.rowSelectors.get(key)?.enabled\n          })\n          // returns an object containing only the filtered keys\n          return pick(selected, val)\n        }),\n      )\n      .subscribe({\n        next: (value: object) => {\n          // the number of selected keys compared to the total number of keys available\n          const numberOfSelected = Object.keys(value).length\n          const allSelected: boolean =\n            numberOfSelected > 0\n              ? numberOfSelected === Object.keys(this.rowSelectorsValue).length\n              : false\n          // update the master selector control\n          this.groupSelector.setValue(allSelected, { emitEvent: false })\n          // update the array of currently selected id's\n          this.selected = Object.keys(value)\n          // and emit the updated value\n          this.ngvRowSelect.emit(this.selected)\n        },\n      })\n  }\n\n  /**\n   * @internal\n   * Registers or disables row controls for new or removed rows.\n   */\n  registerSelectableRows(tableData: any[]): boolean {\n    if (!tableData) return false\n    // Array containing only the id's for each row\n    const dataRowIds: string[] = tableData.map((data: any) => data[this.rowId])\n\n    // Array containing the id's that have registered controls\n    const currentIds: string[] = Object.keys(this.rowSelectorsValue)\n\n    // Array containing all ids that lacks a corresponding control (i.e. new rows)\n    const newIds: string[] = dataRowIds.filter(\n      (id) => currentIds.indexOf(id) === -1,\n    )\n\n    // Array containing all ids that has a control but is no longer in the data set (i.e. removed rows)\n    const removedIds: string[] = currentIds.filter(\n      (id) => dataRowIds.indexOf(id) === -1,\n    )\n\n    // Register new controls for added rows\n    if (newIds.length) {\n      newIds.forEach((id) => {\n        const ctrl = this.rowSelectors.registerControl(\n          id,\n          new UntypedFormControl(false),\n        )\n        if (ctrl.disabled) ctrl.enable()\n      })\n    }\n\n    // Set already registered controls to disabled for removed rows\n    if (removedIds.length)\n      removedIds.forEach((id) => this.rowSelectors.get(id)?.disable())\n\n    return newIds.length > 0 || removedIds.length > 0\n  }\n\n  /**\n   * @internal\n   * Returns all enabled values unless all rows are disabled.\n   */\n  get rowSelectorsValue(): any {\n    return this.rowSelectors.enabled ? this.rowSelectors.value : {}\n  }\n\n  toggleSortOrderWithSpace(event: any, column: TableColumn<T>) {\n    if (column.sortable) {\n      event.preventDefault()\n      this.toggleSortOrder(column)\n    }\n  }\n\n  /**\n   * @internal\n   * Switches sorting order between ascending and descending order for a column.\n   * @param column the column to sort rows after.\n   */\n  toggleSortOrder(column: TableColumn<T>) {\n    // check if the table is already sorted by another column than the one provided\n    const currentlyOrderedBy = this.tableColumns?.find(\n      (el) => el !== column && el.order !== undefined,\n    )\n    if (currentlyOrderedBy) delete currentlyOrderedBy.order\n    column.order = column.order === 'desc' ? 'asc' : 'desc'\n    this.sortItemsBy(column)\n  }\n\n  /** If sortable, reorders the table data using the specified column as ordering attribute. */\n  sortItemsBy(column: TableColumn<T>): TableRow[] | undefined {\n    if (!column.sortable) return\n    // emit re-order event\n    this.ngvOrderBy.emit({ property: column.property, order: column.order })\n    // if local sort is allowed, reorder data\n    if (!this.allowLocalSort || !this.tableData) return\n    return this.tableData.sort(\n      column.order === 'desc'\n        ? orderByDescending(column.property)\n        : orderByAscending(column.property),\n    )\n  }\n\n  /**\n   * @internal\n   * Emits row data for what row was clicked if defaultEmit is allowed.\n   */\n  propagateItemClick(item: any, preventDefaultEmit?: boolean) {\n    if (!preventDefaultEmit) this.ngvRowClick.emit(item)\n\n    if (this.expandable && item[this.subItemsProp]) {\n      this.toggleRowToExpand(item[this.rowId])\n    }\n  }\n\n  getAriaLabel(column: TableColumn<T>): string | undefined {\n    const sortOrder =\n      column.order === 'asc'\n        ? this.ariaLabelsOrderBy?.desc\n        : this.ariaLabelsOrderBy?.asc\n    if (!sortOrder) return // no aria labels defined\n    return column.ariaLabelSortable?.replace('{{sortOrder}}', sortOrder)\n  }\n\n  private toggleRowToExpand(id: string): void {\n    const row = this.rowSelectors.get(id)\n    row?.setValue(!row.value)\n  }\n}\n","<ng-template #sortableThTemplate let-column>\n  <button class=\"gds-table-sort\" *transloco=\"let t\">\n    <ng-template #thButtonTemplate>\n      {{ t(column.label ?? '') }}\n    </ng-template>\n    <ng-container\n      *ngIf=\"\n        customHeaderTemplates.get(column.property) as thTemplate;\n        else thButtonTemplate\n      \"\n    >\n      <ng-template\n        *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n      >\n      </ng-template>\n    </ng-container>\n  </button>\n</ng-template>\n\n<ng-template #notSortableThTemplate let-column>\n  <ng-template #defaultThTemplate>\n    <ng-container *transloco=\"let t\">\n      {{ t(column.label ?? '') }}\n    </ng-container>\n  </ng-template>\n  <ng-container\n    *ngIf=\"\n      customHeaderTemplates.get(column.property) as thTemplate;\n      else defaultThTemplate\n    \"\n  >\n    <ng-template\n      *ngTemplateOutlet=\"thTemplate || null; context: { $implicit: column }\"\n    >\n    </ng-template>\n  </ng-container>\n</ng-template>\n<table class=\"gds-table\" *transloco=\"let t\">\n  <!-- Table header -->\n  <thead>\n    <tr>\n      <!-- Checkbox column for header -->\n      <th *ngIf=\"selectable\" class=\"column__check\">\n        <div class=\"gds-field-checkbox-wrap\">\n          <label\n            [attr.for]=\"'cb_header__' + initId\"\n            class=\"gds-form-control\"\n            id=\"thead-checkbox\"\n          >\n            <input\n              type=\"checkbox\"\n              [formControl]=\"groupSelector\"\n              [attr.aria-label]=\"ariaLabelCheckboxTh\"\n              [attr.id]=\"'cb_header__' + initId\"\n              [attr.data-thook]=\"thook\"\n            />\n            <i></i>\n          </label>\n        </div>\n      </th>\n\n      <!-- Other columns -->\n      <th\n        *ngFor=\"let column of tableColumns\"\n        [columnType]=\"column.valueType\"\n        [sortable]=\"column.sortable\"\n        [sortOrder]=\"column.order\"\n        [thook]=\"'column-header-' + !!column.property\"\n        (click)=\"toggleSortOrder(column)\"\n        (keydown.space)=\"toggleSortOrderWithSpace($event, column)\"\n        [attr.aria-label]=\"getAriaLabel(column)\"\n        [attr.aria-sort]=\"column.order + 'ending'\"\n      >\n        <ng-container *ngIf=\"column.sortable\">\n          <ng-container\n            *ngTemplateOutlet=\"\n              sortableThTemplate;\n              context: { $implicit: column, column: column }\n            \"\n          >\n          </ng-container>\n        </ng-container>\n        <ng-container *ngIf=\"!column.sortable\">\n          <ng-container\n            *ngTemplateOutlet=\"\n              notSortableThTemplate;\n              context: { $implicit: column, column: column }\n            \"\n          >\n          </ng-container>\n        </ng-container>\n      </th>\n    </tr>\n  </thead>\n\n  <!-- Table body -->\n  <tbody [formGroup]=\"rowSelectors\">\n    <ng-container *ngFor=\"let item of tableData; let i = index\">\n      <tr\n        [class.row__expand]=\"expandable\"\n        [attr.data-thook]=\"item | trThook: i : trThookFn\"\n        [attr.data-hasrowspan]=\"hasRowSpan(item)\"\n      >\n        <!-- Checkbox column for row -->\n        <td *ngIf=\"selectable\" class=\"column__check\">\n          <div\n            *ngIf=\"!hiddenCheckboxRowIds.includes(item[rowId])\"\n            class=\"gds-field-checkbox-wrap\"\n          >\n            <label\n              [attr.for]=\"'cb_row__' + initId + '_' + i\"\n              class=\"gds-form-control\"\n            >\n              <input\n                *ngIf=\"rowSelectors.get(item[rowId])\"\n                type=\"checkbox\"\n                [formControlName]=\"item[rowId]\"\n                [attr.aria-label]=\"ariaLabelCheckboxTr\"\n                [attr.id]=\"'cb_row__' + initId + '_' + i\"\n                [attr.data-thook]=\"'row-select-' + i\"\n              />\n              <i></i>\n            </label>\n          </div>\n        </td>\n\n        <!-- Other columns -->\n        <td\n          *ngFor=\"let column of tableColumns; let i = index\"\n          [columnType]=\"column.valueType\"\n          [value]=\"item[column.property]\"\n          (click)=\"propagateItemClick(item, column.preventDefaultClickEvent)\"\n        >\n          <ng-container\n            *ngIf=\"expandable && i === 0; else nonExpandableTemplate\"\n          >\n            <div\n              class=\"gds-item-field-wrap\"\n              [ngClass]=\"{ 'no-sub-items': item.subItems.length === 0 }\"\n            >\n              <span\n                *ngIf=\"item.subItems.length > 0\"\n                role=\"button\"\n                tabindex=\"0\"\n                class=\"chevron-field\"\n                [attr.aria-expanded]=\"rowSelectors.get(item[rowId])?.value\"\n              >\n                <svg\n                  width=\"20\"\n                  height=\"20\"\n                  viewBox=\"0 0 24 24\"\n                  fill=\"none\"\n                  xmlns=\"http://www.w3.org/2000/svg\"\n                >\n                  <path\n                    d=\"M20 9L12 17L4 9\"\n                    stroke=\"currentColor\"\n                    stroke-width=\"1.6\"\n                    stroke-linecap=\"round\"\n                    stroke-linejoin=\"round\"\n                  />\n                </svg>\n              </span>\n              <span class=\"gds-item-field-text\">\n                {{ item[column.property] }} ({{ item.subItems.length }})\n                <div\n                  *ngIf=\"column.columnLabel\"\n                  class=\"gds-item-field-extra-label\"\n                >\n                  {{ item[column.columnLabel] }}\n                </div>\n              </span>\n            </div>\n          </ng-container>\n\n          <ng-template #nonExpandableTemplate>\n            <ng-container\n              *ngIf=\"\n                customRowTemplates.get(column.property) as tdTemplate;\n                else defaultTdTemplate\n              \"\n            >\n              <ng-template\n                *ngTemplateOutlet=\"tdTemplate; context: { $implicit: item }\"\n              >\n              </ng-template>\n            </ng-container>\n            <ng-template #defaultTdTemplate>\n              {{ item[column.property] }}\n            </ng-template>\n          </ng-template>\n        </td>\n      </tr>\n\n      <!-- Expanded Sub Items -->\n      <ng-container *ngIf=\"expandable && rowSelectors.get(item[rowId])?.value\">\n        <tr *ngFor=\"let subItem of item[subItemsProp]\">\n          <td\n            *ngFor=\"let column of tableColumns\"\n            class=\"web-view\"\n            [columnType]=\"column.valueType\"\n            [value]=\"subItem[column.property]\"\n            (click)=\"\n              propagateItemClick(subItem, column.preventDefaultClickEvent)\n            \"\n          >\n            <ng-container\n              *ngIf=\"\n                customRowTemplates.get(column.property) as tdTemplate;\n                else defaultTdTemplate\n              \"\n            >\n              <ng-template\n                *ngTemplateOutlet=\"tdTemplate; context: { $implicit: subItem }\"\n              >\n              </ng-template>\n            </ng-container>\n            <ng-template #defaultTdTemplate>\n              {{ subItem[column.property] }}\n            </ng-template>\n          </td>\n\n          <td\n            class=\"mobile-view\"\n            [attr.colspan]=\"tableColumns.length\"\n            (click)=\"propagateItemClick(subItem)\"\n          >\n            <dl class=\"mobile-view-field-wrap\">\n              <ng-container *ngFor=\"let column of tableColumns\">\n                <div\n                  *ngIf=\"!column.hidePropertyOnMobile\"\n                  class=\"mobile-view-field\"\n                  [columnType]=\"column.valueType\"\n                  [value]=\"subItem[column.property]\"\n                >\n                  <dt *ngIf=\"!column.hideLabelOnMobile\">\n                    <ng-container *transloco=\"let t\">\n                      {{ t(column.label ?? '') }}\n                    </ng-container>\n                  </dt>\n                  <dd\n                    [ngStyle]=\"\n                      column.boldTextOnMobile\n                        ? { 'font-weight': '500' }\n                        : { 'font-weight': '400' }\n                    \"\n                  >\n                    <ng-container\n                      *ngIf=\"\n                        customRowTemplates.get(column.property) as tdTemplate;\n                        else defaultTdTemplate\n                      \"\n                    >\n                      <ng-template\n                        *ngTemplateOutlet=\"\n                          tdTemplate;\n                          context: { $implicit: subItem }\n                        \"\n                      ></ng-template>\n                    </ng-container>\n                    <ng-template #defaultTdTemplate>\n                      {{ subItem[column.property] }}\n                    </ng-template>\n                  </dd>\n                  <ng-content></ng-content>\n                </div>\n              </ng-container>\n            </dl>\n            <span\n              role=\"button\"\n              tabindex=\"0\"\n              class=\"nav-chevron-field\"\n              [attr.aria-expanded]=\"rowSelectors.get(item[rowId])?.value\"\n            >\n              <svg\n                width=\"20\"\n                height=\"20\"\n                viewBox=\"0 0 24 24\"\n                fill=\"none\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n              >\n                <path\n                  d=\"M20 9L12 17L4 9\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"1.6\"\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                />\n              </svg>\n            </span>\n          </td>\n        </tr>\n      </ng-container>\n\n      <!-- Custom appended rows -->\n      <ng-container *ngIf=\"appendedRowsTemplateRef as trTemplate\">\n        <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n        <ng-container\n          *ngTemplateOutlet=\"trTemplate || null; context: { $implicit: item }\"\n        >\n        </ng-container>\n      </ng-container>\n    </ng-container>\n  </tbody>\n\n  <!-- Table footer -->\n  <tfoot *ngIf=\"customFooterTemplateRef as trTemplate\">\n    <!-- Cannot infer trTemplate as TemplateRef therefore null -->\n    <ng-container *ngTemplateOutlet=\"trTemplate || null\"> </ng-container>\n  </tfoot>\n</table>\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { ReactiveFormsModule } from '@angular/forms'\nimport { TranslocoModule } from '@jsverse/transloco'\n\nimport { TableComponent } from './table.component'\nimport {\n  TableAppendableRowsTemplateDirective,\n  TableDirective,\n  TableFooterTemplateDirective,\n  TableTemplateDirective,\n} from './table.directive'\nimport { TrThookPipe } from './tr-thook.pipe'\n\n@NgModule({\n  declarations: [\n    TableComponent,\n    TableDirective,\n    TableTemplateDirective,\n    TableFooterTemplateDirective,\n    TableAppendableRowsTemplateDirective,\n  ],\n  imports: [CommonModule, ReactiveFormsModule, TranslocoModule, TrThookPipe],\n  exports: [\n    TableComponent,\n    TableTemplateDirective,\n    TableFooterTemplateDirective,\n    TableAppendableRowsTemplateDirective,\n  ],\n})\nexport class NggvTableModule {}\n","/*\n * Public API Surface of table\n */\n\nexport * from './table.component'\nexport * from './table.directive'\nexport * from './tr-thook.pipe'\nexport * from './table.models'\nexport * from './table.module'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4.TableDirective","i5.TrThookPipe"],"mappings":"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"}