@visactor/vtable
Version:
canvas table width high performance
550 lines (545 loc) • 39.1 kB
JavaScript
;
var __awaiter = this && this.__awaiter || function(thisArg, _arguments, P, generator) {
return new (P || (P = Promise))((function(resolve, reject) {
function fulfilled(value) {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
}
function rejected(value) {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
}
function step(result) {
var value;
result.done ? resolve(result.value) : (value = result.value, value instanceof P ? value : new P((function(resolve) {
resolve(value);
}))).then(fulfilled, rejected);
}
step((generator = generator.apply(thisArg, _arguments || [])).next());
}));
};
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.EventManager = void 0;
const vrender_1 = require("./../vrender"), TABLE_EVENT_TYPE_1 = require("../core/TABLE_EVENT_TYPE"), media_click_1 = require("./media-click"), drill_1 = require("./drill"), sparkline_event_1 = require("./sparkline-event"), stick_text_1 = require("../scenegraph/stick-text"), table_group_1 = require("./listener/table-group"), scroll_bar_1 = require("./listener/scroll-bar"), container_dom_1 = require("./listener/container-dom"), touch_1 = require("./listener/touch"), util_1 = require("./util"), axis_click_1 = require("./self-event-listener/pivot-chart/axis-click"), axis_hover_1 = require("./self-event-listener/pivot-chart/axis-hover"), env_1 = require("../tools/env"), vutils_1 = require("@visactor/vutils"), scroll_1 = require("./scroll"), is_cell_select_highlight_1 = require("../state/select/is-cell-select-highlight"), checkbox_1 = require("./self-event-listener/list-table/checkbox"), button_1 = require("./component/button"), icon_1 = require("./self-event-listener/base-table/icon"), dropdown_menu_1 = require("./self-event-listener/base-table/dropdown-menu"), dbclick_auto_column_width_1 = require("./self-event-listener/base-table/dbclick-auto-column-width"), style_1 = require("../tools/style");
class EventManager {
constructor(table) {
this.isDown = !1, this.isDraging = !1, this.globalEventListeners = [], this._enableTableScroll = !0,
this.cutWaitPaste = !1, this.clipboardCheckTimer = null, this.cutOperationTime = 0,
this.lastClipboardContent = "", this.cutCellRange = null, this.cutRanges = null,
this.copySourceRange = null, this.table = table, this.handleTextStickBindId = [],
this.inertiaScroll = new scroll_1.InertiaScroll(table.stateManager), "node" === env_1.Env.mode || table.options.disableInteraction || (this.bindOuterEvent(),
setTimeout((() => {
this.bindSelfEvent();
}), 0));
}
bindOuterEvent() {
(0, table_group_1.bindTableGroupListener)(this), (0, container_dom_1.bindContainerDomListener)(this),
(0, scroll_bar_1.bindScrollBarListener)(this), (0, touch_1.bindTouchListener)(this),
(0, table_group_1.bindGesture)(this);
}
updateEventBinder() {
setTimeout((() => {
var _a;
this.table.isReleased || ((0, stick_text_1.checkHaveTextStick)(this.table) && 0 === (null === (_a = this.handleTextStickBindId) || void 0 === _a ? void 0 : _a.length) ? (this.handleTextStickBindId.push(this.table.on(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.SCROLL, (e => {
(0, stick_text_1.handleTextStick)(this.table);
}))), this.handleTextStickBindId.push(this.table.on(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.RESIZE_COLUMN_END, (e => {
(0, stick_text_1.handleTextStick)(this.table);
}))), this.handleTextStickBindId.push(this.table.on(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.RESIZE_ROW_END, (e => {
(0, stick_text_1.handleTextStick)(this.table);
})))) : !(0, stick_text_1.checkHaveTextStick)(this.table) && this.handleTextStickBindId && (this.handleTextStickBindId.forEach((id => {
this.table.off(id);
})), this.handleTextStickBindId = []), (0, sparkline_event_1.bindSparklineHoverEvent)(this.table));
}), 0);
}
bindSelfEvent() {
this.table.isReleased || ((0, icon_1.bindIconClickEvent)(this.table), (0, dropdown_menu_1.bindDropdownMenuEvent)(this.table),
this.updateEventBinder(), (0, media_click_1.bindMediaClick)(this.table), (0, dbclick_auto_column_width_1.bindDBClickAutoColumnWidthEvent)(this.table),
this.table.isPivotTable() && (0, drill_1.checkHaveDrill)(this.table) && (0, drill_1.bindDrillEvent)(this.table),
(0, sparkline_event_1.bindSparklineHoverEvent)(this.table), (0, axis_click_1.bindAxisClickEvent)(this.table),
(0, axis_hover_1.bindAxisHoverEvent)(this.table), (0, checkbox_1.bindGroupTitleCheckboxChange)(this.table),
(0, checkbox_1.bindGroupCheckboxTreeChange)(this.table), (0, checkbox_1.bindHeaderCheckboxChange)(this.table),
(0, button_1.bindButtonClickEvent)(this.table));
}
dealTableHover(eventArgsSet) {
if (!eventArgsSet) return void this.table.stateManager.updateHoverPos(-1, -1);
const {eventArgs: eventArgs} = eventArgsSet;
eventArgs ? this.table.stateManager.updateHoverPos(eventArgs.col, eventArgs.row) : this.table.stateManager.updateHoverPos(-1, -1);
}
dealIconHover(eventArgsSet) {
const {eventArgs: eventArgs} = eventArgsSet;
eventArgs ? this.table.stateManager.updateHoverIcon(eventArgs.col, eventArgs.row, eventArgs.target, eventArgs.targetCell) : this.table.stateManager.updateHoverIcon(-1, -1, void 0, void 0);
}
dealMenuHover(eventArgsSet) {}
dealTableSelect(eventArgsSet, isSelectMoving) {
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
if (!eventArgsSet) return this.table.stateManager.updateSelectPos(-1, -1), !1;
const {eventArgs: eventArgs} = eventArgsSet;
if (eventArgs) {
if ("checkbox" === eventArgs.target.name || "radio" === eventArgs.target.name || "switch" === eventArgs.target.name || "button" === eventArgs.target.name) return !1;
if (this.table.isHeader(eventArgs.col, eventArgs.row) && (0, is_cell_select_highlight_1.isCellDisableSelect)(this.table, eventArgs.col, eventArgs.row)) return isSelectMoving || this.table.stateManager.updateSelectPos(-1, -1),
!1;
if (!this.table.isHeader(eventArgs.col, eventArgs.row) && (0, is_cell_select_highlight_1.isCellDisableSelect)(this.table, eventArgs.col, eventArgs.row)) {
if (!isSelectMoving) {
const isHasSelected = !!(null === (_a = this.table.stateManager.select.ranges) || void 0 === _a ? void 0 : _a.length);
this.table.stateManager.updateSelectPos(-1, -1), isHasSelected && this.table.stateManager.endSelectCells(!0, isHasSelected);
}
return !1;
}
if (this.table.isPivotChart() && ("axis-label" === (null === (_b = null == eventArgsSet ? void 0 : eventArgsSet.eventArgs) || void 0 === _b ? void 0 : _b.target.name) || "chart" === (null === (_c = null == eventArgsSet ? void 0 : eventArgsSet.eventArgs) || void 0 === _c ? void 0 : _c.target.type))) return this.table.stateManager.updateSelectPos(-1, -1),
!1;
const shiftMultiSelect = null === (_e = null === (_d = this.table.keyboardOptions) || void 0 === _d ? void 0 : _d.shiftMultiSelect) || void 0 === _e || _e, ctrlMultiSelect = null === (_g = null === (_f = this.table.keyboardOptions) || void 0 === _f ? void 0 : _f.ctrlMultiSelect) || void 0 === _g || _g;
return this.table.stateManager.updateSelectPos("row" === this.table.stateManager.select.selectInline ? this.table.colCount - 1 : eventArgs.col, "col" === this.table.stateManager.select.selectInline ? this.table.rowCount - 1 : eventArgs.row, eventArgs.event.shiftKey && shiftMultiSelect, (eventArgs.event.ctrlKey || eventArgs.event.metaKey) && ctrlMultiSelect, !1, !isSelectMoving && (null === (_j = null === (_h = this.table.options.select) || void 0 === _h ? void 0 : _h.makeSelectCellVisible) || void 0 === _j || _j)),
!0;
}
return !1;
}
dealFillSelect(eventArgsSet, isSelectMoving) {
var _a, _b, _c, _d, _e, _f, _g, _h;
const {eventArgs: eventArgs} = eventArgsSet;
if (eventArgs) {
if ((null === (_b = null === (_a = this.table.stateManager.select) || void 0 === _a ? void 0 : _a.ranges) || void 0 === _b ? void 0 : _b.length) && this.table.stateManager.isFillHandle()) {
let updateRow, updateCol;
const currentRange = this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1];
isSelectMoving && ((0, vutils_1.isValid)(this.table.stateManager.fillHandle.directionRow) || (Math.abs(this.table.stateManager.fillHandle.startY - eventArgsSet.abstractPos.y) >= Math.abs(this.table.stateManager.fillHandle.startX - eventArgsSet.abstractPos.x) ? this.table.stateManager.fillHandle.directionRow = !0 : this.table.stateManager.fillHandle.directionRow = !1),
Math.abs(this.table.stateManager.fillHandle.startY - eventArgsSet.abstractPos.y) >= Math.abs(this.table.stateManager.fillHandle.startX - eventArgsSet.abstractPos.x) ? this.table.stateManager.fillHandle.startY - eventArgsSet.abstractPos.y > 0 ? this.table.stateManager.fillHandle.direction = "top" : this.table.stateManager.fillHandle.direction = "bottom" : this.table.stateManager.fillHandle.startX - eventArgsSet.abstractPos.x > 0 ? this.table.stateManager.fillHandle.direction = "left" : this.table.stateManager.fillHandle.direction = "right",
this.table.stateManager.fillHandle.directionRow ? (updateRow = eventArgs.row, updateCol = currentRange.end.col) : (updateRow = currentRange.end.row,
updateCol = eventArgs.col));
const ctrlMultiSelect = null === (_d = null === (_c = this.table.keyboardOptions) || void 0 === _c ? void 0 : _c.ctrlMultiSelect) || void 0 === _d || _d;
this.table.stateManager.updateSelectPos(isSelectMoving ? updateCol : currentRange.end.col, isSelectMoving ? updateRow : currentRange.end.row, !0, (eventArgs.event.ctrlKey || eventArgs.event.metaKey) && ctrlMultiSelect, !1, !isSelectMoving);
} else {
const shiftMultiSelect = null === (_f = null === (_e = this.table.keyboardOptions) || void 0 === _e ? void 0 : _e.shiftMultiSelect) || void 0 === _f || _f, ctrlMultiSelect = null === (_h = null === (_g = this.table.keyboardOptions) || void 0 === _g ? void 0 : _g.ctrlMultiSelect) || void 0 === _h || _h;
this.table.stateManager.updateSelectPos(eventArgs.col, eventArgs.row, eventArgs.event.shiftKey && shiftMultiSelect, (eventArgs.event.ctrlKey || eventArgs.event.metaKey) && ctrlMultiSelect, !1, !isSelectMoving);
}
return !0;
}
return !1;
}
deelTableSelectAll() {
this.table.stateManager.updateSelectPos(-1, -1, !1, !1, !0), this.table.fireListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.SELECTED_CELL, {
ranges: this.table.stateManager.select.ranges,
col: 0,
row: 0
});
}
dealMenuSelect(eventArgsSet) {}
checkColumnResize(eventArgsSet, update) {
const {eventArgs: eventArgs} = eventArgsSet;
if (this.table.internalProps.enableTreeStickCell && !eventArgs) return !1;
const resizeCol = this.table.scenegraph.getResizeColAt(eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y, null == eventArgs ? void 0 : eventArgs.targetCell);
let useerCustomCanResizeColumn = !0;
return this.table.internalProps.canResizeColumn && !this.table.internalProps.canResizeColumn(resizeCol.col, resizeCol.row, this.table) && (useerCustomCanResizeColumn = !1),
useerCustomCanResizeColumn && this.table._canResizeColumn(resizeCol.col, resizeCol.row) && resizeCol.col >= 0 ? (update && this.table.stateManager.startResizeCol(resizeCol.col, eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y, resizeCol.rightFrozen),
!0) : (this.table.stateManager.isResizeCol() && this.table.stateManager.endResizeCol(),
!1);
}
checkRowResize(eventArgsSet, update) {
const {eventArgs: eventArgs} = eventArgsSet;
if (eventArgs) {
const resizeRow = this.table.scenegraph.getResizeRowAt(eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y, eventArgs.targetCell);
if (this.table._canResizeRow(resizeRow.col, resizeRow.row) && resizeRow.row >= 0) return update && this.table.stateManager.startResizeRow(resizeRow.row, eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y, resizeRow.bottomFrozen),
!0;
}
return !1;
}
cellIsHeaderCheck(eventArgsSet, update) {
const {eventArgs: eventArgs} = eventArgsSet, {col: col, row: row, target: target} = eventArgs;
if (!this.table.isHeader(col, row)) return !1;
return "checkbox" === this.table.getCellType(eventArgs.col, eventArgs.row) && "checkbox" === target.name;
}
checkCellFillhandle(eventArgsSet, update) {
var _a, _b, _c, _d, _e;
let isFillHandle = !1;
if (isFillHandle = "function" == typeof (null === (_a = this.table.options.excelOptions) || void 0 === _a ? void 0 : _a.fillHandle) ? this.table.options.excelOptions.fillHandle({
selectRanges: this.table.stateManager.select.ranges,
table: this.table
}) : null === (_b = this.table.options.excelOptions) || void 0 === _b ? void 0 : _b.fillHandle,
isFillHandle) {
const {eventArgs: eventArgs} = eventArgsSet;
if (eventArgs && (null === (_d = null === (_c = this.table.stateManager.select) || void 0 === _c ? void 0 : _c.ranges) || void 0 === _d ? void 0 : _d.length)) {
const lastCol = Math.max(this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].start.col, this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].end.col), lastRow = Math.max(this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].start.row, this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].end.row), startCol = Math.min(this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].start.col, this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].end.col), startRow = Math.min(this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].start.row, this.table.stateManager.select.ranges[this.table.stateManager.select.ranges.length - 1].end.row);
let lastCellBoundTargetX;
if (lastCol < this.table.colCount - 1) {
lastCellBoundTargetX = this.table.scenegraph.highPerformanceGetCell(lastCol, lastRow).globalAABBBounds.x2;
} else if (0 === startCol) {
lastCellBoundTargetX = this.table.scenegraph.highPerformanceGetCell(0, lastRow).globalAABBBounds.x1;
} else {
lastCellBoundTargetX = this.table.scenegraph.highPerformanceGetCell(startCol - 1, lastRow).globalAABBBounds.x2;
}
const distanceX = Math.abs(eventArgsSet.abstractPos.x - lastCellBoundTargetX);
let lastCellBoundTargetY;
if (lastRow < this.table.rowCount - 1) {
lastCellBoundTargetY = this.table.scenegraph.highPerformanceGetCell(lastCol, lastRow).globalAABBBounds.y2;
} else {
lastCellBoundTargetY = this.table.scenegraph.highPerformanceGetCell(lastCol, startRow - 1).globalAABBBounds.y2;
}
const distanceY = Math.abs(eventArgsSet.abstractPos.y - lastCellBoundTargetY), squareSize = 18;
if ((null === (_e = this.table.stateManager.fillHandle) || void 0 === _e ? void 0 : _e.isFilling) || distanceX <= squareSize / 2 && distanceY <= squareSize / 2) return update && this.table.stateManager.startFillSelect(eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y),
!0;
}
}
return !1;
}
dealColumnResize(xInTable, yInTable) {
this.table.stateManager.updateResizeCol(xInTable, yInTable);
}
dealRowResize(xInTable, yInTable) {
this.table.stateManager.updateResizeRow(xInTable, yInTable);
}
checkColumnMover(eventArgsSet) {
var _a;
const {eventArgs: eventArgs} = eventArgsSet;
return !(!eventArgs || !this.table._canDragHeaderPosition(eventArgs.col, eventArgs.row)) && (this.table.stateManager.startMoveCol(eventArgs.col, eventArgs.row, eventArgsSet.abstractPos.x, eventArgsSet.abstractPos.y, null === (_a = null == eventArgs ? void 0 : eventArgs.event) || void 0 === _a ? void 0 : _a.nativeEvent),
!0);
}
dealColumnMover(x, y, event) {
let col = this.table.getColAtRelativePosition(x), row = this.table.getRowAtRelativePosition(y);
-1 === col && "row" === this.table.stateManager.columnMove.movingColumnOrRow && (col = 0),
-1 === row && "column" === this.table.stateManager.columnMove.movingColumnOrRow && (row = 0),
(0, vutils_1.isValid)(col) && (0, vutils_1.isValid)(row) && this.table.stateManager.updateMoveCol(col, row, x, y, event);
}
startColumnResize(eventArgsSet) {}
dealIconClick(e, eventArgsSet) {
const {eventArgs: eventArgs} = eventArgsSet, {target: target, event: event, col: col, row: row} = eventArgs || {
target: e.target,
event: e,
col: -1,
row: -1
}, icon = target;
if (icon.role && icon.role.startsWith("icon-")) return this.table.fireListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.ICON_CLICK, {
name: icon.name,
x: (icon.globalAABBBounds.x1 + icon.globalAABBBounds.x2) / 2,
y: icon.globalAABBBounds.y2,
col: col,
row: row,
funcType: icon.attribute.funcType,
icon: icon,
event: event
}), !0;
if (target instanceof vrender_1.RichText) {
const icon = target.pickIcon(event.global);
if (icon) return this.table.fireListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.ICON_CLICK, {
name: icon.attribute.id,
x: icon.globalX + icon.globalAABBBounds.width() / 2,
y: icon.globalY + icon.AABBBounds.height(),
col: col,
row: row,
funcType: icon.attribute.funcType,
icon: icon,
event: event
}), !0;
}
return !1;
}
release() {
var _a;
null === (_a = this.gesture) || void 0 === _a || _a.release(), this.globalEventListeners.forEach((item => {
"document" === item.env ? document.removeEventListener(item.name, item.callback) : "body" === item.env ? document.body.removeEventListener(item.name, item.callback) : "window" === item.env ? window.removeEventListener(item.name, item.callback) : "vglobal" === item.env && vrender_1.vglobal.removeEventListener(item.name, item.callback);
})), this.globalEventListeners = [];
}
enableScroll() {
this._enableTableScroll = !0;
}
disableScroll() {
this._enableTableScroll = !1;
}
handleCopy(e, isCut = !1) {
var _a, _b, _c, _d, _e, _f;
return __awaiter(this, void 0, void 0, (function*() {
const table = this.table;
!isCut && (this.cutWaitPaste = !1), this.copySourceRange = null;
const sourceRanges = table.stateManager.select.ranges;
if (sourceRanges && 1 === sourceRanges.length) {
const sourceRange = sourceRanges[0];
this.copySourceRange = {
startCol: Math.min(sourceRange.start.col, sourceRange.end.col),
startRow: Math.min(sourceRange.start.row, sourceRange.end.row)
};
} else if (!(null == sourceRanges ? void 0 : sourceRanges.length)) return void (this.copySourceRange = null);
const data = this.table.getCopyValue(null === (_b = null === (_a = table.options.keyboardOptions) || void 0 === _a ? void 0 : _a.getCopyCellValue) || void 0 === _b ? void 0 : _b.value);
if ((0, vutils_1.isValid)(data)) {
e.preventDefault();
const element = table.getElement();
element && element !== document.activeElement && (element.focus(), yield new Promise((resolve => setTimeout(resolve, 10))));
try {
if (navigator.clipboard && navigator.clipboard.writeText) {
let hasPermission = !0;
if (navigator.permissions && navigator.permissions.query) try {
hasPermission = "granted" === (yield navigator.permissions.query({
name: "clipboard-write"
})).state;
} catch (permissionError) {
hasPermission = !0;
}
if (hasPermission) try {
if (window.ClipboardItem) {
let htmlValues = data;
1 === table.stateManager.select.ranges.length && (null === (_d = null === (_c = table.options.keyboardOptions) || void 0 === _c ? void 0 : _c.getCopyCellValue) || void 0 === _d ? void 0 : _d.html) && (htmlValues = this.table.getCopyValue(null === (_e = table.options.keyboardOptions) || void 0 === _e ? void 0 : _e.getCopyCellValue.html));
const dataHTML = (0, util_1.setDataToHTML)(htmlValues);
yield navigator.clipboard.write([ new ClipboardItem({
"text/html": new Blob([ dataHTML ], {
type: "text/html"
}),
"text/plain": new Blob([ data ], {
type: "text/plain"
})
}) ]);
} else yield navigator.clipboard.writeText(data);
} catch (clipboardError) {
this.fallbackCopyToClipboard(data, e);
} else this.fallbackCopyToClipboard(data, e);
} else this.fallbackCopyToClipboard(data, e);
table.fireListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.COPY_DATA, {
cellRange: table.stateManager.select.ranges,
copyData: data,
isCut: isCut
});
} catch (error) {
this.fallbackCopyToClipboard(data, e);
}
}
(null === (_f = table.keyboardOptions) || void 0 === _f ? void 0 : _f.showCopyCellBorder) && ((0,
style_1.setActiveCellRangeState)(table), table.clearSelected());
}));
}
fallbackCopyToClipboard(data, e) {
try {
if (e.clipboardData) return void e.clipboardData.setData("text/plain", data);
document.activeElement && document.activeElement !== document.body && document.activeElement.blur();
const textArea = document.createElement("textarea");
textArea.value = data, textArea.style.position = "fixed", textArea.style.left = "-999999px",
textArea.style.top = "-999999px", textArea.style.opacity = "0", textArea.setAttribute("readonly", ""),
textArea.setAttribute("aria-hidden", "true"), document.body.appendChild(textArea),
textArea.focus(), textArea.select(), textArea.setSelectionRange(0, data.length);
try {
document.execCommand("copy");
} catch (execError) {} finally {
document.body.removeChild(textArea);
}
} catch (error) {}
}
handleCut(e) {
var _a;
return __awaiter(this, void 0, void 0, (function*() {
this.handleCopy(e, !0), this.cutWaitPaste = !0, this.cutCellRange = this.table.getSelectedCellInfos(),
this.cutRanges = null === (_a = this.table.stateManager.select.ranges) || void 0 === _a ? void 0 : _a.map((r => ({
start: {
col: r.start.col,
row: r.start.row
},
end: {
col: r.end.col,
row: r.end.row
}
}))), this.clipboardCheckTimer && clearTimeout(this.clipboardCheckTimer), this.clipboardCheckTimer = window.setTimeout((() => {
this.cutWaitPaste && (this.cutWaitPaste = !1, this.cutCellRange = null, this.cutRanges = null,
this.clipboardCheckTimer = null);
}), 3e4), this.saveClipboardContent();
}));
}
handlePaste(e) {
this.cutWaitPaste ? this.checkClipboardChanged().then((changed => {
this.executePaste(e), changed || this.clearCutArea(this.table), this.cutWaitPaste && (this.cutWaitPaste = !1,
this.cutCellRange = null, this.cutRanges = null, this.clipboardCheckTimer && (clearTimeout(this.clipboardCheckTimer),
this.clipboardCheckTimer = null));
})).catch((() => {
this.executePaste(e), this.cutWaitPaste && (this.cutWaitPaste = !1, this.cutCellRange = null,
this.clipboardCheckTimer && (clearTimeout(this.clipboardCheckTimer), this.clipboardCheckTimer = null));
})) : this.executePaste(e);
}
executePaste(e) {
var _a, _b, _c;
return __awaiter(this, void 0, void 0, (function*() {
const table = this.table;
if (!(null === (_a = table.editorManager) || void 0 === _a ? void 0 : _a.editingEditor)) {
if (table.changeCellValues && (null === (_b = table.stateManager.select.ranges) || void 0 === _b ? void 0 : _b.length) > 0) try {
if (navigator.clipboard && navigator.clipboard.read) try {
const clipboardItems = yield navigator.clipboard.read();
let handled = !1;
for (const item of clipboardItems) {
if (item.types.includes("text/html")) {
yield this.pasteHtmlToTable(item), handled = !0;
break;
}
if (item.types.includes("text/plain")) {
yield this.pasteTextToTable(item), handled = !0;
break;
}
}
handled || (yield this.fallbackPasteFromClipboard(e));
} catch (clipboardError) {
yield this.fallbackPasteFromClipboard(e);
} else yield this.fallbackPasteFromClipboard(e);
} catch (error) {
yield this.fallbackPasteFromClipboard(e);
}
(null === (_c = table.keyboardOptions) || void 0 === _c ? void 0 : _c.showCopyCellBorder) && (0,
style_1.clearActiveCellRangeState)(table);
}
}));
}
fallbackPasteFromClipboard(e) {
return __awaiter(this, void 0, void 0, (function*() {
const table = this.table, ranges = table.stateManager.select.ranges, col = Math.min(ranges[0].start.col, ranges[0].end.col), row = Math.min(ranges[0].start.row, ranges[0].end.row);
try {
const element = table.getElement();
element && element !== document.activeElement && (element.focus(), yield new Promise((resolve => setTimeout(resolve, 10))));
const clipboardData = e.clipboardData || window.clipboardData || window.Clipboard;
if (clipboardData) {
const pastedData = clipboardData.getData("text") || clipboardData.getData("Text");
if (pastedData) return void (yield this.processPastedText(pastedData, col, row));
}
} catch (error) {}
}));
}
processPastedText(pastedData, col, row) {
var _a;
return __awaiter(this, void 0, void 0, (function*() {
const table = this.table, rows = pastedData.split("\n"), values = [];
let processedValues;
rows.forEach((function(rowCells) {
const cells = rowCells.split("\t"), rowValues = [];
values.push(rowValues), cells.forEach((function(cell, cellIndex) {
cellIndex === cells.length - 1 && (cell = cell.trim()), rowValues.push(cell);
}));
})), (null === (_a = table.options.keyboardOptions) || void 0 === _a ? void 0 : _a.processFormulaBeforePaste) && this.copySourceRange && (processedValues = table.options.keyboardOptions.processFormulaBeforePaste(values, this.copySourceRange.startCol, this.copySourceRange.startRow, col, row));
const changedCellResults = yield table.changeCellValues(col, row, processedValues || values, !0);
table.hasListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.PASTED_DATA) && table.fireListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.PASTED_DATA, {
col: col,
row: row,
pasteData: processedValues || values,
changedCellResults: changedCellResults
});
}));
}
clearCutArea(table) {
try {
const ranges = this.cutRanges;
if (!ranges || 0 === ranges.length) return;
table.changeCellValuesByRanges(ranges, "");
} catch (error) {}
}
checkClipboardChanged() {
return __awaiter(this, void 0, void 0, (function*() {
if (!navigator.clipboard || !navigator.clipboard.readText) return !1;
try {
return (yield navigator.clipboard.readText()) !== this.lastClipboardContent;
} catch (err) {
return !1;
}
}));
}
saveClipboardContent() {
navigator.clipboard && navigator.clipboard.readText && setTimeout((() => {
navigator.clipboard.readText().then((text => {
this.lastClipboardContent = text;
})).catch((err => {}));
}), 50);
}
pasteHtmlToTable(item) {
const regex = /<tr[^>]*>([\s\S]*?)<\/tr>/g, cellRegex = /<td[^>]*>([\s\S]*?)<\/td>/g, table = this.table, ranges = table.stateManager.select.ranges, selectRangeLength = ranges.length, col = Math.min(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col), row = Math.min(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row), maxCol = Math.max(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col), maxRow = Math.max(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
let pasteValuesColCount = 0, pasteValuesRowCount = 0, values = [];
item.getType("text/html").then((blob => {
blob.text().then((pastedData => __awaiter(this, void 0, void 0, (function*() {
var _a, _b, _c;
if (pastedData && /(<table)|(<TABLE)/g.test(pastedData)) {
const matches = Array.from(pastedData.matchAll(regex));
for (const match of matches) {
const rowContent = match[1], rowValues = Array.from(rowContent.matchAll(cellRegex)).map((cellMatch => cellMatch[1].replace(/(<(?!br)([^>]+)>)/gi, "").replace(/<br(\s*|\/)>[\r\n]?/gim, "\n").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/	/gi, "\t").replace(/ /g, " ")));
values.push(rowValues), pasteValuesColCount = Math.max(pasteValuesColCount, null !== (_a = null == rowValues ? void 0 : rowValues.length) && void 0 !== _a ? _a : 0);
}
let processedValues;
pasteValuesRowCount = null !== (_b = values.length) && void 0 !== _b ? _b : 0, values = this.handlePasteValues(values, pasteValuesRowCount, pasteValuesColCount, maxRow - row + 1, maxCol - col + 1),
(null === (_c = table.options.keyboardOptions) || void 0 === _c ? void 0 : _c.processFormulaBeforePaste) && this.copySourceRange && (processedValues = table.options.keyboardOptions.processFormulaBeforePaste(values, this.copySourceRange.startCol, this.copySourceRange.startRow, col, row));
const changedCellResults = yield table.changeCellValues(col, row, processedValues || values, !0);
table.hasListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.PASTED_DATA) && table.fireListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.PASTED_DATA, {
col: col,
row: row,
pasteData: processedValues || values,
changedCellResults: changedCellResults
});
} else navigator.clipboard.read().then((clipboardItems => {
for (const item of clipboardItems) item.types.includes("text/plain") && item.getType("text/plain").then((blob => {
blob.text().then((data => this._pasteValue(data)));
}));
}));
}))));
}));
}
_pasteValue(pastedData) {
var _a, _b;
return __awaiter(this, void 0, void 0, (function*() {
const table = this.table, ranges = table.stateManager.select.ranges, selectRangeLength = ranges.length, col = Math.min(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col), row = Math.min(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row), maxCol = Math.max(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col), maxRow = Math.max(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
let pasteValuesColCount = 0, pasteValuesRowCount = 0, values = [];
let processedValues;
pastedData.split("\n").forEach((function(rowCells, rowIndex) {
var _a;
const cells = rowCells.split("\t"), rowValues = [];
values.push(rowValues), cells.forEach((function(cell, cellIndex) {
cellIndex === cells.length - 1 && (cell = cell.trim()), rowValues.push(cell);
})), pasteValuesColCount = Math.max(pasteValuesColCount, null !== (_a = null == rowValues ? void 0 : rowValues.length) && void 0 !== _a ? _a : 0);
})), pasteValuesRowCount = null !== (_a = values.length) && void 0 !== _a ? _a : 0,
values = this.handlePasteValues(values, pasteValuesRowCount, pasteValuesColCount, maxRow - row + 1, maxCol - col + 1),
(null === (_b = table.options.keyboardOptions) || void 0 === _b ? void 0 : _b.processFormulaBeforePaste) && this.copySourceRange && (processedValues = table.options.keyboardOptions.processFormulaBeforePaste(values, this.copySourceRange.startCol, this.copySourceRange.startRow, col, row));
const changedCellResults = yield table.changeCellValues(col, row, processedValues || values, !0);
table.hasListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.PASTED_DATA) && table.fireListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.PASTED_DATA, {
col: col,
row: row,
pasteData: processedValues || values,
changedCellResults: changedCellResults
});
}));
}
pasteTextToTable(item) {
return __awaiter(this, void 0, void 0, (function*() {
const table = this.table, ranges = table.stateManager.select.ranges, selectRangeLength = ranges.length, col = Math.min(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col), row = Math.min(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row), maxCol = Math.max(ranges[selectRangeLength - 1].start.col, ranges[selectRangeLength - 1].end.col), maxRow = Math.max(ranges[selectRangeLength - 1].start.row, ranges[selectRangeLength - 1].end.row);
try {
const blob = yield item.getType("text/plain"), pastedData = yield blob.text(), values = this.parsePastedData(pastedData), pasteValuesRowCount = values.length, pasteValuesColCount = Math.max(...values.map((row => row.length)), 0), processedValues = this.handlePasteValues(values, pasteValuesRowCount, pasteValuesColCount, maxRow - row + 1, maxCol - col + 1), changedCellResults = yield table.changeCellValues(col, row, processedValues, !0);
table.hasListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.PASTED_DATA) && table.fireListeners(TABLE_EVENT_TYPE_1.TABLE_EVENT_TYPE.PASTED_DATA, {
col: col,
row: row,
pasteData: processedValues,
changedCellResults: changedCellResults
});
} catch (error) {}
}));
}
parsePastedData(pastedData) {
const rows = pastedData.replace(/\r(?!\n)/g, "\r\n").split("\r\n"), values = [];
return rows.length > 1 && "" === rows[rows.length - 1] && rows.pop(), rows.forEach((rowCells => {
const rowValues = rowCells.split("\t").map((cell => this.processCellValue(cell)));
values.push(rowValues);
})), values;
}
processCellValue(cell) {
cell.includes("\n") && (cell = cell.replace(/^"(.*)"$/, "$1").replace(/["]*/g, (match => new Array(Math.floor(match.length / 2)).fill('"').join(""))));
const numValue = Number(cell);
return isNaN(numValue) ? cell : numValue;
}
handlePasteValues(values, rowCount, colCount, selectedRowCount, selectedColCount) {
if (selectedColCount > colCount || selectedRowCount > rowCount) {
if (selectedColCount % colCount == 0 && selectedRowCount % rowCount == 0) {
const toPasteValues = [];
for (let i = 0; i < selectedRowCount; i++) {
const rowPasteValue = [];
toPasteValues.push(rowPasteValue);
for (let j = 0; j < selectedColCount; j++) {
const copiedRow = i % rowCount, copiedCol = j % colCount;
rowPasteValue.push(values[copiedRow][copiedCol]);
}
}
return toPasteValues;
}
return values;
}
return values;
}
}
exports.EventManager = EventManager;
//# sourceMappingURL=event.js.map