handsontable
Version:
Handsontable is a JavaScript Data Grid available for React, Angular and Vue.
122 lines (119 loc) • 3.73 kB
JavaScript
;
exports.__esModule = true;
exports.runSourceDataValidator = runSourceDataValidator;
exports.runSourceDataValidators = runSourceDataValidators;
var _console = require("../helpers/console");
var _function = require("../helpers/function");
var _mixed = require("../helpers/mixed");
/**
* Runs source-data validator for a single cell.
*
* @param {*} value The value of the cell.
* @param {CellProperties} cellMeta The cell meta object.
* @param {string} [source] The call source identifier.
* @returns {boolean} True if valid, false otherwise.
*/
function runSourceDataValidator(value, cellMeta, source) {
const validator = cellMeta.sourceDataValidator;
if (!(0, _function.isFunction)(validator)) {
return true;
}
const isValid = validator(value, cellMeta, source);
if (isValid === true) {
return true;
}
const {
row,
col,
sourceDataWarningMessage,
allowInvalid
} = cellMeta;
if (sourceDataWarningMessage) {
logSourceDataWarning(sourceDataWarningMessage, [{
row,
col,
value
}]);
}
return allowInvalid === true;
}
/**
* Runs source-data validators for all cells and emits one aggregated warning per cell type
* message when invalid values are found, to avoid spamming the console.
*
* @param {Core} hotInstance The Handsontable instance.
* @param {string} [source] The call source identifier.
*/
function runSourceDataValidators(hotInstance, source) {
const rowSourceCount = hotInstance.countSourceRows();
const colSourceCount = hotInstance.countSourceCols();
if (rowSourceCount === 0 || colSourceCount === 0) {
return;
}
const invalidByMessageType = new Map();
for (let row = 0; row < rowSourceCount; row += 1) {
for (let col = 0; col < colSourceCount; col += 1) {
const visualRow = hotInstance.toVisualRow(row);
const visualColumn = hotInstance.toVisualColumn(col);
if (visualRow === null || visualColumn === null) {
continue;
}
const cellMeta = hotInstance.getCellMeta(visualRow, visualColumn);
const {
sourceDataWarningMessage,
sourceDataValidator,
allowInvalid
} = cellMeta;
if (!(0, _function.isFunction)(sourceDataValidator)) {
continue;
}
const dataSource = hotInstance._getDataSource();
const value = dataSource.getAtCell(row, col, null);
const isValid = sourceDataValidator(value, cellMeta, source);
if (isValid === true) {
continue;
}
if (allowInvalid === false) {
dataSource.setAtCell(row, col, null);
}
if (sourceDataWarningMessage) {
var _invalidByMessageType;
const message = sourceDataWarningMessage;
const list = (_invalidByMessageType = invalidByMessageType.get(message)) !== null && _invalidByMessageType !== void 0 ? _invalidByMessageType : [];
list.push({
row,
col,
value,
message
});
invalidByMessageType.set(message, list);
}
}
}
invalidByMessageType.forEach((items, message) => {
logSourceDataWarning(message, items);
});
}
/**
* Logs a source data warning.
*
* @param {string} message The message to log.
* @param {Array} items The list of affected cells.
*/
function logSourceDataWarning(message, items) {
(0, _console.logAggregatedItems)({
logFunction: _console.warn,
message,
items,
itemFormatter: _ref => {
let {
row,
col,
value
} = _ref;
const rawValue = (0, _mixed.stringify)(value);
const shortValue = rawValue.length > 64 ? `${rawValue.slice(0, 64)}...` : rawValue;
return `row ${row}, col ${col}, value: "${shortValue}"`;
}
});
}