handsontable 14.0.0-next-c22ab6f-20231030 → 14.0.0-next-f88c253-20231106
Sign up to get free protection for your applications and to get access to all the features.
- package/base.js +2 -2
- package/base.mjs +2 -2
- package/dist/handsontable.css +8 -2
- package/dist/handsontable.full.css +8 -2
- package/dist/handsontable.full.js +2084 -3359
- package/dist/handsontable.full.min.css +3 -3
- package/dist/handsontable.full.min.js +59 -66
- package/dist/handsontable.js +2086 -3361
- package/dist/handsontable.min.css +3 -3
- package/dist/handsontable.min.js +16 -23
- package/helpers/mixed.js +2 -2
- package/helpers/mixed.mjs +2 -2
- package/package.json +1 -1
- package/pluginHooks.d.ts +6 -28
- package/pluginHooks.js +63 -117
- package/pluginHooks.mjs +63 -117
- package/plugins/copyPaste/clipboardData.js +18 -0
- package/plugins/copyPaste/clipboardData.mjs +14 -0
- package/plugins/copyPaste/copyPaste.js +92 -38
- package/plugins/copyPaste/copyPaste.mjs +94 -40
- package/plugins/copyPaste/pasteEvent.js +14 -0
- package/plugins/copyPaste/pasteEvent.mjs +9 -0
- package/plugins/mergeCells/mergeCells.js +14 -0
- package/plugins/mergeCells/mergeCells.mjs +14 -0
- package/plugins/nestedHeaders/nestedHeaders.js +22 -21
- package/plugins/nestedHeaders/nestedHeaders.mjs +22 -21
- package/utils/parseTable.js +83 -527
- package/utils/parseTable.mjs +82 -523
- package/plugins/copyPaste/clipboardData/clipboardData.js +0 -516
- package/plugins/copyPaste/clipboardData/clipboardData.mjs +0 -512
- package/plugins/copyPaste/clipboardData/copyClipboardData.js +0 -69
- package/plugins/copyPaste/clipboardData/copyClipboardData.mjs +0 -65
- package/plugins/copyPaste/clipboardData/index.js +0 -9
- package/plugins/copyPaste/clipboardData/index.mjs +0 -4
- package/plugins/copyPaste/clipboardData/pasteClipboardData.js +0 -81
- package/plugins/copyPaste/clipboardData/pasteClipboardData.mjs +0 -77
package/pluginHooks.mjs
CHANGED
@@ -1503,35 +1503,26 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1503
1503
|
* Fired by {@link CopyPaste} plugin before copying the values to the clipboard and before clearing values of
|
1504
1504
|
* the selected cells. This hook is fired when {@link Options#copyPaste} option is enabled.
|
1505
1505
|
*
|
1506
|
-
* Note: Please keep in mind since @14.0.0 the method arguments has been changed.
|
1507
|
-
*
|
1508
1506
|
* @event Hooks#beforeCut
|
1509
|
-
* @param {
|
1510
|
-
* @param {
|
1511
|
-
*
|
1512
|
-
* @param {Function} clipboardData.insertAtRow Insert values at row index.
|
1513
|
-
* @param {Function} clipboardData.insertAtColumn Insert values at column index.
|
1514
|
-
* @param {Function} clipboardData.setCellAt Change headers or cells in the copied dataset.
|
1515
|
-
* @param {Function} clipboardData.getCellAt Get headers or cells from the copied dataset.
|
1516
|
-
* @param {Function} clipboardData.getData Gets copied data stored as array of arrays.
|
1517
|
-
* @param {Function} clipboardData.getMetaInfo Gets meta information for the copied data.
|
1518
|
-
* @param {Function} clipboardData.getRanges Returns ranges related to copied part of Handsontable.
|
1507
|
+
* @param {Array[]} data An array of arrays which contains data to cut.
|
1508
|
+
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
|
1509
|
+
* which will be cut out.
|
1519
1510
|
* @returns {*} If returns `false` then operation of the cutting out is canceled.
|
1520
1511
|
* @example
|
1521
1512
|
* ::: only-for javascript
|
1522
1513
|
* ```js
|
1523
|
-
* // To disregard a single row
|
1514
|
+
* // To disregard a single row, remove it from the array using data.splice(i, 1).
|
1524
1515
|
* new Handsontable(element, {
|
1525
|
-
* beforeCut: function(
|
1526
|
-
* //
|
1527
|
-
*
|
1528
|
-
*
|
1529
|
-
* //
|
1516
|
+
* beforeCut: function(data, coords) {
|
1517
|
+
* // data -> [[1, 2, 3], [4, 5, 6]]
|
1518
|
+
* data.splice(0, 1);
|
1519
|
+
* // data -> [[4, 5, 6]]
|
1520
|
+
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
|
1530
1521
|
* }
|
1531
1522
|
* });
|
1532
1523
|
* // To cancel a cutting action, just return `false`.
|
1533
1524
|
* new Handsontable(element, {
|
1534
|
-
* beforeCut: function(
|
1525
|
+
* beforeCut: function(data, coords) {
|
1535
1526
|
* return false;
|
1536
1527
|
* }
|
1537
1528
|
* });
|
@@ -1540,18 +1531,18 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1540
1531
|
*
|
1541
1532
|
* ::: only-for react
|
1542
1533
|
* ```jsx
|
1543
|
-
* // To disregard a single row
|
1534
|
+
* // To disregard a single row, remove it from the array using data.splice(i, 1).
|
1544
1535
|
* <HotTable
|
1545
|
-
* beforeCut={(
|
1546
|
-
* //
|
1547
|
-
*
|
1548
|
-
*
|
1549
|
-
* //
|
1536
|
+
* beforeCut={(data, coords) => {
|
1537
|
+
* // data -> [[1, 2, 3], [4, 5, 6]]
|
1538
|
+
* data.splice(0, 1);
|
1539
|
+
* // data -> [[4, 5, 6]]
|
1540
|
+
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
|
1550
1541
|
* }}
|
1551
1542
|
* />
|
1552
1543
|
* // To cancel a cutting action, just return `false`.
|
1553
1544
|
* <HotTable
|
1554
|
-
* beforeCut={(
|
1545
|
+
* beforeCut={(data, coords) => {
|
1555
1546
|
* return false;
|
1556
1547
|
* }}
|
1557
1548
|
* />
|
@@ -1563,50 +1554,33 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1563
1554
|
* Fired by {@link CopyPaste} plugin after data was cut out from the table. This hook is fired when
|
1564
1555
|
* {@link Options#copyPaste} option is enabled.
|
1565
1556
|
*
|
1566
|
-
* Note: Please keep in mind since @14.0.0 the method arguments has been changed.
|
1567
|
-
*
|
1568
1557
|
* @event Hooks#afterCut
|
1569
|
-
* @param {
|
1570
|
-
* @param {
|
1571
|
-
*
|
1572
|
-
* @param {Function} clipboardData.insertAtRow Insert values at row index.
|
1573
|
-
* @param {Function} clipboardData.insertAtColumn Insert values at column index.
|
1574
|
-
* @param {Function} clipboardData.setCellAt Change headers or cells in the copied dataset.
|
1575
|
-
* @param {Function} clipboardData.getCellAt Get headers or cells from the copied dataset.
|
1576
|
-
* @param {Function} clipboardData.getData Gets copied data stored as array of arrays.
|
1577
|
-
* @param {Function} clipboardData.getMetaInfo Gets meta information for the copied data.
|
1578
|
-
* @param {Function} clipboardData.getRanges Returns ranges related to copied part of Handsontable.
|
1558
|
+
* @param {Array[]} data An array of arrays with the cut data.
|
1559
|
+
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
|
1560
|
+
* which was cut out.
|
1579
1561
|
*/
|
1580
1562
|
'afterCut',
|
1581
1563
|
/**
|
1582
1564
|
* Fired before values are copied to the clipboard.
|
1583
1565
|
*
|
1584
|
-
* Note: Please keep in mind since @14.0.0 the method arguments has been changed.
|
1585
|
-
*
|
1586
1566
|
* @event Hooks#beforeCopy
|
1587
|
-
* @param {
|
1588
|
-
* @param {
|
1589
|
-
*
|
1590
|
-
* @param {
|
1591
|
-
* @param {Function} clipboardData.insertAtColumn Insert values at column index.
|
1592
|
-
* @param {Function} clipboardData.setCellAt Change headers or cells in the copied dataset.
|
1593
|
-
* @param {Function} clipboardData.getCellAt Get headers or cells from the copied dataset.
|
1594
|
-
* @param {Function} clipboardData.getData Gets copied data stored as array of arrays.
|
1595
|
-
* @param {Function} clipboardData.getMetaInfo Gets meta information for the copied data.
|
1596
|
-
* @param {Function} clipboardData.getRanges Returns ranges related to copied part of Handsontable.
|
1567
|
+
* @param {Array[]} data An array of arrays which contains data to copied.
|
1568
|
+
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
|
1569
|
+
* which will copied.
|
1570
|
+
* @param {{ columnHeadersCount: number }} copiedHeadersCount (Since 12.3.0) The number of copied column headers.
|
1597
1571
|
* @returns {*} If returns `false` then copying is canceled.
|
1598
1572
|
*
|
1599
1573
|
* @example
|
1600
1574
|
* ::: only-for javascript
|
1601
1575
|
* ```js
|
1602
|
-
* // To disregard a single row
|
1576
|
+
* // To disregard a single row, remove it from array using data.splice(i, 1).
|
1603
1577
|
* ...
|
1604
1578
|
* new Handsontable(document.getElementById('example'), {
|
1605
|
-
* beforeCopy: (
|
1606
|
-
* //
|
1607
|
-
*
|
1608
|
-
*
|
1609
|
-
* //
|
1579
|
+
* beforeCopy: (data, coords) => {
|
1580
|
+
* // data -> [[1, 2, 3], [4, 5, 6]]
|
1581
|
+
* data.splice(0, 1);
|
1582
|
+
* // data -> [[4, 5, 6]]
|
1583
|
+
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
|
1610
1584
|
* }
|
1611
1585
|
* });
|
1612
1586
|
* ...
|
@@ -1614,7 +1588,7 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1614
1588
|
* // To cancel copying, return false from the callback.
|
1615
1589
|
* ...
|
1616
1590
|
* new Handsontable(document.getElementById('example'), {
|
1617
|
-
* beforeCopy: (
|
1591
|
+
* beforeCopy: (data, coords) => {
|
1618
1592
|
* return false;
|
1619
1593
|
* }
|
1620
1594
|
* });
|
@@ -1624,14 +1598,14 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1624
1598
|
*
|
1625
1599
|
* ::: only-for react
|
1626
1600
|
* ```jsx
|
1627
|
-
* // To disregard a single row
|
1601
|
+
* // To disregard a single row, remove it from array using data.splice(i, 1).
|
1628
1602
|
* ...
|
1629
1603
|
* <HotTable
|
1630
|
-
* beforeCopy={(
|
1631
|
-
* //
|
1632
|
-
*
|
1633
|
-
*
|
1634
|
-
* //
|
1604
|
+
* beforeCopy={(data, coords) => {
|
1605
|
+
* // data -> [[1, 2, 3], [4, 5, 6]]
|
1606
|
+
* data.splice(0, 1);
|
1607
|
+
* // data -> [[4, 5, 6]]
|
1608
|
+
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
|
1635
1609
|
* }}
|
1636
1610
|
* />
|
1637
1611
|
* ...
|
@@ -1639,7 +1613,7 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1639
1613
|
* // To cancel copying, return false from the callback.
|
1640
1614
|
* ...
|
1641
1615
|
* <HotTable
|
1642
|
-
* beforeCopy={(
|
1616
|
+
* beforeCopy={(data, coords) => {
|
1643
1617
|
* return false;
|
1644
1618
|
* }}
|
1645
1619
|
* />
|
@@ -1652,55 +1626,37 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1652
1626
|
* Fired by {@link CopyPaste} plugin after data are pasted into table. This hook is fired when {@link Options#copyPaste}
|
1653
1627
|
* option is enabled.
|
1654
1628
|
*
|
1655
|
-
* Note: Please keep in mind since @14.0.0 the method arguments has been changed.
|
1656
|
-
*
|
1657
1629
|
* @event Hooks#afterCopy
|
1658
|
-
* @param {
|
1659
|
-
* @param {
|
1660
|
-
*
|
1661
|
-
* @param {
|
1662
|
-
* @param {Function} clipboardData.insertAtColumn Insert values at column index.
|
1663
|
-
* @param {Function} clipboardData.setCellAt Change headers or cells in the copied dataset.
|
1664
|
-
* @param {Function} clipboardData.getCellAt Get headers or cells from the copied dataset.
|
1665
|
-
* @param {Function} clipboardData.getData Gets copied data stored as array of arrays.
|
1666
|
-
* @param {Function} clipboardData.getMetaInfo Gets meta information for the copied data.
|
1667
|
-
* @param {Function} clipboardData.getRanges Returns ranges related to copied part of Handsontable.
|
1630
|
+
* @param {Array[]} data An array of arrays which contains the copied data.
|
1631
|
+
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
|
1632
|
+
* which was copied.
|
1633
|
+
* @param {{ columnHeadersCount: number }} copiedHeadersCount (Since 12.3.0) The number of copied column headers.
|
1668
1634
|
*/
|
1669
1635
|
'afterCopy',
|
1670
1636
|
/**
|
1671
1637
|
* Fired by {@link CopyPaste} plugin before values are pasted into table. This hook is fired when
|
1672
1638
|
* {@link Options#copyPaste} option is enabled.
|
1673
1639
|
*
|
1674
|
-
* Note: Please keep in mind since @14.0.0 the method arguments has been changed.
|
1675
|
-
*
|
1676
1640
|
* @event Hooks#beforePaste
|
1677
|
-
* @param {
|
1678
|
-
* @param {
|
1679
|
-
*
|
1680
|
-
* @param {Function} clipboardData.insertAtRow Insert values at row index.
|
1681
|
-
* @param {Function} clipboardData.insertAtColumn Insert values at column index.
|
1682
|
-
* @param {Function} clipboardData.setCellAt Change headers or cells in the pasted dataset.
|
1683
|
-
* @param {Function} clipboardData.getCellAt Get headers or cells from the pasted dataset.
|
1684
|
-
* @param {Function} clipboardData.getData Gets copied data stored as array of arrays.
|
1685
|
-
* @param {Function} clipboardData.getMetaInfo Gets meta information for the copied data.
|
1686
|
-
* @param {Function} clipboardData.getSource Gets information about source of the copied data
|
1687
|
-
* (Handsontable, table or string).
|
1641
|
+
* @param {Array[]} data An array of arrays which contains data to paste.
|
1642
|
+
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
|
1643
|
+
* that correspond to the previously selected area.
|
1688
1644
|
* @returns {*} If returns `false` then pasting is canceled.
|
1689
1645
|
* @example
|
1690
1646
|
* ```js
|
1691
1647
|
* ::: only-for javascript
|
1692
|
-
* // To disregard a single row
|
1648
|
+
* // To disregard a single row, remove it from array using data.splice(i, 1).
|
1693
1649
|
* new Handsontable(example, {
|
1694
|
-
* beforePaste: (
|
1695
|
-
* //
|
1696
|
-
*
|
1697
|
-
*
|
1698
|
-
* //
|
1650
|
+
* beforePaste: (data, coords) => {
|
1651
|
+
* // data -> [[1, 2, 3], [4, 5, 6]]
|
1652
|
+
* data.splice(0, 1);
|
1653
|
+
* // data -> [[4, 5, 6]]
|
1654
|
+
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
|
1699
1655
|
* }
|
1700
1656
|
* });
|
1701
1657
|
* // To cancel pasting, return false from the callback.
|
1702
1658
|
* new Handsontable(example, {
|
1703
|
-
* beforePaste: (
|
1659
|
+
* beforePaste: (data, coords) => {
|
1704
1660
|
* return false;
|
1705
1661
|
* }
|
1706
1662
|
* });
|
@@ -1709,18 +1665,18 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1709
1665
|
*
|
1710
1666
|
* ::: only-for react
|
1711
1667
|
* ```jsx
|
1712
|
-
* // To disregard a single row
|
1668
|
+
* // To disregard a single row, remove it from array using data.splice(i, 1).
|
1713
1669
|
* <HotTable
|
1714
|
-
* beforePaste={(
|
1715
|
-
* //
|
1716
|
-
*
|
1717
|
-
*
|
1718
|
-
* //
|
1670
|
+
* beforePaste={(data, coords) => {
|
1671
|
+
* // data -> [[1, 2, 3], [4, 5, 6]]
|
1672
|
+
* data.splice(0, 1);
|
1673
|
+
* // data -> [[4, 5, 6]]
|
1674
|
+
* // coords -> [{startRow: 0, startCol: 0, endRow: 1, endCol: 2}]
|
1719
1675
|
* }}
|
1720
1676
|
* />
|
1721
1677
|
* // To cancel pasting, return false from the callback.
|
1722
1678
|
* <HotTable
|
1723
|
-
* beforePaste={(
|
1679
|
+
* beforePaste={(data, coords) => {
|
1724
1680
|
* return false;
|
1725
1681
|
* }}
|
1726
1682
|
* />
|
@@ -1732,20 +1688,10 @@ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-s
|
|
1732
1688
|
* Fired by {@link CopyPaste} plugin after values are pasted into table. This hook is fired when
|
1733
1689
|
* {@link Options#copyPaste} option is enabled.
|
1734
1690
|
*
|
1735
|
-
* Note: Please keep in mind since @14.0.0 the method arguments has been changed.
|
1736
|
-
*
|
1737
1691
|
* @event Hooks#afterPaste
|
1738
|
-
* @param {
|
1739
|
-
* @param {
|
1740
|
-
*
|
1741
|
-
* @param {Function} clipboardData.insertAtRow Insert values at row index.
|
1742
|
-
* @param {Function} clipboardData.insertAtColumn Insert values at column index.
|
1743
|
-
* @param {Function} clipboardData.setCellAt Change headers or cells in the pasted dataset.
|
1744
|
-
* @param {Function} clipboardData.getCellAt Get headers or cells from the pasted dataset.
|
1745
|
-
* @param {Function} clipboardData.getData Gets copied data stored as array of arrays.
|
1746
|
-
* @param {Function} clipboardData.getMetaInfo Gets meta information for the copied data.
|
1747
|
-
* @param {Function} clipboardData.getSource Gets information about source of the copied data
|
1748
|
-
* (Handsontable, table or string).
|
1692
|
+
* @param {Array[]} data An array of arrays with the pasted data.
|
1693
|
+
* @param {object[]} coords An array of objects with ranges of the visual indexes (`startRow`, `startCol`, `endRow`, `endCol`)
|
1694
|
+
* that correspond to the previously selected area.
|
1749
1695
|
*/
|
1750
1696
|
'afterPaste',
|
1751
1697
|
/**
|
@@ -2617,7 +2563,7 @@ const REMOVED_HOOKS = new Map([['modifyRow', '8.0.0'], ['modifyCol', '8.0.0'], [
|
|
2617
2563
|
* @type {Map<string, string>}
|
2618
2564
|
*/
|
2619
2565
|
/* eslint-enable jsdoc/require-description-complete-sentence */
|
2620
|
-
const DEPRECATED_HOOKS = new Map([[
|
2566
|
+
const DEPRECATED_HOOKS = new Map([[]]);
|
2621
2567
|
class Hooks {
|
2622
2568
|
static getSingleton() {
|
2623
2569
|
return getGlobalSingleton();
|
@@ -0,0 +1,18 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
exports.__esModule = true;
|
4
|
+
/**
|
5
|
+
* @private
|
6
|
+
*/
|
7
|
+
class ClipboardData {
|
8
|
+
constructor() {
|
9
|
+
this.data = {};
|
10
|
+
}
|
11
|
+
setData(type, value) {
|
12
|
+
this.data[type] = value;
|
13
|
+
}
|
14
|
+
getData(type) {
|
15
|
+
return this.data[type] || void 0;
|
16
|
+
}
|
17
|
+
}
|
18
|
+
exports.default = ClipboardData;
|
@@ -6,6 +6,7 @@ require("core-js/modules/es.error.cause.js");
|
|
6
6
|
var _base = require("../base");
|
7
7
|
var _pluginHooks = _interopRequireDefault(require("../../pluginHooks"));
|
8
8
|
var _SheetClip = require("../../3rdparty/SheetClip");
|
9
|
+
var _array = require("../../helpers/array");
|
9
10
|
var _string = require("../../helpers/string");
|
10
11
|
var _element = require("../../helpers/dom/element");
|
11
12
|
var _browser = require("../../helpers/browser");
|
@@ -14,10 +15,10 @@ var _copyColumnHeadersOnly = _interopRequireDefault(require("./contextMenuItem/c
|
|
14
15
|
var _copyWithColumnGroupHeaders = _interopRequireDefault(require("./contextMenuItem/copyWithColumnGroupHeaders"));
|
15
16
|
var _copyWithColumnHeaders = _interopRequireDefault(require("./contextMenuItem/copyWithColumnHeaders"));
|
16
17
|
var _cut = _interopRequireDefault(require("./contextMenuItem/cut"));
|
18
|
+
var _pasteEvent = _interopRequireDefault(require("./pasteEvent"));
|
17
19
|
var _copyableRanges = require("./copyableRanges");
|
18
20
|
var _parseTable = require("../../utils/parseTable");
|
19
21
|
var _eventManager = _interopRequireDefault(require("../../eventManager"));
|
20
|
-
var _clipboardData = require("./clipboardData");
|
21
22
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
22
23
|
function _classPrivateMethodInitSpec(obj, privateSet) { _checkPrivateRedeclaration(obj, privateSet); privateSet.add(obj); }
|
23
24
|
function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
|
@@ -42,6 +43,7 @@ _pluginHooks.default.getSingleton().register('afterCopy');
|
|
42
43
|
const PLUGIN_KEY = exports.PLUGIN_KEY = 'copyPaste';
|
43
44
|
const PLUGIN_PRIORITY = exports.PLUGIN_PRIORITY = 80;
|
44
45
|
const SETTING_KEYS = ['fragmentSelection'];
|
46
|
+
const META_HEAD = ['<meta name="generator" content="Handsontable"/>', '<style type="text/css">td{white-space:normal}br{mso-data-placement:same-cell}</style>'].join('');
|
45
47
|
|
46
48
|
/* eslint-disable jsdoc/require-description-complete-sentence */
|
47
49
|
/**
|
@@ -86,6 +88,7 @@ var _isTriggeredByCopy = /*#__PURE__*/new WeakMap();
|
|
86
88
|
var _isTriggeredByCut = /*#__PURE__*/new WeakMap();
|
87
89
|
var _copyableRangesFactory = /*#__PURE__*/new WeakMap();
|
88
90
|
var _ensureClipboardEventsGetTriggered = /*#__PURE__*/new WeakSet();
|
91
|
+
var _countCopiedHeaders = /*#__PURE__*/new WeakSet();
|
89
92
|
var _addContentEditableToHighlightedCell = /*#__PURE__*/new WeakSet();
|
90
93
|
var _removeContentEditableFromHighlightedCell = /*#__PURE__*/new WeakSet();
|
91
94
|
class CopyPaste extends _base.BasePlugin {
|
@@ -99,6 +102,15 @@ class CopyPaste extends _base.BasePlugin {
|
|
99
102
|
* Add the `contenteditable` attribute to the highlighted cell and select its content.
|
100
103
|
*/
|
101
104
|
_classPrivateMethodInitSpec(this, _addContentEditableToHighlightedCell);
|
105
|
+
/**
|
106
|
+
* Counts how many column headers will be copied based on the passed range.
|
107
|
+
*
|
108
|
+
* @private
|
109
|
+
* @param {Array<{startRow: number, startCol: number, endRow: number, endCol: number}>} ranges Array of objects with properties `startRow`, `startCol`, `endRow` and `endCol`.
|
110
|
+
* @returns {{ columnHeadersCount: number }} Returns an object with keys that holds
|
111
|
+
* information with the number of copied headers.
|
112
|
+
*/
|
113
|
+
_classPrivateMethodInitSpec(this, _countCopiedHeaders);
|
102
114
|
/**
|
103
115
|
* Ensure that the `copy`/`cut` events get triggered properly in Safari.
|
104
116
|
*
|
@@ -383,14 +395,26 @@ class CopyPaste extends _base.BasePlugin {
|
|
383
395
|
* @returns {Array[]} An array of arrays that will be copied to the clipboard.
|
384
396
|
*/
|
385
397
|
getRangedData(ranges) {
|
398
|
+
const data = [];
|
386
399
|
const {
|
387
400
|
rows,
|
388
401
|
columns
|
389
402
|
} = (0, _copyableRanges.normalizeRanges)(ranges);
|
390
|
-
|
391
|
-
|
392
|
-
|
403
|
+
|
404
|
+
// concatenate all rows and columns data defined in ranges into one copyable string
|
405
|
+
(0, _array.arrayEach)(rows, row => {
|
406
|
+
const rowSet = [];
|
407
|
+
(0, _array.arrayEach)(columns, column => {
|
408
|
+
if (row < 0) {
|
409
|
+
// `row` as the second argument acts here as the `headerLevel` argument
|
410
|
+
rowSet.push(this.hot.getColHeader(column, row));
|
411
|
+
} else {
|
412
|
+
rowSet.push(this.hot.getCopyableData(row, column));
|
413
|
+
}
|
414
|
+
});
|
415
|
+
data.push(rowSet);
|
393
416
|
});
|
417
|
+
return data;
|
394
418
|
}
|
395
419
|
|
396
420
|
/**
|
@@ -407,17 +431,7 @@ class CopyPaste extends _base.BasePlugin {
|
|
407
431
|
if (!pastableText && !pastableHtml) {
|
408
432
|
return;
|
409
433
|
}
|
410
|
-
const pasteData =
|
411
|
-
clipboardData: {
|
412
|
-
data: {},
|
413
|
-
setData(type, value) {
|
414
|
-
this.data[type] = value;
|
415
|
-
},
|
416
|
-
getData(type) {
|
417
|
-
return this.data[type];
|
418
|
-
}
|
419
|
-
}
|
420
|
-
};
|
434
|
+
const pasteData = new _pasteEvent.default();
|
421
435
|
if (pastableText) {
|
422
436
|
pasteData.clipboardData.setData('text/plain', pastableText);
|
423
437
|
}
|
@@ -556,7 +570,7 @@ class CopyPaste extends _base.BasePlugin {
|
|
556
570
|
/**
|
557
571
|
* `copy` event callback on textarea element.
|
558
572
|
*
|
559
|
-
* @param {
|
573
|
+
* @param {Event} event ClipboardEvent.
|
560
574
|
* @private
|
561
575
|
*/
|
562
576
|
onCopy(event) {
|
@@ -565,12 +579,19 @@ class CopyPaste extends _base.BasePlugin {
|
|
565
579
|
}
|
566
580
|
this.setCopyableText();
|
567
581
|
_classPrivateFieldSet(this, _isTriggeredByCopy, false);
|
568
|
-
const
|
569
|
-
const
|
582
|
+
const data = this.getRangedData(this.copyableRanges);
|
583
|
+
const copiedHeadersCount = _classPrivateMethodGet(this, _countCopiedHeaders, _countCopiedHeaders2).call(this, this.copyableRanges);
|
584
|
+
const allowCopying = !!this.hot.runHooks('beforeCopy', data, this.copyableRanges, copiedHeadersCount);
|
570
585
|
if (allowCopying) {
|
571
|
-
|
572
|
-
|
573
|
-
|
586
|
+
const textPlain = (0, _SheetClip.stringify)(data);
|
587
|
+
if (event && event.clipboardData) {
|
588
|
+
const textHTML = (0, _parseTable._dataToHTML)(data, this.hot.rootDocument);
|
589
|
+
event.clipboardData.setData('text/plain', textPlain);
|
590
|
+
event.clipboardData.setData('text/html', [META_HEAD, textHTML].join(''));
|
591
|
+
} else if (typeof ClipboardEvent === 'undefined') {
|
592
|
+
this.hot.rootWindow.clipboardData.setData('Text', textPlain);
|
593
|
+
}
|
594
|
+
this.hot.runHooks('afterCopy', data, this.copyableRanges, copiedHeadersCount);
|
574
595
|
}
|
575
596
|
_classPrivateFieldSet(this, _copyMode, 'cells-only');
|
576
597
|
event.preventDefault();
|
@@ -579,7 +600,7 @@ class CopyPaste extends _base.BasePlugin {
|
|
579
600
|
/**
|
580
601
|
* `cut` event callback on textarea element.
|
581
602
|
*
|
582
|
-
* @param {
|
603
|
+
* @param {Event} event ClipboardEvent.
|
583
604
|
* @private
|
584
605
|
*/
|
585
606
|
onCut(event) {
|
@@ -588,13 +609,19 @@ class CopyPaste extends _base.BasePlugin {
|
|
588
609
|
}
|
589
610
|
this.setCopyableText();
|
590
611
|
_classPrivateFieldSet(this, _isTriggeredByCut, false);
|
591
|
-
const
|
592
|
-
const allowCuttingOut = !!this.hot.runHooks('beforeCut',
|
612
|
+
const rangedData = this.getRangedData(this.copyableRanges);
|
613
|
+
const allowCuttingOut = !!this.hot.runHooks('beforeCut', rangedData, this.copyableRanges);
|
593
614
|
if (allowCuttingOut) {
|
594
|
-
|
595
|
-
|
615
|
+
const textPlain = (0, _SheetClip.stringify)(rangedData);
|
616
|
+
if (event && event.clipboardData) {
|
617
|
+
const textHTML = (0, _parseTable._dataToHTML)(rangedData, this.hot.rootDocument);
|
618
|
+
event.clipboardData.setData('text/plain', textPlain);
|
619
|
+
event.clipboardData.setData('text/html', [META_HEAD, textHTML].join(''));
|
620
|
+
} else if (typeof ClipboardEvent === 'undefined') {
|
621
|
+
this.hot.rootWindow.clipboardData.setData('Text', textPlain);
|
622
|
+
}
|
596
623
|
this.hot.emptySelectedCells('CopyPaste.cut');
|
597
|
-
this.hot.runHooks('afterCut',
|
624
|
+
this.hot.runHooks('afterCut', rangedData, this.copyableRanges);
|
598
625
|
}
|
599
626
|
event.preventDefault();
|
600
627
|
}
|
@@ -612,22 +639,34 @@ class CopyPaste extends _base.BasePlugin {
|
|
612
639
|
if (event && event.preventDefault) {
|
613
640
|
event.preventDefault();
|
614
641
|
}
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
642
|
+
let pastedData;
|
643
|
+
if (event && typeof event.clipboardData !== 'undefined') {
|
644
|
+
const textHTML = (0, _string.sanitize)(event.clipboardData.getData('text/html'), {
|
645
|
+
ADD_TAGS: ['meta'],
|
646
|
+
ADD_ATTR: ['content'],
|
647
|
+
FORCE_BODY: true
|
648
|
+
});
|
649
|
+
if (textHTML && /(<table)|(<TABLE)/g.test(textHTML)) {
|
650
|
+
const parsedConfig = (0, _parseTable.htmlToGridSettings)(textHTML, this.hot.rootDocument);
|
651
|
+
pastedData = parsedConfig.data;
|
652
|
+
} else {
|
653
|
+
pastedData = event.clipboardData.getData('text/plain');
|
654
|
+
}
|
655
|
+
} else if (typeof ClipboardEvent === 'undefined' && typeof this.hot.rootWindow.clipboardData !== 'undefined') {
|
656
|
+
pastedData = this.hot.rootWindow.clipboardData.getData('Text');
|
657
|
+
}
|
658
|
+
if (typeof pastedData === 'string') {
|
659
|
+
pastedData = (0, _SheetClip.parse)(pastedData);
|
660
|
+
}
|
661
|
+
if (pastedData === void 0 || pastedData && pastedData.length === 0) {
|
622
662
|
return;
|
623
663
|
}
|
624
|
-
|
625
|
-
if (pastedTable.length === 0) {
|
664
|
+
if (this.hot.runHooks('beforePaste', pastedData, this.copyableRanges) === false) {
|
626
665
|
return;
|
627
666
|
}
|
628
|
-
const [startRow, startColumn, endRow, endColumn] = this.populateValues(
|
667
|
+
const [startRow, startColumn, endRow, endColumn] = this.populateValues(pastedData);
|
629
668
|
this.hot.selectCell(startRow, startColumn, Math.min(this.hot.countRows() - 1, endRow), Math.min(this.hot.countCols() - 1, endColumn));
|
630
|
-
this.hot.runHooks('afterPaste',
|
669
|
+
this.hot.runHooks('afterPaste', pastedData, this.copyableRanges);
|
631
670
|
}
|
632
671
|
|
633
672
|
/**
|
@@ -724,6 +763,21 @@ function _ensureClipboardEventsGetTriggered2(eventName) {
|
|
724
763
|
this.hot.rootDocument.execCommand(eventName);
|
725
764
|
}
|
726
765
|
}
|
766
|
+
function _countCopiedHeaders2(ranges) {
|
767
|
+
const {
|
768
|
+
rows
|
769
|
+
} = (0, _copyableRanges.normalizeRanges)(ranges);
|
770
|
+
let columnHeadersCount = 0;
|
771
|
+
for (let row = 0; row < rows.length; row++) {
|
772
|
+
if (rows[row] >= 0) {
|
773
|
+
break;
|
774
|
+
}
|
775
|
+
columnHeadersCount += 1;
|
776
|
+
}
|
777
|
+
return {
|
778
|
+
columnHeadersCount
|
779
|
+
};
|
780
|
+
}
|
727
781
|
function _addContentEditableToHighlightedCell2() {
|
728
782
|
if (this.hot.isListening()) {
|
729
783
|
const lastSelectedRange = this.hot.getSelectedRangeLast();
|