@bexis2/bexis2-core-ui 0.0.30 → 0.1.0

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 (39) hide show
  1. package/README.md +41 -0
  2. package/dist/components/Table/Table.svelte +132 -94
  3. package/dist/components/Table/Table.svelte.d.ts +2 -0
  4. package/dist/components/Table/TableFilter.svelte +50 -5
  5. package/dist/components/Table/TablePagination.svelte +1 -1
  6. package/dist/components/Table/filter.js +43 -3
  7. package/dist/components/form/DropdownKvP.svelte +17 -2
  8. package/dist/components/form/DropdownKvP.svelte.d.ts +2 -0
  9. package/dist/components/form/NumberInput.svelte +2 -0
  10. package/dist/components/form/NumberInput.svelte.d.ts +1 -0
  11. package/dist/components/form/TextArea.svelte +2 -0
  12. package/dist/components/form/TextArea.svelte.d.ts +1 -0
  13. package/dist/components/form/TextInput.svelte +2 -0
  14. package/dist/components/form/TextInput.svelte.d.ts +1 -0
  15. package/dist/components/page/Alert.svelte +39 -0
  16. package/dist/components/page/Alert.svelte.d.ts +22 -0
  17. package/dist/components/spinner/Spinner.svelte +11 -1
  18. package/dist/components/spinner/Spinner.svelte.d.ts +9 -13
  19. package/dist/css/themes/theme-bexis2.css +3 -3
  20. package/dist/index.d.ts +4 -2
  21. package/dist/index.js +4 -1
  22. package/dist/models/Enums.d.ts +5 -0
  23. package/dist/models/Enums.js +6 -0
  24. package/dist/models/Models.d.ts +18 -0
  25. package/package.json +1 -1
  26. package/src/lib/components/Table/Table.svelte +230 -184
  27. package/src/lib/components/Table/TableFilter.svelte +50 -5
  28. package/src/lib/components/Table/TablePagination.svelte +1 -1
  29. package/src/lib/components/Table/filter.ts +141 -94
  30. package/src/lib/components/form/DropdownKvP.svelte +17 -2
  31. package/src/lib/components/form/NumberInput.svelte +2 -0
  32. package/src/lib/components/form/TextArea.svelte +2 -0
  33. package/src/lib/components/form/TextInput.svelte +3 -0
  34. package/src/lib/components/page/Alert.svelte +46 -0
  35. package/src/lib/components/spinner/Spinner.svelte +14 -1
  36. package/src/lib/css/themes/theme-bexis2.css +3 -3
  37. package/src/lib/index.ts +9 -3
  38. package/src/lib/models/Enums.ts +6 -0
  39. package/src/lib/models/Models.ts +102 -78
@@ -67,6 +67,32 @@
67
67
  value: 'ends',
68
68
  label: 'Ends with'
69
69
  }
70
+ ],
71
+ date: [
72
+ {
73
+ value: 'ison',
74
+ label: 'Is on'
75
+ },
76
+ {
77
+ value: 'isstartingfrom',
78
+ label: 'Is starting from'
79
+ },
80
+ {
81
+ value: 'isafter',
82
+ label: 'Is after'
83
+ },
84
+ {
85
+ value: 'isuntil',
86
+ label: 'Is until'
87
+ },
88
+ {
89
+ value: 'isbefore',
90
+ label: 'Is before'
91
+ },
92
+ {
93
+ value: 'isnoton',
94
+ label: 'Is not on'
95
+ }
70
96
  ]
71
97
  };
72
98
 
@@ -78,7 +104,12 @@
78
104
  placement: 'bottom-start'
79
105
  };
80
106
 
81
- const type = typeof $values[0];
107
+ let type: string = typeof $values[0];
108
+ if (type === 'object') {
109
+ if ($values[0] instanceof Date) {
110
+ type = 'date';
111
+ }
112
+ }
82
113
  </script>
83
114
 
84
115
  <form class="">
@@ -95,7 +126,7 @@
95
126
  <div class="card p-3 absolute grid gap-2 shadow-lg z-10 w-min">
96
127
  <button
97
128
  class="btn variant-filled-primary btn-sm"
98
- type="submit"
129
+ type="button"
99
130
  on:click|preventDefault={() => {
100
131
  firstOption = 'isequal';
101
132
  firstValue = undefined;
@@ -126,13 +157,20 @@
126
157
  bind:value={firstValue}
127
158
  on:click|stopPropagation
128
159
  />
129
- {:else}
160
+ {:else if type === 'string'}
130
161
  <input
131
162
  type="text"
132
163
  class="input p-1 border border-primary-500"
133
164
  bind:value={firstValue}
134
165
  on:click|stopPropagation
135
166
  />
167
+ {:else}
168
+ <input
169
+ type="date"
170
+ class="input p-1 border border-primary-500"
171
+ bind:value={firstValue}
172
+ on:click|stopPropagation
173
+ />
136
174
  {/if}
137
175
  </div>
138
176
  <label for="" class="label normal-case">And</label>
@@ -154,18 +192,25 @@
154
192
  bind:value={secondValue}
155
193
  on:click|stopPropagation
156
194
  />
157
- {:else}
195
+ {:else if type === 'string'}
158
196
  <input
159
197
  type="text"
160
198
  class="input p-1 border border-primary-500"
161
199
  bind:value={secondValue}
162
200
  on:click|stopPropagation
163
201
  />
202
+ {:else}
203
+ <input
204
+ type="date"
205
+ class="input p-1 border border-primary-500"
206
+ bind:value={secondValue}
207
+ on:click|stopPropagation
208
+ />
164
209
  {/if}
165
210
  </div>
166
211
  <button
167
212
  class="btn variant-filled-primary btn-sm"
168
- type="submit"
213
+ type="button"
169
214
  on:click|preventDefault={() => {
170
215
  active = firstValue?.toString().length > 0 || secondValue?.toString().length > 0;
171
216
  $filterValue = [firstOption, firstValue, secondOption, secondValue];
@@ -40,7 +40,7 @@
40
40
  <select
41
41
  name="pageSize"
42
42
  id="pageSize"
43
- class="select btn btn-sm variant-filled-primary w-min font-bold"
43
+ class="select variant-filled-primary w-min font-bold"
44
44
  bind:value={$pageSize}
45
45
  >
46
46
  {#each pageSizes as size}
@@ -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 numericFilter: ColumnFilterFn = ({ filterValue, value }) => {
43
- const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
44
- if (!firstFilterValue && !secondFilterValue) {
45
- return true;
46
- } else if ((!firstFilterOption || !firstFilterValue) && secondFilterOption && secondFilterValue) {
47
- return numberFilter(secondFilterOption, secondFilterValue, value);
48
- } else if ((!secondFilterOption || !secondFilterValue) && firstFilterOption && firstFilterValue) {
49
- return numberFilter(firstFilterOption, firstFilterValue, value);
50
- }
51
- return (
52
- numberFilter(firstFilterOption, firstFilterValue, value) &&
53
- numberFilter(secondFilterOption, secondFilterValue, value)
54
- );
55
- };
56
-
57
- const stringFilter: ColumnFilterFn = ({ filterValue, value }) => {
58
- const [firstFilterOption, firstFilterValue, secondFilterOption, secondFilterValue] = filterValue;
59
- if (!firstFilterValue?.length && !secondFilterValue?.length) {
60
- return true;
61
- } else if (
62
- (!firstFilterOption || !firstFilterValue) &&
63
- secondFilterOption &&
64
- secondFilterValue?.length
65
- ) {
66
- return textFilter(secondFilterOption, secondFilterValue, value);
67
- } else if (
68
- (!secondFilterOption || !secondFilterValue?.length) &&
69
- firstFilterOption &&
70
- firstFilterValue?.length
71
- ) {
72
- return textFilter(firstFilterOption, firstFilterValue, value);
73
- }
74
- return (
75
- textFilter(firstFilterOption, firstFilterValue, value) &&
76
- textFilter(secondFilterOption, secondFilterValue, value)
77
- );
78
- };
79
-
80
- export const columnFilter: ColumnFilterFn = ({ filterValue, value }) => {
81
- if (typeof value === 'string') {
82
- return stringFilter({ filterValue, value });
83
- } else if (typeof value === 'number') {
84
- return numericFilter({ filterValue, value });
85
- }
86
- return false;
87
- };
88
-
89
- export const searchFilter: TableFilterFn = ({ filterValue, value }) => {
90
- if (value.toLowerCase().includes(filterValue.toLowerCase())) {
91
- return true;
92
- }
93
- return false;
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
+ };
@@ -9,6 +9,7 @@
9
9
  export let invalid = false;
10
10
  export let feedback = [''];
11
11
  export let required = false;
12
+ export let targetIsComplex = false;
12
13
 
13
14
  $: selected = null;
14
15
 
@@ -17,12 +18,26 @@
17
18
 
18
19
  function updatedSelectedValue(selection) {
19
20
  if (selection != null) {
20
- selected = selection.id;
21
+ if(targetIsComplex)
22
+ {
23
+ selected = selection.id;
24
+ }
25
+ else
26
+ {
27
+ selected = selection
28
+ }
21
29
  }
22
30
  }
23
31
 
24
32
  function updatedTarget(id) {
25
- target = source.find((opt) => opt.id === id);
33
+ if(targetIsComplex)
34
+ {
35
+ target = source.find((opt) => opt.id === id);
36
+ }
37
+ else
38
+ {
39
+ target = id;
40
+ }
26
41
  }
27
42
  </script>
28
43
 
@@ -9,6 +9,7 @@
9
9
  export let invalid: boolean = false;
10
10
  export let required: boolean = false;
11
11
  export let feedback: string[] = [''];
12
+ export let placeholder: string = "";
12
13
  </script>
13
14
 
14
15
  <InputContainer {label} {feedback} {required}>
@@ -20,5 +21,6 @@
20
21
  class:input-error={invalid}
21
22
  bind:value
22
23
  on:input
24
+ {placeholder}
23
25
  />
24
26
  </InputContainer>
@@ -9,6 +9,7 @@
9
9
  export let invalid: boolean = false;
10
10
  export let required: boolean = false;
11
11
  export let feedback: string[] = [''];
12
+ export let placeholder: string = "";
12
13
  </script>
13
14
 
14
15
  <InputContainer {label} {feedback} {required}>
@@ -19,5 +20,6 @@
19
20
  class:input-error={invalid}
20
21
  bind:value
21
22
  on:input
23
+ {placeholder}
22
24
  />
23
25
  </InputContainer>
@@ -9,6 +9,8 @@
9
9
  export let invalid: boolean = false;
10
10
  export let required: boolean = false;
11
11
  export let feedback: string[] = [''];
12
+ export let placeholder: string ="";
13
+
12
14
  </script>
13
15
 
14
16
  <InputContainer {label} {feedback} {required}>
@@ -20,5 +22,6 @@
20
22
  class:input-error={invalid}
21
23
  bind:value
22
24
  on:input
25
+ {placeholder}
23
26
  />
24
27
  </InputContainer>
@@ -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] text-secundary-500"
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: 0 0 0;
12
- --on-secondary: 0 0 0;
11
+ --on-primary: 255 255 255;
12
+ --on-secondary: 255 255 255;
13
13
  --on-tertiary: 0 0 0;
14
- --on-success: 0 0 0;
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';
@@ -54,8 +55,13 @@ export type {
54
55
  user,
55
56
  Input,
56
57
  FileUploaderModel,
57
- Link
58
- } from './models/Models.js';
58
+ Link,
59
+ ListItem,
60
+ KvP
61
+ } from './models/Models.js';
62
+
63
+ //enum
64
+ export { Position } from './models/Enums';
59
65
 
60
66
  // Table
61
67
  export { Table, TableFilter, columnFilter, searchFilter };
@@ -0,0 +1,6 @@
1
+
2
+ export enum Position {
3
+ start = "start",
4
+ end = "end",
5
+ center = "center"
6
+ }