diff --git a/src/app/admin/admin-routing-paths.ts b/src/app/admin/admin-routing-paths.ts index 9c4c6eb15a..3c45081d70 100644 --- a/src/app/admin/admin-routing-paths.ts +++ b/src/app/admin/admin-routing-paths.ts @@ -6,7 +6,7 @@ export const REGISTRIES_MODULE_PATH = 'registries'; export const NOTIFICATIONS_MODULE_PATH = 'notifications'; export const LDN_PATH = 'ldn'; export const REPORTS_MODULE_PATH = 'reports'; - +export const NOTIFY_DASHBOARD_MODULE_PATH = 'notify-dashboard'; export function getRegistriesModuleRoute() { diff --git a/src/app/admin/admin-routing.module.ts b/src/app/admin/admin-routing.module.ts index ae7d49a915..05167956db 100644 --- a/src/app/admin/admin-routing.module.ts +++ b/src/app/admin/admin-routing.module.ts @@ -8,7 +8,7 @@ import { I18nBreadcrumbsService } from '../core/breadcrumbs/i18n-breadcrumbs.ser import { AdminCurationTasksComponent } from './admin-curation-tasks/admin-curation-tasks.component'; import { LDN_PATH, - NOTIFICATIONS_MODULE_PATH, + NOTIFICATIONS_MODULE_PATH, NOTIFY_DASHBOARD_MODULE_PATH, REGISTRIES_MODULE_PATH, REPORTS_MODULE_PATH, } from './admin-routing-paths'; import { BatchImportPageComponent } from './admin-import-batch-page/batch-import-page.component'; @@ -88,6 +88,11 @@ import { loadChildren: () => import('./admin-reports/admin-reports.module') .then((m) => m.AdminReportsModule), }, + { + path: NOTIFY_DASHBOARD_MODULE_PATH, + loadChildren: () => import('./admin-notify-dashboard/admin-notify-dashboard.module') + .then((m) => m.AdminNotifyDashboardModule), + }, ]) ], providers: [ diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 7088860674..07cdd99fcf 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -198,6 +198,7 @@ import { NotifyRequestsStatus } from '../item-page/simple/notify-requests-status import { LdnService } from '../admin/admin-ldn-services/ldn-services-model/ldn-services.model'; import { Itemfilter } from '../admin/admin-ldn-services/ldn-services-model/ldn-service-itemfilters'; import { SubmissionCoarNotifyConfig } from '../submission/sections/section-coar-notify/submission-coar-notify.config'; +import { AdminNotifyMessage } from "../admin/admin-notify-dashboard/models/admin-notify-message.model"; /** * When not in production, endpoint responses can be mocked for testing purposes @@ -411,6 +412,7 @@ export const models = Itemfilter, SubmissionCoarNotifyConfig, NotifyRequestsStatus, + AdminNotifyMessage ]; @NgModule({ diff --git a/src/app/menu.resolver.ts b/src/app/menu.resolver.ts index 6793a70856..ef1bd95382 100644 --- a/src/app/menu.resolver.ts +++ b/src/app/menu.resolver.ts @@ -368,18 +368,40 @@ export class MenuResolver implements Resolve { icon: 'terminal', index: 10 }, + /* COAR Notify section */ + { + id: 'coar_notify', + active: false, + visible: isSiteAdmin, + model: { + type: MenuItemType.TEXT, + text: 'menu.section.coar_notify' + } as TextMenuItemModel, + icon: 'inbox', + index: 13 + }, + { + id: 'notify_dashboard', + active: false, + parentID: 'coar_notify', + visible: isSiteAdmin, + model: { + type: MenuItemType.LINK, + text: 'menu.section.notify_dashboard', + link: '/admin/notify-dashboard' + } as LinkMenuItemModel, + }, /* LDN Services */ { id: 'ldn_services', active: false, + parentID: 'coar_notify', visible: isSiteAdmin && isCoarNotifyEnabled, model: { type: MenuItemType.LINK, text: 'menu.section.services', link: '/admin/ldn/services' } as LinkMenuItemModel, - icon: 'inbox', - index: 14 }, { id: 'health', diff --git a/src/app/notifications/reciter-suggestions/suggestion.service.spec.ts b/src/app/notifications/reciter-suggestions/suggestion.service.spec.ts deleted file mode 100644 index 1803cb948e..0000000000 --- a/src/app/notifications/reciter-suggestions/suggestion.service.spec.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { SuggestionsService } from './suggestions.service'; -import { AuthService } from '../../core/auth/auth.service'; -import { ResearcherProfileDataService } from '../../core/profile/researcher-profile-data.service'; - -import { TestScheduler } from 'rxjs/testing'; -import { getTestScheduler } from 'jasmine-marbles'; -import { of as observableOf } from 'rxjs'; -import { FindListOptions } from '../../core/data/find-list-options.model'; -import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model'; -import { ResearcherProfile } from '../../core/profile/model/researcher-profile.model'; -import { createSuccessfulRemoteDataObject$ } from '../../shared/remote-data.utils'; -import { WorkspaceitemDataService } from '../../core/submission/workspaceitem-data.service'; -import { mockSuggestionPublicationOne } from '../../shared/mocks/reciter-suggestion.mock'; -import { ResourceType } from '../../core/shared/resource-type'; -import { SuggestionsDataService } from '../../core/notifications/reciter-suggestions/suggestions-data.service'; -import { - SuggestionSourceDataService -} from '../../core/notifications/reciter-suggestions/source/suggestion-source-data.service'; -import { - SuggestionTargetDataService -} from '../../core/notifications/reciter-suggestions/target/suggestion-target-data.service'; -import { SuggestionTarget } from '../../core/notifications/reciter-suggestions/models/suggestion-target.model'; - - -describe('SuggestionsService test', () => { - let scheduler: TestScheduler; - let service: SuggestionsService; - let authService: AuthService; - let researcherProfileService: ResearcherProfileDataService; - let suggestionsDataService: SuggestionsDataService; - let suggestionSourceDataService: SuggestionSourceDataService; - let suggestionTargetDataService: SuggestionTargetDataService; - let translateService: any = { - instant: (str) => str, - }; - const suggestionTarget = { - id: '1234:4321', - display: 'display', - source: 'source', - total: 8, - type: new ResourceType('suggestiontarget') - }; - - const mockResercherProfile = { - id: '1234', - uuid: '1234', - visible: true - }; - - function initTestService() { - return new SuggestionsService( - authService, - researcherProfileService, - suggestionsDataService, - suggestionSourceDataService, - suggestionTargetDataService, - translateService - ); - } - - beforeEach(() => { - scheduler = getTestScheduler(); - - - suggestionSourceDataService = jasmine.createSpyObj('suggestionSourcesDataService', { - getSources: observableOf(null), - }); - - researcherProfileService = jasmine.createSpyObj('researcherProfileService', { - findById: createSuccessfulRemoteDataObject$(mockResercherProfile as ResearcherProfile), - findRelatedItemId: observableOf('1234'), - }); - - suggestionTargetDataService = jasmine.createSpyObj('suggestionTargetsDataService', { - getTargets: observableOf(null), - findById: observableOf(null), - }); - - suggestionsDataService = jasmine.createSpyObj('suggestionsDataService', { - searchBy: observableOf(null), - delete: observableOf(null), - deleteSuggestion: createSuccessfulRemoteDataObject$({}), - getSuggestionsByTargetAndSource : observableOf(null), - clearSuggestionRequests : null, - getTargetsByUser: observableOf(null), - }); - - service = initTestService(); - - }); - - describe('Suggestion service', () => { - it('should create', () => { - expect(service).toBeDefined(); - }); - - it('should get targets', () => { - const sortOptions = new SortOptions('display', SortDirection.ASC); - const findListOptions: FindListOptions = { - elementsPerPage: 10, - currentPage: 1, - sort: sortOptions - }; - service.getTargets('source', 10, 1); - expect(suggestionTargetDataService.getTargets).toHaveBeenCalledWith('source', findListOptions); - }); - - it('should get suggestions', () => { - const sortOptions = new SortOptions('display', SortDirection.ASC); - const findListOptions: FindListOptions = { - elementsPerPage: 10, - currentPage: 1, - sort: sortOptions - }; - service.getSuggestions('source:target', 10, 1, sortOptions); - expect(suggestionsDataService.getSuggestionsByTargetAndSource).toHaveBeenCalledWith('target', 'source', findListOptions); - }); - - it('should clear suggestions', () => { - service.clearSuggestionRequests(); - expect(suggestionsDataService.clearSuggestionRequests).toHaveBeenCalled(); - }); - - it('should delete reviewed suggestion', () => { - service.deleteReviewedSuggestion('1234'); - expect(suggestionsDataService.deleteSuggestion).toHaveBeenCalledWith('1234'); - }); - - it('should retrieve current user suggestions', () => { - service.retrieveCurrentUserSuggestions('1234'); - expect(researcherProfileService.findById).toHaveBeenCalledWith('1234'); - }); - - it('should approve and import suggestion', () => { - spyOn(service, 'resolveCollectionId'); - const workspaceitemService = {importExternalSourceEntry: (x,y) => observableOf(null)}; - service.approveAndImport(workspaceitemService as unknown as WorkspaceitemDataService, mockSuggestionPublicationOne, '1234'); - expect(service.resolveCollectionId).toHaveBeenCalled(); - }); - - it('should approve and import suggestions', () => { - spyOn(service, 'approveAndImport'); - const workspaceitemService = {importExternalSourceEntry: (x,y) => observableOf(null)}; - service.approveAndImportMultiple(workspaceitemService as unknown as WorkspaceitemDataService, [mockSuggestionPublicationOne], '1234'); - expect(service.approveAndImport).toHaveBeenCalledWith(workspaceitemService as unknown as WorkspaceitemDataService, mockSuggestionPublicationOne, '1234'); - }); - - it('should delete suggestion', () => { - spyOn(service, 'deleteReviewedSuggestion').and.returnValue(createSuccessfulRemoteDataObject$({})); - service.notMine('1234'); - expect(service.deleteReviewedSuggestion).toHaveBeenCalledWith('1234'); - }); - - it('should delete suggestions', () => { - spyOn(service, 'notMine'); - service.notMineMultiple([mockSuggestionPublicationOne]); - expect(service.notMine).toHaveBeenCalledWith(mockSuggestionPublicationOne.id); - }); - - it('should get target Uuid', () => { - expect(service.getTargetUuid(suggestionTarget as SuggestionTarget)).toBe('4321'); - expect(service.getTargetUuid({id: ''} as SuggestionTarget)).toBe(null); - }); - - it('should get suggestion interpolation', () => { - const result = service.getNotificationSuggestionInterpolation(suggestionTarget as SuggestionTarget); - expect(result.count).toEqual(suggestionTarget.total); - expect(result.source).toEqual('reciter.suggestion.source.' + suggestionTarget.source); - expect(result.type).toEqual('reciter.suggestion.type.' + suggestionTarget.source); - expect(result.suggestionId).toEqual(suggestionTarget.id); - expect(result.displayName).toEqual(suggestionTarget.display); - }); - - it('should translate suggestion type', () => { - expect(service.translateSuggestionType('source')).toEqual('reciter.suggestion.type.source'); - }); - - it('should translate suggestion source', () => { - expect(service.translateSuggestionSource('source')).toEqual('reciter.suggestion.source.source'); - }); - - it('should resolve collection id', () => { - expect(service.resolveCollectionId(mockSuggestionPublicationOne, '1234')).toEqual('1234'); - }); - - it('should check if collection is fixed', () => { - expect(service.isCollectionFixed([mockSuggestionPublicationOne])).toBeFalse(); - }); - }); -}); diff --git a/src/app/shared/search/search.component.html b/src/app/shared/search/search.component.html index 6ee0bb3cb0..72cf911d3c 100644 --- a/src/app/shared/search/search.component.html +++ b/src/app/shared/search/search.component.html @@ -23,7 +23,7 @@
-
-