diff --git a/projects/aca-content/ms-office/src/aos-extension.module.ts b/projects/aca-content/ms-office/src/aos-extension.module.ts index 492b39f84..e7cdd831d 100644 --- a/projects/aca-content/ms-office/src/aos-extension.module.ts +++ b/projects/aca-content/ms-office/src/aos-extension.module.ts @@ -27,7 +27,6 @@ import { NgModule } from '@angular/core'; import { EffectsModule } from '@ngrx/effects'; import { AosEffects } from './effects/aos.effects'; import { TranslationService } from '@alfresco/adf-core'; -import { AlfrescoOfficeExtensionService } from '@alfresco/aca-shared'; import { canOpenWithOffice } from '@alfresco/aca-shared/rules'; @NgModule({ @@ -35,10 +34,10 @@ import { canOpenWithOffice } from '@alfresco/aca-shared/rules'; providers: [provideExtensionConfig(['aos.plugin.json'])] }) export class AosExtensionModule { - constructor(extensions: ExtensionService, translation: TranslationService, aosService: AlfrescoOfficeExtensionService) { + constructor(extensions: ExtensionService, translation: TranslationService) { translation.addTranslationFolder('ms-office', 'assets/ms-office'); extensions.setEvaluators({ - 'aos.canOpenWithOffice': (context) => aosService.isAosPluginEnabled() && canOpenWithOffice(context) + 'aos.canOpenWithOffice': canOpenWithOffice }); } } diff --git a/projects/aca-content/src/lib/extensions/core.extensions.module.ts b/projects/aca-content/src/lib/extensions/core.extensions.module.ts index 7b7e5cfef..0aaa28c54 100644 --- a/projects/aca-content/src/lib/extensions/core.extensions.module.ts +++ b/projects/aca-content/src/lib/extensions/core.extensions.module.ts @@ -27,7 +27,6 @@ import { CommonModule } from '@angular/common'; import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'; import { ExtensionsModule } from '@alfresco/adf-extensions'; import { AppExtensionService } from '@alfresco/aca-shared'; -import { ContentServiceExtensionService } from '../services/content-service-extension.service'; export function setupExtensions(service: AppExtensionService): () => void { return () => service.load(); @@ -44,7 +43,7 @@ export class CoreExtensionsModule { { provide: APP_INITIALIZER, useFactory: setupExtensions, - deps: [AppExtensionService, ContentServiceExtensionService], + deps: [AppExtensionService], multi: true } ] diff --git a/projects/aca-content/src/lib/services/content-service-extension.service.spec.ts b/projects/aca-content/src/lib/services/content-service-extension.service.spec.ts deleted file mode 100644 index 9e7b6b9cf..000000000 --- a/projects/aca-content/src/lib/services/content-service-extension.service.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -/*! - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Alfresco Example Content Application - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * from Hyland Software. If not, see . - */ - -import { ContentServiceExtensionService } from './content-service-extension.service'; -import { AppConfigService, AppConfigServiceMock } from '@alfresco/adf-core'; -import { TestBed } from '@angular/core/testing'; -import { of } from 'rxjs'; -import { HttpClientModule } from '@angular/common/http'; - -describe('ContentServiceExtensionService', () => { - let service: ContentServiceExtensionService; - let appConfig: AppConfigService; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [HttpClientModule], - providers: [{ provide: AppConfigService, useClass: AppConfigServiceMock }] - }); - service = TestBed.inject(ContentServiceExtensionService); - appConfig = TestBed.inject(AppConfigService); - appConfig.config = Object.assign(appConfig.config, { - plugins: { - contentService: true - } - }); - - appConfig.load(); - appConfig.onLoad = of(appConfig.config); - }); - - it('should set the content service to true when it is false in local storage and enabled in the app config', () => { - localStorage.setItem('contentService', 'false'); - service.updateContentServiceAvailability(); - - expect(localStorage.getItem('contentService')).toEqual('true'); - }); - - it('should set the content service to false in local storage when it is false in the app config', () => { - appConfig.config.plugins.contentService = false; - appConfig.load(); - appConfig.onLoad = of(appConfig.config); - service.updateContentServiceAvailability(); - - expect(localStorage.getItem('contentService')).toEqual('false'); - }); - - afterEach(() => { - localStorage.clear(); - }); -}); diff --git a/projects/aca-content/src/lib/services/content-service-extension.service.ts b/projects/aca-content/src/lib/services/content-service-extension.service.ts deleted file mode 100644 index b1b2e1e34..000000000 --- a/projects/aca-content/src/lib/services/content-service-extension.service.ts +++ /dev/null @@ -1,58 +0,0 @@ -/*! - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Alfresco Example Content Application - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * from Hyland Software. If not, see . - */ - -import { Injectable } from '@angular/core'; -import { AppConfigService } from '@alfresco/adf-core'; -import { take } from 'rxjs/operators'; - -@Injectable({ - providedIn: 'root' -}) -export class ContentServiceExtensionService { - constructor(private appConfigService: AppConfigService) { - this.updateContentServiceAvailability(); - } - - updateContentServiceAvailability() { - this.appConfigService.onLoad.pipe(take(1)).subscribe((config) => { - if (config.plugins && config.plugins.contentService === false) { - this.disableContentServices(); - } else { - this.enableContentServices(); - } - }); - } - - private disableContentServices() { - if (localStorage) { - localStorage.setItem('contentService', 'false'); - } - } - - private enableContentServices() { - if (localStorage && localStorage.getItem('contentService') === 'false') { - localStorage.setItem('contentService', 'true'); - } - } -} diff --git a/projects/aca-content/src/lib/services/node-template.service.ts b/projects/aca-content/src/lib/services/node-template.service.ts index c38177e22..7f5342b08 100644 --- a/projects/aca-content/src/lib/services/node-template.service.ts +++ b/projects/aca-content/src/lib/services/node-template.service.ts @@ -45,7 +45,7 @@ export class NodeTemplateService { private currentTemplateConfig: TemplateDialogConfig = null; private rootNode: ResultNode; - _searchApi: SearchApi; + private _searchApi: SearchApi; get searchApi(): SearchApi { this._searchApi = this._searchApi ?? new SearchApi(this.alfrescoApiService.getInstance()); return this._searchApi; diff --git a/projects/aca-shared/rules/src/app.rules.spec.ts b/projects/aca-shared/rules/src/app.rules.spec.ts index a1037bd23..6e5d538d1 100644 --- a/projects/aca-shared/rules/src/app.rules.spec.ts +++ b/projects/aca-shared/rules/src/app.rules.spec.ts @@ -549,26 +549,14 @@ describe('app.evaluators', () => { }); }); - describe('isContentServiceEnabled', () => { - it('should return true when local storage has contentService set to true', () => { - localStorage.setItem('contentService', 'true'); - expect(app.isContentServiceEnabled()).toBe(true); - }); - - it('should return false when local storage has contentService set to false', () => { - localStorage.setItem('contentService', 'false'); - expect(app.isContentServiceEnabled()).toBe(false); - }); - - it('should return true when contentService is not defined in local storage', () => { - localStorage.clear(); - expect(app.isContentServiceEnabled()).toBe(true); - }); - }); - describe('canOpenWithOffice', () => { + const appConfig = { + get: (key: string) => key + }; + it('should return [false] if using SSO', () => { const context: any = { + appConfig, auth: { isOauth: () => true } @@ -579,6 +567,7 @@ describe('app.evaluators', () => { it('should return [false] if no selection present', () => { const context: any = { + appConfig, selection: null }; @@ -587,6 +576,7 @@ describe('app.evaluators', () => { it('should return [false] if no file selected', () => { const context: any = { + appConfig, selection: { file: null } @@ -597,6 +587,7 @@ describe('app.evaluators', () => { it('should return [false] if selected file has no entry', () => { const context: any = { + appConfig, selection: { file: { entry: null @@ -609,6 +600,7 @@ describe('app.evaluators', () => { it('should return [false] if selected file has no properties', () => { const context: any = { + appConfig, selection: { file: { entry: { @@ -623,6 +615,7 @@ describe('app.evaluators', () => { it('should return [false] if selected file is locked', () => { const context: any = { + appConfig, selection: { file: { entry: { @@ -638,6 +631,7 @@ describe('app.evaluators', () => { it('should return [false] if selected file has no extension', () => { const context: any = { + appConfig, selection: { file: { entry: { @@ -654,6 +648,7 @@ describe('app.evaluators', () => { it('should return [false] if extension is not supported', () => { const context: any = { + appConfig, selection: { file: { entry: { @@ -670,6 +665,7 @@ describe('app.evaluators', () => { it('should return [false] if selected file has write lock', () => { const context: any = { + appConfig, selection: { file: { entry: { @@ -688,6 +684,7 @@ describe('app.evaluators', () => { it('should return [false] if selected file has read-only lock', () => { const context: any = { + appConfig, selection: { file: { entry: { @@ -706,6 +703,7 @@ describe('app.evaluators', () => { it('should return [false] if current user is not lock owner', () => { const context: any = { + appConfig, profile: { id: 'user1' }, @@ -730,6 +728,7 @@ describe('app.evaluators', () => { it('should return [false] if current user is lock owner', () => { const context: any = { + appConfig, profile: { id: 'user1' }, @@ -754,6 +753,7 @@ describe('app.evaluators', () => { it('should return [false] if permissions check is false', () => { const context: any = { + appConfig, selection: { file: { entry: { @@ -773,6 +773,9 @@ describe('app.evaluators', () => { it('should return [true] if all checks succeed', () => { const context: any = { + appConfig: { + get: () => true + }, selection: { file: { entry: { diff --git a/projects/aca-shared/rules/src/app.rules.ts b/projects/aca-shared/rules/src/app.rules.ts index 4f501dce9..71333f4bc 100644 --- a/projects/aca-shared/rules/src/app.rules.ts +++ b/projects/aca-shared/rules/src/app.rules.ts @@ -88,7 +88,10 @@ export interface AcaRuleContext extends RuleContext { * Checks if the content plugin is enabled. * JSON ref: `app.isContentServiceEnabled` */ -export const isContentServiceEnabled = (): boolean => localStorage && localStorage.getItem('contentService') !== 'false'; +export const isContentServiceEnabled = (context: AcaRuleContext): boolean => { + const flag = context.appConfig.get('plugins.contentService'); + return flag === true || flag === 'true'; +}; /** * Checks if Search is supported for active view @@ -101,10 +104,10 @@ export const isSearchSupported = (context: RuleContext): boolean => * Checks if upload action is supported for the given context * JSON ref: `app.isUploadSupported` * - * @param content Rule execution context + * @param context Rule execution context */ -export const isUploadSupported = (context: RuleContext): boolean => - [isContentServiceEnabled(), navigation.isPersonalFiles(context) || navigation.isLibraryContent(context), canUpload(context)].every(Boolean); +export const isUploadSupported = (context: AcaRuleContext): boolean => + [isContentServiceEnabled(context), navigation.isPersonalFiles(context) || navigation.isLibraryContent(context), canUpload(context)].every(Boolean); /** * Checks if user can copy selected node. * JSON ref: `app.canCopyNode` @@ -240,8 +243,8 @@ export const hasSelection = (context: RuleContext): boolean => !context.selectio * Checks if user can create a new folder with current path. * JSON ref: `app.navigation.folder.canCreate` */ -export function canCreateFolder(context: RuleContext): boolean { - if (isContentServiceEnabled() && (navigation.isPersonalFiles(context) || navigation.isLibraryContent(context))) { +export function canCreateFolder(context: AcaRuleContext): boolean { + if (isContentServiceEnabled(context) && (navigation.isPersonalFiles(context) || navigation.isLibraryContent(context))) { const { currentFolder } = context.navigation; if (currentFolder) { @@ -257,14 +260,15 @@ export function canCreateFolder(context: RuleContext): boolean { * * @param context Rule execution context */ -export const canCreateLibrary = (context: RuleContext): boolean => [isContentServiceEnabled(), navigation.isLibraries(context)].every(Boolean); +export const canCreateLibrary = (context: AcaRuleContext): boolean => + [isContentServiceEnabled(context), navigation.isLibraries(context)].every(Boolean); /** * Checks if user can upload content to current folder. * JSON ref: `app.navigation.folder.canUpload` */ -export function canUpload(context: RuleContext): boolean { - if (isContentServiceEnabled() && (navigation.isPersonalFiles(context) || navigation.isLibraryContent(context))) { +export function canUpload(context: AcaRuleContext): boolean { + if (isContentServiceEnabled(context) && (navigation.isPersonalFiles(context) || navigation.isLibraryContent(context))) { const { currentFolder } = context.navigation; if (currentFolder) { @@ -578,7 +582,13 @@ export const showInfoSelectionButton = (context: RuleContext): boolean => naviga * * @param context Rule execution context */ -export function canOpenWithOffice(context: RuleContext): boolean { +export function canOpenWithOffice(context: AcaRuleContext): boolean { + const flag = `${context.appConfig.get('plugins.aosPlugin', false)}`; + + if (flag !== 'true') { + return false; + } + if (context.navigation && context.navigation.url && context.navigation.url.startsWith('/trashcan')) { return false; } diff --git a/projects/aca-shared/src/lib/services/alfresco-office-extension.service.spec.ts b/projects/aca-shared/src/lib/services/alfresco-office-extension.service.spec.ts deleted file mode 100644 index b1f45114e..000000000 --- a/projects/aca-shared/src/lib/services/alfresco-office-extension.service.spec.ts +++ /dev/null @@ -1,118 +0,0 @@ -/*! - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Alfresco Example Content Application - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * from Hyland Software. If not, see . - */ - -import { TestBed } from '@angular/core/testing'; -import { AppConfigService } from '@alfresco/adf-core'; -import { AlfrescoOfficeExtensionService } from './alfresco-office-extension.service'; -import { provideMockStore } from '@ngrx/store/testing'; -import { initialState, LibTestingModule } from '../testing/lib-testing-module'; -import { Subject } from 'rxjs'; - -describe('AlfrescoOfficeExtensionService', () => { - let appConfig: AppConfigService; - let service: AlfrescoOfficeExtensionService; - let onLoad$: Subject; - - const mock = () => { - let storage: { [key: string]: any } = {}; - return { - getItem: (key: string) => (key in storage ? storage[key] : null), - setItem: (key: string, value: any) => (storage[key] = value || ''), - removeItem: (key: string) => delete storage[key], - clear: () => (storage = {}) - }; - }; - - beforeEach(() => { - TestBed.configureTestingModule({ - imports: [LibTestingModule], - providers: [provideMockStore({ initialState })] - }); - - onLoad$ = new Subject(); - - appConfig = TestBed.inject(AppConfigService); - appConfig.onLoad = onLoad$; - appConfig.config.aosPlugin = true; - - service = TestBed.inject(AlfrescoOfficeExtensionService); - - Object.defineProperty(window, 'localStorage', { value: mock() }); - }); - - it('should enable plugin on load', () => { - spyOn(localStorage, 'getItem').and.returnValue(null); - spyOn(localStorage, 'setItem'); - - onLoad$.next({ - plugins: { - aosPlugin: true - } - }); - - TestBed.inject(AlfrescoOfficeExtensionService); - expect(localStorage.setItem).toHaveBeenCalledWith('aosPlugin', 'true'); - }); - - it('should disable plugin on load', () => { - spyOn(localStorage, 'removeItem'); - - onLoad$.next({ - plugins: { - aosPlugin: false - } - }); - - TestBed.inject(AlfrescoOfficeExtensionService); - expect(localStorage.removeItem).toHaveBeenCalledWith('aosPlugin'); - }); - - it('Should initialize the localStorage with the item aosPlugin true if not present', () => { - expect(localStorage.getItem('aosPlugin')).toBeNull('The localStorage aosPlugin is not null'); - service.enablePlugin(); - expect(localStorage.getItem('aosPlugin')).toBe('true'); - expect(service.isAosPluginEnabled()).toBe(true); - }); - - it('Should not change the item aosPlugin value if false', () => { - localStorage.setItem('aosPlugin', 'false'); - service.enablePlugin(); - expect(localStorage.getItem('aosPlugin')).toBe('false'); - expect(service.isAosPluginEnabled()).toBe(false); - }); - - it('Should not change the item aosPlugin value if true', () => { - localStorage.setItem('aosPlugin', 'true'); - service.enablePlugin(); - expect(localStorage.getItem('aosPlugin')).toBe('true'); - expect(service.isAosPluginEnabled()).toBe(true); - }); - - it('Should change the item aosPlugin disabled', () => { - localStorage.setItem('aosPlugin', 'true'); - service.disablePlugin(); - expect(localStorage.getItem('aosPlugin')).toBeNull(); - expect(service.isAosPluginEnabled()).toBe(false); - }); -}); diff --git a/projects/aca-shared/src/lib/services/alfresco-office-extension.service.ts b/projects/aca-shared/src/lib/services/alfresco-office-extension.service.ts deleted file mode 100644 index 95d416049..000000000 --- a/projects/aca-shared/src/lib/services/alfresco-office-extension.service.ts +++ /dev/null @@ -1,61 +0,0 @@ -/*! - * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. - * - * Alfresco Example Content Application - * - * This file is part of the Alfresco Example Content Application. - * If the software was purchased under a paid Alfresco license, the terms of - * the paid license agreement will prevail. Otherwise, the software is - * provided under the following open source license terms: - * - * The Alfresco Example Content Application is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * The Alfresco Example Content Application is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * from Hyland Software. If not, see . - */ - -import { Injectable } from '@angular/core'; -import { AppConfigService } from '@alfresco/adf-core'; -import { map, take } from 'rxjs/operators'; - -@Injectable({ - providedIn: 'root' -}) -export class AlfrescoOfficeExtensionService { - constructor(private appConfigService: AppConfigService) { - this.appConfigService.onLoad - .pipe( - take(1), - map((appConfig) => appConfig.plugins && appConfig.plugins.aosPlugin) - ) - .subscribe((aosPlugin) => { - if (aosPlugin) { - this.enablePlugin(); - } else { - this.disablePlugin(); - } - }); - } - - enablePlugin() { - if (localStorage && localStorage.getItem('aosPlugin') === null) { - localStorage.setItem('aosPlugin', 'true'); - } - } - - disablePlugin() { - localStorage.removeItem('aosPlugin'); - } - - isAosPluginEnabled() { - return localStorage && localStorage.getItem('aosPlugin') === 'true'; - } -} diff --git a/projects/aca-shared/src/lib/services/app.service.ts b/projects/aca-shared/src/lib/services/app.service.ts index 553576e9c..4fc799a70 100644 --- a/projects/aca-shared/src/lib/services/app.service.ts +++ b/projects/aca-shared/src/lib/services/app.service.ts @@ -23,7 +23,7 @@ */ import { Inject, Injectable, OnDestroy } from '@angular/core'; -import { AuthenticationService, AppConfigService, AlfrescoApiService, PageTitleService, UserPreferencesService } from '@alfresco/adf-core'; +import { AuthenticationService, AppConfigService, AlfrescoApiService, PageTitleService } from '@alfresco/adf-core'; import { Observable, BehaviorSubject, Subject } from 'rxjs'; import { GroupService, SearchQueryBuilderService, SharedLinksApiService, UploadService, FileUploadErrorEvent } from '@alfresco/adf-content-services'; import { OverlayContainer } from '@angular/cdk/overlay'; @@ -55,16 +55,12 @@ import { AcaMobileAppSwitcherService } from './aca-mobile-app-switcher.service'; // After moving shell to ADF to core, AppService will implement ShellAppService export class AppService implements OnDestroy { private ready: BehaviorSubject; + ready$: Observable; - pageHeading$: Observable; - appNavNarMode$: Subject<'collapsed' | 'expanded'> = new BehaviorSubject('expanded'); toggleAppNavBar$ = new Subject(); - hideSidenavConditions = ['/preview/']; - minimizeSidenavConditions = ['search']; - onDestroy$ = new Subject(); /** @@ -76,7 +72,6 @@ export class AppService implements OnDestroy { } constructor( - public preferencesService: UserPreferencesService, private authenticationService: AuthenticationService, private store: Store, private router: Router, diff --git a/projects/aca-shared/src/public-api.ts b/projects/aca-shared/src/public-api.ts index 48906a0fa..25e950ec6 100644 --- a/projects/aca-shared/src/public-api.ts +++ b/projects/aca-shared/src/public-api.ts @@ -58,7 +58,6 @@ export * from './lib/services/node-permission.service'; export * from './lib/services/app.extension.service'; export * from './lib/services/router.extension.service'; export * from './lib/services/app-hook.service'; -export * from './lib/services/alfresco-office-extension.service'; export * from './lib/services/aca-file-auto-download.service'; export * from './lib/utils/node.utils';