@meshmakers/octo-ui 3.2.21-0 → 3.2.25-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,11 +18,11 @@ import { MatListItemIcon } from '@angular/material/list';
18
18
  import { RouterLink } from '@angular/router';
19
19
 
20
20
  class ListElementModule {
21
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ListElementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.5", ngImport: i0, type: ListElementModule, imports: [CommonModule] });
23
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ListElementModule, imports: [CommonModule] });
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: ListElementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.6", ngImport: i0, type: ListElementModule, imports: [CommonModule] });
23
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: ListElementModule, imports: [CommonModule] });
24
24
  }
25
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ListElementModule, decorators: [{
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: ListElementModule, decorators: [{
26
26
  type: NgModule,
27
27
  args: [{
28
28
  declarations: [],
@@ -143,16 +143,20 @@ class OctoListNavigation {
143
143
  }
144
144
  }
145
145
 
146
+ function getDisplayName(column) {
147
+ return column.displayName ?? column.dataKey;
148
+ }
149
+
146
150
  class PascalCasePipe {
147
151
  transform(value) {
148
152
  if (!value)
149
153
  return value;
150
154
  return value.charAt(0).toUpperCase() + value.slice(1);
151
155
  }
152
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: PascalCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
153
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.5", ngImport: i0, type: PascalCasePipe, isStandalone: true, name: "pascalCase" });
156
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: PascalCasePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
157
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.1.6", ngImport: i0, type: PascalCasePipe, isStandalone: true, name: "pascalCase" });
154
158
  }
155
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: PascalCasePipe, decorators: [{
159
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: PascalCasePipe, decorators: [{
156
160
  type: Pipe,
157
161
  args: [{
158
162
  standalone: true,
@@ -161,12 +165,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
161
165
  }] });
162
166
  class MmOctoTableComponent {
163
167
  dataSource;
164
- dataColumns = { columnNames: [], accessPaths: {} };
165
168
  actionColumns = [];
166
169
  leftToolbarActions = [];
167
170
  optionActions = [];
168
171
  searchFilterColumns = [];
169
- currentRoute = "";
170
172
  currentId = "";
171
173
  defaultSortColumn = "";
172
174
  rowIsClickable = true;
@@ -176,11 +178,33 @@ class MmOctoTableComponent {
176
178
  searchFilterStringUpdated = new EventEmitter();
177
179
  selectedRowId = "";
178
180
  actionColumnClick = new EventEmitter();
181
+ set columns(cols) {
182
+ if (cols === null || cols === undefined || cols.length === 0) {
183
+ this._columns = [];
184
+ return;
185
+ }
186
+ this._columns = [];
187
+ for (const column of cols) {
188
+ if (typeof column === 'string') {
189
+ this._columns.push({ dataKey: column });
190
+ }
191
+ else {
192
+ this._columns.push(column);
193
+ }
194
+ }
195
+ }
196
+ get columns() {
197
+ return this._columns;
198
+ }
199
+ _columns = [];
179
200
  selectedRow = null; // Track the selected row
180
201
  selectedPageSizeSubject = new BehaviorSubject(this.selectedPageSize);
181
202
  paginator;
182
203
  sort;
183
204
  input;
205
+ get columnNames() {
206
+ return this._columns.map(c => getDisplayName(c));
207
+ }
184
208
  loading = false;
185
209
  isMobile;
186
210
  constructor() {
@@ -188,16 +212,11 @@ class MmOctoTableComponent {
188
212
  }
189
213
  ngOnInit() {
190
214
  this.selectedPageSizeSubject.next(this.selectedPageSize);
191
- // at least add the currentId to the search filter columns
192
- if (this.currentId && !this.searchFilterColumns.includes(this.currentId)) {
193
- this.searchFilterColumns.push(this.currentId);
194
- }
195
215
  if (!this.dataSource) {
196
216
  throw new Error('No dataSource provided');
197
217
  }
198
218
  this.checkSelectedRow();
199
219
  }
200
- // noinspection JSUnusedGlobalSymbols
201
220
  ngAfterViewInit() {
202
221
  if (this.sort && this.input && this.paginator) {
203
222
  fromEvent(this.input.nativeElement, 'keyup')
@@ -249,26 +268,17 @@ class MmOctoTableComponent {
249
268
  }
250
269
  }
251
270
  encodeURIComponent = encodeURIComponent;
252
- accessElement(element, column, accessPaths) {
253
- // get keys of accessPaths
254
- const keys = Object.keys(accessPaths);
255
- // check if column is in keys
256
- if (!keys.includes(column)) {
257
- return element[column];
258
- }
259
- try {
260
- // if column is in accessPaths, try split accessPaths[column] by '.' and access element
261
- const path = accessPaths[column].split('.');
262
- let result = element;
263
- for (const p of path) {
264
- result = result[p];
265
- }
266
- return result;
271
+ accessElement(element, column) {
272
+ if (column.dataKey.indexOf('.') === -1) {
273
+ return element[column.dataKey];
267
274
  }
268
- catch {
269
- //console.log(`Error accessing element: ${e}`);
270
- return "NONE";
275
+ // else we have a nested object
276
+ const keys = column.dataKey.split('.');
277
+ let value = element;
278
+ for (const key of keys) {
279
+ value = value[key];
271
280
  }
281
+ return value;
272
282
  }
273
283
  selectedPageSizeChanged($event) {
274
284
  console.log($event.pageSize);
@@ -307,10 +317,11 @@ class MmOctoTableComponent {
307
317
  hasActionColumns = () => {
308
318
  return this.actionColumns.length > 0 || this.optionActions.length > 0;
309
319
  };
310
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: MmOctoTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
311
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: MmOctoTableComponent, isStandalone: true, selector: "mm-octo-table", inputs: { dataSource: "dataSource", dataColumns: "dataColumns", actionColumns: "actionColumns", leftToolbarActions: "leftToolbarActions", optionActions: "optionActions", searchFilterColumns: "searchFilterColumns", currentRoute: "currentRoute", currentId: "currentId", defaultSortColumn: "defaultSortColumn", rowIsClickable: "rowIsClickable", pageSizeOptions: "pageSizeOptions", selectedPageSize: "selectedPageSize", selectedRowId: "selectedRowId" }, outputs: { rowClicked: "rowClicked", searchFilterStringUpdated: "searchFilterStringUpdated", actionColumnClick: "actionColumnClick" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div>\n <mat-progress-bar *ngIf=\"loading || (dataSource?.loading$ | async)\" mode=\"indeterminate\"></mat-progress-bar>\n</div>\n\n<mat-toolbar class=\"octo-toolbar octo-detail-toolbar\">\n @for (toolbarAction of leftToolbarActions; track toolbarAction) {\n <button mat-flat-button routerLink=\"{{toolbarAction.route}}\" type=\"button\" [disabled]=\"!toolbarAction.isDisabled ? false : (toolbarAction.isDisabled | async)\">\n @if (toolbarAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ toolbarAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (toolbarAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ toolbarAction.iconName }}</mat-icon>\n }\n {{ toolbarAction.actionText }}\n </button>\n }\n\n <div class=\"octo-spacer\"></div>\n\n <div class=\"octo-toolbar-search\">\n <mat-form-field appearance=\"outline\">\n <mat-label>\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n Search\n </mat-label>\n <input #input matInput [disabled]=\"loading\">\n </mat-form-field>\n </div>\n</mat-toolbar>\n\n<mat-table [class.isMobile]=\"isMobile\" [dataSource]=\"dataSource\" class=\"mat-elevation-z8 table-container\" mat-table matSort\n matSortActive=\"{{defaultSortColumn}}\" matSortDirection=\"asc\" matSortDisableClear=\"true\">\n\n <ng-container *ngFor=\"let column of dataColumns?.columnNames\" [matColumnDef]=\"column\">\n <mat-header-cell *matHeaderCellDef mat-sort-header> {{ column | pascalCase }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"isMobile\">{{ column | pascalCase }}:</span>\n {{ accessElement(element, column, dataColumns.accessPaths) }}\n </mat-cell>\n </ng-container>\n\n <!-- Consolidated Action Column with multiple buttons -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n @for (column of actionColumns; track column) {\n <ng-container>\n <button mat-button (click)=\"emitRowData({action: column.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n <mat-icon *ngIf=\"column?.svgIconName\" class=\"svg-icon\" svgIcon=\"{{ column.svgIconName }}\" matListItemIcon></mat-icon>\n <mat-icon *ngIf=\"column?.iconName\" class=\"material-symbols-outlined\">{{ column.iconName }}</mat-icon>\n </button>\n </ng-container>\n }\n\n <!-- Options menu with additional actions -->\n @if (optionActions.length > 0) {\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"Options\">\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n </button>\n }\n\n <mat-menu #menu=\"matMenu\">\n @for (optionAction of optionActions; track optionAction) {\n <ng-container>\n <button mat-menu-item\n (click)=\"emitRowData({action: optionAction.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n @if (optionAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ optionAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (optionAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ optionAction.iconName }}</mat-icon>\n }\n {{ optionAction.columnName | pascalCase }}\n </button>\n </ng-container>\n }\n </mat-menu>\n </mat-cell>\n </ng-container>\n\n <!-- Row when there are actions -->\n @if (hasActionColumns()) {\n <mat-header-row *matHeaderRowDef=\"dataColumns?.columnNames?.concat(['actions'])\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: dataColumns?.columnNames?.concat(['actions'])\"></mat-row>\n } @else {\n <mat-header-row *matHeaderRowDef=\"dataColumns?.columnNames\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: dataColumns?.columnNames\"></mat-row>\n }\n\n</mat-table>\n\n<mat-paginator [length]=\"dataSource?.totalCount$ | async\" (page)=\"selectedPageSizeChanged($event)\" [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"selectedPageSizeSubject.getValue()\"></mat-paginator>\n", styles: [".table-container{display:block;width:100%;max-height:70vh;overflow-x:auto;overflow-y:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "component", type: MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: PascalCasePipe, name: "pascalCase" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
320
+ getDisplayName = getDisplayName;
321
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: MmOctoTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
322
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.6", type: MmOctoTableComponent, isStandalone: true, selector: "mm-octo-table", inputs: { dataSource: "dataSource", actionColumns: "actionColumns", leftToolbarActions: "leftToolbarActions", optionActions: "optionActions", searchFilterColumns: "searchFilterColumns", currentId: "currentId", defaultSortColumn: "defaultSortColumn", rowIsClickable: "rowIsClickable", pageSizeOptions: "pageSizeOptions", selectedPageSize: "selectedPageSize", selectedRowId: "selectedRowId", columns: "columns" }, outputs: { rowClicked: "rowClicked", searchFilterStringUpdated: "searchFilterStringUpdated", actionColumnClick: "actionColumnClick" }, viewQueries: [{ propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div>\n <mat-progress-bar *ngIf=\"loading || (dataSource?.loading$ | async)\" mode=\"indeterminate\"></mat-progress-bar>\n</div>\n\n<mat-toolbar class=\"octo-toolbar octo-detail-toolbar\">\n @for (toolbarAction of leftToolbarActions; track toolbarAction) {\n <button mat-flat-button routerLink=\"{{toolbarAction.route}}\" type=\"button\" [disabled]=\"!toolbarAction.isDisabled ? false : (toolbarAction.isDisabled | async)\">\n @if (toolbarAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ toolbarAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (toolbarAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ toolbarAction.iconName }}</mat-icon>\n }\n {{ toolbarAction.actionText }}\n </button>\n }\n\n <div class=\"octo-spacer\"></div>\n\n <div class=\"octo-toolbar-search\">\n <mat-form-field appearance=\"outline\">\n <mat-label>\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n Search\n </mat-label>\n <input #input matInput [disabled]=\"loading\">\n </mat-form-field>\n </div>\n</mat-toolbar>\n\n<mat-table [class.isMobile]=\"isMobile\" [dataSource]=\"dataSource\" class=\"mat-elevation-z8 table-container\" mat-table matSort\n matSortActive=\"{{defaultSortColumn}}\" matSortDirection=\"asc\" matSortDisableClear=\"true\">\n\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"getDisplayName(column)\">\n <mat-header-cell *matHeaderCellDef mat-sort-header> {{ getDisplayName(column) | pascalCase }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"isMobile\">{{ getDisplayName(column) | pascalCase }}:</span>\n {{ accessElement(element, column) }}\n </mat-cell>\n </ng-container>\n\n <!-- Consolidated Action Column with multiple buttons -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n @for (column of actionColumns; track column) {\n <ng-container>\n <button mat-button (click)=\"emitRowData({action: column.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n <mat-icon *ngIf=\"column?.svgIconName\" class=\"svg-icon\" svgIcon=\"{{ column.svgIconName }}\" matListItemIcon></mat-icon>\n <mat-icon *ngIf=\"column?.iconName\" class=\"material-symbols-outlined\">{{ column.iconName }}</mat-icon>\n </button>\n </ng-container>\n }\n\n <!-- Options menu with additional actions -->\n @if (optionActions.length > 0) {\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"Options\">\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n </button>\n }\n\n <mat-menu #menu=\"matMenu\">\n @for (optionAction of optionActions; track optionAction) {\n <ng-container>\n <button mat-menu-item\n (click)=\"emitRowData({action: optionAction.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n @if (optionAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ optionAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (optionAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ optionAction.iconName }}</mat-icon>\n }\n {{ optionAction.columnName | pascalCase }}\n </button>\n </ng-container>\n }\n </mat-menu>\n </mat-cell>\n </ng-container>\n\n @if (hasActionColumns()) {\n <mat-header-row *matHeaderRowDef=\"columnNames.concat(['actions'])\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: columnNames.concat(['actions'])\"></mat-row>\n } @else {\n <mat-header-row *matHeaderRowDef=\"columnNames\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: columnNames\"></mat-row>\n }\n\n</mat-table>\n\n<mat-paginator [length]=\"dataSource?.totalCount$ | async\" (page)=\"selectedPageSizeChanged($event)\" [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"selectedPageSizeSubject.getValue()\"></mat-paginator>\n", styles: [".table-container{display:block;width:100%;max-height:70vh;overflow-x:auto;overflow-y:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "component", type: MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "component", type: MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "pipe", type: PascalCasePipe, name: "pascalCase" }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "directive", type: MatListItemIcon, selector: "[matListItemIcon]" }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
312
323
  }
313
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: MmOctoTableComponent, decorators: [{
324
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: MmOctoTableComponent, decorators: [{
314
325
  type: Component,
315
326
  args: [{ selector: 'mm-octo-table', standalone: true, imports: [
316
327
  AsyncPipe,
@@ -355,11 +366,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
355
366
  MatCellDef,
356
367
  MatHeaderRowDef,
357
368
  MatRowDef
358
- ], template: "<div>\n <mat-progress-bar *ngIf=\"loading || (dataSource?.loading$ | async)\" mode=\"indeterminate\"></mat-progress-bar>\n</div>\n\n<mat-toolbar class=\"octo-toolbar octo-detail-toolbar\">\n @for (toolbarAction of leftToolbarActions; track toolbarAction) {\n <button mat-flat-button routerLink=\"{{toolbarAction.route}}\" type=\"button\" [disabled]=\"!toolbarAction.isDisabled ? false : (toolbarAction.isDisabled | async)\">\n @if (toolbarAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ toolbarAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (toolbarAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ toolbarAction.iconName }}</mat-icon>\n }\n {{ toolbarAction.actionText }}\n </button>\n }\n\n <div class=\"octo-spacer\"></div>\n\n <div class=\"octo-toolbar-search\">\n <mat-form-field appearance=\"outline\">\n <mat-label>\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n Search\n </mat-label>\n <input #input matInput [disabled]=\"loading\">\n </mat-form-field>\n </div>\n</mat-toolbar>\n\n<mat-table [class.isMobile]=\"isMobile\" [dataSource]=\"dataSource\" class=\"mat-elevation-z8 table-container\" mat-table matSort\n matSortActive=\"{{defaultSortColumn}}\" matSortDirection=\"asc\" matSortDisableClear=\"true\">\n\n <ng-container *ngFor=\"let column of dataColumns?.columnNames\" [matColumnDef]=\"column\">\n <mat-header-cell *matHeaderCellDef mat-sort-header> {{ column | pascalCase }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"isMobile\">{{ column | pascalCase }}:</span>\n {{ accessElement(element, column, dataColumns.accessPaths) }}\n </mat-cell>\n </ng-container>\n\n <!-- Consolidated Action Column with multiple buttons -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n @for (column of actionColumns; track column) {\n <ng-container>\n <button mat-button (click)=\"emitRowData({action: column.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n <mat-icon *ngIf=\"column?.svgIconName\" class=\"svg-icon\" svgIcon=\"{{ column.svgIconName }}\" matListItemIcon></mat-icon>\n <mat-icon *ngIf=\"column?.iconName\" class=\"material-symbols-outlined\">{{ column.iconName }}</mat-icon>\n </button>\n </ng-container>\n }\n\n <!-- Options menu with additional actions -->\n @if (optionActions.length > 0) {\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"Options\">\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n </button>\n }\n\n <mat-menu #menu=\"matMenu\">\n @for (optionAction of optionActions; track optionAction) {\n <ng-container>\n <button mat-menu-item\n (click)=\"emitRowData({action: optionAction.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n @if (optionAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ optionAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (optionAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ optionAction.iconName }}</mat-icon>\n }\n {{ optionAction.columnName | pascalCase }}\n </button>\n </ng-container>\n }\n </mat-menu>\n </mat-cell>\n </ng-container>\n\n <!-- Row when there are actions -->\n @if (hasActionColumns()) {\n <mat-header-row *matHeaderRowDef=\"dataColumns?.columnNames?.concat(['actions'])\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: dataColumns?.columnNames?.concat(['actions'])\"></mat-row>\n } @else {\n <mat-header-row *matHeaderRowDef=\"dataColumns?.columnNames\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: dataColumns?.columnNames\"></mat-row>\n }\n\n</mat-table>\n\n<mat-paginator [length]=\"dataSource?.totalCount$ | async\" (page)=\"selectedPageSizeChanged($event)\" [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"selectedPageSizeSubject.getValue()\"></mat-paginator>\n", styles: [".table-container{display:block;width:100%;max-height:70vh;overflow-x:auto;overflow-y:auto}\n"] }]
369
+ ], template: "<div>\n <mat-progress-bar *ngIf=\"loading || (dataSource?.loading$ | async)\" mode=\"indeterminate\"></mat-progress-bar>\n</div>\n\n<mat-toolbar class=\"octo-toolbar octo-detail-toolbar\">\n @for (toolbarAction of leftToolbarActions; track toolbarAction) {\n <button mat-flat-button routerLink=\"{{toolbarAction.route}}\" type=\"button\" [disabled]=\"!toolbarAction.isDisabled ? false : (toolbarAction.isDisabled | async)\">\n @if (toolbarAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ toolbarAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (toolbarAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ toolbarAction.iconName }}</mat-icon>\n }\n {{ toolbarAction.actionText }}\n </button>\n }\n\n <div class=\"octo-spacer\"></div>\n\n <div class=\"octo-toolbar-search\">\n <mat-form-field appearance=\"outline\">\n <mat-label>\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n Search\n </mat-label>\n <input #input matInput [disabled]=\"loading\">\n </mat-form-field>\n </div>\n</mat-toolbar>\n\n<mat-table [class.isMobile]=\"isMobile\" [dataSource]=\"dataSource\" class=\"mat-elevation-z8 table-container\" mat-table matSort\n matSortActive=\"{{defaultSortColumn}}\" matSortDirection=\"asc\" matSortDisableClear=\"true\">\n\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"getDisplayName(column)\">\n <mat-header-cell *matHeaderCellDef mat-sort-header> {{ getDisplayName(column) | pascalCase }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"isMobile\">{{ getDisplayName(column) | pascalCase }}:</span>\n {{ accessElement(element, column) }}\n </mat-cell>\n </ng-container>\n\n <!-- Consolidated Action Column with multiple buttons -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n @for (column of actionColumns; track column) {\n <ng-container>\n <button mat-button (click)=\"emitRowData({action: column.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n <mat-icon *ngIf=\"column?.svgIconName\" class=\"svg-icon\" svgIcon=\"{{ column.svgIconName }}\" matListItemIcon></mat-icon>\n <mat-icon *ngIf=\"column?.iconName\" class=\"material-symbols-outlined\">{{ column.iconName }}</mat-icon>\n </button>\n </ng-container>\n }\n\n <!-- Options menu with additional actions -->\n @if (optionActions.length > 0) {\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"Options\">\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n </button>\n }\n\n <mat-menu #menu=\"matMenu\">\n @for (optionAction of optionActions; track optionAction) {\n <ng-container>\n <button mat-menu-item\n (click)=\"emitRowData({action: optionAction.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n @if (optionAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ optionAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (optionAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ optionAction.iconName }}</mat-icon>\n }\n {{ optionAction.columnName | pascalCase }}\n </button>\n </ng-container>\n }\n </mat-menu>\n </mat-cell>\n </ng-container>\n\n @if (hasActionColumns()) {\n <mat-header-row *matHeaderRowDef=\"columnNames.concat(['actions'])\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: columnNames.concat(['actions'])\"></mat-row>\n } @else {\n <mat-header-row *matHeaderRowDef=\"columnNames\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: columnNames\"></mat-row>\n }\n\n</mat-table>\n\n<mat-paginator [length]=\"dataSource?.totalCount$ | async\" (page)=\"selectedPageSizeChanged($event)\" [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"selectedPageSizeSubject.getValue()\"></mat-paginator>\n", styles: [".table-container{display:block;width:100%;max-height:70vh;overflow-x:auto;overflow-y:auto}\n"] }]
359
370
  }], ctorParameters: () => [], propDecorators: { dataSource: [{
360
371
  type: Input
361
- }], dataColumns: [{
362
- type: Input
363
372
  }], actionColumns: [{
364
373
  type: Input
365
374
  }], leftToolbarActions: [{
@@ -368,8 +377,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
368
377
  type: Input
369
378
  }], searchFilterColumns: [{
370
379
  type: Input
371
- }], currentRoute: [{
372
- type: Input
373
380
  }], currentId: [{
374
381
  type: Input
375
382
  }], defaultSortColumn: [{
@@ -388,6 +395,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
388
395
  type: Input
389
396
  }], actionColumnClick: [{
390
397
  type: Output
398
+ }], columns: [{
399
+ type: Input
391
400
  }], paginator: [{
392
401
  type: ViewChild,
393
402
  args: [MatPaginator, { static: false }]
@@ -400,11 +409,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
400
409
  }] } });
401
410
 
402
411
  class MmOctoUiModule {
403
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: MmOctoUiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
404
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.5", ngImport: i0, type: MmOctoUiModule, imports: [MmOctoTableComponent], exports: [MmOctoTableComponent] });
405
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: MmOctoUiModule, imports: [MmOctoTableComponent] });
412
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: MmOctoUiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
413
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.1.6", ngImport: i0, type: MmOctoUiModule, imports: [MmOctoTableComponent], exports: [MmOctoTableComponent] });
414
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: MmOctoUiModule, imports: [MmOctoTableComponent] });
406
415
  }
407
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: MmOctoUiModule, decorators: [{
416
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: MmOctoUiModule, decorators: [{
408
417
  type: NgModule,
409
418
  args: [{
410
419
  declarations: [],
@@ -425,5 +434,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
425
434
  * Generated bundle index. Do not edit.
426
435
  */
427
436
 
428
- export { ListElementModule, MmOctoTableComponent, MmOctoUiModule, OctoListNavigation, OctoListNavigationDataInfo, OctoListNavigationOptions, PascalCasePipe };
437
+ export { ListElementModule, MmOctoTableComponent, MmOctoUiModule, OctoListNavigation, OctoListNavigationDataInfo, OctoListNavigationOptions, PascalCasePipe, getDisplayName };
429
438
  //# sourceMappingURL=meshmakers-octo-ui.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"meshmakers-octo-ui.mjs","sources":["../../../../projects/meshmakers/octo-ui/src/lib/list-element/list-element.module.ts","../../../../projects/meshmakers/octo-ui/src/lib/list-element/octoListNavigation.ts","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-table/mm-octo-table.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-table/mm-octo-table.component.html","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-ui.module.ts","../../../../projects/meshmakers/octo-ui/src/public-api.ts","../../../../projects/meshmakers/octo-ui/src/meshmakers-octo-ui.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [],\n imports: [CommonModule]\n})\nexport class ListElementModule {}\n","import { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, SortDirection } from '@angular/material/sort';\nimport { ElementRef, EventEmitter } from '@angular/core';\nimport { fromEvent, merge } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';\nimport { SearchFilterDto, SearchFilterTypesDto, SortDto, SortOrdersDto } from \"@meshmakers/octo-services\";\n\nexport class OctoListNavigationDataInfo {\n skip: number;\n take: number;\n searchFilter?: SearchFilterDto;\n sort?: SortDto[];\n\n constructor() {\n this.skip = 0;\n this.take = 10;\n }\n}\n\nexport class OctoListNavigationOptions {\n language: string | null;\n searchFilterType?: SearchFilterTypesDto;\n searchFilterAttributePaths?: string[];\n\n constructor() {\n this.language = null;\n }\n}\n\nexport class OctoListNavigation {\n public loadDataRequest = new EventEmitter<OctoListNavigationDataInfo>();\n\n lastSortDirection: SortDirection | null;\n lastSortField: string | null;\n lastSearchText: string | null;\n\n constructor(\n private readonly paginator: MatPaginator,\n private readonly sort: MatSort,\n private readonly searchBox?: ElementRef<HTMLInputElement>,\n private readonly octoOptions?: OctoListNavigationOptions\n ) {\n this.lastSortDirection = null;\n this.lastSortField = null;\n this.lastSearchText = null;\n }\n\n public get loadDataInfo(): OctoListNavigationDataInfo {\n const filterString = this.searchBox?.nativeElement.value;\n const sortField = this.sort.active;\n const sortDirection = this.sort.direction;\n\n let filter = null;\n if (filterString && this.octoOptions) {\n filter = {\n language: this.octoOptions.language,\n searchTerm: filterString,\n type: this.octoOptions.searchFilterType,\n attributePaths: this.octoOptions.searchFilterAttributePaths\n } as SearchFilterDto;\n }\n\n const sort = [];\n if (sortField && sortDirection) {\n sort.push(({\n attributePath: sortField,\n sortOrder: sortDirection === 'asc' ? SortOrdersDto.AscendingDto : SortOrdersDto.DescendingDto\n } as SortDto));\n }\n\n return {\n skip: this.paginator.pageIndex * this.paginator.pageSize,\n take: this.paginator.pageSize,\n searchFilter: filter,\n sort\n } as OctoListNavigationDataInfo;\n }\n\n init(): void {\n\n if (this.searchBox) {\n // server-side search\n fromEvent<ElementRef>(this.searchBox.nativeElement, 'keyup')\n .pipe(\n debounceTime(500),\n distinctUntilChanged(),\n tap(() => {\n this.paginator.pageIndex = 0;\n if (!this.searchBox) {\n return;\n }\n\n const searchText = this.searchBox.nativeElement.value;\n\n if (!this.lastSearchText && searchText) {\n this.lastSortDirection = this.sort.direction;\n this.lastSortField = this.sort.active;\n\n // Reset sorting to see the score rating (default sorting returned from server)\n this.sort.sort({ id: '', start: 'asc', disableClear: false });\n }\n\n this.lastSearchText = searchText;\n\n if (!searchText && this.lastSortField) {\n if (this.lastSortDirection === 'asc') {\n this.sort.sort({\n id: this.lastSortField,\n start: 'asc',\n disableClear: true\n });\n } else if (this.lastSortDirection === 'desc') {\n this.sort.sort({\n id: this.lastSortField,\n start: 'desc',\n disableClear: true\n });\n }\n }\n\n this.loadData();\n })\n )\n .subscribe();\n }\n\n // reset the paginator after sorting\n this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0));\n\n merge(this.sort.sortChange, this.paginator.page)\n .pipe(\n tap(() => {\n this.loadData();\n })\n )\n .subscribe();\n }\n\n private loadData(): void {\n this.loadDataRequest.emit(this.loadDataInfo);\n }\n}\n","import { Component, ElementRef, Input, ViewChild, OnInit, AfterViewInit, Output, EventEmitter } from \"@angular/core\";\nimport { MatPaginator, PageEvent } from \"@angular/material/paginator\";\nimport { MatSort, MatSortHeader } from '@angular/material/sort';\nimport { BehaviorSubject, fromEvent, merge, Observable } from \"rxjs\";\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';\n\nimport { AsyncPipe, NgForOf, NgIf } from \"@angular/common\";\nimport { MatButton, MatIconButton } from \"@angular/material/button\";\nimport {\n MatCell, MatCellDef,\n MatColumnDef,\n MatHeaderCell, MatHeaderCellDef,\n MatHeaderRow, MatHeaderRowDef,\n MatRow, MatRowDef,\n MatTable\n} from \"@angular/material/table\";\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatToolbar } from '@angular/material/toolbar';\n\n\n// pascal-case.pipe.ts\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from \"@angular/material/menu\";\nimport { MatListItemIcon } from \"@angular/material/list\";\nimport { RouterLink } from \"@angular/router\";\nimport { AssetRepoGraphQlDataSource, SearchFilterDto, SearchFilterTypesDto, SortDto, SortOrdersDto } from \"@meshmakers/octo-services\";\n\n@Pipe({\n standalone: true,\n name: \"pascalCase\"\n})\nexport class PascalCasePipe implements PipeTransform {\n transform(value: string): string {\n if (!value) return value;\n return value.charAt(0).toUpperCase() + value.slice(1);\n }\n}\n\nexport interface DataColumns {\n columnNames: string[];\n accessPaths: Record<string, string>\n}\n\nexport interface ActionColumn {\n columnName: string;\n iconName?: string;\n svgIconName?: string;\n}\n\nexport interface ToolbarAction {\n iconName?: string;\n svgIconName?: string;\n route?: string;\n actionText: string;\n isDisabled?: Observable<boolean>;\n}\n\n@Component({\n selector: 'mm-octo-table',\n standalone: true,\n imports: [\n AsyncPipe,\n MatButton,\n MatCell,\n MatCellDef,\n MatColumnDef,\n MatFormField,\n MatHeaderCell,\n MatIcon,\n MatInput,\n MatLabel,\n MatPaginator,\n MatProgressBar,\n MatRow,\n MatRowDef,\n MatSort,\n MatSortHeader,\n MatTable,\n MatToolbar,\n NgIf,\n MatHeaderCellDef,\n NgForOf,\n PascalCasePipe,\n MatIcon,\n MatIconButton,\n MatMenu,\n MatMenuItem,\n MatMenuTrigger,\n MatIcon,\n MatIcon,\n MatListItemIcon,\n MatHeaderRow,\n MatHeaderRowDef,\n MatHeaderRow,\n MatHeaderRowDef,\n MatButton,\n MatIcon,\n RouterLink,\n MatIcon,\n MatHeaderCellDef,\n MatCellDef,\n MatHeaderRowDef,\n MatRowDef\n ],\n templateUrl: './mm-octo-table.component.html',\n styleUrl: './mm-octo-table.component.scss'\n})\nexport class MmOctoTableComponent implements OnInit, AfterViewInit {\n @Input() dataSource!: AssetRepoGraphQlDataSource<any, any, any>;\n @Input() dataColumns: DataColumns = { columnNames: [], accessPaths: {} };\n @Input() actionColumns: ActionColumn[] = [];\n @Input() leftToolbarActions: ToolbarAction[] = [];\n @Input() optionActions: ActionColumn[] = [];\n @Input() searchFilterColumns: string[] = [];\n @Input() currentRoute = \"\";\n @Input() currentId = \"\";\n @Input() defaultSortColumn = \"\";\n @Input() rowIsClickable = true;\n\n @Input() pageSizeOptions= [5, 10, 20, 50];\n @Input() selectedPageSize = 5;\n\n @Output() rowClicked = new EventEmitter<any>();\n @Output() searchFilterStringUpdated = new EventEmitter<string>();\n @Input() selectedRowId = \"\"\n\n @Output() actionColumnClick = new EventEmitter<{ action: string; id: string, entry: any }>()\n\n selectedRow: any = null; // Track the selected row\n\n selectedPageSizeSubject: BehaviorSubject<number> = new BehaviorSubject<number>(this.selectedPageSize);\n\n\n @ViewChild(MatPaginator, { static: false }) paginator?: MatPaginator;\n @ViewChild(MatSort, { static: false }) sort?: MatSort;\n @ViewChild('input', { static: false }) input?: ElementRef<HTMLInputElement>;\n\n protected loading = false;\n protected isMobile: boolean;\n\n constructor() {\n this.isMobile = false;\n }\n\n ngOnInit(): void {\n\n this.selectedPageSizeSubject.next(this.selectedPageSize);\n // at least add the currentId to the search filter columns\n if(this.currentId && !this.searchFilterColumns.includes(this.currentId)) {\n this.searchFilterColumns.push(this.currentId);\n }\n\n if (!this.dataSource) {\n throw new Error('No dataSource provided');\n }\n\n this.checkSelectedRow();\n }\n\n // noinspection JSUnusedGlobalSymbols\n ngAfterViewInit(): void {\n if (this.sort && this.input && this.paginator) {\n\n fromEvent(this.input.nativeElement, 'keyup')\n .pipe(\n debounceTime(500),\n distinctUntilChanged(),\n tap(() => {\n // server-side search\n if (this.paginator) {\n this.paginator.pageIndex = 0;\n }\n this.searchFilterStringUpdated.emit(this.input?.nativeElement?.value ?? \"\");\n this.loadData();\n })\n )\n .subscribe();\n\n // reset the paginator after sorting\n this.sort.sortChange.subscribe(() => {\n if (this.paginator) this.paginator.pageIndex = 0;\n });\n\n merge(this.sort.sortChange, this.paginator.page)\n .pipe(\n tap(() => {\n this.loadData();\n })\n )\n .subscribe();\n }\n }\n\n loadData(): void {\n if (!this.input || !this.sort) {\n return;\n }\n const filterString = this.input.nativeElement.value;\n const field = this.sort.active;\n const direction = this.sort.direction;\n\n let filter = null;\n if (filterString) {\n filter = {\n type: SearchFilterTypesDto.AttributeFilterDto,\n attributeNames: this.searchFilterColumns,\n searchTerm: filterString\n } as SearchFilterDto;\n }\n\n const sort = [];\n if (field) {\n sort.push(({\n attributePath: field,\n sortOrder: direction === 'asc' ? SortOrdersDto.AscendingDto : SortOrdersDto.DescendingDto\n } as SortDto));\n }\n\n if (this.paginator) {\n this.dataSource?.loadData(this.paginator.pageIndex * this.paginator.pageSize, this.paginator.pageSize, filter, null, sort);\n }\n }\n\n protected readonly encodeURIComponent = encodeURIComponent;\n\n accessElement(element:any, column: string, accessPaths: Record<string, string>): any {\n // get keys of accessPaths\n const keys = Object.keys(accessPaths);\n // check if column is in keys\n if(!keys.includes(column)) {\n return element[column];\n }\n\n try {\n // if column is in accessPaths, try split accessPaths[column] by '.' and access element\n const path = accessPaths[column].split('.');\n let result = element;\n for (const p of path) {\n result = result[p];\n }\n return result;\n } catch {\n //console.log(`Error accessing element: ${e}`);\n return \"NONE\";\n }\n }\n\n selectedPageSizeChanged($event: PageEvent) {\n console.log($event.pageSize)\n this.selectedPageSizeSubject.next($event.pageSize);\n }\n\n getActionColumnNames(): string[] {\n return this.actionColumns.map(ac => ac.columnName);\n }\n\n\n onRowClick(row: any) {\n if (this.rowIsClickable) {\n this.selectedRow = row; // Set the clicked row as the selected one\n this.rowClicked.emit(row); // Emit the clicked row data\n }\n }\n\n isRowSelected(row: any): boolean {\n return this.selectedRow === row; // Check if the row is selected\n }\n\n checkSelectedRow() {\n\n // @ts-expect-error jnu\n this.dataSource.connect(null).subscribe((data) => {\n for(const entry of data) {\n if(entry.rtId === this.selectedRowId) {\n this.onRowClick(entry)\n }\n }\n });\n }\n\n\n emitRowData(data: { action: string; id: string, entry: any }) {\n this.actionColumnClick.emit(data)\n }\n\n\n // Predicate for rows with optionActions\n hasOptionActions = (_row: any) => {\n return this.optionActions.length > 0;\n };\n\n // Predicate for rows with actionColumns but no optionActions\n hasActionColumns = () => {\n return this.actionColumns.length > 0 || this.optionActions.length > 0;\n };\n}\n","<div>\n <mat-progress-bar *ngIf=\"loading || (dataSource?.loading$ | async)\" mode=\"indeterminate\"></mat-progress-bar>\n</div>\n\n<mat-toolbar class=\"octo-toolbar octo-detail-toolbar\">\n @for (toolbarAction of leftToolbarActions; track toolbarAction) {\n <button mat-flat-button routerLink=\"{{toolbarAction.route}}\" type=\"button\" [disabled]=\"!toolbarAction.isDisabled ? false : (toolbarAction.isDisabled | async)\">\n @if (toolbarAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ toolbarAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (toolbarAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ toolbarAction.iconName }}</mat-icon>\n }\n {{ toolbarAction.actionText }}\n </button>\n }\n\n <div class=\"octo-spacer\"></div>\n\n <div class=\"octo-toolbar-search\">\n <mat-form-field appearance=\"outline\">\n <mat-label>\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n Search\n </mat-label>\n <input #input matInput [disabled]=\"loading\">\n </mat-form-field>\n </div>\n</mat-toolbar>\n\n<mat-table [class.isMobile]=\"isMobile\" [dataSource]=\"dataSource\" class=\"mat-elevation-z8 table-container\" mat-table matSort\n matSortActive=\"{{defaultSortColumn}}\" matSortDirection=\"asc\" matSortDisableClear=\"true\">\n\n <ng-container *ngFor=\"let column of dataColumns?.columnNames\" [matColumnDef]=\"column\">\n <mat-header-cell *matHeaderCellDef mat-sort-header> {{ column | pascalCase }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"isMobile\">{{ column | pascalCase }}:</span>\n {{ accessElement(element, column, dataColumns.accessPaths) }}\n </mat-cell>\n </ng-container>\n\n <!-- Consolidated Action Column with multiple buttons -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n @for (column of actionColumns; track column) {\n <ng-container>\n <button mat-button (click)=\"emitRowData({action: column.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n <mat-icon *ngIf=\"column?.svgIconName\" class=\"svg-icon\" svgIcon=\"{{ column.svgIconName }}\" matListItemIcon></mat-icon>\n <mat-icon *ngIf=\"column?.iconName\" class=\"material-symbols-outlined\">{{ column.iconName }}</mat-icon>\n </button>\n </ng-container>\n }\n\n <!-- Options menu with additional actions -->\n @if (optionActions.length > 0) {\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"Options\">\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n </button>\n }\n\n <mat-menu #menu=\"matMenu\">\n @for (optionAction of optionActions; track optionAction) {\n <ng-container>\n <button mat-menu-item\n (click)=\"emitRowData({action: optionAction.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n @if (optionAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ optionAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (optionAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ optionAction.iconName }}</mat-icon>\n }\n {{ optionAction.columnName | pascalCase }}\n </button>\n </ng-container>\n }\n </mat-menu>\n </mat-cell>\n </ng-container>\n\n <!-- Row when there are actions -->\n @if (hasActionColumns()) {\n <mat-header-row *matHeaderRowDef=\"dataColumns?.columnNames?.concat(['actions'])\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: dataColumns?.columnNames?.concat(['actions'])\"></mat-row>\n } @else {\n <mat-header-row *matHeaderRowDef=\"dataColumns?.columnNames\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: dataColumns?.columnNames\"></mat-row>\n }\n\n</mat-table>\n\n<mat-paginator [length]=\"dataSource?.totalCount$ | async\" (page)=\"selectedPageSizeChanged($event)\" [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"selectedPageSizeSubject.getValue()\"></mat-paginator>\n","import { NgModule } from '@angular/core';\nimport { MmOctoTableComponent } from \"./mm-octo-table/mm-octo-table.component\";\n\n\n\n@NgModule({\n declarations: [\n\n ],\n imports: [\n MmOctoTableComponent\n ],\n exports: [\n MmOctoTableComponent\n ]\n})\nexport class MmOctoUiModule { }\n","/*\n * Public API Surface of octo-ui\n */\n\nexport * from './lib/list-element/list-element.module';\nexport * from './lib/list-element/octoListNavigation';\n\n\nexport * from './lib/mm-octo-table/mm-octo-table.component';\nexport * from './lib/mm-octo-ui.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"meshmakers-octo-ui.mjs","sources":["../../../../projects/meshmakers/octo-ui/src/lib/list-element/list-element.module.ts","../../../../projects/meshmakers/octo-ui/src/lib/list-element/octoListNavigation.ts","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-table/mm-octo-table.model.ts","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-table/mm-octo-table.component.ts","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-table/mm-octo-table.component.html","../../../../projects/meshmakers/octo-ui/src/lib/mm-octo-ui.module.ts","../../../../projects/meshmakers/octo-ui/src/public-api.ts","../../../../projects/meshmakers/octo-ui/src/meshmakers-octo-ui.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [],\n imports: [CommonModule]\n})\nexport class ListElementModule {}\n","import { MatPaginator } from '@angular/material/paginator';\nimport { MatSort, SortDirection } from '@angular/material/sort';\nimport { ElementRef, EventEmitter } from '@angular/core';\nimport { fromEvent, merge } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';\nimport { SearchFilterDto, SearchFilterTypesDto, SortDto, SortOrdersDto } from \"@meshmakers/octo-services\";\n\nexport class OctoListNavigationDataInfo {\n skip: number;\n take: number;\n searchFilter?: SearchFilterDto;\n sort?: SortDto[];\n\n constructor() {\n this.skip = 0;\n this.take = 10;\n }\n}\n\nexport class OctoListNavigationOptions {\n language: string | null;\n searchFilterType?: SearchFilterTypesDto;\n searchFilterAttributePaths?: string[];\n\n constructor() {\n this.language = null;\n }\n}\n\nexport class OctoListNavigation {\n public loadDataRequest = new EventEmitter<OctoListNavigationDataInfo>();\n\n lastSortDirection: SortDirection | null;\n lastSortField: string | null;\n lastSearchText: string | null;\n\n constructor(\n private readonly paginator: MatPaginator,\n private readonly sort: MatSort,\n private readonly searchBox?: ElementRef<HTMLInputElement>,\n private readonly octoOptions?: OctoListNavigationOptions\n ) {\n this.lastSortDirection = null;\n this.lastSortField = null;\n this.lastSearchText = null;\n }\n\n public get loadDataInfo(): OctoListNavigationDataInfo {\n const filterString = this.searchBox?.nativeElement.value;\n const sortField = this.sort.active;\n const sortDirection = this.sort.direction;\n\n let filter = null;\n if (filterString && this.octoOptions) {\n filter = {\n language: this.octoOptions.language,\n searchTerm: filterString,\n type: this.octoOptions.searchFilterType,\n attributePaths: this.octoOptions.searchFilterAttributePaths\n } as SearchFilterDto;\n }\n\n const sort = [];\n if (sortField && sortDirection) {\n sort.push(({\n attributePath: sortField,\n sortOrder: sortDirection === 'asc' ? SortOrdersDto.AscendingDto : SortOrdersDto.DescendingDto\n } as SortDto));\n }\n\n return {\n skip: this.paginator.pageIndex * this.paginator.pageSize,\n take: this.paginator.pageSize,\n searchFilter: filter,\n sort\n } as OctoListNavigationDataInfo;\n }\n\n init(): void {\n\n if (this.searchBox) {\n // server-side search\n fromEvent<ElementRef>(this.searchBox.nativeElement, 'keyup')\n .pipe(\n debounceTime(500),\n distinctUntilChanged(),\n tap(() => {\n this.paginator.pageIndex = 0;\n if (!this.searchBox) {\n return;\n }\n\n const searchText = this.searchBox.nativeElement.value;\n\n if (!this.lastSearchText && searchText) {\n this.lastSortDirection = this.sort.direction;\n this.lastSortField = this.sort.active;\n\n // Reset sorting to see the score rating (default sorting returned from server)\n this.sort.sort({ id: '', start: 'asc', disableClear: false });\n }\n\n this.lastSearchText = searchText;\n\n if (!searchText && this.lastSortField) {\n if (this.lastSortDirection === 'asc') {\n this.sort.sort({\n id: this.lastSortField,\n start: 'asc',\n disableClear: true\n });\n } else if (this.lastSortDirection === 'desc') {\n this.sort.sort({\n id: this.lastSortField,\n start: 'desc',\n disableClear: true\n });\n }\n }\n\n this.loadData();\n })\n )\n .subscribe();\n }\n\n // reset the paginator after sorting\n this.sort.sortChange.subscribe(() => (this.paginator.pageIndex = 0));\n\n merge(this.sort.sortChange, this.paginator.page)\n .pipe(\n tap(() => {\n this.loadData();\n })\n )\n .subscribe();\n }\n\n private loadData(): void {\n this.loadDataRequest.emit(this.loadDataInfo);\n }\n}\n","export interface TableColumn {\n displayName?: string | null;\n dataKey: string;\n}\n\n\nexport function getDisplayName(column: TableColumn): string {\n return column.displayName ?? column.dataKey;\n}\n\nexport type ColumnDefinition =\n | string\n | TableColumn;\n","import { Component, ElementRef, Input, ViewChild, OnInit, AfterViewInit, Output, EventEmitter } from \"@angular/core\";\nimport { MatPaginator, PageEvent } from \"@angular/material/paginator\";\nimport { MatSort, MatSortHeader } from '@angular/material/sort';\nimport { BehaviorSubject, fromEvent, merge, Observable } from \"rxjs\";\nimport { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';\n\nimport { AsyncPipe, NgForOf, NgIf } from \"@angular/common\";\nimport { MatButton, MatIconButton } from \"@angular/material/button\";\nimport {\n MatCell, MatCellDef,\n MatColumnDef,\n MatHeaderCell, MatHeaderCellDef,\n MatHeaderRow, MatHeaderRowDef,\n MatRow, MatRowDef,\n MatTable\n} from \"@angular/material/table\";\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatInput } from '@angular/material/input';\nimport { MatProgressBar } from '@angular/material/progress-bar';\nimport { MatToolbar } from '@angular/material/toolbar';\n\n\n// pascal-case.pipe.ts\nimport { Pipe, PipeTransform } from '@angular/core';\nimport { MatMenu, MatMenuItem, MatMenuTrigger } from \"@angular/material/menu\";\nimport { MatListItemIcon } from \"@angular/material/list\";\nimport { RouterLink } from \"@angular/router\";\nimport { AssetRepoGraphQlDataSource, SearchFilterDto, SearchFilterTypesDto, SortDto, SortOrdersDto } from \"@meshmakers/octo-services\";\nimport { ColumnDefinition, getDisplayName, TableColumn } from \"./mm-octo-table.model\";\n\n@Pipe({\n standalone: true,\n name: \"pascalCase\"\n})\nexport class PascalCasePipe implements PipeTransform {\n transform(value: string): string {\n if (!value) return value;\n return value.charAt(0).toUpperCase() + value.slice(1);\n }\n}\n\nexport interface ActionColumn {\n columnName: string;\n iconName?: string;\n svgIconName?: string;\n}\n\nexport interface ToolbarAction {\n iconName?: string;\n svgIconName?: string;\n route?: string;\n actionText: string;\n isDisabled?: Observable<boolean>;\n}\n\n@Component({\n selector: 'mm-octo-table',\n standalone: true,\n imports: [\n AsyncPipe,\n MatButton,\n MatCell,\n MatCellDef,\n MatColumnDef,\n MatFormField,\n MatHeaderCell,\n MatIcon,\n MatInput,\n MatLabel,\n MatPaginator,\n MatProgressBar,\n MatRow,\n MatRowDef,\n MatSort,\n MatSortHeader,\n MatTable,\n MatToolbar,\n NgIf,\n MatHeaderCellDef,\n NgForOf,\n PascalCasePipe,\n MatIcon,\n MatIconButton,\n MatMenu,\n MatMenuItem,\n MatMenuTrigger,\n MatIcon,\n MatIcon,\n MatListItemIcon,\n MatHeaderRow,\n MatHeaderRowDef,\n MatHeaderRow,\n MatHeaderRowDef,\n MatButton,\n MatIcon,\n RouterLink,\n MatIcon,\n MatHeaderCellDef,\n MatCellDef,\n MatHeaderRowDef,\n MatRowDef\n ],\n templateUrl: './mm-octo-table.component.html',\n styleUrl: './mm-octo-table.component.scss'\n})\nexport class MmOctoTableComponent implements OnInit, AfterViewInit {\n @Input() dataSource!: AssetRepoGraphQlDataSource<any, any, any>;\n\n @Input() actionColumns: ActionColumn[] = [];\n @Input() leftToolbarActions: ToolbarAction[] = [];\n @Input() optionActions: ActionColumn[] = [];\n @Input() searchFilterColumns: string[] = [];\n @Input() currentId = \"\";\n @Input() defaultSortColumn = \"\";\n @Input() rowIsClickable = true;\n\n @Input() pageSizeOptions= [5, 10, 20, 50];\n @Input() selectedPageSize = 5;\n\n @Output() rowClicked = new EventEmitter<any>();\n @Output() searchFilterStringUpdated = new EventEmitter<string>();\n @Input() selectedRowId = \"\"\n\n @Output() actionColumnClick = new EventEmitter<{ action: string; id: string, entry: any }>()\n\n @Input() set columns(cols: ColumnDefinition[]){\n if(cols === null || cols === undefined || cols.length === 0) {\n this._columns = [];\n return;\n }\n\n this._columns = [];\n\n for (const column of cols) {\n if(typeof column === 'string'){\n this._columns.push({dataKey: column});\n }else{\n this._columns.push(column);\n }\n }\n }\n\n get columns(): TableColumn[]{\n return this._columns;\n }\n _columns: TableColumn[] = [];\n\n\n selectedRow: any = null; // Track the selected row\n\n selectedPageSizeSubject: BehaviorSubject<number> = new BehaviorSubject<number>(this.selectedPageSize);\n\n @ViewChild(MatPaginator, { static: false }) paginator?: MatPaginator;\n @ViewChild(MatSort, { static: false }) sort?: MatSort;\n @ViewChild('input', { static: false }) input?: ElementRef<HTMLInputElement>;\n\n get columnNames(): string[] {\n return this._columns.map(c => getDisplayName(c));\n }\n\n protected loading = false;\n protected isMobile: boolean;\n\n constructor() {\n this.isMobile = false;\n }\n\n ngOnInit(): void {\n\n this.selectedPageSizeSubject.next(this.selectedPageSize);\n\n\n if (!this.dataSource) {\n throw new Error('No dataSource provided');\n }\n\n this.checkSelectedRow();\n }\n\n ngAfterViewInit(): void {\n if (this.sort && this.input && this.paginator) {\n\n fromEvent(this.input.nativeElement, 'keyup')\n .pipe(\n debounceTime(500),\n distinctUntilChanged(),\n tap(() => {\n // server-side search\n if (this.paginator) {\n this.paginator.pageIndex = 0;\n }\n this.searchFilterStringUpdated.emit(this.input?.nativeElement?.value ?? \"\");\n this.loadData();\n })\n )\n .subscribe();\n\n // reset the paginator after sorting\n this.sort.sortChange.subscribe(() => {\n if (this.paginator) this.paginator.pageIndex = 0;\n });\n\n merge(this.sort.sortChange, this.paginator.page)\n .pipe(\n tap(() => {\n this.loadData();\n })\n )\n .subscribe();\n }\n }\n\n loadData(): void {\n if (!this.input || !this.sort) {\n return;\n }\n const filterString = this.input.nativeElement.value;\n const field = this.sort.active;\n const direction = this.sort.direction;\n\n let filter = null;\n if (filterString) {\n filter = {\n type: SearchFilterTypesDto.AttributeFilterDto,\n attributeNames: this.searchFilterColumns,\n searchTerm: filterString\n } as SearchFilterDto;\n }\n\n const sort = [];\n if (field) {\n sort.push(({\n attributePath: field,\n sortOrder: direction === 'asc' ? SortOrdersDto.AscendingDto : SortOrdersDto.DescendingDto\n } as SortDto));\n }\n\n if (this.paginator) {\n this.dataSource?.loadData(this.paginator.pageIndex * this.paginator.pageSize, this.paginator.pageSize, filter, null, sort);\n }\n }\n\n protected readonly encodeURIComponent = encodeURIComponent;\n\n accessElement(element:any, column: TableColumn): any {\n if(column.dataKey.indexOf('.') === -1) {\n return element[column.dataKey];\n }\n\n // else we have a nested object\n const keys = column.dataKey.split('.');\n let value = element;\n for(const key of keys) {\n value = value[key];\n }\n return value;\n }\n\n selectedPageSizeChanged($event: PageEvent) {\n console.log($event.pageSize)\n this.selectedPageSizeSubject.next($event.pageSize);\n }\n\n getActionColumnNames(): string[] {\n return this.actionColumns.map(ac => ac.columnName);\n }\n\n\n onRowClick(row: any) {\n if (this.rowIsClickable) {\n this.selectedRow = row; // Set the clicked row as the selected one\n this.rowClicked.emit(row); // Emit the clicked row data\n }\n }\n\n isRowSelected(row: any): boolean {\n return this.selectedRow === row; // Check if the row is selected\n }\n\n checkSelectedRow() {\n\n // @ts-expect-error jnu\n this.dataSource.connect(null).subscribe((data) => {\n for(const entry of data) {\n if(entry.rtId === this.selectedRowId) {\n this.onRowClick(entry)\n }\n }\n });\n }\n\n\n emitRowData(data: { action: string; id: string, entry: any }) {\n this.actionColumnClick.emit(data)\n }\n\n\n // Predicate for rows with optionActions\n hasOptionActions = (_row: any) => {\n return this.optionActions.length > 0;\n };\n\n // Predicate for rows with actionColumns but no optionActions\n hasActionColumns = () => {\n return this.actionColumns.length > 0 || this.optionActions.length > 0;\n };\n protected readonly getDisplayName = getDisplayName;\n}\n","<div>\n <mat-progress-bar *ngIf=\"loading || (dataSource?.loading$ | async)\" mode=\"indeterminate\"></mat-progress-bar>\n</div>\n\n<mat-toolbar class=\"octo-toolbar octo-detail-toolbar\">\n @for (toolbarAction of leftToolbarActions; track toolbarAction) {\n <button mat-flat-button routerLink=\"{{toolbarAction.route}}\" type=\"button\" [disabled]=\"!toolbarAction.isDisabled ? false : (toolbarAction.isDisabled | async)\">\n @if (toolbarAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ toolbarAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (toolbarAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ toolbarAction.iconName }}</mat-icon>\n }\n {{ toolbarAction.actionText }}\n </button>\n }\n\n <div class=\"octo-spacer\"></div>\n\n <div class=\"octo-toolbar-search\">\n <mat-form-field appearance=\"outline\">\n <mat-label>\n <mat-icon class=\"material-symbols-outlined\">search</mat-icon>\n Search\n </mat-label>\n <input #input matInput [disabled]=\"loading\">\n </mat-form-field>\n </div>\n</mat-toolbar>\n\n<mat-table [class.isMobile]=\"isMobile\" [dataSource]=\"dataSource\" class=\"mat-elevation-z8 table-container\" mat-table matSort\n matSortActive=\"{{defaultSortColumn}}\" matSortDirection=\"asc\" matSortDisableClear=\"true\">\n\n <ng-container *ngFor=\"let column of columns\" [matColumnDef]=\"getDisplayName(column)\">\n <mat-header-cell *matHeaderCellDef mat-sort-header> {{ getDisplayName(column) | pascalCase }}</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n <span *ngIf=\"isMobile\">{{ getDisplayName(column) | pascalCase }}:</span>\n {{ accessElement(element, column) }}\n </mat-cell>\n </ng-container>\n\n <!-- Consolidated Action Column with multiple buttons -->\n <ng-container matColumnDef=\"actions\">\n <mat-header-cell *matHeaderCellDef>Actions</mat-header-cell>\n <mat-cell *matCellDef=\"let element\">\n @for (column of actionColumns; track column) {\n <ng-container>\n <button mat-button (click)=\"emitRowData({action: column.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n <mat-icon *ngIf=\"column?.svgIconName\" class=\"svg-icon\" svgIcon=\"{{ column.svgIconName }}\" matListItemIcon></mat-icon>\n <mat-icon *ngIf=\"column?.iconName\" class=\"material-symbols-outlined\">{{ column.iconName }}</mat-icon>\n </button>\n </ng-container>\n }\n\n <!-- Options menu with additional actions -->\n @if (optionActions.length > 0) {\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"Options\">\n <mat-icon class=\"material-symbols-outlined\">more_vert</mat-icon>\n </button>\n }\n\n <mat-menu #menu=\"matMenu\">\n @for (optionAction of optionActions; track optionAction) {\n <ng-container>\n <button mat-menu-item\n (click)=\"emitRowData({action: optionAction.columnName, id: encodeURIComponent(element[currentId]), entry: element})\">\n @if (optionAction?.svgIconName) {\n <mat-icon class=\"svg-icon\" svgIcon=\"{{ optionAction.svgIconName }}\" matListItemIcon></mat-icon>\n }\n @if (optionAction?.iconName) {\n <mat-icon class=\"material-symbols-outlined\">{{ optionAction.iconName }}</mat-icon>\n }\n {{ optionAction.columnName | pascalCase }}\n </button>\n </ng-container>\n }\n </mat-menu>\n </mat-cell>\n </ng-container>\n\n @if (hasActionColumns()) {\n <mat-header-row *matHeaderRowDef=\"columnNames.concat(['actions'])\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: columnNames.concat(['actions'])\"></mat-row>\n } @else {\n <mat-header-row *matHeaderRowDef=\"columnNames\"></mat-header-row>\n <mat-row *matRowDef=\"let row; columns: columnNames\"></mat-row>\n }\n\n</mat-table>\n\n<mat-paginator [length]=\"dataSource?.totalCount$ | async\" (page)=\"selectedPageSizeChanged($event)\" [pageSizeOptions]=\"pageSizeOptions\"\n [pageSize]=\"selectedPageSizeSubject.getValue()\"></mat-paginator>\n","import { NgModule } from '@angular/core';\nimport { MmOctoTableComponent } from \"./mm-octo-table/mm-octo-table.component\";\n\n\n\n@NgModule({\n declarations: [\n\n ],\n imports: [\n MmOctoTableComponent\n ],\n exports: [\n MmOctoTableComponent\n ]\n})\nexport class MmOctoUiModule { }\n","/*\n * Public API Surface of octo-ui\n */\n\nexport * from './lib/list-element/list-element.module';\nexport * from './lib/list-element/octoListNavigation';\n\n\nexport * from './lib/mm-octo-table/mm-octo-table.component';\nexport * from './lib/mm-octo-ui.module';\n\nexport * from './lib/mm-octo-table/mm-octo-table.model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -4,16 +4,13 @@ import { MatSort } from '@angular/material/sort';
4
4
  import { BehaviorSubject, Observable } from "rxjs";
5
5
  import { PipeTransform } from '@angular/core';
6
6
  import { AssetRepoGraphQlDataSource } from "@meshmakers/octo-services";
7
+ import { ColumnDefinition, getDisplayName, TableColumn } from "./mm-octo-table.model";
7
8
  import * as i0 from "@angular/core";
8
9
  export declare class PascalCasePipe implements PipeTransform {
9
10
  transform(value: string): string;
10
11
  static ɵfac: i0.ɵɵFactoryDeclaration<PascalCasePipe, never>;
11
12
  static ɵpipe: i0.ɵɵPipeDeclaration<PascalCasePipe, "pascalCase", true>;
12
13
  }
13
- export interface DataColumns {
14
- columnNames: string[];
15
- accessPaths: Record<string, string>;
16
- }
17
14
  export interface ActionColumn {
18
15
  columnName: string;
19
16
  iconName?: string;
@@ -28,12 +25,10 @@ export interface ToolbarAction {
28
25
  }
29
26
  export declare class MmOctoTableComponent implements OnInit, AfterViewInit {
30
27
  dataSource: AssetRepoGraphQlDataSource<any, any, any>;
31
- dataColumns: DataColumns;
32
28
  actionColumns: ActionColumn[];
33
29
  leftToolbarActions: ToolbarAction[];
34
30
  optionActions: ActionColumn[];
35
31
  searchFilterColumns: string[];
36
- currentRoute: string;
37
32
  currentId: string;
38
33
  defaultSortColumn: string;
39
34
  rowIsClickable: boolean;
@@ -47,11 +42,15 @@ export declare class MmOctoTableComponent implements OnInit, AfterViewInit {
47
42
  id: string;
48
43
  entry: any;
49
44
  }>;
45
+ set columns(cols: ColumnDefinition[]);
46
+ get columns(): TableColumn[];
47
+ _columns: TableColumn[];
50
48
  selectedRow: any;
51
49
  selectedPageSizeSubject: BehaviorSubject<number>;
52
50
  paginator?: MatPaginator;
53
51
  sort?: MatSort;
54
52
  input?: ElementRef<HTMLInputElement>;
53
+ get columnNames(): string[];
55
54
  protected loading: boolean;
56
55
  protected isMobile: boolean;
57
56
  constructor();
@@ -59,7 +58,7 @@ export declare class MmOctoTableComponent implements OnInit, AfterViewInit {
59
58
  ngAfterViewInit(): void;
60
59
  loadData(): void;
61
60
  protected readonly encodeURIComponent: typeof encodeURIComponent;
62
- accessElement(element: any, column: string, accessPaths: Record<string, string>): any;
61
+ accessElement(element: any, column: TableColumn): any;
63
62
  selectedPageSizeChanged($event: PageEvent): void;
64
63
  getActionColumnNames(): string[];
65
64
  onRowClick(row: any): void;
@@ -72,6 +71,7 @@ export declare class MmOctoTableComponent implements OnInit, AfterViewInit {
72
71
  }): void;
73
72
  hasOptionActions: (_row: any) => boolean;
74
73
  hasActionColumns: () => boolean;
74
+ protected readonly getDisplayName: typeof getDisplayName;
75
75
  static ɵfac: i0.ɵɵFactoryDeclaration<MmOctoTableComponent, never>;
76
- static ɵcmp: i0.ɵɵComponentDeclaration<MmOctoTableComponent, "mm-octo-table", never, { "dataSource": { "alias": "dataSource"; "required": false; }; "dataColumns": { "alias": "dataColumns"; "required": false; }; "actionColumns": { "alias": "actionColumns"; "required": false; }; "leftToolbarActions": { "alias": "leftToolbarActions"; "required": false; }; "optionActions": { "alias": "optionActions"; "required": false; }; "searchFilterColumns": { "alias": "searchFilterColumns"; "required": false; }; "currentRoute": { "alias": "currentRoute"; "required": false; }; "currentId": { "alias": "currentId"; "required": false; }; "defaultSortColumn": { "alias": "defaultSortColumn"; "required": false; }; "rowIsClickable": { "alias": "rowIsClickable"; "required": false; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; }; "selectedPageSize": { "alias": "selectedPageSize"; "required": false; }; "selectedRowId": { "alias": "selectedRowId"; "required": false; }; }, { "rowClicked": "rowClicked"; "searchFilterStringUpdated": "searchFilterStringUpdated"; "actionColumnClick": "actionColumnClick"; }, never, never, true, never>;
76
+ static ɵcmp: i0.ɵɵComponentDeclaration<MmOctoTableComponent, "mm-octo-table", never, { "dataSource": { "alias": "dataSource"; "required": false; }; "actionColumns": { "alias": "actionColumns"; "required": false; }; "leftToolbarActions": { "alias": "leftToolbarActions"; "required": false; }; "optionActions": { "alias": "optionActions"; "required": false; }; "searchFilterColumns": { "alias": "searchFilterColumns"; "required": false; }; "currentId": { "alias": "currentId"; "required": false; }; "defaultSortColumn": { "alias": "defaultSortColumn"; "required": false; }; "rowIsClickable": { "alias": "rowIsClickable"; "required": false; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; }; "selectedPageSize": { "alias": "selectedPageSize"; "required": false; }; "selectedRowId": { "alias": "selectedRowId"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; }, { "rowClicked": "rowClicked"; "searchFilterStringUpdated": "searchFilterStringUpdated"; "actionColumnClick": "actionColumnClick"; }, never, never, true, never>;
77
77
  }
@@ -0,0 +1,6 @@
1
+ export interface TableColumn {
2
+ displayName?: string | null;
3
+ dataKey: string;
4
+ }
5
+ export declare function getDisplayName(column: TableColumn): string;
6
+ export type ColumnDefinition = string | TableColumn;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshmakers/octo-ui",
3
- "version": "3.2.21-0",
3
+ "version": "3.2.25-0",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^19.1.2",
6
6
  "@angular/core": "^19.1.2"
package/public-api.d.ts CHANGED
@@ -2,3 +2,4 @@ export * from './lib/list-element/list-element.module';
2
2
  export * from './lib/list-element/octoListNavigation';
3
3
  export * from './lib/mm-octo-table/mm-octo-table.component';
4
4
  export * from './lib/mm-octo-ui.module';
5
+ export * from './lib/mm-octo-table/mm-octo-table.model';