vxe-table-select-area
Version:
一个基于 vxe-table 的可区域选中复制、粘贴的组件
402 lines (389 loc) • 12 kB
JavaScript
;
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] = '';
});
}
});
}