@universis/ngx-tables 6.13.3 → 6.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/bundles/universis-ngx-tables.umd.js +156 -11
  2. package/bundles/universis-ngx-tables.umd.js.map +1 -1
  3. package/bundles/universis-ngx-tables.umd.min.js +1 -1
  4. package/bundles/universis-ngx-tables.umd.min.js.map +1 -1
  5. package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +6 -3
  6. package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +6 -3
  7. package/esm2015/lib/components/advanced-table/advanced-table.component.js +96 -5
  8. package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +6 -31
  9. package/esm2015/lib/components/advanced-table/custom-button.formatter.js +45 -0
  10. package/esm2015/lib/i18n/tables.el.js +3 -2
  11. package/esm2015/lib/i18n/tables.en.js +3 -2
  12. package/esm2015/universis-ngx-tables.js +5 -4
  13. package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +6 -3
  14. package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +6 -3
  15. package/esm5/lib/components/advanced-table/advanced-table.component.js +101 -5
  16. package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +6 -31
  17. package/esm5/lib/components/advanced-table/custom-button.formatter.js +56 -0
  18. package/esm5/lib/i18n/tables.el.js +3 -2
  19. package/esm5/lib/i18n/tables.en.js +3 -2
  20. package/esm5/universis-ngx-tables.js +5 -4
  21. package/fesm2015/universis-ngx-tables.js +140 -10
  22. package/fesm2015/universis-ngx-tables.js.map +1 -1
  23. package/fesm5/universis-ngx-tables.js +155 -11
  24. package/fesm5/universis-ngx-tables.js.map +1 -1
  25. package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +2 -1
  26. package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +2 -1
  27. package/lib/components/advanced-table/advanced-table.component.d.ts +6 -2
  28. package/lib/components/advanced-table/advanced-table.formatters.interface.d.ts +5 -17
  29. package/lib/components/advanced-table/custom-button.formatter.d.ts +11 -0
  30. package/lib/i18n/tables.el.d.ts +1 -0
  31. package/lib/i18n/tables.en.d.ts +1 -0
  32. package/package.json +1 -1
  33. package/universis-ngx-tables.d.ts +5 -4
  34. package/universis-ngx-tables.metadata.json +1 -1
@@ -2072,6 +2072,7 @@
2072
2072
  this.height = 800;
2073
2073
  this.showActions = true;
2074
2074
  this.autoLoad = true;
2075
+ this.customEvent = new i0.EventEmitter();
2075
2076
  this.load = new i0.EventEmitter();
2076
2077
  this.init = new i0.EventEmitter();
2077
2078
  this.reload = new i0.EventEmitter();
@@ -2084,6 +2085,8 @@
2084
2085
  this.beforeServerData = new i0.EventEmitter();
2085
2086
  this.afterServerData = new i0.EventEmitter();
2086
2087
  this.loading = new i0.EventEmitter();
2088
+ this.showDetails = new i0.EventEmitter();
2089
+ this.hideDetails = new i0.EventEmitter();
2087
2090
  this.scrollable = true;
2088
2091
  this.serverSide = true;
2089
2092
  this.lengthMenu = [50, 100, 200, 500];
@@ -2719,7 +2722,7 @@
2719
2722
  */ function (cell, cellData, rowData, rowIndex, colIndex) {
2720
2723
  items_1.forEach(function (columnFormatter) {
2721
2724
  /** @type {?} */
2722
- var formatter = self._columnFormatters[columnFormatter.formatter];
2725
+ var formatter = /** @type {?} */ ((self._columnFormatters[columnFormatter.formatter]));
2723
2726
  if (formatter && typeof formatter.afterRender === 'function') {
2724
2727
  formatter.afterRender.bind(column)(cell, cellData, rowData, rowIndex, colIndex);
2725
2728
  }
@@ -2736,12 +2739,14 @@
2736
2739
  render: formatter.render.bind(column),
2737
2740
  });
2738
2741
  }
2739
- if (formatter && typeof formatter.afterRender === 'function') {
2742
+ /** @type {?} */
2743
+ var afterRenderFormatter = /** @type {?} */ ((formatter));
2744
+ if (afterRenderFormatter && typeof afterRenderFormatter.afterRender === 'function') {
2740
2745
  Object.assign(columnDefinition, {
2741
2746
  render: formatter.render.bind(column),
2742
2747
  });
2743
2748
  Object.assign(columnDefinition, {
2744
- createdCell: formatter.afterRender.bind(column),
2749
+ createdCell: afterRenderFormatter.afterRender.bind(column),
2745
2750
  });
2746
2751
  }
2747
2752
  }
@@ -2879,6 +2884,64 @@
2879
2884
  }
2880
2885
  });
2881
2886
  }
2887
+ // display row details
2888
+ if (this.detailsTemplate) {
2889
+ /** @type {?} */
2890
+ var detailsString_1 = this._translateService.instant('Tables.RowDetails');
2891
+ /** @type {?} */
2892
+ var firstColumn = this.config.columns[0];
2893
+ /** @type {?} */
2894
+ var showDetailsColumnDefinition = {
2895
+ className: 'details-control pl-4 pr-0',
2896
+ data: firstColumn.property || firstColumn.name,
2897
+ defaultContent: '',
2898
+ title: '',
2899
+ sortable: false,
2900
+ visible: !this.customSelect,
2901
+ name: firstColumn.name,
2902
+ render: function () {
2903
+ return "<button role=\"button\" title=\"" + detailsString_1 + "\" arial-label=\"" + detailsString_1 + "\"></button>";
2904
+ },
2905
+ };
2906
+ // and finally add column
2907
+ // and finally add column
2908
+ tableColumns_1.unshift(showDetailsColumnDefinition);
2909
+ // user interface additions
2910
+ // Add event listener for opening and closing details
2911
+ // user interface additions
2912
+ // Add event listener for opening and closing details
2913
+ tableElement_1.on('click', 'td.details-control', function (e) {
2914
+ /** @type {?} */
2915
+ var tr = e.target.closest('tr');
2916
+ /** @type {?} */
2917
+ var row = self.dataTable.row(tr);
2918
+ /** @type {?} */
2919
+ var container = document.createElement('div');
2920
+ /** @type {?} */
2921
+ var detailsViewRef = _this._viewContainerRef.createEmbeddedView(_this.detailsTemplate, {
2922
+ rowData: row.data(),
2923
+ });
2924
+ detailsViewRef.detectChanges();
2925
+ if (detailsViewRef.rootNodes.length !== 1) {
2926
+ throw new Error('DetailsTemplate must have exactly one root node.');
2927
+ }
2928
+ container.appendChild(detailsViewRef.rootNodes[0]);
2929
+ if (row.child.isShown()) {
2930
+ // This row is already open - close it
2931
+ // This row is already open - close it
2932
+ _this.hideDetails.emit();
2933
+ row.child.hide();
2934
+ detailsViewRef.destroy();
2935
+ }
2936
+ else {
2937
+ // Open this row
2938
+ // Open this row
2939
+ _this.showDetails.emit({ row: row });
2940
+ row.child(container).show();
2941
+ row.child().addClass('dt-child');
2942
+ }
2943
+ });
2944
+ }
2882
2945
  /** @type {?} */
2883
2946
  var settings = {
2884
2947
  // set length menu
@@ -3247,6 +3310,9 @@
3247
3310
  });
3248
3311
  }
3249
3312
  if (this.selectable) ;
3313
+ if (this.dataTable) {
3314
+ this.dataTable.destroy();
3315
+ }
3250
3316
  // handle init.dt event and emit local event
3251
3317
  this.dataTable = tableElement_1.on('init.dt', function (event) {
3252
3318
  /** @type {?} */
@@ -3292,6 +3358,24 @@
3292
3358
  infoSelector.classList.add('d-none');
3293
3359
  }
3294
3360
  }
3361
+ /** @type {?} */
3362
+ var onCustomEvent = function (event) {
3363
+ /** @type {?} */
3364
+ var target = /** @type {?} */ (event.currentTarget);
3365
+ /** @type {?} */
3366
+ var customEvent = target.dataset["event"] || 'event';
3367
+ /** @type {?} */
3368
+ var row = _this.dataTable.row(target.closest('tr'));
3369
+ /** @type {?} */
3370
+ var data = row.data();
3371
+ _this.customEvent.emit({
3372
+ name: customEvent,
3373
+ data: data,
3374
+ row: row.index()
3375
+ });
3376
+ };
3377
+ this.dataTable.off('click', '.dt-custom');
3378
+ this.dataTable.on('click', '.dt-custom', onCustomEvent);
3295
3379
  // show or hide pager
3296
3380
  if (this.showPaging) {
3297
3381
  this.showPaging = true;
@@ -3879,7 +3963,7 @@
3879
3963
  selector: 'app-advanced-table',
3880
3964
  template: "\n <table #table class=\"dataTable\">\n </table>\n <div #emptyTable class=\"d-none\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <div #errorTemplate class=\"d-none error-message\">\n <div class=\"text-center\">\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-danger border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-secondary\" [translate]=\"'Tables.DataError.Title'\"></h4>\n <p class=\"font-lg text-secondary mb-1\" [translate]=\"'Tables.DataError.Message'\"></p>\n <p class=\"font-lg text-secondary error-inner-message\">\n <small></small>\n </p>\n </div>\n </div>\n </div>\n ",
3881
3965
  encapsulation: i0.ViewEncapsulation.None,
3882
- styles: ["div.dataTables_processing>div:last-child>div{background-color:var(--secondary)}table.dataTable thead .sorting{background-image:none}table.dataTable thead tr th{border-bottom:none;font-weight:500;font-size:.75rem}table.dataTable thead th{color:#73818e;font-size:.75rem;font-weight:600;padding-top:16px;padding-bottom:4px;border-bottom:none;padding-left:8px}table.dataTable tbody tr:first-child td:first-child{border-radius:6px 0}table.dataTable tbody tr:first-child td:last-child{border-radius:0 6px}table.dataTable tbody tr{border-radius:6px}table.dataTable tbody tr td:first-child{border-left:1px solid #c2cfd6}table.dataTable tbody tr td:last-child{border-right:1px solid #c2cfd6}table.dataTable tbody tr td{padding-top:8px;padding-bottom:8px;border-top:1px solid #c2cfd6}table.dataTable tbody tr:last-child td:first-child{border-radius:0 0 0 6px}table.dataTable tbody tr:last-child td:last-child{border-radius:0 0 6px}table.dataTable tbody tr:last-child td{border-bottom:1px solid #c2cfd6}table.dataTable tbody tr.dtrg-group.dtrg-start th{border:2px solid #c2cfd6;border-bottom:1px solid #c2cfd6;color:#3e515b;background-color:#f0f3f5}table.dataTable tbody tr.dtrg-group.dtrg-end th{border-top:2px solid #c2cfd6;border-right:2px solid #c2cfd6;border-left:2px solid #c2cfd6;color:#3e515b;background-color:#f0f3f5}table.dataTable tbody tr:nth-last-child(1) th{border-bottom:2px solid #c2cfd6}table.dataTable td.dataTables_empty{border:none!important}table.dataTable .error-inner-message>small{overflow-wrap:break-word}table.dataTable.no-footer{border-bottom:none}.dataTables_paginate .btn.previous{margin-right:8px}.dataTables_paginate .btn.next{margin-left:8px}.dataTables_info,.dataTables_paginate{margin-top:1rem}.dataTables_paginate span .btn{border-radius:1.5rem}.dataTables_filter{display:none}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:0;overflow:auto}.dataTables_paginate{display:none}.dataTable.processing{opacity:15%}.dataTables_wrapper .dataTables_processing{background:0 0;position:absolute;display:inline-block;top:25%;z-index:5;color:#73818e}.text-decoration-line-through{text-decoration:line-through!important}tr.removed .checkbox+label{visibility:hidden}"]
3966
+ styles: ["div.dataTables_processing>div:last-child>div{background-color:var(--secondary)}table.dataTable thead .sorting{background-image:none}table.dataTable thead tr th{border-bottom:none;font-weight:500;font-size:.75rem}table.dataTable thead th{color:#73818e;font-size:.75rem;font-weight:600;padding-top:16px;padding-bottom:4px;border-bottom:none;padding-left:8px}table.dataTable tbody tr:first-child td:first-child{border-radius:6px 0}table.dataTable tbody tr:first-child td:last-child{border-radius:0 6px}table.dataTable tbody tr{border-radius:6px}table.dataTable tbody tr td:first-child{border-left:1px solid #c2cfd6}table.dataTable tbody tr td:last-child{border-right:1px solid #c2cfd6}table.dataTable tbody tr td{padding-top:8px;padding-bottom:8px;border-top:1px solid #c2cfd6}table.dataTable tbody tr:last-child td:first-child{border-radius:0 0 0 6px}table.dataTable tbody tr:last-child td:last-child{border-radius:0 0 6px}table.dataTable tbody tr:last-child td{border-bottom:1px solid #c2cfd6}table.dataTable tbody tr.dtrg-group.dtrg-start th{border:2px solid #c2cfd6;border-bottom:1px solid #c2cfd6;color:#3e515b;background-color:#f0f3f5}table.dataTable tbody tr.dtrg-group.dtrg-end th{border-top:2px solid #c2cfd6;border-right:2px solid #c2cfd6;border-left:2px solid #c2cfd6;color:#3e515b;background-color:#f0f3f5}table.dataTable tbody tr:nth-last-child(1) th{border-bottom:2px solid #c2cfd6}table.dataTable td.dataTables_empty{border:none!important}table.dataTable .error-inner-message>small{overflow-wrap:break-word}table.dataTable.no-footer{border-bottom:none}.dataTables_paginate .btn.previous{margin-right:8px}.dataTables_paginate .btn.next{margin-left:8px}.dataTables_info,.dataTables_paginate{margin-top:1rem}.dataTables_paginate span .btn{border-radius:1.5rem}.dataTables_filter{display:none}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:0;overflow:auto}.dataTables_paginate{display:none}.dataTable.processing{opacity:15%}.dataTables_wrapper .dataTables_processing{background:0 0;position:absolute;display:inline-block;top:25%;z-index:5;color:#73818e}.text-decoration-line-through{text-decoration:line-through!important}tr.removed .checkbox+label{visibility:hidden}table.dataTable td.details-control{cursor:pointer}table.dataTable td.details-control button{border:none;background-color:inherit;outline:0}table.dataTable td.details-control button::after{content:'\\25B7'}table.dataTable tr.dt-hasChild td.details-control button::after{content:'\\25BD'}"]
3883
3967
  }] }
3884
3968
  ];
3885
3969
  /** @nocollapse */
@@ -3911,6 +3995,7 @@
3911
3995
  height: [{ type: i0.Input }],
3912
3996
  showActions: [{ type: i0.Input }],
3913
3997
  autoLoad: [{ type: i0.Input }],
3998
+ customEvent: [{ type: i0.Output, args: ['customEvent',] }],
3914
3999
  load: [{ type: i0.Output, args: ['load',] }],
3915
4000
  init: [{ type: i0.Output, args: ['init',] }],
3916
4001
  reload: [{ type: i0.Input, args: ['reload',] }],
@@ -3923,6 +4008,8 @@
3923
4008
  beforeServerData: [{ type: i0.Output, args: ['beforeServerData',] }],
3924
4009
  afterServerData: [{ type: i0.Output, args: ['afterServerData',] }],
3925
4010
  loading: [{ type: i0.Output, args: ['loading',] }],
4011
+ showDetails: [{ type: i0.Output, args: ['showDetails',] }],
4012
+ hideDetails: [{ type: i0.Output, args: ['hideDetails',] }],
3926
4013
  scrollable: [{ type: i0.Input }],
3927
4014
  serverSide: [{ type: i0.Input }],
3928
4015
  lengthMenu: [{ type: i0.Input }],
@@ -3942,6 +4029,7 @@
3942
4029
  rowGroup: [{ type: i0.Input }],
3943
4030
  headerTemplate: [{ type: i0.Input }],
3944
4031
  footerTemplate: [{ type: i0.Input }],
4032
+ detailsTemplate: [{ type: i0.Input }],
3945
4033
  header: [{ type: i0.ViewChild, args: ['header',] }],
3946
4034
  footer: [{ type: i0.ViewChild, args: ['footer',] }],
3947
4035
  config: [{ type: i0.Input, args: ['config',] }],
@@ -6298,6 +6386,57 @@
6298
6386
  return AdvancedTableSearchComponent;
6299
6387
  }(AdvancedTableSearchBaseComponent));
6300
6388
 
6389
+ /**
6390
+ * @fileoverview added by tsickle
6391
+ * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
6392
+ */
6393
+ var CustomButtonFormatter = /** @class */ (function (_super) {
6394
+ __extends(CustomButtonFormatter, _super);
6395
+ function CustomButtonFormatter() {
6396
+ return _super.call(this) || this;
6397
+ }
6398
+ /**
6399
+ * @param {?} data
6400
+ * @param {?} type
6401
+ * @param {?} row
6402
+ * @param {?} meta
6403
+ * @return {?}
6404
+ */
6405
+ CustomButtonFormatter.prototype.render = /**
6406
+ * @param {?} data
6407
+ * @param {?} type
6408
+ * @param {?} row
6409
+ * @param {?} meta
6410
+ * @return {?}
6411
+ */
6412
+ function (data, type, row, meta) {
6413
+ if (data == null || this.injector == null) {
6414
+ return '';
6415
+ }
6416
+ /** @type {?} */
6417
+ var formatOptions = Object.assign({
6418
+ buttonClass: 'btn btn-default',
6419
+ }, this.formatOptions);
6420
+ /** @type {?} */
6421
+ var buttonText;
6422
+ /** @type {?} */
6423
+ var buttonTitle = '';
6424
+ if (formatOptions.buttonText) {
6425
+ buttonText = this.injector.get(core.TranslateService).instant(formatOptions.buttonText);
6426
+ }
6427
+ else {
6428
+ buttonText = formatOptions.buttonContent;
6429
+ }
6430
+ if (formatOptions.buttonTitle) {
6431
+ buttonTitle = this.injector.get(core.TranslateService).instant(formatOptions.buttonTitle);
6432
+ }
6433
+ /** @type {?} */
6434
+ var customEvent = formatOptions.event || 'event';
6435
+ return "<button style=\"cursor:pointer\" data-event=\"" + customEvent + "\" class=\"dt-custom " + formatOptions.buttonClass + "\" title=\"" + buttonTitle + "\">" + buttonText + "</button>";
6436
+ };
6437
+ return CustomButtonFormatter;
6438
+ }(ButtonFormatter));
6439
+
6301
6440
  /**
6302
6441
  * @fileoverview added by tsickle
6303
6442
  * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
@@ -6317,6 +6456,7 @@
6317
6456
  TrueFalseFormatter: new TrueFalseFormatter(),
6318
6457
  ActionButtonFormatter: new ActionButtonFormatter(),
6319
6458
  ActionSplitButtonFormatter: new ActionSplitButtonFormatter(),
6459
+ CustomButtonFormatter: new CustomButtonFormatter(),
6320
6460
  };
6321
6461
 
6322
6462
  /**
@@ -7039,7 +7179,7 @@
7039
7179
  { type: i0.Component, args: [{
7040
7180
  // tslint:disable-next-line:component-selector
7041
7181
  selector: 'app-advanced-aggregator',
7042
- template: "<ng-container *ngIf=\"config && body\">\n <div class=\"w-100 text-center\" *ngIf=\"body && body.length === 0\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"groups.length === 0\">\n <div class=\"row mt-4\">\n <app-advanced-aggregator-list [body]=\"body\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\" class=\"col-12\">\n </app-advanced-aggregator-list>\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ body | callAggregator: aggregators: aggregator.name }}\n </span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"groups.length === 1\">\n <ng-container *ngFor=\"let group of body | groupBy: groups[0].name | keyvalue\">\n <div class=\"row mt-4\">\n <h4 class=\"col text-secondary\"> {{ groups[0].title | aggregatorListTitle: group.key }} </h4>\n <app-advanced-aggregator-list [body]=\"group.value\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\"\n class=\"col-12\">\n </app-advanced-aggregator-list>\n </div>\n\n <!-- Footer for the group -->\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ group.value | callAggregator: aggregators: aggregator.name }} </span>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"groups.length > 1\">\n <ng-container *ngFor=\"let group of body | groupBy: groups[0].name | keyvalue\">\n <div class=\"row mt-4\">\n <h4 class=\"col text-secondary\"> {{ groups[0].title | aggregatorListTitle: group.key }} </h4>\n <div *ngFor=\"let subgroup of group.value | groupBy: groups[1].name | keyvalue\" class=\"col-12 ml-4 pl-4\">\n <div class=\"row mt-4\">\n <h6 class=\"col-12 text-secondary\"> {{ groups[1].title | aggregatorListTitle: subgroup.key }} </h6>\n <app-advanced-aggregator-list [body]=\"subgroup.value\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\"\n class=\"col-12\">\n </app-advanced-aggregator-list>\n </div>\n\n <!-- Footer for each subgroup -->\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ subgroup.value | callAggregator: aggregators: aggregator.name }}\n </span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</ng-container>",
7182
+ template: "<ng-container *ngIf=\"config && body\">\n <div class=\"w-100 text-center\" *ngIf=\"body && body.length === 0\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"groups.length === 0\">\n <div class=\"row mt-4\">\n <app-advanced-aggregator-list [detailTemplate]=\"detailTemplate\" [body]=\"body\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\" class=\"col-12\">\n </app-advanced-aggregator-list>\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ body | callAggregator: aggregators: aggregator.name }}\n </span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"groups.length === 1\">\n <ng-container *ngFor=\"let group of body | groupBy: groups[0].name | keyvalue\">\n <div class=\"row mt-4\">\n <h4 class=\"col text-secondary\"> {{ groups[0].title | aggregatorListTitle: group.key }} </h4>\n <app-advanced-aggregator-list [detailTemplate]=\"detailTemplate\" [body]=\"group.value\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\"\n class=\"col-12\">\n </app-advanced-aggregator-list>\n </div>\n\n <!-- Footer for the group -->\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ group.value | callAggregator: aggregators: aggregator.name }} </span>\n </div>\n </div>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"groups.length > 1\">\n <ng-container *ngFor=\"let group of body | groupBy: groups[0].name | keyvalue\">\n <div class=\"row mt-4\">\n <h4 class=\"col text-secondary\"> {{ groups[0].title | aggregatorListTitle: group.key }} </h4>\n <div *ngFor=\"let subgroup of group.value | groupBy: groups[1].name | keyvalue\" class=\"col-12 ml-4 pl-4\">\n <div class=\"row mt-4\">\n <h6 class=\"col-12 text-secondary\"> {{ groups[1].title | aggregatorListTitle: subgroup.key }} </h6>\n <app-advanced-aggregator-list [detailTemplate]=\"detailTemplate\" [body]=\"subgroup.value\" [config]=\"config\" (clickEvent)=\"onActionEvent($event)\"\n class=\"col-12\">\n </app-advanced-aggregator-list>\n </div>\n\n <!-- Footer for each subgroup -->\n <div *ngIf=\"config.aggregators && config.aggregators.length > 0\"\n class=\"footer-text text-dark font-weight-normal text-right font-sm mt-3 mr-2 w-100\">\n <div *ngFor=\"let aggregator of config.aggregators\">\n <span *ngIf=\"aggregator.label\"> {{ aggregator.label | translate }} </span>:\n <span class=\"font-weight-bold\"> {{ subgroup.value | callAggregator: aggregators: aggregator.name }}\n </span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</ng-container>",
7043
7183
  changeDetection: i0.ChangeDetectionStrategy.OnPush
7044
7184
  }] }
7045
7185
  ];
@@ -7059,6 +7199,7 @@
7059
7199
  selectedGroups$: [{ type: i0.Input, args: ['selectedGroups',] }],
7060
7200
  filters$: [{ type: i0.Input, args: ['filters',] }],
7061
7201
  searchExpression: [{ type: i0.Input, args: ['searchExpression',] }],
7202
+ detailTemplate: [{ type: i0.Input, args: ['detailTemplate',] }],
7062
7203
  eventHandler: [{ type: i0.Output }]
7063
7204
  };
7064
7205
  return AdvancedAggregatorComponent;
@@ -7128,7 +7269,7 @@
7128
7269
  { type: i0.Component, args: [{
7129
7270
  // tslint:disable-next-line:component-selector
7130
7271
  selector: 'app-advanced-aggregator-list',
7131
- template: "<div id=\"group-list\" class=\"flex-column\" *ngIf=\"config && config.columns\">\n <ul class=\"sis--list-group sis--list-group-header\">\n <li class=\"sis--list-group-item text-wrap\">\n <div class=\"d-flex justify-content-center align-items-center\" *ngIf=\"body && body.length > 0\">\n <div *ngIf=\"config.actions && config.actions.length > 0\" class=\"sis--list-group-item_sm_column\"></div>\n <div *ngFor=\"let column of config.columns; let i = index\" class=\"text-left\" [class]=\"config.columns[i].length\"\n [translate]=\"config.columns[i].type === 'action' ? '' : column.title\" [ngClass]=\"{\n 'd-none': config.columns[i].hidden\n }\"></div>\n </div>\n </li>\n </ul>\n\n <!-- The list of entries -->\n <ul class=\"sis--list-group sis--list-group-body\" *ngIf=\"body && body.length > 0\">\n <li class=\"sis--list-group-item text-wrap\" *ngFor=\"let entry of body | orderBy: config.orderBy\">\n <div class=\"d-flex justify-content-center align-items-center list-color\">\n <!-- The list of actions -->\n <div *ngIf=\"config.actions && config.actions.length > 0\" class=\"sis--list-group-item_sm_column text-left pr-0\">\n <button *ngFor=\"let action of config.actions\" (click)=\"callCallback(action.identifier, entry)\"\n [title]=\"(action.title ? action.title : '') | translate \" class=\"btn btn-default px-0\">\n <i class=\"\" [class]=\"'fas text-indigo ml-2 ' + 'fa-' + action.icon\"></i>\n </button>\n <span class=\"px-0\">\n <i class=\"fa fa-fw\">&nbsp;</i>\n </span>\n\n </div>\n <!-- The list of data -->\n <div *ngFor=\"let column of config.columns; let i=index\" [class]=\"config.columns[i].length\" class=\"text-left\"\n [ngClass]=\"{\n 'text-truncate': config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate,\n 'd-none': config.columns[i].hidden,\n 'd-md-block': !config.columns[i].hidden\n }\"\n [title]=\"config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate ? entry[column.name] : ''\">\n <span class=\"text-secondary\"\n *ngIf=\"!config.columns[i].hasOwnProperty('type') || (config.columns[i].hasOwnProperty('type') && config.columns[i].type === 'text')\"\n [ngClass]=\"{\n 'font-xs': config.columns[i].variant !== 'primary',\n 'text-body': config.columns[i].variant === 'primary',\n 'text-success': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && entry[config.columns[i].condition],\n 'text-danger': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && !entry[config.columns[i].condition],\n 'font-lg': config.columns[i].variant === 'redGreen' && entry[column.name] && entry[column.name].length > 3,\n 'font-2xl': config.columns[i].variant === 'redGreen' && entry[column.name] && entry[column.name].length <= 3\n }\">\n {{entry[column.name] || '-'}}\n </span>\n\n <span *ngIf=\"config.columns[i].type === 'boolean'\">\n <i class=\"fa font-lg\" [ngClass]=\"{\n 'fa-check text-success': !!entry[column.name],\n 'fa-times text-danger': !!entry[column.name] === false && config.columns[i].variant !== 'checkOrDash'\n }\"></i>\n <span\n *ngIf=\"entry[column.name].toString() !== config.columns[i].trueValue && config.columns[i].variant === 'checkOrDash'\"\n class=\"text-secondary font-xs\">-</span>\n </span>\n </div>\n </div>\n <div *ngIf=\"entry && entry.subitems\">\n <div *ngFor=\"let subitem of entry.subitems\" class=\"d-flex justify-content-center align-items-center list-color\">\n <div *ngIf=\"config.actions && config.actions.length > 0\"\n class=\"sis--list-group-item_sm_column text-left pr-0\">\n <span class=\"px-0\">\n <i class=\"fa fa-fw\">&nbsp;</i>\n </span>\n <button *ngFor=\"let action of config.actions\" (click)=\"callCallback(action.identifier, subitem)\"\n [title]=\"(action.title ? action.title : '') | translate \" class=\"btn btn-default px-0\">\n <i *ngIf=\"action.type === 'edit'\" class=\"fas fa-edit text-indigo\"></i>\n </button>\n </div>\n <div class=\"text-left\"></div>\n <div *ngFor=\"let column of config.columns; let i=index\" [class]=\"config.columns[i].length\" class=\"text-left\"\n [ngClass]=\"{\n 'text-truncate': config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate,\n 'd-none': config.columns[i].hidden,\n 'd-md-block': !config.columns[i].hidden\n }\"\n [title]=\"config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate ? entry[column.name] : ''\">\n <span class=\"text-secondary\"\n *ngIf=\"!config.columns[i].hasOwnProperty('type') || (config.columns[i].hasOwnProperty('type') && config.columns[i].type === 'text')\"\n [ngClass]=\"{\n 'font-xs': config.columns[i].variant !== 'primary',\n 'text-body': config.columns[i].variant === 'primary',\n 'text-success': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && subitem[config.columns[i].condition],\n 'text-danger': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && !subitem[config.columns[i].condition],\n 'font-lg': config.columns[i].variant === 'redGreen' && subitem[column.name] && subitem[column.name].length > 3,\n 'font-2xl': config.columns[i].variant === 'redGreen' && subitem[column.name] && subitem[column.name].length <= 3\n }\">\n {{subitem[column.name] || '-'}}\n </span>\n <span *ngIf=\"config.columns[i].type === 'boolean'\">\n <i class=\"fa font-lg\" [ngClass]=\"{\n 'fa-check text-success': !!subitem[column.name],\n 'fa-times text-danger': !!subitem[column.name] === false && config.columns[i].variant !== 'checkOrDash'\n }\"></i>\n <span\n *ngIf=\"subitem[column.name].toString() !== config.columns[i].trueValue && config.columns[i].variant === 'checkOrDash'\"\n class=\"text-secondary font-xs\">-</span>\n </span>\n </div>\n </div>\n </div>\n </li>\n </ul>\n</div>"
7272
+ template: "<div id=\"group-list\" class=\"flex-column\" *ngIf=\"config && config.columns\">\n <ul class=\"sis--list-group sis--list-group-header\">\n <li class=\"sis--list-group-item text-wrap\">\n <div class=\"d-flex justify-content-center align-items-center\" *ngIf=\"body && body.length > 0\">\n <div *ngIf=\"config.actions && config.actions.length > 0\" class=\"sis--list-group-item_sm_column\"></div>\n <div *ngFor=\"let column of config.columns; let i = index\" class=\"text-left\" [class]=\"config.columns[i].length\"\n [translate]=\"config.columns[i].type === 'action' ? '' : column.title\" [ngClass]=\"{\n 'd-none': config.columns[i].hidden\n }\"></div>\n </div>\n </li>\n </ul>\n\n <!-- The list of entries -->\n <ul class=\"sis--list-group sis--list-group-body\" *ngIf=\"body && body.length > 0\">\n <li class=\"sis--list-group-item text-wrap\" *ngFor=\"let entry of body | orderBy: config.orderBy\">\n <div class=\"d-flex justify-content-center align-items-center list-color\">\n <!-- The list of actions -->\n <div *ngIf=\"config.actions && config.actions.length > 0\" class=\"sis--list-group-item_sm_column text-left pr-0\">\n <button *ngFor=\"let action of config.actions\" (click)=\"callCallback(action.identifier, entry)\"\n [title]=\"(action.title ? action.title : '') | translate \" class=\"btn btn-default px-0\">\n <i class=\"\" [class]=\"'fas text-indigo ml-2 ' + 'fa-' + action.icon\"></i>\n </button>\n <span class=\"px-0\">\n <i class=\"fa fa-fw\">&nbsp;</i>\n </span>\n\n </div>\n <!-- The list of data -->\n <div *ngFor=\"let column of config.columns; let i=index\" [class]=\"config.columns[i].length\" class=\"text-left\"\n [ngClass]=\"{\n 'text-truncate': config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate,\n 'd-none': config.columns[i].hidden,\n 'd-md-block': !config.columns[i].hidden\n }\"\n [title]=\"config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate ? entry[column.name] : ''\">\n <span class=\"text-secondary\"\n *ngIf=\"!config.columns[i].hasOwnProperty('type') || (config.columns[i].hasOwnProperty('type') && config.columns[i].type === 'text')\"\n [ngClass]=\"{\n 'font-xs': config.columns[i].variant !== 'primary',\n 'text-body': config.columns[i].variant === 'primary',\n 'text-success': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && entry[config.columns[i].condition],\n 'text-danger': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && !entry[config.columns[i].condition],\n 'font-lg': config.columns[i].variant === 'redGreen' && entry[column.name] && entry[column.name].length > 3,\n 'font-2xl': config.columns[i].variant === 'redGreen' && entry[column.name] && entry[column.name].length <= 3\n }\">\n {{entry[column.name] || '-'}}\n </span>\n\n <span *ngIf=\"config.columns[i].type === 'boolean'\">\n <i class=\"fa font-lg\" [ngClass]=\"{\n 'fa-check text-success': !!entry[column.name],\n 'fa-times text-danger': !!entry[column.name] === false && config.columns[i].variant !== 'checkOrDash'\n }\"></i>\n <span\n *ngIf=\"entry[column.name].toString() !== config.columns[i].trueValue && config.columns[i].variant === 'checkOrDash'\"\n class=\"text-secondary font-xs\">-</span>\n </span>\n </div>\n </div>\n <ng-container *ngIf=\"detailTemplate\">\n <ng-container *ngTemplateOutlet=\"detailTemplate; context: { row: entry }\"></ng-container>\n </ng-container>\n <div *ngIf=\"entry && entry.subitems\">\n <ng-container *ngFor=\"let subitem of entry.subitems\">\n <div class=\"d-flex d-debug justify-content-center align-items-center list-color\">\n <div *ngIf=\"config.actions && config.actions.length > 0\" class=\"sis--list-group-item_sm_column text-left pr-0\">\n <span class=\"px-0\">\n <i class=\"fa fa-fw\">&nbsp;</i>\n </span>\n <button *ngFor=\"let action of config.actions\" (click)=\"callCallback(action.identifier, subitem)\"\n [title]=\"(action.title ? action.title : '') | translate \" class=\"btn btn-default px-0\">\n <i *ngIf=\"action.type === 'edit'\" class=\"fas fa-edit text-indigo\"></i>\n </button>\n </div>\n <div class=\"text-left\"></div>\n <div *ngFor=\"let column of config.columns; let i=index\" [class]=\"config.columns[i].length\" class=\"text-left\"\n [ngClass]=\"{\n 'text-truncate': config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate,\n 'd-none': config.columns[i].hidden,\n 'd-md-block': !config.columns[i].hidden\n }\"\n [title]=\"config.columns[i].hasOwnProperty('truncate') && config.columns[i].truncate ? entry[column.name] : ''\">\n <span class=\"text-secondary\"\n *ngIf=\"!config.columns[i].hasOwnProperty('type') || (config.columns[i].hasOwnProperty('type') && config.columns[i].type === 'text')\"\n [ngClass]=\"{\n 'font-xs': config.columns[i].variant !== 'primary',\n 'text-body': config.columns[i].variant === 'primary',\n 'text-success': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && subitem[config.columns[i].condition],\n 'text-danger': config.columns[i].variant === 'redGreen' && config.columns[i].hasOwnProperty('condition') && !subitem[config.columns[i].condition],\n 'font-lg': config.columns[i].variant === 'redGreen' && subitem[column.name] && subitem[column.name].length > 3,\n 'font-2xl': config.columns[i].variant === 'redGreen' && subitem[column.name] && subitem[column.name].length <= 3\n }\">\n {{subitem[column.name] || '-'}}\n </span>\n <span *ngIf=\"config.columns[i].type === 'boolean'\">\n <i class=\"fa font-lg\" [ngClass]=\"{\n 'fa-check text-success': !!subitem[column.name],\n 'fa-times text-danger': !!subitem[column.name] === false && config.columns[i].variant !== 'checkOrDash'\n }\"></i>\n <span\n *ngIf=\"subitem[column.name].toString() !== config.columns[i].trueValue && config.columns[i].variant === 'checkOrDash'\"\n class=\"text-secondary font-xs\">-</span>\n </span>\n </div>\n </div>\n </ng-container>\n </div>\n </li>\n </ul>\n</div>"
7132
7273
  }] }
7133
7274
  ];
7134
7275
  /** @nocollapse */
@@ -7140,6 +7281,7 @@
7140
7281
  AdvancedAggregatorListComponent.propDecorators = {
7141
7282
  config: [{ type: i0.Input }],
7142
7283
  body: [{ type: i0.Input }],
7284
+ detailTemplate: [{ type: i0.Input, args: ['detailTemplate',] }],
7143
7285
  clickEvent: [{ type: i0.Output }]
7144
7286
  };
7145
7287
  return AdvancedAggregatorListComponent;
@@ -7567,7 +7709,8 @@
7567
7709
  },
7568
7710
  "ExportList": "Εξαγωγή λίστας",
7569
7711
  "ExportLimitExceeded": "Το πλήθος των στοιχείων προς εξαγωγή ({{dataLength}}) ξεπερνάει το μέγιστο επιτρεπτό ({{exportLimit}}). Παρακαλούμε προσαρμόστε τα φίλτρα της αναζήτησης και προσπαθήστε ξανά.",
7570
- "ExportResults": "Δεδομένα λίστας"
7712
+ "ExportResults": "Δεδομένα λίστας",
7713
+ "RowDetails": "Λεπτομέρειες"
7571
7714
  },
7572
7715
  "TrueFalse": {
7573
7716
  "long": {
@@ -7698,7 +7841,8 @@
7698
7841
  },
7699
7842
  "ExportList": "Export list",
7700
7843
  "ExportLimitExceeded": "The number of items that are to be exported ({{dataLength}}) exceeds the export limit ({{exportLimit}}). Please apply more specific filters to the search.",
7701
- "ExportResults": "Exported list"
7844
+ "ExportResults": "Exported list",
7845
+ "RowDetails": "Details"
7702
7846
  },
7703
7847
  "TrueFalse": {
7704
7848
  "long": {
@@ -8313,9 +8457,10 @@
8313
8457
  exports.featureName = featureName;
8314
8458
  exports.getTablesState = getTablesState;
8315
8459
  exports.selectTable = selectTable;
8316
- exports.ɵa = AdvancedSearchState;
8317
- exports.ɵc = AdvancedTableState;
8318
- exports.ɵd = AdvancedSearchRouterState;
8460
+ exports.ɵa = CustomButtonFormatter;
8461
+ exports.ɵb = AdvancedSearchState;
8462
+ exports.ɵd = AdvancedTableState;
8463
+ exports.ɵe = AdvancedSearchRouterState;
8319
8464
 
8320
8465
  Object.defineProperty(exports, '__esModule', { value: true });
8321
8466