cavalion-js 1.0.82 → 1.0.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.md +4 -0
- package/CHANGELOG.md +6 -0
- package/package.json +1 -1
- package/src/js/Method.js +2 -2
- package/src/js/_js.js +19 -16
- package/src/js/extensions.js +22 -7
- package/src/js/nameOf.js +8 -5
- package/src/locale.js +5 -1
- package/src/stylesheet.js +14 -4
- package/src/util/Browser.js +1 -1
- package/src/util/Clipboard.js +118 -42
- package/src/util/HotkeyManager.js +4 -4
package/.md
CHANGED
|
@@ -51,6 +51,10 @@
|
|
|
51
51
|
- [Scaffold.js](src/js/:)
|
|
52
52
|
- [Type.js](src/js/:)
|
|
53
53
|
|
|
54
|
+
# `2025/01/24` locales in WebKit
|
|
55
|
+
|
|
56
|
+

|
|
57
|
+
|
|
54
58
|
# `2023/05/23` countWords
|
|
55
59
|
|
|
56
60
|
String.prototype.countLinesAndWords = function() {
|
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
package/src/js/Method.js
CHANGED
|
@@ -27,8 +27,8 @@ define(["module", "./nameOf"], function(module, nameOf) {
|
|
|
27
27
|
* @returns {Array}
|
|
28
28
|
*/
|
|
29
29
|
function copy_args(args, callee) {
|
|
30
|
-
if(callee
|
|
31
|
-
return js.
|
|
30
|
+
if(callee !== false) {
|
|
31
|
+
return js.mi(copy_args(args, false), { callee: args.callee });
|
|
32
32
|
}
|
|
33
33
|
return Array.prototype.slice.apply(args, [0]);
|
|
34
34
|
}
|
package/src/js/_js.js
CHANGED
|
@@ -88,19 +88,21 @@ define(function(require) {
|
|
|
88
88
|
* @returns
|
|
89
89
|
*/
|
|
90
90
|
var root = (obj = obj || global);
|
|
91
|
-
if(typeof name === "string")
|
|
91
|
+
if (typeof name === "string") {
|
|
92
|
+
name = name.split(/(?<!\\)\./).map(part => part.replace(/\\\./g, ".")); // Split by unescaped dots, replace escaped dots
|
|
93
|
+
}
|
|
92
94
|
|
|
93
|
-
for(
|
|
95
|
+
for (var i = 0, l = name.length - 1; i < l; ++i) {
|
|
94
96
|
obj = obj[name[i]];
|
|
95
|
-
if(obj === null || obj === undefined || (typeof obj !== "object" && typeof obj !== "function")) {
|
|
97
|
+
if (obj === null || obj === undefined || (typeof obj !== "object" && typeof obj !== "function")) {
|
|
96
98
|
return defaultValue !== undefined ? js.set(name.join("."), defaultValue, root) : undefined;
|
|
97
99
|
}
|
|
98
100
|
}
|
|
99
|
-
|
|
100
|
-
if(defaultValue !== undefined && obj[name[l]] === undefined) {
|
|
101
|
+
|
|
102
|
+
if (defaultValue !== undefined && obj[name[l]] === undefined) {
|
|
101
103
|
return js.set(name.join("."), defaultValue, root);
|
|
102
104
|
}
|
|
103
|
-
|
|
105
|
+
|
|
104
106
|
return obj[name[l]];
|
|
105
107
|
},
|
|
106
108
|
set: function(name, value, obj) {
|
|
@@ -111,16 +113,17 @@ define(function(require) {
|
|
|
111
113
|
* @param obj
|
|
112
114
|
* @returns
|
|
113
115
|
*/
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
116
|
+
obj = obj || global;
|
|
117
|
+
name = name.split(/(?<!\\)\./).map(part => part.replace(/\\\./g, ".")); // Handle escaped dots properly
|
|
118
|
+
|
|
119
|
+
for (var i = 0, l = name.length - 1; i < l; ++i) {
|
|
120
|
+
if (obj[name[i]] === undefined) {
|
|
121
|
+
obj[name[i]] = {};
|
|
122
|
+
}
|
|
123
|
+
obj = obj[name[i]];
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return (obj[name[name.length - 1]] = value);
|
|
124
127
|
},
|
|
125
128
|
normalize: function(base, uri, first) {
|
|
126
129
|
/**
|
package/src/js/extensions.js
CHANGED
|
@@ -107,6 +107,14 @@ define(function(require) {
|
|
|
107
107
|
before = arr.splice(0, newIndex);
|
|
108
108
|
return before.concat([item]).concat(arr);
|
|
109
109
|
};
|
|
110
|
+
Array.moveItem = function(array, from, to) {
|
|
111
|
+
if (from < 0 || from >= array.length || to < 0 || to >= array.length) {
|
|
112
|
+
console.error("Invalid indices");
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const [item] = array.splice(from, 1); // Remove item from 'from' index
|
|
116
|
+
array.splice(to, 0, item); // Insert item at 'to' index
|
|
117
|
+
};
|
|
110
118
|
Array.fn = {
|
|
111
119
|
nonNil(item) { return item !== null && item !== undefined; },
|
|
112
120
|
nonNull(item) { return item !== null },
|
|
@@ -471,16 +479,23 @@ define(function(require) {
|
|
|
471
479
|
/ 8.64e7) + 1) / 7);
|
|
472
480
|
};
|
|
473
481
|
Date.format = function (dt, fmt) {
|
|
474
|
-
|
|
482
|
+
if(!(dt instanceof Date)) {
|
|
475
483
|
dt = new Date(dt);
|
|
476
484
|
}
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
);
|
|
485
|
+
const formatter = Date.format.formats[fmt];
|
|
486
|
+
|
|
487
|
+
if(typeof formatter === "function") {
|
|
488
|
+
return formatter(dt, fmt);
|
|
482
489
|
}
|
|
483
|
-
|
|
490
|
+
|
|
491
|
+
return "unknown format " + fmt + " (" + dt.toISOString() + ")";
|
|
492
|
+
};
|
|
493
|
+
Date.format.formats = {
|
|
494
|
+
'YYYY/MM/DD hh:mm': (dt, fmt) => js.sf("%d/%02d/%02d %02d:%02d",
|
|
495
|
+
dt.getFullYear(), dt.getMonth() + 1, dt.getDate(),
|
|
496
|
+
dt.getHours(), dt.getMinutes()),
|
|
497
|
+
'YYYY/MM/DD': (dt, fmt) => js.sf("%d/%02d/%02d",
|
|
498
|
+
dt.getFullYear(), dt.getMonth() + 1, dt.getDate())
|
|
484
499
|
};
|
|
485
500
|
|
|
486
501
|
});
|
package/src/js/nameOf.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
define(function() {
|
|
2
2
|
|
|
3
3
|
String.of = function(obj) { // TODO require("String.of")
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
try {
|
|
5
|
+
return nameOf(obj);
|
|
6
|
+
} catch(e) {
|
|
7
|
+
debugger;
|
|
8
|
+
}
|
|
9
9
|
};
|
|
10
10
|
|
|
11
11
|
var methods = (nameOf.methods = [
|
|
@@ -14,6 +14,8 @@ define(function() {
|
|
|
14
14
|
(obj) => (obj.naam || obj.omschrijving || obj.code || obj.name || obj.description),
|
|
15
15
|
(obj) => (obj.Naam || obj.Omschrijving || obj.Code || obj.Name || obj.Description),
|
|
16
16
|
(obj) => (obj.Titel || obj.titel || obj.Title || obj.title),
|
|
17
|
+
(obj) => { if(obj.status && obj.statusText) return js.sf("%s - %s", obj.status, obj.statusText); }
|
|
18
|
+
|
|
17
19
|
// (obj) => {
|
|
18
20
|
// var s = (obj.id || obj.Id || obj.ID) ||
|
|
19
21
|
// (obj.naam || obj.omschrijving || obj.code || obj.name || obj.description) ||
|
|
@@ -22,6 +24,7 @@ define(function() {
|
|
|
22
24
|
|
|
23
25
|
// return typeof s === "string" ? s : undefined;
|
|
24
26
|
// }
|
|
27
|
+
|
|
25
28
|
]);
|
|
26
29
|
|
|
27
30
|
methods.before = [];
|
package/src/locale.js
CHANGED
|
@@ -11,8 +11,12 @@ define(function(require) {
|
|
|
11
11
|
var locale = require("locale");
|
|
12
12
|
locale.set("du-NL");
|
|
13
13
|
*/
|
|
14
|
+
|
|
15
|
+
// const trace = [];
|
|
14
16
|
|
|
15
17
|
function locale(id) {
|
|
18
|
+
// if(typeof id === "string") trace.push(id);
|
|
19
|
+
|
|
16
20
|
var loc = locale.loc;//arguments.callee.loc;
|
|
17
21
|
|
|
18
22
|
function resolve(id) {
|
|
@@ -93,7 +97,6 @@ define(function(require) {
|
|
|
93
97
|
|
|
94
98
|
var r;
|
|
95
99
|
if(id instanceof Array) { // #CVLN-202209091-1
|
|
96
|
-
// r = resolve(id.join(""));
|
|
97
100
|
var id_ = id.join("");
|
|
98
101
|
r = locale[loc][id.join("")];
|
|
99
102
|
while(r === undefined && id.length > 1) {
|
|
@@ -214,6 +217,7 @@ define(function(require) {
|
|
|
214
217
|
|
|
215
218
|
return {
|
|
216
219
|
locale: locale,
|
|
220
|
+
// trace: trace,
|
|
217
221
|
|
|
218
222
|
prefixed: locale.prefixed,
|
|
219
223
|
module: function(module) {
|
package/src/stylesheet.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
define(function() {
|
|
2
|
-
|
|
2
|
+
|
|
3
|
+
var timeout;
|
|
4
|
+
|
|
3
5
|
return {
|
|
4
6
|
load: function (name, req, onLoad, config) {
|
|
5
7
|
if(typeof document !== "undefined") {
|
|
@@ -20,9 +22,17 @@ define(function() {
|
|
|
20
22
|
if(less.sheets.indexOf(link) === -1) {
|
|
21
23
|
less.sheets.push(link);
|
|
22
24
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
if(timeout) {
|
|
27
|
+
window.clearTimeout(timeout);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
timeout = window.setTimeout(() => {
|
|
31
|
+
// TODO how to only refresh the current one?
|
|
32
|
+
less.refresh(true)
|
|
33
|
+
}, 2750);
|
|
34
|
+
|
|
35
|
+
onLoad(link);
|
|
26
36
|
});
|
|
27
37
|
}
|
|
28
38
|
} else {
|
package/src/util/Browser.js
CHANGED
package/src/util/Clipboard.js
CHANGED
|
@@ -1,47 +1,123 @@
|
|
|
1
|
-
define([], () =>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
define([], (Clipboard) => {
|
|
2
|
+
|
|
3
|
+
const listeners = {
|
|
4
|
+
copy: [],
|
|
5
|
+
paste: []
|
|
6
|
+
};
|
|
7
|
+
const createEvent = (eventName) => ({
|
|
8
|
+
addListener: (callback) => {
|
|
9
|
+
if (typeof callback !== 'function') {
|
|
10
|
+
throw new Error('Listener must be a function');
|
|
11
|
+
}
|
|
12
|
+
listeners[eventName].push(callback);
|
|
13
|
+
},
|
|
14
|
+
removeListener: (callback) => {
|
|
15
|
+
const index = listeners[eventName].indexOf(callback);
|
|
16
|
+
if (index !== -1) {
|
|
17
|
+
listeners[eventName].splice(index, 1);
|
|
18
|
+
}
|
|
10
19
|
}
|
|
20
|
+
});
|
|
11
21
|
|
|
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
|
-
|
|
22
|
+
const notifyListeners = (event, data) => {
|
|
23
|
+
listeners[event].forEach(listener => {
|
|
24
|
+
try {
|
|
25
|
+
listener(data);
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.error('Error in listener:', error);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const onCopy = createEvent('copy');
|
|
33
|
+
const onPaste = createEvent('paste');
|
|
34
|
+
|
|
35
|
+
return (Clipboard = {
|
|
36
|
+
onCopy,
|
|
37
|
+
onPaste,
|
|
38
|
+
copy: (text) => {
|
|
39
|
+
// If no text is provided, return the result of paste()
|
|
40
|
+
if (typeof text === 'undefined') {
|
|
41
|
+
return Clipboard.paste();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Use the Async Clipboard API when available
|
|
45
|
+
if (navigator.clipboard) {
|
|
46
|
+
return navigator.clipboard.writeText(text).then(() => {
|
|
47
|
+
notifyListeners('copy', text); // Notify listeners on successful copy
|
|
48
|
+
return text;
|
|
49
|
+
})
|
|
50
|
+
.catch(err => {
|
|
51
|
+
throw err;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Fallback using document.execCommand()
|
|
56
|
+
const span = document.createElement('span');
|
|
57
|
+
span.textContent = text;
|
|
58
|
+
span.style.whiteSpace = 'pre';
|
|
59
|
+
span.style.webkitUserSelect = 'auto';
|
|
60
|
+
span.style.userSelect = 'all';
|
|
61
|
+
|
|
62
|
+
document.body.appendChild(span);
|
|
63
|
+
|
|
64
|
+
const selection = window.getSelection();
|
|
65
|
+
const range = window.document.createRange();
|
|
66
|
+
selection.removeAllRanges();
|
|
67
|
+
range.selectNode(span);
|
|
68
|
+
selection.addRange(range);
|
|
69
|
+
|
|
70
|
+
let success = false;
|
|
71
|
+
try {
|
|
72
|
+
success = window.document.execCommand('copy');
|
|
73
|
+
} catch (err) {
|
|
74
|
+
console.log('error', err);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
selection.removeAllRanges();
|
|
78
|
+
window.document.body.removeChild(span);
|
|
79
|
+
|
|
80
|
+
if (success) {
|
|
81
|
+
notifyListeners('copy', text); // Notify listeners on successful copy
|
|
82
|
+
return Promise.resolve(text);
|
|
83
|
+
} else {
|
|
84
|
+
return Promise.reject(new DOMException('The request is not allowed', 'NotAllowedError'));
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
paste: () => {
|
|
88
|
+
// Use the Async Clipboard API when available
|
|
89
|
+
if (navigator.clipboard) {
|
|
90
|
+
return navigator.clipboard.readText().then((text) => {
|
|
91
|
+
notifyListeners('paste', text); // Notify listeners on successful paste
|
|
92
|
+
return text;
|
|
93
|
+
}).catch(err => {
|
|
94
|
+
throw err;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Fallback using a <textarea> for environments without the Clipboard API
|
|
99
|
+
return new Promise((resolve, reject) => {
|
|
100
|
+
const textarea = document.createElement('textarea');
|
|
101
|
+
textarea.style.position = 'absolute';
|
|
102
|
+
textarea.style.left = '-9999px';
|
|
103
|
+
document.body.appendChild(textarea);
|
|
104
|
+
textarea.focus();
|
|
105
|
+
|
|
106
|
+
const success = document.execCommand('paste');
|
|
107
|
+
const text = textarea.value;
|
|
108
|
+
|
|
109
|
+
document.body.removeChild(textarea);
|
|
110
|
+
|
|
111
|
+
if (success) {
|
|
112
|
+
notifyListeners('paste', text); // Notify listeners on successful paste
|
|
113
|
+
resolve(text);
|
|
114
|
+
} else {
|
|
115
|
+
reject(new DOMException('The request is not allowed', 'NotAllowedError'));
|
|
116
|
+
}
|
|
117
|
+
});
|
|
39
118
|
}
|
|
119
|
+
});
|
|
120
|
+
});
|
|
40
121
|
|
|
41
|
-
// Cleanup
|
|
42
|
-
selection.removeAllRanges()
|
|
43
|
-
window.document.body.removeChild(span)
|
|
44
122
|
|
|
45
|
-
|
|
46
|
-
}
|
|
47
|
-
}));
|
|
123
|
+
/* https://chatgpt.com/c/6751dd85-bbe0-8006-a0f2-10713f6028e3?model=gpt-4o-canmore */
|
|
@@ -6,10 +6,10 @@ define(function(require) {
|
|
|
6
6
|
var Keyboard = require("./Keyboard");
|
|
7
7
|
|
|
8
8
|
function checkAndCall(li, evt, type) {
|
|
9
|
-
if(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
if(
|
|
10
|
+
(!li.hasOwnProperty("type") || li.type === "*" || li.type === type) &&
|
|
11
|
+
(!li.hasOwnProperty("modifiers") || Event.modifiersMatch(evt, li.modifiers)) &&
|
|
12
|
+
(typeof li.isEnabled !== "function" || li.isEnabled(evt, type))
|
|
13
13
|
) {
|
|
14
14
|
return li.callback(evt, type);
|
|
15
15
|
}
|