diff --git a/apps/red-ui/src/app/components/downloads-list-screen/downloads-list-screen.component.html b/apps/red-ui/src/app/components/downloads-list-screen/downloads-list-screen.component.html index 8007a30fd..96540c481 100644 --- a/apps/red-ui/src/app/components/downloads-list-screen/downloads-list-screen.component.html +++ b/apps/red-ui/src/app/components/downloads-list-screen/downloads-list-screen.component.html @@ -7,7 +7,7 @@ [bulkActions]="bulkActions" [hasEmptyColumn]="true" [selectionEnabled]="true" - [tableColumnConfigs]="tableColConfigs" + [tableColumnConfigs]="tableColumnConfigs" [tableHeaderLabel]="tableHeaderLabel" > diff --git a/apps/red-ui/src/app/components/downloads-list-screen/downloads-list-screen.component.ts b/apps/red-ui/src/app/components/downloads-list-screen/downloads-list-screen.component.ts index aaf77cc26..db4e6259c 100644 --- a/apps/red-ui/src/app/components/downloads-list-screen/downloads-list-screen.component.ts +++ b/apps/red-ui/src/app/components/downloads-list-screen/downloads-list-screen.component.ts @@ -14,11 +14,11 @@ import { LoadingService } from '@services/loading.service'; providers: [...DefaultListingServices] }) export class DownloadsListScreenComponent extends BaseListingComponent implements OnInit { - readonly circleButtonTypes = CircleButtonTypes; readonly itemSize = 80; protected readonly _primaryKey = 'storageId'; + readonly circleButtonTypes = CircleButtonTypes; readonly tableHeaderLabel = _('downloads-list.table-header.title'); - readonly tableColConfigs: TableColumnConfig[] = [ + readonly tableColumnConfigs: TableColumnConfig[] = [ { label: _('downloads-list.table-col-names.name') }, { label: _('downloads-list.table-col-names.size') }, { label: _('downloads-list.table-col-names.date') }, @@ -47,9 +47,9 @@ export class DownloadsListScreenComponent extends BaseListingComponent d.storageId); + const storageIds = (downloads || this.entitiesService.selected).map(d => d.storageId); await this._downloadControllerService.deleteDownload({ storageIds }).toPromise(); - this.screenStateService.setSelectedEntities([]); + this.entitiesService.setSelected([]); await this._loadData(); } diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-template-listing/dossier-templates-listing-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/dossier-template-listing/dossier-templates-listing-screen.component.html index 16e33115b..f956818ae 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-template-listing/dossier-templates-listing-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-template-listing/dossier-templates-listing-screen.component.html @@ -11,7 +11,7 @@
@@ -94,7 +94,7 @@ [] = [ { label: _('dossier-templates-listing.table-col-names.name'), withSort: true, @@ -38,7 +40,6 @@ export class DossierTemplatesListingScreenComponent extends BaseListingComponent column: 'dateModified' } ]; - protected _tableHeaderLabel = _('dossier-templates-listing.table-header.title'); constructor( protected readonly _injector: Injector, @@ -74,9 +75,9 @@ export class DossierTemplatesListingScreenComponent extends BaseListingComponent }); } - private async _deleteTemplates(templateIds: string[] = this.screenStateService.selectedEntities.map(d => d.dossierTemplateId)) { + private async _deleteTemplates(templateIds: string[] = this.entitiesService.selected.map(d => d.dossierTemplateId)) { await this._dossierTemplateControllerService.deleteDossierTemplates(templateIds).toPromise(); - this.screenStateService.setSelectedEntities([]); + this.entitiesService.setSelected([]); await this._appStateService.loadAllDossierTemplates(); await this._appStateService.loadDictionaryData(); this.loadDossierTemplatesData(); diff --git a/apps/red-ui/src/app/modules/admin/screens/trash/trash-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/trash/trash-screen.component.html index 49d2932ba..7f8c0234b 100644 --- a/apps/red-ui/src/app/modules/admin/screens/trash/trash-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/trash/trash-screen.component.html @@ -8,7 +8,7 @@ @@ -56,7 +56,7 @@
- {{ getRestoreDate(entity.softDeletedTime) | date: 'timeFromNow' }} + {{ entity.restoreDate | date: 'timeFromNow' }}
implements OnInit { - readonly circleButtonTypes = CircleButtonTypes; readonly itemSize = 80; - readonly tableColConfigs: TableColConfig[] = [ + protected readonly _primaryKey = 'dossierName'; + readonly circleButtonTypes = CircleButtonTypes; + readonly tableHeaderLabel = 'trash.table-header.title'; + readonly canRestoreSelected$ = this._canRestoreSelected$; + private readonly _deleteRetentionHours = this._appConfigService.getConfig(AppConfigKey.DELETE_RETENTION_HOURS); + readonly tableColumnConfigs: TableColumnConfig[] = [ { label: _('trash.table-col-names.name'), withSort: true, @@ -50,10 +53,6 @@ export class TrashScreenComponent extends BaseListingComponent column: 'softDeletedTime' } ]; - readonly canRestoreSelected$ = this._canRestoreSelected$; - protected readonly _primaryKey = 'dossierName'; - protected readonly _tableHeaderLabel = 'trash.table-header.title'; - private readonly _deleteRetentionHours = this._appConfigService.getConfig(AppConfigKey.DELETE_RETENTION_HOURS); constructor( readonly permissionsService: PermissionsService, @@ -67,8 +66,8 @@ export class TrashScreenComponent extends BaseListingComponent } private get _canRestoreSelected$(): Observable { - return this.screenStateService.selectedEntities$.pipe( - map(entities => entities.length && this._canRestore(entities)), + return this.entitiesService.selected$.pipe( + map(entities => entities.length && !entities.find(dossier => !dossier.canRestore)), distinctUntilChanged() ); } @@ -79,11 +78,11 @@ export class TrashScreenComponent extends BaseListingComponent this._loadingService.stop(); } - getRestoreDate(softDeletedTime: string): string { + private _getRestoreDate(softDeletedTime: string): string { return moment(softDeletedTime).add(this._deleteRetentionHours, 'hours').toISOString(); } - hardDelete(dossiers = this.screenStateService.selectedEntities) { + hardDelete(dossiers = this.entitiesService.selected) { const data = new ConfirmationDialogInput({ title: dossiers.length > 1 ? _('confirmation-dialog.delete-dossier.title-alt') : _('confirmation-dialog.delete-dossier.title'), titleColor: TitleColors.PRIMARY, @@ -102,27 +101,16 @@ export class TrashScreenComponent extends BaseListingComponent }); } - restore(dossiers = this.screenStateService.selectedEntities) { + restore(dossiers = this.entitiesService.selected) { this._loadingService.loadWhile(this._restore(dossiers)); } private async _loadDossiersData(): Promise { - this.screenStateService.setEntities(this._toListItems(await this._dossiersService.getDeleted())); + this.entitiesService.setEntities(this._toListItems(await this._dossiersService.getDeleted())); } - private _canRestore(dossiers: DossierListItem[]): boolean { - return dossiers.reduce((prev, dossier) => prev && dossier.canRestore, true); - } - - private _canRestoreDossier(dossier: Dossier): boolean { - const date = moment(this.getRestoreDate(dossier.softDeletedTime)); - const now = new Date(Date.now()); - - const daysLeft = date.diff(now, 'days'); - const hoursFromNow = date.diff(now, 'hours'); - const hoursLeft = hoursFromNow - HOURS_IN_A_DAY * daysLeft; - const minutesFromNow = date.diff(now, 'minutes'); - const minutesLeft = minutesFromNow - HOURS_IN_A_DAY * MINUTES_IN_AN_HOUR * daysLeft; + private _canRestoreDossier(restoreDate: string): boolean { + const { daysLeft, hoursLeft, minutesLeft } = getLeftDateTime(restoreDate); return daysLeft >= 0 && hoursLeft >= 0 && minutesLeft > 0; } @@ -132,9 +120,11 @@ export class TrashScreenComponent extends BaseListingComponent } private _toListItem(dossier: Dossier): DossierListItem { + const restoreDate = this._getRestoreDate(dossier.softDeletedTime); return { ...dossier, - canRestore: this._canRestoreDossier(dossier) + restoreDate, + canRestore: this._canRestoreDossier(restoreDate) }; } diff --git a/apps/red-ui/src/app/modules/shared/components/table-header/table-header.component.html b/apps/red-ui/src/app/modules/shared/components/table-header/table-header.component.html index 2b8d9d17d..abec8eb74 100644 --- a/apps/red-ui/src/app/modules/shared/components/table-header/table-header.component.html +++ b/apps/red-ui/src/app/modules/shared/components/table-header/table-header.component.html @@ -19,7 +19,7 @@
0) return this._translateService.instant('time.less-than-an-hour'); diff --git a/apps/red-ui/src/app/utils/functions.ts b/apps/red-ui/src/app/utils/functions.ts index 183aae547..1bf96c3b0 100644 --- a/apps/red-ui/src/app/utils/functions.ts +++ b/apps/red-ui/src/app/utils/functions.ts @@ -1,3 +1,5 @@ +import * as moment from 'moment'; + export const FALLBACK_COLOR = '#CCCCCC'; export function groupBy(xs: any[], key: string) { @@ -67,3 +69,19 @@ export function toNumber(string) { return 0; } } + +const HOURS_IN_A_DAY = 24; +const MINUTES_IN_AN_HOUR = 60; + +export function getLeftDateTime(ISOString: string) { + const date = moment(ISOString); + const now = new Date(Date.now()); + + const daysLeft = date.diff(now, 'days'); + const hoursFromNow = date.diff(now, 'hours'); + const hoursLeft = hoursFromNow - HOURS_IN_A_DAY * daysLeft; + const minutesFromNow = date.diff(now, 'minutes'); + const minutesLeft = minutesFromNow - HOURS_IN_A_DAY * MINUTES_IN_AN_HOUR * daysLeft; + + return { daysLeft, hoursLeft, minutesLeft }; +}