@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.
Files changed (41) hide show
  1. package/README.md +7 -0
  2. package/dist/components/Table/TableContent.svelte +6 -102
  3. package/dist/components/Table/clientDB.js +1 -1
  4. package/dist/components/Table/tableWorker.js +1 -1
  5. package/dist/components/form/Checkbox.svelte +10 -0
  6. package/dist/components/form/Checkbox.svelte.d.ts +1 -0
  7. package/dist/components/form/CheckboxKvPList.svelte +10 -1
  8. package/dist/components/form/CheckboxKvPList.svelte.d.ts +1 -0
  9. package/dist/components/form/CheckboxList.svelte +9 -1
  10. package/dist/components/form/CheckboxList.svelte.d.ts +1 -0
  11. package/dist/components/form/DateInput.svelte +9 -0
  12. package/dist/components/form/DateInput.svelte.d.ts +1 -0
  13. package/dist/components/form/DatePickerInput.svelte +8 -0
  14. package/dist/components/form/DatePickerInput.svelte.d.ts +1 -0
  15. package/dist/components/form/Dropdown.svelte +13 -1
  16. package/dist/components/form/Dropdown.svelte.d.ts +2 -0
  17. package/dist/components/form/DropdownKvP.svelte +12 -1
  18. package/dist/components/form/DropdownKvP.svelte.d.ts +2 -0
  19. package/dist/components/form/MultiSelect.svelte +11 -1
  20. package/dist/components/form/MultiSelect.svelte.d.ts +2 -0
  21. package/dist/components/form/NumberInput.svelte +9 -0
  22. package/dist/components/form/NumberInput.svelte.d.ts +1 -0
  23. package/dist/components/form/TextArea.svelte +9 -0
  24. package/dist/components/form/TextArea.svelte.d.ts +1 -0
  25. package/dist/components/form/TextInput.svelte +9 -0
  26. package/dist/components/form/TextInput.svelte.d.ts +1 -0
  27. package/package.json +1 -1
  28. package/src/lib/components/Table/TableContent.svelte +7 -113
  29. package/src/lib/components/Table/clientDB.js +1 -1
  30. package/src/lib/components/Table/tableWorker.js +1 -1
  31. package/src/lib/components/form/Checkbox.svelte +14 -0
  32. package/src/lib/components/form/CheckboxKvPList.svelte +11 -1
  33. package/src/lib/components/form/CheckboxList.svelte +11 -1
  34. package/src/lib/components/form/DateInput.svelte +12 -0
  35. package/src/lib/components/form/DatePickerInput.svelte +10 -0
  36. package/src/lib/components/form/Dropdown.svelte +13 -1
  37. package/src/lib/components/form/DropdownKvP.svelte +12 -1
  38. package/src/lib/components/form/MultiSelect.svelte +11 -1
  39. package/src/lib/components/form/NumberInput.svelte +10 -0
  40. package/src/lib/components/form/TextArea.svelte +10 -0
  41. package/src/lib/components/form/TextInput.svelte +11 -0
package/README.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # bexis-core-ui
2
2
 
3
+ ## 0.4.100
4
+ - Big Table
5
+ - support DB changes
6
+
7
+ ## 0.4.99
8
+ - Support label and titel in each form component
9
+
3
10
  ## 0.4.98
4
11
  - Table:
5
12
  - fix column read detection
@@ -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, 1);
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, 1);
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,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  id?: string;
5
5
  label?: string;
6
+ title?: string;
6
7
  checked?: boolean;
7
8
  valid: boolean;
8
9
  invalid: boolean;
@@ -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={title} {feedback} {required} {help} {description}>
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}
@@ -5,6 +5,7 @@ declare const __propDef: {
5
5
  source: any;
6
6
  target: any;
7
7
  title: any;
8
+ label: any;
8
9
  description?: string;
9
10
  key: any;
10
11
  help?: boolean;
@@ -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={title} {feedback} {required} {description}>
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} />
@@ -4,6 +4,7 @@ declare const __propDef: {
4
4
  source: any;
5
5
  target: any;
6
6
  title: any;
7
+ label: any;
7
8
  description?: string;
8
9
  key: any;
9
10
  required?: boolean;
@@ -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}
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  id?: string;
5
5
  label?: string;
6
+ title?: string;
6
7
  value?: string;
7
8
  valid?: boolean;
8
9
  invalid?: boolean;
@@ -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
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  id?: string;
5
5
  label?: string;
6
+ title?: string;
6
7
  value?: string;
7
8
  valid?: boolean;
8
9
  invalid?: boolean;
@@ -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={title}
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={title}
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={title}
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}
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  id?: string;
5
5
  label?: string;
6
+ title?: string;
6
7
  value?: string;
7
8
  valid?: boolean;
8
9
  invalid?: boolean;
@@ -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}
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  id?: string;
5
5
  label?: string;
6
+ title?: string;
6
7
  value?: string;
7
8
  valid?: boolean;
8
9
  invalid?: boolean;
@@ -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}
@@ -3,6 +3,7 @@ declare const __propDef: {
3
3
  props: {
4
4
  id?: string;
5
5
  label?: string;
6
+ title?: string;
6
7
  value?: string;
7
8
  valid?: boolean;
8
9
  invalid?: boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bexis2/bexis2-core-ui",
3
- "version": "0.4.98",
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, 1);
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, 1);
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={title} {feedback} {required} {help} {description}>
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={title} {feedback} {required} {description}>
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={title}
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={title}
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={title}
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}