UNPKG

dtable-utils

Version:

dtable common utils

490 lines (470 loc) 18.9 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _defineProperty = require('@babel/runtime/helpers/defineProperty'); var deepCopy = require('deep-copy'); var core = require('../filter/core.js'); var filterRow = require('../filter/filter-row.js'); var filter = require('../validate/filter.js'); var number = require('../column/number.js'); var row = require('../table/row.js'); var sortRow = require('../sort/sort-row.js'); var core$1 = require('../row/core.js'); var rowColor = require('./row-color.js'); var gradientColor = require('./gradient-color.js'); var cellType = require('../constants/cell-type.js'); require('../constants/column.js'); var index = require('../constants/filter/index.js'); require('../constants/formula.js'); require('../constants/sort.js'); require('../constants/group.js'); function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty); var deepCopy__default = /*#__PURE__*/_interopDefaultLegacy(deepCopy); 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__default["default"](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 COMPUTED_COLUMN_TYPES = [cellType.CellType.LINK, cellType.CellType.FORMULA, cellType.CellType.LINK_FORMULA]; var BY_RULES = 'by_rules'; var BY_NUMERIC_RANGE = 'by_numeric_range'; var BY_REPEAT_VALUE = 'by_repeat_value'; var isColumnHasColorRules = function isColumnHasColorRules(column) { var colorbys = column && column.colorbys; if (!colorbys) return false; var type = colorbys.type, colorByRules = colorbys.color_by_rules, rangeSettings = colorbys.range_settings, repeatValueSettings = colorbys.repeat_value_settings; if (type === BY_RULES) { return colorByRules && Array.isArray(colorByRules) && colorByRules.length > 0; } if (type === BY_REPEAT_VALUE) { return repeatValueSettings; } // type === BY_NUMERIC_RANGE return rangeSettings && Object.keys(rangeSettings).length > 0; }; var hasRelatedColumnColorRule = function hasRelatedColumnColorRule(columns, updatedColumnKeyMap) { return columns.some(function (column) { var colorbys = column && column.colorbys; if (!colorbys) { return false; } var type = colorbys.type, color_by_rules = colorbys.color_by_rules; if (type === BY_RULES) { if (!Array.isArray(color_by_rules) || color_by_rules.length === 0) { return false; } return color_by_rules.some(function (rule) { var filters = rule.filters; if (!Array.isArray(filters) || filters.length === 0) { return false; } var validFilters = filters.filter(function (filter$1) { return !filter.ValidateFilter.validate(filter$1, columns).error_message; }); return validFilters.some(function (filter) { return updatedColumnKeyMap[filter.column_key]; }); }); } return isColumnHasColorRules(column); }); }; var isColumnColorRulesValid = function isColumnColorRulesValid(column, columns) { var colorbys = column.colorbys; var type = colorbys.type, colorByRules = colorbys.color_by_rules; if (type === BY_RULES) { var isHasValidColorRule = colorByRules.some(function (rule) { var filters = rule.filters; if (filters.length === 0) return false; return filters.some(function (filter$1) { return !filter.ValidateFilter.validate(filter$1, columns).error_message; }); }); return isHasValidColorRule; } if (type === BY_REPEAT_VALUE) { return true; } if (type === BY_NUMERIC_RANGE) { // gradient color is only used for number column return number.isNumberColumn(column); } return false; }; var isColumnColorsView = function isColumnColorsView(columns) { return columns.some(function (column) { if (!isColumnHasColorRules(column)) return false; // valid color rule: the column maybe changed type if (!isColumnColorRulesValid(column, columns)) return false; return true; }); }; var getValidRulesColumns = function getValidRulesColumns(columns) { // judgement current table's columns has own color_rules columns or not var ownRulesColumns = columns.filter(function (column) { return isColumnHasColorRules(column); }); if (ownRulesColumns.length === 0) return []; // judgement current table's columns has valid color_rules columns ro not var validRulesColumns = ownRulesColumns.filter(function (column) { return isColumnColorRulesValid(column, columns); }); if (validRulesColumns.length === 0) return []; return validRulesColumns; }; var getSortedViewRows = function getSortedViewRows(column, view, table, value, _ref) { var username = _ref.username, userId = _ref.userId, userDepartmentIdsMap = _ref.userDepartmentIdsMap; var filter = { column_key: column.key, filter_predicate: 'is_not_empty', filter_term: '', column: column }; var formulaRows = view.formula_rows; var filterRowIds = filterRow.filterRows(index.FILTER_CONJUNCTION_TYPE.AND, [filter], table.rows, { formulaRows: formulaRows, username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); var sort = { sort_type: 'up', column_key: column.key }; var rows = row.getRowsByIds(table, filterRowIds); var sortedRowIds = sortRow.sortTableRows([sort], rows, [column], { formulaRows: formulaRows, value: value }); return row.getRowsByIds(table, sortedRowIds); }; var getCellValue = function getCellValue(row, column, formulaRows) { var key = column.key, type = column.type; var cellValue = row[key]; if (COMPUTED_COLUMN_TYPES.includes(type)) { var formulaRow = formulaRows && formulaRows[row._id] || {}; if (cellType.CellType.LINK === type) { var startCellValues = formulaRow[key] && Array.isArray(formulaRow[key]) ? formulaRow[key] : []; var _ref2 = startCellValues.length > 0 ? startCellValues[0] : {}, _ref2$display_value = _ref2.display_value, display_value = _ref2$display_value === void 0 ? null : _ref2$display_value; cellValue = display_value; } else { var cellValues = formulaRow[key]; cellValue = Array.isArray(cellValues) ? cellValues[0] : cellValues; } } return cellValue; }; /** * @param {object} column { colorbys, ... } * @param {object} view { formula_rows, ... } * @param {object} table { rows, ... } * @param {object} value {} * @param {array} rows rows from table: [{_id, ...}, ...] * @param {string} username? * @param {string} userId? * @param {object} userDepartmentIdsMap? * @returns object formatted column which used to calculate color */ var getFormattedColumn = function getFormattedColumn(column, view, table, value, rows, _ref3) { var username = _ref3.username, userId = _ref3.userId, userDepartmentIdsMap = _ref3.userDepartmentIdsMap; var dupColumn = deepCopy__default["default"](column); var colorbys = dupColumn.colorbys; var type = colorbys.type, colorByRules = colorbys.color_by_rules, rangeSettings = colorbys.range_settings, repeatValueSettings = colorbys.repeat_value_settings, duplicateColumnKey = colorbys.duplicate_column_key; if (type === BY_RULES) { // formatted color rules var formattedColorRules = colorByRules.map(function (colorRule) { var filters = colorRule.filters; var validFilters = []; try { validFilters = core.deleteInvalidFilter(filters, table.columns); } catch (err) { validFilters = []; } validFilters = core.getFormattedFilters(validFilters); // return formatted colorRule return _objectSpread(_objectSpread({}, colorRule), {}, { filters: validFilters }); }); dupColumn.colorbys = _objectSpread(_objectSpread({}, colorbys), {}, { color_by_rules: formattedColorRules }); return dupColumn; } if (type === BY_REPEAT_VALUE) { var _ref4 = value || {}, _ref4$collaborators = _ref4.collaborators, collaborators = _ref4$collaborators === void 0 ? [] : _ref4$collaborators; var formattedColumn = rowColor["default"].getFormattedDuplicateColumns([dupColumn], [duplicateColumnKey], { collaborators: collaborators }); var duplicate_rows_ids_map = {}; var formulaRows = view.formula_rows; for (var i = 0; i < rows.length; i++) { var row = rows[i]; var rowId = row._id; var formulaRow = formulaRows && formulaRows[rowId]; var rowValue = rowColor["default"].getDuplicateRowValue(row, formattedColumn, formulaRow); if (!rowValue) continue; var rowIds = duplicate_rows_ids_map[rowValue]; if (rowIds && rowIds.length > 0) { rowIds.push(rowId); } else { duplicate_rows_ids_map[rowValue] = [rowId]; } } dupColumn.duplicate_rows_ids_map = duplicate_rows_ids_map; dupColumn.colorbys = _objectSpread(_objectSpread({}, colorbys), {}, { repeat_value_settings: repeatValueSettings }); return dupColumn; } // type === BY_NUMERIC_RANGE // column type has been changed if (!number.isNumberColumn(column)) { dupColumn.gradientColorUtils = null; dupColumn.colorbys = _objectSpread(_objectSpread({}, colorbys), {}, { range_settings: {} }); return dupColumn; } // add gradient_colors computed properties for dumColumn var colorType = rangeSettings.color_type, isCustomStartValue = rangeSettings.is_custom_start_value, isCustomEndValue = rangeSettings.is_custom_end_value, startValue = rangeSettings.start_value, endValue = rangeSettings.end_value; var min = startValue; var max = endValue; if ((!isCustomStartValue || !isCustomEndValue) && table.rows.length > 0) { // sort rows var sortedRows = getSortedViewRows(column, view, table, value, { username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); var _formulaRows = view.formula_rows; // number rows length need great than zero if (sortedRows.length > 0) { var startRow = sortedRows[0]; var endRow = sortedRows[sortedRows.length - 1]; var startCellValue = getCellValue(startRow, column, _formulaRows); var endCellValue = getCellValue(endRow, column, _formulaRows); min = isCustomStartValue ? startValue : startCellValue; max = isCustomEndValue ? endValue : endCellValue; } } var gradientColorUtils = new gradientColor["default"]({ colorType: colorType, min: min, max: max }); dupColumn.gradientColorUtils = gradientColorUtils; return dupColumn; }; /** * Calculate column color * @param {array} rows * @param {object} view * @param {object} table e.g. { id_row_map, ... } * @param {object} value e.g. { tables, collaborators, ... } * @param {string} username * @param {string} userId * @param {object} userDepartmentIdsMap * @returns column color, object */ var getColumnColors = function getColumnColors(rows, view, table, value) { var _ref5 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}, _ref5$username = _ref5.username, username = _ref5$username === void 0 ? '' : _ref5$username, _ref5$userId = _ref5.userId, userId = _ref5$userId === void 0 ? '' : _ref5$userId, _ref5$userDepartmentI = _ref5.userDepartmentIdsMap, userDepartmentIdsMap = _ref5$userDepartmentI === void 0 ? null : _ref5$userDepartmentI; var columns = table.columns; var validRulesColumns = getValidRulesColumns(columns); if (validRulesColumns.length === 0) return {}; var tableRows = core$1.isTableRows(rows) ? rows : row.getRowsByIds(table, rows); // formatted column's color_rules validRulesColumns = validRulesColumns.map(function (column) { return getFormattedColumn(column, view, table, value, tableRows, { username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); }); /** * column_colors data struct * { * row_id: {[column_key]: value, [column_key]: value}, * row_id: {[column_key]: value, [column_key]: value}, * } */ var column_colors = {}; var formulaRows = view.formula_rows; var rowsLength = tableRows.length; var _loop = function _loop() { var row = tableRows[i]; // forEach own color_rules columns var column_color = {}; var rowId = row._id; var formulaRow = formulaRows && formulaRows[rowId] || {}; for (var j = 0; j < validRulesColumns.length; j++) { var column = validRulesColumns[j]; var columnKey = column.key, colorbys = column.colorbys, _column$duplicate_row = column.duplicate_rows_ids_map, duplicate_rows_ids_map = _column$duplicate_row === void 0 ? {} : _column$duplicate_row; var type = colorbys.type, colorByRules = colorbys.color_by_rules, rangeSettings = colorbys.range_settings, repeatValueSettings = colorbys.repeat_value_settings, duplicateColumnKey = colorbys.duplicate_column_key; if (type === BY_RULES) { // obtain the row data that meets the rules and record the color for (var m = 0; m < colorByRules.length; m++) { var colorRule = colorByRules[m]; var filter_conjunction = colorRule.filter_conjunction, filters = colorRule.filters, color = colorRule.color; if (filterRow.filterRow(row, filter_conjunction, filters, { formulaRow: formulaRow, username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap })) { column_color[columnKey] = color; break; } } } if (type === BY_REPEAT_VALUE) { var _color = repeatValueSettings.color; var _ref6 = value || {}, _ref6$collaborators = _ref6.collaborators, collaborators = _ref6$collaborators === void 0 ? [] : _ref6$collaborators; var formattedColumn = rowColor["default"].getFormattedDuplicateColumns([column], [duplicateColumnKey], { collaborators: collaborators }); var rowValue = rowColor["default"].getDuplicateRowValue(row, formattedColumn, formulaRow); if (!rowValue) continue; var rowIds = duplicate_rows_ids_map[rowValue]; if (rowIds && rowIds.length > 1) { var hasRowId = rowIds.some(function (id) { return id === rowId; }); if (hasRowId) { column_color[columnKey] = _color; var firstDuplicateRowId = rowIds[0]; if (!column_colors[firstDuplicateRowId]) { column_colors[firstDuplicateRowId] = column_color; } } } } if (type === BY_NUMERIC_RANGE) { if (Object.keys(rangeSettings).length === 0) break; var cellValue = getCellValue(row, column, formulaRows); if (cellValue || cellValue === 0) { var gradientColorUtils = column.gradientColorUtils; var cellColor = gradientColorUtils.getCellColor(cellValue); if (cellColor) { column_color[columnKey] = cellColor; } } } } if (Object.keys(column_color).length > 0) { column_colors[rowId] = column_color; } }; for (var i = 0; i < rowsLength; i++) { _loop(); } return column_colors; }; /** * Update column color by updated rows. * @param {array} rows updated rows | rows ids * @param {object} view * @param {object} table e.g. { id_row_map, ... } * @param {object} value e.g. { tables, collaborators, ... } * @param {string} username * @param {string} userId * @param {object} userDepartmentIdsMap * @returns column color, object */ var updateColumnColorsByUpdateRows = function updateColumnColorsByUpdateRows(rows, view, table, value) { var _ref7 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}, _ref7$username = _ref7.username, username = _ref7$username === void 0 ? '' : _ref7$username, _ref7$userId = _ref7.userId, userId = _ref7$userId === void 0 ? '' : _ref7$userId, _ref7$userDepartmentI = _ref7.userDepartmentIdsMap, userDepartmentIdsMap = _ref7$userDepartmentI === void 0 ? null : _ref7$userDepartmentI; var columns = table.columns; var validRulesColumns = getValidRulesColumns(columns); if (validRulesColumns.length === 0) return {}; var hasByGradientColorRule = validRulesColumns.some(function (column) { var colorbys = column.colorbys; return colorbys.type === BY_NUMERIC_RANGE; }); var hasRepeatValueColorRule = validRulesColumns.some(function (column) { var colorbys = column.colorbys; return colorbys.type === BY_REPEAT_VALUE; }); // if columns has one column which colorbys type is by_gradient_color, // recalculate all the rows background color if (hasByGradientColorRule || hasRepeatValueColorRule) { view.column_colors = getColumnColors(table.rows, view, table, value, { username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); return view.column_colors; } // recalculate the updated rows background color var updatedRows = core$1.isTableRows(rows) ? rows : row.getRowsByIds(table, rows); var columnColors = getColumnColors(updatedRows, view, table, value, { username: username, userId: userId, userDepartmentIdsMap: userDepartmentIdsMap }); var column_colors = view.column_colors; if (!column_colors) { column_colors = {}; view.column_colors = column_colors; } updatedRows.forEach(function (row) { var rowId = row._id; var columnColor = columnColors[rowId]; column_colors[rowId] = columnColor; }); return view.column_colors; }; var ColumnColorUtils = { isColumnHasColorRules: isColumnHasColorRules, hasRelatedColumnColorRule: hasRelatedColumnColorRule, isColumnColorRulesValid: isColumnColorRulesValid, isColumnColorsView: isColumnColorsView, getValidRulesColumns: getValidRulesColumns, getSortedViewRows: getSortedViewRows, getCellValue: getCellValue, getFormattedColumn: getFormattedColumn, getColumnColors: getColumnColors, updateColumnColorsByUpdateRows: updateColumnColorsByUpdateRows }; exports["default"] = ColumnColorUtils;