UNPKG

dtable-utils

Version:

dtable common utils

273 lines (267 loc) 9.6 kB
import { checkIsFilterGroup, getFormattedFilters, deleteInvalidFilter } from './core.js'; import { checkboxFilter } from './filter-column/checkbox.js'; import { collaboratorFilter } from './filter-column/collaborator.js'; import { creatorFilter } from './filter-column/creator.js'; import { dateFilter } from './filter-column/date.js'; import { digitalSignFilter } from './filter-column/digital-sign.js'; import { fileFilter } from './filter-column/file.js'; import { formulaFilter } from './filter-column/formula.js'; import { geolocationFilter } from './filter-column/geolocation.js'; import { textFilter } from './filter-column/text.js'; import { longTextFilter } from './filter-column/long-text.js'; import { multipleSelectFilter } from './filter-column/multiple-select.js'; import { numberFilter } from './filter-column/number.js'; import { singleSelectFilter } from './filter-column/single-select.js'; import { linkFilter } from './filter-column/link.js'; import { departmentSingleSelectFilter } from './filter-column/department-single-select.js'; import '@babel/runtime/helpers/toConsumableArray'; import { DATE_FORMAT_MAP } from '../constants/column.js'; import '../constants/filter/filter-predicate.js'; import { FILTER_CONJUNCTION_TYPE } from '../constants/filter/index.js'; import { DateUtils } from '../date.js'; import { CellType } from '../constants/cell-type.js'; var getFilterResult = function getFilterResult(row, filter, _ref) { var formulaRow = _ref.formulaRow, username = _ref.username, userId = _ref.userId, userDepartmentIdsMap = _ref.userDepartmentIdsMap; var column_key = filter.column_key, column = filter.column; var cellValue = row[column_key]; switch (column.type) { case CellType.CHECKBOX: { return checkboxFilter(cellValue, filter); } case CellType.SINGLE_SELECT: { return singleSelectFilter(cellValue, filter); } case CellType.MULTIPLE_SELECT: { return multipleSelectFilter(cellValue, filter); } case CellType.DEPARTMENT_SINGLE_SELECT: { return departmentSingleSelectFilter(cellValue, filter, userDepartmentIdsMap); } case CellType.DURATION: case CellType.NUMBER: case CellType.RATE: { return numberFilter(cellValue, filter); } case CellType.DATE: { return dateFilter(cellValue, filter); } case CellType.CTIME: case CellType.MTIME: { cellValue = DateUtils.format(cellValue, DATE_FORMAT_MAP.YYYY_MM_DD_HH_MM_SS); return dateFilter(cellValue, filter); } case CellType.COLLABORATOR: { return collaboratorFilter(cellValue, filter, username); } case CellType.LONG_TEXT: { return longTextFilter(cellValue, filter); } case CellType.TEXT: case CellType.AUTO_NUMBER: case CellType.EMAIL: case CellType.URL: { return textFilter(cellValue, filter, userId); } case CellType.IMAGE: case CellType.FILE: { return fileFilter(cellValue, filter); } case CellType.LAST_MODIFIER: case CellType.CREATOR: { return creatorFilter(cellValue, filter, username); } case CellType.GEOLOCATION: { return geolocationFilter(cellValue, filter); } case CellType.FORMULA: case CellType.LINK_FORMULA: { if (!formulaRow) return false; cellValue = formulaRow[column_key]; return formulaFilter(cellValue, filter, { username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); } case CellType.LINK: { if (!formulaRow) return false; cellValue = formulaRow[column_key]; cellValue = Array.isArray(cellValue) ? cellValue.map(function (linked) { return linked.display_value; }) : null; return linkFilter(cellValue, filter, { username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); } case CellType.DIGITAL_SIGN: { return digitalSignFilter(cellValue, filter); } default: { return false; } } }; /** * Filter row * @param {object} row e.g. { _id, .... } * @param {string} filterConjunction e.g. 'And' | 'Or' * @param {array} filters e.g. [{ column_key, filter_predicate, ... }, ...] * @param {object} formulaRow * @param {string} username * @param {string} userId * @param {object} userDepartmentIdsMap e.g. { current_user_department_ids: [8, 10], current_user_department_and_sub_ids: [8, 10, 12, 34] } * @returns filter result, bool */ var _filterRow = function filterRow(row, filterConjunction, filters) { var _ref2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}, formulaRow = _ref2.formulaRow, _ref2$username = _ref2.username, username = _ref2$username === void 0 ? '' : _ref2$username, userId = _ref2.userId, _ref2$userDepartmentI = _ref2.userDepartmentIdsMap, userDepartmentIdsMap = _ref2$userDepartmentI === void 0 ? {} : _ref2$userDepartmentI; if (filterConjunction === FILTER_CONJUNCTION_TYPE.AND) { return filters.every(function (filter) { if (checkIsFilterGroup(filter)) { return _filterRow(row, filter.filter_conjunction, filter.filters, { formulaRow: formulaRow, username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); } return getFilterResult(row, filter, { formulaRow: formulaRow, username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); }); } if (filterConjunction === FILTER_CONJUNCTION_TYPE.OR) { return filters.some(function (filter) { if (checkIsFilterGroup(filter)) { return _filterRow(row, filter.filter_conjunction, filter.filters, { formulaRow: formulaRow, username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); } return getFilterResult(row, filter, { formulaRow: formulaRow, username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); }); } return false; }; /** * Filter rows * @param {string} filterConjunction e.g. 'And' | 'Or' * @param {array} filters e.g. [{ column_key, filter_predicate, ... }, ...] * @param {array} rows e.g. [{ _id, .... }, ...] * @param {object} formulaRows * @param {string} username * @param {string} userId * @param {object} userDepartmentIdsMap e.g. { current_user_department_ids: [8, 10], current_user_department_and_sub_ids: [8, 10, 12, 34] } * @returns filtered rows ids, array */ var filterRows = function filterRows(filterConjunction, filters, rows, _ref3) { var formulaRows = _ref3.formulaRows, username = _ref3.username, userId = _ref3.userId, userDepartmentIdsMap = _ref3.userDepartmentIdsMap; var filteredRows = []; var formattedFilters = getFormattedFilters(filters); rows.forEach(function (row) { var rowId = row._id; var formulaRow = formulaRows ? formulaRows[rowId] : null; if (_filterRow(row, filterConjunction, formattedFilters, { formulaRow: formulaRow, username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap })) { filteredRows.push(rowId); } }); return filteredRows; }; /** * Filter rows without formula calculation * The "formulaRows" need to be provided if you want to filter formula, link columns etc. * @param {string} filterConjunction e.g. 'And' | 'Or' * @param {array} filters e.g. [{ column_key, filter_predicate, ... }, ...] * @param {array} rows e.g. [{ _id, .... }, ...] * @param {object} table e.g. { columns, ... } * @param {object} formulaRows * @param {string} username * @param {string} userId * @param {object} userDepartmentIdsMap e.g. { current_user_department_ids: [8, 10], current_user_department_and_sub_ids: [8, 10, 12, 34] } * @returns filtered rows: row_ids and error message: error_message, object */ var getFilteredRowsWithoutFormulaCalculation = function getFilteredRowsWithoutFormulaCalculation(filterConjunction, filters, rows, table) { var _ref4 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}, _ref4$formulaRows = _ref4.formulaRows, formulaRows = _ref4$formulaRows === void 0 ? null : _ref4$formulaRows, _ref4$username = _ref4.username, username = _ref4$username === void 0 ? null : _ref4$username, _ref4$userId = _ref4.userId, userId = _ref4$userId === void 0 ? null : _ref4$userId, _ref4$userDepartmentI = _ref4.userDepartmentIdsMap, userDepartmentIdsMap = _ref4$userDepartmentI === void 0 ? null : _ref4$userDepartmentI; var columns = table.columns; var validFilters = []; try { validFilters = deleteInvalidFilter(filters, columns); } catch (err) { return { row_ids: [], error_message: err.message }; } var filteredRows = []; if (validFilters.length === 0) { filteredRows = rows.map(function (row) { return row._id; }); } else { filteredRows = filterRows(filterConjunction, validFilters, rows, { formulaRows: formulaRows, username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); } return { row_ids: filteredRows, error_message: null }; }; export { _filterRow as filterRow, filterRows, getFilteredRowsWithoutFormulaCalculation };