mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-07-24 17:31:52 +00:00
[ADF-5183] Upgrade to Angular 10 (#1506)
* upgrade preparation fixes * remove fdescribe * update browserlist config * ng8 * ngrx 8 * ng9 * ngrx 9 * remove entryComponents * unit tests * ng 10 * latest ADF * fix unit tests * fix lint * update deps and travis * code fixes * upgrade webdriver * cleanup libs * fix test * update test * Use browserTarget as target for lite-serve * Use the update webdriver with CI condition * Use version console.log('load', path * Fix path sh * Try to use remote env * Add the . to export variabled * Use hardcoded chrome version * Remove the run remote * Avoid to use the escape * Skip flaky e2e and raise issue ACA-3615 * SKip failing e2e * Skip flaky e2e and raise issue ACA-3615 * Fix close app toolbar menu and preconditions + tests of mark-favorite.test.ts Personal Files section * Fix mark-favorite tests * Fix ext-header test * Fix new-menu tests * Fix lint * no message * Fix viewer tests Co-authored-by: maurizio vitale <maurizio.vitale@alfresco.com> Co-authored-by: Cristina Jalba <cristina.jalba@ness.com>
This commit is contained in:
@@ -375,9 +375,9 @@ export function isWriteLocked(context: RuleContext): boolean {
|
||||
export function isUserWriteLockOwner(context: RuleContext): boolean {
|
||||
return (
|
||||
isWriteLocked(context) &&
|
||||
(context.selection.file.entry.properties['cm:lockOwner'] &&
|
||||
context.selection.file.entry.properties['cm:lockOwner'].id ===
|
||||
context.profile.id)
|
||||
context.selection.file.entry.properties['cm:lockOwner'] &&
|
||||
context.selection.file.entry.properties['cm:lockOwner'].id ===
|
||||
context.profile.id
|
||||
);
|
||||
}
|
||||
|
||||
|
@@ -74,8 +74,8 @@ describe('InfoDrawerComponent', () => {
|
||||
|
||||
fixture = TestBed.createComponent(InfoDrawerComponent);
|
||||
component = fixture.componentInstance;
|
||||
appExtensionService = TestBed.get(AppExtensionService);
|
||||
contentApiService = TestBed.get(ContentApiService);
|
||||
appExtensionService = TestBed.inject(AppExtensionService);
|
||||
contentApiService = TestBed.inject(ContentApiService);
|
||||
|
||||
tab = { title: 'tab1' };
|
||||
spyOn(appExtensionService, 'getSidebarTabs').and.returnValue([tab]);
|
||||
|
@@ -28,7 +28,7 @@ import { CommonModule } from '@angular/common';
|
||||
import { InfoDrawerComponent } from './info-drawer.component';
|
||||
import { InfoDrawerModule, ToolbarModule } from '@alfresco/adf-core';
|
||||
import { ExtensionsModule } from '@alfresco/adf-extensions';
|
||||
import { MatProgressBarModule } from '@angular/material';
|
||||
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
||||
import { SharedToolbarModule } from '../tool-bar/shared-toolbar.module';
|
||||
|
||||
@NgModule({
|
||||
|
@@ -38,12 +38,13 @@ describe('ContextActionsDirective', () => {
|
||||
directive = new ContextActionsDirective(storeMock);
|
||||
});
|
||||
|
||||
it('should not render context menu when `enabled` property is false', () => {
|
||||
it('should not render context menu when `enabled` property is false', fakeAsync(() => {
|
||||
spyOn(directive, 'execute').and.stub();
|
||||
directive.enabled = false;
|
||||
directive.onContextMenuEvent(new MouseEvent('contextmenu'));
|
||||
|
||||
expect(storeMock.dispatch).not.toHaveBeenCalled();
|
||||
});
|
||||
expect(directive.execute).not.toHaveBeenCalled();
|
||||
}));
|
||||
|
||||
it('should call service to render context menu', fakeAsync(() => {
|
||||
const el = document.createElement('div');
|
||||
|
@@ -65,10 +65,7 @@ export class ContextActionsDirective implements OnInit, OnDestroy {
|
||||
|
||||
ngOnInit() {
|
||||
this.execute$
|
||||
.pipe(
|
||||
debounceTime(300),
|
||||
takeUntil(this.onDestroy$)
|
||||
)
|
||||
.pipe(debounceTime(300), takeUntil(this.onDestroy$))
|
||||
.subscribe((event: MouseEvent) => {
|
||||
this.store.dispatch(new ContextMenu(event));
|
||||
});
|
||||
|
@@ -58,8 +58,8 @@ describe('PaginationDirective', () => {
|
||||
]
|
||||
});
|
||||
|
||||
preferences = TestBed.get(UserPreferencesService);
|
||||
config = TestBed.get(AppConfigService);
|
||||
preferences = TestBed.inject(UserPreferencesService);
|
||||
config = TestBed.inject(AppConfigService);
|
||||
fixture = TestBed.createComponent(PaginationComponent);
|
||||
pagination = fixture.componentInstance;
|
||||
directive = new PaginationDirective(pagination, preferences, config);
|
||||
|
@@ -34,7 +34,7 @@ describe('AppRouteReuseStrategy', () => {
|
||||
providers: [AppRouteReuseStrategy]
|
||||
});
|
||||
|
||||
appRouteReuse = TestBed.get(AppRouteReuseStrategy);
|
||||
appRouteReuse = TestBed.inject(AppRouteReuseStrategy);
|
||||
});
|
||||
|
||||
it('should allow detach if route is configured to be reused', () => {
|
||||
|
@@ -28,7 +28,7 @@ import {
|
||||
DetachedRouteHandle,
|
||||
ActivatedRouteSnapshot
|
||||
} from '@angular/router';
|
||||
import { ComponentRef } from '@angular/core';
|
||||
import { ComponentRef, Injectable } from '@angular/core';
|
||||
|
||||
interface RouteData {
|
||||
reuse: boolean;
|
||||
@@ -39,6 +39,7 @@ interface RouteInfo {
|
||||
data: RouteData;
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class AppRouteReuseStrategy implements RouteReuseStrategy {
|
||||
private routeCache = new Map<string, RouteInfo>();
|
||||
|
||||
|
@@ -54,11 +54,11 @@ describe('AppExtensionService', () => {
|
||||
imports: [LibTestingModule]
|
||||
});
|
||||
|
||||
appConfigService = TestBed.get(AppConfigService);
|
||||
store = TestBed.get(Store);
|
||||
service = TestBed.get(AppExtensionService);
|
||||
extensions = TestBed.get(ExtensionService);
|
||||
components = TestBed.get(ComponentRegisterService);
|
||||
appConfigService = TestBed.inject(AppConfigService);
|
||||
store = TestBed.inject(Store);
|
||||
service = TestBed.inject(AppExtensionService);
|
||||
extensions = TestBed.inject(ExtensionService);
|
||||
components = TestBed.inject(ComponentRegisterService);
|
||||
});
|
||||
|
||||
const applyConfig = (config: ExtensionConfig) => {
|
||||
|
@@ -54,10 +54,10 @@ describe('AppService', () => {
|
||||
]
|
||||
});
|
||||
|
||||
routeReuse = TestBed.get(AppRouteReuseStrategy);
|
||||
auth = TestBed.get(AuthenticationService);
|
||||
appConfig = TestBed.get(AppConfigService);
|
||||
searchQueryBuilderService = TestBed.get(SearchQueryBuilderService);
|
||||
routeReuse = TestBed.inject(AppRouteReuseStrategy);
|
||||
auth = TestBed.inject(AuthenticationService);
|
||||
appConfig = TestBed.inject(AppConfigService);
|
||||
searchQueryBuilderService = TestBed.inject(SearchQueryBuilderService);
|
||||
|
||||
spyOn(routeReuse, 'resetCache').and.stub();
|
||||
|
||||
|
@@ -34,7 +34,7 @@ import { ContextActionsModule } from './directives/contextmenu/contextmenu.modul
|
||||
exports: [ContextActionsModule]
|
||||
})
|
||||
export class SharedModule {
|
||||
static forRoot(): ModuleWithProviders {
|
||||
static forRoot(): ModuleWithProviders<SharedModule> {
|
||||
return {
|
||||
ngModule: SharedModule,
|
||||
providers: [ContentApiService, NodePermissionService, AppService]
|
||||
|
@@ -33,15 +33,8 @@ export const getHeaderColor = createSelector(
|
||||
state => state.headerColor
|
||||
);
|
||||
|
||||
export const getAppName = createSelector(
|
||||
selectApp,
|
||||
state => state.appName
|
||||
);
|
||||
|
||||
export const getLogoPath = createSelector(
|
||||
selectApp,
|
||||
state => state.logoPath
|
||||
);
|
||||
export const getAppName = createSelector(selectApp, state => state.appName);
|
||||
export const getLogoPath = createSelector(selectApp, state => state.logoPath);
|
||||
|
||||
export const getHeaderImagePath = createSelector(
|
||||
selectApp,
|
||||
@@ -53,10 +46,7 @@ export const getLanguagePickerState = createSelector(
|
||||
state => state.languagePicker
|
||||
);
|
||||
|
||||
export const getUserProfile = createSelector(
|
||||
selectApp,
|
||||
state => state.user
|
||||
);
|
||||
export const getUserProfile = createSelector(selectApp, state => state.user);
|
||||
|
||||
export const getCurrentFolder = createSelector(
|
||||
selectApp,
|
||||
@@ -68,10 +58,7 @@ export const getAppSelection = createSelector(
|
||||
state => state.selection
|
||||
);
|
||||
|
||||
export const getSharedUrl = createSelector(
|
||||
selectApp,
|
||||
state => state.sharedUrl
|
||||
);
|
||||
export const getSharedUrl = createSelector(selectApp, state => state.sharedUrl);
|
||||
|
||||
export const getNavigationState = createSelector(
|
||||
selectApp,
|
||||
@@ -103,10 +90,7 @@ export const isQuickShareEnabled = createSelector(
|
||||
info => info.status.isQuickShareEnabled
|
||||
);
|
||||
|
||||
export const isAdmin = createSelector(
|
||||
selectApp,
|
||||
state => state.user.isAdmin
|
||||
);
|
||||
export const isAdmin = createSelector(selectApp, state => state.user.isAdmin);
|
||||
|
||||
export const getSideNavState = createSelector(
|
||||
getAppSelection,
|
||||
|
@@ -25,7 +25,6 @@
|
||||
|
||||
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
|
||||
|
||||
import 'core-js/es7/reflect';
|
||||
import 'zone.js/dist/zone';
|
||||
import 'zone.js/dist/zone-testing';
|
||||
import { getTestBed } from '@angular/core/testing';
|
||||
|
@@ -18,7 +18,6 @@
|
||||
}
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"annotateForClosureCompiler": true,
|
||||
"skipTemplateCodegen": true,
|
||||
"strictMetadataEmit": true,
|
||||
"fullTemplateTypeCheck": true,
|
||||
|
6
projects/aca-shared/tsconfig.lib.prod.json
Normal file
6
projects/aca-shared/tsconfig.lib.prod.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"extends": "./tsconfig.lib.json",
|
||||
"angularCompilerOptions": {
|
||||
"enableIvy": false
|
||||
}
|
||||
}
|
@@ -30,6 +30,7 @@ import { Menu } from '../menu/menu';
|
||||
import { Toolbar } from './../toolbar/toolbar';
|
||||
import { SearchInput } from '../search/search-input';
|
||||
import { waitElement } from '../../utilities/utils';
|
||||
import { BrowserActions } from '@alfresco/adf-testing';
|
||||
|
||||
export class Header extends Component {
|
||||
logoLink = this.byCss('.app-menu__title');
|
||||
@@ -50,6 +51,11 @@ export class Header extends Component {
|
||||
await this.menu.waitForMenuToOpen();
|
||||
}
|
||||
|
||||
async closeMoreMenu(): Promise<void> {
|
||||
await BrowserActions.click(this.moreActions);
|
||||
await this.menu.waitForMenuToClose();
|
||||
}
|
||||
|
||||
async isSignOutDisplayed(): Promise<boolean> {
|
||||
return this.userInfo.menu.isMenuItemPresent('Sign out');
|
||||
}
|
||||
|
@@ -24,7 +24,7 @@
|
||||
*/
|
||||
|
||||
import { ElementFinder, by, element, browser } from 'protractor';
|
||||
import { Logger } from '@alfresco/adf-testing';
|
||||
import { Logger, BrowserActions } from '@alfresco/adf-testing';
|
||||
import { SIDEBAR_LABELS, BROWSER_WAIT_TIMEOUT } from '../../configs';
|
||||
import { Menu } from '../menu/menu';
|
||||
import { Component } from '../component';
|
||||
@@ -79,6 +79,13 @@ export class Sidenav extends Component {
|
||||
await this.menu.waitForMenuToOpen();
|
||||
}
|
||||
|
||||
async closeNewMenu(): Promise<void> {
|
||||
await BrowserActions.click(
|
||||
element(by.css('button[data-automation-id="create-button"] span span'))
|
||||
);
|
||||
await this.menu.waitForMenuToClose();
|
||||
}
|
||||
|
||||
async openCreateFolderDialog(): Promise<void> {
|
||||
await this.openNewMenu();
|
||||
await this.menu.createFolderAction.click();
|
||||
|
@@ -92,7 +92,16 @@ export class Toolbar extends Component {
|
||||
await this.menu.waitForMenuToOpen();
|
||||
}
|
||||
|
||||
async closeMoreMenu() {
|
||||
async closeMoreMenu(): Promise<void> {
|
||||
await this.isButtonPresent('More Actions');
|
||||
|
||||
const moreMenu = this.getButtonByTitleAttribute('More Actions');
|
||||
await BrowserActions.click(moreMenu);
|
||||
|
||||
await this.menu.waitForMenuToClose();
|
||||
}
|
||||
|
||||
async closeMoreMenuEscape() {
|
||||
await Utils.pressEscape();
|
||||
}
|
||||
|
||||
|
@@ -53,7 +53,7 @@ export abstract class Page {
|
||||
}
|
||||
|
||||
async load(relativeUrl: string = '') {
|
||||
const hash = USE_HASH_STRATEGY ? '/#' : '';
|
||||
const hash = USE_HASH_STRATEGY ? '#' : '';
|
||||
const path = `${browser.baseUrl}${hash}${this.url}${relativeUrl}`;
|
||||
return browser.get(path);
|
||||
}
|
||||
|
@@ -147,9 +147,9 @@ export class AdminActions {
|
||||
|
||||
// folder links are deleted automatically when original folder is deleted
|
||||
// Software Engineering Project is the default folder template coming from ACS, should not be deleted
|
||||
const nodesToDelete = (await this.adminApi.nodes.getNodeChildren(
|
||||
spaceTemplatesNodeId
|
||||
)).list.entries
|
||||
const nodesToDelete = (
|
||||
await this.adminApi.nodes.getNodeChildren(spaceTemplatesNodeId)
|
||||
).list.entries
|
||||
.filter(
|
||||
node =>
|
||||
node.entry.nodeType !== 'app:folderlink' &&
|
||||
|
@@ -69,14 +69,12 @@ export function flattenNodeContentTree(
|
||||
|
||||
if (folders) {
|
||||
const foldersData: NodeBodyCreate[] = folders
|
||||
.map(
|
||||
(folder: string | NodeContentTree): NodeBodyCreate[] => {
|
||||
const folderData: NodeContentTree =
|
||||
typeof folder === 'string' ? { name: folder } : folder;
|
||||
.map((folder: string | NodeContentTree): NodeBodyCreate[] => {
|
||||
const folderData: NodeContentTree =
|
||||
typeof folder === 'string' ? { name: folder } : folder;
|
||||
|
||||
return flattenNodeContentTree(folderData, relativePath);
|
||||
}
|
||||
)
|
||||
return flattenNodeContentTree(folderData, relativePath);
|
||||
})
|
||||
.reduce(
|
||||
(nodesData: NodeBodyCreate[], folderData: NodeBodyCreate[]) =>
|
||||
nodesData.concat(folderData),
|
||||
|
@@ -328,9 +328,9 @@ export class SitesApi extends RepoApi {
|
||||
async hasMembershipRequest(siteId: string) {
|
||||
try {
|
||||
await this.apiAuth();
|
||||
const requests = (await this.sitesApi.getSiteMembershipRequests(
|
||||
'-me-'
|
||||
)).list.entries.map(e => e.entry.id);
|
||||
const requests = (
|
||||
await this.sitesApi.getSiteMembershipRequests('-me-')
|
||||
).list.entries.map(e => e.entry.id);
|
||||
return requests.includes(siteId);
|
||||
} catch (error) {
|
||||
this.handleError(
|
||||
|
@@ -179,9 +179,7 @@ export class Utils {
|
||||
static async setSessionStorageFromConfig(
|
||||
configFileName: string
|
||||
): Promise<void> {
|
||||
const configFile = `${
|
||||
browser.params.e2eRootPath
|
||||
}/resources/extensibility-configs/${configFileName}`;
|
||||
const configFile = `${browser.params.e2eRootPath}/resources/extensibility-configs/${configFileName}`;
|
||||
const fileContent = JSON.stringify(
|
||||
fs.readFileSync(configFile, { encoding: 'utf8' })
|
||||
);
|
||||
|
@@ -18,7 +18,6 @@
|
||||
]
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"annotateForClosureCompiler": true,
|
||||
"skipTemplateCodegen": true,
|
||||
"strictMetadataEmit": true,
|
||||
"fullTemplateTypeCheck": true,
|
||||
|
@@ -25,7 +25,6 @@
|
||||
|
||||
// This file is required by karma.conf.js and loads recursively all the .spec and framework files
|
||||
|
||||
import 'core-js/es7/reflect';
|
||||
import 'zone.js/dist/zone';
|
||||
import 'zone.js/dist/zone-testing';
|
||||
import { getTestBed } from '@angular/core/testing';
|
||||
|
@@ -18,7 +18,6 @@
|
||||
]
|
||||
},
|
||||
"angularCompilerOptions": {
|
||||
"annotateForClosureCompiler": true,
|
||||
"skipTemplateCodegen": true,
|
||||
"strictMetadataEmit": true,
|
||||
"fullTemplateTypeCheck": true,
|
||||
|
6
projects/adf-office-services-ext/tsconfig.lib.prod.json
Normal file
6
projects/adf-office-services-ext/tsconfig.lib.prod.json
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"extends": "./tsconfig.lib.json",
|
||||
"angularCompilerOptions": {
|
||||
"enableIvy": false
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user