diff --git a/src/app/features/admin/funding-agencies/funding-agencies-routing.module.ts b/src/app/features/admin/funding-agencies/funding-agencies-routing.module.ts index 159d16c4fdca22bc6261e991b9d2c25e49d3e318..6afba38fc66681de3442186621518d74c95afd4a 100644 --- a/src/app/features/admin/funding-agencies/funding-agencies-routing.module.ts +++ b/src/app/features/admin/funding-agencies/funding-agencies-routing.module.ts @@ -13,6 +13,7 @@ import { } from "@shared/enums/routes.enum"; import {CanDeactivateGuard} from "@shared/services/can-deactivate-guard.service"; import {TRANSLATE} from "solidify-frontend"; +import {AdminFundingAgenciesState} from "./stores/admin-funding-agencies.state"; const routes: Routes = [ { @@ -25,6 +26,7 @@ const routes: Routes = [ component: AdminFundingAgenciesDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.funding-agencies.detail"), + breadcrumbMemoizedSelector: AdminFundingAgenciesState.currentTitle, }, }, { diff --git a/src/app/features/admin/funding-agencies/stores/admin-funding-agencies.state.ts b/src/app/features/admin/funding-agencies/stores/admin-funding-agencies.state.ts index 439f4e90729143e001f074a9ab945a8d9b0e73b3..e6d99babaad4caf1545bdd3f710eb7c22b145ce6 100644 --- a/src/app/features/admin/funding-agencies/stores/admin-funding-agencies.state.ts +++ b/src/app/features/admin/funding-agencies/stores/admin-funding-agencies.state.ts @@ -87,6 +87,14 @@ export class AdminFundingAgenciesState extends ResourceState<FundingAgencyExtend || StoreUtil.isLoadingState(state.admin_fundingAgencies_organizationalUnit); } + @Selector() + static currentTitle(state: AdminFundingAgenciesStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.name; + } + @Selector() static isReadyToBeDisplayed(state: AdminFundingAgenciesStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/institution/institution-routing.module.ts b/src/app/features/admin/institution/institution-routing.module.ts index a2095f54c305e82ab4e8627f1347f643fb1aa920..45f9f8ba4b50ace47dacf1cb899887a5b69a3a3b 100644 --- a/src/app/features/admin/institution/institution-routing.module.ts +++ b/src/app/features/admin/institution/institution-routing.module.ts @@ -2,6 +2,7 @@ import {AdminInstitutionCreateRoutable} from "@admin/institution/components/rout import {AdminInstitutionDetailRoutable} from "@admin/institution/components/routables/admin-institution-detail/admin-institution-detail.routable"; import {AdminInstitutionEditRoutable} from "@admin/institution/components/routables/admin-institution-edit/admin-institution-edit.routable"; import {AdminInstitutionListRoutable} from "@admin/institution/components/routables/admin-institution-list/admin-institution-list.routable"; +import {AdminInstitutionState} from "@admin/institution/stores/admin-institution.state"; import {NgModule} from "@angular/core"; import { RouterModule, @@ -25,6 +26,7 @@ const routes: Routes = [ component: AdminInstitutionDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.institution.detail"), + breadcrumbMemoizedSelector: AdminInstitutionState.currentTitle, }, }, { diff --git a/src/app/features/admin/institution/stores/admin-institution.state.ts b/src/app/features/admin/institution/stores/admin-institution.state.ts index 602d7d96c6e3b81bfc35866a6e4f204198d6aabd..76b5a7468fcaab5a28491a038a0533a88f93f598 100644 --- a/src/app/features/admin/institution/stores/admin-institution.state.ts +++ b/src/app/features/admin/institution/stores/admin-institution.state.ts @@ -61,6 +61,14 @@ export class AdminInstitutionState extends ResourceState<Institution> { return this.isLoading(state); } + @Selector() + static currentTitle(state: AdminInstitutionStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.name; + } + @Selector() static isReadyToBeDisplayed(state: AdminInstitutionStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/license/license-routing.module.ts b/src/app/features/admin/license/license-routing.module.ts index c2caf0226974a26d50334ece7c2a2175d8d9ab05..acbd2341b89c6594ec0463ff8670bd95fc8cb159 100644 --- a/src/app/features/admin/license/license-routing.module.ts +++ b/src/app/features/admin/license/license-routing.module.ts @@ -2,6 +2,7 @@ import {AdminLicenseCreateRoutable} from "@admin/license/components/routables/ad import {AdminLicenseDetailRoutable} from "@admin/license/components/routables/admin-license-detail/admin-license-detail.routable"; import {AdminLicenseEditRoutable} from "@admin/license/components/routables/admin-license-edit/admin-license-edit.routable"; import {AdminLicenseListRoutable} from "@admin/license/components/routables/admin-license-list/admin-license-list.routable"; +import {AdminLicenseState} from "@admin/license/stores/admin-license.state"; import {NgModule} from "@angular/core"; import { RouterModule, @@ -41,6 +42,7 @@ const routes: Routes = [ component: AdminLicenseDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.license.detail"), + breadcrumbMemoizedSelector: AdminLicenseState.currentTitle, }, }, ]; diff --git a/src/app/features/admin/license/stores/admin-license.state.ts b/src/app/features/admin/license/stores/admin-license.state.ts index 1414f78c8cce5862a8326a0ec75feef452eb08ce..cfbd2ec57e747f0257d1957a6b987ff67a4b3b80 100644 --- a/src/app/features/admin/license/stores/admin-license.state.ts +++ b/src/app/features/admin/license/stores/admin-license.state.ts @@ -60,6 +60,14 @@ export class AdminLicenseState extends ResourceState<License> { return this.isLoading(state); } + @Selector() + static currentTitle(state: AdminLicenseStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.title; + } + @Selector() static isReadyToBeDisplayed(state: AdminLicenseStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/oauth2-client/oauth2-client-routing.module.ts b/src/app/features/admin/oauth2-client/oauth2-client-routing.module.ts index d74c511cdc3c7eeb41b986d78034437b20cc17b4..9df76e083d971b63da0805c55b585781edcc2715 100644 --- a/src/app/features/admin/oauth2-client/oauth2-client-routing.module.ts +++ b/src/app/features/admin/oauth2-client/oauth2-client-routing.module.ts @@ -2,6 +2,7 @@ import {AdminOauth2ClientCreateRoutable} from "@admin/oauth2-client/components/r import {AdminOAuth2ClientDetailRoutable} from "@admin/oauth2-client/components/routables/admin-oauth2-client-detail/admin-oauth2-client-detail.routable"; import {AdminOauth2ClientEditRoutable} from "@admin/oauth2-client/components/routables/admin-oauth2-client-edit/admin-oauth2-client-edit.routable"; import {AdminOAuth2ClientListRoutable} from "@admin/oauth2-client/components/routables/admin-oauth2-client-list/admin-oauth2-client-list.routable"; +import {AdminOAuth2ClientState} from "@admin/oauth2-client/stores/admin-oauth2-client.state"; import {NgModule} from "@angular/core"; import { RouterModule, @@ -25,6 +26,7 @@ const routes: Routes = [ component: AdminOAuth2ClientDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.oauth2Client.detail"), + breadcrumbMemoizedSelector: AdminOAuth2ClientState.currentTitle, }, }, { diff --git a/src/app/features/admin/oauth2-client/stores/admin-oauth2-client.state.ts b/src/app/features/admin/oauth2-client/stores/admin-oauth2-client.state.ts index c868caea6a188e135394e973479a7fa259c54718..cd5d4296ecf836183d651577a071eb4990c76f0c 100644 --- a/src/app/features/admin/oauth2-client/stores/admin-oauth2-client.state.ts +++ b/src/app/features/admin/oauth2-client/stores/admin-oauth2-client.state.ts @@ -60,6 +60,14 @@ export class AdminOAuth2ClientState extends ResourceState<Oauth2Client> { return this.isLoading(state); } + @Selector() + static currentTitle(state: AdminOAuth2ClientStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.name; + } + @Selector() static isReadyToBeDisplayed(state: AdminOAuth2ClientStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/orgunit/orgunit-routing.module.ts b/src/app/features/admin/orgunit/orgunit-routing.module.ts index 049c7550ae575e52731d68ca6f73904e8e58e425..e3e4c0c7aeb88bc8901c13f561143bde907a6d3d 100644 --- a/src/app/features/admin/orgunit/orgunit-routing.module.ts +++ b/src/app/features/admin/orgunit/orgunit-routing.module.ts @@ -2,6 +2,7 @@ import {AdminOrgunitCreateRoutable} from "@admin/orgunit/components/routables/ad import {AdminOrgunitDetailRoutable} from "@admin/orgunit/components/routables/admin-orgunit-detail/admin-orgunit-detail.routable"; import {AdminOrgunitEditRoutable} from "@admin/orgunit/components/routables/admin-orgunit-edit/admin-orgunit-edit.routable"; import {AdminOrgunitListRoutable} from "@admin/orgunit/components/routables/admin-orgunit-list/admin-orgunit-list.routable"; +import {AdminOrganizationalUnitState} from "@admin/orgunit/stores/admin-organizational-unit.state"; import {NgModule} from "@angular/core"; import { RouterModule, @@ -25,6 +26,7 @@ const routes: Routes = [ component: AdminOrgunitDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.organizationalUnit.detail"), + breadcrumbMemoizedSelector: AdminOrganizationalUnitState.currentTitle, }, }, { diff --git a/src/app/features/admin/orgunit/stores/admin-organizational-unit.state.ts b/src/app/features/admin/orgunit/stores/admin-organizational-unit.state.ts index e324d881e3c5314c335e69c171d35ab75dcc24a4..87baa4649adb2cc3c1851ac76e360e661040650c 100644 --- a/src/app/features/admin/orgunit/stores/admin-organizational-unit.state.ts +++ b/src/app/features/admin/orgunit/stores/admin-organizational-unit.state.ts @@ -129,6 +129,14 @@ export class AdminOrganizationalUnitState extends ResourceState<OrganizationalUn || StoreUtil.isLoadingState(state.admin_organizationalUnit_institution); } + @Selector() + static currentTitle(state: AdminOrganizationalUnitStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.name; + } + @Selector() static isReadyToBeDisplayed(state: AdminOrganizationalUnitStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/person/person-routing.module.ts b/src/app/features/admin/person/person-routing.module.ts index 6800c3c55255ec9e6e1f9a100f9d61f322567ebd..3404b9ac8f9ce9661d8274fc1f93615033f2319f 100644 --- a/src/app/features/admin/person/person-routing.module.ts +++ b/src/app/features/admin/person/person-routing.module.ts @@ -2,6 +2,7 @@ import {AdminPersonCreateRoutable} from "@admin/person/components/routables/admi import {AdminPersonDetailRoutable} from "@admin/person/components/routables/admin-person-detail/admin-person-detail.routable"; import {AdminPersonEditRoutable} from "@admin/person/components/routables/admin-person-edit/admin-person-edit.routable"; import {AdminPersonListRoutable} from "@admin/person/components/routables/admin-person-list/admin-person-list.routable"; +import {AdminPersonState} from "@admin/person/stores/admin-person.state"; import {NgModule} from "@angular/core"; import { RouterModule, @@ -30,6 +31,7 @@ const routes: Routes = [ component: AdminPersonDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.person.detail"), + breadcrumbMemoizedSelector: AdminPersonState.currentTitle, permission: ApplicationRolePermissionEnum.rootPermission, }, }, diff --git a/src/app/features/admin/person/stores/admin-person.state.ts b/src/app/features/admin/person/stores/admin-person.state.ts index 87181313c1690c4b4cf23ff7a5efb21db7a26c9e..d166375abc029a0668dcfaf02389dffc039c1dff 100644 --- a/src/app/features/admin/person/stores/admin-person.state.ts +++ b/src/app/features/admin/person/stores/admin-person.state.ts @@ -95,6 +95,14 @@ export class AdminPersonState extends ResourceState<PersonExtended> { || StoreUtil.isLoadingState(state.admin_person_institutions); } + @Selector() + static currentTitle(state: AdminPersonStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.fullName; + } + @Selector() static isReadyToBeDisplayed(state: AdminPersonStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/preservation-policy/preservation-policy-routing.module.ts b/src/app/features/admin/preservation-policy/preservation-policy-routing.module.ts index 58bed5578d8c01fc8db30c2c3244a4761f2a1b13..39e77b26d9730ec859705fab14ec98293f528975 100644 --- a/src/app/features/admin/preservation-policy/preservation-policy-routing.module.ts +++ b/src/app/features/admin/preservation-policy/preservation-policy-routing.module.ts @@ -13,6 +13,7 @@ import { } from "@shared/enums/routes.enum"; import {CanDeactivateGuard} from "@shared/services/can-deactivate-guard.service"; import {TRANSLATE} from "solidify-frontend"; +import {AdminPreservationPolicyState} from "./stores/admin-preservation-policy.state"; const routes: Routes = [ { @@ -25,6 +26,7 @@ const routes: Routes = [ component: AdminPreservationPolicyDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.preservationPolicy.detail"), + breadcrumbMemoizedSelector: AdminPreservationPolicyState.currentTitle, }, }, { diff --git a/src/app/features/admin/preservation-policy/stores/admin-preservation-policy.state.ts b/src/app/features/admin/preservation-policy/stores/admin-preservation-policy.state.ts index af64cb1bbffe0c5fb628f2b835b26c481334e853..725161a408149e793b9ae5964bb2f8dc6555d1dd 100644 --- a/src/app/features/admin/preservation-policy/stores/admin-preservation-policy.state.ts +++ b/src/app/features/admin/preservation-policy/stores/admin-preservation-policy.state.ts @@ -60,6 +60,14 @@ export class AdminPreservationPolicyState extends ResourceState<PreservationPoli return this.isLoading(state); } + @Selector() + static currentTitle(state: AdminPreservationPolicyStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.name; + } + @Selector() static isReadyToBeDisplayed(state: AdminPreservationPolicyStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/role/role-routing.module.ts b/src/app/features/admin/role/role-routing.module.ts index f44c15d66b98c7efbd2ff837bd11fddaf686b7a7..1e4daa7f96c7eea1ab16c050a0359f1f30c45561 100644 --- a/src/app/features/admin/role/role-routing.module.ts +++ b/src/app/features/admin/role/role-routing.module.ts @@ -1,6 +1,7 @@ import {AdminRoleDetailRoutable} from "@admin/role/components/routables/admin-role-detail/admin-role-detail.routable"; import {AdminRoleEditRoutable} from "@admin/role/components/routables/admin-role-edit/admin-role-edit.routable"; import {AdminRoleListRoutable} from "@admin/role/components/routables/admin-role-list/admin-role-list.routable"; +import {AdminRoleState} from "@admin/role/stores/admin-role.state"; import {NgModule} from "@angular/core"; import { RouterModule, @@ -24,6 +25,7 @@ const routes: Routes = [ component: AdminRoleDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.role.detail"), + breadcrumbMemoizedSelector: AdminRoleState.currentTitle, }, }, { diff --git a/src/app/features/admin/role/stores/admin-role.state.ts b/src/app/features/admin/role/stores/admin-role.state.ts index 64b356c54f1ecf5c485c7ed918118e5dc7132f99..800cff33a0f31d4e6e96e235e198f0abbe45a207 100644 --- a/src/app/features/admin/role/stores/admin-role.state.ts +++ b/src/app/features/admin/role/stores/admin-role.state.ts @@ -61,6 +61,14 @@ export class AdminRoleState extends ResourceState<Role> { return this.isLoading(state); } + @Selector() + static currentTitle(state: AdminRoleStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.name; + } + @Selector() static isReadyToBeDisplayed(state: AdminRoleStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/submission-policy/stores/admin-submission-policy.state.ts b/src/app/features/admin/submission-policy/stores/admin-submission-policy.state.ts index 51164a232cc812336aabf159e1edb36390f5e59b..e610d2f2f20a2c8f6419159cfce714b5a149d3a1 100644 --- a/src/app/features/admin/submission-policy/stores/admin-submission-policy.state.ts +++ b/src/app/features/admin/submission-policy/stores/admin-submission-policy.state.ts @@ -60,6 +60,14 @@ export class AdminSubmissionPolicyState extends ResourceState<SubmissionPolicy> return this.isLoading(state); } + @Selector() + static currentTitle(state: AdminSubmissionPolicyStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.name; + } + @Selector() static isReadyToBeDisplayed(state: AdminSubmissionPolicyStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/submission-policy/submission-policy-routing.module.ts b/src/app/features/admin/submission-policy/submission-policy-routing.module.ts index 1359e39113f5cf61457e75f8e21c16ec522820a2..df31372704ede9a21b5d6e64b5d91bdaa3d9c914 100644 --- a/src/app/features/admin/submission-policy/submission-policy-routing.module.ts +++ b/src/app/features/admin/submission-policy/submission-policy-routing.module.ts @@ -2,6 +2,7 @@ import {AdminSubmissionPolicyCreateRoutable} from "@admin/submission-policy/comp import {AdminSubmissionPolicyDetailRoutable} from "@admin/submission-policy/components/routables/admin-submission-policy-detail/admin-submission-policy-detail.routable"; import {AdminSubmissionPolicyEditRoutable} from "@admin/submission-policy/components/routables/admin-submission-policy-edit/admin-submission-policy-edit.routable"; import {AdminSubmissionPolicyListRoutable} from "@admin/submission-policy/components/routables/admin-submission-policy-list/admin-submission-policy-list.routable"; +import {AdminSubmissionPolicyState} from "@admin/submission-policy/stores/admin-submission-policy.state"; import {NgModule} from "@angular/core"; import { RouterModule, @@ -25,6 +26,7 @@ const routes: Routes = [ component: AdminSubmissionPolicyDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.submissionPolicy.detail"), + breadcrumbMemoizedSelector: AdminSubmissionPolicyState.currentTitle, }, }, { diff --git a/src/app/features/admin/user/stores/admin-user.state.ts b/src/app/features/admin/user/stores/admin-user.state.ts index 6181c6f2cfd3b491f0a45a4975904cdf2888a58b..9f766be8f4eb9398fc14656559998790a71b6d5d 100644 --- a/src/app/features/admin/user/stores/admin-user.state.ts +++ b/src/app/features/admin/user/stores/admin-user.state.ts @@ -68,6 +68,14 @@ export class AdminUserState extends ResourceState<UserExtended> { return this.isLoading(state); } + @Selector() + static currentTitle(state: AdminUserStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.externalUid; + } + @Selector() static isReadyToBeDisplayed(state: AdminUserStateModel): boolean { return this.isReadyToBeDisplayedInCreateMode diff --git a/src/app/features/admin/user/user-routing.module.ts b/src/app/features/admin/user/user-routing.module.ts index c8f2404f00c99e56af32364547392deeeff0239a..98d5cb84fcbc92757fcdea77bfb93def57c68dd9 100644 --- a/src/app/features/admin/user/user-routing.module.ts +++ b/src/app/features/admin/user/user-routing.module.ts @@ -2,6 +2,7 @@ import {AdminUserCreateRoutable} from "@admin/user/components/routables/admin-us import {AdminUserDetailRoutable} from "@admin/user/components/routables/admin-user-detail/admin-user-detail.routable"; import {AdminUserEditRoutable} from "@admin/user/components/routables/admin-user-edit/admin-user-edit.routable"; import {AdminUserListRoutable} from "@admin/user/components/routables/admin-user-list/admin-user-list.routable"; +import {AdminUserState} from "@admin/user/stores/admin-user.state"; import {NgModule} from "@angular/core"; import { RouterModule, @@ -30,6 +31,7 @@ const routes: Routes = [ component: AdminUserDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.admin.user.detail"), + breadcrumbMemoizedSelector: AdminUserState.currentTitle, permission: ApplicationRolePermissionEnum.rootPermission, }, }, diff --git a/src/app/features/deposit/deposit-routing.module.ts b/src/app/features/deposit/deposit-routing.module.ts index d46ad4d8175b2a6f0f8e9e04c34c13137ccd823e..79677fc7f717b6df68d23b585372402b275a8d56 100644 --- a/src/app/features/deposit/deposit-routing.module.ts +++ b/src/app/features/deposit/deposit-routing.module.ts @@ -11,6 +11,7 @@ import { import {DlcmRoutes} from "@app/shared/models/dlcm-route.model"; import {DepositFileRoutable} from "@deposit/components/routables/deposit-file/deposit-file.routable"; import {DepositMetadataRoutable} from "@deposit/components/routables/deposit-metadata/deposit-metadata.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"; import {CanDeactivateGuard} from "@shared/services/can-deactivate-guard.service"; @@ -32,6 +33,7 @@ const routes: DlcmRoutes = [ component: DepositDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.deposit.detail"), + breadcrumbMemoizedSelector: DepositState.currentTitle, }, canActivate: [DepositRoleGuardDetailService], children: [ @@ -44,7 +46,7 @@ const routes: DlcmRoutes = [ canDeactivate: [CanDeactivateGuard], }, { - path: DepositRoutesEnum.file, + path: DepositRoutesEnum.files, component: DepositFileRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.deposit.file"), @@ -75,7 +77,7 @@ const routes: DlcmRoutes = [ canDeactivate: [CanDeactivateGuard], }, { - path: DepositRoutesEnum.file, + path: DepositRoutesEnum.files, component: DepositFileRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.deposit.file"), diff --git a/src/app/features/deposit/helpers/deposit.helper.ts b/src/app/features/deposit/helpers/deposit.helper.ts index 5170473675acda10ee19cd58dbc68e6e53c6e6bf..3128ca8dd17464e4a94d149ba762215d46dd0f58 100644 --- a/src/app/features/deposit/helpers/deposit.helper.ts +++ b/src/app/features/deposit/helpers/deposit.helper.ts @@ -28,7 +28,7 @@ export class DepositHelper { if (tabRouteSelected === DepositRoutesEnum.metadata) { return DepositTabEnum.metadata; } - if (tabRouteSelected === DepositRoutesEnum.file) { + if (tabRouteSelected === DepositRoutesEnum.files) { return DepositTabEnum.file; } return undefined; @@ -39,7 +39,7 @@ export class DepositHelper { return DepositRoutesEnum.metadata; } if (tabIndexSelected === DepositTabEnum.file) { - return DepositRoutesEnum.file; + return DepositRoutesEnum.files; } return undefined; } diff --git a/src/app/features/deposit/stores/deposit.state.ts b/src/app/features/deposit/stores/deposit.state.ts index fe5128cdf14ec2930e89ee03d69f09430079e8f6..4821ba62ca216bc1269d24a6d0922b33fc24f8ea 100644 --- a/src/app/features/deposit/stores/deposit.state.ts +++ b/src/app/features/deposit/stores/deposit.state.ts @@ -130,6 +130,14 @@ export class DepositState extends ResourceState<DepositExtended> { return StoreUtil.isLoadingState(state); } + @Selector() + static currentTitle(state: DepositStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.title; + } + @Selector() static isLoadingWithDependency(state: DepositStateModel): boolean { return this.isLoading(state) diff --git a/src/app/features/organizational-unit/organizational-unit-routing.module.ts b/src/app/features/organizational-unit/organizational-unit-routing.module.ts index 2c2d00899dc48778443e318dd8c207daf6a402ec..1c58f067fa1bff238a7d0450e4efd7b502d98891 100644 --- a/src/app/features/organizational-unit/organizational-unit-routing.module.ts +++ b/src/app/features/organizational-unit/organizational-unit-routing.module.ts @@ -11,6 +11,7 @@ import {DlcmRoutes} from "@app/shared/models/dlcm-route.model"; import {OrganizationalUnitRoleGuardService} from "@shared/guards/organizational-unit-role-guard.service"; import {CanDeactivateGuard} from "@shared/services/can-deactivate-guard.service"; import {TRANSLATE} from "solidify-frontend"; +import {OrganizationalUnitState} from "./stores/organizational-unit.state"; const routes: DlcmRoutes = [ { @@ -23,6 +24,7 @@ const routes: DlcmRoutes = [ component: OrgunitDetailRoutable, data: { breadcrumb: TRANSLATE("breadcrumb.organizationalUnit.detail"), + breadcrumbMemoizedSelector: OrganizationalUnitState.currentTitle, }, }, { diff --git a/src/app/features/organizational-unit/stores/organizational-unit.state.ts b/src/app/features/organizational-unit/stores/organizational-unit.state.ts index 6cee1205e1a53bab353be259685206725b7335bf..36250abd6b74912ef3e2b4cf4592aa684c77b031 100644 --- a/src/app/features/organizational-unit/stores/organizational-unit.state.ts +++ b/src/app/features/organizational-unit/stores/organizational-unit.state.ts @@ -83,6 +83,9 @@ export class OrganizationalUnitState extends ResourceState<OrganizationalUnitExt } protected get _urlResource(): string { + if (isNullOrUndefined(this.store)) { + return AccessResourceApiEnum.organizationalUnits; + } return this.store.selectSnapshot(OrganizationalUnitState.currentUserIsManager) ? AdminResourceApiEnum.organizationalUnits : AccessResourceApiEnum.organizationalUnits; } @@ -96,6 +99,14 @@ export class OrganizationalUnitState extends ResourceState<OrganizationalUnitExt return state.current; } + @Selector() + static currentTitle(state: OrganizationalUnitStateModel): string | undefined { + if (isNullOrUndefined(state.current)) { + return undefined; + } + return state.current.name; + } + @Selector() static isLoading(state: OrganizationalUnitStateModel): boolean { return StoreUtil.isLoadingState(state); diff --git a/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.html b/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.html index 64c918f6fa5bd3e541e91ca0b22f00e53692ef4c..0ae20b212d69dc1fcbab4ea3a27b4da79da62a12 100644 --- a/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.html +++ b/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.html @@ -4,6 +4,15 @@ > <a [class.current]="isCurrent(breadcrumb.url)" (click)="navigate(breadcrumb.url)" - >{{breadcrumb.label | translate}}</a> + > + <ng-template [ngIf]="!(breadcrumb.labelObs | isNullOrUndefined) && !(breadcrumb.labelObs | async | isNullOrUndefined)" + [ngIfElse]="normalLabel" + > + {{breadcrumb.labelObs | async}} + </ng-template> + <ng-template #normalLabel> + {{breadcrumb.label | translate}} + </ng-template> + </a> </li> </ol> diff --git a/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.ts b/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.ts index 733f3ba032b204b26499154be15bc50f5a88fd82..8ea6de79839ed7b0f9c0546984bb453d6793c7dd 100644 --- a/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.ts +++ b/src/app/shared/components/presentationals/shared-breadcrumb/shared-breadcrumb.presentational.ts @@ -12,6 +12,8 @@ import { import {SharedAbstractPresentational} from "@app/shared/components/presentationals/shared-abstract/shared-abstract.presentational"; import {Breadcrumb} from "@app/shared/models/breadcrumb.model"; import {TranslateService} from "@ngx-translate/core"; +import {Store} from "@ngxs/store"; +import {DlcmData} from "@shared/models/dlcm-route.model"; import { BehaviorSubject, Observable, @@ -22,11 +24,12 @@ import { map, } from "rxjs/operators"; import { + isNullOrUndefined, isUndefined, ObservableUtil, + StringUtil, TRANSLATE, } from "solidify-frontend"; -import {isNullOrUndefined} from "util"; @Component({ selector: "dlcm-shared-breadcrumb", @@ -47,6 +50,7 @@ export class SharedBreadcrumbPresentational extends SharedAbstractPresentational constructor(private translate: TranslateService, private router: Router, + private store: Store, private activatedRoute: ActivatedRoute) { super(); } @@ -64,16 +68,16 @@ export class SharedBreadcrumbPresentational extends SharedAbstractPresentational buildBreadCrumb(route: ActivatedRoute, url: string = "", breadcrumbs: Breadcrumb[] = []): Breadcrumb[] { - console.error(route); - const label = this.getLabel(route); - const id = this.getParamId(route); - if (!isUndefined(label)) { + const label: string = this.getLabel(route); + const labelObs = this.getBreadcrumbMemoizedSelector(route); + if (!isUndefined(label) || !isUndefined(labelObs)) { const path = this.getPath(route); url = `${url}${path}/`; const breadcrumbElement: Breadcrumb = { label, + labelObs: labelObs, url: url, } as Breadcrumb; @@ -98,12 +102,15 @@ export class SharedBreadcrumbPresentational extends SharedAbstractPresentational return this._BREADCRUMB_TRANSLATE_HOME; } - private getParamId(route: ActivatedRoute): string { - if (route.snapshot.paramMap.keys.length > 0 && route.snapshot.paramMap.has("id")) { - const id = route.snapshot.paramMap.get("id"); - console.error("FIND PARAM ID", id); - return id; + private getBreadcrumbMemoizedSelector(route: ActivatedRoute): Observable<string> | undefined { + if (isNullOrUndefined(route.routeConfig)) { + return undefined; } + const breadcrumbMemoizedSelector = (route.routeConfig.data as DlcmData).breadcrumbMemoizedSelector; + if (!isNullOrUndefined(breadcrumbMemoizedSelector)) { + return this.store.select(breadcrumbMemoizedSelector); + } + return undefined; } private getPath(route: ActivatedRoute): string { @@ -112,7 +119,7 @@ export class SharedBreadcrumbPresentational extends SharedAbstractPresentational path = this.insertParametersInPath(route, path); return path; } - return ""; + return StringUtil.stringEmpty; } private insertParametersInPath(route: ActivatedRoute, path: string): string { diff --git a/src/app/shared/enums/routes.enum.ts b/src/app/shared/enums/routes.enum.ts index e1dfdd696018c54b67bbd287b00ab7f8061b1266..35ba40e3578ef485408872982314707d69ad0e49 100644 --- a/src/app/shared/enums/routes.enum.ts +++ b/src/app/shared/enums/routes.enum.ts @@ -23,7 +23,7 @@ export enum DepositRoutesEnum { detail = "detail", edit = "edit", metadata = "metadata", - file = "file", + files = "files", } export enum OrganizationalUnitRoutesEnum { diff --git a/src/app/shared/models/breadcrumb.model.ts b/src/app/shared/models/breadcrumb.model.ts index e88fdb43e066d20b70ad22f8b110ed7b7f297ec0..1088f4d631d70142976ed59e50b65a13afdbc569 100644 --- a/src/app/shared/models/breadcrumb.model.ts +++ b/src/app/shared/models/breadcrumb.model.ts @@ -1,4 +1,7 @@ +import {Observable} from "rxjs"; + export interface Breadcrumb { label: string; + labelObs: Observable<string> | undefined; url: string; } diff --git a/src/app/shared/models/dlcm-route.model.ts b/src/app/shared/models/dlcm-route.model.ts index 36ff4148da1c6fff01f14e5bf2687709db89febc..8cd34245bb96d19ae9d428eea8913504f01d98f3 100644 --- a/src/app/shared/models/dlcm-route.model.ts +++ b/src/app/shared/models/dlcm-route.model.ts @@ -9,6 +9,7 @@ import { UrlMatcher, } from "@angular/router"; import {ApplicationRolePermissionEnum} from "@app/shared/enums/application-role-permission.enum"; +import {BaseResourceState} from "solidify-frontend"; export declare type DlcmRoutes = DlcmRoute[]; @@ -32,5 +33,6 @@ export class DlcmRoute implements Route { export class DlcmData implements Data { breadcrumb?: string; + breadcrumbMemoizedSelector?: (state: BaseResourceState) => string; permission?: ApplicationRolePermissionEnum; } diff --git a/src/app/shared/services/security.service.ts b/src/app/shared/services/security.service.ts index b4bcf0723f33e79bc3503fd1837fe213468f41da..8831f48c9b03654580575b7c3c79e3fd0587b61b 100644 --- a/src/app/shared/services/security.service.ts +++ b/src/app/shared/services/security.service.ts @@ -153,6 +153,9 @@ export class SecurityService { public isRootOrAdmin(): boolean { const applicationRoles = this._store.selectSnapshot(AppState.currentUserApplicationRolesResId); + if (isNullOrUndefined(applicationRoles)) { + return false; + } if (applicationRoles.includes(UserApplicationRoleEnum.admin) || applicationRoles.includes(UserApplicationRoleEnum.root)) { return true; } diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 3b32545c51afaa1684619262fd0481933c50b472..2de94cf2f9ea360e6eb673e5edd40ce63f4bdd9c 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -579,19 +579,19 @@ "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "Funding agency" + "root": "Funding agencies" }, "institution": { "create": "Create", "detail": "License", "edit": "Edit", - "root": "Institution" + "root": "Institutions" }, "license": { "create": "Create", "detail": "License", "edit": "Edit", - "root": "License" + "root": "Licenses" }, "oauth2Client": { "create": "Create", @@ -603,7 +603,7 @@ "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "Organizational unit" + "root": "Organizational units" }, "person": { "create": "Create", @@ -615,25 +615,25 @@ "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "Preservation policy" + "root": "Preservation policies" }, "role": { "detail": "Detail", "edit": "Edit", - "root": "Role" + "root": "Roles" }, "root": "Admin", "submissionPolicy": { "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "Submission policy" + "root": "Submission policies" }, "user": { "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "User" + "root": "Users" } }, "deposit": { diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 3b32545c51afaa1684619262fd0481933c50b472..2de94cf2f9ea360e6eb673e5edd40ce63f4bdd9c 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -579,19 +579,19 @@ "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "Funding agency" + "root": "Funding agencies" }, "institution": { "create": "Create", "detail": "License", "edit": "Edit", - "root": "Institution" + "root": "Institutions" }, "license": { "create": "Create", "detail": "License", "edit": "Edit", - "root": "License" + "root": "Licenses" }, "oauth2Client": { "create": "Create", @@ -603,7 +603,7 @@ "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "Organizational unit" + "root": "Organizational units" }, "person": { "create": "Create", @@ -615,25 +615,25 @@ "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "Preservation policy" + "root": "Preservation policies" }, "role": { "detail": "Detail", "edit": "Edit", - "root": "Role" + "root": "Roles" }, "root": "Admin", "submissionPolicy": { "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "Submission policy" + "root": "Submission policies" }, "user": { "create": "Create", "detail": "Detail", "edit": "Edit", - "root": "User" + "root": "Users" } }, "deposit": { diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 18988ea68ac804c791351a66ebd9aa5d6b3e95d1..320a1313aacc95e5088f8d49ae1c04427d4e059e 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -585,55 +585,55 @@ "create": "Créer", "detail": "Détail", "edit": "Modifier", - "root": "Institution" + "root": "Institutions" }, "license": { "create": "Créer", "detail": "Détail", "edit": "Modifier", - "root": "Licence" + "root": "Licences" }, "oauth2Client": { "create": "Créer", "detail": "Détail", "edit": "Modifier", - "root": "Client OAuth2" + "root": "Clients OAuth2" }, "organizationalUnit": { "create": "Créer", "detail": "Détail", "edit": "Modifier", - "root": "Unité organisationelle" + "root": "Unités organisationelles" }, "person": { "create": "Créer", "detail": "Détail", "edit": "Modifier", - "root": "Personne" + "root": "Personnes" }, "preservationPolicy": { "create": "Créer", "detail": "Détail", "edit": "Modifier", - "root": "Liste politique de préservation" + "root": "Politiques de préservation" }, "role": { "detail": "Détail", "edit": "Modifier", - "root": "Role" + "root": "Rôles" }, "root": "Administration", "submissionPolicy": { "create": "Créer", "detail": "Détail", "edit": "Modifier", - "root": "Politique soumission" + "root": "Politiques de soumission" }, "user": { "create": "Créer", - "detail": "Supprimer", + "detail": "Détail", "edit": "Modifier", - "root": "Utilisateur" + "root": "Utilisateurs" } }, "deposit": { @@ -648,7 +648,7 @@ "organizationalUnit": { "detail": "Détail", "edit": "Modifier", - "root": "Unité organisationnelle" + "root": "Unités organisationnelles" } }, "deposit": {