Skip to content

Commit db9fa05

Browse files
130715: Restored decorators
Co-authored-by: Alexandre Vryghem <alexandre@atmire.com>
1 parent 58a460f commit db9fa05

246 files changed

Lines changed: 1794 additions & 2099 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/app/admin/admin-ldn-services/ldn-services-data/ldn-itemfilters-data.service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Injectable } from '@angular/core';
22
import { Observable } from 'rxjs';
33

4+
import { dataService } from '../../../core/cache/builders/build-decorators';
45
import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service';
56
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
67
import {
@@ -15,12 +16,14 @@ import { RequestService } from '../../../core/data/request.service';
1516
import { HALEndpointService } from '../../../core/shared/hal-endpoint.service';
1617
import { NotificationsService } from '../../../shared/notifications/notifications.service';
1718
import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model';
19+
import { LDN_SERVICE_CONSTRAINT_FILTERS } from '../ldn-services-model/ldn-service.resource-type';
1820
import { Itemfilter } from '../ldn-services-model/ldn-service-itemfilters';
1921

2022
/**
2123
* A service responsible for fetching/sending data from/to the REST API on the itemfilters endpoint
2224
*/
2325
@Injectable({ providedIn: 'root' })
26+
@dataService(LDN_SERVICE_CONSTRAINT_FILTERS)
2427
export class LdnItemfiltersService extends IdentifiableDataService<Itemfilter> implements FindAllData<Itemfilter> {
2528
private findAllData: FindAllDataImpl<Itemfilter>;
2629

src/app/admin/admin-ldn-services/ldn-services-data/ldn-services-data.service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
take,
77
} from 'rxjs/operators';
88

9+
import { dataService } from '../../../core/cache/builders/build-decorators';
910
import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service';
1011
import { RequestParam } from '../../../core/cache/models/request-param.model';
1112
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
@@ -41,6 +42,7 @@ import { URLCombiner } from '../../../core/url-combiner/url-combiner';
4142
import { NotificationsService } from '../../../shared/notifications/notifications.service';
4243
import { FollowLinkConfig } from '../../../shared/utils/follow-link-config.model';
4344
import { LdnServiceConstrain } from '../ldn-services-model/ldn-service.constrain.model';
45+
import { LDN_SERVICE } from '../ldn-services-model/ldn-service.resource-type';
4446
import { LdnService } from '../ldn-services-model/ldn-services.model';
4547

4648
/**
@@ -55,6 +57,7 @@ import { LdnService } from '../ldn-services-model/ldn-services.model';
5557
* @implements {CreateData<LdnService>}
5658
*/
5759
@Injectable({ providedIn: 'root' })
60+
@dataService(LDN_SERVICE)
5861
export class LdnServicesService extends IdentifiableDataService<LdnService> implements FindAllData<LdnService>, DeleteData<LdnService>, PatchData<LdnService>, CreateData<LdnService> {
5962
createData: CreateDataImpl<LdnService>;
6063
private findAllData: FindAllDataImpl<LdnService>;

src/app/admin/admin-notify-dashboard/admin-notify-search-result/admin-notify-search-result.component.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ import {
1717
} from 'rxjs';
1818

1919
import { PaginatedList } from '../../../core/data/paginated-list.model';
20+
import { Context } from '../../../core/shared/context.model';
2021
import { SearchConfigurationService } from '../../../core/shared/search/search-configuration.service';
22+
import { ViewMode } from '../../../core/shared/view-mode.model';
2123
import { SEARCH_CONFIG_SERVICE } from '../../../my-dspace-page/my-dspace-configuration.service';
24+
import { tabulatableObjectsComponent } from '../../../shared/object-collection/shared/tabulatable-objects/tabulatable-objects.decorator';
2225
import { TabulatableResultListElementsComponent } from '../../../shared/object-list/search-result-list-element/tabulatable-search-result/tabulatable-result-list-elements.component';
2326
import { TruncatableComponent } from '../../../shared/truncatable/truncatable.component';
2427
import { TruncatablePartComponent } from '../../../shared/truncatable/truncatable-part/truncatable-part.component';
@@ -50,6 +53,7 @@ import { AdminNotifyMessagesService } from '../services/admin-notify-messages.se
5053
/**
5154
* Component for visualization in table format of the search results related to the AdminNotifyDashboardComponent
5255
*/
56+
@tabulatableObjectsComponent(AdminNotifySearchResult, ViewMode.Table, Context.CoarNotify)
5357
export class AdminNotifySearchResultComponent extends TabulatableResultListElementsComponent<PaginatedList<AdminNotifySearchResult>, AdminNotifySearchResult> implements OnInit, OnDestroy{
5458
public messagesSubject$: BehaviorSubject<AdminNotifyMessage[]> = new BehaviorSubject([]);
5559
public reprocessStatus = 'QUEUE_STATUS_QUEUED_FOR_RETRY';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { SearchResult } from '../../../shared/search/models/search-result.model';
2+
import { searchResultFor } from '../../../shared/search/search-result-element-decorator';
23
import { AdminNotifyMessage } from './admin-notify-message.model';
34

5+
@searchResultFor(AdminNotifyMessage)
46
export class AdminNotifySearchResult extends SearchResult<AdminNotifyMessage> {
57
}

src/app/admin/admin-notify-dashboard/services/admin-notify-messages.service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
tap,
1414
} from 'rxjs/operators';
1515

16+
import { dataService } from '../../../core/cache/builders/build-decorators';
1617
import { RemoteDataBuildService } from '../../../core/cache/builders/remote-data-build.service';
1718
import { ObjectCacheService } from '../../../core/cache/object-cache.service';
1819
import { IdentifiableDataService } from '../../../core/data/base/identifiable-data.service';
@@ -28,6 +29,7 @@ import {
2829
import { NotificationsService } from '../../../shared/notifications/notifications.service';
2930
import { LdnServicesService } from '../../admin-ldn-services/ldn-services-data/ldn-services-data.service';
3031
import { AdminNotifyMessage } from '../models/admin-notify-message.model';
32+
import { ADMIN_NOTIFY_MESSAGE } from '../models/admin-notify-message.resource-type';
3133

3234
/**
3335
* Injectable service responsible for fetching/sending data from/to the REST API on the messages' endpoint.
@@ -37,6 +39,7 @@ import { AdminNotifyMessage } from '../models/admin-notify-message.model';
3739
* @extends {IdentifiableDataService<AdminNotifyMessage>}
3840
*/
3941
@Injectable({ providedIn: 'root' })
42+
@dataService(ADMIN_NOTIFY_MESSAGE)
4043
export class AdminNotifyMessagesService extends IdentifiableDataService<AdminNotifyMessage> {
4144

4245
protected reprocessEndpoint = 'enqueueretry';

src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.spec.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { RemoteData } from '../../../../../core/data/remote-data';
1616
import { Bitstream } from '../../../../../core/shared/bitstream.model';
1717
import { FileService } from '../../../../../core/shared/file.service';
1818
import { Item } from '../../../../../core/shared/item.model';
19-
import { ListableModule } from '../../../../../core/shared/listable.module';
2019
import { ViewMode } from '../../../../../core/shared/view-mode.model';
2120
import { mockTruncatableService } from '../../../../../shared/mocks/mock-trucatable.service';
2221
import { getMockThemeService } from '../../../../../shared/mocks/theme-service.mock';
@@ -59,7 +58,6 @@ describe('ItemAdminSearchResultGridElementComponent', () => {
5958
NoopAnimationsModule,
6059
TranslateModule.forRoot(),
6160
RouterTestingModule.withRoutes([]),
62-
ListableModule,
6361
ItemAdminSearchResultGridElementComponent,
6462
],
6563
providers: [

src/app/admin/admin-search-page/admin-search-results/admin-search-result-grid-element/item-search-result/item-admin-search-result-grid-element.component.ts

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import {
66
OnInit,
77
ViewChild,
88
} from '@angular/core';
9+
import {
10+
from,
11+
Observable,
12+
} from 'rxjs';
13+
import { take } from 'rxjs/operators';
914

1015
import { DSONameService } from '../../../../../core/breadcrumbs/dso-name.service';
1116
import { BitstreamDataService } from '../../../../../core/data/bitstream-data.service';
@@ -60,25 +65,27 @@ export class ItemAdminSearchResultGridElementComponent extends SearchResultGridE
6065
*/
6166
ngOnInit(): void {
6267
super.ngOnInit();
63-
const component: GenericConstructor<Component> = this.getComponent();
68+
const component$: Observable<GenericConstructor<Component>> = from(this.getComponent());
6469

65-
const viewContainerRef = this.dynamicComponentLoaderDirective.viewContainerRef;
66-
viewContainerRef.clear();
70+
component$.pipe(take(1)).subscribe((component) => {
71+
const viewContainerRef = this.dynamicComponentLoaderDirective.viewContainerRef;
72+
viewContainerRef.clear();
6773

68-
this.compRef = viewContainerRef.createComponent(
69-
component, {
70-
index: 0,
71-
injector: undefined,
72-
projectableNodes: [
73-
[this.badges.nativeElement],
74-
[this.buttons.nativeElement],
75-
],
76-
},
77-
);
78-
this.compRef.setInput('object',this.object);
79-
this.compRef.setInput('index', this.index);
80-
this.compRef.setInput('linkType', this.linkType);
81-
this.compRef.setInput('listID', this.listID);
74+
this.compRef = viewContainerRef.createComponent(
75+
component, {
76+
index: 0,
77+
injector: undefined,
78+
projectableNodes: [
79+
[this.badges.nativeElement],
80+
[this.buttons.nativeElement],
81+
],
82+
},
83+
);
84+
this.compRef.setInput('object',this.object);
85+
this.compRef.setInput('index', this.index);
86+
this.compRef.setInput('linkType', this.linkType);
87+
this.compRef.setInput('listID', this.listID);
88+
});
8289
}
8390

8491
ngOnDestroy(): void {
@@ -92,7 +99,7 @@ export class ItemAdminSearchResultGridElementComponent extends SearchResultGridE
9299
* Fetch the component depending on the item's entity type, view mode and context
93100
* @returns {GenericConstructor<Component>}
94101
*/
95-
private getComponent(): GenericConstructor<Component> {
102+
private getComponent(): Promise<GenericConstructor<Component>> {
96103
return getListableObjectComponent(this.object.getRenderTypes(), ViewMode.GridElement, undefined, this.themeService.getThemeName());
97104
}
98105
}

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ import {
66
} from '@angular/core/testing';
77
import { By } from '@angular/platform-browser';
88
import { NoopAnimationsModule } from '@angular/platform-browser/animations';
9-
import { RouterTestingModule } from '@angular/router/testing';
9+
import { RouterModule } from '@angular/router';
1010
import { TranslateModule } from '@ngx-translate/core';
1111

1212
import { MenuService } from '../../../shared/menu/menu.service';
13+
import { MenuSection } from '../../../shared/menu/menu-section.model';
14+
import { getMockThemeService } from '../../../shared/mocks/theme-service.mock';
1315
import { CSSVariableService } from '../../../shared/sass-helper/css-variable.service';
1416
import { CSSVariableServiceStub } from '../../../shared/testing/css-variable-service.stub';
1517
import { MenuServiceStub } from '../../../shared/testing/menu-service.stub';
18+
import { ThemeService } from '../../../shared/theme-support/theme.service';
1619
import { AdminSidebarSectionComponent } from './admin-sidebar-section.component';
1720

1821
describe('AdminSidebarSectionComponent', () => {
@@ -25,19 +28,26 @@ describe('AdminSidebarSectionComponent', () => {
2528

2629
beforeEach(waitForAsync(() => {
2730
TestBed.configureTestingModule({
28-
imports: [NoopAnimationsModule, RouterTestingModule, TranslateModule.forRoot(), AdminSidebarSectionComponent, TestComponent],
31+
imports: [NoopAnimationsModule, RouterModule.forRoot([]), TranslateModule.forRoot(), AdminSidebarSectionComponent, TestComponent],
2932
providers: [
30-
{ provide: 'sectionDataProvider', useValue: { model: { link: 'google.com' }, icon: iconString } },
3133
{ provide: MenuService, useValue: menuService },
3234
{ provide: CSSVariableService, useClass: CSSVariableServiceStub },
35+
{ provide: ThemeService, useValue: getMockThemeService() },
3336
],
3437
}).compileComponents();
3538
}));
3639

3740
beforeEach(() => {
3841
fixture = TestBed.createComponent(AdminSidebarSectionComponent);
3942
component = fixture.componentInstance;
40-
spyOn(component as any, 'getMenuItemComponent').and.returnValue(TestComponent);
43+
component.section = {
44+
model: {
45+
link: 'google.com',
46+
},
47+
icon: iconString,
48+
} as MenuSection;
49+
component.itemModel = component.section.model;
50+
spyOn(component, 'getMenuItemComponent').and.returnValue(Promise.resolve(TestComponent));
4151
fixture.detectChanges();
4252
});
4353

@@ -59,19 +69,27 @@ describe('AdminSidebarSectionComponent', () => {
5969

6070
beforeEach(waitForAsync(() => {
6171
TestBed.configureTestingModule({
62-
imports: [NoopAnimationsModule, RouterTestingModule, TranslateModule.forRoot(), AdminSidebarSectionComponent, TestComponent],
72+
imports: [NoopAnimationsModule, RouterModule.forRoot([]), TranslateModule.forRoot(), AdminSidebarSectionComponent, TestComponent],
6373
providers: [
64-
{ provide: 'sectionDataProvider', useValue: { model: { link: 'google.com', disabled: true }, icon: iconString } },
6574
{ provide: MenuService, useValue: menuService },
6675
{ provide: CSSVariableService, useClass: CSSVariableServiceStub },
76+
{ provide: ThemeService, useValue: getMockThemeService() },
6777
],
6878
}).compileComponents();
6979
}));
7080

7181
beforeEach(() => {
7282
fixture = TestBed.createComponent(AdminSidebarSectionComponent);
7383
component = fixture.componentInstance;
74-
spyOn(component as any, 'getMenuItemComponent').and.returnValue(TestComponent);
84+
component.section = {
85+
model: {
86+
link: 'google.com',
87+
disabled: true,
88+
},
89+
icon: iconString,
90+
} as MenuSection;
91+
component.itemModel = component.section.model;
92+
spyOn(component, 'getMenuItemComponent').and.returnValue(Promise.resolve(TestComponent));
7593
fixture.detectChanges();
7694
});
7795

@@ -97,7 +115,7 @@ describe('AdminSidebarSectionComponent', () => {
97115
template: ``,
98116
standalone: true,
99117
imports: [
100-
RouterTestingModule,
118+
RouterModule,
101119
],
102120
})
103121
class TestComponent {

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

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { NgClass } from '@angular/common';
22
import {
33
Component,
4-
Inject,
54
Injector,
5+
OnChanges,
66
OnInit,
77
} from '@angular/core';
88
import {
@@ -14,9 +14,10 @@ import { TranslateModule } from '@ngx-translate/core';
1414
import { isEmpty } from '../../../shared/empty.util';
1515
import { MenuService } from '../../../shared/menu/menu.service';
1616
import { MenuID } from '../../../shared/menu/menu-id.model';
17-
import { LinkMenuItemModel } from '../../../shared/menu/menu-item/models/link.model';
17+
import { rendersSectionForMenu } from '../../../shared/menu/menu-section.decorator';
1818
import { MenuSection } from '../../../shared/menu/menu-section.model';
1919
import { AbstractMenuSectionComponent } from '../../../shared/menu/menu-section/abstract-menu-section.component';
20+
import { ThemeService } from '../../../shared/theme-support/theme.service';
2021
import { BrowserOnlyPipe } from '../../../shared/utils/browser-only.pipe';
2122

2223
/**
@@ -35,27 +36,30 @@ import { BrowserOnlyPipe } from '../../../shared/utils/browser-only.pipe';
3536
],
3637

3738
})
38-
export class AdminSidebarSectionComponent extends AbstractMenuSectionComponent implements OnInit {
39+
@rendersSectionForMenu(MenuID.ADMIN, false)
40+
export class AdminSidebarSectionComponent extends AbstractMenuSectionComponent implements OnInit, OnChanges {
3941

4042
/**
4143
* This section resides in the Admin Sidebar
4244
*/
4345
menuID: MenuID = MenuID.ADMIN;
44-
itemModel;
4546

4647
/**
4748
* Boolean to indicate whether this section is disabled
4849
*/
4950
isDisabled: boolean;
5051

5152
constructor(
52-
@Inject('sectionDataProvider') protected section: MenuSection,
5353
protected menuService: MenuService,
5454
protected injector: Injector,
55+
protected themeService: ThemeService,
5556
protected router: Router,
5657
) {
57-
super(menuService, injector);
58-
this.itemModel = section.model as LinkMenuItemModel;
58+
super(
59+
menuService,
60+
injector,
61+
themeService,
62+
);
5963
}
6064

6165
ngOnInit(): void {

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ <h4 class="my-1">{{ 'menu.header.admin' | translate }}</h4>
2626
<div class="sidebar-full-width-container" id="sidebar-top-level-items-container">
2727
<div class="sidebar-full-width-container" id="sidebar-top-level-items" role="menubar"
2828
[attr.aria-label]="'menu.header.admin.description' |translate">
29-
@for (section of (sections | async); track section) {
30-
<ng-container
31-
*ngComponentOutlet="(sectionMap$ | async).get(section.id).component; injector: (sectionMap$ | async).get(section.id).injector;"></ng-container>
29+
@for (sectionDTO of (sectionDTOs$ | async); track sectionDTO) {
30+
<ds-menu-component-loader [menuID]="menuID"
31+
[expandable]="sectionDTO.hasSubSections || sectionDTO.menuSection.alwaysRenderExpandable"
32+
[section]="sectionDTO.menuSection">
33+
</ds-menu-component-loader>
3234
}
3335
</div>
3436
</div>

0 commit comments

Comments
 (0)