@bexis2/bexis2-core-ui 0.4.98 → 0.4.100
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/README.md +7 -0
- package/dist/components/Table/TableContent.svelte +6 -102
- package/dist/components/Table/clientDB.js +1 -1
- package/dist/components/Table/tableWorker.js +1 -1
- package/dist/components/form/Checkbox.svelte +10 -0
- package/dist/components/form/Checkbox.svelte.d.ts +1 -0
- package/dist/components/form/CheckboxKvPList.svelte +10 -1
- package/dist/components/form/CheckboxKvPList.svelte.d.ts +1 -0
- package/dist/components/form/CheckboxList.svelte +9 -1
- package/dist/components/form/CheckboxList.svelte.d.ts +1 -0
- package/dist/components/form/DateInput.svelte +9 -0
- package/dist/components/form/DateInput.svelte.d.ts +1 -0
- package/dist/components/form/DatePickerInput.svelte +8 -0
- package/dist/components/form/DatePickerInput.svelte.d.ts +1 -0
- package/dist/components/form/Dropdown.svelte +13 -1
- package/dist/components/form/Dropdown.svelte.d.ts +2 -0
- package/dist/components/form/DropdownKvP.svelte +12 -1
- package/dist/components/form/DropdownKvP.svelte.d.ts +2 -0
- package/dist/components/form/MultiSelect.svelte +11 -1
- package/dist/components/form/MultiSelect.svelte.d.ts +2 -0
- package/dist/components/form/NumberInput.svelte +9 -0
- package/dist/components/form/NumberInput.svelte.d.ts +1 -0
- package/dist/components/form/TextArea.svelte +9 -0
- package/dist/components/form/TextArea.svelte.d.ts +1 -0
- package/dist/components/form/TextInput.svelte +9 -0
- package/dist/components/form/TextInput.svelte.d.ts +1 -0
- package/package.json +1 -1
- package/src/lib/components/Table/TableContent.svelte +7 -113
- package/src/lib/components/Table/clientDB.js +1 -1
- package/src/lib/components/Table/tableWorker.js +1 -1
- package/src/lib/components/form/Checkbox.svelte +14 -0
- package/src/lib/components/form/CheckboxKvPList.svelte +11 -1
- package/src/lib/components/form/CheckboxList.svelte +11 -1
- package/src/lib/components/form/DateInput.svelte +12 -0
- package/src/lib/components/form/DatePickerInput.svelte +10 -0
- package/src/lib/components/form/Dropdown.svelte +13 -1
- package/src/lib/components/form/DropdownKvP.svelte +12 -1
- package/src/lib/components/form/MultiSelect.svelte +11 -1
- package/src/lib/components/form/NumberInput.svelte +10 -0
- package/src/lib/components/form/TextArea.svelte +10 -0
- package/src/lib/components/form/TextInput.svelte +11 -0
package/README.md
CHANGED
|
@@ -68,6 +68,7 @@ const serverSide = server !== void 0 || clientDb;
|
|
|
68
68
|
let _clientDbInstance = null;
|
|
69
69
|
let clientDbEnabled = clientDb;
|
|
70
70
|
let clientDbReady = false;
|
|
71
|
+
let clientDbInitPromise = null;
|
|
71
72
|
let clientDbInitSource = [];
|
|
72
73
|
let clientDbSeedSize = 0;
|
|
73
74
|
const { sendModel = new Send() } = server ?? {};
|
|
@@ -298,6 +299,9 @@ const sortServer = (order, id) => {
|
|
|
298
299
|
const updateTableWithParams = async () => {
|
|
299
300
|
if (clientDbEnabled) {
|
|
300
301
|
isFetching = true;
|
|
302
|
+
if (!clientDbReady && clientDbInitPromise) {
|
|
303
|
+
await clientDbInitPromise;
|
|
304
|
+
}
|
|
301
305
|
const filtersNormalized = utils.normalizeFilters($filters);
|
|
302
306
|
const q = sendModel?.q || "";
|
|
303
307
|
const offset2 = $pageSize * $pageIndex;
|
|
@@ -305,106 +309,6 @@ const updateTableWithParams = async () => {
|
|
|
305
309
|
if (!_clientDbInstance) {
|
|
306
310
|
_clientDbInstance = new ClientDB(tableId);
|
|
307
311
|
}
|
|
308
|
-
if (!clientDbReady) {
|
|
309
|
-
const source = clientDbInitSource.length > 0 ? clientDbInitSource : $data;
|
|
310
|
-
const getValue = (row, column) => {
|
|
311
|
-
const dot = String(column || "").replaceAll("%%%", ".");
|
|
312
|
-
return row[dot] ?? row[column] ?? row[dot.replaceAll(".", "%%%")];
|
|
313
|
-
};
|
|
314
|
-
const localMatches = (row) => {
|
|
315
|
-
if (q && q.length > 0) {
|
|
316
|
-
const ql = String(q).toLowerCase();
|
|
317
|
-
let found = false;
|
|
318
|
-
for (const k in row) {
|
|
319
|
-
const v = row[k];
|
|
320
|
-
if (v == null) continue;
|
|
321
|
-
if (String(v).toLowerCase().includes(ql)) {
|
|
322
|
-
found = true;
|
|
323
|
-
break;
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
if (!found) return false;
|
|
327
|
-
}
|
|
328
|
-
for (const f of filtersNormalized) {
|
|
329
|
-
const actual = getValue(row, f.column);
|
|
330
|
-
const val = f.value;
|
|
331
|
-
if (val == null) continue;
|
|
332
|
-
const aStr = String(actual ?? "").toLowerCase();
|
|
333
|
-
const vStr = String(val ?? "").toLowerCase();
|
|
334
|
-
const aNum = Number(actual);
|
|
335
|
-
const vNum = Number(val);
|
|
336
|
-
const aDate = new Date(actual).getTime();
|
|
337
|
-
const vDate = new Date(val).getTime();
|
|
338
|
-
switch (f.filterBy) {
|
|
339
|
-
case "c":
|
|
340
|
-
if (!aStr.includes(vStr)) return false;
|
|
341
|
-
break;
|
|
342
|
-
case "nc":
|
|
343
|
-
if (aStr.includes(vStr)) return false;
|
|
344
|
-
break;
|
|
345
|
-
case "sw":
|
|
346
|
-
if (!aStr.startsWith(vStr)) return false;
|
|
347
|
-
break;
|
|
348
|
-
case "ew":
|
|
349
|
-
if (!aStr.endsWith(vStr)) return false;
|
|
350
|
-
break;
|
|
351
|
-
case "e":
|
|
352
|
-
if (actual != val) return false;
|
|
353
|
-
break;
|
|
354
|
-
case "ne":
|
|
355
|
-
if (actual == val) return false;
|
|
356
|
-
break;
|
|
357
|
-
case "gt":
|
|
358
|
-
if (Number.isNaN(aNum) || Number.isNaN(vNum) || !(aNum > vNum)) return false;
|
|
359
|
-
break;
|
|
360
|
-
case "lt":
|
|
361
|
-
if (Number.isNaN(aNum) || Number.isNaN(vNum) || !(aNum < vNum)) return false;
|
|
362
|
-
break;
|
|
363
|
-
case "gte":
|
|
364
|
-
if (Number.isNaN(aNum) || Number.isNaN(vNum) || !(aNum >= vNum)) return false;
|
|
365
|
-
break;
|
|
366
|
-
case "lte":
|
|
367
|
-
if (Number.isNaN(aNum) || Number.isNaN(vNum) || !(aNum <= vNum)) return false;
|
|
368
|
-
break;
|
|
369
|
-
case "o":
|
|
370
|
-
if (Number.isNaN(aDate) || Number.isNaN(vDate) || aDate !== vDate) return false;
|
|
371
|
-
break;
|
|
372
|
-
case "sf":
|
|
373
|
-
case "a":
|
|
374
|
-
if (Number.isNaN(aDate) || Number.isNaN(vDate) || !(aDate >= vDate)) return false;
|
|
375
|
-
break;
|
|
376
|
-
case "u":
|
|
377
|
-
case "b":
|
|
378
|
-
if (Number.isNaN(aDate) || Number.isNaN(vDate) || !(aDate <= vDate)) return false;
|
|
379
|
-
break;
|
|
380
|
-
case "no":
|
|
381
|
-
if (Number.isNaN(aDate) || Number.isNaN(vDate) || aDate === vDate) return false;
|
|
382
|
-
break;
|
|
383
|
-
}
|
|
384
|
-
}
|
|
385
|
-
return true;
|
|
386
|
-
};
|
|
387
|
-
const filtered = source.filter(localMatches);
|
|
388
|
-
const order = sendModel?.order || [];
|
|
389
|
-
if (order.length > 0) {
|
|
390
|
-
const { column, direction } = order[0];
|
|
391
|
-
const dir = direction === "desc" ? -1 : 1;
|
|
392
|
-
filtered.sort((a, b) => {
|
|
393
|
-
const av = getValue(a, column);
|
|
394
|
-
const bv = getValue(b, column);
|
|
395
|
-
if (av == null && bv == null) return 0;
|
|
396
|
-
if (av == null) return -1 * dir;
|
|
397
|
-
if (bv == null) return 1 * dir;
|
|
398
|
-
if (typeof av === "number" && typeof bv === "number") return (av - bv) * dir;
|
|
399
|
-
return String(av).localeCompare(String(bv)) * dir;
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
const localRows = filtered.slice(offset2, offset2 + limit);
|
|
403
|
-
serverItems?.set(filtered.length);
|
|
404
|
-
data.set(localRows);
|
|
405
|
-
isFetching = false;
|
|
406
|
-
return { rows: localRows, total: filtered.length };
|
|
407
|
-
}
|
|
408
312
|
const res = await _clientDbInstance.query({
|
|
409
313
|
q,
|
|
410
314
|
filters: filtersNormalized,
|
|
@@ -516,10 +420,10 @@ onMount(async () => {
|
|
|
516
420
|
serverItems?.set(clientDbInitSource.length);
|
|
517
421
|
data.set(firstPage);
|
|
518
422
|
_clientDbInstance = new ClientDB(tableId);
|
|
519
|
-
_clientDbInstance.init(clientDbInitSource).then(async () => {
|
|
520
|
-
const result = await updateTableWithParams();
|
|
423
|
+
clientDbInitPromise = _clientDbInstance.init(clientDbInitSource).then(async () => {
|
|
521
424
|
clientDbReady = true;
|
|
522
425
|
clientDbInitSource = [];
|
|
426
|
+
const result = await updateTableWithParams();
|
|
523
427
|
return result;
|
|
524
428
|
}).catch(() => {
|
|
525
429
|
clientDbReady = false;
|
|
@@ -3,7 +3,7 @@ const DB_PREFIX = 'table-db-';
|
|
|
3
3
|
|
|
4
4
|
function openDB(name) {
|
|
5
5
|
return new Promise((resolve, reject) => {
|
|
6
|
-
const req = indexedDB.open(DB_PREFIX + name
|
|
6
|
+
const req = indexedDB.open(DB_PREFIX + name);
|
|
7
7
|
req.onupgradeneeded = () => {
|
|
8
8
|
const db = req.result;
|
|
9
9
|
if (!db.objectStoreNames.contains('rows')) {
|
|
@@ -4,7 +4,7 @@ const DB_PREFIX = 'table-db-';
|
|
|
4
4
|
|
|
5
5
|
function openDB(name) {
|
|
6
6
|
return new Promise((resolve, reject) => {
|
|
7
|
-
const req = indexedDB.open(DB_PREFIX + name
|
|
7
|
+
const req = indexedDB.open(DB_PREFIX + name);
|
|
8
8
|
req.onupgradeneeded = () => {
|
|
9
9
|
const db = req.result;
|
|
10
10
|
if (!db.objectStoreNames.contains('rows')) {
|
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
<script>import InputContainer from "./InputContainer.svelte";
|
|
2
2
|
export let id = "";
|
|
3
3
|
export let label = "";
|
|
4
|
+
export let title = "";
|
|
4
5
|
export let checked = false;
|
|
5
6
|
export let valid;
|
|
6
7
|
export let invalid;
|
|
7
8
|
export let required;
|
|
8
9
|
export let feedback;
|
|
9
10
|
export let description = "";
|
|
11
|
+
$: {
|
|
12
|
+
if ((!label || label.trim() === "") && title && title.trim() !== "") {
|
|
13
|
+
label = title;
|
|
14
|
+
} else if ((!title || title.trim() === "") && label && label.trim() !== "") {
|
|
15
|
+
title = label;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
10
18
|
</script>
|
|
11
19
|
|
|
20
|
+
|
|
12
21
|
<InputContainer {label} {feedback} {required} {description}>
|
|
13
22
|
<input
|
|
14
23
|
{id}
|
|
24
|
+
{title}
|
|
15
25
|
class="input variant-form-material bg-zinc-50 dark:bg-zinc-50"
|
|
16
26
|
type="checkbox"
|
|
17
27
|
class:input-success={valid}
|
|
@@ -3,19 +3,28 @@ export let id;
|
|
|
3
3
|
export let source;
|
|
4
4
|
export let target;
|
|
5
5
|
export let title;
|
|
6
|
+
export let label;
|
|
6
7
|
export let description = "";
|
|
7
8
|
export let key;
|
|
8
9
|
export let help = false;
|
|
9
10
|
export let vertical = false;
|
|
11
|
+
$: {
|
|
12
|
+
if ((!label || label.trim() === "") && title && title.trim() !== "") {
|
|
13
|
+
label = title;
|
|
14
|
+
} else if ((!title || title.trim() === "") && label && label.trim() !== "") {
|
|
15
|
+
title = label;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
10
18
|
let required = false;
|
|
11
19
|
export let feedback;
|
|
12
20
|
</script>
|
|
13
21
|
|
|
14
|
-
<InputContainer {id} label
|
|
22
|
+
<InputContainer {id} {label} {feedback} {required} {help} {description}>
|
|
15
23
|
<div class="flex gap-2" class:flex-col={vertical}>
|
|
16
24
|
{#each source as item}
|
|
17
25
|
<label class="flex items-center space-x-2" for={item.key}>
|
|
18
26
|
<input
|
|
27
|
+
{title}
|
|
19
28
|
class="checkbox"
|
|
20
29
|
type="checkbox"
|
|
21
30
|
bind:group={target}
|
|
@@ -2,13 +2,21 @@
|
|
|
2
2
|
export let source;
|
|
3
3
|
export let target;
|
|
4
4
|
export let title;
|
|
5
|
+
export let label;
|
|
5
6
|
export let description = "";
|
|
6
7
|
export let key;
|
|
8
|
+
$: {
|
|
9
|
+
if ((!label || label.trim() === "") && title && title.trim() !== "") {
|
|
10
|
+
label = title;
|
|
11
|
+
} else if ((!title || title.trim() === "") && label && label.trim() !== "") {
|
|
12
|
+
title = label;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
7
15
|
export let required = false;
|
|
8
16
|
export let feedback;
|
|
9
17
|
</script>
|
|
10
18
|
|
|
11
|
-
<InputContainer label
|
|
19
|
+
<InputContainer {label} {feedback} {required} {description}>
|
|
12
20
|
{#each source as item}
|
|
13
21
|
<label class="flex items-center space-x-2" for={item}>
|
|
14
22
|
<input class="checkbox" type="checkbox" bind:group={target} value={item} id={item} />
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script>import InputContainer from "./InputContainer.svelte";
|
|
2
2
|
export let id = "";
|
|
3
3
|
export let label = "";
|
|
4
|
+
export let title = "";
|
|
4
5
|
export let value = "";
|
|
5
6
|
export let valid = false;
|
|
6
7
|
export let invalid = false;
|
|
@@ -11,6 +12,13 @@ export let disabled = false;
|
|
|
11
12
|
export let description = "";
|
|
12
13
|
export let showDescription = false;
|
|
13
14
|
export let showIcon = false;
|
|
15
|
+
$: {
|
|
16
|
+
if ((!label || label.trim() === "") && title && title.trim() !== "") {
|
|
17
|
+
label = title;
|
|
18
|
+
} else if ((!title || title.trim() === "") && label && label.trim() !== "") {
|
|
19
|
+
title = label;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
14
22
|
</script>
|
|
15
23
|
|
|
16
24
|
<InputContainer
|
|
@@ -27,6 +35,7 @@ export let showIcon = false;
|
|
|
27
35
|
>
|
|
28
36
|
<input
|
|
29
37
|
{id}
|
|
38
|
+
{title}
|
|
30
39
|
class="input variant-form-material bg-zinc-50 dark:bg-zinc-700 placeholder:text-gray-400"
|
|
31
40
|
type="date"
|
|
32
41
|
class:input-success={valid}
|
|
@@ -4,6 +4,7 @@ import InputContainer from "./InputContainer.svelte";
|
|
|
4
4
|
import SveltyPicker from "svelty-picker";
|
|
5
5
|
export let id = "";
|
|
6
6
|
export let label = "";
|
|
7
|
+
export let title = "";
|
|
7
8
|
export let value = "";
|
|
8
9
|
export let valid = false;
|
|
9
10
|
export let invalid = false;
|
|
@@ -31,6 +32,13 @@ if (mode === "datetime" && (format === "yyyy-mm-dd" || displayFormat === "yyyy-m
|
|
|
31
32
|
if (mode === "datetime") {
|
|
32
33
|
width = "w-64";
|
|
33
34
|
}
|
|
35
|
+
$: {
|
|
36
|
+
if ((!label || label.trim() === "") && title && title.trim() !== "") {
|
|
37
|
+
label = title;
|
|
38
|
+
} else if ((!title || title.trim() === "") && label && label.trim() !== "") {
|
|
39
|
+
title = label;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
34
42
|
</script>
|
|
35
43
|
|
|
36
44
|
<InputContainer
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
export let source;
|
|
6
6
|
export let target;
|
|
7
7
|
export let title;
|
|
8
|
+
export let label;
|
|
8
9
|
export let valid = false;
|
|
9
10
|
export let invalid = false;
|
|
10
11
|
export let feedback = [''];
|
|
@@ -27,11 +28,21 @@
|
|
|
27
28
|
function updatedTarget(value) {
|
|
28
29
|
target = value;
|
|
29
30
|
}
|
|
31
|
+
|
|
32
|
+
$: {
|
|
33
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
34
|
+
label = title;
|
|
35
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
36
|
+
title = label;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
30
41
|
</script>
|
|
31
42
|
|
|
32
43
|
<InputContainer
|
|
33
44
|
{id}
|
|
34
|
-
label
|
|
45
|
+
{label}
|
|
35
46
|
{feedback}
|
|
36
47
|
{required}
|
|
37
48
|
{help}
|
|
@@ -43,6 +54,7 @@
|
|
|
43
54
|
>
|
|
44
55
|
<select
|
|
45
56
|
{id}
|
|
57
|
+
{title}
|
|
46
58
|
class="select variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
47
59
|
class:input-success={valid}
|
|
48
60
|
class:input-error={invalid}
|
|
@@ -5,6 +5,7 @@ export default class Dropdown extends SvelteComponent<{
|
|
|
5
5
|
id: any;
|
|
6
6
|
target: any;
|
|
7
7
|
title: any;
|
|
8
|
+
label: any;
|
|
8
9
|
source: any;
|
|
9
10
|
description?: string | undefined;
|
|
10
11
|
showDescription?: boolean | undefined;
|
|
@@ -32,6 +33,7 @@ declare const __propDef: {
|
|
|
32
33
|
id: any;
|
|
33
34
|
target: any;
|
|
34
35
|
title: any;
|
|
36
|
+
label: any;
|
|
35
37
|
source: any;
|
|
36
38
|
description?: string | undefined;
|
|
37
39
|
showDescription?: boolean | undefined;
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
export let source;
|
|
6
6
|
export let target;
|
|
7
7
|
export let title;
|
|
8
|
+
export let label;
|
|
8
9
|
export let valid = false;
|
|
9
10
|
export let invalid = false;
|
|
10
11
|
export let feedback = [''];
|
|
@@ -36,11 +37,20 @@
|
|
|
36
37
|
target = id;
|
|
37
38
|
}
|
|
38
39
|
}
|
|
40
|
+
|
|
41
|
+
$: {
|
|
42
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
43
|
+
label = title;
|
|
44
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
45
|
+
title = label;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
39
49
|
</script>
|
|
40
50
|
|
|
41
51
|
<InputContainer
|
|
42
52
|
{id}
|
|
43
|
-
label
|
|
53
|
+
{label}
|
|
44
54
|
{feedback}
|
|
45
55
|
{required}
|
|
46
56
|
{help}
|
|
@@ -52,6 +62,7 @@
|
|
|
52
62
|
>
|
|
53
63
|
<select
|
|
54
64
|
{id}
|
|
65
|
+
{title}
|
|
55
66
|
class="select variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
56
67
|
class:input-success={valid}
|
|
57
68
|
class:input-error={invalid}
|
|
@@ -5,6 +5,7 @@ export default class DropdownKvP extends SvelteComponent<{
|
|
|
5
5
|
id: any;
|
|
6
6
|
target: any;
|
|
7
7
|
title: any;
|
|
8
|
+
label: any;
|
|
8
9
|
source: any;
|
|
9
10
|
description?: string | undefined;
|
|
10
11
|
showDescription?: boolean | undefined;
|
|
@@ -33,6 +34,7 @@ declare const __propDef: {
|
|
|
33
34
|
id: any;
|
|
34
35
|
target: any;
|
|
35
36
|
title: any;
|
|
37
|
+
label: any;
|
|
36
38
|
source: any;
|
|
37
39
|
description?: string | undefined;
|
|
38
40
|
showDescription?: boolean | undefined;
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
export let target;
|
|
10
10
|
export let id;
|
|
11
11
|
export let title;
|
|
12
|
+
export let label;
|
|
12
13
|
export let itemId = 'value';
|
|
13
14
|
export let itemLabel = 'label';
|
|
14
15
|
export let itemGroup = '';
|
|
@@ -30,6 +31,15 @@
|
|
|
30
31
|
|
|
31
32
|
let isLoaded = false;
|
|
32
33
|
|
|
34
|
+
$: {
|
|
35
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
36
|
+
label = title;
|
|
37
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
38
|
+
title = label;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
33
43
|
$: value = '';
|
|
34
44
|
$: updateTarget(value);
|
|
35
45
|
$: (target, setValue(target));
|
|
@@ -303,7 +313,7 @@
|
|
|
303
313
|
|
|
304
314
|
<InputContainer
|
|
305
315
|
{id}
|
|
306
|
-
label
|
|
316
|
+
{label}
|
|
307
317
|
{feedback}
|
|
308
318
|
{required}
|
|
309
319
|
{help}
|
|
@@ -5,6 +5,7 @@ export default class MultiSelect extends SvelteComponent<{
|
|
|
5
5
|
id: any;
|
|
6
6
|
target: any;
|
|
7
7
|
title: any;
|
|
8
|
+
label: any;
|
|
8
9
|
source: any;
|
|
9
10
|
description?: string | undefined;
|
|
10
11
|
showDescription?: boolean | undefined;
|
|
@@ -49,6 +50,7 @@ declare const __propDef: {
|
|
|
49
50
|
id: any;
|
|
50
51
|
target: any;
|
|
51
52
|
title: any;
|
|
53
|
+
label: any;
|
|
52
54
|
source: any;
|
|
53
55
|
description?: string | undefined;
|
|
54
56
|
showDescription?: boolean | undefined;
|
|
@@ -3,6 +3,7 @@ import { helpStore } from "../../stores/pageStores";
|
|
|
3
3
|
import { convertServerColumns } from "../Table/utils";
|
|
4
4
|
export let id = "";
|
|
5
5
|
export let label = "";
|
|
6
|
+
export let title = "";
|
|
6
7
|
export let value = "";
|
|
7
8
|
export let valid = false;
|
|
8
9
|
export let invalid = false;
|
|
@@ -16,6 +17,13 @@ export let showDescription = false;
|
|
|
16
17
|
export let showIcon = false;
|
|
17
18
|
export let min = void 0;
|
|
18
19
|
export let max = void 0;
|
|
20
|
+
$: {
|
|
21
|
+
if ((!label || label.trim() === "") && title && title.trim() !== "") {
|
|
22
|
+
label = title;
|
|
23
|
+
} else if ((!title || title.trim() === "") && label && label.trim() !== "") {
|
|
24
|
+
title = label;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
19
27
|
$: if (max != void 0 && parseInt(value) > max) {
|
|
20
28
|
value = max.toString();
|
|
21
29
|
}
|
|
@@ -38,6 +46,7 @@ $: if (min != void 0 && parseInt(value) < min) {
|
|
|
38
46
|
>
|
|
39
47
|
<input
|
|
40
48
|
{id}
|
|
49
|
+
{title}
|
|
41
50
|
class="input variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
42
51
|
type="number"
|
|
43
52
|
class:input-success={valid}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script>import InputContainer from "./InputContainer.svelte";
|
|
2
2
|
export let id = "";
|
|
3
3
|
export let label = "";
|
|
4
|
+
export let title = "";
|
|
4
5
|
export let value = "";
|
|
5
6
|
export let valid = false;
|
|
6
7
|
export let invalid = false;
|
|
@@ -12,6 +13,13 @@ export let disabled = false;
|
|
|
12
13
|
export let description = "";
|
|
13
14
|
export let showDescription = false;
|
|
14
15
|
export let showIcon = false;
|
|
16
|
+
$: {
|
|
17
|
+
if ((!label || label.trim() === "") && title && title.trim() !== "") {
|
|
18
|
+
label = title;
|
|
19
|
+
} else if ((!title || title.trim() === "") && label && label.trim() !== "") {
|
|
20
|
+
title = label;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
15
23
|
</script>
|
|
16
24
|
|
|
17
25
|
<InputContainer
|
|
@@ -28,6 +36,7 @@ export let showIcon = false;
|
|
|
28
36
|
>
|
|
29
37
|
<textarea
|
|
30
38
|
{id}
|
|
39
|
+
{title}
|
|
31
40
|
class="textarea variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
32
41
|
class:input-success={valid}
|
|
33
42
|
class:input-error={invalid}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script>import InputContainer from "./InputContainer.svelte";
|
|
2
2
|
export let id = "";
|
|
3
3
|
export let label = "";
|
|
4
|
+
export let title = "";
|
|
4
5
|
export let value = "";
|
|
5
6
|
export let valid = false;
|
|
6
7
|
export let invalid = false;
|
|
@@ -12,6 +13,13 @@ export let disabled = false;
|
|
|
12
13
|
export let description = "";
|
|
13
14
|
export let showDescription = false;
|
|
14
15
|
export let showIcon = false;
|
|
16
|
+
$: {
|
|
17
|
+
if ((!label || label.trim() === "") && title && title.trim() !== "") {
|
|
18
|
+
label = title;
|
|
19
|
+
} else if ((!title || title.trim() === "") && label && label.trim() !== "") {
|
|
20
|
+
title = label;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
15
23
|
</script>
|
|
16
24
|
|
|
17
25
|
<InputContainer
|
|
@@ -28,6 +36,7 @@ export let showIcon = false;
|
|
|
28
36
|
>
|
|
29
37
|
<input
|
|
30
38
|
{id}
|
|
39
|
+
{title}
|
|
31
40
|
class="input variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
32
41
|
type="text"
|
|
33
42
|
class:input-success={valid}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bexis2/bexis2-core-ui",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.100",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Everything you need to build a Svelte project, powered by [`create-svelte`](https://github.com/sveltejs/kit/tree/master/packages/create-svelte).",
|
|
6
6
|
"keywords": [
|
|
@@ -67,6 +67,7 @@
|
|
|
67
67
|
let _clientDbInstance: any = null;
|
|
68
68
|
let clientDbEnabled = clientDb;
|
|
69
69
|
let clientDbReady = false;
|
|
70
|
+
let clientDbInitPromise: Promise<any> | null = null;
|
|
70
71
|
let clientDbInitSource: any[] = [];
|
|
71
72
|
let clientDbSeedSize = 0;
|
|
72
73
|
const { sendModel = new Send() } = server ?? {};
|
|
@@ -367,6 +368,9 @@
|
|
|
367
368
|
// If we're using a client-side DB (worker + IndexedDB), route queries there
|
|
368
369
|
if (clientDbEnabled) {
|
|
369
370
|
isFetching = true;
|
|
371
|
+
if (!clientDbReady && clientDbInitPromise) {
|
|
372
|
+
await clientDbInitPromise;
|
|
373
|
+
}
|
|
370
374
|
const filtersNormalized = utils.normalizeFilters($filters);
|
|
371
375
|
const q = sendModel?.q || '';
|
|
372
376
|
const offset = $pageSize * $pageIndex;
|
|
@@ -376,116 +380,6 @@
|
|
|
376
380
|
_clientDbInstance = new ClientDB(tableId);
|
|
377
381
|
}
|
|
378
382
|
|
|
379
|
-
if (!clientDbReady) {
|
|
380
|
-
// Fallback while DB is still importing: apply local search/filter/sort for responsiveness.
|
|
381
|
-
const source = clientDbInitSource.length > 0 ? clientDbInitSource : $data;
|
|
382
|
-
|
|
383
|
-
const getValue = (row, column) => {
|
|
384
|
-
const dot = String(column || '').replaceAll('%%%', '.');
|
|
385
|
-
return row[dot] ?? row[column] ?? row[dot.replaceAll('.', '%%%')];
|
|
386
|
-
};
|
|
387
|
-
|
|
388
|
-
const localMatches = (row) => {
|
|
389
|
-
if (q && q.length > 0) {
|
|
390
|
-
const ql = String(q).toLowerCase();
|
|
391
|
-
let found = false;
|
|
392
|
-
for (const k in row) {
|
|
393
|
-
const v = row[k];
|
|
394
|
-
if (v == null) continue;
|
|
395
|
-
if (String(v).toLowerCase().includes(ql)) {
|
|
396
|
-
found = true;
|
|
397
|
-
break;
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
if (!found) return false;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
for (const f of filtersNormalized) {
|
|
404
|
-
const actual = getValue(row, f.column);
|
|
405
|
-
const val = f.value;
|
|
406
|
-
if (val == null) continue;
|
|
407
|
-
|
|
408
|
-
const aStr = String(actual ?? '').toLowerCase();
|
|
409
|
-
const vStr = String(val ?? '').toLowerCase();
|
|
410
|
-
const aNum = Number(actual);
|
|
411
|
-
const vNum = Number(val);
|
|
412
|
-
const aDate = new Date(actual as any).getTime();
|
|
413
|
-
const vDate = new Date(val as any).getTime();
|
|
414
|
-
|
|
415
|
-
switch (f.filterBy) {
|
|
416
|
-
case 'c':
|
|
417
|
-
if (!aStr.includes(vStr)) return false;
|
|
418
|
-
break;
|
|
419
|
-
case 'nc':
|
|
420
|
-
if (aStr.includes(vStr)) return false;
|
|
421
|
-
break;
|
|
422
|
-
case 'sw':
|
|
423
|
-
if (!aStr.startsWith(vStr)) return false;
|
|
424
|
-
break;
|
|
425
|
-
case 'ew':
|
|
426
|
-
if (!aStr.endsWith(vStr)) return false;
|
|
427
|
-
break;
|
|
428
|
-
case 'e':
|
|
429
|
-
if (actual != val) return false;
|
|
430
|
-
break;
|
|
431
|
-
case 'ne':
|
|
432
|
-
if (actual == val) return false;
|
|
433
|
-
break;
|
|
434
|
-
case 'gt':
|
|
435
|
-
if (Number.isNaN(aNum) || Number.isNaN(vNum) || !(aNum > vNum)) return false;
|
|
436
|
-
break;
|
|
437
|
-
case 'lt':
|
|
438
|
-
if (Number.isNaN(aNum) || Number.isNaN(vNum) || !(aNum < vNum)) return false;
|
|
439
|
-
break;
|
|
440
|
-
case 'gte':
|
|
441
|
-
if (Number.isNaN(aNum) || Number.isNaN(vNum) || !(aNum >= vNum)) return false;
|
|
442
|
-
break;
|
|
443
|
-
case 'lte':
|
|
444
|
-
if (Number.isNaN(aNum) || Number.isNaN(vNum) || !(aNum <= vNum)) return false;
|
|
445
|
-
break;
|
|
446
|
-
case 'o':
|
|
447
|
-
if (Number.isNaN(aDate) || Number.isNaN(vDate) || aDate !== vDate) return false;
|
|
448
|
-
break;
|
|
449
|
-
case 'sf':
|
|
450
|
-
case 'a':
|
|
451
|
-
if (Number.isNaN(aDate) || Number.isNaN(vDate) || !(aDate >= vDate)) return false;
|
|
452
|
-
break;
|
|
453
|
-
case 'u':
|
|
454
|
-
case 'b':
|
|
455
|
-
if (Number.isNaN(aDate) || Number.isNaN(vDate) || !(aDate <= vDate)) return false;
|
|
456
|
-
break;
|
|
457
|
-
case 'no':
|
|
458
|
-
if (Number.isNaN(aDate) || Number.isNaN(vDate) || aDate === vDate) return false;
|
|
459
|
-
break;
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
return true;
|
|
464
|
-
};
|
|
465
|
-
|
|
466
|
-
const filtered = source.filter(localMatches);
|
|
467
|
-
const order = sendModel?.order || [];
|
|
468
|
-
if (order.length > 0) {
|
|
469
|
-
const { column, direction } = order[0];
|
|
470
|
-
const dir = direction === 'desc' ? -1 : 1;
|
|
471
|
-
filtered.sort((a, b) => {
|
|
472
|
-
const av = getValue(a, column);
|
|
473
|
-
const bv = getValue(b, column);
|
|
474
|
-
if (av == null && bv == null) return 0;
|
|
475
|
-
if (av == null) return -1 * dir;
|
|
476
|
-
if (bv == null) return 1 * dir;
|
|
477
|
-
if (typeof av === 'number' && typeof bv === 'number') return (av - bv) * dir;
|
|
478
|
-
return String(av).localeCompare(String(bv)) * dir;
|
|
479
|
-
});
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
const localRows = filtered.slice(offset, offset + limit);
|
|
483
|
-
serverItems?.set(filtered.length);
|
|
484
|
-
data.set(localRows);
|
|
485
|
-
isFetching = false;
|
|
486
|
-
return { rows: localRows, total: filtered.length };
|
|
487
|
-
}
|
|
488
|
-
|
|
489
383
|
const res = await _clientDbInstance.query({
|
|
490
384
|
q,
|
|
491
385
|
filters: filtersNormalized,
|
|
@@ -626,13 +520,13 @@
|
|
|
626
520
|
data.set(firstPage);
|
|
627
521
|
|
|
628
522
|
_clientDbInstance = new ClientDB(tableId);
|
|
629
|
-
_clientDbInstance
|
|
523
|
+
clientDbInitPromise = _clientDbInstance
|
|
630
524
|
.init(clientDbInitSource)
|
|
631
525
|
.then(async () => {
|
|
632
|
-
// Only mark ready and release seed after the first DB-backed query succeeds.
|
|
633
|
-
const result = await updateTableWithParams();
|
|
634
526
|
clientDbReady = true;
|
|
527
|
+
// Release the seed before refreshing so paging and filtering always query IndexedDB.
|
|
635
528
|
clientDbInitSource = [];
|
|
529
|
+
const result = await updateTableWithParams();
|
|
636
530
|
return result;
|
|
637
531
|
})
|
|
638
532
|
.catch(() => {
|
|
@@ -3,7 +3,7 @@ const DB_PREFIX = 'table-db-';
|
|
|
3
3
|
|
|
4
4
|
function openDB(name) {
|
|
5
5
|
return new Promise((resolve, reject) => {
|
|
6
|
-
const req = indexedDB.open(DB_PREFIX + name
|
|
6
|
+
const req = indexedDB.open(DB_PREFIX + name);
|
|
7
7
|
req.onupgradeneeded = () => {
|
|
8
8
|
const db = req.result;
|
|
9
9
|
if (!db.objectStoreNames.contains('rows')) {
|
|
@@ -4,7 +4,7 @@ const DB_PREFIX = 'table-db-';
|
|
|
4
4
|
|
|
5
5
|
function openDB(name) {
|
|
6
6
|
return new Promise((resolve, reject) => {
|
|
7
|
-
const req = indexedDB.open(DB_PREFIX + name
|
|
7
|
+
const req = indexedDB.open(DB_PREFIX + name);
|
|
8
8
|
req.onupgradeneeded = () => {
|
|
9
9
|
const db = req.result;
|
|
10
10
|
if (!db.objectStoreNames.contains('rows')) {
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
export let id: string = '';
|
|
5
5
|
export let label: string = '';
|
|
6
|
+
export let title: string = '';
|
|
6
7
|
export let checked: boolean = false;
|
|
7
8
|
|
|
8
9
|
export let valid: boolean;
|
|
@@ -10,11 +11,24 @@
|
|
|
10
11
|
export let required: boolean;
|
|
11
12
|
export let feedback: [];
|
|
12
13
|
export let description: string = '';
|
|
14
|
+
|
|
15
|
+
$: {
|
|
16
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
17
|
+
label = title;
|
|
18
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
19
|
+
title = label;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
13
25
|
</script>
|
|
14
26
|
|
|
27
|
+
|
|
15
28
|
<InputContainer {label} {feedback} {required} {description}>
|
|
16
29
|
<input
|
|
17
30
|
{id}
|
|
31
|
+
{title}
|
|
18
32
|
class="input variant-form-material bg-zinc-50 dark:bg-zinc-50"
|
|
19
33
|
type="checkbox"
|
|
20
34
|
class:input-success={valid}
|
|
@@ -5,20 +5,30 @@
|
|
|
5
5
|
export let source;
|
|
6
6
|
export let target;
|
|
7
7
|
export let title;
|
|
8
|
+
export let label
|
|
8
9
|
export let description = '';
|
|
9
10
|
export let key;
|
|
10
11
|
export let help = false;
|
|
11
12
|
export let vertical = false;
|
|
12
13
|
|
|
14
|
+
$: {
|
|
15
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
16
|
+
label = title;
|
|
17
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
18
|
+
title = label;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
13
22
|
let required = false;
|
|
14
23
|
export let feedback: [];
|
|
15
24
|
</script>
|
|
16
25
|
|
|
17
|
-
<InputContainer {id} label
|
|
26
|
+
<InputContainer {id} {label} {feedback} {required} {help} {description}>
|
|
18
27
|
<div class="flex gap-2" class:flex-col={vertical}>
|
|
19
28
|
{#each source as item}
|
|
20
29
|
<label class="flex items-center space-x-2" for={item.key}>
|
|
21
30
|
<input
|
|
31
|
+
{title}
|
|
22
32
|
class="checkbox"
|
|
23
33
|
type="checkbox"
|
|
24
34
|
bind:group={target}
|
|
@@ -4,14 +4,24 @@
|
|
|
4
4
|
export let source;
|
|
5
5
|
export let target;
|
|
6
6
|
export let title;
|
|
7
|
+
export let label;
|
|
7
8
|
export let description = '';
|
|
8
9
|
export let key;
|
|
9
10
|
|
|
11
|
+
$: {
|
|
12
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
13
|
+
label = title;
|
|
14
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
15
|
+
title = label;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
10
20
|
export let required = false;
|
|
11
21
|
export let feedback: [];
|
|
12
22
|
</script>
|
|
13
23
|
|
|
14
|
-
<InputContainer label
|
|
24
|
+
<InputContainer {label} {feedback} {required} {description}>
|
|
15
25
|
{#each source as item}
|
|
16
26
|
<label class="flex items-center space-x-2" for={item}>
|
|
17
27
|
<input class="checkbox" type="checkbox" bind:group={target} value={item} id={item} />
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
export let id: string = '';
|
|
5
5
|
export let label: string = '';
|
|
6
|
+
export let title: string = '';
|
|
6
7
|
export let value: string = '';
|
|
7
8
|
export let valid: boolean = false;
|
|
8
9
|
export let invalid: boolean = false;
|
|
@@ -13,6 +14,16 @@
|
|
|
13
14
|
export let description: string = '';
|
|
14
15
|
export let showDescription: boolean = false;
|
|
15
16
|
export let showIcon: boolean = false;
|
|
17
|
+
|
|
18
|
+
$: {
|
|
19
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
20
|
+
label = title;
|
|
21
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
22
|
+
title = label;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
16
27
|
</script>
|
|
17
28
|
|
|
18
29
|
<InputContainer
|
|
@@ -29,6 +40,7 @@
|
|
|
29
40
|
>
|
|
30
41
|
<input
|
|
31
42
|
{id}
|
|
43
|
+
{title}
|
|
32
44
|
class="input variant-form-material bg-zinc-50 dark:bg-zinc-700 placeholder:text-gray-400"
|
|
33
45
|
type="date"
|
|
34
46
|
class:input-success={valid}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
export let id: string = '';
|
|
8
8
|
export let label: string = '';
|
|
9
|
+
export let title: string = '';
|
|
9
10
|
export let value: string = '';
|
|
10
11
|
export let valid: boolean = false;
|
|
11
12
|
export let invalid: boolean = false;
|
|
@@ -37,6 +38,15 @@
|
|
|
37
38
|
if (mode === 'datetime') {
|
|
38
39
|
width = 'w-64';
|
|
39
40
|
}
|
|
41
|
+
|
|
42
|
+
$: {
|
|
43
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
44
|
+
label = title;
|
|
45
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
46
|
+
title = label;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
40
50
|
</script>
|
|
41
51
|
|
|
42
52
|
<InputContainer
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
export let source;
|
|
6
6
|
export let target;
|
|
7
7
|
export let title;
|
|
8
|
+
export let label;
|
|
8
9
|
export let valid = false;
|
|
9
10
|
export let invalid = false;
|
|
10
11
|
export let feedback = [''];
|
|
@@ -27,11 +28,21 @@
|
|
|
27
28
|
function updatedTarget(value) {
|
|
28
29
|
target = value;
|
|
29
30
|
}
|
|
31
|
+
|
|
32
|
+
$: {
|
|
33
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
34
|
+
label = title;
|
|
35
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
36
|
+
title = label;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
30
41
|
</script>
|
|
31
42
|
|
|
32
43
|
<InputContainer
|
|
33
44
|
{id}
|
|
34
|
-
label
|
|
45
|
+
{label}
|
|
35
46
|
{feedback}
|
|
36
47
|
{required}
|
|
37
48
|
{help}
|
|
@@ -43,6 +54,7 @@
|
|
|
43
54
|
>
|
|
44
55
|
<select
|
|
45
56
|
{id}
|
|
57
|
+
{title}
|
|
46
58
|
class="select variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
47
59
|
class:input-success={valid}
|
|
48
60
|
class:input-error={invalid}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
export let source;
|
|
6
6
|
export let target;
|
|
7
7
|
export let title;
|
|
8
|
+
export let label;
|
|
8
9
|
export let valid = false;
|
|
9
10
|
export let invalid = false;
|
|
10
11
|
export let feedback = [''];
|
|
@@ -36,11 +37,20 @@
|
|
|
36
37
|
target = id;
|
|
37
38
|
}
|
|
38
39
|
}
|
|
40
|
+
|
|
41
|
+
$: {
|
|
42
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
43
|
+
label = title;
|
|
44
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
45
|
+
title = label;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
39
49
|
</script>
|
|
40
50
|
|
|
41
51
|
<InputContainer
|
|
42
52
|
{id}
|
|
43
|
-
label
|
|
53
|
+
{label}
|
|
44
54
|
{feedback}
|
|
45
55
|
{required}
|
|
46
56
|
{help}
|
|
@@ -52,6 +62,7 @@
|
|
|
52
62
|
>
|
|
53
63
|
<select
|
|
54
64
|
{id}
|
|
65
|
+
{title}
|
|
55
66
|
class="select variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
56
67
|
class:input-success={valid}
|
|
57
68
|
class:input-error={invalid}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
export let target;
|
|
10
10
|
export let id;
|
|
11
11
|
export let title;
|
|
12
|
+
export let label;
|
|
12
13
|
export let itemId = 'value';
|
|
13
14
|
export let itemLabel = 'label';
|
|
14
15
|
export let itemGroup = '';
|
|
@@ -30,6 +31,15 @@
|
|
|
30
31
|
|
|
31
32
|
let isLoaded = false;
|
|
32
33
|
|
|
34
|
+
$: {
|
|
35
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
36
|
+
label = title;
|
|
37
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
38
|
+
title = label;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
33
43
|
$: value = '';
|
|
34
44
|
$: updateTarget(value);
|
|
35
45
|
$: (target, setValue(target));
|
|
@@ -303,7 +313,7 @@
|
|
|
303
313
|
|
|
304
314
|
<InputContainer
|
|
305
315
|
{id}
|
|
306
|
-
label
|
|
316
|
+
{label}
|
|
307
317
|
{feedback}
|
|
308
318
|
{required}
|
|
309
319
|
{help}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
export let id: string = '';
|
|
7
7
|
export let label: string = '';
|
|
8
|
+
export let title: string = '';
|
|
8
9
|
export let value: string = '';
|
|
9
10
|
|
|
10
11
|
export let valid: boolean = false;
|
|
@@ -20,6 +21,14 @@
|
|
|
20
21
|
export let min: number | undefined = undefined;
|
|
21
22
|
export let max: number | undefined = undefined;
|
|
22
23
|
|
|
24
|
+
$: {
|
|
25
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
26
|
+
label = title;
|
|
27
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
28
|
+
title = label;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
23
32
|
// Diese Zeile wird jedes Mal ausgeführt, wenn sich "menge" ändert
|
|
24
33
|
$: if (max != undefined && parseInt(value) > max) {
|
|
25
34
|
value = max.toString();
|
|
@@ -44,6 +53,7 @@
|
|
|
44
53
|
>
|
|
45
54
|
<input
|
|
46
55
|
{id}
|
|
56
|
+
{title}
|
|
47
57
|
class="input variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
48
58
|
type="number"
|
|
49
59
|
class:input-success={valid}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
export let id: string = '';
|
|
5
5
|
export let label: string = '';
|
|
6
|
+
export let title: string = '';
|
|
6
7
|
export let value: string = '';
|
|
7
8
|
|
|
8
9
|
export let valid: boolean = false;
|
|
@@ -15,6 +16,14 @@
|
|
|
15
16
|
export let description: string = '';
|
|
16
17
|
export let showDescription: boolean = false;
|
|
17
18
|
export let showIcon: boolean = false;
|
|
19
|
+
|
|
20
|
+
$: {
|
|
21
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
22
|
+
label = title;
|
|
23
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
24
|
+
title = label;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
18
27
|
</script>
|
|
19
28
|
|
|
20
29
|
<InputContainer
|
|
@@ -31,6 +40,7 @@
|
|
|
31
40
|
>
|
|
32
41
|
<textarea
|
|
33
42
|
{id}
|
|
43
|
+
{title}
|
|
34
44
|
class="textarea variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
35
45
|
class:input-success={valid}
|
|
36
46
|
class:input-error={invalid}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
export let id: string = '';
|
|
5
5
|
export let label: string = '';
|
|
6
|
+
export let title: string = '';
|
|
6
7
|
export let value: string = '';
|
|
7
8
|
export let valid: boolean = false;
|
|
8
9
|
export let invalid: boolean = false;
|
|
@@ -14,6 +15,15 @@
|
|
|
14
15
|
export let description: string = '';
|
|
15
16
|
export let showDescription: boolean = false;
|
|
16
17
|
export let showIcon: boolean = false;
|
|
18
|
+
|
|
19
|
+
$: {
|
|
20
|
+
if ((!label || label.trim() === '') && title && title.trim() !== '') {
|
|
21
|
+
label = title;
|
|
22
|
+
} else if ((!title || title.trim() === '') && label && label.trim() !== '') {
|
|
23
|
+
title = label;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
17
27
|
</script>
|
|
18
28
|
|
|
19
29
|
<InputContainer
|
|
@@ -30,6 +40,7 @@
|
|
|
30
40
|
>
|
|
31
41
|
<input
|
|
32
42
|
{id}
|
|
43
|
+
{title}
|
|
33
44
|
class="input variant-form-material dark:bg-zinc-700 bg-zinc-50 placeholder:text-gray-400"
|
|
34
45
|
type="text"
|
|
35
46
|
class:input-success={valid}
|