diff --git a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-csv-import-dialog/active-fields-listing/active-fields-listing.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-csv-import-dialog/active-fields-listing/active-fields-listing.component.ts index cdaceeb4d..5068b98b5 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-csv-import-dialog/active-fields-listing/active-fields-listing.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-csv-import-dialog/active-fields-listing/active-fields-listing.component.ts @@ -29,7 +29,6 @@ export class ActiveFieldsListingComponent extends BaseListingComponent im ngOnChanges(changes: SimpleChanges): void { if (changes.entities) { this.screenStateService.setEntities(this.entities); - this.screenStateService.setDisplayedEntities(this.entities); this.screenStateService.updateSelection(); } } diff --git a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts index 4de397f09..44cac87d1 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts @@ -97,7 +97,6 @@ export class FileAttributesCsvImportDialogComponent extends BaseListingComponent } this.screenStateService.setEntities(this.parseResult.meta.fields.map(field => this._buildAttribute(field))); - this.screenStateService.setDisplayedEntities(this.allEntities); this.activeFields = []; for (const entity of this.allEntities) { diff --git a/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts index 03a7f0ec9..043eb25a8 100644 --- a/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts @@ -66,7 +66,6 @@ export class DefaultColorsScreenComponent value: data[key] })); this.screenStateService.setEntities(entities); - this.screenStateService.setDisplayedEntities(entities); this._loadingService.stop(); } } diff --git a/apps/red-ui/src/app/modules/admin/screens/dictionary-listing/dictionary-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dictionary-listing/dictionary-listing-screen.component.ts index e9eaf4359..fd1fdd8db 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dictionary-listing/dictionary-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dictionary-listing/dictionary-listing-screen.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, Injector, OnInit } from '@angular/core'; +import { Component, Injector, OnInit } from '@angular/core'; import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/simple-doughnut-chart.component'; import { DictionaryControllerService } from '@redaction/red-ui-http'; import { AppStateService } from '@state/app-state.service'; @@ -17,7 +17,7 @@ import { BaseListingComponent } from '@shared/base/base-listing.component'; import { AdminDialogService } from '../../services/admin-dialog.service'; const toChartConfig = (dict: TypeValueWrapper): DoughnutChartConfig => ({ - value: dict.entries ? dict.entries.length : 0, + value: dict.entries?.length ?? 0, color: dict.hexColor, label: dict.label, key: dict.type @@ -100,8 +100,6 @@ export class DictionaryListingScreenComponent extends BaseListingComponent diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts index 8a2e518f9..fd9d9f10f 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts @@ -61,7 +61,6 @@ export class DossierAttributesListingScreenComponent extends BaseListingComponen this._loadingService.start(); const attributes = await this._dossierAttributesService.getConfig(); this.screenStateService.setEntities(attributes); - this.filterService.applyFilters(); this._loadingService.stop(); } } diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-template-listing/dossier-templates-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-template-listing/dossier-templates-listing-screen.component.ts index 2db3ceb3a..769f22100 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-template-listing/dossier-templates-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-template-listing/dossier-templates-listing-screen.component.ts @@ -54,7 +54,6 @@ export class DossierTemplatesListingScreenComponent extends BaseListingComponent this._loadingService.start(); this._appStateService.reset(); this.screenStateService.setEntities(this._appStateService.dossierTemplates); - this.filterService.applyFilters(); this._loadDossierTemplateStats(); this._loadingService.stop(); } diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts index be078f557..c17f588f1 100644 --- a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts @@ -91,17 +91,16 @@ export class FileAttributesListingScreenComponent extends BaseListingComponent implemen this._loadingService.start(); await this.loadDossierTemplatesData(); - this.filterService.applyFilters(); this._loadingService.stop(); } @@ -74,6 +73,5 @@ export class TrashScreenComponent extends BaseListingComponent implemen const entities = this.screenStateService.allEntities.filter(e => !ids.includes(e.dossierId)); this.screenStateService.setEntities(entities); this.screenStateService.setSelectedEntities([]); - this.filterService.applyFilters(); } } diff --git a/apps/red-ui/src/app/modules/admin/screens/user-listing/user-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/user-listing/user-listing-screen.component.ts index 37ca2be04..4a6fdd703 100644 --- a/apps/red-ui/src/app/modules/admin/screens/user-listing/user-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/user-listing/user-listing-screen.component.ts @@ -1,4 +1,4 @@ -import { ChangeDetectionStrategy, Component, Injector, OnInit, QueryList, ViewChildren } from '@angular/core'; +import { Component, Injector, OnInit, QueryList, ViewChildren } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; import { UserService } from '@services/user.service'; import { User, UserControllerService } from '@redaction/red-ui-http'; @@ -19,11 +19,11 @@ import { map } from 'rxjs/operators'; @Component({ templateUrl: './user-listing-screen.component.html', styleUrls: ['./user-listing-screen.component.scss'], - changeDetection: ChangeDetectionStrategy.OnPush, providers: [FilterService, SearchService, ScreenStateService, SortingService] }) export class UserListingScreenComponent extends BaseListingComponent implements OnInit { protected readonly _primaryKey = 'userId'; + readonly canDeleteSelected$ = this._canDeleteSelected$; collapsedDetails = false; chartData: DoughnutChartConfig[] = []; @@ -43,7 +43,7 @@ export class UserListingScreenComponent extends BaseListingComponent imple super(_injector); } - get canDeleteSelected$(): Observable { + get _canDeleteSelected$(): Observable { const entities$ = this.screenStateService.selectedEntities$; return entities$.pipe(map(all => all.indexOf(this.userService.user) === -1)); } @@ -86,7 +86,6 @@ export class UserListingScreenComponent extends BaseListingComponent imple private async _loadData() { this.screenStateService.setEntities(await this._userControllerService.getAllUsers().toPromise()); await this.userService.loadAllUsers(); - this.filterService.applyFilters(); this._computeStats(); this._loadingService.stop(); } diff --git a/apps/red-ui/src/app/modules/dossier/components/dossier-details/dossier-details.component.html b/apps/red-ui/src/app/modules/dossier/components/dossier-details/dossier-details.component.html index 9a0b8acae..dfca40153 100644 --- a/apps/red-ui/src/app/modules/dossier/components/dossier-details/dossier-details.component.html +++ b/apps/red-ui/src/app/modules/dossier/components/dossier-details/dossier-details.component.html @@ -41,7 +41,7 @@ [config]="documentsChartData" [radius]="63" [strokeWidth]="15" - [subtitle]="i18nKey + 'charts.documents-in-dossier'" + [subtitle]="'dossier-overview.dossier-details.charts.documents-in-dossier'" direction="row" > @@ -49,8 +49,8 @@
diff --git a/apps/red-ui/src/app/modules/dossier/components/dossier-details/dossier-details.component.ts b/apps/red-ui/src/app/modules/dossier/components/dossier-details/dossier-details.component.ts index 4a65ccbaf..5ad0f88f5 100644 --- a/apps/red-ui/src/app/modules/dossier/components/dossier-details/dossier-details.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/dossier-details/dossier-details.component.ts @@ -9,7 +9,6 @@ import { UserService } from '@services/user.service'; import { User } from '@redaction/red-ui-http'; import { Toaster } from '../../../../services/toaster.service'; import { FilterService } from '../../../shared/services/filter.service'; -import { FileStatusWrapper } from '../../../../models/file/file-status.wrapper'; import { DossierAttributeWithValue } from '@models/dossier-attributes.model'; @Component({ @@ -18,7 +17,6 @@ import { DossierAttributeWithValue } from '@models/dossier-attributes.model'; styleUrls: ['./dossier-details.component.scss'] }) export class DossierDetailsComponent implements OnInit { - readonly i18nKey = 'dossier-overview.dossier-details.'; documentsChartData: DoughnutChartConfig[] = []; owner: User; editingOwner = false; @@ -27,11 +25,13 @@ export class DossierDetailsComponent implements OnInit { @Output() openDossierDictionaryDialog = new EventEmitter(); @Output() toggleCollapse = new EventEmitter(); + readonly needsWorkFilters$ = this.filterService.getFilterModels$('needsWorkFilters'); + constructor( readonly appStateService: AppStateService, readonly translateChartService: TranslateChartService, readonly permissionsService: PermissionsService, - readonly filterService: FilterService, + readonly filterService: FilterService, private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _userService: UserService, private readonly _toaster: Toaster diff --git a/apps/red-ui/src/app/modules/dossier/components/dossier-listing-details/dossier-listing-details.component.ts b/apps/red-ui/src/app/modules/dossier/components/dossier-listing-details/dossier-listing-details.component.ts index 331a9722f..254a92de9 100644 --- a/apps/red-ui/src/app/modules/dossier/components/dossier-listing-details/dossier-listing-details.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/dossier-listing-details/dossier-listing-details.component.ts @@ -9,9 +9,9 @@ import { FilterService } from '@shared/services/filter.service'; styleUrls: ['./dossier-listing-details.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class DossierListingDetailsComponent { +export class DossierListingDetailsComponent { @Input() dossiersChartData: DoughnutChartConfig[]; @Input() documentsChartData: DoughnutChartConfig[]; - constructor(readonly appStateService: AppStateService, readonly filterService: FilterService) {} + constructor(readonly appStateService: AppStateService, readonly filterService: FilterService) {} } diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-listing-screen/dossier-listing-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-listing-screen/dossier-listing-screen.component.ts index c2ea8eeb5..83fadd698 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-listing-screen/dossier-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-listing-screen/dossier-listing-screen.component.ts @@ -1,11 +1,10 @@ -import { Component, Injector, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; +import { AfterViewInit, ChangeDetectorRef, Component, Injector, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { Dossier, DossierTemplateModel } from '@redaction/red-ui-http'; import { AppStateService } from '@state/app-state.service'; import { UserService } from '@services/user.service'; import { DoughnutChartConfig } from '@shared/components/simple-doughnut-chart/simple-doughnut-chart.component'; import { groupBy } from '@utils/functions'; import { TranslateService } from '@ngx-translate/core'; -import { PermissionsService } from '@services/permissions.service'; import { DossierWrapper } from '@state/model/dossier.wrapper'; import { timer } from 'rxjs'; import { filter } from 'rxjs/operators'; @@ -38,7 +37,10 @@ const isLeavingScreen = event => event instanceof NavigationStart && event.url ! styleUrls: ['./dossier-listing-screen.component.scss'], providers: [FilterService, SearchService, ScreenStateService, SortingService] }) -export class DossierListingScreenComponent extends BaseListingComponent implements OnInit, OnDestroy, OnAttach, OnDetach { +export class DossierListingScreenComponent + extends BaseListingComponent + implements OnInit, AfterViewInit, OnDestroy, OnAttach, OnDetach +{ readonly itemSize = 95; protected readonly _primaryKey = 'dossierName'; buttonConfigs: ButtonConfig[] = [ @@ -78,7 +80,6 @@ export class DossierListingScreenComponent extends BaseListingComponent; constructor( - readonly permissionsService: PermissionsService, private readonly _translateChartService: TranslateChartService, private readonly _userService: UserService, private readonly _dialogService: DossiersDialogService, @@ -86,6 +87,7 @@ export class DossierListingScreenComponent extends BaseListingComponent quickFilters.reduce((acc, f) => acc || (f.checked && f.checker(dw)), false) }); - - this.filterService.applyFilters(); } private _createQuickFilters() { diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview-screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview-screen/dossier-overview-screen.component.ts index 980d64688..9bab99401 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview-screen/dossier-overview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview-screen/dossier-overview-screen.component.ts @@ -49,8 +49,8 @@ export class DossierOverviewScreenComponent dossierAttributes: DossierAttributeWithValue[] = []; @ViewChild(DossierDetailsComponent, { static: false }) private readonly _dossierDetailsComponent: DossierDetailsComponent; + private readonly _lastOpenedFileKey = 'Dossier-Recent-' + this.activeDossier.dossierId; private _lastScrollPosition: number; - private _lastOpenedFileKey = 'Dossier-Recent-' + this.activeDossier.dossierId; @ViewChild('needsWorkTemplate', { read: TemplateRef, static: true }) private readonly _needsWorkTemplate: TemplateRef; @@ -163,8 +163,6 @@ export class DossierOverviewScreenComponent this._loadEntitiesFromState(); this._computeAllFilters(); - this.filterService.applyFilters(); - this._dossierDetailsComponent?.calculateChartConfig(); this._changeDetectorRef.detectChanges(); } diff --git a/apps/red-ui/src/app/modules/shared/base/base-listing.component.ts b/apps/red-ui/src/app/modules/shared/base/base-listing.component.ts index ee31643b0..9a3d2e34c 100644 --- a/apps/red-ui/src/app/modules/shared/base/base-listing.component.ts +++ b/apps/red-ui/src/app/modules/shared/base/base-listing.component.ts @@ -15,11 +15,14 @@ export abstract class BaseListingComponent extends AutoUnsubscribeComponent i readonly scrollViewport: CdkVirtualScrollViewport; readonly permissionsService: PermissionsService; - readonly filterService: FilterService; + readonly filterService: FilterService; readonly sortingService: SortingService; readonly searchService: SearchService; readonly screenStateService: ScreenStateService; + readonly sortedDisplayedEntities$: Observable; + readonly noMatch$: Observable; + /** * Key used in the *trackBy* function with **ngFor* or **cdkVirtualFor* * and in the default sorting and as the search field @@ -36,6 +39,9 @@ export abstract class BaseListingComponent extends AutoUnsubscribeComponent i this.searchService = this._injector.get(SearchService); this.screenStateService = this._injector.get>(ScreenStateService); setTimeout(() => this.setInitialConfig()); + + this.sortedDisplayedEntities$ = this._sortedDisplayedEntities$; + this.noMatch$ = this._noMatch$; } setInitialConfig() { @@ -50,7 +56,7 @@ export abstract class BaseListingComponent extends AutoUnsubscribeComponent i super.ngOnDestroy(); } - get sortedDisplayedEntities$(): Observable { + private get _sortedDisplayedEntities$(): Observable { return this.screenStateService.displayedEntities$.pipe(map(entities => this.sortingService.defaultSort(entities))); } @@ -58,7 +64,7 @@ export abstract class BaseListingComponent extends AutoUnsubscribeComponent i return this.screenStateService.allEntities; } - get noMatch$(): Observable { + private get _noMatch$(): Observable { return combineLatest([this.screenStateService.allEntitiesLength$, this.screenStateService.displayedLength$]).pipe( map(([hasEntities, hasDisplayedEntities]) => hasEntities && !hasDisplayedEntities), distinctUntilChanged() diff --git a/apps/red-ui/src/app/modules/shared/components/filters/popup-filter/popup-filter.component.ts b/apps/red-ui/src/app/modules/shared/components/filters/popup-filter/popup-filter.component.ts index 7cca79894..296f0219d 100644 --- a/apps/red-ui/src/app/modules/shared/components/filters/popup-filter/popup-filter.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/filters/popup-filter/popup-filter.component.ts @@ -1,12 +1,4 @@ -import { - ChangeDetectorRef, - Component, - EventEmitter, - Input, - OnChanges, - Output, - TemplateRef -} from '@angular/core'; +import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, TemplateRef } from '@angular/core'; import { FilterModel } from './model/filter.model'; import { handleCheckedValue } from './utils/filter-utils'; import { MAT_CHECKBOX_DEFAULT_OPTIONS } from '@angular/material/checkbox'; @@ -42,10 +34,7 @@ export class PopupFilterComponent implements OnChanges { atLeastOneFilterIsExpandable = false; atLeastOneSecondaryFilterIsExpandable = false; - constructor( - private readonly _changeDetectorRef: ChangeDetectorRef, - private readonly _translateService: TranslateService - ) {} + constructor(private readonly _changeDetectorRef: ChangeDetectorRef, private readonly _translateService: TranslateService) {} get hasActiveFilters(): boolean { return !!this._allFilters.find(f => f.checked || f.indeterminate); @@ -57,9 +46,7 @@ export class PopupFilterComponent implements OnChanges { ngOnChanges(): void { this.atLeastOneFilterIsExpandable = !!this.primaryFilters?.find(f => this.isExpandable(f)); - this.atLeastOneSecondaryFilterIsExpandable = !!this.secondaryFilters?.find(f => - this.isExpandable(f) - ); + this.atLeastOneSecondaryFilterIsExpandable = !!this.secondaryFilters?.find(f => this.isExpandable(f)); } filterCheckboxClicked($event: any, filter: FilterModel, parent?: FilterModel) { diff --git a/apps/red-ui/src/app/modules/shared/components/filters/quick-filters/quick-filters.component.html b/apps/red-ui/src/app/modules/shared/components/filters/quick-filters/quick-filters.component.html index a60ebcca1..a35b5fef6 100644 --- a/apps/red-ui/src/app/modules/shared/components/filters/quick-filters/quick-filters.component.html +++ b/apps/red-ui/src/app/modules/shared/components/filters/quick-filters/quick-filters.component.html @@ -1,6 +1,6 @@
diff --git a/apps/red-ui/src/app/modules/shared/components/filters/quick-filters/quick-filters.component.ts b/apps/red-ui/src/app/modules/shared/components/filters/quick-filters/quick-filters.component.ts index 632f0350e..fa29fc3bc 100644 --- a/apps/red-ui/src/app/modules/shared/components/filters/quick-filters/quick-filters.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/filters/quick-filters/quick-filters.component.ts @@ -1,14 +1,14 @@ -import { Component, EventEmitter, Output } from '@angular/core'; -import { FilterModel } from '../popup-filter/model/filter.model'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; import { FilterService } from '@shared/services/filter.service'; @Component({ selector: 'redaction-quick-filters', templateUrl: './quick-filters.component.html', - styleUrls: ['./quick-filters.component.scss'] + styleUrls: ['./quick-filters.component.scss'], + changeDetection: ChangeDetectionStrategy.OnPush }) -export class QuickFiltersComponent { - @Output() filtersChanged = new EventEmitter(); +export class QuickFiltersComponent { + readonly quickFilters$ = this.filterService.getFilterModels$('quickFilters'); - constructor(readonly filterService: FilterService) {} + constructor(readonly filterService: FilterService) {} } diff --git a/apps/red-ui/src/app/modules/shared/components/page-header/page-header.component.html b/apps/red-ui/src/app/modules/shared/components/page-header/page-header.component.html index ffa5724af..1c9ef9031 100644 --- a/apps/red-ui/src/app/modules/shared/components/page-header/page-header.component.html +++ b/apps/red-ui/src/app/modules/shared/components/page-header/page-header.component.html @@ -6,7 +6,7 @@ { @Input() buttonConfigs: ButtonConfig[]; @Input() searchPlaceholder: string; - constructor(@Optional() readonly filterService: FilterService, @Optional() readonly searchService: SearchService) {} + readonly filters$ = this.filterService?.filterGroups$.pipe(map(all => all.filter(f => f.icon))); + readonly showResetFilters$ = this._showResetFilters$; - get filters$(): Observable { - return this.filterService?.filterGroups$.pipe(map(all => all.filter(f => f.icon))); - } + constructor(@Optional() readonly filterService: FilterService, @Optional() readonly searchService: SearchService) {} + + get _showResetFilters$(): Observable { + if (!this.filterService) return of(false); - get showResetFilters$(): Observable { const filtersLength$ = this.filters$.pipe( map(f => f.length), distinctUntilChanged() diff --git a/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.html b/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.html index 94a662ac8..30d59d04a 100644 --- a/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.html +++ b/apps/red-ui/src/app/modules/shared/components/simple-doughnut-chart/simple-doughnut-chart.component.html @@ -33,8 +33,8 @@