mirror of
https://github.com/Alfresco/alfresco-content-app.git
synced 2025-07-24 17:31:52 +00:00
[ACA-2873] Move acaContextActions to aca-shared library (#1301)
* move to aca-shared library * export directive * context menu action * import directive from shared library * context menu effect * test * update docs * fix production code * fix imports * fix licence header * fix licence headers
This commit is contained in:
committed by
Adina Parpalita
parent
b09c93b103
commit
8b7c7b5ed4
@@ -0,0 +1,67 @@
|
||||
/*!
|
||||
* @license
|
||||
* Alfresco Example Content Application
|
||||
*
|
||||
* Copyright (C) 2005 - 2020 Alfresco Software Limited
|
||||
*
|
||||
* 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
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { ContextActionsDirective } from './contextmenu.directive';
|
||||
import { ContextMenu } from '@alfresco/aca-shared/store';
|
||||
import { fakeAsync, tick } from '@angular/core/testing';
|
||||
|
||||
describe('ContextActionsDirective', () => {
|
||||
let directive;
|
||||
const storeMock = <any>{
|
||||
dispatch: jasmine.createSpy('dispatch')
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
directive = new ContextActionsDirective(storeMock);
|
||||
});
|
||||
|
||||
it('should not render context menu when `enabled` property is false', () => {
|
||||
directive.enabled = false;
|
||||
directive.onContextMenuEvent(new MouseEvent('contextmenu'));
|
||||
|
||||
expect(storeMock.dispatch).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('should call service to render context menu', fakeAsync(() => {
|
||||
const el = document.createElement('div');
|
||||
el.className =
|
||||
'adf-datatable-cell adf-datatable-cell--text adf-datatable-row';
|
||||
|
||||
const fragment = document.createDocumentFragment();
|
||||
fragment.appendChild(el);
|
||||
const target = fragment.querySelector('div');
|
||||
const mouseEventMock = <any>{ preventDefault: () => {}, target };
|
||||
|
||||
directive.ngOnInit();
|
||||
|
||||
directive.onContextMenuEvent(mouseEventMock);
|
||||
|
||||
tick(500);
|
||||
|
||||
expect(storeMock.dispatch).toHaveBeenCalledWith(
|
||||
new ContextMenu(mouseEventMock)
|
||||
);
|
||||
}));
|
||||
});
|
@@ -0,0 +1,112 @@
|
||||
/*!
|
||||
* @license
|
||||
* Alfresco Example Content Application
|
||||
*
|
||||
* Copyright (C) 2005 - 2020 Alfresco Software Limited
|
||||
*
|
||||
* 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
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import {
|
||||
Directive,
|
||||
HostListener,
|
||||
Input,
|
||||
OnInit,
|
||||
OnDestroy
|
||||
} from '@angular/core';
|
||||
import { debounceTime, takeUntil } from 'rxjs/operators';
|
||||
import { Subject } from 'rxjs';
|
||||
import { Store } from '@ngrx/store';
|
||||
import { AppStore, ContextMenu } from '@alfresco/aca-shared/store';
|
||||
|
||||
@Directive({
|
||||
selector: '[acaContextActions]',
|
||||
exportAs: 'acaContextActions'
|
||||
})
|
||||
export class ContextActionsDirective implements OnInit, OnDestroy {
|
||||
private execute$: Subject<any> = new Subject();
|
||||
onDestroy$: Subject<boolean> = new Subject<boolean>();
|
||||
|
||||
// tslint:disable-next-line:no-input-rename
|
||||
@Input('acaContextEnable')
|
||||
enabled = true;
|
||||
|
||||
@HostListener('contextmenu', ['$event'])
|
||||
onContextMenuEvent(event: MouseEvent) {
|
||||
if (event) {
|
||||
event.preventDefault();
|
||||
|
||||
if (this.enabled) {
|
||||
const target = this.getTarget(event);
|
||||
if (target) {
|
||||
this.execute(event, target);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
constructor(private store: Store<AppStore>) {}
|
||||
|
||||
ngOnInit() {
|
||||
this.execute$
|
||||
.pipe(
|
||||
debounceTime(300),
|
||||
takeUntil(this.onDestroy$)
|
||||
)
|
||||
.subscribe((event: MouseEvent) => {
|
||||
this.store.dispatch(new ContextMenu(event));
|
||||
});
|
||||
}
|
||||
|
||||
ngOnDestroy() {
|
||||
this.onDestroy$.next(true);
|
||||
this.onDestroy$.complete();
|
||||
}
|
||||
|
||||
execute(event: MouseEvent, target: Element) {
|
||||
if (!this.isSelected(target)) {
|
||||
target.dispatchEvent(new MouseEvent('click'));
|
||||
}
|
||||
|
||||
this.execute$.next(event);
|
||||
}
|
||||
|
||||
private getTarget(event: MouseEvent): Element {
|
||||
return this.findAncestor(<Element>event.target, 'adf-datatable-cell');
|
||||
}
|
||||
|
||||
private isSelected(target: Element): boolean {
|
||||
if (!target) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return this.findAncestor(target, 'adf-datatable-row').classList.contains(
|
||||
'adf-is-selected'
|
||||
);
|
||||
}
|
||||
|
||||
private findAncestor(el: Element, className: string): Element {
|
||||
if (el.classList.contains(className)) {
|
||||
return el;
|
||||
}
|
||||
// tslint:disable-next-line:curly
|
||||
while ((el = el.parentElement) && !el.classList.contains(className));
|
||||
return el;
|
||||
}
|
||||
}
|
@@ -0,0 +1,33 @@
|
||||
/*!
|
||||
* @license
|
||||
* Alfresco Example Content Application
|
||||
*
|
||||
* Copyright (C) 2005 - 2020 Alfresco Software Limited
|
||||
*
|
||||
* 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
|
||||
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { NgModule } from '@angular/core';
|
||||
import { ContextActionsDirective } from './contextmenu.directive';
|
||||
|
||||
@NgModule({
|
||||
declarations: [ContextActionsDirective],
|
||||
exports: [ContextActionsDirective]
|
||||
})
|
||||
export class ContextActionsModule {}
|
@@ -27,8 +27,11 @@ import { NgModule, ModuleWithProviders } from '@angular/core';
|
||||
import { ContentApiService } from './services/content-api.service';
|
||||
import { NodePermissionService } from './services/node-permission.service';
|
||||
import { AppService } from './services/app.service';
|
||||
|
||||
@NgModule({})
|
||||
import { ContextActionsModule } from './directives/contextmenu/contextmenu.module';
|
||||
@NgModule({
|
||||
imports: [ContextActionsModule],
|
||||
exports: [ContextActionsModule]
|
||||
})
|
||||
export class SharedModule {
|
||||
static forRoot(): ModuleWithProviders {
|
||||
return {
|
||||
|
@@ -39,4 +39,7 @@ export * from './lib/services/node-permission.service';
|
||||
export * from './lib/components/generic-error/generic-error.component';
|
||||
export * from './lib/components/generic-error/generic-error.module';
|
||||
|
||||
export * from './lib/directives/contextmenu/contextmenu.directive';
|
||||
export * from './lib/directives/contextmenu/contextmenu.module';
|
||||
|
||||
export * from './lib/shared.module';
|
||||
|
Reference in New Issue
Block a user