import * as i0 from '@angular/core';
import { EventEmitter, Component, Output, ViewChild, Input, HostListener, Injectable, NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { Subscription, map, debounceTime } from 'rxjs';
import * as i1 from '@laserfiche/lf-ui-components/internal-shared';
import { LfMessageToastTypes, GeneralDialogLayoutModule, LfToastMessageModule, LfLoaderModule } from '@laserfiche/lf-ui-components/internal-shared';
import * as i2$1 from '@angular/forms';
import { FormsModule } from '@angular/forms';
import * as i3 from '@angular/material/checkbox';
import { MatCheckboxModule } from '@angular/material/checkbox';
import * as i2 from '@angular/common';
import { CommonModule } from '@angular/common';
import * as i1$1 from '@angular/material/dialog';
import { MatDialogModule } from '@angular/material/dialog';
import { createCustomElement } from '@angular/elements';
import { MatIconModule } from '@angular/material/icon';

// Copyright (c) Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.
/** @internal */
class FeedbackImageUploadComponent {
    constructor(localizationService) {
        this.localizationService = localizationService;
        this.imageUploadError = new EventEmitter();
        this.feedbackImageBase64 = new EventEmitter();
        this.showLoader = false;
        this.acceptedImageTypes = '.jpg,.jpeg,.png,.gif,.webp';
        this.acceptedImageFormats = 'JPEG, PNG, GIF, WebP';
        this.supportedImageTypeArray = this.acceptedImageTypes
            .split(',')
            .map((imgType) => imgType.replace('.', 'image/'));
        this.megabyteLimit = 3;
        this.imageSizeLimitBytes = this.megabyteLimit * 1024 * 1024;
        this.localizedStrings = {
            OR: this.localizationService.getStringLaserficheObservable('OR'),
            ATTACH_IMAGE: this.localizationService.getStringComponentsObservable('ATTACH_IMAGE'),
            DRAG_DROP_FILE: this.localizationService.getStringLaserficheObservable('DRAG_DROP_FILE'),
            REMOVE: this.localizationService.getStringLaserficheObservable('REMOVE'),
            BROWSE: this.localizationService.getStringLaserficheObservable('BROWSE'),
            OPTIONAL: this.localizationService.getStringLaserficheObservable('OPTIONAL'),
            UNKNOWN_ERROR: this.localizationService.getStringLaserficheObservable('UNKNOWN_ERROR'),
        };
    }
    async dropHandler(ev) {
        let file;
        let numFiles = 0;
        ev.preventDefault();
        if (ev?.dataTransfer?.items) {
            numFiles = ev.dataTransfer.items.length;
            const item = ev.dataTransfer.items[0];
            if (item.kind === 'file') {
                file = item.getAsFile() ?? undefined;
            }
        }
        else {
            numFiles = ev.dataTransfer?.files.length ?? 0;
            file = ev.dataTransfer?.files.item(0) ?? undefined;
        }
        if (numFiles > 1) {
            this.imageUploadError.emit(this.localizationService.getResourceStringComponents('IMAGE_NOT_ATTACHED') +
                ' ' +
                this.localizationService.getResourceStringComponents('PLEASE_ATTACH_ONLY_ONE_IMAGE'));
        }
        else {
            await this.tryReadAndValidateImageAsync(file);
        }
    }
    dragOverHandler(ev) {
        ev.preventDefault();
    }
    async tryReadAndValidateImageAsync(image) {
        try {
            this.showLoader = true;
            await this.uploadImageOrThrow(image);
        }
        catch (error) {
            this.handleImageUploadError(error);
        }
        finally {
            this.showLoader = false;
            return !!this.imageUploaded;
        }
    }
    async uploadImageOrThrow(image) {
        this.checkImageForErrors(image);
        const encodingData = await this.getBase64Async(image);
        this.feedbackImageBase64.emit(encodingData);
        this.imageUploaded = {
            name: image.name, rawBase64: encodingData
        };
    }
    checkImageForErrors(image) {
        if (!image) {
            throw new Error("image does not exist");
        }
        const isImageSupported = this.supportedImageTypeArray.includes(image.type);
        if (!isImageSupported) {
            throw new ImageUploadError(ImageUploadErrorType.UnsupportedFormat);
        }
        if (image.size > this.imageSizeLimitBytes) {
            throw new ImageUploadError(ImageUploadErrorType.TooLarge);
        }
    }
    handleImageUploadError(error) {
        const errorMessage = this.getImageUploadErrorMessage(error);
        this.imageUploadError.emit(this.localizationService.getResourceStringComponents('IMAGE_NOT_ATTACHED') + ' ' + errorMessage);
        this.feedbackImageBase64.emit(undefined);
        this.imageUploaded = undefined;
    }
    getImageUploadErrorMessage(error) {
        if (error.name === ImageUploadError_name) {
            switch (error.imageUploadErrorType) {
                case ImageUploadErrorType.TooLarge:
                    return this.localizationService.getResourceStringComponents('IMAGE_EXCEEDS_MAX_FILE_SIZE_0', [`${this.megabyteLimit} MB`]);
                case ImageUploadErrorType.UnsupportedFormat:
                    return this.localizationService.getResourceStringComponents('IMAGE_CORRUPTED_UNRECOGNIZED_FORMAT') + ' ' + this.localizationService.getResourceStringComponents('ACCEPTED_FORMATS_ARE_0', [this.acceptedImageFormats,]);
                default:
                    return error.message ?? this.localizedStrings.UNKNOWN_ERROR;
            }
        }
        else {
            return error.message ?? this.localizedStrings.UNKNOWN_ERROR;
        }
    }
    onInputClickArea() {
        if (!this.inputFile) {
            console.warn('Input Element unexpectedly does not exist.');
            return;
        }
        this.inputFile.nativeElement.click();
    }
    async onFileSelectedAsync(event) {
        const file = event.target?.files?.item(0) ?? undefined;
        const isFileAttached = await this.tryReadAndValidateImageAsync(file);
        if (!isFileAttached) {
            event.target.files = null;
            event.target.value = '';
        }
    }
    async getBase64Async(file) {
        return new Promise((resolve, reject) => {
            var reader = new FileReader();
            reader.onload = () => {
                const imgBase64 = reader.result;
                var image = document.createElement('img');
                image.onload = () => {
                    resolve(imgBase64);
                };
                image.onerror = (error) => {
                    console.warn(error);
                    reject(new ImageUploadError(ImageUploadErrorType.UnsupportedFormat));
                };
                image.src = imgBase64;
            };
            reader.onerror = (error) => {
                console.warn(error);
                reject(new ImageUploadError(ImageUploadErrorType.UnsupportedFormat));
            };
            reader.readAsDataURL(file);
        });
    }
    removeImage() {
        this.imageUploaded = undefined;
        this.feedbackImageBase64.emit(undefined);
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackImageUploadComponent, deps: [{ token: i1.AppLocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FeedbackImageUploadComponent, selector: "lf-feedback-image-upload", outputs: { imageUploadError: "imageUploadError", feedbackImageBase64: "feedbackImageBase64" }, viewQueries: [{ propertyName: "inputFile", first: true, predicate: ["uploadFile"], descendants: true }], ngImport: i0, template: "<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<label for=\"image-upload\" class=\"lf-text-label\"\r\n  >{{ localizedStrings.ATTACH_IMAGE | async }} ({{ localizedStrings.OPTIONAL | async }})</label\r\n>\r\n<div (drop)=\"dropHandler($event)\" (dragover)=\"dragOverHandler($event)\">\r\n  <div id=\"image-upload\" class=\"file-drop-zone\" *ngIf=\"!(showLoader || imageUploaded); else showSelectedFile\">\r\n    <input\r\n      id=\"browseFileInput\"\r\n      type=\"file\"\r\n      [accept]=\"acceptedImageTypes\"\r\n      tabindex=\"-1\"\r\n      title=\"\"\r\n      (change)=\"onFileSelectedAsync($event)\"\r\n      #uploadFile\r\n    />\r\n\r\n    <div id=\"file-upload-area\">\r\n      <span id=\"upload-icon\" class=\"material-icons\"> file_upload </span>\r\n      <label for=\"uploadFile\">\r\n        <button class=\"sec-button lf-button\" (click)=\"onInputClickArea()\">{{ localizedStrings.BROWSE | async }}</button>\r\n      </label>\r\n      <div class=\"file-upload-sub-text lf-text-body\">{{ localizedStrings.OR | async }}</div>\r\n      <div class=\"file-upload-sub-text lf-text-body\">{{ localizedStrings.DRAG_DROP_FILE | async }}</div>\r\n    </div>\r\n  </div>\r\n  <ng-template #showSelectedFile>\r\n    <div class=\"picked-file-zone\">\r\n      <div *ngIf=\"imageUploaded; else displayLoader\" class=\"selected-file-info\">\r\n          <div class=\"image-preview\">\r\n            <img [src]=\"imageUploaded?.rawBase64\" style=\"max-width: 100%; max-height: 100%; object-fit: contain\" />\r\n          </div>\r\n          <div id=\"uploaded-file-name\" class=\"lf-text-body\" title=\"{{ imageUploaded?.name }}\">\r\n            {{ imageUploaded?.name }}\r\n          </div>\r\n          <button class=\"lf-close-button\" title=\"{{ localizedStrings.REMOVE | async }}\" (click)=\"removeImage()\">\r\n            <span class=\"material-icons-outlined\"> close </span>\r\n          </button>\r\n      </div>\r\n      <ng-template #displayLoader>\r\n        <div class=\"loader-wrapper\">\r\n          <lf-loader-component></lf-loader-component>\r\n        </div>\r\n      </ng-template>\r\n    </div>\r\n  </ng-template>\r\n</div>\r\n", styles: [":host{display:block}.file-drop-zone{cursor:pointer}.file-drop-zone,.picked-file-zone{width:100%;padding:8px;border:dashed 1px #979797;position:relative;margin:0 auto;box-sizing:border-box}input#browseFileInput{opacity:0;position:absolute;z-index:2;width:100%;height:100%;top:0;left:0;cursor:pointer}.file-upload-sub-text{font-size:14px;line-height:24px;font-weight:600}#uploaded-file-name{padding-right:8px;padding-left:8px;overflow:hidden;text-overflow:ellipsis;text-align:center}#file-upload-area{display:flex;flex-direction:column;align-items:center;width:100%}#upload-icon{font-size:36px;color:#646464}.selected-file-info{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.image-preview{height:64px;width:64px;display:flex;justify-content:center}.loader-wrapper{display:flex;justify-content:center}\n", ".lf-close-button{cursor:pointer;display:flex;height:24px;width:24px;align-items:center;border:none;background:inherit;justify-content:center;color:#646464}.lf-textarea{width:100%;display:block;border:1px solid #aaaaaa;border-radius:2px;padding:7px 10px 8px;box-sizing:border-box}.lf-textarea::-webkit-scrollbar{width:8px}.lf-textarea::-webkit-scrollbar-track{margin:1px}.lf-textarea::-webkit-scrollbar-thumb{background:#6d6d6d;border-radius:10px}.dialog-button{margin-left:10px}.character-count{width:100%;text-align:right;font-size:12px;margin-top:2px}.feedback-suggestion-textbox{resize:none}.lf-user-feedback-description{margin-bottom:10px}.feedback-suggestion-button{margin-left:auto;margin-right:auto;font-weight:600;cursor:pointer;display:block;width:80%;height:60px;background-color:inherit;border:1px solid #cfcfcf;border-radius:4px;line-height:16px}#lf-user-feedback-suggestion-mode-button{margin-top:5px}.feedback-suggestion-button:hover{background-color:#e0e0e0}.email-checkbox-container{margin-top:20px;display:flex;justify-content:flex-start}::ng-deep .lf-user-feedback-panel .mat-mdc-dialog-container{padding:0}.dialog-content{position:relative}#messages{top:-15px}.lf-text-label{display:block;padding-bottom:5px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox{margin-right:4px;padding:0}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mat-mdc-checkbox-touch-target{width:20px;height:20px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{width:18px;height:18px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{left:0;top:0}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.LfLoaderComponent, selector: "lf-loader-component" }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackImageUploadComponent, decorators: [{
            type: Component,
            args: [{ selector: 'lf-feedback-image-upload', template: "<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<label for=\"image-upload\" class=\"lf-text-label\"\r\n  >{{ localizedStrings.ATTACH_IMAGE | async }} ({{ localizedStrings.OPTIONAL | async }})</label\r\n>\r\n<div (drop)=\"dropHandler($event)\" (dragover)=\"dragOverHandler($event)\">\r\n  <div id=\"image-upload\" class=\"file-drop-zone\" *ngIf=\"!(showLoader || imageUploaded); else showSelectedFile\">\r\n    <input\r\n      id=\"browseFileInput\"\r\n      type=\"file\"\r\n      [accept]=\"acceptedImageTypes\"\r\n      tabindex=\"-1\"\r\n      title=\"\"\r\n      (change)=\"onFileSelectedAsync($event)\"\r\n      #uploadFile\r\n    />\r\n\r\n    <div id=\"file-upload-area\">\r\n      <span id=\"upload-icon\" class=\"material-icons\"> file_upload </span>\r\n      <label for=\"uploadFile\">\r\n        <button class=\"sec-button lf-button\" (click)=\"onInputClickArea()\">{{ localizedStrings.BROWSE | async }}</button>\r\n      </label>\r\n      <div class=\"file-upload-sub-text lf-text-body\">{{ localizedStrings.OR | async }}</div>\r\n      <div class=\"file-upload-sub-text lf-text-body\">{{ localizedStrings.DRAG_DROP_FILE | async }}</div>\r\n    </div>\r\n  </div>\r\n  <ng-template #showSelectedFile>\r\n    <div class=\"picked-file-zone\">\r\n      <div *ngIf=\"imageUploaded; else displayLoader\" class=\"selected-file-info\">\r\n          <div class=\"image-preview\">\r\n            <img [src]=\"imageUploaded?.rawBase64\" style=\"max-width: 100%; max-height: 100%; object-fit: contain\" />\r\n          </div>\r\n          <div id=\"uploaded-file-name\" class=\"lf-text-body\" title=\"{{ imageUploaded?.name }}\">\r\n            {{ imageUploaded?.name }}\r\n          </div>\r\n          <button class=\"lf-close-button\" title=\"{{ localizedStrings.REMOVE | async }}\" (click)=\"removeImage()\">\r\n            <span class=\"material-icons-outlined\"> close </span>\r\n          </button>\r\n      </div>\r\n      <ng-template #displayLoader>\r\n        <div class=\"loader-wrapper\">\r\n          <lf-loader-component></lf-loader-component>\r\n        </div>\r\n      </ng-template>\r\n    </div>\r\n  </ng-template>\r\n</div>\r\n", styles: [":host{display:block}.file-drop-zone{cursor:pointer}.file-drop-zone,.picked-file-zone{width:100%;padding:8px;border:dashed 1px #979797;position:relative;margin:0 auto;box-sizing:border-box}input#browseFileInput{opacity:0;position:absolute;z-index:2;width:100%;height:100%;top:0;left:0;cursor:pointer}.file-upload-sub-text{font-size:14px;line-height:24px;font-weight:600}#uploaded-file-name{padding-right:8px;padding-left:8px;overflow:hidden;text-overflow:ellipsis;text-align:center}#file-upload-area{display:flex;flex-direction:column;align-items:center;width:100%}#upload-icon{font-size:36px;color:#646464}.selected-file-info{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.image-preview{height:64px;width:64px;display:flex;justify-content:center}.loader-wrapper{display:flex;justify-content:center}\n", ".lf-close-button{cursor:pointer;display:flex;height:24px;width:24px;align-items:center;border:none;background:inherit;justify-content:center;color:#646464}.lf-textarea{width:100%;display:block;border:1px solid #aaaaaa;border-radius:2px;padding:7px 10px 8px;box-sizing:border-box}.lf-textarea::-webkit-scrollbar{width:8px}.lf-textarea::-webkit-scrollbar-track{margin:1px}.lf-textarea::-webkit-scrollbar-thumb{background:#6d6d6d;border-radius:10px}.dialog-button{margin-left:10px}.character-count{width:100%;text-align:right;font-size:12px;margin-top:2px}.feedback-suggestion-textbox{resize:none}.lf-user-feedback-description{margin-bottom:10px}.feedback-suggestion-button{margin-left:auto;margin-right:auto;font-weight:600;cursor:pointer;display:block;width:80%;height:60px;background-color:inherit;border:1px solid #cfcfcf;border-radius:4px;line-height:16px}#lf-user-feedback-suggestion-mode-button{margin-top:5px}.feedback-suggestion-button:hover{background-color:#e0e0e0}.email-checkbox-container{margin-top:20px;display:flex;justify-content:flex-start}::ng-deep .lf-user-feedback-panel .mat-mdc-dialog-container{padding:0}.dialog-content{position:relative}#messages{top:-15px}.lf-text-label{display:block;padding-bottom:5px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox{margin-right:4px;padding:0}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mat-mdc-checkbox-touch-target{width:20px;height:20px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{width:18px;height:18px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{left:0;top:0}\n"] }]
        }], ctorParameters: () => [{ type: i1.AppLocalizationService }], propDecorators: { imageUploadError: [{
                type: Output
            }], feedbackImageBase64: [{
                type: Output
            }], inputFile: [{
                type: ViewChild,
                args: ['uploadFile']
            }] } });
/** @internal */
var ImageUploadErrorType;
(function (ImageUploadErrorType) {
    ImageUploadErrorType[ImageUploadErrorType["TooLarge"] = 0] = "TooLarge";
    ImageUploadErrorType[ImageUploadErrorType["UnsupportedFormat"] = 1] = "UnsupportedFormat";
})(ImageUploadErrorType || (ImageUploadErrorType = {}));
/** @internal */
const ImageUploadError_name = 'ImageUploadError';
/** @internal */
class ImageUploadError extends Error {
    constructor(imageUploadErrorType, message) {
        super(message ?? imageUploadErrorType.toString());
        this.imageUploadErrorType = imageUploadErrorType;
        this.name = ImageUploadError_name;
    }
}

// Copyright (c) Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.
/** @internal */
class FeedbackSubmissionComponent {
    constructor(localizationService) {
        this.localizationService = localizationService;
        this.feedbackTextChanged = new EventEmitter();
        this.toastMessages = [];
        this.maxFeedbackLength = 2048;
        this.feedbackLength = 0;
        this.feedbackEmailCheckbox = false;
        this.localizedStrings = {
            FOUND_SOMETHING_LIKE_DISLIKE_LET_US_KNOW: this.localizationService.getStringComponentsObservable('FOUND_SOMETHING_LIKE_DISLIKE_LET_US_KNOW'),
            DO_YOU_HAVE_IDEA_NEW_FEATURE_IMPROVEMENT_LOOK_FORWARD_TO_HEARING: this.localizationService.getStringComponentsObservable('DO_YOU_HAVE_IDEA_NEW_FEATURE_IMPROVEMENT_LOOK_FORWARD_TO_HEARING'),
            TELL_US_ABOUT_EXPERIENCE: this.localizationService.getStringComponentsObservable('TELL_US_ABOUT_EXPERIENCE'),
            PLEASE_DO_NOT_INCLUDE_CONFIDENTIAL_OR_PERSONAL_INFO_IN_FEEDBACK: this.localizationService.getStringComponentsObservable('PLEASE_DO_NOT_INCLUDE_CONFIDENTIAL_OR_PERSONAL_INFO_IN_FEEDBACK'),
            YOU_MAY_CONTACT_ME_ABOUT_FEEDBACK: this.localizationService.getStringComponentsObservable('YOU_MAY_CONTACT_ME_ABOUT_FEEDBACK'),
            TELL_US_ABOUT_IDEA: this.localizationService.getStringComponentsObservable('TELL_US_ABOUT_IDEA'),
            REQUIRED: this.localizationService.getStringLaserficheObservable('REQUIRED'),
        };
    }
    onFeedbackImageBase64(imageBase64) {
        this.feedbackImageBase64 = imageBase64;
    }
    feedbackTextBoxChange(event) {
        const feedbackText = event.target.value;
        this.feedbackLength = feedbackText.length;
        this.feedbackTextChanged.emit(feedbackText);
    }
    onImageUploadError(errMsg) {
        const errorToastMsg = {
            message: errMsg,
            type: LfMessageToastTypes.Warning,
            noIcon: false,
            hideMessage: false,
        };
        this.toastMessages = [errorToastMsg];
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackSubmissionComponent, deps: [{ token: i1.AppLocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FeedbackSubmissionComponent, selector: "lf-feedback-submission", inputs: { isFeedback: "isFeedback" }, outputs: { feedbackTextChanged: "feedbackTextChanged" }, ngImport: i0, template: "<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<div class=\"user-feedback-content-container lf-dialog-content\">\r\n  <lf-toast-message id=\"messages\" [messages]=\"toastMessages\"></lf-toast-message>\r\n  <div class=\"lf-text-body lf-user-feedback-description\">\r\n    {{\r\n      isFeedback\r\n        ? (localizedStrings.FOUND_SOMETHING_LIKE_DISLIKE_LET_US_KNOW | async)\r\n        : (localizedStrings.DO_YOU_HAVE_IDEA_NEW_FEATURE_IMPROVEMENT_LOOK_FORWARD_TO_HEARING | async)\r\n    }}\r\n  </div>\r\n  <label for=\"feedback-suggestion-textbox\" class=\"lf-text-label\"\r\n    >{{\r\n      isFeedback ? (localizedStrings.TELL_US_ABOUT_EXPERIENCE | async) : (localizedStrings.TELL_US_ABOUT_IDEA | async)\r\n    }}\r\n    ({{ localizedStrings.REQUIRED | async }})</label\r\n  >\r\n  <textarea\r\n    id=\"feedback-suggestion-textbox\"\r\n    rows=\"10\"\r\n    [attr.maxlength]=\"maxFeedbackLength\"\r\n    (input)=\"feedbackTextBoxChange($event)\"\r\n    class=\"lf-textarea lf-text-placeholder lf-text-body feedback-suggestion-textbox\"\r\n    [placeholder]=\"localizedStrings.PLEASE_DO_NOT_INCLUDE_CONFIDENTIAL_OR_PERSONAL_INFO_IN_FEEDBACK | async\"\r\n  ></textarea>\r\n  <div class=\"lf-text-body character-count\">\r\n    <span>{{ feedbackLength }}</span>\r\n    <span> / </span>\r\n    <span>{{ maxFeedbackLength }}</span>\r\n  </div>\r\n  <lf-feedback-image-upload\r\n    id=\"image-upload-block\"\r\n    (feedbackImageBase64)=\"onFeedbackImageBase64($event)\"\r\n    (imageUploadError)=\"onImageUploadError($event)\"\r\n  ></lf-feedback-image-upload>\r\n  <div class=\"email-checkbox-container\">\r\n    <mat-checkbox\r\n      color=\"primary\"\r\n      class=\"lf-user-feedback-checkbox lf-checkbox\"\r\n      [disableRipple]=\"true\"\r\n      ngDefaultControl\r\n      [(ngModel)]=\"feedbackEmailCheckbox\"\r\n    >\r\n      {{ localizedStrings.YOU_MAY_CONTACT_ME_ABOUT_FEEDBACK | async }}\r\n    </mat-checkbox>\r\n  </div>\r\n</div>\r\n", styles: ["#image-upload-block{height:160px}\n", ".lf-close-button{cursor:pointer;display:flex;height:24px;width:24px;align-items:center;border:none;background:inherit;justify-content:center;color:#646464}.lf-textarea{width:100%;display:block;border:1px solid #aaaaaa;border-radius:2px;padding:7px 10px 8px;box-sizing:border-box}.lf-textarea::-webkit-scrollbar{width:8px}.lf-textarea::-webkit-scrollbar-track{margin:1px}.lf-textarea::-webkit-scrollbar-thumb{background:#6d6d6d;border-radius:10px}.dialog-button{margin-left:10px}.character-count{width:100%;text-align:right;font-size:12px;margin-top:2px}.feedback-suggestion-textbox{resize:none}.lf-user-feedback-description{margin-bottom:10px}.feedback-suggestion-button{margin-left:auto;margin-right:auto;font-weight:600;cursor:pointer;display:block;width:80%;height:60px;background-color:inherit;border:1px solid #cfcfcf;border-radius:4px;line-height:16px}#lf-user-feedback-suggestion-mode-button{margin-top:5px}.feedback-suggestion-button:hover{background-color:#e0e0e0}.email-checkbox-container{margin-top:20px;display:flex;justify-content:flex-start}::ng-deep .lf-user-feedback-panel .mat-mdc-dialog-container{padding:0}.dialog-content{position:relative}#messages{top:-15px}.lf-text-label{display:block;padding-bottom:5px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox{margin-right:4px;padding:0}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mat-mdc-checkbox-touch-target{width:20px;height:20px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{width:18px;height:18px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{left:0;top:0}\n"], dependencies: [{ kind: "directive", type: i2$1.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: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i1.LfToastMessageComponent, selector: "lf-toast-message", inputs: ["messages"] }, { kind: "component", type: FeedbackImageUploadComponent, selector: "lf-feedback-image-upload", outputs: ["imageUploadError", "feedbackImageBase64"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackSubmissionComponent, decorators: [{
            type: Component,
            args: [{ selector: 'lf-feedback-submission', template: "<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<div class=\"user-feedback-content-container lf-dialog-content\">\r\n  <lf-toast-message id=\"messages\" [messages]=\"toastMessages\"></lf-toast-message>\r\n  <div class=\"lf-text-body lf-user-feedback-description\">\r\n    {{\r\n      isFeedback\r\n        ? (localizedStrings.FOUND_SOMETHING_LIKE_DISLIKE_LET_US_KNOW | async)\r\n        : (localizedStrings.DO_YOU_HAVE_IDEA_NEW_FEATURE_IMPROVEMENT_LOOK_FORWARD_TO_HEARING | async)\r\n    }}\r\n  </div>\r\n  <label for=\"feedback-suggestion-textbox\" class=\"lf-text-label\"\r\n    >{{\r\n      isFeedback ? (localizedStrings.TELL_US_ABOUT_EXPERIENCE | async) : (localizedStrings.TELL_US_ABOUT_IDEA | async)\r\n    }}\r\n    ({{ localizedStrings.REQUIRED | async }})</label\r\n  >\r\n  <textarea\r\n    id=\"feedback-suggestion-textbox\"\r\n    rows=\"10\"\r\n    [attr.maxlength]=\"maxFeedbackLength\"\r\n    (input)=\"feedbackTextBoxChange($event)\"\r\n    class=\"lf-textarea lf-text-placeholder lf-text-body feedback-suggestion-textbox\"\r\n    [placeholder]=\"localizedStrings.PLEASE_DO_NOT_INCLUDE_CONFIDENTIAL_OR_PERSONAL_INFO_IN_FEEDBACK | async\"\r\n  ></textarea>\r\n  <div class=\"lf-text-body character-count\">\r\n    <span>{{ feedbackLength }}</span>\r\n    <span> / </span>\r\n    <span>{{ maxFeedbackLength }}</span>\r\n  </div>\r\n  <lf-feedback-image-upload\r\n    id=\"image-upload-block\"\r\n    (feedbackImageBase64)=\"onFeedbackImageBase64($event)\"\r\n    (imageUploadError)=\"onImageUploadError($event)\"\r\n  ></lf-feedback-image-upload>\r\n  <div class=\"email-checkbox-container\">\r\n    <mat-checkbox\r\n      color=\"primary\"\r\n      class=\"lf-user-feedback-checkbox lf-checkbox\"\r\n      [disableRipple]=\"true\"\r\n      ngDefaultControl\r\n      [(ngModel)]=\"feedbackEmailCheckbox\"\r\n    >\r\n      {{ localizedStrings.YOU_MAY_CONTACT_ME_ABOUT_FEEDBACK | async }}\r\n    </mat-checkbox>\r\n  </div>\r\n</div>\r\n", styles: ["#image-upload-block{height:160px}\n", ".lf-close-button{cursor:pointer;display:flex;height:24px;width:24px;align-items:center;border:none;background:inherit;justify-content:center;color:#646464}.lf-textarea{width:100%;display:block;border:1px solid #aaaaaa;border-radius:2px;padding:7px 10px 8px;box-sizing:border-box}.lf-textarea::-webkit-scrollbar{width:8px}.lf-textarea::-webkit-scrollbar-track{margin:1px}.lf-textarea::-webkit-scrollbar-thumb{background:#6d6d6d;border-radius:10px}.dialog-button{margin-left:10px}.character-count{width:100%;text-align:right;font-size:12px;margin-top:2px}.feedback-suggestion-textbox{resize:none}.lf-user-feedback-description{margin-bottom:10px}.feedback-suggestion-button{margin-left:auto;margin-right:auto;font-weight:600;cursor:pointer;display:block;width:80%;height:60px;background-color:inherit;border:1px solid #cfcfcf;border-radius:4px;line-height:16px}#lf-user-feedback-suggestion-mode-button{margin-top:5px}.feedback-suggestion-button:hover{background-color:#e0e0e0}.email-checkbox-container{margin-top:20px;display:flex;justify-content:flex-start}::ng-deep .lf-user-feedback-panel .mat-mdc-dialog-container{padding:0}.dialog-content{position:relative}#messages{top:-15px}.lf-text-label{display:block;padding-bottom:5px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox{margin-right:4px;padding:0}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mat-mdc-checkbox-touch-target{width:20px;height:20px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{width:18px;height:18px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{left:0;top:0}\n"] }]
        }], ctorParameters: () => [{ type: i1.AppLocalizationService }], propDecorators: { isFeedback: [{
                type: Input
            }], feedbackTextChanged: [{
                type: Output
            }] } });

// Copyright (c) Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.
/** @internal */
var UserFeedbackTrackingEventType;
(function (UserFeedbackTrackingEventType) {
    UserFeedbackTrackingEventType["Feedback"] = "Feedback";
    UserFeedbackTrackingEventType["Suggestion"] = "Suggestion";
})(UserFeedbackTrackingEventType || (UserFeedbackTrackingEventType = {}));

// Copyright (c) Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.
/** @internal */
class FeedbackSuggestionSelectionComponent {
    constructor(localizationService) {
        this.localizationService = localizationService;
        this.feedbackClicked = new EventEmitter();
        this.suggestionClicked = new EventEmitter();
        this.localizedStrings = {
            YOUR_FEEDBACK_SUGGESTION_HELP_IMPROVE_PRODUCT: this.localizationService.getStringComponentsObservable('YOUR_FEEDBACK_SUGGESTION_HELP_IMPROVE_PRODUCT'),
            TECHNICAL_ISSUES_CONTACT_ADMIN_OR_SP: this.localizationService.getStringComponentsObservable('TECHNICAL_ISSUES_CONTACT_ADMIN_OR_SP'),
            I_HAVE_FEEDBACK: this.localizationService.getStringComponentsObservable('I_HAVE_FEEDBACK'),
            I_HAVE_SUGGESTION: this.localizationService.getStringComponentsObservable('I_HAVE_SUGGESTION'),
        };
    }
    onClickFeedback() {
        this.feedbackClicked.emit();
    }
    onClickSuggestion() {
        this.suggestionClicked.emit();
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackSuggestionSelectionComponent, deps: [{ token: i1.AppLocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: FeedbackSuggestionSelectionComponent, selector: "lf-feedback-suggestion-selection", outputs: { feedbackClicked: "feedbackClicked", suggestionClicked: "suggestionClicked" }, ngImport: i0, template: "<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<div class=\"lf-text-body lf-user-feedback-description\">{{localizedStrings.YOUR_FEEDBACK_SUGGESTION_HELP_IMPROVE_PRODUCT | async}}</div>\r\n<div class=\"lf-text-body lf-user-feedback-description\">{{localizedStrings.TECHNICAL_ISSUES_CONTACT_ADMIN_OR_SP | async}}</div>\r\n<button id=\"lf-user-feedback-feedback-mode-button\" class=\"lf-button feedback-suggestion-button\"\r\n    (click)=\"onClickFeedback()\">{{localizedStrings.I_HAVE_FEEDBACK | async}}</button>\r\n<button id=\"lf-user-feedback-suggestion-mode-button\" class=\"lf-button feedback-suggestion-button\"\r\n    (click)=\"onClickSuggestion()\">{{localizedStrings.I_HAVE_SUGGESTION | async}}</button>\r\n", styles: ["", ".lf-close-button{cursor:pointer;display:flex;height:24px;width:24px;align-items:center;border:none;background:inherit;justify-content:center;color:#646464}.lf-textarea{width:100%;display:block;border:1px solid #aaaaaa;border-radius:2px;padding:7px 10px 8px;box-sizing:border-box}.lf-textarea::-webkit-scrollbar{width:8px}.lf-textarea::-webkit-scrollbar-track{margin:1px}.lf-textarea::-webkit-scrollbar-thumb{background:#6d6d6d;border-radius:10px}.dialog-button{margin-left:10px}.character-count{width:100%;text-align:right;font-size:12px;margin-top:2px}.feedback-suggestion-textbox{resize:none}.lf-user-feedback-description{margin-bottom:10px}.feedback-suggestion-button{margin-left:auto;margin-right:auto;font-weight:600;cursor:pointer;display:block;width:80%;height:60px;background-color:inherit;border:1px solid #cfcfcf;border-radius:4px;line-height:16px}#lf-user-feedback-suggestion-mode-button{margin-top:5px}.feedback-suggestion-button:hover{background-color:#e0e0e0}.email-checkbox-container{margin-top:20px;display:flex;justify-content:flex-start}::ng-deep .lf-user-feedback-panel .mat-mdc-dialog-container{padding:0}.dialog-content{position:relative}#messages{top:-15px}.lf-text-label{display:block;padding-bottom:5px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox{margin-right:4px;padding:0}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mat-mdc-checkbox-touch-target{width:20px;height:20px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{width:18px;height:18px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{left:0;top:0}\n"], dependencies: [{ kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: FeedbackSuggestionSelectionComponent, decorators: [{
            type: Component,
            args: [{ selector: 'lf-feedback-suggestion-selection', template: "<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<div class=\"lf-text-body lf-user-feedback-description\">{{localizedStrings.YOUR_FEEDBACK_SUGGESTION_HELP_IMPROVE_PRODUCT | async}}</div>\r\n<div class=\"lf-text-body lf-user-feedback-description\">{{localizedStrings.TECHNICAL_ISSUES_CONTACT_ADMIN_OR_SP | async}}</div>\r\n<button id=\"lf-user-feedback-feedback-mode-button\" class=\"lf-button feedback-suggestion-button\"\r\n    (click)=\"onClickFeedback()\">{{localizedStrings.I_HAVE_FEEDBACK | async}}</button>\r\n<button id=\"lf-user-feedback-suggestion-mode-button\" class=\"lf-button feedback-suggestion-button\"\r\n    (click)=\"onClickSuggestion()\">{{localizedStrings.I_HAVE_SUGGESTION | async}}</button>\r\n", styles: [".lf-close-button{cursor:pointer;display:flex;height:24px;width:24px;align-items:center;border:none;background:inherit;justify-content:center;color:#646464}.lf-textarea{width:100%;display:block;border:1px solid #aaaaaa;border-radius:2px;padding:7px 10px 8px;box-sizing:border-box}.lf-textarea::-webkit-scrollbar{width:8px}.lf-textarea::-webkit-scrollbar-track{margin:1px}.lf-textarea::-webkit-scrollbar-thumb{background:#6d6d6d;border-radius:10px}.dialog-button{margin-left:10px}.character-count{width:100%;text-align:right;font-size:12px;margin-top:2px}.feedback-suggestion-textbox{resize:none}.lf-user-feedback-description{margin-bottom:10px}.feedback-suggestion-button{margin-left:auto;margin-right:auto;font-weight:600;cursor:pointer;display:block;width:80%;height:60px;background-color:inherit;border:1px solid #cfcfcf;border-radius:4px;line-height:16px}#lf-user-feedback-suggestion-mode-button{margin-top:5px}.feedback-suggestion-button:hover{background-color:#e0e0e0}.email-checkbox-container{margin-top:20px;display:flex;justify-content:flex-start}::ng-deep .lf-user-feedback-panel .mat-mdc-dialog-container{padding:0}.dialog-content{position:relative}#messages{top:-15px}.lf-text-label{display:block;padding-bottom:5px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox{margin-right:4px;padding:0}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mat-mdc-checkbox-touch-target{width:20px;height:20px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{width:18px;height:18px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{left:0;top:0}\n"] }]
        }], ctorParameters: () => [{ type: i1.AppLocalizationService }], propDecorators: { feedbackClicked: [{
                type: Output
            }], suggestionClicked: [{
                type: Output
            }] } });

/** @internal */
var FeedbackDialogState;
(function (FeedbackDialogState) {
    FeedbackDialogState[FeedbackDialogState["FIRST_PANE"] = 0] = "FIRST_PANE";
    FeedbackDialogState[FeedbackDialogState["FEEDBACK"] = 1] = "FEEDBACK";
    FeedbackDialogState[FeedbackDialogState["SUGGESTION"] = 2] = "SUGGESTION";
    FeedbackDialogState[FeedbackDialogState["THANK_YOU"] = 3] = "THANK_YOU";
    FeedbackDialogState[FeedbackDialogState["ERROR"] = 4] = "ERROR";
})(FeedbackDialogState || (FeedbackDialogState = {}));
/**
 * @internal
 */
class UserFeedbackDialogComponent {
    get isFirstPane() {
        return this.dialogState === FeedbackDialogState.FIRST_PANE;
    }
    get isFeedback() {
        return this.dialogState === FeedbackDialogState.FEEDBACK;
    }
    get isSuggestion() {
        return this.dialogState === FeedbackDialogState.SUGGESTION;
    }
    get isThankYou() {
        return this.dialogState === FeedbackDialogState.THANK_YOU;
    }
    get isError() {
        return this.dialogState === FeedbackDialogState.ERROR;
    }
    constructor(dialogRef, ref, localizationService) {
        this.dialogRef = dialogRef;
        this.ref = ref;
        this.localizationService = localizationService;
        this.submitFeedback = new EventEmitter();
        this.dialogState = FeedbackDialogState.FIRST_PANE;
        this.allSubscriptions = new Subscription();
        this.isSubmitDisabled = true;
        this.localizedStrings = {
            SUGGESTION: this.localizationService.getStringLaserficheObservable('SUGGESTION'),
            FEEDBACK: this.localizationService.getStringLaserficheObservable('FEEDBACK'),
            CLOSE: this.localizationService.getStringLaserficheObservable('CLOSE'),
            THANK_YOU_FOR_SUBMISSION: this.localizationService.getStringLaserficheObservable('THANK_YOU_FOR_SUBMISSION'),
            IF_YOUD_LIKE_TO_JOIN_OUR_CUSTOMER_PANEL: this.localizationService
                .getStringComponentsObservable('IF_YOUD_LIKE_TO_JOIN_OUR_CUSTOMER_PANEL')
                .pipe(map((value) => {
                return `${value} `;
            })),
            PLEASE_CLICK_HERE: this.localizationService.getStringComponentsObservable('PLEASE_CLICK_HERE'),
            SOMETHING_WENT_WRONG_PLEASE_TRY_AGAIN_LATER: this.localizationService.getStringLaserficheObservable('SOMETHING_WENT_WRONG_PLEASE_TRY_AGAIN_LATER'),
            SUBMIT: this.localizationService.getStringLaserficheObservable('SUBMIT'),
            CANCEL: this.localizationService.getStringLaserficheObservable('CANCEL'),
        };
        this.USER_FEEDBACK_TITLE = this.localizedStrings.FEEDBACK;
    }
    ngAfterViewInit() {
        const elem = document.getElementById('lf-user-feedback-feedback-mode-button');
        elem?.focus();
    }
    ngOnDestroy() {
        this.allSubscriptions.unsubscribe();
    }
    setError() {
        this.dialogState = FeedbackDialogState.ERROR;
    }
    onClickFeedback() {
        this.dialogState = FeedbackDialogState.FEEDBACK;
        this.USER_FEEDBACK_TITLE = this.localizedStrings.FEEDBACK;
        setTimeout(() => document.getElementById('feedback-suggestion-textbox')?.focus());
        this.onTextChanges();
    }
    onClickSuggestion() {
        this.dialogState = FeedbackDialogState.SUGGESTION;
        this.USER_FEEDBACK_TITLE = this.localizedStrings.SUGGESTION;
        setTimeout(() => document.getElementById('feedback-suggestion-textbox')?.focus());
        this.onTextChanges();
    }
    onEscKey(event) {
        this.dialogRef.close();
    }
    onTextChanges() {
        this.ref.detectChanges();
        const feedbackTextSub = this.feedbackSubmission?.feedbackTextChanged
            .asObservable()
            .pipe(debounceTime(250))
            .subscribe((text) => {
            this.feedbackText = text;
            this.isSubmitDisabled = this.isEmptyOrWhitespace(text);
        });
        this.allSubscriptions.add(feedbackTextSub);
    }
    async onClickSubmitAsync() {
        try {
            const dialogData = this.getFeedbackDialogData();
            this.submitFeedback.emit(dialogData);
            if (!this.isError) {
                this.dialogState = FeedbackDialogState.THANK_YOU;
            }
        }
        catch (error) {
            console.warn(error.message);
            this.setError();
        }
    }
    onCloseDialog() {
        this.dialogRef.close();
    }
    isEmptyOrWhitespace(value) {
        return !value || !(value.trim().length > 0);
    }
    getFeedbackDialogData() {
        if (!this.feedbackSubmission || !this.feedbackText) {
            throw new Error('feedbackSubmission unexpectedly does not exist. Cannot submit');
        }
        let userFeedbackTrackingEventType = UserFeedbackTrackingEventType.Feedback;
        if (this.isSuggestion) {
            userFeedbackTrackingEventType = UserFeedbackTrackingEventType.Suggestion;
        }
        const dialogData = {
            canContact: this.feedbackSubmission.feedbackEmailCheckbox,
            userFeedbackTrackingEventType,
            feedbackText: this.feedbackText,
            feedbackImageBase64: this.feedbackSubmission.feedbackImageBase64,
        };
        return dialogData;
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserFeedbackDialogComponent, deps: [{ token: i1$1.MatDialogRef }, { token: i0.ChangeDetectorRef }, { token: i1.AppLocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: UserFeedbackDialogComponent, selector: "lf-user-feedback-dialog-component", outputs: { submitFeedback: "submitFeedback" }, host: { listeners: { "document:keydown.escape": "onEscKey($event)" } }, viewQueries: [{ propertyName: "feedbackSubmission", first: true, predicate: FeedbackSubmissionComponent, descendants: true }], ngImport: i0, template: "<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<lf-general-dialog-layout>\r\n  <span class=\"lf-dialog-title lf-popup-dialog-title dialog-header\">{{ USER_FEEDBACK_TITLE | async }}</span>\r\n  <button class=\"dialog-header lf-close-button\" [title]=\"localizedStrings.CLOSE | async\" (click)=\"onCloseDialog()\">\r\n    <span class=\"material-icons-outlined\"> close </span>\r\n  </button>\r\n  <div *ngIf=\"isFirstPane\" class=\"dialog-content\">\r\n    <lf-feedback-suggestion-selection\r\n      (feedbackClicked)=\"onClickFeedback()\"\r\n      (suggestionClicked)=\"onClickSuggestion()\"\r\n    ></lf-feedback-suggestion-selection>\r\n  </div>\r\n  <div *ngIf=\"isFeedback || isSuggestion\" class=\"dialog-content\">\r\n    <lf-feedback-submission [isFeedback]=\"isFeedback\"></lf-feedback-submission>\r\n  </div>\r\n  <div *ngIf=\"isThankYou\" class=\"dialog-content\">\r\n    <div class=\"lf-text-body\">\r\n      {{ localizedStrings.THANK_YOU_FOR_SUBMISSION | async }}\r\n    </div>\r\n    <div class=\"lf-text-body\">\r\n      {{ localizedStrings.IF_YOUD_LIKE_TO_JOIN_OUR_CUSTOMER_PANEL | async }}\r\n      <a href=\"https://info.laserfiche.com/laserfiche-customer-panel-signup\" target=\"_blank\">{{\r\n        localizedStrings.PLEASE_CLICK_HERE | async\r\n      }}</a>\r\n    </div>\r\n  </div>\r\n  <div *ngIf=\"isError\" class=\"dialog-content\">\r\n    <p class=\"lf-text-body lf-user-feedback-thank-you\">\r\n      {{ localizedStrings.SOMETHING_WENT_WRONG_PLEASE_TRY_AGAIN_LATER | async }}\r\n    </p>\r\n  </div>\r\n  <div align=\"end\" class=\"dialog-footer\">\r\n    <button\r\n      *ngIf=\"isFeedback || isSuggestion\"\r\n      id=\"lf-user-feedback-submit-feedback-button\"\r\n      class=\"lf-button primary-button dialog-button\"\r\n      [disabled]=\"isSubmitDisabled\"\r\n      (click)=\"onClickSubmitAsync()\"\r\n    >\r\n      {{ localizedStrings.SUBMIT | async }}\r\n    </button>\r\n    <button class=\"lf-button sec-button dialog-button\" (click)=\"onCloseDialog()\">\r\n      {{ isThankYou || isError ? (localizedStrings.CLOSE | async) : (localizedStrings.CANCEL | async) }}\r\n    </button>\r\n  </div>\r\n</lf-general-dialog-layout>\r\n", styles: [".lf-close-button{cursor:pointer;display:flex;height:24px;width:24px;align-items:center;border:none;background:inherit;justify-content:center;color:#646464}.lf-textarea{width:100%;display:block;border:1px solid #aaaaaa;border-radius:2px;padding:7px 10px 8px;box-sizing:border-box}.lf-textarea::-webkit-scrollbar{width:8px}.lf-textarea::-webkit-scrollbar-track{margin:1px}.lf-textarea::-webkit-scrollbar-thumb{background:#6d6d6d;border-radius:10px}.dialog-button{margin-left:10px}.character-count{width:100%;text-align:right;font-size:12px;margin-top:2px}.feedback-suggestion-textbox{resize:none}.lf-user-feedback-description{margin-bottom:10px}.feedback-suggestion-button{margin-left:auto;margin-right:auto;font-weight:600;cursor:pointer;display:block;width:80%;height:60px;background-color:inherit;border:1px solid #cfcfcf;border-radius:4px;line-height:16px}#lf-user-feedback-suggestion-mode-button{margin-top:5px}.feedback-suggestion-button:hover{background-color:#e0e0e0}.email-checkbox-container{margin-top:20px;display:flex;justify-content:flex-start}::ng-deep .lf-user-feedback-panel .mat-mdc-dialog-container{padding:0}.dialog-content{position:relative}#messages{top:-15px}.lf-text-label{display:block;padding-bottom:5px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox{margin-right:4px;padding:0}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mat-mdc-checkbox-touch-target{width:20px;height:20px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{width:18px;height:18px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{left:0;top:0}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.GeneralDialogLayoutComponent, selector: "lf-general-dialog-layout" }, { kind: "component", type: FeedbackSuggestionSelectionComponent, selector: "lf-feedback-suggestion-selection", outputs: ["feedbackClicked", "suggestionClicked"] }, { kind: "component", type: FeedbackSubmissionComponent, selector: "lf-feedback-submission", inputs: ["isFeedback"], outputs: ["feedbackTextChanged"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: UserFeedbackDialogComponent, decorators: [{
            type: Component,
            args: [{ selector: 'lf-user-feedback-dialog-component', template: "<!--Copyright (c) Laserfiche.\r\nLicensed under the MIT License. See LICENSE in the project root for license information.-->\r\n\r\n<lf-general-dialog-layout>\r\n  <span class=\"lf-dialog-title lf-popup-dialog-title dialog-header\">{{ USER_FEEDBACK_TITLE | async }}</span>\r\n  <button class=\"dialog-header lf-close-button\" [title]=\"localizedStrings.CLOSE | async\" (click)=\"onCloseDialog()\">\r\n    <span class=\"material-icons-outlined\"> close </span>\r\n  </button>\r\n  <div *ngIf=\"isFirstPane\" class=\"dialog-content\">\r\n    <lf-feedback-suggestion-selection\r\n      (feedbackClicked)=\"onClickFeedback()\"\r\n      (suggestionClicked)=\"onClickSuggestion()\"\r\n    ></lf-feedback-suggestion-selection>\r\n  </div>\r\n  <div *ngIf=\"isFeedback || isSuggestion\" class=\"dialog-content\">\r\n    <lf-feedback-submission [isFeedback]=\"isFeedback\"></lf-feedback-submission>\r\n  </div>\r\n  <div *ngIf=\"isThankYou\" class=\"dialog-content\">\r\n    <div class=\"lf-text-body\">\r\n      {{ localizedStrings.THANK_YOU_FOR_SUBMISSION | async }}\r\n    </div>\r\n    <div class=\"lf-text-body\">\r\n      {{ localizedStrings.IF_YOUD_LIKE_TO_JOIN_OUR_CUSTOMER_PANEL | async }}\r\n      <a href=\"https://info.laserfiche.com/laserfiche-customer-panel-signup\" target=\"_blank\">{{\r\n        localizedStrings.PLEASE_CLICK_HERE | async\r\n      }}</a>\r\n    </div>\r\n  </div>\r\n  <div *ngIf=\"isError\" class=\"dialog-content\">\r\n    <p class=\"lf-text-body lf-user-feedback-thank-you\">\r\n      {{ localizedStrings.SOMETHING_WENT_WRONG_PLEASE_TRY_AGAIN_LATER | async }}\r\n    </p>\r\n  </div>\r\n  <div align=\"end\" class=\"dialog-footer\">\r\n    <button\r\n      *ngIf=\"isFeedback || isSuggestion\"\r\n      id=\"lf-user-feedback-submit-feedback-button\"\r\n      class=\"lf-button primary-button dialog-button\"\r\n      [disabled]=\"isSubmitDisabled\"\r\n      (click)=\"onClickSubmitAsync()\"\r\n    >\r\n      {{ localizedStrings.SUBMIT | async }}\r\n    </button>\r\n    <button class=\"lf-button sec-button dialog-button\" (click)=\"onCloseDialog()\">\r\n      {{ isThankYou || isError ? (localizedStrings.CLOSE | async) : (localizedStrings.CANCEL | async) }}\r\n    </button>\r\n  </div>\r\n</lf-general-dialog-layout>\r\n", styles: [".lf-close-button{cursor:pointer;display:flex;height:24px;width:24px;align-items:center;border:none;background:inherit;justify-content:center;color:#646464}.lf-textarea{width:100%;display:block;border:1px solid #aaaaaa;border-radius:2px;padding:7px 10px 8px;box-sizing:border-box}.lf-textarea::-webkit-scrollbar{width:8px}.lf-textarea::-webkit-scrollbar-track{margin:1px}.lf-textarea::-webkit-scrollbar-thumb{background:#6d6d6d;border-radius:10px}.dialog-button{margin-left:10px}.character-count{width:100%;text-align:right;font-size:12px;margin-top:2px}.feedback-suggestion-textbox{resize:none}.lf-user-feedback-description{margin-bottom:10px}.feedback-suggestion-button{margin-left:auto;margin-right:auto;font-weight:600;cursor:pointer;display:block;width:80%;height:60px;background-color:inherit;border:1px solid #cfcfcf;border-radius:4px;line-height:16px}#lf-user-feedback-suggestion-mode-button{margin-top:5px}.feedback-suggestion-button:hover{background-color:#e0e0e0}.email-checkbox-container{margin-top:20px;display:flex;justify-content:flex-start}::ng-deep .lf-user-feedback-panel .mat-mdc-dialog-container{padding:0}.dialog-content{position:relative}#messages{top:-15px}.lf-text-label{display:block;padding-bottom:5px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox{margin-right:4px;padding:0}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mat-mdc-checkbox-touch-target{width:20px;height:20px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__native-control{width:18px;height:18px}::ng-deep .lf-user-feedback-checkbox.mat-mdc-checkbox .mdc-checkbox .mdc-checkbox__background{left:0;top:0}\n"] }]
        }], ctorParameters: () => [{ type: i1$1.MatDialogRef }, { type: i0.ChangeDetectorRef }, { type: i1.AppLocalizationService }], propDecorators: { submitFeedback: [{
                type: Output
            }], feedbackSubmission: [{
                type: ViewChild,
                args: [FeedbackSubmissionComponent]
            }], onEscKey: [{
                type: HostListener,
                args: ['document:keydown.escape', ['$event']]
            }] } });

// Copyright Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.
function init(environment) {
    // Create a queue, but don't obliterate an existing one!
    const analytics = (window.analytics = window.analytics || []);
    // If the real analytics.js is already on the page return.
    if (analytics.initialize)
        return;
    // If the snippet was invoked already show an error.
    if (analytics.invoked) {
        if (window.console && console.error) {
            console.error('Segment snippet included twice.');
        }
        return;
    }
    // Invoked flag, to make sure the snippet
    // is never invoked twice.
    analytics.invoked = true;
    // A list of the methods in Analytics.js to stub.
    analytics.methods = [
        'trackSubmit',
        'trackClick',
        'trackLink',
        'trackForm',
        'pageview',
        'identify',
        'reset',
        'group',
        'track',
        'ready',
        'alias',
        'debug',
        'page',
        'once',
        'off',
        'on',
    ];
    // Define a factory to create stubs. These are placeholders
    // for methods in Analytics.js so that you never have to wait
    // for it to load to actually record data. The `method` is
    // stored as the first argument, so we can replay the data.
    analytics.factory = function (method) {
        return function () {
            var args = Array.prototype.slice.call(arguments);
            args.unshift(method);
            analytics.push(args);
            return analytics;
        };
    };
    // For each of our methods, generate a queueing stub.
    for (var i = 0; i < analytics.methods.length; i++) {
        var key = analytics.methods[i];
        analytics[key] = analytics.factory(key);
    }
    // Define a method to load Analytics.js from our CDN,
    // and that will be sure to only ever load it once.
    analytics.load = function (env, options) {
        // Create an async script element based on your key.
        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.async = true;
        script.src = 'https://lfxstatic.com/lib/LaserficheUsageTracking/latest/analytics.min.js';
        // Insert our script next to the first script element.
        var first = document.getElementsByTagName('script')[0];
        first.parentNode?.insertBefore(script, first);
        analytics._loadOptions = options;
        analytics._environment = env;
    };
    // Add a version to keep track of what's in the wild.
    analytics.SNIPPET_VERSION = '4.1.0';
    // Load Analytics.js with your enivironment, which will automatically
    // load the tools you've enabled for your account. Boosh!
    analytics.load(environment);
    // Make the first page call to load the integrations. If
    // you'd like to manually name or tag the page, edit or
    // move this call however you'd like.
    analytics.page();
}

// Copyright (c) Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.
/** @internal */
class LfAnalyticsService {
    constructor() {
        this.businessIntelligenceInitialized = false;
    }
    track(event) {
        try {
            const businessIntelligenceInfo = this.getBusinessIntelligenceInfo(window.origin);
            if (businessIntelligenceInfo && !this.businessIntelligenceInitialized) {
                init(businessIntelligenceInfo.environment);
                this.businessIntelligenceInitialized = true;
            }
            const analytics = this.getAnalytics(businessIntelligenceInfo);
            if (analytics && event.accountId && event.module && event.userId) {
                const isHostEmpower = this.isHostEmpower(window.origin);
                if (isHostEmpower) {
                    const hosting_context = event.hosting_context;
                    event.hosting_context = hosting_context ? 'Empower Environment - ' + hosting_context : 'Empower Environment';
                }
                console.log(`track ${event.eventName}`);
                const eventWithoutName = { ...event };
                delete eventWithoutName.eventName;
                analytics.track(event.eventName, eventWithoutName);
                return true;
            }
            return false;
        }
        catch (error) {
            console.warn(`Analytics track error: ${error}`);
            return false;
        }
    }
    getAnalytics(businessIntelligenceInfo) {
        if (!businessIntelligenceInfo) {
            return undefined;
        }
        else {
            return window.analytics;
        }
    }
    getBusinessIntelligenceInfo(url) {
        const _url = new URL(url.toLowerCase());
        if (_url.host.includes('cloudtest.') || _url.host.includes('d3nunhg1m0ng5s.')) {
            return { environment: 'test' };
        }
        else if (this.isNotProductionUrl(_url)) {
            return { environment: 'development' };
        }
        else {
            return { environment: 'production' };
        }
    }
    isNotProductionUrl(_url) {
        if (_url.host != 'app.laserfiche.com'
            && _url.host != 'signin.laserfiche.com'
            && _url.host != 'accounts.laserfiche.com'
            && _url.host != 'app.laserfiche.ca'
            && _url.host != 'signin.laserfiche.ca'
            && _url.host != 'accounts.laserfiche.ca'
            && _url.host != 'app.eu.laserfiche.com'
            && _url.host != 'signin.eu.laserfiche.com'
            && _url.host != 'accounts.eu.laserfiche.com'
            && _url.host != 'lfxstatic.com'
            && _url.host != 'app.clouddemo.laserfiche.com'
            && _url.host != 'accounts.clouddemo.laserfiche.com'
            && _url.host != 'signin.clouddemo.laserfiche.com') {
            return true; // not production
        }
        else {
            return false; // production
        }
    }
    isHostEmpower(url) {
        const _url = new URL(url.toLowerCase());
        if (_url.host == 'accounts.clouddemo.laserfiche.com'
            || _url.host == 'signin.clouddemo.laserfiche.com'
            || _url.host == 'app.clouddemo.laserfiche.com') {
            return true; // empower
        }
        else {
            return false; // not empower
        }
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LfAnalyticsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
    static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LfAnalyticsService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LfAnalyticsService, decorators: [{
            type: Injectable,
            args: [{
                    providedIn: 'root'
                }]
        }], ctorParameters: () => [] });

// Copyright (c) Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.
class LfUserFeedbackComponent {
    /** @internal */
    constructor(
    /** @internal */
    dialog, 
    /** @internal */
    analyticsService, 
    /** @internal */
    localizationService) {
        this.dialog = dialog;
        this.analyticsService = analyticsService;
        this.localizationService = localizationService;
        this.hosting_module = '';
        this.hosting_context = '';
        this.user_id = '';
        this.account_id = '';
        /** @internal */
        this.feedbackText = this.localizationService.getStringLaserficheObservable('FEEDBACK');
    }
    /** @internal */
    async handleDialogAsync() {
        if (!this.dialogRef) {
            this.openDialog();
            await this.closeDialogAsync();
        }
    }
    /** @internal */
    async closeDialogAsync() {
        await this.dialogRef.afterClosed().toPromise();
        this.dialogRef = undefined;
    }
    /** @internal */
    get disableFeedbackButton() {
        return !this.user_id || !this.account_id;
    }
    /** @internal */
    openDialog() {
        try {
            this.dialogRef = this.dialog.open(UserFeedbackDialogComponent, {
                width: '448px',
                data: {},
                panelClass: 'lf-user-feedback-panel',
                autoFocus: false,
                disableClose: true,
                backdropClass: 'lf-user-feedback-backdrop'
            });
            this.dialogRef.componentInstance.submitFeedback.subscribe((result) => {
                if (result?.userFeedbackTrackingEventType) {
                    const eventTrackingData = this.createEventTrackingData(result);
                    const trackSucceeded = this.analyticsService?.track(eventTrackingData);
                    if (!trackSucceeded) {
                        this.dialogRef?.componentInstance.setError();
                    }
                }
            });
        }
        catch (error) {
            console.error(`Could not open User Feedback dialog: ${error.message}`);
        }
    }
    /** @internal */
    createEventTrackingData(dialogData) {
        const data = {
            userId: this.user_id,
            accountId: this.account_id,
            module: 'UserFeedback', // Do not change or localize
            eventName: dialogData.userFeedbackTrackingEventType,
            hosting_module: this.hosting_module ?? 'UserFeedback',
            hosting_context: this.hosting_context,
            is_willing_to_be_contacted: dialogData.canContact,
            message: dialogData.feedbackText,
            email_address: '', // dummy empty value to satisfy the schema requirements
            image: dialogData.feedbackImageBase64 ?? undefined,
            attachment_entry_id: '', // dummy empty value
        };
        return data;
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LfUserFeedbackComponent, deps: [{ token: i1$1.MatDialog }, { token: LfAnalyticsService }, { token: i1.AppLocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
    static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: LfUserFeedbackComponent, selector: "lf-user-feedback-component", inputs: { hosting_module: "hosting_module", hosting_context: "hosting_context", user_id: "user_id", account_id: "account_id" }, ngImport: i0, template: `<button id="lf-user-feedback-button" [disabled]="disableFeedbackButton" (click)="handleDialogAsync()">
    {{ feedbackText | async }}
  </button>`, isInline: true, styles: ["::ng-deep .cdk-overlay-backdrop.lf-user-feedback-backdrop{opacity:.5;position:fixed;inset:0;background-color:#000;-webkit-user-select:none;user-select:none}\n"], dependencies: [{ kind: "pipe", type: i2.AsyncPipe, name: "async" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LfUserFeedbackComponent, decorators: [{
            type: Component,
            args: [{ selector: 'lf-user-feedback-component', template: `<button id="lf-user-feedback-button" [disabled]="disableFeedbackButton" (click)="handleDialogAsync()">
    {{ feedbackText | async }}
  </button>`, styles: ["::ng-deep .cdk-overlay-backdrop.lf-user-feedback-backdrop{opacity:.5;position:fixed;inset:0;background-color:#000;-webkit-user-select:none;user-select:none}\n"] }]
        }], ctorParameters: () => [{ type: i1$1.MatDialog }, { type: LfAnalyticsService }, { type: i1.AppLocalizationService }], propDecorators: { hosting_module: [{
                type: Input
            }], hosting_context: [{
                type: Input
            }], user_id: [{
                type: Input
            }], account_id: [{
                type: Input
            }] } });

// Copyright (c) Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.
class LfUserFeedbackModule {
    /** @internal */
    constructor(
    /** @internal */ injector) {
        const elementName = 'lf-user-feedback';
        if (window.customElements && !customElements.get(elementName)) {
            const newElement = createCustomElement(LfUserFeedbackComponent, { injector });
            customElements.define(elementName, newElement);
        }
    }
    static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LfUserFeedbackModule, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.NgModule }); }
    static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: LfUserFeedbackModule, bootstrap: [LfUserFeedbackComponent], declarations: [LfUserFeedbackComponent, UserFeedbackDialogComponent, FeedbackSuggestionSelectionComponent, FeedbackSubmissionComponent, FeedbackImageUploadComponent], imports: [CommonModule,
            FormsModule,
            MatDialogModule,
            MatCheckboxModule,
            MatIconModule,
            GeneralDialogLayoutModule,
            LfToastMessageModule,
            LfLoaderModule], exports: [LfUserFeedbackComponent] }); }
    static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LfUserFeedbackModule, imports: [CommonModule,
            FormsModule,
            MatDialogModule,
            MatCheckboxModule,
            MatIconModule,
            GeneralDialogLayoutModule,
            LfToastMessageModule,
            LfLoaderModule] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LfUserFeedbackModule, decorators: [{
            type: NgModule,
            args: [{
                    declarations: [LfUserFeedbackComponent, UserFeedbackDialogComponent, FeedbackSuggestionSelectionComponent, FeedbackSubmissionComponent, FeedbackImageUploadComponent],
                    imports: [
                        CommonModule,
                        FormsModule,
                        MatDialogModule,
                        MatCheckboxModule,
                        MatIconModule,
                        GeneralDialogLayoutModule,
                        LfToastMessageModule,
                        LfLoaderModule,
                    ],
                    providers: [],
                    bootstrap: [LfUserFeedbackComponent],
                    exports: [LfUserFeedbackComponent],
                    schemas: [CUSTOM_ELEMENTS_SCHEMA],
                }]
        }], ctorParameters: () => [{ type: i0.Injector }] });

// Copyright (c) Laserfiche.
// Licensed under the MIT License. See LICENSE in the project root for license information.

/**
 * Generated bundle index. Do not edit.
 */

export { LfUserFeedbackComponent, LfUserFeedbackModule };
//# sourceMappingURL=laserfiche-lf-ui-components-lf-user-feedback.mjs.map
