UNPKG

ontimize-web-ngx

Version:
895 lines 129 kB
import { __decorate, __metadata } from "tslib"; import { SelectionModel } from '@angular/cdk/collections'; import { Directive, ElementRef, EventEmitter, forwardRef, Injector, NgZone, ViewChild } from '@angular/core'; import { MatPaginator } from '@angular/material/paginator'; import { BehaviorSubject } from 'rxjs'; import { OSearchInputComponent } from '../components/input/search-input/o-search-input.component'; import { BooleanConverter, BooleanInputConverter } from '../decorators/input-converter'; import { OFormLayoutDialogComponent } from '../layouts/form-layout/dialog/o-form-layout-dialog.component'; import { OFormLayoutManagerComponent } from '../layouts/form-layout/o-form-layout-manager.component'; import { NavigationService } from '../services/navigation.service'; import { PermissionsService } from '../services/permissions/permissions.service'; import { OTranslateService } from '../services/translate/o-translate.service'; import { O_GLOBAL_CONFIG } from '../types/o-global-config.type'; import { ObservableWrapper } from '../util/async'; import { Codes } from '../util/codes'; import { FilterExpressionUtils } from '../util/filter-expression.utils'; import { PermissionsUtils } from '../util/permissions'; import { Util } from '../util/util'; import { OFormComponent } from './form/o-form.component'; import { AbstractOServiceBaseComponent, DEFAULT_INPUTS_O_SERVICE_BASE_COMPONENT } from './o-service-base-component.class'; import { OFormLayoutManagerService } from '../services/o-form-layout-manager.service'; import * as i0 from "@angular/core"; import * as i1 from "./form/o-form.component"; export const DEFAULT_INPUTS_O_SERVICE_COMPONENT = [ ...DEFAULT_INPUTS_O_SERVICE_BASE_COMPONENT, '_title: title', 'ovisible: visible', 'oenabled: enabled', 'controls', 'detailMode: detail-mode', 'detailFormRoute: detail-form-route', 'recursiveDetail: recursive-detail', 'detailButtonInRow: detail-button-in-row', 'detailButtonInRowIcon: detail-button-in-row-icon', 'editFormRoute: edit-form-route', 'recursiveEdit: recursive-edit', 'editButtonInRow: edit-button-in-row', 'editButtonInRowIcon: edit-button-in-row-icon', 'insertButton: insert-button', 'rowHeight : row-height', 'insertFormRoute: insert-form-route', 'recursiveInsert: recursive-insert', 'filterCaseSensitive: filter-case-sensitive', 'quickFilter: quick-filter', 'quickFilterPlaceholder: quick-filter-placeholder', 'paginationControls: pagination-controls', 'pageSizeOptions: page-size-options', 'quickFilterAppearance:quick-filter-appearance', 'disablePageSizeCalculation: disable-page-size-calculation', 'initialFilterFunction: initial-filter-function', 'filterBuilderFunction: filter-builder-function' ]; export const DEFAULT_OUTPUTS_O_SERVICE_COMPONENT = [ 'onClick', 'onDoubleClick', 'onDataLoaded', 'onPaginatedDataLoaded', 'onSearch' ]; export class AbstractOServiceComponent extends AbstractOServiceBaseComponent { set title(val) { this._title = val; } get title() { if (Util.isDefined(this._title)) { return this.translateService.get(this._title); } return this._title; } get pageSizeOptions() { return this._pageSizeOptions; } set pageSizeOptions(val) { if (!(val instanceof Array)) { val = Util.parseArray(String(val)).map(a => parseInt(a, 10)); } this._pageSizeOptions = val; } set rowHeight(value) { this._rowHeight = value ? value.toLowerCase() : value; if (!Codes.isValidRowHeight(this._rowHeight)) { this._rowHeight = Codes.DEFAULT_ROW_HEIGHT; } this.rowHeightSubject.next(this._rowHeight); } get rowHeight() { return this._rowHeight; } set filterCaseSensitive(value) { this._filterCaseSensitive = BooleanConverter(value); } get filterCaseSensitive() { return this._filterCaseSensitive; } get quickFilter() { return this._quickFilter; } set quickFilter(val) { val = Util.parseBoolean(String(val)); this._quickFilter = val; if (val) { setTimeout(() => this.registerQuickFilter(this.searchInputComponent), 0); } } get selection() { if (!Util.isDefined(this._selection)) { this._selection = new SelectionModel(true, [], true, this.compareRow()); } return this._selection; } constructor(injector, elRef, form) { super(injector); this.elRef = elRef; this.form = form; this.ovisible = true; this.oenabled = true; this.controls = true; this.detailMode = Codes.DETAIL_MODE_CLICK; this.recursiveDetail = false; this.detailButtonInRow = false; this.detailButtonInRowIcon = Codes.DETAIL_ICON; this.recursiveEdit = false; this.editButtonInRow = false; this.editButtonInRowIcon = Codes.EDIT_ICON; this.paginationControls = true; this.disablePageSizeCalculation = false; this._rowHeight = Codes.DEFAULT_ROW_HEIGHT; this.rowHeightSubject = new BehaviorSubject(this._rowHeight); this.rowHeightObservable = this.rowHeightSubject.asObservable(); this.checkViewPortSubject = new BehaviorSubject(false); this.checkViewPortObservable = this.checkViewPortSubject.asObservable(); this.recursiveInsert = false; this._filterCaseSensitive = false; this._quickFilter = true; this.quickFilterPlaceholder = ''; this.onClick = new EventEmitter(); this.onDoubleClick = new EventEmitter(); this.onDataLoaded = new EventEmitter(); this.onPaginatedDataLoaded = new EventEmitter(); this.onSearch = new EventEmitter(); this.dataResponseArray = []; this._pageSizeOptions = Codes.PAGE_SIZE_OPTIONS; this.clickDelay = 200; this.clickPrevent = false; this._quickFilterAppearance = 'outline'; this.mutationObservers = []; this.enabledInsertButton = true; this.enabledRefreshButton = true; this._currentPage = 0; this.permissionsService = this.injector.get(PermissionsService); this.translateService = this.injector.get(OTranslateService); this.navigationService = this.injector.get(NavigationService); try { this.formLayoutManager = this.injector.get(OFormLayoutManagerComponent); } catch (e) { } try { this.oFormLayoutDialog = this.injector.get(OFormLayoutDialogComponent); this.formLayoutManager = this.oFormLayoutDialog.formLayoutManager; } catch (e) { } this.getGlobalInjectionTokenConfig(); } getGlobalInjectionTokenConfig() { try { const oGlobalConfig = this.injector.get(O_GLOBAL_CONFIG); if (Util.isDefined(oGlobalConfig.storeState)) { this.storeState = oGlobalConfig.storeState; } ; } catch (error) { } } initialize() { super.initialize(); if (this.detailButtonInRow || this.editButtonInRow) { this.detailMode = Codes.DETAIL_MODE_NONE; } } afterViewInit() { this.registerFormLayoutManagerState(); super.afterViewInit(); if (this.elRef) { this.elRef.nativeElement.removeAttribute('title'); } if (this.formLayoutManager && this.formLayoutManager.isMainComponent(this)) { this.onTriggerUpdateSubscription = this.formLayoutManager.onTriggerUpdate.subscribe(() => { this.reloadData(); }); } } destroy() { super.destroy(); if (this.onTriggerUpdateSubscription) { this.onTriggerUpdateSubscription.unsubscribe(); } if (this.tabsSubscriptions) { this.tabsSubscriptions.unsubscribe(); } if (this.quickFilterSubscription) { this.quickFilterSubscription.unsubscribe(); } } isVisible() { return this.ovisible; } hasControls() { return this.controls; } hasTitle() { return this.title !== undefined; } getSelectedItems() { return this.selection.selected; } clearSelection() { this.selection.clear(); } setSelected(item) { if (Util.isDefined(item)) { this.selection.toggle(item); } } async navigateToDetail(route, qParams, relativeTo) { const extras = { relativeTo: relativeTo }; let isFormLayoutActive = false; if (this.formLayoutManager && this.formLayoutManager.isMainComponent(this)) { qParams[Codes.IGNORE_CAN_DEACTIVATE] = this.formLayoutManager.ignoreCanDeactivate; isFormLayoutActive = true; this.formLayoutManager.setAsActiveFormLayoutManager(); } extras[Codes.QUERY_PARAMS] = qParams; this.router.navigate(route, extras). then(() => { if (!isFormLayoutActive) { this.navigationService.isNavigating = false; } }) .catch((e) => { console.error('Cannot match any routes. URL Segment: ', route, e); this.navigationService.isNavigating = false; }); } insertDetail() { if (this.oFormLayoutDialog) { console.warn('Navigation is not available yet in a form layout manager with mode="dialog"'); return; } const route = this.getInsertRoute(); this.addFormLayoutManagerRoute(route); if (route.length > 0) { const relativeTo = this.recursiveInsert ? this.actRoute.parent : this.actRoute; const qParams = {}; if (this.formLayoutManager && this.formLayoutManager.isTabMode()) { qParams[Codes.INSERTION_MODE] = 'true'; } this.navigateToDetail(route, qParams, relativeTo); } } viewDetail(item, context) { const formLayoutManagerService = this.injector.get(OFormLayoutManagerService); formLayoutManagerService.context = void 0; if (this.oFormLayoutDialog) { console.warn('Navigation is not available yet in a form layout manager with mode="dialog"'); if (this.formLayoutManager.navigationService) { this.formLayoutManager.navigationService.isNavigating = false; } return; } const zone = this.injector.get(NgZone); zone.run(async () => { const route = this.getItemModeRoute(item, 'detailFormRoute'); this.addFormLayoutManagerRoute(route); if (route.length > 0) { const qParams = Codes.getIsDetailObject(); const relativeTo = this.recursiveDetail ? this.actRoute.parent : this.actRoute; if (!this.formLayoutManager?.isSplitPaneMode()) { formLayoutManagerService.context = context; } await this.navigateToDetail(route, qParams, relativeTo); } }); } editDetail(item) { if (this.oFormLayoutDialog) { console.warn('Navigation is not available yet in a form layout manager with mode="dialog"'); return; } const zone = this.injector.get(NgZone); zone.run(async () => { const route = this.getItemModeRoute(item, 'editFormRoute'); this.addFormLayoutManagerRoute(route); if (route.length > 0) { const qParams = Codes.getIsDetailObject(); const relativeTo = this.recursiveEdit ? this.actRoute.parent : this.actRoute; await this.navigateToDetail(route, qParams, relativeTo); } }); } addFormLayoutManagerRoute(routeArr) { if (this.formLayoutManager && routeArr.length > 0) { const compRoute = this.formLayoutManager.getRouteForComponent(this); if (compRoute && compRoute.length > 0) { routeArr.unshift(...compRoute); } } return routeArr; } setButtonPermissions(actionsPermissions) { if (Util.isDefined(actionsPermissions)) { this.setPermission('insert', 'insertButton', 'enabledInsertButton', actionsPermissions); this.setPermission('refresh', 'refreshButton', 'enabledRefreshButton', actionsPermissions); this.setPermission('delete', 'deleteButton', 'enabledDeleteButton', actionsPermissions); } } setPermission(attr, visibleProp, enabledProp, actionsPermissions) { const perm = this.getPermissionByAttr(attr, actionsPermissions); if (Util.isDefined(perm)) { this[visibleProp] = perm.visible; this[enabledProp] = perm.enabled; } } manageCustomPermissions(actionsPermissions, selector) { const customPermissions = actionsPermissions.filter(perm => !['insert', 'refresh', 'delete'].includes(perm.attr)); customPermissions.forEach(permission => { this.managePermission(this.elRef, permission, this.mutationObservers, selector); }); } getActionsPermissions(permissions) { return Util.isDefined(permissions) ? (permissions.actions || []) : []; } getPermissionByAttr(attr, actionsPermissions) { return actionsPermissions.find((perm) => perm.attr === attr); } managePermission(elementRef, permission, mutationObservers, selector, attr) { let elementByAction; const attrAction = Util.isDefined(attr) ? attr : permission.attr; const allElements = elementRef.nativeElement.querySelectorAll(selector); allElements.forEach(element => { if (element.getAttribute('attr') === attrAction) { elementByAction = element; } }); if (Util.isDefined(elementByAction)) { if (!permission.visible) { elementByAction.remove(); } else if (!permission.enabled) { elementByAction.disabled = true; const mutationObserver = PermissionsUtils.registerDisabledChangesInDom(elementByAction); mutationObservers.push(mutationObserver); } } } getEncodedParentKeys() { let encoded; if (Object.keys(this._pKeysEquiv).length > 0) { const pKeys = this.getParentKeysValues(); if (Object.keys(pKeys).length > 0) { encoded = Util.encodeParentKeys(pKeys); } } return encoded; } getInsertRoute() { const route = []; if (Util.isDefined(this.detailFormRoute)) { route.push(this.detailFormRoute); } const insertRoute = Util.isDefined(this.insertFormRoute) ? this.insertFormRoute : Codes.DEFAULT_INSERT_ROUTE; route.push(insertRoute); const encodedParentKeys = this.getEncodedParentKeys(); if (Util.isDefined(encodedParentKeys)) { const routeObj = {}; routeObj[Codes.PARENT_KEYS_KEY] = encodedParentKeys; route.push(routeObj); } if (route.length > 0) { this.storeNavigationFormRoutes('insertFormRoute'); } return route; } getItemModeRoute(item, modeRoute) { const result = this.getRouteOfSelectedRow(item); if (result.length > 0) { if (Util.isDefined(this.detailFormRoute)) { result.unshift(this.detailFormRoute); } if (modeRoute === 'editFormRoute') { result.push(this.editFormRoute || Codes.DEFAULT_EDIT_ROUTE); } } if (result.length > 0 && !this.oFormLayoutDialog) { this.storeNavigationFormRoutes(modeRoute, this.getQueryConfiguration()); } return result; } getQueryConfiguration() { let result = { keysValues: this.getKeysValues() }; if (this.pageable) { result = Object.assign({ serviceType: this.serviceType, queryArguments: this.queryArguments, entity: this.entity, service: this.service, queryMethod: this.pageable ? this.paginatedQueryMethod : this.queryMethod, totalRecordsNumber: this.getTotalRecordsNumber(), queryRows: this.queryRows, queryRecordOffset: Math.max(this.currentPage * this.queryRows, this.state.queryRecordOffset - this.queryRows) }, result); } return result; } getRouteOfSelectedRow(item) { const route = []; if (Util.isObject(item)) { this.keysArray.forEach(key => { if (Util.isDefined(item[key])) { route.push(item[key]); } }); } return route; } deleteLocalItems() { const selectedItems = this.getSelectedItems(); for (let i = 0; i < selectedItems.length; ++i) { const selectedItem = selectedItems[i]; const selectedItemKv = {}; for (let k = 0; k < this.keysArray.length; ++k) { const key = this.keysArray[k]; selectedItemKv[key] = selectedItem[key]; } for (let j = this.dataArray.length - 1; j >= 0; --j) { const item = this.dataArray[j]; const itemKv = {}; for (let k = 0; k < this.keysArray.length; ++k) { const key = this.keysArray[k]; itemKv[key] = item[key]; } let found = false; for (const k in selectedItemKv) { if (selectedItemKv.hasOwnProperty(k)) { found = itemKv.hasOwnProperty(k) && (selectedItemKv[k] === itemKv[k]); } } if (found) { this.dataArray.splice(j, 1); break; } } } this.clearSelection(); } reinitialize(options) { if (options && Object.keys(options).length) { const clonedOpts = Object.assign({}, options); if (clonedOpts.hasOwnProperty('entity')) { this.entity = clonedOpts.entity; if (this.oattrFromEntity) { this.oattr = undefined; } delete clonedOpts.entity; } for (const prop in clonedOpts) { if (clonedOpts.hasOwnProperty(prop)) { this[prop] = clonedOpts[prop]; } } this.destroy(); this.initialize(); } } setFilterBuilder(filterBuilder) { this.filterBuilder = filterBuilder; } getComponentFilter(existingFilter = {}) { let filter = super.getComponentFilter(existingFilter); const quickFilterExpr = this.getQuickFilterExpression(); const filterBuilderExpr = this.getFilterBuilderExpression(); const initialFilterExpr = this.initialFilterFunction ? this.initialFilterFunction() : undefined; let complexExpr = quickFilterExpr || filterBuilderExpr; if (quickFilterExpr && filterBuilderExpr) { complexExpr = FilterExpressionUtils.buildComplexExpression(quickFilterExpr, filterBuilderExpr, FilterExpressionUtils.OP_AND); } if (initialFilterExpr) { if (FilterExpressionUtils.instanceofExpression(initialFilterExpr)) { complexExpr = complexExpr ? FilterExpressionUtils.buildComplexExpression(complexExpr, initialFilterExpr, FilterExpressionUtils.OP_AND) : initialFilterExpr; } else { filter = { ...filter, ...initialFilterExpr }; } } if (complexExpr && !Util.isDefined(filter[FilterExpressionUtils.BASIC_EXPRESSION_KEY])) { filter[FilterExpressionUtils.BASIC_EXPRESSION_KEY] = complexExpr; } else if (complexExpr) { filter[FilterExpressionUtils.BASIC_EXPRESSION_KEY] = FilterExpressionUtils.buildComplexExpression(filter[FilterExpressionUtils.BASIC_EXPRESSION_KEY], complexExpr, FilterExpressionUtils.OP_AND); } return filter; } getQuickFilterExpression() { if (this.pageable && Util.isDefined(this.quickFilterComponent)) { return this.quickFilterComponent.filterExpression; } return undefined; } getFilterBuilderExpression() { this.filterBuilder = this.filterBuilderFunction ? this.filterBuilderFunction() : this.filterBuilder; if (Util.isDefined(this.filterBuilder)) { return this.filterBuilder.getExpression(); } return undefined; } storeNavigationFormRoutes(activeMode, queryConf) { const mainFormLayoutComp = this.formLayoutManager ? Util.isDefined(this.formLayoutManager.isMainComponent(this)) : undefined; this.navigationService.storeFormRoutes({ mainFormLayoutManagerComponent: mainFormLayoutComp, isMainNavigationComponent: true, detailFormRoute: this.detailFormRoute, editFormRoute: this.editFormRoute, insertFormRoute: Util.isDefined(this.insertFormRoute) ? this.insertFormRoute : Codes.DEFAULT_INSERT_ROUTE }, activeMode, queryConf); } saveDataNavigationInLocalStorage() { } getKeysValues() { const data = this.dataArray; const self = this; return data.map((row) => { const obj = {}; self.keysArray.forEach((key) => { if (row[key] !== undefined) { obj[key] = row[key]; } }); return obj; }); } getRouteKey() { let route = ''; if (this.formLayoutManager && !this.formLayoutManager.isMainComponent(this)) { route = this.router.url; const params = this.formLayoutManager.getParams(); if (params) { route += '/' + (Object.keys(params).join('/')); } } else { route = super.getRouteKey(); } return route; } get elementRef() { return this.elRef; } showCaseSensitiveCheckbox() { return !this.pageable; } registerQuickFilter(arg) { const quickFilter = arg; if (Util.isDefined(this.quickFilterComponent)) { return; } this.quickFilterComponent = quickFilter; if (Util.isDefined(this.quickFilterComponent)) { this.quickFilterSubscription = this.quickFilterComponent.onSearch.subscribe(val => { this.onSearch.emit(val); this.filterData(val); }); if (Util.isDefined(this.state)) { if ((this.state.quickFilterValue || '').length > 0) { this.quickFilterComponent.setValue(this.state.quickFilterValue, { emitEvent: true }); } } } } isFilterCaseSensitive() { const useQuickFilterValue = Util.isDefined(this.quickFilterComponent) && this.showCaseSensitiveCheckbox(); if (useQuickFilterValue) { return this.quickFilterComponent.filterCaseSensitive; } return this.filterCaseSensitive; } configureFilterValue(value) { let returnVal = value; if (value && value.length > 0) { if (!value.startsWith('*')) { returnVal = '*' + returnVal; } if (!value.endsWith('*')) { returnVal = returnVal + '*'; } } return returnVal; } getQuickFilterValue() { const result = ''; if (Util.isDefined(this.quickFilterComponent)) { return this.quickFilterComponent.getValue() || ''; } return result; } getQuickFilterColumns() { let result = this.quickFilterColArray; if (Util.isDefined(this.quickFilterComponent)) { result = this.quickFilterComponent.getActiveColumns(); } return result; } filterData(value, loadMore) { value = Util.isDefined(value) ? value : Util.isDefined(this.quickFilterComponent) ? this.quickFilterComponent.getValue() : void 0; if (Util.isDefined(this.state) && Util.isDefined(value)) { this.state.quickFilterValue = value; } if (this.pageable) { const queryArgs = { offset: 0, length: this.queryRows, replace: true }; this.queryData(void 0, queryArgs); return; } if (this.dataResponseArray && this.dataResponseArray.length > 0) { let filteredData = this.dataResponseArray.slice(0); filteredData = this.getQuickFilterDataFromArray(value, filteredData); filteredData = this.getSortedDataFromArray(filteredData); filteredData = this.getPaginationDataFromArray(filteredData); this.setDataArray(filteredData); } else { this.setDataArray(this.dataResponseArray); } } getQuickFilterDataFromArray(quickfilter, dataArray) { let result = dataArray; if (quickfilter && quickfilter.length > 0) { const caseSensitive = this.isFilterCaseSensitive(); const quickFilterColumns = this.getQuickFilterColumns(); const regExpStr = new RegExp(Util.escapeSpecialCharacter(Util.normalizeString(quickfilter, !caseSensitive))); result = dataArray.filter(item => { return quickFilterColumns.some(col => regExpStr.test(Util.normalizeString(item[col] + '', !caseSensitive))); }); } return result; } getSortedDataFromArray(dataArray) { return dataArray; } setData(data, sqlTypes, replace) { if (!Util.isArray(data)) { this.setDataArray([]); } else { this.dataResponseArray = this.parseResponseArray(data, replace); if (this.pageable) { this.setDataArray(this.dataResponseArray); } else { this.filterData(); } } if (this.pageable) { ObservableWrapper.callEmit(this.onPaginatedDataLoaded, data); } ObservableWrapper.callEmit(this.onDataLoaded, this.dataResponseArray); } parseResponseArray(data, replace) { return data; } registerFormLayoutManagerState() { if (this.storeState && this.formLayoutManager && this.formLayoutManager.isTabMode() && this.formLayoutManager.oTabGroup) { if (!Util.isDefined(this.formLayoutManagerTabIndex)) { this.formLayoutManagerTabIndex = this.formLayoutManager.oTabGroup.data.length; } const updateComponentStateSubject = this.formLayoutManager.oTabGroup.updateTabComponentsState; this.tabsSubscriptions = this.formLayoutManager.onSelectedTabChange.subscribe((arg) => { if (this.formLayoutManagerTabIndex === arg.previousIndex) { this.updateStateStorage(); this.alreadyStored = false; if (arg.index !== 0) { updateComponentStateSubject.next(arg); } } if (this.formLayoutManager.navigationService.isNavigating) { arg.data.rendererSubject.next(true); } this.checkViewPortSubject.next(true); }); this.tabsSubscriptions.add(updateComponentStateSubject.subscribe((arg) => { if (this.formLayoutManagerTabIndex === arg.index) { this.componentStateService.initialize(this); this.applyDefaultConfiguration(); } })); this.tabsSubscriptions.add(this.formLayoutManager.onCloseTab.subscribe((arg) => { if (this.formLayoutManagerTabIndex === arg.index) { this.updateStateStorage(); } })); } } applyDefaultConfiguration() { } onChangePage(e) { this.dataService?.setPaginationContext({ pageNumber: e.pageIndex, pageSize: e.pageSize }); if (!this.pageable) { this.currentPage = e.pageIndex; this.queryRows = e.pageSize; this.filterData(); return; } const goingBack = e.pageIndex < this.currentPage; this.currentPage = e.pageIndex; const pageSize = e.pageSize; const oldQueryRows = this.queryRows; const changingPageSize = (oldQueryRows !== pageSize); this.queryRows = pageSize; let newStartRecord; let queryLength; if (goingBack || changingPageSize) { newStartRecord = (this.currentPage * this.queryRows); queryLength = this.queryRows; } else { newStartRecord = Math.max(this.state.queryRecordOffset, (this.currentPage * this.queryRows)); const newEndRecord = Math.min(newStartRecord + this.queryRows, this.state.totalQueryRecordsNumber); queryLength = this.disablePageSizeCalculation ? this.queryRows : Math.min(this.queryRows, newEndRecord - newStartRecord); } const queryArgs = { offset: newStartRecord, length: queryLength, replace: true }; this.queryData(void 0, queryArgs); } set currentPage(val) { this._currentPage = val; } get currentPage() { return this._currentPage; } get totalRecords() { if (this.pageable) { return this.getTotalRecordsNumber(); } return this.dataResponseArray.length; } getPaginationDataFromArray(dataArray) { let result = dataArray; if (this.paginationControls) { result = result.splice(this.currentPage * this.queryRows, this.queryRows); } return result; } handleItemClick(item) { this.clickTimer = setTimeout(() => { if (!this.clickPrevent) { this.itemClickDone(item); } this.clickPrevent = false; }, this.clickDelay); } itemClickDone(item) { if (!this.oenabled) { return; } const data = item.getItemData(); if (this.detailMode === Codes.DETAIL_MODE_CLICK) { this.saveDataNavigationInLocalStorage(); this.viewDetail(data); } this.onClick.emit(data); } handleItemDblClick(item) { clearTimeout(this.clickTimer); this.clickPrevent = true; this.itemDblClickDone(item); } itemDblClickDone(item) { if (!this.oenabled) { return; } const data = item.getItemData(); if (Codes.isDoubleClickMode(this.detailMode)) { this.saveDataNavigationInLocalStorage(); this.viewDetail(data); } this.onDoubleClick.emit(data); } get quickFilterAppearance() { return this._quickFilterAppearance; } set quickFilterAppearance(value) { const values = ['fill', 'outline']; if (values.indexOf(value) === -1) { console.warn('The quick-filter-appearance attribute is undefined so the outline value will be used'); value = 'outline'; } this._quickFilterAppearance = value; } getSqlTypesOfKeys() { const sqlTypes = this.getSqlTypes(); const sqlTypesArg = {}; if (Util.isDefined(sqlTypes)) { this.keysArray.forEach(key => { sqlTypesArg[key] = sqlTypes[key]; }); } return sqlTypesArg; } compareRow() { return (o1, o2) => this.keysArray.every(key => o1[key] === o2[key]); } } AbstractOServiceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AbstractOServiceComponent, deps: [{ token: i0.Injector }, { token: i0.ElementRef }, { token: i1.OFormComponent }], target: i0.ɵɵFactoryTarget.Directive }); AbstractOServiceComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: AbstractOServiceComponent, inputs: { oattr: ["attr", "oattr"], service: "service", serviceType: ["service-type", "serviceType"], entity: "entity", queryOnInit: ["query-on-init", "queryOnInit"], queryOnBind: ["query-on-bind", "queryOnBind"], queryOnEvent: ["query-on-event", "queryOnEvent"], pageable: "pageable", columns: "columns", keys: "keys", parentKeys: ["parent-keys", "parentKeys"], staticData: ["static-data", "staticData"], queryMethod: ["query-method", "queryMethod"], paginatedQueryMethod: ["paginated-query-method", "paginatedQueryMethod"], oQueryRows: ["query-rows", "oQueryRows"], insertMethod: ["insert-method", "insertMethod"], updateMethod: ["update-method", "updateMethod"], deleteMethod: ["delete-method", "deleteMethod"], storeState: ["store-state", "storeState"], queryWithNullParentKeys: ["query-with-null-parent-keys", "queryWithNullParentKeys"], queryFallbackFunction: ["query-fallback-function", "queryFallbackFunction"], configureServiceArgs: ["configure-service-args", "configureServiceArgs"], _title: ["title", "_title"], ovisible: ["visible", "ovisible"], oenabled: ["enabled", "oenabled"], controls: "controls", detailMode: ["detail-mode", "detailMode"], detailFormRoute: ["detail-form-route", "detailFormRoute"], recursiveDetail: ["recursive-detail", "recursiveDetail"], detailButtonInRow: ["detail-button-in-row", "detailButtonInRow"], detailButtonInRowIcon: ["detail-button-in-row-icon", "detailButtonInRowIcon"], editFormRoute: ["edit-form-route", "editFormRoute"], recursiveEdit: ["recursive-edit", "recursiveEdit"], editButtonInRow: ["edit-button-in-row", "editButtonInRow"], editButtonInRowIcon: ["edit-button-in-row-icon", "editButtonInRowIcon"], insertButton: ["insert-button", "insertButton"], rowHeight: ["row-height", "rowHeight"], insertFormRoute: ["insert-form-route", "insertFormRoute"], recursiveInsert: ["recursive-insert", "recursiveInsert"], filterCaseSensitive: ["filter-case-sensitive", "filterCaseSensitive"], quickFilter: ["quick-filter", "quickFilter"], quickFilterPlaceholder: ["quick-filter-placeholder", "quickFilterPlaceholder"], paginationControls: ["pagination-controls", "paginationControls"], pageSizeOptions: ["page-size-options", "pageSizeOptions"], quickFilterAppearance: ["quick-filter-appearance", "quickFilterAppearance"], disablePageSizeCalculation: ["disable-page-size-calculation", "disablePageSizeCalculation"], initialFilterFunction: ["initial-filter-function", "initialFilterFunction"], filterBuilderFunction: ["filter-builder-function", "filterBuilderFunction"] }, outputs: { onClick: "onClick", onDoubleClick: "onDoubleClick", onDataLoaded: "onDataLoaded", onPaginatedDataLoaded: "onPaginatedDataLoaded", onSearch: "onSearch" }, viewQueries: [{ propertyName: "matpaginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "searchInputComponent", first: true, predicate: i0.forwardRef(function () { return OSearchInputComponent; }), descendants: true }], usesInheritance: true, ngImport: i0 }); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "ovisible", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "oenabled", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "controls", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "recursiveDetail", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "detailButtonInRow", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "recursiveEdit", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "editButtonInRow", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "insertButton", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "paginationControls", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "disablePageSizeCalculation", void 0); __decorate([ BooleanInputConverter(), __metadata("design:type", Boolean) ], AbstractOServiceComponent.prototype, "recursiveInsert", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: AbstractOServiceComponent, decorators: [{ type: Directive, args: [{ inputs: DEFAULT_INPUTS_O_SERVICE_COMPONENT, outputs: DEFAULT_OUTPUTS_O_SERVICE_COMPONENT }] }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }, { type: i1.OFormComponent }]; }, propDecorators: { matpaginator: [{ type: ViewChild, args: [MatPaginator] }], ovisible: [], oenabled: [], controls: [], recursiveDetail: [], detailButtonInRow: [], recursiveEdit: [], editButtonInRow: [], insertButton: [], paginationControls: [], disablePageSizeCalculation: [], recursiveInsert: [], searchInputComponent: [{ type: ViewChild, args: [(forwardRef(() => OSearchInputComponent))] }] } }); export class OServiceComponent extends AbstractOServiceComponent { } OServiceComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OServiceComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive }); OServiceComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.10", type: OServiceComponent, usesInheritance: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: OServiceComponent, decorators: [{ type: Directive }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiby1zZXJ2aWNlLWNvbXBvbmVudC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL29udGltaXplLXdlYi1uZ3gvc3JjL2xpYi9jb21wb25lbnRzL28tc2VydmljZS1jb21wb25lbnQuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdHLE9BQU8sRUFBRSxZQUFZLEVBQWEsTUFBTSw2QkFBNkIsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZUFBZSxFQUE0QixNQUFNLE1BQU0sQ0FBQztBQUdqRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUNsRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV4RixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUVyRyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUdqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUc5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFJaEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFFLHFCQUFxQixFQUFF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