@bexis2/bexis2-core-ui 0.0.30 → 0.0.31
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 +26 -0
- package/dist/components/Table/Table.svelte +132 -94
- package/dist/components/Table/Table.svelte.d.ts +2 -0
- package/dist/components/Table/TableFilter.svelte +50 -5
- package/dist/components/Table/TablePagination.svelte +1 -1
- package/dist/components/Table/filter.js +43 -3
- package/dist/components/page/Alert.svelte +39 -0
- package/dist/components/page/Alert.svelte.d.ts +22 -0
- package/dist/components/spinner/Spinner.svelte +11 -1
- package/dist/components/spinner/Spinner.svelte.d.ts +9 -13
- package/dist/css/themes/theme-bexis2.css +3 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/models/Enums.d.ts +5 -0
- package/dist/models/Enums.js +6 -0
- package/dist/models/Models.d.ts +8 -0
- package/package.json +1 -1
- package/src/lib/components/Table/Table.svelte +230 -184
- package/src/lib/components/Table/TableFilter.svelte +50 -5
- package/src/lib/components/Table/TablePagination.svelte +1 -1
- package/src/lib/components/Table/filter.ts +141 -94
- package/src/lib/components/page/Alert.svelte +46 -0
- package/src/lib/components/spinner/Spinner.svelte +14 -1
- package/src/lib/css/themes/theme-bexis2.css +3 -3
- package/src/lib/index.ts +2 -1
- package/src/lib/models/Enums.ts +6 -0
- package/src/lib/models/Models.ts +88 -78
|
@@ -1,94 +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
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
) {
|
|
66
|
-
return
|
|
67
|
-
} else if (
|
|
68
|
-
(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
) {
|
|
72
|
-
return
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
|
|
3
|
+
import Fa from 'svelte-fa';
|
|
4
|
+
|
|
5
|
+
import { faXmark } from '@fortawesome/free-solid-svg-icons';
|
|
6
|
+
|
|
7
|
+
import {fade} from 'svelte/transition'
|
|
8
|
+
|
|
9
|
+
export let title:string = "";
|
|
10
|
+
export let message:string = "";
|
|
11
|
+
export let cssClass:string= "";
|
|
12
|
+
export let deleteBtn:boolean = true;
|
|
13
|
+
|
|
14
|
+
$:show = true;
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
</script>
|
|
18
|
+
{#if show}
|
|
19
|
+
|
|
20
|
+
<aside class="alert {cssClass}" transition:fade|local={{ duration: 100 }}>
|
|
21
|
+
<!-- Icon -->
|
|
22
|
+
<!-- <div>(icon)</div> -->
|
|
23
|
+
<!-- Message -->
|
|
24
|
+
<div class="alert-message">
|
|
25
|
+
|
|
26
|
+
{#if title}
|
|
27
|
+
<h3 class="h3">{title}</h3>
|
|
28
|
+
{/if}
|
|
29
|
+
<p>{message}
|
|
30
|
+
<slot></slot>
|
|
31
|
+
</p>
|
|
32
|
+
</div>
|
|
33
|
+
<!-- Actions -->
|
|
34
|
+
<div class="alert-actions">
|
|
35
|
+
<slot name="actions"/>
|
|
36
|
+
|
|
37
|
+
{#if deleteBtn}
|
|
38
|
+
<button class="btn hover:text-primary-100" on:click={()=>show = false}>
|
|
39
|
+
<Fa icon={faXmark} />
|
|
40
|
+
</button>
|
|
41
|
+
{/if}
|
|
42
|
+
|
|
43
|
+
</div>
|
|
44
|
+
</aside>
|
|
45
|
+
|
|
46
|
+
{/if}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Position } from "$lib/models/Enums";
|
|
3
|
+
|
|
4
|
+
export let textCss = "text-secundary-500"
|
|
5
|
+
export let label = "";
|
|
6
|
+
export let position:Position = Position.start
|
|
7
|
+
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
<div class="flex justify-{position} items-{position} h-full w-full gap-5 pt-2">
|
|
1
11
|
<div
|
|
2
|
-
class="inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite]
|
|
12
|
+
class="inline-block h-8 w-8 animate-spin rounded-full border-4 border-solid border-current border-r-transparent align-[-0.125em] motion-reduce:animate-[spin_1.5s_linear_infinite] {textCss}"
|
|
3
13
|
role="status"
|
|
4
14
|
>
|
|
5
15
|
<span
|
|
@@ -7,3 +17,6 @@
|
|
|
7
17
|
>Loading...</span
|
|
8
18
|
>
|
|
9
19
|
</div>
|
|
20
|
+
<span>{label}</span>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
@@ -8,10 +8,10 @@
|
|
|
8
8
|
--theme-rounded-container: 4px;
|
|
9
9
|
--theme-border-base: 1px;
|
|
10
10
|
/* =~= Theme On-X Colors =~= */
|
|
11
|
-
--on-primary:
|
|
12
|
-
--on-secondary:
|
|
11
|
+
--on-primary: 255 255 255;
|
|
12
|
+
--on-secondary: 255 255 255;
|
|
13
13
|
--on-tertiary: 0 0 0;
|
|
14
|
-
--on-success:
|
|
14
|
+
--on-success: 255 255 255;
|
|
15
15
|
--on-warning: 255 255 255;
|
|
16
16
|
--on-error: 255 255 255;
|
|
17
17
|
--on-surface: 0 0 0;
|
package/src/lib/index.ts
CHANGED
|
@@ -9,6 +9,7 @@ import FileUploader from './components/file/FileUploader.svelte';
|
|
|
9
9
|
//page
|
|
10
10
|
import Spinner from './components/spinner/Spinner.svelte';
|
|
11
11
|
import Page from './components/page/Page.svelte';
|
|
12
|
+
import Alert from './components/page/Alert.svelte';
|
|
12
13
|
|
|
13
14
|
// input
|
|
14
15
|
import Checkbox from './components/form/Checkbox.svelte';
|
|
@@ -43,7 +44,7 @@ export {
|
|
|
43
44
|
export { FileInfo, FileIcon, FileUploader };
|
|
44
45
|
|
|
45
46
|
//others
|
|
46
|
-
export { ListView, TableView, Spinner, Page };
|
|
47
|
+
export { ListView, TableView, Spinner, Page, Alert };
|
|
47
48
|
|
|
48
49
|
//Api
|
|
49
50
|
export { Api } from './services/Api.js';
|
package/src/lib/models/Models.ts
CHANGED
|
@@ -1,78 +1,88 @@
|
|
|
1
|
-
import type { SvelteComponent } from 'svelte';
|
|
2
|
-
import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
|
|
3
|
-
import type { Writable } from 'svelte/store';
|
|
4
|
-
|
|
5
|
-
// page
|
|
6
|
-
export interface Link
|
|
7
|
-
{
|
|
8
|
-
label:string,
|
|
9
|
-
url:string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
export interface
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
export interface
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
1
|
+
import type { SvelteComponent } from 'svelte';
|
|
2
|
+
import type { ColumnFilterFn } from 'svelte-headless-table/lib/plugins';
|
|
3
|
+
import type { Writable } from 'svelte/store';
|
|
4
|
+
|
|
5
|
+
// page
|
|
6
|
+
export interface Link
|
|
7
|
+
{
|
|
8
|
+
label:string,
|
|
9
|
+
url:string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
// Form
|
|
14
|
+
export interface Input {
|
|
15
|
+
id: string;
|
|
16
|
+
label: string;
|
|
17
|
+
feedback: string[];
|
|
18
|
+
invalid: boolean;
|
|
19
|
+
valid: boolean;
|
|
20
|
+
required: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface FileInfo {
|
|
24
|
+
name: string;
|
|
25
|
+
type: string;
|
|
26
|
+
length: number;
|
|
27
|
+
description: string;
|
|
28
|
+
validationHash: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface FileUploaderModel {
|
|
32
|
+
accept: string[];
|
|
33
|
+
existingFiles: FileInfo[];
|
|
34
|
+
descriptionType: number;
|
|
35
|
+
multiple: boolean;
|
|
36
|
+
maxSize: number;
|
|
37
|
+
lastModification: Date;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface Files {
|
|
41
|
+
accepted: Blob[];
|
|
42
|
+
rejected: Blob[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type user = {
|
|
46
|
+
name: string;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export interface FileObj {
|
|
50
|
+
path: string;
|
|
51
|
+
lastModified: number;
|
|
52
|
+
lastModifiedDate: Date;
|
|
53
|
+
name: string;
|
|
54
|
+
size: number;
|
|
55
|
+
type: string;
|
|
56
|
+
webkitRelativePath: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface ColumnInstructions {
|
|
60
|
+
toStringFn?: (value: any) => string;
|
|
61
|
+
toSortableValueFn?: (value: any) => string | number;
|
|
62
|
+
toFilterableValueFn?: (value: any) => string | number | Date;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Table column type
|
|
66
|
+
export interface Column {
|
|
67
|
+
header?: string;
|
|
68
|
+
exclude?: boolean; // false by default
|
|
69
|
+
instructions?: ColumnInstructions;
|
|
70
|
+
disableFiltering?: boolean; // false by default
|
|
71
|
+
disableSorting?: boolean; // false by default
|
|
72
|
+
colFilterFn?: ColumnFilterFn;
|
|
73
|
+
colFilterComponent?: typeof SvelteComponent;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface Columns {
|
|
77
|
+
[key: string]: Column;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Table config type
|
|
81
|
+
export interface TableConfig<T> {
|
|
82
|
+
id: string;
|
|
83
|
+
data: Writable<T[]>;
|
|
84
|
+
columns?: Columns;
|
|
85
|
+
pageSizes?: number[];
|
|
86
|
+
defaultPageSize?: number;
|
|
87
|
+
optionsComponent?: typeof SvelteComponent;
|
|
88
|
+
}
|