dtable-utils
Version:
dtable common utils
490 lines (470 loc) • 18.9 kB
JavaScript
'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;