@bexis2/bexis2-core-ui 0.2.28 → 0.2.30
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 +21 -2
- package/dist/TableView.svelte +1 -1
- package/dist/components/{file → File}/FileIcon.svelte +45 -45
- package/{src/lib/components/file → dist/components/File}/FileInfo.svelte +13 -13
- package/dist/components/ListView.svelte +5 -5
- package/dist/components/Table/Table.svelte +17 -2
- package/dist/components/Table/TableFilter.svelte +13 -6
- package/dist/components/form/Checkbox.svelte +13 -13
- package/dist/components/form/CheckboxKvPList.svelte +16 -16
- package/dist/components/form/CheckboxList.svelte +10 -10
- package/dist/components/form/DateInput.svelte +15 -13
- package/dist/components/form/DateInput.svelte.d.ts +1 -0
- package/dist/components/form/DropdownKvP.svelte +54 -54
- package/dist/components/form/MultiSelect.svelte +181 -181
- package/dist/components/form/NumberInput.svelte +16 -14
- package/dist/components/form/NumberInput.svelte.d.ts +1 -0
- package/dist/components/form/TextArea.svelte +15 -13
- package/dist/components/form/TextArea.svelte.d.ts +1 -0
- package/dist/components/form/TextInput.svelte +16 -14
- package/dist/components/form/TextInput.svelte.d.ts +1 -0
- package/dist/components/page/Alert.svelte +28 -28
- package/dist/components/page/BackToTop.svelte +30 -30
- package/dist/components/page/Docs.svelte +22 -22
- package/dist/components/page/ErrorMessage.svelte +8 -8
- package/dist/components/page/Footer.svelte +5 -5
- package/dist/components/page/Header.svelte +5 -5
- package/dist/components/page/HelpPopUp.svelte +30 -30
- package/dist/components/page/PageCaller.js +19 -19
- package/dist/components/page/Spinner.svelte +14 -14
- package/dist/components/page/breadcrumb/Breadcrumb.svelte +19 -19
- package/dist/components/page/menu/MenuDataCaller.js +10 -10
- package/dist/css/core.ui.postcss +17 -17
- package/dist/css/themes/theme-bexis2.css +96 -96
- package/dist/css/themes/theme-crimson.css +101 -101
- package/dist/css/themes/theme-gold-nouveau.css +140 -140
- package/dist/css/themes/theme-hamlindigo.css +112 -112
- package/dist/css/themes/theme-modern.css +127 -127
- package/dist/css/themes/theme-rocket.css +119 -119
- package/dist/css/themes/theme-sahara.css +128 -128
- package/dist/css/themes/theme-seafoam.css +122 -122
- package/dist/css/themes/theme-seasonal.css +115 -115
- package/dist/css/themes/theme-skeleton.css +118 -118
- package/dist/css/themes/theme-vintage.css +125 -125
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -3
- package/dist/models/Models.d.ts +3 -3
- package/dist/services/BaseCaller.js +16 -16
- package/package.json +1 -1
- package/src/lib/TableView.svelte +1 -1
- package/src/lib/components/{file → File}/FileIcon.svelte +45 -45
- package/{dist/components/file → src/lib/components/File}/FileInfo.svelte +13 -13
- package/src/lib/components/ListView.svelte +11 -11
- package/src/lib/components/Table/Table.svelte +19 -3
- package/src/lib/components/Table/TableFilter.svelte +15 -6
- package/src/lib/components/Table/filter.ts +141 -141
- package/src/lib/components/form/Checkbox.svelte +24 -24
- package/src/lib/components/form/CheckboxKvPList.svelte +29 -29
- package/src/lib/components/form/CheckboxList.svelte +21 -21
- package/src/lib/components/form/DateInput.svelte +27 -25
- package/src/lib/components/form/DropdownKvP.svelte +54 -54
- package/src/lib/components/form/MultiSelect.svelte +181 -181
- package/src/lib/components/form/NumberInput.svelte +30 -28
- package/src/lib/components/form/TextArea.svelte +28 -26
- package/src/lib/components/form/TextInput.svelte +28 -26
- package/src/lib/components/page/Alert.svelte +41 -41
- package/src/lib/components/page/BackToTop.svelte +30 -30
- package/src/lib/components/page/Docs.svelte +46 -46
- package/src/lib/components/page/ErrorMessage.svelte +10 -10
- package/src/lib/components/page/Footer.svelte +18 -18
- package/src/lib/components/page/Header.svelte +18 -18
- package/src/lib/components/page/HelpPopUp.svelte +72 -72
- package/src/lib/components/page/PageCaller.js +19 -19
- package/src/lib/components/page/Spinner.svelte +20 -20
- package/src/lib/components/page/breadcrumb/Breadcrumb.svelte +39 -39
- package/src/lib/components/page/menu/MenuDataCaller.js +10 -10
- package/src/lib/css/core.ui.postcss +17 -17
- package/src/lib/css/themes/theme-bexis2.css +96 -96
- package/src/lib/css/themes/theme-crimson.css +101 -101
- package/src/lib/css/themes/theme-gold-nouveau.css +140 -140
- package/src/lib/css/themes/theme-hamlindigo.css +112 -112
- package/src/lib/css/themes/theme-modern.css +127 -127
- package/src/lib/css/themes/theme-rocket.css +119 -119
- package/src/lib/css/themes/theme-sahara.css +128 -128
- package/src/lib/css/themes/theme-seafoam.css +122 -122
- package/src/lib/css/themes/theme-seasonal.css +115 -115
- package/src/lib/css/themes/theme-skeleton.css +118 -118
- package/src/lib/css/themes/theme-vintage.css +125 -125
- package/src/lib/index.ts +3 -3
- package/src/lib/models/Models.ts +3 -3
- package/src/lib/models/Page.ts +40 -40
- package/src/lib/services/Api.ts +55 -55
- package/src/lib/services/BaseCaller.js +16 -16
- package/src/lib/stores/apiStores.ts +31 -31
- /package/dist/components/{file → File}/FileIcon.svelte.d.ts +0 -0
- /package/dist/components/{file → File}/FileInfo.svelte.d.ts +0 -0
- /package/dist/components/{file → File}/FileUploader.svelte +0 -0
- /package/dist/components/{file → File}/FileUploader.svelte.d.ts +0 -0
- /package/src/lib/components/{file → File}/FileUploader.svelte +0 -0
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import Fa from 'svelte-fa';
|
|
3
|
-
import { faFileAudio } from '@fortawesome/free-regular-svg-icons';
|
|
4
|
-
import { faFileVideo } from '@fortawesome/free-regular-svg-icons';
|
|
5
|
-
import { faFileWord } from '@fortawesome/free-regular-svg-icons';
|
|
6
|
-
import { faFilePdf } from '@fortawesome/free-regular-svg-icons';
|
|
7
|
-
import { faFileExcel } from '@fortawesome/free-regular-svg-icons';
|
|
8
|
-
import { faFileAlt } from '@fortawesome/free-regular-svg-icons';
|
|
9
|
-
import { faFileImage } from '@fortawesome/free-regular-svg-icons';
|
|
10
|
-
import { faFileArchive } from '@fortawesome/free-regular-svg-icons';
|
|
11
|
-
|
|
12
|
-
export let type = '';
|
|
13
|
-
</script>
|
|
14
|
-
|
|
15
|
-
{#if type.includes('excel') || type.includes('spreadsheetml')}
|
|
16
|
-
<Fa icon={faFileExcel} />
|
|
17
|
-
{/if}
|
|
18
|
-
|
|
19
|
-
{#if type.includes('text')}
|
|
20
|
-
<Fa icon={faFileAlt} />
|
|
21
|
-
{/if}
|
|
22
|
-
|
|
23
|
-
{#if type.includes('image')}
|
|
24
|
-
<Fa icon={faFileImage} />
|
|
25
|
-
{/if}
|
|
26
|
-
|
|
27
|
-
{#if type.includes('audio')}
|
|
28
|
-
<Fa icon={faFileAudio} />
|
|
29
|
-
{/if}
|
|
30
|
-
|
|
31
|
-
{#if type.includes('video')}
|
|
32
|
-
<Fa icon={faFileVideo} />
|
|
33
|
-
{/if}
|
|
34
|
-
|
|
35
|
-
{#if type.includes('word')}
|
|
36
|
-
<Fa icon={faFileWord} />
|
|
37
|
-
{/if}
|
|
38
|
-
|
|
39
|
-
{#if type.includes('pdf')}
|
|
40
|
-
<Fa icon={faFilePdf} />
|
|
41
|
-
{/if}
|
|
42
|
-
|
|
43
|
-
{#if type.includes('zip')}
|
|
44
|
-
<Fa icon={faFileArchive} />
|
|
45
|
-
{/if}
|
|
1
|
+
<script>
|
|
2
|
+
import Fa from 'svelte-fa';
|
|
3
|
+
import { faFileAudio } from '@fortawesome/free-regular-svg-icons';
|
|
4
|
+
import { faFileVideo } from '@fortawesome/free-regular-svg-icons';
|
|
5
|
+
import { faFileWord } from '@fortawesome/free-regular-svg-icons';
|
|
6
|
+
import { faFilePdf } from '@fortawesome/free-regular-svg-icons';
|
|
7
|
+
import { faFileExcel } from '@fortawesome/free-regular-svg-icons';
|
|
8
|
+
import { faFileAlt } from '@fortawesome/free-regular-svg-icons';
|
|
9
|
+
import { faFileImage } from '@fortawesome/free-regular-svg-icons';
|
|
10
|
+
import { faFileArchive } from '@fortawesome/free-regular-svg-icons';
|
|
11
|
+
|
|
12
|
+
export let type = '';
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
{#if type.includes('excel') || type.includes('spreadsheetml')}
|
|
16
|
+
<Fa icon={faFileExcel} />
|
|
17
|
+
{/if}
|
|
18
|
+
|
|
19
|
+
{#if type.includes('text')}
|
|
20
|
+
<Fa icon={faFileAlt} />
|
|
21
|
+
{/if}
|
|
22
|
+
|
|
23
|
+
{#if type.includes('image')}
|
|
24
|
+
<Fa icon={faFileImage} />
|
|
25
|
+
{/if}
|
|
26
|
+
|
|
27
|
+
{#if type.includes('audio')}
|
|
28
|
+
<Fa icon={faFileAudio} />
|
|
29
|
+
{/if}
|
|
30
|
+
|
|
31
|
+
{#if type.includes('video')}
|
|
32
|
+
<Fa icon={faFileVideo} />
|
|
33
|
+
{/if}
|
|
34
|
+
|
|
35
|
+
{#if type.includes('word')}
|
|
36
|
+
<Fa icon={faFileWord} />
|
|
37
|
+
{/if}
|
|
38
|
+
|
|
39
|
+
{#if type.includes('pdf')}
|
|
40
|
+
<Fa icon={faFilePdf} />
|
|
41
|
+
{/if}
|
|
42
|
+
|
|
43
|
+
{#if type.includes('zip')}
|
|
44
|
+
<Fa icon={faFileArchive} />
|
|
45
|
+
{/if}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import FileIcon from './FileIcon.svelte';
|
|
3
|
-
|
|
4
|
-
export let name = '';
|
|
5
|
-
export let type = '';
|
|
6
|
-
// export let description;
|
|
7
|
-
export let size = '';
|
|
8
|
-
</script>
|
|
9
|
-
|
|
10
|
-
<div style="font-size:{size}">
|
|
11
|
-
<FileIcon {type} />
|
|
12
|
-
{name}
|
|
13
|
-
</div>
|
|
1
|
+
<script>
|
|
2
|
+
import FileIcon from './FileIcon.svelte';
|
|
3
|
+
|
|
4
|
+
export let name = '';
|
|
5
|
+
export let type = '';
|
|
6
|
+
// export let description;
|
|
7
|
+
export let size = '';
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<div style="font-size:{size}">
|
|
11
|
+
<FileIcon {type} />
|
|
12
|
+
{name}
|
|
13
|
+
</div>
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
type x = {
|
|
3
|
-
name: string;
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
let result: x = { name: 'david' };
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<h1>MyList</h1>
|
|
10
|
-
{result.name}
|
|
11
|
-
<b>from bexis-lib</b>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
type x = {
|
|
3
|
+
name: string;
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
let result: x = { name: 'david' };
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<h1>MyList</h1>
|
|
10
|
+
{result.name}
|
|
11
|
+
<b>from bexis-lib</b>
|
|
@@ -47,8 +47,17 @@
|
|
|
47
47
|
expand: addExpandedRows()
|
|
48
48
|
});
|
|
49
49
|
|
|
50
|
-
const
|
|
51
|
-
|
|
50
|
+
const allCols: { [key: string]: any } = {};
|
|
51
|
+
|
|
52
|
+
$data.forEach((item) => {
|
|
53
|
+
Object.keys(item).forEach((key) => {
|
|
54
|
+
if (!allCols[key]) {
|
|
55
|
+
allCols[key] = {};
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const accessors: AccessorType[] = Object.keys(allCols) as AccessorType[];
|
|
52
61
|
|
|
53
62
|
const tableColumns = [
|
|
54
63
|
...accessors
|
|
@@ -123,6 +132,9 @@
|
|
|
123
132
|
return table.column({
|
|
124
133
|
header: key,
|
|
125
134
|
accessor: accessor,
|
|
135
|
+
cell: ({ value }) => {
|
|
136
|
+
return (value === undefined) ? "" : value;
|
|
137
|
+
},
|
|
126
138
|
plugins: {
|
|
127
139
|
sort: {
|
|
128
140
|
invert: true
|
|
@@ -249,7 +261,11 @@
|
|
|
249
261
|
<tr {...rowAttrs} id="{tableId}-row-{row.id}">
|
|
250
262
|
{#each row.cells as cell (cell?.id)}
|
|
251
263
|
<Subscribe attrs={cell.attrs()} let:attrs>
|
|
252
|
-
<td
|
|
264
|
+
<td
|
|
265
|
+
{...attrs}
|
|
266
|
+
class="!p-2 w-max focus:resize"
|
|
267
|
+
id="{tableId}-{cell.id}-{row.id}"
|
|
268
|
+
>
|
|
253
269
|
<div
|
|
254
270
|
class="flex items-center h-max overflow-x-auto resize-none hover:resize"
|
|
255
271
|
class:max-w-md={!fitToScreen}
|
|
@@ -105,12 +105,21 @@
|
|
|
105
105
|
placement: 'bottom-start'
|
|
106
106
|
};
|
|
107
107
|
|
|
108
|
-
let type: string =
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
108
|
+
let type: string = '';
|
|
109
|
+
let isDate = false;
|
|
110
|
+
|
|
111
|
+
$values.forEach((item) => {
|
|
112
|
+
if (item) {
|
|
113
|
+
type = typeof (toFilterableValueFn ? toFilterableValueFn(item) : item);
|
|
114
|
+
if (type === 'object') {
|
|
115
|
+
if (item instanceof Date) {
|
|
116
|
+
isDate = true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
112
119
|
}
|
|
113
|
-
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
type = isDate ? 'date' : type;
|
|
114
123
|
</script>
|
|
115
124
|
|
|
116
125
|
<form class="">
|
|
@@ -124,7 +133,7 @@
|
|
|
124
133
|
<Fa icon={faFilter} size="12" />
|
|
125
134
|
</button>
|
|
126
135
|
|
|
127
|
-
<div data-popup={`${popupId}`} id=
|
|
136
|
+
<div data-popup={`${popupId}`} id={popupId} class="z-50">
|
|
128
137
|
<div class="card p-3 grid gap-2 shadow-lg w-min bg-base-100">
|
|
129
138
|
<button
|
|
130
139
|
class="btn variant-filled-primary btn-sm"
|
|
@@ -1,141 +1,141 @@
|
|
|
1
|
-
import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
|
|
2
|
-
import type { TableFilterFn } from 'svelte-headless-table/lib/plugins/addTableFilter';
|
|
3
|
-
|
|
4
|
-
const textFilter = (filterOption, filterValue, value) => {
|
|
5
|
-
switch (filterOption) {
|
|
6
|
-
case 'isequal':
|
|
7
|
-
return value.toLowerCase() === filterValue.toLowerCase();
|
|
8
|
-
case 'isnotequal':
|
|
9
|
-
return value.toLowerCase() !== filterValue.toLowerCase();
|
|
10
|
-
case 'starts':
|
|
11
|
-
return value.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
12
|
-
case 'ends':
|
|
13
|
-
return value.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
14
|
-
case 'contains':
|
|
15
|
-
return value.toLowerCase().includes(filterValue.toLowerCase());
|
|
16
|
-
case 'notcontains':
|
|
17
|
-
return !value.toLowerCase().includes(filterValue.toLowerCase());
|
|
18
|
-
default:
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
const numberFilter = (filterOption, filterValue, value) => {
|
|
24
|
-
switch (filterOption) {
|
|
25
|
-
case 'isequal':
|
|
26
|
-
return value === filterValue;
|
|
27
|
-
case 'isnotequal':
|
|
28
|
-
return value !== filterValue;
|
|
29
|
-
case 'isgreater':
|
|
30
|
-
return value > filterValue;
|
|
31
|
-
case 'isless':
|
|
32
|
-
return value < filterValue;
|
|
33
|
-
case 'isgreaterorequal':
|
|
34
|
-
return value >= filterValue;
|
|
35
|
-
case 'islessorequal':
|
|
36
|
-
return value <= filterValue;
|
|
37
|
-
default:
|
|
38
|
-
return false;
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
const dateFilter = (filterOption, filterValue, value) => {
|
|
43
|
-
const filter = new Date(filterValue);
|
|
44
|
-
|
|
45
|
-
switch (filterOption) {
|
|
46
|
-
case 'ison':
|
|
47
|
-
return value === filter;
|
|
48
|
-
case 'isstartingfrom':
|
|
49
|
-
return value >= filter;
|
|
50
|
-
case 'isafter':
|
|
51
|
-
return value > filter;
|
|
52
|
-
case 'isuntil':
|
|
53
|
-
return value <= filter;
|
|
54
|
-
case 'isbefore':
|
|
55
|
-
return value < filter;
|
|
56
|
-
case 'isnoton':
|
|
57
|
-
return value !== filter;
|
|
58
|
-
default:
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
const numericFilter: ColumnFilterFn = ({ filterValue, value }) => {
|
|
64
|
-
const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
|
|
65
|
-
if (firstFilterValue == null && secondFilterValue == null) {
|
|
66
|
-
return true;
|
|
67
|
-
} else if (
|
|
68
|
-
(firstFilterOption == null || firstFilterValue == null) &&
|
|
69
|
-
secondFilterOption != null &&
|
|
70
|
-
secondFilterValue != null
|
|
71
|
-
) {
|
|
72
|
-
return numberFilter(secondFilterOption, secondFilterValue, value);
|
|
73
|
-
} else if (
|
|
74
|
-
(secondFilterOption == null || secondFilterValue == null) &&
|
|
75
|
-
firstFilterOption != null &&
|
|
76
|
-
firstFilterValue != null
|
|
77
|
-
) {
|
|
78
|
-
return numberFilter(firstFilterOption, firstFilterValue, value);
|
|
79
|
-
}
|
|
80
|
-
return (
|
|
81
|
-
numberFilter(firstFilterOption, firstFilterValue, value) &&
|
|
82
|
-
numberFilter(secondFilterOption, secondFilterValue, value)
|
|
83
|
-
);
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
const stringFilter: ColumnFilterFn = ({ filterValue, value }) => {
|
|
87
|
-
const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
|
|
88
|
-
if (!firstFilterValue?.length && !secondFilterValue?.length) {
|
|
89
|
-
return true;
|
|
90
|
-
} else if (
|
|
91
|
-
(!firstFilterOption || !firstFilterValue) &&
|
|
92
|
-
secondFilterOption &&
|
|
93
|
-
secondFilterValue?.length
|
|
94
|
-
) {
|
|
95
|
-
return textFilter(secondFilterOption, secondFilterValue, value);
|
|
96
|
-
} else if (
|
|
97
|
-
(!secondFilterOption || !secondFilterValue?.length) &&
|
|
98
|
-
firstFilterOption &&
|
|
99
|
-
firstFilterValue?.length
|
|
100
|
-
) {
|
|
101
|
-
return textFilter(firstFilterOption, firstFilterValue, value);
|
|
102
|
-
}
|
|
103
|
-
return (
|
|
104
|
-
textFilter(firstFilterOption, firstFilterValue, value) &&
|
|
105
|
-
textFilter(secondFilterOption, secondFilterValue, value)
|
|
106
|
-
);
|
|
107
|
-
};
|
|
108
|
-
|
|
109
|
-
const dateTypeFilter: ColumnFilterFn = ({ filterValue, value }) => {
|
|
110
|
-
const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
|
|
111
|
-
if (!firstFilterValue && !secondFilterValue) {
|
|
112
|
-
return true;
|
|
113
|
-
} else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
|
|
114
|
-
return dateFilter(secondFilterOption, secondFilterValue, value);
|
|
115
|
-
} else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
|
|
116
|
-
return dateFilter(firstFilterOption, firstFilterValue, value);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return (
|
|
120
|
-
dateFilter(firstFilterOption, firstFilterValue, value) &&
|
|
121
|
-
dateFilter(secondFilterOption, secondFilterValue, value)
|
|
122
|
-
);
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
export const columnFilter: ColumnFilterFn = ({ filterValue, value }) => {
|
|
126
|
-
if (typeof value === 'string') {
|
|
127
|
-
return stringFilter({ filterValue, value });
|
|
128
|
-
} else if (typeof value === 'number') {
|
|
129
|
-
return numericFilter({ filterValue, value });
|
|
130
|
-
} else if (typeof value === 'object' && value instanceof Date) {
|
|
131
|
-
return dateTypeFilter({ filterValue, value });
|
|
132
|
-
}
|
|
133
|
-
return false;
|
|
134
|
-
};
|
|
135
|
-
|
|
136
|
-
export const searchFilter: TableFilterFn = ({ filterValue, value }) => {
|
|
137
|
-
if (value.toLowerCase().includes(filterValue.toLowerCase())) {
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
return false;
|
|
141
|
-
};
|
|
1
|
+
import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
|
|
2
|
+
import type { TableFilterFn } from 'svelte-headless-table/lib/plugins/addTableFilter';
|
|
3
|
+
|
|
4
|
+
const textFilter = (filterOption, filterValue, value) => {
|
|
5
|
+
switch (filterOption) {
|
|
6
|
+
case 'isequal':
|
|
7
|
+
return value.toLowerCase() === filterValue.toLowerCase();
|
|
8
|
+
case 'isnotequal':
|
|
9
|
+
return value.toLowerCase() !== filterValue.toLowerCase();
|
|
10
|
+
case 'starts':
|
|
11
|
+
return value.toLowerCase().startsWith(filterValue.toLowerCase());
|
|
12
|
+
case 'ends':
|
|
13
|
+
return value.toLowerCase().endsWith(filterValue.toLowerCase());
|
|
14
|
+
case 'contains':
|
|
15
|
+
return value.toLowerCase().includes(filterValue.toLowerCase());
|
|
16
|
+
case 'notcontains':
|
|
17
|
+
return !value.toLowerCase().includes(filterValue.toLowerCase());
|
|
18
|
+
default:
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const numberFilter = (filterOption, filterValue, value) => {
|
|
24
|
+
switch (filterOption) {
|
|
25
|
+
case 'isequal':
|
|
26
|
+
return value === filterValue;
|
|
27
|
+
case 'isnotequal':
|
|
28
|
+
return value !== filterValue;
|
|
29
|
+
case 'isgreater':
|
|
30
|
+
return value > filterValue;
|
|
31
|
+
case 'isless':
|
|
32
|
+
return value < filterValue;
|
|
33
|
+
case 'isgreaterorequal':
|
|
34
|
+
return value >= filterValue;
|
|
35
|
+
case 'islessorequal':
|
|
36
|
+
return value <= filterValue;
|
|
37
|
+
default:
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const dateFilter = (filterOption, filterValue, value) => {
|
|
43
|
+
const filter = new Date(filterValue);
|
|
44
|
+
|
|
45
|
+
switch (filterOption) {
|
|
46
|
+
case 'ison':
|
|
47
|
+
return value === filter;
|
|
48
|
+
case 'isstartingfrom':
|
|
49
|
+
return value >= filter;
|
|
50
|
+
case 'isafter':
|
|
51
|
+
return value > filter;
|
|
52
|
+
case 'isuntil':
|
|
53
|
+
return value <= filter;
|
|
54
|
+
case 'isbefore':
|
|
55
|
+
return value < filter;
|
|
56
|
+
case 'isnoton':
|
|
57
|
+
return value !== filter;
|
|
58
|
+
default:
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
const numericFilter: ColumnFilterFn = ({ filterValue, value }) => {
|
|
64
|
+
const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
|
|
65
|
+
if (firstFilterValue == null && secondFilterValue == null) {
|
|
66
|
+
return true;
|
|
67
|
+
} else if (
|
|
68
|
+
(firstFilterOption == null || firstFilterValue == null) &&
|
|
69
|
+
secondFilterOption != null &&
|
|
70
|
+
secondFilterValue != null
|
|
71
|
+
) {
|
|
72
|
+
return numberFilter(secondFilterOption, secondFilterValue, value);
|
|
73
|
+
} else if (
|
|
74
|
+
(secondFilterOption == null || secondFilterValue == null) &&
|
|
75
|
+
firstFilterOption != null &&
|
|
76
|
+
firstFilterValue != null
|
|
77
|
+
) {
|
|
78
|
+
return numberFilter(firstFilterOption, firstFilterValue, value);
|
|
79
|
+
}
|
|
80
|
+
return (
|
|
81
|
+
numberFilter(firstFilterOption, firstFilterValue, value) &&
|
|
82
|
+
numberFilter(secondFilterOption, secondFilterValue, value)
|
|
83
|
+
);
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const stringFilter: ColumnFilterFn = ({ filterValue, value }) => {
|
|
87
|
+
const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
|
|
88
|
+
if (!firstFilterValue?.length && !secondFilterValue?.length) {
|
|
89
|
+
return true;
|
|
90
|
+
} else if (
|
|
91
|
+
(!firstFilterOption || !firstFilterValue) &&
|
|
92
|
+
secondFilterOption &&
|
|
93
|
+
secondFilterValue?.length
|
|
94
|
+
) {
|
|
95
|
+
return textFilter(secondFilterOption, secondFilterValue, value);
|
|
96
|
+
} else if (
|
|
97
|
+
(!secondFilterOption || !secondFilterValue?.length) &&
|
|
98
|
+
firstFilterOption &&
|
|
99
|
+
firstFilterValue?.length
|
|
100
|
+
) {
|
|
101
|
+
return textFilter(firstFilterOption, firstFilterValue, value);
|
|
102
|
+
}
|
|
103
|
+
return (
|
|
104
|
+
textFilter(firstFilterOption, firstFilterValue, value) &&
|
|
105
|
+
textFilter(secondFilterOption, secondFilterValue, value)
|
|
106
|
+
);
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const dateTypeFilter: ColumnFilterFn = ({ filterValue, value }) => {
|
|
110
|
+
const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
|
|
111
|
+
if (!firstFilterValue && !secondFilterValue) {
|
|
112
|
+
return true;
|
|
113
|
+
} else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
|
|
114
|
+
return dateFilter(secondFilterOption, secondFilterValue, value);
|
|
115
|
+
} else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
|
|
116
|
+
return dateFilter(firstFilterOption, firstFilterValue, value);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
dateFilter(firstFilterOption, firstFilterValue, value) &&
|
|
121
|
+
dateFilter(secondFilterOption, secondFilterValue, value)
|
|
122
|
+
);
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
export const columnFilter: ColumnFilterFn = ({ filterValue, value }) => {
|
|
126
|
+
if (typeof value === 'string') {
|
|
127
|
+
return stringFilter({ filterValue, value });
|
|
128
|
+
} else if (typeof value === 'number') {
|
|
129
|
+
return numericFilter({ filterValue, value });
|
|
130
|
+
} else if (typeof value === 'object' && value instanceof Date) {
|
|
131
|
+
return dateTypeFilter({ filterValue, value });
|
|
132
|
+
}
|
|
133
|
+
return false;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export const searchFilter: TableFilterFn = ({ filterValue, value }) => {
|
|
137
|
+
if (value.toLowerCase().includes(filterValue.toLowerCase())) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
141
|
+
};
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import InputContainer from './InputContainer.svelte';
|
|
3
|
-
|
|
4
|
-
export let id: string = '';
|
|
5
|
-
export let label: string = '';
|
|
6
|
-
export let checked: boolean = false;
|
|
7
|
-
|
|
8
|
-
export let valid: boolean;
|
|
9
|
-
export let invalid: boolean;
|
|
10
|
-
export let required: boolean;
|
|
11
|
-
export let feedback: [];
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<InputContainer {label} {feedback} {required}>
|
|
15
|
-
<input
|
|
16
|
-
{id}
|
|
17
|
-
class="input variant-form-material"
|
|
18
|
-
type="checkbox"
|
|
19
|
-
class:input-success={valid}
|
|
20
|
-
class:input-error={invalid}
|
|
21
|
-
bind:checked
|
|
22
|
-
on:input
|
|
23
|
-
/>
|
|
24
|
-
</InputContainer>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import InputContainer from './InputContainer.svelte';
|
|
3
|
+
|
|
4
|
+
export let id: string = '';
|
|
5
|
+
export let label: string = '';
|
|
6
|
+
export let checked: boolean = false;
|
|
7
|
+
|
|
8
|
+
export let valid: boolean;
|
|
9
|
+
export let invalid: boolean;
|
|
10
|
+
export let required: boolean;
|
|
11
|
+
export let feedback: [];
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<InputContainer {label} {feedback} {required}>
|
|
15
|
+
<input
|
|
16
|
+
{id}
|
|
17
|
+
class="input variant-form-material"
|
|
18
|
+
type="checkbox"
|
|
19
|
+
class:input-success={valid}
|
|
20
|
+
class:input-error={invalid}
|
|
21
|
+
bind:checked
|
|
22
|
+
on:input
|
|
23
|
+
/>
|
|
24
|
+
</InputContainer>
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import InputContainer from './InputContainer.svelte';
|
|
3
|
-
|
|
4
|
-
export let id;
|
|
5
|
-
export let source;
|
|
6
|
-
export let target;
|
|
7
|
-
export let title;
|
|
8
|
-
export let description = '';
|
|
9
|
-
export let key;
|
|
10
|
-
export let help = false;
|
|
11
|
-
|
|
12
|
-
let required = false;
|
|
13
|
-
let feedback: [];
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<InputContainer {id} label={title} {feedback} {required} {help}>
|
|
17
|
-
{#each source as item}
|
|
18
|
-
<label class="flex items-center space-x-2" for={key}>
|
|
19
|
-
<input
|
|
20
|
-
class="checkbox"
|
|
21
|
-
type="checkbox"
|
|
22
|
-
bind:group={target}
|
|
23
|
-
checked={item.key}
|
|
24
|
-
value={item.key}
|
|
25
|
-
/>
|
|
26
|
-
<p>{item.value}</p>
|
|
27
|
-
</label>
|
|
28
|
-
{/each}
|
|
29
|
-
</InputContainer>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import InputContainer from './InputContainer.svelte';
|
|
3
|
+
|
|
4
|
+
export let id;
|
|
5
|
+
export let source;
|
|
6
|
+
export let target;
|
|
7
|
+
export let title;
|
|
8
|
+
export let description = '';
|
|
9
|
+
export let key;
|
|
10
|
+
export let help = false;
|
|
11
|
+
|
|
12
|
+
let required = false;
|
|
13
|
+
let feedback: [];
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<InputContainer {id} label={title} {feedback} {required} {help}>
|
|
17
|
+
{#each source as item}
|
|
18
|
+
<label class="flex items-center space-x-2" for={key}>
|
|
19
|
+
<input
|
|
20
|
+
class="checkbox"
|
|
21
|
+
type="checkbox"
|
|
22
|
+
bind:group={target}
|
|
23
|
+
checked={item.key}
|
|
24
|
+
value={item.key}
|
|
25
|
+
/>
|
|
26
|
+
<p>{item.value}</p>
|
|
27
|
+
</label>
|
|
28
|
+
{/each}
|
|
29
|
+
</InputContainer>
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import InputContainer from './InputContainer.svelte';
|
|
3
|
-
|
|
4
|
-
export let source;
|
|
5
|
-
export let target;
|
|
6
|
-
export let title;
|
|
7
|
-
export let description = '';
|
|
8
|
-
export let key;
|
|
9
|
-
|
|
10
|
-
let required = false;
|
|
11
|
-
let feedback: [];
|
|
12
|
-
</script>
|
|
13
|
-
|
|
14
|
-
<InputContainer label={title} {feedback} {required}>
|
|
15
|
-
{#each source as item}
|
|
16
|
-
<label class="flex items-center space-x-2" for={key}>
|
|
17
|
-
<input class="checkbox" type="checkbox" bind:group={target} value={item} />
|
|
18
|
-
<p>{item}</p>
|
|
19
|
-
</label>
|
|
20
|
-
{/each}
|
|
21
|
-
</InputContainer>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import InputContainer from './InputContainer.svelte';
|
|
3
|
+
|
|
4
|
+
export let source;
|
|
5
|
+
export let target;
|
|
6
|
+
export let title;
|
|
7
|
+
export let description = '';
|
|
8
|
+
export let key;
|
|
9
|
+
|
|
10
|
+
let required = false;
|
|
11
|
+
let feedback: [];
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<InputContainer label={title} {feedback} {required}>
|
|
15
|
+
{#each source as item}
|
|
16
|
+
<label class="flex items-center space-x-2" for={key}>
|
|
17
|
+
<input class="checkbox" type="checkbox" bind:group={target} value={item} />
|
|
18
|
+
<p>{item}</p>
|
|
19
|
+
</label>
|
|
20
|
+
{/each}
|
|
21
|
+
</InputContainer>
|