UNPKG

vxe-table-select-area

Version:

一个基于 vxe-table 的可区域选中复制、粘贴的组件

402 lines (389 loc) 12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.decodeSpreadsheetStr = decodeSpreadsheetStr; exports.encodeToSpreadsheetStr = encodeToSpreadsheetStr; exports.onAfterCopy = onAfterCopy; exports.onAfterCut = onAfterCut; exports.onAfterDelete = onAfterDelete; exports.onAfterPaste = onAfterPaste; exports.onBeforeCopy = onBeforeCopy; exports.onBeforeCut = onBeforeCut; exports.onBeforeDelete = onBeforeDelete; exports.onBeforePaste = onBeforePaste; /* eslint-disable brace-style */ /* eslint-disable no-void */ var regUniversalNewLine = /^(\r\n|\n\r|\r|\n)/; var regNextCellNoQuotes = /^[^\t\r\n]+/; var regNextEmptyCell = /^\t/; /** * @decodeSpreadsheetStr * @desc Decode spreadsheet string into array. refer from http://github.com/warpech/sheetclip/ * @param {string} str The string to parse. * @returns {array} */ function decodeSpreadsheetStr(str) { var arr = [['']]; if (str.length === 0) { return arr; } var column = 0; var row = 0; var lastLength; while (str.length > 0) { if (lastLength === str.length) { // In the case If in last cycle we didn't match anything, we have to leave the infinite loop break; } lastLength = str.length; if (str.match(regNextEmptyCell)) { str = str.replace(regNextEmptyCell, ''); column += 1; arr[row][column] = ''; } else if (str.match(regUniversalNewLine)) { str = str.replace(regUniversalNewLine, ''); column = 0; row += 1; arr[row] = ['']; } else { var nextCell = ''; if (str.startsWith('"')) { var quoteNo = 0; var isStillCell = true; while (isStillCell) { var nextChar = str.slice(0, 1); if (nextChar === '"') { quoteNo += 1; } nextCell += nextChar; str = str.slice(1); if (str.length === 0 || str.match(/^[\t\r\n]/) && quoteNo % 2 === 0) { isStillCell = false; } } nextCell = nextCell.replace(/^"/, '').replace(/"$/, '').replace(/["]*/g, function (match) { return new Array(Math.floor(match.length / 2)).fill('"').join(''); }); } else { var matchedText = str.match(regNextCellNoQuotes); nextCell = matchedText ? matchedText[0] : ''; str = str.slice(nextCell.length); } arr[row][column] = nextCell; } } // 去除 excel 最后一个多余的换行数据 if (Array.isArray(arr) && arr.length > 1) { if (arr[arr.length - 1].length === 1 && arr[arr.length - 1][0] === '') { arr = arr.slice(0, arr.length - 1); } } return arr; } /** * @decodeSpreadsheetStr * @desc encode array to spreadsheet string. refer from http://github.com/warpech/sheetclip/ * @param {array} str The string to parse. * @returns {string} */ function encodeToSpreadsheetStr(arr) { var r; var rLen; var c; var cLen; var str = ''; var val; for (r = 0, rLen = arr.length; r < rLen; r += 1) { cLen = arr[r].length; for (c = 0; c < cLen; c += 1) { if (c > 0) { str += '\t'; } val = arr[r][c]; if (typeof val === 'string') { if (val.indexOf('\n') > -1) { str += "\"".concat(val.replace(/"/g, '""'), "\""); } else { str += val; } } else if (val === null || val === void 0) { // void 0 resolves to undefined str += ''; } else { str += val; } } if (r !== rLen - 1) { str += '\n'; } } return str; } /** * @onBeforeCopy * @desc on before copy * @param {Event} event * @return {selectionRangeIndexes,selectionRangeKeys,data} */ function onBeforeCopy(_ref) { var cellSelectionRangeData = _ref.cellSelectionRangeData, selectionRangeData = _ref.selectionRangeData, colgroups = _ref.colgroups, allRowKeys = _ref.allRowKeys; var leftColKey = cellSelectionRangeData.leftColKey, rightColKey = cellSelectionRangeData.rightColKey, topRowKey = cellSelectionRangeData.topRowKey, bottomRowKey = cellSelectionRangeData.bottomRowKey; var selectionRangeIndexes = { startColIndex: colgroups.findIndex(function (x) { return x.key === leftColKey; }), endColIndex: colgroups.findIndex(function (x) { return x.key === rightColKey; }), startRowIndex: allRowKeys.indexOf(topRowKey), endRowIndex: allRowKeys.indexOf(bottomRowKey) }; var selectionRangeKeys = { startColKey: leftColKey, endColKey: rightColKey, startRowKey: topRowKey, endRowKey: bottomRowKey }; var response = { selectionRangeIndexes: selectionRangeIndexes, selectionRangeKeys: selectionRangeKeys, data: selectionRangeData }; return response; } /** * @onAfterCopy * @desc on after copy * @param {Event} event * @return */ function onAfterCopy(_ref2) { var event = _ref2.event, selectionRangeData = _ref2.selectionRangeData; var spreadsheetStr = encodeToSpreadsheetStr(selectionRangeData); if (event.clipboardData) { event.clipboardData.setData('text/plain', spreadsheetStr); } // IE browser else if (window.clipboardData) { window.clipboardData.setData('Text', spreadsheetStr); } } /** * @onBeforePaste * @desc on before paste * @param {Event} event * @return */ function onBeforePaste(_ref3) { var event = _ref3.event, cellSelectionRangeData = _ref3.cellSelectionRangeData, colgroups = _ref3.colgroups, allRowKeys = _ref3.allRowKeys; var pastedData; if (event.clipboardData) { pastedData = event.clipboardData.getData('text/plain'); } // IE browser else if (window.clipboardData) { pastedData = window.clipboardData.getData('Text'); } if (typeof pastedData !== 'string') { return null; } var decodePasteData = decodeSpreadsheetStr(pastedData); var startColIndex = colgroups.findIndex(function (x) { return x.key === cellSelectionRangeData.leftColKey; }); var endColIndex = Math.min(startColIndex + decodePasteData[0].length - 1, colgroups.length - 1); var startRowIndex = allRowKeys.indexOf(cellSelectionRangeData.topRowKey); var endRowIndex = Math.min(startRowIndex + decodePasteData.length - 1, allRowKeys.length - 1); var response = { selectionRangeIndexes: { startColIndex: startColIndex, endColIndex: endColIndex, startRowIndex: startRowIndex, endRowIndex: endRowIndex }, selectionRangeKeys: { startColKey: colgroups[startColIndex].key, endColKey: colgroups[endColIndex].key, startRowKey: allRowKeys[startRowIndex], endRowKey: allRowKeys[endRowIndex] }, data: [] }; var sourceFieldNames = colgroups.slice(startColIndex, endColIndex + 1).map(function (x) { return x.field; }); response.data = decodePasteData.slice(0, endRowIndex - startRowIndex + 1).map(function (rowData) { var newRow = {}; rowData.forEach(function (cellData, cellIndex) { if (cellIndex <= endColIndex - startColIndex) { newRow[sourceFieldNames[cellIndex]] = cellData; } }); return newRow; }); return response; } /** * @onAfterPaste * @desc on after paste * @param {Event} event * @return */ function onAfterPaste(_ref4) { var tableData = _ref4.tableData, beforePasteResponse = _ref4.beforePasteResponse; var pasteData = beforePasteResponse.data, selectionRangeIndexes = beforePasteResponse.selectionRangeIndexes; pasteData.forEach(function (rowData, rowIndex) { Object.assign(tableData[selectionRangeIndexes.startRowIndex + rowIndex], rowData); }); } /** * @onBeforeCut * @desc on before cut * @param {Event} event * @return {selectionRangeIndexes,selectionRangeKeys,data} */ function onBeforeCut(_ref5) { var cellSelectionRangeData = _ref5.cellSelectionRangeData, selectionRangeData = _ref5.selectionRangeData, colgroups = _ref5.colgroups, allRowKeys = _ref5.allRowKeys; var leftColKey = cellSelectionRangeData.leftColKey, rightColKey = cellSelectionRangeData.rightColKey, topRowKey = cellSelectionRangeData.topRowKey, bottomRowKey = cellSelectionRangeData.bottomRowKey; var selectionRangeIndexes = { startColIndex: colgroups.findIndex(function (x) { return x.key === leftColKey; }), endColIndex: colgroups.findIndex(function (x) { return x.key === rightColKey; }), startRowIndex: allRowKeys.indexOf(topRowKey), endRowIndex: allRowKeys.indexOf(bottomRowKey) }; var selectionRangeKeys = { startColKey: leftColKey, endColKey: rightColKey, startRowKey: topRowKey, endRowKey: bottomRowKey }; var response = { selectionRangeIndexes: selectionRangeIndexes, selectionRangeKeys: selectionRangeKeys, data: selectionRangeData }; return response; } /** * @onAfterCut * @desc on after cut * @param {Event} event * @return */ function onAfterCut(_ref6) { var event = _ref6.event, tableData = _ref6.tableData, colgroups = _ref6.colgroups, selectionRangeData = _ref6.selectionRangeData, selectionRangeIndexes = _ref6.selectionRangeIndexes; var spreadsheetStr = encodeToSpreadsheetStr(selectionRangeData); var endColIndex = selectionRangeIndexes.endColIndex, endRowIndex = selectionRangeIndexes.endRowIndex, startColIndex = selectionRangeIndexes.startColIndex, startRowIndex = selectionRangeIndexes.startRowIndex; // 移除制定的表格数据 var fieldNames = colgroups.slice(startColIndex, endColIndex + 1).map(function (x) { return x.field; }); tableData.forEach(function (rowData, rowIndex) { if (rowIndex >= startRowIndex && rowIndex <= endRowIndex) { fieldNames.forEach(function (fieldName) { rowData[fieldName] = ''; }); } }); if (event.clipboardData) { event.clipboardData.setData('text/plain', spreadsheetStr); } // IE browser else if (window.clipboardData) { window.clipboardData.setData('Text', spreadsheetStr); } } /** * @onBeforeDelete * @desc on before delete * @param {Event} event * @return {selectionRangeIndexes,selectionRangeKeys,data} */ function onBeforeDelete(_ref7) { var cellSelectionRangeData = _ref7.cellSelectionRangeData, selectionRangeData = _ref7.selectionRangeData, colgroups = _ref7.colgroups, allRowKeys = _ref7.allRowKeys; var leftColKey = cellSelectionRangeData.leftColKey, rightColKey = cellSelectionRangeData.rightColKey, topRowKey = cellSelectionRangeData.topRowKey, bottomRowKey = cellSelectionRangeData.bottomRowKey; var selectionRangeIndexes = { startColIndex: colgroups.findIndex(function (x) { return x.key === leftColKey; }), endColIndex: colgroups.findIndex(function (x) { return x.key === rightColKey; }), startRowIndex: allRowKeys.indexOf(topRowKey), endRowIndex: allRowKeys.indexOf(bottomRowKey) }; var selectionRangeKeys = { startColKey: leftColKey, endColKey: rightColKey, startRowKey: topRowKey, endRowKey: bottomRowKey }; var response = { selectionRangeIndexes: selectionRangeIndexes, selectionRangeKeys: selectionRangeKeys, data: selectionRangeData }; return response; } /** * @onAfterDelete * @desc on after delete * @param {Event} event * @return */ function onAfterDelete(_ref8) { var tableData = _ref8.tableData, colgroups = _ref8.colgroups, selectionRangeIndexes = _ref8.selectionRangeIndexes; var endColIndex = selectionRangeIndexes.endColIndex, endRowIndex = selectionRangeIndexes.endRowIndex, startColIndex = selectionRangeIndexes.startColIndex, startRowIndex = selectionRangeIndexes.startRowIndex; // 移除制定的表格数据 var fieldNames = colgroups.slice(startColIndex, endColIndex + 1).map(function (x) { return x.field; }); tableData.forEach(function (rowData, rowIndex) { if (rowIndex >= startRowIndex && rowIndex <= endRowIndex) { fieldNames.forEach(function (fieldName) { rowData[fieldName] = ''; }); } }); }