clipboard
Advanced tools
Comparing version 1.5.8 to 1.5.9
/*! | ||
* clipboard.js v1.5.8 | ||
* clipboard.js v1.5.9 | ||
* https://zenorocha.github.io/clipboard.js | ||
@@ -353,404 +353,385 @@ * | ||
},{}],8:[function(require,module,exports){ | ||
'use strict'; | ||
(function (global, factory) { | ||
if (typeof define === "function" && define.amd) { | ||
define(['module', 'select'], factory); | ||
} else if (typeof exports !== "undefined") { | ||
factory(module, require('select')); | ||
} else { | ||
var mod = { | ||
exports: {} | ||
}; | ||
factory(mod, global.select); | ||
global.clipboardAction = mod.exports; | ||
} | ||
})(this, function (module, _select) { | ||
'use strict'; | ||
exports.__esModule = true; | ||
var _select2 = _interopRequireDefault(_select); | ||
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; }; })(); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
var _select = require('select'); | ||
var _select2 = _interopRequireDefault(_select); | ||
/** | ||
* Inner class which performs selection from either `text` or `target` | ||
* properties and then executes copy or cut operations. | ||
*/ | ||
var ClipboardAction = (function () { | ||
/** | ||
* @param {Object} options | ||
*/ | ||
function ClipboardAction(options) { | ||
_classCallCheck(this, ClipboardAction); | ||
this.resolveOptions(options); | ||
this.initSelection(); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : { | ||
default: obj | ||
}; | ||
} | ||
/** | ||
* Defines base properties passed from constructor. | ||
* @param {Object} options | ||
*/ | ||
ClipboardAction.prototype.resolveOptions = function resolveOptions() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
this.action = options.action; | ||
this.emitter = options.emitter; | ||
this.target = options.target; | ||
this.text = options.text; | ||
this.trigger = options.trigger; | ||
this.selectedText = ''; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { | ||
return typeof obj; | ||
} : function (obj) { | ||
return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; | ||
}; | ||
/** | ||
* Decides which selection strategy is going to be applied based | ||
* on the existence of `text` and `target` properties. | ||
*/ | ||
function _classCallCheck(instance, Constructor) { | ||
if (!(instance instanceof Constructor)) { | ||
throw new TypeError("Cannot call a class as a function"); | ||
} | ||
} | ||
ClipboardAction.prototype.initSelection = function initSelection() { | ||
if (this.text && this.target) { | ||
throw new Error('Multiple attributes declared, use either "target" or "text"'); | ||
} else if (this.text) { | ||
this.selectFake(); | ||
} else if (this.target) { | ||
this.selectTarget(); | ||
} else { | ||
throw new Error('Missing required attributes, use either "target" or "text"'); | ||
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); | ||
} | ||
} | ||
}; | ||
/** | ||
* Creates a fake textarea element, sets its value from `text` property, | ||
* and makes a selection on it. | ||
*/ | ||
return function (Constructor, protoProps, staticProps) { | ||
if (protoProps) defineProperties(Constructor.prototype, protoProps); | ||
if (staticProps) defineProperties(Constructor, staticProps); | ||
return Constructor; | ||
}; | ||
}(); | ||
ClipboardAction.prototype.selectFake = function selectFake() { | ||
var _this = this; | ||
var ClipboardAction = function () { | ||
/** | ||
* @param {Object} options | ||
*/ | ||
var isRTL = document.documentElement.getAttribute('dir') == 'rtl'; | ||
function ClipboardAction(options) { | ||
_classCallCheck(this, ClipboardAction); | ||
this.removeFake(); | ||
this.resolveOptions(options); | ||
this.initSelection(); | ||
} | ||
this.fakeHandler = document.body.addEventListener('click', function () { | ||
return _this.removeFake(); | ||
}); | ||
/** | ||
* Defines base properties passed from constructor. | ||
* @param {Object} options | ||
*/ | ||
this.fakeElem = document.createElement('textarea'); | ||
// Prevent zooming on iOS | ||
this.fakeElem.style.fontSize = '12pt'; | ||
// Reset box model | ||
this.fakeElem.style.border = '0'; | ||
this.fakeElem.style.padding = '0'; | ||
this.fakeElem.style.margin = '0'; | ||
// Move element out of screen horizontally | ||
this.fakeElem.style.position = 'absolute'; | ||
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; | ||
// Move element to the same position vertically | ||
this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px'; | ||
this.fakeElem.setAttribute('readonly', ''); | ||
this.fakeElem.value = this.text; | ||
document.body.appendChild(this.fakeElem); | ||
ClipboardAction.prototype.resolveOptions = function resolveOptions() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
this.selectedText = _select2['default'](this.fakeElem); | ||
this.copyText(); | ||
}; | ||
this.action = options.action; | ||
this.emitter = options.emitter; | ||
this.target = options.target; | ||
this.text = options.text; | ||
this.trigger = options.trigger; | ||
/** | ||
* Only removes the fake element after another click event, that way | ||
* a user can hit `Ctrl+C` to copy because selection still exists. | ||
*/ | ||
this.selectedText = ''; | ||
}; | ||
ClipboardAction.prototype.removeFake = function removeFake() { | ||
if (this.fakeHandler) { | ||
document.body.removeEventListener('click'); | ||
this.fakeHandler = null; | ||
} | ||
ClipboardAction.prototype.initSelection = function initSelection() { | ||
if (this.text && this.target) { | ||
throw new Error('Multiple attributes declared, use either "target" or "text"'); | ||
} else if (this.text) { | ||
this.selectFake(); | ||
} else if (this.target) { | ||
this.selectTarget(); | ||
} else { | ||
throw new Error('Missing required attributes, use either "target" or "text"'); | ||
} | ||
}; | ||
if (this.fakeElem) { | ||
document.body.removeChild(this.fakeElem); | ||
this.fakeElem = null; | ||
} | ||
}; | ||
ClipboardAction.prototype.selectFake = function selectFake() { | ||
var _this = this; | ||
/** | ||
* Selects the content from element passed on `target` property. | ||
*/ | ||
var isRTL = document.documentElement.getAttribute('dir') == 'rtl'; | ||
ClipboardAction.prototype.selectTarget = function selectTarget() { | ||
this.selectedText = _select2['default'](this.target); | ||
this.copyText(); | ||
}; | ||
this.removeFake(); | ||
/** | ||
* Executes the copy operation based on the current selection. | ||
*/ | ||
this.fakeHandler = document.body.addEventListener('click', function () { | ||
return _this.removeFake(); | ||
}); | ||
ClipboardAction.prototype.copyText = function copyText() { | ||
var succeeded = undefined; | ||
this.fakeElem = document.createElement('textarea'); | ||
// Prevent zooming on iOS | ||
this.fakeElem.style.fontSize = '12pt'; | ||
// Reset box model | ||
this.fakeElem.style.border = '0'; | ||
this.fakeElem.style.padding = '0'; | ||
this.fakeElem.style.margin = '0'; | ||
// Move element out of screen horizontally | ||
this.fakeElem.style.position = 'fixed'; | ||
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; | ||
// Move element to the same position vertically | ||
this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px'; | ||
this.fakeElem.setAttribute('readonly', ''); | ||
this.fakeElem.value = this.text; | ||
try { | ||
succeeded = document.execCommand(this.action); | ||
} catch (err) { | ||
succeeded = false; | ||
} | ||
document.body.appendChild(this.fakeElem); | ||
this.handleResult(succeeded); | ||
}; | ||
this.selectedText = (0, _select2.default)(this.fakeElem); | ||
this.copyText(); | ||
}; | ||
/** | ||
* Fires an event based on the copy operation result. | ||
* @param {Boolean} succeeded | ||
*/ | ||
ClipboardAction.prototype.removeFake = function removeFake() { | ||
if (this.fakeHandler) { | ||
document.body.removeEventListener('click'); | ||
this.fakeHandler = null; | ||
} | ||
ClipboardAction.prototype.handleResult = function handleResult(succeeded) { | ||
if (succeeded) { | ||
this.emitter.emit('success', { | ||
action: this.action, | ||
text: this.selectedText, | ||
trigger: this.trigger, | ||
clearSelection: this.clearSelection.bind(this) | ||
}); | ||
} else { | ||
this.emitter.emit('error', { | ||
action: this.action, | ||
trigger: this.trigger, | ||
clearSelection: this.clearSelection.bind(this) | ||
}); | ||
} | ||
}; | ||
if (this.fakeElem) { | ||
document.body.removeChild(this.fakeElem); | ||
this.fakeElem = null; | ||
} | ||
}; | ||
/** | ||
* Removes current selection and focus from `target` element. | ||
*/ | ||
ClipboardAction.prototype.selectTarget = function selectTarget() { | ||
this.selectedText = (0, _select2.default)(this.target); | ||
this.copyText(); | ||
}; | ||
ClipboardAction.prototype.clearSelection = function clearSelection() { | ||
if (this.target) { | ||
this.target.blur(); | ||
} | ||
ClipboardAction.prototype.copyText = function copyText() { | ||
var succeeded = undefined; | ||
window.getSelection().removeAllRanges(); | ||
}; | ||
try { | ||
succeeded = document.execCommand(this.action); | ||
} catch (err) { | ||
succeeded = false; | ||
} | ||
/** | ||
* Sets the `action` to be performed which can be either 'copy' or 'cut'. | ||
* @param {String} action | ||
*/ | ||
this.handleResult(succeeded); | ||
}; | ||
/** | ||
* Destroy lifecycle. | ||
*/ | ||
ClipboardAction.prototype.handleResult = function handleResult(succeeded) { | ||
if (succeeded) { | ||
this.emitter.emit('success', { | ||
action: this.action, | ||
text: this.selectedText, | ||
trigger: this.trigger, | ||
clearSelection: this.clearSelection.bind(this) | ||
}); | ||
} else { | ||
this.emitter.emit('error', { | ||
action: this.action, | ||
trigger: this.trigger, | ||
clearSelection: this.clearSelection.bind(this) | ||
}); | ||
} | ||
}; | ||
ClipboardAction.prototype.destroy = function destroy() { | ||
this.removeFake(); | ||
}; | ||
ClipboardAction.prototype.clearSelection = function clearSelection() { | ||
if (this.target) { | ||
this.target.blur(); | ||
} | ||
_createClass(ClipboardAction, [{ | ||
key: 'action', | ||
set: function set() { | ||
var action = arguments.length <= 0 || arguments[0] === undefined ? 'copy' : arguments[0]; | ||
window.getSelection().removeAllRanges(); | ||
}; | ||
this._action = action; | ||
ClipboardAction.prototype.destroy = function destroy() { | ||
this.removeFake(); | ||
}; | ||
if (this._action !== 'copy' && this._action !== 'cut') { | ||
throw new Error('Invalid "action" value, use either "copy" or "cut"'); | ||
} | ||
}, | ||
_createClass(ClipboardAction, [{ | ||
key: 'action', | ||
set: function set() { | ||
var action = arguments.length <= 0 || arguments[0] === undefined ? 'copy' : arguments[0]; | ||
/** | ||
* Gets the `action` property. | ||
* @return {String} | ||
*/ | ||
get: function get() { | ||
return this._action; | ||
} | ||
this._action = action; | ||
/** | ||
* Sets the `target` property using an element | ||
* that will be have its content copied. | ||
* @param {Element} target | ||
*/ | ||
}, { | ||
key: 'target', | ||
set: function set(target) { | ||
if (target !== undefined) { | ||
if (target && typeof target === 'object' && target.nodeType === 1) { | ||
this._target = target; | ||
} else { | ||
throw new Error('Invalid "target" value, use a valid Element'); | ||
if (this._action !== 'copy' && this._action !== 'cut') { | ||
throw new Error('Invalid "action" value, use either "copy" or "cut"'); | ||
} | ||
}, | ||
get: function get() { | ||
return this._action; | ||
} | ||
}, | ||
}, { | ||
key: 'target', | ||
set: function set(target) { | ||
if (target !== undefined) { | ||
if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) { | ||
this._target = target; | ||
} else { | ||
throw new Error('Invalid "target" value, use a valid Element'); | ||
} | ||
} | ||
}, | ||
get: function get() { | ||
return this._target; | ||
} | ||
}]); | ||
/** | ||
* Gets the `target` property. | ||
* @return {String|HTMLElement} | ||
*/ | ||
get: function get() { | ||
return this._target; | ||
} | ||
}]); | ||
return ClipboardAction; | ||
}(); | ||
return ClipboardAction; | ||
})(); | ||
module.exports = ClipboardAction; | ||
}); | ||
exports['default'] = ClipboardAction; | ||
module.exports = exports['default']; | ||
},{"select":6}],9:[function(require,module,exports){ | ||
'use strict'; | ||
(function (global, factory) { | ||
if (typeof define === "function" && define.amd) { | ||
define(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], factory); | ||
} else if (typeof exports !== "undefined") { | ||
factory(module, require('./clipboard-action'), require('tiny-emitter'), require('good-listener')); | ||
} else { | ||
var mod = { | ||
exports: {} | ||
}; | ||
factory(mod, global.clipboardAction, global.tinyEmitter, global.goodListener); | ||
global.clipboard = mod.exports; | ||
} | ||
})(this, function (module, _clipboardAction, _tinyEmitter, _goodListener) { | ||
'use strict'; | ||
exports.__esModule = true; | ||
var _clipboardAction2 = _interopRequireDefault(_clipboardAction); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
var _goodListener2 = _interopRequireDefault(_goodListener); | ||
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; } | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : { | ||
default: obj | ||
}; | ||
} | ||
var _clipboardAction = require('./clipboard-action'); | ||
function _classCallCheck(instance, Constructor) { | ||
if (!(instance instanceof Constructor)) { | ||
throw new TypeError("Cannot call a class as a function"); | ||
} | ||
} | ||
var _clipboardAction2 = _interopRequireDefault(_clipboardAction); | ||
function _possibleConstructorReturn(self, call) { | ||
if (!self) { | ||
throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); | ||
} | ||
var _tinyEmitter = require('tiny-emitter'); | ||
return call && (typeof call === "object" || typeof call === "function") ? call : self; | ||
} | ||
var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter); | ||
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); | ||
} | ||
var _goodListener = require('good-listener'); | ||
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; | ||
} | ||
var _goodListener2 = _interopRequireDefault(_goodListener); | ||
var Clipboard = function (_Emitter) { | ||
_inherits(Clipboard, _Emitter); | ||
/** | ||
* Base class which takes one or more elements, adds event listeners to them, | ||
* and instantiates a new `ClipboardAction` on each click. | ||
*/ | ||
/** | ||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger | ||
* @param {Object} options | ||
*/ | ||
var Clipboard = (function (_Emitter) { | ||
_inherits(Clipboard, _Emitter); | ||
function Clipboard(trigger, options) { | ||
_classCallCheck(this, Clipboard); | ||
/** | ||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger | ||
* @param {Object} options | ||
*/ | ||
var _this = _possibleConstructorReturn(this, _Emitter.call(this)); | ||
function Clipboard(trigger, options) { | ||
_classCallCheck(this, Clipboard); | ||
_this.resolveOptions(options); | ||
_this.listenClick(trigger); | ||
return _this; | ||
} | ||
_Emitter.call(this); | ||
/** | ||
* Defines if attributes would be resolved using internal setter functions | ||
* or custom functions that were passed in the constructor. | ||
* @param {Object} options | ||
*/ | ||
this.resolveOptions(options); | ||
this.listenClick(trigger); | ||
} | ||
/** | ||
* Helper function to retrieve attribute value. | ||
* @param {String} suffix | ||
* @param {Element} element | ||
*/ | ||
Clipboard.prototype.resolveOptions = function resolveOptions() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
/** | ||
* Defines if attributes would be resolved using internal setter functions | ||
* or custom functions that were passed in the constructor. | ||
* @param {Object} options | ||
*/ | ||
this.action = typeof options.action === 'function' ? options.action : this.defaultAction; | ||
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; | ||
this.text = typeof options.text === 'function' ? options.text : this.defaultText; | ||
}; | ||
Clipboard.prototype.resolveOptions = function resolveOptions() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
Clipboard.prototype.listenClick = function listenClick(trigger) { | ||
var _this2 = this; | ||
this.action = typeof options.action === 'function' ? options.action : this.defaultAction; | ||
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; | ||
this.text = typeof options.text === 'function' ? options.text : this.defaultText; | ||
}; | ||
this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) { | ||
return _this2.onClick(e); | ||
}); | ||
}; | ||
/** | ||
* Adds a click event listener to the passed trigger. | ||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger | ||
*/ | ||
Clipboard.prototype.onClick = function onClick(e) { | ||
var trigger = e.delegateTarget || e.currentTarget; | ||
Clipboard.prototype.listenClick = function listenClick(trigger) { | ||
var _this = this; | ||
if (this.clipboardAction) { | ||
this.clipboardAction = null; | ||
} | ||
this.listener = _goodListener2['default'](trigger, 'click', function (e) { | ||
return _this.onClick(e); | ||
}); | ||
}; | ||
this.clipboardAction = new _clipboardAction2.default({ | ||
action: this.action(trigger), | ||
target: this.target(trigger), | ||
text: this.text(trigger), | ||
trigger: trigger, | ||
emitter: this | ||
}); | ||
}; | ||
/** | ||
* Defines a new `ClipboardAction` on each click event. | ||
* @param {Event} e | ||
*/ | ||
Clipboard.prototype.defaultAction = function defaultAction(trigger) { | ||
return getAttributeValue('action', trigger); | ||
}; | ||
Clipboard.prototype.onClick = function onClick(e) { | ||
var trigger = e.delegateTarget || e.currentTarget; | ||
Clipboard.prototype.defaultTarget = function defaultTarget(trigger) { | ||
var selector = getAttributeValue('target', trigger); | ||
if (this.clipboardAction) { | ||
this.clipboardAction = null; | ||
} | ||
if (selector) { | ||
return document.querySelector(selector); | ||
} | ||
}; | ||
this.clipboardAction = new _clipboardAction2['default']({ | ||
action: this.action(trigger), | ||
target: this.target(trigger), | ||
text: this.text(trigger), | ||
trigger: trigger, | ||
emitter: this | ||
}); | ||
}; | ||
Clipboard.prototype.defaultText = function defaultText(trigger) { | ||
return getAttributeValue('text', trigger); | ||
}; | ||
/** | ||
* Default `action` lookup function. | ||
* @param {Element} trigger | ||
*/ | ||
Clipboard.prototype.destroy = function destroy() { | ||
this.listener.destroy(); | ||
Clipboard.prototype.defaultAction = function defaultAction(trigger) { | ||
return getAttributeValue('action', trigger); | ||
}; | ||
if (this.clipboardAction) { | ||
this.clipboardAction.destroy(); | ||
this.clipboardAction = null; | ||
} | ||
}; | ||
/** | ||
* Default `target` lookup function. | ||
* @param {Element} trigger | ||
*/ | ||
return Clipboard; | ||
}(_tinyEmitter2.default); | ||
Clipboard.prototype.defaultTarget = function defaultTarget(trigger) { | ||
var selector = getAttributeValue('target', trigger); | ||
if (selector) { | ||
return document.querySelector(selector); | ||
} | ||
}; | ||
/** | ||
* Default `text` lookup function. | ||
* @param {Element} trigger | ||
* Helper function to retrieve attribute value. | ||
* @param {String} suffix | ||
* @param {Element} element | ||
*/ | ||
function getAttributeValue(suffix, element) { | ||
var attribute = 'data-clipboard-' + suffix; | ||
Clipboard.prototype.defaultText = function defaultText(trigger) { | ||
return getAttributeValue('text', trigger); | ||
}; | ||
/** | ||
* Destroy lifecycle. | ||
*/ | ||
Clipboard.prototype.destroy = function destroy() { | ||
this.listener.destroy(); | ||
if (this.clipboardAction) { | ||
this.clipboardAction.destroy(); | ||
this.clipboardAction = null; | ||
if (!element.hasAttribute(attribute)) { | ||
return; | ||
} | ||
}; | ||
return Clipboard; | ||
})(_tinyEmitter2['default']); | ||
exports['default'] = Clipboard; | ||
function getAttributeValue(suffix, element) { | ||
var attribute = 'data-clipboard-' + suffix; | ||
if (!element.hasAttribute(attribute)) { | ||
return; | ||
return element.getAttribute(attribute); | ||
} | ||
return element.getAttribute(attribute); | ||
} | ||
module.exports = exports['default']; | ||
module.exports = Clipboard; | ||
}); | ||
},{"./clipboard-action":8,"good-listener":4,"tiny-emitter":7}]},{},[9])(9) | ||
}); |
/*! | ||
* clipboard.js v1.5.8 | ||
* clipboard.js v1.5.9 | ||
* https://zenorocha.github.io/clipboard.js | ||
@@ -7,2 +7,2 @@ * | ||
*/ | ||
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,r){function o(a,s){if(!n[a]){if(!e[a]){var c="function"==typeof require&&require;if(!s&&c)return c(a,!0);if(i)return i(a,!0);var u=new Error("Cannot find module '"+a+"'");throw u.code="MODULE_NOT_FOUND",u}var l=n[a]={exports:{}};e[a][0].call(l.exports,function(t){var n=e[a][1][t];return o(n?n:t)},l,l.exports,t,e,n,r)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;a<r.length;a++)o(r[a]);return o}({1:[function(t,e,n){var r=t("matches-selector");e.exports=function(t,e,n){for(var o=n?t:t.parentNode;o&&o!==document;){if(r(o,e))return o;o=o.parentNode}}},{"matches-selector":5}],2:[function(t,e,n){function r(t,e,n,r,i){var a=o.apply(this,arguments);return t.addEventListener(n,a,i),{destroy:function(){t.removeEventListener(n,a,i)}}}function o(t,e,n,r){return function(n){n.delegateTarget=i(n.target,e,!0),n.delegateTarget&&r.call(t,n)}}var i=t("closest");e.exports=r},{closest:1}],3:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){var e=Object.prototype.toString.call(t);return"[object Function]"===e}},{}],4:[function(t,e,n){function r(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!s.string(e))throw new TypeError("Second argument must be a String");if(!s.fn(n))throw new TypeError("Third argument must be a Function");if(s.node(t))return o(t,e,n);if(s.nodeList(t))return i(t,e,n);if(s.string(t))return a(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function o(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function a(t,e,n){return c(document.body,t,e,n)}var s=t("./is"),c=t("delegate");e.exports=r},{"./is":3,delegate:2}],5:[function(t,e,n){function r(t,e){if(i)return i.call(t,e);for(var n=t.parentNode.querySelectorAll(e),r=0;r<n.length;++r)if(n[r]==t)return!0;return!1}var o=Element.prototype,i=o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector||o.msMatchesSelector||o.oMatchesSelector;e.exports=r},{}],6:[function(t,e,n){function r(t){var e;if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName)t.focus(),t.setSelectionRange(0,t.value.length),e=t.value;else{t.hasAttribute("contenteditable")&&t.focus();var n=window.getSelection(),r=document.createRange();r.selectNodeContents(t),n.removeAllRanges(),n.addRange(r),e=n.toString()}return e}e.exports=r},{}],7:[function(t,e,n){function r(){}r.prototype={on:function(t,e,n){var r=this.e||(this.e={});return(r[t]||(r[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function r(){o.off(t,r),e.apply(n,arguments)}var o=this;return r._=e,this.on(t,r,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),r=0,o=n.length;for(r;o>r;r++)n[r].fn.apply(n[r].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),r=n[t],o=[];if(r&&e)for(var i=0,a=r.length;a>i;i++)r[i].fn!==e&&r[i].fn._!==e&&o.push(r[i]);return o.length?n[t]=o:delete n[t],this}},e.exports=r},{}],8:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}n.__esModule=!0;var i=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),a=t("select"),s=r(a),c=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return t.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=e.action,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""},t.prototype.initSelection=function t(){if(this.text&&this.target)throw new Error('Multiple attributes declared, use either "target" or "text"');if(this.text)this.selectFake();else{if(!this.target)throw new Error('Missing required attributes, use either "target" or "text"');this.selectTarget()}},t.prototype.selectFake=function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandler=document.body.addEventListener("click",function(){return e.removeFake()}),this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="absolute",this.fakeElem.style[n?"right":"left"]="-9999px",this.fakeElem.style.top=(window.pageYOffset||document.documentElement.scrollTop)+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=s.default(this.fakeElem),this.copyText()},t.prototype.removeFake=function t(){this.fakeHandler&&(document.body.removeEventListener("click"),this.fakeHandler=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)},t.prototype.selectTarget=function t(){this.selectedText=s.default(this.target),this.copyText()},t.prototype.copyText=function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(n){e=!1}this.handleResult(e)},t.prototype.handleResult=function t(e){e?this.emitter.emit("success",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)}):this.emitter.emit("error",{action:this.action,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})},t.prototype.clearSelection=function t(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()},t.prototype.destroy=function t(){this.removeFake()},i(t,[{key:"action",set:function t(){var e=arguments.length<=0||void 0===arguments[0]?"copy":arguments[0];if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!=typeof e||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');this._target=e}},get:function t(){return this._target}}]),t}();n.default=c,e.exports=n.default},{select:6}],9:[function(t,e,n){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}n.__esModule=!0;var s=t("./clipboard-action"),c=r(s),u=t("tiny-emitter"),l=r(u),f=t("good-listener"),d=r(f),h=function(t){function e(n,r){o(this,e),t.call(this),this.resolveOptions(r),this.listenClick(n)}return i(e,t),e.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText},e.prototype.listenClick=function t(e){var n=this;this.listener=d.default(e,"click",function(t){return n.onClick(t)})},e.prototype.onClick=function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new c.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})},e.prototype.defaultAction=function t(e){return a("action",e)},e.prototype.defaultTarget=function t(e){var n=a("target",e);return n?document.querySelector(n):void 0},e.prototype.defaultText=function t(e){return a("text",e)},e.prototype.destroy=function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)},e}(l.default);n.default=h,e.exports=n.default},{"./clipboard-action":8,"good-listener":4,"tiny-emitter":7}]},{},[9])(9)}); | ||
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function r(c,s){if(!n[c]){if(!e[c]){var a="function"==typeof require&&require;if(!s&&a)return a(c,!0);if(i)return i(c,!0);var l=new Error("Cannot find module '"+c+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[c]={exports:{}};e[c][0].call(u.exports,function(t){var n=e[c][1][t];return r(n?n:t)},u,u.exports,t,e,n,o)}return n[c].exports}for(var i="function"==typeof require&&require,c=0;c<o.length;c++)r(o[c]);return r}({1:[function(t,e,n){var o=t("matches-selector");e.exports=function(t,e,n){for(var r=n?t:t.parentNode;r&&r!==document;){if(o(r,e))return r;r=r.parentNode}}},{"matches-selector":5}],2:[function(t,e,n){function o(t,e,n,o,i){var c=r.apply(this,arguments);return t.addEventListener(n,c,i),{destroy:function(){t.removeEventListener(n,c,i)}}}function r(t,e,n,o){return function(n){n.delegateTarget=i(n.target,e,!0),n.delegateTarget&&o.call(t,n)}}var i=t("closest");e.exports=o},{closest:1}],3:[function(t,e,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){var e=Object.prototype.toString.call(t);return"[object Function]"===e}},{}],4:[function(t,e,n){function o(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!s.string(e))throw new TypeError("Second argument must be a String");if(!s.fn(n))throw new TypeError("Third argument must be a Function");if(s.node(t))return r(t,e,n);if(s.nodeList(t))return i(t,e,n);if(s.string(t))return c(t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function r(t,e,n){return t.addEventListener(e,n),{destroy:function(){t.removeEventListener(e,n)}}}function i(t,e,n){return Array.prototype.forEach.call(t,function(t){t.addEventListener(e,n)}),{destroy:function(){Array.prototype.forEach.call(t,function(t){t.removeEventListener(e,n)})}}}function c(t,e,n){return a(document.body,t,e,n)}var s=t("./is"),a=t("delegate");e.exports=o},{"./is":3,delegate:2}],5:[function(t,e,n){function o(t,e){if(i)return i.call(t,e);for(var n=t.parentNode.querySelectorAll(e),o=0;o<n.length;++o)if(n[o]==t)return!0;return!1}var r=Element.prototype,i=r.matchesSelector||r.webkitMatchesSelector||r.mozMatchesSelector||r.msMatchesSelector||r.oMatchesSelector;e.exports=o},{}],6:[function(t,e,n){function o(t){var e;if("INPUT"===t.nodeName||"TEXTAREA"===t.nodeName)t.focus(),t.setSelectionRange(0,t.value.length),e=t.value;else{t.hasAttribute("contenteditable")&&t.focus();var n=window.getSelection(),o=document.createRange();o.selectNodeContents(t),n.removeAllRanges(),n.addRange(o),e=n.toString()}return e}e.exports=o},{}],7:[function(t,e,n){function o(){}o.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){function o(){r.off(t,o),e.apply(n,arguments)}var r=this;return o._=e,this.on(t,o,n)},emit:function(t){var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;for(o;r>o;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,c=o.length;c>i;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(r,i){if("function"==typeof t&&t.amd)t(["module","select"],i);else if("undefined"!=typeof o)i(n,e("select"));else{var c={exports:{}};i(c,r.select),r.clipboardAction=c.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var r=n(e),i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},c=function(){function t(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}return function(e,n,o){return n&&t(e.prototype,n),o&&t(e,o),e}}(),s=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return t.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action=e.action,this.emitter=e.emitter,this.target=e.target,this.text=e.text,this.trigger=e.trigger,this.selectedText=""},t.prototype.initSelection=function t(){if(this.text&&this.target)throw new Error('Multiple attributes declared, use either "target" or "text"');if(this.text)this.selectFake();else{if(!this.target)throw new Error('Missing required attributes, use either "target" or "text"');this.selectTarget()}},t.prototype.selectFake=function t(){var e=this,n="rtl"==document.documentElement.getAttribute("dir");this.removeFake(),this.fakeHandler=document.body.addEventListener("click",function(){return e.removeFake()}),this.fakeElem=document.createElement("textarea"),this.fakeElem.style.fontSize="12pt",this.fakeElem.style.border="0",this.fakeElem.style.padding="0",this.fakeElem.style.margin="0",this.fakeElem.style.position="fixed",this.fakeElem.style[n?"right":"left"]="-9999px",this.fakeElem.style.top=(window.pageYOffset||document.documentElement.scrollTop)+"px",this.fakeElem.setAttribute("readonly",""),this.fakeElem.value=this.text,document.body.appendChild(this.fakeElem),this.selectedText=(0,r.default)(this.fakeElem),this.copyText()},t.prototype.removeFake=function t(){this.fakeHandler&&(document.body.removeEventListener("click"),this.fakeHandler=null),this.fakeElem&&(document.body.removeChild(this.fakeElem),this.fakeElem=null)},t.prototype.selectTarget=function t(){this.selectedText=(0,r.default)(this.target),this.copyText()},t.prototype.copyText=function t(){var e=void 0;try{e=document.execCommand(this.action)}catch(n){e=!1}this.handleResult(e)},t.prototype.handleResult=function t(e){e?this.emitter.emit("success",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)}):this.emitter.emit("error",{action:this.action,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})},t.prototype.clearSelection=function t(){this.target&&this.target.blur(),window.getSelection().removeAllRanges()},t.prototype.destroy=function t(){this.removeFake()},c(t,[{key:"action",set:function t(){var e=arguments.length<=0||void 0===arguments[0]?"copy":arguments[0];if(this._action=e,"copy"!==this._action&&"cut"!==this._action)throw new Error('Invalid "action" value, use either "copy" or "cut"')},get:function t(){return this._action}},{key:"target",set:function t(e){if(void 0!==e){if(!e||"object"!==("undefined"==typeof e?"undefined":i(e))||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');this._target=e}},get:function t(){return this._target}}]),t}();t.exports=s})},{select:6}],9:[function(e,n,o){!function(r,i){if("function"==typeof t&&t.amd)t(["module","./clipboard-action","tiny-emitter","good-listener"],i);else if("undefined"!=typeof o)i(n,e("./clipboard-action"),e("tiny-emitter"),e("good-listener"));else{var c={exports:{}};i(c,r.clipboardAction,r.tinyEmitter,r.goodListener),r.clipboard=c.exports}}(this,function(t,e,n,o){"use strict";function r(t){return t&&t.__esModule?t:{"default":t}}function i(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function c(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function s(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function a(t,e){var n="data-clipboard-"+t;if(e.hasAttribute(n))return e.getAttribute(n)}var l=r(e),u=r(n),f=r(o),d=function(t){function e(n,o){i(this,e);var r=c(this,t.call(this));return r.resolveOptions(o),r.listenClick(n),r}return s(e,t),e.prototype.resolveOptions=function t(){var e=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.action="function"==typeof e.action?e.action:this.defaultAction,this.target="function"==typeof e.target?e.target:this.defaultTarget,this.text="function"==typeof e.text?e.text:this.defaultText},e.prototype.listenClick=function t(e){var n=this;this.listener=(0,f.default)(e,"click",function(t){return n.onClick(t)})},e.prototype.onClick=function t(e){var n=e.delegateTarget||e.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new l.default({action:this.action(n),target:this.target(n),text:this.text(n),trigger:n,emitter:this})},e.prototype.defaultAction=function t(e){return a("action",e)},e.prototype.defaultTarget=function t(e){var n=a("target",e);return n?document.querySelector(n):void 0},e.prototype.defaultText=function t(e){return a("text",e)},e.prototype.destroy=function t(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)},e}(u.default);t.exports=d})},{"./clipboard-action":8,"good-listener":4,"tiny-emitter":7}]},{},[9])(9)}); |
@@ -1,242 +0,220 @@ | ||
'use strict'; | ||
(function (global, factory) { | ||
if (typeof define === "function" && define.amd) { | ||
define(['module', 'select'], factory); | ||
} else if (typeof exports !== "undefined") { | ||
factory(module, require('select')); | ||
} else { | ||
var mod = { | ||
exports: {} | ||
}; | ||
factory(mod, global.select); | ||
global.clipboardAction = mod.exports; | ||
} | ||
})(this, function (module, _select) { | ||
'use strict'; | ||
exports.__esModule = true; | ||
var _select2 = _interopRequireDefault(_select); | ||
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; }; })(); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
var _select = require('select'); | ||
var _select2 = _interopRequireDefault(_select); | ||
/** | ||
* Inner class which performs selection from either `text` or `target` | ||
* properties and then executes copy or cut operations. | ||
*/ | ||
var ClipboardAction = (function () { | ||
/** | ||
* @param {Object} options | ||
*/ | ||
function ClipboardAction(options) { | ||
_classCallCheck(this, ClipboardAction); | ||
this.resolveOptions(options); | ||
this.initSelection(); | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : { | ||
default: obj | ||
}; | ||
} | ||
/** | ||
* Defines base properties passed from constructor. | ||
* @param {Object} options | ||
*/ | ||
ClipboardAction.prototype.resolveOptions = function resolveOptions() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
this.action = options.action; | ||
this.emitter = options.emitter; | ||
this.target = options.target; | ||
this.text = options.text; | ||
this.trigger = options.trigger; | ||
this.selectedText = ''; | ||
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { | ||
return typeof obj; | ||
} : function (obj) { | ||
return obj && typeof Symbol === "function" && obj.constructor === Symbol ? "symbol" : typeof obj; | ||
}; | ||
/** | ||
* Decides which selection strategy is going to be applied based | ||
* on the existence of `text` and `target` properties. | ||
*/ | ||
function _classCallCheck(instance, Constructor) { | ||
if (!(instance instanceof Constructor)) { | ||
throw new TypeError("Cannot call a class as a function"); | ||
} | ||
} | ||
ClipboardAction.prototype.initSelection = function initSelection() { | ||
if (this.text && this.target) { | ||
throw new Error('Multiple attributes declared, use either "target" or "text"'); | ||
} else if (this.text) { | ||
this.selectFake(); | ||
} else if (this.target) { | ||
this.selectTarget(); | ||
} else { | ||
throw new Error('Missing required attributes, use either "target" or "text"'); | ||
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); | ||
} | ||
} | ||
}; | ||
/** | ||
* Creates a fake textarea element, sets its value from `text` property, | ||
* and makes a selection on it. | ||
*/ | ||
return function (Constructor, protoProps, staticProps) { | ||
if (protoProps) defineProperties(Constructor.prototype, protoProps); | ||
if (staticProps) defineProperties(Constructor, staticProps); | ||
return Constructor; | ||
}; | ||
}(); | ||
ClipboardAction.prototype.selectFake = function selectFake() { | ||
var _this = this; | ||
var ClipboardAction = function () { | ||
/** | ||
* @param {Object} options | ||
*/ | ||
var isRTL = document.documentElement.getAttribute('dir') == 'rtl'; | ||
function ClipboardAction(options) { | ||
_classCallCheck(this, ClipboardAction); | ||
this.removeFake(); | ||
this.resolveOptions(options); | ||
this.initSelection(); | ||
} | ||
this.fakeHandler = document.body.addEventListener('click', function () { | ||
return _this.removeFake(); | ||
}); | ||
/** | ||
* Defines base properties passed from constructor. | ||
* @param {Object} options | ||
*/ | ||
this.fakeElem = document.createElement('textarea'); | ||
// Prevent zooming on iOS | ||
this.fakeElem.style.fontSize = '12pt'; | ||
// Reset box model | ||
this.fakeElem.style.border = '0'; | ||
this.fakeElem.style.padding = '0'; | ||
this.fakeElem.style.margin = '0'; | ||
// Move element out of screen horizontally | ||
this.fakeElem.style.position = 'absolute'; | ||
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; | ||
// Move element to the same position vertically | ||
this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px'; | ||
this.fakeElem.setAttribute('readonly', ''); | ||
this.fakeElem.value = this.text; | ||
document.body.appendChild(this.fakeElem); | ||
ClipboardAction.prototype.resolveOptions = function resolveOptions() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
this.selectedText = _select2['default'](this.fakeElem); | ||
this.copyText(); | ||
}; | ||
this.action = options.action; | ||
this.emitter = options.emitter; | ||
this.target = options.target; | ||
this.text = options.text; | ||
this.trigger = options.trigger; | ||
/** | ||
* Only removes the fake element after another click event, that way | ||
* a user can hit `Ctrl+C` to copy because selection still exists. | ||
*/ | ||
this.selectedText = ''; | ||
}; | ||
ClipboardAction.prototype.removeFake = function removeFake() { | ||
if (this.fakeHandler) { | ||
document.body.removeEventListener('click'); | ||
this.fakeHandler = null; | ||
} | ||
ClipboardAction.prototype.initSelection = function initSelection() { | ||
if (this.text && this.target) { | ||
throw new Error('Multiple attributes declared, use either "target" or "text"'); | ||
} else if (this.text) { | ||
this.selectFake(); | ||
} else if (this.target) { | ||
this.selectTarget(); | ||
} else { | ||
throw new Error('Missing required attributes, use either "target" or "text"'); | ||
} | ||
}; | ||
if (this.fakeElem) { | ||
document.body.removeChild(this.fakeElem); | ||
this.fakeElem = null; | ||
} | ||
}; | ||
ClipboardAction.prototype.selectFake = function selectFake() { | ||
var _this = this; | ||
/** | ||
* Selects the content from element passed on `target` property. | ||
*/ | ||
var isRTL = document.documentElement.getAttribute('dir') == 'rtl'; | ||
ClipboardAction.prototype.selectTarget = function selectTarget() { | ||
this.selectedText = _select2['default'](this.target); | ||
this.copyText(); | ||
}; | ||
this.removeFake(); | ||
/** | ||
* Executes the copy operation based on the current selection. | ||
*/ | ||
this.fakeHandler = document.body.addEventListener('click', function () { | ||
return _this.removeFake(); | ||
}); | ||
ClipboardAction.prototype.copyText = function copyText() { | ||
var succeeded = undefined; | ||
this.fakeElem = document.createElement('textarea'); | ||
// Prevent zooming on iOS | ||
this.fakeElem.style.fontSize = '12pt'; | ||
// Reset box model | ||
this.fakeElem.style.border = '0'; | ||
this.fakeElem.style.padding = '0'; | ||
this.fakeElem.style.margin = '0'; | ||
// Move element out of screen horizontally | ||
this.fakeElem.style.position = 'fixed'; | ||
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px'; | ||
// Move element to the same position vertically | ||
this.fakeElem.style.top = (window.pageYOffset || document.documentElement.scrollTop) + 'px'; | ||
this.fakeElem.setAttribute('readonly', ''); | ||
this.fakeElem.value = this.text; | ||
try { | ||
succeeded = document.execCommand(this.action); | ||
} catch (err) { | ||
succeeded = false; | ||
} | ||
document.body.appendChild(this.fakeElem); | ||
this.handleResult(succeeded); | ||
}; | ||
this.selectedText = (0, _select2.default)(this.fakeElem); | ||
this.copyText(); | ||
}; | ||
/** | ||
* Fires an event based on the copy operation result. | ||
* @param {Boolean} succeeded | ||
*/ | ||
ClipboardAction.prototype.removeFake = function removeFake() { | ||
if (this.fakeHandler) { | ||
document.body.removeEventListener('click'); | ||
this.fakeHandler = null; | ||
} | ||
ClipboardAction.prototype.handleResult = function handleResult(succeeded) { | ||
if (succeeded) { | ||
this.emitter.emit('success', { | ||
action: this.action, | ||
text: this.selectedText, | ||
trigger: this.trigger, | ||
clearSelection: this.clearSelection.bind(this) | ||
}); | ||
} else { | ||
this.emitter.emit('error', { | ||
action: this.action, | ||
trigger: this.trigger, | ||
clearSelection: this.clearSelection.bind(this) | ||
}); | ||
} | ||
}; | ||
if (this.fakeElem) { | ||
document.body.removeChild(this.fakeElem); | ||
this.fakeElem = null; | ||
} | ||
}; | ||
/** | ||
* Removes current selection and focus from `target` element. | ||
*/ | ||
ClipboardAction.prototype.selectTarget = function selectTarget() { | ||
this.selectedText = (0, _select2.default)(this.target); | ||
this.copyText(); | ||
}; | ||
ClipboardAction.prototype.clearSelection = function clearSelection() { | ||
if (this.target) { | ||
this.target.blur(); | ||
} | ||
ClipboardAction.prototype.copyText = function copyText() { | ||
var succeeded = undefined; | ||
window.getSelection().removeAllRanges(); | ||
}; | ||
try { | ||
succeeded = document.execCommand(this.action); | ||
} catch (err) { | ||
succeeded = false; | ||
} | ||
/** | ||
* Sets the `action` to be performed which can be either 'copy' or 'cut'. | ||
* @param {String} action | ||
*/ | ||
this.handleResult(succeeded); | ||
}; | ||
/** | ||
* Destroy lifecycle. | ||
*/ | ||
ClipboardAction.prototype.handleResult = function handleResult(succeeded) { | ||
if (succeeded) { | ||
this.emitter.emit('success', { | ||
action: this.action, | ||
text: this.selectedText, | ||
trigger: this.trigger, | ||
clearSelection: this.clearSelection.bind(this) | ||
}); | ||
} else { | ||
this.emitter.emit('error', { | ||
action: this.action, | ||
trigger: this.trigger, | ||
clearSelection: this.clearSelection.bind(this) | ||
}); | ||
} | ||
}; | ||
ClipboardAction.prototype.destroy = function destroy() { | ||
this.removeFake(); | ||
}; | ||
ClipboardAction.prototype.clearSelection = function clearSelection() { | ||
if (this.target) { | ||
this.target.blur(); | ||
} | ||
_createClass(ClipboardAction, [{ | ||
key: 'action', | ||
set: function set() { | ||
var action = arguments.length <= 0 || arguments[0] === undefined ? 'copy' : arguments[0]; | ||
window.getSelection().removeAllRanges(); | ||
}; | ||
this._action = action; | ||
ClipboardAction.prototype.destroy = function destroy() { | ||
this.removeFake(); | ||
}; | ||
if (this._action !== 'copy' && this._action !== 'cut') { | ||
throw new Error('Invalid "action" value, use either "copy" or "cut"'); | ||
} | ||
}, | ||
_createClass(ClipboardAction, [{ | ||
key: 'action', | ||
set: function set() { | ||
var action = arguments.length <= 0 || arguments[0] === undefined ? 'copy' : arguments[0]; | ||
/** | ||
* Gets the `action` property. | ||
* @return {String} | ||
*/ | ||
get: function get() { | ||
return this._action; | ||
} | ||
this._action = action; | ||
/** | ||
* Sets the `target` property using an element | ||
* that will be have its content copied. | ||
* @param {Element} target | ||
*/ | ||
}, { | ||
key: 'target', | ||
set: function set(target) { | ||
if (target !== undefined) { | ||
if (target && typeof target === 'object' && target.nodeType === 1) { | ||
this._target = target; | ||
} else { | ||
throw new Error('Invalid "target" value, use a valid Element'); | ||
if (this._action !== 'copy' && this._action !== 'cut') { | ||
throw new Error('Invalid "action" value, use either "copy" or "cut"'); | ||
} | ||
}, | ||
get: function get() { | ||
return this._action; | ||
} | ||
}, | ||
}, { | ||
key: 'target', | ||
set: function set(target) { | ||
if (target !== undefined) { | ||
if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) { | ||
this._target = target; | ||
} else { | ||
throw new Error('Invalid "target" value, use a valid Element'); | ||
} | ||
} | ||
}, | ||
get: function get() { | ||
return this._target; | ||
} | ||
}]); | ||
/** | ||
* Gets the `target` property. | ||
* @return {String|HTMLElement} | ||
*/ | ||
get: function get() { | ||
return this._target; | ||
} | ||
}]); | ||
return ClipboardAction; | ||
}(); | ||
return ClipboardAction; | ||
})(); | ||
exports['default'] = ClipboardAction; | ||
module.exports = exports['default']; | ||
module.exports = ClipboardAction; | ||
}); |
@@ -1,156 +0,159 @@ | ||
'use strict'; | ||
(function (global, factory) { | ||
if (typeof define === "function" && define.amd) { | ||
define(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], factory); | ||
} else if (typeof exports !== "undefined") { | ||
factory(module, require('./clipboard-action'), require('tiny-emitter'), require('good-listener')); | ||
} else { | ||
var mod = { | ||
exports: {} | ||
}; | ||
factory(mod, global.clipboardAction, global.tinyEmitter, global.goodListener); | ||
global.clipboard = mod.exports; | ||
} | ||
})(this, function (module, _clipboardAction, _tinyEmitter, _goodListener) { | ||
'use strict'; | ||
exports.__esModule = true; | ||
var _clipboardAction2 = _interopRequireDefault(_clipboardAction); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | ||
var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
var _goodListener2 = _interopRequireDefault(_goodListener); | ||
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; } | ||
function _interopRequireDefault(obj) { | ||
return obj && obj.__esModule ? obj : { | ||
default: obj | ||
}; | ||
} | ||
var _clipboardAction = require('./clipboard-action'); | ||
function _classCallCheck(instance, Constructor) { | ||
if (!(instance instanceof Constructor)) { | ||
throw new TypeError("Cannot call a class as a function"); | ||
} | ||
} | ||
var _clipboardAction2 = _interopRequireDefault(_clipboardAction); | ||
function _possibleConstructorReturn(self, call) { | ||
if (!self) { | ||
throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); | ||
} | ||
var _tinyEmitter = require('tiny-emitter'); | ||
return call && (typeof call === "object" || typeof call === "function") ? call : self; | ||
} | ||
var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter); | ||
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); | ||
} | ||
var _goodListener = require('good-listener'); | ||
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; | ||
} | ||
var _goodListener2 = _interopRequireDefault(_goodListener); | ||
var Clipboard = function (_Emitter) { | ||
_inherits(Clipboard, _Emitter); | ||
/** | ||
* Base class which takes one or more elements, adds event listeners to them, | ||
* and instantiates a new `ClipboardAction` on each click. | ||
*/ | ||
/** | ||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger | ||
* @param {Object} options | ||
*/ | ||
var Clipboard = (function (_Emitter) { | ||
_inherits(Clipboard, _Emitter); | ||
function Clipboard(trigger, options) { | ||
_classCallCheck(this, Clipboard); | ||
/** | ||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger | ||
* @param {Object} options | ||
*/ | ||
var _this = _possibleConstructorReturn(this, _Emitter.call(this)); | ||
function Clipboard(trigger, options) { | ||
_classCallCheck(this, Clipboard); | ||
_this.resolveOptions(options); | ||
_this.listenClick(trigger); | ||
return _this; | ||
} | ||
_Emitter.call(this); | ||
/** | ||
* Defines if attributes would be resolved using internal setter functions | ||
* or custom functions that were passed in the constructor. | ||
* @param {Object} options | ||
*/ | ||
this.resolveOptions(options); | ||
this.listenClick(trigger); | ||
} | ||
/** | ||
* Helper function to retrieve attribute value. | ||
* @param {String} suffix | ||
* @param {Element} element | ||
*/ | ||
Clipboard.prototype.resolveOptions = function resolveOptions() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
/** | ||
* Defines if attributes would be resolved using internal setter functions | ||
* or custom functions that were passed in the constructor. | ||
* @param {Object} options | ||
*/ | ||
this.action = typeof options.action === 'function' ? options.action : this.defaultAction; | ||
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; | ||
this.text = typeof options.text === 'function' ? options.text : this.defaultText; | ||
}; | ||
Clipboard.prototype.resolveOptions = function resolveOptions() { | ||
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; | ||
Clipboard.prototype.listenClick = function listenClick(trigger) { | ||
var _this2 = this; | ||
this.action = typeof options.action === 'function' ? options.action : this.defaultAction; | ||
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget; | ||
this.text = typeof options.text === 'function' ? options.text : this.defaultText; | ||
}; | ||
this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) { | ||
return _this2.onClick(e); | ||
}); | ||
}; | ||
/** | ||
* Adds a click event listener to the passed trigger. | ||
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger | ||
*/ | ||
Clipboard.prototype.onClick = function onClick(e) { | ||
var trigger = e.delegateTarget || e.currentTarget; | ||
Clipboard.prototype.listenClick = function listenClick(trigger) { | ||
var _this = this; | ||
if (this.clipboardAction) { | ||
this.clipboardAction = null; | ||
} | ||
this.listener = _goodListener2['default'](trigger, 'click', function (e) { | ||
return _this.onClick(e); | ||
}); | ||
}; | ||
this.clipboardAction = new _clipboardAction2.default({ | ||
action: this.action(trigger), | ||
target: this.target(trigger), | ||
text: this.text(trigger), | ||
trigger: trigger, | ||
emitter: this | ||
}); | ||
}; | ||
/** | ||
* Defines a new `ClipboardAction` on each click event. | ||
* @param {Event} e | ||
*/ | ||
Clipboard.prototype.defaultAction = function defaultAction(trigger) { | ||
return getAttributeValue('action', trigger); | ||
}; | ||
Clipboard.prototype.onClick = function onClick(e) { | ||
var trigger = e.delegateTarget || e.currentTarget; | ||
Clipboard.prototype.defaultTarget = function defaultTarget(trigger) { | ||
var selector = getAttributeValue('target', trigger); | ||
if (this.clipboardAction) { | ||
this.clipboardAction = null; | ||
} | ||
if (selector) { | ||
return document.querySelector(selector); | ||
} | ||
}; | ||
this.clipboardAction = new _clipboardAction2['default']({ | ||
action: this.action(trigger), | ||
target: this.target(trigger), | ||
text: this.text(trigger), | ||
trigger: trigger, | ||
emitter: this | ||
}); | ||
}; | ||
Clipboard.prototype.defaultText = function defaultText(trigger) { | ||
return getAttributeValue('text', trigger); | ||
}; | ||
/** | ||
* Default `action` lookup function. | ||
* @param {Element} trigger | ||
*/ | ||
Clipboard.prototype.destroy = function destroy() { | ||
this.listener.destroy(); | ||
Clipboard.prototype.defaultAction = function defaultAction(trigger) { | ||
return getAttributeValue('action', trigger); | ||
}; | ||
if (this.clipboardAction) { | ||
this.clipboardAction.destroy(); | ||
this.clipboardAction = null; | ||
} | ||
}; | ||
/** | ||
* Default `target` lookup function. | ||
* @param {Element} trigger | ||
*/ | ||
return Clipboard; | ||
}(_tinyEmitter2.default); | ||
Clipboard.prototype.defaultTarget = function defaultTarget(trigger) { | ||
var selector = getAttributeValue('target', trigger); | ||
if (selector) { | ||
return document.querySelector(selector); | ||
} | ||
}; | ||
/** | ||
* Default `text` lookup function. | ||
* @param {Element} trigger | ||
* Helper function to retrieve attribute value. | ||
* @param {String} suffix | ||
* @param {Element} element | ||
*/ | ||
function getAttributeValue(suffix, element) { | ||
var attribute = 'data-clipboard-' + suffix; | ||
Clipboard.prototype.defaultText = function defaultText(trigger) { | ||
return getAttributeValue('text', trigger); | ||
}; | ||
/** | ||
* Destroy lifecycle. | ||
*/ | ||
Clipboard.prototype.destroy = function destroy() { | ||
this.listener.destroy(); | ||
if (this.clipboardAction) { | ||
this.clipboardAction.destroy(); | ||
this.clipboardAction = null; | ||
if (!element.hasAttribute(attribute)) { | ||
return; | ||
} | ||
}; | ||
return Clipboard; | ||
})(_tinyEmitter2['default']); | ||
exports['default'] = Clipboard; | ||
function getAttributeValue(suffix, element) { | ||
var attribute = 'data-clipboard-' + suffix; | ||
if (!element.hasAttribute(attribute)) { | ||
return; | ||
return element.getAttribute(attribute); | ||
} | ||
return element.getAttribute(attribute); | ||
} | ||
module.exports = exports['default']; | ||
module.exports = Clipboard; | ||
}); |
@@ -6,3 +6,3 @@ // Package metadata for Meteor.js. | ||
summary: "Modern copy to clipboard. No Flash. Just 2kb.", | ||
version: "1.5.8", | ||
version: "1.5.9", | ||
git: "https://github.com/zenorocha/clipboard.js" | ||
@@ -9,0 +9,0 @@ }); |
{ | ||
"name": "clipboard", | ||
"version": "1.5.8", | ||
"version": "1.5.9", | ||
"description": "Modern copy to clipboard. No Flash. Just 2kb", | ||
@@ -19,16 +19,20 @@ "repository": "zenorocha/clipboard.js", | ||
"devDependencies": { | ||
"babel": "^5.8.29", | ||
"babelify": "^6.3.0", | ||
"babel-cli": "^6.5.1", | ||
"babel-core": "^6.5.2", | ||
"babel-plugin-transform-es2015-modules-umd": "^6.5.0", | ||
"babel-preset-es2015": "^6.5.0", | ||
"babel-preset-es2015-loose": "^7.0.0", | ||
"babelify": "^7.2.0", | ||
"bannerify": "Vekat/bannerify#feature-option", | ||
"browserify": "^11.2.0", | ||
"browserify": "^13.0.0", | ||
"chai": "^3.4.1", | ||
"install": "^0.4.4", | ||
"karma": "^0.13.10", | ||
"karma-browserify": "^4.4.0", | ||
"karma-browserify": "^5.0.1", | ||
"karma-chai": "^0.1.0", | ||
"karma-mocha": "^0.2.0", | ||
"karma-phantomjs-launcher": "^0.2.1", | ||
"karma-phantomjs-launcher": "^1.0.0", | ||
"karma-sinon": "^1.0.4", | ||
"mocha": "^2.3.3", | ||
"phantomjs": "^1.9.18", | ||
"phantomjs-polyfill": "0.0.1", | ||
"phantomjs-prebuilt": "^2.1.4", | ||
"sinon": "^1.17.2", | ||
@@ -40,5 +44,5 @@ "uglify-js": "^2.4.24", | ||
"build": "npm run build-debug && npm run build-min", | ||
"build-debug": "browserify src/clipboard.js -s Clipboard -t [babelify --loose all] -p [bannerify --file .banner ] -o dist/clipboard.js", | ||
"build-debug": "browserify src/clipboard.js -s Clipboard -t [babelify] -p [bannerify --file .banner ] -o dist/clipboard.js", | ||
"build-min": "uglifyjs dist/clipboard.js --comments '/!/' -m screw_ie8=true -c screw_ie8=true,unused=false -o dist/clipboard.min.js", | ||
"build-watch": "watchify src/clipboard.js -s Clipboard -t [babelify --loose all] -o dist/clipboard.js -v", | ||
"build-watch": "watchify src/clipboard.js -s Clipboard -t [babelify] -o dist/clipboard.js -v", | ||
"test": "karma start --single-run", | ||
@@ -45,0 +49,0 @@ "prepublish": "babel src --out-dir lib --loose all" |
55817
21
929