ngx-ui-hero
Version:
Simple, fast and reliable utilities for Angular.
7,330 lines • 650 kB
JavaScript
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\">×</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\">×</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