@bexis2/bexis2-core-ui 0.3.12 → 0.3.13
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 +1 -0
- package/dist/components/File/FileUploader.svelte +3 -3
- package/dist/components/Table/TableContent.svelte +202 -119
- package/dist/components/Table/TableFilter.svelte +146 -102
- package/dist/components/Table/TableFilter.svelte.d.ts +2 -3
- package/dist/components/Table/TableFilterServer.svelte +274 -0
- package/dist/components/Table/TableFilterServer.svelte.d.ts +22 -0
- package/dist/components/Table/TablePagination.svelte +72 -39
- package/dist/components/Table/TablePaginationServer.svelte +125 -0
- package/dist/components/Table/TablePaginationServer.svelte.d.ts +21 -0
- package/dist/components/Table/filter.js +40 -78
- package/dist/components/Table/shared.d.ts +32 -0
- package/dist/components/Table/shared.js +117 -0
- package/dist/components/form/DropdownKvP.svelte.d.ts +4 -4
- package/dist/components/form/MultiSelect.svelte.d.ts +6 -6
- package/dist/models/Enums.d.ts +18 -0
- package/dist/models/Enums.js +20 -0
- package/dist/models/Models.d.ts +43 -2
- package/dist/models/Models.js +28 -1
- package/package.json +2 -2
- package/src/lib/components/Table/TableContent.svelte +227 -151
- package/src/lib/components/Table/TableFilter.svelte +166 -102
- package/src/lib/components/Table/TableFilterServer.svelte +310 -0
- package/src/lib/components/Table/TablePagination.svelte +75 -39
- package/src/lib/components/Table/TablePaginationServer.svelte +133 -0
- package/src/lib/components/Table/filter.ts +42 -86
- package/src/lib/components/Table/shared.ts +141 -0
- package/src/lib/components/file/FileUploader.svelte +3 -3
- package/src/lib/models/Enums.ts +22 -0
- package/src/lib/models/Models.ts +63 -2
|
@@ -13,6 +13,16 @@ const goToFirstPage = () => $pageIndex = 0;
|
|
|
13
13
|
const goToLastPage = () => $pageIndex = $pageCount - 1;
|
|
14
14
|
const goToNextPage = () => $pageIndex += 1;
|
|
15
15
|
const goToPreviousPage = () => $pageIndex -= 1;
|
|
16
|
+
const handleChange = (e) => {
|
|
17
|
+
const value = e.target.value;
|
|
18
|
+
if (value > $pageCount) {
|
|
19
|
+
$pageIndex = $pageCount - 1;
|
|
20
|
+
} else if (value < 1) {
|
|
21
|
+
$pageIndex = 0;
|
|
22
|
+
} else {
|
|
23
|
+
$pageIndex = value - 1;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
16
26
|
$:
|
|
17
27
|
goToFirstPageDisabled = !$pageIndex;
|
|
18
28
|
$:
|
|
@@ -23,43 +33,66 @@ $:
|
|
|
23
33
|
goToPreviousPageDisabled = !$hasPreviousPage;
|
|
24
34
|
</script>
|
|
25
35
|
|
|
26
|
-
<div class="flex justify-
|
|
27
|
-
<
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
36
|
+
<div class="flex justify-between w-full items-stretch gap-10">
|
|
37
|
+
<div class="flex justify-start">
|
|
38
|
+
<select
|
|
39
|
+
name="pageSize"
|
|
40
|
+
id="{id}-pageSize"
|
|
41
|
+
class="select variant-filled-primary w-min font-bold"
|
|
42
|
+
bind:value={$pageSize}
|
|
43
|
+
>
|
|
44
|
+
{#each pageSizes as size}
|
|
45
|
+
<option value={size}>{size}</option>
|
|
46
|
+
{/each}
|
|
47
|
+
</select>
|
|
48
|
+
</div>
|
|
49
|
+
<div class="flex justify-center gap-1">
|
|
50
|
+
<button
|
|
51
|
+
class="btn btn-sm variant-filled-primary"
|
|
52
|
+
on:click|preventDefault={goToFirstPage}
|
|
53
|
+
disabled={goToFirstPageDisabled}
|
|
54
|
+
id="{id}-first"
|
|
55
|
+
>
|
|
56
|
+
<Fa icon={faAnglesLeft} /></button
|
|
57
|
+
>
|
|
58
|
+
<button
|
|
59
|
+
class="btn btn-sm variant-filled-primary"
|
|
60
|
+
id="{id}-previous"
|
|
61
|
+
on:click|preventDefault={goToPreviousPage}
|
|
62
|
+
disabled={goToPreviousPageDisabled}><Fa icon={faAngleLeft} /></button
|
|
63
|
+
>
|
|
64
|
+
<input
|
|
65
|
+
type="number"
|
|
66
|
+
class="input border border-primary-500 rounded flex w-24"
|
|
67
|
+
value={$pageIndex + 1}
|
|
68
|
+
max={$pageCount}
|
|
69
|
+
min={1}
|
|
70
|
+
on:change={handleChange}
|
|
71
|
+
/>
|
|
72
|
+
<button
|
|
73
|
+
class="btn btn-sm variant-filled-primary"
|
|
74
|
+
id="{id}-next"
|
|
75
|
+
on:click|preventDefault={goToNextPage}
|
|
76
|
+
disabled={goToNextPageDisabled}><Fa icon={faAngleRight} /></button
|
|
77
|
+
>
|
|
78
|
+
<button
|
|
79
|
+
class="btn btn-sm variant-filled-primary"
|
|
80
|
+
id="{id}-last"
|
|
81
|
+
on:click|preventDefault={goToLastPage}
|
|
82
|
+
disabled={goToLastPageDisabled}><Fa icon={faAnglesRight} /></button
|
|
83
|
+
>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="flex justify-end items-center">
|
|
86
|
+
<span class="text-sm text-gray-500">
|
|
87
|
+
{#if $pageCount > 0}
|
|
88
|
+
{#if $pageCount == 1}
|
|
89
|
+
1 page
|
|
90
|
+
{:else}
|
|
91
|
+
{$pageCount} pages
|
|
92
|
+
{/if}
|
|
93
|
+
{:else}
|
|
94
|
+
No pages
|
|
95
|
+
{/if}
|
|
96
|
+
</span>
|
|
97
|
+
</div>
|
|
65
98
|
</div>
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
<script>import Fa from "svelte-fa/src/fa.svelte";
|
|
2
|
+
import {
|
|
3
|
+
faAnglesRight,
|
|
4
|
+
faAngleRight,
|
|
5
|
+
faAnglesLeft,
|
|
6
|
+
faAngleLeft
|
|
7
|
+
} from "@fortawesome/free-solid-svg-icons";
|
|
8
|
+
export let id;
|
|
9
|
+
export let pageIndex;
|
|
10
|
+
export let pageSize;
|
|
11
|
+
export let pageSizes;
|
|
12
|
+
export let serverItemCount;
|
|
13
|
+
export let updateTable;
|
|
14
|
+
let goToFirstPageDisabled = true;
|
|
15
|
+
let goToLastPageDisabled = true;
|
|
16
|
+
let goToNextPageDisabled = true;
|
|
17
|
+
let goToPreviousPageDisabled = true;
|
|
18
|
+
const handleChange = (e) => {
|
|
19
|
+
const value = e.target.value;
|
|
20
|
+
if (value > pageCount) {
|
|
21
|
+
$pageIndex = pageCount - 1;
|
|
22
|
+
} else if (value < 1) {
|
|
23
|
+
$pageIndex = 0;
|
|
24
|
+
} else {
|
|
25
|
+
$pageIndex = value - 1;
|
|
26
|
+
}
|
|
27
|
+
updateTable();
|
|
28
|
+
};
|
|
29
|
+
const goTo = (dst) => {
|
|
30
|
+
switch (dst) {
|
|
31
|
+
case "first":
|
|
32
|
+
$pageIndex = 0;
|
|
33
|
+
break;
|
|
34
|
+
case "last":
|
|
35
|
+
$pageIndex = pageCount - 1;
|
|
36
|
+
break;
|
|
37
|
+
case "next":
|
|
38
|
+
$pageIndex += 1;
|
|
39
|
+
break;
|
|
40
|
+
case "previous":
|
|
41
|
+
$pageIndex -= 1;
|
|
42
|
+
break;
|
|
43
|
+
default:
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
updateTable();
|
|
47
|
+
};
|
|
48
|
+
$:
|
|
49
|
+
pageCount = Math.ceil($serverItemCount / $pageSize);
|
|
50
|
+
$:
|
|
51
|
+
goToFirstPageDisabled = !$pageIndex;
|
|
52
|
+
$:
|
|
53
|
+
goToLastPageDisabled = $pageIndex == pageCount - 1;
|
|
54
|
+
$:
|
|
55
|
+
goToNextPageDisabled = $pageIndex == pageCount - 1;
|
|
56
|
+
$:
|
|
57
|
+
goToPreviousPageDisabled = !$pageIndex;
|
|
58
|
+
$:
|
|
59
|
+
$pageSize && updateTable();
|
|
60
|
+
updateTable();
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<div class="flex justify-between w-full items-stretch gap-10">
|
|
64
|
+
<div class="flex justify-start">
|
|
65
|
+
<select
|
|
66
|
+
name="pageSize"
|
|
67
|
+
id="{id}-pageSize"
|
|
68
|
+
class="select variant-filled-primary w-min font-bold"
|
|
69
|
+
bind:value={$pageSize}
|
|
70
|
+
>
|
|
71
|
+
{#each pageSizes as size}
|
|
72
|
+
<option value={size}>{size}</option>
|
|
73
|
+
{/each}
|
|
74
|
+
</select>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="flex justify-center gap-1">
|
|
77
|
+
<button
|
|
78
|
+
class="btn btn-sm variant-filled-primary"
|
|
79
|
+
on:click|preventDefault={() => goTo('first')}
|
|
80
|
+
disabled={goToFirstPageDisabled}
|
|
81
|
+
id="{id}-first"
|
|
82
|
+
>
|
|
83
|
+
<Fa icon={faAnglesLeft} /></button
|
|
84
|
+
>
|
|
85
|
+
<button
|
|
86
|
+
class="btn btn-sm variant-filled-primary"
|
|
87
|
+
id="{id}-previous"
|
|
88
|
+
on:click|preventDefault={() => goTo('previous')}
|
|
89
|
+
disabled={goToPreviousPageDisabled}><Fa icon={faAngleLeft} /></button
|
|
90
|
+
>
|
|
91
|
+
<input
|
|
92
|
+
type="number"
|
|
93
|
+
class="input border border-primary-500 rounded flex w-24"
|
|
94
|
+
value={$pageIndex + 1}
|
|
95
|
+
max={pageCount}
|
|
96
|
+
min={1}
|
|
97
|
+
on:change={handleChange}
|
|
98
|
+
/>
|
|
99
|
+
<button
|
|
100
|
+
class="btn btn-sm variant-filled-primary"
|
|
101
|
+
id="{id}-next"
|
|
102
|
+
on:click|preventDefault={() => goTo('next')}
|
|
103
|
+
disabled={goToNextPageDisabled}><Fa icon={faAngleRight} /></button
|
|
104
|
+
>
|
|
105
|
+
<button
|
|
106
|
+
class="btn btn-sm variant-filled-primary"
|
|
107
|
+
id="{id}-last"
|
|
108
|
+
on:click|preventDefault={() => goTo('last')}
|
|
109
|
+
disabled={goToLastPageDisabled}><Fa icon={faAnglesRight} /></button
|
|
110
|
+
>
|
|
111
|
+
</div>
|
|
112
|
+
<div class="flex justify-end items-center">
|
|
113
|
+
<span class="text-sm text-gray-500">
|
|
114
|
+
{#if pageCount > 0}
|
|
115
|
+
{#if pageCount == 1}
|
|
116
|
+
1 page
|
|
117
|
+
{:else}
|
|
118
|
+
{pageCount} pages
|
|
119
|
+
{/if}
|
|
120
|
+
{:else}
|
|
121
|
+
No pages
|
|
122
|
+
{/if}
|
|
123
|
+
</span>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SvelteComponentTyped } from "svelte";
|
|
2
|
+
declare const __propDef: {
|
|
3
|
+
props: {
|
|
4
|
+
id: any;
|
|
5
|
+
pageIndex: any;
|
|
6
|
+
pageSize: any;
|
|
7
|
+
pageSizes: any;
|
|
8
|
+
serverItemCount: any;
|
|
9
|
+
updateTable: any;
|
|
10
|
+
};
|
|
11
|
+
events: {
|
|
12
|
+
[evt: string]: CustomEvent<any>;
|
|
13
|
+
};
|
|
14
|
+
slots: {};
|
|
15
|
+
};
|
|
16
|
+
export type TablePaginationServerProps = typeof __propDef.props;
|
|
17
|
+
export type TablePaginationServerEvents = typeof __propDef.events;
|
|
18
|
+
export type TablePaginationServerSlots = typeof __propDef.slots;
|
|
19
|
+
export default class TablePaginationServer extends SvelteComponentTyped<TablePaginationServerProps, TablePaginationServerEvents, TablePaginationServerSlots> {
|
|
20
|
+
}
|
|
21
|
+
export {};
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
import { FilterOptionsEnum } from '../../models/Enums';
|
|
1
2
|
const textFilter = (filterOption, filterValue, value) => {
|
|
2
3
|
switch (filterOption) {
|
|
3
|
-
case
|
|
4
|
+
case FilterOptionsEnum.e:
|
|
4
5
|
return value.toLowerCase() === filterValue.toLowerCase();
|
|
5
|
-
case
|
|
6
|
+
case FilterOptionsEnum.ne:
|
|
6
7
|
return value.toLowerCase() !== filterValue.toLowerCase();
|
|
7
|
-
case
|
|
8
|
+
case FilterOptionsEnum.sw:
|
|
8
9
|
return value.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
9
|
-
case
|
|
10
|
+
case FilterOptionsEnum.ew:
|
|
10
11
|
return value.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
11
|
-
case
|
|
12
|
+
case FilterOptionsEnum.c:
|
|
12
13
|
return value.toLowerCase().includes(filterValue.toLowerCase());
|
|
13
|
-
case
|
|
14
|
+
case FilterOptionsEnum.nc:
|
|
14
15
|
return !value.toLowerCase().includes(filterValue.toLowerCase());
|
|
15
16
|
default:
|
|
16
17
|
return false;
|
|
@@ -18,17 +19,17 @@ const textFilter = (filterOption, filterValue, value) => {
|
|
|
18
19
|
};
|
|
19
20
|
const numberFilter = (filterOption, filterValue, value) => {
|
|
20
21
|
switch (filterOption) {
|
|
21
|
-
case
|
|
22
|
+
case FilterOptionsEnum.e:
|
|
22
23
|
return value === filterValue;
|
|
23
|
-
case
|
|
24
|
+
case FilterOptionsEnum.ne:
|
|
24
25
|
return value !== filterValue;
|
|
25
|
-
case
|
|
26
|
+
case FilterOptionsEnum.gt:
|
|
26
27
|
return value > filterValue;
|
|
27
|
-
case
|
|
28
|
+
case FilterOptionsEnum.lt:
|
|
28
29
|
return value < filterValue;
|
|
29
|
-
case
|
|
30
|
+
case FilterOptionsEnum.gte:
|
|
30
31
|
return value >= filterValue;
|
|
31
|
-
case
|
|
32
|
+
case FilterOptionsEnum.lte:
|
|
32
33
|
return value <= filterValue;
|
|
33
34
|
default:
|
|
34
35
|
return false;
|
|
@@ -37,81 +38,42 @@ const numberFilter = (filterOption, filterValue, value) => {
|
|
|
37
38
|
const dateFilter = (filterOption, filterValue, value) => {
|
|
38
39
|
const filter = new Date(filterValue);
|
|
39
40
|
switch (filterOption) {
|
|
40
|
-
case
|
|
41
|
-
return value === filter;
|
|
42
|
-
case
|
|
43
|
-
return value >= filter;
|
|
44
|
-
case
|
|
45
|
-
return value > filter;
|
|
46
|
-
case
|
|
47
|
-
return value <= filter;
|
|
48
|
-
case
|
|
49
|
-
return value < filter;
|
|
50
|
-
case
|
|
51
|
-
return value !== filter;
|
|
41
|
+
case FilterOptionsEnum.o:
|
|
42
|
+
return value.getTime() === filter.getTime();
|
|
43
|
+
case FilterOptionsEnum.sf:
|
|
44
|
+
return value.getTime() >= filter.getTime();
|
|
45
|
+
case FilterOptionsEnum.a:
|
|
46
|
+
return value.getTime() > filter.getTime();
|
|
47
|
+
case FilterOptionsEnum.u:
|
|
48
|
+
return value.getTime() <= filter.getTime();
|
|
49
|
+
case FilterOptionsEnum.b:
|
|
50
|
+
return value.getTime() < filter.getTime();
|
|
51
|
+
case FilterOptionsEnum.no:
|
|
52
|
+
return value.getTime() !== filter.getTime();
|
|
52
53
|
default:
|
|
53
54
|
return false;
|
|
54
55
|
}
|
|
55
56
|
};
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
else if ((secondFilterOption == null || secondFilterValue == null) &&
|
|
67
|
-
firstFilterOption != null &&
|
|
68
|
-
firstFilterValue != null) {
|
|
69
|
-
return numberFilter(firstFilterOption, firstFilterValue, value);
|
|
70
|
-
}
|
|
71
|
-
return (numberFilter(firstFilterOption, firstFilterValue, value) &&
|
|
72
|
-
numberFilter(secondFilterOption, secondFilterValue, value));
|
|
73
|
-
};
|
|
74
|
-
const stringFilter = ({ filterValue, value }) => {
|
|
75
|
-
const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
|
|
76
|
-
if (!firstFilterValue?.length && !secondFilterValue?.length) {
|
|
77
|
-
return true;
|
|
78
|
-
}
|
|
79
|
-
else if ((!firstFilterOption || !firstFilterValue) &&
|
|
80
|
-
secondFilterOption &&
|
|
81
|
-
secondFilterValue?.length) {
|
|
82
|
-
return textFilter(secondFilterOption, secondFilterValue, value);
|
|
83
|
-
}
|
|
84
|
-
else if ((!secondFilterOption || !secondFilterValue?.length) &&
|
|
85
|
-
firstFilterOption &&
|
|
86
|
-
firstFilterValue?.length) {
|
|
87
|
-
return textFilter(firstFilterOption, firstFilterValue, value);
|
|
88
|
-
}
|
|
89
|
-
return (textFilter(firstFilterOption, firstFilterValue, value) &&
|
|
90
|
-
textFilter(secondFilterOption, secondFilterValue, value));
|
|
91
|
-
};
|
|
92
|
-
const dateTypeFilter = ({ filterValue, value }) => {
|
|
93
|
-
const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
|
|
94
|
-
if (!firstFilterValue && !secondFilterValue) {
|
|
95
|
-
return true;
|
|
96
|
-
}
|
|
97
|
-
else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
|
|
98
|
-
return dateFilter(secondFilterOption, secondFilterValue, value);
|
|
99
|
-
}
|
|
100
|
-
else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
|
|
101
|
-
return dateFilter(firstFilterOption, firstFilterValue, value);
|
|
102
|
-
}
|
|
103
|
-
return (dateFilter(firstFilterOption, firstFilterValue, value) &&
|
|
104
|
-
dateFilter(secondFilterOption, secondFilterValue, value));
|
|
57
|
+
const applyFilter = (filterValue, value, filterFn) => {
|
|
58
|
+
let result = true;
|
|
59
|
+
const filters = Object.keys(filterValue).map((key) => ({
|
|
60
|
+
option: key,
|
|
61
|
+
value: filterValue[key]
|
|
62
|
+
}));
|
|
63
|
+
filters.forEach((filter) => {
|
|
64
|
+
result = result && (filter.value ? filterFn(filter.option, filter.value, value) : true);
|
|
65
|
+
});
|
|
66
|
+
return result;
|
|
105
67
|
};
|
|
106
68
|
export const columnFilter = ({ filterValue, value }) => {
|
|
107
|
-
if (typeof value === '
|
|
108
|
-
return
|
|
69
|
+
if (typeof value === 'object' && value instanceof Date) {
|
|
70
|
+
return applyFilter(filterValue, value, dateFilter);
|
|
109
71
|
}
|
|
110
72
|
else if (typeof value === 'number') {
|
|
111
|
-
return
|
|
73
|
+
return applyFilter(filterValue, value, numberFilter);
|
|
112
74
|
}
|
|
113
|
-
else if (typeof value === '
|
|
114
|
-
return
|
|
75
|
+
else if (typeof value === 'string') {
|
|
76
|
+
return applyFilter(filterValue, value, textFilter);
|
|
115
77
|
}
|
|
116
78
|
return false;
|
|
117
79
|
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { FilterOptionsEnum } from '../../models/Enums';
|
|
2
|
+
import type { Columns, Filter, ServerColumn } from '../../models/Models';
|
|
3
|
+
export declare const minWidth: (id: string, columns: Columns | undefined) => number;
|
|
4
|
+
export declare const fixedWidth: (id: string, columns: Columns | undefined) => number;
|
|
5
|
+
export declare const cellStyle: (id: string, columns: Columns | undefined) => string;
|
|
6
|
+
export declare const normalizeFilters: (filters: {
|
|
7
|
+
[key: string]: {
|
|
8
|
+
e?: string | number | Date | undefined;
|
|
9
|
+
ne?: string | number | Date | undefined;
|
|
10
|
+
gt?: string | number | Date | undefined;
|
|
11
|
+
lt?: string | number | Date | undefined;
|
|
12
|
+
gte?: string | number | Date | undefined;
|
|
13
|
+
lte?: string | number | Date | undefined;
|
|
14
|
+
c?: string | number | Date | undefined;
|
|
15
|
+
nc?: string | number | Date | undefined;
|
|
16
|
+
sw?: string | number | Date | undefined;
|
|
17
|
+
ew?: string | number | Date | undefined;
|
|
18
|
+
o?: string | number | Date | undefined;
|
|
19
|
+
sf?: string | number | Date | undefined;
|
|
20
|
+
a?: string | number | Date | undefined;
|
|
21
|
+
u?: string | number | Date | undefined;
|
|
22
|
+
b?: string | number | Date | undefined;
|
|
23
|
+
no?: string | number | Date | undefined;
|
|
24
|
+
};
|
|
25
|
+
}) => Filter[];
|
|
26
|
+
export declare const exportAsCsv: (tableId: string, exportedData: string) => void;
|
|
27
|
+
export declare const resetResize: (headerRows: any, pageRows: any, tableId: string, columns: Columns | undefined, resizable: 'none' | 'rows' | 'columns' | 'both') => void;
|
|
28
|
+
export declare const missingValuesFn: (key: number, missingValues: {
|
|
29
|
+
[key: string]: string;
|
|
30
|
+
[key: number]: string;
|
|
31
|
+
}) => string;
|
|
32
|
+
export declare const convertServerColumns: (columns: ServerColumn[]) => Columns;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Function to determine minWidth for a column to simplify the logic in the HTML
|
|
2
|
+
export const minWidth = (id, columns) => {
|
|
3
|
+
if (columns && id in columns) {
|
|
4
|
+
return columns[id].minWidth ?? 0;
|
|
5
|
+
}
|
|
6
|
+
return 0;
|
|
7
|
+
};
|
|
8
|
+
// Function to determine fixedWidth for a column to simplify the logic in the HTML
|
|
9
|
+
export const fixedWidth = (id, columns) => {
|
|
10
|
+
if (columns && id in columns) {
|
|
11
|
+
return columns[id].fixedWidth ?? 0;
|
|
12
|
+
}
|
|
13
|
+
return 0;
|
|
14
|
+
};
|
|
15
|
+
// Function to create custom styles for the columns to simplify the logic in the HTML
|
|
16
|
+
export const cellStyle = (id, columns) => {
|
|
17
|
+
const minW = minWidth(id, columns);
|
|
18
|
+
const fixedW = fixedWidth(id, columns);
|
|
19
|
+
const styles = [];
|
|
20
|
+
// If minWidth is provided, add to styles
|
|
21
|
+
minW && styles.push(`min-width: ${minW}px`);
|
|
22
|
+
// If fixedWidth is provided, add to styles
|
|
23
|
+
fixedW && styles.push(`width: ${fixedW}px`);
|
|
24
|
+
// Create and return styles separated by ';'
|
|
25
|
+
return styles.join(';');
|
|
26
|
+
};
|
|
27
|
+
// Function to normalize the filters for back-end
|
|
28
|
+
export const normalizeFilters = (filters) => {
|
|
29
|
+
let filter = [];
|
|
30
|
+
// Add filters to the request
|
|
31
|
+
Object.keys(filters).forEach((key) => {
|
|
32
|
+
Object.keys(filters[key])
|
|
33
|
+
.filter((k) => filters[key][k] !== undefined)
|
|
34
|
+
.forEach((k) => {
|
|
35
|
+
filter.push({
|
|
36
|
+
column: key,
|
|
37
|
+
filterBy: k,
|
|
38
|
+
value: filters[key][k]
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
return filter;
|
|
43
|
+
};
|
|
44
|
+
export const exportAsCsv = (tableId, exportedData) => {
|
|
45
|
+
// Creating a hidden anchor element to download the CSV file
|
|
46
|
+
const anchor = document.createElement('a');
|
|
47
|
+
anchor.style.display = 'none';
|
|
48
|
+
anchor.href = `data:text/csv;charset=utf-8,${encodeURIComponent(exportedData)}`;
|
|
49
|
+
anchor.download = `${tableId}.csv`;
|
|
50
|
+
document.body.appendChild(anchor);
|
|
51
|
+
anchor.click();
|
|
52
|
+
document.body.removeChild(anchor);
|
|
53
|
+
};
|
|
54
|
+
// Resetting the resized columns and/or rows
|
|
55
|
+
export const resetResize = (headerRows, pageRows, tableId, columns, resizable) => {
|
|
56
|
+
// Run only if resizable is not none
|
|
57
|
+
if (resizable === 'columns' || resizable === 'both') {
|
|
58
|
+
headerRows.forEach((row) => {
|
|
59
|
+
row.cells.forEach((cell) => {
|
|
60
|
+
const minW = minWidth(cell.id, columns);
|
|
61
|
+
const fixedW = fixedWidth(cell.id, columns);
|
|
62
|
+
// If a fixedWidth is provided for a column, then reset the width to that value
|
|
63
|
+
fixedW &&
|
|
64
|
+
document
|
|
65
|
+
.getElementById(`th-${tableId}-${cell.id}`)
|
|
66
|
+
?.style.setProperty('width', `${fixedW}px`);
|
|
67
|
+
// If a minWidth is provided for a column, then reset the width to that value
|
|
68
|
+
minW &&
|
|
69
|
+
document
|
|
70
|
+
.getElementById(`th-${tableId}-${cell.id}`)
|
|
71
|
+
?.style.setProperty('width', `${minW}px`);
|
|
72
|
+
// If neither minWidth nor fixedWidth provided for a column, then reset the width to auto
|
|
73
|
+
!minW &&
|
|
74
|
+
!fixedW &&
|
|
75
|
+
document.getElementById(`th-${tableId}-${cell.id}`)?.style.setProperty('width', 'auto');
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (resizable === 'rows' || resizable === 'both') {
|
|
80
|
+
pageRows.forEach((row) => {
|
|
81
|
+
row.cells.forEach((cell) => {
|
|
82
|
+
// Reset all row heights to auto
|
|
83
|
+
document
|
|
84
|
+
.getElementById(`${tableId}-${cell.id}-${row.id}`)
|
|
85
|
+
?.style.setProperty('height', 'auto');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
export const missingValuesFn = (key, missingValues) => {
|
|
91
|
+
return key in missingValues ? missingValues[key] : key.toString();
|
|
92
|
+
};
|
|
93
|
+
export const convertServerColumns = (columns) => {
|
|
94
|
+
const columnsConfig = {};
|
|
95
|
+
columns.forEach((col) => {
|
|
96
|
+
let instructions = {};
|
|
97
|
+
// if (col.instructions?.displayPattern) {
|
|
98
|
+
// instructions = {
|
|
99
|
+
// toStringFn: (date: Date) =>
|
|
100
|
+
// date.toLocaleString('en-US', col.instructions?.displayPattern || {}),
|
|
101
|
+
// toSortableValueFn: (date: Date) => date.getTime(),
|
|
102
|
+
// toFilterableValueFn: (date: Date) => date
|
|
103
|
+
// };
|
|
104
|
+
// }
|
|
105
|
+
if (col.instructions?.missingValues) {
|
|
106
|
+
instructions = {
|
|
107
|
+
...instructions,
|
|
108
|
+
toStringFn: (key) => missingValuesFn(key, col.instructions?.missingValues || {})
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
columnsConfig[col.column] = {
|
|
112
|
+
exclude: col.exclude,
|
|
113
|
+
instructions
|
|
114
|
+
};
|
|
115
|
+
});
|
|
116
|
+
return columnsConfig;
|
|
117
|
+
};
|
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
/** @typedef {typeof __propDef.events} DropdownKvPEvents */
|
|
3
3
|
/** @typedef {typeof __propDef.slots} DropdownKvPSlots */
|
|
4
4
|
export default class DropdownKvP extends SvelteComponentTyped<{
|
|
5
|
-
target: any;
|
|
6
5
|
id: any;
|
|
6
|
+
target: any;
|
|
7
7
|
source: any;
|
|
8
8
|
title: any;
|
|
9
|
-
required?: boolean | undefined;
|
|
10
9
|
invalid?: boolean | undefined;
|
|
11
10
|
valid?: boolean | undefined;
|
|
12
11
|
feedback?: string[] | undefined;
|
|
12
|
+
required?: boolean | undefined;
|
|
13
13
|
complexTarget?: boolean | undefined;
|
|
14
14
|
help?: boolean | undefined;
|
|
15
15
|
}, {
|
|
@@ -25,14 +25,14 @@ export type DropdownKvPSlots = typeof __propDef.slots;
|
|
|
25
25
|
import { SvelteComponentTyped } from "svelte";
|
|
26
26
|
declare const __propDef: {
|
|
27
27
|
props: {
|
|
28
|
-
target: any;
|
|
29
28
|
id: any;
|
|
29
|
+
target: any;
|
|
30
30
|
source: any;
|
|
31
31
|
title: any;
|
|
32
|
-
required?: boolean | undefined;
|
|
33
32
|
invalid?: boolean | undefined;
|
|
34
33
|
valid?: boolean | undefined;
|
|
35
34
|
feedback?: string[] | undefined;
|
|
35
|
+
required?: boolean | undefined;
|
|
36
36
|
complexTarget?: boolean | undefined;
|
|
37
37
|
help?: boolean | undefined;
|
|
38
38
|
};
|
|
@@ -2,14 +2,13 @@
|
|
|
2
2
|
/** @typedef {typeof __propDef.events} MultiSelectEvents */
|
|
3
3
|
/** @typedef {typeof __propDef.slots} MultiSelectSlots */
|
|
4
4
|
export default class MultiSelect extends SvelteComponentTyped<{
|
|
5
|
-
target: any;
|
|
6
5
|
id: any;
|
|
6
|
+
target: any;
|
|
7
7
|
source: any;
|
|
8
8
|
title: any;
|
|
9
|
-
disabled?: boolean | undefined;
|
|
10
|
-
required?: boolean | undefined;
|
|
11
9
|
invalid?: boolean | undefined;
|
|
12
10
|
feedback?: string[] | undefined;
|
|
11
|
+
required?: boolean | undefined;
|
|
13
12
|
complexTarget?: boolean | undefined;
|
|
14
13
|
help?: boolean | undefined;
|
|
15
14
|
itemId?: string | undefined;
|
|
@@ -20,6 +19,7 @@ export default class MultiSelect extends SvelteComponentTyped<{
|
|
|
20
19
|
placeholder?: string | undefined;
|
|
21
20
|
loading?: boolean | undefined;
|
|
22
21
|
clearable?: boolean | undefined;
|
|
22
|
+
disabled?: boolean | undefined;
|
|
23
23
|
}, {
|
|
24
24
|
change: CustomEvent<any>;
|
|
25
25
|
input: CustomEvent<any>;
|
|
@@ -39,14 +39,13 @@ export type MultiSelectSlots = typeof __propDef.slots;
|
|
|
39
39
|
import { SvelteComponentTyped } from "svelte";
|
|
40
40
|
declare const __propDef: {
|
|
41
41
|
props: {
|
|
42
|
-
target: any;
|
|
43
42
|
id: any;
|
|
43
|
+
target: any;
|
|
44
44
|
source: any;
|
|
45
45
|
title: any;
|
|
46
|
-
disabled?: boolean | undefined;
|
|
47
|
-
required?: boolean | undefined;
|
|
48
46
|
invalid?: boolean | undefined;
|
|
49
47
|
feedback?: string[] | undefined;
|
|
48
|
+
required?: boolean | undefined;
|
|
50
49
|
complexTarget?: boolean | undefined;
|
|
51
50
|
help?: boolean | undefined;
|
|
52
51
|
itemId?: string | undefined;
|
|
@@ -57,6 +56,7 @@ declare const __propDef: {
|
|
|
57
56
|
placeholder?: string | undefined;
|
|
58
57
|
loading?: boolean | undefined;
|
|
59
58
|
clearable?: boolean | undefined;
|
|
59
|
+
disabled?: boolean | undefined;
|
|
60
60
|
};
|
|
61
61
|
events: {
|
|
62
62
|
change: CustomEvent<any>;
|