UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

122 lines 14.7 kB
// © 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 { DOCUMENT } from "@angular/common"; import { Directive, EventEmitter, HostListener, Inject, Input, Output, } from "@angular/core"; import isEmpty from "lodash/isEmpty"; import isEqual from "lodash/isEqual"; import isString from "lodash/isString"; import { LoggerService } from "../../../services/log-service"; import * as i0 from "@angular/core"; import * as i1 from "../../../services/log-service"; /** * <example-url>./../examples/index.html#/common/clipboard</example-url> */ /** * @ignore * @dynamic * Directive that provides copy to clipboard functionality. */ export class ClipboardDirective { /** * Replaces element click behavior with clipboard copy event */ onClick(e) { if (isEqual(this.hasCopySupport, true)) { e.preventDefault(); return this.copyText(); } else { this.clipboardError.emit(); return this.logger.error("document copy operation is not supported"); } } constructor(logger, document) { this.logger = logger; this.document = document; /* eslint-enable @angular-eslint/no-input-rename */ /** * Event that is fired when text was copied to the clipboard successfully */ this.clipboardSuccess = new EventEmitter(); /** * Event that is fired when copy text was failed */ this.clipboardError = new EventEmitter(); this.hasCopySupport = false; this.createNode = (text) => { const node = this.document.createElement("textarea"); node.style.position = "absolute"; node.style.left = "-10000px"; node.textContent = text; return node; }; } ngOnInit() { try { this.hasCopySupport = this.document.queryCommandSupported("copy"); } catch (ex) { this.logger.error(ex.message); } } copyText() { if (isEmpty(this.textToCopy) || !isString(this.textToCopy)) { return this.logger.warn("notext", "nuiClipboard text is empty or not a string"); } const node = this.createNode(this.textToCopy); try { const selection = this.document.getSelection(); this.document.body.appendChild(node); node.select(); this.document.execCommand("copy"); selection?.removeAllRanges(); this.clipboardSuccess.emit(); } catch (ex) { this.logger.error(ex.message); this.clipboardError.emit(); } finally { this.document.body.removeChild(node); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ClipboardDirective, deps: [{ token: i1.LoggerService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ClipboardDirective, selector: "[nuiClipboard]", inputs: { textToCopy: ["nuiClipboard", "textToCopy"] }, outputs: { clipboardSuccess: "clipboardSuccess", clipboardError: "clipboardError" }, host: { listeners: { "click": "onClick($event)" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ClipboardDirective, decorators: [{ type: Directive, args: [{ selector: "[nuiClipboard]", }] }], ctorParameters: () => [{ type: i1.LoggerService }, { type: Document, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { textToCopy: [{ type: Input, args: ["nuiClipboard"] }], clipboardSuccess: [{ type: Output }], clipboardError: [{ type: Output }], onClick: [{ type: HostListener, args: ["click", ["$event"]] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcGJvYXJkLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9jb21tb24vZGlyZWN0aXZlcy9jbGlwYm9hcmQvY2xpcGJvYXJkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLE1BQU0sR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLE9BQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLFFBQVEsTUFBTSxpQkFBaUIsQ0FBQztBQUV2QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7OztBQUU5RDs7R0FFRztBQUVIOzs7O0dBSUc7QUFJSCxNQUFNLE9BQU8sa0JBQWtCO0lBbUIzQjs7T0FFRztJQUVJLE9BQU8sQ0FBQyxDQUFRO1FBQ25CLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDcEMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzFCO2FBQU07WUFD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b3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XG5pbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkluaXQsXG4gICAgT3V0cHV0LFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSBcImxvZGFzaC9pc0VtcHR5XCI7XG5pbXBvcnQgaXNFcXVhbCBmcm9tIFwibG9kYXNoL2lzRXF1YWxcIjtcbmltcG9ydCBpc1N0cmluZyBmcm9tIFwibG9kYXNoL2lzU3RyaW5nXCI7XG5cbmltcG9ydCB7IExvZ2dlclNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vLi4vc2VydmljZXMvbG9nLXNlcnZpY2VcIjtcblxuLyoqXG4gKiA8ZXhhbXBsZS11cmw+Li8uLi9leGFtcGxlcy9pbmRleC5odG1sIy9jb21tb24vY2xpcGJvYXJkPC9leGFtcGxlLXVybD5cbiAqL1xuXG4vKipcbiAqIEBpZ25vcmVcbiAqIEBkeW5hbWljXG4gKiBEaXJlY3RpdmUgdGhhdCBwcm92aWRlcyBjb3B5IHRvIGNsaXBib2FyZCBmdW5jdGlvbmFsaXR5LlxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbbnVpQ2xpcGJvYXJkXVwiLFxufSlcbmV4cG9ydCBjbGFzcyBDbGlwYm9hcmREaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qIGVzbGludC1kaXNhYmxlIEBhbmd1bGFyLWVzbGludC9uby1pbnB1dC1yZW5hbWUgKi9cbiAgICAvKipcbiAgICAgKiBUZXh0IHRvIGJlIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkXG4gICAgICovXG4gICAgQElucHV0KFwibnVpQ2xpcGJvYXJkXCIpIHB1YmxpYyB0ZXh0VG9Db3B5OiBzdHJpbmc7XG4gICAgLyogZXNsaW50LWVuYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXQtcmVuYW1lICovXG5cbiAgICAvKipcbiAgICAgKiBFdmVudCB0aGF0IGlzIGZpcmVkIHdoZW4gdGV4dCB3YXMgY29waWVkIHRvIHRoZSBjbGlwYm9hcmQgc3VjY2Vzc2Z1bGx5XG4gICAgICovXG4gICAgQE91dHB1dCgpIHB1YmxpYyBjbGlwYm9hcmRTdWNjZXNzID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAgIC8qKlxuICAgICAqIEV2ZW50IHRoYXQgaXMgZmlyZWQgd2hlbiBjb3B5IHRleHQgd2FzIGZhaWxlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwdWJsaWMgY2xpcGJvYXJkRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICBwcml2YXRlIGhhc0NvcHlTdXBwb3J0ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlcyBlbGVtZW50IGNsaWNrIGJlaGF2aW9yIHdpdGggY2xpcGJvYXJkIGNvcHkgZXZlbnRcbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKFwiY2xpY2tcIiwgW1wiJGV2ZW50XCJdKVxuICAgIHB1YmxpYyBvbkNsaWNrKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChpc0VxdWFsKHRoaXMuaGFzQ29weVN1cHBvcnQsIHRydWUpKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb3B5VGV4dCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jbGlwYm9hcmRFcnJvci5lbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgXCJkb2N1bWVudCBjb3B5IG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBsb2dnZXI6IExvZ2dlclNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IERvY3VtZW50XG4gICAgKSB7fVxuXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5oYXNDb3B5U3VwcG9ydCA9IHRoaXMuZG9jdW1lbnQucXVlcnlDb21tYW5kU3VwcG9ydGVkKFwiY29weVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKGV4Lm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjb3B5VGV4dCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzRW1wdHkodGhpcy50ZXh0VG9Db3B5KSB8fCAhaXNTdHJpbmcodGhpcy50ZXh0VG9Db3B5KSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAgICAgXCJub3RleHRcIixcbiAgICAgICAgICAgICAgICBcIm51aUNsaXBib2FyZCB0ZXh0IGlzIGVtcHR5IG9yIG5vdCBhIHN0cmluZ1wiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm9kZSA9IHRoaXMuY3JlYXRlTm9kZSh0aGlzLnRleHRUb0NvcHkpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLmRvY3VtZW50LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgICAgbm9kZS5zZWxlY3QoKTtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJjb3B5XCIpO1xuICAgICAgICAgICAgc2VsZWN0aW9uPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkU3VjY2Vzcy5lbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci5lcnJvcihleC5tZXNzYWdlKTtcbiAgICAgICAgICAgIHRoaXMuY2xpcGJvYXJkRXJyb3IuZW1pdCgpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5kb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVOb2RlID0gKHRleHQ6IHN0cmluZyk6IEhUTUxUZXh0QXJlYUVsZW1lbnQgPT4ge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG5cbiAgICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gXCItMTAwMDBweFwiO1xuICAgICAgICBub2RlLnRleHRDb250ZW50ID0gdGV4dDtcblxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9O1xufVxuIl19