Listable by ID instead of reference

This commit is contained in:
Timo Bejan 2021-08-24 13:34:23 +03:00
parent 7d14fc27fb
commit 844e265777
5 changed files with 16 additions and 6 deletions

View File

@ -35,3 +35,4 @@ export * from './lib/inputs/editable-input/editable-input.component';
export * from './lib/inputs/input-with-action/input-with-action.component';
export * from './lib/buttons';
export * from './lib/help-mode';
export * from './lib/tables/models/listable';

View File

@ -4,12 +4,13 @@ import { distinctUntilChanged, map, tap } from 'rxjs/operators';
import { FilterService } from '../filtering/filter.service';
import { SearchService } from '../search/search.service';
import { getFilteredEntities } from '../filtering/filter-utils';
import { Listable } from './models/listable';
const toLengthValue = (entities: unknown[]) => entities?.length ?? 0;
const getLength = pipe(map(toLengthValue), distinctUntilChanged());
@Injectable()
export class EntitiesService<T> {
export class EntitiesService<T extends Listable> {
private readonly _all$ = new BehaviorSubject<T[]>([]);
readonly all$ = this._all$.asObservable();
readonly allLength$ = this._all$.pipe(getLength);
@ -18,8 +19,9 @@ export class EntitiesService<T> {
readonly displayed$ = this._getDisplayed$;
readonly displayedLength$ = this.displayed$.pipe(getLength);
private readonly _selected$ = new BehaviorSubject<T[]>([]);
private readonly _selected$ = new BehaviorSubject<(string | number)[]>([]);
readonly selected$ = this._selected$.asObservable();
readonly selectedEntities$ = this._selected$.asObservable().pipe(map(() => this.selected));
readonly selectedLength$ = this._selected$.pipe(getLength);
readonly noData$ = this._noData$;
@ -34,7 +36,8 @@ export class EntitiesService<T> {
}
get selected(): T[] {
return Object.values(this._selected$.getValue());
const selectedIds = Object.values(this._selected$.getValue());
return this.all.filter(a => selectedIds.indexOf(a.id) !== -1);
}
private get _getDisplayed$(): Observable<T[]> {
@ -87,7 +90,8 @@ export class EntitiesService<T> {
}
setSelected(newEntities: T[]): void {
this._selected$.next(newEntities);
const selectedIds = newEntities.map(e => e.id);
this._selected$.next(selectedIds);
}
isSelected(entity: T): boolean {

View File

@ -10,11 +10,12 @@ import { SearchService } from '../search/search.service';
import { KeysOf } from '../utils/types/utility-types';
import { TableColumnConfig } from './models/table-column-config.model';
import { EntitiesService } from './entities.service';
import { Listable } from './models/listable';
export const DefaultListingServices = [FilterService, SearchService, EntitiesService, SortingService] as const;
@Directive()
export abstract class ListingComponent<T> extends AutoUnsubscribe implements OnDestroy {
export abstract class ListingComponent<T extends Listable> extends AutoUnsubscribe implements OnDestroy {
readonly filterService = this._injector.get(FilterService);
readonly searchService = this._injector.get<SearchService<T>>(SearchService);
readonly sortingService = this._injector.get<SortingService<T>>(SortingService);

View File

@ -0,0 +1,3 @@
export interface Listable {
readonly id: string | number;
}

View File

@ -3,6 +3,7 @@ import { Required } from '../../utils/decorators/required.decorator';
import { FilterService } from '../../filtering/filter.service';
import { TableColumnConfig } from '../models/table-column-config.model';
import { EntitiesService } from '../entities.service';
import { Listable } from '../models/listable';
@Component({
selector: 'iqser-table-header',
@ -10,7 +11,7 @@ import { EntitiesService } from '../entities.service';
styleUrls: ['./table-header.component.scss'],
changeDetection: ChangeDetectionStrategy.OnPush
})
export class TableHeaderComponent<T> {
export class TableHeaderComponent<T extends Listable> {
@Input() @Required() tableHeaderLabel!: string;
@Input() @Required() tableColumnConfigs!: readonly TableColumnConfig<T>[];
@Input() hasEmptyColumn = false;