Skip to content

Commit 9c8fdb8

Browse files
[LM-46] change menu-item type to external menu item and with no parent
1 parent 3de8e2b commit 9c8fdb8

7 files changed

Lines changed: 47 additions & 23 deletions

src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
[attr.aria-disabled]="isDisabled"
55
[attr.aria-labelledby]="'sidebarName-' + section.id"
66
[title]="('menu.section.icon.' + section.id) | translate"
7-
[routerLink]="itemModel.link"
7+
[routerLink]="itemModel.link ?? itemModel.href"
88
(keyup.space)="navigate($event)"
99
(keyup.enter)="navigate($event)"
1010
href="javascript:void(0);"
@@ -21,3 +21,4 @@
2121
</div>
2222
</a>
2323
</div>
24+

src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,31 @@ import { AdminSidebarSectionComponent } from './admin-sidebar-section.component'
1010
import { RouterTestingModule } from '@angular/router/testing';
1111
import { By } from '@angular/platform-browser';
1212
import { TranslateModule } from '@ngx-translate/core';
13+
import { of } from 'rxjs';
14+
import { HardRedirectService } from '../../../core/services/hard-redirect.service';
1315

1416
describe('AdminSidebarSectionComponent', () => {
1517
let component: AdminSidebarSectionComponent;
1618
let fixture: ComponentFixture<AdminSidebarSectionComponent>;
1719
const menuService = new MenuServiceStub();
1820
const iconString = 'test';
1921

22+
const hardRedirectService = jasmine.createSpyObj('HardRedirectService', {
23+
redirect: of({})
24+
});
25+
2026
describe('when not disabled', () => {
2127

2228
beforeEach(waitForAsync(() => {
29+
2330
TestBed.configureTestingModule({
2431
imports: [NoopAnimationsModule, RouterTestingModule, TranslateModule.forRoot()],
2532
declarations: [AdminSidebarSectionComponent, TestComponent],
2633
providers: [
2734
{provide: 'sectionDataProvider', useValue: {model: {link: 'google.com'}, icon: iconString}},
2835
{provide: MenuService, useValue: menuService},
2936
{provide: CSSVariableService, useClass: CSSVariableServiceStub},
37+
{provide: HardRedirectService, useValue: hardRedirectService},
3038
]
3139
}).overrideComponent(AdminSidebarSectionComponent, {
3240
set: {
@@ -67,6 +75,7 @@ describe('AdminSidebarSectionComponent', () => {
6775
{provide: 'sectionDataProvider', useValue: {model: {link: 'google.com', disabled: true}, icon: iconString}},
6876
{provide: MenuService, useValue: menuService},
6977
{provide: CSSVariableService, useClass: CSSVariableServiceStub},
78+
{provide: HardRedirectService, useValue: hardRedirectService},
7079
]
7180
}).overrideComponent(AdminSidebarSectionComponent, {
7281
set: {

src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, Inject, Injector, OnInit } from '@angular/core';
1+
import { Component, Inject, Injector, OnInit, Optional } from '@angular/core';
22
import { MenuSectionComponent } from '../../../shared/menu/menu-section/menu-section.component';
33
import { MenuService } from '../../../shared/menu/menu.service';
44
import { rendersSectionForMenu } from '../../../shared/menu/menu-section.decorator';
@@ -7,6 +7,8 @@ import { MenuSection } from '../../../shared/menu/menu-section.model';
77
import { MenuID } from '../../../shared/menu/menu-id.model';
88
import { isEmpty } from '../../../shared/empty.util';
99
import { Router } from '@angular/router';
10+
import { ExternalLinkMenuItemModel } from '../../../shared/menu/menu-item/models/external-link.model';
11+
import { HardRedirectService } from '../../../core/services/hard-redirect.service';
1012

1113
/**
1214
* Represents a non-expandable section in the admin sidebar
@@ -36,20 +38,33 @@ export class AdminSidebarSectionComponent extends MenuSectionComponent implement
3638
protected menuService: MenuService,
3739
protected injector: Injector,
3840
protected router: Router,
41+
protected hardRedirectService: HardRedirectService,
3942
) {
4043
super(menuSection, menuService, injector);
41-
this.itemModel = menuSection.model as LinkMenuItemModel;
44+
this.itemModel = menuSection.model as LinkMenuItemModel | ExternalLinkMenuItemModel;
4245
}
4346

4447
ngOnInit(): void {
45-
this.isDisabled = this.itemModel?.disabled || isEmpty(this.itemModel?.link);
48+
if (this.itemModel instanceof LinkMenuItemModel) {
49+
this.isDisabled = this.itemModel?.disabled || isEmpty(this.itemModel?.link);
50+
} else if (this.itemModel instanceof ExternalLinkMenuItemModel) {
51+
this.isDisabled = this.itemModel?.disabled || isEmpty(this.itemModel?.href);
52+
} else {
53+
this.isDisabled = true;
54+
}
55+
4656
super.ngOnInit();
4757
}
4858

4959
navigate(event: any): void {
5060
event.preventDefault();
5161
if (!this.isDisabled) {
52-
this.router.navigate(this.itemModel.link);
62+
63+
if (this.itemModel instanceof LinkMenuItemModel) {
64+
this.router.navigate([this.itemModel.link]);
65+
} else if (this.itemModel instanceof ExternalLinkMenuItemModel) {
66+
this.hardRedirectService.redirect(this.itemModel.href);
67+
}
5368
}
5469
}
5570
}

src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.spec.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,24 @@ import { MenuService } from '../../../shared/menu/menu.service';
55
import { MenuServiceStub } from '../../../shared/testing/menu-service.stub';
66
import { CSSVariableService } from '../../../shared/sass-helper/css-variable.service';
77
import { CSSVariableServiceStub } from '../../../shared/testing/css-variable-service.stub';
8-
import { of as observableOf } from 'rxjs';
8+
import { of as observableOf, of } from 'rxjs';
99
import { Component } from '@angular/core';
1010
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
1111
import { By } from '@angular/platform-browser';
1212
import { TranslateModule } from '@ngx-translate/core';
1313
import { Router } from '@angular/router';
1414
import { RouterStub } from '../../../shared/testing/router.stub';
15+
import { HardRedirectService } from '../../../core/services/hard-redirect.service';
1516

1617
describe('ExpandableAdminSidebarSectionComponent', () => {
1718
let component: ExpandableAdminSidebarSectionComponent;
1819
let fixture: ComponentFixture<ExpandableAdminSidebarSectionComponent>;
1920
const menuService = new MenuServiceStub();
2021
const iconString = 'test';
22+
const hardRedirectService = jasmine.createSpyObj('HardRedirectService', {
23+
redirect: of({})
24+
});
25+
2126
beforeEach(waitForAsync(() => {
2227
TestBed.configureTestingModule({
2328
imports: [NoopAnimationsModule, TranslateModule.forRoot()],
@@ -27,6 +32,7 @@ describe('ExpandableAdminSidebarSectionComponent', () => {
2732
{ provide: MenuService, useValue: menuService },
2833
{ provide: CSSVariableService, useClass: CSSVariableServiceStub },
2934
{ provide: Router, useValue: new RouterStub() },
35+
{provide: HardRedirectService, useValue: hardRedirectService},
3036
]
3137
}).overrideComponent(ExpandableAdminSidebarSectionComponent, {
3238
set: {

src/app/admin/admin-sidebar/expandable-admin-sidebar-section/expandable-admin-sidebar-section.component.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { map } from 'rxjs/operators';
1010
import { rendersSectionForMenu } from '../../../shared/menu/menu-section.decorator';
1111
import { MenuID } from '../../../shared/menu/menu-id.model';
1212
import { Router } from '@angular/router';
13+
import { HardRedirectService } from '../../../core/services/hard-redirect.service';
1314

1415
/**
1516
* Represents a expandable section in the sidebar
@@ -55,8 +56,9 @@ export class ExpandableAdminSidebarSectionComponent extends AdminSidebarSectionC
5556
private variableService: CSSVariableService,
5657
protected injector: Injector,
5758
protected router: Router,
59+
protected hardRedirectService: HardRedirectService,
5860
) {
59-
super(menuSection, menuService, injector, router);
61+
super(menuSection, menuService, injector, router, hardRedirectService);
6062
}
6163

6264
/**

src/app/menu.resolver.spec.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import { createPaginatedList } from './shared/testing/utils.test';
2020
import { SectionDataService } from './core/layout/section-data.service';
2121
import createSpy = jasmine.createSpy;
2222
import { ConfigurationDataService } from './core/data/configuration-data.service';
23-
import { HardRedirectService } from './core/services/hard-redirect.service';
2423

2524
const BOOLEAN = { t: true, f: false };
2625
const MENU_STATE = {
@@ -71,7 +70,6 @@ describe('MenuResolver', () => {
7170
let authorizationService;
7271
let scriptService;
7372
let configService;
74-
let hardRedirectService;
7573

7674
beforeEach(waitForAsync(() => {
7775
menuService = new MenuServiceStub();
@@ -91,10 +89,6 @@ describe('MenuResolver', () => {
9189
findByPropertyName: observableOf({})
9290
});
9391

94-
hardRedirectService = jasmine.createSpyObj('HardRedirectService', {
95-
redirect: observableOf({})
96-
});
97-
9892
TestBed.configureTestingModule({
9993
imports: [TranslateModule.forRoot(), NoopAnimationsModule, RouterTestingModule],
10094
declarations: [AdminSidebarComponent],
@@ -104,7 +98,6 @@ describe('MenuResolver', () => {
10498
{ provide: AuthorizationDataService, useValue: authorizationService },
10599
{ provide: ScriptDataService, useValue: scriptService },
106100
{ provide: ConfigurationDataService, useValue: configService },
107-
{ provide: HardRedirectService, useValue: hardRedirectService },
108101
{
109102
provide: NgbModal, useValue: {
110103
open: () => {/*comment*/

src/app/menu.resolver.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ import { Section } from './core/layout/models/section.model';
5454
import { NOTIFICATIONS_RECITER_SUGGESTION_PATH } from './admin/admin-notifications/admin-notifications-routing-paths';
5555
import { ConfigurationDataService } from './core/data/configuration-data.service';
5656
import { ConfigurationProperty } from './core/shared/configuration-property.model';
57-
import { HardRedirectService } from './core/services/hard-redirect.service';
57+
import { ExternalLinkMenuItemModel } from './shared/menu/menu-item/models/external-link.model';
5858

5959
/**
6060
* Creates all of the app's menus
@@ -74,7 +74,6 @@ export class MenuResolver implements Resolve<boolean> {
7474
protected scriptDataService: ScriptDataService,
7575
protected sectionDataService: SectionDataService,
7676
protected configService: ConfigurationDataService,
77-
private hardRedirectService: HardRedirectService,
7877
) {
7978
}
8079

@@ -625,17 +624,16 @@ export class MenuResolver implements Resolve<boolean> {
625624
]).subscribe(([authorized, url]) => {
626625
this.menuService.addSection(MenuID.ADMIN, {
627626
id: 'loginmiur_dlexporter_url',
628-
parentID: 'export',
627+
index: 15,
629628
active: false,
630629
visible: authorized && (hasValue(url) && url.length > 0),
631630
model: {
632-
type: MenuItemType.ONCLICK,
631+
type: MenuItemType.EXTERNAL,
633632
text: 'menu.section.loginmiur_dlexporter_url',
634-
function: () => {
635-
// redirect to external URL
636-
this.hardRedirectService.redirect(url);
637-
}
638-
} as OnClickMenuItemModel,
633+
disabled: false,
634+
href: url
635+
} as ExternalLinkMenuItemModel,
636+
icon: 'fa-solid fa-arrows-spin',
639637
shouldPersistOnRouteChange: true
640638
});
641639
});

0 commit comments

Comments
 (0)