UNPKG

ontimize-web-ngx

Version:
396 lines 84 kB
import { __decorate, __metadata } from "tslib"; import { Component, ContentChildren, ElementRef, forwardRef, Inject, Injector, Optional, QueryList, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core'; import { MediaObserver } from '@angular/flex-layout'; import { MatPaginator } from '@angular/material/paginator'; import { Subscription } from 'rxjs'; import { BooleanInputConverter } from '../../decorators/input-converter'; import { ComponentStateServiceProvider, OntimizeServiceProvider } from '../../services/factories'; import { OGridComponentStateService } from '../../services/state/o-grid-component-state.service'; import { Codes } from '../../util/codes'; import { ServiceUtils } from '../../util/service.utils'; import { Util } from '../../util/util'; import { OFormComponent } from '../form/o-form.component'; import { AbstractOServiceComponent } from '../o-service-component.class'; import { OMatSort } from '../table/extensions/sort/o-mat-sort'; import { OGridItemComponent } from './grid-item/o-grid-item.component'; import { OGridItemDirective } from './grid-item/o-grid-item.directive'; import { O_COMPONENT_STATE_SERVICE } from '../../injection-tokens'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "../input/search-input/o-search-input.component"; import * as i3 from "@angular/flex-layout/flex"; import * as i4 from "@angular/flex-layout/extended"; import * as i5 from "@angular/material/core"; import * as i6 from "@angular/material/button"; import * as i7 from "@angular/material/grid-list"; import * as i8 from "@angular/material/icon"; import * as i9 from "@angular/material/form-field"; import * as i10 from "@angular/material/select"; import * as i11 from "@angular/material/paginator"; import * as i12 from "../o-data-toolbar/o-data-toolbar.component"; import * as i13 from "./grid-item/o-grid-item.directive"; import * as i14 from "./skeketon/o-grid-skeleton.component"; import * as i15 from "../../pipes/o-translate.pipe"; import * as i16 from "../form/o-form.component"; export const DEFAULT_INPUTS_O_GRID = [ 'cols', 'showPageSize: show-page-size', 'showSort: orderable', 'sortableColumns: sortable-columns', 'sortColumn: sort-column', 'quickFilterColumns: quick-filter-columns', 'gridItemHeight: grid-item-height', 'refreshButton: refresh-button', 'gutterSize:gutter-size', 'fixedHeader:fixed-header', 'showFooter:show-footer', 'insertButtonPosition:insert-button-position', 'insertButtonFloatable:insert-button-floatable', 'showButtonsText: show-buttons-text' ]; const PAGE_SIZE_OPTIONS = [8, 16, 24, 32, 64]; export class OGridComponent extends AbstractOServiceComponent { get cols() { return this._cols || this._colsDefault; } set cols(value) { this._cols = value; } get sortableColumns() { return this._sortableColumns; } set sortableColumns(val) { let parsed = []; if (!Util.isArray(val)) { parsed = ServiceUtils.parseSortColumns(String(val)); } this._sortableColumns = parsed; } set gridItems(value) { this._gridItems = value; } get gridItems() { return this._gridItems; } constructor(injector, elRef, form) { super(injector, elRef, form); this._queryRows = 32; this.fixedHeader = false; this.showPageSize = false; this.showSort = false; this.showFooter = true; this.gridItemHeight = '1:1'; this.refreshButton = true; this.insertButton = false; this.insertButtonFloatable = true; this.showButtonsText = false; this.insertButtonPosition = 'bottom'; this.paginationControls = false; this.gutterSize = '1px'; this._quickFilterAppearance = 'outline'; this._sortableColumns = []; this._colsDefault = 1; this._pageSizeOptions = PAGE_SIZE_OPTIONS; this.storePaginationState = false; this._gridItems = []; this.subscription = new Subscription(); this.media = this.injector.get(MediaObserver); this.oMatSort = new OMatSort(); } get state() { return this.componentStateService.state; } ngOnInit() { this.initialize(); this.permissions = this.permissionsService.getGridPermissions(this.oattr, this.actRoute); this.actionsPermissions = this.getActionsPermissions(this.permissions); this.setButtonPermissions(this.actionsPermissions); } initialize() { super.initialize(); if (!Util.isDefined(this.quickFilterColumns)) { this.quickFilterColumns = this.columns; } this.quickFilterColArray = Util.parseArray(this.quickFilterColumns, true); if (Util.isDefined(this.state.sortColumn)) { this.sortColumn = this.state.sortColumn; } this.parseSortColumn(); const existingOption = this.pageSizeOptions.find(option => option === this.queryRows); if (!Util.isDefined(existingOption)) { this._pageSizeOptions.push(this.queryRows); this._pageSizeOptions.sort((i, j) => i - j); } if (Util.isDefined(this.state.currentPage)) { this.currentPage = this.state.currentPage; } if (Util.isDefined(this.state.queryRows)) { this.queryRows = this.state.queryRows; } } ngAfterViewInit() { super.afterViewInit(); this.filterCaseSensitive = Util.isDefined(this.state.filterCaseSensitive) ? this.state.filterCaseSensitive : this.filterCaseSensitive; this.setGridItemDirectivesData(); this.subscribeToMediaChanges(); this.registerQuickFilter(this.searchInputComponent); if (this.queryOnInit) { this.queryData(); } this.manageCustomPermissions(this.actionsPermissions, '[o-grid-toolbar]'); } ngAfterContentInit() { this.gridItems = this.inputGridItems.toArray(); this.subscription.add(this.inputGridItems.changes.subscribe(queryChanges => { this.gridItems = queryChanges._results; })); } subscribeToMediaChanges() { this.subscription.add(this.media.asObservable().subscribe((change) => { if (change && change[0]) { switch (change[0].mqAlias) { case 'xs': case 'sm': this._colsDefault = 1; break; case 'md': this._colsDefault = 2; break; case 'lg': case 'xl': this._colsDefault = 4; } } })); } reloadData() { let queryArgs = {}; if (this.pageable) { this.state.queryRecordOffset = 0; queryArgs = { offset: this.paginationControls ? (this.currentPage * this.queryRows) : 0, length: Math.max(this.queryRows, this.dataResponseArray.length), replace: true }; } this.queryData(void 0, queryArgs); } reloadPaginatedDataFromStart() { this.currentPage = 0; this.dataResponseArray = []; this.reloadData(); } getSortedDataFromArray(dataArray) { if (Util.isDefined(this.sortColumnOrder)) { return this.oMatSort.getSortedDataBySQLOrder(dataArray, [this.sortColumnOrder]); } return dataArray; } registerGridItemDirective(item) { if (item) { if (this.detailMode === Codes.DETAIL_MODE_CLICK) { item.onClick(gridItem => this.onItemDetailClick(gridItem)); } if (Codes.isDoubleClickMode(this.detailMode)) { item.onDoubleClick(gridItem => this.onItemDetailDblClick(gridItem)); } } } onItemDetailClick(item) { this.handleItemClick(item); } onItemDetailDblClick(item) { this.handleItemDblClick(item); } ngOnDestroy() { this.destroy(); } destroy() { super.destroy(); if (this.subscription) { this.subscription.unsubscribe(); } } loadMore() { this.currentPage += 1; if (this.pageable) { const queryArgs = { offset: this.state.queryRecordOffset, length: this.queryRows }; this.dataService?.setPaginationContext({ pageNumber: this.dataService?.getPaginationContext().pageNumber + 1 }); this.queryData(void 0, queryArgs); } else { this.filterData(void 0, true); } } getQueryArguments(filter, ovrrArgs) { const queryArguments = super.getQueryArguments(filter, ovrrArgs); if (this.pageable && Util.isDefined(this.sortColumn)) { queryArguments.sort = this.sortColumnOrder ? [this.sortColumnOrder] : []; } return queryArguments; } parseSortColumn() { const parsed = (ServiceUtils.parseSortColumns(this.sortColumn) || [])[0]; const index = this.findSortableColumnIndex(parsed); if (Util.isDefined(index) && index !== -1) { this.sortColumnOrder = parsed; } } get currentOrderColumn() { return this.findSortableColumnIndex(this.sortColumnOrder); } set currentOrderColumn(val) { this.sortColumnOrder = this.sortableColumns[val]; } findSortableColumnIndex(sortableColumn) { if (!Util.isDefined(sortableColumn)) { return null; } return this.sortableColumns .findIndex(item => item.columnName === sortableColumn.columnName && item.ascendent === sortableColumn.ascendent); } getDataToStore() { return this.componentStateService.getDataToStore(); } getSortOptionText(col) { let result; let colTextKey = `GRID.SORT_BY_${col.columnName.toUpperCase()}_` + (col.ascendent ? 'ASC' : 'DESC'); result = this.translateService.get(colTextKey); if (result !== colTextKey) { return result; } colTextKey = 'GRID.SORT_BY_' + (col.ascendent ? 'ASC' : 'DESC'); result = this.translateService.get(colTextKey, [(this.translateService.get(col.columnName) || '')]); return result; } add() { super.insertDetail(); } parseResponseArray(data, replace) { let result = data; if (this.pageable && !replace) { result = this.paginationControls ? data : (this.dataResponseArray || []).concat(data); } else if (!this.pageable) { result = data; } return result; } saveDataNavigationInLocalStorage() { super.saveDataNavigationInLocalStorage(); this.storePaginationState = true; } setGridItemDirectivesData() { this.gridItemDirectives.changes.subscribe(() => { this.gridItemDirectives.toArray().forEach((element, index) => { element.setItemData(this.dataArray[index]); element.setGridComponent(this); this.registerGridItemDirective(element); }); }); } pageSizeChanged() { if (this.pageable) { this.reloadData(); } else { this.filterData(); } } sortColumnChanged(event) { this.currentOrderColumn = event.value; if (this.pageable) { this.reloadData(); } else { this.filterData(); } } registerQuickFilter(arg) { super.registerQuickFilter(arg); if (Util.isDefined(this.quickFilterComponent) && Util.isDefined(this.state.quickFilterActiveColumns)) { const parsedArr = Util.parseArray(this.state.quickFilterActiveColumns, true); this.quickFilterComponent.setActiveColumns(parsedArr); } } getPaginationDataFromArray(dataArray) { let result; if (this.paginationControls) { result = dataArray.splice(this.currentPage * this.queryRows, this.queryRows); } else { result = dataArray.splice(0, this.queryRows * (this.currentPage + 1)); } return result; } } OGridComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OGridComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: forwardRef(() => OFormComponent), optional: true }], target: i0.ɵɵFactoryTarget.Component }); OGridComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: OGridComponent, selector: "o-grid", inputs: { cols: "cols", showPageSize: ["show-page-size", "showPageSize"], showSort: ["orderable", "showSort"], sortableColumns: ["sortable-columns", "sortableColumns"], sortColumn: ["sort-column", "sortColumn"], quickFilterColumns: ["quick-filter-columns", "quickFilterColumns"], gridItemHeight: ["grid-item-height", "gridItemHeight"], refreshButton: ["refresh-button", "refreshButton"], gutterSize: ["gutter-size", "gutterSize"], fixedHeader: ["fixed-header", "fixedHeader"], showFooter: ["show-footer", "showFooter"], insertButtonPosition: ["insert-button-position", "insertButtonPosition"], insertButtonFloatable: ["insert-button-floatable", "insertButtonFloatable"], showButtonsText: ["show-buttons-text", "showButtonsText"] }, host: { properties: { "class.o-grid": "true", "class.o-grid-fixed": "fixedHeader" } }, providers: [ OntimizeServiceProvider, ComponentStateServiceProvider, { provide: O_COMPONENT_STATE_SERVICE, useClass: OGridComponentStateService }, ], queries: [{ propertyName: "inputGridItems", predicate: i0.forwardRef(function () { return OGridItemComponent; }) }], viewQueries: [{ propertyName: "matpaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "gridItemDirectives", predicate: OGridItemDirective, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div [style.display]=\"isVisible()? '' : 'none'\" class=\"o-grid-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n\n <!--TOOLBAR-->\n <o-data-toolbar *ngIf=\"hasControls()\" class=\"o-grid-toolbar\" [title]=\"title\" [show-title]=\"hasTitle()\">\n <ng-container o-data-toolbar-projection-start>\n <ng-container *ngIf=\"showButtonsText;else showButtonsWithoutText\">\n <!-- button new-->\n <button *ngIf=\"insertButton && !insertButtonFloatable\" type=\"button\" [disabled]=\"!enabledInsertButton\"\n class=\"o-grid-add-button o-grid-button text\" mat-stroked-button aria-label=\"Insert\" (click)=\"add()\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n <span>{{ 'ADD' | oTranslate }}</span>\n </button>\n\n <!--button refresh-->\n <button type=\"button\" mat-stroked-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\" (click)=\"reloadData()\" *ngIf=\"refreshButton\"\n class=\"o-grid-button text\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n <span>{{ 'REFRESH' | oTranslate }}</span>\n </button>\n </ng-container>\n\n <ng-template #showButtonsWithoutText>\n <!-- button new-->\n <button *ngIf=\"insertButton && !insertButtonFloatable\" [disabled]=\"!enabledInsertButton\" type=\"button\"\n class=\"o-grid-button o-grid-add-button no-text\" mat-icon-button aria-label=\"Insert\" (click)=\"add()\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n\n <!--button refresh-->\n <button type=\"button\" mat-icon-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\" (click)=\"reloadData()\" *ngIf=\"refreshButton\"\n class=\"o-grid-button no-text\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n </button>\n </ng-template>\n\n <!--O-GRID-PAGINATOR-->\n <div class=\"o-grid-paginator\" *ngIf=\"showPageSize\">\n <div class=\"o-grid-page-size-label\">{{ 'GRID.ITEMS_PER_PAGE' | oTranslate }}:</div>\n <mat-form-field class=\"o-grid-select-page\">\n <mat-select placeholder=\"\" #pageSizeSelect [(value)]=\"queryRows\" (selectionChange)=\"pageSizeChanged()\">\n <mat-option *ngFor=\"let page of pageSizeOptions\" [value]=\"page\">\n {{ page }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!--O-GRID-SORT-->\n <div class=\"o-grid-sort\" *ngIf=\"showSort && sortableColumns.length > 0\">\n <mat-form-field class=\"o-grid-select-sort\">\n <mat-icon matPrefix>sort</mat-icon>\n <mat-select #sortSelect [value]=\"currentOrderColumn\" (selectionChange)=\"sortColumnChanged($event)\"\n placeholder=\" {{ 'GRID.SORT_BY' | oTranslate }}\">\n <mat-option *ngFor=\"let column of sortableColumns; let i = index\" [value]=\"i\">\n {{ getSortOptionText(column) }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n </ng-container>\n <ng-content select=\"[o-grid-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-grid-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-grid-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <o-search-input *ngIf=\"quickFilter\" [columns]=\"quickFilterColumns\" [filter-case-sensitive]=\"filterCaseSensitive\"\n [show-case-sensitive-checkbox]=\"showCaseSensitiveCheckbox()\" [placeholder]=\"quickFilterPlaceholder\" [appearance]=\"quickFilterAppearance\"\n float-label=\"never\"></o-search-input>\n </ng-container>\n </o-data-toolbar>\n\n <!--no results-->\n <div class=\"o-grid-no-results fill-remaining\" *ngIf=\"gridItems.length === 0\" fxLayoutAlign=\"center start\" layout-padding\n [ngStyle]=\"{'visibility': (loading | async) === false ? 'visible':'hidden'}\">\n {{'GRID.EMPTY' | oTranslate}}\n <ng-container *ngIf=\"quickFilter && searchInputComponent && searchInputComponent.getValue() && searchInputComponent.getValue().length > 0\">\n {{ 'GRID.EMPTY_USING_FILTER' | oTranslate : { values: [ searchInputComponent.getValue()] } }}\n </ng-container>\n </div>\n\n\n <!--MAT-GRID-LIST-->\n <mat-grid-list [cols]=\"cols\" [gutterSize]=\"gutterSize\" [rowHeight]=\"gridItemHeight\" class=\"o-mat-grid-list fill-remaining\"\n *ngIf=\"gridItems.length > 0\" [ngStyle]=\"{'visibility': (loading | async) === false ? 'visible':'hidden'}\">\n <mat-grid-tile o-grid-item *ngFor=\"let item of gridItems\" [colspan]=\"item.colspan\" [rowspan]=\"item.rowspan\">\n <ng-container *ngTemplateOutlet=\"item.template\"></ng-container>\n </mat-grid-tile>\n </mat-grid-list>\n <button type=\"button\" aria-label=\"Insert\" *ngIf=\"insertButton && insertButtonFloatable\" [disabled]=\"!enabledInsertButton\" mat-fab (click)=\"add()\"\n class=\"o-grid-add-floatable-button\" [class.o-grid-add-bottom-floatable-button]=\"insertButtonPosition ==='bottom'\"\n [class.o-grid-add-top-floatable-button]=\"insertButtonPosition ==='top'\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n\n <!-- GRID FOOTER -->\n <div *ngIf=\"!paginationControls && showFooter && (loading | async)===false\" fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"o-grid-footer\">\n <button type=\"button\" mat-button *ngIf=\"getDataArray().length < totalRecords && getDataArray().length>0\" (click)=\"loadMore()\"\n class=\"mat-raised-button\">\n {{ 'GRID.BUTTON_NEXT' | oTranslate }}\n </button>\n <span fxFlex></span>\n <span class=\"o-grid-totals\">{{ 'GRID.TEXT_SHOWN_ITEMS' | oTranslate :{values: [getDataArray().length, totalRecords]}\n }}</span>\n </div>\n\n <mat-paginator class=\"o-mat-paginator\" #paginator *ngIf=\"paginationControls && showFooter\" [length]=\"totalRecords\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"pageSizeOptions\" [pageIndex]=\"currentPage\" [showFirstLastButtons]=\"true\" (page)=\"onChangePage($event)\"\n [ngStyle]=\"{'visibility': (loading | async) === false ? 'visible':'hidden'}\"></mat-paginator>\n\n <div *ngIf=\"loading | async\" fxLayout=\"row\" fxLayoutAlign=\"center end\" class=\"o-loading-blocker\">\n <div fxLayoutAlign=\"center center\" [class.o-spinner-container-controls]=\"hasControls()\" class=\"o-spinner-container\">\n <o-grid-skeleton></o-grid-skeleton>\n </div>\n </div>\n\n\n</div>\n", styles: [".o-grid{height:100%}.o-grid .o-grid-container{position:relative;height:100%;display:flex}.o-grid .o-grid-container .o-grid-toolbar{margin-bottom:12px}.o-grid .o-grid-container .o-grid-toolbar .mat-mdc-form-field-type-mat-select .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex:not(.mdc-text-field--outlined) .mat-mdc-form-field-infix{padding-top:12px}.o-grid .o-grid-container .o-grid-no-results{padding:16px}.o-grid .o-grid-container .o-grid-paginator,.o-grid .o-grid-container .o-grid-sort{margin-right:1em}.o-grid .o-grid-container .o-grid-paginator{display:flex}.o-grid .o-grid-container .o-grid-paginator .o-grid-select-page{width:60px}.o-grid .o-grid-container .o-grid-paginator .o-grid-page-size-label{margin:0 4px 0 8px;align-self:center}.o-grid .o-grid-container .o-grid-footer .o-grid-totals{margin-right:8px;font-size:14px}.o-grid .o-grid-container .o-grid-footer,.o-grid .o-grid-container .o-mat-paginator{flex-shrink:0}.o-grid .o-grid-container .o-loading-blocker{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-grid .o-grid-container .o-loading-blocker .o-spinner-container{width:100%;height:100%}.o-grid .o-grid-container .o-loading-blocker .o-spinner-container.o-spinner-container-controls{height:calc(100% - 64px)}.o-grid.o-grid-fixed,.o-grid.o-grid-fixed .o-grid-container{max-height:100%;height:100%}.o-grid.o-grid-fixed .o-mat-grid-list{overflow:auto;padding-bottom:0!important}.o-grid.o-grid-fixed .o-grid-footer,.o-grid.o-grid-fixed .o-mat-paginator{flex:0 0 auto}.o-grid .o-grid-add-floatable-button{right:12px;position:absolute}.o-grid .o-grid-add-floatable-button.o-grid-add-bottom-floatable-button{bottom:36px}.o-grid .o-grid-add-floatable-button.o-grid-add-top-floatable-button{top:66px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.OSearchInputComponent, selector: "o-search-input", inputs: ["placeholder", "label", "width", "float-label", "appearance", "columns", "filter-case-sensitive", "show-case-sensitive-checkbox", "show-menu"], outputs: ["onSearch"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i3.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i4.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i5.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i6.MatFabButton, selector: "button[mat-fab]", inputs: ["disabled", "disableRipple", "color", "tabIndex", "extended"], exportAs: ["matButton"] }, { kind: "component", type: i7.MatGridList, selector: "mat-grid-list", inputs: ["cols", "gutterSize", "rowHeight"], exportAs: ["matGridList"] }, { kind: "component", type: i7.MatGridTile, selector: "mat-grid-tile", inputs: ["rowspan", "colspan"], exportAs: ["matGridTile"] }, { kind: "component", type: i8.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "component", type: i10.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatPaginator, selector: "mat-paginator", inputs: ["disabled"], exportAs: ["matPaginator"] }, { kind: "component", type: i12.ODataToolbarComponent, selector: "o-data-toolbar", inputs: ["show-title", "title"] }, { kind: "directive", type: i13.OGridItemDirective, selector: "mat-grid-tile[o-grid-item]" }, { kind: "component", type: i14.OGridSkeletonComponent, selector: "o-grid-skeleton" }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i15.OTranslatePipe, name: "oTranslate" }], encapsulation: i0.ViewEncapsulation.None }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OGridComponent.prototype, "fixedHeader", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OGridComponent.prototype, "showPageSize", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OGridComponent.prototype, "showSort", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OGridComponent.prototype, "showFooter", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OGridComponent.prototype, "refreshButton", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OGridComponent.prototype, "insertButton", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OGridComponent.prototype, "insertButtonFloatable", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], OGridComponent.prototype, "showButtonsText", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OGridComponent, decorators: [{ type: Component, args: [{ selector: 'o-grid', providers: [ OntimizeServiceProvider, ComponentStateServiceProvider, { provide: O_COMPONENT_STATE_SERVICE, useClass: OGridComponentStateService }, ], inputs: DEFAULT_INPUTS_O_GRID, encapsulation: ViewEncapsulation.None, host: { '[class.o-grid]': 'true', '[class.o-grid-fixed]': 'fixedHeader' }, template: "<div [style.display]=\"isVisible()? '' : 'none'\" class=\"o-grid-container\" fxLayout=\"column\" fxLayoutAlign=\"start stretch\">\n\n <!--TOOLBAR-->\n <o-data-toolbar *ngIf=\"hasControls()\" class=\"o-grid-toolbar\" [title]=\"title\" [show-title]=\"hasTitle()\">\n <ng-container o-data-toolbar-projection-start>\n <ng-container *ngIf=\"showButtonsText;else showButtonsWithoutText\">\n <!-- button new-->\n <button *ngIf=\"insertButton && !insertButtonFloatable\" type=\"button\" [disabled]=\"!enabledInsertButton\"\n class=\"o-grid-add-button o-grid-button text\" mat-stroked-button aria-label=\"Insert\" (click)=\"add()\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n <span>{{ 'ADD' | oTranslate }}</span>\n </button>\n\n <!--button refresh-->\n <button type=\"button\" mat-stroked-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\" (click)=\"reloadData()\" *ngIf=\"refreshButton\"\n class=\"o-grid-button text\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n <span>{{ 'REFRESH' | oTranslate }}</span>\n </button>\n </ng-container>\n\n <ng-template #showButtonsWithoutText>\n <!-- button new-->\n <button *ngIf=\"insertButton && !insertButtonFloatable\" [disabled]=\"!enabledInsertButton\" type=\"button\"\n class=\"o-grid-button o-grid-add-button no-text\" mat-icon-button aria-label=\"Insert\" (click)=\"add()\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n\n <!--button refresh-->\n <button type=\"button\" mat-icon-button aria-label=\"Refresh\" [disabled]=\"!enabledRefreshButton\" (click)=\"reloadData()\" *ngIf=\"refreshButton\"\n class=\"o-grid-button no-text\">\n <mat-icon svgIcon=\"ontimize:autorenew\"></mat-icon>\n </button>\n </ng-template>\n\n <!--O-GRID-PAGINATOR-->\n <div class=\"o-grid-paginator\" *ngIf=\"showPageSize\">\n <div class=\"o-grid-page-size-label\">{{ 'GRID.ITEMS_PER_PAGE' | oTranslate }}:</div>\n <mat-form-field class=\"o-grid-select-page\">\n <mat-select placeholder=\"\" #pageSizeSelect [(value)]=\"queryRows\" (selectionChange)=\"pageSizeChanged()\">\n <mat-option *ngFor=\"let page of pageSizeOptions\" [value]=\"page\">\n {{ page }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <!--O-GRID-SORT-->\n <div class=\"o-grid-sort\" *ngIf=\"showSort && sortableColumns.length > 0\">\n <mat-form-field class=\"o-grid-select-sort\">\n <mat-icon matPrefix>sort</mat-icon>\n <mat-select #sortSelect [value]=\"currentOrderColumn\" (selectionChange)=\"sortColumnChanged($event)\"\n placeholder=\" {{ 'GRID.SORT_BY' | oTranslate }}\">\n <mat-option *ngFor=\"let column of sortableColumns; let i = index\" [value]=\"i\">\n {{ getSortOptionText(column) }}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n </ng-container>\n <ng-content select=\"[o-grid-toolbar][position=start]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-content select=\"[o-grid-toolbar][position=end]\" ngProjectAs=\"[o-data-toolbar-custom-projection-end]\">\n </ng-content>\n <ng-content select=\"[o-grid-toolbar]\" ngProjectAs=\"[o-data-toolbar-custom-projection-start]\">\n </ng-content>\n <ng-container o-data-toolbar-projection-end>\n <o-search-input *ngIf=\"quickFilter\" [columns]=\"quickFilterColumns\" [filter-case-sensitive]=\"filterCaseSensitive\"\n [show-case-sensitive-checkbox]=\"showCaseSensitiveCheckbox()\" [placeholder]=\"quickFilterPlaceholder\" [appearance]=\"quickFilterAppearance\"\n float-label=\"never\"></o-search-input>\n </ng-container>\n </o-data-toolbar>\n\n <!--no results-->\n <div class=\"o-grid-no-results fill-remaining\" *ngIf=\"gridItems.length === 0\" fxLayoutAlign=\"center start\" layout-padding\n [ngStyle]=\"{'visibility': (loading | async) === false ? 'visible':'hidden'}\">\n {{'GRID.EMPTY' | oTranslate}}\n <ng-container *ngIf=\"quickFilter && searchInputComponent && searchInputComponent.getValue() && searchInputComponent.getValue().length > 0\">\n {{ 'GRID.EMPTY_USING_FILTER' | oTranslate : { values: [ searchInputComponent.getValue()] } }}\n </ng-container>\n </div>\n\n\n <!--MAT-GRID-LIST-->\n <mat-grid-list [cols]=\"cols\" [gutterSize]=\"gutterSize\" [rowHeight]=\"gridItemHeight\" class=\"o-mat-grid-list fill-remaining\"\n *ngIf=\"gridItems.length > 0\" [ngStyle]=\"{'visibility': (loading | async) === false ? 'visible':'hidden'}\">\n <mat-grid-tile o-grid-item *ngFor=\"let item of gridItems\" [colspan]=\"item.colspan\" [rowspan]=\"item.rowspan\">\n <ng-container *ngTemplateOutlet=\"item.template\"></ng-container>\n </mat-grid-tile>\n </mat-grid-list>\n <button type=\"button\" aria-label=\"Insert\" *ngIf=\"insertButton && insertButtonFloatable\" [disabled]=\"!enabledInsertButton\" mat-fab (click)=\"add()\"\n class=\"o-grid-add-floatable-button\" [class.o-grid-add-bottom-floatable-button]=\"insertButtonPosition ==='bottom'\"\n [class.o-grid-add-top-floatable-button]=\"insertButtonPosition ==='top'\">\n <mat-icon svgIcon=\"ontimize:add\"></mat-icon>\n </button>\n\n <!-- GRID FOOTER -->\n <div *ngIf=\"!paginationControls && showFooter && (loading | async)===false\" fxLayout=\"row\" fxLayoutAlign=\"center center\" class=\"o-grid-footer\">\n <button type=\"button\" mat-button *ngIf=\"getDataArray().length < totalRecords && getDataArray().length>0\" (click)=\"loadMore()\"\n class=\"mat-raised-button\">\n {{ 'GRID.BUTTON_NEXT' | oTranslate }}\n </button>\n <span fxFlex></span>\n <span class=\"o-grid-totals\">{{ 'GRID.TEXT_SHOWN_ITEMS' | oTranslate :{values: [getDataArray().length, totalRecords]}\n }}</span>\n </div>\n\n <mat-paginator class=\"o-mat-paginator\" #paginator *ngIf=\"paginationControls && showFooter\" [length]=\"totalRecords\" [pageSize]=\"queryRows\"\n [pageSizeOptions]=\"pageSizeOptions\" [pageIndex]=\"currentPage\" [showFirstLastButtons]=\"true\" (page)=\"onChangePage($event)\"\n [ngStyle]=\"{'visibility': (loading | async) === false ? 'visible':'hidden'}\"></mat-paginator>\n\n <div *ngIf=\"loading | async\" fxLayout=\"row\" fxLayoutAlign=\"center end\" class=\"o-loading-blocker\">\n <div fxLayoutAlign=\"center center\" [class.o-spinner-container-controls]=\"hasControls()\" class=\"o-spinner-container\">\n <o-grid-skeleton></o-grid-skeleton>\n </div>\n </div>\n\n\n</div>\n", styles: [".o-grid{height:100%}.o-grid .o-grid-container{position:relative;height:100%;display:flex}.o-grid .o-grid-container .o-grid-toolbar{margin-bottom:12px}.o-grid .o-grid-container .o-grid-toolbar .mat-mdc-form-field-type-mat-select .mat-mdc-text-field-wrapper .mat-mdc-form-field-flex:not(.mdc-text-field--outlined) .mat-mdc-form-field-infix{padding-top:12px}.o-grid .o-grid-container .o-grid-no-results{padding:16px}.o-grid .o-grid-container .o-grid-paginator,.o-grid .o-grid-container .o-grid-sort{margin-right:1em}.o-grid .o-grid-container .o-grid-paginator{display:flex}.o-grid .o-grid-container .o-grid-paginator .o-grid-select-page{width:60px}.o-grid .o-grid-container .o-grid-paginator .o-grid-page-size-label{margin:0 4px 0 8px;align-self:center}.o-grid .o-grid-container .o-grid-footer .o-grid-totals{margin-right:8px;font-size:14px}.o-grid .o-grid-container .o-grid-footer,.o-grid .o-grid-container .o-mat-paginator{flex-shrink:0}.o-grid .o-grid-container .o-loading-blocker{position:absolute;top:0;left:0;right:0;bottom:0;z-index:500;visibility:visible;opacity:1;transition:opacity .25s linear}.o-grid .o-grid-container .o-loading-blocker .o-spinner-container{width:100%;height:100%}.o-grid .o-grid-container .o-loading-blocker .o-spinner-container.o-spinner-container-controls{height:calc(100% - 64px)}.o-grid.o-grid-fixed,.o-grid.o-grid-fixed .o-grid-container{max-height:100%;height:100%}.o-grid.o-grid-fixed .o-mat-grid-list{overflow:auto;padding-bottom:0!important}.o-grid.o-grid-fixed .o-grid-footer,.o-grid.o-grid-fixed .o-mat-paginator{flex:0 0 auto}.o-grid .o-grid-add-floatable-button{right:12px;position:absolute}.o-grid .o-grid-add-floatable-button.o-grid-add-bottom-floatable-button{bottom:36px}.o-grid .o-grid-add-floatable-button.o-grid-add-top-floatable-button{top:66px}\n"] }] }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i16.OFormComponent, decorators: [{ type: Optional }, { type: Inject, args: [forwardRef(() => OFormComponent)] }] }]; }, propDecorators: { fixedHeader: [], showPageSize: [], showSort: [], showFooter: [], refreshButton: [], insertButton: [], insertButtonFloatable: [], showButtonsText: [], inputGridItems: [{ type: ContentChildren, args: [forwardRef(() => OGridItemComponent)] }], gridItemDirectives: [{ type: ViewChildren, args: [OGridItemDirective] }], matpaginator: [{ type: ViewChild, args: [MatPaginator] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1ncmlkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2dyaWQvby1ncmlkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL2dyaWQvby1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBSVIsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQWUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFcEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFekUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLHVCQUF1QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFbEcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0scURBQXFELENBQUM7QUFLakcsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV2RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRW5FLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHO0lBRW5DLE1BQU07SUFFTiw4QkFBOEI7SUFFOUIscUJBQXFCO0lBRXJCLG1DQUFtQztJQUVuQyx5QkFBeUI7SUFFekIsMENBQTBDO0lBRTFDLGtDQUFrQztJQUVsQywrQkFBK0I7SUFFL0Isd0JBQXdCO0lBRXhCLDBCQUEwQjtJQUUxQix3QkFBd0I7SUFFeEIsNkNBQTZDO0lBRTdDLCtDQUErQztJQUUvQyxvQ0FBb0M7Q0FDckMsQ0FBQztBQUdGLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFrQjlDLE1BQU0sT0FBTyxjQUFlLFNBQVEseUJBQXFEO0lBbUN2RixJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztJQUN6QyxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsS0FBYTtRQUNwQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFDRCxJQUFJLGVBQWUsQ0FBQyxHQUFHO1FBQ3JCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN0QixNQUFNLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztJQUNqQyxDQUFDO0lBdUJELElBQUksU0FBUyxDQUFDLEtBQWtCO1FBQzlCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQVlELFlBQ0UsUUFBa0IsRUFDbEIsS0FBaUIsRUFDcUMsSUFBb0I7UUFFMUUsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUE5RnJCLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFHbkIsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFHN0IsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFHOUIsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUcxQixlQUFVLEdBQVksSUFBSSxDQUFDO1FBRTNCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBR3ZCLGtCQUFhLEdBQVksSUFBSSxDQUFDO1FBR3JDLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBR3ZCLDBCQUFxQixHQUFZLElBQUksQ0FBQztRQUc3QyxvQkFBZSxHQUFZLEtBQUssQ0FBQztRQUUxQix5QkFBb0IsR0FBcUIsUUFBUSxDQUFDO1FBQ3pELHVCQUFrQixHQUFHLEtBQUssQ0FBQztRQUNwQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLDJCQUFzQixHQUEyQixTQUFTLENBQUM7UUE4QjNELHFCQUFnQixHQUFlLEVBQUUsQ0FBQztRQUtsQyxpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUMzQixxQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQztRQUU5Qix5QkFBb0IsR0FBWSxLQUFLLENBQUM7UUFVbkMsZUFBVSxHQUFnQixFQUFFLENBQUM7UUFFN0IsaUJBQVksR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQWN4RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDO0lBQzFDLENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pGLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBSU0sVUFBVTtRQUNmLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVuQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUN4QztRQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUxRSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0RixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsRUFBRTtZQUNuQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQztTQUMzQztRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRU0sZUFBZTtRQUNwQixLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUMzQixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztRQUNqQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUU7WUFDekUsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU0sdUJBQXVCO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBcUIsRUFBRSxFQUFFO1lBQ2xGLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsUUFBUSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO29CQUN6QixLQUFLLElBQUksQ0FBQztvQkFDVixLQUFLLElBQUk7d0JBQ1AsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7d0JBQ3RCLE1BQU07b0JBQ1IsS0FBSyxJQUFJO3dCQUNQLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO3dCQUN0QixNQUFNO29CQUNSLEtBQUssSUFBSSxDQUFDO29CQUNWLEtBQUssSUFBSTt3QkFDUCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztpQkFDekI7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU0sVUFBVTtRQUNmLElBQUksU0FBUyxHQUFtQixFQUFFLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQ2pDLFNBQVMsR0FBRztnQkFDVixNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7Z0JBQy9ELE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sNEJBQTRCO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFUyxzQkFBc0IsQ0FBQyxTQUFnQjtRQUMvQyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztTQUNqRjtRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxJQUF3QjtRQUN2RCxJQUFJLElBQUksRUFBRTtZQUNSLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7Z0JBQy9DLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQzthQUM1RDtZQUNELElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3JFO1NBQ0Y7SUFDSCxDQUFDO0lBRU0saUJBQWlCLENBQUMsSUFBd0I7UUFDL0MsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRU0sb0JBQW9CLENBQUMsSUFBd0I7UUFDbEQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU0sT0FBTztRQUNaLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE1BQU0sU0FBUyxHQUFtQjtnQkFDaEMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCO2dCQUNwQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDdkIsQ0FBQztZQUNGLElBQUksQ0FBQyxXQUFXLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxvQkFBb0IsRUFBRSxDQUFDLFVBQVUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDbkM7YUFBTTtZQUNMLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBR00saUJBQWlCLENBQUMsTUFBYyxFQUFFLFFBQXlCO1FBQ2hFLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFakUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3BELGNBQWMsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUMxRTtRQUNELE9BQU8sY0FBYyxDQUFDO0lBQ3hCLENBQUM7SUFFTSxlQUFlO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6RSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6QyxJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQztTQUMvQjtJQUNILENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixPQUFPLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVELElBQUksa0JBQWtCLENBQUMsR0FBVztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVTLHVCQUF1QixDQUFDLGNBQXdCO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ25DLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlO2FBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQ