Asymmetrik/ngx-starter

View on GitHub
src/app/core/teams/list-teams/base-list-teams.component.ts

Summary

Maintainability
A
0 mins
Test Coverage
import {
    Directive,
    HostAttributeToken,
    booleanAttribute,
    computed,
    inject,
    input
} from '@angular/core';

import cloneDeep from 'lodash/cloneDeep';
import { Observable } from 'rxjs';

import { PagingOptions, PagingResults } from '../../../common';
import { SystemAlertService } from '../../../common/system-alert';
import { AsyTableDataSource } from '../../../common/table';
import { APP_SESSION } from '../../tokens';
import { Team } from '../team.model';
import { TeamsService } from '../teams.service';

@Directive({ standalone: true })
export abstract class BaseListTeamsComponent {
    readonly #teamsService = inject(TeamsService);
    readonly #alertService = inject(SystemAlertService);
    readonly #session = inject(APP_SESSION);

    readonly parent = input<Team>();
    readonly embedded = booleanAttribute(
        inject(new HostAttributeToken('embedded'), { optional: true })
    );

    readonly canCreateTeam = computed(() => this.#session().hasSomeRoles(['editor', 'admin']));

    readonly displayedColumns = ['name', 'created', 'description'];

    protected constructor(public dataSource: AsyTableDataSource<Team>) {
        this.#alertService.clearAllAlerts();
    }

    loadData(
        pagingOptions: PagingOptions,
        search: string,
        query: object & { $and?: object[] }
    ): Observable<PagingResults<Team>> {
        if (this.parent()) {
            query = cloneDeep(query);
            if (!query.$and) {
                query.$and = [];
            }
            query.$and.push({ parent: this.parent()?._id });
        }

        return this.#teamsService.search(pagingOptions, query, search);
    }

    clearFilters() {
        this.dataSource.search('');
    }
}