UNPKG

handsontable

Version:

Handsontable is a JavaScript Data Grid available for React, Angular and Vue.

117 lines (111 loc) 3.39 kB
import "core-js/modules/es.array.push.js"; import "core-js/modules/es.set.difference.v2.js"; import "core-js/modules/es.set.intersection.v2.js"; import "core-js/modules/es.set.is-disjoint-from.v2.js"; import "core-js/modules/es.set.is-subset-of.v2.js"; import "core-js/modules/es.set.is-superset-of.v2.js"; import "core-js/modules/es.set.symmetric-difference.v2.js"; import "core-js/modules/es.set.union.v2.js"; import "core-js/modules/esnext.iterator.constructor.js"; import "core-js/modules/esnext.iterator.for-each.js"; import "core-js/modules/esnext.iterator.map.js"; import { getComparisonFunction } from "../../helpers/feature.mjs"; const sortCompare = getComparisonFunction(); /** * Comparison function for sorting purposes. * * @param {*} a The first value to compare. * @param {*} b The second value to compare. * @returns {number} Returns number from -1 to 1. */ export function sortComparison(a, b) { if (typeof a === 'number' && typeof b === 'number') { return a - b; } return sortCompare(a, b); } /** * Convert raw value into visual value. * * @param {*} value The value to convert. * @param {string} defaultEmptyValue Default value for empty cells. * @returns {*} */ export function toVisualValue(value, defaultEmptyValue) { let visualValue = value; if (visualValue === '') { visualValue = `(${defaultEmptyValue})`; } return visualValue; } /** * Create an array assertion to compare if an element exists in that array (in a more efficient way than .indexOf). * * @param {Array} initialData Values to compare. * @returns {Function} */ export function createArrayAssertion(initialData) { const dataset = new Set(initialData); return function (value) { return dataset.has(value); }; } /** * Convert empty-ish values like null and undefined to an empty string. * * @param {*} value Value to check. * @returns {string} */ export function toEmptyString(value) { return value === null || value === undefined ? '' : value; } /** * Unify column values (remove duplicated values and sort them). * * @param {Array} values An array of values. * @returns {Array} */ export function unifyColumnValues(values) { return Array.from(new Set(values)).map(value => toEmptyString(value)).sort((a, b) => { if (typeof a === 'number' && typeof b === 'number') { return a - b; } if (a === b) { return 0; } return a > b ? 1 : -1; }); } /** * Intersect 'base' values with 'selected' values and return an array of object. * * @param {Array} base An array of base values. * @param {Array} selected An array of selected values. * @param {string} defaultEmptyValue Default value for empty cells. * @param {Function} [callback] A callback function which is invoked for every item in an array. * @returns {Array} */ export function intersectValues(base, selected, defaultEmptyValue, callback) { const result = []; const same = base === selected; let selectedItemsAssertion; if (!same) { selectedItemsAssertion = createArrayAssertion(selected); } base.forEach(value => { let checked = false; if (same || selectedItemsAssertion(value)) { checked = true; } const item = { checked, value, visualValue: toVisualValue(value, defaultEmptyValue) }; if (callback) { callback(item); } result.push(item); }); return result; }