@nova-ui/bits
Version:
SolarWinds Nova Framework
91 lines • 11.3 kB
JavaScript
// © 2022 SolarWinds Worldwide, LLC. All rights reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import { Injectable } from "@angular/core";
import includes from "lodash/includes";
import isUndefined from "lodash/isUndefined";
import * as i0 from "@angular/core";
/**
* <example-url>./../examples/index.html#/common/event-propagation-service</example-url>
*/
/**
* Service that provides event propagation rules for NUI components.
*
* __Name :__
* Event Propagation service
*
*/
/** @ignore */
export class EventPropagationService {
constructor() {
this.preventedTargetSelectors = [
"a",
"nui-checkbox-mark",
"nui-checkbox-glyph",
"nui-checkbox-input",
"input",
"button",
];
// nui-button uses transclusion and so we need to check the parent too
this.preventedTargetParentSelectors = [
"button",
"nui-button-content",
];
}
/**
* __Description:__
* Returns a boolean which indicates if event should propagate based on predefined list of selectors.
* @param event Event to handle propagation.
* @returns Value indicating whether that event should be propagated.
*/
targetShouldPropagate(event) {
// TODO: Refactor event.target logic, incorrect type, EventTarget type does not contain parentElement property
const element = event.target;
const parentElement = element.parentElement ?? undefined;
this.should = true;
if (isUndefined(parentElement)) {
throw new Error("parentElement is not defined");
}
this.compareElementSelector(this.preventedTargetSelectors, element);
this.compareElementSelector(this.preventedTargetParentSelectors, parentElement);
return this.should;
}
/**
* __Description:__
* Helper compare function
* @param selectors Selectors list to compare with.
* @param element Event's target element or its parent.
* @returns Value indicating whether that event should be propagated.
*/
compareElementSelector(selectors, element) {
selectors.forEach((selector) => {
if (element.tagName.toLowerCase() === selector ||
includes(element.classList, selector)) {
return (this.should = false);
}
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EventPropagationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EventPropagationService, providedIn: "root" }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EventPropagationService, decorators: [{
type: Injectable,
args: [{ providedIn: "root" }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtcHJvcGFnYXRpb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9ldmVudC1wcm9wYWdhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sUUFBUSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sV0FBVyxNQUFNLG9CQUFvQixDQUFDOztBQUk3Qzs7R0FFRztBQUVIOzs7Ozs7R0FNRztBQUVILGNBQWM7QUFFZCxNQUFNLE9BQU8sdUJBQXVCO0lBRHBDO1FBRVksNkJBQXdCLEdBQWE7WUFDekMsR0FBRztZQUNILG1CQUFtQjtZQUNuQixvQkFBb0I7WUFDcEIsb0JBQW9CO1lBQ3BCLE9BQU87WUFDUCxRQUFRO1NBQ1gsQ0FBQztRQUVGLHNFQUFzRTtRQUM5RCxtQ0FBOEIsR0FBYTtZQUMvQyxRQUFRO1lBQ1Isb0JBQW9CO1NBQ3ZCLENBQUM7S0ErQ0w7SUEzQ0c7Ozs7O09BS0c7SUFDSSxxQkFBcUIsQ0FBQyxLQUFZO1FBQ3JDLDhHQUE4RztRQUM5RyxNQUFNLE9BQU8sR0FBWSxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQ3RDLE1BQU0sYUFBYSxHQUNmLE9BQU8sQ0FBQyxhQUFhLElBQUksU0FBUyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBRW5CLElBQUksV0FBVyxDQUFDLGFBQWEsQ0FBQyxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLHNCQUFzQixDQUN2QixJQUFJLENBQUMsOEJBQThCLEVBQ25DLGFBQWEsQ0FDaEIsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssc0JBQXNCLENBQUMsU0FBbUIsRUFBRSxPQUFnQjtRQUNoRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxFQUFFO1lBQ25DLElBQ0ksT0FBTyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO2dCQUMxQyxRQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsRUFDdkM7Z0JBQ0UsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7YUFDaEM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7K0dBNURRLHVCQUF1QjttSEFBdkIsdUJBQXVCLGNBRFYsTUFBTTs7NEZBQ25CLHVCQUF1QjtrQkFEbkMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgaW5jbHVkZXMgZnJvbSBcImxvZGFzaC9pbmNsdWRlc1wiO1xuaW1wb3J0IGlzVW5kZWZpbmVkIGZyb20gXCJsb2Rhc2gvaXNVbmRlZmluZWRcIjtcblxuaW1wb3J0IHsgSUV2ZW50UHJvcGFnYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4vcHVibGljLWFwaVwiO1xuXG4vKipcbiAqIDxleGFtcGxlLXVybD4uLy4uL2V4YW1wbGVzL2luZGV4Lmh0bWwjL2NvbW1vbi9ldmVudC1wcm9wYWdhdGlvbi1zZXJ2aWNlPC9leGFtcGxlLXVybD5cbiAqL1xuXG4vKipcbiAqICBTZXJ2aWNlIHRoYXQgcHJvdmlkZXMgZXZlbnQgcHJvcGFnYXRpb24gcnVsZXMgZm9yIE5VSSBjb21wb25lbnRzLlxuICpcbiAqIF9fTmFtZSA6X19cbiAqIEV2ZW50IFByb3BhZ2F0aW9uIHNlcnZpY2VcbiAqXG4gKi9cblxuLyoqIEBpZ25vcmUgKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogXCJyb290XCIgfSlcbmV4cG9ydCBjbGFzcyBFdmVudFByb3BhZ2F0aW9uU2VydmljZSBpbXBsZW1lbnRzIElFdmVudFByb3BhZ2F0aW9uU2VydmljZSB7XG4gICAgcHJpdmF0ZSBwcmV2ZW50ZWRUYXJnZXRTZWxlY3RvcnM6IHN0cmluZ1tdID0gW1xuICAgICAgICBcImFcIixcbiAgICAgICAgXCJudWktY2hlY2tib3gtbWFya1wiLFxuICAgICAgICBcIm51aS1jaGVja2JveC1nbHlwaFwiLFxuICAgICAgICBcIm51aS1jaGVja2JveC1pbnB1dFwiLFxuICAgICAgICBcImlucHV0XCIsXG4gICAgICAgIFwiYnV0dG9uXCIsXG4gICAgXTtcblxuICAgIC8vIG51aS1idXR0b24gdXNlcyB0cmFuc2NsdXNpb24gYW5kIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHBhcmVudCB0b29cbiAgICBwcml2YXRlIHByZXZlbnRlZFRhcmdldFBhcmVudFNlbGVjdG9yczogc3RyaW5nW10gPSBbXG4gICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgIFwibnVpLWJ1dHRvbi1jb250ZW50XCIsXG4gICAgXTtcblxuICAgIHByaXZhdGUgc2hvdWxkOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogX19EZXNjcmlwdGlvbjpfX1xuICAgICAqIFJldHVybnMgYSBib29sZWFuIHdoaWNoIGluZGljYXRlcyBpZiBldmVudCBzaG91bGQgcHJvcGFnYXRlIGJhc2VkIG9uIHByZWRlZmluZWQgbGlzdCBvZiBzZWxlY3RvcnMuXG4gICAgICogQHBhcmFtICAgZXZlbnQgRXZlbnQgdG8gaGFuZGxlIHByb3BhZ2F0aW9uLlxuICAgICAqIEByZXR1cm5zICBWYWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhhdCBldmVudCBzaG91bGQgYmUgcHJvcGFnYXRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdGFyZ2V0U2hvdWxkUHJvcGFnYXRlKGV2ZW50OiBFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciBldmVudC50YXJnZXQgbG9naWMsIGluY29ycmVjdCB0eXBlLCBFdmVudFRhcmdldCB0eXBlIGRvZXMgbm90IGNvbnRhaW4gcGFyZW50RWxlbWVudCBwcm9wZXJ0eVxuICAgICAgICBjb25zdCBlbGVtZW50ID0gPEVsZW1lbnQ+ZXZlbnQudGFyZ2V0O1xuICAgICAgICBjb25zdCBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQgPz8gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNob3VsZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKHBhcmVudEVsZW1lbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwYXJlbnRFbGVtZW50IGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21wYXJlRWxlbWVudFNlbGVjdG9yKHRoaXMucHJldmVudGVkVGFyZ2V0U2VsZWN0b3JzLCBlbGVtZW50KTtcbiAgICAgICAgdGhpcy5jb21wYXJlRWxlbWVudFNlbGVjdG9yKFxuICAgICAgICAgICAgdGhpcy5wcmV2ZW50ZWRUYXJnZXRQYXJlbnRTZWxlY3RvcnMsXG4gICAgICAgICAgICBwYXJlbnRFbGVtZW50XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvdWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIF9fRGVzY3JpcHRpb246X19cbiAgICAgKiBIZWxwZXIgY29tcGFyZSBmdW5jdGlvblxuICAgICAqIEBwYXJhbSAgIHNlbGVjdG9ycyBTZWxlY3RvcnMgbGlzdCB0byBjb21wYXJlIHdpdGguXG4gICAgICogQHBhcmFtICBlbGVtZW50IEV2ZW50J3MgdGFyZ2V0IGVsZW1lbnQgb3IgaXRzIHBhcmVudC5cbiAgICAgKiBAcmV0dXJucyAgVmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoYXQgZXZlbnQgc2hvdWxkIGJlIHByb3BhZ2F0ZWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjb21wYXJlRWxlbWVudFNlbGVjdG9yKHNlbGVjdG9yczogc3RyaW5nW10sIGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgc2VsZWN0b3JzLmZvckVhY2goKHNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gc2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICBpbmNsdWRlcyhlbGVtZW50LmNsYXNzTGlzdCwgc2VsZWN0b3IpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHRoaXMuc2hvdWxkID0gZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=