Skip to content

Commit b8bb3ff

Browse files
committed
Merge branch 'w2p-121550_refactor-menu-resolvers-7.6_option-1' into refactor-menu-resolvers-7.6_sketch-branch
2 parents 4729ae9 + d85d5fb commit b8bb3ff

12 files changed

Lines changed: 96 additions & 33 deletions

src/app/app.menus.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@ import { RegistriesMenuProvider } from './shared/menu/providers/registries.menu'
2727
import { StatisticsMenuProvider } from './shared/menu/providers/statistics.menu';
2828
import { SystemWideAlertMenuProvider } from './shared/menu/providers/system-wide-alert.menu';
2929
import { WorkflowMenuProvider } from './shared/menu/providers/workflow.menu';
30-
import { COMMUNITY_MODULE_PATH } from './community-page/community-page-routing-paths';
31-
import { COLLECTION_MODULE_PATH } from './collection-page/collection-page-routing-paths';
32-
import { ENTITY_MODULE_PATH, ITEM_MODULE_PATH } from './item-page/item-page-routing-paths';
3330
import { DsoOptionMenu } from './shared/menu/providers/dso-option.menu';
31+
import { MenuRoute } from './shared/menu/menu-route.model';
3432

3533
export const MENUS = buildMenuStructure({
3634
[MenuID.PUBLIC]: [
@@ -54,11 +52,29 @@ export const MENUS = buildMenuStructure({
5452
],
5553
[MenuID.DSO_EDIT]: [
5654
DsoOptionMenu.withSubs([
57-
SubscribeMenuProvider.onRoute(COMMUNITY_MODULE_PATH, COLLECTION_MODULE_PATH),
58-
DSpaceObjectEditMenuProvider.onRoute(COMMUNITY_MODULE_PATH, COLLECTION_MODULE_PATH, ITEM_MODULE_PATH, ENTITY_MODULE_PATH),
59-
VersioningMenuProvider.onRoute(ITEM_MODULE_PATH, ENTITY_MODULE_PATH),
60-
OrcidMenuProvider.onRoute(ITEM_MODULE_PATH, ENTITY_MODULE_PATH),
61-
ClaimMenuProvider.onRoute(ITEM_MODULE_PATH, ENTITY_MODULE_PATH, COLLECTION_MODULE_PATH),
55+
SubscribeMenuProvider.onRoute(
56+
MenuRoute.SIMPLE_COMMUNITY_PAGE,
57+
MenuRoute.SIMPLE_COLLECTION_PAGE,
58+
),
59+
DSpaceObjectEditMenuProvider.onRoute(
60+
MenuRoute.SIMPLE_COMMUNITY_PAGE,
61+
MenuRoute.SIMPLE_COLLECTION_PAGE,
62+
MenuRoute.SIMPLE_ITEM_PAGE,
63+
MenuRoute.FULL_ITEM_PAGE,
64+
),
65+
VersioningMenuProvider.onRoute(
66+
MenuRoute.SIMPLE_ITEM_PAGE,
67+
MenuRoute.FULL_ITEM_PAGE,
68+
),
69+
OrcidMenuProvider.onRoute(
70+
MenuRoute.SIMPLE_ITEM_PAGE,
71+
MenuRoute.FULL_ITEM_PAGE,
72+
),
73+
ClaimMenuProvider.onRoute(
74+
MenuRoute.SIMPLE_ITEM_PAGE,
75+
MenuRoute.FULL_ITEM_PAGE,
76+
MenuRoute.SIMPLE_COLLECTION_PAGE,
77+
),
6278
]),
6379
],
6480
});

src/app/collection-page/collection-page-routing.module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { DeleteCollectionPageComponent } from './delete-collection-page/delete-c
1919
import { ItemTemplatePageResolver } from './edit-item-template-page/item-template-page.resolver';
2020
import { ThemedEditItemTemplatePageComponent } from './edit-item-template-page/themed-edit-item-template-page.component';
2121
import { ThemedCollectionPageComponent } from './themed-collection-page.component';
22+
import { MenuRoute } from '../shared/menu/menu-route.model';
2223

2324
@NgModule({
2425
imports: [
@@ -62,6 +63,9 @@ import { ThemedCollectionPageComponent } from './themed-collection-page.componen
6263
path: '',
6364
component: ThemedCollectionPageComponent,
6465
pathMatch: 'full',
66+
data: {
67+
menuRoute: MenuRoute.SIMPLE_COLLECTION_PAGE,
68+
},
6569
}
6670
],
6771
},

src/app/community-page/community-page-routing.module.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { CreateCommunityPageComponent } from './create-community-page/create-com
1515
import { CreateCommunityPageGuard } from './create-community-page/create-community-page.guard';
1616
import { DeleteCommunityPageComponent } from './delete-community-page/delete-community-page.component';
1717
import { ThemedCommunityPageComponent } from './themed-community-page.component';
18+
import { MenuRoute } from '../shared/menu/menu-route.model';
1819

1920
@NgModule({
2021
imports: [
@@ -48,6 +49,9 @@ import { ThemedCommunityPageComponent } from './themed-community-page.component'
4849
path: '',
4950
component: ThemedCommunityPageComponent,
5051
pathMatch: 'full',
52+
data: {
53+
menuRoute: MenuRoute.SIMPLE_COMMUNITY_PAGE,
54+
},
5155
}
5256
],
5357
},

src/app/item-page/item-page-routing.module.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { OrcidPageGuard } from './orcid-page/orcid-page.guard';
1818
import { ThemedItemPageComponent } from './simple/themed-item-page.component';
1919
import { VersionPageComponent } from './version-page/version-page/version-page.component';
2020
import { VersionResolver } from './version-page/version.resolver';
21+
import { MenuRoute } from '../shared/menu/menu-route.model';
2122

2223
@NgModule({
2324
imports: [
@@ -34,10 +35,16 @@ import { VersionResolver } from './version-page/version.resolver';
3435
path: '',
3536
component: ThemedItemPageComponent,
3637
pathMatch: 'full',
38+
data: {
39+
menuRoute: MenuRoute.SIMPLE_ITEM_PAGE,
40+
},
3741
},
3842
{
3943
path: 'full',
4044
component: ThemedFullItemPageComponent,
45+
data: {
46+
menuRoute: MenuRoute.FULL_ITEM_PAGE,
47+
},
4148
},
4249
{
4350
path: ITEM_EDIT_PATH,

src/app/shared/menu/menu-provider.model.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Observable, } from 'rxjs';
1111
import { MenuID } from './menu-id.model';
1212
import { MenuItemModels } from './menu-section.model';
1313
import { Type } from '@angular/core';
14+
import { MenuRoute } from './menu-route.model';
1415

1516
/**
1617
* Partial menu section
@@ -52,7 +53,7 @@ export interface MenuProvider {
5253
*/
5354
export class MenuProviderTypeWithOptions {
5455
providerType: Type<MenuProvider>;
55-
paths?: string[];
56+
paths?: MenuRoute[];
5657
childProviderTypes?: (Type<MenuProvider> | MenuProviderTypeWithOptions)[];
5758

5859
}
@@ -90,7 +91,7 @@ export abstract class AbstractMenuProvider implements MenuProvider {
9091
* This will be automatically set based on the paths added based on the paths provided through the 'onRoute' static
9192
* method in the app.menus.ts file
9293
*/
93-
activePaths?: string[];
94+
activePaths?: MenuRoute[];
9495

9596
/**
9697
* The ID of the parent provider of this provider.
@@ -110,7 +111,7 @@ export abstract class AbstractMenuProvider implements MenuProvider {
110111
* Static method to be called from the app.menus.ts file to define paths on which this provider should the active
111112
* @param paths - The paths on which the sections of this provider should be active
112113
*/
113-
public static onRoute(...paths: string[]): MenuProviderTypeWithOptions {
114+
public static onRoute(...paths: MenuRoute[]): MenuProviderTypeWithOptions {
114115
if (!AbstractMenuProvider.isPrototypeOf(this)) {
115116
throw new Error(
116117
'onRoute should only be called from concrete subclasses of AbstractMenuProvider'

src/app/shared/menu/menu-provider.service.spec.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { waitForAsync } from '@angular/core/testing';
77
import { MenuProviderService } from './menu-provider.service';
88
import { MenuService } from './menu.service';
99
import { COMMUNITY_MODULE_PATH } from '../../community-page/community-page-routing-paths';
10-
import { COLLECTION_MODULE_PATH } from '../../collection-page/collection-page-routing-paths';
10+
import { MenuRoute } from './menu-route.model';
1111

1212
describe('MenuProviderService', () => {
1313

@@ -18,7 +18,7 @@ describe('MenuProviderService', () => {
1818
public shouldPersistOnRouteChange: boolean,
1919
public menuProviderId: string,
2020
public index: number,
21-
public activePaths: string[],
21+
public activePaths: MenuRoute[],
2222
public parentID: string,
2323
public alwaysRenderExpandable: boolean,
2424
public sections: PartialMenuSection[]
@@ -36,7 +36,12 @@ describe('MenuProviderService', () => {
3636
let menuService: MenuService;
3737

3838
const router = {
39-
events: observableOf(new ResolveEnd(1, 'test-url', 'test-url-after-redirect',{url: 'test-url', root: {url: [new UrlSegment('test-url', {})]}} as any ))
39+
events: observableOf(new ResolveEnd(1, 'test-url', 'test-url-after-redirect', {
40+
url: 'test-url',
41+
root: {url: [new UrlSegment('test-url', {})], data: {}
42+
},
43+
data: {}
44+
} as any))
4045
};
4146

4247
const section = {
@@ -59,7 +64,7 @@ describe('MenuProviderService', () => {
5964
const persistentProvider2 = new TestMenuProvider(MenuID.PUBLIC, true, 'provider2', 1, undefined, 'provider1', false, [section]);
6065
const nonPersistentProvider3 = new TestMenuProvider(MenuID.PUBLIC, false, 'provider3', 2, undefined, undefined, false, [section]);
6166
const nonPersistentProvider4 = new TestMenuProvider(MenuID.PUBLIC, false, 'provider4', 3, undefined, 'provider3', false, [section]);
62-
const nonPersistentProvider5WithRoutes = new TestMenuProvider(MenuID.PUBLIC, false, 'provider4', 3, [COMMUNITY_MODULE_PATH, COLLECTION_MODULE_PATH], undefined, false, [section]);
67+
const nonPersistentProvider5WithRoutes = new TestMenuProvider(MenuID.PUBLIC, false, 'provider4', 3, [MenuRoute.SIMPLE_COMMUNITY_PAGE, MenuRoute.SIMPLE_COLLECTION_PAGE,], undefined, false, [section]);
6368

6469
const listOfProvider = [persistentProvider1, persistentProvider2, nonPersistentProvider3, nonPersistentProvider4, nonPersistentProvider5WithRoutes];
6570

@@ -110,7 +115,7 @@ describe('MenuProviderService', () => {
110115

111116
describe('resolveRouteMenus with no matching path specific providers', () => {
112117
it('should remove the current non persistent menus and add the general non persistent menus', () => {
113-
const route = {};
118+
const route = {data:{}};
114119
const state = {url: 'test-url'};
115120
menuProviderService.resolveRouteMenus(route as any, state as any).subscribe();
116121

@@ -128,7 +133,7 @@ describe('MenuProviderService', () => {
128133

129134
describe('resolveRouteMenus with a matching path specific provider', () => {
130135
it('should remove the current non persistent menus and add the general non persistent menus', () => {
131-
const route = {};
136+
const route = {data:{ menuRoute: MenuRoute.SIMPLE_COMMUNITY_PAGE}};
132137
const state = {url: `xxxx/${COMMUNITY_MODULE_PATH}/xxxxxx`};
133138
menuProviderService.resolveRouteMenus(route as any, state as any).subscribe();
134139

src/app/shared/menu/menu-provider.service.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { AbstractMenuProvider, PartialMenuSection } from './menu-provider.model'
1616
import { MenuState } from './menu-state.model';
1717
import { MenuService } from './menu.service';
1818
import { MENU_PROVIDER } from './menu.structure';
19+
import { MenuRoute } from './menu-route.model';
1920

2021
/**
2122
* Service that is responsible for adding and removing the menu sections created by the providers, both for
@@ -126,8 +127,8 @@ export class MenuProviderService {
126127
.filter(provider => {
127128
let shouldUpdate = false;
128129
if (!provider.shouldPersistOnRouteChange && isNotEmpty(provider.activePaths)) {
129-
provider.activePaths.forEach((path) => {
130-
if (state.url.includes(path)) {
130+
provider.activePaths.forEach((path: MenuRoute) => {
131+
if (route.data.menuRoute === path) {
131132
shouldUpdate = true;
132133
}
133134
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
/**
2+
* The menu route IDs that can be used for route resolvers
3+
*/
4+
export enum MenuRoute {
5+
SIMPLE_COMMUNITY_PAGE = 'simple-community-page',
6+
SIMPLE_COLLECTION_PAGE = 'simple-collection-page',
7+
SIMPLE_ITEM_PAGE = 'simple-item-page',
8+
FULL_ITEM_PAGE = 'full-item-page',
9+
}

src/app/shared/menu/menu.structure.spec.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import { CommunityListMenuProvider } from './providers/community-list.menu';
33
import { NewMenuProvider } from './providers/new.menu';
44
import { DsoOptionMenu } from './providers/dso-option.menu';
55
import { SubscribeMenuProvider } from './providers/comcol-subscribe.menu';
6-
import { COMMUNITY_MODULE_PATH } from '../../community-page/community-page-routing-paths';
7-
import { COLLECTION_MODULE_PATH } from '../../collection-page/collection-page-routing-paths';
86
import { buildMenuStructure } from './menu.structure';
97
import { MenuProviderService } from './menu-provider.service';
108
import { BrowseMenuProvider } from './providers/browse.menu';
@@ -21,10 +19,10 @@ import { WorkflowMenuProvider } from './providers/workflow.menu';
2119
import { HealthMenuProvider } from './providers/health.menu';
2220
import { SystemWideAlertMenuProvider } from './providers/system-wide-alert.menu';
2321
import { DSpaceObjectEditMenuProvider } from './providers/dso-edit.menu';
24-
import { ENTITY_MODULE_PATH, ITEM_MODULE_PATH } from '../../item-page/item-page-routing-paths';
2522
import { VersioningMenuProvider } from './providers/item-versioning.menu';
2623
import { OrcidMenuProvider } from './providers/item-orcid.menu';
2724
import { ClaimMenuProvider } from './providers/item-claim.menu';
25+
import { MenuRoute } from './menu-route.model';
2826

2927
describe('buildMenuStructure', () => {
3028
const providerStructure =
@@ -50,11 +48,29 @@ describe('buildMenuStructure', () => {
5048
],
5149
[MenuID.DSO_EDIT]: [
5250
DsoOptionMenu.withSubs([
53-
SubscribeMenuProvider.onRoute(COMMUNITY_MODULE_PATH, COLLECTION_MODULE_PATH),
54-
DSpaceObjectEditMenuProvider.onRoute(COMMUNITY_MODULE_PATH, COLLECTION_MODULE_PATH, ITEM_MODULE_PATH, ENTITY_MODULE_PATH),
55-
VersioningMenuProvider.onRoute(ITEM_MODULE_PATH, ENTITY_MODULE_PATH),
56-
OrcidMenuProvider.onRoute(ITEM_MODULE_PATH, ENTITY_MODULE_PATH),
57-
ClaimMenuProvider.onRoute(ITEM_MODULE_PATH, ENTITY_MODULE_PATH, COLLECTION_MODULE_PATH),
51+
SubscribeMenuProvider.onRoute(
52+
MenuRoute.SIMPLE_COMMUNITY_PAGE,
53+
MenuRoute.SIMPLE_COLLECTION_PAGE
54+
),
55+
DSpaceObjectEditMenuProvider.onRoute(
56+
MenuRoute.SIMPLE_COMMUNITY_PAGE,
57+
MenuRoute.SIMPLE_COLLECTION_PAGE,
58+
MenuRoute.SIMPLE_ITEM_PAGE,
59+
MenuRoute.FULL_ITEM_PAGE,
60+
),
61+
VersioningMenuProvider.onRoute(
62+
MenuRoute.SIMPLE_ITEM_PAGE,
63+
MenuRoute.FULL_ITEM_PAGE,
64+
),
65+
OrcidMenuProvider.onRoute(
66+
MenuRoute.SIMPLE_ITEM_PAGE,
67+
MenuRoute.FULL_ITEM_PAGE,
68+
),
69+
ClaimMenuProvider.onRoute(
70+
MenuRoute.SIMPLE_ITEM_PAGE,
71+
MenuRoute.FULL_ITEM_PAGE,
72+
MenuRoute.SIMPLE_COLLECTION_PAGE,
73+
),
5874
]),
5975
],
6076
};

src/app/shared/menu/menu.structure.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { MenuID } from './menu-id.model';
1010
import { AbstractMenuProvider, MenuProviderTypeWithOptions } from './menu-provider.model';
1111
import { MenuProviderService } from './menu-provider.service';
1212
import { hasValue, isNotEmpty } from '../empty.util';
13+
import { MenuRoute } from './menu-route.model';
1314

1415
export const MENU_PROVIDER = new InjectionToken<AbstractMenuProvider>('MENU_PROVIDER');
1516

@@ -75,7 +76,7 @@ function processProviderType(providers: Provider[], menuID: string, providerType
7576
* @param hasSubProviders - Whether this provider has sub providers
7677
* @param paths - The paths this provider should be active on if relevant
7778
*/
78-
function addProviderToList(providers: Provider[], providerType: Type<AbstractMenuProvider>, menuID: string, index: number, parentID?: string, hasSubProviders?: boolean, paths?: string[]) {
79+
function addProviderToList(providers: Provider[], providerType: Type<AbstractMenuProvider>, menuID: string, index: number, parentID?: string, hasSubProviders?: boolean, paths?: MenuRoute[]) {
7980
const resolvedProvider = {
8081
provide: MENU_PROVIDER,
8182
multi: true,

0 commit comments

Comments
 (0)