{"version":3,"sources":["node_modules/@angular/cdk/fesm2022/clipboard.mjs","src/app/user-settings/api-key/api-key.component.ts","src/app/user-settings/api-key/api-key.component.html"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Injectable, Inject, InjectionToken, EventEmitter, Directive, Optional, Input, Output, NgModule } from '@angular/core';\n\n/**\n * A pending copy-to-clipboard operation.\n *\n * The implementation of copying text to the clipboard modifies the DOM and\n * forces a re-layout. This re-layout can take too long if the string is large,\n * causing the execCommand('copy') to happen too long after the user clicked.\n * This results in the browser refusing to copy. This object lets the\n * re-layout happen in a separate tick from copying by providing a copy function\n * that can be called later.\n *\n * Destroy must be called when no longer in use, regardless of whether `copy` is\n * called.\n */\nclass PendingCopy {\n constructor(text, _document) {\n this._document = _document;\n const textarea = this._textarea = this._document.createElement('textarea');\n const styles = textarea.style;\n // Hide the element for display and accessibility. Set a fixed position so the page layout\n // isn't affected. We use `fixed` with `top: 0`, because focus is moved into the textarea\n // for a split second and if it's off-screen, some browsers will attempt to scroll it into view.\n styles.position = 'fixed';\n styles.top = styles.opacity = '0';\n styles.left = '-999em';\n textarea.setAttribute('aria-hidden', 'true');\n textarea.value = text;\n // Making the textarea `readonly` prevents the screen from jumping on iOS Safari (see #25169).\n textarea.readOnly = true;\n // The element needs to be inserted into the fullscreen container, if the page\n // is in fullscreen mode, otherwise the browser won't execute the copy command.\n (this._document.fullscreenElement || this._document.body).appendChild(textarea);\n }\n /** Finishes copying the text. */\n copy() {\n const textarea = this._textarea;\n let successful = false;\n try {\n // Older browsers could throw if copy is not supported.\n if (textarea) {\n const currentFocus = this._document.activeElement;\n textarea.select();\n textarea.setSelectionRange(0, textarea.value.length);\n successful = this._document.execCommand('copy');\n if (currentFocus) {\n currentFocus.focus();\n }\n }\n } catch {\n // Discard error.\n // Initial setting of {@code successful} will represent failure here.\n }\n return successful;\n }\n /** Cleans up DOM changes used to perform the copy operation. */\n destroy() {\n const textarea = this._textarea;\n if (textarea) {\n textarea.remove();\n this._textarea = undefined;\n }\n }\n}\n\n/**\n * A service for copying text to the clipboard.\n */\nlet Clipboard = /*#__PURE__*/(() => {\n class Clipboard {\n constructor(document) {\n this._document = document;\n }\n /**\n * Copies the provided text into the user's clipboard.\n *\n * @param text The string to copy.\n * @returns Whether the operation was successful.\n */\n copy(text) {\n const pendingCopy = this.beginCopy(text);\n const successful = pendingCopy.copy();\n pendingCopy.destroy();\n return successful;\n }\n /**\n * Prepares a string to be copied later. This is useful for large strings\n * which take too long to successfully render and be copied in the same tick.\n *\n * The caller must call `destroy` on the returned `PendingCopy`.\n *\n * @param text The string to copy.\n * @returns the pending copy operation.\n */\n beginCopy(text) {\n return new PendingCopy(text, this._document);\n }\n static {\n this.ɵfac = function Clipboard_Factory(t) {\n return new (t || Clipboard)(i0.ɵɵinject(DOCUMENT));\n };\n }\n static {\n this.ɵprov = /* @__PURE__ */i0.ɵɵdefineInjectable({\n token: Clipboard,\n factory: Clipboard.ɵfac,\n providedIn: 'root'\n });\n }\n }\n return Clipboard;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/** Injection token that can be used to provide the default options to `CdkCopyToClipboard`. */\nconst CDK_COPY_TO_CLIPBOARD_CONFIG = /*#__PURE__*/new InjectionToken('CDK_COPY_TO_CLIPBOARD_CONFIG');\n/**\n * Provides behavior for a button that when clicked copies content into user's\n * clipboard.\n */\nlet CdkCopyToClipboard = /*#__PURE__*/(() => {\n class CdkCopyToClipboard {\n constructor(_clipboard, _ngZone, config) {\n this._clipboard = _clipboard;\n this._ngZone = _ngZone;\n /** Content to be copied. */\n this.text = '';\n /**\n * How many times to attempt to copy the text. This may be necessary for longer text, because\n * the browser needs time to fill an intermediate textarea element and copy the content.\n */\n this.attempts = 1;\n /**\n * Emits when some text is copied to the clipboard. The\n * emitted value indicates whether copying was successful.\n */\n this.copied = new EventEmitter();\n /** Copies that are currently being attempted. */\n this._pending = new Set();\n if (config && config.attempts != null) {\n this.attempts = config.attempts;\n }\n }\n /** Copies the current text to the clipboard. */\n copy(attempts = this.attempts) {\n if (attempts > 1) {\n let remainingAttempts = attempts;\n const pending = this._clipboard.beginCopy(this.text);\n this._pending.add(pending);\n const attempt = () => {\n const successful = pending.copy();\n if (!successful && --remainingAttempts && !this._destroyed) {\n // We use 1 for the timeout since it's more predictable when flushing in unit tests.\n this._currentTimeout = this._ngZone.runOutsideAngular(() => setTimeout(attempt, 1));\n } else {\n this._currentTimeout = null;\n this._pending.delete(pending);\n pending.destroy();\n this.copied.emit(successful);\n }\n };\n attempt();\n } else {\n this.copied.emit(this._clipboard.copy(this.text));\n }\n }\n ngOnDestroy() {\n if (this._currentTimeout) {\n clearTimeout(this._currentTimeout);\n }\n this._pending.forEach(copy => copy.destroy());\n this._pending.clear();\n this._destroyed = true;\n }\n static {\n this.ɵfac = function CdkCopyToClipboard_Factory(t) {\n return new (t || CdkCopyToClipboard)(i0.ɵɵdirectiveInject(Clipboard), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵdirectiveInject(CDK_COPY_TO_CLIPBOARD_CONFIG, 8));\n };\n }\n static {\n this.ɵdir = /* @__PURE__ */i0.ɵɵdefineDirective({\n type: CdkCopyToClipboard,\n selectors: [[\"\", \"cdkCopyToClipboard\", \"\"]],\n hostBindings: function CdkCopyToClipboard_HostBindings(rf, ctx) {\n if (rf & 1) {\n i0.ɵɵlistener(\"click\", function CdkCopyToClipboard_click_HostBindingHandler() {\n return ctx.copy();\n });\n }\n },\n inputs: {\n text: [i0.ɵɵInputFlags.None, \"cdkCopyToClipboard\", \"text\"],\n attempts: [i0.ɵɵInputFlags.None, \"cdkCopyToClipboardAttempts\", \"attempts\"]\n },\n outputs: {\n copied: \"cdkCopyToClipboardCopied\"\n },\n standalone: true\n });\n }\n }\n return CdkCopyToClipboard;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\nlet ClipboardModule = /*#__PURE__*/(() => {\n class ClipboardModule {\n static {\n this.ɵfac = function ClipboardModule_Factory(t) {\n return new (t || ClipboardModule)();\n };\n }\n static {\n this.ɵmod = /* @__PURE__ */i0.ɵɵdefineNgModule({\n type: ClipboardModule\n });\n }\n static {\n this.ɵinj = /* @__PURE__ */i0.ɵɵdefineInjector({});\n }\n }\n return ClipboardModule;\n})();\n/*#__PURE__*/(() => {\n (typeof ngDevMode === \"undefined\" || ngDevMode) && void 0;\n})();\n\n/**\n * Generated bundle index. Do not edit.\n */\n\nexport { CDK_COPY_TO_CLIPBOARD_CONFIG, CdkCopyToClipboard, Clipboard, ClipboardModule, PendingCopy };\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component, DestroyRef,\n ElementRef, inject,\n Input,\n OnInit,\n ViewChild\n} from '@angular/core';\nimport {ToastrService} from 'ngx-toastr';\nimport {ConfirmService} from 'src/app/shared/confirm.service';\nimport {AccountService} from 'src/app/_services/account.service';\nimport {Clipboard} from '@angular/cdk/clipboard';\nimport {takeUntilDestroyed} from \"@angular/core/rxjs-interop\";\nimport { NgbTooltip } from '@ng-bootstrap/ng-bootstrap';\nimport { NgIf } from '@angular/common';\nimport {translate, TranslocoDirective} from \"@ngneat/transloco\";\n\n@Component({\n selector: 'app-api-key',\n templateUrl: './api-key.component.html',\n styleUrls: ['./api-key.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgIf, NgbTooltip, TranslocoDirective]\n})\nexport class ApiKeyComponent implements OnInit {\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly confirmService = inject(ConfirmService);\n private readonly accountService = inject(AccountService);\n private readonly toastr = inject(ToastrService);\n private readonly clipboard = inject(Clipboard);\n private readonly cdRef = inject(ChangeDetectorRef);\n\n @Input() title: string = 'API Key';\n @Input() showRefresh: boolean = true;\n @Input() transform: (val: string) => string = (val: string) => val;\n @Input() tooltipText: string = '';\n @Input() hideData = true;\n @ViewChild('apiKey') inputElem!: ElementRef;\n\n key: string = '';\n isDataHidden: boolean = this.hideData;\n\n get InputType() {\n return (this.hideData && this.isDataHidden) ? 'password' : 'text';\n }\n\n\n ngOnInit(): void {\n this.accountService.currentUser$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(user => {\n let key = '';\n if (user) {\n key = user.apiKey;\n } else {\n key = translate('api-key.no-key');\n }\n\n if (this.showRefresh) {\n this.showRefresh = !this.accountService.hasReadOnlyRole(user!);\n }\n\n if (this.transform != undefined) {\n this.key = this.transform(key);\n this.cdRef.markForCheck();\n }\n });\n }\n\n async copy() {\n this.inputElem.nativeElement.select();\n this.clipboard.copy(this.inputElem.nativeElement.value);\n this.inputElem.nativeElement.setSelectionRange(0, 0);\n this.cdRef.markForCheck();\n }\n\n async refresh() {\n if (!await this.confirmService.confirm(translate('api-key.confirm-reset'))) {\n return;\n }\n this.accountService.resetApiKey().subscribe(newKey => {\n this.key = newKey;\n this.cdRef.markForCheck();\n this.toastr.success(translate('api-key.key-reset'));\n });\n }\n\n selectAll() {\n if (this.inputElem) {\n this.inputElem.nativeElement.setSelectionRange(0, this.key.length);\n this.cdRef.markForCheck();\n }\n }\n\n toggleVisibility() {\n this.isDataHidden = !this.isDataHidden;\n this.cdRef.markForCheck();\n }\n\n}\n","\n
\n 0\"> \n {{tooltipText}}\n
\n \n \n \n @if (showRefresh) {\n \n }\n\n \n {{t('regen-warning')}}\n \n
\n
\n
\n"],"mappings":"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","names":["PendingCopy","text","_document","textarea","styles","successful","currentFocus","Clipboard","_Clipboard","document","pendingCopy","t","ɵɵinject","DOCUMENT","ɵɵdefineInjectable","ɵɵelementStart","ɵɵtext","ɵɵelement","ɵɵelementEnd","ɵɵadvance","ɵɵproperty","tooltip_r2","ɵɵtextInterpolate","ctx_r2","tooltipText","ɵɵlistener","ɵɵrestoreView","_r4","ɵɵnextContext","ɵɵresetView","toggleVisibility","isDataHidden","t_r5","ɵɵclassMapInterpolate1","_r6","refresh","tipContent_r7","ɵɵtextInterpolate1","ɵɵelementContainerStart","ɵɵtemplate","ApiKeyComponent_ng_container_0_span_4_Template","ApiKeyComponent_ng_container_0_ng_template_5_Template","ɵɵtemplateRefExtractor","_r1","selectAll","ApiKeyComponent_ng_container_0_button_10_Template","copy","ApiKeyComponent_ng_container_0_Conditional_15_Template","ApiKeyComponent_ng_container_0_ng_template_16_Template","ɵɵpropertyInterpolate1","title","length","InputType","key","hideData","ɵɵconditional","showRefresh","ApiKeyComponent","constructor","destroyRef","inject","DestroyRef","confirmService","ConfirmService","accountService","AccountService","toastr","ToastrService","clipboard","Clipboard","cdRef","ChangeDetectorRef","transform","val","ngOnInit","currentUser$","pipe","takeUntilDestroyed","subscribe","user","apiKey","translate","hasReadOnlyRole","undefined","markForCheck","__async","inputElem","nativeElement","select","value","setSelectionRange","confirm","resetApiKey","newKey","success","selectors","viewQuery","rf","ctx","ApiKeyComponent_ng_container_0_Template","NgIf","NgbTooltip","TranslocoDirective","changeDetection","_ApiKeyComponent"],"x_google_ignoreList":[0]}