@sumaris-net/ngx-components 2.4.55 → 2.4.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,6 @@
1
1
  import { AppFormUtils } from '../form/form.utils';
2
+ import { EntityUtils } from '../services/model/entity.model';
3
+ import { isNotNil, isNotNilOrNaN } from '../../shared/functions';
2
4
  export class AppTableUtils {
3
5
  static waitIdle(table) {
4
6
  if (!table || !table.dataSource) {
@@ -9,5 +11,20 @@ export class AppTableUtils {
9
11
  static logRowErrors(row, logPrefix) {
10
12
  AppFormUtils.logFormErrors(row.validator, logPrefix);
11
13
  }
14
+ static getEntityId(row) {
15
+ return EntityUtils.getId(row.currentData);
16
+ }
17
+ static getEntityIds(rows) {
18
+ return (rows || [])
19
+ .map((row) => row.currentData)
20
+ .filter(isNotNil)
21
+ .map(EntityUtils.getId)
22
+ .filter(isNotNilOrNaN);
23
+ }
24
+ static getEntities(rows) {
25
+ return (rows || [])
26
+ .map((row) => row.currentData)
27
+ .filter(isNotNil);
28
+ }
12
29
  }
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGFibGUvdGFibGUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR2hELE1BQU0sT0FBTyxhQUFhO0lBRXhCLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBOEI7UUFDNUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQTZDLEVBQUUsU0FBa0I7UUFDbkYsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QXBwVGFibGV9IGZyb20gJy4vdGFibGUuY2xhc3MnO1xuaW1wb3J0IHtUYWJsZUVsZW1lbnR9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZSc7XG5pbXBvcnQge0FwcEZvcm1VdGlsc30gZnJvbSAnLi4vZm9ybS9mb3JtLnV0aWxzJztcbmltcG9ydCB7QXN5bmNUYWJsZUVsZW1lbnR9IGZyb20gJ0BlLWlzL25neC1tYXRlcmlhbC10YWJsZS9zcmMvYXBwL25neC1tYXRlcmlhbC10YWJsZS9hc3luYy9hc3luYy10YWJsZS1lbGVtZW50JztcblxuZXhwb3J0IGNsYXNzIEFwcFRhYmxlVXRpbHMge1xuXG4gIHN0YXRpYyB3YWl0SWRsZSh0YWJsZTogQXBwVGFibGU8YW55LCBhbnksIGFueT4pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICghdGFibGUgfHwgIXRhYmxlLmRhdGFTb3VyY2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0YWJsZS4gTWlzc2luZyB0YWJsZSBvciB0YWJsZS5kYXRhU291cmNlJyk7XG4gICAgfVxuICAgIHJldHVybiB0YWJsZS5kYXRhU291cmNlLndhaXRJZGxlKCk7XG4gIH1cblxuICBzdGF0aWMgbG9nUm93RXJyb3JzKHJvdzogVGFibGVFbGVtZW50PGFueT58QXN5bmNUYWJsZUVsZW1lbnQ8YW55PiwgbG9nUHJlZml4Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnMocm93LnZhbGlkYXRvciwgbG9nUHJlZml4KTtcbiAgfVxuXG59XG4iXX0=
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUudXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvdGFibGUvdGFibGUudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBQyxXQUFXLEVBQVUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUMsUUFBUSxFQUFFLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRS9ELE1BQU0sT0FBTyxhQUFhO0lBRXhCLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBOEI7UUFDNUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1NBQ3JFO1FBQ0QsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQTZDLEVBQUUsU0FBa0I7UUFDbkYsWUFBWSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUF5RCxHQUEyQztRQUNwSCxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxNQUFNLENBQUMsWUFBWSxDQUF5RCxJQUFnRDtRQUMxSCxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzthQUNoQixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7YUFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQzthQUNoQixHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQzthQUN0QixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQXlELElBQWdEO1FBQ3pILE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2FBQ2hCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQzthQUM3QixNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcHBUYWJsZX0gZnJvbSAnLi90YWJsZS5jbGFzcyc7XG5pbXBvcnQge1RhYmxlRWxlbWVudH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7QXBwRm9ybVV0aWxzfSBmcm9tICcuLi9mb3JtL2Zvcm0udXRpbHMnO1xuaW1wb3J0IHtBc3luY1RhYmxlRWxlbWVudH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlL3NyYy9hcHAvbmd4LW1hdGVyaWFsLXRhYmxlL2FzeW5jL2FzeW5jLXRhYmxlLWVsZW1lbnQnO1xuaW1wb3J0IHtFbnRpdHlVdGlscywgSUVudGl0eX0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvZW50aXR5Lm1vZGVsJztcbmltcG9ydCB7aXNOb3ROaWwsIGlzTm90TmlsT3JOYU59IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgQXBwVGFibGVVdGlscyB7XG5cbiAgc3RhdGljIHdhaXRJZGxlKHRhYmxlOiBBcHBUYWJsZTxhbnksIGFueSwgYW55Pik6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0YWJsZSB8fCAhdGFibGUuZGF0YVNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHRhYmxlLiBNaXNzaW5nIHRhYmxlIG9yIHRhYmxlLmRhdGFTb3VyY2UnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhYmxlLmRhdGFTb3VyY2Uud2FpdElkbGUoKTtcbiAgfVxuXG4gIHN0YXRpYyBsb2dSb3dFcnJvcnMocm93OiBUYWJsZUVsZW1lbnQ8YW55PnxBc3luY1RhYmxlRWxlbWVudDxhbnk+LCBsb2dQcmVmaXg/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBBcHBGb3JtVXRpbHMubG9nRm9ybUVycm9ycyhyb3cudmFsaWRhdG9yLCBsb2dQcmVmaXgpO1xuICB9XG5cbiAgc3RhdGljIGdldEVudGl0eUlkPFQgZXh0ZW5kcyBJRW50aXR5PFQsIElEPiA9IElFbnRpdHk8YW55LCBhbnk+LCBJRCA9IGFueT4ocm93OiBUYWJsZUVsZW1lbnQ8VD4gfCBBc3luY1RhYmxlRWxlbWVudDxUPik6IElEIHtcbiAgICByZXR1cm4gRW50aXR5VXRpbHMuZ2V0SWQocm93LmN1cnJlbnREYXRhKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRFbnRpdHlJZHM8VCBleHRlbmRzIElFbnRpdHk8VCwgSUQ+ID0gSUVudGl0eTxhbnksIGFueT4sIElEID0gYW55Pihyb3dzOiBUYWJsZUVsZW1lbnQ8VD5bXSB8IEFzeW5jVGFibGVFbGVtZW50PFQ+W10pOiBJRFtdIHtcbiAgICByZXR1cm4gKHJvd3MgfHwgW10pXG4gICAgICAubWFwKChyb3cpID0+IHJvdy5jdXJyZW50RGF0YSlcbiAgICAgIC5maWx0ZXIoaXNOb3ROaWwpXG4gICAgICAubWFwKEVudGl0eVV0aWxzLmdldElkKVxuICAgICAgLmZpbHRlcihpc05vdE5pbE9yTmFOKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRFbnRpdGllczxUIGV4dGVuZHMgSUVudGl0eTxULCBJRD4gPSBJRW50aXR5PGFueSwgYW55PiwgSUQgPSBhbnk+KHJvd3M6IFRhYmxlRWxlbWVudDxUPltdIHwgQXN5bmNUYWJsZUVsZW1lbnQ8VD5bXSk6IFRbXSB7XG4gICAgcmV0dXJuIChyb3dzIHx8IFtdKVxuICAgICAgLm1hcCgocm93KSA9PiByb3cuY3VycmVudERhdGEpXG4gICAgICAuZmlsdGVyKGlzTm90TmlsKTtcbiAgfVxufVxuIl19
@@ -11515,6 +11515,15 @@ class EntityUtils {
11515
11515
  static isRemoteId(id) {
11516
11516
  return isNotNil(id) && +id >= 0;
11517
11517
  }
11518
+ static getId(entity) {
11519
+ return entity.id;
11520
+ }
11521
+ static collectById(entities) {
11522
+ return (entities || []).map(e => e.id);
11523
+ }
11524
+ static arrayDistinctFilterFn(item, index, values) {
11525
+ return values.findIndex(e => e.id === item.id) === index;
11526
+ }
11518
11527
  }
11519
11528
  EntityUtils.getPropertyByPath = getPropertyByPath;
11520
11529
 
@@ -25995,6 +26004,21 @@ class AppTableUtils {
25995
26004
  static logRowErrors(row, logPrefix) {
25996
26005
  AppFormUtils.logFormErrors(row.validator, logPrefix);
25997
26006
  }
26007
+ static getEntityId(row) {
26008
+ return EntityUtils.getId(row.currentData);
26009
+ }
26010
+ static getEntityIds(rows) {
26011
+ return (rows || [])
26012
+ .map((row) => row.currentData)
26013
+ .filter(isNotNil)
26014
+ .map(EntityUtils.getId)
26015
+ .filter(isNotNilOrNaN);
26016
+ }
26017
+ static getEntities(rows) {
26018
+ return (rows || [])
26019
+ .map((row) => row.currentData)
26020
+ .filter(isNotNil);
26021
+ }
25998
26022
  }
25999
26023
 
26000
26024
  // @dynamic
@@ -26421,6 +26445,7 @@ class AppTable {
26421
26445
  this.dirtySubject = new BehaviorSubject(false);
26422
26446
  this.errorSubject = new BehaviorSubject(undefined);
26423
26447
  this.selection = new SelectionModel(true, []);
26448
+ this.permanentSelection = null;
26424
26449
  this.editedRow = undefined;
26425
26450
  this.i18nColumnPrefix = 'COMMON.';
26426
26451
  this.autoLoad = true;
@@ -26474,18 +26499,6 @@ class AppTable {
26474
26499
  set error(error) {
26475
26500
  this.setError(error);
26476
26501
  }
26477
- /**
26478
- * @deprecated
26479
- */
26480
- get loading$() {
26481
- return this.loadingSubject.asObservable();
26482
- }
26483
- /**
26484
- * @deprecated
26485
- */
26486
- get saving$() {
26487
- return this.savingSubject.asObservable();
26488
- }
26489
26502
  get firstUserColumn() {
26490
26503
  return this.displayedColumns[RESERVED_START_COLUMNS.length];
26491
26504
  }
@@ -26507,6 +26520,11 @@ class AppTable {
26507
26520
  get empty() {
26508
26521
  return this.loading || this.totalRowCount === 0;
26509
26522
  }
26523
+ get selectedEntities() {
26524
+ var _a;
26525
+ return ((_a = this.permanentSelection) === null || _a === void 0 ? void 0 : _a.selected)
26526
+ || AppTableUtils.getEntities(this.selection.selected);
26527
+ }
26510
26528
  get dirty() {
26511
26529
  return this.dirtySubject.value;
26512
26530
  }
@@ -27076,8 +27094,7 @@ class AppTable {
27076
27094
  isAllSelected() {
27077
27095
  // DEBUG
27078
27096
  //console.debug('isAllSelected. lengths', this.selection.selected.length, this.totalRowCount);
27079
- return this.selection.selected.length === this.totalRowCount ||
27080
- this.selection.selected.length === this.visibleRowCount;
27097
+ return this.selection.selected.length === this.visibleRowCount;
27081
27098
  }
27082
27099
  /** Selects all rows if they are not all selected; otherwise clear selection. */
27083
27100
  masterToggle() {
@@ -27206,7 +27223,8 @@ class AppTable {
27206
27223
  // DO not update manually, because watchALl().subscribe() will update this count
27207
27224
  //this.totalRowCount -= deleteCount;
27208
27225
  //this.visibleRowCount -= deleteCount;
27209
- this.selection.clear();
27226
+ // Deselect deleted rows
27227
+ this.selection.deselect(...rows);
27210
27228
  this.editedRow = undefined;
27211
27229
  this.markAsDirty({ emitEvent: false /*markForCheck() is called just after*/ });
27212
27230
  this.markForCheck();
@@ -27275,7 +27293,6 @@ class AppTable {
27275
27293
  event.preventDefault();
27276
27294
  }
27277
27295
  this.markAsLoading();
27278
- this.selection.clear();
27279
27296
  this.openRow(row.currentData.id, row)
27280
27297
  .then(() => this.markAsLoaded())
27281
27298
  .catch(() => this.markAsLoaded());
@@ -27590,9 +27607,7 @@ class AppTable {
27590
27607
  this.onNewRow.emit(event);
27591
27608
  return true;
27592
27609
  }
27593
- return yield this.router.navigate(['new'], {
27594
- relativeTo: this.route
27595
- });
27610
+ return this.navController.navigateForward(`${this.router.url}/new`);
27596
27611
  });
27597
27612
  }
27598
27613
  // can be overridden to add more required columns
@@ -28019,6 +28034,53 @@ class AppTable {
28019
28034
  def.subject.unsubscribe();
28020
28035
  }
28021
28036
  }
28037
+ /**
28038
+ * Initialize the permanent selection model
28039
+ * @protected
28040
+ */
28041
+ initPermanentSelection() {
28042
+ if (this.permanentSelection)
28043
+ throw new Error('initPermanentSelection() already called!');
28044
+ this.permanentSelection = new SelectionModel(true, []);
28045
+ let selectionChangedPrevented = false;
28046
+ // Listen sort change
28047
+ this.registerSubscription(this.onSort.subscribe(() => (selectionChangedPrevented = true)) // prevent selection change on sort
28048
+ );
28049
+ // Listen datasource update
28050
+ this.registerSubscription(this.dataSource.rowsSubject
28051
+ // restore the 'adding' selection (for example after a page or sort change)
28052
+ .subscribe((rows) => {
28053
+ selectionChangedPrevented = true;
28054
+ try {
28055
+ const permanentSelectionIds = (this.permanentSelection.selected || []).map(EntityUtils.getId);
28056
+ this.selection.setSelection(...rows.filter((row) => permanentSelectionIds.includes(AppTableUtils.getEntityId(row))));
28057
+ this.markForCheck();
28058
+ }
28059
+ finally {
28060
+ selectionChangedPrevented = false;
28061
+ }
28062
+ }));
28063
+ // Listen selection change
28064
+ this.registerSubscription(this.selection.changed
28065
+ .pipe(filter(() => !selectionChangedPrevented))
28066
+ .subscribe((selectionChange) => {
28067
+ // add to selection
28068
+ if (selectionChange.added.length) {
28069
+ this.permanentSelection.setSelection(...(this.permanentSelection.selected || [])
28070
+ // Add new elements
28071
+ .concat(...AppTableUtils.getEntities(selectionChange.added))
28072
+ // Avoid duplicated entities (Mantis #55351)
28073
+ .filter(EntityUtils.arrayDistinctFilterFn));
28074
+ }
28075
+ // remove from selection
28076
+ if (selectionChange.removed.length) {
28077
+ const removedIds = AppTableUtils.getEntityIds(selectionChange.removed);
28078
+ this.permanentSelection.setSelection(...(this.permanentSelection.selected || [])
28079
+ .filter((entity) => !removedIds.includes(entity.id)));
28080
+ }
28081
+ this.markForCheck();
28082
+ }));
28083
+ }
28022
28084
  }
28023
28085
  AppTable.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AppTable, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
28024
28086
  AppTable.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: AppTable, inputs: { settingsId: "settingsId", debug: "debug", i18nColumnPrefix: "i18nColumnPrefix", i18nColumnSuffix: "i18nColumnSuffix", autoLoad: "autoLoad", readOnly: "readOnly", inlineEdition: "inlineEdition", focusFirstColumn: "focusFirstColumn", confirmBeforeDelete: "confirmBeforeDelete", confirmBeforeCancel: "confirmBeforeCancel", undoableDeletion: "undoableDeletion", saveBeforeDelete: "saveBeforeDelete", keepEditedRowOnSave: "keepEditedRowOnSave", saveBeforeSort: "saveBeforeSort", saveBeforeFilter: "saveBeforeFilter", propagateRowError: "propagateRowError", defaultSortBy: "defaultSortBy", defaultSortDirection: "defaultSortDirection", defaultPageSize: "defaultPageSize", defaultPageSizeOptions: "defaultPageSizeOptions", focusColumn: "focusColumn", dataSource: "dataSource", filter: "filter", disabled: "disabled", paginator: "paginator" }, outputs: { onRefresh: "onRefresh", onOpenRow: "onOpenRow", onNewRow: "onNewRow", onStartEditingRow: "onStartEditingRow", onConfirmEditCreateRow: "onConfirmEditCreateRow", onCancelOrDeleteRow: "onCancelOrDeleteRow", onBeforeDeleteRows: "onBeforeDeleteRows", onBeforeCancelRows: "onBeforeCancelRows", onBeforeSave: "onBeforeSave", onAfterDeletedRows: "onAfterDeletedRows", onSort: "onSort", onDirty: "onDirty", onError: "onError" }, viewQueries: [{ propertyName: "table", first: true, predicate: MatTable, descendants: true }, { propertyName: "childPaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "sort", first: true, predicate: MatSort, descendants: true }], ngImport: i0 });
@@ -29441,7 +29503,8 @@ class AppEntityEditor extends AppTabEditor {
29441
29503
  console.debug('[entity-editor] Updating route using queryParams: ', queryParams);
29442
29504
  return yield this.router.navigate(['.'], {
29443
29505
  relativeTo: this.route,
29444
- queryParams: this.queryParams
29506
+ queryParams: this.queryParams,
29507
+ state: { animated: false }
29445
29508
  });
29446
29509
  }
29447
29510
  }
@@ -29451,7 +29514,8 @@ class AppEntityEditor extends AppTabEditor {
29451
29514
  const res = yield this.router.navigate(['.'], {
29452
29515
  relativeTo: this.route,
29453
29516
  replaceUrl: true,
29454
- queryParams: Object.assign(Object.assign({}, this.queryParams), { [this.pathIdAttribute]: futureId })
29517
+ queryParams: Object.assign(Object.assign({}, this.queryParams), { [this.pathIdAttribute]: futureId }),
29518
+ state: { animated: false }
29455
29519
  });
29456
29520
  if (!res)
29457
29521
  return false;
@@ -29463,7 +29527,8 @@ class AppEntityEditor extends AppTabEditor {
29463
29527
  console.debug('[entity-editor] Updating route to: ' + path);
29464
29528
  return yield this.router.navigate(commands, {
29465
29529
  replaceUrl: true,
29466
- queryParams: this.queryParams
29530
+ queryParams: this.queryParams,
29531
+ state: { animated: false }
29467
29532
  });
29468
29533
  }
29469
29534
  return Promise.reject('Missing page URL');