From b338dd9baa8fd67a83d2f8c5710f8b56b0e360cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Thu, 18 Nov 2021 20:32:17 +0200 Subject: [PATCH] Some improvements --- src/lib/listing/services/entities.service.ts | 25 ++++++++++++++------ src/lib/listing/table/table.component.ts | 6 ++++- src/lib/services/constants.ts | 3 ++- src/lib/services/toaster.service.ts | 4 ++-- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/lib/listing/services/entities.service.ts b/src/lib/listing/services/entities.service.ts index daaa2b4..8348d5f 100644 --- a/src/lib/listing/services/entities.service.ts +++ b/src/lib/listing/services/entities.service.ts @@ -49,7 +49,7 @@ export class EntitiesService extends GenericService< loadAll(modelPath = this._defaultModelPath, queryParams?: List): Observable { return this.getAll(modelPath, queryParams).pipe( mapEach(entity => new this._entityClass(entity)), - tap((entities: E[]) => this.replace(entities)), + tap((entities: E[]) => this.setEntities(entities)), ); } @@ -67,7 +67,19 @@ export class EntitiesService extends GenericService< ); } - setEntities(newEntities: E[]): void { + setEntities(entities: E[]): void { + // Keep old object references for unchanged entities + const newEntities = entities.map(entity => { + const oldEntity = this.find(entity.id); + + if (oldEntity && JSON.stringify(oldEntity) === JSON.stringify(entity)) { + return oldEntity; + } + + this.entityChanged$.next(entity); + return entity; + }); + this._all$.next(newEntities); } @@ -79,10 +91,9 @@ export class EntitiesService extends GenericService< return this.all.some(entity => entity.id === id); } - replace(newEntities: E[]): void { - const ids = newEntities.map(entity => entity.id); - const all = this.all.filter(item => !ids.includes(item.id)); - this.setEntities([...all, ...newEntities]); - newEntities.forEach(entity => this.entityChanged$.next(entity)); + replace(entity: E): void { + const all = this.all.filter(item => item.id !== entity.id); + this.setEntities([...all, entity]); + this.entityChanged$.next(entity); } } diff --git a/src/lib/listing/table/table.component.ts b/src/lib/listing/table/table.component.ts index 7e6e3f2..221b1eb 100644 --- a/src/lib/listing/table/table.component.ts +++ b/src/lib/listing/table/table.component.ts @@ -47,7 +47,7 @@ export class TableComponent extends AutoUnsubscribe impleme @Input() itemMouseEnterFn?: (entity: T) => void; @Input() itemMouseLeaveFn?: (entity: T) => void; @Output() readonly noDataAction = new EventEmitter(); - @ViewChild(TableContentComponent, { static: true }) readonly tableContent!: TableContentComponent; + @ViewChild(TableContentComponent, { static: true }) private readonly _tableContent!: TableContentComponent; constructor( @Inject(forwardRef(() => ListingComponent)) readonly listingComponent: ListingComponent, @@ -65,6 +65,10 @@ export class TableComponent extends AutoUnsubscribe impleme return this.listingComponent.tableHeaderLabel; } + scrollToLastIndex(): void { + this._tableContent.scrollToLastIndex(); + } + ngOnInit(): void { this._setStyles(); } diff --git a/src/lib/services/constants.ts b/src/lib/services/constants.ts index 65eb969..abdb226 100644 --- a/src/lib/services/constants.ts +++ b/src/lib/services/constants.ts @@ -1,2 +1,3 @@ -export const CONFLICT_ERROR_CODE = 409; +export const CONFLICT = 409; +export const BAD_REQUEST = 400; export const CHANGED_CHECK_INTERVAL = 3000; diff --git a/src/lib/services/toaster.service.ts b/src/lib/services/toaster.service.ts index 990947e..613bfe8 100644 --- a/src/lib/services/toaster.service.ts +++ b/src/lib/services/toaster.service.ts @@ -6,7 +6,7 @@ import { TranslateService } from '@ngx-translate/core'; import { HttpErrorResponse } from '@angular/common/http'; import { filter } from 'rxjs/operators'; import { ErrorMessageService } from './error-message.service'; -import { CONFLICT_ERROR_CODE } from './constants'; +import { CONFLICT } from './constants'; const enum NotificationType { SUCCESS = 'SUCCESS', @@ -53,7 +53,7 @@ export class Toaster { error(message: string, options?: Partial): ActiveToast { let resultedMsg; - if (options?.error && options.error.status !== CONFLICT_ERROR_CODE) { + if (options?.error && options.error.status !== CONFLICT) { resultedMsg = this._errorMessageService.getMessage(options.error, message); } else { resultedMsg = this._translateService.instant(message, options?.params) as string;