mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-23 12:27:48 +00:00
feat(tag): display tags with table (#7311)
This commit is contained in:
107
frontend/src/components/sf-table/utils/get-event-transfer.js
Normal file
107
frontend/src/components/sf-table/utils/get-event-transfer.js
Normal file
@@ -0,0 +1,107 @@
|
||||
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;
|
Reference in New Issue
Block a user