Files
alfresco-content-app/projects/aca-content/src/lib/components/context-menu/context-menu.service.ts
Nikita Maliarchuk 7245e994c5 [ACS-4959] Update license headers to reflect Hyland Copyright Guidelines (#3115)
* [ACS-4959] install eslint-plugin-license-header plugin

* [ACS-4959] configure new license

* [ACS-4959] aca-folder-rules license update

* [ACS-4959] content-ce license update

* [ACS-4959] app-e2e license update

* [ACS-4959] adf-office-services-ext license update

* [ACS-4959] aca-shared update license

* [ACS-4959] aca-about license update

* [ACS-4959] aca-content license update

* [ACS-4959] aca-viewer & aca-preview license update

* [ACS-4959] other files license update

* [ACS-4959] patern fix

* [ACS-4959] vendors updated

* [ACS-4959] path fix

* [ACS-4959] some more vendors update

* [ACS-4959] license update
2023-04-13 04:32:30 -04:00

112 lines
4.0 KiB
TypeScript

/*!
* 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 <http://www.gnu.org/licenses/>.
*/
import { Injectable, Injector, ComponentRef } from '@angular/core';
import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
import { ComponentPortal } from '@angular/cdk/portal';
import { ContextMenuOverlayRef } from './context-menu-overlay';
import { ContextMenuComponent } from './context-menu.component';
import { ContextmenuOverlayConfig } from './interfaces';
import { UserPreferencesService } from '@alfresco/adf-core';
import { Directionality } from '@angular/cdk/bidi';
import { CONTEXT_MENU_DIRECTION } from './direction.token';
@Injectable({
providedIn: 'root'
})
export class ContextMenuService {
private direction: Directionality;
constructor(private injector: Injector, private overlay: Overlay, private userPreferenceService: UserPreferencesService) {
this.userPreferenceService.select('textOrientation').subscribe((textOrientation) => {
this.direction = textOrientation;
});
}
open(config: ContextmenuOverlayConfig): ContextMenuOverlayRef {
const overlay = this.createOverlay(config);
const overlayRef = new ContextMenuOverlayRef(overlay);
this.attachDialogContainer(overlay, overlayRef);
return overlayRef;
}
private createOverlay(config: ContextmenuOverlayConfig): OverlayRef {
const overlayConfig = this.getOverlayConfig(config);
return this.overlay.create(overlayConfig);
}
private attachDialogContainer(overlay: OverlayRef, contextmenuOverlayRef: ContextMenuOverlayRef): ContextMenuComponent {
const injector = this.createInjector(contextmenuOverlayRef);
const containerPortal = new ComponentPortal(ContextMenuComponent, null, injector);
const containerRef: ComponentRef<ContextMenuComponent> = overlay.attach(containerPortal);
return containerRef.instance;
}
private createInjector(contextmenuOverlayRef: ContextMenuOverlayRef): Injector {
const injectionTokens = new WeakMap();
injectionTokens.set(ContextMenuOverlayRef, contextmenuOverlayRef);
injectionTokens.set(CONTEXT_MENU_DIRECTION, this.direction);
return Injector.create({
parent: this.injector,
providers: [
{ provide: ContextMenuOverlayRef, useValue: contextmenuOverlayRef },
{ provide: CONTEXT_MENU_DIRECTION, useValue: this.direction }
]
});
}
private getOverlayConfig(config: ContextmenuOverlayConfig): OverlayConfig {
const { x, y } = config.source;
const positionStrategy = this.overlay
.position()
.flexibleConnectedTo({ x, y })
.withPositions([
{
originX: 'end',
originY: 'bottom',
overlayX: 'end',
overlayY: 'top'
}
]);
const overlayConfig = new OverlayConfig({
hasBackdrop: config.hasBackdrop,
backdropClass: config.backdropClass,
panelClass: config.panelClass,
scrollStrategy: this.overlay.scrollStrategies.close(),
positionStrategy,
direction: this.direction
});
return overlayConfig;
}
}