import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { MatDialog } from '@angular/material/dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { IsActive } from '@app/core/common/enum/is-active.enum'; import { Language } from '@app/core/model/language/language'; import { LanguageLookup } from '@app/core/query/language.lookup'; import { AuthService } from '@app/core/services/auth/auth.service'; import { LanguageHttpService } from '@app/core/services/language/language.http.service'; import { SnackBarNotificationLevel, UiNotificationService } from '@app/core/services/notification/ui-notification-service'; import { EnumUtils } from '@app/core/services/utilities/enum-utils.service'; import { QueryParamsService } from '@app/core/services/utilities/query-params.service'; import { BaseListingComponent } from '@common/base/base-listing-component'; import { PipeService } from '@common/formatting/pipe.service'; import { DataTableDateTimeFormatPipe } from '@common/formatting/pipes/date-time-format.pipe'; import { IsActiveTypePipe } from '@common/formatting/pipes/is-active-type.pipe'; import { QueryResult } from '@common/model/query-result'; import { ConfirmationDialogComponent } from '@common/modules/confirmation-dialog/confirmation-dialog.component'; import { HttpErrorHandlingService } from '@common/modules/errors/error-handling/http-error-handling.service'; import { ColumnDefinition, ColumnsChangedEvent, HybridListingComponent, PageLoadEvent } from '@common/modules/hybrid-listing/hybrid-listing.component'; import { Guid } from '@common/types/guid'; import { TranslateService } from '@ngx-translate/core'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { nameof } from 'ts-simple-nameof'; @Component({ templateUrl: './language-listing.component.html', styleUrls: ['./language-listing.component.scss'] }) export class LanguageListingComponent extends BaseListingComponent implements OnInit { publish = false; userSettingsKey = { key: 'LanguageListingUserSettings' }; propertiesAvailableForOrder: ColumnDefinition[]; // @ViewChild('LanguageStatus', { static: true }) LanguageStatus?: TemplateRef; @ViewChild('actions', { static: true }) actions?: TemplateRef; @ViewChild(HybridListingComponent, { static: true }) hybridListingComponent: HybridListingComponent; private readonly lookupFields: string[] = [ nameof(x => x.id), nameof(x => x.code), nameof(x => x.updatedAt), nameof(x => x.createdAt), nameof(x => x.hash), nameof(x => x.belongsToCurrentTenant), nameof(x => x.isActive) ]; rowIdentity = x => x.id; constructor( protected router: Router, protected route: ActivatedRoute, protected uiNotificationService: UiNotificationService, protected httpErrorHandlingService: HttpErrorHandlingService, protected queryParamsService: QueryParamsService, private languageV2Service: LanguageHttpService, public authService: AuthService, private pipeService: PipeService, public enumUtils: EnumUtils, private language: TranslateService, private dialog: MatDialog ) { super(router, route, uiNotificationService, httpErrorHandlingService, queryParamsService); // Lookup setup // Default lookup values are defined in the user settings class. this.lookup = this.initializeLookup(); } ngOnInit() { super.ngOnInit(); } protected initializeLookup(): LanguageLookup { const lookup = new LanguageLookup(); lookup.metadata = { countAll: true }; lookup.page = { offset: 0, size: this.ITEMS_PER_PAGE }; lookup.isActive = [IsActive.Active]; lookup.order = { items: [this.toDescSortField(nameof(x => x.createdAt))] }; this.updateOrderUiFields(lookup.order); lookup.project = { fields: this.lookupFields }; return lookup; } protected setupColumns() { this.gridColumns.push(...[{ prop: nameof(x => x.code), sortable: true, languageName: 'LANGUAGE-LISTING.FIELDS.CODE' }, { prop: nameof(x => x.createdAt), sortable: true, languageName: 'LANGUAGE-LISTING.FIELDS.CREATED-AT', pipe: this.pipeService.getPipe(DataTableDateTimeFormatPipe).withFormat('short') }, { prop: nameof(x => x.updatedAt), sortable: true, languageName: 'LANGUAGE-LISTING.FIELDS.UPDATED-AT', pipe: this.pipeService.getPipe(DataTableDateTimeFormatPipe).withFormat('short') }, { prop: nameof(x => x.isActive), sortable: true, languageName: 'LANGUAGE-LISTING.FIELDS.IS-ACTIVE', pipe: this.pipeService.getPipe(IsActiveTypePipe) }, { alwaysShown: true, cellTemplate: this.actions, maxWidth: 120 } ]); this.propertiesAvailableForOrder = this.gridColumns.filter(x => x.sortable); } // // Listing Component functions // onColumnsChanged(event: ColumnsChangedEvent) { super.onColumnsChanged(event); this.onColumnsChangedInternal(event.properties.map(x => x.toString())); } private onColumnsChangedInternal(columns: string[]) { // Here are defined the projection fields that always requested from the api. const fields = new Set(this.lookupFields); this.gridColumns.map(x => x.prop) .filter(x => !columns?.includes(x as string)) .forEach(item => { fields.delete(item as string) }); this.lookup.project = { fields: [...fields] }; this.onPageLoad({ offset: 0 } as PageLoadEvent); } protected loadListing(): Observable> { return this.languageV2Service.query(this.lookup); } public deleteType(id: Guid) { if (id) { const dialogRef = this.dialog.open(ConfirmationDialogComponent, { data: { isDeleteConfirmation: true, message: this.language.instant('GENERAL.CONFIRMATION-DIALOG.DELETE-ITEM'), confirmButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CONFIRM'), cancelButton: this.language.instant('GENERAL.CONFIRMATION-DIALOG.ACTIONS.CANCEL') } }); dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { if (result) { this.languageV2Service.delete(id).pipe(takeUntil(this._destroyed)) .subscribe( complete => this.onCallbackSuccess(), error => this.onCallbackError(error) ); } }); } } onCallbackSuccess(): void { this.uiNotificationService.snackBarNotification(this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-DELETE'), SnackBarNotificationLevel.Success); this.refresh(); } }