UNPKG

ngx-ui-hero

Version:

Simple, fast and reliable utilities for Angular.

7,330 lines 650 kB
import * as i0 from '@angular/core';
import { EventEmitter, Component, Input, Output, Directive, PLATFORM_ID, Injectable, Inject, Pipe, NgModule, InjectionToken, TemplateRef, Optional, ContentChild, ViewChild, forwardRef, HostListener } from '@angular/core';
import * as i1$4 from 'ngx-bootstrap/datepicker';
import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';
import * as i7 from 'ngx-bootstrap/dropdown';
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
import * as i1 from 'ngx-bootstrap/modal';
import { ModalModule } from 'ngx-bootstrap/modal';
import * as i1$3 from 'ngx-bootstrap/pagination';
import { PaginationModule } from 'ngx-bootstrap/pagination';
import * as i7$1 from 'ngx-bootstrap/popover';
import { PopoverModule } from 'ngx-bootstrap/popover';
import * as i5 from 'ngx-bootstrap/progressbar';
import { ProgressbarModule } from 'ngx-bootstrap/progressbar';
import * as i8 from 'ngx-bootstrap/tabs';
import { TabsModule } from 'ngx-bootstrap/tabs';
import * as i4 from 'ngx-bootstrap/tooltip';
import { TooltipModule } from 'ngx-bootstrap/tooltip';
import * as i1$1 from '@angular/common';
import { isPlatformBrowser, CommonModule, CurrencyPipe } from '@angular/common';
import { fromEvent, throwError, of, zip } from 'rxjs';
import { debounceTime, catchError, map, retry } from 'rxjs/operators';
import { orderBy, uniqBy, filter, sumBy, some, map as map$1, clone, find, sum } from 'lodash-es';
import * as i1$2 from '@angular/router';
import { NavigationStart } from '@angular/router';
import Swal from 'sweetalert2';
import * as i1$5 from '@angular/common/http';
import { HttpResponse, HttpClientModule } from '@angular/common/http';
import * as i4$1 from 'ng2-file-upload';
import { FileUploader, FileUploadModule } from 'ng2-file-upload';
import * as i2 from '@angular/forms';
import { FormsModule, Validators, NG_VALIDATORS, NG_ASYNC_VALIDATORS, NG_VALUE_ACCESSOR, NgModel } from '@angular/forms';
import * as _ from 'lodash';
import { __awaiter } from 'tslib';
import * as FileSaver from 'file-saver';
import * as XLSX from 'xlsx';
import * as i2$1 from '@angular/platform-browser';
import * as momentImported from 'moment';

class ModalComponent {
    constructor(modalRef) {
        this.modalRef = modalRef;
        this.modalTitle = '';
        this.hideActions = false;
        this.noPaddings = false;
        this.cancelButtonLabel = 'Cancel';
        this.onClose = new EventEmitter();
    }
    ngOnInit() {
    }
    Fechar() {
        this.onClose.emit();
        this.modalRef.hide();
    }
}
ModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ModalComponent, deps: [{ token: i1.BsModalRef }], target: i0.ɵɵFactoryTarget.Component });
ModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ModalComponent, selector: "ui-modal", inputs: { modalTitle: "modalTitle", hideActions: "hideActions", noPaddings: "noPaddings", cancelButtonLabel: "cancelButtonLabel" }, outputs: { onClose: "onClose" }, ngImport: i0, template: "<div class=\"modal-header\" *ngIf=\"modalTitle\">\n  <h5 class=\"modal-title\">{{modalTitle}}</h5>\n  <button type=\"button\" class=\"close\" (click)=\"Fechar()\" aria-label=\"Close\">\n    <span aria-hidden=\"true\">&times;</span>\n  </button>\n</div>\n<div class=\"modal-body\" [ngClass]=\"{'p-0': noPaddings}\">\n    <ng-content select=\".body\"></ng-content>\n</div>\n<div class=\"modal-footer\" *ngIf=\"!hideActions\">\n  <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"Fechar()\"><i class=\"fa fa-times\"></i> {{cancelButtonLabel}}</button>\n  <ng-content select=\".actions\"></ng-content>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ModalComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ui-modal', template: "<div class=\"modal-header\" *ngIf=\"modalTitle\">\n  <h5 class=\"modal-title\">{{modalTitle}}</h5>\n  <button type=\"button\" class=\"close\" (click)=\"Fechar()\" aria-label=\"Close\">\n    <span aria-hidden=\"true\">&times;</span>\n  </button>\n</div>\n<div class=\"modal-body\" [ngClass]=\"{'p-0': noPaddings}\">\n    <ng-content select=\".body\"></ng-content>\n</div>\n<div class=\"modal-footer\" *ngIf=\"!hideActions\">\n  <button type=\"button\" class=\"btn btn-outline-secondary\" (click)=\"Fechar()\"><i class=\"fa fa-times\"></i> {{cancelButtonLabel}}</button>\n  <ng-content select=\".actions\"></ng-content>\n</div>" }]
        }], ctorParameters: function () { return [{ type: i1.BsModalRef }]; }, propDecorators: { modalTitle: [{
                type: Input
            }], hideActions: [{
                type: Input
            }], noPaddings: [{
                type: Input
            }], cancelButtonLabel: [{
                type: Input
            }], onClose: [{
                type: Output
            }] } });

let identifier$m = 0;
class ReportComponent {
    constructor() {
        this.reportTitle = ' ';
        this.identifier = `ui-report-${identifier$m++}`;
    }
    Print() {
        $(`#${this.identifier}`).printThis({
            debug: false,
            importCSS: true,
            importStyle: true,
            printContainer: true,
            loadCSS: "",
            pageTitle: this.reportTitle,
            removeInline: false,
            removeInlineSelector: "*",
            printDelay: 333,
            header: '',
            footer: '',
            base: false,
            formValues: true,
            canvas: false,
            //doctypeString: '...',       // enter a different doctype for older markup
            removeScripts: false,
            copyTagClasses: false,
            beforePrintEvent: null,
            beforePrint: null,
            afterPrint: null // function called before iframe is removed
        });
    }
}
ReportComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ReportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
ReportComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ReportComponent, selector: "ui-report", inputs: { reportTitle: "reportTitle" }, ngImport: i0, template: "<div id=\"{{identifier}}\" class=\"report\">\n  <ng-content select=\".page-header\"></ng-content>\n  <ng-content select=\".report-body\"></ng-content>\n  <ng-content select=\".page-footer\"></ng-content>\n</div>\n", styles: [""] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ReportComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ui-report', template: "<div id=\"{{identifier}}\" class=\"report\">\n  <ng-content select=\".page-header\"></ng-content>\n  <ng-content select=\".report-body\"></ng-content>\n  <ng-content select=\".page-footer\"></ng-content>\n</div>\n" }]
        }], ctorParameters: function () { return []; }, propDecorators: { reportTitle: [{
                type: Input
            }] } });

class SpinnerComponent {
    constructor() {
        this.noMargins = false;
    }
    ngOnInit() { }
}
SpinnerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SpinnerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
SpinnerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: SpinnerComponent, selector: "spinner", inputs: { noMargins: "noMargins" }, ngImport: i0, template: "<div class=\"spinner\" [ngClass]=\"{'m-0': noMargins}\">\n    <div class=\"bounce1\"></div>\n    <div class=\"bounce2\"></div>\n    <div class=\"bounce3\"></div>\n</div>", styles: [".spinner{margin:0 auto;width:70px;text-align:center}.spinner>div{width:18px;height:18px;background-color:#d6dbe0;border-radius:100%;display:inline-block;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes sk-bouncedelay{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SpinnerComponent, decorators: [{
            type: Component,
            args: [{ selector: 'spinner', template: "<div class=\"spinner\" [ngClass]=\"{'m-0': noMargins}\">\n    <div class=\"bounce1\"></div>\n    <div class=\"bounce2\"></div>\n    <div class=\"bounce3\"></div>\n</div>", styles: [".spinner{margin:0 auto;width:70px;text-align:center}.spinner>div{width:18px;height:18px;background-color:#d6dbe0;border-radius:100%;display:inline-block;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.spinner .bounce1{animation-delay:-.32s}.spinner .bounce2{animation-delay:-.16s}@keyframes sk-bouncedelay{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}\n"] }]
        }], ctorParameters: function () { return []; }, propDecorators: { noMargins: [{
                type: Input
            }] } });

class AutoFocusDirective {
    constructor(el) {
        this.el = el;
    }
    ngOnInit() {
        this.el.nativeElement.focus();
    }
}
AutoFocusDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AutoFocusDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
AutoFocusDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: AutoFocusDirective, selector: "[auto-focus]", ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AutoFocusDirective, decorators: [{
            type: Directive,
            args: [{ selector: '[auto-focus]' }]
        }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });

class AutoSelectOnFocusDirective {
    constructor(elementRef, renderer) {
        this.elementRef = elementRef;
        this.renderer = renderer;
    }
    ngOnInit() {
        this.renderer.listen(this.elementRef.nativeElement, 'focus', (event) => {
            jQuery(this.elementRef.nativeElement).select();
        });
    }
}
AutoSelectOnFocusDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AutoSelectOnFocusDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
AutoSelectOnFocusDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: AutoSelectOnFocusDirective, selector: "input[autoSelectOnFocus]", ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AutoSelectOnFocusDirective, decorators: [{
            type: Directive,
            args: [{
                    // tslint:disable-next-line:directive-selector
                    selector: 'input[autoSelectOnFocus]'
                }]
        }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; } });

class ClickOutsideDirective {
    constructor(_el, _ngZone, platformId) {
        this._el = _el;
        this._ngZone = _ngZone;
        this.platformId = platformId;
        this.clickOutsideEnabled = true;
        this.attachOutsideOnClick = false;
        this.delayClickOutsideInit = true;
        this.emitOnBlur = false;
        this.exclude = '';
        this.excludeBeforeClick = false;
        this.clickOutsideEvents = '';
        this.clickOutside = new EventEmitter();
        this._nodesExcluded = [];
        this._events = ['click'];
        this._initOnClickBody = this._initOnClickBody.bind(this);
        this._onClickBody = this._onClickBody.bind(this);
        this._onWindowBlur = this._onWindowBlur.bind(this);
    }
    ngOnInit() {
        if (!isPlatformBrowser(this.platformId)) {
            return;
        }
        this._init();
    }
    ngOnDestroy() {
        if (!isPlatformBrowser(this.platformId)) {
            return;
        }
        this._removeClickOutsideListener();
        this._removeAttachOutsideOnClickListener();
        this._removeWindowBlurListener();
    }
    ngOnChanges(changes) {
        if (!isPlatformBrowser(this.platformId)) {
            return;
        }
        if (changes['attachOutsideOnClick'] || changes['exclude'] || changes['emitOnBlur']) {
            this._init();
        }
    }
    _init() {
        if (this.clickOutsideEvents !== '') {
            this._events = this.clickOutsideEvents.split(',').map(e => e.trim());
        }
        this._excludeCheck();
        if (this.attachOutsideOnClick) {
            this._initAttachOutsideOnClickListener();
        }
        else {
            this._initOnClickBody();
        }
        if (this.emitOnBlur) {
            this._initWindowBlurListener();
        }
    }
    _initOnClickBody() {
        if (this.delayClickOutsideInit) {
            setTimeout(this._initClickOutsideListener.bind(this));
        }
        else {
            this._initClickOutsideListener();
        }
    }
    _excludeCheck() {
        if (this.exclude) {
            try {
                const nodes = Array.from(document.querySelectorAll(this.exclude));
                if (nodes) {
                    this._nodesExcluded = nodes;
                }
            }
            catch (err) {
                console.error('[ng-click-outside] Check your exclude selector syntax.', err);
            }
        }
    }
    _onClickBody(ev) {
        if (!this.clickOutsideEnabled) {
            return;
        }
        if (this.excludeBeforeClick) {
            this._excludeCheck();
        }
        if (!this._el.nativeElement.contains(ev.target) && !this._shouldExclude(ev.target)) {
            this._emit(ev);
            if (this.attachOutsideOnClick) {
                this._removeClickOutsideListener();
            }
        }
    }
    _onWindowBlur(ev) {
        setTimeout(() => {
            if (!document.hidden) {
                this._emit(ev);
            }
        });
    }
    _emit(ev) {
        if (!this.clickOutsideEnabled) {
            return;
        }
        this._ngZone.run(() => this.clickOutside.emit(ev));
    }
    _shouldExclude(target) {
        for (let excludedNode of this._nodesExcluded) {
            if (excludedNode.contains(target)) {
                return true;
            }
        }
        return false;
    }
    _initClickOutsideListener() {
        this._ngZone.runOutsideAngular(() => {
            this._events.forEach(e => document.body.addEventListener(e, this._onClickBody));
        });
    }
    _removeClickOutsideListener() {
        this._ngZone.runOutsideAngular(() => {
            this._events.forEach(e => document.body.removeEventListener(e, this._onClickBody));
        });
    }
    _initAttachOutsideOnClickListener() {
        this._ngZone.runOutsideAngular(() => {
            this._events.forEach(e => this._el.nativeElement.addEventListener(e, this._initOnClickBody));
        });
    }
    _removeAttachOutsideOnClickListener() {
        this._ngZone.runOutsideAngular(() => {
            this._events.forEach(e => this._el.nativeElement.removeEventListener(e, this._initOnClickBody));
        });
    }
    _initWindowBlurListener() {
        this._ngZone.runOutsideAngular(() => {
            window.addEventListener('blur', this._onWindowBlur);
        });
    }
    _removeWindowBlurListener() {
        this._ngZone.runOutsideAngular(() => {
            window.removeEventListener('blur', this._onWindowBlur);
        });
    }
}
ClickOutsideDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClickOutsideDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Directive });
ClickOutsideDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: { clickOutsideEnabled: "clickOutsideEnabled", attachOutsideOnClick: "attachOutsideOnClick", delayClickOutsideInit: "delayClickOutsideInit", emitOnBlur: "emitOnBlur", exclude: "exclude", excludeBeforeClick: "excludeBeforeClick", clickOutsideEvents: "clickOutsideEvents" }, outputs: { clickOutside: "clickOutside" }, usesOnChanges: true, ngImport: i0 });
ClickOutsideDirective.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClickOutsideDirective });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ClickOutsideDirective, decorators: [{
            type: Injectable
        }, {
            type: Directive,
            args: [{ selector: '[clickOutside]' }]
        }], ctorParameters: function () {
        return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: Object, decorators: [{
                        type: Inject,
                        args: [PLATFORM_ID]
                    }] }];
    }, propDecorators: { clickOutsideEnabled: [{
                type: Input
            }], attachOutsideOnClick: [{
                type: Input
            }], delayClickOutsideInit: [{
                type: Input
            }], emitOnBlur: [{
                type: Input
            }], exclude: [{
                type: Input
            }], excludeBeforeClick: [{
                type: Input
            }], clickOutsideEvents: [{
                type: Input
            }], clickOutside: [{
                type: Output
            }] } });

class DebounceDirective {
    constructor(elementRef) {
        this.elementRef = elementRef;
        this.delay = 500;
        this.callback = new EventEmitter();
        this.arrowsCallback = new EventEmitter();
        this._arrowKeyCodes = [13, 27, 37, 38, 39, 40];
    }
    ngOnInit() {
        const event1 = fromEvent(this.elementRef.nativeElement, 'keyup')
            .pipe(debounceTime(this.delay))
            .subscribe((input) => {
            if (this._arrowKeyCodes.indexOf(input.keyCode) < 0) {
                this.callback.emit(input);
            }
        });
        const event2 = fromEvent(this.elementRef.nativeElement, 'keyup')
            .subscribe((input) => {
            if (this._arrowKeyCodes.indexOf(input.keyCode) >= 0) {
                this.arrowsCallback.emit(input);
            }
        });
    }
}
DebounceDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DebounceDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
DebounceDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: DebounceDirective, selector: "[debounce]", inputs: { delay: "delay" }, outputs: { callback: "callback", arrowsCallback: "arrowsCallback" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DebounceDirective, decorators: [{
            type: Directive,
            args: [{
                    selector: '[debounce]'
                }]
        }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { delay: [{
                type: Input
            }], callback: [{
                type: Output
            }], arrowsCallback: [{
                type: Output
            }] } });

class TutorialService {
    constructor(rendererFactory, router) {
        this.rendererFactory = rendererFactory;
        this.router = router;
        this.onStepChanged = new EventEmitter();
        this.onStart = new EventEmitter();
        this.onExit = new EventEmitter();
        this._currentTaskIndex = -1;
        this.OVERLAY_ID = 'tutorial-orverlay';
        this.BLOCKER_ID = 'element-blocker';
        this.BLOCK_ID = 'element-tutorial-block';
        this.BLOCK_ARROW_ID = 'element-tutorial-block-arrow';
        this.BLOCK_TITLE_ID = 'element-tutorial-block-title';
        this.BLOCK_BODY_ID = 'element-tutorial-block-body';
        this.BLOCK_CONTROLS_ID = 'element-tutorial-block-controls';
        this.BLOCK_CONTROL_PREV_ID = 'element-tutorial-block-prev-control';
        this.BLOCK_CONTROL_NEXT_ID = 'element-tutorial-block-next-control';
        this.BLOCK_CONTROL_INFO_ID = 'element-tutorial-block-info-control';
        this.BLOCK_CONTROL_EXIT_ID = 'element-tutorial-block-exit-control';
        this._render = rendererFactory.createRenderer(null, null);
        this.router.events.subscribe((event) => {
            if (event instanceof NavigationStart) {
                this.resetTasks();
            }
        });
    }
    addAction(action, element) {
        let index = -1;
        if (!this._tasks) {
            this._tasks = new Array();
        }
        else {
            for (let i = 0; i < this._tasks.length; i++) {
                if (this._tasks[i].element.nativeElement.tagName == element.nativeElement.tagName
                    && this._tasks[i].action.title == action.title
                    && this._tasks[i].action.text == action.text) {
                    index = i;
                    break;
                }
            }
        }
        let task = {
            action: action,
            element: element
        };
        if (index >= 0) {
            this._tasks[index] = task;
        }
        else {
            this._tasks.push(task);
        }
    }
    playAll() {
        if (this._currentTaskIndex >= 0)
            return;
        setTimeout(() => {
            let tasks = this._tasks.filter(x => x.element && x.element.nativeElement && x.element.nativeElement.isConnected);
            if (!tasks || tasks.length == 0)
                return;
            tasks = orderBy(tasks, ['action.order'], ['asc']);
            this.play(tasks);
        });
    }
    playByKey(key, onlyOnce) {
        if (this._currentTaskIndex >= 0)
            return;
        setTimeout(() => {
            if (onlyOnce && this.getLocalStorage(key))
                return;
            let tasks = this._tasks.filter(x => x.element && x.element.nativeElement && x.element.nativeElement.isConnected && x.action.key == key);
            if (!tasks || tasks.length == 0)
                return;
            tasks = orderBy(tasks, ['action.order'], ['asc']);
            this.play(tasks);
            if (onlyOnce) {
                this.setLocalStorage(key, key);
            }
        });
    }
    moveNext() {
        if (this._currentTaskIndex >= this._runningTasks.length - 1) {
            this.exit();
            return;
        }
        this.destroyCurrentTask();
        this._currentTaskIndex += 1;
        this.renderCurrentTask();
        this.notifyStepHasChanged();
    }
    movePrev() {
        if (this._currentTaskIndex == 0)
            return;
        this.destroyCurrentTask();
        this._currentTaskIndex -= 1;
        this.renderCurrentTask();
        this.notifyStepHasChanged();
    }
    exit() {
        this.destroyCurrentTask();
        this.destroyOverlay();
        this.stopListeningKeyboardArrows();
        this._currentTaskIndex = -1;
        this._runningTasks = null;
        this.onExit.emit();
    }
    resetTasks() {
        this._tasks = new Array();
    }
    play(tasks) {
        this.onStart.emit();
        this._currentTaskIndex = 0;
        this._runningTasks = tasks;
        this.renderOverlay();
        this.renderCurrentTask();
        this.notifyStepHasChanged();
        this.startListeningKeyboardArrows();
    }
    //rendering
    renderCurrentTask() {
        if (this._currentTaskIndex < 0)
            return;
        let task = this._runningTasks[this._currentTaskIndex];
        this.renderElement(task);
        this.scrollToCurrentElementBlock();
    }
    renderElement(task) {
        this._render.setStyle(task.element.nativeElement, 'position', 'relative');
        this._render.setStyle(task.element.nativeElement, 'zIndex', '9001');
        this.renderElementBlocker(task.element);
        this.renderElementColorWhiteIfText(task.element);
        this.renderElementTutorialBlock(task);
    }
    renderElementBlocker(el) {
        let blocker = this.createElementBlocker();
        this._render.insertBefore(el.nativeElement.parentNode, blocker, el.nativeElement);
    }
    renderElementTutorialBlock(task) {
        let block = this.createTutorialBlockElement(task);
        this.handleTutorialBlockPosition(block, task.element);
        this._render.insertBefore(task.element.nativeElement.parentNode, block, task.element.nativeElement);
    }
    renderElementColorWhiteIfText(el) {
        if (this.isCurrentElementText()) {
            this.colorPlaceholder = getComputedStyle(el.nativeElement, null).getPropertyValue('color');
            this._render.setStyle(el.nativeElement, 'color', '#FFF');
        }
    }
    renderOverlay() {
        let overlay = this.createOverLay();
        this._render.appendChild(document.body, overlay);
    }
    //element creations
    createOverLay() {
        let overlay = this._render.createElement('div');
        this._render.setAttribute(overlay, 'id', this.OVERLAY_ID);
        this._render.setStyle(overlay, 'position', 'fixed');
        this._render.setStyle(overlay, 'width', '100%');
        this._render.setStyle(overlay, 'height', '100%');
        this._render.setStyle(overlay, 'backgroundColor', 'rgba(41, 41, 41, 0.89)');
        this._render.setStyle(overlay, 'top', '0');
        this._render.setStyle(overlay, 'zIndex', '9000');
        this._render.setStyle(document.body, 'overflow', 'hidden');
        return overlay;
    }
    createElementBlocker() {
        let blocker = this._render.createElement('div');
        this._render.setAttribute(blocker, 'id', this.BLOCKER_ID);
        this._render.setStyle(blocker, 'background-color', '#00000024');
        this._render.setStyle(blocker, 'position', 'fixed');
        this._render.setStyle(blocker, 'top', '0');
        this._render.setStyle(blocker, 'left', '0');
        this._render.setStyle(blocker, 'bottom', '0');
        this._render.setStyle(blocker, 'right', '0');
        this._render.setStyle(blocker, 'zIndex', '9002');
        return blocker;
    }
    createTutorialBlockElement(task) {
        let block = this._render.createElement('div');
        this._render.setAttribute(block, 'id', this.BLOCK_ID);
        this._render.setStyle(block, 'position', 'fixed');
        this._render.setStyle(block, 'zIndex', '9003');
        this._render.setStyle(block, 'border', '3px solid #FFF');
        this._render.setStyle(block, 'borderRadius', '5px');
        this._render.setStyle(block, 'minWidth', '200px');
        this._render.setStyle(block, 'maxWidth', '350px');
        this._render.setStyle(block, 'transition', 'opacity .3s ease-in-out');
        this.hideTutorialBlockElement(block);
        this._render.appendChild(block, this.createTutorialBlockArrow());
        if (task.action.title) {
            this._render.appendChild(block, this.createTutorialBlockTitleElement(task.action.title));
        }
        this._render.appendChild(block, this.createTutorialBlockBodyElement(task.action.text));
        this._render.appendChild(block, this.createTutorialBlockControls());
        return block;
    }
    createTutorialBlockArrow() {
        let arrow = this._render.createElement('div');
        this._render.setAttribute(arrow, 'id', this.BLOCK_ARROW_ID);
        this._render.setStyle(arrow, 'position', 'absolute');
        this._render.setStyle(arrow, 'zIndex', '9003');
        this._render.setStyle(arrow, 'width', '0');
        this._render.setStyle(arrow, 'height', '0');
        this._render.setStyle(arrow, 'border-top', '12px solid transparent');
        this._render.setStyle(arrow, 'border-bottom', '12px solid transparent');
        return arrow;
    }
    createTutorialBlockTitleElement(title) {
        let blockTitle = this._render.createElement('div');
        let blockTitleText = this._render.createText(title);
        let btnExit = this.createTutorialBlockExitControl();
        this._render.setAttribute(blockTitle, 'id', this.BLOCK_TITLE_ID);
        this._render.setStyle(blockTitle, 'display', 'flex');
        this._render.setStyle(blockTitle, 'align-items', 'center');
        this._render.setStyle(blockTitle, 'backgroundColor', '#EEEEEE');
        this._render.setStyle(blockTitle, 'color', 'rgb(84, 84, 84)');
        this._render.setStyle(blockTitle, 'padding', '10px 12px');
        this._render.setStyle(blockTitle, 'borderRadius', '5px 5px 0px 0px');
        this._render.setStyle(blockTitle, 'borderBottom', '1px solid rgb(214, 214, 214)');
        this._render.setStyle(blockTitle, 'font-size', '16px');
        this._render.setStyle(blockTitle, 'font-weight', '600');
        this._render.setStyle(blockTitle, 'text-transform', 'uppercase');
        this._render.setStyle(blockTitle, 'margin', '-2px -2px 0px -2px');
        if (blockTitleText) {
            this._render.setStyle(blockTitle, 'fontSize', '16px');
            this._render.setStyle(blockTitle, 'fontWeight', '600');
            this._render.appendChild(blockTitle, blockTitleText);
        }
        this._render.appendChild(blockTitle, btnExit);
        return blockTitle;
    }
    createTutorialBlockBodyElement(text) {
        let blockBody = this._render.createElement('div');
        let blockBodyText = this._render.createText(text);
        this._render.setAttribute(blockBody, 'id', this.BLOCK_BODY_ID);
        this._render.setStyle(blockBody, 'backgroundColor', '#FFF');
        this._render.setStyle(blockBody, 'padding', '10px 10px 20px 10px');
        if (blockBodyText) {
            this._render.setStyle(blockBody, 'fontSize', '14px');
            this._render.setStyle(blockBody, 'fontWeight', 'normal');
            this._render.appendChild(blockBody, blockBodyText);
        }
        return blockBody;
    }
    createTutorialBlockControls() {
        let controls = this._render.createElement('div');
        this._render.setAttribute(controls, 'id', this.BLOCK_CONTROLS_ID);
        this._render.setStyle(controls, 'backgroundColor', '#FFF');
        this._render.setStyle(controls, 'padding', '10px 12px');
        this._render.setStyle(controls, 'borderRadius', '0px 0px 5px 5px');
        this._render.setStyle(controls, 'margin', '0 -2px -2px -2px');
        this._render.setStyle(controls, 'display', 'flex');
        this._render.setStyle(controls, 'align-items', 'center');
        this._render.setStyle(controls, 'justify-content', 'flex-end');
        this._render.appendChild(controls, this.createTutorialBlockInfoControl());
        this._render.appendChild(controls, this.createTutorialBlockPrevControl());
        this._render.appendChild(controls, this.createTutorialBlockNextControl());
        return controls;
    }
    createTutorialBlockPrevControl() {
        let button = this._render.createElement('button');
        let icone = this._render.createElement('i');
        this._render.setAttribute(button, 'id', this.BLOCK_CONTROL_PREV_ID);
        this._render.addClass(button, 'btn');
        this._render.addClass(button, 'btn-sm');
        this._render.addClass(button, 'btn-primary');
        this._render.addClass(button, 'mr-1');
        this._render.addClass(icone, 'fa');
        this._render.addClass(icone, 'fa-arrow-left');
        this._render.appendChild(button, icone);
        if (this._currentTaskIndex == 0) {
            this._render.setAttribute(button, 'disabled', 'disabled');
        }
        else {
            this._render.listen(button, 'click', () => {
                this.movePrev();
            });
        }
        return button;
    }
    createTutorialBlockNextControl() {
        let button = this._render.createElement('button');
        let icone = this._render.createElement('i');
        this._render.setAttribute(button, 'id', this.BLOCK_CONTROL_NEXT_ID);
        this._render.addClass(button, 'btn');
        this._render.addClass(button, 'btn-sm');
        this._render.addClass(button, 'mr-1');
        this._render.addClass(icone, 'fa');
        this._render.appendChild(button, icone);
        if (this._currentTaskIndex >= this._runningTasks.length - 1) {
            this._render.addClass(icone, 'fa-times');
            this._render.addClass(button, 'btn-outline-primary');
        }
        else {
            this._render.addClass(icone, 'fa-arrow-right');
            this._render.addClass(button, 'btn-primary');
        }
        this._render.listen(button, 'click', () => {
            this.moveNext();
        });
        return button;
    }
    createTutorialBlockExitControl() {
        let icone = this._render.createElement('i');
        this._render.setAttribute(icone, 'id', this.BLOCK_CONTROL_EXIT_ID);
        this._render.addClass(icone, 'ml-auto');
        this._render.addClass(icone, 'fa');
        this._render.addClass(icone, 'fa-times');
        this._render.setStyle(icone, 'cursor', 'pointer');
        this._render.listen(icone, 'click', () => {
            this.exit();
        });
        return icone;
    }
    createTutorialBlockInfoControl() {
        let span = this._render.createElement('small');
        this._render.setAttribute(span, 'id', this.BLOCK_CONTROL_INFO_ID);
        this._render.addClass(span, 'mr-auto');
        this._render.setStyle(span, 'fontSize', '12px');
        this._render.setStyle(span, 'fontWeight', 'normal');
        this._render.appendChild(span, this._render.createText(`${this._currentTaskIndex + 1}/${this._runningTasks.length}`));
        return span;
    }
    //element destroy
    destroyCurrentTask() {
        this.destroyElementById(this.BLOCKER_ID);
        this.destroyElementById(this.BLOCK_ID);
        let currentElement = this._runningTasks[this._currentTaskIndex].element;
        if (this.isCurrentElementText() && this.colorPlaceholder) {
            this._render.setStyle(currentElement.nativeElement, 'color', this.colorPlaceholder);
            this.colorPlaceholder = null;
        }
        this._render.removeStyle(currentElement.nativeElement, 'position');
        this._render.removeStyle(currentElement.nativeElement, 'zIndex');
    }
    destroyOverlay() {
        this.destroyElementById(this.OVERLAY_ID);
        this._render.removeStyle(document.body, 'overflow');
    }
    destroyElementById(id) {
        let el = document.getElementById(id);
        this._render.removeChild(el.parentNode, el);
    }
    //aux
    handleTutorialBlockPosition(block, el) {
        setTimeout(() => {
            this.setTutorialBlockPosition(block, el);
        }, 0);
        this._render.listen(window, 'resize', () => {
            this.setTutorialBlockPosition(block, el);
        });
    }
    setTutorialBlockPosition(block, el) {
        let arrow = document.getElementById(this.BLOCK_ARROW_ID);
        let elementRect = el.nativeElement.getBoundingClientRect();
        let top = elementRect.top;
        let left = elementRect.left + elementRect.width + 20;
        let blockHeight = $(block).height();
        let blockWidth = $(block).width();
        let isCurrentBlockOnBottomOfScreen = this.isCurrentBlockOnBottomOfScreen();
        let isCurrentBlockOnRightOfScreen = this.isCurrentBlockOnRightOfScreen();
        let arrowBorder = isCurrentBlockOnRightOfScreen ? 'border-left' : 'border-right';
        let arrowPositionX = isCurrentBlockOnRightOfScreen ? 'right' : 'left';
        let arrowPositionY = isCurrentBlockOnBottomOfScreen ? 'bottom' : 'top';
        let arrowColor = isCurrentBlockOnBottomOfScreen ? '#FFF' : '#EEE';
        if (isCurrentBlockOnBottomOfScreen) {
            top -= blockHeight - 32;
        }
        if (isCurrentBlockOnRightOfScreen) {
            left -= blockWidth + elementRect.width + 45;
        }
        if ((left + blockWidth) >= document.body.clientWidth) {
            left -= blockWidth + 45;
        }
        if (arrow) {
            this._render.setStyle(arrow, arrowBorder, `15px solid ${arrowColor}`);
            this._render.setStyle(arrow, arrowPositionX, `-17px`);
            this._render.setStyle(arrow, arrowPositionY, `8px`);
        }
        this._render.setStyle(block, 'top', this.getNumberInPx(top));
        this._render.setStyle(block, 'left', this.getNumberInPx(left));
    }
    getNumberInPx(value) {
        return value + 'px';
    }
    scrollToCurrentElementBlock() {
        setTimeout(() => {
            let block = document.getElementById(this.BLOCK_ID);
            let el = this._runningTasks[this._currentTaskIndex].element;
            let offsetTopFromBody = $(el.nativeElement).offset().top;
            let elementY = offsetTopFromBody - 150;
            $('html').animate({
                scrollTop: elementY,
                duration: 0
            }, () => {
                this.setTutorialBlockPosition(block, el);
                this.fadeInTutorialBlockElement(block);
            });
        });
    }
    hideTutorialBlockElement(block) {
        this._render.setStyle(block, 'opacity', '0');
    }
    fadeInTutorialBlockElement(block) {
        this._render.setStyle(block, 'opacity', '1');
    }
    isCurrentBlockOnBottomOfScreen() {
        if (this._currentTaskIndex < 0)
            return false;
        let el = this._runningTasks[this._currentTaskIndex].element;
        let elementRect = el.nativeElement.getBoundingClientRect();
        let top = elementRect.top;
        let offsetTopFromBody = $(el.nativeElement).offset().top;
        return top > document.body.scrollHeight - offsetTopFromBody;
    }
    isCurrentBlockOnRightOfScreen() {
        if (this._currentTaskIndex < 0)
            return false;
        let el = this._runningTasks[this._currentTaskIndex].element;
        let offsetLeftFromBody = $(el.nativeElement).offset().left;
        return offsetLeftFromBody >= document.body.clientWidth / 2;
    }
    isCurrentElementText() {
        if (this._currentTaskIndex < 0)
            return false;
        const allowedTags = ['h1', 'h2', 'h3', 'h4', 'h5', 'span', 'small', 'p'];
        let el = this._runningTasks[this._currentTaskIndex].element;
        return allowedTags.filter(x => x.toUpperCase() == el.nativeElement.tagName).length == 1;
    }
    notifyStepHasChanged() {
        this.onStepChanged.emit(this._runningTasks[this._currentTaskIndex]);
    }
    startListeningKeyboardArrows() {
        this.unlistenKeyboardArrows = this._render.listen(document.body, 'keyup', (event) => {
            switch (event.keyCode) {
                case 27:
                    this.exit();
                    break;
                case 37:
                    this.movePrev();
                    break;
                case 13:
                case 39:
                    this.moveNext();
                    break;
            }
            event.stopImmediatePropagation();
        });
    }
    stopListeningKeyboardArrows() {
        this.unlistenKeyboardArrows();
    }
    //localstorage
    getLocalStorage(key) {
        const result = localStorage.getItem(`Ui-Hero-Turorial-${key}`);
        if (typeof result === 'string') {
            return result;
        }
        else {
            return JSON.parse(result);
        }
    }
    setLocalStorage(key, value) {
        if (typeof value === 'string') {
            localStorage.setItem(`Ui-Hero-Turorial-${key}`, value);
        }
        else {
            localStorage.setItem(`Ui-Hero-Turorial-${key}`, JSON.stringify(value));
        }
    }
}
TutorialService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TutorialService, deps: [{ token: i0.RendererFactory2 }, { token: i1$2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
TutorialService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TutorialService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TutorialService, decorators: [{
            type: Injectable
        }], ctorParameters: function () { return [{ type: i0.RendererFactory2 }, { type: i1$2.Router }]; } });

class TutorialDirective {
    constructor(tutorialService, el) {
        this.tutorialService = tutorialService;
        this.el = el;
    }
    ngOnInit() {
        this.tutorialService.addAction(this.tutorial, this.el);
    }
}
TutorialDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TutorialDirective, deps: [{ token: TutorialService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
TutorialDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: TutorialDirective, selector: "[tutorial]", inputs: { tutorial: "tutorial" }, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TutorialDirective, decorators: [{
            type: Directive,
            args: [{ selector: '[tutorial]' }]
        }], ctorParameters: function () { return [{ type: TutorialService }, { type: i0.ElementRef }]; }, propDecorators: { tutorial: [{
                type: Input
            }] } });

class SearchByPipe {
    transform(items, property, searchText) {
        if (!items)
            return [];
        if (!searchText)
            return items;
        searchText = searchText.toLowerCase();
        return items.filter(it => {
            return it[property].toLowerCase().includes(searchText);
        });
    }
}
SearchByPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SearchByPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
SearchByPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: SearchByPipe, name: "searchBy" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: SearchByPipe, decorators: [{
            type: Pipe,
            args: [{
                    name: 'searchBy'
                }]
        }] });

class AlertService {
    constructor() { }
    show(title, text, type, confirmButtonText, callback) {
        Swal.fire({
            title: title,
            html: text,
            icon: type,
            confirmButtonText: confirmButtonText || "Ok",
        }).then((result) => {
            if (result.value && callback) {
                callback();
            }
        });
    }
    info(title, text, confirmButtonText, callback) {
        this.show(title, text, "info", confirmButtonText, callback);
    }
    success(title, text, confirmButtonText, callback) {
        this.show(title, text, "success", confirmButtonText, callback);
    }
    error(title, text, confirmButtonText, callback) {
        this.show(title, text, "error", confirmButtonText, callback);
    }
    warning(title, text, confirmButtonText, callback) {
        this.show(title, text, "warning", confirmButtonText, callback);
    }
    question(title, text, successCallback, confirmButtonText, cancelButtonText, cancelCallback) {
        Swal.fire({
            title: title,
            text: text,
            icon: "question",
            confirmButtonText: confirmButtonText || "Ok",
            cancelButtonText: cancelButtonText || "Cancel",
            showCancelButton: true,
        }).then((result) => {
            if (result.value && successCallback) {
                successCallback();
            }
            else if (!result.value && cancelCallback) {
                cancelCallback();
            }
        });
    }
}
AlertService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AlertService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
AlertService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AlertService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AlertService, decorators: [{
            type: Injectable
        }], ctorParameters: function () { return []; } });

class TutorialAction {
}

class UiModule {
}
UiModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
UiModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: UiModule, declarations: [AutoSelectOnFocusDirective,
        DebounceDirective,
        ClickOutsideDirective,
        AutoFocusDirective,
        TutorialDirective,
        SearchByPipe,
        SpinnerComponent,
        ModalComponent,
        ReportComponent], imports: [CommonModule, i1$3.PaginationModule, i7.BsDropdownModule, i1.ModalModule, i1$4.BsDatepickerModule, i5.ProgressbarModule, i4.TooltipModule, i7$1.PopoverModule, i8.TabsModule], exports: [AutoSelectOnFocusDirective,
        DebounceDirective,
        ClickOutsideDirective,
        AutoFocusDirective,
        TutorialDirective,
        SearchByPipe,
        SpinnerComponent,
        ModalComponent,
        ReportComponent,
        PaginationModule,
        BsDropdownModule,
        ModalModule,
        BsDatepickerModule,
        ProgressbarModule,
        TooltipModule,
        PopoverModule,
        TabsModule] });
UiModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiModule, providers: [
        AlertService,
        TutorialService
    ], imports: [CommonModule,
        PaginationModule.forRoot(),
        BsDropdownModule.forRoot(),
        ModalModule.forRoot(),
        BsDatepickerModule.forRoot(),
        ProgressbarModule.forRoot(),
        TooltipModule.forRoot(),
        PopoverModule.forRoot(),
        TabsModule.forRoot(), PaginationModule,
        BsDropdownModule,
        ModalModule,
        BsDatepickerModule,
        ProgressbarModule,
        TooltipModule,
        PopoverModule,
        TabsModule] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [
                        CommonModule,
                        PaginationModule.forRoot(),
                        BsDropdownModule.forRoot(),
                        ModalModule.forRoot(),
                        BsDatepickerModule.forRoot(),
                        ProgressbarModule.forRoot(),
                        TooltipModule.forRoot(),
                        PopoverModule.forRoot(),
                        TabsModule.forRoot(),
                    ],
                    declarations: [
                        AutoSelectOnFocusDirective,
                        DebounceDirective,
                        ClickOutsideDirective,
                        AutoFocusDirective,
                        TutorialDirective,
                        SearchByPipe,
                        SpinnerComponent,
                        ModalComponent,
                        ReportComponent,
                    ],
                    exports: [
                        AutoSelectOnFocusDirective,
                        DebounceDirective,
                        ClickOutsideDirective,
                        AutoFocusDirective,
                        TutorialDirective,
                        SearchByPipe,
                        SpinnerComponent,
                        ModalComponent,
                        ReportComponent,
                        PaginationModule,
                        BsDropdownModule,
                        ModalModule,
                        BsDatepickerModule,
                        ProgressbarModule,
                        TooltipModule,
                        PopoverModule,
                        TabsModule
                    ],
                    entryComponents: [
                        ModalComponent
                    ],
                    providers: [
                        AlertService,
                        TutorialService
                    ],
                }]
        }] });

class NgxUiHeroModule {
}
NgxUiHeroModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
NgxUiHeroModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroModule, imports: [UiModule], exports: [UiModule] });
NgxUiHeroModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroModule, imports: [UiModule, UiModule] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [UiModule],
                    declarations: [],
                    exports: [UiModule]
                }]
        }] });

let API_SETTINGS = new InjectionToken('apiSettings');

class LocalStorageService {
    constructor(settings) {
        this.settings = settings;
        this._prefix = 'uiHero_';
        if (this.settings.localStoragePrefix) {
            this._prefix = this.settings.localStoragePrefix;
        }
    }
    Get(key) {
        const result = localStorage.getItem(`${this._prefix}${key}`);
        if (typeof result === 'string') {
            return result;
        }
        else {
            return JSON.parse(result);
        }
    }
    Set(key, value) {
        if (typeof value === 'string') {
            localStorage.setItem(`${this._prefix}${key}`, value);
        }
        else {
            localStorage.setItem(`${this._prefix}${key}`, JSON.stringify(value));
        }
    }
    Remove(key) {
        localStorage.removeItem(`${this._prefix}${key}`);
    }
}
LocalStorageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocalStorageService, deps: [{ token: API_SETTINGS }], target: i0.ɵɵFactoryTarget.Injectable });
LocalStorageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocalStorageService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LocalStorageService, decorators: [{
            type: Injectable
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [API_SETTINGS]
                    }] }];
    } });

class BaseApiUrlInterceptor {
    constructor(settings) {
        this.settings = settings;
        this._baseApiUrl = this.settings.apiBaseUrl;
        this._apiAlias = this.settings.apiAlias;
    }
    intercept(req, next) {
        if (!this._baseApiUrl || this._baseApiUrl.length == 0 || req.url.indexOf('http') >= 0)
            return next.handle(req);
        let urlBase = this.concatUrl(this._baseApiUrl, this._apiAlias);
        const modified = req.clone({
            url: this.concatUrl(urlBase, req.url),
        });
        return next.handle(modified);
    }
    concatUrl(path1, path2) {
        let separator = !this.isNullOrEmpty(path1) && !this.isNullOrEmpty(path2) && !path1.endsWith('/') && !path2.startsWith('/')
            ? '/'
            : '';
        return `${path1}${separator}${path2}`;
    }
    isNullOrEmpty(value) {
        return value == undefined || value == null || value == '';
    }
}
BaseApiUrlInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseApiUrlInterceptor, deps: [{ token: API_SETTINGS }], target: i0.ɵɵFactoryTarget.Injectable });
BaseApiUrlInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseApiUrlInterceptor });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BaseApiUrlInterceptor, decorators: [{
            type: Injectable
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [API_SETTINGS]
                    }] }];
    } });

class CommonHeadersInterceptor {
    intercept(req, next) {
        const modified = req.clone({
            setHeaders: {
                'Content-Type': req.headers.has('Content-Type')
                    ? req.headers.get('Content-Type')
                    : 'application/json; charset=utf-8',
                'Cache-Control': 'no-cache',
                'Pragma': 'no-cache',
                'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT',
            }
        });
        return next.handle(modified);
    }
}
CommonHeadersInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonHeadersInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
CommonHeadersInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonHeadersInterceptor });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CommonHeadersInterceptor, decorators: [{
            type: Injectable
        }] });

class JwtAuthInterceptor {
    constructor(settings, localStorageService) {
        this.settings = settings;
        this.localStorageService = localStorageService;
        this._jwtSuffix = 'access_token';
        if (this.settings.jwtLocalStorageSuffix) {
            this._jwtSuffix = this.settings.jwtLocalStorageSuffix;
        }
    }
    intercept(req, next) {
        let jwtToken = this.localStorageService.Get(this._jwtSuffix);
        if (!jwtToken || jwtToken.length == 0)
            return next.handle(req);
        const modified = req.clone({
            setHeaders: {
                'Authorization': `Bearer ${jwtToken}`,
            }
        });
        return next.handle(modified);
    }
}
JwtAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: JwtAuthInterceptor, deps: [{ token: API_SETTINGS }, { token: LocalStorageService }], target: i0.ɵɵFactoryTarget.Injectable });
JwtAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: JwtAuthInterceptor });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: JwtAuthInterceptor, decorators: [{
            type: Injectable
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [API_SETTINGS]
                    }] }, { type: LocalStorageService }];
    } });

class ErrorHandlerInterceptor {
    intercept(req, next) {
        return next.handle(req)
            .pipe(catchError((error) => {
            return throwError({
                unauthorized: error.status == 401 || error.status == 403,
                code: error.status,
                message: error.message,
                data: error.error
            });
        }));
    }
}
ErrorHandlerInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorHandlerInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
ErrorHandlerInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorHandlerInterceptor });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ErrorHandlerInterceptor, decorators: [{
            type: Injectable
        }] });

class ResponseDataInterceptor {
    constructor(settings) {
        this.settings = settings;
        this._responseDataPropertyName = settings.responseDataPropertyName;
    }
    intercept(req, next) {
        return next.handle(req)
            .pipe(map((event) => {
            if (event instanceof HttpResponse) {
                event = event.clone({
                    body: (this._responseDataPropertyName && this._responseDataPropertyName.length > 0)
                        ? event.body[this._responseDataPropertyName]
                        : event.body
                });
            }
            return event;
        }));
    }
}
ResponseDataInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ResponseDataInterceptor, deps: [{ token: API_SETTINGS }], target: i0.ɵɵFactoryTarget.Injectable });
ResponseDataInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ResponseDataInterceptor });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ResponseDataInterceptor, decorators: [{
            type: Injectable
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [API_SETTINGS]
                    }] }];
    } });

class WinAuthInterceptor {
    intercept(req, next) {
        const modified = req.clone({
            withCredentials: true
        });
        return next.handle(modified);
    }
}
WinAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WinAuthInterceptor, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
WinAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WinAuthInterceptor });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: WinAuthInterceptor, decorators: [{
            type: Injectable
        }] });

class NgxUiHeroApiModule {
    static forRoot(settings) {
        return {
            ngModule: NgxUiHeroApiModule,
            providers: [
                LocalStorageService,
                {
                    provide: API_SETTINGS,
                    useValue: settings
                }
            ]
        };
    }
}
NgxUiHeroApiModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroApiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
NgxUiHeroApiModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroApiModule, imports: [CommonModule,
        HttpClientModule] });
NgxUiHeroApiModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroApiModule, imports: [CommonModule,
        HttpClientModule] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroApiModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [
                        CommonModule,
                        HttpClientModule
                    ],
                    declarations: [],
                }]
        }] });

class ColumnFilterModel {
    constructor(filter, column, operator) {
        this.filter = filter;
        this.column = column;
        this.operator = operator;
    }
    ;
}
class ContainsOperator {
    constructor() {
        this.symbol = '...';
    }
    validate(filter, value) {
        return value != undefined
            && value != null
            && value.toUpperCase().indexOf(filter.toUpperCase()) >= 0;
    }
}
class EqualsOperator {
    constructor() {
        this.symbol = '=';
    }
    validate(filter, value) {
        return filter == value;
    }
}
class DifferentOperator {
    constructor() {
        this.symbol = '!=';
    }
    validate(filter, value) {
        return filter != value;
    }
}
class GreaterThanOperator {
    constructor() {
        this.symbol = '>';
    }
    validate(filter, value) {
        return filter > value;
    }
}
class GreaterThanOrEqualsToOperator {
    constructor() {
        this.symbol = '>=';
    }
    validate(filter, value) {
        return filter >= value;
    }
}
class LessThanOperator {
    constructor() {
        this.symbol = '<';
    }
    validate(filter, value) {
        return filter < value;
    }
}
class LessThanOrEqualsToOperator {
    constructor() {
        this.symbol = '<=';
    }
    validate(filter, value) {
        return filter <= value;
    }
}
class IsTrueOperator {
    constructor() {
        this.symbol = '';
    }
    validate(filter, value) {
        return value;
    }
}
class IsFalseOperator {
    constructor() {
        this.symbol = '';
    }
    validate(filter, value) {
        return !value;
    }
}

class ColumnFilterComponent {
    constructor() {
        this.onChange = new EventEmitter();
        this.filterPlaceholder = 'Filter...';
        this.emptyResultsMessage = 'No results found at this moment.';
        this.search = '';
    }
    ngOnInit() {
        this.initializeOptions();
    }
    onSearch() {
        if (!this.search || this.search.length == 0) {
            this.clearFilters();
            return;
        }
        this.filteredOptions = this.options.filter(x => x.toString().toUpperCase().indexOf(this.search.toUpperCase()) >= 0);
    }
    onClickOutside() {
        this.column.isFiltersOpenned = false;
    }
    select(item) {
        this.column.simpleFilter = new ColumnFilterModel(item, this.column, new EqualsOperator());
        this.onChange.emit(this.column);
        this.clearFilters();
    }
    removeSimpleFilter() {
        this.column.simpleFilter = null;
        this.onChange.emit(this.column);
    }
    initializeOptions() {
        if (!this.data || this.data.length == 0)
            return;
        this.options = this.data.map((row, index) => {
            if (this.column.render)
                return this.column.render(row, this.renderPropertyValue(this.column.data, row), index);
            return this.renderPropertyValue(this.column.data, row);
        });
        this.options = uniqBy(this.options, x => x);
        this.options = filter(this.options, x => x != undefined && x != null);
        this.options = _.orderBy(this.options, x => x);
        this.clearFilters();
    }
    renderPropertyValue(propertyPath, object) {
        let parts = propertyPath.split(".");
        let property = object || {};
        for (let i = 0; i < parts.length; i++) {
            if (!property) {
                return null;
            }
            property = property[parts[i]];
        }
        return property;
    }
    clearFilters() {
        this.search = '';
        this.filteredOptions = Object.assign([], this.options);
    }
}
ColumnFilterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ColumnFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
ColumnFilterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: ColumnFilterComponent, selector: "ui-column-filter", inputs: { data: "data", column: "column", filterPlaceholder: "filterPlaceholder", emptyResultsMessage: "emptyResultsMessage" }, outputs: { onChange: "onChange" }, ngImport: i0, template: "<div class=\"filters-container\" (clickOutside)=\"onClickOutside()\">\n    <div class=\"search\">\n      <div class=\"input-group\">\n        <div class=\"input-group-prepend\">\n          <span class=\"input-group-text\"><i class=\"fa fa-search\"></i></span>\n        </div>\n        <input type=\"text\" class=\"form-control form-control-sm\" [placeholder]=\"filterPlaceholder\" [(ngModel)]=\"search\" debounce (callback)=\"onSearch()\" />\n      </div>\n    </div>\n    <div class=\"filters d-flex flex-wrap\" *ngIf=\"column.simpleFilter || column.customFilters?.length > 0\">\n      <button class=\"btn btn-primary btn-sm text-truncate\" *ngIf=\"column.simpleFilter\" (click)=\"removeSimpleFilter()\">\n        <i class=\"fa fa-times\"></i>\n        <span class=\"ml-1\" [innerHtml]=\"column.simpleFilter.filter\"></span>\n      </button>\n    </div>\n    <div class=\"options\">\n      <div class=\"option text-truncate\" *ngFor=\"let item of filteredOptions\" [title]=\"item\" (click)=\"select(item)\" [innerHtml]=\"item\"></div>\n      <p class=\"mb-0 p-3\" *ngIf=\"!filteredOptions || filteredOptions.length == 0\">{{emptyResultsMessage}}</p>\n    </div>\n</div>", styles: [".filters-container{margin:-8px -12px}.filters-container .search{background-color:#f9f9f9;padding:10px;border-radius:.3rem .3rem 0 0;border-bottom:1px solid #CCC}.filters-container .options{background-color:#fff;max-height:200px;overflow-y:auto;overflow-x:hidden;border-radius:0 0 .3rem .3rem}.filters-container .options .option{cursor:pointer;padding:7px 10px;font-size:14px;max-width:300px}.filters-container .options .option:hover{background-color:#f9f9f9}.filters-container .filters{background-color:#d4e9ff;padding:10px;border-bottom:1px solid #aed5ff}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: DebounceDirective, selector: "[debounce]", inputs: ["delay"], outputs: ["callback", "arrowsCallback"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ColumnFilterComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ui-column-filter', template: "<div class=\"filters-container\" (clickOutside)=\"onClickOutside()\">\n    <div class=\"search\">\n      <div class=\"input-group\">\n        <div class=\"input-group-prepend\">\n          <span class=\"input-group-text\"><i class=\"fa fa-search\"></i></span>\n        </div>\n        <input type=\"text\" class=\"form-control form-control-sm\" [placeholder]=\"filterPlaceholder\" [(ngModel)]=\"search\" debounce (callback)=\"onSearch()\" />\n      </div>\n    </div>\n    <div class=\"filters d-flex flex-wrap\" *ngIf=\"column.simpleFilter || column.customFilters?.length > 0\">\n      <button class=\"btn btn-primary btn-sm text-truncate\" *ngIf=\"column.simpleFilter\" (click)=\"removeSimpleFilter()\">\n        <i class=\"fa fa-times\"></i>\n        <span class=\"ml-1\" [innerHtml]=\"column.simpleFilter.filter\"></span>\n      </button>\n    </div>\n    <div class=\"options\">\n      <div class=\"option text-truncate\" *ngFor=\"let item of filteredOptions\" [title]=\"item\" (click)=\"select(item)\" [innerHtml]=\"item\"></div>\n      <p class=\"mb-0 p-3\" *ngIf=\"!filteredOptions || filteredOptions.length == 0\">{{emptyResultsMessage}}</p>\n    </div>\n</div>", styles: [".filters-container{margin:-8px -12px}.filters-container .search{background-color:#f9f9f9;padding:10px;border-radius:.3rem .3rem 0 0;border-bottom:1px solid #CCC}.filters-container .options{background-color:#fff;max-height:200px;overflow-y:auto;overflow-x:hidden;border-radius:0 0 .3rem .3rem}.filters-container .options .option{cursor:pointer;padding:7px 10px;font-size:14px;max-width:300px}.filters-container .options .option:hover{background-color:#f9f9f9}.filters-container .filters{background-color:#d4e9ff;padding:10px;border-bottom:1px solid #aed5ff}\n"] }]
        }], ctorParameters: function () { return []; }, propDecorators: { onChange: [{
                type: Output
            }], data: [{
                type: Input
            }], column: [{
                type: Input
            }], filterPlaceholder: [{
                type: Input
            }], emptyResultsMessage: [{
                type: Input
            }] } });

let DATAGRID_CONFIG = new InjectionToken('dataGridConfig');

var EnumDataGridMode;
(function (EnumDataGridMode) {
    EnumDataGridMode[EnumDataGridMode["OnClient"] = 0] = "OnClient";
    EnumDataGridMode[EnumDataGridMode["OnServer"] = 1] = "OnServer";
})(EnumDataGridMode || (EnumDataGridMode = {}));
var EnumAutoFitMode;
(function (EnumAutoFitMode) {
    EnumAutoFitMode[EnumAutoFitMode["Default"] = 0] = "Default";
    EnumAutoFitMode[EnumAutoFitMode["ByCaption"] = 1] = "ByCaption";
    EnumAutoFitMode[EnumAutoFitMode["ByContent"] = 2] = "ByContent";
})(EnumAutoFitMode || (EnumAutoFitMode = {}));

class LoadingImage {
    constructor() {
        this.image = `data:image/gif;base64,R0lGODlhIANYAvf/AIWwpv///9vV0Iaxp6vDvPn//tnSzeP18o2zqpK9s4OupLLUzNza1O37+Xmmm9Lq5YSvpcLc1rTa0tvx7cri3XaonPL08s3o44q4rnytotbPyer189rt6fX+/uvt6X+qoOLY0+Lh3IGsouv59tnTznyonsvm4HqsoXilmpXDudfQyvz//nSkmKrMxIGxpnSmmnKkmIW0qX6wpd708ICsonakmnamm9bSzICqoJPAtvP39eXl4IawpqXNxHiqnnGilv7//468stTt6MbMxd7W0eb49PH+/Onq5nionOHy7najmKHJwJzIvo26sHamnIWvpYK0qJnEutjQy73d1nmqn67Rye7w7ZnGvISupPX6+H6pnnOkmsLg2XqnnJ7GvfH8+tDh3XOil73h2ZO2rfH6+Iawp6nRyJ7KwJu6sdfw667VzcXi3Mbk3qTJwXqqn7rX0dnW0Lnc1aa+trjZ0vj6+eDe2Ye4rfn8+8bg2rTWz4Gyp7nHwH2uo3qonvX8+6HNxNfq5oOvpnuonZjCuXionubo5KnQxnumnNHl4HKil36pn97c13yqn4a2rKHMwoCrobnb1MLi3Iq6r8Hl3vDy742+tLnUzr7e17zb1IWzqIq8sfv9/L7Y0tvW0d/t6t/X0trV0Ojn46bRyNjV0KXLw6rUys3OyZ3DutvUz9rX0oSupYSwpW2ilsbo4Ofa1oSxp/v8+4Kto6vVzISwpsjn4JzFu9jUz/7+/tbTzd3TzdHPyYCupKTPxq/Xzrjc04/AtIexp6XKxJe/tq3Ox+/u7P3//q7Ty97Uz9LRzIarorHYz4qyqPf49qLHvoqupOf7+NrUz3msoNDb1K/Sy4WtpOvc2IOyp/v7+oWxp4OvpHeqn3SlmYSsor3FvoOxpv///qfPxv3+/aHKw4GonuLV0JbHvM/r56jTy4Wxptbn4/b29P7+/2qglIaxpq/b0oO1q4Wwp4e8sIKsoHuvo4iyqLfd1r/r45y/t/z9/YCzp4iupYewp5CwptHw6f79/P///yH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NDkxMSwgMjAxMy8xMC8yOS0xMTo0NzoxNiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChNYWNpbnRvc2gpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkM0QUMxOUY2ODdDRTExRTM4OTZEQjQxNjREMzcwRkEwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkM0QUMxOUY3ODdDRTExRTM4OTZEQjQxNjREMzcwRkEwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QzRBQzE5RjQ4N0NFMTFFMzg5NkRCNDE2NEQzNzBGQTAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QzRBQzE5RjU4N0NFMTFFMzg5NkRCNDE2NEQzNzBGQTAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIxMC8uLSwrKikoJyYlJCMiISAfHh0cGxoZGBcWFRQTEhEQDw4NDAsKCQgHBgUEAwIBAAAh+QQFAwD/ACwAAAAAIANYAgAI/wABCBxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnz6BDix5NurTp06hTq17NurXr17Bjy55Nu7bt27hz697Nu7fv38CDCx9OvLjx48iTK1/OvLnz59CjS59Ovbr169iza9/Ovbv37+DDi/8fT768+fPo06tfz769+/fw48ufT7++/fv48+vfz7+///8ABijggAQWaOCBCCao4IIMNujggxBGKOGEFFZo4YUYZqjhhhx26OGHIIYo4ogklmjiiSimqOKKLLbo4oswxijjjDTWaOONOOao44489ujjj0AGKeSQRBZp5JFIJqnkkkw26eSTUEYp5ZRUVmnllVhmqeWWXHbp5ZdghinmmGSWaeaZaKap5ppstunmm3DGKeecdNZp55145qnnnnz26eefgAYq6KCEFmrooYgmquiijDbq6KOQRirppJRWaumlmGaq6aacdurpp6CGKuqopJZq6qmopqrqqqy26uqrsMb/KuustNZq66245qrrrrz26uuvwAYr7LDEFmvsscgmq+yyzDbr7LPQRivttNRWa+212Gar7bbcduvtt+CGK+645JZr7rnopqvuuuy26+678MYr77z01mvvvfjmq+++/Pbr778AByzwwAQXbPDBCCes8MIMN+zwwxBHLPHEFFds8cUYZ6zxxhx37PHHIIcs8sgkl2zyySinrPLKLLfs8sswxyzzzDTXbPPNOOes88489+zzz0AHLfTQRBdt9JUQKKBALI984PTTj8SiAARHDweBCFr0gQQSNiDhRgYuxGDH2GTHIEMGblRQw9Z9KBIL1VXPljQNjDjAQgUyaCJMM8pM/2KOJ54kscEIDRTewAgbJOEJBxeIoUYzwtjBhw1KCBJ13KRBoLnm2WTDdAk12HBCDE30EAcYExgRwOqs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`;
    }
}

const EXCEL_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8';
const EXCEL_EXTENSION = '.xlsx';
class ExcelService {
    constructor() { }
    ExportJsonToExcel(json, excelFileName) {
        const worksheet = XLSX.utils.json_to_sheet(json);
        const workbook = { Sheets: { 'data': worksheet }, SheetNames: ['data'] };
        const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
        this.saveAsExcelFile(excelBuffer, excelFileName);
    }
    ExportTableToExcel(tableId, excelFileName, sheetName) {
        const worksheet = XLSX.utils.table_to_sheet(document.getElementById(tableId), { raw: true });
        const workbook = XLSX.utils.book_new();
        XLSX.utils.book_append_sheet(workbook, worksheet, sheetName);
        const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
        this.saveAsExcelFile(excelBuffer, excelFileName);
    }
    saveAsExcelFile(buffer, fileName) {
        const data = new Blob([buffer], { type: EXCEL_TYPE });
        FileSaver.saveAs(data, fileName + '_' + new Date().getTime() + EXCEL_EXTENSION);
    }
}
ExcelService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ExcelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
ExcelService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ExcelService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ExcelService, decorators: [{
            type: Injectable
        }], ctorParameters: function () { return []; } });

class DatagridExportingModalComponent {
    constructor(modalRef, modalService, excelService) {
        this.modalRef = modalRef;
        this.modalService = modalService;
        this.excelService = excelService;
        this.loadingImage = new LoadingImage().image;
        this.tableId = 'datagrid-exportation';
    }
    ngOnInit() {
        this.columns = this.modalService.config.initialState['columns'];
        this.data = this.modalService.config.initialState['data'];
        this.initialColumnToSort = this.modalService.config.initialState['initialColumnToSort'];
        this.initialSortDirection = this.modalService.config.initialState['initialSortDirection'];
        this.exportedFileName = this.modalService.config.initialState['exportedFileName'];
        this.exportedExcelSheetName = this.modalService.config.initialState['exportedExcelSheetName'];
        this.export();
    }
    export() {
        setTimeout(() => {
            this.excelService.ExportJsonToExcel(this.buildExportedJson(), this.exportedFileName);
            this.modalRef.hide();
        }, 1000);
    }
    buildExportedJson() {
        if (!this.data || !this.columns) {
            return [];
        }
        let result = [];
        for (let r = 0; r < this.data.length; r++) {
            let rowObject = {};
            for (let c = 0; c < this.columns.length; c++) {
                let property = this.columns[c].caption;
                let data;
                let currentData;
                if (this.columns[c].data) {
                    currentData = this.renderPropertyValue(this.columns[c].data, this.data[r]);
                }
                if (!this.columns[c].renderOnPrint && !this.columns[c].render && this.columns[c].data) {
                    data = currentData;
                }
                else if (this.columns[c].renderOnPrint) {
                    data = this.columns[c].renderOnPrint(this.data[r], currentData, r);
                }
                else if (this.columns[c].render) {
                    data = this.columns[c].render(this.data[r], currentData, r);
                }
                rowObject[property] = data;
            }
            result.push(rowObject);
        }
        return orderBy(result, [this.columns[this.initialColumnToSort].caption], [this.initialSortDirection]);
    }
    renderPropertyValue(propertyPath, object) {
        let parts = propertyPath.split(".");
        let property = object || {};
        for (let i = 0; i < parts.length; i++) {
            if (!property) {
                return null;
            }
            property = property[parts[i]];
        }
        return property;
    }
}
DatagridExportingModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatagridExportingModalComponent, deps: [{ token: i1.BsModalRef }, { token: i1.BsModalService }, { token: ExcelService }], target: i0.ɵɵFactoryTarget.Component });
DatagridExportingModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DatagridExportingModalComponent, selector: "ui-datagrid-exporting-modal", ngImport: i0, template: "<ui-modal [hideActions]=\"true\" [noPaddings]=\"true\">\n  <div class=\"body\">\n    <img [src]=\"loadingImage\" class=\"w-100\" />\n  </div>\n</ui-modal>\n", dependencies: [{ kind: "component", type: ModalComponent, selector: "ui-modal", inputs: ["modalTitle", "hideActions", "noPaddings", "cancelButtonLabel"], outputs: ["onClose"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DatagridExportingModalComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ui-datagrid-exporting-modal', template: "<ui-modal [hideActions]=\"true\" [noPaddings]=\"true\">\n  <div class=\"body\">\n    <img [src]=\"loadingImage\" class=\"w-100\" />\n  </div>\n</ui-modal>\n" }]
        }], ctorParameters: function () { return [{ type: i1.BsModalRef }, { type: i1.BsModalService }, { type: ExcelService }]; } });

class ActionsColumnDirective {
    constructor(template) {
        this.template = template;
    }
}
ActionsColumnDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ActionsColumnDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
ActionsColumnDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ActionsColumnDirective, selector: "[actions-column]", ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ActionsColumnDirective, decorators: [{
            type: Directive,
            args: [{ selector: '[actions-column]' }]
        }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });

class DataGridColumnModel {
    constructor() {
        this.caption = '';
        this.captionAlignment = EnumAlignment$1.Left;
        this.captionClasses = '';
        this.data = '';
        this.dataAlignment = EnumAlignment$1.Left;
        this.dataClasses = '';
        this.sortable = true;
        this.sortDirection = EnumSortDirection.Ascending;
        this.enableTooltip = false;
        this.isFiltersOpenned = false;
        this.filterable = true;
        this.visible = false;
        /**
         * If true, a summary value will be displayed in a bottom summaries row, into the proper column.
         * @var name It must be a numeric property.
         */
        this.summarizable = false;
        this.summaryPrefix = '';
    }
}
class DataGridSortingModel {
}
var EnumSortDirection;
(function (EnumSortDirection) {
    EnumSortDirection["Ascending"] = "asc";
    EnumSortDirection["Descending"] = "desc";
})(EnumSortDirection || (EnumSortDirection = {}));
var EnumAlignment$1;
(function (EnumAlignment) {
    EnumAlignment[EnumAlignment["Left"] = 0] = "Left";
    EnumAlignment[EnumAlignment["Center"] = 1] = "Center";
    EnumAlignment[EnumAlignment["Right"] = 2] = "Right";
})(EnumAlignment$1 || (EnumAlignment$1 = {}));

let identifier$l = 0;
class GridDataModel {
}
class GridRowModel {
}
class GridColumnModel {
}
class DataGridComponent {
    constructor(defaultOptions, iterableDiffers, modalService, renderer, sanitizer) {
        this.iterableDiffers = iterableDiffers;
        this.modalService = modalService;
        this.renderer = renderer;
        this.sanitizer = sanitizer;
        this.initialRenderApplied = false;
        this.sortApplied = false;
        this.animating = false;
        this.selectAll = false;
        this.isResizing = false;
        this.isReordering = false;
        this.currentElementBeingReorderedFromIndex = -1;
        this.currentElementBeingReorderedToIndex = -1;
        this.currentPage = 1;
        this.identifier = `datagrid-${identifier$l++}`;
        this.debugMode = false;
        this.tableId = this.identifier;
        this.emptyResultsMessage = "No results found at this moment.";
        this.infoMessage = "Showing records from {recordsFrom} to {recordsTo} of {totalRecords} records found.";
        this.animated = true;
        this.striped = true;
        this.bordered = true;
        this.hoverEffect = true;
        this.responsive = true;
        this.showCheckboxColumn = false;
        this.showSelectAllCheckbox = true;
        this.selectAllPages = true;
        this.checkBoxMode = 0;
        this.showSummaries = false;
        this.allowExports = false;
        this.exportButtonLabel = "Export";
        this.exportedFileName = "Export";
        this.exportedExcelSheetName = "Sheet";
        this.initialColumnToSort = 0;
        this.initialSortDirection = EnumSortDirection.Ascending;
        this.mode = EnumDataGridMode.OnClient;
        this.itemsPerPage = 10;
        this.maxSize = 10;
        this.boundaryLinks = true;
        this.directionLinks = true;
        this.rotate = true;
        this.showActionsColumn = false;
        this.showInfos = true;
        this.actionsColumnCaption = "#";
        this.actionsColumnWidth = "100px";
        this.firstText = "First";
        this.previousText = "Previous";
        this.nextText = "Next";
        this.lastText = "Last";
        this.autoFitMode = EnumAutoFitMode.ByContent;
        this.allowColumnResize = true;
        this.allowColumnFilters = true;
        this.allowColumnReorder = true;
        this.fixedHeader = false;
        this.minHeight = 200;
        this.filterPlaceholder = "Filter...";
        this.filterPlacement = "bottom";
        this.OnSelectionChanged = new EventEmitter();
        this.OnRowSelected = new EventEmitter();
        this.OnRowRendered = new EventEmitter();
        this.OnPaginate = new EventEmitter();
        this.OnSort = new EventEmitter();
        this.OnColumnFiltered = new EventEmitter();
        this._maxWidth = 400;
        this._minColumnWidth = 150;
        Object.assign(this, defaultOptions);
        if (defaultOptions.paging) {
            Object.assign(this, defaultOptions.paging);
        }
        if (defaultOptions.styles) {
            Object.assign(this, defaultOptions.styles);
        }
        if (defaultOptions.exporting) {
            Object.assign(this, defaultOptions.exporting);
        }
        if (defaultOptions.filtering) {
            Object.assign(this, defaultOptions.filtering);
        }
        if (defaultOptions.reordering) {
            Object.assign(this, defaultOptions.reordering);
        }
        this._dataDiffer = this.iterableDiffers.find([]).create(null);
    }
    get data() {
        return this._externalData;
    }
    set data(value) {
        this._externalData = value;
        if (this.isUndefinedOrNull(value) &&
            !this.isUndefinedOrNull(this._internalData)) {
            this.initializeRendering(true);
        }
    }
    ngOnInit() {
        this.draw();
    }
    ngDoCheck() {
        let dataHasChanges = this._dataDiffer.diff(this._externalData);
        if (dataHasChanges && this.initialRenderApplied) {
            this.initializeRendering(true);
        }
    }
    ToogleSorting(column) {
        if (!column.sortable || !column.sort || this.isResizing) {
            return;
        }
        if (this.mode == EnumDataGridMode.OnClient) {
            if (column.sort.sorting) {
                if (column.sort.sortDirection == EnumSortDirection.Ascending) {
                    column.sort.sortDirection = EnumSortDirection.Descending;
                }
                else {
                    column.sort.sortDirection = EnumSortDirection.Ascending;
                }
            }
            else {
                for (let i = 0; i < this.columns.length; i++) {
                    this.columns[i].sort.sorting = false;
                }
                column.sort.sorting = true;
                column.sort.sortDirection = EnumSortDirection.Ascending;
            }
            this.sortOnClient(column);
            this.paginateOnClient(this.currentPage);
        }
        else {
            if (this.isUndefinedOrNull(this.OnSort)) {
                console.error("The [OnSort] callback must be provided when DataGrid Server mode is enabled.");
                return;
            }
            this.OnSort.emit(column);
        }
    }
    PageChanged(event) {
        if (this.mode == EnumDataGridMode.OnClient) {
            this.paginateOnClient(event.page);
        }
        else {
            if (this.isUndefinedOrNull(this.OnPaginate)) {
                console.error("The [OnPaginate] callback must be provided when DataGrid Server mode is enabled.");
                return;
            }
        }
        this.OnPaginate.emit(event);
    }
    GetInfo() {
        let result = this.infoMessage;
        let recordsFrom = this.currentPage * this.itemsPerPage - (this.itemsPerPage - 1);
        let recordsTo = this.currentPage * this.itemsPerPage;
        let totalRecords = this.totalItems;
        if (recordsTo > totalRecords) {
            recordsTo = recordsTo - (recordsTo - totalRecords);
        }
        return result
            .replace("{recordsFrom}", recordsFrom.toString())
            .replace("{recordsTo}", recordsTo.toString())
            .replace("{totalRecords}", totalRecords.toString());
    }
    Redraw() {
        this.draw();
    }
    RenderPropertyValue(propertyPath, object) {
        if (!propertyPath)
            return null;
        let parts = propertyPath.split(".");
        let property = object || {};
        for (let i = 0; i < parts.length; i++) {
            if (!property) {
                return null;
            }
            property = property[parts[i]];
        }
        return property;
    }
    RenderColumnSummary(column) {
        if (!this.gridData || !this.gridData.hasData) {
            return 0;
        }
        return sumBy(this.gridData.rows, (x) => Number(this.RenderPropertyValue(column.data, x.model)));
    }
    HasSummarizableColumns() {
        if (!this.columns || this.columns.length == 0) {
            return false;
        }
        return some(this.columns, (x) => x.summarizable);
    }
    OnSelectAllChanged() {
        if (!this.gridData || !this.gridData.hasData) {
            return;
        }
        for (let i = 0; i < this.gridData.rows.length; i++) {
            this.gridData.rows[i].selected = this.selectAll;
            if (!this.selectAllPages) {
                switch (this.mode) {
                    case EnumDataGridMode.OnServer:
                        this._internalData[i].selected = this.selectAll;
                        break;
                    default:
                        this._internalData[i + this.itemsPerPage * (this.currentPage - 1)].selected = this.selectAll;
                        break;
                }
            }
        }
        if (this.selectAllPages) {
            for (let i = 0; i < this._internalData.length; i++) {
                this._internalData[i].selected = this.selectAll;
            }
        }
        this.OnSelectionChanged.emit();
    }
    OnRowSelectedChanged(row, rowIndex) {
        switch (this.mode) {
            case EnumDataGridMode.OnServer:
                this._internalData[rowIndex].selected = row.selected;
                break;
            default:
                this._internalData[rowIndex + this.itemsPerPage * (this.currentPage - 1)].selected = row.selected;
                break;
        }
        this.handleSelectAllCheckboxState();
        this.OnRowSelected.emit(row);
        this.OnSelectionChanged.emit();
    }
    ExportToExcel(event) {
        return __awaiter(this, void 0, void 0, function* () {
            event.preventDefault();
            let _data = this.boundedExportCallback
                ? yield this.boundedExportCallback()
                : this._externalData;
            this.modalService.show(DatagridExportingModalComponent, {
                class: "modal-md",
                initialState: {
                    data: _data,
                    columns: this.columns.slice(0),
                    exportedFileName: this.exportedFileName,
                    exportedExcelSheetName: this.exportedExcelSheetName,
                    initialColumnToSort: this.initialColumnToSort,
                    initialSortDirection: this.initialSortDirection,
                },
            });
            return false;
        });
    }
    OnResizerMouseDown(e) {
        if (!this.allowColumnResize)
            return;
        this.isResizing = true;
        var pageX, curCol, nxtCol, curColWidth, nxtColWidth;
        curCol = e.target.parentElement;
        nxtCol = curCol.nextElementSibling;
        pageX = e.pageX;
        var padding = this.paddingDiff(curCol);
        curColWidth = curCol.offsetWidth - padding;
        if (nxtCol)
            nxtColWidth = nxtCol.offsetWidth - padding;
        var onMouseMoveCallback = (e) => {
            if (curCol) {
                var diffX = e.pageX - pageX;
                if (nxtCol)
                    nxtCol.style.width = nxtColWidth - diffX + "px";
                curCol.style.width = curColWidth + diffX + "px";
            }
        };
        var onMouseUpCallback = (e) => {
            curCol = undefined;
            nxtCol = undefined;
            pageX = undefined;
            nxtColWidth = undefined;
            curColWidth = undefined;
            setTimeout(() => {
                this.isResizing = false;
            });
            document.removeEventListener("mousemove", onMouseMoveCallback);
            document.removeEventListener("mouseup", onMouseUpCallback);
        };
        document.addEventListener("mousemove", onMouseMoveCallback);
        document.addEventListener("mouseup", onMouseUpCallback);
    }
    OnColumnMouseDown(e, index) {
        if (!this.allowColumnReorder)
            return;
        var onDragStartCallback = (e) => {
            var img = document.createElement("img");
            e.dataTransfer.setDragImage(img, 0, 0);
            this.isReordering = true;
            this.currentElementBeingReorderedFromIndex = index;
            this.renderer.addClass(e.target.parentElement.parentElement, "dragging");
            e.target.addEventListener("dragenter", (e) => onDragEnterCallback(e, index));
            e.target.addEventListener("dragend", onDragEndCallback);
            $(`#${this.identifier} thead tr th.column`).each((i, el) => {
                if (i != index) {
                    el.addEventListener("dragenter", (e) => onDragEnterCallback(e, i));
                    el.addEventListener("dragover", onDragOverCallback);
                }
            });
        };
        var onDragEndCallback = (e) => {
            if (this.currentElementBeingReorderedFromIndex !=
                this.currentElementBeingReorderedToIndex) {
                this.debug("From", this.currentElementBeingReorderedFromIndex, "To", this.currentElementBeingReorderedToIndex);
                var columnFromCopy = Object.assign({}, this.columns[this.currentElementBeingReorderedFromIndex]);
                var columnsCopy = Object.assign([], this.columns);
                columnsCopy.splice(this.currentElementBeingReorderedFromIndex, 1);
                columnsCopy.splice(this.currentElementBeingReorderedToIndex, 0, columnFromCopy);
                this.columns = columnsCopy;
                this.updateColumnReorderingDefinition();
            }
            this.isReordering = false;
            this.currentElementBeingReorderedFromIndex = -1;
            this.currentElementBeingReorderedToIndex = -1;
            this.renderer.removeClass(e.target.parentElement.parentElement, "dragging");
            e.target.removeEventListener("dragenter", (e) => onDragEnterCallback(e, index));
            e.target.removeEventListener("dragend", onDragEndCallback);
            $(`#${this.identifier} thead tr th.column`).each((i, el) => {
                if (i != index) {
                    el.removeEventListener("dragenter", (e) => onDragEnterCallback(e, i));
                    el.removeEventListener("dragover", onDragOverCallback);
                }
            });
            this.initializeRendering();
        };
        var onDragEnterCallback = (e, i) => {
            this.currentElementBeingReorderedToIndex = i;
        };
        var onDragOverCallback = (e) => {
            e.preventDefault();
        };
        var onMouseUpCallback = (e) => {
            e.target.removeEventListener("dragstart", onDragStartCallback);
            e.target.removeEventListener("mouseup", onMouseUpCallback);
        };
        e.target.addEventListener("dragstart", onDragStartCallback);
        e.target.addEventListener("mouseup", onMouseUpCallback);
    }
    OnColumnFilterClick(e, column) {
        if (!column.isFiltersOpenned) {
            this.closeAllColumnsFilters();
            column.isFiltersOpenned = true;
        }
        else {
            this.closeAllColumnsFilters();
        }
        e.stopPropagation();
    }
    OnFiltersChange(column) {
        if (this.mode == EnumDataGridMode.OnServer) {
            this.OnColumnFiltered.emit(column);
        }
        else {
            this.initializeRendering();
        }
    }
    HandleColumnClick(row, currentData, rowIndex, column) {
        if (!column.onClick)
            return;
        column.onClick(row, currentData, rowIndex, column);
    }
    HandleColumnRendering(row, currentData, rowIndex, column) {
        if (!column.render)
            return "";
        return this.sanitizer.bypassSecurityTrustHtml(column.render(row, currentData, rowIndex));
    }
    draw(redrawing) {
        this.initializeColumns();
        this.initializeRendering(redrawing);
    }
    initializeRendering(redrawing) {
        setTimeout(() => {
            this.initializeGridData();
            this.initializeFilters();
            this.initializePaging(redrawing);
            this.initializeSorting();
            this.handleAutoFit();
            this.handleInitialRenderingFlag();
        }, 0);
    }
    initializeGridData() {
        if (this._externalData) {
            this._internalData = Object.assign([], this._externalData);
        }
        else {
            this._internalData = [];
        }
        if (this.mode == EnumDataGridMode.OnServer) {
            this.initGridDataModel(Object.assign([], this._internalData));
            this.handleRowRenders();
        }
    }
    initGridDataModel(data) {
        this.gridData = {
            hasData: data && data.length > 0,
            rows: map$1(data, (row, rowIndex) => {
                let _row = {
                    selected: row.selected,
                    model: row,
                    columns: map$1(this.columns, (column, columnIndex) => {
                        let _column = {
                            isHtml: column.render != undefined,
                        };
                        if (column.data) {
                            if (column.data.split(".").length > 1) {
                                _column.value = this.RenderPropertyValue(column.data, row);
                            }
                            else {
                                _column.value = row[column.data];
                            }
                        }
                        if (_column.isHtml) {
                            _column.value = this.HandleColumnRendering(row, _column.value, rowIndex, column);
                        }
                        return _column;
                    }),
                };
                return _row;
            }),
        };
    }
    initializeColumns() {
        if (!this.columns || this.columns.length == 0) {
            console.error("Param [columns] cannot be undefined or empty.");
            return;
        }
        if (!this._externalColumns)
            this._externalColumns = clone(this.columns);
        for (let i = 0; i < this.columns.length; i++) {
            let target = {
                caption: null,
                captionAlignment: EnumAlignment$1.Left,
                captionClasses: null,
                data: null,
                dataAlignment: EnumAlignment$1.Left,
                dataClasses: null,
                sortable: true,
                filterable: true,
                visible: true,
                index: i,
            };
            Object.assign(target, this.columns[i]);
            this.columns[i] = target;
            this.columns[i].sort = new DataGridSortingModel();
            if (!this.isUndefinedOrNull(this.initialColumnToSort) &&
                this.initialColumnToSort == i) {
                this.columns[i].sort.sorting = true;
                if (this.columns[i].sortDirection) {
                    this.columns[i].sort.sortDirection = this.columns[i].sortDirection;
                }
                else {
                    this.columns[i].sort.sortDirection = this.initialSortDirection;
                }
            }
        }
        if (!this._internalColumns)
            this._internalColumns = clone(this.columns);
        this.filterColumnsThatShouldBeVisible();
        this.verifyColumnIndexPersistences();
    }
    initializeSorting() {
        if (this.isUndefinedOrNull(this._internalData) ||
            this.mode == EnumDataGridMode.OnServer ||
            this.isUndefinedOrNull(this.initialColumnToSort)) {
            this.sortApplied = true;
            return;
        }
        if (this.initialColumnToSort > this.columns.length - 1) {
            console.error("Param [initialColumnToSort] greater than the number of columns.");
            this.sortApplied = true;
            return;
        }
        const columnToSort = find(this.columns, (x) => x.sortable && x.sort && x.sort.sorting);
        if (this.isUndefinedOrNull(columnToSort)) {
            this.paginateOnClient(this.currentPage);
        }
        else {
            this.sortOnClient(columnToSort);
            this.paginateOnClient(this.currentPage);
        }
        this.sortApplied = true;
    }
    initializePaging(redrawing) {
        if (!this.currentPage) {
            this.currentPage = 1;
        }
        if (this._internalData && this.mode == EnumDataGridMode.OnClient) {
            this.totalItems = this._internalData.length;
        }
        let currentPageFitsTheNumberOfItems = this.totalItems > this.itemsPerPage * (this.currentPage - 1);
        let shouldResetCurrentPage = this.currentPage > 1 &&
            this.mode == EnumDataGridMode.OnClient &&
            !currentPageFitsTheNumberOfItems;
        if ((redrawing && this.mode == EnumDataGridMode.OnClient) ||
            shouldResetCurrentPage) {
            this.currentPage = 1;
        }
        if (this.paginator) {
            this.paginator.page = this.currentPage;
            this.paginator.totalItems = this.totalItems;
        }
    }
    paddingDiff(col) {
        if (this.getStyleVal(col, "box-sizing") == "border-box") {
            return 0;
        }
        var padLeft = this.getStyleVal(col, "padding-left");
        var padRight = this.getStyleVal(col, "padding-right");
        return parseInt(padLeft) + parseInt(padRight);
    }
    getStyleVal(elm, css) {
        return window.getComputedStyle(elm, null).getPropertyValue(css);
    }
    isUndefinedOrNull(value) {
        return value == undefined || value == null;
    }
    sortOnClient(column) {
        this._internalData = orderBy(this._internalData, [column.data], [column.sort.sortDirection]);
    }
    paginateOnClient(page) {
        const startItem = (page - 1) * this.itemsPerPage;
        const endItem = page * this.itemsPerPage;
        this.initGridDataModel(this._internalData.slice(startItem, endItem));
        this.handleRowRenders();
        this.handleSelectAllCheckboxState();
        this.handleAutoFit();
    }
    handleAutoFit() {
        switch (this.autoFitMode) {
            case EnumAutoFitMode.ByContent:
                this.autofitByContent();
                break;
            case EnumAutoFitMode.ByCaption:
                this.autofitByCaption();
                break;
            default:
                this.autofitByFixedWidths();
                break;
        }
    }
    autofitByContent() {
        if (!this.gridData || !this.gridData.hasData) {
            this.autofitByCaption();
            return;
        }
        this.animating = true;
        setTimeout(() => {
            let widths = [];
            let gridWidth = $(`#${this.tableId}`).parent().width();
            if (gridWidth == 0 &&
                $(`#${this.tableId}`).parents(".tab-content").length) {
                gridWidth = $(`#${this.tableId}`).parents(".tab-content").width();
            }
            for (let rowIndex = 0; rowIndex < this.gridData.rows.length; rowIndex++) {
                for (let columnIndex = 0; columnIndex < this.columns.length; columnIndex++) {
                    let width = this._minColumnWidth;
                    let currentData = null;
                    if (!this.gridData.rows[rowIndex].columns[columnIndex].isHtml) {
                        currentData =
                            this.gridData.rows[rowIndex].columns[columnIndex].value;
                    }
                    if (!this.isUndefinedOrNull(currentData)) {
                        width = currentData.toString().length * 10 + 20;
                    }
                    if (!this.isUndefinedOrNull(this.columns[columnIndex].caption)) {
                        let widthByCaption = this.columns[columnIndex].caption.toString().length * 10 + 40;
                        if (widthByCaption > width) {
                            width = widthByCaption;
                            if (this.allowColumnResize) {
                                width += 20;
                            }
                            if ((this.allowColumnFilters &&
                                this.columns[columnIndex].filterable &&
                                this.isUndefinedOrNull(widths[columnIndex])) ||
                                width > widths[columnIndex]) {
                                width += 30;
                            }
                        }
                    }
                    if (this.isUndefinedOrNull(widths[columnIndex]) ||
                        width > widths[columnIndex]) {
                        if (width > this._maxWidth) {
                            widths[columnIndex] = this._maxWidth;
                        }
                        else {
                            widths[columnIndex] = width;
                        }
                    }
                }
            }
            this.setDataGridWidths(widths, gridWidth);
            this.animating = false;
        }, 0);
    }
    autofitByCaption() {
        this.animating = true;
        setTimeout(() => {
            for (let columnIndex = 0; columnIndex < this.columns.length; columnIndex++) {
                if (this.isUndefinedOrNull(this.columns[columnIndex].width)) {
                    let widthByCaption = this.columns[columnIndex].caption.toString().length * 10 + 40;
                    if (this.allowColumnResize) {
                        widthByCaption += 10;
                    }
                    if (this.allowColumnFilters && this.columns[columnIndex].filterable) {
                        widthByCaption += 30;
                    }
                    this.columns[columnIndex].width = `${widthByCaption}px`;
                }
            }
            this.animating = false;
        }, 0);
    }
    autofitByFixedWidths() {
        this.animating = true;
        setTimeout(() => {
            for (let columnIndex = 0; columnIndex < this.columns.length; columnIndex++) {
                if (this.isUndefinedOrNull(this.columns[columnIndex].width)) {
                    this.columns[columnIndex].width = "150px";
                }
            }
            this.animating = false;
        }, 0);
    }
    handleSelectAllCheckboxState() {
        if (!this.gridData || !this.gridData.hasData) {
            this.selectAll = false;
            return;
        }
        this.selectAll =
            this.gridData.rows.filter((x) => x.selected).length ==
                this.gridData.rows.length;
    }
    setDataGridWidths(widths, gridWidth) {
        let initialColumnsWidths = new Array(this.columns.length);
        let _externalColumns = this._externalColumns.filter((x) => x.visible == undefined || x.visible == true);
        for (let i = 0; i < _externalColumns.length; i++) {
            let columnDefaultWidth = _externalColumns[i].width;
            let def = this.getColumnReorderingDefinitionFrom(_externalColumns[i]);
            if (!def) {
                initialColumnsWidths[i] = columnDefaultWidth;
                continue;
            }
            initialColumnsWidths[def.userIndex] = columnDefaultWidth;
        }
        this.debug("initialColumnsWidths", initialColumnsWidths);
        let totalColumnsWidth = sum(widths);
        let totalColumnsWidthGreaterThanGrid = totalColumnsWidth > gridWidth;
        if (!totalColumnsWidthGreaterThanGrid) {
            let biggestColumnIndex = 0;
            let biggestWidth = widths[widths.length - 1];
            for (let i = widths.length - 2; i >= 0; i--) {
                if (widths[i] > biggestWidth) {
                    biggestWidth = widths[i];
                    biggestColumnIndex = i;
                }
            }
            for (let columnIndex = 0; columnIndex < this.columns.length; columnIndex++) {
                if (columnIndex == biggestColumnIndex) {
                    this.columns[columnIndex].width = `auto`;
                    if (widths[columnIndex] >= this._maxWidth) {
                        if (!this.columns[columnIndex].dataClasses) {
                            this.columns[columnIndex].dataClasses = "";
                        }
                        this.columns[columnIndex].dataClasses += " td-break-word";
                    }
                }
                else {
                    this.columns[columnIndex].width = `${widths[columnIndex]}px`;
                }
            }
        }
        else {
            for (let columnIndex = 0; columnIndex < this.columns.length; columnIndex++) {
                if (widths[columnIndex] >= this._maxWidth) {
                    if (!this.columns[columnIndex].dataClasses) {
                        this.columns[columnIndex].dataClasses = "";
                    }
                    this.columns[columnIndex].dataClasses += " td-break-word";
                }
                this.columns[columnIndex].width = `${widths[columnIndex]}px`;
            }
        }
        for (let i = 0; i < initialColumnsWidths.length; i++) {
            if (initialColumnsWidths[i]) {
                this.columns[i].width = initialColumnsWidths[i];
            }
        }
    }
    handleInitialRenderingFlag() {
        if (!this.initialRenderApplied) {
            this.initialRenderApplied = true;
        }
    }
    initializeFilters() {
        if (!this.columns ||
            this.columns.length == 0 ||
            !this.data ||
            this.data.length == 0 ||
            this.mode == EnumDataGridMode.OnServer)
            return;
        let filters = [];
        for (let i = 0; i < this.columns.length; i++) {
            if (this.columns[i].simpleFilter) {
                filters.push(this.columns[i].simpleFilter);
            }
            if (this.columns[i].customFilters &&
                this.columns[i].customFilters.length > 0) {
                filters.push(...this.columns[i].customFilters);
            }
        }
        if (!filters || filters.length == 0)
            return;
        this._internalData = this.data.filter((row, rowIndex) => {
            for (let i = 0; i < filters.length; i++) {
                let value = null;
                if (filters[i].column.render)
                    value = filters[i].column.render(row, this.RenderPropertyValue(filters[i].column.data, row), rowIndex);
                else
                    value = this.RenderPropertyValue(filters[i].column.data, row);
                if (!filters[i].operator.validate(filters[i].filter, value)) {
                    return false;
                }
            }
            return true;
        });
    }
    closeAllColumnsFilters() {
        if (!this.columns || this.columns.length == 0)
            return;
        for (let i = 0; i < this.columns.length; i++) {
            this.columns[i].isFiltersOpenned = false;
        }
    }
    handleRowRenders() {
        if (!this.gridData || !this.gridData.hasData)
            return;
        for (let i = 0; i < this.gridData.rows.length; i++) {
            this.OnRowRendered.emit(this.gridData.rows[i]);
        }
    }
    verifyColumnIndexPersistences() {
        if (!this.userPreferencesKey)
            return;
        let definition = this.getOrCreateColumnReorderingDefinition();
        this.applyColumnReorderingDefinition(definition);
    }
    getColumnReorderingDefinition() {
        if (this._columnDefinitions)
            return this._columnDefinitions;
        this.debug("Readed from localstorage");
        let json = localStorage.getItem(this.userPreferencesKey);
        this._columnDefinitions = json ? JSON.parse(json) : null;
        return this._columnDefinitions;
    }
    getOrCreateColumnReorderingDefinition() {
        let definition = this.getColumnReorderingDefinition();
        if (!definition || this.definitionIsNotCompatibleAnymore(definition)) {
            return this.buildColumnReorderingDefinition();
        }
        return definition;
    }
    buildColumnReorderingDefinition() {
        let definition = {
            key: this.userPreferencesKey,
            data: this.columns.map((c) => {
                let item = {
                    caption: c.caption,
                    originalIndex: c.index,
                    userIndex: c.index,
                };
                return item;
            }),
        };
        this._columnDefinitions = definition;
        localStorage.setItem(this.userPreferencesKey, JSON.stringify(definition));
        this.debug("Rebuilded ColumnReorderingDefinition");
        return definition;
    }
    definitionIsNotCompatibleAnymore(definition) {
        this.debug("Compatibility checking on:", definition);
        let hasDifferentNumberOfColumns = this.columns.length != definition.data.length;
        this.debug("hasDifferentNumberOfColumns", hasDifferentNumberOfColumns);
        if (hasDifferentNumberOfColumns)
            return true;
        let hasDifferencesByCaption = filter(definition.data, (def) => this.columns[def.originalIndex].caption != def.caption).length > 0;
        this.debug("hasDifferencesByCaption", hasDifferencesByCaption);
        return hasDifferencesByCaption;
    }
    applyColumnReorderingDefinition(definition) {
        for (let i = 0; i < this.columns.length; i++) {
            let def = find(definition.data, (x) => x.caption == this.columns[i].caption);
            if (!def)
                continue;
            this.columns[i].index = def.userIndex;
            this.debug(this.columns[i].caption, this.columns[i].index);
        }
        this.columns = orderBy(this.columns, (x) => x.index);
    }
    updateColumnReorderingDefinition() {
        if (!this.userPreferencesKey)
            return;
        let definition = this.getColumnReorderingDefinition();
        for (let i = 0; i < this.columns.length; i++) {
            this.columns[i].index = i;
            let def = definition.data.find((x) => x.caption == this.columns[i].caption);
            if (!def)
                continue;
            def.userIndex = i;
        }
        this._columnDefinitions = definition;
        localStorage.setItem(this.userPreferencesKey, JSON.stringify(definition));
    }
    getColumnReorderingDefinitionFrom(column) {
        if (!this.userPreferencesKey)
            return undefined;
        let definition = this.getColumnReorderingDefinition();
        if (!definition)
            return undefined;
        let def = definition.data.find((x) => x.caption == column.caption);
        if (!def)
            return undefined;
        return def;
    }
    filterColumnsThatShouldBeVisible() {
        this.columns = this._internalColumns.filter((x) => x.visible);
    }
    debug(message, ...params) {
        if (!this.debugMode)
            return;
        console.log(message, ...params);
    }
}
DataGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataGridComponent, deps: [{ token: DATAGRID_CONFIG, optional: true }, { token: i0.IterableDiffers }, { token: i1.BsModalService }, { token: i0.Renderer2 }, { token: i2$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
DataGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DataGridComponent, selector: "datagrid", inputs: { debugMode: "debugMode", tableId: "tableId", columns: "columns", emptyResultsMessage: "emptyResultsMessage", infoMessage: "infoMessage", animated: "animated", striped: "striped", bordered: "bordered", hoverEffect: "hoverEffect", responsive: "responsive", showCheckboxColumn: "showCheckboxColumn", showSelectAllCheckbox: "showSelectAllCheckbox", selectAllPages: "selectAllPages", checkBoxMode: "checkBoxMode", showSummaries: "showSummaries", allowExports: "allowExports", exportButtonLabel: "exportButtonLabel", exportedFileName: "exportedFileName", exportedExcelSheetName: "exportedExcelSheetName", initialColumnToSort: "initialColumnToSort", initialSortDirection: "initialSortDirection", mode: "mode", totalItems: "totalItems", itemsPerPage: "itemsPerPage", maxSize: "maxSize", boundaryLinks: "boundaryLinks", directionLinks: "directionLinks", rotate: "rotate", showActionsColumn: "showActionsColumn", showInfos: "showInfos", actionsColumnCaption: "actionsColumnCaption", actionsColumnWidth: "actionsColumnWidth", firstText: "firstText", previousText: "previousText", nextText: "nextText", lastText: "lastText", autoFitMode: "autoFitMode", allowColumnResize: "allowColumnResize", allowColumnFilters: "allowColumnFilters", allowColumnReorder: "allowColumnReorder", fixedHeader: "fixedHeader", minHeight: "minHeight", maxHeight: "maxHeight", userPreferencesKey: "userPreferencesKey", filterPlaceholder: "filterPlaceholder", filterPlacement: "filterPlacement", boundedExportCallback: "boundedExportCallback", data: "data" }, outputs: { OnSelectionChanged: "OnSelectionChanged", OnRowSelected: "OnRowSelected", OnRowRendered: "OnRowRendered", OnPaginate: "OnPaginate", OnSort: "OnSort", OnColumnFiltered: "OnColumnFiltered" }, queries: [{ propertyName: "actionsColumnTemplate", first: true, predicate: ActionsColumnDirective, descendants: true, read: TemplateRef, static: true }], viewQueries: [{ propertyName: "paginator", first: true, predicate: ["paginator"], descendants: true }], ngImport: i0, template: "<div class=\"ui-hero-datagrid\">\n    <div \n        [ngClass]=\"{\n            'table-responsive': responsive,\n            'fixed-header': fixedHeader\n        }\"\n        [ngStyle]=\"{\n            'max-height.px': fixedHeader && maxHeight > 0 ? maxHeight : 'auto',\n            'min-height.px': fixedHeader && minHeight > 0 ? minHeight : 'auto'\n        }\">\n        <table [id]=\"tableId\" class=\"table\" [ngClass]=\"{\n            'table-striped': striped,\n            'table-bordered': bordered,\n            'table-hover': hoverEffect,\n            'table-animated': animated && initialRenderApplied && !isResizing,\n            'table-animating': animating && initialRenderApplied,\n            'table-fixed': autoFitMode == 1 || autoFitMode == 2,\n            'table-not-resizing': !isResizing,\n            'd-none': !initialRenderApplied\n        }\">\n            <thead>\n                <tr>\n                    <th class=\"\" *ngIf=\"showCheckboxColumn && gridData?.hasData\" style=\"width: 50px;\">\n\n                        <div  class=\" custom-control custom-switch\" *ngIf=\"checkBoxMode == 1 && showSelectAllCheckbox\">\n                            <input type=\"checkbox\" class=\"custom-control-input\" [id]=\"'customSwitchDataGrid' + tableId \" [(ngModel)]=\"selectAll\" (change)=\"OnSelectAllChanged()\" >    \n                            <label class=\"custom-control-label\" [for]=\"'customSwitchDataGrid' + tableId\"></label>                        \n                        </div>\n\n                        <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"OnSelectAllChanged()\" *ngIf=\"checkBoxMode == 0 && showSelectAllCheckbox\" />\n                    </th>\n                    <th class=\"action text-center\" *ngIf=\"showActionsColumn\" [ngStyle]=\"{'width': actionsColumnWidth}\">{{actionsColumnCaption}}</th>\n                    <th *ngFor=\"let column of columns; let i = index;\" \n                        (click)=\"ToogleSorting(column)\" \n                        class=\"column {{column.captionClasses}}\" \n                        [draggable]=\"false\"\n                        [ngStyle]=\"{'width': column.width}\" \n                        [ngClass]=\"{\n                            'sortable': column.sortable,\n                            'sorting': column.sort?.sorting,\n                            'asc': column.sort?.sortDirection == 'asc',\n                            'desc': column.sort?.sortDirection == 'desc'\n                        }\">\n                        <div class=\"d-flex justify-content-between align-items-center\">                            \n                            <div class=\"flex-grow-1\" \n                                [ngClass]=\"{'text-center': column.captionAlignment == 1, 'text-right': column.captionAlignment == 2}\" \n                                [draggable]=\"allowColumnReorder && !isResizing\" \n                                (mousedown)=\"OnColumnMouseDown($event, i)\"\n                                [innerHtml]=\"column.renderCaption ? column.renderCaption() : column.caption\">                                \n                            </div>\n                            <i class=\"fa fa-sort ml-1\" *ngIf=\"column.sortable && !column.sort?.sorting && gridData?.hasData\"></i>\n                            <i class=\"fa fa-sort-amount-asc ml-1\" *ngIf=\"column.sortable && column.sort?.sorting && column.sort?.sortDirection == 'asc' && gridData?.hasData\"></i>\n                            <i class=\"fa fa-sort-amount-desc ml-1\" *ngIf=\"column.sortable && column.sort?.sorting && column.sort?.sortDirection == 'desc' && gridData?.hasData\"></i>\n\n                            <button type=\"button\" class=\"btn btn-sm btn-filter ml-2 mr-1\" *ngIf=\"allowColumnFilters && column.filterable && data?.length > 0\"\n                                [popover]=\"popFilters\" triggers=\"\" [isOpen]=\"column.isFiltersOpenned\" [placement]=\"filterPlacement\" [adaptivePosition]=\"false\" container=\"body\" (click)=\"OnColumnFilterClick($event, column)\" [ngClass]=\"{\n                                    'btn-primary': column.simpleFilter || column.customFilters?.length > 0\n                                }\">\n                                <i class=\"fa fa-filter\"></i>\n                            </button>\n\n                            <ng-template #popFilters>\n                                <ui-column-filter \n                                    [column]=\"column\" \n                                    [data]=\"data\" \n                                    [filterPlaceholder]=\"filterPlaceholder\" \n                                    [emptyResultsMessage]=\"emptyResultsMessage\" \n                                    (onChange)=\"OnFiltersChange($event)\">\n                                </ui-column-filter>\n                            </ng-template>\n                        </div>\n                        <div class=\"resizer\" *ngIf=\"allowColumnResize\" (mousedown)=\"OnResizerMouseDown($event)\"></div>\n                    </th>\n                </tr>\n            </thead>\n            <tbody *ngIf=\"sortApplied\">\n                <tr *ngFor=\"let row of gridData.rows; let rowIndex = index;\" [ngClass]=\"row.ngClass\">\n                    <td class=\"\" *ngIf=\"showCheckboxColumn && gridData?.hasData && checkBoxMode == 1\">\n                        <div  class=\"custom-control custom-switch\" style=\"overflow: initial !important\">\n                            <input type=\"checkbox\" class=\"custom-control-input\" [id]=\"'customSwitchDataGrid' + rowIndex + tableId\" [(ngModel)]=\"row.selected\" (change)=\"OnRowSelectedChanged(row, rowIndex)\" >    \n                            <label class=\"custom-control-label\" [for]=\"'customSwitchDataGrid' + rowIndex + tableId\"></label>                        \n                        </div>                        \n                    </td>\n                    <td class=\"text-center checkbox-column\" *ngIf=\"showCheckboxColumn && gridData?.hasData && checkBoxMode == 0\">\n                        \n                        <input type=\"checkbox\" [(ngModel)]=\"row.selected\" (change)=\"OnRowSelectedChanged(row, rowIndex)\" *ngIf=\"checkBoxMode == 0 \" />\n                    </td>\n                    <td class=\"action text-center\" *ngIf=\"showActionsColumn\">\n                        <ng-container \n                            [ngTemplateOutlet]=\"actionsColumnTemplate\"\n                            [ngTemplateOutletContext]=\"{\n                                row: row.model,\n                                rowIndex: rowIndex\n                            }\">\n                        </ng-container>\n                    </td>\n                    <td *ngFor=\"let column of columns; let columnIndex = index;\" \n                        class=\"{{column.dataClasses}}\" \n                        [ngClass]=\"{\n                            'text-center': column.dataAlignment == 1,\n                            'text-right': column.dataAlignment == 2\n                        }\">                        \n                        <span \n                            [title]=\"column.enableTooltip ? row.columns[columnIndex].value : ''\"\n                            [innerHtml]=\"row.columns[columnIndex]?.value\"\n                            (click)=\"HandleColumnClick(row, row.columns[columnIndex].value, rowIndex, column)\">\n                        </span>\n                    </td>\n                </tr>\n                <tr *ngIf=\"showSummaries && HasSummarizableColumns()\" class=\"summaries\">\n                    <td *ngIf=\"showCheckboxColumn && gridData?.hasData\"></td>\n                    <td *ngIf=\"showActionsColumn\"></td>\n                    <td *ngFor=\"let column of columns; let columnIndex = index;\" class=\"{{column.dataClasses}}\" [ngClass]=\"{\n                        'text-center': column.dataAlignment == 1,\n                        'text-right': column.dataAlignment == 2\n                    }\">                        \n                        <span *ngIf=\"column.summarizable\">{{column.summaryPrefix}}{{RenderColumnSummary(column) | number:'1.2-2'}}</span>\n                    </td>\n                </tr>\n            </tbody>\n            <tfoot *ngIf=\"sortApplied && (!gridData || !gridData.hasData)\">\n                <tr>\n                    <td class=\"empty-results text-center p-3\" [attr.colspan]=\"columns?.length + (showActionsColumn ? 1 : 0) + (showCheckboxColumn && gridData?.hasData ? 1 : 0)\">\n                        <p class=\"mb-0\">{{emptyResultsMessage}}</p>\n                    </td>\n                </tr>\n            </tfoot>\n        </table>\n\n        <div class=\"loading-box\" *ngIf=\"!sortApplied\">\n            <spinner></spinner>\n        </div>\n    </div>\n\n    <div class=\"d-flex align-items-center flex-wrap-reverse mt-3\"  *ngIf=\"showInfos && gridData?.hasData\">\n        <div class=\"d-flex align-items-center flex-wrap-reverse justify-content-center\">\n            <div class=\"d-flex align-items-center flex-wrap\">\n                <div class=\"export-actions mr-3 my-1\" *ngIf=\"allowExports\">\n                    <div class=\"btn-group\" dropdown>\n                        <button dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\">\n                            <i class=\"fa fa-external-link\"></i> {{exportButtonLabel}} <span class=\"caret\"></span>\n                        </button>\n                        <ul *dropdownMenu class=\"dropdown-menu\" role=\"menu\">\n                            <li role=\"menuitem\"><a class=\"dropdown-item\" href=\"#\" (click)=\"ExportToExcel($event)\"><i class=\"fa fa-file-excel-o\"></i> Excel</a></li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n            <div class=\"info mr-3 my-1\">\n                <span>{{GetInfo()}}</span>\n            </div>\n        </div>\n        \n        <div class=\"pagination ml-auto\">\n            <pagination #paginator\n                [(ngModel)]=\"currentPage\"\n                [totalItems]=\"totalItems\"\n                [itemsPerPage]=\"itemsPerPage\"\n                [boundaryLinks]=\"boundaryLinks\"\n                [directionLinks]=\"directionLinks\"\n                [maxSize]=\"maxSize\"\n                [rotate]=\"rotate\"\n                [firstText]=\"firstText\"\n                [lastText]=\"lastText\"\n                [nextText]=\"nextText\"\n                [previousText]=\"previousText\"\n                (pageChanged)=\"PageChanged($event)\">\n            </pagination>\n        </div>\n    </div>   \n</div>\n", styles: [":host{display:flex;flex-direction:column;flex:1 0 auto}.ui-hero-datagrid{position:relative;display:flex;flex-direction:column;flex:1 0 auto}.ui-hero-datagrid table{margin-bottom:0}.ui-hero-datagrid table th{position:relative}.ui-hero-datagrid table th>div>div{flex-shrink:0;-webkit-user-select:none;user-select:none}.ui-hero-datagrid table th .resizer{position:absolute;cursor:col-resize;top:0;right:0;width:6px;height:100%;background:repeating-linear-gradient(45deg,transparent,transparent 2px,rgba(0,0,0,.05) 2px,rgba(0,0,0,.05) 4px)}.ui-hero-datagrid table th:hover .resizer{background:repeating-linear-gradient(45deg,transparent,transparent 2px,rgba(0,0,0,.2) 2px,rgba(0,0,0,.2) 4px)}.ui-hero-datagrid table td,.ui-hero-datagrid table th{overflow:hidden;vertical-align:middle}.ui-hero-datagrid table td>*{word-break:break-word}.ui-hero-datagrid table th.sortable{cursor:pointer}.ui-hero-datagrid table th.checkbox-column input[type=checkbox]{margin:0;width:20px;height:20px;vertical-align:middle}.ui-hero-datagrid table td.checkbox-column input[type=checkbox]{margin:0 auto;width:20px;height:20px;vertical-align:middle}.ui-hero-datagrid table tr.summaries{border-top:2px solid #c1c1c1}.ui-hero-datagrid table tr.summaries td{background-color:#dee2e6}.ui-hero-datagrid table.table-not-resizing th.sortable:hover{background-color:#dee2e6;color:#666}.ui-hero-datagrid table.table-not-resizing th.sortable:hover .btn-filter:not(.btn-primary){background-color:#fff}.ui-hero-datagrid table.table-not-resizing th.dragging{background-color:#007bff!important;color:#fff!important}.ui-hero-datagrid table.table-fixed{table-layout:fixed}.ui-hero-datagrid table.table-fixed td:not(.td-break-word) *{word-break:keep-word;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.ui-hero-datagrid table:not(.table-fixed) th.action{white-space:nowrap;width:1%}.ui-hero-datagrid table.table-animated.table-animating td *{opacity:.5}.ui-hero-datagrid table.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.ui-hero-datagrid table.table-animated *{transition:all .15s ease-in-out,border-color none}.ui-hero-datagrid .custom-control-label{overflow:initial!important}.ui-hero-datagrid .custom-control-label:after{top:calc(.23rem + 2px)!important}.ui-hero-datagrid .empty-results{border:1px solid #dee2e6;background-color:#f9f9f9;color:#666}.ui-hero-datagrid .pagination{max-height:40px}.ui-hero-datagrid .fixed-header{display:flex;flex-direction:column;flex:1 0 auto;overflow-y:auto;height:0}.ui-hero-datagrid .fixed-header table thead th{background-color:#fff;position:sticky;top:0;box-shadow:inset 0 1px #dee2e6,0 .125rem .25rem #00000013;z-index:1}.ui-hero-datagrid .fixed-header:before{content:\"\";position:absolute;top:0;left:0;right:0;border-top:2px solid #dee2e6;z-index:1}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: SpinnerComponent, selector: "spinner", inputs: ["noMargins"] }, { kind: "component", type: i1$3.PaginationComponent, selector: "pagination", inputs: ["itemsPerPage", "totalItems", "maxSize", "rotate", "boundaryLinks", "directionLinks", "pageBtnClass", "align", "firstText", "previousText", "nextText", "lastText", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: i7.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i7.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i7.BsDropdownDirective, selector: "[bsDropdown],[dropdown]", inputs: ["autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen", "placement", "triggers", "container", "dropup"], outputs: ["onShown", "onHidden", "isOpenChange"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i7$1.PopoverDirective, selector: "[popover]", inputs: ["outsideClick", "containerClass", "isOpen", "adaptivePosition", "popover", "popoverContext", "popoverTitle", "placement", "triggers", "container", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "component", type: ColumnFilterComponent, selector: "ui-column-filter", inputs: ["data", "column", "filterPlaceholder", "emptyResultsMessage"], outputs: ["onChange"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DataGridComponent, decorators: [{
            type: Component,
            args: [{ selector: "datagrid", template: "<div class=\"ui-hero-datagrid\">\n    <div \n        [ngClass]=\"{\n            'table-responsive': responsive,\n            'fixed-header': fixedHeader\n        }\"\n        [ngStyle]=\"{\n            'max-height.px': fixedHeader && maxHeight > 0 ? maxHeight : 'auto',\n            'min-height.px': fixedHeader && minHeight > 0 ? minHeight : 'auto'\n        }\">\n        <table [id]=\"tableId\" class=\"table\" [ngClass]=\"{\n            'table-striped': striped,\n            'table-bordered': bordered,\n            'table-hover': hoverEffect,\n            'table-animated': animated && initialRenderApplied && !isResizing,\n            'table-animating': animating && initialRenderApplied,\n            'table-fixed': autoFitMode == 1 || autoFitMode == 2,\n            'table-not-resizing': !isResizing,\n            'd-none': !initialRenderApplied\n        }\">\n            <thead>\n                <tr>\n                    <th class=\"\" *ngIf=\"showCheckboxColumn && gridData?.hasData\" style=\"width: 50px;\">\n\n                        <div  class=\" custom-control custom-switch\" *ngIf=\"checkBoxMode == 1 && showSelectAllCheckbox\">\n                            <input type=\"checkbox\" class=\"custom-control-input\" [id]=\"'customSwitchDataGrid' + tableId \" [(ngModel)]=\"selectAll\" (change)=\"OnSelectAllChanged()\" >    \n                            <label class=\"custom-control-label\" [for]=\"'customSwitchDataGrid' + tableId\"></label>                        \n                        </div>\n\n                        <input type=\"checkbox\" [(ngModel)]=\"selectAll\" (change)=\"OnSelectAllChanged()\" *ngIf=\"checkBoxMode == 0 && showSelectAllCheckbox\" />\n                    </th>\n                    <th class=\"action text-center\" *ngIf=\"showActionsColumn\" [ngStyle]=\"{'width': actionsColumnWidth}\">{{actionsColumnCaption}}</th>\n                    <th *ngFor=\"let column of columns; let i = index;\" \n                        (click)=\"ToogleSorting(column)\" \n                        class=\"column {{column.captionClasses}}\" \n                        [draggable]=\"false\"\n                        [ngStyle]=\"{'width': column.width}\" \n                        [ngClass]=\"{\n                            'sortable': column.sortable,\n                            'sorting': column.sort?.sorting,\n                            'asc': column.sort?.sortDirection == 'asc',\n                            'desc': column.sort?.sortDirection == 'desc'\n                        }\">\n                        <div class=\"d-flex justify-content-between align-items-center\">                            \n                            <div class=\"flex-grow-1\" \n                                [ngClass]=\"{'text-center': column.captionAlignment == 1, 'text-right': column.captionAlignment == 2}\" \n                                [draggable]=\"allowColumnReorder && !isResizing\" \n                                (mousedown)=\"OnColumnMouseDown($event, i)\"\n                                [innerHtml]=\"column.renderCaption ? column.renderCaption() : column.caption\">                                \n                            </div>\n                            <i class=\"fa fa-sort ml-1\" *ngIf=\"column.sortable && !column.sort?.sorting && gridData?.hasData\"></i>\n                            <i class=\"fa fa-sort-amount-asc ml-1\" *ngIf=\"column.sortable && column.sort?.sorting && column.sort?.sortDirection == 'asc' && gridData?.hasData\"></i>\n                            <i class=\"fa fa-sort-amount-desc ml-1\" *ngIf=\"column.sortable && column.sort?.sorting && column.sort?.sortDirection == 'desc' && gridData?.hasData\"></i>\n\n                            <button type=\"button\" class=\"btn btn-sm btn-filter ml-2 mr-1\" *ngIf=\"allowColumnFilters && column.filterable && data?.length > 0\"\n                                [popover]=\"popFilters\" triggers=\"\" [isOpen]=\"column.isFiltersOpenned\" [placement]=\"filterPlacement\" [adaptivePosition]=\"false\" container=\"body\" (click)=\"OnColumnFilterClick($event, column)\" [ngClass]=\"{\n                                    'btn-primary': column.simpleFilter || column.customFilters?.length > 0\n                                }\">\n                                <i class=\"fa fa-filter\"></i>\n                            </button>\n\n                            <ng-template #popFilters>\n                                <ui-column-filter \n                                    [column]=\"column\" \n                                    [data]=\"data\" \n                                    [filterPlaceholder]=\"filterPlaceholder\" \n                                    [emptyResultsMessage]=\"emptyResultsMessage\" \n                                    (onChange)=\"OnFiltersChange($event)\">\n                                </ui-column-filter>\n                            </ng-template>\n                        </div>\n                        <div class=\"resizer\" *ngIf=\"allowColumnResize\" (mousedown)=\"OnResizerMouseDown($event)\"></div>\n                    </th>\n                </tr>\n            </thead>\n            <tbody *ngIf=\"sortApplied\">\n                <tr *ngFor=\"let row of gridData.rows; let rowIndex = index;\" [ngClass]=\"row.ngClass\">\n                    <td class=\"\" *ngIf=\"showCheckboxColumn && gridData?.hasData && checkBoxMode == 1\">\n                        <div  class=\"custom-control custom-switch\" style=\"overflow: initial !important\">\n                            <input type=\"checkbox\" class=\"custom-control-input\" [id]=\"'customSwitchDataGrid' + rowIndex + tableId\" [(ngModel)]=\"row.selected\" (change)=\"OnRowSelectedChanged(row, rowIndex)\" >    \n                            <label class=\"custom-control-label\" [for]=\"'customSwitchDataGrid' + rowIndex + tableId\"></label>                        \n                        </div>                        \n                    </td>\n                    <td class=\"text-center checkbox-column\" *ngIf=\"showCheckboxColumn && gridData?.hasData && checkBoxMode == 0\">\n                        \n                        <input type=\"checkbox\" [(ngModel)]=\"row.selected\" (change)=\"OnRowSelectedChanged(row, rowIndex)\" *ngIf=\"checkBoxMode == 0 \" />\n                    </td>\n                    <td class=\"action text-center\" *ngIf=\"showActionsColumn\">\n                        <ng-container \n                            [ngTemplateOutlet]=\"actionsColumnTemplate\"\n                            [ngTemplateOutletContext]=\"{\n                                row: row.model,\n                                rowIndex: rowIndex\n                            }\">\n                        </ng-container>\n                    </td>\n                    <td *ngFor=\"let column of columns; let columnIndex = index;\" \n                        class=\"{{column.dataClasses}}\" \n                        [ngClass]=\"{\n                            'text-center': column.dataAlignment == 1,\n                            'text-right': column.dataAlignment == 2\n                        }\">                        \n                        <span \n                            [title]=\"column.enableTooltip ? row.columns[columnIndex].value : ''\"\n                            [innerHtml]=\"row.columns[columnIndex]?.value\"\n                            (click)=\"HandleColumnClick(row, row.columns[columnIndex].value, rowIndex, column)\">\n                        </span>\n                    </td>\n                </tr>\n                <tr *ngIf=\"showSummaries && HasSummarizableColumns()\" class=\"summaries\">\n                    <td *ngIf=\"showCheckboxColumn && gridData?.hasData\"></td>\n                    <td *ngIf=\"showActionsColumn\"></td>\n                    <td *ngFor=\"let column of columns; let columnIndex = index;\" class=\"{{column.dataClasses}}\" [ngClass]=\"{\n                        'text-center': column.dataAlignment == 1,\n                        'text-right': column.dataAlignment == 2\n                    }\">                        \n                        <span *ngIf=\"column.summarizable\">{{column.summaryPrefix}}{{RenderColumnSummary(column) | number:'1.2-2'}}</span>\n                    </td>\n                </tr>\n            </tbody>\n            <tfoot *ngIf=\"sortApplied && (!gridData || !gridData.hasData)\">\n                <tr>\n                    <td class=\"empty-results text-center p-3\" [attr.colspan]=\"columns?.length + (showActionsColumn ? 1 : 0) + (showCheckboxColumn && gridData?.hasData ? 1 : 0)\">\n                        <p class=\"mb-0\">{{emptyResultsMessage}}</p>\n                    </td>\n                </tr>\n            </tfoot>\n        </table>\n\n        <div class=\"loading-box\" *ngIf=\"!sortApplied\">\n            <spinner></spinner>\n        </div>\n    </div>\n\n    <div class=\"d-flex align-items-center flex-wrap-reverse mt-3\"  *ngIf=\"showInfos && gridData?.hasData\">\n        <div class=\"d-flex align-items-center flex-wrap-reverse justify-content-center\">\n            <div class=\"d-flex align-items-center flex-wrap\">\n                <div class=\"export-actions mr-3 my-1\" *ngIf=\"allowExports\">\n                    <div class=\"btn-group\" dropdown>\n                        <button dropdownToggle type=\"button\" class=\"btn btn-primary dropdown-toggle\">\n                            <i class=\"fa fa-external-link\"></i> {{exportButtonLabel}} <span class=\"caret\"></span>\n                        </button>\n                        <ul *dropdownMenu class=\"dropdown-menu\" role=\"menu\">\n                            <li role=\"menuitem\"><a class=\"dropdown-item\" href=\"#\" (click)=\"ExportToExcel($event)\"><i class=\"fa fa-file-excel-o\"></i> Excel</a></li>\n                        </ul>\n                    </div>\n                </div>\n            </div>\n            <div class=\"info mr-3 my-1\">\n                <span>{{GetInfo()}}</span>\n            </div>\n        </div>\n        \n        <div class=\"pagination ml-auto\">\n            <pagination #paginator\n                [(ngModel)]=\"currentPage\"\n                [totalItems]=\"totalItems\"\n                [itemsPerPage]=\"itemsPerPage\"\n                [boundaryLinks]=\"boundaryLinks\"\n                [directionLinks]=\"directionLinks\"\n                [maxSize]=\"maxSize\"\n                [rotate]=\"rotate\"\n                [firstText]=\"firstText\"\n                [lastText]=\"lastText\"\n                [nextText]=\"nextText\"\n                [previousText]=\"previousText\"\n                (pageChanged)=\"PageChanged($event)\">\n            </pagination>\n        </div>\n    </div>   \n</div>\n", styles: [":host{display:flex;flex-direction:column;flex:1 0 auto}.ui-hero-datagrid{position:relative;display:flex;flex-direction:column;flex:1 0 auto}.ui-hero-datagrid table{margin-bottom:0}.ui-hero-datagrid table th{position:relative}.ui-hero-datagrid table th>div>div{flex-shrink:0;-webkit-user-select:none;user-select:none}.ui-hero-datagrid table th .resizer{position:absolute;cursor:col-resize;top:0;right:0;width:6px;height:100%;background:repeating-linear-gradient(45deg,transparent,transparent 2px,rgba(0,0,0,.05) 2px,rgba(0,0,0,.05) 4px)}.ui-hero-datagrid table th:hover .resizer{background:repeating-linear-gradient(45deg,transparent,transparent 2px,rgba(0,0,0,.2) 2px,rgba(0,0,0,.2) 4px)}.ui-hero-datagrid table td,.ui-hero-datagrid table th{overflow:hidden;vertical-align:middle}.ui-hero-datagrid table td>*{word-break:break-word}.ui-hero-datagrid table th.sortable{cursor:pointer}.ui-hero-datagrid table th.checkbox-column input[type=checkbox]{margin:0;width:20px;height:20px;vertical-align:middle}.ui-hero-datagrid table td.checkbox-column input[type=checkbox]{margin:0 auto;width:20px;height:20px;vertical-align:middle}.ui-hero-datagrid table tr.summaries{border-top:2px solid #c1c1c1}.ui-hero-datagrid table tr.summaries td{background-color:#dee2e6}.ui-hero-datagrid table.table-not-resizing th.sortable:hover{background-color:#dee2e6;color:#666}.ui-hero-datagrid table.table-not-resizing th.sortable:hover .btn-filter:not(.btn-primary){background-color:#fff}.ui-hero-datagrid table.table-not-resizing th.dragging{background-color:#007bff!important;color:#fff!important}.ui-hero-datagrid table.table-fixed{table-layout:fixed}.ui-hero-datagrid table.table-fixed td:not(.td-break-word) *{word-break:keep-word;text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.ui-hero-datagrid table:not(.table-fixed) th.action{white-space:nowrap;width:1%}.ui-hero-datagrid table.table-animated.table-animating td *{opacity:.5}.ui-hero-datagrid table.table-striped tbody tr:nth-of-type(odd){background-color:#f9f9f9}.ui-hero-datagrid table.table-animated *{transition:all .15s ease-in-out,border-color none}.ui-hero-datagrid .custom-control-label{overflow:initial!important}.ui-hero-datagrid .custom-control-label:after{top:calc(.23rem + 2px)!important}.ui-hero-datagrid .empty-results{border:1px solid #dee2e6;background-color:#f9f9f9;color:#666}.ui-hero-datagrid .pagination{max-height:40px}.ui-hero-datagrid .fixed-header{display:flex;flex-direction:column;flex:1 0 auto;overflow-y:auto;height:0}.ui-hero-datagrid .fixed-header table thead th{background-color:#fff;position:sticky;top:0;box-shadow:inset 0 1px #dee2e6,0 .125rem .25rem #00000013;z-index:1}.ui-hero-datagrid .fixed-header:before{content:\"\";position:absolute;top:0;left:0;right:0;border-top:2px solid #dee2e6;z-index:1}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [DATAGRID_CONFIG]
                    }, {
                        type: Optional
                    }] }, { type: i0.IterableDiffers }, { type: i1.BsModalService }, { type: i0.Renderer2 }, { type: i2$1.DomSanitizer }];
    }, propDecorators: { debugMode: [{
                type: Input
            }], tableId: [{
                type: Input
            }], columns: [{
                type: Input
            }], emptyResultsMessage: [{
                type: Input
            }], infoMessage: [{
                type: Input
            }], animated: [{
                type: Input
            }], striped: [{
                type: Input
            }], bordered: [{
                type: Input
            }], hoverEffect: [{
                type: Input
            }], responsive: [{
                type: Input
            }], showCheckboxColumn: [{
                type: Input
            }], showSelectAllCheckbox: [{
                type: Input
            }], selectAllPages: [{
                type: Input
            }], checkBoxMode: [{
                type: Input
            }], showSummaries: [{
                type: Input
            }], allowExports: [{
                type: Input
            }], exportButtonLabel: [{
                type: Input
            }], exportedFileName: [{
                type: Input
            }], exportedExcelSheetName: [{
                type: Input
            }], initialColumnToSort: [{
                type: Input
            }], initialSortDirection: [{
                type: Input
            }], mode: [{
                type: Input
            }], totalItems: [{
                type: Input
            }], itemsPerPage: [{
                type: Input
            }], maxSize: [{
                type: Input
            }], boundaryLinks: [{
                type: Input
            }], directionLinks: [{
                type: Input
            }], rotate: [{
                type: Input
            }], showActionsColumn: [{
                type: Input
            }], showInfos: [{
                type: Input
            }], actionsColumnCaption: [{
                type: Input
            }], actionsColumnWidth: [{
                type: Input
            }], firstText: [{
                type: Input
            }], previousText: [{
                type: Input
            }], nextText: [{
                type: Input
            }], lastText: [{
                type: Input
            }], autoFitMode: [{
                type: Input
            }], allowColumnResize: [{
                type: Input
            }], allowColumnFilters: [{
                type: Input
            }], allowColumnReorder: [{
                type: Input
            }], fixedHeader: [{
                type: Input
            }], minHeight: [{
                type: Input
            }], maxHeight: [{
                type: Input
            }], userPreferencesKey: [{
                type: Input
            }], filterPlaceholder: [{
                type: Input
            }], filterPlacement: [{
                type: Input
            }], boundedExportCallback: [{
                type: Input
            }], OnSelectionChanged: [{
                type: Output
            }], OnRowSelected: [{
                type: Output
            }], OnRowRendered: [{
                type: Output
            }], OnPaginate: [{
                type: Output
            }], OnSort: [{
                type: Output
            }], OnColumnFiltered: [{
                type: Output
            }], actionsColumnTemplate: [{
                type: ContentChild,
                args: [ActionsColumnDirective, { read: TemplateRef, static: true }]
            }], paginator: [{
                type: ViewChild,
                args: ["paginator"]
            }], data: [{
                type: Input,
                args: ["data"]
            }] } });

class ColumnReorderingDefinitionsModel {
}
class ColumnReorderingDefinitionsItemModel {
}

class NgxUiHeroDataGridModule {
    static forRoot(config) {
        return {
            ngModule: NgxUiHeroDataGridModule,
            providers: [
                {
                    provide: DATAGRID_CONFIG,
                    useValue: config,
                }
            ]
        };
    }
}
NgxUiHeroDataGridModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroDataGridModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
NgxUiHeroDataGridModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroDataGridModule, declarations: [DataGridComponent,
        ActionsColumnDirective,
        DatagridExportingModalComponent,
        ColumnFilterComponent], imports: [CommonModule,
        FormsModule,
        UiModule], exports: [DataGridComponent,
        ActionsColumnDirective] });
NgxUiHeroDataGridModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroDataGridModule, providers: [
        ExcelService
    ], imports: [CommonModule,
        FormsModule,
        UiModule] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroDataGridModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [
                        CommonModule,
                        FormsModule,
                        UiModule,
                    ],
                    declarations: [
                        DataGridComponent,
                        ActionsColumnDirective,
                        DatagridExportingModalComponent,
                        ColumnFilterComponent
                    ],
                    exports: [
                        DataGridComponent,
                        ActionsColumnDirective
                    ],
                    entryComponents: [
                        DatagridExportingModalComponent
                    ],
                    providers: [
                        ExcelService
                    ],
                }]
        }] });

class CurrencySymbolPipe extends CurrencyPipe {
    transform(value) {
        const currencyValue = super.transform(0, value, true, '1.0-2');
        return currencyValue.replace(/[0-9]/g, '');
    }
}
CurrencySymbolPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrencySymbolPipe, deps: null, target: i0.ɵɵFactoryTarget.Pipe });
CurrencySymbolPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: CurrencySymbolPipe, name: "currencySymbol" });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrencySymbolPipe, decorators: [{
            type: Pipe,
            args: [{ name: 'currencySymbol' }]
        }] });

class BlockUiComponent {
    constructor() { }
}
BlockUiComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BlockUiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
BlockUiComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: BlockUiComponent, selector: "[block-ui]", inputs: { blockUi: ["block-ui", "blockUi"] }, ngImport: i0, template: "<div class=\"block-ui\">\n  <ng-content></ng-content>\n\n  <div class=\"block-ui-overlay\" *ngIf=\"blockUi?.loading\">\n    <div class=\"loading\">\n      <div class=\"spinner\">\n        <div class=\"bounce1\"></div>\n        <div class=\"bounce2\"></div>\n        <div class=\"bounce3\"></div>\n      </div>\n      <div class=\"message\" *ngIf=\"blockUi?.message\">{{blockUi?.message}}</div>\n    </div>\n  </div>  \n</div>", styles: [".block-ui{position:relative}.block-ui .block-ui-overlay{position:absolute;inset:0;background:rgba(51,51,51,.596);display:flex;align-items:center;justify-content:center;z-index:30}.block-ui .block-ui-overlay .message{color:#fff;font-size:1.3em;text-shadow:-1px 1px 1px #484848;font-family:Helvetica Neue,Helvetica;text-align:center}.block-ui .block-ui-overlay .spinner{width:70px;margin:0 auto;text-align:center}.block-ui .block-ui-overlay .spinner>div{width:18px;height:18px;background-color:#fff;border-radius:100%;display:inline-block;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.block-ui .block-ui-overlay .spinner .bounce1{animation-delay:-.32s}.block-ui .block-ui-overlay .spinner .bounce2{animation-delay:-.16s}@keyframes sk-bouncedelay{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}\n"], dependencies: [{ kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: BlockUiComponent, decorators: [{
            type: Component,
            args: [{ selector: '[block-ui]', template: "<div class=\"block-ui\">\n  <ng-content></ng-content>\n\n  <div class=\"block-ui-overlay\" *ngIf=\"blockUi?.loading\">\n    <div class=\"loading\">\n      <div class=\"spinner\">\n        <div class=\"bounce1\"></div>\n        <div class=\"bounce2\"></div>\n        <div class=\"bounce3\"></div>\n      </div>\n      <div class=\"message\" *ngIf=\"blockUi?.message\">{{blockUi?.message}}</div>\n    </div>\n  </div>  \n</div>", styles: [".block-ui{position:relative}.block-ui .block-ui-overlay{position:absolute;inset:0;background:rgba(51,51,51,.596);display:flex;align-items:center;justify-content:center;z-index:30}.block-ui .block-ui-overlay .message{color:#fff;font-size:1.3em;text-shadow:-1px 1px 1px #484848;font-family:Helvetica Neue,Helvetica;text-align:center}.block-ui .block-ui-overlay .spinner{width:70px;margin:0 auto;text-align:center}.block-ui .block-ui-overlay .spinner>div{width:18px;height:18px;background-color:#fff;border-radius:100%;display:inline-block;animation:sk-bouncedelay 1.4s infinite ease-in-out both}.block-ui .block-ui-overlay .spinner .bounce1{animation-delay:-.32s}.block-ui .block-ui-overlay .spinner .bounce2{animation-delay:-.16s}@keyframes sk-bouncedelay{0%,80%,to{transform:scale(0)}40%{transform:scale(1)}}\n"] }]
        }], ctorParameters: function () { return []; }, propDecorators: { blockUi: [{
                type: Input,
                args: ['block-ui']
            }] } });

let INPUT_FORMS_CONFIG = new InjectionToken('inputFormsConfig');

const normalizeValidator = (validator) => {
    const func = validator.validate.bind(validator);
    if (typeof func === 'function') {
        return (c) => func(c);
    }
    else {
        return validator;
    }
};
const composeValidators = (validators) => {
    if (validators == null || validators.length === 0) {
        return null;
    }
    return Validators.compose(validators.map(normalizeValidator));
};
const validate = (validators, asyncValidators) => {
    return (control) => {
        const synchronousValid = () => composeValidators(validators)(control);
        if (asyncValidators) {
            const asyncValidator = composeValidators(asyncValidators);
            return asyncValidator(control).map((v) => {
                const secondary = synchronousValid();
                if (secondary || v) { // compose async and sync validator results
                    return Object.assign({}, secondary, v);
                }
            });
        }
        if (validators) {
            return of(synchronousValid());
        }
        return of(null);
    };
};
const handleValidationError = (errorMessage, label) => {
    const re = /{label}/gi;
    return errorMessage.replace(re, label);
};
const message = (validator, key, label, validationMessages) => {
    switch (key) {
        case 'required':
            return handleValidationError(validationMessages.required, label);
        case 'pattern':
            return handleValidationError(validationMessages.pattern, label);
        case 'minlength':
            return handleValidationError(validationMessages.minlength, label);
        case 'maxlength':
            return handleValidationError(validationMessages.maxlength, label);
    }
    switch (typeof validator[key]) {
        case 'string':
            return validator[key];
        default:
            return handleValidationError(validationMessages.invalid, label);
    }
};

const noop$1 = () => { };
class ValueAccessorBase {
    constructor() {
        this._onChangeCallback = noop$1;
        this._onTouchedCallback = noop$1;
    }
    get value() {
        return this.innerValue;
    }
    set value(value) {
        if (this.innerValue !== value) {
            this.innerValue = value;
            this._onChangeCallback(value);
        }
    }
    touch() {
        this.internallyTouched = true;
    }
    writeValue(value) {
        this.innerValue = value;
    }
    registerOnChange(fn) {
        this._onChangeCallback = fn;
    }
    registerOnTouched(fn) {
        this._onTouchedCallback = fn;
    }
}

class ElementBase extends ValueAccessorBase {
    constructor(validators, asyncValidators, config) {
        super();
        this.validators = validators;
        this.asyncValidators = asyncValidators;
        this.config = config;
        this.showValidations = false;
        this.autocomplete = 'on';
    }
    validate() {
        return validate(this.validators, this.asyncValidators)(this.model.control);
    }
    get invalid() {
        return this.validate().pipe(map((v) => this.invalidPattern
            || this.invalidMaxValue
            || this.invalidMinValue
            || Object.keys(v || {}).length > 0));
    }
    get failures() {
        return this.validate().pipe(map((v) => {
            const fails = Object.keys(v || {}).map(k => message(v, k, this.label, this.config.validationMessages));
            if (this.invalidPattern) {
                fails.push(message(v, 'pattern', this.label, this.config.validationMessages));
            }
            else if (this.invalidMaxValue) {
                fails.push(message(v, 'max', this.label, this.config.validationMessages));
            }
            else if (this.invalidMinValue) {
                fails.push(message(v, 'min', this.label, this.config.validationMessages));
            }
            return fails;
        }));
    }
    get touched() {
        return this.model != null && this.model != undefined && (this.model.touched || this.internallyTouched);
    }
    get invalidPattern() {
        return this.model.control.hasError('pattern') || this.model.control.hasError('invalid');
    }
    get invalidMaxValue() {
        return this.model.control.hasError('max');
    }
    get invalidMinValue() {
        return this.model.control.hasError('min');
    }
    get isRequired() {
        if (!this.validators || this.validators.length === 0) {
            return;
        }
        return this.validators.filter(x => x['required'] == true).length > 0;
    }
}
ElementBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ElementBase, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
ElementBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: ElementBase, inputs: { label: "label", disabled: "disabled", showValidations: "showValidations", autocomplete: "autocomplete", help: "help", description: "description" }, usesInheritance: true, ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: ElementBase, decorators: [{
            type: Directive
        }], ctorParameters: function () {
        return [{ type: undefined }, { type: undefined }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { label: [{
                type: Input
            }], disabled: [{
                type: Input
            }], showValidations: [{
                type: Input
            }], autocomplete: [{
                type: Input
            }], help: [{
                type: Input
            }], description: [{
                type: Input
            }] } });

let identifier$k = 0;
class FilterDateComponent extends ElementBase {
    constructor(validators, asyncValidators, config, localeService) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.localeService = localeService;
        this.format = 'MM/dd/yyyy';
        this.theme = 'theme-dark-blue';
        this.clearSelectionButtonLabel = 'Clear';
        this.onChange = new EventEmitter();
        this.clickOutsideEnabled = true;
        this.locale = 'en-gb';
        this.bsConfig = {
            containerClass: this.theme,
            customTodayClass: 'today',
        };
        this.identifier = `filter-date-${identifier$k++}`;
        if (config.date) {
            Object.assign(this, config.date);
        }
        if (config.dropDown) {
            this.clearSelectionButtonLabel = config.dropDown.clearSelectionButtonLabel;
        }
    }
    ngOnInit() {
        this.localeService.use(this.locale);
        setTimeout(() => {
            this.handleInitialValue();
        });
    }
    ngDoCheck() {
        this.handleInitialValue();
    }
    onValueChange(value) {
        if (this.toggling)
            return;
        this.value = value;
        this.onChange.emit(value);
        setTimeout(() => {
            this.showDropdown = false;
        }, 0);
    }
    toggleDropDown(event, value) {
        if (this.clickOutsideEnabled) {
            this.toggling = true;
            if ((value == false && !this.showDropdown) || (value == undefined && this.disabled))
                return;
            if (value == undefined) {
                if (this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = !this.showDropdown;
            }
            else {
                if (!value && this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = value;
            }
            setTimeout(() => {
                this.toggling = false;
            }, 0);
        }
        else {
            this.clickOutsideEnabled = true;
        }
    }
    onComboPressed(event) {
        if (event.keyCode == 13) {
            this.toggleDropDown(null);
            event.preventDefault();
        }
    }
    clearSelection(e) {
        this.value = null;
        this.comboTouched = true;
        this.showDropdown = false;
        this.onChange.emit(this.value);
        if (e)
            e.stopPropagation();
    }
    setComboTouched() {
        this.comboTouched = true;
    }
    handleInitialValue() {
        if (this.value && (typeof this.value == "string" || this.value instanceof String)) {
            let data = new Date(this.value);
            data.setHours(0);
            data.setMinutes(0);
            data.setSeconds(0);
            data.setMilliseconds(0);
            this.writeValue(data);
        }
    }
}
FilterDateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterDateComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i1$4.BsLocaleService }], target: i0.ɵɵFactoryTarget.Component });
FilterDateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FilterDateComponent, selector: "filter-date", inputs: { minDate: "minDate", maxDate: "maxDate", format: "format", theme: "theme", clearSelectionButtonLabel: "clearSelectionButtonLabel" }, outputs: { onChange: "onChange" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: FilterDateComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-filter-date\">\n    <input type=\"hidden\" [(ngModel)]=\"value\" />\n\n    <div class=\"combobox d-flex align-items-center\" [ngClass]=\"{\n        'open': showDropdown, \n        'disabled': disabled,\n        'has-value': value\n      }\" (click)=\"toggleDropDown($event)\" (keyup)=\"onComboPressed($event)\" tabindex=\"0\">\n        <span *ngIf=\"!value\">{{label}}</span>\n\n        <span *ngIf=\"value\">\n            <b>{{label}}</b>:\n            <small class=\"text-muted text-truncate ml-1\">{{value | date:format}}</small>\n        </span>\n        \n        <i class=\"fa\" [ngClass]=\"{'fa-angle-down': !showDropdown, 'fa-angle-up': showDropdown}\"></i>\n    </div>\n\n    <div class=\"dropdown-options fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"toggleDropDown($event, false)\">\n        <div class=\"options-container\">\n            <bs-datepicker-inline \n                [minDate]=\"minDate\"\n                [maxDate]=\"maxDate\"\n                [bsConfig]=\"bsConfig\"\n                [bsValue]=\"value\"\n                (bsValueChange)=\"onValueChange($event)\">\n            </bs-datepicker-inline>\n            <div class=\"toolbar\" *ngIf=\"value && !disabled\">\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"clearSelection($event)\">\n                    <i class=\"fa fa-eraser\"></i> {{clearSelectionButtonLabel}}\n                </button>\n            </div>\n        </div>\n    </div>\n</div>", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-filter-date{position:relative}.ui-filter-date *{-webkit-user-select:none;user-select:none}.ui-filter-date>.combobox{outline:none;padding:.375rem .475rem;width:-moz-fit-content;width:fit-content}.ui-filter-date>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-filter-date>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-filter-date .combobox:hover{cursor:pointer}.ui-filter-date>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-filter-date>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-filter-date>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;z-index:20;margin-top:-1px;min-width:300px}.ui-filter-date>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-filter-date>.dropdown-options .toolbar{padding:10px;border-bottom:1px solid #ced4da;background-color:#1b578a}.ui-filter-date>.dropdown-options.drop-right{left:inherit;right:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: i1$4.BsDatepickerInlineDirective, selector: "bs-datepicker-inline", inputs: ["bsValue", "bsConfig", "isDisabled", "minDate", "maxDate", "dateCustomClasses", "datesEnabled", "datesDisabled"], outputs: ["bsValueChange"], exportAs: ["bsDatepickerInline"] }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterDateComponent, decorators: [{
            type: Component,
            args: [{ selector: 'filter-date', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: FilterDateComponent,
                            multi: true
                        }], template: "<div [id]=\"identifier\" class=\"ui-filter-date\">\n    <input type=\"hidden\" [(ngModel)]=\"value\" />\n\n    <div class=\"combobox d-flex align-items-center\" [ngClass]=\"{\n        'open': showDropdown, \n        'disabled': disabled,\n        'has-value': value\n      }\" (click)=\"toggleDropDown($event)\" (keyup)=\"onComboPressed($event)\" tabindex=\"0\">\n        <span *ngIf=\"!value\">{{label}}</span>\n\n        <span *ngIf=\"value\">\n            <b>{{label}}</b>:\n            <small class=\"text-muted text-truncate ml-1\">{{value | date:format}}</small>\n        </span>\n        \n        <i class=\"fa\" [ngClass]=\"{'fa-angle-down': !showDropdown, 'fa-angle-up': showDropdown}\"></i>\n    </div>\n\n    <div class=\"dropdown-options fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"toggleDropDown($event, false)\">\n        <div class=\"options-container\">\n            <bs-datepicker-inline \n                [minDate]=\"minDate\"\n                [maxDate]=\"maxDate\"\n                [bsConfig]=\"bsConfig\"\n                [bsValue]=\"value\"\n                (bsValueChange)=\"onValueChange($event)\">\n            </bs-datepicker-inline>\n            <div class=\"toolbar\" *ngIf=\"value && !disabled\">\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"clearSelection($event)\">\n                    <i class=\"fa fa-eraser\"></i> {{clearSelectionButtonLabel}}\n                </button>\n            </div>\n        </div>\n    </div>\n</div>", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-filter-date{position:relative}.ui-filter-date *{-webkit-user-select:none;user-select:none}.ui-filter-date>.combobox{outline:none;padding:.375rem .475rem;width:-moz-fit-content;width:fit-content}.ui-filter-date>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-filter-date>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-filter-date .combobox:hover{cursor:pointer}.ui-filter-date>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-filter-date>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-filter-date>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;z-index:20;margin-top:-1px;min-width:300px}.ui-filter-date>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-filter-date>.dropdown-options .toolbar{padding:10px;border-bottom:1px solid #ced4da;background-color:#1b578a}.ui-filter-date>.dropdown-options.drop-right{left:inherit;right:0}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: i1$4.BsLocaleService }];
    }, propDecorators: { minDate: [{
                type: Input
            }], maxDate: [{
                type: Input
            }], format: [{
                type: Input
            }], theme: [{
                type: Input
            }], clearSelectionButtonLabel: [{
                type: Input
            }], onChange: [{
                type: Output
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$j = 0;
class FilterDropdownSearchComponent extends ElementBase {
    constructor(validators, asyncValidators, config, iterableDiffers) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.iterableDiffers = iterableDiffers;
        this.clickOutsideEnabled = true;
        this.searchCounter = 0;
        this.selectedItemIndex = -1;
        this.placeholder = 'Select...';
        this.searchPlaceholder = 'Search...';
        this.emptyResultsMessage = 'No results found at this moment.';
        this.clearSelectionButtonLabel = 'Clear';
        this.minCharsToSearch = 3;
        this.dropRight = false;
        this.onChange = new EventEmitter();
        this.onSearch = new EventEmitter();
        this.identifier = `input-dropdown-search-${identifier$j++}`;
        if (config.dropDown) {
            Object.assign(this, config.dropDown);
        }
        this._differData = this.iterableDiffers.find([]).create(null);
    }
    get data() {
        return this._data;
    }
    set data(value) {
        this._data = value;
        this.Init();
    }
    ngOnInit() {
        this.Init();
    }
    ngDoCheck() {
        let changesInData = this._differData.diff(this._data);
        if (changesInData || !this.modelInitialized || this.value != this._lastModelInitialized) {
            this.Init();
        }
    }
    Init() {
        this.clearSearch();
        if (!this.internalData || this.internalData.length == 0) {
            return;
        }
        if (this.value != null && this.value != undefined) {
            this.setSelectedItemByTheCurrentModelValue();
            this._lastModelInitialized = this.value;
        }
        else {
            this.selectedDisplayText = '';
            this._lastModelInitialized = undefined;
        }
        this.modelInitialized = true;
    }
    ToggleDropDown(event, value) {
        if (this.clickOutsideEnabled) {
            if ((value == false && !this.showDropdown) || (value == undefined && this.disabled))
                return;
            if (value == undefined) {
                if (this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = !this.showDropdown;
            }
            else {
                if (!value && this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = value;
            }
            if (this.lazyLoadedData) {
                this.search = '';
                this.internalData = [];
            }
            else {
                this.clearSearch(true);
            }
        }
        else {
            this.clickOutsideEnabled = true;
        }
    }
    Select(row) {
        if (this.disabled) {
            this.ToggleDropDown(null, false);
            return;
        }
        this.value = this.renderPropertyValue(this.valueProperty, row);
        this.onChange.emit(this.value);
        this.ToggleDropDown(null, false);
    }
    OnSearch() {
        if (this.lazyLoadedData) {
            this.onSearch.emit(this.search);
            this.searchCounter += 1;
            return;
        }
        if (!this.search || this.search.length < this.minCharsToSearch) {
            this.clearSearchResults();
            return;
        }
        this.filterData();
    }
    ClearSelection(e) {
        this.value = null;
        this.selectedDisplayText = null;
        this.comboTouched = true;
        this.showDropdown = false;
        this.onChange.emit(this.value);
        if (e)
            e.stopPropagation();
    }
    SetLoading(value) {
        this.loading = value;
    }
    OnArrowsPressed(event) {
        if (event.keyCode == 13) {
            this.Select(this.internalData[this.selectedItemIndex]);
        }
        else if (event.keyCode >= 37 && event.keyCode <= 40) {
            this.handleArrows(event.keyCode);
        }
    }
    OnComboPressed(event) {
        if (event.keyCode == 13) {
            this.ToggleDropDown(null);
            event.preventDefault();
        }
    }
    handleOptionsScrollerDown() {
        var scroll = 0;
        var scrollPositionStart = $(`#${this.identifier} .result-list`).scrollTop();
        var scrollPositionEnd = scrollPositionStart + (38 * 6);
        var currentPosition = this.selectedItemIndex * 38;
        if (currentPosition >= scrollPositionStart && currentPosition < scrollPositionEnd) {
            scroll = scrollPositionStart;
        }
        else {
            scroll = (this.selectedItemIndex - 6) * 38;
        }
        $(`#${this.identifier} .result-list`).scrollTop(scroll);
    }
    handleOptionsScrollerUp() {
        var scroll = 0;
        var scrollPositionStart = $(`#${this.identifier} .result-list`).scrollTop();
        var scrollPositionEnd = scrollPositionStart + (38 * 6);
        var currentPosition = this.selectedItemIndex * 38;
        if (currentPosition > scrollPositionStart && currentPosition <= scrollPositionEnd) {
            scroll = scrollPositionStart;
        }
        else {
            scroll = (this.selectedItemIndex - 1) * 38;
        }
        $(`#${this.identifier} .result-list`).scrollTop(scroll);
    }
    handleArrows(keyCode) {
        switch (keyCode) {
            case 38: //ArrouUp
                if (this.selectedItemIndex > 0) {
                    this.selectedItemIndex -= 1;
                }
                this.handleOptionsScrollerUp();
                break;
            case 40: //ArrouDown
                if (this.selectedItemIndex < (this.internalData.length - 1)) {
                    this.selectedItemIndex += 1;
                }
                this.handleOptionsScrollerDown();
                break;
        }
    }
    setSelectedItemByTheCurrentModelValue() {
        if (this.value == null || this.value == undefined)
            return;
        let row = this.data.find(x => this.value == this.renderPropertyValue(this.valueProperty, x));
        if (row) {
            this.selectedDisplayText = this.renderPropertyValue(this.displayTextProperty, row);
        }
    }
    filterData() {
        this.internalData = this.data.filter(x => {
            let value = this.renderPropertyValue(this.displayTextProperty, x);
            if (value && value.toString().toUpperCase().indexOf(this.search.toUpperCase()) >= 0) {
                return true;
            }
            return false;
        });
    }
    clearSearch(clearSearchInput) {
        if (clearSearchInput) {
            this.search = '';
        }
        this.clearSearchResults();
    }
    clearSearchResults() {
        this.selectedItemIndex = -1;
        this.internalData = Object.assign([], this.data);
    }
    setComboTouched() {
        this.comboTouched = true;
    }
    renderPropertyValue(propertyPath, object) {
        let parts = propertyPath.split(".");
        let property = object || {};
        for (let i = 0; i < parts.length; i++) {
            if (!property) {
                return null;
            }
            property = property[parts[i]];
        }
        return property;
    }
}
FilterDropdownSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterDropdownSearchComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
FilterDropdownSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FilterDropdownSearchComponent, selector: "filter-dropdown-search", inputs: { placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", emptyResultsMessage: "emptyResultsMessage", clearSelectionButtonLabel: "clearSelectionButtonLabel", displayTextProperty: "displayTextProperty", valueProperty: "valueProperty", lazyLoadedData: "lazyLoadedData", minCharsToSearch: "minCharsToSearch", dropRight: "dropRight", data: "data" }, outputs: { onChange: "onChange", onSearch: "onSearch" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: FilterDropdownSearchComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-filter-dropdown-search\">\n    <input type=\"hidden\" [(ngModel)]=\"value\" />\n\n    <div class=\"combobox d-flex align-items-center\" [ngClass]=\"{\n        'open': showDropdown, \n        'disabled': disabled,\n        'has-value': value\n      }\" (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n        <span *ngIf=\"!value\">{{label}}</span>\n\n        <span *ngIf=\"value && selectedDisplayText\">\n            <b>{{label}}</b>:\n            <small class=\"text-muted text-truncate ml-1\">{{selectedDisplayText}}</small>\n        </span>\n        \n        <i class=\"fa\" [ngClass]=\"{'fa-angle-down': !showDropdown, 'fa-angle-up': showDropdown}\"></i>\n    </div>\n\n    <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\"\n        [ngClass]=\"{\n            'drop-right': dropRight\n        }\">\n        <div class=\"options-container\">\n            <div class=\"toolbar d-flex align-items-center\">\n                <input type=\"text\" auto-focus class=\"form-control\" name=\"{{identifier}}-search\" [(ngModel)]=\"search\"\n                    placeholder=\"{{searchPlaceholder}}\" debounce (callback)=\"OnSearch()\"\n                    (arrowsCallback)=\"OnArrowsPressed($event)\" />\n                    \n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ClearSelection($event)\" *ngIf=\"value && !disabled\">\n                    <i class=\"fa fa-eraser\"></i> {{clearSelectionButtonLabel}}\n                </button>\n            </div>\n\n            <div class=\"loading\" *ngIf=\"loading\">\n                <spinner></spinner>\n            </div>\n\n            <div *ngIf=\"!loading && internalData?.length > 0\">\n                <div class=\"result-list\">\n                    <div class=\"list-item\" *ngFor=\"let item of internalData; let i = index;\" (click)=\"Select(item)\"\n                        [ngClass]=\"{\n                'active': value == item[valueProperty],\n                'focused': selectedItemIndex == i\n              }\">\n                        {{item[displayTextProperty]}}\n                    </div>\n                </div>\n            </div>\n\n            <span class=\"empty-results\" *ngIf=\"!loading && (!lazyLoadedData || searchCounter > 0) && (!internalData || internalData.length == 0)\">{{emptyResultsMessage}}</span>\n        </div>\n    </div>\n</div>", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-filter-dropdown-search{position:relative}.ui-filter-dropdown-search *{-webkit-user-select:none;user-select:none}.ui-filter-dropdown-search>.combobox{outline:none;padding:.375rem .475rem;width:-moz-fit-content;width:fit-content}.ui-filter-dropdown-search>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-filter-dropdown-search>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-filter-dropdown-search .combobox:hover{cursor:pointer}.ui-filter-dropdown-search>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-filter-dropdown-search>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-filter-dropdown-search>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-filter-dropdown-search>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-filter-dropdown-search>.combobox.has-validations.is-valid{border-color:#28a745}.ui-filter-dropdown-search>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-filter-dropdown-search>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-filter-dropdown-search>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-filter-dropdown-search>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-filter-dropdown-search>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important}.ui-filter-dropdown-search>.dropdown-options .loading{background-color:#696969;padding:40px 30px;border-radius:0 0 .25rem .25rem}.ui-filter-dropdown-search>.dropdown-options .result-list{overflow-y:auto;overflow-x:hidden;max-height:300px}.ui-filter-dropdown-search>.dropdown-options .result-list .list-item{color:#000000de;cursor:pointer;text-decoration:none;padding:7px 10px;font-size:16px}.ui-filter-dropdown-search>.dropdown-options .result-list .list-item.active{color:#007bff}.ui-filter-dropdown-search>.dropdown-options .result-list .list-item:hover,.ui-filter-dropdown-search>.dropdown-options .result-list .list-item.focused{background:rgba(0,0,0,.04)}.ui-filter-dropdown-search>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.ui-filter-dropdown-search>.dropdown-options.drop-right{left:inherit;right:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: DebounceDirective, selector: "[debounce]", inputs: ["delay"], outputs: ["callback", "arrowsCallback"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: AutoFocusDirective, selector: "[auto-focus]" }, { kind: "component", type: SpinnerComponent, selector: "spinner", inputs: ["noMargins"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterDropdownSearchComponent, decorators: [{
            type: Component,
            args: [{ selector: 'filter-dropdown-search', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: FilterDropdownSearchComponent,
                            multi: true
                        }], template: "<div [id]=\"identifier\" class=\"ui-filter-dropdown-search\">\n    <input type=\"hidden\" [(ngModel)]=\"value\" />\n\n    <div class=\"combobox d-flex align-items-center\" [ngClass]=\"{\n        'open': showDropdown, \n        'disabled': disabled,\n        'has-value': value\n      }\" (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n        <span *ngIf=\"!value\">{{label}}</span>\n\n        <span *ngIf=\"value && selectedDisplayText\">\n            <b>{{label}}</b>:\n            <small class=\"text-muted text-truncate ml-1\">{{selectedDisplayText}}</small>\n        </span>\n        \n        <i class=\"fa\" [ngClass]=\"{'fa-angle-down': !showDropdown, 'fa-angle-up': showDropdown}\"></i>\n    </div>\n\n    <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\"\n        [ngClass]=\"{\n            'drop-right': dropRight\n        }\">\n        <div class=\"options-container\">\n            <div class=\"toolbar d-flex align-items-center\">\n                <input type=\"text\" auto-focus class=\"form-control\" name=\"{{identifier}}-search\" [(ngModel)]=\"search\"\n                    placeholder=\"{{searchPlaceholder}}\" debounce (callback)=\"OnSearch()\"\n                    (arrowsCallback)=\"OnArrowsPressed($event)\" />\n                    \n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ClearSelection($event)\" *ngIf=\"value && !disabled\">\n                    <i class=\"fa fa-eraser\"></i> {{clearSelectionButtonLabel}}\n                </button>\n            </div>\n\n            <div class=\"loading\" *ngIf=\"loading\">\n                <spinner></spinner>\n            </div>\n\n            <div *ngIf=\"!loading && internalData?.length > 0\">\n                <div class=\"result-list\">\n                    <div class=\"list-item\" *ngFor=\"let item of internalData; let i = index;\" (click)=\"Select(item)\"\n                        [ngClass]=\"{\n                'active': value == item[valueProperty],\n                'focused': selectedItemIndex == i\n              }\">\n                        {{item[displayTextProperty]}}\n                    </div>\n                </div>\n            </div>\n\n            <span class=\"empty-results\" *ngIf=\"!loading && (!lazyLoadedData || searchCounter > 0) && (!internalData || internalData.length == 0)\">{{emptyResultsMessage}}</span>\n        </div>\n    </div>\n</div>", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-filter-dropdown-search{position:relative}.ui-filter-dropdown-search *{-webkit-user-select:none;user-select:none}.ui-filter-dropdown-search>.combobox{outline:none;padding:.375rem .475rem;width:-moz-fit-content;width:fit-content}.ui-filter-dropdown-search>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-filter-dropdown-search>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-filter-dropdown-search .combobox:hover{cursor:pointer}.ui-filter-dropdown-search>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-filter-dropdown-search>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-filter-dropdown-search>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-filter-dropdown-search>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-filter-dropdown-search>.combobox.has-validations.is-valid{border-color:#28a745}.ui-filter-dropdown-search>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-filter-dropdown-search>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-filter-dropdown-search>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-filter-dropdown-search>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-filter-dropdown-search>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important}.ui-filter-dropdown-search>.dropdown-options .loading{background-color:#696969;padding:40px 30px;border-radius:0 0 .25rem .25rem}.ui-filter-dropdown-search>.dropdown-options .result-list{overflow-y:auto;overflow-x:hidden;max-height:300px}.ui-filter-dropdown-search>.dropdown-options .result-list .list-item{color:#000000de;cursor:pointer;text-decoration:none;padding:7px 10px;font-size:16px}.ui-filter-dropdown-search>.dropdown-options .result-list .list-item.active{color:#007bff}.ui-filter-dropdown-search>.dropdown-options .result-list .list-item:hover,.ui-filter-dropdown-search>.dropdown-options .result-list .list-item.focused{background:rgba(0,0,0,.04)}.ui-filter-dropdown-search>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.ui-filter-dropdown-search>.dropdown-options.drop-right{left:inherit;right:0}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: i0.IterableDiffers }];
    }, propDecorators: { model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }], placeholder: [{
                type: Input
            }], searchPlaceholder: [{
                type: Input
            }], emptyResultsMessage: [{
                type: Input
            }], clearSelectionButtonLabel: [{
                type: Input
            }], displayTextProperty: [{
                type: Input
            }], valueProperty: [{
                type: Input
            }], lazyLoadedData: [{
                type: Input
            }], minCharsToSearch: [{
                type: Input
            }], dropRight: [{
                type: Input
            }], onChange: [{
                type: Output
            }], onSearch: [{
                type: Output
            }], data: [{
                type: Input,
                args: ['data']
            }] } });

let identifier$i = 0;
class FilterMultiselectComponent extends ElementBase {
    constructor(validators, asyncValidators, config, iterableDiffers) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.iterableDiffers = iterableDiffers;
        this.placeholder = 'Select...';
        this.searchPlaceholder = 'Search...';
        this.displayTextProperty = 'text';
        this.valueProperty = 'value';
        this.emptyMessage = 'No results found.';
        this.selectAllButtonLabel = 'Select all';
        this.clearSelectionButtonLabel = 'Clear';
        this.dropRight = false;
        this.onChange = new EventEmitter();
        this.identifier = `input-multiselect-${identifier$i++}`;
        if (config.multiSelect) {
            Object.assign(this, config.multiSelect);
        }
        this._differModel = this.iterableDiffers.find([]).create(null);
        this._differOptions = this.iterableDiffers.find([]).create(null);
    }
    get options() {
        return this._options;
    }
    set options(value) {
        this._options = value;
        this.Init();
    }
    ngOnInit() {
        this.Init();
    }
    ngDoCheck() {
        let changesInModel = this._differModel.diff(this.value);
        let changesInOptions = this._differOptions.diff(this._options);
        if (changesInModel || (changesInOptions && !this.modelInitialized)) {
            this.Init();
        }
    }
    Init() {
        if (!this.value || !this.options || this.value.length == 0 || this.options.length == 0) {
            if ((!this.value || this.value.length == 0) && this.options) {
                this.ToggleAllItemsSelection(false, false);
            }
            return;
        }
        for (let i = 0; i < this.options.length; i++) {
            this.options[i].selected = this.value.filter(x => this.options[i][this.valueProperty] == x[this.valueProperty]).length > 0;
        }
        this.modelInitialized = true;
    }
    ToggleDropDown(event, value) {
        if ((value == false && !this.showOptions) || (value == undefined && this.disabled))
            return;
        if (value == undefined) {
            if (this.showOptions) {
                this.setComboTouched();
            }
            this.showOptions = !this.showOptions;
        }
        else {
            if (!value && this.showOptions) {
                this.setComboTouched();
            }
            this.showOptions = value;
        }
        this.clearSearch();
    }
    ToggleItemSelected(item) {
        if (this.disabled) {
            return;
        }
        item.selected = !item.selected;
        this.updateModel();
        this.onChange.emit();
    }
    ToggleAllItemsSelection(value, emitChanges) {
        if (this.disabled) {
            return;
        }
        if (!this.options || this.options.length == 0)
            return;
        for (let i = 0; i < this.options.length; i++) {
            this.options[i].selected = value;
        }
        this.updateModel();
        this.clearSearch();
        if (emitChanges)
            this.onChange.emit();
    }
    ItemSelectedCheckChanged() {
        if (this.disabled) {
            return;
        }
        this.updateModel();
        this.onChange.emit();
    }
    RemoveItem(item, index, event) {
        if (this.disabled || !this.options || this.options.length == 0) {
            return;
        }
        let itemToRemove = this.options.find(x => x[this.valueProperty] == item[this.valueProperty]);
        if (itemToRemove) {
            this.ToggleItemSelected(itemToRemove);
            this.clearSearch();
        }
        else {
            this.value.splice(index, 1);
        }
        event.stopPropagation();
    }
    OnComboPressed(event) {
        if (event.keyCode == 13) {
            this.ToggleDropDown(null);
            event.preventDefault();
        }
    }
    clearSearch() {
        this.search = '';
    }
    updateModel() {
        if (!this.options || this.options.length == 0) {
            this.value = [];
            return;
        }
        this.value = this.options.filter(x => x.selected);
    }
    setComboTouched() {
        this.comboTouched = true;
    }
}
FilterMultiselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterMultiselectComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
FilterMultiselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: FilterMultiselectComponent, selector: "filter-multiselect", inputs: { placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", displayTextProperty: "displayTextProperty", valueProperty: "valueProperty", emptyMessage: "emptyMessage", selectAllButtonLabel: "selectAllButtonLabel", clearSelectionButtonLabel: "clearSelectionButtonLabel", dropRight: "dropRight", options: "options" }, outputs: { onChange: "onChange" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: FilterMultiselectComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-filter-multiselect\">\n    <input type=\"hidden\" [(ngModel)]=\"value\" />\n\n    <div class=\"combobox d-flex align-items-center justify-content-between\" \n        [ngClass]=\"{\n            'open': showOptions, \n            'disabled': disabled,\n            'has-value': value?.length > 0\n        }\"\n        (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n        <span class=\"mr-2\" *ngIf=\"value?.length > 0\"><b>{{label}}</b>: </span>\n\n        <span *ngIf=\"!value || value.length == 0\">{{label}}</span>\n\n        <div *ngIf=\"value?.length > 0\" class=\"selected-items d-flex align-items-center\">\n            <span *ngFor=\"let item of value | slice:0:1; let i = index;\">\n                <small class=\"text-muted text-truncate ml-1\">{{item[displayTextProperty]}}</small>\n            </span>\n            <small class=\"text-muted\" *ngIf=\"value.length > 1\">... (+{{value.length - 1}})</small>\n        </div>\n\n        <i class=\"fa\" [ngClass]=\"{'fa-angle-down': !showOptions, 'fa-angle-up': showOptions}\"></i>\n    </div>\n\n    <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showOptions\" (clickOutside)=\"ToggleDropDown($event, false)\" \n        [ngClass]=\"{\n            'drop-right': dropRight\n        }\">\n        \n        <div class=\"options-container\" *ngIf=\"options?.length > 0\">\n            <div class=\"toolbar d-flex align-items-center\">\n                <input type=\"text\" class=\"form-control flex-grow-1\" name=\"{{identifier}}-search\" [(ngModel)]=\"search\" placeholder=\"{{searchPlaceholder}}\" auto-focus />\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ToggleAllItemsSelection(true, true)\" [disabled]=\"disabled\"><i class=\"fa fa-check-square\"></i> {{selectAllButtonLabel}}</button>\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ToggleAllItemsSelection(false, true)\" [disabled]=\"disabled\"><i class=\"fa fa-eraser\"></i> {{clearSelectionButtonLabel}}</button>\n            </div>\n\n            <ul>\n                <li class=\"d-flex\" *ngFor=\"let item of options | searchBy : displayTextProperty : search\" [ngClass]=\"{'selected': item.selected}\">\n                    <div class=\"checkbox mr-3 flex-shrink-0\">\n                        <input type=\"checkbox\" name=\"{{identifier}}-option\" [(ngModel)]=\"item.selected\" (change)=\"ItemSelectedCheckChanged()\" [disabled]=\"disabled\" />\n                    </div>\n                    <span class=\"link\" (click)=\"ToggleItemSelected(item)\">{{item[displayTextProperty]}}</span>\n                </li>\n            </ul>\n\n            <small class=\"empty-results\" *ngIf=\"(options | searchBy : displayTextProperty : search).length == 0\">{{emptyMessage}}</small>\n        </div>\n\n        <small class=\"empty-results\" *ngIf=\"!options || options.length == 0\">{{emptyMessage}}</small>\n    </div>\n</div>", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-filter-multiselect{position:relative}.ui-filter-multiselect *{-webkit-user-select:none;user-select:none}.ui-filter-multiselect>.combobox{outline:none;padding:.375rem .475rem;width:-moz-fit-content;width:fit-content}.ui-filter-multiselect>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-filter-multiselect>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-filter-multiselect>.combobox .selected-items{margin-left:-5px;overflow:hidden}.ui-filter-multiselect>.combobox .selected-items .badge{margin-right:3px;line-height:1;color:#888;background-color:#e0e0e0;border-bottom:2px solid #ccc;border-left:2px solid #ccc;padding:5px 7px 4px}.ui-filter-multiselect>.combobox .selected-items .badge>span{display:inline-block;max-width:150px}.ui-filter-multiselect>.combobox .selected-items .badge:hover{cursor:pointer;color:#fff;background-color:#007bff;border-bottom:2px solid #00559a;border-left:2px solid #00559a}.ui-filter-multiselect>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-filter-multiselect>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-filter-multiselect>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-filter-multiselect>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-filter-multiselect>.combobox.has-validations.is-valid{border-color:#28a745}.ui-filter-multiselect>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-filter-multiselect .combobox:hover{cursor:pointer}.ui-filter-multiselect>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-filter-multiselect>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-filter-multiselect>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-filter-multiselect>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important;min-width:0}.ui-filter-multiselect>.dropdown-options ul{max-height:300px;overflow-y:scroll;overflow-x:hidden;margin:0;padding:0}.ui-filter-multiselect>.dropdown-options ul li{list-style:none;border-bottom:1px solid #ced4da}.ui-filter-multiselect>.dropdown-options ul li>.checkbox{background-color:#f0f0f0;border-right:1px solid #ced4da;padding:12px 15px;display:flex;align-items:center}.ui-filter-multiselect>.dropdown-options ul li>.checkbox input[type=checkbox]{width:17px;height:17px}.ui-filter-multiselect>.dropdown-options ul li>span{cursor:pointer;padding:8px 0}.ui-filter-multiselect>.dropdown-options ul li.selected{color:#007bff}.ui-filter-multiselect>.dropdown-options ul li:hover{background-color:#f9f9f9}.ui-filter-multiselect>.dropdown-options ul li:last-child{border-bottom:0}.ui-filter-multiselect>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.ui-filter-multiselect>.dropdown-options.drop-right{left:inherit;right:0}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: AutoFocusDirective, selector: "[auto-focus]" }, { kind: "pipe", type: i1$1.SlicePipe, name: "slice" }, { kind: "pipe", type: SearchByPipe, name: "searchBy" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: FilterMultiselectComponent, decorators: [{
            type: Component,
            args: [{ selector: 'filter-multiselect', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: FilterMultiselectComponent,
                            multi: true
                        }], template: "<div [id]=\"identifier\" class=\"ui-filter-multiselect\">\n    <input type=\"hidden\" [(ngModel)]=\"value\" />\n\n    <div class=\"combobox d-flex align-items-center justify-content-between\" \n        [ngClass]=\"{\n            'open': showOptions, \n            'disabled': disabled,\n            'has-value': value?.length > 0\n        }\"\n        (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n        <span class=\"mr-2\" *ngIf=\"value?.length > 0\"><b>{{label}}</b>: </span>\n\n        <span *ngIf=\"!value || value.length == 0\">{{label}}</span>\n\n        <div *ngIf=\"value?.length > 0\" class=\"selected-items d-flex align-items-center\">\n            <span *ngFor=\"let item of value | slice:0:1; let i = index;\">\n                <small class=\"text-muted text-truncate ml-1\">{{item[displayTextProperty]}}</small>\n            </span>\n            <small class=\"text-muted\" *ngIf=\"value.length > 1\">... (+{{value.length - 1}})</small>\n        </div>\n\n        <i class=\"fa\" [ngClass]=\"{'fa-angle-down': !showOptions, 'fa-angle-up': showOptions}\"></i>\n    </div>\n\n    <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showOptions\" (clickOutside)=\"ToggleDropDown($event, false)\" \n        [ngClass]=\"{\n            'drop-right': dropRight\n        }\">\n        \n        <div class=\"options-container\" *ngIf=\"options?.length > 0\">\n            <div class=\"toolbar d-flex align-items-center\">\n                <input type=\"text\" class=\"form-control flex-grow-1\" name=\"{{identifier}}-search\" [(ngModel)]=\"search\" placeholder=\"{{searchPlaceholder}}\" auto-focus />\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ToggleAllItemsSelection(true, true)\" [disabled]=\"disabled\"><i class=\"fa fa-check-square\"></i> {{selectAllButtonLabel}}</button>\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ToggleAllItemsSelection(false, true)\" [disabled]=\"disabled\"><i class=\"fa fa-eraser\"></i> {{clearSelectionButtonLabel}}</button>\n            </div>\n\n            <ul>\n                <li class=\"d-flex\" *ngFor=\"let item of options | searchBy : displayTextProperty : search\" [ngClass]=\"{'selected': item.selected}\">\n                    <div class=\"checkbox mr-3 flex-shrink-0\">\n                        <input type=\"checkbox\" name=\"{{identifier}}-option\" [(ngModel)]=\"item.selected\" (change)=\"ItemSelectedCheckChanged()\" [disabled]=\"disabled\" />\n                    </div>\n                    <span class=\"link\" (click)=\"ToggleItemSelected(item)\">{{item[displayTextProperty]}}</span>\n                </li>\n            </ul>\n\n            <small class=\"empty-results\" *ngIf=\"(options | searchBy : displayTextProperty : search).length == 0\">{{emptyMessage}}</small>\n        </div>\n\n        <small class=\"empty-results\" *ngIf=\"!options || options.length == 0\">{{emptyMessage}}</small>\n    </div>\n</div>", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-filter-multiselect{position:relative}.ui-filter-multiselect *{-webkit-user-select:none;user-select:none}.ui-filter-multiselect>.combobox{outline:none;padding:.375rem .475rem;width:-moz-fit-content;width:fit-content}.ui-filter-multiselect>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-filter-multiselect>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-filter-multiselect>.combobox .selected-items{margin-left:-5px;overflow:hidden}.ui-filter-multiselect>.combobox .selected-items .badge{margin-right:3px;line-height:1;color:#888;background-color:#e0e0e0;border-bottom:2px solid #ccc;border-left:2px solid #ccc;padding:5px 7px 4px}.ui-filter-multiselect>.combobox .selected-items .badge>span{display:inline-block;max-width:150px}.ui-filter-multiselect>.combobox .selected-items .badge:hover{cursor:pointer;color:#fff;background-color:#007bff;border-bottom:2px solid #00559a;border-left:2px solid #00559a}.ui-filter-multiselect>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-filter-multiselect>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-filter-multiselect>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-filter-multiselect>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-filter-multiselect>.combobox.has-validations.is-valid{border-color:#28a745}.ui-filter-multiselect>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-filter-multiselect .combobox:hover{cursor:pointer}.ui-filter-multiselect>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-filter-multiselect>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-filter-multiselect>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-filter-multiselect>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important;min-width:0}.ui-filter-multiselect>.dropdown-options ul{max-height:300px;overflow-y:scroll;overflow-x:hidden;margin:0;padding:0}.ui-filter-multiselect>.dropdown-options ul li{list-style:none;border-bottom:1px solid #ced4da}.ui-filter-multiselect>.dropdown-options ul li>.checkbox{background-color:#f0f0f0;border-right:1px solid #ced4da;padding:12px 15px;display:flex;align-items:center}.ui-filter-multiselect>.dropdown-options ul li>.checkbox input[type=checkbox]{width:17px;height:17px}.ui-filter-multiselect>.dropdown-options ul li>span{cursor:pointer;padding:8px 0}.ui-filter-multiselect>.dropdown-options ul li.selected{color:#007bff}.ui-filter-multiselect>.dropdown-options ul li:hover{background-color:#f9f9f9}.ui-filter-multiselect>.dropdown-options ul li:last-child{border-bottom:0}.ui-filter-multiselect>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.ui-filter-multiselect>.dropdown-options.drop-right{left:inherit;right:0}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: i0.IterableDiffers }];
    }, propDecorators: { placeholder: [{
                type: Input
            }], searchPlaceholder: [{
                type: Input
            }], displayTextProperty: [{
                type: Input
            }], valueProperty: [{
                type: Input
            }], emptyMessage: [{
                type: Input
            }], selectAllButtonLabel: [{
                type: Input
            }], clearSelectionButtonLabel: [{
                type: Input
            }], dropRight: [{
                type: Input
            }], onChange: [{
                type: Output
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }], options: [{
                type: Input,
                args: ['options']
            }] } });

let identifier$h = 0;
class InputCheckboxComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.identifier = `input-checkbox-${identifier$h++}`;
    }
}
InputCheckboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputCheckboxComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputCheckboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputCheckboxComponent, selector: "input-checkbox", providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputCheckboxComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"checkbox\">\n  <label>\n    <input type=\"checkbox\" \n      [disabled]=\"disabled\" \n      [(ngModel)]=\"value\"\n      [id]=\"identifier\"> {{label}}\n  </label>\n</div>", dependencies: [{ kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputCheckboxComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-checkbox', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputCheckboxComponent,
                            multi: true
                        }], template: "<div class=\"checkbox\">\n  <label>\n    <input type=\"checkbox\" \n      [disabled]=\"disabled\" \n      [(ngModel)]=\"value\"\n      [id]=\"identifier\"> {{label}}\n  </label>\n</div>" }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

class InputValidationsComponent {
}
InputValidationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputValidationsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
InputValidationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputValidationsComponent, selector: "input-validations", inputs: { messages: "messages" }, ngImport: i0, template: "<div class=\"invalid-feedback\">\n  <div *ngFor=\"let message of messages\">{{message}}</div>\n</div>", styles: [".invalid-feedback{display:block}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputValidationsComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-validations', template: "<div class=\"invalid-feedback\">\n  <div *ngFor=\"let message of messages\">{{message}}</div>\n</div>", styles: [".invalid-feedback{display:block}\n"] }]
        }], propDecorators: { messages: [{
                type: Input
            }] } });

let CURRENCY_MASK_CONFIG = new InjectionToken("currency.mask.config");

class InputManager {
    constructor(htmlInputElement) {
        this.htmlInputElement = htmlInputElement;
    }
    setCursorAt(position) {
        if (this.htmlInputElement.setSelectionRange) {
            this.htmlInputElement.focus();
            this.htmlInputElement.setSelectionRange(position, position);
        }
        else if (this.htmlInputElement.createTextRange) {
            let textRange = this.htmlInputElement.createTextRange();
            textRange.collapse(true);
            textRange.moveEnd("character", position);
            textRange.moveStart("character", position);
            textRange.select();
        }
    }
    updateValueAndCursor(newRawValue, oldLength, selectionStart) {
        this.rawValue = newRawValue;
        let newLength = newRawValue.length;
        selectionStart = selectionStart - (oldLength - newLength);
        this.setCursorAt(selectionStart);
    }
    get canInputMoreNumbers() {
        let haventReachedMaxLength = !(this.rawValue.length >= this.htmlInputElement.maxLength && this.htmlInputElement.maxLength >= 0);
        let selectionStart = this.inputSelection.selectionStart;
        let selectionEnd = this.inputSelection.selectionEnd;
        let haveNumberSelected = (selectionStart != selectionEnd && this.htmlInputElement.value.substring(selectionStart, selectionEnd).match(/\d/)) ? true : false;
        let startWithZero = (this.htmlInputElement.value.substring(0, 1) == "0");
        return haventReachedMaxLength || haveNumberSelected || startWithZero;
    }
    get inputSelection() {
        let selectionStart = 0;
        let selectionEnd = 0;
        if (typeof this.htmlInputElement.selectionStart == "number" && typeof this.htmlInputElement.selectionEnd == "number") {
            selectionStart = this.htmlInputElement.selectionStart;
            selectionEnd = this.htmlInputElement.selectionEnd;
        }
        else {
            let range = document.getSelection().anchorNode;
            if (range && range.firstChild == this.htmlInputElement) {
                let lenght = this.htmlInputElement.value.length;
                let normalizedValue = this.htmlInputElement.value.replace(/\r\n/g, "\n");
                let startRange = this.htmlInputElement.createTextRange();
                let endRange = this.htmlInputElement.createTextRange();
                endRange.collapse(false);
                if (startRange.compareEndPoints("StartToEnd", endRange) > -1) {
                    selectionStart = selectionEnd = lenght;
                }
                else {
                    selectionStart = -startRange.moveStart("character", -lenght);
                    selectionStart += normalizedValue.slice(0, selectionStart).split("\n").length - 1;
                    if (startRange.compareEndPoints("EndToEnd", endRange) > -1) {
                        selectionEnd = lenght;
                    }
                    else {
                        selectionEnd = -startRange.moveEnd("character", -lenght);
                        selectionEnd += normalizedValue.slice(0, selectionEnd).split("\n").length - 1;
                    }
                }
            }
        }
        return {
            selectionStart: selectionStart,
            selectionEnd: selectionEnd
        };
    }
    get rawValue() {
        return this.htmlInputElement && this.htmlInputElement.value;
    }
    set rawValue(value) {
        this._storedRawValue = value;
        if (this.htmlInputElement) {
            this.htmlInputElement.value = value;
        }
    }
    get storedRawValue() {
        return this._storedRawValue;
    }
}

class InputService {
    constructor(htmlInputElement, options) {
        this.htmlInputElement = htmlInputElement;
        this.options = options;
        this.inputManager = new InputManager(htmlInputElement);
    }
    addNumber(keyCode) {
        if (!this.rawValue) {
            this.rawValue = this.applyMask(false, "0");
        }
        let keyChar = String.fromCharCode(keyCode);
        let selectionStart = this.inputSelection.selectionStart;
        let selectionEnd = this.inputSelection.selectionEnd;
        this.rawValue = this.rawValue.substring(0, selectionStart) + keyChar + this.rawValue.substring(selectionEnd, this.rawValue.length);
        this.updateFieldValue(selectionStart + 1);
    }
    applyMask(isNumber, rawValue) {
        let { allowNegative, decimal, precision, prefix, suffix, thousands } = this.options;
        rawValue = isNumber ? new Number(rawValue).toFixed(precision) : rawValue;
        let onlyNumbers = rawValue.replace(/[^0-9]/g, "");
        if (!onlyNumbers) {
            return "";
        }
        let integerPart = onlyNumbers.slice(0, onlyNumbers.length - precision).replace(/^0*/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, thousands);
        if (integerPart == "") {
            integerPart = "0";
        }
        let newRawValue = integerPart;
        let decimalPart = onlyNumbers.slice(onlyNumbers.length - precision);
        if (precision > 0) {
            decimalPart = "0".repeat(precision - decimalPart.length) + decimalPart;
            newRawValue += decimal + decimalPart;
        }
        let isZero = parseInt(integerPart) == 0 && (parseInt(decimalPart) == 0 || decimalPart == "");
        let operator = (rawValue.indexOf("-") > -1 && allowNegative && !isZero) ? "-" : "";
        return operator + prefix + newRawValue + suffix;
    }
    clearMask(rawValue) {
        if (rawValue == null || rawValue == "") {
            return null;
        }
        let value = rawValue.replace(this.options.prefix, "").replace(this.options.suffix, "");
        if (this.options.thousands) {
            value = value.replace(new RegExp("\\" + this.options.thousands, "g"), "");
        }
        if (this.options.decimal) {
            value = value.replace(this.options.decimal, ".");
        }
        return parseFloat(value);
    }
    changeToNegative() {
        if (this.options.allowNegative && this.rawValue != "" && this.rawValue.charAt(0) != "-" && this.value != 0) {
            let selectionStart = this.inputSelection.selectionStart;
            this.rawValue = "-" + this.rawValue;
            this.updateFieldValue(selectionStart + 1);
        }
    }
    changeToPositive() {
        let selectionStart = this.inputSelection.selectionStart;
        this.rawValue = this.rawValue.replace("-", "");
        this.updateFieldValue(selectionStart - 1);
    }
    fixCursorPosition(forceToEndPosition) {
        let currentCursorPosition = this.inputSelection.selectionStart;
        //if the current cursor position is after the number end position, it is moved to the end of the number, ignoring the prefix or suffix. this behavior can be forced with forceToEndPosition flag
        if (currentCursorPosition > this.getRawValueWithoutSuffixEndPosition() || forceToEndPosition) {
            this.inputManager.setCursorAt(this.getRawValueWithoutSuffixEndPosition());
            //if the current cursor position is before the number start position, it is moved to the start of the number, ignoring the prefix or suffix
        }
        else if (currentCursorPosition < this.getRawValueWithoutPrefixStartPosition()) {
            this.inputManager.setCursorAt(this.getRawValueWithoutPrefixStartPosition());
        }
    }
    getRawValueWithoutSuffixEndPosition() {
        return this.rawValue.length - this.options.suffix.length;
    }
    getRawValueWithoutPrefixStartPosition() {
        return this.value != null && this.value < 0 ? this.options.prefix.length + 1 : this.options.prefix.length;
    }
    removeNumber(keyCode) {
        let { decimal, thousands } = this.options;
        let selectionEnd = this.inputSelection.selectionEnd;
        let selectionStart = this.inputSelection.selectionStart;
        if (selectionStart > this.rawValue.length - this.options.suffix.length) {
            selectionEnd = this.rawValue.length - this.options.suffix.length;
            selectionStart = this.rawValue.length - this.options.suffix.length;
        }
        //there is no selection
        if (selectionEnd == selectionStart) {
            //delete key and the target digit is a number
            if ((keyCode == 46 || keyCode == 63272) && /^\d+$/.test(this.rawValue.substring(selectionStart, selectionEnd + 1))) {
                selectionEnd = selectionEnd + 1;
            }
            //delete key and the target digit is the decimal or thousands divider
            if ((keyCode == 46 || keyCode == 63272) && (this.rawValue.substring(selectionStart, selectionEnd + 1) == decimal || this.rawValue.substring(selectionStart, selectionEnd + 1) == thousands)) {
                selectionEnd = selectionEnd + 2;
                selectionStart = selectionStart + 1;
            }
            //backspace key and the target digit is a number
            if (keyCode == 8 && /^\d+$/.test(this.rawValue.substring(selectionStart - 1, selectionEnd))) {
                selectionStart = selectionStart - 1;
            }
            //backspace key and the target digit is the decimal or thousands divider
            if (keyCode == 8 && (this.rawValue.substring(selectionStart - 1, selectionEnd) == decimal || this.rawValue.substring(selectionStart - 1, selectionEnd) == thousands)) {
                selectionStart = selectionStart - 2;
                selectionEnd = selectionEnd - 1;
            }
        }
        this.rawValue = this.rawValue.substring(0, selectionStart) + this.rawValue.substring(selectionEnd, this.rawValue.length);
        this.updateFieldValue(selectionStart);
    }
    updateFieldValue(selectionStart) {
        let newRawValue = this.applyMask(false, this.rawValue || "");
        selectionStart = selectionStart == undefined ? this.rawValue.length : selectionStart;
        this.inputManager.updateValueAndCursor(newRawValue, this.rawValue.length, selectionStart);
    }
    updateOptions(options) {
        let value = this.value;
        this.options = options;
        this.value = value;
    }
    get canInputMoreNumbers() {
        return this.inputManager.canInputMoreNumbers;
    }
    get inputSelection() {
        return this.inputManager.inputSelection;
    }
    get rawValue() {
        return this.inputManager.rawValue;
    }
    set rawValue(value) {
        this.inputManager.rawValue = value;
    }
    get storedRawValue() {
        return this.inputManager.storedRawValue;
    }
    get value() {
        return this.clearMask(this.rawValue);
    }
    set value(value) {
        this.rawValue = this.applyMask(true, "" + value);
    }
}

class InputHandler {
    constructor(htmlInputElement, options) {
        this.inputService = new InputService(htmlInputElement, options);
        this.htmlInputElement = htmlInputElement;
    }
    handleClick(event, chromeAndroid) {
        let selectionRangeLength = Math.abs(this.inputService.inputSelection.selectionEnd - this.inputService.inputSelection.selectionStart);
        //if there is no selection and the value is not null, the cursor position will be fixed. if the browser is chrome on android, the cursor will go to the end of the number.
        if (selectionRangeLength == 0 && !isNaN(this.inputService.value)) {
            this.inputService.fixCursorPosition(chromeAndroid);
        }
    }
    handleCut(event) {
        if (this.isReadOnly()) {
            return;
        }
        setTimeout(() => {
            this.inputService.updateFieldValue();
            this.setValue(this.inputService.value);
            this.onModelChange(this.inputService.value);
        }, 0);
    }
    handleInput(event) {
        if (this.isReadOnly()) {
            return;
        }
        let keyCode = this.getNewKeyCode(this.inputService.storedRawValue, this.inputService.rawValue);
        let rawValueLength = this.inputService.rawValue.length;
        let rawValueSelectionEnd = this.inputService.inputSelection.selectionEnd;
        let rawValueWithoutSuffixEndPosition = this.inputService.getRawValueWithoutSuffixEndPosition();
        let storedRawValueLength = this.inputService.storedRawValue.length;
        this.inputService.rawValue = this.inputService.storedRawValue;
        if ((rawValueSelectionEnd != rawValueWithoutSuffixEndPosition || Math.abs(rawValueLength - storedRawValueLength) != 1) && storedRawValueLength != 0) {
            this.setCursorPosition(event);
            return;
        }
        if (rawValueLength < storedRawValueLength) {
            if (this.inputService.value != 0) {
                this.inputService.removeNumber(8);
            }
            else {
                this.setValue(null);
            }
        }
        if (rawValueLength > storedRawValueLength) {
            switch (keyCode) {
                case 43:
                    this.inputService.changeToPositive();
                    break;
                case 45:
                    this.inputService.changeToNegative();
                    break;
                default:
                    if (!this.inputService.canInputMoreNumbers || (isNaN(this.inputService.value) && String.fromCharCode(keyCode).match(/\d/) == null)) {
                        return;
                    }
                    this.inputService.addNumber(keyCode);
            }
        }
        this.setCursorPosition(event);
        this.onModelChange(this.inputService.value);
    }
    handleKeydown(event) {
        if (this.isReadOnly()) {
            return;
        }
        let keyCode = event.which || event.charCode || event.keyCode;
        if (keyCode == 8 || keyCode == 46 || keyCode == 63272) {
            event.preventDefault();
            let selectionRangeLength = Math.abs(this.inputService.inputSelection.selectionEnd - this.inputService.inputSelection.selectionStart);
            if (selectionRangeLength == this.inputService.rawValue.length || this.inputService.value == 0) {
                this.setValue(null);
                this.onModelChange(this.inputService.value);
            }
            if (selectionRangeLength == 0 && !isNaN(this.inputService.value)) {
                this.inputService.removeNumber(keyCode);
                this.onModelChange(this.inputService.value);
            }
            if ((keyCode === 8 || keyCode === 46) && selectionRangeLength != 0 && !isNaN(this.inputService.value)) {
                this.inputService.removeNumber(keyCode);
                this.onModelChange(this.inputService.value);
            }
        }
    }
    handleKeypress(event) {
        if (this.isReadOnly()) {
            return;
        }
        let keyCode = event.which || event.charCode || event.keyCode;
        if (keyCode == undefined || [9, 13].indexOf(keyCode) != -1 || this.isArrowEndHomeKeyInFirefox(event)) {
            return;
        }
        switch (keyCode) {
            case 43:
                this.inputService.changeToPositive();
                break;
            case 45:
                this.inputService.changeToNegative();
                break;
            default:
                if (this.inputService.canInputMoreNumbers && (!isNaN(this.inputService.value) || String.fromCharCode(keyCode).match(/\d/) != null)) {
                    this.inputService.addNumber(keyCode);
                }
        }
        event.preventDefault();
        this.onModelChange(this.inputService.value);
    }
    handleKeyup(event) {
        this.inputService.fixCursorPosition();
    }
    handlePaste(event) {
        if (this.isReadOnly()) {
            return;
        }
        setTimeout(() => {
            this.inputService.updateFieldValue();
            this.setValue(this.inputService.value);
            this.onModelChange(this.inputService.value);
        }, 1);
    }
    updateOptions(options) {
        this.inputService.updateOptions(options);
    }
    getOnModelChange() {
        return this.onModelChange;
    }
    setOnModelChange(callbackFunction) {
        this.onModelChange = callbackFunction;
    }
    getOnModelTouched() {
        return this.onModelTouched;
    }
    setOnModelTouched(callbackFunction) {
        this.onModelTouched = callbackFunction;
    }
    setValue(value) {
        this.inputService.value = value;
    }
    getNewKeyCode(oldString, newString) {
        if (oldString.length > newString.length) {
            return null;
        }
        for (let x = 0; x < newString.length; x++) {
            if (oldString.length == x || oldString[x] != newString[x]) {
                return newString.charCodeAt(x);
            }
        }
    }
    isArrowEndHomeKeyInFirefox(event) {
        if ([35, 36, 37, 38, 39, 40].indexOf(event.keyCode) != -1 && (event.charCode == undefined || event.charCode == 0)) {
            return true;
        }
        return false;
    }
    isReadOnly() {
        return this.htmlInputElement && this.htmlInputElement.readOnly;
    }
    setCursorPosition(event) {
        let rawValueWithoutSuffixEndPosition = this.inputService.getRawValueWithoutSuffixEndPosition();
        setTimeout(function () {
            event.target.setSelectionRange(rawValueWithoutSuffixEndPosition, rawValueWithoutSuffixEndPosition);
        }, 0);
    }
}

const CURRENCYMASKDIRECTIVE_VALUE_ACCESSOR = {
    provide: NG_VALUE_ACCESSOR,
    useExisting: forwardRef(() => CurrencyMaskDirective),
    multi: true
};
class CurrencyMaskDirective {
    constructor(config, currencyMaskConfig, elementRef, keyValueDiffers) {
        this.config = config;
        this.currencyMaskConfig = currencyMaskConfig;
        this.elementRef = elementRef;
        this.keyValueDiffers = keyValueDiffers;
        this.options = {};
        this.optionsTemplate = {
            align: "right",
            allowNegative: true,
            decimal: ".",
            precision: 2,
            prefix: "",
            suffix: "",
            thousands: ","
        };
        this.optionsTemplate = currencyMaskConfig || {};
        this.optionsTemplate.decimal = config.currency.decimal;
        this.optionsTemplate.thousands = config.currency.thousands;
        this.optionsTemplate.precision = this.options.precision || config.currency.precision;
        this.optionsTemplate.allowNegative = config.currency.allowNegative;
        this.optionsTemplate.prefix = config.currency.prefix;
        this.optionsTemplate.suffix = config.currency.suffix;
        this.optionsTemplate.align = config.currency.align;
        this.keyValueDiffer = keyValueDiffers.find({}).create();
    }
    ngAfterViewInit() {
        this.elementRef.nativeElement.style.textAlign = this.options.align ? this.options.align : this.optionsTemplate.align;
    }
    ngDoCheck() {
        if (this.keyValueDiffer.diff(this.options)) {
            this.elementRef.nativeElement.style.textAlign = this.options.align ? this.options.align : this.optionsTemplate.align;
            this.inputHandler.updateOptions(Object.assign({}, this.optionsTemplate, this.options));
        }
    }
    ngOnInit() {
        this.inputHandler = new InputHandler(this.elementRef.nativeElement, Object.assign({}, this.optionsTemplate, this.options));
    }
    handleBlur(event) {
        this.inputHandler.getOnModelTouched().apply(event);
    }
    handleClick(event) {
        this.inputHandler.handleClick(event, this.isChromeAndroid());
    }
    handleCut(event) {
        if (!this.isChromeAndroid()) {
            this.inputHandler.handleCut(event);
        }
    }
    handleInput(event) {
        if (this.isChromeAndroid()) {
            this.inputHandler.handleInput(event);
        }
    }
    handleKeydown(event) {
        if (!this.isChromeAndroid()) {
            this.inputHandler.handleKeydown(event);
        }
    }
    handleKeypress(event) {
        if (!this.isChromeAndroid()) {
            this.inputHandler.handleKeypress(event);
        }
    }
    handleKeyup(event) {
        if (!this.isChromeAndroid()) {
            this.inputHandler.handleKeyup(event);
        }
    }
    handlePaste(event) {
        if (!this.isChromeAndroid()) {
            this.inputHandler.handlePaste(event);
        }
    }
    isChromeAndroid() {
        return /chrome/i.test(navigator.userAgent) && /android/i.test(navigator.userAgent);
    }
    registerOnChange(callbackFunction) {
        this.inputHandler.setOnModelChange(callbackFunction);
    }
    registerOnTouched(callbackFunction) {
        this.inputHandler.setOnModelTouched(callbackFunction);
    }
    setDisabledState(value) {
        this.elementRef.nativeElement.disabled = value;
    }
    validate(abstractControl) {
        let result = {};
        if (abstractControl.value > this.max) {
            result.max = true;
        }
        if (abstractControl.value < this.min) {
            result.min = true;
        }
        return result;
    }
    writeValue(value) {
        this.inputHandler.setValue(value);
    }
}
CurrencyMaskDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrencyMaskDirective, deps: [{ token: INPUT_FORMS_CONFIG }, { token: CURRENCY_MASK_CONFIG, optional: true }, { token: i0.ElementRef }, { token: i0.KeyValueDiffers }], target: i0.ɵɵFactoryTarget.Directive });
CurrencyMaskDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: CurrencyMaskDirective, selector: "[currencyMask]", inputs: { max: "max", min: "min", options: "options" }, host: { listeners: { "blur": "handleBlur($event)", "click": "handleClick($event)", "cut": "handleCut($event)", "input": "handleInput($event)", "keydown": "handleKeydown($event)", "keypress": "handleKeypress($event)", "keyup": "handleKeyup($event)", "paste": "handlePaste($event)" } }, providers: [
        CURRENCYMASKDIRECTIVE_VALUE_ACCESSOR,
        { provide: NG_VALIDATORS, useExisting: CurrencyMaskDirective, multi: true }
    ], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: CurrencyMaskDirective, decorators: [{
            type: Directive,
            args: [{
                    selector: "[currencyMask]",
                    providers: [
                        CURRENCYMASKDIRECTIVE_VALUE_ACCESSOR,
                        { provide: NG_VALIDATORS, useExisting: CurrencyMaskDirective, multi: true }
                    ]
                }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [CURRENCY_MASK_CONFIG]
                    }] }, { type: i0.ElementRef }, { type: i0.KeyValueDiffers }];
    }, propDecorators: { max: [{
                type: Input
            }], min: [{
                type: Input
            }], options: [{
                type: Input
            }], handleBlur: [{
                type: HostListener,
                args: ["blur", ["$event"]]
            }], handleClick: [{
                type: HostListener,
                args: ["click", ["$event"]]
            }], handleCut: [{
                type: HostListener,
                args: ["cut", ["$event"]]
            }], handleInput: [{
                type: HostListener,
                args: ["input", ["$event"]]
            }], handleKeydown: [{
                type: HostListener,
                args: ["keydown", ["$event"]]
            }], handleKeypress: [{
                type: HostListener,
                args: ["keypress", ["$event"]]
            }], handleKeyup: [{
                type: HostListener,
                args: ["keyup", ["$event"]]
            }], handlePaste: [{
                type: HostListener,
                args: ["paste", ["$event"]]
            }] } });

let identifier$g = 0;
class InputCurrencyComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.showInputGroup = true;
        this.placeholder = '';
        this.precision = 2;
        this.identifier = `input-currency-${identifier$g++}`;
        this.currencyCode = this.config.currency.currencyCode;
    }
    ngOnInit() { }
}
InputCurrencyComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputCurrencyComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputCurrencyComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputCurrencyComponent, selector: "input-currency", inputs: { showInputGroup: "showInputGroup", placeholder: "placeholder", precision: "precision" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputCurrencyComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"showInputGroup\">\n    <span class=\"input-group-text\">{{currencyCode | currencySymbol}}</span>\n  </div>\n  <input\n    currencyMask\n    autoSelectOnFocus\n    class=\"form-control\"\n    [placeholder]=\"placeholder\"\n    [autocomplete]=\"autocomplete\"\n    [options]=\"{ precision: precision }\"\n    [disabled]=\"disabled\" \n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\"\n  />\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n  \n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AutoSelectOnFocusDirective, selector: "input[autoSelectOnFocus]" }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "directive", type: CurrencyMaskDirective, selector: "[currencyMask]", inputs: ["max", "min", "options"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: CurrencySymbolPipe, name: "currencySymbol" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputCurrencyComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-currency', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputCurrencyComponent,
                            multi: true
                        }], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"showInputGroup\">\n    <span class=\"input-group-text\">{{currencyCode | currencySymbol}}</span>\n  </div>\n  <input\n    currencyMask\n    autoSelectOnFocus\n    class=\"form-control\"\n    [placeholder]=\"placeholder\"\n    [autocomplete]=\"autocomplete\"\n    [options]=\"{ precision: precision }\"\n    [disabled]=\"disabled\" \n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\"\n  />\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n  \n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n" }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { showInputGroup: [{
                type: Input
            }], placeholder: [{
                type: Input
            }], precision: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$f = 0;
class InputDateComponent extends ElementBase {
    constructor(validators, asyncValidators, config, localeService, domSanitizer) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.localeService = localeService;
        this.domSanitizer = domSanitizer;
        this.placeholder = '';
        this.format = 'MM/dd/yyyy';
        this.showInputGroup = true;
        this.placement = 'bottom';
        this.theme = 'theme-dark-blue';
        this.onChange = new EventEmitter();
        this.locale = 'en-gb';
        this.bsConfig = {
            containerClass: this.theme,
            customTodayClass: 'today',
        };
        this.identifier = `input-date-${identifier$f++}`;
        if (config.date) {
            Object.assign(this, config.date);
        }
    }
    ngOnInit() {
        this.localeService.use(this.locale);
        this.datepicker.setConfig();
        if (!this.inputGroupText) {
            this.inputGroupText = this.domSanitizer.bypassSecurityTrustHtml("<i class='fa fa-calendar' aria-hidden='true'></i>");
        }
        setTimeout(() => {
            this.handleInitialValue();
        });
    }
    ngDoCheck() {
        this.handleInitialValue();
    }
    onValueChange(value) {
        this.onChange.emit(value);
    }
    handleInitialValue() {
        if (this.value && (typeof this.value == "string" || this.value instanceof String)) {
            let data = new Date(this.value);
            data.setHours(0);
            data.setMinutes(0);
            data.setSeconds(0);
            data.setMilliseconds(0);
            this.writeValue(data);
        }
    }
}
InputDateComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputDateComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i1$4.BsLocaleService }, { token: i2$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
InputDateComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputDateComponent, selector: "input-date", inputs: { placeholder: "placeholder", minDate: "minDate", maxDate: "maxDate", format: "format", showInputGroup: "showInputGroup", inputGroupText: "inputGroupText", placement: "placement", theme: "theme" }, outputs: { onChange: "onChange" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputDateComponent,
            multi: true
        }], viewQueries: [{ propertyName: "datepicker", first: true, predicate: ["dp"], descendants: true, static: true }, { propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"showInputGroup\">\n    <span class=\"input-group-text\" [innerHtml]=\"inputGroupText\"></span>\n  </div>\n\n  <input type=\"text\" class=\"form-control\" [id]=\"identifier\" #dp=\"bsDatepicker\"\n    bsDatepicker\n    autocomplete=\"off\"\n    [minDate]=\"minDate\"\n    [maxDate]=\"maxDate\"\n    [placement]=\"placement\"\n    [placeholder]=\"placeholder\"\n    [disabled]=\"disabled\" \n    [bsConfig]=\"bsConfig\"\n    [(ngModel)]=\"value\"\n    (bsValueChange)=\"onValueChange($event)\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\">\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1$4.BsDatepickerDirective, selector: "[bsDatepicker]", inputs: ["placement", "triggers", "outsideClick", "container", "outsideEsc", "isOpen", "bsValue", "bsConfig", "isDisabled", "minDate", "maxDate", "minMode", "daysDisabled", "datesDisabled", "datesEnabled", "dateCustomClasses"], outputs: ["bsValueChange", "onShown", "onHidden"], exportAs: ["bsDatepicker"] }, { kind: "directive", type: i1$4.BsDatepickerInputDirective, selector: "input[bsDatepicker]" }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputDateComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-date', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputDateComponent,
                            multi: true
                        }], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"showInputGroup\">\n    <span class=\"input-group-text\" [innerHtml]=\"inputGroupText\"></span>\n  </div>\n\n  <input type=\"text\" class=\"form-control\" [id]=\"identifier\" #dp=\"bsDatepicker\"\n    bsDatepicker\n    autocomplete=\"off\"\n    [minDate]=\"minDate\"\n    [maxDate]=\"maxDate\"\n    [placement]=\"placement\"\n    [placeholder]=\"placeholder\"\n    [disabled]=\"disabled\" \n    [bsConfig]=\"bsConfig\"\n    [(ngModel)]=\"value\"\n    (bsValueChange)=\"onValueChange($event)\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\">\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n" }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: i1$4.BsLocaleService }, { type: i2$1.DomSanitizer }];
    }, propDecorators: { placeholder: [{
                type: Input
            }], minDate: [{
                type: Input
            }], maxDate: [{
                type: Input
            }], format: [{
                type: Input
            }], showInputGroup: [{
                type: Input
            }], inputGroupText: [{
                type: Input
            }], placement: [{
                type: Input
            }], theme: [{
                type: Input
            }], onChange: [{
                type: Output
            }], datepicker: [{
                type: ViewChild,
                args: ['dp', { static: true }]
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$e = 0;
class InputDropdownGridComponent extends ElementBase {
    constructor(validators, asyncValidators, config, iterableDiffers) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.iterableDiffers = iterableDiffers;
        this.clickOutsideEnabled = true;
        this.placeholder = 'Select...';
        this.searchPlaceholder = 'Search...';
        this.itemsPerPage = 5;
        this.maxSize = 5;
        this.showInfos = true;
        this.onChange = new EventEmitter();
        this.onSearch = new EventEmitter();
        this.identifier = `input-dropdown-grid-${identifier$e++}`;
        if (config.dropDown) {
            Object.assign(this, config.dropDown);
        }
        this._differData = this.iterableDiffers.find([]).create(null);
    }
    get data() {
        return this._data;
    }
    set data(value) {
        this._data = value;
        this.Init();
    }
    ngOnInit() {
        this.Init();
    }
    ngDoCheck() {
        let changesInData = this._differData.diff(this._data);
        if (changesInData || !this.modelInitialized || this.value != this._lastModelInitialized) {
            this.Init();
        }
    }
    Init() {
        this.clearSearch();
        if (!this.internalData || this.internalData.length == 0) {
            return;
        }
        if (this.value) {
            this.setSelectedItemByTheCurrentModelValue();
            this._lastModelInitialized = this.value;
        }
        else {
            this.selectedDisplayText = '';
            this._lastModelInitialized = undefined;
        }
        this.modelInitialized = true;
    }
    ToggleDropDown(event, value) {
        if (this.clickOutsideEnabled) {
            if ((value == false && !this.showDropdown) || (value == undefined && this.disabled))
                return;
            if (value == undefined) {
                if (this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = !this.showDropdown;
            }
            else {
                if (!value && this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = value;
            }
            this.clearSearch();
        }
        else {
            this.clickOutsideEnabled = true;
        }
    }
    Select(row) {
        if (this.disabled) {
            this.ToggleDropDown(null, false);
            return;
        }
        this.value = this.renderPropertyValue(this.valueProperty, row);
        this.onChange.emit(this.value);
        this.ToggleDropDown(null, false);
    }
    OnSearch() {
        if (this.lazyLoadedData) {
            this.onSearch.emit(this.search);
            return;
        }
        if (!this.search || this.search.length < 3) {
            this.clearSearchResults();
            return;
        }
        this.filterData();
    }
    OnPaginate() {
        this.clickOutsideEnabled = false;
    }
    ClearSelection(e) {
        this.value = null;
        this.selectedDisplayText = null;
        this.comboTouched = true;
        this.showDropdown = false;
        this.onChange.emit(this.value);
        if (e)
            e.stopPropagation();
    }
    OnComboPressed(event) {
        if (event.keyCode == 13) {
            this.ToggleDropDown(null);
            event.preventDefault();
        }
    }
    setSelectedItemByTheCurrentModelValue() {
        if (!this.value)
            return;
        let row = this.data.find(x => this.value == this.renderPropertyValue(this.valueProperty, x));
        if (row) {
            this.selectedDisplayText = this.renderPropertyValue(this.displayTextProperty, row);
        }
    }
    filterData() {
        this.internalData = this.data.filter(x => {
            for (let i = 0; i < this.columns.length; i++) {
                let columnData = '';
                let value = '';
                if (this.columns[i].data) {
                    columnData = this.renderPropertyValue(this.columns[i].data, x);
                }
                if (this.columns[i].render != undefined) {
                    value = this.columns[i].render(x, columnData, i);
                }
                else {
                    value = columnData;
                }
                if (value && value.toString().toUpperCase().indexOf(this.search.toUpperCase()) >= 0) {
                    return true;
                }
            }
            return false;
        });
    }
    clearSearch() {
        this.search = '';
        this.clearSearchResults();
    }
    clearSearchResults() {
        this.internalData = Object.assign([], this.data);
    }
    setComboTouched() {
        this.comboTouched = true;
    }
    renderPropertyValue(propertyPath, object) {
        let parts = propertyPath.split(".");
        let property = object || {};
        for (let i = 0; i < parts.length; i++) {
            if (!property) {
                return null;
            }
            property = property[parts[i]];
        }
        return property;
    }
}
InputDropdownGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputDropdownGridComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
InputDropdownGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputDropdownGridComponent, selector: "input-dropdown-grid", inputs: { placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", displayTextProperty: "displayTextProperty", valueProperty: "valueProperty", columns: "columns", lazyLoadedData: "lazyLoadedData", itemsPerPage: "itemsPerPage", maxSize: "maxSize", showInfos: "showInfos", data: "data" }, outputs: { onChange: "onChange", onSearch: "onSearch" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputDropdownGridComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-dropdown-grid\">\n  <label *ngIf=\"label\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n  </label>\n\n  <input type=\"hidden\" [(ngModel)]=\"value\" />\n  <div class=\"combobox d-flex align-items-center\" \n    [ngClass]=\"{\n      'has-validations': showValidations,\n      'open': showDropdown, \n      'disabled': disabled,\n      'is-valid': !showDropdown && !disabled && comboTouched && (!isRequired || value),\n      'is-invalid': !showDropdown && !disabled && comboTouched && isRequired && !value\n    }\"\n    (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n    <span class=\"mr-auto text-truncate\">{{selectedDisplayText || placeholder}}</span>\n    <i class=\"fa fa-times btn-clear-selection\" *ngIf=\"value && !disabled\" (click)=\"ClearSelection($event)\"></i>\n    <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n  </div>\n\n  <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n    <div class=\"options-container\">\n      <div class=\"toolbar d-flex align-items-center\">\n        <input type=\"text\" auto-focus\n          class=\"form-control\" \n          name=\"{{identifier}}-search\" \n          [(ngModel)]=\"search\" \n          placeholder=\"{{searchPlaceholder}}\"\n          debounce (callback)=\"OnSearch()\" />\n      </div>\n\n      <div class=\"p-2\">\n        <datagrid \n          [data]=\"internalData\" \n          [columns]=\"columns\" \n          [showActionsColumn]=\"true\"\n          [initialColumnToSort]=\"0\"          \n          [itemsPerPage]=\"itemsPerPage\"\n          [maxSize]=\"maxSize\"\n          [showInfos]=\"showInfos\"          \n          actionsColumnWidth=\"60px\"\n          (OnPaginate)=\"OnPaginate()\">\n          <ng-template actions-column let-row=\"row\" let-rowIndex=\"rowIndex\">\n            <button class=\"btn btn-outline-primary btn-sm\" (click)=\"Select(row)\"><i class=\"fa fa-external-link\"></i></button>\n          </ng-template>\n        </datagrid>\n      </div>\n    </div>\n  </div>\n</div>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-dropdown-grid{position:relative}.ui-dropdown-grid *{-webkit-user-select:none;user-select:none}.ui-dropdown-grid>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.ui-dropdown-grid>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-dropdown-grid>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-dropdown-grid>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-dropdown-grid>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-dropdown-grid>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-dropdown-grid>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-dropdown-grid>.combobox.has-validations.is-valid{border-color:#28a745}.ui-dropdown-grid>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-dropdown-grid>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-dropdown-grid>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-dropdown-grid>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-dropdown-grid>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important}.ui-dropdown-grid>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.btn-clear-selection{cursor:pointer;padding:8px 10px;margin:-5px 0 -5px -5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: DebounceDirective, selector: "[debounce]", inputs: ["delay"], outputs: ["callback", "arrowsCallback"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: AutoFocusDirective, selector: "[auto-focus]" }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: DataGridComponent, selector: "datagrid", inputs: ["debugMode", "tableId", "columns", "emptyResultsMessage", "infoMessage", "animated", "striped", "bordered", "hoverEffect", "responsive", "showCheckboxColumn", "showSelectAllCheckbox", "selectAllPages", "checkBoxMode", "showSummaries", "allowExports", "exportButtonLabel", "exportedFileName", "exportedExcelSheetName", "initialColumnToSort", "initialSortDirection", "mode", "totalItems", "itemsPerPage", "maxSize", "boundaryLinks", "directionLinks", "rotate", "showActionsColumn", "showInfos", "actionsColumnCaption", "actionsColumnWidth", "firstText", "previousText", "nextText", "lastText", "autoFitMode", "allowColumnResize", "allowColumnFilters", "allowColumnReorder", "fixedHeader", "minHeight", "maxHeight", "userPreferencesKey", "filterPlaceholder", "filterPlacement", "boundedExportCallback", "data"], outputs: ["OnSelectionChanged", "OnRowSelected", "OnRowRendered", "OnPaginate", "OnSort", "OnColumnFiltered"] }, { kind: "directive", type: ActionsColumnDirective, selector: "[actions-column]" }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputDropdownGridComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-dropdown-grid', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputDropdownGridComponent,
                            multi: true
                        }], template: "<div [id]=\"identifier\" class=\"ui-dropdown-grid\">\n  <label *ngIf=\"label\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n  </label>\n\n  <input type=\"hidden\" [(ngModel)]=\"value\" />\n  <div class=\"combobox d-flex align-items-center\" \n    [ngClass]=\"{\n      'has-validations': showValidations,\n      'open': showDropdown, \n      'disabled': disabled,\n      'is-valid': !showDropdown && !disabled && comboTouched && (!isRequired || value),\n      'is-invalid': !showDropdown && !disabled && comboTouched && isRequired && !value\n    }\"\n    (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n    <span class=\"mr-auto text-truncate\">{{selectedDisplayText || placeholder}}</span>\n    <i class=\"fa fa-times btn-clear-selection\" *ngIf=\"value && !disabled\" (click)=\"ClearSelection($event)\"></i>\n    <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n  </div>\n\n  <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n    <div class=\"options-container\">\n      <div class=\"toolbar d-flex align-items-center\">\n        <input type=\"text\" auto-focus\n          class=\"form-control\" \n          name=\"{{identifier}}-search\" \n          [(ngModel)]=\"search\" \n          placeholder=\"{{searchPlaceholder}}\"\n          debounce (callback)=\"OnSearch()\" />\n      </div>\n\n      <div class=\"p-2\">\n        <datagrid \n          [data]=\"internalData\" \n          [columns]=\"columns\" \n          [showActionsColumn]=\"true\"\n          [initialColumnToSort]=\"0\"          \n          [itemsPerPage]=\"itemsPerPage\"\n          [maxSize]=\"maxSize\"\n          [showInfos]=\"showInfos\"          \n          actionsColumnWidth=\"60px\"\n          (OnPaginate)=\"OnPaginate()\">\n          <ng-template actions-column let-row=\"row\" let-rowIndex=\"rowIndex\">\n            <button class=\"btn btn-outline-primary btn-sm\" (click)=\"Select(row)\"><i class=\"fa fa-external-link\"></i></button>\n          </ng-template>\n        </datagrid>\n      </div>\n    </div>\n  </div>\n</div>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-dropdown-grid{position:relative}.ui-dropdown-grid *{-webkit-user-select:none;user-select:none}.ui-dropdown-grid>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.ui-dropdown-grid>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-dropdown-grid>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-dropdown-grid>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-dropdown-grid>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-dropdown-grid>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-dropdown-grid>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-dropdown-grid>.combobox.has-validations.is-valid{border-color:#28a745}.ui-dropdown-grid>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-dropdown-grid>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-dropdown-grid>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-dropdown-grid>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-dropdown-grid>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important}.ui-dropdown-grid>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.btn-clear-selection{cursor:pointer;padding:8px 10px;margin:-5px 0 -5px -5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: i0.IterableDiffers }];
    }, propDecorators: { model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }], placeholder: [{
                type: Input
            }], searchPlaceholder: [{
                type: Input
            }], displayTextProperty: [{
                type: Input
            }], valueProperty: [{
                type: Input
            }], columns: [{
                type: Input
            }], lazyLoadedData: [{
                type: Input
            }], itemsPerPage: [{
                type: Input
            }], maxSize: [{
                type: Input
            }], showInfos: [{
                type: Input
            }], onChange: [{
                type: Output
            }], onSearch: [{
                type: Output
            }], data: [{
                type: Input,
                args: ['data']
            }] } });

let identifier$d = 0;
class InputDropdownSearchComponent extends ElementBase {
    constructor(validators, asyncValidators, config, iterableDiffers) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.iterableDiffers = iterableDiffers;
        this.clickOutsideEnabled = true;
        this.searchCounter = 0;
        this.selectedItemIndex = -1;
        this.placeholder = 'Select...';
        this.searchPlaceholder = 'Search...';
        this.emptyResultsMessage = 'No results found at this moment.';
        this.minCharsToSearch = 3;
        this.onChange = new EventEmitter();
        this.onSearch = new EventEmitter();
        this.identifier = `input-dropdown-search-${identifier$d++}`;
        if (config.dropDown) {
            Object.assign(this, config.dropDown);
        }
        this._differData = this.iterableDiffers.find([]).create(null);
    }
    get data() {
        return this._data;
    }
    set data(value) {
        this._data = value;
        this.Init();
    }
    ngOnInit() {
        this.Init();
    }
    ngDoCheck() {
        let changesInData = this._differData.diff(this._data);
        if (changesInData || !this.modelInitialized || this.value != this._lastModelInitialized) {
            this.Init();
        }
    }
    Init() {
        this.clearSearch();
        if (!this.internalData || this.internalData.length == 0) {
            return;
        }
        if (this.value != null && this.value != undefined) {
            this.setSelectedItemByTheCurrentModelValue();
            this._lastModelInitialized = this.value;
        }
        else {
            this.selectedDisplayText = '';
            this._lastModelInitialized = undefined;
        }
        this.modelInitialized = true;
    }
    ToggleDropDown(event, value) {
        if (this.clickOutsideEnabled) {
            if ((value == false && !this.showDropdown) || (value == undefined && this.disabled))
                return;
            if (value == undefined) {
                if (this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = !this.showDropdown;
            }
            else {
                if (!value && this.showDropdown) {
                    this.setComboTouched();
                }
                this.showDropdown = value;
            }
            if (this.lazyLoadedData) {
                this.search = '';
                this.internalData = [];
            }
            else {
                this.clearSearch(true);
            }
        }
        else {
            this.clickOutsideEnabled = true;
        }
    }
    Select(row) {
        if (this.disabled) {
            this.ToggleDropDown(null, false);
            return;
        }
        this.value = this.renderPropertyValue(this.valueProperty, row);
        this.onChange.emit(this.value);
        this.ToggleDropDown(null, false);
    }
    OnSearch() {
        if (this.lazyLoadedData) {
            this.onSearch.emit(this.search);
            this.searchCounter += 1;
            return;
        }
        if (!this.search || this.search.length < this.minCharsToSearch) {
            this.clearSearchResults();
            return;
        }
        this.filterData();
    }
    ClearSelection(e) {
        this.value = null;
        this.selectedDisplayText = null;
        this.comboTouched = true;
        this.showDropdown = false;
        this.onChange.emit(this.value);
        if (e)
            e.stopPropagation();
    }
    SetLoading(value) {
        this.loading = value;
    }
    OnArrowsPressed(event) {
        if (event.keyCode == 13) {
            this.Select(this.internalData[this.selectedItemIndex]);
        }
        else if (event.keyCode >= 37 && event.keyCode <= 40) {
            this.handleArrows(event.keyCode);
        }
    }
    OnComboPressed(event) {
        if (event.keyCode == 13) {
            this.ToggleDropDown(null);
            event.preventDefault();
        }
    }
    handleOptionsScrollerDown() {
        var scroll = 0;
        var scrollPositionStart = $(`#${this.identifier} .result-list`).scrollTop();
        var scrollPositionEnd = scrollPositionStart + (38 * 6);
        var currentPosition = this.selectedItemIndex * 38;
        if (currentPosition >= scrollPositionStart && currentPosition < scrollPositionEnd) {
            scroll = scrollPositionStart;
        }
        else {
            scroll = (this.selectedItemIndex - 6) * 38;
        }
        $(`#${this.identifier} .result-list`).scrollTop(scroll);
    }
    handleOptionsScrollerUp() {
        var scroll = 0;
        var scrollPositionStart = $(`#${this.identifier} .result-list`).scrollTop();
        var scrollPositionEnd = scrollPositionStart + (38 * 6);
        var currentPosition = this.selectedItemIndex * 38;
        if (currentPosition > scrollPositionStart && currentPosition <= scrollPositionEnd) {
            scroll = scrollPositionStart;
        }
        else {
            scroll = (this.selectedItemIndex - 1) * 38;
        }
        $(`#${this.identifier} .result-list`).scrollTop(scroll);
    }
    handleArrows(keyCode) {
        switch (keyCode) {
            case 38: //ArrouUp
                if (this.selectedItemIndex > 0) {
                    this.selectedItemIndex -= 1;
                }
                this.handleOptionsScrollerUp();
                break;
            case 40: //ArrouDown
                if (this.selectedItemIndex < (this.internalData.length - 1)) {
                    this.selectedItemIndex += 1;
                }
                this.handleOptionsScrollerDown();
                break;
        }
    }
    setSelectedItemByTheCurrentModelValue() {
        if (this.value == null || this.value == undefined)
            return;
        let row = this.data.find(x => this.value == this.renderPropertyValue(this.valueProperty, x));
        if (row) {
            this.selectedDisplayText = this.renderPropertyValue(this.displayTextProperty, row);
        }
    }
    filterData() {
        this.internalData = this.data.filter(x => {
            let value = this.renderPropertyValue(this.displayTextProperty, x);
            if (value && value.toString().toUpperCase().indexOf(this.search.toUpperCase()) >= 0) {
                return true;
            }
            return false;
        });
    }
    clearSearch(clearSearchInput) {
        if (clearSearchInput) {
            this.search = '';
        }
        this.clearSearchResults();
    }
    clearSearchResults() {
        this.selectedItemIndex = -1;
        this.internalData = Object.assign([], this.data);
    }
    setComboTouched() {
        this.comboTouched = true;
    }
    renderPropertyValue(propertyPath, object) {
        let parts = propertyPath.split(".");
        let property = object || {};
        for (let i = 0; i < parts.length; i++) {
            if (!property) {
                return null;
            }
            property = property[parts[i]];
        }
        return property;
    }
}
InputDropdownSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputDropdownSearchComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
InputDropdownSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputDropdownSearchComponent, selector: "input-dropdown-search", inputs: { placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", emptyResultsMessage: "emptyResultsMessage", displayTextProperty: "displayTextProperty", valueProperty: "valueProperty", lazyLoadedData: "lazyLoadedData", minCharsToSearch: "minCharsToSearch", data: "data" }, outputs: { onChange: "onChange", onSearch: "onSearch" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputDropdownSearchComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-dropdown-search\">\n  <label *ngIf=\"label\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n  </label>\n\n  <input type=\"hidden\" [(ngModel)]=\"value\" />\n  <div class=\"combobox d-flex align-items-center\" \n    [ngClass]=\"{\n      'has-validations': showValidations,\n      'open': showDropdown, \n      'disabled': disabled,\n      'is-valid': !showDropdown && !disabled && comboTouched && (!isRequired || (value != null && value != undefined)),\n      'is-invalid': !showDropdown && !disabled && comboTouched && isRequired && (value == null || value == undefined)\n    }\"\n    (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n    <span class=\"mr-auto text-truncate\">{{value != null && value != undefined && selectedDisplayText ? selectedDisplayText : placeholder}}</span>\n    <i class=\"fa fa-times btn-clear-selection\" *ngIf=\"(value != null && value != undefined) && !disabled\" (click)=\"ClearSelection($event)\"></i>\n    <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n  </div>\n\n  <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n    <div class=\"options-container\">\n      <div class=\"toolbar d-flex align-items-center\">\n        <input type=\"text\" auto-focus\n          class=\"form-control\" \n          name=\"{{identifier}}-search\" \n          [(ngModel)]=\"search\" \n          placeholder=\"{{searchPlaceholder}}\"\n          debounce \n          (callback)=\"OnSearch()\" (arrowsCallback)=\"OnArrowsPressed($event)\" />\n      </div>\n\n      <div class=\"loading\" *ngIf=\"loading\">\n        <spinner></spinner>\n      </div>\n\n      <div *ngIf=\"!loading && internalData?.length > 0\">\n        <div class=\"result-list\">\n          <div class=\"list-item\" \n            *ngFor=\"let item of internalData; let i = index;\" \n            (click)=\"Select(item)\" \n            [ngClass]=\"{\n              'active': value == item[valueProperty],\n              'focused': selectedItemIndex == i\n            }\">\n            {{item[displayTextProperty]}}\n          </div>\n        </div>\n      </div>\n\n      <span class=\"empty-results\" *ngIf=\"!loading && (!lazyLoadedData || searchCounter > 0) && (!internalData || internalData.length == 0)\">{{emptyResultsMessage}}</span>\n    </div>\n  </div>\n</div>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-dropdown-search{position:relative}.ui-dropdown-search *{-webkit-user-select:none;user-select:none}.ui-dropdown-search>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.ui-dropdown-search>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-dropdown-search>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-dropdown-search>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-dropdown-search>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-dropdown-search>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-dropdown-search>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-dropdown-search>.combobox.has-validations.is-valid{border-color:#28a745}.ui-dropdown-search>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-dropdown-search>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-dropdown-search>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-dropdown-search>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-dropdown-search>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important}.ui-dropdown-search>.dropdown-options .loading{background-color:#696969;padding:40px 30px;border-radius:0 0 .25rem .25rem}.ui-dropdown-search>.dropdown-options .result-list{overflow-y:auto;overflow-x:hidden;max-height:300px}.ui-dropdown-search>.dropdown-options .result-list .list-item{color:#000000de;cursor:pointer;text-decoration:none;padding:7px 10px;font-size:16px}.ui-dropdown-search>.dropdown-options .result-list .list-item.active{color:#007bff}.ui-dropdown-search>.dropdown-options .result-list .list-item:hover,.ui-dropdown-search>.dropdown-options .result-list .list-item.focused{background:rgba(0,0,0,.04)}.ui-dropdown-search>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.btn-clear-selection{cursor:pointer;padding:8px 10px;margin:-5px 0 -5px -5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: DebounceDirective, selector: "[debounce]", inputs: ["delay"], outputs: ["callback", "arrowsCallback"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: AutoFocusDirective, selector: "[auto-focus]" }, { kind: "component", type: SpinnerComponent, selector: "spinner", inputs: ["noMargins"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputDropdownSearchComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-dropdown-search', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputDropdownSearchComponent,
                            multi: true
                        }], template: "<div [id]=\"identifier\" class=\"ui-dropdown-search\">\n  <label *ngIf=\"label\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n  </label>\n\n  <input type=\"hidden\" [(ngModel)]=\"value\" />\n  <div class=\"combobox d-flex align-items-center\" \n    [ngClass]=\"{\n      'has-validations': showValidations,\n      'open': showDropdown, \n      'disabled': disabled,\n      'is-valid': !showDropdown && !disabled && comboTouched && (!isRequired || (value != null && value != undefined)),\n      'is-invalid': !showDropdown && !disabled && comboTouched && isRequired && (value == null || value == undefined)\n    }\"\n    (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n    <span class=\"mr-auto text-truncate\">{{value != null && value != undefined && selectedDisplayText ? selectedDisplayText : placeholder}}</span>\n    <i class=\"fa fa-times btn-clear-selection\" *ngIf=\"(value != null && value != undefined) && !disabled\" (click)=\"ClearSelection($event)\"></i>\n    <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n  </div>\n\n  <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n    <div class=\"options-container\">\n      <div class=\"toolbar d-flex align-items-center\">\n        <input type=\"text\" auto-focus\n          class=\"form-control\" \n          name=\"{{identifier}}-search\" \n          [(ngModel)]=\"search\" \n          placeholder=\"{{searchPlaceholder}}\"\n          debounce \n          (callback)=\"OnSearch()\" (arrowsCallback)=\"OnArrowsPressed($event)\" />\n      </div>\n\n      <div class=\"loading\" *ngIf=\"loading\">\n        <spinner></spinner>\n      </div>\n\n      <div *ngIf=\"!loading && internalData?.length > 0\">\n        <div class=\"result-list\">\n          <div class=\"list-item\" \n            *ngFor=\"let item of internalData; let i = index;\" \n            (click)=\"Select(item)\" \n            [ngClass]=\"{\n              'active': value == item[valueProperty],\n              'focused': selectedItemIndex == i\n            }\">\n            {{item[displayTextProperty]}}\n          </div>\n        </div>\n      </div>\n\n      <span class=\"empty-results\" *ngIf=\"!loading && (!lazyLoadedData || searchCounter > 0) && (!internalData || internalData.length == 0)\">{{emptyResultsMessage}}</span>\n    </div>\n  </div>\n</div>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-dropdown-search{position:relative}.ui-dropdown-search *{-webkit-user-select:none;user-select:none}.ui-dropdown-search>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.ui-dropdown-search>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-dropdown-search>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-dropdown-search>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-dropdown-search>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-dropdown-search>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-dropdown-search>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-dropdown-search>.combobox.has-validations.is-valid{border-color:#28a745}.ui-dropdown-search>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-dropdown-search>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-dropdown-search>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-dropdown-search>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-dropdown-search>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important}.ui-dropdown-search>.dropdown-options .loading{background-color:#696969;padding:40px 30px;border-radius:0 0 .25rem .25rem}.ui-dropdown-search>.dropdown-options .result-list{overflow-y:auto;overflow-x:hidden;max-height:300px}.ui-dropdown-search>.dropdown-options .result-list .list-item{color:#000000de;cursor:pointer;text-decoration:none;padding:7px 10px;font-size:16px}.ui-dropdown-search>.dropdown-options .result-list .list-item.active{color:#007bff}.ui-dropdown-search>.dropdown-options .result-list .list-item:hover,.ui-dropdown-search>.dropdown-options .result-list .list-item.focused{background:rgba(0,0,0,.04)}.ui-dropdown-search>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}.btn-clear-selection{cursor:pointer;padding:8px 10px;margin:-5px 0 -5px -5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: i0.IterableDiffers }];
    }, propDecorators: { model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }], placeholder: [{
                type: Input
            }], searchPlaceholder: [{
                type: Input
            }], emptyResultsMessage: [{
                type: Input
            }], displayTextProperty: [{
                type: Input
            }], valueProperty: [{
                type: Input
            }], lazyLoadedData: [{
                type: Input
            }], minCharsToSearch: [{
                type: Input
            }], onChange: [{
                type: Output
            }], onSearch: [{
                type: Output
            }], data: [{
                type: Input,
                args: ['data']
            }] } });

let identifier$c = 0;
class InputEmailComponent extends ElementBase {
    constructor(validators, asyncValidators, config, domSanitizer) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.domSanitizer = domSanitizer;
        this.placeholder = '';
        this.showInputGroup = true;
        this.identifier = `input-email-${identifier$c++}`;
    }
    ngOnInit() {
        if (!this.inputGroupText) {
            this.inputGroupText = this.domSanitizer.bypassSecurityTrustHtml("<i class='fa fa-envelope-o' aria-hidden='true'></i>");
        }
    }
}
InputEmailComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputEmailComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i2$1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
InputEmailComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputEmailComponent, selector: "input-email", inputs: { placeholder: "placeholder", maxlength: "maxlength", showInputGroup: "showInputGroup", inputGroupText: "inputGroupText" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputEmailComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"showInputGroup\">\n    <span class=\"input-group-text\" [innerHtml]=\"inputGroupText\"></span>\n  </div>\n  <input \n    type=\"email\"\n    name=\"email\"\n    pattern=\"[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,3}$\"\n    class=\"form-control\"  \n    [disabled]=\"disabled\" \n    [maxlength]=\"maxlength\"\n    [placeholder]=\"placeholder\"\n    [autocomplete]=\"autocomplete\"\n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\"\n    email\n  />\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i2.EmailValidator, selector: "[email][formControlName],[email][formControl],[email][ngModel]", inputs: ["email"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputEmailComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-email', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputEmailComponent,
                            multi: true
                        }], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"showInputGroup\">\n    <span class=\"input-group-text\" [innerHtml]=\"inputGroupText\"></span>\n  </div>\n  <input \n    type=\"email\"\n    name=\"email\"\n    pattern=\"[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,3}$\"\n    class=\"form-control\"  \n    [disabled]=\"disabled\" \n    [maxlength]=\"maxlength\"\n    [placeholder]=\"placeholder\"\n    [autocomplete]=\"autocomplete\"\n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\"\n    email\n  />\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n" }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: i2$1.DomSanitizer }];
    }, propDecorators: { placeholder: [{
                type: Input
            }], maxlength: [{
                type: Input
            }], showInputGroup: [{
                type: Input
            }], inputGroupText: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

class InputMonthYearLanguage {
    constructor(days, daysMin, months) {
        this.days = days;
        this.daysMin = daysMin;
        this.months = months;
    }
}

const INPUT_MONTH_YEAR_LANGUAGES = new Map([
    ['cs', new InputMonthYearLanguage(['Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota', 'Neděle'], ['Po', 'Út', 'St', 'Čt', 'Pá', 'So', 'Ne'], ['Leden', 'Únor', 'Březen', 'Duben', 'Květen', 'Červen', 'Červenec', 'Srpen', 'Září', 'Říjen', 'Listopad', 'Prosinec'])],
    ['da', new InputMonthYearLanguage(['Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag', 'Søndag'], ['Ma', 'Ti', 'On', 'To', 'Fr', 'Lø', 'Sø'], ['Januar', 'Februar', 'Marts', 'April', 'Maj', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'December'])],
    ['de', new InputMonthYearLanguage(['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag'], ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'], ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'])],
    ['en', new InputMonthYearLanguage(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'], ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'])],
    ['es', new InputMonthYearLanguage(['Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado', 'Domingo'], ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'], ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Augosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'])],
    ['fi', new InputMonthYearLanguage(['Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai', 'Sunnuntai'], ['Ma', 'Ti', 'Ke', 'To', 'Pe', 'La', 'Su'], ['Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', 'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu'])],
    ['fr', new InputMonthYearLanguage(['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'], ['Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa', 'Di'], ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Decembre'])],
    ['hu', new InputMonthYearLanguage(['Hétfő', 'Kedd', 'Szerda', 'Csütörtök', 'Péntek', 'Szombat', 'Vasárnap'], ['H', 'K', 'Sz', 'Cs', 'P', 'Sz', 'V'], ['Január', 'Február', 'Március', 'Április', 'Május', 'Június', 'Július', 'Augusztus', 'Szeptember', 'Október', 'November', 'December'])],
    ['it', new InputMonthYearLanguage(['Lunedì', 'Martedì', 'Mercoledì', 'Giovedì', 'Venerdì', 'Sabato', 'Domenica'], ['Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa', 'Do'], ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'])],
    ['jp', new InputMonthYearLanguage(['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日'], ['月', '火', '水', '木', '金', '土', '日'], ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'])],
    ['nl', new InputMonthYearLanguage(['maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag', 'zondag'], ['ma', 'di', 'wo', 'do', 'vr', 'za', 'zo'], ['Januari', 'Februari', 'Maart', 'April', 'Mei', 'Juni', 'Juli', 'Augustus', 'September', 'Oktober', 'November', 'December'])],
    ['pl', new InputMonthYearLanguage(['Poniedziałek', 'Wtorek', 'Środa', 'Czwartek', 'Piątek', 'Sobota', 'Niedziela'], ['Pn', 'Wt', 'Śr', 'Czw', 'Pt', 'So', 'Nd'], ['Styczeń', 'Luty', 'Marzec', 'Kwiecień', 'Maj', 'Czerwiec', 'Lipiec', 'Sierpień', 'Wrzesień', 'Październik', 'Listopad', 'Grudzień'])],
    ['pt', new InputMonthYearLanguage(['Segunda', 'Terça', 'Quarta', 'Quinta', 'Sexta', 'Sábado', 'Domingo'], ['Se', 'Te', 'Qa', 'Qi', 'Sx', 'Sa', 'Do'], ['Janeiro', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'])],
    ['ro', new InputMonthYearLanguage(['Luni', 'Marţi', 'Miercuri', 'Joi', 'Vineri', 'Sâmbătă', 'Duminică'], ['Lu', 'Ma', 'Mi', 'Jo', 'Vi', 'Sa', 'Du'], ['Ianuarie', 'Februarie', 'Martie', 'Aprilie', 'Mai', 'Iunie', 'Iulie', 'August', 'Septembrie', 'Octombrie', 'Noiembrie', 'Decembrie'])],
    ['sk', new InputMonthYearLanguage(['Pondelok', 'Utorok', 'Streda', 'Štvrtok', 'Piatok', 'Sobota', 'Nedeľa'], ['Po', 'Ut', 'St', 'Št', 'Pi', 'So', 'Ne'], ['Január', 'Február', 'Marec', 'Apríl', 'Máj', 'Jún', 'Júl', 'August', 'September', 'Október', 'November', 'December'])],
    ['zh', new InputMonthYearLanguage(['周一', '周二', '周三', '周四', '周五', '周六', '周日'], ['一', '二', '三', '四', '五', '六', '日'], ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'])],
]);

let identifier$b = 0;
class InputMonthYearComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.placeholder = 'Select...';
        this.language = 'en';
        this.format = 'MMM/yyyy';
        this.onChange = new EventEmitter();
        this.displayMode = EnumDisplayMode.Month;
        this.identifier = `input-month-year-${identifier$b++}`;
    }
    ngOnInit() {
        if (this.config.monthYear) {
            Object.assign(this, this.config.monthYear);
        }
        this.init();
    }
    ngDoCheck() {
        this.handleInitialValue();
    }
    ToggleDropDown(event, value) {
        if ((value == false && !this.showDropdown) || (value == undefined && this.disabled))
            return;
        this.displayMode = EnumDisplayMode.Month;
        this.handleSelectedYear();
        if (value == undefined) {
            if (this.showDropdown) {
                this.setComboTouched();
            }
            this.showDropdown = !this.showDropdown;
        }
        else {
            if (!value && this.showDropdown) {
                this.setComboTouched();
            }
            this.showDropdown = value;
        }
    }
    IncrementSelectedYear() {
        if (this.disabled)
            return;
        this.selectedYear++;
    }
    DecrementSelectedYear() {
        if (this.disabled)
            return;
        this.selectedYear--;
    }
    GetMonthAvaiable(index) {
        if (!this.monthsAvailable || (this.monthsAvailable && this.monthsAvailable.filter(x => x.year == this.selectedYear).length == 0) || (this.monthsAvailable && this.monthsAvailable.filter(x => x.year == this.selectedYear).length > 0 && !this.monthsAvailable.filter(x => x.year == this.selectedYear)[0].monthsAvaiable[index].value))
            return true;
        else
            return false;
    }
    SelectMonth(month) {
        if (this.disabled) {
            this.showDropdown = false;
            return;
        }
        if (!this.GetMonthAvaiable(month)) {
            return;
        }
        let newDate = new Date(this.selectedYear, month, 1, 0, 0, 0, 0);
        this.value = newDate;
        this.showDropdown = false;
        this.setComboTouched();
        this.onChange.emit(this.value);
    }
    Clear(event) {
        this.value = null;
        this.comboTouched = true;
        this.showDropdown = false;
        this.onChange.emit(this.value);
        event.stopPropagation();
    }
    OnComboPressed(event) {
        if (event.keyCode == 13) {
            this.ToggleDropDown(null);
            event.preventDefault();
        }
    }
    init() {
        this.initLanguageDefinitions();
    }
    initLanguageDefinitions() {
        this.languageDefinitions = INPUT_MONTH_YEAR_LANGUAGES.get(this.language);
    }
    handleSelectedYear() {
        if (this.value) {
            this.selectedYear = this.value.getFullYear();
        }
        else {
            this.selectedYear = new Date().getFullYear();
        }
    }
    handleInitialValue() {
        if (this.value && (typeof this.value == "string" || this.value instanceof String)) {
            let data = new Date(this.value);
            data.setHours(0);
            data.setMinutes(0);
            data.setSeconds(0);
            data.setMilliseconds(0);
            this.writeValue(data);
        }
    }
    setComboTouched() {
        this.comboTouched = true;
    }
}
InputMonthYearComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputMonthYearComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputMonthYearComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputMonthYearComponent, selector: "input-month-year", inputs: { placeholder: "placeholder", language: "language", format: "format", monthsAvailable: "monthsAvailable" }, outputs: { onChange: "onChange" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputMonthYearComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-month-year\">\n  <label *ngIf=\"label\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n  </label>\n\n  <input type=\"date\" class=\"d-none\" [(ngModel)]=\"value\" />\n  <div class=\"combobox d-flex align-items-center justify-content-between\" \n      [ngClass]=\"{\n        'has-validations': showValidations,\n        'open': showDropdown, \n        'disabled': disabled,\n        'is-valid': !showDropdown && !disabled && comboTouched && !(invalid | async),\n        'is-invalid': !showDropdown && !disabled && comboTouched && (invalid | async)\n      }\"\n      (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n      <span *ngIf=\"!value\">{{placeholder}}</span>\n      <span *ngIf=\"value\">{{value | date:format}}</span>\n\n      <i class=\"fa fa-times btn-clear-selection ml-auto\" *ngIf=\"value && !disabled\" (click)=\"Clear($event)\"></i>\n      <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n  </div>\n\n  <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n    <div class=\"months-container\" *ngIf=\"displayMode == 0\">\n      <div class=\"toolbar d-flex align-items-center justify-content-between\">\n        <button class=\"btn btn-light\" (click)=\"DecrementSelectedYear()\"><i class=\"fa fa-chevron-left\"></i></button>\n        <button class=\"btn btn-light\">{{selectedYear}}</button>\n        <button class=\"btn btn-light\" (click)=\"IncrementSelectedYear()\"><i class=\"fa fa-chevron-right\"></i></button>\n      </div>\n\n      <ul class=\"d-flex flex-wrap\">\n        <li *ngFor=\"let item of languageDefinitions.months; let i = index;\" \n          (click)=\"SelectMonth(i)\"\n          [ngClass]=\"{'selected': value?.getMonth() == i && GetMonthAvaiable(i),\n                      'disabled': !GetMonthAvaiable(i) }\">\n          {{item | slice:0:3}}\n        </li>\n      </ul>\n    </div>\n  </div>\n</div>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-month-year{position:relative}.ui-month-year *{-webkit-user-select:none;user-select:none}.ui-month-year>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:6px}.ui-month-year>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-month-year>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-month-year>.combobox>i.fa-times{color:#9b9b9b;cursor:pointer}.ui-month-year>.combobox.open{border-radius:6px 6px 6px 0}.ui-month-year>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-month-year>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-month-year>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-month-year>.combobox.has-validations.is-valid{border-color:#28a745}.ui-month-year>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-month-year>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 6px 6px;position:absolute;top:71px;left:0;width:250px;z-index:20;margin-top:-1px}.ui-month-year>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-month-year>.dropdown-options ul{margin:0;padding:5px 4px 5px 5px}.ui-month-year>.dropdown-options ul li{list-style:none;width:33.33%;height:25%;padding:10px;text-align:center;border-radius:4px}.ui-month-year>.dropdown-options ul li>span{cursor:pointer}.ui-month-year>.dropdown-options ul li.selected{color:#007bff;font-weight:600}.ui-month-year>.dropdown-options ul li.disabled{color:#dedede;text-decoration:line-through}.ui-month-year>.dropdown-options ul li:hover{background-color:#007bff;color:#fff;cursor:pointer}.btn-clear-selection{cursor:pointer;color:#495057!important;padding:8px 10px;margin-top:-5px!important;margin-bottom:-5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.SlicePipe, name: "slice" }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputMonthYearComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-month-year', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputMonthYearComponent,
                            multi: true
                        }], template: "<div [id]=\"identifier\" class=\"ui-month-year\">\n  <label *ngIf=\"label\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n  </label>\n\n  <input type=\"date\" class=\"d-none\" [(ngModel)]=\"value\" />\n  <div class=\"combobox d-flex align-items-center justify-content-between\" \n      [ngClass]=\"{\n        'has-validations': showValidations,\n        'open': showDropdown, \n        'disabled': disabled,\n        'is-valid': !showDropdown && !disabled && comboTouched && !(invalid | async),\n        'is-invalid': !showDropdown && !disabled && comboTouched && (invalid | async)\n      }\"\n      (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n      <span *ngIf=\"!value\">{{placeholder}}</span>\n      <span *ngIf=\"value\">{{value | date:format}}</span>\n\n      <i class=\"fa fa-times btn-clear-selection ml-auto\" *ngIf=\"value && !disabled\" (click)=\"Clear($event)\"></i>\n      <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showDropdown, 'fa-caret-up': showDropdown}\"></i>\n  </div>\n\n  <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showDropdown\" (clickOutside)=\"ToggleDropDown($event, false)\">\n    <div class=\"months-container\" *ngIf=\"displayMode == 0\">\n      <div class=\"toolbar d-flex align-items-center justify-content-between\">\n        <button class=\"btn btn-light\" (click)=\"DecrementSelectedYear()\"><i class=\"fa fa-chevron-left\"></i></button>\n        <button class=\"btn btn-light\">{{selectedYear}}</button>\n        <button class=\"btn btn-light\" (click)=\"IncrementSelectedYear()\"><i class=\"fa fa-chevron-right\"></i></button>\n      </div>\n\n      <ul class=\"d-flex flex-wrap\">\n        <li *ngFor=\"let item of languageDefinitions.months; let i = index;\" \n          (click)=\"SelectMonth(i)\"\n          [ngClass]=\"{'selected': value?.getMonth() == i && GetMonthAvaiable(i),\n                      'disabled': !GetMonthAvaiable(i) }\">\n          {{item | slice:0:3}}\n        </li>\n      </ul>\n    </div>\n  </div>\n</div>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && comboTouched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-month-year{position:relative}.ui-month-year *{-webkit-user-select:none;user-select:none}.ui-month-year>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:6px}.ui-month-year>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-month-year>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-month-year>.combobox>i.fa-times{color:#9b9b9b;cursor:pointer}.ui-month-year>.combobox.open{border-radius:6px 6px 6px 0}.ui-month-year>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-month-year>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-month-year>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-month-year>.combobox.has-validations.is-valid{border-color:#28a745}.ui-month-year>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-month-year>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 6px 6px;position:absolute;top:71px;left:0;width:250px;z-index:20;margin-top:-1px}.ui-month-year>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-month-year>.dropdown-options ul{margin:0;padding:5px 4px 5px 5px}.ui-month-year>.dropdown-options ul li{list-style:none;width:33.33%;height:25%;padding:10px;text-align:center;border-radius:4px}.ui-month-year>.dropdown-options ul li>span{cursor:pointer}.ui-month-year>.dropdown-options ul li.selected{color:#007bff;font-weight:600}.ui-month-year>.dropdown-options ul li.disabled{color:#dedede;text-decoration:line-through}.ui-month-year>.dropdown-options ul li:hover{background-color:#007bff;color:#fff;cursor:pointer}.btn-clear-selection{cursor:pointer;color:#495057!important;padding:8px 10px;margin-top:-5px!important;margin-bottom:-5px!important;border-radius:3px}.btn-clear-selection:hover{background-color:#e7e7e7}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { placeholder: [{
                type: Input
            }], language: [{
                type: Input
            }], format: [{
                type: Input
            }], monthsAvailable: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }], onChange: [{
                type: Output
            }] } });
var EnumDisplayMode;
(function (EnumDisplayMode) {
    EnumDisplayMode[EnumDisplayMode["Month"] = 0] = "Month";
    EnumDisplayMode[EnumDisplayMode["Year"] = 1] = "Year";
})(EnumDisplayMode || (EnumDisplayMode = {}));

let identifier$a = 0;
class InputMultiselectComponent extends ElementBase {
    constructor(validators, asyncValidators, config, iterableDiffers) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.iterableDiffers = iterableDiffers;
        this.placeholder = 'Select...';
        this.searchPlaceholder = 'Search...';
        this.displayTextProperty = 'text';
        this.valueProperty = 'value';
        this.emptyMessage = 'No results found.';
        this.selectAllButtonLabel = 'Select all';
        this.clearSelectionButtonLabel = 'Clear selection';
        this.maxCountOfLabelsToShow = 3;
        this.onChange = new EventEmitter();
        this.identifier = `input-multiselect-${identifier$a++}`;
        if (config.multiSelect) {
            Object.assign(this, config.multiSelect);
        }
        this._differModel = this.iterableDiffers.find([]).create(null);
        this._differOptions = this.iterableDiffers.find([]).create(null);
    }
    get options() {
        return this._options;
    }
    set options(value) {
        this._options = value;
        this.Init();
    }
    ngOnInit() {
        this.Init();
    }
    ngDoCheck() {
        let changesInModel = this._differModel.diff(this.value);
        let changesInOptions = this._differOptions.diff(this._options);
        if (changesInModel || (changesInOptions && !this.modelInitialized)) {
            this.Init();
        }
    }
    Init() {
        if (!this.value || !this.options || this.value.length == 0 || this.options.length == 0) {
            if ((!this.value || this.value.length == 0) && this.options) {
                this.ToggleAllItemsSelection(false, false);
            }
            return;
        }
        for (let i = 0; i < this.options.length; i++) {
            this.options[i].selected = this.value.filter(x => this.options[i][this.valueProperty] == x[this.valueProperty]).length > 0;
        }
        this.modelInitialized = true;
    }
    ToggleDropDown(event, value) {
        if ((value == false && !this.showOptions) || (value == undefined && this.disabled))
            return;
        if (value == undefined) {
            if (this.showOptions) {
                this.setComboTouched();
            }
            this.showOptions = !this.showOptions;
        }
        else {
            if (!value && this.showOptions) {
                this.setComboTouched();
            }
            this.showOptions = value;
        }
        this.clearSearch();
    }
    ToggleItemSelected(item) {
        if (this.disabled) {
            return;
        }
        item.selected = !item.selected;
        this.updateModel();
        this.onChange.emit();
    }
    ToggleAllItemsSelection(value, emitChanges) {
        if (this.disabled) {
            return;
        }
        if (!this.options || this.options.length == 0)
            return;
        for (let i = 0; i < this.options.length; i++) {
            this.options[i].selected = value;
        }
        this.updateModel();
        this.clearSearch();
        if (emitChanges)
            this.onChange.emit();
    }
    ItemSelectedCheckChanged() {
        if (this.disabled) {
            return;
        }
        this.updateModel();
        this.onChange.emit();
    }
    RemoveItem(item, index, event) {
        if (this.disabled || !this.options || this.options.length == 0) {
            return;
        }
        let itemToRemove = this.options.find(x => x[this.valueProperty] == item[this.valueProperty]);
        if (itemToRemove) {
            this.ToggleItemSelected(itemToRemove);
            this.clearSearch();
        }
        else {
            this.value.splice(index, 1);
        }
        event.stopPropagation();
    }
    OnComboPressed(event) {
        if (event.keyCode == 13) {
            this.ToggleDropDown(null);
            event.preventDefault();
        }
    }
    clearSearch() {
        this.search = '';
    }
    updateModel() {
        if (!this.options || this.options.length == 0) {
            this.value = [];
            return;
        }
        this.value = this.options.filter(x => x.selected);
    }
    setComboTouched() {
        this.comboTouched = true;
    }
}
InputMultiselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputMultiselectComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component });
InputMultiselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputMultiselectComponent, selector: "input-multiselect", inputs: { placeholder: "placeholder", searchPlaceholder: "searchPlaceholder", displayTextProperty: "displayTextProperty", valueProperty: "valueProperty", emptyMessage: "emptyMessage", selectAllButtonLabel: "selectAllButtonLabel", clearSelectionButtonLabel: "clearSelectionButtonLabel", maxCountOfLabelsToShow: "maxCountOfLabelsToShow", options: "options" }, outputs: { onChange: "onChange" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputMultiselectComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div [id]=\"identifier\" class=\"ui-multiselect\">\n    <label *ngIf=\"label\">\n        {{label}}\n        <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n        <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n    </label>\n\n    <input type=\"hidden\" [(ngModel)]=\"value\" />\n    <div class=\"combobox d-flex align-items-center justify-content-between\" \n        [ngClass]=\"{\n            'has-validations': showValidations,\n            'open': showOptions, \n            'disabled': disabled,\n            'is-valid': !showOptions && !disabled && comboTouched && (!isRequired || value?.length > 0),\n            'is-invalid': !showOptions && !disabled && comboTouched && isRequired && (!value || value.length == 0)\n        }\"\n        (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n        <span *ngIf=\"!value || value.length == 0\">{{placeholder}}</span>\n\n        <div *ngIf=\"value?.length > 0\" class=\"selected-items d-flex align-items-center\">\n            <span class=\"badge\" *ngFor=\"let item of value | slice:0:maxCountOfLabelsToShow; let i = index;\" (click)=\"RemoveItem(item, i, $event)\">\n                <span class=\"text-truncate\">{{item[displayTextProperty]}}</span>\n                <i class=\"fa fa-times ml-2\" *ngIf=\"!disabled\"></i>\n            </span>\n            <span *ngIf=\"value.length > maxCountOfLabelsToShow\">...</span>\n        </div>\n\n        <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showOptions, 'fa-caret-up': showOptions}\"></i>\n    </div>\n\n    <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showOptions\" (clickOutside)=\"ToggleDropDown($event, false)\">\n        <div class=\"options-container\" *ngIf=\"options?.length > 0\">\n            <div class=\"toolbar d-flex align-items-center\">\n                <input type=\"text\" class=\"form-control flex-grow-1\" name=\"{{identifier}}-search\" [(ngModel)]=\"search\" placeholder=\"{{searchPlaceholder}}\" auto-focus />\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ToggleAllItemsSelection(true, true)\" [disabled]=\"disabled\"><i class=\"fa fa-check-square\"></i> {{selectAllButtonLabel}}</button>\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ToggleAllItemsSelection(false, true)\" [disabled]=\"disabled\"><i class=\"fa fa-eraser\"></i> {{clearSelectionButtonLabel}}</button>\n            </div>\n\n            <ul>\n                <li class=\"d-flex\" *ngFor=\"let item of options | searchBy : displayTextProperty : search\" [ngClass]=\"{'selected': item.selected}\">\n                    <div class=\"checkbox mr-3 flex-shrink-0\">\n                        <input type=\"checkbox\" name=\"{{identifier}}-option\" [(ngModel)]=\"item.selected\" (change)=\"ItemSelectedCheckChanged()\" [disabled]=\"disabled\" />\n                    </div>\n                    <span class=\"link\" (click)=\"ToggleItemSelected(item)\">{{item[displayTextProperty]}}</span>\n                </li>\n            </ul>\n\n            <small class=\"empty-results\" *ngIf=\"(options | searchBy : displayTextProperty : search).length == 0\">{{emptyMessage}}</small>\n        </div>\n\n        <small class=\"empty-results\" *ngIf=\"!options || options.length == 0\">{{emptyMessage}}</small>\n    </div>\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-multiselect{position:relative}.ui-multiselect *{-webkit-user-select:none;user-select:none}.ui-multiselect>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.ui-multiselect>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-multiselect>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-multiselect>.combobox .selected-items{margin-left:-5px;overflow:hidden}.ui-multiselect>.combobox .selected-items .badge{margin-right:3px;line-height:1;color:#888;background-color:#e0e0e0;border-bottom:2px solid #ccc;border-left:2px solid #ccc;padding:5px 7px 4px}.ui-multiselect>.combobox .selected-items .badge>span{display:inline-block;max-width:150px}.ui-multiselect>.combobox .selected-items .badge:hover{cursor:pointer;color:#fff;background-color:#007bff;border-bottom:2px solid #00559a;border-left:2px solid #00559a}.ui-multiselect>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-multiselect>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-multiselect>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-multiselect>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-multiselect>.combobox.has-validations.is-valid{border-color:#28a745}.ui-multiselect>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-multiselect>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-multiselect>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-multiselect>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-multiselect>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important;min-width:0}.ui-multiselect>.dropdown-options ul{max-height:300px;overflow-y:scroll;overflow-x:hidden;margin:0;padding:0}.ui-multiselect>.dropdown-options ul li{list-style:none;border-bottom:1px solid #ced4da}.ui-multiselect>.dropdown-options ul li>.checkbox{background-color:#f0f0f0;border-right:1px solid #ced4da;padding:12px 15px;display:flex;align-items:center}.ui-multiselect>.dropdown-options ul li>.checkbox input[type=checkbox]{width:17px;height:17px}.ui-multiselect>.dropdown-options ul li>span{cursor:pointer;padding:8px 0}.ui-multiselect>.dropdown-options ul li.selected{color:#007bff}.ui-multiselect>.dropdown-options ul li:hover{background-color:#f9f9f9}.ui-multiselect>.dropdown-options ul li:last-child{border-bottom:0}.ui-multiselect>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: ClickOutsideDirective, selector: "[clickOutside]", inputs: ["clickOutsideEnabled", "attachOutsideOnClick", "delayClickOutsideInit", "emitOnBlur", "exclude", "excludeBeforeClick", "clickOutsideEvents"], outputs: ["clickOutside"] }, { kind: "directive", type: AutoFocusDirective, selector: "[auto-focus]" }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i1$1.SlicePipe, name: "slice" }, { kind: "pipe", type: SearchByPipe, name: "searchBy" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputMultiselectComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-multiselect', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputMultiselectComponent,
                            multi: true
                        }], template: "<div [id]=\"identifier\" class=\"ui-multiselect\">\n    <label *ngIf=\"label\">\n        {{label}}\n        <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n        <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n    </label>\n\n    <input type=\"hidden\" [(ngModel)]=\"value\" />\n    <div class=\"combobox d-flex align-items-center justify-content-between\" \n        [ngClass]=\"{\n            'has-validations': showValidations,\n            'open': showOptions, \n            'disabled': disabled,\n            'is-valid': !showOptions && !disabled && comboTouched && (!isRequired || value?.length > 0),\n            'is-invalid': !showOptions && !disabled && comboTouched && isRequired && (!value || value.length == 0)\n        }\"\n        (click)=\"ToggleDropDown($event)\" (keyup)=\"OnComboPressed($event)\" tabindex=\"0\">\n\n        <span *ngIf=\"!value || value.length == 0\">{{placeholder}}</span>\n\n        <div *ngIf=\"value?.length > 0\" class=\"selected-items d-flex align-items-center\">\n            <span class=\"badge\" *ngFor=\"let item of value | slice:0:maxCountOfLabelsToShow; let i = index;\" (click)=\"RemoveItem(item, i, $event)\">\n                <span class=\"text-truncate\">{{item[displayTextProperty]}}</span>\n                <i class=\"fa fa-times ml-2\" *ngIf=\"!disabled\"></i>\n            </span>\n            <span *ngIf=\"value.length > maxCountOfLabelsToShow\">...</span>\n        </div>\n\n        <i class=\"fa\" [ngClass]=\"{'fa-caret-down': !showOptions, 'fa-caret-up': showOptions}\"></i>\n    </div>\n\n    <div class=\"dropdown-options shadow fadeInDown\" *ngIf=\"showOptions\" (clickOutside)=\"ToggleDropDown($event, false)\">\n        <div class=\"options-container\" *ngIf=\"options?.length > 0\">\n            <div class=\"toolbar d-flex align-items-center\">\n                <input type=\"text\" class=\"form-control flex-grow-1\" name=\"{{identifier}}-search\" [(ngModel)]=\"search\" placeholder=\"{{searchPlaceholder}}\" auto-focus />\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ToggleAllItemsSelection(true, true)\" [disabled]=\"disabled\"><i class=\"fa fa-check-square\"></i> {{selectAllButtonLabel}}</button>\n                <button type=\"button\" class=\"btn btn-light ml-1 flex-shrink-0\" (click)=\"ToggleAllItemsSelection(false, true)\" [disabled]=\"disabled\"><i class=\"fa fa-eraser\"></i> {{clearSelectionButtonLabel}}</button>\n            </div>\n\n            <ul>\n                <li class=\"d-flex\" *ngFor=\"let item of options | searchBy : displayTextProperty : search\" [ngClass]=\"{'selected': item.selected}\">\n                    <div class=\"checkbox mr-3 flex-shrink-0\">\n                        <input type=\"checkbox\" name=\"{{identifier}}-option\" [(ngModel)]=\"item.selected\" (change)=\"ItemSelectedCheckChanged()\" [disabled]=\"disabled\" />\n                    </div>\n                    <span class=\"link\" (click)=\"ToggleItemSelected(item)\">{{item[displayTextProperty]}}</span>\n                </li>\n            </ul>\n\n            <small class=\"empty-results\" *ngIf=\"(options | searchBy : displayTextProperty : search).length == 0\">{{emptyMessage}}</small>\n        </div>\n\n        <small class=\"empty-results\" *ngIf=\"!options || options.length == 0\">{{emptyMessage}}</small>\n    </div>\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-5%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}.ui-multiselect{position:relative}.ui-multiselect *{-webkit-user-select:none;user-select:none}.ui-multiselect>.combobox{outline:none;background-color:#fff;padding:.375rem .4rem .375rem .75rem;border:1px solid #ced4da;border-radius:.25rem}.ui-multiselect>.combobox>span{color:#6c757d;font-size:1rem;line-height:1.5}.ui-multiselect>.combobox>i{color:#495057;font-size:14px;margin-left:10px}.ui-multiselect>.combobox .selected-items{margin-left:-5px;overflow:hidden}.ui-multiselect>.combobox .selected-items .badge{margin-right:3px;line-height:1;color:#888;background-color:#e0e0e0;border-bottom:2px solid #ccc;border-left:2px solid #ccc;padding:5px 7px 4px}.ui-multiselect>.combobox .selected-items .badge>span{display:inline-block;max-width:150px}.ui-multiselect>.combobox .selected-items .badge:hover{cursor:pointer;color:#fff;background-color:#007bff;border-bottom:2px solid #00559a;border-left:2px solid #00559a}.ui-multiselect>.combobox.open{border-radius:.25rem .25rem 0 0}.ui-multiselect>.combobox.disabled{background-color:#e9ecef;border-color:#ced4da}.ui-multiselect>.combobox.has-validations.is-invalid{border-color:#dc3545}.ui-multiselect>.combobox.has-validations.is-invalid.open{box-shadow:0 0 0 .2rem #dc354540}.ui-multiselect>.combobox.has-validations.is-valid{border-color:#28a745}.ui-multiselect>.combobox.has-validations.is-valid.open{box-shadow:0 0 0 .2rem #28a74540}.ui-multiselect>.dropdown-options{background-color:#fff;border:1px solid #ced4da;border-radius:0 0 .25rem .25rem;position:absolute;top:100%;left:0;width:100%;z-index:20;margin-top:-1px;min-width:300px}.ui-multiselect>.dropdown-options>.options-container{display:inherit;position:initial;font-family:inherit;background-color:inherit;box-shadow:none;height:auto;width:auto;color:inherit;font-size:inherit;letter-spacing:inherit;line-height:inherit;padding:inherit;border-radius:inherit}.ui-multiselect>.dropdown-options .toolbar{padding:3px;border-bottom:1px solid #ced4da;background-color:#f8f9fa}.ui-multiselect>.dropdown-options .toolbar input[type=text]{background-color:transparent;border:0;padding:.375rem .55rem;box-shadow:none!important;min-width:0}.ui-multiselect>.dropdown-options ul{max-height:300px;overflow-y:scroll;overflow-x:hidden;margin:0;padding:0}.ui-multiselect>.dropdown-options ul li{list-style:none;border-bottom:1px solid #ced4da}.ui-multiselect>.dropdown-options ul li>.checkbox{background-color:#f0f0f0;border-right:1px solid #ced4da;padding:12px 15px;display:flex;align-items:center}.ui-multiselect>.dropdown-options ul li>.checkbox input[type=checkbox]{width:17px;height:17px}.ui-multiselect>.dropdown-options ul li>span{cursor:pointer;padding:8px 0}.ui-multiselect>.dropdown-options ul li.selected{color:#007bff}.ui-multiselect>.dropdown-options ul li:hover{background-color:#f9f9f9}.ui-multiselect>.dropdown-options ul li:last-child{border-bottom:0}.ui-multiselect>.dropdown-options .empty-results{font-style:italic;padding:12px;display:block;color:#6b6b6b}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }, { type: i0.IterableDiffers }];
    }, propDecorators: { placeholder: [{
                type: Input
            }], searchPlaceholder: [{
                type: Input
            }], displayTextProperty: [{
                type: Input
            }], valueProperty: [{
                type: Input
            }], emptyMessage: [{
                type: Input
            }], selectAllButtonLabel: [{
                type: Input
            }], clearSelectionButtonLabel: [{
                type: Input
            }], maxCountOfLabelsToShow: [{
                type: Input
            }], onChange: [{
                type: Output
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }], options: [{
                type: Input,
                args: ['options']
            }] } });

class MaxValueDirective {
    validate(c) {
        if (this.max == undefined || this.max == null)
            return null;
        return c.value > this.max
            ? { "invalid": true }
            : null;
    }
}
MaxValueDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MaxValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
MaxValueDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: MaxValueDirective, selector: "[max][ngModel]", inputs: { max: "max" }, providers: [{ provide: NG_VALIDATORS, useExisting: MaxValueDirective, multi: true }], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MaxValueDirective, decorators: [{
            type: Directive,
            args: [{
                    selector: '[max][ngModel]',
                    providers: [{ provide: NG_VALIDATORS, useExisting: MaxValueDirective, multi: true }]
                }]
        }], propDecorators: { max: [{
                type: Input
            }] } });

class MinValueDirective {
    validate(c) {
        if (this.min == undefined || this.min == null)
            return null;
        return c.value < this.min
            ? { "invalid": true }
            : null;
    }
}
MinValueDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MinValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
MinValueDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: MinValueDirective, selector: "[min][ngModel]", inputs: { min: "min" }, providers: [{ provide: NG_VALIDATORS, useExisting: MinValueDirective, multi: true }], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MinValueDirective, decorators: [{
            type: Directive,
            args: [{
                    selector: '[min][ngModel]',
                    providers: [{ provide: NG_VALIDATORS, useExisting: MinValueDirective, multi: true }]
                }]
        }], propDecorators: { min: [{
                type: Input
            }] } });

let identifier$9 = 0;
class InputNumberComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.identifier = `input-number-${identifier$9++}`;
    }
    ngOnInit() { }
}
InputNumberComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputNumberComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputNumberComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputNumberComponent, selector: "input-number", inputs: { maxValue: "maxValue", minValue: "minValue" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputNumberComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<input\n  class=\"form-control\"\n  type=\"number\"\n  [max]=\"maxValue\"\n  [min]=\"minValue\"\n  [disabled]=\"disabled\"\n  [autocomplete]=\"autocomplete\"\n  [(ngModel)]=\"value\"\n  [id]=\"identifier\"\n  [ngClass]=\"{\n    'is-valid': showValidations && !disabled && touched && !(invalid | async),\n    'is-invalid': showValidations && !disabled && touched && (invalid | async)\n  }\"\n/>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "directive", type: MaxValueDirective, selector: "[max][ngModel]", inputs: ["max"] }, { kind: "directive", type: MinValueDirective, selector: "[min][ngModel]", inputs: ["min"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputNumberComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-number', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputNumberComponent,
                            multi: true
                        }], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<input\n  class=\"form-control\"\n  type=\"number\"\n  [max]=\"maxValue\"\n  [min]=\"minValue\"\n  [disabled]=\"disabled\"\n  [autocomplete]=\"autocomplete\"\n  [(ngModel)]=\"value\"\n  [id]=\"identifier\"\n  [ngClass]=\"{\n    'is-valid': showValidations && !disabled && touched && !(invalid | async),\n    'is-invalid': showValidations && !disabled && touched && (invalid | async)\n  }\"\n/>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n" }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { maxValue: [{
                type: Input
            }], minValue: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$8 = 0;
class InputPercentComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.showInputGroup = true;
        this.inputGroupText = '%';
        this.placeholder = '';
        this.precision = 1;
        this.identifier = `input-percent-${identifier$8++}`;
    }
    ngOnInit() { }
}
InputPercentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputPercentComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputPercentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputPercentComponent, selector: "input-percent", inputs: { showInputGroup: "showInputGroup", inputGroupText: "inputGroupText", placeholder: "placeholder", precision: "precision" }, providers: [
        { provide: NG_VALUE_ACCESSOR, useExisting: InputPercentComponent, multi: true },
    ], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"showInputGroup\">\n    <span class=\"input-group-text\" [innerHtml]=\"inputGroupText\"></span>\n  </div>\n  <input\n    currencyMask\n    autoSelectOnFocus\n    class=\"form-control\"\n    [placeholder]=\"placeholder\"\n    [autocomplete]=\"autocomplete\"\n    [options]=\"{ precision: precision }\"\n    [disabled]=\"disabled\" \n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\"\n  />\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n  \n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AutoSelectOnFocusDirective, selector: "input[autoSelectOnFocus]" }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "directive", type: CurrencyMaskDirective, selector: "[currencyMask]", inputs: ["max", "min", "options"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputPercentComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-percent', providers: [
                        { provide: NG_VALUE_ACCESSOR, useExisting: InputPercentComponent, multi: true },
                    ], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"showInputGroup\">\n    <span class=\"input-group-text\" [innerHtml]=\"inputGroupText\"></span>\n  </div>\n  <input\n    currencyMask\n    autoSelectOnFocus\n    class=\"form-control\"\n    [placeholder]=\"placeholder\"\n    [autocomplete]=\"autocomplete\"\n    [options]=\"{ precision: precision }\"\n    [disabled]=\"disabled\" \n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\"\n  />\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n  \n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n" }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { showInputGroup: [{
                type: Input
            }], inputGroupText: [{
                type: Input
            }], placeholder: [{
                type: Input
            }], precision: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$7 = 0;
class InputRadioComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.identifier = `input-radio-${identifier$7++}`;
    }
}
InputRadioComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputRadioComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputRadioComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputRadioComponent, selector: "input-radio", inputs: { name: "name", radioValue: "radioValue" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputRadioComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"radio\">\n  <label>\n    <input type=\"radio\" \n      [name]=\"name\" \n      [value]=\"radioValue\"\n      [disabled]=\"disabled\" \n      [(ngModel)]=\"value\"\n      [id]=\"identifier\">\n    {{label}}\n  </label>\n</div>", dependencies: [{ kind: "directive", type: i2.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.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputRadioComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-radio', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputRadioComponent,
                            multi: true
                        }], template: "<div class=\"radio\">\n  <label>\n    <input type=\"radio\" \n      [name]=\"name\" \n      [value]=\"radioValue\"\n      [disabled]=\"disabled\" \n      [(ngModel)]=\"value\"\n      [id]=\"identifier\">\n    {{label}}\n  </label>\n</div>" }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { name: [{
                type: Input
            }], radioValue: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$6 = 0;
class InputSelectComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.identifier = `input-select-${identifier$6++}`;
    }
    ngOnInit() {
        setTimeout(() => {
            this.handleInitialValue();
        });
    }
    ngDoCheck() {
        this.handleInitialValue();
    }
    getOptionDisplayText(option) {
        const prop = this.displayTextProperty || 'displayText';
        return option[prop];
    }
    getOptionValue(option) {
        const prop = this.valueProperty || 'value';
        return option[prop];
    }
    handleInitialValue() {
        if (this.value != undefined && this.value != null) {
            this.value = this.value.toString();
        }
        else {
            this.writeValue('');
        }
    }
}
InputSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputSelectComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputSelectComponent, selector: "input-select", inputs: { displayTextProperty: "displayTextProperty", valueProperty: "valueProperty", defaultOption: "defaultOption", options: "options" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputSelectComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<select class=\"form-control\" \n  [(ngModel)]=\"value\"\n  [id]=\"identifier\" \n  [disabled]=\"disabled\" \n  [ngClass]=\"{\n    'is-valid': showValidations && !disabled && touched && !(invalid | async),\n    'is-invalid': showValidations && !disabled && touched && (invalid | async)\n  }\">\n  <option value=\"\" *ngIf=\"defaultOption\">{{defaultOption}}</option>\n  <option [value]=\"getOptionValue(option)\" *ngFor=\"let option of options\">{{getOptionDisplayText(option)}}</option>\n  <ng-content></ng-content>\n</select>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", styles: [".form-control.is-invalid,.was-validated .form-control:invalid,.form-control.is-valid,.was-validated .form-control:valid{background-position:center right calc(.875em + .1875rem)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputSelectComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-select', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputSelectComponent,
                            multi: true
                        }], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<select class=\"form-control\" \n  [(ngModel)]=\"value\"\n  [id]=\"identifier\" \n  [disabled]=\"disabled\" \n  [ngClass]=\"{\n    'is-valid': showValidations && !disabled && touched && !(invalid | async),\n    'is-invalid': showValidations && !disabled && touched && (invalid | async)\n  }\">\n  <option value=\"\" *ngIf=\"defaultOption\">{{defaultOption}}</option>\n  <option [value]=\"getOptionValue(option)\" *ngFor=\"let option of options\">{{getOptionDisplayText(option)}}</option>\n  <ng-content></ng-content>\n</select>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", styles: [".form-control.is-invalid,.was-validated .form-control:invalid,.form-control.is-valid,.was-validated .form-control:valid{background-position:center right calc(.875em + .1875rem)}\n"] }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { displayTextProperty: [{
                type: Input
            }], valueProperty: [{
                type: Input
            }], defaultOption: [{
                type: Input
            }], options: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$5 = 0;
class InputSwitchComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.onChange = new EventEmitter();
        this.identifier = `input-switch-${identifier$5++}`;
    }
    Toggle() {
        if (this.disabled)
            return;
        this.value = !this.value;
        this.onChange.emit(this.value);
    }
}
InputSwitchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputSwitchComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputSwitchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputSwitchComponent, selector: "input-switch", outputs: { onChange: "onChange" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputSwitchComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"ui-switch\">\n  <div class=\"d-flex align-items-center\">\n    <div class=\"switch\" (click)=\"Toggle()\" [ngClass]=\"{'on': value, 'disabled': disabled}\">\n      <div class=\"switch-toggler\"></div>\n    </div>\n    <label class=\"ml-2 mb-0\" *ngIf=\"label\">\n      {{label}}\n    </label>\n  </div>\n</div>", styles: [".ui-switch .switch{position:relative;background-color:#f9f9f9;border:1px solid #dfdfdf;min-width:50px;height:30px;border-radius:30px;box-shadow:#dfdfdf 0 0 inset;transition:.3s ease-out all;cursor:pointer}.ui-switch .switch .switch-toggler{position:absolute;top:0;right:calc(100% - 30px);background-color:#fff;border-radius:100%;box-shadow:0 1px 3px #0006;width:30px;height:28px;transition:.3s ease-out all}.ui-switch .switch.on{background-color:#64bd63}.ui-switch .switch.on .switch-toggler{left:auto;right:0}.ui-switch .switch.disabled{background-color:#d2d2d2;border-color:#bdbdbd}.ui-switch .switch.disabled .switch-toggler{background-color:#eee}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputSwitchComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-switch', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputSwitchComponent,
                            multi: true
                        }], template: "<div class=\"ui-switch\">\n  <div class=\"d-flex align-items-center\">\n    <div class=\"switch\" (click)=\"Toggle()\" [ngClass]=\"{'on': value, 'disabled': disabled}\">\n      <div class=\"switch-toggler\"></div>\n    </div>\n    <label class=\"ml-2 mb-0\" *ngIf=\"label\">\n      {{label}}\n    </label>\n  </div>\n</div>", styles: [".ui-switch .switch{position:relative;background-color:#f9f9f9;border:1px solid #dfdfdf;min-width:50px;height:30px;border-radius:30px;box-shadow:#dfdfdf 0 0 inset;transition:.3s ease-out all;cursor:pointer}.ui-switch .switch .switch-toggler{position:absolute;top:0;right:calc(100% - 30px);background-color:#fff;border-radius:100%;box-shadow:0 1px 3px #0006;width:30px;height:28px;transition:.3s ease-out all}.ui-switch .switch.on{background-color:#64bd63}.ui-switch .switch.on .switch-toggler{left:auto;right:0}.ui-switch .switch.disabled{background-color:#d2d2d2;border-color:#bdbdbd}.ui-switch .switch.disabled .switch-toggler{background-color:#eee}\n"] }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }], onChange: [{
                type: Output
            }] } });

/**
 * @hidden
 */
const MASK_FLAGS = ['C', '&', 'a', 'A', '?', 'L', '9', '0', '#'];
/**
 * @hidden
 */
const KEYS = {
    Ctrl: 17,
    Z: 90,
    Y: 89,
    X: 88,
    BACKSPACE: 8,
    DELETE: 46
};
/**
 * @hidden
 */
class MaskHelper {
    get cursor() {
        return this._cursor;
    }
    parseValueByMask(value, maskOptions, cursor) {
        let inputValue = value;
        const mask = maskOptions.format;
        const literals = this.getMaskLiterals(mask);
        const literalKeys = Array.from(literals.keys());
        const nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys);
        if (inputValue.length < mask.length) { // BACKSPACE, DELETE
            if (inputValue === '' && cursor === -1) {
                this._cursor = 0;
                return this.parseValueByMaskOnInit(value, maskOptions);
            } // workaround for IE 'x' button
            if (nonLiteralIndeces.indexOf(cursor + 1) !== -1) {
                inputValue = this.insertCharAt(inputValue, cursor + 1, maskOptions.promptChar);
                this._cursor = cursor + 1;
            }
            else {
                inputValue = this.insertCharAt(inputValue, cursor + 1, mask[cursor + 1]);
                this._cursor = cursor + 1;
                for (let i = this._cursor; i < 0; i--) {
                    if (literalKeys.indexOf(this._cursor) !== -1) {
                        this._cursor--;
                    }
                    else {
                        break;
                    }
                }
            }
        }
        else {
            const char = inputValue[cursor];
            let isCharValid = this.validateCharOnPostion(char, cursor, mask);
            if (nonLiteralIndeces.indexOf(cursor) !== -1) {
                inputValue = this.replaceCharAt(inputValue, cursor, '');
                if (isCharValid) {
                    inputValue = this.replaceCharAt(inputValue, cursor, char);
                    this._cursor = cursor + 1;
                }
                else {
                    this._cursor = cursor;
                }
            }
            else {
                inputValue = this.replaceCharAt(inputValue, cursor, '');
                this._cursor = ++cursor;
                for (let i = cursor; i < mask.length; i++) {
                    if (literalKeys.indexOf(this._cursor) !== -1) {
                        this._cursor = ++cursor;
                    }
                    else {
                        isCharValid = this.validateCharOnPostion(char, cursor, mask);
                        if (isCharValid) {
                            inputValue = this.replaceCharAt(inputValue, cursor, char);
                            this._cursor = ++cursor;
                            break;
                        }
                        else {
                            break;
                        }
                    }
                }
            }
        }
        return inputValue;
    }
    parseMask(maskOptions) {
        let outputVal = '';
        const mask = maskOptions.format;
        const literals = this.getMaskLiterals(mask);
        for (const maskSym of mask) {
            outputVal += maskOptions.promptChar;
        }
        literals.forEach((val, key) => {
            outputVal = this.replaceCharAt(outputVal, key, val);
        });
        return outputVal;
    }
    parseValueByMaskOnInit(inputVal, maskOptions) {
        let outputVal = '';
        let value = '';
        const mask = maskOptions.format;
        const literals = this.getMaskLiterals(mask);
        const literalKeys = Array.from(literals.keys());
        const nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys);
        const literalValues = Array.from(literals.values());
        if (inputVal != null) {
            value = inputVal.toString();
        }
        for (const maskSym of mask) {
            outputVal += maskOptions.promptChar;
        }
        literals.forEach((val, key) => {
            outputVal = this.replaceCharAt(outputVal, key, val);
        });
        if (!value) {
            return outputVal;
        }
        const nonLiteralValues = this.getNonLiteralValues(value, literalValues);
        for (let i = 0; i < nonLiteralValues.length; i++) {
            const char = nonLiteralValues[i];
            const isCharValid = this.validateCharOnPostion(char, nonLiteralIndeces[i], mask);
            if (!isCharValid && char !== maskOptions.promptChar) {
                nonLiteralValues[i] = maskOptions.promptChar;
            }
        }
        if (nonLiteralValues.length > nonLiteralIndeces.length) {
            nonLiteralValues.splice(nonLiteralIndeces.length);
        }
        let pos = 0;
        for (const nonLiteralValue of nonLiteralValues) {
            const char = nonLiteralValue;
            outputVal = this.replaceCharAt(outputVal, nonLiteralIndeces[pos++], char);
        }
        return outputVal;
    }
    restoreValueFromMask(value, maskOptions) {
        let outputVal = '';
        const mask = maskOptions.format;
        const literals = this.getMaskLiterals(mask);
        const literalValues = Array.from(literals.values());
        for (const val of value) {
            if (literalValues.indexOf(val) === -1) {
                if (val !== maskOptions.promptChar) {
                    outputVal += val;
                }
            }
        }
        return outputVal;
    }
    parseValueByMaskUponSelection(value, maskOptions, cursor, selection) {
        let isCharValid;
        let inputValue = value;
        const char = inputValue[cursor];
        const mask = maskOptions.format;
        const literals = this.getMaskLiterals(mask);
        const literalKeys = Array.from(literals.keys());
        const nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys);
        if (!this.data) {
            this._cursor = cursor < 0 ? ++cursor : cursor;
            if (nonLiteralIndeces.indexOf(this._cursor) !== -1) {
                isCharValid = this.validateCharOnPostion(char, this._cursor, mask);
                inputValue = isCharValid ? this.replaceCharAt(inputValue, this._cursor++, char) :
                    inputValue = this.replaceCharAt(inputValue, this._cursor++, maskOptions.promptChar);
                selection--;
                if (selection > 0) {
                    for (let i = 0; i < selection; i++) {
                        cursor++;
                        inputValue = nonLiteralIndeces.indexOf(cursor) !== -1 ?
                            this.insertCharAt(inputValue, cursor, maskOptions.promptChar) :
                            this.insertCharAt(inputValue, cursor, mask[cursor]);
                    }
                }
            }
            else {
                inputValue = this.replaceCharAt(inputValue, this._cursor, mask[this._cursor]);
                this._cursor++;
                selection--;
                let isMarked = false;
                if (selection > 0) {
                    cursor = this._cursor;
                    for (let i = 0; i < selection; i++) {
                        if (nonLiteralIndeces.indexOf(cursor) !== -1) {
                            isCharValid = this.validateCharOnPostion(char, cursor, mask);
                            if (isCharValid && !isMarked) {
                                inputValue = this.insertCharAt(inputValue, cursor, char);
                                cursor++;
                                this._cursor++;
                                isMarked = true;
                            }
                            else {
                                inputValue = this.insertCharAt(inputValue, cursor, maskOptions.promptChar);
                                cursor++;
                            }
                        }
                        else {
                            inputValue = this.insertCharAt(inputValue, cursor, mask[cursor]);
                            if (cursor === this._cursor) {
                                this._cursor++;
                            }
                            cursor++;
                        }
                    }
                }
            }
        }
        else {
            if (inputValue === '' && cursor === -1) {
                this._cursor = 0;
                return this.parseValueByMaskOnInit(value, maskOptions);
            } // workaround for IE 'x' button
            if (this._cursor < 0) {
                this._cursor++;
                cursor++;
            }
            cursor++;
            this._cursor = cursor;
            for (let i = 0; i < selection; i++) {
                if (nonLiteralIndeces.indexOf(cursor) !== -1) {
                    inputValue = this.insertCharAt(inputValue, cursor, maskOptions.promptChar);
                    cursor++;
                }
                else {
                    inputValue = this.insertCharAt(inputValue, cursor, mask[cursor]);
                    cursor++;
                }
            }
        }
        return inputValue;
    }
    parseValueByMaskUponCopyPaste(value, maskOptions, cursor, clipboardData, selection) {
        let inputValue = value;
        const mask = maskOptions.format;
        const literals = this.getMaskLiterals(mask);
        const literalKeys = Array.from(literals.keys());
        const nonLiteralIndeces = this.getNonLiteralIndeces(mask, literalKeys);
        const selectionEnd = cursor + selection;
        this._cursor = cursor;
        for (const clipboardSym of clipboardData) {
            const char = clipboardSym;
            if (this._cursor > mask.length) {
                return inputValue;
            }
            if (nonLiteralIndeces.indexOf(this._cursor) !== -1) {
                const isCharValid = this.validateCharOnPostion(char, this._cursor, mask);
                if (isCharValid) {
                    inputValue = this.replaceCharAt(inputValue, this._cursor++, char);
                }
            }
            else {
                for (let i = cursor; i < mask.length; i++) {
                    if (literalKeys.indexOf(this._cursor) !== -1) {
                        this._cursor++;
                    }
                    else {
                        const isCharValid = this.validateCharOnPostion(char, this._cursor, mask);
                        if (isCharValid) {
                            inputValue = this.replaceCharAt(inputValue, this._cursor++, char);
                        }
                        break;
                    }
                }
            }
            selection--;
        }
        if (selection > 0) {
            for (let i = this._cursor; i < selectionEnd; i++) {
                if (literalKeys.indexOf(this._cursor) !== -1) {
                    this._cursor++;
                }
                else {
                    inputValue = this.replaceCharAt(inputValue, this._cursor++, maskOptions.promptChar);
                }
            }
        }
        return inputValue;
    }
    validateCharOnPostion(inputChar, position, mask) {
        let regex;
        let isValid;
        const letterOrDigitRegEx = '[\\d\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z]';
        const letterDigitOrSpaceRegEx = '[\\d\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z\\u0020]';
        const letterRegEx = '[\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z]';
        const letteSpaceRegEx = '[\\u00C0-\\u1FFF\\u2C00-\\uD7FFa-zA-Z\\u0020]';
        const digitRegEx = '[\\d]';
        const digitSpaceRegEx = '[\\d\\u0020]';
        const digitSpecialRegEx = '[\\d-\\+]';
        switch (mask.charAt(position)) {
            case 'C':
                isValid = inputChar !== '';
                break;
            case '&':
                regex = new RegExp('[\\u0020]');
                isValid = !regex.test(inputChar);
                break;
            case 'a':
                regex = new RegExp(letterDigitOrSpaceRegEx);
                isValid = regex.test(inputChar);
                break;
            case 'A':
                regex = new RegExp(letterOrDigitRegEx);
                isValid = regex.test(inputChar);
                break;
            case '?':
                regex = new RegExp(letteSpaceRegEx);
                isValid = regex.test(inputChar);
                break;
            case 'L':
                regex = new RegExp(letterRegEx);
                isValid = regex.test(inputChar);
                break;
            case '0':
                regex = new RegExp(digitRegEx);
                isValid = regex.test(inputChar);
                break;
            case '9':
                regex = new RegExp(digitSpaceRegEx);
                isValid = regex.test(inputChar);
                break;
            case '#':
                regex = new RegExp(digitSpecialRegEx);
                isValid = regex.test(inputChar);
                break;
            default: {
                isValid = null;
            }
        }
        return isValid;
    }
    replaceCharAt(strValue, index, char) {
        if (strValue !== undefined) {
            return strValue.substring(0, index) + char + strValue.substring(index + 1);
        }
    }
    insertCharAt(strValue, index, char) {
        if (strValue !== undefined) {
            return strValue.substring(0, index) + char + strValue.substring(index);
        }
    }
    getMaskLiterals(mask) {
        const literals = new Map();
        for (let i = 0; i < mask.length; i++) {
            const char = mask.charAt(i);
            if (MASK_FLAGS.indexOf(char) === -1) {
                literals.set(i, char);
            }
        }
        return literals;
    }
    getNonLiteralIndeces(mask, literalKeys) {
        const nonLiteralsIndeces = new Array();
        for (let i = 0; i < mask.length; i++) {
            if (literalKeys.indexOf(i) === -1) {
                nonLiteralsIndeces.push(i);
            }
        }
        return nonLiteralsIndeces;
    }
    getNonLiteralValues(value, literalValues) {
        const nonLiteralValues = new Array();
        for (const val of value) {
            if (literalValues.indexOf(val) === -1) {
                nonLiteralValues.push(val);
            }
        }
        return nonLiteralValues;
    }
}

/**
 *@hidden
 */
function cloneArray(array, deep) {
    const arr = [];
    if (!array) {
        return arr;
    }
    let i = array.length;
    while (i--) {
        arr[i] = deep ? cloneValue(array[i]) : array[i];
    }
    return arr;
}
/**
 * Doesn't clone leaf items
 * @hidden
 */
function cloneHierarchicalArray(array, childDataKey) {
    const result = [];
    if (!array) {
        return result;
    }
    for (const item of array) {
        const clonedItem = cloneValue(item);
        if (Array.isArray(item[childDataKey])) {
            clonedItem[childDataKey] = cloneHierarchicalArray(clonedItem[childDataKey], childDataKey);
        }
        result.push(clonedItem);
    }
    return result;
}
/**
 * Deep clones all first level keys of Obj2 and merges them to Obj1
 * @param obj1 Object to merge into
 * @param obj2 Object to merge from
 * @returns Obj1 with merged cloned keys from Obj2
 * @hidden
 */
function mergeObjects(obj1, obj2) {
    if (!isObject(obj1)) {
        throw new Error(`Cannot merge into ${obj1}. First param must be an object.`);
    }
    if (!isObject(obj2)) {
        return obj1;
    }
    for (const key of Object.keys(obj2)) {
        obj1[key] = cloneValue(obj2[key]);
    }
    return obj1;
}
/**
 * Creates deep clone of provided value.
 * Supports primitive values, dates and objects.
 * If passed value is array returns shallow copy of the array.
 * @param value value to clone
 * @returns Deep copy of provided value
 *@hidden
 */
function cloneValue(value) {
    if (isDate(value)) {
        return new Date(value.getTime());
    }
    if (Array.isArray(value)) {
        return [...value];
    }
    if (value instanceof Map || value instanceof Set) {
        return value;
    }
    if (isObject(value)) {
        const result = {};
        for (const key of Object.keys(value)) {
            result[key] = cloneValue(value[key]);
        }
        return result;
    }
    return value;
}
/**
 * Checks if provided variable is Object
 * @param value Value to check
 * @returns true if provided variable is Object
 *@hidden
 */
function isObject(value) {
    return value && value.toString() === '[object Object]';
}
/**
 * Checks if provided variable is Date
 * @param value Value to check
 * @returns true if provided variable is Date
 *@hidden
 */
function isDate(value) {
    return Object.prototype.toString.call(value) === '[object Date]';
}
/**
 * Checks if the two passed arguments are equal
 * Currently supports date objects
 * @param obj1
 * @param obj2
 * @returns: `boolean`
 * @hidden
 */
function isEqual(obj1, obj2) {
    if (isDate(obj1) && isDate(obj2)) {
        return obj1.getTime() === obj2.getTime();
    }
    return obj1 === obj2;
}
/**
 *@hidden
* Returns the actual size of the node content, using Range
* ```typescript
* let range = document.createRange();
* let column = this.grid.columnList.filter(c => c.field === 'ID')[0];
*
* let size = getNodeSizeViaRange(range, column.cells[0].nativeElement);
* ```
 */
function getNodeSizeViaRange(range, node) {
    let overflow = null;
    if (isIE() || isEdge()) {
        overflow = node.style.overflow;
        // we need that hack - otherwise content won't be measured correctly in IE/Edge
        node.style.overflow = 'visible';
    }
    range.selectNodeContents(node);
    const width = range.getBoundingClientRect().width;
    if (isIE() || isEdge()) {
        // we need that hack - otherwise content won't be measured correctly in IE/Edge
        node.style.overflow = overflow;
    }
    return width;
}
/**
 *@hidden
* Returns the actual size of the node content, using Canvas
* ```typescript
* let ctx = document.createElement('canvas').getContext('2d');
* let column = this.grid.columnList.filter(c => c.field === 'ID')[0];
*
* let size = valToPxlsUsingCanvas(ctx, column.cells[0].nativeElement);
* ```
 */
function getNodeSizeViaCanvas(canvas2dCtx, node) {
    const s = this.grid.document.defaultView.getComputedStyle(node);
    // need to set the font to get correct width
    canvas2dCtx.font = s.fontSize + ' ' + s.fontFamily;
    return canvas2dCtx.measureText(node.textContent).width;
}
/**
 *@hidden
 */
function isIE() {
    return navigator.appVersion.indexOf('Trident/') > 0;
}
/**
 *@hidden
 */
function isEdge() {
    const edgeBrowser = /Edge[\/\s](\d+\.\d+)/.test(navigator.userAgent);
    return edgeBrowser;
}
/**
 *@hidden
 */
function isFirefox() {
    const firefoxBrowser = /Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent);
    return firefoxBrowser;
}
/** @hidden */
function isNavigationKey(key) {
    return ['down', 'up', 'left', 'right', 'arrowdown', 'arrowup', 'arrowleft', 'arrowright',
        'home', 'end', 'space', 'spacebar', ' '].indexOf(key) !== -1;
}
/**
 *@hidden
 */
function flatten(arr) {
    let result = [];
    arr.forEach(el => {
        result.push(el);
        if (el.children) {
            const children = Array.isArray(el.children) ? el.children : el.children.toArray();
            result = result.concat(flatten(children));
        }
    });
    return result;
}
const NAVIGATION_KEYS = new Set(['down', 'up', 'left', 'right', 'arrowdown', 'arrowup', 'arrowleft', 'arrowright',
    'home', 'end', 'space', 'spacebar', ' ']);
const ROW_EXPAND_KEYS = new Set('right down arrowright arrowdown'.split(' '));
const ROW_COLLAPSE_KEYS = new Set('left up arrowleft arrowup'.split(' '));
const SUPPORTED_KEYS = new Set([...Array.from(NAVIGATION_KEYS), 'tab', 'enter', 'f2', 'escape', 'esc']);

const noop = () => { };
class MaskDirective {
    constructor(elementRef) {
        this.elementRef = elementRef;
        this.onValueChange = new EventEmitter();
        this._maskOptions = {
            format: '',
            promptChar: ''
        };
        this._onTouchedCallback = noop;
        this._onChangeCallback = noop;
        this.maskHelper = new MaskHelper();
    }
    set placeholder(val) {
        this._placeholder = val;
        this.nativeElement.setAttribute('placeholder', this._placeholder);
    }
    get placeholder() {
        return this._placeholder;
    }
    get value() {
        return this.nativeElement.value;
    }
    set value(val) {
        this.nativeElement.value = val;
    }
    get nativeElement() {
        return this.elementRef.nativeElement;
    }
    get selectionStart() {
        return this.nativeElement.selectionStart;
    }
    get selectionEnd() {
        return this.nativeElement.selectionEnd;
    }
    ngOnInit() {
        if (this.promptChar && this.promptChar.length > 1) {
            this._maskOptions.promptChar = this.promptChar = this.promptChar.substring(0, 1);
        }
        this._maskOptions.format = this.mask ? this.mask : 'CCCCCCCCCC';
        this._maskOptions.promptChar = this.promptChar ? this.promptChar : '_';
        this.nativeElement.setAttribute('placeholder', this.placeholder ? this.placeholder : this._maskOptions.format);
    }
    onKeydown(event) {
        const key = event.keyCode || event.charCode;
        if (isIE() && this._stopPropagation) {
            this._stopPropagation = false;
        }
        if (key === KEYS.Ctrl) {
            this._ctrlDown = true;
        }
        if ((this._ctrlDown && key === KEYS.Z) || (this._ctrlDown && key === KEYS.Y)) {
            event.preventDefault();
        }
        this._key = key;
        this._selection = Math.abs(this.selectionEnd - this.selectionStart);
    }
    onKeyup(event) {
        const key = event.keyCode || event.charCode;
        if (key === KEYS.Ctrl) {
            this._ctrlDown = false;
        }
    }
    onPaste(event) {
        this._paste = true;
        this._valOnPaste = this.value;
        this._cursorOnPaste = this.getCursorPosition();
    }
    onInputChanged(event) {
        if (isIE() && this._stopPropagation) {
            this._stopPropagation = false;
            return;
        }
        if (this._paste) {
            this._paste = false;
            const clipboardData = this.value.substring(this._cursorOnPaste, this.getCursorPosition());
            this.value = this.maskHelper.parseValueByMaskUponCopyPaste(this._valOnPaste, this._maskOptions, this._cursorOnPaste, clipboardData, this._selection);
            this.setCursorPosition(this.maskHelper.cursor);
        }
        else {
            const currentCursorPos = this.getCursorPosition();
            this.maskHelper.data = (this._key === KEYS.BACKSPACE) || (this._key === KEYS.DELETE);
            this.value = this._selection && this._selection !== 0 ?
                this.maskHelper.parseValueByMaskUponSelection(this.value, this._maskOptions, currentCursorPos - 1, this._selection) :
                this.maskHelper.parseValueByMask(this.value, this._maskOptions, currentCursorPos - 1);
            this.setCursorPosition(this.maskHelper.cursor);
        }
        const rawVal = this.maskHelper.restoreValueFromMask(this.value, this._maskOptions);
        this.dataValue = this.includeLiterals ? this.value : rawVal;
        this._onChangeCallback(this.dataValue);
        this.onValueChange.emit({ rawValue: rawVal, formattedValue: this.value });
    }
    onFocus(value) {
        if (this.focusedValuePipe) {
            if (isIE()) {
                this._stopPropagation = true;
            }
            this.value = this.focusedValuePipe.transform(value);
        }
        else {
            this.value = this.maskHelper.parseValueByMaskOnInit(this.value, this._maskOptions);
        }
    }
    onBlur(value) {
        if (this.displayValuePipe) {
            this.value = this.displayValuePipe.transform(value);
        }
        else if (value === this.maskHelper.parseMask(this._maskOptions)) {
            this.value = '';
        }
    }
    getCursorPosition() {
        return this.nativeElement.selectionStart;
    }
    setCursorPosition(start, end = start) {
        this.nativeElement.setSelectionRange(start, end);
    }
    writeValue(value) {
        if (this.promptChar && this.promptChar.length > 1) {
            this._maskOptions.promptChar = this.promptChar.substring(0, 1);
        }
        this.value = value ? this.maskHelper.parseValueByMaskOnInit(value, this._maskOptions) : '';
        if (this.displayValuePipe) {
            this.value = this.displayValuePipe.transform(this.value);
        }
        this.dataValue = this.includeLiterals ? this.value : value;
        //this._onChangeCallback(this.dataValue);
        this.onValueChange.emit({ rawValue: value, formattedValue: this.value });
    }
    registerOnChange(fn) { this._onChangeCallback = fn; }
    registerOnTouched(fn) { this._onTouchedCallback = fn; }
    setDisabledState(isDisabled) {
        this.nativeElement.setAttribute('disabled', isDisabled);
    }
}
MaskDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MaskDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
MaskDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: MaskDirective, selector: "[mask]", inputs: { mask: "mask", promptChar: "promptChar", includeLiterals: "includeLiterals", placeholder: "placeholder", displayValuePipe: "displayValuePipe", focusedValuePipe: "focusedValuePipe", dataValue: "dataValue" }, outputs: { onValueChange: "onValueChange" }, host: { listeners: { "keydown": "onKeydown($event)", "keyup": "onKeyup($event)", "paste": "onPaste($event)", "input": "onInputChanged($event)", "focus": "onFocus($event.target.value)", "blur": "onBlur($event.target.value)" } }, providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: MaskDirective, multi: true }], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: MaskDirective, decorators: [{
            type: Directive,
            args: [{
                    providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: MaskDirective, multi: true }],
                    selector: '[mask]'
                }]
        }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { mask: [{
                type: Input,
                args: ['mask']
            }], promptChar: [{
                type: Input
            }], includeLiterals: [{
                type: Input
            }], placeholder: [{
                type: Input
            }], displayValuePipe: [{
                type: Input
            }], focusedValuePipe: [{
                type: Input
            }], dataValue: [{
                type: Input
            }], onValueChange: [{
                type: Output
            }], onKeydown: [{
                type: HostListener,
                args: ['keydown', ['$event']]
            }], onKeyup: [{
                type: HostListener,
                args: ['keyup', ['$event']]
            }], onPaste: [{
                type: HostListener,
                args: ['paste', ['$event']]
            }], onInputChanged: [{
                type: HostListener,
                args: ['input', ['$event']]
            }], onFocus: [{
                type: HostListener,
                args: ['focus', ['$event.target.value']]
            }], onBlur: [{
                type: HostListener,
                args: ['blur', ['$event.target.value']]
            }] } });

let identifier$4 = 0;
class InputTextMaskComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.placeholder = '';
        this.includeLiterals = false;
        this.wasTouched = false;
        this.identifier = `input-text-mask-${identifier$4++}`;
    }
    ngOnInit() {
    }
    onTouch() {
        this.wasTouched = true;
    }
}
InputTextMaskComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputTextMaskComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputTextMaskComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputTextMaskComponent, selector: "input-text-mask", inputs: { placeholder: "placeholder", masking: "masking", includeLiterals: "includeLiterals" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputTextMaskComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<input \n    type=\"text\" \n    class=\"form-control\" \n    [disabled]=\"disabled\" \n    [placeholder]=\"placeholder\"  \n    [autocomplete]=\"autocomplete\"\n    [mask]=\"masking\"\n    [includeLiterals]=\"includeLiterals\"\n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    autoSelectOnFocus\n    [ngClass]=\"{\n        'is-valid': showValidations && !disabled && wasTouched && !(invalid | async),\n        'is-invalid': showValidations && !disabled && wasTouched && (invalid | async)\n    }\"\n    (blur)=\"onTouch()\" />\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n    *ngIf=\"showValidations && !disabled && wasTouched && (invalid | async)\"\n    [messages]=\"failures | async\">\n</input-validations>\n  ", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: AutoSelectOnFocusDirective, selector: "input[autoSelectOnFocus]" }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "directive", type: MaskDirective, selector: "[mask]", inputs: ["mask", "promptChar", "includeLiterals", "placeholder", "displayValuePipe", "focusedValuePipe", "dataValue"], outputs: ["onValueChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputTextMaskComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-text-mask', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputTextMaskComponent,
                            multi: true
                        }], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n    {{label}}\n    <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n    <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<input \n    type=\"text\" \n    class=\"form-control\" \n    [disabled]=\"disabled\" \n    [placeholder]=\"placeholder\"  \n    [autocomplete]=\"autocomplete\"\n    [mask]=\"masking\"\n    [includeLiterals]=\"includeLiterals\"\n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    autoSelectOnFocus\n    [ngClass]=\"{\n        'is-valid': showValidations && !disabled && wasTouched && !(invalid | async),\n        'is-invalid': showValidations && !disabled && wasTouched && (invalid | async)\n    }\"\n    (blur)=\"onTouch()\" />\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n    *ngIf=\"showValidations && !disabled && wasTouched && (invalid | async)\"\n    [messages]=\"failures | async\">\n</input-validations>\n  " }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { placeholder: [{
                type: Input
            }], masking: [{
                type: Input
            }], includeLiterals: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$3 = 0;
class InputTextComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.placeholder = '';
        this.identifier = `input-text-${identifier$3++}`;
    }
    ngOnInit() {
    }
}
InputTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputTextComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputTextComponent, selector: "input-text", inputs: { placeholder: "placeholder", inputGroupPrepend: "inputGroupPrepend", inputGroupAppend: "inputGroupAppend", maxlength: "maxlength" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputTextComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"inputGroupPrepend\">\n    <span class=\"input-group-text\" [innerHtml]=\"inputGroupPrepend\"></span>\n  </div>\n\n  <input \n    type=\"text\" \n    class=\"form-control\" \n    [maxlength]=\"maxlength\"\n    [disabled]=\"disabled\" \n    [placeholder]=\"placeholder\"  \n    [autocomplete]=\"autocomplete\"\n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\" />\n\n    <div class=\"input-group-append\" *ngIf=\"inputGroupAppend\">\n      <span class=\"input-group-text\" [innerHtml]=\"inputGroupAppend\"></span>\n    </div>\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputTextComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-text', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputTextComponent,
                            multi: true
                        }], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<div class=\"input-group\">\n  <div class=\"input-group-prepend\" *ngIf=\"inputGroupPrepend\">\n    <span class=\"input-group-text\" [innerHtml]=\"inputGroupPrepend\"></span>\n  </div>\n\n  <input \n    type=\"text\" \n    class=\"form-control\" \n    [maxlength]=\"maxlength\"\n    [disabled]=\"disabled\" \n    [placeholder]=\"placeholder\"  \n    [autocomplete]=\"autocomplete\"\n    [(ngModel)]=\"value\"\n    [id]=\"identifier\"\n    [ngClass]=\"{\n      'is-valid': showValidations && !disabled && touched && !(invalid | async),\n      'is-invalid': showValidations && !disabled && touched && (invalid | async)\n    }\" />\n\n    <div class=\"input-group-append\" *ngIf=\"inputGroupAppend\">\n      <span class=\"input-group-text\" [innerHtml]=\"inputGroupAppend\"></span>\n    </div>\n</div>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n" }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { placeholder: [{
                type: Input
            }], inputGroupPrepend: [{
                type: Input
            }], inputGroupAppend: [{
                type: Input
            }], maxlength: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$2 = 0;
class InputTextareaComponent extends ElementBase {
    constructor(validators, asyncValidators, config) {
        super(validators, asyncValidators, config);
        this.config = config;
        this.placeholder = '';
        this.identifier = `input-textarea-${identifier$2++}`;
    }
    ngOnInit() { }
}
InputTextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputTextareaComponent, deps: [{ token: NG_VALIDATORS, optional: true }, { token: NG_ASYNC_VALIDATORS, optional: true }, { token: INPUT_FORMS_CONFIG }], target: i0.ɵɵFactoryTarget.Component });
InputTextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputTextareaComponent, selector: "input-textarea", inputs: { placeholder: "placeholder", maxlength: "maxlength" }, providers: [{
            provide: NG_VALUE_ACCESSOR,
            useExisting: InputTextareaComponent,
            multi: true
        }], viewQueries: [{ propertyName: "model", first: true, predicate: NgModel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<textarea\n  rows=\"5\"\n  class=\"form-control\"   \n  [disabled]=\"disabled\" \n  [maxlength]=\"maxlength\"\n  [placeholder]=\"placeholder\"\n  [(ngModel)]=\"value\"\n  [ngClass]=\"{\n    'is-valid': showValidations && !disabled && touched && !(invalid | async),\n    'is-invalid': showValidations && !disabled && touched && (invalid | async)\n  }\"\n  [id]=\"identifier\">\n</textarea>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n", dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "component", type: InputValidationsComponent, selector: "input-validations", inputs: ["messages"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputTextareaComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-textarea', providers: [{
                            provide: NG_VALUE_ACCESSOR,
                            useExisting: InputTextareaComponent,
                            multi: true
                        }], template: "<label *ngIf=\"label\" [attr.for]=\"identifier\">\n  {{label}}\n  <span class=\"required-symbol\" *ngIf=\"isRequired\"> *</span>\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<textarea\n  rows=\"5\"\n  class=\"form-control\"   \n  [disabled]=\"disabled\" \n  [maxlength]=\"maxlength\"\n  [placeholder]=\"placeholder\"\n  [(ngModel)]=\"value\"\n  [ngClass]=\"{\n    'is-valid': showValidations && !disabled && touched && !(invalid | async),\n    'is-invalid': showValidations && !disabled && touched && (invalid | async)\n  }\"\n  [id]=\"identifier\">\n</textarea>\n\n<small class=\"text-muted\" *ngIf=\"description\">{{description}}</small>\n\n<input-validations\n  *ngIf=\"showValidations && !disabled && touched && (invalid | async)\"\n  [messages]=\"failures | async\">\n</input-validations>\n" }]
        }], ctorParameters: function () {
        return [{ type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_VALIDATORS]
                    }] }, { type: Array, decorators: [{
                        type: Optional
                    }, {
                        type: Inject,
                        args: [NG_ASYNC_VALIDATORS]
                    }] }, { type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }] }];
    }, propDecorators: { placeholder: [{
                type: Input
            }], maxlength: [{
                type: Input
            }], model: [{
                type: ViewChild,
                args: [NgModel, { static: true }]
            }] } });

let identifier$1 = 0;
class InputUploadComponent {
    constructor(config, http) {
        this.http = http;
        this.placeholder = 'Select a file to upload...';
        this.dropZonePlaceholder = 'Drag & drop a file to import.';
        this.disabled = false;
        this.autoUpload = true;
        this.showDropZone = false;
        this.showQueue = false;
        this.chunk = false;
        this.chunkSize = 1048576;
        this.chunkRetries = 3;
        this.chunkRequestsCountInParallel = 50;
        this.maxFileSize = 0;
        this.withCredentials = false;
        this.selectButtonIcon = 'fa fa-folder';
        this.selectButtonLabel = 'Select';
        this.removeButtonIcon = 'fa fa-trash';
        this.removeButtonLabel = 'Remove';
        this.removeButtonAllowed = true;
        this.fileTypeErrorMessage = 'The file type [{extension}] is not allowed.';
        this.fileSizeErrorMessage = 'This file exceeds the max file size allowed of {maxFileSize}MB.';
        this.maxFileSizeLabel = 'Max file size:';
        this.allowedExtensionsLabel = 'Allowed extensions:';
        this.onFileAdded = new EventEmitter();
        this.onUploadComplete = new EventEmitter();
        this.onChunkFileUpload = new EventEmitter();
        this.onError = new EventEmitter();
        this.onClear = new EventEmitter();
        this.identifier = `input-upload-${identifier$1++}`;
        this.onParallelChunkCompletes = new EventEmitter();
        this.selectedFileName = '';
        this.hasDropZoneOver = false;
        this.chunkProgress = 0;
        if (config && config.upload) {
            Object.assign(this, config.upload);
        }
    }
    ngOnInit() {
        this.uploader = new FileUploader({
            url: this.url,
            autoUpload: false,
            maxFileSize: this.maxFileSize * 1000000,
        });
        this.handleUploaderEvents();
    }
    Clear() {
        this.chunkProgress = 0;
        this.selectedFileModel = null;
        this.selectedFileName = '';
        this.errorMessage = null;
        this.chunks = null;
        this.uploader.clearQueue();
        this.uploader.cancelAll();
        this.onClear.emit();
    }
    StartUploadManually() {
        let promise = new Promise((resolve, reject) => {
            if (!this.selectedFileBlob) {
                reject();
                return;
            }
            this.onUploadComplete.subscribe(result => resolve(result), error => reject(error));
            this.onError.subscribe(result => reject(result));
            if (this.chunk && this.chunks && this.chunks.length > 0) {
                this.startChunkUpload();
            }
            else {
                this.startSingleUpload();
            }
        });
        return promise;
    }
    SetSelectedFileName(fileName) {
        this.selectedFileName = fileName;
    }
    OnFileOver(e) {
        this.hasDropZoneOver = e;
    }
    OnFileChange(event) {
        if (event.target.files[0]) {
            this.addSelectedFileForManualUploading(event.target.files[0]);
        }
    }
    OnFileDrop(event) {
        if (event[0]) {
            this.addSelectedFileForManualUploading(event[0]);
        }
    }
    HasFile() {
        return this.selectedFileBlob != null && this.selectedFileBlob != undefined;
    }
    ResetState() {
        if (this.uploader.queue && this.uploader.queue.length > 0) {
            for (let i = 0; i < this.uploader.queue.length; i++) {
                this.uploader.queue[i].isError = false;
                this.uploader.queue[i].isUploaded = false;
                this.uploader.queue[i].isSuccess = false;
            }
        }
    }
    startSingleUpload() {
        this.uploader.uploadAll();
    }
    startChunkUpload() {
        this.chunkProgress = 0;
        if (this.chunkRequestsCountInParallel > 0 && this.chunks.length > this.chunkRequestsCountInParallel) {
            this.sendGroupedPromisesSequentially();
            this.onParallelChunkCompletes.subscribe(() => {
                this.chunkProgress = 100;
                this.onUploadComplete.emit({ chunkId: this.chunks[0].id });
            });
        }
        else {
            let chunksPromises = [];
            chunksPromises.push(this.sendChunks(this.chunks));
            Promise.all(chunksPromises)
                .then(() => {
                this.chunkProgress = 100;
                this.onUploadComplete.emit({ chunkId: this.chunks[0].id });
            })
                .catch(error => {
                this.onError.emit(error);
            });
        }
    }
    sendChunks(chunks) {
        let promise = new Promise((resolve, reject) => {
            let requests = [];
            for (let i = 0; i < chunks.length; i++) {
                let formData = new FormData();
                formData.append("file", chunks[i].blob, chunks[i].name);
                requests.push(this.http.post(this.url, formData, { withCredentials: this.withCredentials })
                    .pipe(retry(this.chunkRetries)));
            }
            zip(...requests).subscribe(() => {
                this.chunkProgress += (100 / this.chunks.length) * chunks.length;
                resolve();
            }, error => reject(error));
        });
        return promise;
    }
    sendGroupedPromisesSequentially(index = 0) {
        let start = index * this.chunkRequestsCountInParallel;
        let end = ((index + 1) * this.chunkRequestsCountInParallel) - 1;
        let lastIndex = end + 1 >= this.chunks.length;
        if (end > this.chunks.length - 1) {
            end = this.chunks.length - 1;
        }
        this.sendChunks(this.chunks.slice(start, end + 1))
            .then(() => {
            if (!lastIndex) {
                this.sendGroupedPromisesSequentially(index + 1);
            }
            else {
                this.onParallelChunkCompletes.emit();
            }
        })
            .catch(error => {
            this.onError.emit(error);
            this.Clear();
        });
    }
    splitSelectedFileInChunks() {
        this.chunks = [];
        let file = this.selectedFileBlob;
        let fileSize = file.size;
        let start = 0;
        let end = this.chunkSize;
        let chunksCount = 0;
        let chunkGuid = Math.random()
            .toString()
            .replace("0.", "");
        if (fileSize % this.chunkSize == 0) {
            chunksCount = fileSize / this.chunkSize;
        }
        else {
            chunksCount = Math.floor(fileSize / this.chunkSize) + 1;
        }
        for (let i = 0; i < chunksCount; i++) {
            this.chunks.push({
                id: chunkGuid,
                name: `${chunkGuid}_${i}`,
                blob: file.slice(start, end)
            });
            start = end;
            end = start + this.chunkSize;
        }
    }
    handleUploaderEvents() {
        this.uploader.onBeforeUploadItem = (fileItem) => {
            fileItem.withCredentials = this.withCredentials;
        };
        this.uploader.onSuccessItem = (item, response, status, headers) => {
            this.chunkProgress = 100;
            this.onUploadComplete.emit({ item, response });
            this.ResetState();
        };
        this.uploader.onErrorItem = (item, response, status, headers) => {
            this.onError.emit({ item, response, status });
            this.ResetState();
        };
        this.uploader.onWhenAddingFileFailed = (item, filter, options) => {
            this.onError.emit({ item, filter, options });
        };
    }
    addSelectedFileForManualUploading(file) {
        this.selectedFileBlob = null;
        if (!file) {
            return;
        }
        if (this.validate(file)) {
            this.selectedFileBlob = file;
            this.SetSelectedFileName(file.name);
            if (this.uploader.queue.length > 1) {
                this.uploader.removeFromQueue(this.uploader.queue[0]);
            }
            if (this.chunk) {
                this.splitSelectedFileInChunks();
            }
            this.onFileAdded.emit(file);
            if (this.autoUpload) {
                this.StartUploadManually();
            }
        }
    }
    validate(item) {
        this.selectedFileName = null;
        this.errorMessage = null;
        if (!this.validateFileType(item) || !this.validateFileSize(item)) {
            this.selectedFileModel = null;
            this.uploader.clearQueue();
            return false;
        }
        return true;
    }
    validateFileType(file) {
        if (!this.allowedExtensions || this.allowedExtensions.length == 0) {
            return true;
        }
        let extensionArray = file.name.split('.');
        let extension = extensionArray[extensionArray.length - 1].toLowerCase();
        let result = this.allowedExtensions.find(x => x == extension);
        if (result == undefined || result == null) {
            this.errorMessage = this.fileTypeErrorMessage.replace('{extension}', extension);
            return false;
        }
        return true;
    }
    validateFileSize(file) {
        if (this.maxFileSize == 0) {
            return true;
        }
        if (file.size > this.maxFileSize * 1048576) {
            this.errorMessage = this.fileSizeErrorMessage.replace('{maxFileSize}', `${this.maxFileSize}`);
            return false;
        }
        return true;
    }
}
InputUploadComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputUploadComponent, deps: [{ token: INPUT_FORMS_CONFIG, optional: true }, { token: i1$5.HttpClient }], target: i0.ɵɵFactoryTarget.Component });
InputUploadComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: InputUploadComponent, selector: "input-upload", inputs: { url: "url", label: "label", help: "help", description: "description", placeholder: "placeholder", dropZonePlaceholder: "dropZonePlaceholder", disabled: "disabled", autoUpload: "autoUpload", showDropZone: "showDropZone", showQueue: "showQueue", chunk: "chunk", chunkSize: "chunkSize", chunkRetries: "chunkRetries", chunkRequestsCountInParallel: "chunkRequestsCountInParallel", maxFileSize: "maxFileSize", withCredentials: "withCredentials", selectButtonIcon: "selectButtonIcon", selectButtonLabel: "selectButtonLabel", removeButtonIcon: "removeButtonIcon", removeButtonLabel: "removeButtonLabel", removeButtonAllowed: "removeButtonAllowed", allowedExtensions: "allowedExtensions", fileTypeErrorMessage: "fileTypeErrorMessage", fileSizeErrorMessage: "fileSizeErrorMessage", maxFileSizeLabel: "maxFileSizeLabel", allowedExtensionsLabel: "allowedExtensionsLabel" }, outputs: { onFileAdded: "onFileAdded", onUploadComplete: "onUploadComplete", onChunkFileUpload: "onChunkFileUpload", onError: "onError", onClear: "onClear" }, ngImport: i0, template: "<label *ngIf=\"label\">\n  {{label}}\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<input type=\"file\" class=\"d-none\" [(ngModel)]=\"selectedFileModel\" (change)=\"OnFileChange($event)\" #fileInput\n  ng2FileSelect [uploader]=\"uploader\" [disabled]=\"disabled\" id=\"{{identifier}}-0\" />\n\n<div class=\"input-group\">\n  <input type=\"text\" class=\"form-control\" [value]=\"selectedFileName\" placeholder=\"{{placeholder}}\" id=\"{{identifier}}-1\"\n    (click)=\"fileInput.click()\" readonly />\n  <div class=\"input-group-append\">\n    <button class=\"btn btn-primary\" type=\"button\" (click)=\"fileInput.click()\" [disabled]=\"disabled\"><i\n        *ngIf=\"selectButtonIcon\" class=\"{{selectButtonIcon}}\"></i> {{selectButtonLabel}}</button>\n    <button class=\"btn btn-outline-danger\" type=\"button\" *ngIf=\"selectedFileName && removeButtonAllowed\"\n      (click)=\"Clear()\" [disabled]=\"disabled\"><i *ngIf=\"removeButtonIcon\" class=\"{{removeButtonIcon}}\"></i>\n      {{removeButtonLabel}}</button>\n  </div>\n</div>\n\n<p class=\"mb-0\" *ngIf=\"description\">\n  <small class=\"text-muted\">{{description}}</small>\n</p>\n\n<small class=\"text-muted\" *ngIf=\"maxFileSize > 0\">\n  {{maxFileSizeLabel}} <b>{{maxFileSize}}MB</b>.\n</small>\n<small class=\"text-muted\" *ngIf=\"allowedExtensions?.length > 0\">\n  {{allowedExtensionsLabel}}\n  <span *ngFor=\"let item of allowedExtensions; let first = first;\">\n    <span *ngIf=\"!first\">, </span>\n    <b>{{item}}</b>\n  </span>\n  <span>.</span>\n</small>\n\n<div *ngIf=\"errorMessage\">\n  <small class=\"text-danger\">{{errorMessage}}</small>\n</div>\n\n<div class=\"chunks-queue\" *ngIf=\"chunk && chunks?.length > 0 && showQueue\">\n  <div class=\"chunk\">\n    <div class=\"d-flex\">\n      <div class=\"icon mr-2\">\n        <i class=\"fa fa-file fa-2x\"></i>\n      </div>\n      <div class=\"data flex-grow-1\">\n        <div class=\"d-flex align-items-center\">\n          <small class=\"file-name\"><b>{{selectedFileName}} ({{chunks.length}})</b></small>\n          <small class=\"file-size ml-auto\">{{selectedFileBlob?.size / 1000 | number:'1.2-2'}}KB</small>\n        </div>\n        <progressbar [value]=\"chunkProgress\">\n          {{chunkProgress}}%\n        </progressbar>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div ng2FileDrop *ngIf=\"showDropZone\" [ngClass]=\"{'mouse-over': hasDropZoneOver}\" (fileOver)=\"OnFileOver($event)\"\n  (onFileDrop)=\"OnFileDrop($event)\" [uploader]=\"uploader\" class=\"dropzone\">\n  <i class=\"fa fa-cloud-download fa-4x\"></i><br />\n  <span>{{dropZonePlaceholder}}</span>\n</div>\n", styles: [".dropzone{background:white;border-radius:5px;border:2px dashed #CCC;margin:10px 0;padding:40px;text-align:center}.dropzone i{color:#ccc}.dropzone span{color:#999}.dropzone,.dropzone>*{transition:color .35s ease-in-out,background-color .35s ease-in-out}.dropzone.mouse-over{background-color:#f0f0f0;border:2px solid #CCC;opacity:.5}.dropzone.mouse-over i,.dropzone.mouse-over span{color:#292929}.chunks-queue{border:1px solid #CCC;border-radius:6px;margin:10px 0}.chunks-queue .chunk{padding:10px;border-bottom:1px solid #CCC}.chunks-queue .chunk .icon i{font-size:2.2em}.chunks-queue .chunk .icon i,.chunks-queue .chunk .data .file-name{color:#00559a}.chunks-queue .chunk:last-child{border-bottom:0}.chunks-queue.scrollable{max-height:300px;overflow-y:scroll}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4$1.FileDropDirective, selector: "[ng2FileDrop]", inputs: ["uploader"], outputs: ["fileOver", "onFileDrop"] }, { kind: "directive", type: i4$1.FileSelectDirective, selector: "[ng2FileSelect]", inputs: ["uploader"], outputs: ["onFileSelected"] }, { kind: "component", type: i5.ProgressbarComponent, selector: "progressbar", inputs: ["animate", "striped", "value", "max", "type"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: InputUploadComponent, decorators: [{
            type: Component,
            args: [{ selector: 'input-upload', template: "<label *ngIf=\"label\">\n  {{label}}\n  <i class=\"fa fa-question-circle ml-2\" tooltip=\"{{help}}\" container=\"body\" *ngIf=\"help\"></i>\n</label>\n\n<input type=\"file\" class=\"d-none\" [(ngModel)]=\"selectedFileModel\" (change)=\"OnFileChange($event)\" #fileInput\n  ng2FileSelect [uploader]=\"uploader\" [disabled]=\"disabled\" id=\"{{identifier}}-0\" />\n\n<div class=\"input-group\">\n  <input type=\"text\" class=\"form-control\" [value]=\"selectedFileName\" placeholder=\"{{placeholder}}\" id=\"{{identifier}}-1\"\n    (click)=\"fileInput.click()\" readonly />\n  <div class=\"input-group-append\">\n    <button class=\"btn btn-primary\" type=\"button\" (click)=\"fileInput.click()\" [disabled]=\"disabled\"><i\n        *ngIf=\"selectButtonIcon\" class=\"{{selectButtonIcon}}\"></i> {{selectButtonLabel}}</button>\n    <button class=\"btn btn-outline-danger\" type=\"button\" *ngIf=\"selectedFileName && removeButtonAllowed\"\n      (click)=\"Clear()\" [disabled]=\"disabled\"><i *ngIf=\"removeButtonIcon\" class=\"{{removeButtonIcon}}\"></i>\n      {{removeButtonLabel}}</button>\n  </div>\n</div>\n\n<p class=\"mb-0\" *ngIf=\"description\">\n  <small class=\"text-muted\">{{description}}</small>\n</p>\n\n<small class=\"text-muted\" *ngIf=\"maxFileSize > 0\">\n  {{maxFileSizeLabel}} <b>{{maxFileSize}}MB</b>.\n</small>\n<small class=\"text-muted\" *ngIf=\"allowedExtensions?.length > 0\">\n  {{allowedExtensionsLabel}}\n  <span *ngFor=\"let item of allowedExtensions; let first = first;\">\n    <span *ngIf=\"!first\">, </span>\n    <b>{{item}}</b>\n  </span>\n  <span>.</span>\n</small>\n\n<div *ngIf=\"errorMessage\">\n  <small class=\"text-danger\">{{errorMessage}}</small>\n</div>\n\n<div class=\"chunks-queue\" *ngIf=\"chunk && chunks?.length > 0 && showQueue\">\n  <div class=\"chunk\">\n    <div class=\"d-flex\">\n      <div class=\"icon mr-2\">\n        <i class=\"fa fa-file fa-2x\"></i>\n      </div>\n      <div class=\"data flex-grow-1\">\n        <div class=\"d-flex align-items-center\">\n          <small class=\"file-name\"><b>{{selectedFileName}} ({{chunks.length}})</b></small>\n          <small class=\"file-size ml-auto\">{{selectedFileBlob?.size / 1000 | number:'1.2-2'}}KB</small>\n        </div>\n        <progressbar [value]=\"chunkProgress\">\n          {{chunkProgress}}%\n        </progressbar>\n      </div>\n    </div>\n  </div>\n</div>\n\n<div ng2FileDrop *ngIf=\"showDropZone\" [ngClass]=\"{'mouse-over': hasDropZoneOver}\" (fileOver)=\"OnFileOver($event)\"\n  (onFileDrop)=\"OnFileDrop($event)\" [uploader]=\"uploader\" class=\"dropzone\">\n  <i class=\"fa fa-cloud-download fa-4x\"></i><br />\n  <span>{{dropZonePlaceholder}}</span>\n</div>\n", styles: [".dropzone{background:white;border-radius:5px;border:2px dashed #CCC;margin:10px 0;padding:40px;text-align:center}.dropzone i{color:#ccc}.dropzone span{color:#999}.dropzone,.dropzone>*{transition:color .35s ease-in-out,background-color .35s ease-in-out}.dropzone.mouse-over{background-color:#f0f0f0;border:2px solid #CCC;opacity:.5}.dropzone.mouse-over i,.dropzone.mouse-over span{color:#292929}.chunks-queue{border:1px solid #CCC;border-radius:6px;margin:10px 0}.chunks-queue .chunk{padding:10px;border-bottom:1px solid #CCC}.chunks-queue .chunk .icon i{font-size:2.2em}.chunks-queue .chunk .icon i,.chunks-queue .chunk .data .file-name{color:#00559a}.chunks-queue .chunk:last-child{border-bottom:0}.chunks-queue.scrollable{max-height:300px;overflow-y:scroll}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [INPUT_FORMS_CONFIG]
                    }, {
                        type: Optional
                    }] }, { type: i1$5.HttpClient }];
    }, propDecorators: { url: [{
                type: Input
            }], label: [{
                type: Input
            }], help: [{
                type: Input
            }], description: [{
                type: Input
            }], placeholder: [{
                type: Input
            }], dropZonePlaceholder: [{
                type: Input
            }], disabled: [{
                type: Input
            }], autoUpload: [{
                type: Input
            }], showDropZone: [{
                type: Input
            }], showQueue: [{
                type: Input
            }], chunk: [{
                type: Input
            }], chunkSize: [{
                type: Input
            }], chunkRetries: [{
                type: Input
            }], chunkRequestsCountInParallel: [{
                type: Input
            }], maxFileSize: [{
                type: Input
            }], withCredentials: [{
                type: Input
            }], selectButtonIcon: [{
                type: Input
            }], selectButtonLabel: [{
                type: Input
            }], removeButtonIcon: [{
                type: Input
            }], removeButtonLabel: [{
                type: Input
            }], removeButtonAllowed: [{
                type: Input
            }], allowedExtensions: [{
                type: Input
            }], fileTypeErrorMessage: [{
                type: Input
            }], fileSizeErrorMessage: [{
                type: Input
            }], maxFileSizeLabel: [{
                type: Input
            }], allowedExtensionsLabel: [{
                type: Input
            }], onFileAdded: [{
                type: Output
            }], onUploadComplete: [{
                type: Output
            }], onChunkFileUpload: [{
                type: Output
            }], onError: [{
                type: Output
            }], onClear: [{
                type: Output
            }] } });

class RadialButtonComponent {
    constructor() {
        this.disabled = false;
        this.labelPlacement = 'bottom';
        this.backgroundColorClass = 'btn-primary';
        this.onClick = new EventEmitter();
    }
    ngOnInit() {
    }
}
RadialButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RadialButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
RadialButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RadialButtonComponent, selector: "ui-radial-button", inputs: { disabled: "disabled", label: "label", labelPlacement: "labelPlacement", iconClass: "iconClass", backgroundColorClass: "backgroundColorClass" }, outputs: { onClick: "onClick" }, ngImport: i0, template: "<button class=\"btn-radial btn\" [ngClass]=\"backgroundColorClass\" type=\"button\"\n  [tooltip]=\"label\" [placement]=\"labelPlacement\" container=\"body\" [disabled]=\"disabled\" (click)=\"onClick.emit($event)\">\n  <i [ngClass]=\"iconClass\"></i>\n</button>\n", styles: [".btn-radial{height:50px;width:50px;border-radius:50%;box-shadow:0 1px 5px #00000047;transition:transform .4s cubic-bezier(.175,.885,.32,1.275);transition-delay:.1s}.btn-radial i{margin-top:2px}.btn-radial:not([disabled]):hover{transform:scale(1.1)}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RadialButtonComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ui-radial-button', template: "<button class=\"btn-radial btn\" [ngClass]=\"backgroundColorClass\" type=\"button\"\n  [tooltip]=\"label\" [placement]=\"labelPlacement\" container=\"body\" [disabled]=\"disabled\" (click)=\"onClick.emit($event)\">\n  <i [ngClass]=\"iconClass\"></i>\n</button>\n", styles: [".btn-radial{height:50px;width:50px;border-radius:50%;box-shadow:0 1px 5px #00000047;transition:transform .4s cubic-bezier(.175,.885,.32,1.275);transition-delay:.1s}.btn-radial i{margin-top:2px}.btn-radial:not([disabled]):hover{transform:scale(1.1)}\n"] }]
        }], ctorParameters: function () { return []; }, propDecorators: { disabled: [{
                type: Input
            }], label: [{
                type: Input
            }], labelPlacement: [{
                type: Input
            }], iconClass: [{
                type: Input
            }], backgroundColorClass: [{
                type: Input
            }], onClick: [{
                type: Output
            }] } });

class InputDateConfig {
}

class BlockUi {
    start(message) {
        this.loading = true;
        this.message = message;
    }
    stop() {
        this.loading = false;
        this.message = null;
    }
}

class NgxUiHeroInputFormsModule {
    static forRoot(config) {
        return {
            ngModule: NgxUiHeroInputFormsModule,
            providers: [
                {
                    provide: INPUT_FORMS_CONFIG,
                    useValue: config
                },
            ]
        };
    }
}
NgxUiHeroInputFormsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroInputFormsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
NgxUiHeroInputFormsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroInputFormsModule, declarations: [MaxValueDirective,
        MinValueDirective,
        CurrencySymbolPipe,
        InputTextComponent,
        InputValidationsComponent,
        InputSelectComponent,
        InputEmailComponent,
        InputTextareaComponent,
        InputCheckboxComponent,
        InputRadioComponent,
        InputCurrencyComponent,
        InputPercentComponent,
        InputNumberComponent,
        InputDateComponent,
        InputUploadComponent,
        RadialButtonComponent,
        InputMultiselectComponent,
        InputMonthYearComponent,
        InputSwitchComponent,
        InputDropdownGridComponent,
        BlockUiComponent,
        InputDropdownSearchComponent,
        InputTextMaskComponent,
        FilterDropdownSearchComponent,
        FilterMultiselectComponent,
        FilterDateComponent,
        MaskDirective,
        CurrencyMaskDirective], imports: [CommonModule,
        FormsModule,
        HttpClientModule,
        FileUploadModule,
        UiModule,
        NgxUiHeroDataGridModule], exports: [MaxValueDirective,
        MinValueDirective,
        CurrencySymbolPipe,
        FileUploadModule,
        InputTextComponent,
        InputValidationsComponent,
        InputSelectComponent,
        InputEmailComponent,
        InputTextareaComponent,
        InputCheckboxComponent,
        InputRadioComponent,
        InputCurrencyComponent,
        InputPercentComponent,
        InputNumberComponent,
        InputDateComponent,
        InputUploadComponent,
        RadialButtonComponent,
        InputMultiselectComponent,
        InputMonthYearComponent,
        InputSwitchComponent,
        InputDropdownGridComponent,
        InputDropdownSearchComponent,
        InputTextMaskComponent,
        BlockUiComponent,
        FilterDropdownSearchComponent,
        FilterMultiselectComponent,
        FilterDateComponent,
        MaskDirective,
        CurrencyMaskDirective] });
NgxUiHeroInputFormsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroInputFormsModule, imports: [CommonModule,
        FormsModule,
        HttpClientModule,
        FileUploadModule,
        UiModule,
        NgxUiHeroDataGridModule, FileUploadModule] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroInputFormsModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [
                        CommonModule,
                        FormsModule,
                        HttpClientModule,
                        FileUploadModule,
                        UiModule,
                        NgxUiHeroDataGridModule
                    ],
                    declarations: [
                        MaxValueDirective,
                        MinValueDirective,
                        CurrencySymbolPipe,
                        InputTextComponent,
                        InputValidationsComponent,
                        InputSelectComponent,
                        InputEmailComponent,
                        InputTextareaComponent,
                        InputCheckboxComponent,
                        InputRadioComponent,
                        InputCurrencyComponent,
                        InputPercentComponent,
                        InputNumberComponent,
                        InputDateComponent,
                        InputUploadComponent,
                        RadialButtonComponent,
                        InputMultiselectComponent,
                        InputMonthYearComponent,
                        InputSwitchComponent,
                        InputDropdownGridComponent,
                        BlockUiComponent,
                        InputDropdownSearchComponent,
                        InputTextMaskComponent,
                        FilterDropdownSearchComponent,
                        FilterMultiselectComponent,
                        FilterDateComponent,
                        MaskDirective,
                        CurrencyMaskDirective
                    ],
                    exports: [
                        MaxValueDirective,
                        MinValueDirective,
                        CurrencySymbolPipe,
                        FileUploadModule,
                        InputTextComponent,
                        InputValidationsComponent,
                        InputSelectComponent,
                        InputEmailComponent,
                        InputTextareaComponent,
                        InputCheckboxComponent,
                        InputRadioComponent,
                        InputCurrencyComponent,
                        InputPercentComponent,
                        InputNumberComponent,
                        InputDateComponent,
                        InputUploadComponent,
                        RadialButtonComponent,
                        InputMultiselectComponent,
                        InputMonthYearComponent,
                        InputSwitchComponent,
                        InputDropdownGridComponent,
                        InputDropdownSearchComponent,
                        InputTextMaskComponent,
                        BlockUiComponent,
                        FilterDropdownSearchComponent,
                        FilterMultiselectComponent,
                        FilterDateComponent,
                        MaskDirective,
                        CurrencyMaskDirective
                    ],
                }]
        }] });

let TREEVIEW_CONFIG = new InjectionToken('treeViewConfig');

class TreeViewService {
    constructor() {
        this.onSelecionChanged = new EventEmitter();
    }
}
TreeViewService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
TreeViewService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewService, decorators: [{
            type: Injectable
        }], ctorParameters: function () { return []; } });

class TreeViewItemComponent {
    constructor(service) {
        this.service = service;
        this.showIcons = true;
        this.enableLabelLinkStyle = false;
        this.openned = false;
        this.expandedOnInit = false;
        this.rootItem = false;
        this.OnItemExpanded = new EventEmitter();
        this.OnItemClicked = new EventEmitter();
    }
    ngOnInit() {
        this.handleSelecionChanges();
        this.equalHeightStyle = this.columns != undefined && this.columns.length > 0;
        this.summarizedStyle = this.columns != undefined
            && this.columns.length > 0
            && this.row[this.collectionProperty]
            && this.row[this.collectionProperty].length > 0;
        if (this.expandedOnInit) {
            this.openned = true;
        }
    }
    Toogle() {
        this.openned = !this.openned;
        if (this.openned) {
            this.emitItemExpandedEvent(this.row);
        }
    }
    OnClick() {
        this.emitItemClickedEvent(this.row);
    }
    HandleSubItemExpanded(data) {
        this.emitItemExpandedEvent(data);
    }
    HandleSubItemClicked(data) {
        this.emitItemClickedEvent(data);
    }
    HandleColumnClick(column, row, currentData, rowIndex) {
        if (column.onClick) {
            column.onClick(row, currentData, rowIndex);
        }
    }
    emitItemExpandedEvent(data) {
        this.OnItemExpanded.emit(data);
    }
    emitItemClickedEvent(data) {
        this.OnItemClicked.emit(data);
    }
    handleSelecionChanges() {
        this.service.onSelecionChanged.subscribe(data => {
            this.active = this.idProperty && this.row[this.idProperty] == data[this.idProperty];
        });
    }
}
TreeViewItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewItemComponent, deps: [{ token: TreeViewService }], target: i0.ɵɵFactoryTarget.Component });
TreeViewItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TreeViewItemComponent, selector: "[ui-tree-view-item]", inputs: { row: "row", idProperty: "idProperty", labelProperty: "labelProperty", collectionProperty: "collectionProperty", columns: "columns", showIcons: "showIcons", enableLabelLinkStyle: "enableLabelLinkStyle", normalItemIconClass: "normalItemIconClass", collapsableClosedItemIconClass: "collapsableClosedItemIconClass", collapsableOpennedItemIconClass: "collapsableOpennedItemIconClass", first: "first", last: "last", openned: "openned", expandedOnInit: "expandedOnInit", rootItem: "rootItem" }, outputs: { OnItemExpanded: "OnItemExpanded", OnItemClicked: "OnItemClicked" }, ngImport: i0, template: "<div class=\"item\" [ngClass]=\"{\n    'has-children': row[collectionProperty]?.length > 0,\n    'has-many-children': row[collectionProperty]?.length > 1,\n    'has-no-columns': !columns || columns.length == 0,\n    'has-no-icons': !showIcons,\n    'labels-as-link': enableLabelLinkStyle,\n    'active': active,\n    'first': first,\n    'last': last\n  }\">\n  <div class=\"d-flex align-items-center justify-content-between w-100\" \n    [ngClass]=\"{\n      'summarized-style': summarizedStyle, \n      'equal-height': equalHeightStyle,\n      'open': openned\n    }\">\n    <i class=\"mx-1 fa empty\" *ngIf=\"!row[collectionProperty] || row[collectionProperty].length == 0\"></i>\n    <i class=\"mx-1 fa toogler\" [ngClass]=\"{\n      'fa-plus-square-o': row[collectionProperty]?.length > 0 && !openned,\n      'fa-minus-square-o': row[collectionProperty]?.length > 0 && openned\n    }\" (click)=\"Toogle()\"></i>\n    <i class=\"mx-1 folder-item fa {{collapsableClosedItemIconClass}}\" *ngIf=\"row[collectionProperty]?.length > 0 && !openned && showIcons\"></i>\n    <i class=\"mx-1 folder-item fa {{collapsableOpennedItemIconClass}}\" *ngIf=\"row[collectionProperty]?.length > 0 && openned && showIcons\"></i>\n    <i class=\"mx-1 normal-item fa {{normalItemIconClass}}\" *ngIf=\"(!row[collectionProperty] || row[collectionProperty].length == 0) && showIcons\"></i>\n  \n    <label class=\"mb-0 mr-auto d-inline-block text-truncate\" (click)=\"OnClick()\">{{row[labelProperty]}}</label>\n  \n    <div class=\"columns d-flex align-items-center justify-content-between h-100\" *ngIf=\"columns?.length > 0\">\n      <div class=\"column {{column.dataClasses}}\" \n        *ngFor=\"let column of columns; let i = index;\" \n        [ngStyle]=\"{'width': column.width}\"\n        [ngClass]=\"{'text-center': column.dataAlignment == 1, 'text-right': column.dataAlignment == 2}\">\n  \n        <div *ngIf=\"!column.editable || row[collectionProperty]?.length > 0\" (click)=\"HandleColumnClick(column, row, row[column.data], i)\">          \n          <div *ngIf=\"!column.render && column.data\">\n            <span *ngIf=\"!column.dataType || column.dataType == 0\">{{row[column.data]}}</span>\n            <span *ngIf=\"column.dataType == 1\">{{row[column.data] | date:'short'}}</span>\n            <span *ngIf=\"column.dataType >= 2\">{{row[column.data] | number:'1.2-2'}}</span>\n          </div>\n          <span *ngIf=\"column.render\" [innerHtml]=\"column.render(row, row[column.data], i)\"></span>\n        </div>\n        \n        <div *ngIf=\"column.editable && (!row[collectionProperty] || row[collectionProperty].length == 0)\">\n          <input-text *ngIf=\"!column.dataType || column.dataType == 0\" [(ngModel)]=\"row[column.data]\"></input-text>\n          <input-date *ngIf=\"column.dataType == 1\" [(ngModel)]=\"row[column.data]\"></input-date>\n          <input-number *ngIf=\"column.dataType == 2\" [(ngModel)]=\"row[column.data]\"></input-number>\n          <input-currency *ngIf=\"column.dataType == 3\" [(ngModel)]=\"row[column.data]\"></input-currency>\n          <input-percent *ngIf=\"column.dataType == 4\" [(ngModel)]=\"row[column.data]\"></input-percent>\n        </div>\n      </div>\n    </div>\n  </div>\n  \n  <ul class=\"fadeInDown\" *ngIf=\"row[collectionProperty]?.length > 0 && openned\">\n    <li *ngFor=\"let subitem of row[collectionProperty]; let first = first; let last = last;\" \n      ui-tree-view-item\n      [row]=\"subitem\"\n      [columns]=\"columns\"\n      [idProperty]=\"idProperty\"\n      [labelProperty]=\"labelProperty\"\n      [collectionProperty]=\"collectionProperty\"\n      [showIcons]=\"showIcons\"\n      [enableLabelLinkStyle]=\"enableLabelLinkStyle\"\n      [normalItemIconClass]=\"normalItemIconClass\"\n      [collapsableClosedItemIconClass]=\"collapsableClosedItemIconClass\"\n      [collapsableOpennedItemIconClass]=\"collapsableOpennedItemIconClass\"\n      [first]=\"first\"\n      [last]=\"last\"\n      [expandedOnInit]=\"expandedOnInit\"\n      [showIcons]=\"showIcons\"\n      (OnItemExpanded)=\"HandleSubItemExpanded($event)\"\n      (OnItemClicked)=\"HandleSubItemClicked($event)\"\n      >\n    </li>\n  </ul>\n</div>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-10%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}i.folder-item{color:#ffb822}i.normal-item{color:#c1bfd0}i.fa.fa-plus-square-o,i.fa.fa-minus-square-o{background-color:#f0f0f0;z-index:11}i.fa.empty{width:7px}.item.has-no-columns i.fa.fa-plus-square-o,.item.has-no-columns i.fa.fa-minus-square-o{background-color:#fff}.toogler,.item.labels-as-link>div>label{cursor:pointer}.item>div>label{padding:0 4px}.item.active>div>label,.item.labels-as-link>div>label:hover{background-color:#666;color:#fff;border-radius:4px}.item.active>div>label{background-color:#09498e!important}.no-selection::selection{background:transparent}ul{position:relative;padding:0;margin:0 0 0 20px}ul li{position:relative;list-style:none!important}.columns .column{margin-left:5px}.item{position:relative;overflow:hidden}.item>div{position:relative;height:30px}.item>div.equal-height{height:45px}.item>div.summarized-style{background-color:#f0f0f0;border-bottom:1px solid #CCC}.item>div.summarized-style .columns .column{padding:0 13px}.item>div:before{content:\"\";position:absolute;top:0;bottom:0;left:9px;z-index:10;width:0;border-right:1px solid #CCC}.item.has-children.first>div:before{top:0}.item.last>div:before{bottom:22px}.item.has-children.last>div:before{bottom:17px}ul:before{content:\"\";position:absolute;top:0;bottom:0;left:-11px;z-index:10;width:0;border-right:1px solid #CCC}.item.has-children.last>ul:before{display:none}.item>div:after{content:\"\";position:absolute;top:calc(50% - 1px);left:9px;z-index:10;width:13px;border-bottom:1px solid #CCC}.item.has-no-columns.last>div:before{bottom:15px}.item.has-no-icons>div>label{margin-left:5px}.item.has-no-icons.has-children>div>label{margin-left:8px}@media (max-width: 860px){.columns{display:none!important}}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: InputTextComponent, selector: "input-text", inputs: ["placeholder", "inputGroupPrepend", "inputGroupAppend", "maxlength"] }, { kind: "component", type: InputCurrencyComponent, selector: "input-currency", inputs: ["showInputGroup", "placeholder", "precision"] }, { kind: "component", type: InputPercentComponent, selector: "input-percent", inputs: ["showInputGroup", "inputGroupText", "placeholder", "precision"] }, { kind: "component", type: InputNumberComponent, selector: "input-number", inputs: ["maxValue", "minValue"] }, { kind: "component", type: InputDateComponent, selector: "input-date", inputs: ["placeholder", "minDate", "maxDate", "format", "showInputGroup", "inputGroupText", "placement", "theme"], outputs: ["onChange"] }, { kind: "component", type: TreeViewItemComponent, selector: "[ui-tree-view-item]", inputs: ["row", "idProperty", "labelProperty", "collectionProperty", "columns", "showIcons", "enableLabelLinkStyle", "normalItemIconClass", "collapsableClosedItemIconClass", "collapsableOpennedItemIconClass", "first", "last", "openned", "expandedOnInit", "rootItem"], outputs: ["OnItemExpanded", "OnItemClicked"] }, { kind: "pipe", type: i1$1.DecimalPipe, name: "number" }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewItemComponent, decorators: [{
            type: Component,
            args: [{ selector: '[ui-tree-view-item]', template: "<div class=\"item\" [ngClass]=\"{\n    'has-children': row[collectionProperty]?.length > 0,\n    'has-many-children': row[collectionProperty]?.length > 1,\n    'has-no-columns': !columns || columns.length == 0,\n    'has-no-icons': !showIcons,\n    'labels-as-link': enableLabelLinkStyle,\n    'active': active,\n    'first': first,\n    'last': last\n  }\">\n  <div class=\"d-flex align-items-center justify-content-between w-100\" \n    [ngClass]=\"{\n      'summarized-style': summarizedStyle, \n      'equal-height': equalHeightStyle,\n      'open': openned\n    }\">\n    <i class=\"mx-1 fa empty\" *ngIf=\"!row[collectionProperty] || row[collectionProperty].length == 0\"></i>\n    <i class=\"mx-1 fa toogler\" [ngClass]=\"{\n      'fa-plus-square-o': row[collectionProperty]?.length > 0 && !openned,\n      'fa-minus-square-o': row[collectionProperty]?.length > 0 && openned\n    }\" (click)=\"Toogle()\"></i>\n    <i class=\"mx-1 folder-item fa {{collapsableClosedItemIconClass}}\" *ngIf=\"row[collectionProperty]?.length > 0 && !openned && showIcons\"></i>\n    <i class=\"mx-1 folder-item fa {{collapsableOpennedItemIconClass}}\" *ngIf=\"row[collectionProperty]?.length > 0 && openned && showIcons\"></i>\n    <i class=\"mx-1 normal-item fa {{normalItemIconClass}}\" *ngIf=\"(!row[collectionProperty] || row[collectionProperty].length == 0) && showIcons\"></i>\n  \n    <label class=\"mb-0 mr-auto d-inline-block text-truncate\" (click)=\"OnClick()\">{{row[labelProperty]}}</label>\n  \n    <div class=\"columns d-flex align-items-center justify-content-between h-100\" *ngIf=\"columns?.length > 0\">\n      <div class=\"column {{column.dataClasses}}\" \n        *ngFor=\"let column of columns; let i = index;\" \n        [ngStyle]=\"{'width': column.width}\"\n        [ngClass]=\"{'text-center': column.dataAlignment == 1, 'text-right': column.dataAlignment == 2}\">\n  \n        <div *ngIf=\"!column.editable || row[collectionProperty]?.length > 0\" (click)=\"HandleColumnClick(column, row, row[column.data], i)\">          \n          <div *ngIf=\"!column.render && column.data\">\n            <span *ngIf=\"!column.dataType || column.dataType == 0\">{{row[column.data]}}</span>\n            <span *ngIf=\"column.dataType == 1\">{{row[column.data] | date:'short'}}</span>\n            <span *ngIf=\"column.dataType >= 2\">{{row[column.data] | number:'1.2-2'}}</span>\n          </div>\n          <span *ngIf=\"column.render\" [innerHtml]=\"column.render(row, row[column.data], i)\"></span>\n        </div>\n        \n        <div *ngIf=\"column.editable && (!row[collectionProperty] || row[collectionProperty].length == 0)\">\n          <input-text *ngIf=\"!column.dataType || column.dataType == 0\" [(ngModel)]=\"row[column.data]\"></input-text>\n          <input-date *ngIf=\"column.dataType == 1\" [(ngModel)]=\"row[column.data]\"></input-date>\n          <input-number *ngIf=\"column.dataType == 2\" [(ngModel)]=\"row[column.data]\"></input-number>\n          <input-currency *ngIf=\"column.dataType == 3\" [(ngModel)]=\"row[column.data]\"></input-currency>\n          <input-percent *ngIf=\"column.dataType == 4\" [(ngModel)]=\"row[column.data]\"></input-percent>\n        </div>\n      </div>\n    </div>\n  </div>\n  \n  <ul class=\"fadeInDown\" *ngIf=\"row[collectionProperty]?.length > 0 && openned\">\n    <li *ngFor=\"let subitem of row[collectionProperty]; let first = first; let last = last;\" \n      ui-tree-view-item\n      [row]=\"subitem\"\n      [columns]=\"columns\"\n      [idProperty]=\"idProperty\"\n      [labelProperty]=\"labelProperty\"\n      [collectionProperty]=\"collectionProperty\"\n      [showIcons]=\"showIcons\"\n      [enableLabelLinkStyle]=\"enableLabelLinkStyle\"\n      [normalItemIconClass]=\"normalItemIconClass\"\n      [collapsableClosedItemIconClass]=\"collapsableClosedItemIconClass\"\n      [collapsableOpennedItemIconClass]=\"collapsableOpennedItemIconClass\"\n      [first]=\"first\"\n      [last]=\"last\"\n      [expandedOnInit]=\"expandedOnInit\"\n      [showIcons]=\"showIcons\"\n      (OnItemExpanded)=\"HandleSubItemExpanded($event)\"\n      (OnItemClicked)=\"HandleSubItemClicked($event)\"\n      >\n    </li>\n  </ul>\n</div>\n", styles: ["@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-10%,0)}to{opacity:1;transform:translateZ(0)}}.fadeInDown{animation-name:fadeInDown;animation-duration:.35s;animation-fill-mode:both}i.folder-item{color:#ffb822}i.normal-item{color:#c1bfd0}i.fa.fa-plus-square-o,i.fa.fa-minus-square-o{background-color:#f0f0f0;z-index:11}i.fa.empty{width:7px}.item.has-no-columns i.fa.fa-plus-square-o,.item.has-no-columns i.fa.fa-minus-square-o{background-color:#fff}.toogler,.item.labels-as-link>div>label{cursor:pointer}.item>div>label{padding:0 4px}.item.active>div>label,.item.labels-as-link>div>label:hover{background-color:#666;color:#fff;border-radius:4px}.item.active>div>label{background-color:#09498e!important}.no-selection::selection{background:transparent}ul{position:relative;padding:0;margin:0 0 0 20px}ul li{position:relative;list-style:none!important}.columns .column{margin-left:5px}.item{position:relative;overflow:hidden}.item>div{position:relative;height:30px}.item>div.equal-height{height:45px}.item>div.summarized-style{background-color:#f0f0f0;border-bottom:1px solid #CCC}.item>div.summarized-style .columns .column{padding:0 13px}.item>div:before{content:\"\";position:absolute;top:0;bottom:0;left:9px;z-index:10;width:0;border-right:1px solid #CCC}.item.has-children.first>div:before{top:0}.item.last>div:before{bottom:22px}.item.has-children.last>div:before{bottom:17px}ul:before{content:\"\";position:absolute;top:0;bottom:0;left:-11px;z-index:10;width:0;border-right:1px solid #CCC}.item.has-children.last>ul:before{display:none}.item>div:after{content:\"\";position:absolute;top:calc(50% - 1px);left:9px;z-index:10;width:13px;border-bottom:1px solid #CCC}.item.has-no-columns.last>div:before{bottom:15px}.item.has-no-icons>div>label{margin-left:5px}.item.has-no-icons.has-children>div>label{margin-left:8px}@media (max-width: 860px){.columns{display:none!important}}\n"] }]
        }], ctorParameters: function () { return [{ type: TreeViewService }]; }, propDecorators: { row: [{
                type: Input
            }], idProperty: [{
                type: Input
            }], labelProperty: [{
                type: Input
            }], collectionProperty: [{
                type: Input
            }], columns: [{
                type: Input
            }], showIcons: [{
                type: Input
            }], enableLabelLinkStyle: [{
                type: Input
            }], normalItemIconClass: [{
                type: Input
            }], collapsableClosedItemIconClass: [{
                type: Input
            }], collapsableOpennedItemIconClass: [{
                type: Input
            }], first: [{
                type: Input
            }], last: [{
                type: Input
            }], openned: [{
                type: Input
            }], expandedOnInit: [{
                type: Input
            }], rootItem: [{
                type: Input
            }], OnItemExpanded: [{
                type: Output
            }], OnItemClicked: [{
                type: Output
            }] } });

class TreeViewComponent {
    constructor(defaultOptions) {
        this.emptyResultsMessage = 'No results found at this moment.';
        this.showIcons = true;
        this.enableLabelLinkStyle = false;
        this.normalItemIconClass = 'fa fa-file';
        this.collapsableClosedItemIconClass = 'fa fa-folder';
        this.collapsableOpennedItemIconClass = 'fa fa-folder-open';
        this.expandAllOnInit = true;
        this.OnItemExpanded = new EventEmitter();
        this.OnItemClicked = new EventEmitter();
        Object.assign(this, defaultOptions);
        if (defaultOptions.styles) {
            Object.assign(this, defaultOptions.styles);
        }
    }
    ngOnInit() {
    }
}
TreeViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewComponent, deps: [{ token: TREEVIEW_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
TreeViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TreeViewComponent, selector: "ui-tree-view", inputs: { columns: "columns", data: "data", idProperty: "idProperty", labelProperty: "labelProperty", collectionProperty: "collectionProperty", emptyResultsMessage: "emptyResultsMessage", showIcons: "showIcons", enableLabelLinkStyle: "enableLabelLinkStyle", normalItemIconClass: "normalItemIconClass", collapsableClosedItemIconClass: "collapsableClosedItemIconClass", collapsableOpennedItemIconClass: "collapsableOpennedItemIconClass", expandAllOnInit: "expandAllOnInit" }, outputs: { OnItemExpanded: "OnItemExpanded", OnItemClicked: "OnItemClicked" }, ngImport: i0, template: "<div class=\"treeview-container\">\n  <div class=\"treeview-header d-flex align-items-center justify-content-end\" *ngIf=\"columns?.length > 0\">\n    <div class=\"column-header {{column.captionClasses}}\" *ngFor=\"let column of columns\" \n      [ngStyle]=\"{'width': column.width}\"\n      [ngClass]=\"{'text-center': column.captionAlignment == 1, 'text-right': column.captionAlignment == 2}\">\n      \n      {{column.caption}}\n    </div>\n  </div>\n  \n  <div class=\"treeview-content\" *ngIf=\"data?.length > 0\">\n    <ul>\n      <li *ngFor=\"let row of data; let first = first; let last = last;\" \n        ui-tree-view-item\n        [row]=\"row\"\n        [columns]=\"columns\"\n        [idProperty]=\"idProperty\"\n        [labelProperty]=\"labelProperty\"\n        [collectionProperty]=\"collectionProperty\"\n        [showIcons]=\"showIcons\"\n        [enableLabelLinkStyle]=\"enableLabelLinkStyle\"\n        [normalItemIconClass]=\"normalItemIconClass\"\n        [collapsableClosedItemIconClass]=\"collapsableClosedItemIconClass\"\n        [collapsableOpennedItemIconClass]=\"collapsableOpennedItemIconClass\"\n        [first]=\"first\"\n        [last]=\"last\"\n        [expandedOnInit]=\"expandAllOnInit\"\n        [rootItem]=\"true\"\n        (OnItemExpanded)=\"OnItemExpanded.emit($event)\"\n        (OnItemClicked)=\"OnItemClicked.emit($event)\"\n        >\n      </li>\n    </ul>\n  </div>\n\n  <p *ngIf=\"!data || data.length == 0\">{{emptyResultsMessage}}</p>\n</div>\n", styles: [".treeview-container .treeview-header{border-bottom:3px solid #CCC}.treeview-container .treeview-header .column-header{border:1px solid #CCC;border-bottom:0;padding:10px;margin-left:5px}.treeview-container .treeview-content ul{position:relative;padding:0;margin:0}.treeview-container .treeview-content ul li{list-style:none!important}@media (max-width: 860px){.treeview-header{display:none!important}}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: TreeViewItemComponent, selector: "[ui-tree-view-item]", inputs: ["row", "idProperty", "labelProperty", "collectionProperty", "columns", "showIcons", "enableLabelLinkStyle", "normalItemIconClass", "collapsableClosedItemIconClass", "collapsableOpennedItemIconClass", "first", "last", "openned", "expandedOnInit", "rootItem"], outputs: ["OnItemExpanded", "OnItemClicked"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TreeViewComponent, decorators: [{
            type: Component,
            args: [{ selector: 'ui-tree-view', template: "<div class=\"treeview-container\">\n  <div class=\"treeview-header d-flex align-items-center justify-content-end\" *ngIf=\"columns?.length > 0\">\n    <div class=\"column-header {{column.captionClasses}}\" *ngFor=\"let column of columns\" \n      [ngStyle]=\"{'width': column.width}\"\n      [ngClass]=\"{'text-center': column.captionAlignment == 1, 'text-right': column.captionAlignment == 2}\">\n      \n      {{column.caption}}\n    </div>\n  </div>\n  \n  <div class=\"treeview-content\" *ngIf=\"data?.length > 0\">\n    <ul>\n      <li *ngFor=\"let row of data; let first = first; let last = last;\" \n        ui-tree-view-item\n        [row]=\"row\"\n        [columns]=\"columns\"\n        [idProperty]=\"idProperty\"\n        [labelProperty]=\"labelProperty\"\n        [collectionProperty]=\"collectionProperty\"\n        [showIcons]=\"showIcons\"\n        [enableLabelLinkStyle]=\"enableLabelLinkStyle\"\n        [normalItemIconClass]=\"normalItemIconClass\"\n        [collapsableClosedItemIconClass]=\"collapsableClosedItemIconClass\"\n        [collapsableOpennedItemIconClass]=\"collapsableOpennedItemIconClass\"\n        [first]=\"first\"\n        [last]=\"last\"\n        [expandedOnInit]=\"expandAllOnInit\"\n        [rootItem]=\"true\"\n        (OnItemExpanded)=\"OnItemExpanded.emit($event)\"\n        (OnItemClicked)=\"OnItemClicked.emit($event)\"\n        >\n      </li>\n    </ul>\n  </div>\n\n  <p *ngIf=\"!data || data.length == 0\">{{emptyResultsMessage}}</p>\n</div>\n", styles: [".treeview-container .treeview-header{border-bottom:3px solid #CCC}.treeview-container .treeview-header .column-header{border:1px solid #CCC;border-bottom:0;padding:10px;margin-left:5px}.treeview-container .treeview-content ul{position:relative;padding:0;margin:0}.treeview-container .treeview-content ul li{list-style:none!important}@media (max-width: 860px){.treeview-header{display:none!important}}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [TREEVIEW_CONFIG]
                    }, {
                        type: Optional
                    }] }];
    }, propDecorators: { columns: [{
                type: Input
            }], data: [{
                type: Input
            }], idProperty: [{
                type: Input
            }], labelProperty: [{
                type: Input
            }], collectionProperty: [{
                type: Input
            }], emptyResultsMessage: [{
                type: Input
            }], showIcons: [{
                type: Input
            }], enableLabelLinkStyle: [{
                type: Input
            }], normalItemIconClass: [{
                type: Input
            }], collapsableClosedItemIconClass: [{
                type: Input
            }], collapsableOpennedItemIconClass: [{
                type: Input
            }], expandAllOnInit: [{
                type: Input
            }], OnItemExpanded: [{
                type: Output
            }], OnItemClicked: [{
                type: Output
            }] } });

class TreeViewStylesConfig {
}

class TreeViewColumnModel {
    constructor() {
        this.caption = '';
        this.captionAlignment = EnumAlignment.Left;
        this.captionClasses = '';
        this.data = '';
        this.dataAlignment = EnumAlignment.Left;
        this.dataClasses = '';
        this.editable = false;
        this.dataType = EnumTreeViewColumnDataType.Text;
    }
}
var EnumAlignment;
(function (EnumAlignment) {
    EnumAlignment[EnumAlignment["Left"] = 0] = "Left";
    EnumAlignment[EnumAlignment["Center"] = 1] = "Center";
    EnumAlignment[EnumAlignment["Right"] = 2] = "Right";
})(EnumAlignment || (EnumAlignment = {}));
var EnumTreeViewColumnDataType;
(function (EnumTreeViewColumnDataType) {
    EnumTreeViewColumnDataType[EnumTreeViewColumnDataType["Text"] = 0] = "Text";
    EnumTreeViewColumnDataType[EnumTreeViewColumnDataType["Date"] = 1] = "Date";
    EnumTreeViewColumnDataType[EnumTreeViewColumnDataType["Number"] = 2] = "Number";
    EnumTreeViewColumnDataType[EnumTreeViewColumnDataType["Currency"] = 3] = "Currency";
    EnumTreeViewColumnDataType[EnumTreeViewColumnDataType["Percent"] = 4] = "Percent";
})(EnumTreeViewColumnDataType || (EnumTreeViewColumnDataType = {}));

class NgxUiHeroTreeViewModule {
    static forRoot(config) {
        return {
            ngModule: NgxUiHeroTreeViewModule,
            providers: [
                {
                    provide: TREEVIEW_CONFIG,
                    useValue: config,
                }
            ]
        };
    }
}
NgxUiHeroTreeViewModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroTreeViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
NgxUiHeroTreeViewModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroTreeViewModule, declarations: [TreeViewComponent,
        TreeViewItemComponent], imports: [CommonModule,
        FormsModule,
        NgxUiHeroInputFormsModule], exports: [TreeViewComponent] });
NgxUiHeroTreeViewModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroTreeViewModule, providers: [
        TreeViewService
    ], imports: [CommonModule,
        FormsModule,
        NgxUiHeroInputFormsModule] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroTreeViewModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [
                        CommonModule,
                        FormsModule,
                        NgxUiHeroInputFormsModule
                    ],
                    declarations: [
                        TreeViewComponent,
                        TreeViewItemComponent
                    ],
                    exports: [
                        TreeViewComponent
                    ],
                    providers: [
                        TreeViewService
                    ],
                }]
        }] });

let CHARTS_CONFIG = new InjectionToken('chartsConfig');

class GanttSeriesTooltipTemplateDirective {
    constructor(template) {
        this.template = template;
    }
}
GanttSeriesTooltipTemplateDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSeriesTooltipTemplateDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
GanttSeriesTooltipTemplateDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: GanttSeriesTooltipTemplateDirective, selector: "[serie-tooltip-template]", ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttSeriesTooltipTemplateDirective, decorators: [{
            type: Directive,
            args: [{ selector: '[serie-tooltip-template]' }]
        }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });

const moment = momentImported;
let identifier = 0;
class GanttChartComponent {
    constructor(config) {
        this.tooltipPlacement = 'left';
        this.maxHeight = 0;
        this.showFooter = false;
        this.showTodayIndicator = true;
        this.onSelect = new EventEmitter();
        this.identifier = `gantt-chart-${identifier++}`;
        this.locale = 'en-us';
        this.emptyMessage = 'No results found at this moment.';
        this.showingMouseIndicator = false;
        this.mouseMovingLastMonth = false;
        this.colors = [
            '#8270fa',
            '#4d5b66',
            '#4fd1a1',
            '#fe3cae',
            '#ffca22',
            '#ff9f41',
            '#5aaaff',
            '#498acb',
            '#27cfc2',
            '#ff6982',
            '#f44336',
            '#cddc39',
            '#607d8b',
            '#795548'
        ];
        Object.assign(this, config);
    }
    ngOnInit() {
        this.initData();
        this.initMonths();
        this.initTimelineSizes();
        this.initTodayIndicator();
    }
    onResize() {
        this.handleTimelineSizes();
        this.initTodayIndicator();
    }
    onSerieSelected(item, serie) {
        this.onSelect.emit({
            item,
            serie
        });
    }
    onTimelineMouseMove(event) {
        if (!this.showingMouseIndicator)
            return;
        let offset = $(`#${this.identifier} .gantt-timeline .timeline`).offset();
        this.mouseIndicatorCoordinateX = event.pageX - offset.left;
        let monthWidth = $(`#${this.identifier} .gantt-timeline .timeline .item:first-child`).children('.box:first-child').width();
        let monthIndexBeingHovered = Math.floor(this.mouseIndicatorCoordinateX / (monthWidth + 2));
        let date = new Date(this.currentYear, monthIndexBeingHovered, 1);
        let daysInMonth = moment(date).daysInMonth();
        let dayWidth = monthWidth / daysInMonth;
        let dayBeignHovered = Math.floor((this.mouseIndicatorCoordinateX - ((monthWidth + 2) * monthIndexBeingHovered)) / dayWidth) + 1;
        if (dayBeignHovered <= 0 || dayBeignHovered > daysInMonth)
            return;
        this.dateIndicator = new Date(this.currentYear, monthIndexBeingHovered, dayBeignHovered);
        this.mouseMovingLastMonth = monthIndexBeingHovered == 11;
    }
    onTimelineMouseEnter() {
        this.showingMouseIndicator = true;
    }
    onTimelineMouseLeave() {
        this.showingMouseIndicator = false;
    }
    initData() {
        if (!this.externalData || this.externalData.length == 0)
            return;
        this.internalData = new Array();
        for (let i = 0; i < this.externalData.length; i++) {
            let colorIndex = Math.round(Math.random() * (this.colors.length - 1));
            this.internalData.push({
                label: this.externalData[i].label,
                series: this.externalData[i].series.map(s => {
                    return {
                        color: s.color || this.colors[colorIndex],
                        startDate: s.startDate,
                        endDate: s.endDate,
                        data: s.data,
                        left: 0,
                        width: 0,
                        daysDiff: this.daysDiffFromSerie(s),
                        label: s.label
                    };
                })
            });
        }
    }
    daysDiffFromSerie(serie) {
        var start = moment(serie.startDate);
        var end = moment(serie.endDate);
        return end.diff(start, 'days') + 1;
    }
    monthsDiffFromSerie(serie) {
        var start = moment(serie.startDate);
        var end = moment(serie.endDate);
        return end.diff(start, 'months');
    }
    initMonths() {
        moment.locale(this.locale);
        let today = new Date();
        if (!this.currentYear) {
            this.currentYear = today.getFullYear();
        }
        let referenceDate = new Date(this.currentYear, today.getMonth(), today.getDay());
        this.dayLabel = moment.localeData().relativeTime(1, false, 'd', false).split(' ')[1];
        this.monthLabel = moment.localeData().relativeTime(1, false, 'M', false).split(' ')[1];
        this.yearLabel = moment.localeData().relativeTime(1, false, 'y', false).split(' ')[1];
        this.currentMonth = referenceDate.getMonth();
        this.months = moment.monthsShort('-MMM-');
    }
    initTimelineSizes() {
        setTimeout(() => {
            this.handleTimelineSizes();
        }, 0);
    }
    initTodayIndicator() {
        setTimeout(() => {
            let monthWidth = $(`#${this.identifier} .gantt-timeline .timeline .item:first-child`).children('.box:first-child').width();
            let referenceDate = new Date();
            let day = referenceDate.getDate();
            let month = referenceDate.getMonth() + 1;
            let firstDayWidth = monthWidth / moment(referenceDate).daysInMonth();
            this.todayIndicatorCoordinateX = ((month - 1) * monthWidth) + ((day - 1) * firstDayWidth) + ((month - 1) * 2);
        }, 0);
    }
    handleTimelineSizes() {
        if (!this.internalData || this.internalData.length == 0)
            return;
        let monthWidth = $(`#${this.identifier} .gantt-timeline .timeline .item:first-child`).children('.box:first-child').width();
        for (let i = 0; i < this.internalData.length; i++) {
            if (!this.internalData[i].series || this.internalData[i].series.length == 0)
                continue;
            for (let s = 0; s < this.internalData[i].series.length; s++) {
                let serieTotalWidth = 0;
                let day = this.internalData[i].series[s].startDate.getDate();
                let month = this.internalData[i].series[s].startDate.getMonth() + 1;
                let daysDiff = this.internalData[i].series[s].daysDiff;
                let startDate = this.internalData[i].series[s].startDate;
                let firstDayWidth = monthWidth / moment(startDate).daysInMonth();
                let monthsDiff = this.monthsDiffFromSerie(this.internalData[i].series[s]);
                for (let d = 0; d < daysDiff; d++) {
                    let date = moment(startDate).add({ days: d }).toDate();
                    let daysInMonth = moment(date).daysInMonth();
                    let dayWidth = monthWidth / daysInMonth;
                    serieTotalWidth += dayWidth;
                }
                this.internalData[i].series[s].left = ((month - 1) * monthWidth) + ((day - 1) * firstDayWidth) + ((month - 1) * 2);
                this.internalData[i].series[s].width = serieTotalWidth + (monthsDiff * 2);
            }
        }
    }
}
GanttChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttChartComponent, deps: [{ token: CHARTS_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component });
GanttChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: GanttChartComponent, selector: "gantt-chart", inputs: { externalData: ["data", "externalData"], caption: "caption", tooltipPlacement: "tooltipPlacement", maxHeight: "maxHeight", showFooter: "showFooter", showTodayIndicator: "showTodayIndicator", currentYear: "currentYear" }, outputs: { onSelect: "onSelect" }, host: { listeners: { "window:resize": "onResize()" } }, queries: [{ propertyName: "seriesTooltipTemplate", first: true, predicate: GanttSeriesTooltipTemplateDirective, descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<div id=\"{{identifier}}\" class=\"ui-gantt-chart\">\n    <div class=\"gantt-container\" *ngIf=\"internalData?.length > 0\" [ngStyle]=\"{'maxHeight.px': maxHeight > 0 ? maxHeight : 'auto'}\">\n        <div class=\"gantt-labels\">\n            <div class=\"header\">\n                <div class=\"title\">{{caption}}</div>\n                <div class=\"legends\">\n                    <span class=\"year\">{{yearLabel}}</span>\n                    <span class=\"month\">{{monthLabel}}</span>\n                </div>\n            </div>\n            <div class=\"labels\">\n                <div class=\"label\" *ngFor=\"let item of internalData\">\n                    {{item.label}}\n                </div>\n            </div>\n            <div class=\"footer\" *ngIf=\"showFooter\">\n                <div class=\"title\">{{caption}}</div>\n                <div class=\"legends\">\n                    <span class=\"month\">{{monthLabel}}</span>\n                    <span class=\"year\">{{yearLabel}}</span>\n                </div>\n            </div>\n        </div>\n        <div class=\"gantt-timeline\">\n            <div class=\"header\">\n                <div class=\"year\">{{currentYear}}</div>\n                <div class=\"months\">\n                    <div class=\"month\" *ngFor=\"let item of months\">{{item | uppercase}}</div>\n                </div>\n                <div class=\"date-indicator\" *ngIf=\"showingMouseIndicator\" [ngStyle]=\"{\n                    'left.px': mouseIndicatorCoordinateX - (mouseMovingLastMonth ? 150 : 75)\n                }\">\n                    <i class=\"fa fa-calendar\"></i> {{dateIndicator | date}}\n                </div>\n            </div>\n            <div class=\"timeline\" (mouseenter)=\"onTimelineMouseEnter()\" (mouseleave)=\"onTimelineMouseLeave()\" (mousemove)=\"onTimelineMouseMove($event)\">\n                <div class=\"item\" *ngFor=\"let item of internalData\">\n                    <div class=\"box\" *ngFor=\"let month of months\"></div>\n\n                    <div class=\"serie-container\"  *ngFor=\"let serie of item.series\">\n                        <ng-template #tooltipTemplate>\n                            <ng-container \n                                [ngTemplateOutlet]=\"seriesTooltipTemplate\"\n                                [ngTemplateOutletContext]=\"{\n                                    serie: serie,\n                                    item: item\n                                }\">\n                            </ng-container>\n                        </ng-template>\n\n                        <div class=\"serie\" \n                            [placement]=\"tooltipPlacement\"\n                            [tooltip]=\"seriesTooltipTemplate ? tooltipTemplate : null\"\n                            container=\"body\"\n                            (click)=\"onSerieSelected(item, serie)\"\n                            [ngClass]=\"{\n                                'highlighted': showingMouseIndicator && mouseIndicatorCoordinateX >= serie.left && mouseIndicatorCoordinateX <= (serie.left + serie.width)\n                            }\"\n                            [ngStyle]=\"{\n                                'backgroundColor': serie.color,\n                                'left.px': serie.left,\n                                'width.px': serie.width\n                            }\">\n                            <span class=\"text-truncate\">{{serie.label || serie.daysDiff}}</span>\n                            <div class=\"left-border\"></div>\n                            <div class=\"top-border\"></div>\n                            <div class=\"right-border\"></div>\n                            <div class=\"bottom-border\"></div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"mouse-indicator\" *ngIf=\"showingMouseIndicator\" [ngStyle]=\"{'left.px': mouseIndicatorCoordinateX}\"></div>\n                <div class=\"mouse-indicator today\" *ngIf=\"showTodayIndicator\" [ngStyle]=\"{'left.px': todayIndicatorCoordinateX}\"></div>\n            </div>\n            <div class=\"footer\" *ngIf=\"showFooter\">\n                <div class=\"months\">\n                    <div class=\"month\" *ngFor=\"let item of months\">{{item | uppercase}}</div>\n                </div>\n                <div class=\"year\">{{currentYear}}</div>\n                <div class=\"date-indicator\" *ngIf=\"showingMouseIndicator\" [ngStyle]=\"{\n                    'left.px': mouseIndicatorCoordinateX - (mouseMovingLastMonth ? 150 : 75)\n                }\">\n                    <i class=\"fa fa-calendar\"></i> {{dateIndicator | date}}\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <p *ngIf=\"!internalData || internalData.length == 0\">{{emptyMessage}}</p>\n</div>\n", styles: ["@keyframes pulse{0%{opacity:.7}50%{opacity:1}to{opacity:.7}}.ui-gantt-chart{width:100%;border:1px solid #eeeeee}.ui-gantt-chart .gantt-container{display:flex;overflow-y:auto}.ui-gantt-chart .gantt-container .gantt-labels .header,.ui-gantt-chart .gantt-container .gantt-labels .footer,.ui-gantt-chart .gantt-container .gantt-timeline .header,.ui-gantt-chart .gantt-container .gantt-timeline .footer{display:flex;height:70px;box-shadow:0 .125rem .25rem #00000013}.ui-gantt-chart .gantt-container .gantt-labels .footer,.ui-gantt-chart .gantt-container .gantt-timeline .footer{box-shadow:0 -.125rem .25rem #00000013}.ui-gantt-chart .gantt-container .gantt-labels{width:300px;flex-shrink:0;position:relative}.ui-gantt-chart .gantt-container .gantt-labels .header,.ui-gantt-chart .gantt-container .gantt-labels .footer{justify-content:space-between;align-items:center;border-right:2px solid #eeeeee;padding:0 20px;background-color:#fff;position:sticky;top:0;z-index:10}.ui-gantt-chart .gantt-container .gantt-labels .header .title,.ui-gantt-chart .gantt-container .gantt-labels .footer .title{color:#717274;font-weight:600;font-size:18px}.ui-gantt-chart .gantt-container .gantt-labels .header .legends,.ui-gantt-chart .gantt-container .gantt-labels .footer .legends{text-align:right}.ui-gantt-chart .gantt-container .gantt-labels .header .legends span,.ui-gantt-chart .gantt-container .gantt-labels .footer .legends span{color:#717274;display:block;font-size:13px;font-weight:700;padding:4px 0;text-transform:capitalize}.ui-gantt-chart .gantt-container .gantt-labels .footer{top:inherit;bottom:0}.ui-gantt-chart .gantt-container .gantt-labels .labels .label{display:flex;align-items:center;font-weight:600;line-height:1.2;background-color:#f1f5f8;border-bottom:1px solid #dfe8ef;border-right:2px solid #dfe8ef;padding:0 20px;height:50px}.ui-gantt-chart .gantt-container .gantt-timeline{flex-grow:1;position:relative}.ui-gantt-chart .gantt-container .gantt-timeline .header,.ui-gantt-chart .gantt-container .gantt-timeline .footer{display:flex;flex-direction:column;justify-content:center;min-width:700px;background-color:#fff;position:sticky;top:0;z-index:10}.ui-gantt-chart .gantt-container .gantt-timeline .header .year,.ui-gantt-chart .gantt-container .gantt-timeline .footer .year{text-align:center;color:#717274;font-size:13px;font-weight:700;padding:4px 0}.ui-gantt-chart .gantt-container .gantt-timeline .header .months,.ui-gantt-chart .gantt-container .gantt-timeline .footer .months{display:flex;padding:4px 0}.ui-gantt-chart .gantt-container .gantt-timeline .header .months .month,.ui-gantt-chart .gantt-container .gantt-timeline .footer .months .month{color:#717274;text-align:center;flex-grow:1;font-size:13px;font-weight:600}.ui-gantt-chart .gantt-container .gantt-timeline .header .date-indicator,.ui-gantt-chart .gantt-container .gantt-timeline .footer .date-indicator{position:absolute;bottom:8px;background-color:#327ace;color:#fff;padding:3px 10px;border-radius:10px;border:1px solid #00559A;font-size:13px;width:150px;text-align:center;transition:left .2s ease-out}.ui-gantt-chart .gantt-container .gantt-timeline .footer{top:inherit;bottom:0}.ui-gantt-chart .gantt-container .gantt-timeline .footer .date-indicator{bottom:35px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline{position:relative;min-width:700px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item{display:flex;position:relative;transition:background-color .2s ease-in-out}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .box{flex-grow:1;transition:background-color .2s ease-in-out;border-bottom:1px solid #eeeeee;border-right:2px solid #eeeeee;height:50px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .box:last-child{border-right:0}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .box:hover{background-color:#f0f0f0}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie{cursor:pointer;position:absolute;display:flex;align-items:center;color:#fff;font-size:13px;font-weight:600;top:5px;bottom:6px;padding:0 5px;transition:opacity .3s ease-in-out,width .8s ease-out;z-index:9}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie:hover{opacity:.8}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .left-border,.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .top-border,.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .right-border,.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .bottom-border{position:absolute;background-color:#333;opacity:.5;z-index:11}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .left-border{top:2px;left:0;bottom:2px;width:2px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .top-border{top:0;right:0;left:0;height:2px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .right-border{top:2px;right:0;bottom:2px;width:2px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .bottom-border{bottom:0;right:0;left:0;height:2px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie.highlighted{animation:pulse 1s infinite ease-in-out}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item:hover{background-color:#f9f9f9}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .mouse-indicator{position:absolute;top:0;bottom:0;width:0;border-right:1px dashed #327ACE;z-index:8;-webkit-user-select:none;user-select:none;outline:none}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .mouse-indicator.today{border-right:1px dashed #327ACE;z-index:10}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .mouse-indicator.today:before{content:\"\";position:absolute;top:0;left:-4.5px;width:0;height:0;z-index:8;border-top:5px solid #327ACE;border-right:5px solid transparent;border-left:5px solid transparent}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .mouse-indicator.today:after{content:\"\";position:absolute;bottom:0;left:-4.5px;width:0;height:0;z-index:8;border-bottom:5px solid #327ACE;border-right:5px solid transparent;border-left:5px solid transparent}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["containerClass", "tooltipAnimation", "tooltipFadeDuration", "isOpen", "tooltipHtml", "tooltip", "tooltipPlacement", "placement", "tooltipIsOpen", "tooltipEnable", "isDisabled", "tooltipAppendToBody", "container", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "delay", "tooltipTrigger", "triggers", "adaptivePosition"], outputs: ["tooltipChange", "tooltipStateChanged", "onShown", "onHidden"], exportAs: ["bs-tooltip"] }, { kind: "pipe", type: i1$1.UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: i1$1.DatePipe, name: "date" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: GanttChartComponent, decorators: [{
            type: Component,
            args: [{ selector: 'gantt-chart', host: {
                        '(window:resize)': 'onResize()'
                    }, template: "<div id=\"{{identifier}}\" class=\"ui-gantt-chart\">\n    <div class=\"gantt-container\" *ngIf=\"internalData?.length > 0\" [ngStyle]=\"{'maxHeight.px': maxHeight > 0 ? maxHeight : 'auto'}\">\n        <div class=\"gantt-labels\">\n            <div class=\"header\">\n                <div class=\"title\">{{caption}}</div>\n                <div class=\"legends\">\n                    <span class=\"year\">{{yearLabel}}</span>\n                    <span class=\"month\">{{monthLabel}}</span>\n                </div>\n            </div>\n            <div class=\"labels\">\n                <div class=\"label\" *ngFor=\"let item of internalData\">\n                    {{item.label}}\n                </div>\n            </div>\n            <div class=\"footer\" *ngIf=\"showFooter\">\n                <div class=\"title\">{{caption}}</div>\n                <div class=\"legends\">\n                    <span class=\"month\">{{monthLabel}}</span>\n                    <span class=\"year\">{{yearLabel}}</span>\n                </div>\n            </div>\n        </div>\n        <div class=\"gantt-timeline\">\n            <div class=\"header\">\n                <div class=\"year\">{{currentYear}}</div>\n                <div class=\"months\">\n                    <div class=\"month\" *ngFor=\"let item of months\">{{item | uppercase}}</div>\n                </div>\n                <div class=\"date-indicator\" *ngIf=\"showingMouseIndicator\" [ngStyle]=\"{\n                    'left.px': mouseIndicatorCoordinateX - (mouseMovingLastMonth ? 150 : 75)\n                }\">\n                    <i class=\"fa fa-calendar\"></i> {{dateIndicator | date}}\n                </div>\n            </div>\n            <div class=\"timeline\" (mouseenter)=\"onTimelineMouseEnter()\" (mouseleave)=\"onTimelineMouseLeave()\" (mousemove)=\"onTimelineMouseMove($event)\">\n                <div class=\"item\" *ngFor=\"let item of internalData\">\n                    <div class=\"box\" *ngFor=\"let month of months\"></div>\n\n                    <div class=\"serie-container\"  *ngFor=\"let serie of item.series\">\n                        <ng-template #tooltipTemplate>\n                            <ng-container \n                                [ngTemplateOutlet]=\"seriesTooltipTemplate\"\n                                [ngTemplateOutletContext]=\"{\n                                    serie: serie,\n                                    item: item\n                                }\">\n                            </ng-container>\n                        </ng-template>\n\n                        <div class=\"serie\" \n                            [placement]=\"tooltipPlacement\"\n                            [tooltip]=\"seriesTooltipTemplate ? tooltipTemplate : null\"\n                            container=\"body\"\n                            (click)=\"onSerieSelected(item, serie)\"\n                            [ngClass]=\"{\n                                'highlighted': showingMouseIndicator && mouseIndicatorCoordinateX >= serie.left && mouseIndicatorCoordinateX <= (serie.left + serie.width)\n                            }\"\n                            [ngStyle]=\"{\n                                'backgroundColor': serie.color,\n                                'left.px': serie.left,\n                                'width.px': serie.width\n                            }\">\n                            <span class=\"text-truncate\">{{serie.label || serie.daysDiff}}</span>\n                            <div class=\"left-border\"></div>\n                            <div class=\"top-border\"></div>\n                            <div class=\"right-border\"></div>\n                            <div class=\"bottom-border\"></div>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"mouse-indicator\" *ngIf=\"showingMouseIndicator\" [ngStyle]=\"{'left.px': mouseIndicatorCoordinateX}\"></div>\n                <div class=\"mouse-indicator today\" *ngIf=\"showTodayIndicator\" [ngStyle]=\"{'left.px': todayIndicatorCoordinateX}\"></div>\n            </div>\n            <div class=\"footer\" *ngIf=\"showFooter\">\n                <div class=\"months\">\n                    <div class=\"month\" *ngFor=\"let item of months\">{{item | uppercase}}</div>\n                </div>\n                <div class=\"year\">{{currentYear}}</div>\n                <div class=\"date-indicator\" *ngIf=\"showingMouseIndicator\" [ngStyle]=\"{\n                    'left.px': mouseIndicatorCoordinateX - (mouseMovingLastMonth ? 150 : 75)\n                }\">\n                    <i class=\"fa fa-calendar\"></i> {{dateIndicator | date}}\n                </div>\n            </div>\n        </div>\n    </div>\n\n    <p *ngIf=\"!internalData || internalData.length == 0\">{{emptyMessage}}</p>\n</div>\n", styles: ["@keyframes pulse{0%{opacity:.7}50%{opacity:1}to{opacity:.7}}.ui-gantt-chart{width:100%;border:1px solid #eeeeee}.ui-gantt-chart .gantt-container{display:flex;overflow-y:auto}.ui-gantt-chart .gantt-container .gantt-labels .header,.ui-gantt-chart .gantt-container .gantt-labels .footer,.ui-gantt-chart .gantt-container .gantt-timeline .header,.ui-gantt-chart .gantt-container .gantt-timeline .footer{display:flex;height:70px;box-shadow:0 .125rem .25rem #00000013}.ui-gantt-chart .gantt-container .gantt-labels .footer,.ui-gantt-chart .gantt-container .gantt-timeline .footer{box-shadow:0 -.125rem .25rem #00000013}.ui-gantt-chart .gantt-container .gantt-labels{width:300px;flex-shrink:0;position:relative}.ui-gantt-chart .gantt-container .gantt-labels .header,.ui-gantt-chart .gantt-container .gantt-labels .footer{justify-content:space-between;align-items:center;border-right:2px solid #eeeeee;padding:0 20px;background-color:#fff;position:sticky;top:0;z-index:10}.ui-gantt-chart .gantt-container .gantt-labels .header .title,.ui-gantt-chart .gantt-container .gantt-labels .footer .title{color:#717274;font-weight:600;font-size:18px}.ui-gantt-chart .gantt-container .gantt-labels .header .legends,.ui-gantt-chart .gantt-container .gantt-labels .footer .legends{text-align:right}.ui-gantt-chart .gantt-container .gantt-labels .header .legends span,.ui-gantt-chart .gantt-container .gantt-labels .footer .legends span{color:#717274;display:block;font-size:13px;font-weight:700;padding:4px 0;text-transform:capitalize}.ui-gantt-chart .gantt-container .gantt-labels .footer{top:inherit;bottom:0}.ui-gantt-chart .gantt-container .gantt-labels .labels .label{display:flex;align-items:center;font-weight:600;line-height:1.2;background-color:#f1f5f8;border-bottom:1px solid #dfe8ef;border-right:2px solid #dfe8ef;padding:0 20px;height:50px}.ui-gantt-chart .gantt-container .gantt-timeline{flex-grow:1;position:relative}.ui-gantt-chart .gantt-container .gantt-timeline .header,.ui-gantt-chart .gantt-container .gantt-timeline .footer{display:flex;flex-direction:column;justify-content:center;min-width:700px;background-color:#fff;position:sticky;top:0;z-index:10}.ui-gantt-chart .gantt-container .gantt-timeline .header .year,.ui-gantt-chart .gantt-container .gantt-timeline .footer .year{text-align:center;color:#717274;font-size:13px;font-weight:700;padding:4px 0}.ui-gantt-chart .gantt-container .gantt-timeline .header .months,.ui-gantt-chart .gantt-container .gantt-timeline .footer .months{display:flex;padding:4px 0}.ui-gantt-chart .gantt-container .gantt-timeline .header .months .month,.ui-gantt-chart .gantt-container .gantt-timeline .footer .months .month{color:#717274;text-align:center;flex-grow:1;font-size:13px;font-weight:600}.ui-gantt-chart .gantt-container .gantt-timeline .header .date-indicator,.ui-gantt-chart .gantt-container .gantt-timeline .footer .date-indicator{position:absolute;bottom:8px;background-color:#327ace;color:#fff;padding:3px 10px;border-radius:10px;border:1px solid #00559A;font-size:13px;width:150px;text-align:center;transition:left .2s ease-out}.ui-gantt-chart .gantt-container .gantt-timeline .footer{top:inherit;bottom:0}.ui-gantt-chart .gantt-container .gantt-timeline .footer .date-indicator{bottom:35px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline{position:relative;min-width:700px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item{display:flex;position:relative;transition:background-color .2s ease-in-out}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .box{flex-grow:1;transition:background-color .2s ease-in-out;border-bottom:1px solid #eeeeee;border-right:2px solid #eeeeee;height:50px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .box:last-child{border-right:0}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .box:hover{background-color:#f0f0f0}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie{cursor:pointer;position:absolute;display:flex;align-items:center;color:#fff;font-size:13px;font-weight:600;top:5px;bottom:6px;padding:0 5px;transition:opacity .3s ease-in-out,width .8s ease-out;z-index:9}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie:hover{opacity:.8}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .left-border,.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .top-border,.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .right-border,.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .bottom-border{position:absolute;background-color:#333;opacity:.5;z-index:11}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .left-border{top:2px;left:0;bottom:2px;width:2px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .top-border{top:0;right:0;left:0;height:2px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .right-border{top:2px;right:0;bottom:2px;width:2px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie .bottom-border{bottom:0;right:0;left:0;height:2px}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item .serie.highlighted{animation:pulse 1s infinite ease-in-out}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .item:hover{background-color:#f9f9f9}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .mouse-indicator{position:absolute;top:0;bottom:0;width:0;border-right:1px dashed #327ACE;z-index:8;-webkit-user-select:none;user-select:none;outline:none}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .mouse-indicator.today{border-right:1px dashed #327ACE;z-index:10}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .mouse-indicator.today:before{content:\"\";position:absolute;top:0;left:-4.5px;width:0;height:0;z-index:8;border-top:5px solid #327ACE;border-right:5px solid transparent;border-left:5px solid transparent}.ui-gantt-chart .gantt-container .gantt-timeline .timeline .mouse-indicator.today:after{content:\"\";position:absolute;bottom:0;left:-4.5px;width:0;height:0;z-index:8;border-bottom:5px solid #327ACE;border-right:5px solid transparent;border-left:5px solid transparent}\n"] }]
        }], ctorParameters: function () {
        return [{ type: undefined, decorators: [{
                        type: Inject,
                        args: [CHARTS_CONFIG]
                    }, {
                        type: Optional
                    }] }];
    }, propDecorators: { externalData: [{
                type: Input,
                args: ['data']
            }], caption: [{
                type: Input
            }], tooltipPlacement: [{
                type: Input
            }], maxHeight: [{
                type: Input
            }], showFooter: [{
                type: Input
            }], showTodayIndicator: [{
                type: Input
            }], currentYear: [{
                type: Input
            }], onSelect: [{
                type: Output
            }], seriesTooltipTemplate: [{
                type: ContentChild,
                args: [GanttSeriesTooltipTemplateDirective, { read: TemplateRef, static: true }]
            }] } });

class NgxUiHeroChartsModule {
    static forRoot(config) {
        return {
            ngModule: NgxUiHeroChartsModule,
            providers: [
                {
                    provide: CHARTS_CONFIG,
                    useValue: config,
                }
            ]
        };
    }
}
NgxUiHeroChartsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroChartsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
NgxUiHeroChartsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroChartsModule, declarations: [GanttChartComponent,
        GanttSeriesTooltipTemplateDirective], imports: [CommonModule,
        UiModule], exports: [GanttChartComponent,
        GanttSeriesTooltipTemplateDirective] });
NgxUiHeroChartsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroChartsModule, imports: [CommonModule,
        UiModule] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: NgxUiHeroChartsModule, decorators: [{
            type: NgModule,
            args: [{
                    imports: [
                        CommonModule,
                        UiModule,
                    ],
                    declarations: [
                        GanttChartComponent,
                        GanttSeriesTooltipTemplateDirective
                    ],
                    exports: [
                        GanttChartComponent,
                        GanttSeriesTooltipTemplateDirective
                    ],
                    providers: [],
                }]
        }] });

/*
 * Public API Surface of ngx-ui-hero
 */

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

export { ActionsColumnDirective, AlertService, AutoFocusDirective, AutoSelectOnFocusDirective, BaseApiUrlInterceptor, BlockUi, BlockUiComponent, CURRENCYMASKDIRECTIVE_VALUE_ACCESSOR, ClickOutsideDirective, ColumnFilterModel, ColumnReorderingDefinitionsItemModel, ColumnReorderingDefinitionsModel, CommonHeadersInterceptor, CurrencyMaskDirective, CurrencySymbolPipe, DataGridColumnModel, DataGridComponent, DataGridSortingModel, DebounceDirective, EnumAlignment$1 as EnumAlignment, EnumAutoFitMode, EnumDataGridMode, EnumSortDirection, EnumTreeViewColumnDataType, ErrorHandlerInterceptor, FilterDateComponent, FilterDropdownSearchComponent, FilterMultiselectComponent, GanttChartComponent, GanttSeriesTooltipTemplateDirective, GridColumnModel, GridDataModel, GridRowModel, InputCheckboxComponent, InputCurrencyComponent, InputDateComponent, InputDateConfig, InputDropdownGridComponent, InputDropdownSearchComponent, InputEmailComponent, InputMonthYearComponent, InputMultiselectComponent, InputNumberComponent, InputPercentComponent, InputRadioComponent, InputSelectComponent, InputSwitchComponent, InputTextComponent, InputTextMaskComponent, InputTextareaComponent, InputUploadComponent, InputValidationsComponent, JwtAuthInterceptor, LocalStorageService, MaskDirective, MaxValueDirective, MinValueDirective, ModalComponent, NgxUiHeroApiModule, NgxUiHeroChartsModule, NgxUiHeroDataGridModule, NgxUiHeroInputFormsModule, NgxUiHeroModule, NgxUiHeroTreeViewModule, RadialButtonComponent, ReportComponent, ResponseDataInterceptor, SearchByPipe, SpinnerComponent, TreeViewColumnModel, TreeViewComponent, TreeViewService, TreeViewStylesConfig, TutorialAction, TutorialDirective, TutorialService, UiModule, WinAuthInterceptor };
//# sourceMappingURL=ngx-ui-hero.mjs.map