-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathutils.js
141 lines (119 loc) · 3.67 KB
/
utils.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
export function uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
var r = crypto.getRandomValues(new Uint8Array(1))[0] % 16 | 0,
v = c == 'x' ? r : r & 0x3 | 0x8;
return v.toString(16);
});
}
export function create(tagName, attributes = {}, children = []) {
const element = document.createElement(tagName);
const specialProps = ['class', 'style'];
Object.assign(element, _.omit(attributes, specialProps));
if (attributes.class) {
element.classList.add(...attributes.class.split(' '));
}
if (attributes.style) {
if (typeof attributes.style === 'object') {
Object.assign(element.style, attributes.style);
} else {
element.style = attributes.style;
}
}
element.append(...children);
return element;
}
export function enableAutoResize(input) {
function updateSize() {
requestAnimationFrame(() => {
input.size = (input.value.length || input.placeholder.length || 1);
});
}
for (let eventName of ['keyup', 'keypress', 'focus', 'blur', 'change']) {
input.addEventListener(eventName, updateSize, false);
input.classList.add('variable-length');
}
updateSize();
}
/**
* Taken from and modified using:
* https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript
*/
export function copyTextToClipboard(text) {
const textArea = document.createElement("textarea");
//
// *** This styling is an extra step which is likely not required. ***
//
// Why is it here? To ensure:
// 1. the element is able to have focus and selection.
// 2. if element was to flash render it has minimal visual impact.
// 3. less flakyness with selection and copying which **might** occur if
// the textarea element is not visible.
//
// The likelihood is the element won't even render, not even a flash,
// so some of these are just precautions. However in IE the element
// is visible whilst the popup box asking the user for permission for
// the web page to copy to the clipboard.
//
Object.assign(textArea.style, {
// Place in top-left corner of screen regardless of scroll position.
position: 'fixed',
top: 0,
left: 0,
// Ensure it has a small width and height. Setting to 1px / 1em
// doesn't work as this gives a negative w/h on some browsers.
width: '2em',
height: '2em',
// We don't need padding, reducing the size if it does flash render.
padding: 0,
// Clean up any borders.
border: 'none',
outline: 'none',
boxShadow: 'none',
// Avoid flash of white box if rendered for any reason.
background: 'transparent'
});
textArea.value = text;
document.body.appendChild(textArea);
textArea.select();
let supported;
try {
supported = document.queryCommandSupported('copy');
} catch (err) {
lively.warn('Copy to clipboard not supported.', err);
supported = false;
}
if (supported) {
let enabled;
try {
enabled = document.queryCommandEnabled('copy');
} catch (err) {
lively.warn('Copy to clipboard not enabled.', err);
enabled = false;
}
if (enabled) {
try {
if (!document.execCommand('copy')) {
lively.warn('Copying not successful.');
}
} catch (err) {
lively.warn('Unable to execute copy.');
}
}
}
document.body.removeChild(textArea);
}
export function remove(array, item) {
const index = array.indexOf(item);
const hasItem = index > -1;
if (hasItem) {
array.splice(index, 1);
}
return hasItem;
}
export function removeAll(array, condition) {
const toBeRemoved = array.filter(condition);
toBeRemoved.forEach(item => {
remove(array, item);
});
return toBeRemoved;
}