mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-22 11:57:34 +00:00
108 lines
3.2 KiB
JavaScript
108 lines
3.2 KiB
JavaScript
import TRANSFER_TYPES from '../constants/transfer-types';
|
|
|
|
const { FRAGMENT, HTML, TEXT } = TRANSFER_TYPES;
|
|
|
|
function getEventTransfer(event) {
|
|
const transfer = event.dataTransfer || event.clipboardData;
|
|
let dtableFragment = getType(transfer, FRAGMENT);
|
|
let html = getType(transfer, HTML);
|
|
let text = getType(transfer, TEXT);
|
|
let files = getFiles(transfer);
|
|
|
|
// paste sf-metadata
|
|
if (dtableFragment) {
|
|
return { [TRANSFER_TYPES.METADATA_FRAGMENT]: JSON.parse(dtableFragment), type: TRANSFER_TYPES.METADATA_FRAGMENT };
|
|
}
|
|
|
|
// paste html
|
|
if (html) {
|
|
let copiedTableNode = (new DOMParser()).parseFromString(html, HTML).querySelector('table');
|
|
if (copiedTableNode) {
|
|
return { [TRANSFER_TYPES.METADATA_FRAGMENT]: html2TableFragment(copiedTableNode), html, text, type: 'html' };
|
|
}
|
|
return { [TRANSFER_TYPES.METADATA_FRAGMENT]: text2TableFragment(text), html, text, type: 'html' };
|
|
}
|
|
|
|
// paste local picture or other files here
|
|
if (files && files.length) {
|
|
return { [TRANSFER_TYPES.METADATA_FRAGMENT]: text2TableFragment(text), 'files': files, type: 'files' };
|
|
}
|
|
|
|
// paste text
|
|
if (text) {
|
|
return { [TRANSFER_TYPES.METADATA_FRAGMENT]: text2TableFragment(text), text, type: 'text' };
|
|
}
|
|
}
|
|
|
|
function getType(transfer, type) {
|
|
if (!transfer.types || !transfer.types.length) {
|
|
// COMPAT: In IE 11, there is no `types` field but `getData('Text')`
|
|
// is supported`. (2017/06/23)
|
|
return type === TEXT ? transfer.getData('Text') || null : null;
|
|
}
|
|
|
|
return transfer.getData(type);
|
|
}
|
|
|
|
function text2TableFragment(data) {
|
|
let formattedData = data ? data.replace(/\r/g, '') : '';
|
|
let dataSplitted = formattedData.split('\n');
|
|
let rowSplitted = dataSplitted[0].split('\t');
|
|
let copiedColumns = rowSplitted.map((value, j) => ({ key: `col${j}`, type: 'text' }));
|
|
let copiedRecords = [];
|
|
dataSplitted.forEach((row) => {
|
|
let obj = {};
|
|
if (row) {
|
|
row = row.split('\t');
|
|
row.forEach((col, j) => {
|
|
obj[`col${j}`] = col;
|
|
});
|
|
}
|
|
copiedRecords.push(obj);
|
|
});
|
|
|
|
return { copiedRecords, copiedColumns };
|
|
}
|
|
|
|
function html2TableFragment(tableNode) {
|
|
let trs = tableNode.querySelectorAll('tr');
|
|
let tds = trs[0].querySelectorAll('td');
|
|
let copiedColumns = [];
|
|
let copiedRecords = [];
|
|
tds.forEach((td, i) => {
|
|
copiedColumns.push({ key: `col${i}`, type: 'text' });
|
|
});
|
|
trs.forEach((tr) => {
|
|
let row = {};
|
|
let cells = tr.querySelectorAll('td');
|
|
cells.forEach((cell, i) => {
|
|
row[`col${i}`] = cell.innerText;
|
|
});
|
|
copiedRecords.push(row);
|
|
});
|
|
return { copiedRecords, copiedColumns };
|
|
}
|
|
|
|
function getFiles(transfer) {
|
|
let files;
|
|
try {
|
|
// Get and normalize files if they exist.
|
|
if (transfer.items && transfer.items.length) {
|
|
files = Array.from(transfer.items)
|
|
.map(item => (item.kind === 'file' ? item.getAsFile() : null))
|
|
.filter(exists => exists);
|
|
} else if (transfer.files && transfer.files.length) {
|
|
files = Array.from(transfer.files);
|
|
}
|
|
} catch (err) {
|
|
if (transfer.files && transfer.files.length) {
|
|
files = Array.from(transfer.files);
|
|
}
|
|
}
|
|
return files;
|
|
}
|
|
|
|
export { text2TableFragment };
|
|
|
|
export default getEventTransfer;
|