Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • dlcm/ui/dlcm-portal
1 result
Show changes
Showing
with 691 additions and 106 deletions
......@@ -42,6 +42,7 @@ import {
import {SharedHistoryDialog} from "@shared/components/dialogs/shared-history/shared-history.dialog";
import {SharedAbstractDetailEditRoutable} from "@shared/components/routables/shared-abstract-detail-edit/shared-abstract-detail-edit.routable";
import {
AppRoutesEnum,
DepositRoutesEnum,
RoutesEnum,
} from "@shared/enums/routes.enum";
......@@ -74,9 +75,9 @@ import {
styleUrls: ["./deposit-detail-edit.routable.scss"],
})
export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<DepositExtended, DepositStateModel> implements OnInit, OnDestroy {
historyObs: Observable<StatusHistory[]> = MemoizedUtil.select(this.store, DepositStatusHistoryState, state => state.history);
isLoadingObs: Observable<boolean> = MemoizedUtil.isLoading(this.store, DepositStatusHistoryState);
queryParametersObs: Observable<QueryParameters> = MemoizedUtil.select(this.store, DepositStatusHistoryState, state => state.queryParameters);
historyObs: Observable<StatusHistory[]> = MemoizedUtil.select(this._store, DepositStatusHistoryState, state => state.history);
isLoadingObs: Observable<boolean> = MemoizedUtil.isLoading(this._store, DepositStatusHistoryState);
queryParametersObs: Observable<QueryParameters> = MemoizedUtil.select(this._store, DepositStatusHistoryState, state => state.queryParameters);
@Select((state: LocalStateModel) => state.deposit.deposit_dataFile.numberFilesInErrors) numberFilesInErrorObs: Observable<number | undefined>;
@Select((state: LocalStateModel) => state.deposit.deposit_dataFile.numberFiles) numberFilesObs: Observable<number | undefined>;
@Select(AppState.currentOrgUnitPersonRoleResId) currentPersonRoleObs: Observable<string[]>;
......@@ -96,7 +97,9 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<
canSubmitAction: boolean = false;
canReserveDoiAction: boolean = false;
readonly KEY_PARAM_NAME: string = "title";
private _orgUnitResId: string | undefined = undefined;
readonly KEY_PARAM_NAME: keyof DepositExtended & string = "title";
readonly KEY_DELETE_BUTTON: string = TRANSLATE("deposit.delete");
readonly KEY_EDIT_BUTTON: string = TRANSLATE("deposit.edit");
readonly KEY_BACK_BUTTON: string = TRANSLATE("admin.button.goBackToAdminHome");
......@@ -106,14 +109,14 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<
return Deposit.StatusEnum;
}
constructor(protected _store: Store,
protected route: ActivatedRoute,
constructor(protected readonly _store: Store,
protected readonly _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected _changeDetector: ChangeDetectorRef,
public dialog: MatDialog,
protected router: Router,
private _securityService: SecurityService) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.deposit, depositActionNameSpace);
protected readonly _changeDetector: ChangeDetectorRef,
protected readonly _dialog: MatDialog,
protected readonly _router: Router,
private readonly _securityService: SecurityService) {
super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.deposit, depositActionNameSpace);
}
ngOnInit(): void {
......@@ -122,7 +125,7 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<
this.retrieveCurrentModelWithUrl();
this._computeCurrentTab();
this.subscribe(this.router.events
this.subscribe(this._router.events
.pipe(
filter(event => event instanceof NavigationCancel || event instanceof NavigationEnd),
distinctUntilChanged(),
......@@ -141,8 +144,13 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<
this.cleanState();
}
protected retrieveResIdFromUrl(): void {
this._resId = this._route.snapshot.paramMap.get(AppRoutesEnum.paramIdWithoutPrefixParam);
this._orgUnitResId = this._route.parent.snapshot.paramMap.get(AppRoutesEnum.paramId2WithoutPrefixParam);
}
private _computeCurrentTab(): void {
const tabRouteSelected = DepositHelper.getTabRouteSelected(this.route);
const tabRouteSelected = DepositHelper.getTabRouteSelected(this._route);
this.tabSelected = DepositHelper.getTabSelectedIndexWithRoute(tabRouteSelected);
}
......@@ -237,8 +245,8 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<
}
edit(): void {
const tabRouteSelected = DepositHelper.getTabRouteSelected(this.route);
this._store.dispatch(new Navigate([RoutesEnum.depositDetail, this._resId, tabRouteSelected, DepositRoutesEnum.edit]));
const tabRouteSelected = DepositHelper.getTabRouteSelected(this._route);
this._store.dispatch(new Navigate([RoutesEnum.deposit, this._orgUnitResId, DepositRoutesEnum.detail, this._resId, tabRouteSelected, DepositRoutesEnum.edit]));
}
getSubResourceWithParentId(id: string): void {
......@@ -262,12 +270,12 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<
}
showHistory(): void {
const dialogRef = this.dialog.open(SharedHistoryDialog, {
const dialogRef = this._dialog.open(SharedHistoryDialog, {
width: "800px",
data: {
parentId: null,
resourceResId: this._resId,
name: this.state,
name: this._state,
statusHistory: this.historyObs,
isLoading: this.isLoadingObs,
queryParametersObs: this.queryParametersObs,
......@@ -276,10 +284,10 @@ export class DepositDetailEditRoutable extends SharedAbstractDetailEditRoutable<
});
}
navigate(tabSelected: DepositTabEnum): void {
navigate(tabSelected: DepositTabEnum, isEdit?: boolean | undefined): void {
const tabRouteSelected = DepositHelper.getTabRouteSelectedWithTabIndex(tabSelected);
const path = [RoutesEnum.depositDetail, this._resId, tabRouteSelected];
if (this.isEdit) {
const path = [AppRoutesEnum.deposit, this._orgUnitResId, DepositRoutesEnum.detail, this._resId, tabRouteSelected];
if (isNullOrUndefined(isEdit) ? this.isEdit : isEdit) {
path.push(DepositRoutesEnum.edit);
}
this._store.dispatch(new Navigate(path));
......
......@@ -87,6 +87,7 @@
(queryParametersChange)="onQueryParametersEvent($event)"
(selectChange)="showDetail($event)"
[columnsSkippedToClear]="columnsToSkippedFilter"
[actions]="actions"
>
</dlcm-shared-data-table>
</div>
......
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
OnInit,
......@@ -46,10 +45,13 @@ import {DataFileStatusEnum} from "@shared/enums/business/data-file-status.enum";
import {FieldTypeEnum} from "@shared/enums/field-type.enum";
import {FileViewModeEnum} from "@shared/enums/file-view-mode.enum";
import {LocalStateEnum} from "@shared/enums/local-state.enum";
import {AppRoutesEnum} from "@shared/enums/routes.enum";
import {DataTableActions} from "@shared/models/data-table-actions.model";
import {DataTableColumns} from "@shared/models/data-table-columns.model";
import {StatusHistory} from "@shared/models/status-history.model";
import {Observable} from "rxjs";
import {
distinctUntilChanged,
filter,
take,
tap,
......@@ -74,7 +76,6 @@ import {environment} from "../../../../../../environments/environment";
selector: "dlcm-deposit-file-routable",
templateUrl: "./deposit-file.routable.html",
styleUrls: ["./deposit-file.routable.scss"],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<DepositExtended, DepositStateModel> implements OnInit {
isLoadingDataFileObs: Observable<boolean> = MemoizedUtil.isLoading(this._store, DepositDataFileState);
......@@ -95,6 +96,7 @@ export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<Deposi
private readonly _RELATIVE_LOCATION: string = "relativeLocation";
columns: DataTableColumns<DepositDataFile>[];
actions: DataTableActions<DepositDataFile>[];
columnsToSkippedFilter: string[] = [
this._RELATIVE_LOCATION,
......@@ -106,14 +108,27 @@ export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<Deposi
return FileViewModeEnum;
}
readonly KEY_PARAM_NAME: string = undefined;
constructor(protected _store: Store,
protected route: ActivatedRoute,
readonly actionDownload: DataTableActions = {
logo: "cloud_download",
callback: (depositDataFile: DepositDataFile) => this.downloadDataFile(this._resId, depositDataFile),
placeholder: TRANSLATE("crud.list.action.download"),
displayOnCondition: (depositDataFile: DepositDataFile) => true,
};
readonly actionDelete: DataTableActions = {
logo: "delete",
callback: (depositDataFile: DepositDataFile) => this.deleteDataFile(this._resId, depositDataFile),
placeholder: TRANSLATE("crud.list.action.delete"),
displayOnCondition: (depositDataFile: DepositDataFile) => this.isEdit,
};
readonly KEY_PARAM_NAME: keyof DepositExtended & string = undefined;
constructor(protected readonly _store: Store,
protected readonly _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef,
public dialog: MatDialog) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.deposit, depositActionNameSpace);
protected readonly _dialog: MatDialog) {
super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.deposit, depositActionNameSpace);
}
ngOnInit(): void {
......@@ -229,10 +244,22 @@ export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<Deposi
],
},
];
this.actions = [];
this.subscribe(this.isEditObs.pipe(distinctUntilChanged()), (isEdit: boolean) => {
if (isEdit) {
this.actions = [
this.actionDelete,
this.actionDownload,
];
} else {
this.actions = [this.actionDownload];
}
});
}
private getCurrentModelOnParent(): void {
this._resId = this.route.snapshot.parent.paramMap.get("id");
this._resId = this._route.snapshot.parent.paramMap.get(AppRoutesEnum.paramIdWithoutPrefixParam);
this.getDepositById(this._resId);
}
......@@ -243,7 +270,7 @@ export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<Deposi
getSubResourceWithParentId(id: string): void {
const queryParameter = new QueryParameters();
MappingObjectUtil.set(queryParameter.search.searchItems, "relativeLocation", "/");
MappingObjectUtil.set(queryParameter.search.searchItems, this._RELATIVE_LOCATION, "/");
this._store.dispatch(new DepositDataFileAction.GetAll(id, queryParameter, true));
this._store.dispatch(new DepositDataFileAction.GetListFolder(id));
}
......@@ -317,7 +344,7 @@ export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<Deposi
}
showDetail(depositDataFile: DepositDataFile): void {
this.dialogDataFileRef = this.dialog.open(SharedFileDetailDialog, {
this.dialogDataFileRef = this._dialog.open(SharedFileDetailDialog, {
data: {
dataFile: depositDataFile,
parentId: this._resId,
......@@ -333,7 +360,7 @@ export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<Deposi
color: "accent",
icon: "delete",
callback: (current) => this.deleteDataFile(this._resId, depositDataFile),
displayCondition: current => !this.isEdit,
displayCondition: current => this.isEdit,
order: 0,
},
{
......@@ -358,7 +385,7 @@ export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<Deposi
}
openModalUpload(): void {
const dialogRef = this.dialog.open(DepositFileUploadDialog, {
const dialogRef = this._dialog.open(DepositFileUploadDialog, {
height: "90%",
width: "90%",
});
......@@ -371,7 +398,7 @@ export class DepositFileRoutable extends SharedAbstractDetailEditRoutable<Deposi
}
openModalUploadArchive(): void {
const dialogRef = this.dialog.open(DepositFileUploadArchiveDialog, {
const dialogRef = this._dialog.open(DepositFileUploadArchiveDialog, {
height: "90%",
width: "90%",
});
......
<router-outlet></router-outlet>
:host {
flex: 1;
}
import {
Component,
OnInit,
} from "@angular/core";
import {ActivatedRoute} from "@angular/router";
import {DepositAction} from "@deposit/stores/deposit.action";
import {Store} from "@ngxs/store";
import {SharedAbstractRoutable} from "@shared/components/routables/shared-abstract/shared-abstract.routable";
import {AppRoutesEnum} from "@shared/enums/routes.enum";
import {isNullOrUndefined} from "solidify-frontend";
@Component({
selector: "dlcm-deposit-home-routable",
templateUrl: "./deposit-home.routable.html",
styleUrls: ["./deposit-home.routable.scss"],
})
export class DepositHomeRoutable extends SharedAbstractRoutable implements OnInit {
private _orgUnitResId: string;
constructor(private readonly _store: Store,
private readonly _route: ActivatedRoute) {
super();
this.retrieveCurrentModelWithUrl();
}
protected retrieveCurrentModelWithUrl(): void {
this.retrieveResIdFromUrl();
this._store.dispatch(new DepositAction.SetOrganizationalUnit(this._orgUnitResId));
}
protected retrieveResIdFromUrl(): void {
this._orgUnitResId = this._route.snapshot.paramMap.get(AppRoutesEnum.paramId2WithoutPrefixParam);
if (isNullOrUndefined(this._orgUnitResId)) {
this._orgUnitResId = this._route.parent.snapshot.paramMap.get(AppRoutesEnum.paramId2WithoutPrefixParam);
}
}
}
<div class="host">
<div class="toolbar-wrapper">
<div class="button-toolbar">
<button *ngIf="KEY_BACK_BUTTON"
mat-button
color="accent"
(click)="back()"
>
<mat-icon>navigate_before</mat-icon>
{{KEY_BACK_BUTTON | translate}}
</button>
<button mat-flat-button
color="primary"
*ngIf="options.canCreate"
(click)="create()"
>
<mat-icon>add</mat-icon>
{{KEY_CREATE_BUTTON | translate}}
</button>
<ng-container *ngFor="let extraButton of options?.listExtraButtons">
<button mat-button
[color]="extraButton.color"
(click)="extraButton.callback ? extraButton.callback() : navigate(extraButton.route)"
>
<mat-icon>{{extraButton.icon}}</mat-icon>
{{extraButton.labelToTranslate | translate}}
</button>
</ng-container>
<button mat-button
color="accent"
(click)="getAll()"
>
<mat-icon>refresh</mat-icon>
{{KEY_REFRESH_BUTTON | translate}}
</button>
</div>
<mat-form-field *ngIf="getFormControl(formDefinition.organizationalUnitId) as fd"
class="org-unit-selector"
>
<mat-label>{{'deposit.organizationUnit' | translate }}</mat-label>
<mat-select [formControl]="fd"
>
<mat-option *ngFor="let orgUnit of listAuthorizedOrgUnit"
[value]="orgUnit.resId"
>
{{orgUnit.name}}
</mat-option>
</mat-select>
</mat-form-field>
<!-- <dlcm-shared-searchable-single-select *ngIf="getFormControl(formDefinition.organizationalUnitId) as fd"-->
<!-- class="org-unit-selector"-->
<!-- solidifyValidation-->
<!-- [resourceNameSpace]="appAuthorizedOrganizationalUnitNameSpace"-->
<!-- [state]="appAuthorizedOrganizationalUnitState"-->
<!-- [formControl]="fd"-->
<!-- [canDeleteValue]="false"-->
<!-- [labelKey]="'name'"-->
<!-- [valueKey]="'resId'"-->
<!-- [placeholder]="'deposit.organizationUnit' | translate"-->
<!-- (valueChange)="orgUnitSelectionChange($event)"-->
<!-- >-->
<!-- </dlcm-shared-searchable-single-select>-->
</div>
<div class="wrapper"
[dlcmSpinner]="isLoadingObs | async"
>
<dlcm-shared-data-table [columns]="columns"
[actions]="actions"
[isLoading]="isLoadingObs | async"
[datas]="listObs | async"
[columnsSkippedToClear]="columnsSkipperToClear()"
[queryParameters]="queryParametersObs | async"
(selectChange)="showDetail($event)"
(queryParametersChange)="onQueryParametersEvent($event)"
></dlcm-shared-data-table>
</div>
</div>
@import "../../../../../shared/components/routables/shared-abstract-list/shared-abstract-list.routable.scss";
:host {
.toolbar-wrapper {
display: flex;
justify-content: space-between;
.org-unit-selector {
width: 280px;
}
@include respond-to-smaller-than-breakpoint('md') {
flex-wrap: wrap;
.button-toolbar {
width: 100%;
}
}
@include respond-to-smaller-than-breakpoint('sm') {
.org-unit-selector {
width: 100%;
}
}
}
}
import {
ChangeDetectionStrategy,
ChangeDetectorRef,
Component,
OnInit,
} from "@angular/core";
import {
AbstractControl,
FormBuilder,
FormGroup,
Validators,
} from "@angular/forms";
import {MatDialog} from "@angular/material/dialog";
import {ActivatedRoute} from "@angular/router";
import {DepositExtended} from "@app/features/deposit/models/deposits-extended.model";
import {depositActionNameSpace} from "@app/features/deposit/stores/deposit.action";
import {DepositStateModel} from "@app/features/deposit/stores/deposit.state";
import {
DepositAction,
depositActionNameSpace,
} from "@app/features/deposit/stores/deposit.action";
import {
DepositState,
DepositStateModel,
} from "@app/features/deposit/stores/deposit.state";
import {OrganizationalUnit} from "@app/generated-api";
import {Deposit} from "@app/generated-api/model/deposit.model";
import {SharedAbstractListRoutable} from "@app/shared/components/routables/shared-abstract-list/shared-abstract-list.routable";
import {FieldTypeEnum} from "@app/shared/enums/field-type.enum";
import {LocalStateEnum} from "@app/shared/enums/local-state.enum";
import {
AppRoutesEnum,
DepositRoutesEnum,
RoutesEnum,
} from "@app/shared/enums/routes.enum";
import {appAuthorizedOrganizationalUnitNameSpace} from "@app/stores/authorized-organizational-unit/app-authorized-organizational-unit.action";
import {AppAuthorizedOrganizationalUnitState} from "@app/stores/authorized-organizational-unit/app-authorized-organizational-unit.state";
import {TranslateService} from "@ngx-translate/core";
import {Store} from "@ngxs/store";
import {Navigate} from "@ngxs/router-plugin";
import {
Actions,
Store,
} from "@ngxs/store";
import {BaseFormDefinition} from "@shared/models/base-form-definition.model";
import {UserPreferencesUtil} from "@shared/utils/user-preferences.util";
import {
distinctUntilChanged,
tap,
} from "rxjs/operators";
import {
FormValidationHelper,
isNullOrUndefined,
isUndefined,
MappingObjectUtil,
ObjectUtil,
OrderEnum,
PropertyName,
QueryParameters,
ResourceActionHelper,
ResourceNameSpace,
ResourceState,
SolidifyValidator,
TRANSLATE,
} from "solidify-frontend";
@Component({
selector: "dlcm-deposit-list-routable",
templateUrl: "../../../../../shared/components/routables/shared-abstract-list/shared-abstract-list.routable.html",
styleUrls: ["../../../../../shared/components/routables/shared-abstract-list/shared-abstract-list.routable.scss"],
changeDetection: ChangeDetectionStrategy.OnPush,
templateUrl: "./deposit-list.routable.html",
styleUrls: ["./deposit-list.routable.scss"],
})
export class DepositListRoutable extends SharedAbstractListRoutable<DepositExtended, DepositStateModel> implements OnInit {
formDefinition: FormComponentFormDefinition = new FormComponentFormDefinition();
readonly KEY_CREATE_BUTTON: string = TRANSLATE("deposit.new");
readonly KEY_REFRESH_BUTTON: string = TRANSLATE("deposit.refresh");
readonly KEY_BACK_BUTTON: string | undefined = undefined;
readonly KEY_PARAM_NAME: keyof DepositExtended & string = "title";
readonly KEY_ORGANIZATIONAL_UNIT: keyof DepositExtended & string = "organizationalUnitId";
appAuthorizedOrganizationalUnitNameSpace: ResourceNameSpace = appAuthorizedOrganizationalUnitNameSpace;
appAuthorizedOrganizationalUnitState: typeof AppAuthorizedOrganizationalUnitState = AppAuthorizedOrganizationalUnitState;
listAuthorizedOrgUnit: OrganizationalUnit[] = ResourceState.listSnapshot(this._store, AppAuthorizedOrganizationalUnitState);
form: FormGroup;
constructor(protected store: Store,
protected _changeDetector: ChangeDetectorRef,
protected _route: ActivatedRoute,
private translate: TranslateService) {
super(store, _changeDetector, _route, LocalStateEnum.deposit, depositActionNameSpace);
private _orgUnitResId: string;
private _isInitialized: boolean = false;
constructor(protected readonly _store: Store,
protected readonly _changeDetector: ChangeDetectorRef,
protected readonly _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _dialog: MatDialog,
private readonly _fb: FormBuilder) {
super(_store, _changeDetector, _route, _actions$, _dialog, LocalStateEnum.deposit, depositActionNameSpace);
}
ngOnInit(): void {
super.ngOnInit();
this.subscribe(this._route.url.pipe(distinctUntilChanged()),
value => {
this.retrieveResIdFromUrl();
if (this._isInitialized === true) {
this.onQueryParametersEvent(ResourceState.queryParametersSnapshot(this._store, DepositState));
}
});
this.form = this._fb.group({
[this.formDefinition.organizationalUnitId]: [this._orgUnitResId, [Validators.required, SolidifyValidator]],
});
this.subscribe(this.form.get(this.formDefinition.organizationalUnitId).valueChanges.pipe(
distinctUntilChanged(),
tap(resId => {
this._store.dispatch(new Navigate([RoutesEnum.deposit, resId, DepositRoutesEnum.list]));
}),
));
this._isInitialized = true;
}
protected retrieveResIdFromUrl(): void {
this._orgUnitResId = this._route.snapshot.paramMap.get(AppRoutesEnum.paramId2WithoutPrefixParam);
if (isNullOrUndefined(this._orgUnitResId)) {
this._orgUnitResId = this._route.parent.snapshot.paramMap.get(AppRoutesEnum.paramId2WithoutPrefixParam);
}
}
get formValidationHelper(): typeof FormValidationHelper {
return FormValidationHelper;
}
conditionDisplayEditButton(model: DepositExtended | undefined): boolean {
if (isUndefined(model)) {
return true;
}
return model.status === Deposit.StatusEnum.INPROGRESS || model.status === Deposit.StatusEnum.INERROR;
}
conditionDisplayDeleteButton(model: DepositExtended | undefined): boolean {
if (isUndefined(model)) {
return true;
}
return model.status === Deposit.StatusEnum.INPROGRESS || model.status === Deposit.StatusEnum.INERROR;
}
getFormControl(key: string): AbstractControl {
return FormValidationHelper.getFormControl(this.form, key);
}
defineColumns(): void {
......@@ -57,17 +155,17 @@ export class DepositListRoutable extends SharedAbstractListRoutable<DepositExten
isFilterable: true,
isSortable: true,
},
{
field: "organizationalUnit.name" as any,
header: TRANSLATE("deposit.table.header.organizationalUnit"),
type: FieldTypeEnum.searchableSingleSelect,
order: OrderEnum.none,
isFilterable: true,
// isSortable: true,
resourceNameSpace: this.appAuthorizedOrganizationalUnitNameSpace,
resourceState: this.appAuthorizedOrganizationalUnitState as any,
filterableField: "organizationalUnitId",
},
// {
// field: "organizationalUnit.name" as any,
// header: TRANSLATE("deposit.table.header.organizationalUnit"),
// type: FieldTypeEnum.searchableSingleSelect,
// order: OrderEnum.none,
// isFilterable: true,
// // isSortable: true,
// resourceNameSpace: this.appAuthorizedOrganizationalUnitNameSpace,
// resourceState: this.appAuthorizedOrganizationalUnitState as any,
// filterableField: "organizationalUnitId",
// },
{
field: "publicationDate",
header: TRANSLATE("deposit.table.header.publicationDate"),
......@@ -145,4 +243,36 @@ export class DepositListRoutable extends SharedAbstractListRoutable<DepositExten
},
];
}
showDetail(model: DepositExtended): void {
this._store.dispatch(new Navigate([AppRoutesEnum.deposit, this._orgUnitResId, DepositRoutesEnum.detail, model.resId]));
}
updateQueryParameterWithOrgUnit(queryParameters: QueryParameters, orgUnit: OrganizationalUnit | undefined): QueryParameters | undefined {
queryParameters = ObjectUtil.clone(queryParameters);
queryParameters.search = ObjectUtil.clone(queryParameters.search);
if (isNullOrUndefined(orgUnit)) {
return queryParameters;
}
UserPreferencesUtil.setPreferredOrgUnitInDepositMenu(orgUnit.resId);
MappingObjectUtil.set(queryParameters.search.searchItems, this.KEY_ORGANIZATIONAL_UNIT, orgUnit.resId);
return queryParameters;
}
columnsSkipperToClear(): string[] {
return [this.KEY_ORGANIZATIONAL_UNIT];
}
create(): void {
this._store.dispatch(new Navigate([RoutesEnum.deposit, this._orgUnitResId, DepositRoutesEnum.create]));
}
onQueryParametersEvent(queryParameters: QueryParameters): void {
this.updateQueryParameterWithOrgUnit(queryParameters, {resId: this._orgUnitResId});
super.onQueryParametersEvent(queryParameters);
}
}
class FormComponentFormDefinition extends BaseFormDefinition {
@PropertyName() organizationalUnitId: string;
}
......@@ -65,14 +65,14 @@ export class DepositMetadataRoutable extends SharedAbstractDetailEditRoutable<De
@ViewChild("formPresentational", {static: false})
readonly formPresentational: DepositFormPresentational;
readonly KEY_PARAM_NAME: string = "title";
readonly KEY_PARAM_NAME: keyof DepositExtended & string = "title";
constructor(protected _store: Store,
protected route: ActivatedRoute,
constructor(protected readonly _store: Store,
protected readonly _route: ActivatedRoute,
protected readonly _actions$: Actions,
protected readonly _changeDetector: ChangeDetectorRef,
public dialog: MatDialog) {
super(_store, route, _actions$, _changeDetector, dialog, LocalStateEnum.deposit, depositActionNameSpace);
protected readonly _dialog: MatDialog) {
super(_store, _route, _actions$, _changeDetector, _dialog, LocalStateEnum.deposit, depositActionNameSpace);
}
ngOnInit(): void {
......
import {
Component,
OnInit,
} from "@angular/core";
import {AppAuthorizedOrganizationalUnitState} from "@app/stores/authorized-organizational-unit/app-authorized-organizational-unit.state";
import {Navigate} from "@ngxs/router-plugin";
import {Store} from "@ngxs/store";
import {SharedAbstractRoutable} from "@shared/components/routables/shared-abstract/shared-abstract.routable";
import {
DepositRoutesEnum,
RoutesEnum,
} from "@shared/enums/routes.enum";
import {UserPreferencesUtil} from "@shared/utils/user-preferences.util";
import {
ResourceState,
urlSeparator,
} from "solidify-frontend";
@Component({
selector: "dlcm-deposit-root-routable",
templateUrl: "./deposit-root.routable.html",
styleUrls: ["./deposit-root.routable.scss"],
})
export class DepositRootRoutable extends SharedAbstractRoutable implements OnInit {
constructor(private readonly _store: Store) {
super();
}
ngOnInit(): void {
const listAuthorizedOrgUnit = ResourceState.listSnapshot(this._store, AppAuthorizedOrganizationalUnitState);
const preferredOrgUnit = UserPreferencesUtil.getPreferredOrgUnitInDepositMenu(listAuthorizedOrgUnit);
this._store.dispatch(new Navigate([RoutesEnum.deposit + urlSeparator + preferredOrgUnit.resId + urlSeparator + DepositRoutesEnum.list]));
}
}
......@@ -9,7 +9,9 @@ import {
import {DlcmRoutes} from "@app/shared/models/dlcm-route.model";
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";
import {DepositMetadataRoutable} from "@deposit/components/routables/deposit-metadata/deposit-metadata.routable";
import {DepositRootRoutable} from "@deposit/components/routables/deposit-root/deposit-root.routable";
import {DepositState} from "@deposit/stores/deposit.state";
import {DepositRoleGuardDetailService} from "@shared/guards/deposit-role-guard-detail.service";
import {DepositRoleGuardEditService} from "@shared/guards/deposit-role-guard-edit.service";
......@@ -19,69 +21,93 @@ import {TRANSLATE} from "solidify-frontend";
const routes: DlcmRoutes = [
{
path: AppRoutesEnum.root,
component: DepositListRoutable,
data: {},
component: DepositRootRoutable,
},
{
path: DepositRoutesEnum.detail + AppRoutesEnum.separator + AppRoutesEnum.paramId,
redirectTo: DepositRoutesEnum.detail + AppRoutesEnum.separator + AppRoutesEnum.paramId + AppRoutesEnum.separator + DepositRoutesEnum.files,
path: AppRoutesEnum.paramId2,
redirectTo: AppRoutesEnum.paramId2 + AppRoutesEnum.separator + DepositRoutesEnum.list,
pathMatch: "full",
},
{
path: DepositRoutesEnum.detail + AppRoutesEnum.separator + AppRoutesEnum.paramId,
component: DepositDetailEditRoutable,
path: AppRoutesEnum.paramId2 + AppRoutesEnum.separator + DepositRoutesEnum.detail + AppRoutesEnum.separator + AppRoutesEnum.paramId,
redirectTo: AppRoutesEnum.paramId2 + AppRoutesEnum.separator + DepositRoutesEnum.detail + AppRoutesEnum.separator + AppRoutesEnum.paramId + AppRoutesEnum.separator + DepositRoutesEnum.files,
pathMatch: "full",
},
{
path: AppRoutesEnum.paramId2 + AppRoutesEnum.separator + DepositRoutesEnum.detail + AppRoutesEnum.separator + AppRoutesEnum.paramId + AppRoutesEnum.separator + DepositRoutesEnum.edit,
redirectTo: AppRoutesEnum.paramId2 + AppRoutesEnum.separator + DepositRoutesEnum.detail + AppRoutesEnum.separator + AppRoutesEnum.paramId + AppRoutesEnum.separator + DepositRoutesEnum.files + AppRoutesEnum.separator + DepositRoutesEnum.edit,
pathMatch: "full",
},
{
// AppRoutesEnum.root + AppRoutesEnum.separator +
path: AppRoutesEnum.paramId2,
component: DepositHomeRoutable,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.detail"),
breadcrumbMemoizedSelector: DepositState.currentTitle,
breadcrumb: TRANSLATE("breadcrumb.deposit.organizationalUnit"),
breadcrumbMemoizedSelector: DepositState.currentOrgUnitName,
},
canActivate: [DepositRoleGuardDetailService],
children: [
{
path: DepositRoutesEnum.metadata,
component: DepositMetadataRoutable,
path: DepositRoutesEnum.list,
component: DepositListRoutable,
},
{
path: DepositRoutesEnum.detail + AppRoutesEnum.separator + AppRoutesEnum.paramId,
component: DepositDetailEditRoutable,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.metadata"),
noBreadcrumbLink: true,
breadcrumb: TRANSLATE("breadcrumb.deposit.detail"),
breadcrumbMemoizedSelector: DepositState.currentTitle,
},
canActivate: [DepositRoleGuardDetailService],
children: [
{
path: DepositRoutesEnum.edit,
path: DepositRoutesEnum.metadata,
component: DepositMetadataRoutable,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.edit"),
breadcrumb: TRANSLATE("breadcrumb.deposit.metadata"),
noBreadcrumbLink: true,
},
canActivate: [DepositRoleGuardEditService],
canDeactivate: [CanDeactivateGuard],
children: [
{
path: DepositRoutesEnum.edit,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.edit"),
},
canActivate: [DepositRoleGuardEditService],
canDeactivate: [CanDeactivateGuard],
},
],
},
],
},
{
path: DepositRoutesEnum.files,
component: DepositFileRoutable,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.file"),
noBreadcrumbLink: true,
},
children: [
{
path: DepositRoutesEnum.edit,
path: DepositRoutesEnum.files,
component: DepositFileRoutable,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.edit"),
breadcrumb: TRANSLATE("breadcrumb.deposit.file"),
noBreadcrumbLink: true,
},
canActivate: [DepositRoleGuardEditService],
canDeactivate: [CanDeactivateGuard],
children: [
{
path: DepositRoutesEnum.edit,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.edit"),
},
canActivate: [DepositRoleGuardEditService],
canDeactivate: [CanDeactivateGuard],
},
],
},
],
},
{
path: DepositRoutesEnum.create,
component: DepositCreateRoutable,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.create"),
},
canDeactivate: [CanDeactivateGuard],
},
],
},
{
path: DepositRoutesEnum.create,
component: DepositCreateRoutable,
data: {
breadcrumb: TRANSLATE("breadcrumb.deposit.create"),
},
canDeactivate: [CanDeactivateGuard],
},
];
@NgModule({
......
......@@ -14,8 +14,11 @@ import {DepositPersonAlternativeDialog} from "@deposit/components/dialogs/deposi
import {DepositPersonDialog} from "@deposit/components/dialogs/deposit-person/deposit-person.dialog";
import {DepositFolderTreePresentational} from "@deposit/components/presentationals/deposit-folder-tree/deposit-folder-tree.presentational";
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 {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";
import {TranslateModule} from "@ngx-translate/core";
import {NgxsModule} from "@ngxs/store";
......@@ -24,6 +27,8 @@ import {DepositCreateRoutable} from "./components/routables/deposit-create/depos
import {DepositDetailEditRoutable} from "./components/routables/deposit-detail-edit/deposit-detail-edit.routable";
const routables = [
DepositRootRoutable,
DepositHomeRoutable,
DepositListRoutable,
DepositCreateRoutable,
DepositDetailEditRoutable,
......@@ -62,6 +67,7 @@ const presentationals = [
DepositPeopleState,
DepositStatusHistoryState,
DepositDataFileStatusHistoryState,
DepositOrganizationalUnitState,
]),
],
entryComponents: [
......
......@@ -105,6 +105,13 @@ export namespace DepositAction {
export class Clean extends ResourceAction.Clean {
}
export class SetOrganizationalUnit {
static readonly type: string = `[${state}] Set Organizational Unit`;
constructor(public organizationalUnitId: string) {
}
}
export class Submit {
static readonly type: string = `[${state}] Submit`;
......
......@@ -23,6 +23,7 @@ import {
DepositPersonStateModel,
} from "@app/features/deposit/stores/people/deposit-people.state";
import {DepositPersonAction} from "@app/features/deposit/stores/people/deposit-person.action";
import {OrganizationalUnit} from "@app/generated-api";
import {Deposit} from "@app/generated-api/model/deposit.model";
import {ApiActionEnum} from "@app/shared/enums/api-action.enum";
import {PreIngestResourceApiEnum} from "@app/shared/enums/api.enum";
......@@ -37,6 +38,8 @@ import {SharedLanguageAction} from "@app/shared/stores/language/shared-language.
import {SharedPreservationPolicyAction} from "@app/shared/stores/preservation-policy/shared-preservation-policy.action";
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 {DepositOrganizationalUnitState} from "@deposit/stores/organizational-unit/deposit-organizational-unit.state";
import {
DepositStatusHistoryState,
DepositStatusHistoryStateModel,
......@@ -85,6 +88,7 @@ export interface DepositStateModel extends ResourceStateModel<DepositExtended> {
isLoadingDataFile: boolean;
uploadStatus: UploadFileStatus[];
deposit_statusHistory: DepositStatusHistoryStateModel;
organizationalUnit: OrganizationalUnit;
}
@State<DepositStateModel>({
......@@ -96,11 +100,13 @@ export interface DepositStateModel extends ResourceStateModel<DepositExtended> {
isLoadingDataFile: false,
uploadStatus: [],
deposit_statusHistory: {...defaultStatusHistoryInitValue()},
organizationalUnit: undefined,
},
children: [
DepositDataFileState,
DepositPeopleState,
DepositStatusHistoryState,
DepositOrganizationalUnitState,
],
})
export class DepositState extends ResourceState<DepositStateModel, DepositExtended> {
......@@ -115,8 +121,8 @@ export class DepositState extends ResourceState<DepositStateModel, DepositExtend
protected actions$: Actions) {
super(apiService, store, notificationService, actions$, {
nameSpace: depositActionNameSpace,
routeRedirectUrlAfterSuccessCreateAction: (resId: string) => RoutesEnum.depositDetail + urlSeparator + resId + urlSeparator + DepositRoutesEnum.files + urlSeparator + DepositRoutesEnum.edit,
routeRedirectUrlAfterSuccessUpdateAction: (resId: string) => RoutesEnum.depositDetail + urlSeparator + resId + urlSeparator + DepositRoutesEnum.files,
// routeRedirectUrlAfterSuccessCreateAction: (resId: string) => RoutesEnum.depositDetail + urlSeparator + resId + urlSeparator + DepositRoutesEnum.files + urlSeparator + DepositRoutesEnum.edit,
// routeRedirectUrlAfterSuccessUpdateAction: (resId: string) => RoutesEnum.depositDetail + urlSeparator + resId + urlSeparator + DepositRoutesEnum.files,
routeRedirectUrlAfterSuccessDeleteAction: RoutesEnum.deposit,
notificationResourceCreateSuccessTextToTranslate: TRANSLATE("deposit.notification.resource.create"),
notificationResourceDeleteSuccessTextToTranslate: TRANSLATE("deposit.notification.resource.delete"),
......@@ -133,6 +139,14 @@ export class DepositState extends ResourceState<DepositStateModel, DepositExtend
return StoreUtil.isLoadingState(state);
}
@Selector()
static currentOrgUnitName(state: DepositStateModel): string | undefined {
if (isNullOrUndefined(state.organizationalUnit)) {
return undefined;
}
return state.organizationalUnit.name;
}
@Selector()
static currentTitle(state: DepositStateModel): string | undefined {
if (isNullOrUndefined(state.current)) {
......@@ -196,6 +210,15 @@ export class DepositState extends ResourceState<DepositStateModel, DepositExtend
});
}
@Action(DepositAction.SetOrganizationalUnit)
setOrganizationalUnit(ctx: StateContext<DepositStateModel>, action: DepositAction.SetOrganizationalUnit): void {
const listAuthorizedOrgUnit = ResourceState.listSnapshot(this.store, AppAuthorizedOrganizationalUnitState);
const orgUnit = listAuthorizedOrgUnit.find(o => o.resId === action.organizationalUnitId);
ctx.patchState({
organizationalUnit: orgUnit,
});
}
@OverrideDefaultAction()
@Action(DepositAction.Create)
create(ctx: StateContext<DepositStateModel>, action: DepositAction.Create): Observable<DepositExtended> {
......@@ -214,6 +237,16 @@ export class DepositState extends ResourceState<DepositStateModel, DepositExtend
);
}
@OverrideDefaultAction()
@Action(DepositAction.CreateSuccess)
createSuccess(ctx: StateContext<DepositStateModel>, action: DepositAction.CreateSuccess): void {
super.createSuccess(ctx, action);
ctx.dispatch([
new Navigate([RoutesEnum.deposit, action.model.organizationalUnitId, DepositRoutesEnum.detail, action.model.resId, DepositRoutesEnum.files]),
new DepositAction.SetOrganizationalUnit(action.model.organizationalUnitId),
]);
}
@OverrideDefaultAction()
@Action(DepositAction.Update)
update(ctx: StateContext<DepositStateModel>, action: DepositAction.Update): Observable<DepositExtended> {
......@@ -239,7 +272,11 @@ export class DepositState extends ResourceState<DepositStateModel, DepositExtend
super.updateSuccess(ctx, action);
const depositId = action.model.resId;
ctx.dispatch(new DepositPersonAction.GetAll(depositId));
ctx.dispatch([
new DepositPersonAction.GetAll(depositId),
new Navigate([RoutesEnum.deposit, action.model.organizationalUnitId, DepositRoutesEnum.detail, action.model.resId, DepositRoutesEnum.files]),
new DepositAction.SetOrganizationalUnit(action.model.organizationalUnitId),
]);
}
private updateSubResource(model: DepositExtended, action: DepositAction.Create | DepositAction.Update, ctx: StateContext<DepositStateModel>): Observable<boolean> {
......
import {OrganizationalUnit} from "@app/generated-api";
import {LocalStateEnum} from "@shared/enums/local-state.enum";
import {
ResourceAction,
ResourceNameSpace,
TypeDefaultAction,
} from "solidify-frontend";
const state = LocalStateEnum.deposit_organizationalUnit;
export namespace DepositOrganizationalUnitAction {
@TypeDefaultAction(state)
export class LoadResource extends ResourceAction.LoadResource {
}
@TypeDefaultAction(state)
export class LoadResourceSuccess extends ResourceAction.LoadResourceSuccess {
}
@TypeDefaultAction(state)
export class LoadResourceFail extends ResourceAction.LoadResourceFail {
}
@TypeDefaultAction(state)
export class ChangeQueryParameters extends ResourceAction.ChangeQueryParameters {
}
@TypeDefaultAction(state)
export class GetAll extends ResourceAction.GetAll {
}
@TypeDefaultAction(state)
export class GetAllSuccess extends ResourceAction.GetAllSuccess<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class GetAllFail extends ResourceAction.GetAllFail<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class GetByListId extends ResourceAction.GetByListId {
}
@TypeDefaultAction(state)
export class GetByListIdSuccess extends ResourceAction.GetByListIdSuccess {
}
@TypeDefaultAction(state)
export class GetByListIdFail extends ResourceAction.GetByListIdFail {
}
@TypeDefaultAction(state)
export class GetById extends ResourceAction.GetById {
}
@TypeDefaultAction(state)
export class GetByIdSuccess extends ResourceAction.GetByIdSuccess<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class GetByIdFail extends ResourceAction.GetByIdFail<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class Create extends ResourceAction.Create<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class CreateSuccess extends ResourceAction.CreateSuccess<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class CreateFail extends ResourceAction.CreateFail<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class Update extends ResourceAction.Update<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class UpdateSuccess extends ResourceAction.UpdateSuccess<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class UpdateFail extends ResourceAction.UpdateFail<OrganizationalUnit> {
}
@TypeDefaultAction(state)
export class Delete extends ResourceAction.Delete {
}
@TypeDefaultAction(state)
export class DeleteSuccess extends ResourceAction.DeleteSuccess {
}
@TypeDefaultAction(state)
export class DeleteFail extends ResourceAction.DeleteFail {
}
@TypeDefaultAction(state)
export class Clean extends ResourceAction.Clean {
}
}
export const depositOrganizationalUnitNameSpace: ResourceNameSpace = DepositOrganizationalUnitAction;
import {OrganizationalUnit} from "@app/generated-api";
import {AdminResourceApiEnum} from "@app/shared/enums/api.enum";
import {depositOrganizationalUnitNameSpace} from "@deposit/stores/organizational-unit/deposit-organizational-unit.action";
import {
Actions,
Selector,
State,
Store,
} from "@ngxs/store";
import {LocalStateEnum} from "@shared/enums/local-state.enum";
import {
ApiService,
defaultResourceStateInitValue,
isNullOrUndefined,
NotificationService,
ResourceState,
ResourceStateModel,
} from "solidify-frontend";
export interface DepositOrganizationalUnitStateModel extends ResourceStateModel<OrganizationalUnit> {
}
@State<DepositOrganizationalUnitStateModel>({
name: LocalStateEnum.deposit_organizationalUnit,
defaults: {
...defaultResourceStateInitValue(),
},
})
export class DepositOrganizationalUnitState extends ResourceState<DepositOrganizationalUnitStateModel, OrganizationalUnit> {
constructor(protected apiService: ApiService,
protected store: Store,
protected notificationService: NotificationService,
protected actions$: Actions) {
super(apiService, store, notificationService, actions$, {
nameSpace: depositOrganizationalUnitNameSpace,
});
}
protected get _urlResource(): string {
return AdminResourceApiEnum.authorizedOrganizationalUnits;
}
@Selector()
static currentTitle(state: DepositOrganizationalUnitStateModel): string | undefined {
console.error("CALLED DepositOrganizationalUnitStateModel");
if (isNullOrUndefined(state.current)) {
return undefined;
}
return state.current.name;
}
}
......@@ -70,7 +70,7 @@ export class HomeBrowsingListArchivesRoutable extends SharedAbstractRoutable imp
this.subscribe(this._activatedRoute.url,
(url) => {
this.isArchiveDetail = !isEmptyArray(this._activatedRoute.snapshot.children);
this.orgUnitId = this._activatedRoute.snapshot.paramMap.get("id");
this.orgUnitId = this._activatedRoute.snapshot.paramMap.get(AppRoutesEnum.paramIdWithoutPrefixParam);
this._store.dispatch(new HomeOrgUnitAction.GetById(this.orgUnitId));
});
......