UNPKG

tuain-ng-forms-lib

Version:

Componentes y Clases Angular para la gestión de formularios TUAIN

525 lines 83.1 kB
import { Subject } from 'rxjs'; import { elementTypes } from '../form.constants'; import { FormElement } from '../element'; import { RecordTableColumn } from './column'; import { TableAction } from './action'; import { TableRecordData } from './row-data'; const TABLE_SORT_ASCENDING = 'asc'; const TABLE_SORT_DESCENDING = 'desc'; const attrs = { allSelected: { name: 'allSelected', propagate: 'allSelected' }, tableCode: { name: 'tableCode', propagate: 'code' }, clientPaging: { name: 'clientPaging', propagate: null }, globalSearch: { name: 'globalSearch', propagate: 'globalSearch' }, globalFilterString: { name: '_globalFilterString', propagate: 'globalFilterString' }, sorting: { name: 'sorting', propagate: null }, recordsPerPage: { name: 'recordsPerPage', propagate: 'recordsPerPage' }, layout: { name: 'layout', propagate: 'layout' }, columns: { name: 'columns', propagate: 'columns' }, selectedRecords: { name: 'selectedRecords', propagate: 'selectedRecords' }, currentPage: { name: 'currentPage', propagate: 'currentPage' }, totalRecordsNumber: { name: 'totalRecordsNumber', propagate: 'totalRecordsNumber' }, visibleRecords: { name: '_visibleRecords', propagate: 'visibleRecords' }, waiting: { name: '_waiting', propagate: 'waiting' }, }; export class RecordTable extends FormElement { _inlineActionTrigger = new Subject(); _globalActionTrigger = new Subject(); _recordSelectionTrigger = new Subject(); _selectionActionTrigger = new Subject(); _getDataTrigger = new Subject(); _tableColumnObj = {}; _appendPages; _actions; _actionsObj = {}; // Mecanismos de filtrado nueva versión _globalFilterString = ''; globalFilterStrings = []; selectedRecords; restrictedId; layout = null; _globalSearch; _tableRecords; _tableRecordObj = {}; _visibleRecords = []; _columns; _selectable; _selectionBackend; _selectionField; _allSelected = false; _tableCode = ''; _tableTitle; _currentPage; _totalPages; _requestedPage; _recordsPerPage = 10; _totalRecordsNumber = 0; _recordsNumber = 0; _sorting; _waiting; _clientPaging = true; _sortable; constructor(tableReceived, formConfig) { super(tableReceived, formConfig); this.propagationCustomAttributes = this._formConfig?.propagationCustomAttributes?.tables ?? []; this.elementType = elementTypes.table; this._waiting = false; this._currentPage = 1; this._totalPages = 1; this._requestedPage = 1; this._columns = []; this._tableColumnObj = {}; this._actions = []; this._actionsObj = {}; this._tableRecords = []; this._globalSearch = false; this.restrictedId = null; this._tableTitle = tableReceived.tableTitle; this._appendPages = tableReceived?.append ?? false; this._selectable = tableReceived?.selectable ?? false; this._selectionBackend = tableReceived?.selectionBackend ?? false; this._sortable = tableReceived?.sortable ?? false; this.setAttr(attrs.allSelected, false); this.setAttr(attrs.tableCode, tableReceived.tableCode); this.setAttr(attrs.clientPaging, tableReceived?.clientPaging ?? true); this.setAttr(attrs.globalSearch, tableReceived?.simpleFilter ?? false); this.setAttr(attrs.globalFilterString, ''); this.setAttr(attrs.sorting, { columnName: '', direction: '' }); this.setAttr(attrs.recordsPerPage, formConfig.defaultRecordsPerPage); this.setAttr(attrs.layout, ''); if (tableReceived.fields) { const columns = []; for (const columnReceived of tableReceived.fields) { const columnEnriched = { ...columnReceived, visibleStates: this.visibleStates, enabledStates: this.enabledStates }; const columnDefinition = new RecordTableColumn(columnEnriched, this._formConfig); columns.push(columnDefinition); this._tableColumnObj[columnDefinition.fieldCode] = columnDefinition; } this.setAttr(attrs.columns, columns); } if (tableReceived.actions) { const tableActions = tableReceived.actions.map(objDef => { let visibleStates = objDef.visibleStates; let enabledStates = objDef.enabledStates; if (!visibleStates) { visibleStates = (objDef.actionModes || '').split(',') .map(state => state.trim()) .filter(state => state.length > 0); enabledStates = (objDef.actionModes || '').split(',') .map(state => state.trim()) .filter(state => state.length > 0); } return { ...objDef, visibleStates, enabledStates }; }); for (const actionReceived of tableActions) { const inlineAction = new TableAction(actionReceived, this._formConfig); this._actions.push(inlineAction); this._actionsObj[inlineAction.actionCode] = inlineAction; } } this._selectionField = (this._selectable) ? tableReceived?.selectionField : null; // Filtros predefinidos en el formulario if (tableReceived.filters) { for (let index = 0; index < tableReceived.filters.length; index++) { this.addFilterDefinition(tableReceived.filters[index].fieldCode, tableReceived.filters[index]); } } } get columnNames() { return Object.keys(this._tableColumnObj); } get inlineActionTrigger() { return this._inlineActionTrigger.asObservable(); } get globalActionTrigger() { return this._globalActionTrigger.asObservable(); } get selectionActionTrigger() { return this._selectionActionTrigger.asObservable(); } get recordSelectionTrigger() { return this._recordSelectionTrigger.asObservable(); } get getDataTrigger() { return this._getDataTrigger.asObservable(); } get globalSearch() { return this._globalSearch; } get tableRecords() { return this._tableRecords; } get tableRecordObj() { return this._tableRecordObj; } get visibleRecords() { return this._visibleRecords; } get columns() { return this._columns; } get selectable() { return this._selectable; } get selectionBackend() { return this._selectionBackend; } get selectionField() { return this._selectionField; } get allSelected() { return this._allSelected; } get tableCode() { return this._tableCode; } get tableTitle() { return this._tableTitle; } get currentPage() { return this._currentPage; } get totalPages() { return this._totalPages; } get requestedPage() { return this._requestedPage; } get recordsPerPage() { return this._recordsPerPage; } get totalRecordsNumber() { return this._totalRecordsNumber; } get recordsNumber() { return this._recordsNumber; } get sorting() { return this._sorting; } get waiting() { return this._waiting; } get clientPaging() { return this._clientPaging; } get sortable() { return this._sortable; } get globalFilterString() { return this._globalFilterString; } set globalFilterString(globalFilterString) { this._globalFilterString = globalFilterString; } set globalSearch(globalSearch) { this._globalSearch = globalSearch; } set tableRecords(tableRecords) { this._tableRecords = tableRecords; } set tableRecordObj(tableRecordObj) { this._tableRecordObj = tableRecordObj; } set visibleRecords(visibleRecords) { this._visibleRecords = visibleRecords ?? []; } set columns(columns) { this._columns = columns; } set selectable(selectable) { this._selectable = selectable; } set selectionBackend(selectionBackend) { this._selectionBackend = selectionBackend; } set selectionField(selectionField) { this._selectionField = selectionField; } set allSelected(allSelected) { this._allSelected = allSelected; } set tableCode(tableCode) { this._tableCode = tableCode; } set tableTitle(tableTitle) { this._tableTitle = tableTitle; } set currentPage(currentPage) { this._currentPage = currentPage; } set totalPages(totalPages) { this._totalPages = totalPages; } set requestedPage(requestedPage) { this._requestedPage = requestedPage; } set recordsPerPage(recordsPerPage) { this._recordsPerPage = recordsPerPage; } set totalRecordsNumber(totalRecordsNumber) { this._totalRecordsNumber = totalRecordsNumber; } set recordsNumber(recordsNumber) { this._recordsNumber = recordsNumber; } set sorting(sorting) { this._sorting = sorting; } set waiting(waiting) { this.setAttr(attrs.waiting, waiting); } set clientPaging(clientPaging) { this._clientPaging = clientPaging; } set sortable(sortable) { this._sortable = sortable; } getLayout() { return this.layout; } setLayout(layout) { this.setAttr(attrs.layout, layout); } hasActions() { return (this._actions.length > 0); } getSelectedRecords() { return this._tableRecords.filter(rec => rec.selected).map(rec => rec.recordId); } activateGlobalSearch() { this._globalSearch = true; } inactivateGlobalSearch() { this._globalSearch = false; } columnDefinition(fieldCode) { return this._tableColumnObj[fieldCode]; } putOnWait() { this.waiting = true; } freeWaiting() { this.waiting = false; } setWidget(widget) { this.widget = widget; } notifyGlobalAction(actionCode) { const tableEvent = { tableCode: this._tableCode, actionCode, actionDetail: null }; this._globalActionTrigger.next(tableEvent); } notifyInlineAction(tableActionEvent) { const tableEvent = { tableCode: this._tableCode, actionCode: tableActionEvent.actionCode, actionDetail: { recordId: tableActionEvent.recordId, recordData: tableActionEvent.recordData } }; this._inlineActionTrigger.next(tableEvent); } notifyRecordSelection(recordId) { const record = this.getTableRecord(recordId); if (!record) { return; } record.toggleSelect(); this._requestedPage = this._currentPage ?? 1; const tableEvent = { tableCode: this._tableCode, actionCode: null, actionDetail: { recordId: record.recordId, recordData: record.recordData } }; this._recordSelectionTrigger.next(tableEvent); } notifySelectionAction(actionCode) { const tableEvent = { tableCode: this._tableCode, actionCode, actionDetail: { selectedRecords: this.selectedRecords } }; this._selectionActionTrigger.next(tableEvent); } notifyGetDataAction(requestedPage = null) { this.updateVisibleRecords(); this._requestedPage = requestedPage || this._currentPage || 1; const tableEvent = { tableCode: this._tableCode, actionCode: null, actionDetail: null, }; this._getDataTrigger.next(tableEvent); return null; } clean() { this._tableRecords = []; this.unSelectAll(); this._tableRecordObj = {}; this.updateVisibleRecords(); } selectAll() { this.setAttr(attrs.allSelected, true); this._tableRecords.forEach(record => record.select()); this.setAttr(attrs.selectedRecords, this.getSelectedRecords()); return true; } unSelectAll() { this.setAttr(attrs.allSelected, false); this._tableRecords.forEach(record => record.unselect()); this.setAttr(attrs.selectedRecords, this.getSelectedRecords()); return true; } setTableRecords(tableRecords, append) { if (!append) { this._tableRecords = []; this._tableRecordObj = {}; this.setAttr(attrs.allSelected, false); this.setAttr(attrs.selectedRecords, []); } const newRecordsObj = { ...this._tableRecordObj }; const newRecords = [...this._tableRecords]; for (const tableRecord of tableRecords) { const recordReceived = new TableRecordData(tableRecord, this._columns, this._selectionField); const recordIdKey = recordReceived.recordIdKey; newRecords.push(recordReceived); newRecordsObj[recordIdKey] = recordReceived; } this._tableRecords = newRecords; this._tableRecordObj = newRecordsObj; } appendRecords(records) { this.setTableRecords(records, true); } replaceRecords(records) { this.setTableRecords(records, false); } setTableAppend(append) { this._appendPages = append; } changePage(requestedPage) { if (this._clientPaging) { this.setAttr(attrs.currentPage, requestedPage); this.updateVisibleRecords(); } else { this.notifyGetDataAction(requestedPage); } } updateVisibleRecords() { let visibleRecords; if (this._clientPaging) { visibleRecords = this.getFilteredRecords(); // Se valida si la página actual sigue siendo válida const totalRecords = visibleRecords.length; const recordsLastPage = totalRecords % this._recordsPerPage; const totalPages = Math.trunc(totalRecords / this._recordsPerPage + (recordsLastPage ? 1 : 0)); if (this._currentPage > totalPages) { this._currentPage = totalPages || 1; } const sliceNumber1 = (this._currentPage - 1) * this._recordsPerPage; const sliceNumber2 = (this._currentPage - 1) * this._recordsPerPage + this._recordsPerPage; visibleRecords = visibleRecords.slice(sliceNumber1, sliceNumber2); this.setAttr(attrs.totalRecordsNumber, totalRecords); } else { visibleRecords = this._tableRecords; } this.setAttr(attrs.visibleRecords, visibleRecords ?? []); } updateFromServer(tableReceived) { this._requestedPage = 1; const { visible = true, totalPages = 1, recordsNumber, currentPage = 1, recordsPerPage, totalRecordsNumber, sortingColumn, sortingDirection, tableRecords, actions, fields, } = tableReceived; this.visible = visible; if (actions) { Object.keys(actions).forEach(actionCode => { const tblAction = this.getAction(actionCode); const actionReceived = actions[actionCode]; if (actionReceived.visible === true || actionReceived.visible === false) { (actionReceived.visible === true) && tblAction.show(); (actionReceived.visible === false) && tblAction.hide(); } if (actionReceived.enabled === true || actionReceived.enabled === false) { (actionReceived.enabled === true) && tblAction.enable(); (actionReceived.enabled === false) && tblAction.disable(); } if (actionReceived.showOnStates) { actionReceived.showOnStates?.forEach(newState => { tblAction.addVisibleState(newState); }); } if (actionReceived.hideOnStates) { actionReceived.hideOnStates?.forEach(newState => { tblAction.removeVisibleState(newState); }); } if (actionReceived.enableOnStates) { actionReceived.enableOnStates?.forEach(newState => { tblAction.addEnabledState(newState); }); } if (actionReceived.disableOnStates) { actionReceived.disableOnStates?.forEach(newState => { tblAction.removeEnabledState(newState); }); } }); } if (fields) { Object.keys(fields).forEach(fieldCode => { const tblField = this.columnDefinition(fieldCode); const fieldReceived = fields[fieldCode]; if (fieldReceived.visible === true || fieldReceived.visible === false) { (fieldReceived.visible === true) && tblField.show(); (fieldReceived.visible === false) && tblField.hide(); } }); } if (tableRecords) { this._totalPages = totalPages; this._recordsNumber = recordsNumber; this.setAttr(attrs.currentPage, +currentPage); this.setAttr(attrs.recordsPerPage, +recordsPerPage); this.setAttr(attrs.totalRecordsNumber, (this._clientPaging) ? tableRecords.length : +totalRecordsNumber); this.setAttr(attrs.sorting, { columnName: sortingColumn || '', direction: sortingDirection || '' }); if (!this._appendPages) { this.replaceRecords(tableRecords); } else { this.appendRecords(tableRecords); } } this.freeWaiting(); this.updateVisibleRecords(); } getTableRecord(recordId) { const recordIdKey = (typeof recordId === 'object') ? JSON.stringify(recordId) : recordId; return (this._tableRecordObj && recordId && this._tableRecordObj[recordId]) ? this._tableRecordObj[recordId] : null; } getAction(actionCode) { return (this._actionsObj && actionCode && this._actionsObj[actionCode]) ? this._actionsObj[actionCode] : null; } getActions(actionClass = this._formConfig.tableActions.inline, actionTypes = null) { return this._actions.filter(actionDef => { const typeIncluded = (actionTypes) ? actionTypes.includes(actionDef.actionType) : true; return actionDef.actionClass === actionClass && typeIncluded; }); } // Filtros setFilterById(id) { if (this.restrictedId === id) { return; } this.restrictedId = id; this.updateVisibleRecords(); } cleanIdFilter() { if (this.restrictedId === null) { return; } this.restrictedId = null; this.updateVisibleRecords(); } setGlobalFilterString(text, notifyComponent = true) { this.globalFilterStrings = text.split(' ').filter(t => t && t.trim().length > 0).map(t => t.trim()) ?? []; if (this._clientPaging) { this.changePage(1); } if (notifyComponent) { this.setAttr(attrs.globalFilterString, text.trim()); } } addFilterDefinition(columnName, filterDefinition) { const tableColumn = this.columnDefinition(columnName); tableColumn && tableColumn.addFilterDefinition(filterDefinition); } getFilteredRecords() { let filteredRecords = this._tableRecords; if (this.restrictedId) { filteredRecords = filteredRecords.filter(record => record.recordId === this.restrictedId); } if (this.globalFilterStrings.length > 0) { filteredRecords = filteredRecords.filter(record => record.hasPattern(this.globalFilterStrings, this._tableColumnObj)); } const columnFilters = this._columns.filter(column => column.filter).map(column => column.filter); if (columnFilters.length > 0) { filteredRecords = filteredRecords.filter(record => record.hasCondition(columnFilters)); } return filteredRecords; } getColumnFilter(columnName) { const tableColumn = this.columnDefinition(columnName); return tableColumn?.filter ?? null; } addColumnFilter(columnName, columnValues, operator = null) { const tableColumn = this.columnDefinition(columnName); const columnFilterDefinition = tableColumn?.filterDefinition ?? null; if (!columnFilterDefinition) { return; } tableColumn && tableColumn.addFilter(columnValues, operator); this.updateVisibleRecords(); } removeColumnFilter(columnName) { const tableColumn = this.columnDefinition(columnName); tableColumn && tableColumn.removeFilter(); this.updateVisibleRecords(); } get currentFilter() { const compactFilter = { simpleFilterWords: this.globalFilterStrings, advancedFilter: [], }; const columnFilters = this._columns.filter(column => column.filter).map(column => column.filter); for (let index = 0; index < columnFilters.length; index++) { const columnFilter = columnFilters[index]; compactFilter.advancedFilter.push({ fieldCode: columnFilter?.fieldCode, operator: columnFilter?.operator, fieldValue1: columnFilter?.values[0], fieldValue2: columnFilter?.values[1], }); } return compactFilter; } // Ordenamiento de registros local sort(columnName, direction) { this.setRequiredOrder(columnName, direction); if (this._clientPaging) { this.localSortData(); } else { this.notifyGetDataAction(); } } setRequiredOrder(columnField, direction = null) { this.setAttr(attrs.sorting, { columnName: columnField, direction: (direction === 'ascend') ? TABLE_SORT_ASCENDING : TABLE_SORT_DESCENDING, }); } localSortData() { if (!this._sorting.columnName || !this._sorting.direction) { return; } this._tableRecords.sort((a, b) => this.recordCompare(a, b, this._sorting.columnName, this._sorting.direction)); //this.unSelectAll(); this.updateVisibleRecords(); } recordCompare(recordA, recordB, columnCompare, direction) { const recordAValue = recordA.getFieldValue(columnCompare); const recordBValue = recordB.getFieldValue(columnCompare); const recordAColumn = isNaN(recordAValue) ? recordAValue.toLocaleLowerCase() : +recordAValue; const recordBColumn = isNaN(recordBValue) ? recordBValue.toLocaleLowerCase() : +recordBValue; let result = 0; if (recordAColumn < recordBColumn) { result = -1; } else if (recordAColumn > recordBColumn) { result = 1; } return direction === TABLE_SORT_ASCENDING ? result : -result; } formStateChangeCustomSubscribe(form, formChangeSubject) { this._columns?.forEach(column => { column?.connectWithParentForm(form, formChangeSubject); }); this._actions?.forEach(action => { action?.connectWithParentForm(form, formChangeSubject); }); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWFpbi1uZy1mb3Jtcy1saWIvc3JjL2xpYi9jbGFzc2VzL2Zvcm1zL3RhYmxlL3RhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU3QyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUNuQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUVyQyxNQUFNLEtBQUssR0FBRztJQUNaLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRTtJQUM5RCxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7SUFDbkQsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0lBQ3ZELFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRTtJQUNqRSxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUU7SUFDcEYsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0lBQzdDLGNBQWMsRUFBRSxFQUFFLElB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