From 0291942613e7627a03d882b1bba6a88a30e1164b Mon Sep 17 00:00:00 2001 From: Yury Bondarenko Date: Thu, 28 Dec 2023 13:46:39 +0100 Subject: [PATCH] Proof-of-concept: independent menu section providers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace god-class resolvers with a service that populates the menus from lists of injectable providers - Static menu sections are resolved at the root route ~ `resolveStatic` - Route-dependent menu sections can be declared in the same structure, but are resolved on-demand ~ `resolveRoute` - More and more easily customizable - Parts can be moved between menus, removed, replaced or extended individually - The dependencies of each provider are independent of each other - Order of providers determines the order of each menu → single source of truth for the order --- .../admin-sidebar-section.component.ts | 11 +- ...dable-admin-sidebar-section.component.html | 2 +- ...andable-admin-sidebar-section.component.ts | 5 +- src/app/app-routing.module.ts | 40 +++--- src/app/app.menus.ts | 58 ++++++++ src/app/app.module.ts | 60 ++++++--- .../collection-page-routing.module.ts | 52 +++----- .../community-page-routing.module.ts | 47 +++---- src/app/home-page/home-page-routing.module.ts | 19 +-- src/app/item-page/item-page-routing.module.ts | 62 +++++---- src/app/item-page/item-page.resolver.ts | 4 +- .../expandable-navbar-section.component.ts | 12 +- .../navbar-section.component.ts | 14 +- ...dit-menu-expandable-section.component.scss | 14 +- ...-edit-menu-expandable-section.component.ts | 10 +- .../dso-edit-menu-section.component.ts | 10 +- .../menu/menu-item/models/altmetric.model.ts | 2 +- .../menu-item/models/external-link.model.ts | 2 +- .../menu/menu-item/models/link.model.ts | 2 +- .../menu/menu-item/models/menu-item.model.ts | 2 +- .../menu/menu-item/models/onclick.model.ts | 4 +- .../menu/menu-item/models/search.model.ts | 4 +- .../menu/menu-item/models/text.model.ts | 2 +- src/app/shared/menu/menu-provider.service.ts | 126 ++++++++++++++++++ src/app/shared/menu/menu-provider.ts | 47 +++++++ src/app/shared/menu/menu-section.model.ts | 93 +++++++++++-- ....ts => abstract-menu-section.component.ts} | 41 ++++-- .../menu-section.component.spec.ts | 37 +++-- src/app/shared/menu/menu-state.model.ts | 2 +- src/app/shared/menu/menu.component.ts | 10 +- src/app/shared/menu/menu.module.ts | 16 +-- src/app/shared/menu/menu.reducer.spec.ts | 2 +- src/app/shared/menu/menu.reducer.ts | 2 +- src/app/shared/menu/menu.resolver.ts | 35 +++++ src/app/shared/menu/menu.structure.ts | 46 +++++++ .../menu/providers/access-control.menu.ts | 94 +++++++++++++ .../menu/providers/admin-search.menu.ts | 50 +++++++ src/app/shared/menu/providers/browse.menu.ts | 67 ++++++++++ .../menu/providers/comcol-subscribe.menu.ts | 65 +++++++++ .../menu/providers/community-list.menu.ts | 35 +++++ .../shared/menu/providers/curation.menu.ts | 51 +++++++ .../shared/menu/providers/dso-edit.menu.ts | 53 ++++++++ src/app/shared/menu/providers/dso.menu.ts | 56 ++++++++ src/app/shared/menu/providers/edit.menu.ts | 92 +++++++++++++ .../providers/expandable-menu-provider.ts | 64 +++++++++ src/app/shared/menu/providers/export.menu.ts | 88 ++++++++++++ src/app/shared/menu/providers/health.menu.ts | 50 +++++++ src/app/shared/menu/providers/import.menu.ts | 80 +++++++++++ .../shared/menu/providers/item-claim.menu.ts | 93 +++++++++++++ .../shared/menu/providers/item-orcid.menu.ts | 57 ++++++++ .../menu/providers/item-versioning.menu.ts | 60 +++++++++ src/app/shared/menu/providers/item.menu.ts | 52 ++++++++ src/app/shared/menu/providers/new.menu.ts | 100 ++++++++++++++ .../menu/providers/notifications.menu.ts | 68 ++++++++++ .../shared/menu/providers/processes.menu.ts | 50 +++++++ .../shared/menu/providers/registries.menu.ts | 75 +++++++++++ .../menu/providers/route-context.menu.ts | 43 ++++++ .../shared/menu/providers/statistics.menu.ts | 70 ++++++++++ .../menu/providers/system-wide-alert.menu.ts | 50 +++++++ .../shared/menu/providers/workflow.menu.ts | 50 +++++++ 60 files changed, 2281 insertions(+), 227 deletions(-) create mode 100644 src/app/app.menus.ts create mode 100644 src/app/shared/menu/menu-provider.service.ts create mode 100644 src/app/shared/menu/menu-provider.ts rename src/app/shared/menu/menu-section/{menu-section.component.ts => abstract-menu-section.component.ts} (89%) create mode 100644 src/app/shared/menu/menu.resolver.ts create mode 100644 src/app/shared/menu/menu.structure.ts create mode 100644 src/app/shared/menu/providers/access-control.menu.ts create mode 100644 src/app/shared/menu/providers/admin-search.menu.ts create mode 100644 src/app/shared/menu/providers/browse.menu.ts create mode 100644 src/app/shared/menu/providers/comcol-subscribe.menu.ts create mode 100644 src/app/shared/menu/providers/community-list.menu.ts create mode 100644 src/app/shared/menu/providers/curation.menu.ts create mode 100644 src/app/shared/menu/providers/dso-edit.menu.ts create mode 100644 src/app/shared/menu/providers/dso.menu.ts create mode 100644 src/app/shared/menu/providers/edit.menu.ts create mode 100644 src/app/shared/menu/providers/expandable-menu-provider.ts create mode 100644 src/app/shared/menu/providers/export.menu.ts create mode 100644 src/app/shared/menu/providers/health.menu.ts create mode 100644 src/app/shared/menu/providers/import.menu.ts create mode 100644 src/app/shared/menu/providers/item-claim.menu.ts create mode 100644 src/app/shared/menu/providers/item-orcid.menu.ts create mode 100644 src/app/shared/menu/providers/item-versioning.menu.ts create mode 100644 src/app/shared/menu/providers/item.menu.ts create mode 100644 src/app/shared/menu/providers/new.menu.ts create mode 100644 src/app/shared/menu/providers/notifications.menu.ts create mode 100644 src/app/shared/menu/providers/processes.menu.ts create mode 100644 src/app/shared/menu/providers/registries.menu.ts create mode 100644 src/app/shared/menu/providers/route-context.menu.ts create mode 100644 src/app/shared/menu/providers/statistics.menu.ts create mode 100644 src/app/shared/menu/providers/system-wide-alert.menu.ts create mode 100644 src/app/shared/menu/providers/workflow.menu.ts diff --git a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts index d6cd803622..3606cb299f 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts @@ -1,5 +1,5 @@ import { Component, Inject, Injector, OnInit } from '@angular/core'; -import { MenuSectionComponent } from '../../../shared/menu/menu-section/menu-section.component'; +import { AbstractMenuSectionComponent } from '../../../shared/menu/menu-section/abstract-menu-section.component'; import { MenuService } from '../../../shared/menu/menu.service'; import { rendersSectionForMenu } from '../../../shared/menu/menu-section.decorator'; import { LinkMenuItemModel } from '../../../shared/menu/menu-item/models/link.model'; @@ -19,7 +19,7 @@ import { Router } from '@angular/router'; }) @rendersSectionForMenu(MenuID.ADMIN, false) -export class AdminSidebarSectionComponent extends MenuSectionComponent implements OnInit { +export class AdminSidebarSectionComponent extends AbstractMenuSectionComponent implements OnInit { /** * This section resides in the Admin Sidebar @@ -33,16 +33,17 @@ export class AdminSidebarSectionComponent extends MenuSectionComponent implement isDisabled: boolean; constructor( - @Inject('sectionDataProvider') menuSection: MenuSection, + @Inject('sectionDataProvider') protected section: MenuSection, protected menuService: MenuService, protected injector: Injector, protected router: Router, ) { - super(menuSection, menuService, injector); - this.itemModel = menuSection.model as LinkMenuItemModel; + super(menuService, injector); + this.itemModel = section.model as LinkMenuItemModel; } ngOnInit(): void { + // todo: should support all menu entries? this.isDisabled = this.itemModel?.disabled || isEmpty(this.itemModel?.link); super.ngOnInit(); } diff --git a/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.html b/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.html index 1f4666bbd0..23f5a958d2 100644 --- a/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.html +++ b/src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.html @@ -13,7 +13,7 @@ (keyup.enter)="toggleSection($event)" >
- +