dtable-utils
Version:
dtable common utils
273 lines (267 loc) • 9.6 kB
JavaScript
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 };