dtable-utils
Version:
dtable common utils
412 lines (393 loc) • 17.3 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
var _toConsumableArray = require('@babel/runtime/helpers/toConsumableArray');
var core$1 = require('../row/core.js');
var row = require('../table/row.js');
var core = require('./core.js');
var date = require('../date.js');
var date$1 = require('../column/date.js');
var collaborator = require('../cell-value-get/collaborator.js');
var geolocation = require('../cell-value-get/geolocation.js');
var cellValue = require('../cell-value-get/cell-value.js');
var checkbox = require('../sort/sort-column/checkbox.js');
var collaborator$1 = require('../sort/sort-column/collaborator.js');
var date$2 = require('../sort/sort-column/date.js');
var number = require('../sort/sort-column/number.js');
var text = require('../sort/sort-column/text.js');
var cellType = require('../constants/cell-type.js');
var column = require('../constants/column.js');
var formula = require('../constants/formula.js');
var formula$1 = require('../sort/sort-column/formula.js');
var link = require('../sort/sort-column/link.js');
var department = require('../sort/sort-column/department.js');
var multipleSelect = require('../sort/sort-column/multiple-select.js');
var singleSelect = require('../sort/sort-column/single-select.js');
var group = require('../constants/group.js');
var sort = require('../constants/sort.js');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
var _toConsumableArray__default = /*#__PURE__*/_interopDefaultLegacy(_toConsumableArray);
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 _getCellValue = function _getCellValue(row, formulaRows, groupby) {
var column_key = groupby.column_key,
column = groupby.column;
var cellValue = row[column_key];
var type = column.type;
if (formula.FORMULA_COLUMN_TYPES_MAP[type]) {
var formulaRow = formulaRows[row._id] || {};
return formulaRow[column_key];
}
// link column value is calculate as a special formula column
if (type === cellType.CellType.LINK) {
var _formulaRow = formulaRows[row._id] || {};
return _formulaRow[column_key] || [];
}
return cellValue;
};
var _getFormattedCellValue = function _getFormattedCellValue(cellValue$1, groupby) {
var column = groupby.column,
countType = groupby.count_type;
var columnType = column.type,
columnData = column.data;
switch (columnType) {
case cellType.CellType.TEXT:
case cellType.CellType.URL:
case cellType.CellType.EMAIL:
case cellType.CellType.LAST_MODIFIER:
case cellType.CellType.CREATOR:
case cellType.CellType.DEPARTMENT_SINGLE_SELECT:
{
return cellValue$1 || null;
}
case cellType.CellType.DATE:
case cellType.CellType.CTIME:
case cellType.CellType.MTIME:
{
return date.DateUtils.getDateByGranularity(cellValue$1, countType) || null;
}
case cellType.CellType.NUMBER:
case cellType.CellType.DURATION:
case cellType.CellType.RATE:
{
return cellValue$1 || cellValue$1 === 0 ? cellValue$1 : null;
}
case cellType.CellType.CHECKBOX:
{
return !!cellValue$1;
}
case cellType.CellType.SINGLE_SELECT:
{
return cellValue$1 || null;
}
case cellType.CellType.MULTIPLE_SELECT:
{
return Array.isArray(cellValue$1) ? cellValue$1 : [];
}
case cellType.CellType.COLLABORATOR:
{
return Array.isArray(cellValue$1) ? cellValue$1 : [];
}
case cellType.CellType.GEOLOCATION:
{
return geolocation.getGeolocationByGranularity(cellValue$1, countType);
}
case cellType.CellType.FORMULA:
case cellType.CellType.LINK_FORMULA:
{
var _ref = columnData || {},
result_type = _ref.result_type;
if (result_type === formula.FORMULA_RESULT_TYPE.NUMBER) {
return cellValue$1 || cellValue$1 === 0 ? cellValue$1 : null;
}
if (result_type === formula.FORMULA_RESULT_TYPE.DATE) {
return date.DateUtils.getDateByGranularity(cellValue$1, countType) || null;
}
if (result_type === formula.FORMULA_RESULT_TYPE.BOOL) {
return !!cellValue$1;
}
if (result_type === formula.FORMULA_RESULT_TYPE.ARRAY) {
var newCellValue = cellValue$1;
if (date$1.isDateColumn(column) && Array.isArray(cellValue$1) && cellValue$1.length > 0) {
return date.DateUtils.getDateByGranularity(cellValue$1[0], countType) || null;
}
// convert to string
return cellValue.getFormulaDisplayString(newCellValue, columnData) || null;
}
return cellValue$1 || null;
}
case cellType.CellType.LINK:
{
if (!Array.isArray(cellValue$1) || cellValue$1.length === 0) {
return [];
}
return cellValue$1.map(function (linked) {
return linked.display_value;
});
}
default:
{
return null;
}
}
};
var _getStrCellValue = function _getStrCellValue(cellValue, columnType) {
var sCellValue = null;
if (column.SINGLE_CELL_VALUE_COLUMN_TYPE_MAP[columnType]) {
sCellValue = typeof cellValue === 'string' ? cellValue : String(cellValue);
} else if (column.MULTIPLE_CELL_VALUE_COLUMN_TYPE_MAP[columnType]) {
sCellValue = _toConsumableArray__default["default"](cellValue).sort().toString();
}
return sCellValue;
};
var _findGroupIndexWithMultipleGroupbys = function _findGroupIndexWithMultipleGroupbys(sCellValue, cellValue2GroupIndexMap, groupsLength) {
var target = cellValue2GroupIndexMap[sCellValue];
if (target && target.index > -1) {
return target.index;
}
// eslint-disable-next-line
cellValue2GroupIndexMap[sCellValue] = {};
// eslint-disable-next-line
cellValue2GroupIndexMap[sCellValue].subgroups = {};
// eslint-disable-next-line
cellValue2GroupIndexMap[sCellValue].index = groupsLength;
return -1;
};
var _findGroupIndex = function _findGroupIndex(sCellValue, cellValue2GroupIndexMap, groupsLength) {
var index = cellValue2GroupIndexMap[sCellValue];
if (index > -1) {
return index;
}
// eslint-disable-next-line
cellValue2GroupIndexMap[sCellValue] = groupsLength;
return -1;
};
var _getSortedGroups = function getSortedGroups(groups, groupbys, value, level) {
var _groupbys$level = groupbys[level],
column$1 = _groupbys$level.column,
sort_type = _groupbys$level.sort_type;
var collaborators = value.collaborators;
var columnType = column$1.type,
columnData = column$1.data;
var normalizedSortType = sort_type || sort.SORT_TYPE.UP;
var option_id_index_map = {};
if (columnType === cellType.CellType.SINGLE_SELECT || columnType === cellType.CellType.MULTIPLE_SELECT) {
var _ref2 = columnData || {},
options = _ref2.options;
if (Array.isArray(options)) {
options.forEach(function (option, index) {
option_id_index_map[option.id] = index;
});
}
}
groups.sort(function (currGroupRow, nextGroupRow) {
var currCellVal = currGroupRow.cell_value;
var nextCellVal = nextGroupRow.cell_value;
if (sort.SORT_COLUMN_OPTIONS.includes(columnType)) {
var sortResult;
if (sort.TEXT_SORTER_COLUMN_TYPES.includes(columnType)) {
sortResult = text.sortText(currCellVal, nextCellVal, normalizedSortType);
} else if (sort.NUMBER_SORTER_COLUMN_TYPES.includes(columnType)) {
sortResult = number.sortNumber(currCellVal, nextCellVal, normalizedSortType);
} else if (column.DATE_COLUMN_OPTIONS.includes(columnType)) {
sortResult = date$2.sortDate(currCellVal, nextCellVal, normalizedSortType);
} else if (columnType === cellType.CellType.DEPARTMENT_SINGLE_SELECT) {
sortResult = department.sortDepartment(currCellVal, nextCellVal, normalizedSortType);
} else if (columnType === cellType.CellType.CHECKBOX) {
sortResult = checkbox.sortCheckbox(currCellVal, nextCellVal, normalizedSortType);
} else if (columnType === cellType.CellType.COLLABORATOR) {
var currCollaborators = currCellVal;
var nextCollaborators = nextCellVal;
if (collaborators) {
currCollaborators = collaborator.getCollaboratorsNames(currCollaborators, collaborators);
nextCollaborators = collaborator.getCollaboratorsNames(nextCollaborators, collaborators);
}
sortResult = collaborator$1.sortCollaborator(currCollaborators, nextCollaborators, normalizedSortType);
} else if (columnType === cellType.CellType.SINGLE_SELECT) {
sortResult = singleSelect.sortSingleSelect(currCellVal, nextCellVal, {
sort_type: normalizedSortType,
option_id_index_map: option_id_index_map
});
} else if (columnType === cellType.CellType.MULTIPLE_SELECT) {
sortResult = multipleSelect.sortMultipleSelect(currCellVal, nextCellVal, {
sort_type: normalizedSortType,
option_id_index_map: option_id_index_map
});
} else if (formula.FORMULA_COLUMN_TYPES_MAP[columnType]) {
var currOriginalCellVal = currGroupRow.original_cell_value;
var nextOriginalCellVal = nextGroupRow.original_cell_value;
sortResult = formula$1.sortFormula(currOriginalCellVal, nextOriginalCellVal, normalizedSortType, {
columnData: columnData,
value: value
});
} else if (columnType === cellType.CellType.LINK) {
var _currOriginalCellVal = currGroupRow.original_cell_value;
var _nextOriginalCellVal = nextGroupRow.original_cell_value;
sortResult = link.sortLink(_currOriginalCellVal, _nextOriginalCellVal, normalizedSortType, {
columnData: columnData,
value: value
});
}
return sortResult;
}
if (currCellVal === '') return 1;
if (nextCellVal === '') return -1;
return 0;
});
// for nested group.
var isNestedGroup = Array.isArray(groups[0].subgroups) && groups[0].subgroups.length > 0;
if (isNestedGroup) {
var nextLevel = level + 1;
// eslint-disable-next-line
groups = groups.map(function (group) {
var sortedSubgroups = _getSortedGroups(group.subgroups, groupbys, value, nextLevel);
return _objectSpread(_objectSpread({}, group), {}, {
subgroups: sortedSubgroups
});
});
}
return groups;
};
var groupRowsWithMultipleGroupbys = function groupRowsWithMultipleGroupbys(groupbys, rows, formulaRows, value) {
var validGroupbys = groupbys.length > group.MAX_GROUP_LEVEL ? groupbys.slice(0, group.MAX_GROUP_LEVEL) : _toConsumableArray__default["default"](groupbys);
var groups = [];
var cellValue2GroupIndexMap = {};
rows.forEach(function (row) {
var rowId = row._id;
var updatedGroup;
var updateCellValue2GroupIndexMap;
for (var level = 0; level < validGroupbys.length; level++) {
var currentGroupby = validGroupbys[level];
var column = currentGroupby.column,
column_key = currentGroupby.column_key;
var columnType = column.type;
var cellValue = _getCellValue(row, formulaRows, currentGroupby);
var formattedValue = _getFormattedCellValue(cellValue, currentGroupby);
var sCellValue = _getStrCellValue(formattedValue, columnType);
var group = {
cell_value: formattedValue,
original_cell_value: cellValue,
row_ids: null,
column_key: column_key,
subgroups: [],
summaries: {}
};
if (level === 0) {
var groupedRowIndex = _findGroupIndexWithMultipleGroupbys(sCellValue, cellValue2GroupIndexMap, groups.length);
updateCellValue2GroupIndexMap = cellValue2GroupIndexMap[sCellValue].subgroups;
if (groupedRowIndex < 0) {
groups.push(group);
updatedGroup = groups[groups.length - 1];
} else {
updatedGroup = groups[groupedRowIndex];
}
} else {
var _groupedRowIndex = _findGroupIndexWithMultipleGroupbys(sCellValue, updateCellValue2GroupIndexMap, updatedGroup.subgroups.length);
updateCellValue2GroupIndexMap = updateCellValue2GroupIndexMap[sCellValue].subgroups;
if (_groupedRowIndex < 0) {
updatedGroup.subgroups.push(group);
updatedGroup = updatedGroup.subgroups[updatedGroup.subgroups.length - 1];
} else {
updatedGroup = updatedGroup.subgroups[_groupedRowIndex];
}
// update row_ids in the deepest group.
if (level === validGroupbys.length - 1) {
if (!updatedGroup.row_ids) {
updatedGroup.row_ids = [rowId];
} else {
updatedGroup.row_ids.push(rowId);
}
}
}
}
});
groups = _getSortedGroups(groups, validGroupbys, value, 0);
return groups;
};
/**
* Group table rows
* @param {array} groupbys e.g. [{ column_key, count_type, column, ... }, ...]
* @param {array} rows e.g. [{ _id, ... }, ...]
* @param {object} formulaRows computed value of formula, link-formula, link etc.
* @param {object} value e.g. { collaborators, ... }
* @returns groups: [{
* cell_value, original_cell_value, column_key,
row_ids, subgroups, summaries, ...}, ...], array
*/
var groupTableRows = function groupTableRows(groupbys, rows, formulaRows, value) {
if (groupbys.length === 0) {
return [];
}
if (groupbys.length > 1) {
return groupRowsWithMultipleGroupbys(groupbys, rows, formulaRows, value);
}
var groupby = groupbys[0];
var column_key = groupby.column_key,
column = groupby.column;
var columnType = column.type;
var groups = [];
var cellValue2GroupIndexMap = {};
rows.forEach(function (r) {
var cellValue = _getCellValue(r, formulaRows, groupby);
var formattedValue = _getFormattedCellValue(cellValue, groupby);
var sCellValue = _getStrCellValue(formattedValue, columnType);
var groupedRowIndex = _findGroupIndex(sCellValue, cellValue2GroupIndexMap, groups.length);
if (groupedRowIndex > -1) {
groups[groupedRowIndex].row_ids.push(r._id);
} else {
groups.push({
cell_value: formattedValue,
original_cell_value: cellValue,
column_key: column_key,
row_ids: [r._id],
subgroups: null,
summaries: {}
});
}
});
// sort groups
groups = _getSortedGroups(groups, groupbys, value, 0);
return groups;
};
/**
* Group view rows
* @param {array} groupbys e.g. [{ column_key, count_type, column, ... }, ...]
* @param {object} table e.g. { id_row_map, ... }
* @param {array} rowsIds e.g. [ row._id, ...]
* @param {object} formulaRows computed value of formula, link-formula, link etc.
* @param {object} value e.g. { collaborators, ... }
* @returns groups: [{
* cell_value, original_cell_value, column_key,
row_ids, subgroups, summaries, ...}, ...], array
*/
var groupViewRows = function groupViewRows(groupbys, table, rowsIds, formulaRows, value) {
if (rowsIds.length === 0) {
return [];
}
var rowsData = row.getRowsByIds(table, rowsIds);
return groupTableRows(groupbys, rowsData, formulaRows, value);
};
/**
* Group rows
* The "formulaRows" must be supplied if you want group rows by formula/link-formula/link columns
* @param {array} groupbys e.g. [{ column_key, count_type, ... }, ...]
* @param {array} rows e.g. table rows: [{ _id, ... }, ...] | view rows: [ row._id, ...]
* @param {object} table e.g. { id_row_map, columns, ... }
* @param {object} value e.g. { collaborators, ... }
* @param {object} formulaRows computed value of formula, link-formula, link etc.
* @returns groups: [{
* cell_value, original_cell_value, column_key,
row_ids, subgroups, summaries, ...}, ...], array
*/
var getGroupedRowsWithoutFormulaCalculation = function getGroupedRowsWithoutFormulaCalculation(groupbys, rows, table, value) {
var _ref3 = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {},
_ref3$formulaRows = _ref3.formulaRows,
formulaRows = _ref3$formulaRows === void 0 ? null : _ref3$formulaRows;
var columns = table.columns;
var validGroupbys = core.deleteInvalidGroupby(groupbys, columns, table, value);
return core$1.isTableRows(rows) ? groupTableRows(validGroupbys, rows, formulaRows, value) : groupViewRows(validGroupbys, table, rows, formulaRows, value);
};
exports.getGroupedRowsWithoutFormulaCalculation = getGroupedRowsWithoutFormulaCalculation;
exports.groupTableRows = groupTableRows;
exports.groupViewRows = groupViewRows;