contextMenuCopyPaste.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. 'use strict';
  2. exports.__esModule = true;
  3. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  4. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  5. var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
  6. var _zeroclipboard = require('zeroclipboard');
  7. var _zeroclipboard2 = _interopRequireDefault(_zeroclipboard);
  8. var _base = require('./../_base');
  9. var _base2 = _interopRequireDefault(_base);
  10. var _element = require('./../../helpers/dom/element');
  11. var _array = require('./../../helpers/array');
  12. var _eventManager = require('./../../eventManager');
  13. var _eventManager2 = _interopRequireDefault(_eventManager);
  14. var _plugins = require('./../../plugins');
  15. var _predefinedItems = require('./../contextMenu/predefinedItems');
  16. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  17. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  18. function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
  19. function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
  20. /**
  21. * @description
  22. * This plugin adds a copy/paste functionality to the context menu. Due to browser restrictions, it uses ZeroClipboard to allow
  23. * copying data with a click.
  24. *
  25. * @plugin ContextMenuCopyPaste
  26. * @dependencies ContextMenu
  27. */
  28. var ContextMenuCopyPaste = function (_BasePlugin) {
  29. _inherits(ContextMenuCopyPaste, _BasePlugin);
  30. /**
  31. * @param {Object} hotInstance
  32. */
  33. function ContextMenuCopyPaste(hotInstance) {
  34. _classCallCheck(this, ContextMenuCopyPaste);
  35. /**
  36. * Instance of {@link EventManager}.
  37. *
  38. * @type {EventManager}
  39. */
  40. var _this = _possibleConstructorReturn(this, (ContextMenuCopyPaste.__proto__ || Object.getPrototypeOf(ContextMenuCopyPaste)).call(this, hotInstance));
  41. _this.eventManager = new _eventManager2.default(_this);
  42. /**
  43. * Path to swf file which is necessary for ZeroClipboard.
  44. *
  45. * @type {String}
  46. */
  47. _this.swfPath = null;
  48. /**
  49. * outsideClickDeselectsCache setting cache.
  50. *
  51. * @type {Boolean}
  52. */
  53. _this.outsideClickDeselectsCache = null;
  54. return _this;
  55. }
  56. /**
  57. * Check if the plugin is enabled in the handsontable settings.
  58. *
  59. * @returns {Boolean}
  60. */
  61. _createClass(ContextMenuCopyPaste, [{
  62. key: 'isEnabled',
  63. value: function isEnabled() {
  64. return this.hot.getSettings().contextMenuCopyPaste;
  65. }
  66. /**
  67. * Enable plugin for this Handsontable instance.
  68. */
  69. }, {
  70. key: 'enablePlugin',
  71. value: function enablePlugin() {
  72. var _this2 = this;
  73. if (this.enabled) {
  74. return;
  75. }
  76. if (_typeof(this.hot.getSettings().contextMenuCopyPaste) === 'object') {
  77. this.swfPath = this.hot.getSettings().contextMenuCopyPaste.swfPath;
  78. }
  79. if (typeof _zeroclipboard2.default === 'undefined') {
  80. console.error('To be able to use the Copy/Paste feature from the context menu, you need to manually include ZeroClipboard.js file to your website.');
  81. }
  82. try {
  83. /* eslint-disable no-new */
  84. new ActiveXObject('ShockwaveFlash.ShockwaveFlash');
  85. } catch (exception) {
  86. if (typeof navigator.mimeTypes['application/x-shockwave-flash'] == 'undefined') {
  87. console.error('To be able to use the Copy/Paste feature from the context menu, your browser needs to have Flash Plugin installed.');
  88. }
  89. }
  90. if (this.swfPath) {
  91. _zeroclipboard2.default.config({
  92. swfPath: this.swfPath
  93. });
  94. }
  95. this.hot.addHook('afterContextMenuShow', function () {
  96. return _this2.onAfterContextMenuShow();
  97. });
  98. this.hot.addHook('afterContextMenuDefaultOptions', function (options) {
  99. return _this2.onAfterContextMenuDefaultOptions(options);
  100. });
  101. this.registerEvents();
  102. _get(ContextMenuCopyPaste.prototype.__proto__ || Object.getPrototypeOf(ContextMenuCopyPaste.prototype), 'enablePlugin', this).call(this);
  103. }
  104. /**
  105. * Disable plugin for this Handsontable instance.
  106. */
  107. }, {
  108. key: 'disablePlugin',
  109. value: function disablePlugin() {
  110. _get(ContextMenuCopyPaste.prototype.__proto__ || Object.getPrototypeOf(ContextMenuCopyPaste.prototype), 'disablePlugin', this).call(this);
  111. }
  112. /**
  113. * @private
  114. */
  115. }, {
  116. key: 'registerEvents',
  117. value: function registerEvents() {
  118. var _this3 = this;
  119. this.eventManager.addEventListener(document, 'mouseenter', function () {
  120. return _this3.removeCurrentClass();
  121. });
  122. this.eventManager.addEventListener(document, 'mouseleave', function () {
  123. return _this3.removeZeroClipboardClass();
  124. });
  125. }
  126. /**
  127. * Get a value to copy.
  128. *
  129. * @returns {String}
  130. */
  131. }, {
  132. key: 'getCopyValue',
  133. value: function getCopyValue() {
  134. this.hot.copyPaste.setCopyableText();
  135. this.hot.copyPaste.copyPasteInstance.triggerCopy();
  136. return this.hot.copyPaste.copyPasteInstance.elTextarea.value;
  137. }
  138. /**
  139. * Add Copy and Paste functionality to the context menu.
  140. *
  141. * @private
  142. * @param {Object} defaultOptions
  143. */
  144. }, {
  145. key: 'onAfterContextMenuDefaultOptions',
  146. value: function onAfterContextMenuDefaultOptions(defaultOptions) {
  147. defaultOptions.items.unshift({
  148. key: 'copy',
  149. name: 'Copy',
  150. disabled: function disabled() {
  151. return this.selection.selectedHeader.corner;
  152. }
  153. }, {
  154. key: 'paste',
  155. name: 'Paste',
  156. callback: function callback() {
  157. this.copyPaste.triggerPaste();
  158. },
  159. disabled: function disabled() {
  160. return this.selection.selectedHeader.corner;
  161. }
  162. }, { name: _predefinedItems.SEPARATOR });
  163. }
  164. /**
  165. * After context menu show listener.
  166. *
  167. * @private
  168. */
  169. }, {
  170. key: 'onAfterContextMenuShow',
  171. value: function onAfterContextMenuShow() {
  172. var _this4 = this;
  173. var contextMenu = this.hot.getPlugin('contextMenu');
  174. var data = contextMenu.menu.hotMenu.getSourceData();
  175. // find position of 'copy' option.
  176. (0, _array.arrayEach)(data, function (item, index) {
  177. if (item.key === 'copy') {
  178. var zeroClipboardInstance = new _zeroclipboard2.default(contextMenu.menu.hotMenu.getCell(index, 0));
  179. zeroClipboardInstance.off();
  180. zeroClipboardInstance.on('copy', function (event) {
  181. var clipboard = event.clipboardData;
  182. clipboard.setData('text/plain', _this4.getCopyValue());
  183. _this4.hot.getSettings().outsideClickDeselects = _this4.outsideClickDeselectsCache;
  184. });
  185. return false;
  186. }
  187. });
  188. }
  189. /**
  190. * @private
  191. */
  192. }, {
  193. key: 'removeCurrentClass',
  194. value: function removeCurrentClass() {
  195. var contextMenu = this.hot.getPlugin('contextMenu');
  196. if (!contextMenu.enabled) {
  197. return;
  198. }
  199. if (contextMenu.menu.isOpened()) {
  200. var element = contextMenu.menu.hotMenu.rootElement.querySelector('td.current');
  201. if (element) {
  202. (0, _element.removeClass)(element, 'current');
  203. }
  204. }
  205. this.outsideClickDeselectsCache = this.hot.getSettings().outsideClickDeselects;
  206. this.hot.getSettings().outsideClickDeselects = false;
  207. }
  208. /**
  209. * @private
  210. */
  211. }, {
  212. key: 'removeZeroClipboardClass',
  213. value: function removeZeroClipboardClass() {
  214. var contextMenu = this.hot.getPlugin('contextMenu');
  215. if (!contextMenu.enabled) {
  216. return;
  217. }
  218. if (contextMenu.menu.isOpened()) {
  219. var element = contextMenu.menu.hotMenu.rootElement.querySelector('td.zeroclipboard-is-hover');
  220. if (element) {
  221. (0, _element.removeClass)(element, 'zeroclipboard-is-hover');
  222. }
  223. }
  224. this.hot.getSettings().outsideClickDeselects = this.outsideClickDeselectsCache;
  225. }
  226. }]);
  227. return ContextMenuCopyPaste;
  228. }(_base2.default);
  229. (0, _plugins.registerPlugin)('contextMenuCopyPaste', ContextMenuCopyPaste);
  230. exports.default = ContextMenuCopyPaste;