@rivet-health/design-system 40.35.0 → 40.35.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.
@@ -8657,6 +8657,48 @@ var TableResultHelpers;
8657
8657
 
8658
8658
  var TableSearchHelpers;
8659
8659
  (function (TableSearchHelpers) {
8660
+ /**
8661
+ * The configured fuse options, without the keys for columns search does not
8662
+ * cover: the ones marked `searchable: false` and the ones turned off in
8663
+ * "Search in". Keys that don't belong to a column are left alone.
8664
+ */
8665
+ function fuseOptionsForSearchColumns(fuseOptions, columns, query) {
8666
+ if (!(fuseOptions === null || fuseOptions === void 0 ? void 0 : fuseOptions.keys))
8667
+ return fuseOptions;
8668
+ const excludedPaths = new Set(Array.from(columns.entries())
8669
+ .filter(([key, column]) => column.searchable === false ||
8670
+ query.searchColumns.get(key) === false)
8671
+ .map(([key, column]) => columnPath(key, column)));
8672
+ return Object.assign(Object.assign({}, fuseOptions), { keys: fuseOptions.keys.filter(key => !excludedPaths.has(fuseKeyPath(key))) });
8673
+ }
8674
+ TableSearchHelpers.fuseOptionsForSearchColumns = fuseOptionsForSearchColumns;
8675
+ /**
8676
+ * Marks the columns with no key in `fuseOptions.keys` as `searchable: false`,
8677
+ * so "Search in" only offers columns that search can cover.
8678
+ */
8679
+ function markColumnsOutsideFuseKeysUnsearchable(columns, fuseOptions) {
8680
+ if (!(fuseOptions === null || fuseOptions === void 0 ? void 0 : fuseOptions.keys))
8681
+ return columns;
8682
+ const keyPaths = new Set(fuseOptions.keys.map(fuseKeyPath));
8683
+ return new Map(Array.from(columns.entries()).map(([key, column]) => [
8684
+ key,
8685
+ keyPaths.has(columnPath(key, column))
8686
+ ? column
8687
+ : Object.assign(Object.assign({}, column), { searchable: false }),
8688
+ ]));
8689
+ }
8690
+ TableSearchHelpers.markColumnsOutsideFuseKeysUnsearchable = markColumnsOutsideFuseKeysUnsearchable;
8691
+ function columnPath(key, column) {
8692
+ var _a, _b;
8693
+ return (_b = (_a = column.orderKey) === null || _a === void 0 ? void 0 : _a.toString()) !== null && _b !== void 0 ? _b : key.toString();
8694
+ }
8695
+ function fuseKeyPath(key) {
8696
+ if (typeof key === 'string')
8697
+ return key;
8698
+ if (Array.isArray(key))
8699
+ return key.join('.');
8700
+ return Array.isArray(key.name) ? key.name.join('.') : key.name;
8701
+ }
8660
8702
  function getSearchColumnsSelectedState(state, expectedValue) {
8661
8703
  switch (expectedValue) {
8662
8704
  case 'all':
@@ -9628,41 +9670,19 @@ var RivTable;
9628
9670
  */
9629
9671
  RivTable.NestedPaginateByOptions = ['bottomRows', 'topRows'];
9630
9672
  function createInMemoryManager(fetchDataset, columns, pluralEntityName, options) {
9673
+ columns = TableSearchHelpers.markColumnsOutsideFuseKeysUnsearchable(columns, options === null || options === void 0 ? void 0 : options.fuseOptions);
9631
9674
  let data;
9632
9675
  let fuse;
9633
9676
  const source = (query, mostRecentAction) => __awaiter(this, void 0, void 0, function* () {
9634
- var _a, _b, _c, _d;
9635
- //For inMemoryManagers that do not utilize searchColumns,
9636
- //we do not want to overwrite their fuseOptions
9637
- if (mostRecentAction.type === 'load') {
9638
- //Prevent searching on columns that are in fuse options but not supported by search.
9639
- const nonSearchableColumnsKeys = ((_a = options === null || options === void 0 ? void 0 : options.fuseOptions) === null || _a === void 0 ? void 0 : _a.keys)
9640
- ? Array.from(columns.entries())
9641
- .filter(([key, column]) => {
9642
- return column.searchable == false;
9643
- })
9644
- .map(([key, column]) => {
9645
- var _a;
9646
- return ((_a = column.orderKey) === null || _a === void 0 ? void 0 : _a.toString()) || key.toString();
9647
- })
9648
- : undefined;
9649
- const fuseOptions = (options === null || options === void 0 ? void 0 : options.fuseOptions) && nonSearchableColumnsKeys
9650
- ? Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.fuseOptions), { keys: (_c = (_b = options === null || options === void 0 ? void 0 : options.fuseOptions) === null || _b === void 0 ? void 0 : _b.keys) === null || _c === void 0 ? void 0 : _c.filter(k => !nonSearchableColumnsKeys.includes(k.toString())) }) : options === null || options === void 0 ? void 0 : options.fuseOptions;
9651
- data = yield fetchDataset();
9652
- fuse = new Fuse(data, fuseOptions);
9653
- }
9654
- if (mostRecentAction.type === 'searchColumnsChange' ||
9677
+ var _a;
9678
+ if (mostRecentAction.type === 'load' ||
9679
+ mostRecentAction.type === 'searchColumnsChange' ||
9655
9680
  mostRecentAction.type === 'toggleAllSearchColumns') {
9656
9681
  data = yield fetchDataset();
9657
- fuse = new Fuse(data, Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.fuseOptions), { keys: Array.from(query.searchColumns.entries())
9658
- .filter(([_, value]) => !!value)
9659
- .map(([key, _]) => {
9660
- const columnKey = columns.get(key);
9661
- return (columnKey === null || columnKey === void 0 ? void 0 : columnKey.orderKey) || key;
9662
- }) }));
9682
+ fuse = new Fuse(data, TableSearchHelpers.fuseOptionsForSearchColumns(options === null || options === void 0 ? void 0 : options.fuseOptions, columns, query));
9663
9683
  }
9664
9684
  const orderColumn = query.order
9665
- ? (_d = columns.get(query.order.column)) === null || _d === void 0 ? void 0 : _d.orderKey
9685
+ ? (_a = columns.get(query.order.column)) === null || _a === void 0 ? void 0 : _a.orderKey
9666
9686
  : undefined;
9667
9687
  const hasExplicitSort = query.order != null && orderColumn !== undefined;
9668
9688
  const defaultSortSpec = (() => {
@@ -9716,45 +9736,22 @@ var RivTable;
9716
9736
  }
9717
9737
  RivTable.createInMemoryManager = createInMemoryManager;
9718
9738
  function createInMemoryManagerNested(fetchDataset, columns, pluralEntityName, options) {
9739
+ columns = TableSearchHelpers.markColumnsOutsideFuseKeysUnsearchable(columns, options === null || options === void 0 ? void 0 : options.fuseOptions);
9719
9740
  let data;
9720
9741
  let rowsFromData;
9721
9742
  // The fuse will search the individual rows
9722
9743
  let fuse;
9723
9744
  const source = (query, mostRecentAction) => __awaiter(this, void 0, void 0, function* () {
9724
- var _a, _b, _c, _d, _e, _f;
9725
- //For inMemoryManagers that do not utilize searchColumns,
9726
- //we do not want to overwrite their fuseOptions
9727
- if (mostRecentAction.type === 'load') {
9728
- //Prevent searching on columns that are in fuse options but not supported by search.
9729
- const nonSearchableColumnsKeys = ((_a = options === null || options === void 0 ? void 0 : options.fuseOptions) === null || _a === void 0 ? void 0 : _a.keys)
9730
- ? Array.from(columns.entries())
9731
- .filter(([key, column]) => {
9732
- return column.searchable == false;
9733
- })
9734
- .map(([key, column]) => {
9735
- var _a;
9736
- return ((_a = column.orderKey) === null || _a === void 0 ? void 0 : _a.toString()) || key.toString();
9737
- })
9738
- : undefined;
9739
- const fuseOptions = (options === null || options === void 0 ? void 0 : options.fuseOptions) && nonSearchableColumnsKeys
9740
- ? Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.fuseOptions), { keys: (_c = (_b = options === null || options === void 0 ? void 0 : options.fuseOptions) === null || _b === void 0 ? void 0 : _b.keys) === null || _c === void 0 ? void 0 : _c.filter(k => !nonSearchableColumnsKeys.includes(k.toString())) }) : options === null || options === void 0 ? void 0 : options.fuseOptions;
9741
- data = yield fetchDataset();
9742
- rowsFromData = TableResultHelpers.getAllRowsFromNestedHeaders(data);
9743
- fuse = new Fuse(rowsFromData, fuseOptions);
9744
- }
9745
- if (mostRecentAction.type === 'searchColumnsChange' ||
9745
+ var _a, _b, _c;
9746
+ if (mostRecentAction.type === 'load' ||
9747
+ mostRecentAction.type === 'searchColumnsChange' ||
9746
9748
  mostRecentAction.type === 'toggleAllSearchColumns') {
9747
9749
  data = yield fetchDataset();
9748
9750
  rowsFromData = TableResultHelpers.getAllRowsFromNestedHeaders(data);
9749
- fuse = new Fuse(rowsFromData, Object.assign(Object.assign({}, options === null || options === void 0 ? void 0 : options.fuseOptions), { keys: Array.from(query.searchColumns.entries())
9750
- .filter(([_, value]) => !!value)
9751
- .map(([key, _]) => {
9752
- const columnKey = columns.get(key);
9753
- return (columnKey === null || columnKey === void 0 ? void 0 : columnKey.orderKey) || key;
9754
- }) }));
9751
+ fuse = new Fuse(rowsFromData, TableSearchHelpers.fuseOptionsForSearchColumns(options === null || options === void 0 ? void 0 : options.fuseOptions, columns, query));
9755
9752
  }
9756
9753
  const orderColumn = query.order
9757
- ? (_d = columns.get(query.order.column)) === null || _d === void 0 ? void 0 : _d.orderKey
9754
+ ? (_a = columns.get(query.order.column)) === null || _a === void 0 ? void 0 : _a.orderKey
9758
9755
  : undefined;
9759
9756
  const hasExplicitSort = query.order != null && orderColumn !== undefined;
9760
9757
  const defaultSortSpec = (() => {
@@ -9787,7 +9784,7 @@ var RivTable;
9787
9784
  const nestedRowsToDisplay = didRestrictDisplayedRows
9788
9785
  ? TableNestingHelpers.findNestedRowsWithHeadersToKeep(data, rowsMatchingFilters)
9789
9786
  : data;
9790
- const matchingRowCount = TableNestingHelpers.countNestedRows(nestedRowsToDisplay, (_e = options === null || options === void 0 ? void 0 : options.paginateBy) !== null && _e !== void 0 ? _e : 'bottomRows');
9787
+ const matchingRowCount = TableNestingHelpers.countNestedRows(nestedRowsToDisplay, (_b = options === null || options === void 0 ? void 0 : options.paginateBy) !== null && _b !== void 0 ? _b : 'bottomRows');
9791
9788
  let sortedNestedRows;
9792
9789
  if (hasExplicitSort && query.order) {
9793
9790
  // Explicit sort override has priority over everything else
@@ -9807,7 +9804,7 @@ var RivTable;
9807
9804
  // Don't sort if we have no information to use to sort
9808
9805
  sortedNestedRows = nestedRowsToDisplay;
9809
9806
  }
9810
- const paginatedHeaderRows = TablePaginationHelpers.paginateNestedHeaderRows(sortedNestedRows, query.pagination.page, query.pagination.pageSize, (_f = options === null || options === void 0 ? void 0 : options.paginateBy) !== null && _f !== void 0 ? _f : 'bottomRows');
9807
+ const paginatedHeaderRows = TablePaginationHelpers.paginateNestedHeaderRows(sortedNestedRows, query.pagination.page, query.pagination.pageSize, (_c = options === null || options === void 0 ? void 0 : options.paginateBy) !== null && _c !== void 0 ? _c : 'bottomRows');
9811
9808
  const hasHeaders = paginatedHeaderRows.some(header => header.headerText != null);
9812
9809
  return {
9813
9810
  currentPageNestedHeaders: paginatedHeaderRows,
@@ -11271,10 +11268,10 @@ class TableComponent {
11271
11268
  }
11272
11269
  }
11273
11270
  TableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
11274
- TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "riv-table", inputs: { manager: "manager" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:copy": "onCopy($event)" } }, queries: [{ propertyName: "cellTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "summaryTemplate", first: true, predicate: ["summary"], descendants: true }, { propertyName: "menuTemplate", first: true, predicate: ["menu"], descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: ["selection"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: ["subheader"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"s.display.columnsAreReorderable\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></div>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td>\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n {{ headerRow.headerText }}\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n *ngIf=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n &hellip;\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n &hellip;\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}td.toggle-header{text-align:left}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: CheckboxComponent, selector: "riv-checkbox", inputs: ["name", "identifier", "value", "checkedColorToken", "indeterminateColorToken", "checkboxTooltip", "indeterminate", "disabled", "required", "state", "errorMessage", "ariaLabel"], outputs: ["valueChange"] }, { kind: "component", type: IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "component", type: LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "zIndexOverride", "errorMessage"] }, { kind: "component", type: MenuComponent, selector: "riv-menu", inputs: ["preferredPosition", "disabled"] }, { kind: "component", type: MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "directive", type: OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: SrOnlyComponent, selector: "riv-sr-only" }, { kind: "component", type: TableHeaderResizeHandleComponent, selector: "riv-table-header-resize-handle", outputs: ["dragResize"] }, { kind: "component", type: ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: NumberPipe, name: "rivNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11271
+ TableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TableComponent, selector: "riv-table", inputs: { manager: "manager" }, host: { listeners: { "document:keydown": "keyDown($event)", "document:keyup": "keyUp($event)", "document:copy": "onCopy($event)" } }, queries: [{ propertyName: "cellTemplate", first: true, predicate: ["cell"], descendants: true }, { propertyName: "summaryTemplate", first: true, predicate: ["summary"], descendants: true }, { propertyName: "menuTemplate", first: true, predicate: ["menu"], descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: ["selection"], descendants: true }, { propertyName: "headerTemplate", first: true, predicate: ["header"], descendants: true }, { propertyName: "subheaderTemplate", first: true, predicate: ["subheader"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"s.display.columnsAreReorderable\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></div>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td>\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n {{ headerRow.headerText }}\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <ng-template #cellContent>\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <div\n *ngIf=\"\n showChevronForCell(\n columnIndex,\n hasSubRows,\n depth\n );\n else cellContent\n \"\n class=\"toggleable-cell-content\"\n >\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n <div class=\"toggleable-cell-value\">\n <ng-container\n *ngTemplateOutlet=\"cellContent\"\n ></ng-container>\n </div>\n </div>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n &hellip;\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n &hellip;\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}.toggleable-cell-content{display:flex;align-items:center}.toggleable-cell-value{flex:1 1 auto;min-width:0}td.toggle-header{text-align:left}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: ButtonComponent, selector: "[rivButton]", inputs: ["locked", "disabled", "loading", "full", "size", "variant", "icon", "iconPosition", "current"] }, { kind: "component", type: CalloutComponent, selector: "riv-callout", inputs: ["anchor", "isModal", "preferredPosition", "allowedPositions", "fallbackDirection", "showCaret", "theme"], outputs: ["close"] }, { kind: "component", type: CheckboxComponent, selector: "riv-checkbox", inputs: ["name", "identifier", "value", "checkedColorToken", "indeterminateColorToken", "checkboxTooltip", "indeterminate", "disabled", "required", "state", "errorMessage", "ariaLabel"], outputs: ["valueChange"] }, { kind: "component", type: IconComponent, selector: "riv-icon", inputs: ["name", "fillColor", "size", "customSize", "strokeWidth"] }, { kind: "component", type: LinkComponent, selector: "[rivLink]", inputs: ["disabled", "locked", "theme", "variant"] }, { kind: "component", type: LoadingCoverComponent, selector: "riv-loading-cover", inputs: ["loading", "loadingSize", "zIndexOverride", "errorMessage"] }, { kind: "component", type: MenuComponent, selector: "riv-menu", inputs: ["preferredPosition", "disabled"] }, { kind: "component", type: MenuItemComponent, selector: "[riv-menu-item]", inputs: ["locked", "disabled", "variant"] }, { kind: "directive", type: OverlayDirective, selector: "[riv-overlay]" }, { kind: "component", type: SimpleSelectComponent, selector: "riv-simple-select", inputs: ["optionGroups", "selectedOption", "size", "disabled", "locked", "filterabilityOptions", "orderBy", "placeholder", "maxHeight", "maxWidth", "minHeight", "minWidth", "dividers", "sortSelectedToTop", "grow", "preferredCalloutPosition", "allowedCalloutPositions"], outputs: ["selectedOptionChange"] }, { kind: "directive", type: SizeDirective, selector: "[rivClientSize]", outputs: ["rivClientSize"] }, { kind: "component", type: SrOnlyComponent, selector: "riv-sr-only" }, { kind: "component", type: TableHeaderResizeHandleComponent, selector: "riv-table-header-resize-handle", outputs: ["dragResize"] }, { kind: "component", type: ZeroStateComponent, selector: "riv-zero-state", inputs: ["message", "title", "icon"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: NumberPipe, name: "rivNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11275
11272
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TableComponent, decorators: [{
11276
11273
  type: Component,
11277
- args: [{ selector: 'riv-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"s.display.columnsAreReorderable\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></div>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td>\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n {{ headerRow.headerText }}\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n *ngIf=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n &hellip;\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n &hellip;\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}td.toggle-header{text-align:left}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"] }]
11274
+ args: [{ selector: 'riv-table', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"manager?.state | async; let s\">\n <ng-container *ngIf=\"selectionCalloutPosition | async; let position\">\n <ng-container *ngIf=\"s.selection.selectedCount > 0 && selectionTemplate\">\n <riv-callout\n *riv-overlay\n [anchor]=\"position\"\n [isModal]=\"false\"\n [theme]=\"'light'\"\n [showCaret]=\"false\"\n [preferredPosition]=\"'top-right'\"\n >\n <ng-container\n *ngTemplateOutlet=\"selectionTemplate; context: { state: s }\"\n ></ng-container>\n </riv-callout>\n </ng-container>\n </ng-container>\n <div class=\"loading-container\">\n <div class=\"header\" *ngIf=\"headerTemplate\">\n <ng-container\n *ngTemplateOutlet=\"headerTemplate; context: { state: s }\"\n ></ng-container>\n </div>\n <riv-loading-cover\n class=\"container-loader-wrapper\"\n [loading]=\"s.load.loading\"\n [errorMessage]=\"s.load.error ? getErrorMessage(s.load.error) : undefined\"\n >\n <div\n class=\"container\"\n tabindex=\"0\"\n [ngClass]=\"{\n 'container-ungrouped': !isGroupResult(s.result),\n 'has-header': !isGroupResult(s.result) && headerTemplate,\n 'without-columns': s.display.columns.length === 0\n }\"\n (rivClientSize)=\"containerSize.next($event)\"\n >\n <riv-zero-state\n *ngIf=\"s.display.columns.length === 0\"\n class=\"no-columns-message\"\n [message]=\"\n 'All columns disabled. Enable at least one column to view table data.'\n \"\n ></riv-zero-state>\n\n <!--\n An overview of the templates we are using:\n\n headersAndTableBody - helps us create multiple tables for grouped results\n headerRowWithSubRows - helps us create header rows for nested with header results\n nestedRowWithSubRows - helps us create nested rows for the nested result types\n rowWrappedWithRowLink - helps us add a rowlink to a row\n rowBody - displays the row content\n -->\n\n <!-- When we are grouped, we show one table per group -->\n <ng-container\n *ngIf=\"\n isGroupResult(s.result) && s.result.resultType === 'table-grouping'\n \"\n >\n <ng-container\n *ngFor=\"\n let group of s.result.rowGroups;\n trackBy: trackByGroup;\n let last = last\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: group, last: last }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- When we aren't grouped, we show one table -->\n <ng-container\n *ngIf=\"isRegularResult(s.result) || isNestedResult(s.result)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headersAndTableBody;\n context: { group: null, last: true }\n \"\n ></ng-container>\n </ng-container>\n\n <ng-template let-group=\"group\" let-last=\"last\" #headersAndTableBody>\n <ng-container *ngIf=\"isGroupResult(s.result) && group !== null\">\n <ng-container\n *ngTemplateOutlet=\"\n subheaderTemplate || null;\n context: { state: s, group }\n \"\n ></ng-container>\n </ng-container>\n <div [ngClass]=\"{ 'subcontainer-grouped': isGroupResult(s.result) }\">\n <table>\n <thead>\n <tr>\n <th\n *ngIf=\"!!s.selection.allowSelection\"\n class=\"selection-head\"\n >\n <riv-sr-only>Select rows</riv-sr-only>\n <div\n *ngIf=\"\n s.selection.allowSelection !== 'individual' &&\n s.selection.allowSelection === true\n \"\n class=\"checkbox-wrapper\"\n >\n <riv-checkbox\n *ngIf=\"!isGroupResult(s.result)\"\n [value]=\"s.selection.isAllSelected === true\"\n [indeterminate]=\"\n s.selection.isAllSelected === 'indeterminate'\n \"\n (valueChange)=\"\n manager?.actions?.next({ type: 'allSelectedChange' })\n \"\n ariaLabel=\"Select all rows\"\n ></riv-checkbox>\n <riv-checkbox\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n [value]=\"group.selected === true\"\n [indeterminate]=\"group.selected === 'indeterminate'\"\n (valueChange)=\"\n manager?.actions?.next({\n type: 'groupSelectionChange',\n payload: group\n })\n \"\n ariaLabel=\"Select group rows\"\n ></riv-checkbox>\n </div>\n </th>\n <th\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-head\"\n >\n <!-- Add a column for the chevrons, if we have togglable headers -->\n <riv-sr-only>Toggles</riv-sr-only>\n </th>\n <th\n *ngFor=\"let column of s.display.columns; let i = index\"\n [class.pinned]=\"column.pinned\"\n [style.left.px]=\"column.left\"\n [style.width.px]=\"getWidth(column)\"\n [attr.draggable]=\"s.display.columnsAreReorderable\"\n droppable=\"true\"\n class=\"drop-zone\"\n (dragstart)=\"dragStart(i, column.key)\"\n (dragenter)=\"$event.preventDefault(); dragOver(i)\"\n (drop)=\"drop(i, s.display.enabledCount)\"\n [class.dragged-over-left]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx > i\n \"\n [class.dragged-over-right]=\"\n draggedOverColumnIdx === i &&\n draggedColumnIdx !== null &&\n draggedColumnIdx < i\n \"\n >\n <div\n *ngIf=\"\n !column.orderable &&\n !column.filterable &&\n !s.display.columnsAreFreezable &&\n !s.display.columnsAreHideable\n \"\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n </div>\n <riv-menu\n *ngIf=\"\n column.orderable ||\n column.filterable ||\n s.display.columnsAreFreezable ||\n s.display.columnsAreHideable\n \"\n >\n <ng-template #trigger>\n <span\n class=\"header-wrapper\"\n [class.left]=\"column.alignment === 'left'\"\n [class.right]=\"column.alignment === 'right'\"\n [class.active]=\"s.query.order?.column === column.key\"\n >\n {{ s.display.columnNameMap.get(column.key) }}\n <span class=\"icon-container\">\n <riv-icon\n [size]=\"12\"\n [name]=\"\n s.query.order?.direction === 'desc'\n ? 'ArrowDown'\n : 'ArrowUp'\n \"\n ></riv-icon>\n </span>\n </span>\n <riv-table-header-resize-handle\n (dragResize)=\"setWidth(column.key, $event)\"\n ></riv-table-header-resize-handle>\n </ng-template>\n <ng-container *ngIf=\"column.orderable\">\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'asc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'asc',\n column: column.key\n }\n })\n \"\n >\n Sort ascending\n </button>\n <button\n type=\"button\"\n *ngIf=\"s.query.order?.column === column.key\"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: null\n })\n \"\n >\n Remove sort\n </button>\n <button\n type=\"button\"\n *ngIf=\"\n !(\n s.query.order?.column === column.key &&\n s.query.order?.direction === 'desc'\n )\n \"\n riv-menu-item\n (click)=\"\n manager?.actions?.next({\n type: 'orderChange',\n source: 'headerMenu',\n payload: {\n direction: 'desc',\n column: column.key\n }\n })\n \"\n >\n Sort descending\n </button>\n </ng-container>\n <div\n class=\"riv-divider\"\n *ngIf=\"column.orderable && column.filterable\"\n ></div>\n <button\n type=\"button\"\n *ngIf=\"column.filterable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'filterAdd',\n columnKey: column.key\n })\n \"\n >\n Add a filter\n </button>\n <div\n class=\"riv-divider\"\n *ngIf=\"\n (column.orderable || column.filterable) &&\n (s.display.columnsAreFreezable ||\n s.display.columnsAreHideable)\n \"\n ></div>\n <ng-container *ngIf=\"s.display.columnsAreFreezable\">\n <button\n type=\"button\"\n *ngIf=\"!column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: true,\n index: i,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Freeze up to column\n </button>\n <button\n type=\"button\"\n *ngIf=\"column.pinned\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnsFreezeUpToChange',\n freeze: false,\n index: 0,\n source: 'headerMenu',\n column: column.key\n })\n \"\n >\n Un-freeze columns\n </button>\n </ng-container>\n <button\n type=\"button\"\n *ngIf=\"s.display.columnsAreHideable\"\n riv-menu-item\n (click)=\"\n this.manager?.actions?.next({\n type: 'columnEnabledChange',\n column: column.key,\n enabled: false,\n source: 'headerMenu'\n })\n \"\n >\n Hide column\n </button>\n </riv-menu>\n </th>\n <th *ngIf=\"menuTemplate\" class=\"menu-head\">\n <riv-sr-only>Menu</riv-sr-only>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-container\n *ngIf=\"s.result.totalMatchingRowCount > 0; else empty\"\n >\n <!-- Grouped results do not have subrows or headers -->\n <ng-container\n *ngIf=\"isGroupResult(s.result) && group !== null\"\n >\n <ng-container\n *ngFor=\"\n let row of group.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Regular results do not have subrows or headers -->\n <ng-container\n *ngIf=\"\n isRegularResult(s.result) &&\n s.result.resultType === 'normal-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let row of s.result.rowsAsGroup.rows;\n let rowIndex = index;\n trackBy: trackByRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n rowWrappedWithRowLink;\n context: {\n row: row,\n rowIndex: rowIndex,\n depth: 0,\n hasSubRows: false,\n rowIsCollapsed: false\n }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <!-- Nested with header results have subrows and headers -->\n <ng-container\n *ngIf=\"\n isNestedResult(s.result) &&\n s.result.resultType === 'nested-rows'\n \"\n >\n <ng-container\n *ngFor=\"\n let headerRow of s.result.nestedHeaderRows;\n trackBy: trackByNestedHeader\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n headerRowWithSubRows;\n context: { headerRow: headerRow }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n\n <ng-template let-headerRow=\"headerRow\" #headerRowWithSubRows>\n <!-- Display the header -->\n <ng-container *ngIf=\"headerRow.headerText !== null\">\n <tr\n class=\"toggle-header-row\"\n (click)=\"toggleHeaderCollapse(headerRow.id)\"\n >\n <td>\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n headerRow.isCollapsed\n ? 'ChevronDown'\n : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n </td>\n <td\n class=\"toggle-header\"\n [attr.colspan]=\"s.display.columns.length\"\n >\n {{ headerRow.headerText }}\n </td>\n <td *ngIf=\"menuTemplate\"></td>\n </tr>\n </ng-container>\n\n <!-- If a header is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !headerRow.isCollapsed && headerRow.subRows.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let nestedRow of headerRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n nestedRowWithSubRows;\n context: { nestedRow: nestedRow, depth: 0 }\n \"\n ></ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-nestedRow=\"nestedRow\"\n let-depth=\"depth\"\n #nestedRowWithSubRows\n >\n <!-- Display the current row -->\n <ng-container\n [ngTemplateOutlet]=\"rowWrappedWithRowLink\"\n [ngTemplateOutletContext]=\"{\n row: nestedRow.data,\n rowIndex: -1,\n depth: depth,\n hasSubRows: nestedRow.subRows?.length > 0,\n rowIsCollapsed: nestedRow.isCollapsed\n }\"\n >\n </ng-container>\n\n <!-- If a row is not collapsed, also show its subrows -->\n <ng-container\n *ngIf=\"\n !nestedRow.isCollapsed && nestedRow.subRows?.length > 0\n \"\n >\n <ng-container\n *ngFor=\"\n let subRow of nestedRow.subRows;\n trackBy: trackByNestedRow\n \"\n >\n <ng-container\n [ngTemplateOutlet]=\"nestedRowWithSubRows\"\n [ngTemplateOutletContext]=\"{\n nestedRow: subRow,\n depth: depth + 1\n }\"\n >\n </ng-container>\n </ng-container>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowWrappedWithRowLink\n >\n <ng-container\n *ngIf=\"{\n row: row,\n rowIndex: rowIndex,\n depth: depth,\n hasSubRows: hasSubRows,\n rowIsCollapsed: rowIsCollapsed\n } as rowContext\"\n >\n <ng-container *ngIf=\"row.rowLink; let rl\">\n <a\n *ngIf=\"isExternalRowLink(rl)\"\n [href]=\"rl.href\"\n draggable=\"false\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n <a\n *ngIf=\"isInternalRowLink(rl)\"\n draggable=\"false\"\n [routerLink]=\"rl.routerLink\"\n [queryParams]=\"rl.queryParams\"\n [queryParamsHandling]=\"rl.queryParamsHandling\"\n class=\"row-link\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n [class.active]=\"rl.active\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </a>\n </ng-container>\n <tr\n *ngIf=\"!row.rowLink\"\n [class.grayed]=\"s.display.rowsAreGrayed\"\n >\n <ng-container\n *ngTemplateOutlet=\"rowBody; context: rowContext\"\n ></ng-container>\n </tr>\n </ng-container>\n </ng-template>\n\n <ng-template\n let-row=\"row\"\n let-rowIndex=\"rowIndex\"\n let-depth=\"depth\"\n let-hasSubRows=\"hasSubRows\"\n let-rowIsCollapsed=\"rowIsCollapsed\"\n #rowBody\n >\n <td\n *ngIf=\"\n s.selection.allowSelection === true ||\n s.selection.allowSelection === 'individual'\n \"\n class=\"selection-body\"\n (click)=\"$event.preventDefault()\"\n >\n <label\n class=\"checkbox-wrapper\"\n (click)=\"$event.stopPropagation()\"\n >\n <riv-checkbox\n [identifier]=\"'riv-table-selection-' + row.id\"\n [value]=\"row.selected\"\n (valueChange)=\"selectionChange(row.id, $event)\"\n ariaLabel=\"Select row\"\n ></riv-checkbox>\n </label>\n </td>\n <td\n *ngIf=\"isNestedResult(s.result) && !!s.result.hasHeaders\"\n class=\"toggle-body\"\n >\n <!-- This td lines up with the header chevron column -->\n </td>\n <ng-container\n *ngFor=\"\n let column of s.display.columns;\n index as columnIndex;\n trackBy: trackByColumn\n \"\n >\n <ng-container\n *ngIf=\"\n s.display.cellRowSpan(rowIndex, column.key) as span\n \"\n >\n <td\n *ngIf=\"span > 0\"\n [attr.rowspan]=\"span\"\n [class.rs-right-border]=\"\n s.display.needsRightBorder(rowIndex, column.key)\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [class.toggleable-cell]=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n \"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n (click)=\"\n showChevronForCell(columnIndex, hasSubRows, depth)\n ? toggleRowCollapse(row.id)\n : handleClick($event, column)\n \"\n >\n <ng-template #cellContent>\n <ng-container\n *ngIf=\"!blankCellDueToNesting(columnIndex, depth)\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n cellTemplate || null;\n context: { row: row, column: column }\n \"\n ></ng-container>\n </ng-container>\n </ng-template>\n\n <!-- Rows with subrows have a chevron indicating you can click the row to see the subrows. -->\n <div\n *ngIf=\"\n showChevronForCell(\n columnIndex,\n hasSubRows,\n depth\n );\n else cellContent\n \"\n class=\"toggleable-cell-content\"\n >\n <riv-icon\n class=\"prevent-shrink chevron\"\n [name]=\"\n rowIsCollapsed ? 'ChevronDown' : 'ChevronUp'\n \"\n [size]=\"16\"\n ></riv-icon>\n <div class=\"toggleable-cell-value\">\n <ng-container\n *ngTemplateOutlet=\"cellContent\"\n ></ng-container>\n </div>\n </div>\n </td>\n </ng-container>\n </ng-container>\n <td\n *ngIf=\"menuTemplate\"\n class=\"menu-body\"\n (click)=\"\n $event.stopPropagation(); $event.preventDefault()\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"\n menuTemplate || null;\n context: { row: row }\n \"\n ></ng-container>\n </td>\n </ng-template>\n\n <tr *ngIf=\"s.display.customSummaryRow\">\n <td\n *ngFor=\"\n let column of s.display.columns;\n trackBy: trackByColumn\n \"\n [class.pinned]=\"column.pinned\"\n [class.advanced]=\"column.dataType === 'advanced'\"\n [style.left.px]=\"column.left\"\n [style.text-align]=\"column.alignment\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n summaryTemplate || null;\n context: { column: column }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n <ng-template #empty>\n <tr>\n <td [attr.colspan]=\"s.display.columns.length\">\n <riv-zero-state\n *ngIf=\"s.display.zeroStateMessage; let message\"\n [message]=\"message\"\n ></riv-zero-state>\n </td>\n </tr>\n </ng-template>\n </tbody>\n </table>\n </div>\n <div\n class=\"footer\"\n *ngIf=\"\n isGroupResult(s.result) &&\n group !== null &&\n group.totalMatchingRowCount > s.query.grouping.countPerGroup &&\n group.rows.length === s.query.grouping.countPerGroup\n \"\n >\n <span\n rivLink\n class=\"footer-link\"\n (click)=\"\n manager?.actions?.next({\n type: 'viewMoreKeyChange',\n viewMoreKey: group.groupData.key.toString()\n })\n \"\n >View all {{ group.totalMatchingRowCount }}</span\n >\n </div>\n <br *ngIf=\"!last\" />\n </ng-template>\n </div>\n <div *ngIf=\"s.query.pagination.showControls\" class=\"pagination\">\n <div class=\"page-size-controls\">\n <ng-container\n *ngIf=\"!isGroupResult(s.result) && !s.display.hidePageSizeSelector\"\n >\n <span> Results per page: </span>\n <riv-simple-select\n [selectedOption]=\"{\n id: s.query.pagination.pageSize.toString(),\n title: s.query.pagination.pageSize.toString(),\n value: s.query.pagination.pageSize\n }\"\n (selectedOptionChange)=\"\n manager?.actions?.next({\n type: 'pageSizeChange',\n size: $event?.value || 25\n })\n \"\n [optionGroups]=\"pageSizeOptions\"\n [size]=\"'small'\"\n [orderBy]=\"'source'\"\n ></riv-simple-select>\n </ng-container>\n </div>\n <span\n *ngIf=\"s.result.totalMatchingRowCount > 0 && !isGroupResult(s.result)\"\n class=\"page-data-indicator\"\n >\n {{ s.query.pagination.pageRowStart | rivNumber }}-{{\n s.query.pagination.pageRowEnd | rivNumber\n }}\n of\n {{ s.result.totalMatchingRowCount | rivNumber }}\n </span>\n <div\n *ngIf=\"s.query.pagination.showControls\"\n class=\"pagination-controls\"\n >\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowLeft'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.previous === null\"\n (click)=\"manager?.actions?.next({ type: 'previousPageNavigate' })\"\n ></button>\n <span\n *ngIf=\"s.query.pagination.pages[0] > 0\"\n class=\"truncated-pages left\"\n >\n &hellip;\n </span>\n <button\n *ngFor=\"let page of s.query.pagination.pages\"\n class=\"page\"\n type=\"button\"\n [disabled]=\"page === s.query.pagination.page\"\n [attr.aria-disabled]=\"\n page === s.query.pagination.page ? 'true' : null\n \"\n (click)=\"manager?.actions?.next({ type: 'pageChange', page })\"\n >\n {{ page + 1 }}\n </button>\n <span\n *ngIf=\"\n s.query.pagination.pages[s.query.pagination.pages.length - 1] <\n s.query.pagination.pageCount - 1\n \"\n class=\"truncated-pages right\"\n >\n &hellip;\n </span>\n <button\n rivButton\n [variant]=\"'basic'\"\n [size]=\"'small'\"\n [icon]=\"'ArrowRight'\"\n type=\"button\"\n [disabled]=\"s.query.pagination.next === null\"\n (click)=\"manager?.actions?.next({ type: 'nextPageNavigate' })\"\n ></button>\n </div>\n </div>\n </riv-loading-cover>\n </div>\n</ng-container>\n", styles: [":host{display:flex;min-height:0}.no-columns-message{position:sticky;inset:0;z-index:var(--loadable-z-index);background-color:var(--surface-light-0)}riv-loading-cover{width:100%;display:grid;grid-template-rows:1fr auto;gap:0}.loading-container{width:100%;display:flex;flex-direction:column;min-height:0}.header{border-width:var(--border-width) var(--border-width) 0 var(--border-width);border-style:solid;border-color:var(--border-light);border-top-left-radius:var(--border-radius-medium);border-top-right-radius:var(--border-radius-medium)}.header:has(+ div > .subheader){border-bottom-width:var(--border-width);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);margin-bottom:var(--size-large)}.header+.container>.subcontainer{border-top-left-radius:0;border-top-right-radius:0}.container-loader-wrapper{flex:1 1 auto;min-height:0}.container{overflow:auto}.container.without-columns{overflow:hidden;position:relative}.container-ungrouped{border:var(--border-width) solid var(--border-light);border-radius:var(--border-radius-medium)}.container-ungrouped.has-header{border-top-left-radius:0;border-top-right-radius:0}.subcontainer-grouped{overflow:auto;border:var(--border-width) solid var(--border-light);border-top-right-radius:var(--border-radius-medium);border-top-left-radius:var(--border-radius-medium)}.subcontainer-grouped:not(:has(+ .footer)){border-bottom-right-radius:var(--border-radius-medium);border-bottom-left-radius:var(--border-radius-medium)}table{border-collapse:separate;width:100%;table-layout:fixed}thead{position:sticky;top:0;z-index:var(--above-scroll-z-index)}th{border-bottom:var(--border-width) solid var(--border-light);background-color:var(--surface-light-1);position:relative}th:not(:last-child){border-right:var(--border-width) solid var(--border-light)}th.pinned{position:sticky;top:0;z-index:1}th.dragged-over-left:before,th.dragged-over-right:before{content:\"\";position:absolute;top:0;bottom:0;width:var(--size-xxsmall);background-color:var(--brand);box-shadow:0 0 var(--size-xxsmall) var(--brand)}th.dragged-over-left:before{left:0}th.dragged-over-right:before{right:0}th.selection-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0;vertical-align:middle;height:calc(var(--base-grid-size) * 8 + var(--border-width))}.checkbox-wrapper{display:flex;justify-content:center;align-items:center}label.checkbox-wrapper{cursor:pointer;width:100%;height:100%}th.menu-head{width:var(--size-xxlarge);position:sticky;z-index:1;right:0}th.toggle-head{width:var(--size-xxlarge);position:sticky;z-index:1;left:0}th>riv-menu{width:100%}.header-wrapper{font-size:var(--size-medium);font-weight:var(--font-weight-heavy);line-height:1;padding:var(--size-xsmall) var(--size-small);display:inline-flex;align-items:center;justify-content:center;width:100%;height:calc(var(--base-grid-size) * 8);white-space:nowrap}.header-wrapper.left{justify-content:flex-start}.header-wrapper.right{justify-content:flex-end}span.header-wrapper{transition:background-color var(--short-transition);cursor:pointer}span.header-wrapper:hover{background-color:var(--black-20)}span.header-wrapper .icon-container{overflow:hidden;display:inline-block;width:0;height:1em;opacity:0;padding-left:0;transition:width var(--medium-transition),opacity var(--medium-transition),color var(--medium-transition),padding-left var(--medium-transition)}span.header-wrapper.active .icon-container{width:calc(var(--base-grid-size) * 3.5);padding-left:var(--size-xsmall);opacity:1}span.header-wrapper:hover .icon-container{color:var(--type-light-low-contrast)}span.header-wrapper.active .icon-container{color:var(--brand)}a.row-link{display:table-row;text-decoration:none;color:inherit;-webkit-user-select:text;user-select:text}a.row-link td{transition:background-color var(--short-transition);-webkit-user-select:text;user-select:text}a.row-link:hover td{background-color:var(--surface-light-2)}a.row-link:active td{background-color:var(--surface-light-3)}td.rs-hover{background-color:var(--surface-light-2)}td{border-bottom:var(--border-width) solid var(--border-light);height:calc(var(--base-grid-size) * 8);padding:var(--size-xxsmall) var(--size-small);font:var(--body-small);vertical-align:middle;text-align:center;background-color:var(--surface-light-0)}tr.grayed td,a.row-link.grayed td{background-color:var(--gray-30)}tbody>*:last-child>td{border-bottom:none}td.pinned{position:sticky;z-index:1}td.pinned:not(:has(+ td.pinned)){border-right:var(--border-width) solid var(--border-light)}td.advanced,td.selection-body,td.menu-body,td.toggle-body{padding:0;vertical-align:middle}td.selection-body{position:sticky;z-index:1;left:0}td.menu-body{position:sticky;z-index:1;right:0}.pagination{margin-top:var(--size-small);display:flex;justify-content:space-between;gap:var(--size-large)}.page-size-controls,.pagination-controls{display:flex;align-items:center;gap:var(--size-xsmall)}.page-data-indicator{display:flex;align-items:center;flex-grow:1;justify-content:flex-end;font:var(--body-medium);color:var(--type-light-low-contrast)}.page-size-controls span{font:var(--body-medium)}.page{display:flex;align-items:center;justify-content:center;min-width:calc(var(--base-grid-size) * 7.5);height:calc(var(--base-grid-size) * 7.5);padding:var(--size-xxsmall);font:var(--input-medium);color:var(--purp-80);border-radius:var(--border-radius-small);transition:background-color var(--short-transition)}.page:hover,.page:disabled{background-color:var(--black-20)}.page:active:not(:disabled){background-color:var(--black-40)}.page:not(:disabled){cursor:pointer}.truncated-pages{color:var(--type-light-disabled)}.truncated-pages.left{padding-left:var(--size-small)}.truncated-pages.right{padding-right:var(--size-small)}.footer{background-color:var(--surface-light-1);border-bottom:var(--border-width) solid var(--border-light);border-left:var(--border-width) solid var(--border-light);border-right:var(--border-width) solid var(--border-light);border-bottom-left-radius:var(--border-radius-medium);border-bottom-right-radius:var(--border-radius-medium);text-align:right;padding:calc(var(--base-grid-size) / 2);font:var(--body-medium)}.footer-link{margin-right:var(--size-medium)}td[rowspan]:not([rowspan=\"1\"]){border-right:var(--border-width) solid var(--border-light)}td.rs-right-border{border-right:var(--border-width) solid var(--border-light)}a.row-link.active>td{background-color:var(--surface-light-selected)}.prevent-shrink{flex-shrink:0}td.toggleable-cell{cursor:pointer;font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}td riv-icon.chevron{vertical-align:middle;margin-right:var(--size-xsmall)}.toggleable-cell-content{display:flex;align-items:center}.toggleable-cell-value{flex:1 1 auto;min-width:0}td.toggle-header{text-align:left}tr.toggle-header-row td{cursor:pointer;background-color:var(--surface-light-1);font-size:var(--type-1-font-size);line-height:var(--type-1-line-height-2);font-weight:var(--font-weight-heavy)}\n"] }]
11278
11275
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { manager: [{
11279
11276
  type: Input
11280
11277
  }], cellTemplate: [{