cx 25.2.1 → 25.3.1
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/dist/manifest.js +694 -694
- package/dist/widgets.js +7 -2
- package/package.json +1 -1
- package/src/core.d.ts +40 -1
- package/src/data/View.d.ts +36 -12
- package/src/ui/ResizeManager.d.ts +4 -3
- package/src/util/Format.js +270 -270
- package/src/util/debounce.d.ts +3 -4
- package/src/widgets/HtmlElement.d.ts +4 -0
- package/src/widgets/form/ColorPicker.js +485 -480
- package/src/widgets/nav/LinkButton.js +3 -3
package/src/util/Format.js
CHANGED
|
@@ -1,270 +1,270 @@
|
|
|
1
|
-
import { debug } from "./Debug";
|
|
2
|
-
import { GlobalCacheIdentifier } from "./GlobalCacheIdentifier";
|
|
3
|
-
import { isNumber } from "../util/isNumber";
|
|
4
|
-
import { isUndefined } from "../util/isUndefined";
|
|
5
|
-
import { isArray } from "../util/isArray";
|
|
6
|
-
import { capitalize } from "./capitalize";
|
|
7
|
-
import { parseDateInvariant } from "./date/parseDateInvariant";
|
|
8
|
-
|
|
9
|
-
//Culture dependent formatters are defined in the ui package.
|
|
10
|
-
|
|
11
|
-
const defaultFormatter = (v) => v.toString();
|
|
12
|
-
|
|
13
|
-
let formatFactory = {
|
|
14
|
-
string: function () {
|
|
15
|
-
return defaultFormatter;
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
wrap: function (part0, prefix, suffix) {
|
|
19
|
-
if (!prefix) prefix = "";
|
|
20
|
-
|
|
21
|
-
if (!suffix) suffix = "";
|
|
22
|
-
|
|
23
|
-
return (value) => prefix + value.toString() + suffix;
|
|
24
|
-
},
|
|
25
|
-
|
|
26
|
-
fixed: function (part0, digits) {
|
|
27
|
-
return (value) => value.toFixed(digits);
|
|
28
|
-
},
|
|
29
|
-
|
|
30
|
-
prefix: function (part0, prefix) {
|
|
31
|
-
if (!prefix) prefix = "";
|
|
32
|
-
|
|
33
|
-
return (value) => prefix + value.toString();
|
|
34
|
-
},
|
|
35
|
-
|
|
36
|
-
suffix: function (part0, suffix) {
|
|
37
|
-
if (!suffix) suffix = "";
|
|
38
|
-
|
|
39
|
-
return (value) => value.toString() + suffix;
|
|
40
|
-
},
|
|
41
|
-
|
|
42
|
-
uppercase: function () {
|
|
43
|
-
return (value) => value.toString().toUpperCase();
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
lowercase: function () {
|
|
47
|
-
return (value) => value.toString().toLowerCase();
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
urlencode: function () {
|
|
51
|
-
return (value) => encodeURIComponent(value);
|
|
52
|
-
},
|
|
53
|
-
|
|
54
|
-
number: function (part0, minFractionDigits, maxFractionDigits) {
|
|
55
|
-
let { minimumFractionDigits, maximumFractionDigits } = resolveMinMaxFractionDigits(
|
|
56
|
-
minFractionDigits,
|
|
57
|
-
maxFractionDigits,
|
|
58
|
-
);
|
|
59
|
-
let trimmable = maximumFractionDigits - minimumFractionDigits;
|
|
60
|
-
if (trimmable > 0) {
|
|
61
|
-
if (minimumFractionDigits == 0) ++trimmable;
|
|
62
|
-
return (value) => trimFractionZeros(value.toFixed(maximumFractionDigits), trimmable);
|
|
63
|
-
}
|
|
64
|
-
return (value) => value.toFixed(maximumFractionDigits);
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
percentage: function (part0, minFractionDigits, maxFractionDigits) {
|
|
68
|
-
let numberFormatter = formatFactory.number(part0, minFractionDigits, maxFractionDigits);
|
|
69
|
-
return (value) => numberFormatter(value * 100) + "%";
|
|
70
|
-
},
|
|
71
|
-
|
|
72
|
-
percentageSign: function (part0, minFractionDigits, maxFractionDigits) {
|
|
73
|
-
let numberFormatter = formatFactory.number(part0, minFractionDigits, maxFractionDigits);
|
|
74
|
-
return (value) => numberFormatter(value) + "%";
|
|
75
|
-
},
|
|
76
|
-
|
|
77
|
-
date: function () {
|
|
78
|
-
return (value) => {
|
|
79
|
-
let date = parseDateInvariant(value);
|
|
80
|
-
return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`;
|
|
81
|
-
};
|
|
82
|
-
},
|
|
83
|
-
|
|
84
|
-
time: function () {
|
|
85
|
-
return (value) => {
|
|
86
|
-
let date = parseDateInvariant(value);
|
|
87
|
-
let h = date.getHours() >= 10 ? date.getHours() : "0" + date.getHours();
|
|
88
|
-
let m = date.getMinutes() >= 10 ? date.getMinutes() : "0" + date.getMinutes();
|
|
89
|
-
return `${h}:${m}`;
|
|
90
|
-
};
|
|
91
|
-
},
|
|
92
|
-
|
|
93
|
-
datetime: function () {
|
|
94
|
-
let date = formatFactory.date();
|
|
95
|
-
let time = formatFactory.time();
|
|
96
|
-
return (value) => date(value) + " " + time(value);
|
|
97
|
-
},
|
|
98
|
-
|
|
99
|
-
ellipsis: function (part0, length, where) {
|
|
100
|
-
length = Number(length);
|
|
101
|
-
if (!(length > 3)) length = 10;
|
|
102
|
-
switch (where) {
|
|
103
|
-
default:
|
|
104
|
-
case "end":
|
|
105
|
-
return (value) => {
|
|
106
|
-
let s = String(value);
|
|
107
|
-
if (s.length > length) return s.substring(0, length - 3) + "...";
|
|
108
|
-
return s;
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
case "start":
|
|
112
|
-
return (value) => {
|
|
113
|
-
let s = String(value);
|
|
114
|
-
if (s.length > length) return "..." + s.substring(s.length - length + 3);
|
|
115
|
-
return s;
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
case "middle":
|
|
119
|
-
return (value) => {
|
|
120
|
-
let s = String(value);
|
|
121
|
-
if (s.length > length) {
|
|
122
|
-
let x = Math.floor(length - 2) / 2;
|
|
123
|
-
return s.substring(0, x) + "..." + s.substring(s.length - (length - 3 - x));
|
|
124
|
-
}
|
|
125
|
-
return s;
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
},
|
|
129
|
-
|
|
130
|
-
zeroPad: function (part0, length) {
|
|
131
|
-
return (value) => {
|
|
132
|
-
let s = String(value);
|
|
133
|
-
return s.padStart(length, "0");
|
|
134
|
-
};
|
|
135
|
-
},
|
|
136
|
-
|
|
137
|
-
leftPad: function (part0, length, char) {
|
|
138
|
-
return (value) => {
|
|
139
|
-
let s = String(value);
|
|
140
|
-
return s.padStart(length, char ?? " ");
|
|
141
|
-
};
|
|
142
|
-
},
|
|
143
|
-
|
|
144
|
-
capitalize: function () {
|
|
145
|
-
return (value) => {
|
|
146
|
-
let s = String(value);
|
|
147
|
-
return capitalize(s);
|
|
148
|
-
};
|
|
149
|
-
},
|
|
150
|
-
|
|
151
|
-
titleCase: function () {
|
|
152
|
-
return (value) => {
|
|
153
|
-
let s = String(value);
|
|
154
|
-
return s.replace(/\w\S*/g, function (word) {
|
|
155
|
-
return capitalize(word.toLowerCase());
|
|
156
|
-
});
|
|
157
|
-
};
|
|
158
|
-
},
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
formatFactory.s = formatFactory.str = formatFactory.string;
|
|
162
|
-
formatFactory.f = formatFactory.fixed;
|
|
163
|
-
formatFactory.n = formatFactory.number;
|
|
164
|
-
formatFactory.p = formatFactory.percentage;
|
|
165
|
-
formatFactory.ps = formatFactory.percentageSign;
|
|
166
|
-
formatFactory.d = formatFactory.date;
|
|
167
|
-
formatFactory.t = formatFactory.time;
|
|
168
|
-
formatFactory.dt = formatFactory.datetime;
|
|
169
|
-
formatFactory.zeropad = formatFactory.zeroPad;
|
|
170
|
-
formatFactory.leftpad = formatFactory.leftPad;
|
|
171
|
-
formatFactory.capitalize = formatFactory.capitalize;
|
|
172
|
-
formatFactory.titlecase = formatFactory.titleCase;
|
|
173
|
-
|
|
174
|
-
function buildFormatter(format) {
|
|
175
|
-
let formatter = defaultFormatter,
|
|
176
|
-
nullText = "";
|
|
177
|
-
if (format) {
|
|
178
|
-
let pipeParts = format.split("|");
|
|
179
|
-
nullText = pipeParts[1] || "";
|
|
180
|
-
let colonSepParts = pipeParts[0].split(":");
|
|
181
|
-
for (let i = 0; i < colonSepParts.length; i++) {
|
|
182
|
-
let parts = colonSepParts[i].split(";");
|
|
183
|
-
let factory = formatFactory[parts[0]];
|
|
184
|
-
if (!factory) debug("Unknown string format: " + format);
|
|
185
|
-
else if (i == 0) formatter = factory(...parts);
|
|
186
|
-
else {
|
|
187
|
-
let outerFmt = factory(...parts);
|
|
188
|
-
let innerFmt = formatter;
|
|
189
|
-
formatter = (v) => outerFmt(innerFmt(v));
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return (v) => (v == null || v === "" ? nullText : formatter(v));
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
let format = {
|
|
197
|
-
cache: {},
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
function getDefaultFormatCache() {
|
|
201
|
-
if (format.cacheIdentifier != GlobalCacheIdentifier.get()) {
|
|
202
|
-
format = {
|
|
203
|
-
cache: {},
|
|
204
|
-
cacheIdentifier: GlobalCacheIdentifier.get(),
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
return format.cache;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
let getFormatCache = getDefaultFormatCache;
|
|
211
|
-
|
|
212
|
-
export function setGetFormatCacheCallback(callback) {
|
|
213
|
-
getFormatCache = callback;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
function getFormatter(format) {
|
|
217
|
-
if (!format) format = "";
|
|
218
|
-
let formatCache = getFormatCache();
|
|
219
|
-
let formatter = formatCache[format];
|
|
220
|
-
if (!formatter) formatter = formatCache[format] = buildFormatter(format);
|
|
221
|
-
|
|
222
|
-
return formatter;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
export class Format {
|
|
226
|
-
static value(v, format) {
|
|
227
|
-
let formatter = getFormatter(format);
|
|
228
|
-
return formatter(v);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
static parse(format) {
|
|
232
|
-
return getFormatter(format);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
static register(format, formatter) {
|
|
236
|
-
this.registerFactory(format, () => formatter);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
static registerFactory(format, factory) {
|
|
240
|
-
if (isArray(format)) format.forEach((f) => this.registerFactory(f, factory));
|
|
241
|
-
else formatFactory[format] = factory;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
export function resolveMinMaxFractionDigits(minimumFractionDigits, maximumFractionDigits) {
|
|
246
|
-
minimumFractionDigits = minimumFractionDigits != null ? Number(minimumFractionDigits) : minimumFractionDigits;
|
|
247
|
-
maximumFractionDigits = maximumFractionDigits != null ? Number(maximumFractionDigits) : maximumFractionDigits;
|
|
248
|
-
|
|
249
|
-
if (isNumber(minimumFractionDigits)) {
|
|
250
|
-
if (isUndefined(maximumFractionDigits)) maximumFractionDigits = minimumFractionDigits;
|
|
251
|
-
else if (isNumber(maximumFractionDigits) && maximumFractionDigits < minimumFractionDigits)
|
|
252
|
-
maximumFractionDigits = minimumFractionDigits;
|
|
253
|
-
} else if (minimumFractionDigits == null && maximumFractionDigits == null) {
|
|
254
|
-
minimumFractionDigits = 0;
|
|
255
|
-
maximumFractionDigits = 18;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
return {
|
|
259
|
-
minimumFractionDigits,
|
|
260
|
-
maximumFractionDigits,
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
export function trimFractionZeros(str, max) {
|
|
265
|
-
let cnt = 0,
|
|
266
|
-
l = str.length;
|
|
267
|
-
while (cnt < max && (str[l - 1 - cnt] === "0" || str[l - 1 - cnt] === ".")) cnt++;
|
|
268
|
-
|
|
269
|
-
return cnt > 0 ? str.substring(0, l - cnt) : str;
|
|
270
|
-
}
|
|
1
|
+
import { debug } from "./Debug";
|
|
2
|
+
import { GlobalCacheIdentifier } from "./GlobalCacheIdentifier";
|
|
3
|
+
import { isNumber } from "../util/isNumber";
|
|
4
|
+
import { isUndefined } from "../util/isUndefined";
|
|
5
|
+
import { isArray } from "../util/isArray";
|
|
6
|
+
import { capitalize } from "./capitalize";
|
|
7
|
+
import { parseDateInvariant } from "./date/parseDateInvariant";
|
|
8
|
+
|
|
9
|
+
//Culture dependent formatters are defined in the ui package.
|
|
10
|
+
|
|
11
|
+
const defaultFormatter = (v) => v.toString();
|
|
12
|
+
|
|
13
|
+
let formatFactory = {
|
|
14
|
+
string: function () {
|
|
15
|
+
return defaultFormatter;
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
wrap: function (part0, prefix, suffix) {
|
|
19
|
+
if (!prefix) prefix = "";
|
|
20
|
+
|
|
21
|
+
if (!suffix) suffix = "";
|
|
22
|
+
|
|
23
|
+
return (value) => prefix + value.toString() + suffix;
|
|
24
|
+
},
|
|
25
|
+
|
|
26
|
+
fixed: function (part0, digits) {
|
|
27
|
+
return (value) => value.toFixed(digits);
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
prefix: function (part0, prefix) {
|
|
31
|
+
if (!prefix) prefix = "";
|
|
32
|
+
|
|
33
|
+
return (value) => prefix + value.toString();
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
suffix: function (part0, suffix) {
|
|
37
|
+
if (!suffix) suffix = "";
|
|
38
|
+
|
|
39
|
+
return (value) => value.toString() + suffix;
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
uppercase: function () {
|
|
43
|
+
return (value) => value.toString().toUpperCase();
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
lowercase: function () {
|
|
47
|
+
return (value) => value.toString().toLowerCase();
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
urlencode: function () {
|
|
51
|
+
return (value) => encodeURIComponent(value);
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
number: function (part0, minFractionDigits, maxFractionDigits) {
|
|
55
|
+
let { minimumFractionDigits, maximumFractionDigits } = resolveMinMaxFractionDigits(
|
|
56
|
+
minFractionDigits,
|
|
57
|
+
maxFractionDigits,
|
|
58
|
+
);
|
|
59
|
+
let trimmable = maximumFractionDigits - minimumFractionDigits;
|
|
60
|
+
if (trimmable > 0) {
|
|
61
|
+
if (minimumFractionDigits == 0) ++trimmable;
|
|
62
|
+
return (value) => trimFractionZeros(value.toFixed(maximumFractionDigits), trimmable);
|
|
63
|
+
}
|
|
64
|
+
return (value) => value.toFixed(maximumFractionDigits);
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
percentage: function (part0, minFractionDigits, maxFractionDigits) {
|
|
68
|
+
let numberFormatter = formatFactory.number(part0, minFractionDigits, maxFractionDigits);
|
|
69
|
+
return (value) => numberFormatter(value * 100) + "%";
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
percentageSign: function (part0, minFractionDigits, maxFractionDigits) {
|
|
73
|
+
let numberFormatter = formatFactory.number(part0, minFractionDigits, maxFractionDigits);
|
|
74
|
+
return (value) => numberFormatter(value) + "%";
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
date: function () {
|
|
78
|
+
return (value) => {
|
|
79
|
+
let date = parseDateInvariant(value);
|
|
80
|
+
return `${date.getMonth() + 1}/${date.getDate()}/${date.getFullYear()}`;
|
|
81
|
+
};
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
time: function () {
|
|
85
|
+
return (value) => {
|
|
86
|
+
let date = parseDateInvariant(value);
|
|
87
|
+
let h = date.getHours() >= 10 ? date.getHours() : "0" + date.getHours();
|
|
88
|
+
let m = date.getMinutes() >= 10 ? date.getMinutes() : "0" + date.getMinutes();
|
|
89
|
+
return `${h}:${m}`;
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
datetime: function () {
|
|
94
|
+
let date = formatFactory.date();
|
|
95
|
+
let time = formatFactory.time();
|
|
96
|
+
return (value) => date(value) + " " + time(value);
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
ellipsis: function (part0, length, where) {
|
|
100
|
+
length = Number(length);
|
|
101
|
+
if (!(length > 3)) length = 10;
|
|
102
|
+
switch (where) {
|
|
103
|
+
default:
|
|
104
|
+
case "end":
|
|
105
|
+
return (value) => {
|
|
106
|
+
let s = String(value);
|
|
107
|
+
if (s.length > length) return s.substring(0, length - 3) + "...";
|
|
108
|
+
return s;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
case "start":
|
|
112
|
+
return (value) => {
|
|
113
|
+
let s = String(value);
|
|
114
|
+
if (s.length > length) return "..." + s.substring(s.length - length + 3);
|
|
115
|
+
return s;
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
case "middle":
|
|
119
|
+
return (value) => {
|
|
120
|
+
let s = String(value);
|
|
121
|
+
if (s.length > length) {
|
|
122
|
+
let x = Math.floor(length - 2) / 2;
|
|
123
|
+
return s.substring(0, x) + "..." + s.substring(s.length - (length - 3 - x));
|
|
124
|
+
}
|
|
125
|
+
return s;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
zeroPad: function (part0, length) {
|
|
131
|
+
return (value) => {
|
|
132
|
+
let s = String(value);
|
|
133
|
+
return s.padStart(length, "0");
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
leftPad: function (part0, length, char) {
|
|
138
|
+
return (value) => {
|
|
139
|
+
let s = String(value);
|
|
140
|
+
return s.padStart(length, char ?? " ");
|
|
141
|
+
};
|
|
142
|
+
},
|
|
143
|
+
|
|
144
|
+
capitalize: function () {
|
|
145
|
+
return (value) => {
|
|
146
|
+
let s = String(value);
|
|
147
|
+
return capitalize(s);
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
|
|
151
|
+
titleCase: function () {
|
|
152
|
+
return (value) => {
|
|
153
|
+
let s = String(value);
|
|
154
|
+
return s.replace(/\w\S*/g, function (word) {
|
|
155
|
+
return capitalize(word.toLowerCase());
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
formatFactory.s = formatFactory.str = formatFactory.string;
|
|
162
|
+
formatFactory.f = formatFactory.fixed;
|
|
163
|
+
formatFactory.n = formatFactory.number;
|
|
164
|
+
formatFactory.p = formatFactory.percentage;
|
|
165
|
+
formatFactory.ps = formatFactory.percentageSign;
|
|
166
|
+
formatFactory.d = formatFactory.date;
|
|
167
|
+
formatFactory.t = formatFactory.time;
|
|
168
|
+
formatFactory.dt = formatFactory.datetime;
|
|
169
|
+
formatFactory.zeropad = formatFactory.zeroPad;
|
|
170
|
+
formatFactory.leftpad = formatFactory.leftPad;
|
|
171
|
+
formatFactory.capitalize = formatFactory.capitalize;
|
|
172
|
+
formatFactory.titlecase = formatFactory.titleCase;
|
|
173
|
+
|
|
174
|
+
function buildFormatter(format) {
|
|
175
|
+
let formatter = defaultFormatter,
|
|
176
|
+
nullText = "";
|
|
177
|
+
if (format) {
|
|
178
|
+
let pipeParts = format.split("|");
|
|
179
|
+
nullText = pipeParts[1] || "";
|
|
180
|
+
let colonSepParts = pipeParts[0].split(":");
|
|
181
|
+
for (let i = 0; i < colonSepParts.length; i++) {
|
|
182
|
+
let parts = colonSepParts[i].split(";");
|
|
183
|
+
let factory = formatFactory[parts[0]];
|
|
184
|
+
if (!factory) debug("Unknown string format: " + format);
|
|
185
|
+
else if (i == 0) formatter = factory(...parts);
|
|
186
|
+
else {
|
|
187
|
+
let outerFmt = factory(...parts);
|
|
188
|
+
let innerFmt = formatter;
|
|
189
|
+
formatter = (v) => outerFmt(innerFmt(v));
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return (v) => (v == null || v === "" ? nullText : formatter(v));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
let format = {
|
|
197
|
+
cache: {},
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
function getDefaultFormatCache() {
|
|
201
|
+
if (format.cacheIdentifier != GlobalCacheIdentifier.get()) {
|
|
202
|
+
format = {
|
|
203
|
+
cache: {},
|
|
204
|
+
cacheIdentifier: GlobalCacheIdentifier.get(),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return format.cache;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
let getFormatCache = getDefaultFormatCache;
|
|
211
|
+
|
|
212
|
+
export function setGetFormatCacheCallback(callback) {
|
|
213
|
+
getFormatCache = callback;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
function getFormatter(format) {
|
|
217
|
+
if (!format) format = "";
|
|
218
|
+
let formatCache = getFormatCache();
|
|
219
|
+
let formatter = formatCache[format];
|
|
220
|
+
if (!formatter) formatter = formatCache[format] = buildFormatter(format);
|
|
221
|
+
|
|
222
|
+
return formatter;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
export class Format {
|
|
226
|
+
static value(v, format) {
|
|
227
|
+
let formatter = getFormatter(format);
|
|
228
|
+
return formatter(v);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
static parse(format) {
|
|
232
|
+
return getFormatter(format);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
static register(format, formatter) {
|
|
236
|
+
this.registerFactory(format, () => formatter);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
static registerFactory(format, factory) {
|
|
240
|
+
if (isArray(format)) format.forEach((f) => this.registerFactory(f, factory));
|
|
241
|
+
else formatFactory[format] = factory;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
export function resolveMinMaxFractionDigits(minimumFractionDigits, maximumFractionDigits) {
|
|
246
|
+
minimumFractionDigits = minimumFractionDigits != null ? Number(minimumFractionDigits) : minimumFractionDigits;
|
|
247
|
+
maximumFractionDigits = maximumFractionDigits != null ? Number(maximumFractionDigits) : maximumFractionDigits;
|
|
248
|
+
|
|
249
|
+
if (isNumber(minimumFractionDigits)) {
|
|
250
|
+
if (isUndefined(maximumFractionDigits)) maximumFractionDigits = minimumFractionDigits;
|
|
251
|
+
else if (isNumber(maximumFractionDigits) && maximumFractionDigits < minimumFractionDigits)
|
|
252
|
+
maximumFractionDigits = minimumFractionDigits;
|
|
253
|
+
} else if (minimumFractionDigits == null && maximumFractionDigits == null) {
|
|
254
|
+
minimumFractionDigits = 0;
|
|
255
|
+
maximumFractionDigits = 18;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
return {
|
|
259
|
+
minimumFractionDigits,
|
|
260
|
+
maximumFractionDigits,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
export function trimFractionZeros(str, max) {
|
|
265
|
+
let cnt = 0,
|
|
266
|
+
l = str.length;
|
|
267
|
+
while (cnt < max && (str[l - 1 - cnt] === "0" || str[l - 1 - cnt] === ".")) cnt++;
|
|
268
|
+
|
|
269
|
+
return cnt > 0 ? str.substring(0, l - cnt) : str;
|
|
270
|
+
}
|
package/src/util/debounce.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
2
1
|
/**
|
|
3
2
|
* Returns a function, that, as long as it continues to be invoked, will not
|
|
4
|
-
* trigger the `callback` function, until the `delay` amount of milliseconds has passed since the last call.
|
|
3
|
+
* trigger the `callback` function, until the `delay` amount of milliseconds has passed since the last call.
|
|
5
4
|
* All arguments are passed to the `callback` function.
|
|
6
5
|
* @param callback
|
|
7
|
-
* @param delay - Delay in milliseconds.
|
|
6
|
+
* @param delay - Delay in milliseconds.
|
|
8
7
|
* @returns {Function}
|
|
9
8
|
*/
|
|
10
|
-
export function debounce
|
|
9
|
+
export function debounce<T extends (...args: any[]) => void>(callback: T, delay: number): T;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Cx from "../core";
|
|
2
|
+
import { Instance } from "../ui/Instance";
|
|
2
3
|
|
|
3
4
|
interface HtmlElementProps extends Cx.HtmlElementProps {
|
|
4
5
|
/** HTML to be injected into the element. */
|
|
@@ -21,6 +22,9 @@ interface HtmlElementProps extends Cx.HtmlElementProps {
|
|
|
21
22
|
/** Allow any prop if HtmlElement is used directly.
|
|
22
23
|
* e.g. `<HtmlElement tag="form" onSubmit="submit" />`*/
|
|
23
24
|
[key: string]: any;
|
|
25
|
+
|
|
26
|
+
/** Callback function called when the element is mounted in the DOM. Provides reference to the element and the component instance. */
|
|
27
|
+
onRef?: string | ((element: any, instance: Instance) => void);
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
export class HtmlElement extends Cx.Widget<HtmlElementProps> {}
|