ng-hub-ui-portal
Version:
A flexible Angular portal library for dynamic content rendering with advanced positioning and interaction control
84 lines • 9.58 kB
JavaScript
import { inject, Injectable, Injector } from '@angular/core';
import { HubPortalConfig } from './portal-config';
import { HubPortalStack } from './portal-stack';
import * as i0 from "@angular/core";
/**
* A service for opening portal windows.
*
* Creating a portal is straightforward: create a component or a template and pass it as an argument to
* the `.open()` method.
*/
export class HubPortal {
constructor() {
this._injector = inject(Injector);
this._portalStack = inject(HubPortalStack);
this._config = inject(HubPortalConfig);
}
/**
* Opens a new portal window with the specified content and supplied options.
*
* Content can be provided as a `TemplateRef` or a component type. If you pass a component type as content,
* then instances of those components can be injected with an instance of the `HubActivePortal` class. You can then
* use `HubActivePortal` methods to close / dismiss portals from "inside" of your component.
*
* Also see the [`HubPortalOptions`](#/components/portal/api#HubPortalOptions) for the list of supported options.
*/
open(content, options = {}) {
const combinedOptions = {
...this._config,
animation: this._config.animation,
...options
};
return this._portalStack.open(this._injector, content, combinedOptions);
}
/**
* The function `toggle` opens a portal with specified content and options while dismissing any existing portals.
*
* @param {any} content - The `content` parameter in the `toggle` function is the content that you want to display within the
* portal. This can be any type of content such as a component, template, or any other HTML element that you want to show in the
* portal.
* @param {HubPortalOptions} options - The `options` parameter in the `toggle` function is an object that allows you to customize
* the behavior of the portal.
*
* @returns The `toggle` function is returning a `HubPortalRef` object.
*/
toggle(content, options = {}) {
const combinedOptions = {
...this._config,
animation: this._config.animation,
...options
};
// this.dismissAll();
// return this._portalStack.open(this._injector, content, combinedOptions);
return this._portalStack.toggle(this._injector, content, combinedOptions);
}
/**
* Returns an observable that holds the active portal instances.
*/
get activeInstances() {
return this._portalStack.activeInstances;
}
/**
* Dismisses all currently displayed portal windows with the supplied reason.
*
* @since 3.1.0
*/
dismissAll(reason) {
this._portalStack.dismissAll(reason);
}
/**
* Indicates if there are currently any open portal windows in the application.
*
* @since 3.3.0
*/
hasOpenPortals() {
return this._portalStack.hasOpenPortals();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubPortal, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubPortal, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HubPortal, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9ydGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcG9ydGFsL3NyYy9saWIvcG9ydGFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3RCxPQUFPLEVBQUUsZUFBZSxFQUFvQixNQUFNLGlCQUFpQixDQUFDO0FBRXBFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFaEQ7Ozs7O0dBS0c7QUFFSCxNQUFNLE9BQU8sU0FBUztJQUR0QjtRQUVTLGNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsaUJBQVksR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEMsWUFBTyxHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztLQXNFMUM7SUFwRUE7Ozs7Ozs7O09BUUc7SUFDSCxJQUFJLENBQUMsT0FBWSxFQUFFLFVBQTRCLEVBQUU7UUFDaEQsTUFBTSxlQUFlLEdBQUc7WUFDdkIsR0FBRyxJQUFJLENBQUMsT0FBTztZQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDakMsR0FBRyxPQUFPO1NBQ1YsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSCxNQUFNLENBQUMsT0FBWSxFQUFFLFVBQTRCLEVBQUU7UUFDbEQsTUFBTSxlQUFlLEdBQUc7WUFDdkIsR0FBRyxJQUFJLENBQUMsT0FBTztZQUNmLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7WUFDakMsR0FBRyxPQUFPO1NBQ1YsQ0FBQztRQUNGLHFCQUFxQjtRQUNyQiwyRUFBMkU7UUFDM0UsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FDOUIsSUFBSSxDQUFDLFNBQVMsRUFDZCxPQUFPLEVBQ1AsZUFBZSxDQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGVBQWU7UUFDbEIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQztJQUMxQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFVBQVUsQ0FBQyxNQUFZO1FBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMzQyxDQUFDOzhHQXhFVyxTQUFTO2tIQUFULFNBQVMsY0FESSxNQUFNOzsyRkFDbkIsU0FBUztrQkFEckIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEh1YlBvcnRhbENvbmZpZywgSHViUG9ydGFsT3B0aW9ucyB9IGZyb20gJy4vcG9ydGFsLWNvbmZpZyc7XG5pbXBvcnQgeyBIdWJQb3J0YWxSZWYgfSBmcm9tICcuL3BvcnRhbC1yZWYnO1xuaW1wb3J0IHsgSHViUG9ydGFsU3RhY2sgfSBmcm9tICcuL3BvcnRhbC1zdGFjayc7XG5cbi8qKlxuICogQSBzZXJ2aWNlIGZvciBvcGVuaW5nIHBvcnRhbCB3aW5kb3dzLlxuICpcbiAqIENyZWF0aW5nIGEgcG9ydGFsIGlzIHN0cmFpZ2h0Zm9yd2FyZDogY3JlYXRlIGEgY29tcG9uZW50IG9yIGEgdGVtcGxhdGUgYW5kIHBhc3MgaXQgYXMgYW4gYXJndW1lbnQgdG9cbiAqIHRoZSBgLm9wZW4oKWAgbWV0aG9kLlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIEh1YlBvcnRhbCB7XG5cdHByaXZhdGUgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblx0cHJpdmF0ZSBfcG9ydGFsU3RhY2sgPSBpbmplY3QoSHViUG9ydGFsU3RhY2spO1xuXHRwcml2YXRlIF9jb25maWcgPSBpbmplY3QoSHViUG9ydGFsQ29uZmlnKTtcblxuXHQvKipcblx0ICogT3BlbnMgYSBuZXcgcG9ydGFsIHdpbmRvdyB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGVudCBhbmQgc3VwcGxpZWQgb3B0aW9ucy5cblx0ICpcblx0ICogQ29udGVudCBjYW4gYmUgcHJvdmlkZWQgYXMgYSBgVGVtcGxhdGVSZWZgIG9yIGEgY29tcG9uZW50IHR5cGUuIElmIHlvdSBwYXNzIGEgY29tcG9uZW50IHR5cGUgYXMgY29udGVudCxcblx0ICogdGhlbiBpbnN0YW5jZXMgb2YgdGhvc2UgY29tcG9uZW50cyBjYW4gYmUgaW5qZWN0ZWQgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGUgYEh1YkFjdGl2ZVBvcnRhbGAgY2xhc3MuIFlvdSBjYW4gdGhlblxuXHQgKiB1c2UgYEh1YkFjdGl2ZVBvcnRhbGAgbWV0aG9kcyB0byBjbG9zZSAvIGRpc21pc3MgcG9ydGFscyBmcm9tIFwiaW5zaWRlXCIgb2YgeW91ciBjb21wb25lbnQuXG5cdCAqXG5cdCAqIEFsc28gc2VlIHRoZSBbYEh1YlBvcnRhbE9wdGlvbnNgXSgjL2NvbXBvbmVudHMvcG9ydGFsL2FwaSNIdWJQb3J0YWxPcHRpb25zKSBmb3IgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIG9wdGlvbnMuXG5cdCAqL1xuXHRvcGVuKGNvbnRlbnQ6IGFueSwgb3B0aW9uczogSHViUG9ydGFsT3B0aW9ucyA9IHt9KTogSHViUG9ydGFsUmVmIHtcblx0XHRjb25zdCBjb21iaW5lZE9wdGlvbnMgPSB7XG5cdFx0XHQuLi50aGlzLl9jb25maWcsXG5cdFx0XHRhbmltYXRpb246IHRoaXMuX2NvbmZpZy5hbmltYXRpb24sXG5cdFx0XHQuLi5vcHRpb25zXG5cdFx0fTtcblx0XHRyZXR1cm4gdGhpcy5fcG9ydGFsU3RhY2sub3Blbih0aGlzLl9pbmplY3RvciwgY29udGVudCwgY29tYmluZWRPcHRpb25zKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZnVuY3Rpb24gYHRvZ2dsZWAgb3BlbnMgYSBwb3J0YWwgd2l0aCBzcGVjaWZpZWQgY29udGVudCBhbmQgb3B0aW9ucyB3aGlsZSBkaXNtaXNzaW5nIGFueSBleGlzdGluZyBwb3J0YWxzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge2FueX0gY29udGVudCAtIFRoZSBgY29udGVudGAgcGFyYW1ldGVyIGluIHRoZSBgdG9nZ2xlYCBmdW5jdGlvbiBpcyB0aGUgY29udGVudCB0aGF0IHlvdSB3YW50IHRvIGRpc3BsYXkgd2l0aGluIHRoZVxuXHQgKiBwb3J0YWwuIFRoaXMgY2FuIGJlIGFueSB0eXBlIG9mIGNvbnRlbnQgc3VjaCBhcyBhIGNvbXBvbmVudCwgdGVtcGxhdGUsIG9yIGFueSBvdGhlciBIVE1MIGVsZW1lbnQgdGhhdCB5b3Ugd2FudCB0byBzaG93IGluIHRoZVxuXHQgKiBwb3J0YWwuXG5cdCAqIEBwYXJhbSB7SHViUG9ydGFsT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBgb3B0aW9uc2AgcGFyYW1ldGVyIGluIHRoZSBgdG9nZ2xlYCBmdW5jdGlvbiBpcyBhbiBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIGN1c3RvbWl6ZVxuXHQgKiB0aGUgYmVoYXZpb3Igb2YgdGhlIHBvcnRhbC5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIGB0b2dnbGVgIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIGBIdWJQb3J0YWxSZWZgIG9iamVjdC5cblx0ICovXG5cdHRvZ2dsZShjb250ZW50OiBhbnksIG9wdGlvbnM6IEh1YlBvcnRhbE9wdGlvbnMgPSB7fSk6IEh1YlBvcnRhbFJlZiB7XG5cdFx0Y29uc3QgY29tYmluZWRPcHRpb25zID0ge1xuXHRcdFx0Li4udGhpcy5fY29uZmlnLFxuXHRcdFx0YW5pbWF0aW9uOiB0aGlzLl9jb25maWcuYW5pbWF0aW9uLFxuXHRcdFx0Li4ub3B0aW9uc1xuXHRcdH07XG5cdFx0Ly8gdGhpcy5kaXNtaXNzQWxsKCk7XG5cdFx0Ly8gcmV0dXJuIHRoaXMuX3BvcnRhbFN0YWNrLm9wZW4odGhpcy5faW5qZWN0b3IsIGNvbnRlbnQsIGNvbWJpbmVkT3B0aW9ucyk7XG5cdFx0cmV0dXJuIHRoaXMuX3BvcnRhbFN0YWNrLnRvZ2dsZShcblx0XHRcdHRoaXMuX2luamVjdG9yLFxuXHRcdFx0Y29udGVudCxcblx0XHRcdGNvbWJpbmVkT3B0aW9uc1xuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHRoYXQgaG9sZHMgdGhlIGFjdGl2ZSBwb3J0YWwgaW5zdGFuY2VzLlxuXHQgKi9cblx0Z2V0IGFjdGl2ZUluc3RhbmNlcygpIHtcblx0XHRyZXR1cm4gdGhpcy5fcG9ydGFsU3RhY2suYWN0aXZlSW5zdGFuY2VzO1xuXHR9XG5cblx0LyoqXG5cdCAqIERpc21pc3NlcyBhbGwgY3VycmVudGx5IGRpc3BsYXllZCBwb3J0YWwgd2luZG93cyB3aXRoIHRoZSBzdXBwbGllZCByZWFzb24uXG5cdCAqXG5cdCAqIEBzaW5jZSAzLjEuMFxuXHQgKi9cblx0ZGlzbWlzc0FsbChyZWFzb24/OiBhbnkpIHtcblx0XHR0aGlzLl9wb3J0YWxTdGFjay5kaXNtaXNzQWxsKHJlYXNvbik7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIGlmIHRoZXJlIGFyZSBjdXJyZW50bHkgYW55IG9wZW4gcG9ydGFsIHdpbmRvd3MgaW4gdGhlIGFwcGxpY2F0aW9uLlxuXHQgKlxuXHQgKiBAc2luY2UgMy4zLjBcblx0ICovXG5cdGhhc09wZW5Qb3J0YWxzKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9wb3J0YWxTdGFjay5oYXNPcGVuUG9ydGFscygpO1xuXHR9XG59XG4iXX0=