diff --git a/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.html b/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.html new file mode 100644 index 0000000000000000000000000000000000000000..075a7b83d306b4eea66fac0f3aebe788148212f4 --- /dev/null +++ b/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.html @@ -0,0 +1,40 @@ +<div> + <div class="tab-content"> + <div class="file-uploaded"> + <h1>{{'deposit.aip.title.collection' | translate}}</h1> + <div class="file-uploaded-header"> + <button mat-icon-button + mat-button + (click)="refresh()" + [matTooltip]="'deposit.file.tree.refresh' | translate" + [matTooltipPosition]="'left'" + [class.spinning]="isLoadingCollectionObs | async" + [disabled]="isLoadingCollectionObs | async" + > + <fa-icon icon="sync-alt"></fa-icon> + </button> + </div> + + <div class="file-viewer"> + <div class="file-list-wrapper" + [dlcmSpinner]="isLoadingCollectionObs | async" + > + <dlcm-shared-data-table *ngIf="columns" + [columns]="columns" + [actions]="actions" + [isLoading]="isLoadingCollectionObs | async" + [datas]="listCollectionObs | async" + [queryParameters]="queryParametersObs | async" + (queryParametersChange)="onQueryParametersEvent($event)" + (selectChange)="showDetail($event)" + > + </dlcm-shared-data-table> + </div> + + <ng-template #noFile> + <label>{{'deposit.file.tree.noFile' | translate}}</label> + </ng-template> + </div> + </div> + </div> +</div> diff --git a/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.scss b/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.scss new file mode 100644 index 0000000000000000000000000000000000000000..e625020704368d8b94f3a2dffb9eab99d50bec7a --- /dev/null +++ b/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.scss @@ -0,0 +1,52 @@ +@import "../../../../../../sass/abstracts/variables"; +@import "../../../../../../sass/abstracts/mixins"; +@import "../../../../../shared/components/routables/shared-abstract-detail-edit-common/shared-abstract-detail-edit-common.routable"; + +:host { + padding: 0; + + .tab-content { + + .file-uploaded { + + .file-uploaded-header { + display: flex; + justify-content: space-between; + align-items: center; + position: relative; + min-height: 35px; + + fa-icon { + font-size: 20px; + } + + button { + transition-property: transform; + transition-duration: 1s; + + position: absolute; + top: -10px; + right: 10px; + + &.spinning { + animation-name: rotate; + animation-duration: 2s; + animation-iteration-count: infinite; + animation-timing-function: linear; + } + + @keyframes rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } + } + } + } + } + } + +} + diff --git a/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.ts b/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.ts new file mode 100644 index 0000000000000000000000000000000000000000..1fe32d755a73e92fba1685786e7dde03e62d6261 --- /dev/null +++ b/src/app/features/deposit/components/routables/deposit-collection/deposit-collection.routable.ts @@ -0,0 +1,226 @@ +import { + ChangeDetectorRef, + Component, + OnInit, +} from "@angular/core"; +import {MatDialog} from "@angular/material"; +import {ActivatedRoute} from "@angular/router"; +import {DepositExtended} from "@deposit/models/deposits-extended.model"; +import {DepositCollectionAction} from "@deposit/stores/collection/deposit-collection.action"; +import {DepositCollectionState} from "@deposit/stores/collection/deposit-collection.state"; +import {depositActionNameSpace} from "@deposit/stores/deposit.action"; +import {DepositStateModel} from "@deposit/stores/deposit.state"; +import {environment} from "@environments/environment"; +import { + Actions, + Store, +} from "@ngxs/store"; +import {AipExtended} from "@preservation/aip/models/aip-extended.model"; +import {PreservationAipAipAction} from "@preservation/aip/stores/aip-aip/aip-aip.action"; +import {PreservationAipAipState} from "@preservation/aip/stores/aip-aip/aip-aip.state"; +import {PreservationAipAipStatusHistoryAction} from "@preservation/aip/stores/aip-aip/status-history/aip-aip-status-history.action"; +import { + SharedAipDetailDialog, + SharedAipDetailDialogData, +} from "@shared/components/dialogs/shared-aip-detail/shared-aip-detail.dialog"; +import {SharedAbstractDetailEditRoutable} from "@shared/components/routables/shared-abstract-detail-edit/shared-abstract-detail-edit.routable"; +import {ComplianceLevelEnum} from "@shared/enums/business/compliance-level.enum"; +import {DataFileStatusEnum} from "@shared/enums/business/data-file-status.enum"; +import {DataTableComponentEnum} from "@shared/enums/data-table-component.enum"; +import {FieldTypeEnum} from "@shared/enums/field-type.enum"; +import {LocalStateEnum} from "@shared/enums/local-state.enum"; +import { + AppRoutesEnum, + PreservationPlanningRoutesEnum, +} from "@shared/enums/routes.enum"; +import {DataTableActions} from "@shared/models/data-table-actions.model"; +import {DataTableColumns} from "@shared/models/data-table-columns.model"; +import {Observable} from "rxjs"; +import { + CompositionState, + MemoizedUtil, + ObservableUtil, + OrderEnum, + QueryParameters, + ResourceActionHelper, + TRANSLATE, +} from "solidify-frontend"; + +@Component({ + selector: "dlcm-deposit-collection-routable", + templateUrl: "./deposit-collection.routable.html", + styleUrls: ["./deposit-collection.routable.scss"], +}) +export class DepositCollectionRoutable extends SharedAbstractDetailEditRoutable<DepositExtended, DepositStateModel> implements OnInit { + readonly KEY_PARAM_NAME: keyof DepositExtended & string = undefined; + + isLoadingCollectionObs: Observable<boolean> = MemoizedUtil.isLoading(this._store, DepositCollectionState); + listCollectionObs: Observable<AipExtended[]> = CompositionState.list(this._store, DepositCollectionState); + queryParametersObs: Observable<QueryParameters> = CompositionState.queryParameters(this._store, DepositCollectionState); + + + + columns: DataTableColumns<AipExtended>[]; + actions: DataTableActions<AipExtended>[]; + + constructor(protected readonly _store: Store, + protected readonly _route: ActivatedRoute, + protected readonly _actions$: Actions, + protected readonly _changeDetector: ChangeDetectorRef, + protected readonly _dialog: MatDialog) { + super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.deposit, depositActionNameSpace); + } + + ngOnInit(): void { + super.ngOnInit(); + this.getCurrentModelOnParent(); + + this.columns = [ + { + field: "info.name" as any, + header: TRANSLATE("deposit.aip.table.aipName"), + type: FieldTypeEnum.string, + order: OrderEnum.none, + isSortable: true, + isFilterable: false, + }, + { + field: "info.status" as any, + header: TRANSLATE("deposit.aip.table.status"), + type: FieldTypeEnum.singleSelect, + order: OrderEnum.none, + isSortable: false, + isFilterable: false, + translate: true, + filterEnum: [ + { + key: DataFileStatusEnum.IN_ERROR, + value: TRANSLATE("IN_ERROR"), + }, + { + key: DataFileStatusEnum.READY, + value: TRANSLATE("READY"), + }, + { + key: DataFileStatusEnum.RECEIVED, + value: TRANSLATE("RECEIVED"), + }, + { + key: DataFileStatusEnum.CHANGE_RELATIVE_LOCATION, + value: TRANSLATE("CHANGE_RELATIVE_LOCATION"), + }, + { + key: DataFileStatusEnum.TO_PROCESS, + value: TRANSLATE("TO_PROCESS"), + }, + { + key: DataFileStatusEnum.PROCESSED, + value: TRANSLATE("PROCESSED"), + }, + { + key: DataFileStatusEnum.FILE_FORMAT_IDENTIFIED, + value: TRANSLATE("FILE_FORMAT_IDENTIFIED"), + }, + { + key: DataFileStatusEnum.FILE_FORMAT_UNKNOWN, + value: TRANSLATE("FILE_FORMAT_UNKNOWN"), + }, + { + key: DataFileStatusEnum.VIRUS_CHECKED, + value: TRANSLATE("VIRUS_CHECKED"), + }, + { + key: DataFileStatusEnum.CLEANING, + value: TRANSLATE("CLEANING"), + }, + { + key: DataFileStatusEnum.CLEANED, + value: TRANSLATE("CLEANED"), + }, + ], + }, + { + field: "info.complianceLevel" as any, + header: TRANSLATE("deposit.aip.table.complianceLevel"), + type: FieldTypeEnum.singleSelect, + order: OrderEnum.none, + isSortable: false, + isFilterable: false, + translate: true, + component: DataTableComponentEnum.conformityLevelStar, + filterEnum: [ + { + key: ComplianceLevelEnum.FULL_COMPLIANCE, + value: TRANSLATE("FULL_COMPLIANCE"), + }, + { + key: ComplianceLevelEnum.AVERAGE_COMPLIANCE, + value: TRANSLATE("AVERAGE_COMPLIANCE"), + }, + { + key: ComplianceLevelEnum.WEAK_COMPLIANCE, + value: TRANSLATE("WEAK_COMPLIANCE"), + }, + { + key: ComplianceLevelEnum.NO_COMPLIANCE, + value: TRANSLATE("NO_COMPLIANCE"), + }, + { + key: ComplianceLevelEnum.NOT_ASSESSED, + value: TRANSLATE("NOT_ASSESSED"), + }, + ], + }, + ]; + this.actions = [ + { + logo: "forward", + callback: (aipExtended: AipExtended) => this.goToAip(aipExtended), + placeholder: TRANSLATE("crud.list.action.goToAip"), + displayOnCondition: (aipExtended: AipExtended) => true, + } + ]; + } + + private getCurrentModelOnParent(): void { + this._resId = this._route.snapshot.parent.paramMap.get(AppRoutesEnum.paramIdWithoutPrefixParam); + this.getDepositById(this._resId); + } + + private getDepositById(id: string): void { + this._store.dispatch(ResourceActionHelper.getById(depositActionNameSpace, id, true)); + this.getSubResourceWithParentId(id); + } + + getSubResourceWithParentId(id: string): void { + this._store.dispatch(new DepositCollectionAction.GetAll(id, null, true)); + } + + refresh(): void { + this._store.dispatch(new DepositCollectionAction.Refresh(this._resId)); + } + + onQueryParametersEvent(queryParameters: QueryParameters): void { + this._store.dispatch(new DepositCollectionAction.ChangeQueryParameters(this._resId, queryParameters, true)); + } + + showDetail(aip: AipExtended): void { + const dialogRef = this._dialog.open(SharedAipDetailDialog, { + data: { + aip: aip, + parentId: this._resId, + isReadonly: true, + isLoading: null, + statusHistory: null, + queryParametersObs: null, + state: null, + name: LocalStateEnum.deposit_collection, + } as SharedAipDetailDialogData<AipExtended>, + width: environment.modalWidth, + }); + } + + private goToAip(aip: AipExtended): void { + this._store.dispatch(new DepositCollectionAction.GoToAip(aip)); + } +} diff --git a/src/app/features/deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable.html b/src/app/features/deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable.html index 8a4b266c4222b810e88141eeeed9e20652e4ed81..95ca9ae3ad072cb310d070ad7f9887da1e1f56c8 100644 --- a/src/app/features/deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable.html +++ b/src/app/features/deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable.html @@ -122,6 +122,12 @@ <span class="tab-header-label">{{'deposit.tab.upload' | translate}}</span> </ng-template> </mat-tab> + <mat-tab *ngIf="(currentObs | async)?.collectionSize > 0"> + <ng-template mat-tab-label> + <mat-icon class="tab-header-icon">insert_drive_file</mat-icon> + <span class="tab-header-label">{{'deposit.tab.collection' | translate}}</span> + </ng-template> + </mat-tab> </mat-tab-group> <div class="tab-content"> diff --git a/src/app/features/deposit/deposit-routing.module.ts b/src/app/features/deposit/deposit-routing.module.ts index 561f03a97ff5d385e814160f6c8beb4beef8117f..09c12218f83086ecc48cb930be2e17f8922e5c99 100644 --- a/src/app/features/deposit/deposit-routing.module.ts +++ b/src/app/features/deposit/deposit-routing.module.ts @@ -10,6 +10,7 @@ import { DepositRoutesEnum, } from "@app/shared/enums/routes.enum"; import {DlcmRoutes} from "@app/shared/models/dlcm-route.model"; +import {DepositCollectionRoutable} from "@deposit/components/routables/deposit-collection/deposit-collection.routable"; import {DepositDetailEditRoutable} from "@deposit/components/routables/deposit-detail-edit/deposit-detail-edit.routable"; import {DepositFileRoutable} from "@deposit/components/routables/deposit-file/deposit-file.routable"; import {DepositHomeRoutable} from "@deposit/components/routables/deposit-home/deposit-home.routable"; @@ -137,6 +138,14 @@ const routes: DlcmRoutes = [ canActivate: [DepositRoleGuardEditService], canDeactivate: [CanDeactivateGuard], }, + { + path: DepositRoutesEnum.collection, + component: DepositCollectionRoutable, + data : { + breadcrumb: TRANSLATE("breadcrumb.deposit.collection"), + noBreadcrumbLink: true, + } + } ], }, ], diff --git a/src/app/features/deposit/deposit.module.ts b/src/app/features/deposit/deposit.module.ts index bf6a76f51b541cb528021aa586a24012411fda90..d2ed7722cc87ddb07f224b14cd8163b79ee7d12b 100644 --- a/src/app/features/deposit/deposit.module.ts +++ b/src/app/features/deposit/deposit.module.ts @@ -15,11 +15,13 @@ import {DepositPersonAlternativeDialog} from "@deposit/components/dialogs/deposi import {DepositPersonDialog} from "@deposit/components/dialogs/deposit-person/deposit-person.dialog"; import {DepositBannerPresentational} from "@deposit/components/presentationals/deposit-banner/deposit-banner.presentational"; import {DepositFolderTreePresentational} from "@deposit/components/presentationals/deposit-folder-tree/deposit-folder-tree.presentational"; +import {DepositCollectionRoutable} from "@deposit/components/routables/deposit-collection/deposit-collection.routable"; import {DepositFileRoutable} from "@deposit/components/routables/deposit-file/deposit-file.routable"; import {DepositHomeRoutable} from "@deposit/components/routables/deposit-home/deposit-home.routable"; import {DepositMetadataRoutable} from "@deposit/components/routables/deposit-metadata/deposit-metadata.routable"; import {DepositRootRoutable} from "@deposit/components/routables/deposit-root/deposit-root.routable"; import {DepositUploadRoutable} from "@deposit/components/routables/deposit-upload/deposit-upload.routable"; +import {DepositCollectionState} from "@deposit/stores/collection/deposit-collection.state"; import {DepositDataFileStatusHistoryState} from "@deposit/stores/data-file/status-history/deposit-data-file-status-history.state"; import {DepositOrganizationalUnitState} from "@deposit/stores/organizational-unit/deposit-organizational-unit.state"; import {DepositStatusHistoryState} from "@deposit/stores/status-history/deposit-status-history.state"; @@ -38,6 +40,7 @@ const routables = [ DepositFileRoutable, DepositUploadRoutable, DepositMetadataRoutable, + DepositCollectionRoutable ]; const containers = []; const dialogs = [ @@ -74,6 +77,7 @@ const presentationals = [ DepositStatusHistoryState, DepositDataFileStatusHistoryState, DepositOrganizationalUnitState, + DepositCollectionState ]), ], entryComponents: [ diff --git a/src/app/features/deposit/enums/deposit-tab.enum.ts b/src/app/features/deposit/enums/deposit-tab.enum.ts index 6ba699f7ca1eb55c05090f8a6a53bbbc2a8ff210..253009927c15ce0a97cbf55bb2cae94bd5342cd4 100644 --- a/src/app/features/deposit/enums/deposit-tab.enum.ts +++ b/src/app/features/deposit/enums/deposit-tab.enum.ts @@ -2,4 +2,5 @@ export enum DepositTabEnum { metadata = 0, file = 1, upload = 2, + collection = 3, } diff --git a/src/app/features/deposit/helpers/deposit.helper.ts b/src/app/features/deposit/helpers/deposit.helper.ts index 5c828545b804d43d4c64429322e3d051d6ae4101..d1073820a783926d8b3f38b8528730597e44b605 100644 --- a/src/app/features/deposit/helpers/deposit.helper.ts +++ b/src/app/features/deposit/helpers/deposit.helper.ts @@ -34,6 +34,9 @@ export class DepositHelper { if (tabRouteSelected === DepositRoutesEnum.upload) { return DepositTabEnum.upload; } + if (tabRouteSelected === DepositRoutesEnum.collection) { + return DepositTabEnum.collection; + } return undefined; } @@ -47,6 +50,9 @@ export class DepositHelper { if (tabIndexSelected === DepositTabEnum.upload) { return DepositRoutesEnum.upload; } + if (tabIndexSelected === DepositTabEnum.collection) { + return DepositRoutesEnum.collection; + } return undefined; } diff --git a/src/app/features/deposit/stores/collection/deposit-collection.action.ts b/src/app/features/deposit/stores/collection/deposit-collection.action.ts new file mode 100644 index 0000000000000000000000000000000000000000..7deba1e518a99e5068e4bc4b297f4f6ea43b2aa0 --- /dev/null +++ b/src/app/features/deposit/stores/collection/deposit-collection.action.ts @@ -0,0 +1,162 @@ +import {AipExtended} from "@preservation/aip/models/aip-extended.model"; +import { + BaseAction, + BaseSubAction, + CompositionAction, + CompositionNameSpace, + QueryParameters, + TypeDefaultAction, +} from "solidify-frontend"; +import {LocalStateEnum} from "../../../../shared/enums/local-state.enum"; + +const state = LocalStateEnum.deposit_collection; + +export namespace DepositCollectionAction { + @TypeDefaultAction(state) + export class GetAll extends CompositionAction.GetAll { + } + + @TypeDefaultAction(state) + export class GetAllSuccess extends CompositionAction.GetAllSuccess<AipExtended> { + } + + @TypeDefaultAction(state) + export class GetAllFail extends CompositionAction.GetAllFail { + } + + @TypeDefaultAction(state) + export class GetById extends CompositionAction.GetById { + } + + @TypeDefaultAction(state) + export class GetByIdSuccess extends CompositionAction.GetByIdSuccess<AipExtended> { + } + + @TypeDefaultAction(state) + export class GetByIdFail extends CompositionAction.GetByIdFail { + } + + @TypeDefaultAction(state) + export class Update extends CompositionAction.Update<AipExtended> { + } + + @TypeDefaultAction(state) + export class UpdateSuccess extends CompositionAction.UpdateSuccess<AipExtended> { + } + + @TypeDefaultAction(state) + export class UpdateFail extends CompositionAction.UpdateFail<AipExtended> { + } + + @TypeDefaultAction(state) + export class Create extends CompositionAction.Create<AipExtended> { + } + + @TypeDefaultAction(state) + export class CreateSuccess extends CompositionAction.CreateSuccess<AipExtended> { + } + + @TypeDefaultAction(state) + export class CreateFail extends CompositionAction.CreateFail<AipExtended> { + } + + @TypeDefaultAction(state) + export class Delete extends CompositionAction.Delete<AipExtended> { + } + + @TypeDefaultAction(state) + export class DeleteSuccess extends CompositionAction.DeleteSuccess<AipExtended> { + } + + @TypeDefaultAction(state) + export class DeleteFail extends CompositionAction.DeleteFail<AipExtended> { + } + + export class ChangeQueryParameters extends BaseAction { + static readonly type: string = `[${state}] Change Query Parameters`; + + constructor(public parentId: string, public queryParameters: QueryParameters, public keepCurrentContext: boolean = false) { + super(); + } + } + + export class Refresh { + static readonly type: string = `[${state}] Refresh`; + + constructor(public parentId: string) { + } + } + + export class GetListFolder extends BaseAction { + static readonly type: string = `[${state}] Get List Folder`; + + constructor(public parentId: string) { + super(); + } + } + + export class GetListFolderSuccess extends BaseSubAction<GetListFolder> { + static readonly type: string = `[${state}] Get List Folder Success`; + + constructor(public parentAction: GetListFolder, public folder: string[]) { + super(parentAction); + } + } + + export class GetListFolderFail extends BaseSubAction<GetListFolder> { + static readonly type: string = `[${state}] Get List Folder Fail`; + + constructor(public parentAction: GetListFolder) { + super(parentAction); + } + } + + export class GetNumberAip extends BaseAction { + static readonly type: string = `[${state}] Get Number Aip`; + + constructor(public parentId: string) { + super(); + } + } + + export class GetNumberAipSuccess extends BaseSubAction<GetNumberAip> { + static readonly type: string = `[${state}] Get Number Aip Success`; + + constructor(public parentAction: GetNumberAip, public numberFiles: number) { + super(parentAction); + } + } + + export class GetNumberAipFail extends BaseSubAction<GetNumberAip> { + static readonly type: string = `[${state}] Get Number Aip Fail`; + } + + export class GetNumberAipInError extends BaseAction { + static readonly type: string = `[${state}] Get Number Aip in Error`; + + constructor(public parentId: string) { + super(); + } + } + + export class GetNumberAipInErrorSuccess extends BaseSubAction<GetNumberAipInError> { + static readonly type: string = `[${state}] Get Number Aip in Error Success`; + + constructor(public parentAction: GetNumberAipInError, public numberFilesInErrors: number) { + super(parentAction); + } + } + + export class GetNumberAipInErrorFail extends BaseSubAction<GetNumberAipInError> { + static readonly type: string = `[${state}] Get Number Aip in Error Fail`; + } + + export class GoToAip { + static readonly type: string = `[${state}] Go To Aip`; + + constructor(public aip: AipExtended) { + } + } +} + +export const depositCollectionActionNameSpace: CompositionNameSpace = DepositCollectionAction; diff --git a/src/app/features/deposit/stores/collection/deposit-collection.state.ts b/src/app/features/deposit/stores/collection/deposit-collection.state.ts new file mode 100644 index 0000000000000000000000000000000000000000..866f90b3c0f3b71df934c6927bef6b5f239432ea --- /dev/null +++ b/src/app/features/deposit/stores/collection/deposit-collection.state.ts @@ -0,0 +1,99 @@ +import {HttpClient} from "@angular/common/http"; +import {Inject} from "@angular/core"; +import {WINDOW} from "@app/app.module"; +import { + DepositCollectionAction, + depositCollectionActionNameSpace, +} from "@deposit/stores/collection/deposit-collection.action"; +import {DepositDataFileAction} from "@deposit/stores/data-file/deposit-data-file.action"; +import {DepositDataFileStateModel} from "@deposit/stores/data-file/deposit-data-file.state"; +import {Navigate} from "@ngxs/router-plugin"; +import { + Action, + Actions, + State, + StateContext, + Store, +} from "@ngxs/store"; +import {AipExtended} from "@preservation/aip/models/aip-extended.model"; +import {PreservationAipAipAction} from "@preservation/aip/stores/aip-aip/aip-aip.action"; +import {PreservationAipAipStateModel} from "@preservation/aip/stores/aip-aip/aip-aip.state"; +import {PreservationAipAction} from "@preservation/aip/stores/aip.action"; +import {ApiResourceNameEnum} from "@shared/enums/api-resource-name.enum"; +import {PreIngestResourceApiEnum} from "@shared/enums/api.enum"; +import {LocalStateEnum} from "@shared/enums/local-state.enum"; +import { + AppRoutesEnum, + PreservationPlanningRoutesEnum, + RoutesEnum, + urlSeparator, +} from "@shared/enums/routes.enum"; +import {DownloadService} from "@shared/services/download.service"; +import { + ApiService, + CompositionState, + CompositionStateModel, + defaultCompositionStateInitValue, + NotificationService, +} from "solidify-frontend"; + +export const defaultDepositCollectionValue: () => DepositCollectionStateModel = () => + ({ + ...defaultCompositionStateInitValue(), + listFolders: [], + numberAips: undefined, + numberAipInErrors: undefined, + }); + + +export interface DepositCollectionStateModel extends CompositionStateModel<AipExtended> { + listFolders: string[]; + numberAips: number | undefined; + numberAipInErrors: number | undefined; +} + +@State<DepositCollectionStateModel>({ + name: LocalStateEnum.deposit_collection, + defaults: { + ...defaultDepositCollectionValue(), + }, +}) +export class DepositCollectionState extends CompositionState<DepositCollectionStateModel, AipExtended> { + constructor(protected apiService: ApiService, + protected store: Store, + protected notificationService: NotificationService, + protected actions$: Actions, + @Inject(WINDOW) private _window: Window, + protected httpClient: HttpClient, + private downloadService: DownloadService) { + super(apiService, store, notificationService, actions$, { + nameSpace: depositCollectionActionNameSpace, + resourceName: ApiResourceNameEnum.AIP, + }); + } + + protected get _urlResource(): string { + return PreIngestResourceApiEnum.deposits; + } + + + @Action(DepositCollectionAction.ChangeQueryParameters) + changeQueryParameters(ctx: StateContext<DepositCollectionStateModel>, action: DepositCollectionAction.ChangeQueryParameters): void { + ctx.patchState({ + queryParameters: action.queryParameters, + }); + ctx.dispatch(new DepositCollectionAction.GetAll(action.parentId, undefined, action.keepCurrentContext)); + } + + @Action(DepositCollectionAction.Refresh) + refresh(ctx: StateContext<DepositCollectionStateModel>, action: DepositCollectionAction.Refresh): void { + ctx.dispatch(new DepositCollectionAction.GetAll(action.parentId, undefined, true)); + } + + @Action(DepositCollectionAction.GoToAip) + goToAip(ctx: StateContext<DepositCollectionStateModel>, action: DepositCollectionAction.GoToAip): void { + const pathAipDetail = RoutesEnum.preservationAip + urlSeparator + 1 + urlSeparator + PreservationPlanningRoutesEnum.aipDetail + AppRoutesEnum.separator; + const path = [pathAipDetail, action.aip.resId]; + ctx.dispatch(new Navigate(path)); + } +} diff --git a/src/app/features/deposit/stores/deposit.state.ts b/src/app/features/deposit/stores/deposit.state.ts index cc14197eaa1d484d57d4427fcc75cfe3ca682fa3..fdbab3a5ac400e2c30f2d445374d9eac9fd753a1 100644 --- a/src/app/features/deposit/stores/deposit.state.ts +++ b/src/app/features/deposit/stores/deposit.state.ts @@ -39,6 +39,11 @@ import {SharedPreservationPolicyAction} from "@app/shared/stores/preservation-po import {SharedSubmissionPolicyAction} from "@app/shared/stores/submission-policy/shared-submission-policy.action"; import {AppAction} from "@app/stores/app.action"; import {AppAuthorizedOrganizationalUnitState} from "@app/stores/authorized-organizational-unit/app-authorized-organizational-unit.state"; +import { + defaultDepositCollectionValue, + DepositCollectionState, + DepositCollectionStateModel, +} from "@deposit/stores/collection/deposit-collection.state"; import {DepositOrganizationalUnitState} from "@deposit/stores/organizational-unit/deposit-organizational-unit.state"; import { DepositStatusHistoryState, @@ -91,6 +96,7 @@ import { export interface DepositStateModel extends ResourceStateModel<DepositExtended> { deposit_dataFile: DepositDataFileStateModel; deposit_person: DepositPersonStateModel; + deposit_collection: DepositCollectionStateModel; isLoadingDataFile: boolean; uploadStatus: UploadFileStatus[]; deposit_statusHistory: DepositStatusHistoryStateModel; @@ -110,6 +116,7 @@ export interface DepositStateModel extends ResourceStateModel<DepositExtended> { ...defaultResourceStateInitValue(), deposit_dataFile: defaultDepositDataFileValue(), deposit_person: {...defaultAssociationRemoteStateInitValue()}, + deposit_collection: defaultDepositCollectionValue(), isLoadingDataFile: false, uploadStatus: [], deposit_statusHistory: {...defaultStatusHistoryInitValue()}, @@ -127,6 +134,7 @@ export interface DepositStateModel extends ResourceStateModel<DepositExtended> { DepositPeopleState, DepositStatusHistoryState, DepositOrganizationalUnitState, + DepositCollectionState ], }) export class DepositState extends ResourceState<DepositStateModel, DepositExtended> { diff --git a/src/app/features/preservation/aip/components/routables/aip-tabs/aip-tabs.routable.ts b/src/app/features/preservation/aip/components/routables/aip-tabs/aip-tabs.routable.ts index d4b543a298efa159747eb566be64812548dd0303..9cdc55db5e61629d1c36bf03c20efbf834d01f05 100644 --- a/src/app/features/preservation/aip/components/routables/aip-tabs/aip-tabs.routable.ts +++ b/src/app/features/preservation/aip/components/routables/aip-tabs/aip-tabs.routable.ts @@ -94,5 +94,4 @@ export class AipTabsRoutable extends SharedAbstractRoutable implements OnInit { this._store.dispatch(new Navigate([AppRoutesEnum.preservation, PreservationPlanningRoutesEnum.aip, this.storagionNode, PreservationPlanningRoutesEnum.aipList, tab])); } - } diff --git a/src/app/shared/components/dialogs/shared-aip-detail/shared-aip-detail.dialog.html b/src/app/shared/components/dialogs/shared-aip-detail/shared-aip-detail.dialog.html index 8a422dc153cc1deafecd00bcc2ee2fb97bbe078d..748299e49a64d3a83118f3e985a6c0a2de249951 100644 --- a/src/app/shared/components/dialogs/shared-aip-detail/shared-aip-detail.dialog.html +++ b/src/app/shared/components/dialogs/shared-aip-detail/shared-aip-detail.dialog.html @@ -15,6 +15,7 @@ </ng-container> <button mat-button + *ngIf="data.isLoading !==null" color="accent" (click)="showHistory()" > diff --git a/src/app/shared/enums/local-state.enum.ts b/src/app/shared/enums/local-state.enum.ts index 2053bf25bafd6de71423682d755305ca0fcd29b3..aeab43b388625980322d3666948b5e6ed58fa398 100644 --- a/src/app/shared/enums/local-state.enum.ts +++ b/src/app/shared/enums/local-state.enum.ts @@ -15,6 +15,7 @@ export enum LocalStateEnum { deposit_person = "deposit_person", deposit_organizationalUnit = "deposit_organizationalUnit", deposit_dataFile = "deposit_dataFile", + deposit_collection = "deposit_collection", deposit_statusHistory = "deposit_statusHistory", deposit_dataFile_statusHistory = "deposit_dataFile_statusHistory", diff --git a/src/app/shared/enums/routes.enum.ts b/src/app/shared/enums/routes.enum.ts index beb64cd1a4488e3792bcbb36e330d6133a68c5b3..567a2a7294922ac9e2e40191ce92590a2a1b3102 100644 --- a/src/app/shared/enums/routes.enum.ts +++ b/src/app/shared/enums/routes.enum.ts @@ -30,6 +30,7 @@ export enum DepositRoutesEnum { metadata = "metadata", files = "files", upload = "upload", + collection = "collection", paramTab = ":tab", paramTabWithoutPrefix = "tab", } diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index bd2e5b34ac5e4d28e6e7944c5fec5b986b278c5e..564f68c5838db99aa38d278a5fc01bad9ebb537e 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -847,7 +847,8 @@ "file": "Data files", "metadata": "Metadata", "root": "Deposits", - "upload": "Uploads" + "upload": "Uploads", + "collection": "Collection" }, "home": "Home", "organizationalUnit": { @@ -899,6 +900,15 @@ } }, "deposit": { + "aip": { + "title": { + "collection": "Collection" + }, + "table": { + "aipName": "Aip Name", + "status": "Status", + "complianceLevel": "Compliance Level" + }, "accessLevel": "Access Level", "addMeAsAuthor": "add me as author", "alert": { @@ -1124,6 +1134,7 @@ "submissionPolicy": "Submission Policy", "submit": "Submit", "tab": { + "collection": "Collection", "datafiles": "Files", "details": "Metadata", "upload": "Uploads" diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index b2ee1e550ed23ce8759263919ed997a01a1d3cbe..acbb2f49130d167422368fc00ba9f0f1dedc7226 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -847,7 +847,8 @@ "file": "Data files", "metadata": "Metadata", "root": "Deposits", - "upload": "Uploads" + "upload": "Uploads", + "collection": "Collection" }, "home": "Home", "organizationalUnit": { @@ -899,6 +900,16 @@ } }, "deposit": { + "aip": { + "title": { + "collection": "Collection" + }, + "table": { + "aipName": "Aip Name", + "status": "Status", + "complianceLevel": "Compliance Level" + } + }, "accessLevel": "Access Level", "addMeAsAuthor": "add me as author", "alert": { @@ -1124,6 +1135,7 @@ "submissionPolicy": "Submission Policy", "submit": "Submit", "tab": { + "collection": "Collection", "datafiles": "Files", "details": "Metadata", "upload": "Uploads" diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 987cf3e878e540facf0905cb206df1c0e1e07cf7..8d022b33ea8584d468b55d177830ac032f716c5f 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -847,7 +847,8 @@ "file": "Fichiers", "metadata": "Métadonnées", "root": "Dépôts", - "upload": "Envois" + "upload": "Envois", + "collection": "Collection" }, "home": "Accueil", "organizationalUnit": { @@ -899,6 +900,15 @@ } }, "deposit": { + "aip": { + "title": { + "collection": "Collection" + }, + "table": { + "aipName": "Nom d'Aip", + "status": "Statut", + "complianceLevel": "Niveau de conformité" + }, "accessLevel": "Niveau d'accès", "addMeAsAuthor": "m'ajouter en tant qu'auteur", "alert": { @@ -1126,7 +1136,8 @@ "tab": { "datafiles": "Fichiers", "details": "Métadonnées", - "upload": "Envois" + "upload": "Envois", + "collection": "Collection" }, "table": { "header": {