@nova-ui/bits
Version:
SolarWinds Nova Framework
362 lines • 71.8 kB
JavaScript
// © 2023 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 { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, ViewChild, ViewEncapsulation, } from "@angular/core";
import { FormBuilder, FormControl, NG_VALUE_ACCESSOR, } from "@angular/forms";
import { Observable, Subject } from "rxjs";
import { takeUntil } from "rxjs/operators";
import { FreeTypeQueryUtilsService } from "./helpers/freetype-query-utils.service";
import { TextHighlightOverlayComponent } from "./text-highlight-overlay/text-highlight-overlay-component";
import { NuiFormFieldControl } from "../form-field/public-api";
import { SelectV2Component } from "../select-v2/select/select-v2.component";
import { ToastService } from "../toast/toast.service";
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "../toast/toast.service";
import * as i3 from "./helpers/freetype-query-utils.service";
import * as i4 from "@angular/common";
import * as i5 from "../divider/divider.component";
import * as i6 from "../icon/icon.component";
import * as i7 from "../select-v2/select/select-v2.component";
import * as i8 from "../select-v2/option/select-v2-option.component";
import * as i9 from "../select-v2/option-group/select-v2-option-group.component";
import * as i10 from "./text-highlight-overlay/text-highlight-overlay-component";
import * as i11 from "../../pipes/highlight.pipe";
// <example-url>./../examples/index.html#/freetype-query</example-url>
export class FreetypeQueryBuilderComponent {
static pasteTextCommon(text) {
text = text.replace(/(\r\n|\n|\r)/gm, " ");
return document.execCommand("insertText", false, text);
}
constructor(renderer2, formBuilder, cd, toastService, utils) {
this.renderer2 = renderer2;
this.formBuilder = formBuilder;
this.cd = cd;
this.toastService = toastService;
this.utils = utils;
this.KEY_ENTER_CODE = "Enter";
this.KEY_ESC_CODE = "Escape";
this.maxLength = 10000;
this.readonly = false;
this.currentHelp = [];
this.helpItemSelected = new EventEmitter();
this.currentValue = new EventEmitter();
this.cursorPos = new EventEmitter();
this.cursorCoords = new EventEmitter();
this.submitQuery = new EventEmitter();
this.ON_SCROLL_CALLBACK = this.onTextAreaScroll.bind(this);
this.BASE_LINE = 34;
this.destroy$$ = new Subject();
this.tokens = [];
this.scrollValue = 0;
this.cursorPosition = 0;
this.lastHeight = 0;
this.focusedTokenValue = "";
this.highlightModel = { value: "", tokens: [] };
this.inputHeight = this.BASE_LINE;
this.selectControl = new FormControl();
this.clearNewLinesOnPaste = (event) => {
event.preventDefault();
if (event.clipboardData && event.clipboardData.getData) {
const text = event.clipboardData.getData("text/plain");
if (!FreetypeQueryBuilderComponent.pasteTextCommon(text)) {
this.pasteTextFirefox(this.textarea, text);
}
this.scrollToCursor();
}
};
this.formGroup = this.formBuilder.group({
body: [""],
});
this.bodyControl = this.formGroup.get("body");
}
ngOnChanges(changes) {
if (changes.value) {
this.bodyControl.patchValue(changes.value.currentValue);
}
}
ngAfterViewInit() {
this.renderer2.listen(this.querySelect.inputElement.nativeElement, "focusin", () => {
this.openOptions();
});
this.querySelect.valueSelected
.pipe(takeUntil(this.destroy$$))
.subscribe((value) => {
this.itemSelected({
newValue: value,
oldValue: undefined,
});
setTimeout(() => {
this.openOptions();
});
});
this.bodyControl.valueChanges
.pipe(takeUntil(this.destroy$$))
.subscribe((value) => this.onValueChange(value));
this.registerListeners();
this.cursorSetter$
.pipe(takeUntil(this.destroy$$))
.subscribe((pos) => setTimeout(() => this.setCursorToPos(pos)));
if (this.value) {
this.onValueChange(this.value);
setTimeout(() => {
this.rerender();
});
}
this.querySelect.clickOutsideDropdown.subscribe(() => {
this.querySelect.hideDropdown();
});
this.renderer2.listen(this.querySelect.inputElement.nativeElement, "focusout", ($event) => {
const selectedOption = this.querySelect.inputElement.nativeElement.parentElement.contains($event.currentTarget.parentElement);
if (!selectedOption) {
setTimeout(() => this.querySelect.hideDropdown());
}
});
}
openOptions() {
if (!this.querySelect.isDropdownOpen) {
this.selectControl.setValue(undefined);
this.querySelect.showDropdown();
}
}
ngOnDestroy() {
this.clearListeners();
this.destroy$$.next();
this.destroy$$.complete();
}
onKeyDown($event) {
if ($event.key === this.KEY_ENTER_CODE) {
$event.preventDefault();
if (!this.querySelect.isDropdownOpen) {
this.submitQuery.emit();
}
}
}
onDrop($event) {
const data = $event.dataTransfer?.getData("text");
if (data && data.length + this.value.length > this.maxLength) {
$event.preventDefault();
this.toastService.error({
message: "Query cannot exceed maximum length of " +
this.maxLength +
" characters.",
});
}
}
onKeyUp($event) {
if ($event.key !== this.KEY_ENTER_CODE) {
this.updateCursor($event.target["selectionStart"]);
}
if ($event.key !== this.KEY_ESC_CODE) {
this.openOptions();
}
if ($event.key === this.KEY_ESC_CODE) {
this.querySelect.hideDropdown();
}
}
onClick($event) {
this.updateCursor($event.target["selectionStart"]);
this.openOptions();
}
itemSelected($event) {
this.helpItemSelected.emit({ value: $event.newValue.value });
}
get textarea() {
return this.messageTextarea.nativeElement;
}
get textareaHolder() {
return this.messageTextareaHolder.nativeElement;
}
scrollToCursor() {
setTimeout(() => {
this.textarea.blur();
this.textarea.focus();
});
}
pasteTextFirefox(textarea, text) {
textarea.setRangeText(text, textarea.selectionStart || 0, textarea.selectionEnd || 0, "end");
if (textarea.value.length > this.maxLength) {
textarea.value = textarea.value.substr(0, this.maxLength);
}
// @ts-ignore
textarea.dispatchEvent(new InputEvent("input", {
data: text,
inputType: "insertText",
isComposing: false,
}));
}
onTextAreaScroll(event) {
this.scrollValue = event.target["scrollTop"];
this.textHighlightOverlayHolder.nativeElement.scrollTop =
this.scrollValue;
this.cd.markForCheck();
}
onValueChange(value) {
this.value = value;
this.tokens = this.tokenizer.tokenizeText(this.bodyControl.value);
this.focusedToken = this.tokens[this.getFocusedTokenIndex()];
this.focusedTokenValue = this.focusedToken
? this.focusedToken.value
: "";
this.openOptions();
this.rerender();
this.currentValue.emit({ value: this.value, tokens: this.tokens });
}
setCursorToPos(pos) {
this.textarea.focus();
this.textarea.setSelectionRange(pos, pos);
}
rerender() {
this.textarea.style.height =
this.textHighlightOverlay["container"]
.scrollHeight + "px";
this.highlightModel = { value: this.value, tokens: this.tokens };
setTimeout(() => {
const overlayScrollHeight = this.textHighlightOverlay["container"]
.scrollHeight;
this.highlightModel = { value: this.value, tokens: this.tokens };
this.textarea.style.height = overlayScrollHeight + "px";
if (this.textAreaHeightChanged()) {
this.lastHeight = overlayScrollHeight;
if (document.activeElement === this.textarea) {
this.openOptions();
}
}
this.cd.detectChanges();
});
}
getFocusedTokenIndex() {
for (let i = 0; i < this.tokens.length; i++) {
if (this.tokens[i].start <= this.cursorPosition &&
this.tokens[i].end >= this.cursorPosition) {
return i;
}
}
return -1;
}
updateCursor(selectionStart) {
this.cursorPos.emit(selectionStart);
this.cursorPosition = selectionStart;
const focusedTokenIndex = this.getFocusedTokenIndex();
this.focusedToken =
this.tokens[focusedTokenIndex < 0
? this.tokens.length - 1
: focusedTokenIndex];
this.focusedTokenValue = this.focusedToken
? this.focusedToken.value
: "";
this.tokens.forEach((token) => {
token.focused =
token.start <= this.cursorPosition &&
token.end >= this.cursorPosition;
});
this.rerender();
this.cursorCoords.emit(this.utils.getTextareaCaretCoordinates(this.textarea, this.textarea.selectionEnd));
}
textAreaHeightChanged() {
return (Number(this.textarea.style.height.split("px")[0]) !==
this.lastHeight);
}
registerListeners() {
const textAreaEl = this.textareaHolder;
if (textAreaEl) {
textAreaEl.addEventListener("scroll", this.ON_SCROLL_CALLBACK);
textAreaEl.addEventListener("paste", this.clearNewLinesOnPaste);
}
}
clearListeners() {
const textAreaEl = this.textareaHolder;
if (textAreaEl) {
textAreaEl.removeEventListener("scroll", this.ON_SCROLL_CALLBACK);
textAreaEl.removeEventListener("paste", this.clearNewLinesOnPaste);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FreetypeQueryBuilderComponent, deps: [{ token: i0.Renderer2 }, { token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.ToastService }, { token: i3.FreeTypeQueryUtilsService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FreetypeQueryBuilderComponent, selector: "nui-freetype-query-builder", inputs: { maxLength: "maxLength", readonly: "readonly", placeholder: "placeholder", value: "value", renderer: "renderer", tokenizer: "tokenizer", currentHelp: "currentHelp", cursorSetter$: "cursorSetter$" }, outputs: { helpItemSelected: "helpItemSelected", currentValue: "currentValue", cursorPos: "cursorPos", cursorCoords: "cursorCoords", submitQuery: "submitQuery" }, host: { classAttribute: "nui-freetype-query-builder" }, providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => FreetypeQueryBuilderComponent),
},
{
provide: NuiFormFieldControl,
useExisting: forwardRef(() => FreetypeQueryBuilderComponent),
multi: true,
},
], viewQueries: [{ propertyName: "querySelect", first: true, predicate: ["queryselect"], descendants: true, static: true }, { propertyName: "messageTextarea", first: true, predicate: ["messageTextarea"], descendants: true }, { propertyName: "messageTextareaHolder", first: true, predicate: ["messageTextareaHolder"], descendants: true }, { propertyName: "textHighlightOverlayHolder", first: true, predicate: ["textHighlightOverlayHolder"], descendants: true }, { propertyName: "textHighlightOverlay", first: true, predicate: TextHighlightOverlayComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<nui-select-v2\n #queryselect\n placeholder=\"Select Item\"\n class=\"action\"\n style=\"z-index: 1\"\n [formControl]=\"selectControl\"\n [manualDropdownControl]=\"true\"\n [displayValueTemplate]=\"customTemplate\"\n>\n <ng-container\n *ngFor=\"\n let item of readonly ? [] : currentHelp;\n let idx = index;\n let last = last;\n let first = first\n \"\n >\n <nui-select-v2-option\n tabindex=\"-1\"\n *ngIf=\"!item.items\"\n [displayValueContext]=\"item\"\n [value]=\"item\"\n >\n <div class=\"d-inline-flex align-items-center\">\n <nui-icon\n class=\"mr-2\"\n *ngIf=\"item.icon\"\n [icon]=\"item.icon\"\n ></nui-icon>\n <span\n tabindex=\"-1\"\n [innerHTML]=\"\n item.displayValue | nuiHighlight : focusedTokenValue\n \"\n ></span>\n </div>\n </nui-select-v2-option>\n <nui-select-v2-option-group\n tabindex=\"-1\"\n *ngIf=\"item.items && item.items !== []\"\n >\n <nui-divider\n *ngIf=\"last && idx > 1\"\n size=\"extra-small\"\n ></nui-divider>\n <span\n *ngIf=\"item.header\"\n class=\"nui-select-v2-option-group--header\"\n >{{ item.header }}</span\n >\n <ng-container *ngIf=\"!item.notice\">\n <nui-select-v2-option\n *ngFor=\"let groupedItem of item.items\"\n tabindex=\"-1\"\n [displayValueContext]=\"groupedItem\"\n [value]=\"groupedItem\"\n >\n <span\n tabindex=\"-1\"\n *ngIf=\"!customTemplate\"\n [innerHTML]=\"\n groupedItem.displayValue\n | nuiHighlight : focusedTokenValue\n \"\n ></span>\n </nui-select-v2-option>\n </ng-container>\n <ng-container *ngIf=\"item.notice\">\n <ng-container *ngFor=\"let groupedItem of item.items\">\n <div class=\"options-group\">\n <nui-icon\n iconSize=\"small\"\n icon=\"{{\n 'severity_' +\n (groupedItem['severity']\n ? groupedItem['severity']\n : 'info')\n }}\"\n ></nui-icon>\n <span class=\"options-group__item\" tabindex=\"-1\">{{\n groupedItem.message.displayValue\n }}</span>\n </div>\n </ng-container>\n </ng-container>\n <nui-divider *ngIf=\"!last\" size=\"extra-small\"></nui-divider>\n </nui-select-v2-option-group>\n </ng-container>\n</nui-select-v2>\n\n<ng-template #customTemplate let-context>\n <div class=\"freetype-query__content custom-input-template\">\n <div>\n <form class=\"freetype-query__form\" [formGroup]=\"formGroup\">\n <div #messageTextareaHolder class=\"message-textarea__holder\">\n <textarea\n #messageTextarea\n spellcheck=\"false\"\n type=\"text\"\n (drop)=\"onDrop($event)\"\n [attr.disabled]=\"readonly ? 'disabled' : null\"\n (keydown)=\"onKeyDown($event)\"\n (keyup)=\"onKeyUp($event)\"\n (click)=\"onClick($event)\"\n [style.height.px]=\"inputHeight\"\n class=\"message-textarea form-control input-control\"\n formControlName=\"body\"\n [placeholder]=\"placeholder\"\n [maxLength]=\"maxLength\"\n >\n </textarea>\n <div class=\"overlay-holder\" #textHighlightOverlayHolder>\n <nui-text-highlight-overlay\n [model]=\"highlightModel\"\n [renderConfigurator]=\"renderer\"\n ></nui-text-highlight-overlay>\n </div>\n </div>\n </form>\n </div>\n </div>\n</ng-template>\n", styles: [".freetype-query__content{position:relative;width:100%;border:solid 1px lightgray;border-radius:3px}.freetype-query__content .freetype-query__form{position:relative}.freetype-query__content .freetype-query__form .message-textarea__holder{max-height:117px;overflow:auto;font-family:monospace!important}.freetype-query__content .overlay-holder{position:absolute;overflow:auto;inset:0;z-index:-1;color:transparent;width:100%;font-size:13px;line-height:1.66666667}.freetype-query__content .message-overlay{box-sizing:border-box;font-family:monospace!important;word-break:break-word;max-height:calc(100% + 3px);overflow:auto;width:100%;color:transparent;font-size:13px;line-height:1.66666667;min-height:34px;border:1px solid transparent;padding:5px 10px;white-space:break-spaces}.freetype-query__content .message-textarea{white-space:break-spaces;overflow:hidden!important;resize:none;width:100%;z-index:1;background-color:transparent!important;padding:5px 10px;font-size:13px;box-sizing:border-box;font-family:monospace;max-width:100%;min-width:100%;line-height:22px;border:0 solid transparent}.freetype-query__content .message-textarea__container{z-index:1;font-family:monospace!important;background-color:transparent}.options-group{padding:5px 10px 0}.options-group__item{margin-left:5px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.DividerComponent, selector: "nui-divider", inputs: ["isVertical", "size"] }, { kind: "component", type: i6.IconComponent, selector: "nui-icon", inputs: ["iconColor", "brushType", "iconHoverColor", "iconSize", "cssClass", "fillContainer", "status", "childStatus", "icon", "counter"] }, { kind: "component", type: i7.SelectV2Component, selector: "nui-select-v2", inputs: ["displayValueTemplate"] }, { kind: "component", type: i8.SelectV2OptionComponent, selector: "nui-select-v2-option", inputs: ["value", "index", "displayValueContext", "outfiltered"] }, { kind: "component", type: i9.SelectV2OptionGroupComponent, selector: "nui-select-v2-option-group" }, { kind: "component", type: i10.TextHighlightOverlayComponent, selector: "nui-text-highlight-overlay", inputs: ["model", "renderConfigurator"] }, { kind: "pipe", type: i11.HighlightPipe, name: "nuiHighlight" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FreetypeQueryBuilderComponent, decorators: [{
type: Component,
args: [{ selector: "nui-freetype-query-builder", encapsulation: ViewEncapsulation.None, host: {
class: "nui-freetype-query-builder",
}, providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => FreetypeQueryBuilderComponent),
},
{
provide: NuiFormFieldControl,
useExisting: forwardRef(() => FreetypeQueryBuilderComponent),
multi: true,
},
], template: "<nui-select-v2\n #queryselect\n placeholder=\"Select Item\"\n class=\"action\"\n style=\"z-index: 1\"\n [formControl]=\"selectControl\"\n [manualDropdownControl]=\"true\"\n [displayValueTemplate]=\"customTemplate\"\n>\n <ng-container\n *ngFor=\"\n let item of readonly ? [] : currentHelp;\n let idx = index;\n let last = last;\n let first = first\n \"\n >\n <nui-select-v2-option\n tabindex=\"-1\"\n *ngIf=\"!item.items\"\n [displayValueContext]=\"item\"\n [value]=\"item\"\n >\n <div class=\"d-inline-flex align-items-center\">\n <nui-icon\n class=\"mr-2\"\n *ngIf=\"item.icon\"\n [icon]=\"item.icon\"\n ></nui-icon>\n <span\n tabindex=\"-1\"\n [innerHTML]=\"\n item.displayValue | nuiHighlight : focusedTokenValue\n \"\n ></span>\n </div>\n </nui-select-v2-option>\n <nui-select-v2-option-group\n tabindex=\"-1\"\n *ngIf=\"item.items && item.items !== []\"\n >\n <nui-divider\n *ngIf=\"last && idx > 1\"\n size=\"extra-small\"\n ></nui-divider>\n <span\n *ngIf=\"item.header\"\n class=\"nui-select-v2-option-group--header\"\n >{{ item.header }}</span\n >\n <ng-container *ngIf=\"!item.notice\">\n <nui-select-v2-option\n *ngFor=\"let groupedItem of item.items\"\n tabindex=\"-1\"\n [displayValueContext]=\"groupedItem\"\n [value]=\"groupedItem\"\n >\n <span\n tabindex=\"-1\"\n *ngIf=\"!customTemplate\"\n [innerHTML]=\"\n groupedItem.displayValue\n | nuiHighlight : focusedTokenValue\n \"\n ></span>\n </nui-select-v2-option>\n </ng-container>\n <ng-container *ngIf=\"item.notice\">\n <ng-container *ngFor=\"let groupedItem of item.items\">\n <div class=\"options-group\">\n <nui-icon\n iconSize=\"small\"\n icon=\"{{\n 'severity_' +\n (groupedItem['severity']\n ? groupedItem['severity']\n : 'info')\n }}\"\n ></nui-icon>\n <span class=\"options-group__item\" tabindex=\"-1\">{{\n groupedItem.message.displayValue\n }}</span>\n </div>\n </ng-container>\n </ng-container>\n <nui-divider *ngIf=\"!last\" size=\"extra-small\"></nui-divider>\n </nui-select-v2-option-group>\n </ng-container>\n</nui-select-v2>\n\n<ng-template #customTemplate let-context>\n <div class=\"freetype-query__content custom-input-template\">\n <div>\n <form class=\"freetype-query__form\" [formGroup]=\"formGroup\">\n <div #messageTextareaHolder class=\"message-textarea__holder\">\n <textarea\n #messageTextarea\n spellcheck=\"false\"\n type=\"text\"\n (drop)=\"onDrop($event)\"\n [attr.disabled]=\"readonly ? 'disabled' : null\"\n (keydown)=\"onKeyDown($event)\"\n (keyup)=\"onKeyUp($event)\"\n (click)=\"onClick($event)\"\n [style.height.px]=\"inputHeight\"\n class=\"message-textarea form-control input-control\"\n formControlName=\"body\"\n [placeholder]=\"placeholder\"\n [maxLength]=\"maxLength\"\n >\n </textarea>\n <div class=\"overlay-holder\" #textHighlightOverlayHolder>\n <nui-text-highlight-overlay\n [model]=\"highlightModel\"\n [renderConfigurator]=\"renderer\"\n ></nui-text-highlight-overlay>\n </div>\n </div>\n </form>\n </div>\n </div>\n</ng-template>\n", styles: [".freetype-query__content{position:relative;width:100%;border:solid 1px lightgray;border-radius:3px}.freetype-query__content .freetype-query__form{position:relative}.freetype-query__content .freetype-query__form .message-textarea__holder{max-height:117px;overflow:auto;font-family:monospace!important}.freetype-query__content .overlay-holder{position:absolute;overflow:auto;inset:0;z-index:-1;color:transparent;width:100%;font-size:13px;line-height:1.66666667}.freetype-query__content .message-overlay{box-sizing:border-box;font-family:monospace!important;word-break:break-word;max-height:calc(100% + 3px);overflow:auto;width:100%;color:transparent;font-size:13px;line-height:1.66666667;min-height:34px;border:1px solid transparent;padding:5px 10px;white-space:break-spaces}.freetype-query__content .message-textarea{white-space:break-spaces;overflow:hidden!important;resize:none;width:100%;z-index:1;background-color:transparent!important;padding:5px 10px;font-size:13px;box-sizing:border-box;font-family:monospace;max-width:100%;min-width:100%;line-height:22px;border:0 solid transparent}.freetype-query__content .message-textarea__container{z-index:1;font-family:monospace!important;background-color:transparent}.options-group{padding:5px 10px 0}.options-group__item{margin-left:5px}\n"] }]
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.ToastService }, { type: i3.FreeTypeQueryUtilsService }], propDecorators: { maxLength: [{
type: Input
}], readonly: [{
type: Input
}], placeholder: [{
type: Input
}], value: [{
type: Input
}], renderer: [{
type: Input
}], tokenizer: [{
type: Input
}], currentHelp: [{
type: Input
}], cursorSetter$: [{
type: Input
}], helpItemSelected: [{
type: Output
}], currentValue: [{
type: Output
}], cursorPos: [{
type: Output
}], cursorCoords: [{
type: Output
}], submitQuery: [{
type: Output
}], querySelect: [{
type: ViewChild,
args: ["queryselect", { static: true }]
}], messageTextarea: [{
type: ViewChild,
args: ["messageTextarea", { static: false }]
}], messageTextareaHolder: [{
type: ViewChild,
args: ["messageTextareaHolder", { static: false }]
}], textHighlightOverlayHolder: [{
type: ViewChild,
args: ["textHighlightOverlayHolder", { static: false }]
}], textHighlightOverlay: [{
type: ViewChild,
args: [TextHighlightOverlayComponent, { static: false }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXR5cGUtcXVlcnktYnVpbGRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2ZyZWV0eXBlLXF1ZXJ5LWJ1aWxkZXIvZnJlZXR5cGUtcXVlcnktYnVpbGRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2ZyZWV0eXBlLXF1ZXJ5LWJ1aWxkZXIvZnJlZXR5cGUtcXVlcnktYnVpbGRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNULGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0gsV0FBVyxFQUNYLFdBQVcsRUFFWCxpQkFBaUIsR0FDcEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFTbkYsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sMkRBQTJELENBQUM7QUFD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TUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHL0MscUJBQXFCO3NCQURwQixTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHckQsMEJBQTBCO3NCQUR6QixTQUFTO3VCQUFDLDRCQUE0QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFHMUQsb0JBQW9CO3NCQURuQixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjMgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPdXRwdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHtcbiAgICBGb3JtQnVpbGRlcixcbiAgICBGb3JtQ29udHJvbCxcbiAgICBGb3JtR3JvdXAsXG4gICAgTkdfVkFMVUVfQUNDRVNTT1IsXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcblxuaW1wb3J0IHsgRnJlZVR5cGVRdWVyeVV0aWxzU2VydmljZSB9IGZyb20gXCIuL2hlbHBlcnMvZnJlZXR5cGUtcXVlcnktdXRpbHMuc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgICBDYXJldENvb3JkaW5hdGVzLFxuICAgIEhlbHBFbnRyeSxcbiAgICBIaW50RW50cnksXG4gICAgUXVlcnlUb2tlbixcbiAgICBSZW5kZXJDb25maWd1cmF0b3IsXG4gICAgVG9rZW5pemVyLFxufSBmcm9tIFwiLi9tb2RlbHNcIjtcbmltcG9ydCB7IFRleHRIaWdobGlnaHRPdmVybGF5Q29tcG9uZW50IH0gZnJvbSBcIi4vdGV4dC1oaWdobGlnaHQtb3ZlcmxheS90ZXh0LWhpZ2hsaWdodC1vdmVybGF5LWNvbXBvbmVudFwiO1xuaW1wb3J0IHsgTnVpRm9ybUZpZWxkQ29udHJvbCB9IGZyb20gXCIuLi9mb3JtLWZpZWxkL3B1YmxpYy1hcGlcIjtcbmltcG9ydCB7IE9wdGlvblZhbHVlVHlwZSB9IGZyb20gXCIuLi9vdmVybGF5L3R5cGVzXCI7XG5pbXBvcnQgeyBTZWxlY3RWMkNvbXBvbmVudCB9IGZyb20gXCIuLi9zZWxlY3QtdjIvc2VsZWN0L3NlbGVjdC12Mi5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCIuLi90b2FzdC90b2FzdC5zZXJ2aWNlXCI7XG5cbi8vIDxleGFtcGxlLXVybD4uLy4uL2V4YW1wbGVzL2luZGV4Lmh0bWwjL2ZyZWV0eXBlLXF1ZXJ5PC9leGFtcGxlLXVybD5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS1mcmVldHlwZS1xdWVyeS1idWlsZGVyXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9mcmVldHlwZS1xdWVyeS1idWlsZGVyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgc3R5bGVVcmxzOiBbXCIuL2ZyZWV0eXBlLXF1ZXJ5LWJ1aWxkZXIuY29tcG9uZW50Lmxlc3NcIl0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiBcIm51aS1mcmVldHlwZS1xdWVyeS1idWlsZGVyXCIsXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZyZWV0eXBlUXVlcnlCdWlsZGVyQ29tcG9uZW50KSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogTnVpRm9ybUZpZWxkQ29udHJvbCxcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEZyZWV0eXBlUXVlcnlCdWlsZGVyQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEZyZWV0eXBlUXVlcnlCdWlsZGVyQ29tcG9uZW50PFQgZXh0ZW5kcyBRdWVyeVRva2VuPlxuICAgIGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXRcbntcbiAgICBwcml2YXRlIHN0YXRpYyBwYXN0ZVRleHRDb21tb24odGV4dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhcXHJcXG58XFxufFxccikvZ20sIFwiIFwiKTtcblxuICAgICAgICByZXR1cm4gZG9jdW1lbnQuZXhlY0NvbW1hbmQoXCJpbnNlcnRUZXh0XCIsIGZhbHNlLCB0ZXh0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWR