Compare commits

..

9 Commits

Author SHA1 Message Date
Beto Muniz
d1eac52d40 Improve in-code doc comments 2021-05-17 12:42:07 -03:00
Beto Muniz
b43d93e69d Add types. Fix tsd check env. Improve in-code doc comments 2021-05-17 12:38:18 -03:00
Beto Muniz
ef32d876de Improve folder structure. Clean up code. 2021-04-15 10:49:00 -03:00
Beto Muniz
e7e38a18e0 Migrate clipboard-action-default to functional approach. Update tests. Add tests 2021-04-15 01:25:22 -03:00
Beto Muniz
455b7fdb0c Update condition syntax based on PR reviews 2021-04-11 14:30:49 -03:00
Beto Muniz
a8c35683a6 Add tests to static copy/cut methods 2021-04-11 14:18:57 -03:00
Beto Muniz
f267fb88f2 Add/update tests 2021-04-11 14:13:39 -03:00
Beto Muniz
f99af48fd1 Update tests to accommodate new proposal 2021-03-29 12:06:10 -03:00
Beto Muniz
b0aa1dfaca Isolate cut, copy and core helper functions. 2021-03-29 11:21:28 -03:00
21 changed files with 498 additions and 428 deletions

View File

@@ -5,12 +5,9 @@ name: build
on:
push:
branches: [master]
branches: [ master ]
pull_request:
branches: [master]
env:
FORCE_COLOR: 2
branches: [ master ]
jobs:
build:
@@ -23,12 +20,13 @@ jobs:
# For now is not possible to target LTS verssions =/ check progress here https://github.com/actions/setup-node/issues/26
steps:
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm run build --if-present
- run: npm run lint
- run: npm test
- uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm run build --if-present
- run: npm run lint
- run: npm test

View File

@@ -1,6 +1,6 @@
{
"name": "clipboard",
"version": "2.0.11",
"version": "2.0.8",
"description": "Modern copy to clipboard. No Flash. Just 3kb",
"license": "MIT",
"main": "dist/clipboard.js",

View File

@@ -20,15 +20,11 @@
var clipboard = new ClipboardJS(btn);
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
clipboard.on('error', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
</script>
</body>

View File

@@ -20,15 +20,11 @@
var clipboard = new ClipboardJS(btns);
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
clipboard.on('error', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
</script>
</body>

View File

@@ -19,15 +19,11 @@
var clipboard = new ClipboardJS('.btn');
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
clipboard.on('error', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
</script>
</body>

View File

@@ -22,15 +22,11 @@
});
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
clipboard.on('error', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
</script>
</body>

View File

@@ -21,15 +21,11 @@
});
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
clipboard.on('error', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
</script>
</body>

View File

@@ -24,15 +24,11 @@
var clipboard = new ClipboardJS('.btn');
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
clipboard.on('error', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
</script>
</body>

View File

@@ -1,37 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>target-input-number</title>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<!-- 1. Define some markup -->
<input id="foo" type="number" value="0" />
<button
class="btn"
data-clipboard-action="copy"
data-clipboard-target="#foo"
>
Copy
</button>
<!-- 2. Include library -->
<script src="../dist/clipboard.min.js"></script>
<!-- 3. Instantiate clipboard -->
<script>
var clipboard = new ClipboardJS('.btn');
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
});
clipboard.on('error', function (e) {
console.log(e);
});
</script>
</body>
</html>

View File

@@ -24,9 +24,7 @@
var clipboard = new ClipboardJS('.btn');
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
clipboard.on('error', function (e) {

View File

@@ -24,15 +24,11 @@
var clipboard = new ClipboardJS('.btn');
clipboard.on('success', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
clipboard.on('error', function (e) {
console.info('Action:', e.action);
console.info('Text:', e.text);
console.info('Trigger:', e.trigger);
console.log(e);
});
</script>
</body>

80
dist/clipboard.js vendored
View File

@@ -1,5 +1,5 @@
/*!
* clipboard.js v2.0.11
* clipboard.js v2.0.8
* https://clipboardjs.com/
*
* Licensed MIT © Zeno Rocha
@@ -17,7 +17,7 @@
return /******/ (function() { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ 686:
/***/ 747:
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
"use strict";
@@ -49,12 +49,12 @@ function command(type) {
return false;
}
}
;// CONCATENATED MODULE: ./src/actions/cut.js
;// CONCATENATED MODULE: ./src/clipboard-action-cut.js
/**
* Cut action wrapper.
* @param {String|HTMLElement} target
* @param {HTMLElement} target
* @return {String}
*/
@@ -64,7 +64,7 @@ var ClipboardActionCut = function ClipboardActionCut(target) {
return selectedText;
};
/* harmony default export */ var actions_cut = (ClipboardActionCut);
/* harmony default export */ var clipboard_action_cut = (ClipboardActionCut);
;// CONCATENATED MODULE: ./src/common/create-fake-element.js
/**
* Creates a fake textarea element with a value.
@@ -90,25 +90,10 @@ function createFakeElement(value) {
fakeElement.value = value;
return fakeElement;
}
;// CONCATENATED MODULE: ./src/actions/copy.js
;// CONCATENATED MODULE: ./src/clipboard-action-copy.js
/**
* Create fake copy action wrapper using a fake element.
* @param {String} target
* @param {Object} options
* @return {String}
*/
var fakeCopyAction = function fakeCopyAction(value, options) {
var fakeElement = createFakeElement(value);
options.container.appendChild(fakeElement);
var selectedText = select_default()(fakeElement);
command('copy');
fakeElement.remove();
return selectedText;
};
/**
* Copy action wrapper.
* @param {String|HTMLElement} target
@@ -116,7 +101,6 @@ var fakeCopyAction = function fakeCopyAction(value, options) {
* @return {String}
*/
var ClipboardActionCopy = function ClipboardActionCopy(target) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
container: document.body
@@ -124,10 +108,11 @@ var ClipboardActionCopy = function ClipboardActionCopy(target) {
var selectedText = '';
if (typeof target === 'string') {
selectedText = fakeCopyAction(target, options);
} else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {
// If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
selectedText = fakeCopyAction(target.value, options);
var fakeElement = createFakeElement(target);
options.container.appendChild(fakeElement);
selectedText = select_default()(fakeElement);
command('copy');
fakeElement.remove();
} else {
selectedText = select_default()(target);
command('copy');
@@ -136,8 +121,8 @@ var ClipboardActionCopy = function ClipboardActionCopy(target) {
return selectedText;
};
/* harmony default export */ var actions_copy = (ClipboardActionCopy);
;// CONCATENATED MODULE: ./src/actions/default.js
/* harmony default export */ var clipboard_action_copy = (ClipboardActionCopy);
;// CONCATENATED MODULE: ./src/clipboard-action-default.js
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
@@ -178,20 +163,20 @@ var ClipboardActionDefault = function ClipboardActionDefault() {
if (text) {
return actions_copy(text, {
return clipboard_action_copy(text, {
container: container
});
} // Defines which selection strategy based on `target` property.
if (target) {
return action === 'cut' ? actions_cut(target) : actions_copy(target, {
return action === 'cut' ? clipboard_action_cut(target) : clipboard_action_copy(target, {
container: container
});
}
};
/* harmony default export */ var actions_default = (ClipboardActionDefault);
/* harmony default export */ var clipboard_action_default = (ClipboardActionDefault);
;// CONCATENATED MODULE: ./src/clipboard.js
function clipboard_typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return clipboard_typeof(obj); }
@@ -256,6 +241,8 @@ var Clipboard = /*#__PURE__*/function (_Emitter) {
_classCallCheck(this, Clipboard);
_this = _super.call(this);
_this.ClipboardActionCut = clipboard_action_cut.bind(_assertThisInitialized(_this));
_this.ClipboardActionCopy = clipboard_action_copy.bind(_assertThisInitialized(_this));
_this.resolveOptions(options);
@@ -302,23 +289,23 @@ var Clipboard = /*#__PURE__*/function (_Emitter) {
key: "onClick",
value: function onClick(e) {
var trigger = e.delegateTarget || e.currentTarget;
var action = this.action(trigger) || 'copy';
var text = actions_default({
action: action,
var selectedText = clipboard_action_default({
action: this.action(trigger),
container: this.container,
target: this.target(trigger),
text: this.text(trigger)
}); // Fires an event based on the copy operation result.
this.emit(text ? 'success' : 'error', {
action: action,
text: text,
this.emit(selectedText ? 'success' : 'error', {
action: this.action,
text: selectedText,
trigger: trigger,
clearSelection: function clearSelection() {
if (trigger) {
trigger.focus();
}
document.activeElement.blur();
window.getSelection().removeAllRanges();
}
});
@@ -347,13 +334,6 @@ var Clipboard = /*#__PURE__*/function (_Emitter) {
return document.querySelector(selector);
}
}
/**
* Allow fire programmatically a copy action
* @param {String|HTMLElement} target
* @param {Object} options
* @returns Text copied.
*/
}, {
key: "defaultText",
@@ -379,18 +359,12 @@ var Clipboard = /*#__PURE__*/function (_Emitter) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
container: document.body
};
return actions_copy(target, options);
return clipboard_action_copy(target, options);
}
/**
* Allow fire programmatically a cut action
* @param {String|HTMLElement} target
* @returns Text cutted.
*/
}, {
key: "cut",
value: function cut(target) {
return actions_cut(target);
return clipboard_action_cut(target);
}
/**
* Returns the support of the given action, or all actions if no action is
@@ -884,7 +858,7 @@ module.exports.TinyEmitter = E;
/******/ // module exports must be returned from runtime so entry inlining is disabled
/******/ // startup
/******/ // Load entry module and return exports
/******/ return __webpack_require__(686);
/******/ return __webpack_require__(747);
/******/ })()
.default;
});

File diff suppressed because one or more lines are too long

648
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,7 @@
Package.describe({
name: 'zenorocha:clipboard',
summary: 'Modern copy to clipboard. No Flash. Just 3kb.',
version: '2.0.11',
version: '2.0.8',
git: 'https://github.com/zenorocha/clipboard.js',
});

View File

@@ -1,6 +1,6 @@
{
"name": "clipboard",
"version": "2.0.11",
"version": "2.0.8",
"description": "Modern copy to clipboard. No Flash. Just 2kb",
"homepage": "https://clipboardjs.com",
"repository": "zenorocha/clipboard.js",

View File

@@ -2,22 +2,6 @@ import select from 'select';
import command from '../common/command';
import createFakeElement from '../common/create-fake-element';
/**
* Create fake copy action wrapper using a fake element.
* @param {String} target
* @param {Object} options
* @return {String}
*/
const fakeCopyAction = (value, options) => {
const fakeElement = createFakeElement(value);
options.container.appendChild(fakeElement);
const selectedText = select(fakeElement);
command('copy');
fakeElement.remove();
return selectedText;
};
/**
* Copy action wrapper.
* @param {String|HTMLElement} target
@@ -30,13 +14,11 @@ const ClipboardActionCopy = (
) => {
let selectedText = '';
if (typeof target === 'string') {
selectedText = fakeCopyAction(target, options);
} else if (
target instanceof HTMLInputElement &&
!['text', 'search', 'url', 'tel', 'password'].includes(target?.type)
) {
// If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
selectedText = fakeCopyAction(target.value, options);
const fakeElement = createFakeElement(target);
options.container.appendChild(fakeElement);
selectedText = select(fakeElement);
command('copy');
fakeElement.remove();
} else {
selectedText = select(target);
command('copy');

2
src/clipboard.d.ts vendored
View File

@@ -39,7 +39,7 @@ declare class ClipboardJS {
/**
* Fires a copy action
*/
static copy(target: string | Element, options?: CopyActionOptions): string;
static copy(target: string | Element, options: CopyActionOptions): string;
/**
* Fires a cut action

View File

@@ -69,23 +69,23 @@ class Clipboard extends Emitter {
*/
onClick(e) {
const trigger = e.delegateTarget || e.currentTarget;
const action = this.action(trigger) || 'copy';
const text = ClipboardActionDefault({
action,
const selectedText = ClipboardActionDefault({
action: this.action(trigger),
container: this.container,
target: this.target(trigger),
text: this.text(trigger),
});
// Fires an event based on the copy operation result.
this.emit(text ? 'success' : 'error', {
action,
text,
this.emit(selectedText ? 'success' : 'error', {
action: this.action,
text: selectedText,
trigger,
clearSelection() {
if (trigger) {
trigger.focus();
}
document.activeElement.blur();
window.getSelection().removeAllRanges();
},
});

View File

@@ -51,19 +51,5 @@ describe('ClipboardActionCopy', () => {
assert.equal(selectedText, text);
});
it('should select its value in a input number based on text', () => {
const value = 1;
document.querySelector('#input').setAttribute('type', 'number');
document.querySelector('#input').setAttribute('value', value);
const selectedText = ClipboardActionCopy(
document.querySelector('#input'),
{
container: document.body,
}
);
assert.equal(Number(selectedText), value);
});
});
});

View File

@@ -158,7 +158,6 @@ describe('Clipboard', () => {
clipboard.on('success', (e) => {
assert.property(e, 'action');
assert.equal(e.action, 'copy');
assert.property(e, 'text');
assert.property(e, 'trigger');
assert.property(e, 'clearSelection');
@@ -171,16 +170,16 @@ describe('Clipboard', () => {
});
describe('#clearSelection', () => {
it('should clear text selection without moving focus', (done) => {
it('should remove focus from target and text selection', (done) => {
let clipboard = new Clipboard('.btn');
clipboard.on('success', (e) => {
e.clearSelection();
let selectedElem = document.activeElement;
let selectedText = window.getSelection().toString();
assert.equal(selectedElem, e.trigger);
e.clearSelection();
assert.equal(selectedElem, document.body);
assert.equal(selectedText, '');
done();