UNPKG

17.3 kBSource Map (JSON)View Raw
1{"version":3,"file":"ngx-clipboard.js","sources":["../../../projects/ngx-clipboard/src/lib/ngx-clipboard.service.ts","../../../projects/ngx-clipboard/src/lib/ngx-clipboard.directive.ts","../../../projects/ngx-clipboard/src/lib/ngx-clipboard-if-supported.directive.ts","../../../projects/ngx-clipboard/src/lib/ngx-clipboard.module.ts","../../../projects/ngx-clipboard/src/public_api.ts","../../../projects/ngx-clipboard/src/ngx-clipboard.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\r\nimport { Inject, Injectable, Optional } from '@angular/core';\r\nimport { WINDOW } from 'ngx-window-token';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nimport { ClipboardParams, IClipboardResponse } from './interface';\r\n\r\n/**\r\n * The following code is heavily copied from https://github.com/zenorocha/clipboard.js\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class ClipboardService {\r\n private copySubject = new Subject<IClipboardResponse>();\r\n public copyResponse$: Observable<IClipboardResponse> = this.copySubject.asObservable();\r\n private tempTextArea: HTMLTextAreaElement | undefined;\r\n private config: ClipboardParams = {};\r\n\r\n constructor(@Inject(DOCUMENT) public document: any, @Optional() @Inject(WINDOW) private window: any) {}\r\n\r\n public configure(config: ClipboardParams) {\r\n this.config = config;\r\n }\r\n\r\n public copy(content: string): void {\r\n if (!this.isSupported || !content) {\r\n return this.pushCopyResponse({ isSuccess: false, content });\r\n }\r\n const copyResult = this.copyFromContent(content);\r\n if (copyResult) {\r\n return this.pushCopyResponse({ content, isSuccess: copyResult });\r\n }\r\n return this.pushCopyResponse({ isSuccess: false, content });\r\n }\r\n\r\n public get isSupported(): boolean {\r\n return !!this.document.queryCommandSupported && !!this.document.queryCommandSupported('copy') && !!this.window;\r\n }\r\n\r\n public isTargetValid(element: HTMLInputElement | HTMLTextAreaElement): boolean {\r\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\r\n if (element.hasAttribute('disabled')) {\r\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\r\n }\r\n return true;\r\n }\r\n throw new Error('Target should be input or textarea');\r\n }\r\n\r\n /**\r\n * Attempts to copy from an input `targetElm`\r\n */\r\n public copyFromInputElement(targetElm: HTMLInputElement | HTMLTextAreaElement, isFocus = true): boolean {\r\n try {\r\n this.selectTarget(targetElm);\r\n const re = this.copyText();\r\n this.clearSelection(isFocus ? targetElm : undefined, this.window);\r\n return re && this.isCopySuccessInIE11();\r\n } catch (error) {\r\n return false;\r\n }\r\n }\r\n\r\n /**\r\n * This is a hack for IE11 to return `true` even if copy fails.\r\n */\r\n public isCopySuccessInIE11(): boolean {\r\n const clipboardData = this.window['clipboardData'];\r\n if (clipboardData && clipboardData.getData) {\r\n if (!clipboardData.getData('Text')) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a fake textarea element, sets its value from `text` property,\r\n * and makes a selection on it.\r\n */\r\n public copyFromContent(content: string, container: HTMLElement = this.document.body): boolean {\r\n // check if the temp textarea still belongs to the current container.\r\n // In case we have multiple places using ngx-clipboard, one is in a modal using container but the other one is not.\r\n if (this.tempTextArea && !container.contains(this.tempTextArea)) {\r\n this.destroy(this.tempTextArea.parentElement || undefined);\r\n }\r\n\r\n if (!this.tempTextArea) {\r\n this.tempTextArea = this.createTempTextArea(this.document, this.window);\r\n try {\r\n container.appendChild(this.tempTextArea);\r\n } catch (error) {\r\n throw new Error('Container should be a Dom element');\r\n }\r\n }\r\n this.tempTextArea.value = content;\r\n\r\n const toReturn = this.copyFromInputElement(this.tempTextArea, false);\r\n if (this.config.cleanUpAfterCopy) {\r\n this.destroy(this.tempTextArea.parentElement || undefined);\r\n }\r\n return toReturn;\r\n }\r\n\r\n /**\r\n * Remove temporary textarea if any exists.\r\n */\r\n public destroy(container: HTMLElement = this.document.body): void {\r\n if (this.tempTextArea) {\r\n container.removeChild(this.tempTextArea);\r\n // removeChild doesn't remove the reference from memory\r\n this.tempTextArea = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Select the target html input element.\r\n */\r\n private selectTarget(inputElement: HTMLInputElement | HTMLTextAreaElement): number | undefined {\r\n inputElement.select();\r\n inputElement.setSelectionRange(0, inputElement.value.length);\r\n return inputElement.value.length;\r\n }\r\n\r\n private copyText(): boolean {\r\n return this.document.execCommand('copy');\r\n }\r\n\r\n /**\r\n * Moves focus away from `target` and back to the trigger, removes current selection.\r\n */\r\n private clearSelection(inputElement: HTMLInputElement | HTMLTextAreaElement | undefined, window: Window): void {\r\n inputElement && inputElement.focus();\r\n window.getSelection()?.removeAllRanges();\r\n }\r\n\r\n /**\r\n * Creates a fake textarea for copy command.\r\n */\r\n private createTempTextArea(doc: Document, window: Window): HTMLTextAreaElement {\r\n const isRTL = doc.documentElement.getAttribute('dir') === 'rtl';\r\n let ta: HTMLTextAreaElement;\r\n ta = doc.createElement('textarea');\r\n // Prevent zooming on iOS\r\n ta.style.fontSize = '12pt';\r\n // Reset box model\r\n ta.style.border = '0';\r\n ta.style.padding = '0';\r\n ta.style.margin = '0';\r\n // Move element out of screen horizontally\r\n ta.style.position = 'absolute';\r\n ta.style[isRTL ? 'right' : 'left'] = '-9999px';\r\n // Move element to the same position vertically\r\n const yPosition = window.pageYOffset || doc.documentElement.scrollTop;\r\n ta.style.top = yPosition + 'px';\r\n ta.setAttribute('readonly', '');\r\n return ta;\r\n }\r\n\r\n /**\r\n * Pushes copy operation response to copySubject, to provide global access\r\n * to the response.\r\n */\r\n public pushCopyResponse(response: IClipboardResponse): void {\r\n this.copySubject.next(response);\r\n }\r\n\r\n /**\r\n * @deprecated use pushCopyResponse instead.\r\n */\r\n public pushCopyReponse(response: IClipboardResponse): void {\r\n this.pushCopyResponse(response);\r\n }\r\n}\r\n","import { Directive, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output } from '@angular/core';\r\n\r\nimport { IClipboardResponse } from './interface';\r\nimport { ClipboardService } from './ngx-clipboard.service';\r\n\r\n@Directive({\r\n selector: '[ngxClipboard]'\r\n})\r\nexport class ClipboardDirective implements OnInit, OnDestroy {\r\n // https://github.com/maxisam/ngx-clipboard/issues/239#issuecomment-623330624\r\n // tslint:disable-next-line:no-input-rename\r\n @Input('ngxClipboard')\r\n public targetElm: HTMLInputElement | HTMLTextAreaElement | undefined | '';\r\n @Input()\r\n public container: HTMLElement;\r\n\r\n @Input()\r\n public cbContent: string | undefined;\r\n\r\n @Input()\r\n public cbSuccessMsg: string;\r\n\r\n @Output()\r\n public cbOnSuccess: EventEmitter<IClipboardResponse> = new EventEmitter<IClipboardResponse>();\r\n\r\n @Output()\r\n public cbOnError: EventEmitter<any> = new EventEmitter<any>();\r\n constructor(private clipboardSrv: ClipboardService) {}\r\n\r\n // tslint:disable-next-line:no-empty\r\n public ngOnInit() {}\r\n\r\n public ngOnDestroy() {\r\n this.clipboardSrv.destroy(this.container);\r\n }\r\n\r\n @HostListener('click', ['$event.target'])\r\n public onClick(event: Event) {\r\n if (!this.clipboardSrv.isSupported) {\r\n this.handleResult(false, undefined, event);\r\n } else if (this.targetElm && this.clipboardSrv.isTargetValid(this.targetElm)) {\r\n this.handleResult(this.clipboardSrv.copyFromInputElement(this.targetElm), this.targetElm.value, event);\r\n } else if (this.cbContent) {\r\n this.handleResult(this.clipboardSrv.copyFromContent(this.cbContent, this.container), this.cbContent, event);\r\n }\r\n }\r\n\r\n /**\r\n * Fires an event based on the copy operation result.\r\n * @param succeeded\r\n */\r\n private handleResult(succeeded: boolean, copiedContent: string | undefined, event: Event) {\r\n let response: IClipboardResponse = {\r\n isSuccess: succeeded,\r\n event\r\n };\r\n\r\n if (succeeded) {\r\n response = Object.assign(response, {\r\n content: copiedContent,\r\n successMessage: this.cbSuccessMsg\r\n });\r\n this.cbOnSuccess.emit(response);\r\n } else {\r\n this.cbOnError.emit(response);\r\n }\r\n\r\n this.clipboardSrv.pushCopyResponse(response);\r\n }\r\n}\r\n","import { Directive, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';\r\n\r\nimport { ClipboardService } from './ngx-clipboard.service';\r\n\r\n@Directive({\r\n selector: '[ngxClipboardIfSupported]'\r\n})\r\nexport class ClipboardIfSupportedDirective implements OnInit {\r\n constructor(\r\n private _clipboardService: ClipboardService,\r\n private _viewContainerRef: ViewContainerRef,\r\n private _templateRef: TemplateRef<any>\r\n ) {}\r\n\r\n ngOnInit() {\r\n if (this._clipboardService.isSupported) {\r\n this._viewContainerRef.createEmbeddedView(this._templateRef);\r\n }\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule } from '@angular/core';\r\n\r\nimport { ClipboardIfSupportedDirective } from './ngx-clipboard-if-supported.directive';\r\nimport { ClipboardDirective } from './ngx-clipboard.directive';\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n declarations: [ClipboardDirective, ClipboardIfSupportedDirective],\r\n exports: [ClipboardDirective, ClipboardIfSupportedDirective]\r\n})\r\nexport class ClipboardModule {}\r\n","/*\r\n * Public API Surface of ngx-clipboard\r\n */\r\n\r\nexport * from './lib/ngx-clipboard.service';\r\nexport * from './lib/ngx-clipboard.directive';\r\nexport * from './lib/ngx-clipboard.module';\r\nexport * from './lib/ngx-clipboard-if-supported.directive';\r\nexport * from './lib/interface';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
\No newline at end of file