UNPKG

dtable-utils

Version:

dtable common utils

535 lines (513 loc) 19 kB
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray'; import _defineProperty from '@babel/runtime/helpers/defineProperty'; import { ValidateFilter } from '../validate/filter.js'; import { DateUtils } from '../date.js'; import { FILTER_ERR_MSG } from '../constants/filter/index.js'; import { CellType } from '../constants/cell-type.js'; import { FORMULA_RESULT_TYPE, FORMULA_COLUMN_TYPES_MAP } from '../constants/formula.js'; import { hasOwnProperty } from '../common.js'; import { FILTER_TERM_MODIFIER_TYPE } from '../constants/filter/filter-modifier.js'; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } var EXACT_DATE_TERM_MODIFIER_TYPES = [FILTER_TERM_MODIFIER_TYPE.TODAY, FILTER_TERM_MODIFIER_TYPE.TOMORROW, FILTER_TERM_MODIFIER_TYPE.YESTERDAY, FILTER_TERM_MODIFIER_TYPE.ONE_WEEK_AGO, FILTER_TERM_MODIFIER_TYPE.ONE_WEEK_FROM_NOW, FILTER_TERM_MODIFIER_TYPE.ONE_MONTH_AGO, FILTER_TERM_MODIFIER_TYPE.ONE_MONTH_FROM_NOW, FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_AGO, FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_FROM_NOW, FILTER_TERM_MODIFIER_TYPE.EXACT_DATE]; /** * Check if is filter group * @param {object} filter * @returns bool */ var checkIsFilterGroup = function checkIsFilterGroup(filter) { return hasOwnProperty(filter, 'filters'); }; /** * Check if is formula/link filter * @param {object} filter * @returns bool */ var checkIsFormulaFilter = function checkIsFormulaFilter(filter) { var column = filter.column; return FORMULA_COLUMN_TYPES_MAP[column.type] || column.type === CellType.LINK; }; /** * Check has contains formula filter * @param {array} filters e.g. [{ column_key, column, ...}] * @returns bool */ var checkHasFormulaFilter = function checkHasFormulaFilter(filters) { return filters.some(function (filter) { if (checkIsFilterGroup(filter)) { var subFilters = filter.filters; if (!Array.isArray(subFilters) || subFilters.length === 0) { return false; } return subFilters.some(function (subFilter) { return checkIsFormulaFilter(subFilter); }); } return checkIsFormulaFilter(filter); }); }; var isCurrentUserDepartment = function isCurrentUserDepartment(departmentId, userDepartmentIdsMap) { var _ref = userDepartmentIdsMap || {}, current_user_department_ids = _ref.current_user_department_ids; return Array.isArray(current_user_department_ids) && current_user_department_ids.includes(departmentId); }; var isCurrentUserDepartmentAndSub = function isCurrentUserDepartmentAndSub(departmentId, userDepartmentIdsMap) { var _ref2 = userDepartmentIdsMap || {}, current_user_department_and_sub_ids = _ref2.current_user_department_and_sub_ids; return Array.isArray(current_user_department_and_sub_ids) && current_user_department_and_sub_ids.includes(departmentId); }; var isSpecificDepartment = function isSpecificDepartment(departmentId, filterTerm) { if (typeof departmentId !== 'number') return false; return filterTerm.includes(departmentId); }; /** * Check if the filter is available to display * @param {object} filter * @param {array} columns * @returns bool */ var checkIsAvailableFilter = function checkIsAvailableFilter(filter, columns) { var _ValidateFilter$valid = ValidateFilter.validate(filter, columns), error_message = _ValidateFilter$valid.error_message; if (error_message && error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) { return false; } return true; }; /** * Get filters which excludes incomplete * @param {array} filters e.g. [{ column_key, filter_predicate, ... }, { filters: [...]}] * @param {array} columns * @returns valid filters, array */ var getValidFilters = function getValidFilters(filters, columns) { if (!Array.isArray(filters) || !Array.isArray(columns)) { return []; } var availableFilters = []; filters.forEach(function (filter) { if (checkIsFilterGroup(filter)) { var subFilters = filter.filters; var availableSubFilters = []; if (Array.isArray(subFilters) && subFilters.length > 0) { availableSubFilters = subFilters.filter(function (subFilter) { return checkIsAvailableFilter(subFilter, columns); }); } // just keep the filter group which has valid sub-filters if (availableSubFilters.length > 0) { availableFilters.push(_objectSpread(_objectSpread({}, filter), {}, { filters: availableSubFilters })); } } else if (checkIsAvailableFilter(filter, columns)) { availableFilters.push(filter); } }); return availableFilters; }; /** * Get filters without error messages * @param {array} filters e.g. [{ column_key, filter_predicate, ... }] * @param {array} columns * @returns valid filters, array */ var getValidFiltersWithoutError = function getValidFiltersWithoutError(filters, columns) { if (!Array.isArray(filters) || !Array.isArray(columns)) { return []; } return filters.filter(function (filter) { return !ValidateFilter.validate(filter, columns).error_message; }); }; /** * Generate date for filter * @param {string} filterTermModifier * @param {any} filterTerm * @returns date | date range, object */ var otherDate = function otherDate(filterTermModifier, filterTerm) { var today = new Date(); var year = today.getFullYear(); var month = today.getMonth(); // use js month representation: 0 - 11 var day = today.getDate(); // 0 1 2 3 4 5 6 7 8 9 10 11 days in every month var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; days[1] = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) ? 29 : 28; // is leap year switch (filterTermModifier) { case FILTER_TERM_MODIFIER_TYPE.TODAY: { // today, should start at 0:00 and end at 24:00 return new Date(year, month, day, 0, 0, 0); } case FILTER_TERM_MODIFIER_TYPE.TOMORROW: { return new Date(year, month, day + 1); } case FILTER_TERM_MODIFIER_TYPE.YESTERDAY: { return new Date(year, month, day - 1); } case FILTER_TERM_MODIFIER_TYPE.ONE_WEEK_AGO: { return new Date(year, month, day - 7); } case FILTER_TERM_MODIFIER_TYPE.ONE_WEEK_FROM_NOW: { return new Date(year, month, day + 7); } case FILTER_TERM_MODIFIER_TYPE.ONE_MONTH_AGO: { var pastMonth = month - 1; var monthDaysIndex = month === 0 ? 11 : pastMonth; var currentDay = day > days[monthDaysIndex] ? days[monthDaysIndex] : day; return new Date(year, pastMonth, currentDay); } case FILTER_TERM_MODIFIER_TYPE.ONE_MONTH_FROM_NOW: { var nextMonth = month + 1; var _monthDaysIndex = month === 11 ? 0 : nextMonth; var _currentDay = day > days[_monthDaysIndex] ? days[_monthDaysIndex] : day; return new Date(year, nextMonth, _currentDay); } case FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_AGO: { return new Date(year, month, day - Number(filterTerm)); } case FILTER_TERM_MODIFIER_TYPE.NUMBER_OF_DAYS_FROM_NOW: { return new Date(year, month, day + Number(filterTerm)); } case FILTER_TERM_MODIFIER_TYPE.EXACT_DATE: { return new Date(filterTerm); } case FILTER_TERM_MODIFIER_TYPE.THE_PAST_WEEK: { var weekDay = today.getDay() !== 0 ? today.getDay() : 7; return { startDate: new Date(year, month, day - weekDay - 6), endDate: new Date(year, month, day - weekDay) }; } case FILTER_TERM_MODIFIER_TYPE.THIS_WEEK: { var _weekDay = today.getDay() !== 0 ? today.getDay() : 7; return { startDate: new Date(year, month, day - _weekDay + 1), endDate: new Date(year, month, day - _weekDay + 7) }; } case FILTER_TERM_MODIFIER_TYPE.THE_NEXT_WEEK: { var _weekDay2 = today.getDay() !== 0 ? today.getDay() : 7; return { startDate: new Date(year, month, day - _weekDay2 + 8), endDate: new Date(year, month, day - _weekDay2 + 14) }; } case FILTER_TERM_MODIFIER_TYPE.THE_PAST_MONTH: { var _pastMonth = month - 1; return { startDate: new Date(year, _pastMonth, 1), endDate: new Date(year, _pastMonth, days[month === 0 ? 11 : _pastMonth]) }; } case FILTER_TERM_MODIFIER_TYPE.THIS_MONTH: { return { startDate: new Date(year, month, 1), endDate: new Date(year, month, days[month]) }; } case FILTER_TERM_MODIFIER_TYPE.THE_NEXT_MONTH: { var _nextMonth = month + 1; return { startDate: new Date(year, _nextMonth, 1), endDate: new Date(year, _nextMonth, month === 11 ? days[0] : days[_nextMonth]) }; } case FILTER_TERM_MODIFIER_TYPE.THE_PAST_YEAR: { var pastYear = year - 1; return { startDate: new Date(pastYear, 0, 1), // The computer's month starts at 0. endDate: new Date(pastYear, 11, 31) }; } case FILTER_TERM_MODIFIER_TYPE.THIS_YEAR: { return { startDate: new Date(year, 0, 1), endDate: new Date(year, 11, 31) }; } case FILTER_TERM_MODIFIER_TYPE.THE_NEXT_YEAR: { var nextYear = year + 1; return { startDate: new Date(nextYear, 0, 1), endDate: new Date(nextYear, 11, 31) }; } case FILTER_TERM_MODIFIER_TYPE.THE_NEXT_NUMBERS_OF_DAYS: { return { startDate: new Date(year, month, day + 1, 0, 0, 0), endDate: new Date(year, month, day + Number(filterTerm)) }; } case FILTER_TERM_MODIFIER_TYPE.THE_PAST_NUMBERS_OF_DAYS: { return { startDate: new Date(year, month, day - Number(filterTerm)), endDate: new Date(year, month, day, 0, 0, 0) }; } default: { return {}; } } }; /** * Generate formatted date for filter * @param {string} filterTermModifier * @param {any} filterTerm * @returns formatted date | date range, object */ var getFormattedFilterOtherDate = function getFormattedFilterOtherDate(filterTermModifier, filterTerm) { var _otherDate = otherDate(filterTermModifier, filterTerm); if (EXACT_DATE_TERM_MODIFIER_TYPES.includes(filterTermModifier)) { return DateUtils.format(_otherDate); } var startDate = _otherDate.startDate, endDate = _otherDate.endDate; return { startDate: startDate ? DateUtils.format(startDate) : '', endDate: endDate ? DateUtils.format(endDate) : '' }; }; /** * Format filter with other_date, linked_column etc. * @param {object} filter e.g. { filter_term, filter_term_modifier, ... } * @param {object} column * @returns formatted filter */ var _getFormattedFilter = function getFormattedFilter(filter, column) { var filter_term = filter.filter_term, filter_term_modifier = filter.filter_term_modifier; var columnType = column.type, columnData = column.data; var formattedFilter = filter; switch (columnType) { case CellType.FORMULA: case CellType.LINK_FORMULA: { var result_type = columnData.result_type, array_type = columnData.array_type, array_data = columnData.array_data; if (result_type === FORMULA_RESULT_TYPE.DATE) { formattedFilter.other_date = getFormattedFilterOtherDate(filter_term_modifier, filter_term); } if (result_type === FORMULA_RESULT_TYPE.ARRAY) { var linkedColumn = { type: array_type, data: array_data }; formattedFilter.linked_column = linkedColumn; formattedFilter = _getFormattedFilter(formattedFilter, linkedColumn); } break; } case CellType.DATE: case CellType.CTIME: case CellType.MTIME: { formattedFilter.other_date = getFormattedFilterOtherDate(filter_term_modifier, filter_term); break; } case CellType.LINK: { var _ref3 = columnData || {}, _array_type = _ref3.array_type, _array_data = _ref3.array_data; var _linkedColumn = { type: _array_type, data: _array_data }; var filterColumnData = _objectSpread(_objectSpread({}, columnData), {}, { result_type: FORMULA_RESULT_TYPE.ARRAY }); var filterColumn = _objectSpread(_objectSpread({}, column), {}, { data: filterColumnData }); formattedFilter.column = filterColumn; formattedFilter.linked_column = _linkedColumn; formattedFilter = _getFormattedFilter(formattedFilter, _linkedColumn); break; } } return formattedFilter; }; /** * Get formatted filters with other_date, linked_column etc. * @param {array} filters [{ filter_term, filter_term_modifier, column, ... }] * @returns formatted filters, array */ var getFormattedFilters = function getFormattedFilters(filters) { return filters.map(function (filter) { if (checkIsFilterGroup(filter)) { var subFilters = filter.filters; var formattedSubFilters = []; if (Array.isArray(subFilters) && subFilters.length > 0) { formattedSubFilters = subFilters.map(function (subFilter) { return _getFormattedFilter(subFilter, subFilter.column); }); } return _objectSpread(_objectSpread({}, filter), {}, { filters: formattedSubFilters }); } return _getFormattedFilter(filter, filter.column); }); }; var checkFilter = function checkFilter(filter, columns) { var _ValidateFilter$valid2 = ValidateFilter.validate(filter, columns), error_message = _ValidateFilter$valid2.error_message; if (error_message) { if (error_message === FILTER_ERR_MSG.INCOMPLETE_FILTER) { return null; } throw new Error(error_message); } var newFilter = _objectSpread({}, filter); var column_key = filter.column_key; newFilter.column = columns.find(function (column) { return column.key === column_key; }); return newFilter; }; /** * Get filters without error messages and formatted with filter column * @param {array} filters e.g. [{ column_key, filter_predicate, ... }] * @param {array} columns * @returns filters, array */ var deleteInvalidFilter = function deleteInvalidFilter(filters, columns) { if (!Array.isArray(filters) || filters.length === 0) { return []; } var cleanFilters = []; filters.forEach(function (filter) { if (checkIsFilterGroup(filter)) { var subFilters = filter.filters; if (Array.isArray(subFilters) && subFilters.length > 0) { var cleanSubFilters = []; subFilters.forEach(function (subFilter) { var newSubFilter = checkFilter(subFilter, columns); if (newSubFilter) { cleanSubFilters.push(newSubFilter); } }); // just keep the filter group which has valid sub-filters if (cleanSubFilters.length > 0) { cleanFilters.push(_objectSpread(_objectSpread({}, filter), {}, { filters: cleanSubFilters })); } } } else { var newFilter = checkFilter(filter, columns); if (newFilter) { cleanFilters.push(newFilter); } } }); return cleanFilters; }; /** * Categorize filters * @param {array} filters * @returns {object} { generalFilters, formulaFilters, filterGroups } */ var getClassifiedFilters = function getClassifiedFilters(filters) { var generalFilters = []; var formulaFilters = []; var filterGroups = []; filters.forEach(function (filter) { if (checkIsFilterGroup(filter)) { filterGroups.push(filter); } else if (checkIsFormulaFilter(filter)) { formulaFilters.push(filter); } else { generalFilters.push(filter); } }); return { generalFilters: generalFilters, formulaFilters: formulaFilters, filterGroups: filterGroups }; }; /** * Check if is related filter of given columns * @param {object} filter * @param {object} updatedColumnKeyMap e.g. { [column.key]: true } * @returns bool */ var checkIsRelatedFilter = function checkIsRelatedFilter(filter, columnKeyMap) { var column_key = filter.column_key; if (!column_key) { return false; } return !!columnKeyMap[column_key]; }; /** * Check if is related filter group of given columns * @param {object} filterGroup * @param {object} columnKeyMap * @returns bool */ var checkIsRelatedFilterGroup = function checkIsRelatedFilterGroup(filterGroup, columnKeyMap) { var filters = filterGroup.filters; if (!Array.isArray(filters) || filters.length === 0) { return false; } return filters.some(function (filter) { return checkIsRelatedFilter(filter, columnKeyMap); }); }; /** * Check if has related filters of given columns * @param {array} filters * @param {object} updatedColumnKeyMap e.g. { [column.key]: true } * @returns bool */ var hasRelatedFilters = function hasRelatedFilters(filters, columnKeyMap) { return filters.some(function (filter) { return checkIsFilterGroup(filter) ? checkIsRelatedFilterGroup(filter, columnKeyMap) : checkIsRelatedFilter(filter, columnKeyMap); }); }; /** * Get a one-dimensional filter list * @param {array} filters [] */ var getOneDimensionalFilters = function getOneDimensionalFilters(filters) { if (!Array.isArray(filters) || filters.length === 0) { return []; } var oneDimensionalFilters = []; filters.forEach(function (filter) { if (!checkIsFilterGroup(filter)) { oneDimensionalFilters.push(filter); } else if (Array.isArray(filter.filters)) { oneDimensionalFilters.push.apply(oneDimensionalFilters, _toConsumableArray(filter.filters)); } }); return oneDimensionalFilters; }; export { checkHasFormulaFilter, checkIsAvailableFilter, checkIsFilterGroup, checkIsFormulaFilter, checkIsRelatedFilter, checkIsRelatedFilterGroup, deleteInvalidFilter, getClassifiedFilters, _getFormattedFilter as getFormattedFilter, getFormattedFilterOtherDate, getFormattedFilters, getOneDimensionalFilters, getValidFilters, getValidFiltersWithoutError, hasRelatedFilters, isCurrentUserDepartment, isCurrentUserDepartmentAndSub, isSpecificDepartment, otherDate };