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 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
+ ![20250124-133233-p8mj9G](https://raw.githubusercontent.com/relluf/screenshots/master/uPic/202501/20250124-133233-p8mj9G.png)
57
+
54
58
  # `2023/05/23` countWords
55
59
 
56
60
  String.prototype.countLinesAndWords = function() {
package/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ### 2025/04/03 - 1.0.83
2
+
3
+ * Introduces Array.moveItem
4
+ * Updates js.set to handle escaped dots properly
5
+ * Adds a delay of 2750ms before refresing LESS definitions
6
+
1
7
  ### 2024/11/08 - 1.0.82
2
8
 
3
9
  * Service build in favor of cavalion-code
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cavalion-js",
3
- "version": "1.0.82",
3
+ "version": "1.0.83",
4
4
  "description": "Cavalion common JavaScript library",
5
5
  "main": "index.js",
6
6
  "scripts": {
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 === true) {
31
- return js.mixIn(copy_args(args), {callee: args.callee});
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") name = name.split(".");
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( var i = 0, l = name.length - 1; i < l; ++i) {
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
- obj = obj || global;
115
- name = name.split(".");
116
- for( var i = 0, l = name.length - 1; i < l; ++i) {
117
- if(obj[name[i]] === undefined) {
118
- obj[name[i]] = {};
119
- }
120
- obj = obj[name[i]];
121
- }
122
-
123
- return (obj[name[name.length - 1]] = value);
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
  /**
@@ -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
- if(!(dt instanceof Date)) {
482
+ if(!(dt instanceof Date)) {
475
483
  dt = new Date(dt);
476
484
  }
477
- if(fmt === "YYYY/MM/DD hh:mm") {
478
- return js.sf("%d/%02d/%02d %02d:%02d",
479
- dt.getFullYear(), dt.getMonth() + 1, dt.getDate(),
480
- dt.getHours(), dt.getMinutes()
481
- );
485
+ const formatter = Date.format.formats[fmt];
486
+
487
+ if(typeof formatter === "function") {
488
+ return formatter(dt, fmt);
482
489
  }
483
- return dt.toISOString();
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
- try {
5
- return nameOf(obj);
6
- } catch(e) {
7
- debugger;
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
- // TODO how to only refresh this current one?
24
- less.refresh(true).then(_ => onLoad(link));
25
- // onLoad(link);
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 {
@@ -156,7 +156,7 @@ define(function(require) {
156
156
  _: BrowserDetect
157
157
  };
158
158
 
159
- Browser.webkit = Browser.safari || Browser.chrome;
159
+ Browser.webkit = Browser.chrome;
160
160
  Browser.firefox = Browser.mozilla;
161
161
 
162
162
  return Browser;
@@ -1,47 +1,123 @@
1
- define([], () => ({
2
- copy: (text) => {
3
- // Use the Async Clipboard API when available. Requires a secure browsing
4
- // context (i.e. HTTPS)
5
- if (navigator.clipboard) {
6
- return navigator.clipboard.writeText(text).then(() => text).
7
- catch(function (err) {
8
- throw (err !== undefined ? err : new DOMException('The request is not allowed', 'NotAllowedError'))
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
- // ...Otherwise, use document.execCommand() fallback
13
-
14
- // Put the text to copy into a <span>
15
- var span = document.createElement('span')
16
- span.textContent = text
17
-
18
- // Preserve consecutive spaces and newlines
19
- span.style.whiteSpace = 'pre'
20
- span.style.webkitUserSelect = 'auto'
21
- span.style.userSelect = 'all'
22
-
23
- // Add the <span> to the page
24
- document.body.appendChild(span)
25
-
26
- // Make a selection object representing the range of text selected by the user
27
- var selection = window.getSelection()
28
- var range = window.document.createRange()
29
- selection.removeAllRanges()
30
- range.selectNode(span)
31
- selection.addRange(range)
32
-
33
- // Copy text to the clipboard
34
- var success = false
35
- try {
36
- success = window.document.execCommand('copy')
37
- } catch(err) {
38
- console.log('error', err)
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
- return success ? Promise.resolve(text) : Promise.reject(new DOMException('The request is not allowed', 'NotAllowedError'))
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((!li.hasOwnProperty("type") || li.type === "*" || li.type === type)
10
- && (!li.hasOwnProperty("modifiers") || Event.modifiersMatch(evt,
11
- li.modifiers)) && (typeof li.isEnabled !== "function" ||
12
- li.isEnabled(evt, type))
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
  }