@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
198 lines • 15.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable, Injector } from '@angular/core';
import { Overlay, OverlayConfig, OverlayPositionBuilder } from '@angular/cdk/overlay';
import { ComponentPortal, PortalInjector } from '@angular/cdk/portal';
import { PopoverRef } from './popover-ref';
import { POPOVER_CONTENT_DATA } from './popover.tokens';
import { PopoverContainer } from './popover-container.component';
import { fromEvent } from 'rxjs';
import { skip, filter, take } from 'rxjs/operators';
/** @type {?} */
const positions = {
bottom: {
originY: 'bottom',
overlayY: 'top',
offsetY: 4,
},
top: {
originY: 'top',
overlayY: 'bottom',
offsetY: -4,
}
};
/** @type {?} */
const alignments = {
left: {
originX: 'start',
overlayX: 'start',
},
right: {
originX: 'end',
overlayX: 'end',
},
center: {
originX: 'center',
overlayX: 'center',
}
};
/**
* @record
*/
export function PopoverConfig() { }
if (false) {
/** @type {?|undefined} */
PopoverConfig.prototype.content;
/** @type {?} */
PopoverConfig.prototype.position;
/** @type {?} */
PopoverConfig.prototype.alignment;
}
/** @type {?} */
const DEFAULT_CONFIG = {
content: null,
position: 'bottom',
alignment: 'left',
};
export class PopoverService {
/**
* @param {?} injector
* @param {?} overlay
* @param {?} overlayPositionBuilder
*/
constructor(injector, overlay, overlayPositionBuilder) {
this.injector = injector;
this.overlay = overlay;
this.overlayPositionBuilder = overlayPositionBuilder;
}
/**
* @param {?=} config
* @param {?=} target
* @return {?}
*/
open(config = DEFAULT_CONFIG, target) {
// Override default configuration
/** @type {?} */
const popoverConfig = Object.assign({}, DEFAULT_CONFIG, config);
// Returns an OverlayRef which is a PortalHost
/** @type {?} */
const overlayRef = this.createOverlay(popoverConfig, target);
// Instantiate remote control
/** @type {?} */
const popoverRef = new PopoverRef(overlayRef);
/** @type {?} */
const overlayComponent = this.attachPopoverContainer(overlayRef, popoverConfig, popoverRef);
popoverRef.componentInstance = overlayComponent;
this.clickSubscription = fromEvent(document, 'click')
.pipe(skip(1), filter((/**
* @param {?} event
* @return {?}
*/
event => {
/** @type {?} */
const clickTarget = (/** @type {?} */ (event.target));
return overlayRef && overlayRef.overlayElement && !overlayRef.overlayElement.contains(clickTarget);
})), take(1)).subscribe((/**
* @param {?} _
* @return {?}
*/
_ => {
popoverRef.close();
this.clickSubscription.unsubscribe();
}));
return popoverRef;
}
/**
* @private
* @param {?} config
* @param {?} target
* @return {?}
*/
createOverlay(config, target) {
/** @type {?} */
const overlayConfig = this.getOverlayConfig(config, target);
return this.overlay.create(overlayConfig);
}
/**
* @private
* @param {?} overlayRef
* @param {?} config
* @param {?} popoverRef
* @return {?}
*/
attachPopoverContainer(overlayRef, config, popoverRef) {
/** @type {?} */
const injector = this.createInjector(config, popoverRef);
/** @type {?} */
const containerPortal = new ComponentPortal(PopoverContainer, null, injector);
/** @type {?} */
const containerRef = overlayRef.attach(containerPortal);
return containerRef.instance;
}
/**
* @private
* @param {?} config
* @param {?} popoverRef
* @return {?}
*/
createInjector(config, popoverRef) {
/** @type {?} */
const injectionTokens = new WeakMap();
injectionTokens.set(PopoverRef, popoverRef);
injectionTokens.set(POPOVER_CONTENT_DATA, config.content);
return new PortalInjector(this.injector, injectionTokens);
}
/**
* @private
* @param {?} config
* @param {?} target
* @return {?}
*/
getOverlayConfig(config, target) {
/** @type {?} */
const positionStrategy = this.overlayPositionBuilder
.flexibleConnectedTo(target)
.withPositions([(/** @type {?} */ (Object.assign({}, positions[config.position], alignments[config.alignment])))]);
/** @type {?} */
const overlayConfig = new OverlayConfig({
hasBackdrop: false,
scrollStrategy: this.overlay.scrollStrategies.close(),
positionStrategy
});
return overlayConfig;
}
}
PopoverService.decorators = [
{ type: Injectable }
];
/** @nocollapse */
PopoverService.ctorParameters = () => [
{ type: Injector },
{ type: Overlay },
{ type: OverlayPositionBuilder }
];
if (false) {
/**
* @type {?}
* @private
*/
PopoverService.prototype.clickSubscription;
/**
* @type {?}
* @private
*/
PopoverService.prototype.injector;
/**
* @type {?}
* @private
*/
PopoverService.prototype.overlay;
/**
* @type {?}
* @private
*/
PopoverService.prototype.overlayPositionBuilder;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGt1c2hraS9uZy1zdWthLyIsInNvdXJjZXMiOlsibGliL3BvcG92ZXIvcG9wb3Zlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBeUMsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWMsc0JBQXNCLEVBQXFCLE1BQU0sc0JBQXNCLENBQUM7QUFDckgsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2pFLE9BQU8sRUFBZ0IsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDOztNQUc5QyxTQUFTLEdBQUc7SUFDaEIsTUFBTSxFQUFFO1FBQ04sT0FBTyxFQUFFLFFBQVE7UUFDakIsUUFBUSxFQUFFLEtBQUs7UUFDZixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBQ0QsR0FBRyxFQUFFO1FBQ0gsT0FBTyxFQUFFLEtBQUs7UUFDZCxRQUFRLEVBQUUsUUFBUTtRQUNsQixPQUFPLEVBQUUsQ0FBQyxDQUFDO0tBQ1o7Q0FDRjs7TUFFSyxVQUFVLEdBQUc7SUFDakIsSUFBSSxFQUFFO1FBQ0osT0FBTyxFQUFFLE9BQU87UUFDaEIsUUFBUSxFQUFFLE9BQU87S0FDbEI7SUFDRCxLQUFLLEVBQUU7UUFDTCxPQUFPLEVBQUUsS0FBSztRQUNkLFFBQVEsRUFBRSxLQUFLO0tBQ2hCO0lBQ0QsTUFBTSxFQUFF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Ozs7OztJQUVPLGdCQUFnQixDQUFDLE1BQXFCLEVBQUUsTUFBZ0M7O2NBQ3hFLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0I7YUFDakQsbUJBQW1CLENBQUMsTUFBTSxDQUFDO2FBQzNCLGFBQWEsQ0FBQyxDQUFDLHFDQUFLLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBdUIsQ0FBQyxDQUFDOztjQUVyRyxhQUFhLEdBQUcsSUFBSSxhQUFhLENBQUM7WUFDdEMsV0FBVyxFQUFFLEtBQUs7WUFDbEIsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFO1lBQ3JELGdCQUFnQjtTQUNqQixDQUFDO1FBRUYsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQzs7O1lBM0VGLFVBQVU7Ozs7WUFuRFUsUUFBUTtZQUNwQixPQUFPO1lBQTZCLHNCQUFzQjs7Ozs7OztJQW9EakUsMkNBQXdDOzs7OztJQUd0QyxrQ0FBMEI7Ozs7O0lBQzFCLGlDQUF3Qjs7Ozs7SUFDeEIsZ0RBQXNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIENvbXBvbmVudFJlZiwgVGVtcGxhdGVSZWYsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWYsIE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIsIENvbm5lY3RlZFBvc2l0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgQ29tcG9uZW50UG9ydGFsLCBQb3J0YWxJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuXG5pbXBvcnQgeyBQb3BvdmVyUmVmIH0gZnJvbSAnLi9wb3BvdmVyLXJlZic7XG5pbXBvcnQgeyBQT1BPVkVSX0NPTlRFTlRfREFUQSB9IGZyb20gJy4vcG9wb3Zlci50b2tlbnMnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbnRhaW5lciB9IGZyb20gJy4vcG9wb3Zlci1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBza2lwLCBmaWx0ZXIsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBQb3BvdmVyQ29udGVudCB9IGZyb20gJy4vcG9wb3Zlci1jb250ZW50JztcblxuY29uc3QgcG9zaXRpb25zID0ge1xuICBib3R0b206IHtcbiAgICBvcmlnaW5ZOiAnYm90dG9tJyxcbiAgICBvdmVybGF5WTogJ3RvcCcsXG4gICAgb2Zmc2V0WTogNCxcbiAgfSxcbiAgdG9wOiB7XG4gICAgb3JpZ2luWTogJ3RvcCcsXG4gICAgb3ZlcmxheVk6ICdib3R0b20nLFxuICAgIG9mZnNldFk6IC00LFxuICB9XG59O1xuXG5jb25zdCBhbGlnbm1lbnRzID0ge1xuICBsZWZ0OiB7XG4gICAgb3JpZ2luWDogJ3N0YXJ0JyxcbiAgICBvdmVybGF5WDogJ3N0YXJ0JyxcbiAgfSxcbiAgcmlnaHQ6IHtcbiAgICBvcmlnaW5YOiAnZW5kJyxcbiAgICBvdmVybGF5WDogJ2VuZCcsXG4gIH0sXG4gIGNlbnRlcjoge1xuICAgIG9yaWdpblg6ICdjZW50ZXInLFxuICAgIG92ZXJsYXlYOiAnY2VudGVyJyxcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvcG92ZXJDb25maWcge1xuICBjb250ZW50PzogUG9wb3ZlckNvbnRlbnQ7XG4gIHBvc2l0aW9uOiAndG9wJyB8ICdib3R0b20nO1xuICBhbGlnbm1lbnQ6ICdsZWZ0JyB8ICdyaWdodCcgfCAnY2VudGVyJztcbn1cblxuY29uc3QgREVGQVVMVF9DT05GSUc6IFBvcG92ZXJDb25maWcgPSB7XG4gIGNvbnRlbnQ6IG51bGwsXG4gIHBvc2l0aW9uOiAnYm90dG9tJyxcbiAgYWxpZ25tZW50OiAnbGVmdCcsXG59O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUG9wb3ZlclNlcnZpY2Uge1xuICBwcml2YXRlIGNsaWNrU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgb3ZlcmxheVBvc2l0aW9uQnVpbGRlcjogT3ZlcmxheVBvc2l0aW9uQnVpbGRlcixcbiAgKSB7IH1cblxuICBvcGVuKGNvbmZpZzogUG9wb3ZlckNvbmZpZyA9IERFRkFVTFRfQ09ORklHLCB0YXJnZXQ6IEVsZW1lbnRSZWYgfCBIVE1MRWxlbWVudCkge1xuICAgIC8vIE92ZXJyaWRlIGRlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHBvcG92ZXJDb25maWcgPSB7IC4uLkRFRkFVTFRfQ09ORklHLCAuLi5jb25maWcgfTtcblxuICAgIC8vIFJldHVybnMgYW4gT3ZlcmxheVJlZiB3aGljaCBpcyBhIFBvcnRhbEhvc3RcbiAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5jcmVhdGVPdmVybGF5KHBvcG92ZXJDb25maWcsIHRhcmdldCk7XG5cbiAgICAvLyBJbnN0YW50aWF0ZSByZW1vdGUgY29udHJvbFxuICAgIGNvbnN0IHBvcG92ZXJSZWYgPSBuZXcgUG9wb3ZlclJlZihvdmVybGF5UmVmKTtcblxuICAgIGNvbnN0IG92ZXJsYXlDb21wb25lbnQgPSB0aGlzLmF0dGFjaFBvcG92ZXJDb250YWluZXIob3ZlcmxheVJlZiwgcG9wb3ZlckNvbmZpZywgcG9wb3ZlclJlZik7XG5cbiAgICBwb3BvdmVyUmVmLmNvbXBvbmVudEluc3RhbmNlID0gb3ZlcmxheUNvbXBvbmVudDtcblxuICAgIHRoaXMuY2xpY2tTdWJzY3JpcHRpb24gPSBmcm9tRXZlbnQ8TW91c2VFdmVudD4oZG9jdW1lbnQsICdjbGljaycpXG4gICAgICAucGlwZShcbiAgICAgICAgc2tpcCgxKSxcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjbGlja1RhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICByZXR1cm4gb3ZlcmxheVJlZiAmJiBvdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50ICYmICFvdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmNvbnRhaW5zKGNsaWNrVGFyZ2V0KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2UoMSlcbiAgICAgICkuc3Vic2NyaWJlKF8gPT4ge1xuICAgICAgICBwb3BvdmVyUmVmLmNsb3NlKCk7XG4gICAgICAgIHRoaXMuY2xpY2tTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHBvcG92ZXJSZWY7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU92ZXJsYXkoY29uZmlnOiBQb3BvdmVyQ29uZmlnLCB0YXJnZXQ6IEVsZW1lbnRSZWYgfCBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSB0aGlzLmdldE92ZXJsYXlDb25maWcoY29uZmlnLCB0YXJnZXQpO1xuICAgIHJldHVybiB0aGlzLm92ZXJsYXkuY3JlYXRlKG92ZXJsYXlDb25maWcpO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hQb3BvdmVyQ29udGFpbmVyKG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsIGNvbmZpZzogUG9wb3ZlckNvbmZpZywgcG9wb3ZlclJlZjogUG9wb3ZlclJlZikge1xuICAgIGNvbnN0IGluamVjdG9yID0gdGhpcy5jcmVhdGVJbmplY3Rvcihjb25maWcsIHBvcG92ZXJSZWYpO1xuXG4gICAgY29uc3QgY29udGFpbmVyUG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChQb3BvdmVyQ29udGFpbmVyLCBudWxsLCBpbmplY3Rvcik7XG4gICAgY29uc3QgY29udGFpbmVyUmVmOiBDb21wb25lbnRSZWY8UG9wb3ZlckNvbnRhaW5lcj4gPSBvdmVybGF5UmVmLmF0dGFjaChjb250YWluZXJQb3J0YWwpO1xuXG4gICAgcmV0dXJuIGNvbnRhaW5lclJlZi5pbnN0YW5jZTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlSW5qZWN0b3IoY29uZmlnOiBQb3BvdmVyQ29uZmlnLCBwb3BvdmVyUmVmOiBQb3BvdmVyUmVmKTogUG9ydGFsSW5qZWN0b3Ige1xuICAgIGNvbnN0IGluamVjdGlvblRva2VucyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBpbmplY3Rpb25Ub2tlbnMuc2V0KFBvcG92ZXJSZWYsIHBvcG92ZXJSZWYpO1xuICAgIGluamVjdGlvblRva2Vucy5zZXQoUE9QT1ZFUl9DT05URU5UX0RBVEEsIGNvbmZpZy5jb250ZW50KTtcblxuICAgIHJldHVybiBuZXcgUG9ydGFsSW5qZWN0b3IodGhpcy5pbmplY3RvciwgaW5qZWN0aW9uVG9rZW5zKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3ZlcmxheUNvbmZpZyhjb25maWc6IFBvcG92ZXJDb25maWcsIHRhcmdldDogRWxlbWVudFJlZiB8IEhUTUxFbGVtZW50KTogT3ZlcmxheUNvbmZpZyB7XG4gICAgY29uc3QgcG9zaXRpb25TdHJhdGVneSA9IHRoaXMub3ZlcmxheVBvc2l0aW9uQnVpbGRlclxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGFyZ2V0KVxuICAgICAgLndpdGhQb3NpdGlvbnMoW3sgLi4ucG9zaXRpb25zW2NvbmZpZy5wb3NpdGlvbl0sIC4uLmFsaWdubWVudHNbY29uZmlnLmFsaWdubWVudF0gfSBhcyBDb25uZWN0ZWRQb3NpdGlvbl0pO1xuXG4gICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IG5ldyBPdmVybGF5Q29uZmlnKHtcbiAgICAgIGhhc0JhY2tkcm9wOiBmYWxzZSxcbiAgICAgIHNjcm9sbFN0cmF0ZWd5OiB0aGlzLm92ZXJsYXkuc2Nyb2xsU3RyYXRlZ2llcy5jbG9zZSgpLFxuICAgICAgcG9zaXRpb25TdHJhdGVneVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG92ZXJsYXlDb25maWc7XG4gIH1cbn1cbiJdfQ==