@bexis2/bexis2-core-ui 0.0.22 → 0.0.25

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 (86) hide show
  1. package/README.md +14 -33
  2. package/dist/TableView.svelte +1 -1
  3. package/dist/components/ListView.svelte +5 -5
  4. package/dist/components/Table/Table.svelte +167 -0
  5. package/dist/components/Table/Table.svelte.d.ts +17 -0
  6. package/dist/components/Table/TableFilter.svelte +168 -0
  7. package/dist/components/Table/TableFilter.svelte.d.ts +21 -0
  8. package/dist/components/Table/TablePagination.svelte +60 -0
  9. package/dist/components/Table/TablePagination.svelte.d.ts +17 -0
  10. package/dist/components/Table/filter.d.ts +4 -0
  11. package/dist/components/Table/filter.js +83 -0
  12. package/dist/components/file/FileIcon.svelte +45 -0
  13. package/dist/components/file/FileInfo.svelte +13 -0
  14. package/dist/components/{File → file}/FileUploader.svelte +35 -38
  15. package/dist/components/form/Checkbox.svelte +21 -0
  16. package/dist/components/form/Checkbox.svelte.d.ts +24 -0
  17. package/dist/components/form/CheckboxKvPList.svelte +18 -0
  18. package/dist/components/form/CheckboxKvPList.svelte.d.ts +20 -0
  19. package/dist/components/form/CheckboxList.svelte +18 -0
  20. package/dist/components/form/CheckboxList.svelte.d.ts +20 -0
  21. package/dist/components/form/DateInput.svelte +21 -0
  22. package/dist/components/form/DateInput.svelte.d.ts +24 -0
  23. package/dist/components/form/DropdownKvP.svelte +44 -0
  24. package/dist/components/form/DropdownKvP.svelte.d.ts +43 -0
  25. package/dist/components/form/InputContainer.svelte +21 -0
  26. package/dist/components/form/InputContainer.svelte.d.ts +20 -0
  27. package/dist/components/form/MultiSelect.svelte +89 -0
  28. package/dist/components/form/MultiSelect.svelte.d.ts +41 -0
  29. package/dist/components/form/NumberInput.svelte +21 -0
  30. package/dist/components/form/NumberInput.svelte.d.ts +24 -0
  31. package/dist/components/form/TextArea.svelte +20 -0
  32. package/dist/components/form/TextArea.svelte.d.ts +24 -0
  33. package/dist/components/form/TextInput.svelte +21 -0
  34. package/dist/components/form/TextInput.svelte.d.ts +24 -0
  35. package/dist/components/spinner/Spinner.svelte +9 -0
  36. package/dist/css/core.ui.css +5 -2
  37. package/dist/css/themes/theme-bexis2.css +96 -98
  38. package/dist/css/themes/theme-crimson.css +3 -2
  39. package/dist/css/themes/theme-hamlindigo.css +3 -2
  40. package/dist/css/themes/theme-seafoam.css +3 -2
  41. package/dist/index.d.ts +16 -5
  42. package/dist/index.js +20 -5
  43. package/dist/models/Models.d.ts +28 -0
  44. package/dist/services/Api.js +12 -11
  45. package/dist/stores/apistore.js +13 -13
  46. package/package.json +101 -85
  47. package/src/lib/TableView.svelte +1 -1
  48. package/src/lib/components/ListView.svelte +11 -13
  49. package/src/lib/components/Table/Table.svelte +184 -0
  50. package/src/lib/components/Table/TableFilter.svelte +176 -0
  51. package/src/lib/components/Table/TablePagination.svelte +61 -0
  52. package/src/lib/components/Table/filter.ts +94 -0
  53. package/src/lib/components/file/FileIcon.svelte +45 -0
  54. package/src/lib/components/file/FileInfo.svelte +13 -0
  55. package/src/lib/components/file/FileUploader.svelte +184 -0
  56. package/src/lib/components/form/Checkbox.svelte +24 -0
  57. package/src/lib/components/form/CheckboxKvPList.svelte +21 -0
  58. package/src/lib/components/form/CheckboxList.svelte +21 -0
  59. package/src/lib/components/form/DateInput.svelte +24 -0
  60. package/src/lib/components/form/DropdownKvP.svelte +44 -0
  61. package/src/lib/components/form/InputContainer.svelte +22 -0
  62. package/src/lib/components/form/MultiSelect.svelte +89 -0
  63. package/src/lib/components/form/NumberInput.svelte +24 -0
  64. package/src/lib/components/form/TextArea.svelte +23 -0
  65. package/src/lib/components/form/TextInput.svelte +24 -0
  66. package/src/lib/components/spinner/Spinner.svelte +9 -0
  67. package/src/lib/css/core.ui.css +5 -2
  68. package/src/lib/css/themes/theme-bexis2.css +96 -98
  69. package/src/lib/css/themes/theme-crimson.css +3 -2
  70. package/src/lib/css/themes/theme-hamlindigo.css +3 -2
  71. package/src/lib/css/themes/theme-seafoam.css +3 -2
  72. package/src/lib/index.ts +40 -11
  73. package/src/lib/models/Models.ts +70 -39
  74. package/src/lib/services/Api.ts +55 -58
  75. package/src/lib/stores/apistore.ts +28 -32
  76. package/dist/components/File/FileIcon.svelte +0 -49
  77. package/dist/components/File/FileInfo.svelte +0 -14
  78. package/dist/components/Spinner/Spinner.svelte +0 -8
  79. package/src/lib/components/File/FileIcon.svelte +0 -49
  80. package/src/lib/components/File/FileInfo.svelte +0 -14
  81. package/src/lib/components/File/FileUploader.svelte +0 -217
  82. package/src/lib/components/Spinner/Spinner.svelte +0 -8
  83. /package/dist/components/{File → file}/FileIcon.svelte.d.ts +0 -0
  84. /package/dist/components/{File → file}/FileInfo.svelte.d.ts +0 -0
  85. /package/dist/components/{File → file}/FileUploader.svelte.d.ts +0 -0
  86. /package/dist/components/{Spinner → spinner}/Spinner.svelte.d.ts +0 -0
@@ -0,0 +1,184 @@
1
+ <script lang="ts">
2
+ import type { FileUploaderModel, FileInfo, Files } from '../../models/Models.js';
3
+
4
+ import DropZone from 'svelte-file-dropzone/Dropzone.svelte';
5
+ import Fa from 'svelte-fa/src/fa.svelte';
6
+
7
+ import Spinner from '../spinner/Spinner.svelte';
8
+ import { createEventDispatcher } from 'svelte';
9
+ import { faTrash } from '@fortawesome/free-solid-svg-icons';
10
+ import { faSave } from '@fortawesome/free-regular-svg-icons';
11
+ import { faFileUpload } from '@fortawesome/free-solid-svg-icons';
12
+
13
+ import { Api } from '../../services/Api.js';
14
+
15
+ export let id = 0;
16
+ export let version = 1;
17
+
18
+ import { onMount } from 'svelte';
19
+
20
+ // export let description="";
21
+ // export let status=0;
22
+
23
+ //action to load fileupload model
24
+ export let start = '';
25
+ //action to save selected file
26
+ export let submit = '';
27
+
28
+ export let context = '';
29
+
30
+ export let data: FileUploaderModel | undefined;
31
+
32
+ $: model = data;
33
+ $: submitBt = 'submit';
34
+
35
+ let maxSize = 0;
36
+
37
+ const dispatch = createEventDispatcher();
38
+
39
+ let fx: FileInfo[];
40
+
41
+ let files: Files = { accepted: [], rejected: [] };
42
+ $: files;
43
+
44
+ onMount(async () => {
45
+ console.log('fileupload - OnMount', data);
46
+
47
+ if (!data) {
48
+ load();
49
+ } else {
50
+ model = data;
51
+ }
52
+
53
+ if (model) {
54
+ submitBt += context;
55
+ maxSize = model.maxSize * 1024 * 1024;
56
+ }
57
+ });
58
+
59
+ // load modal from server
60
+ async function load() {
61
+ let url = start + '?id=' + id + '&version=' + version;
62
+
63
+ // load menu froms server
64
+ const res = await Api.get(url);
65
+ model = await res.data();
66
+
67
+ console.log('fileupload', model);
68
+ }
69
+
70
+ function handleFilesSelect(e: any) {
71
+ console.log('handleFilesSelect', e);
72
+ console.log('files', files);
73
+
74
+ const { acceptedFiles, fileRejections } = e.detail;
75
+
76
+ files.accepted = [...files.accepted, ...acceptedFiles];
77
+ files.rejected = [...files.rejected, ...fileRejections];
78
+
79
+ console.log('acceptedFiles', acceptedFiles);
80
+ console.log('files.accepted', files.accepted);
81
+
82
+ if (fileRejections.length > 0) {
83
+ //alert("the dropped file is not supported");
84
+ console.log('the dropped file is not supported.');
85
+ console.log(files.rejected);
86
+
87
+ let messages = [''];
88
+
89
+ for (let index = 0; index < fileRejections.length; index++) {
90
+ const element = fileRejections[index];
91
+ messages.push(getErrorMessage(element));
92
+ }
93
+
94
+ console.log(messages);
95
+
96
+ dispatch('error', { messages });
97
+ //list up the errors somewhere
98
+ files.rejected = [];
99
+ }
100
+
101
+ if (acceptedFiles.length > 0) {
102
+ document.getElementById(submitBt)?.click();
103
+ }
104
+ }
105
+
106
+ function getErrorMessage(rejected) {
107
+ let message = '';
108
+ message = rejected.file.path + ' : ';
109
+ let errors = rejected.errors;
110
+ for (let index = 0; index < errors.length; index++) {
111
+ const error = errors[index];
112
+ message += error.message;
113
+ }
114
+
115
+ return message;
116
+ }
117
+
118
+ async function handleSubmit() {
119
+ console.log('SUBMIT');
120
+
121
+ dispatch('submit');
122
+
123
+ let url = submit + '?id=' + id;
124
+
125
+ // console.log(model);
126
+ // console.log(url);
127
+ console.log('SUBMIT');
128
+
129
+ if (files.accepted.length > 0) {
130
+ console.log(files);
131
+
132
+ const formData = new FormData();
133
+ formData.append('files', '123');
134
+ // Looping over all files and add it to FormData object
135
+ for (var i = 0; i < files.accepted.length; i++) {
136
+ formData.append(files.accepted[i].name, files.accepted[i]);
137
+ }
138
+
139
+ const response = await Api.post(url, formData);
140
+
141
+ if (response.status == 200) {
142
+ dispatch('submited');
143
+
144
+ let message = files.accepted.length + ' is/are uploaded';
145
+ dispatch('success', { text: message });
146
+
147
+ files.accepted = [];
148
+ }
149
+ }
150
+ }
151
+ </script>
152
+
153
+ <form on:submit|preventDefault={handleSubmit}>
154
+ {#if model}
155
+ <!--if model exist -->
156
+ <div>
157
+ <DropZone
158
+ on:drop={handleFilesSelect}
159
+ accept={model.accept}
160
+ multiple={model.multiple}
161
+ {maxSize}
162
+ >
163
+ <b style="font-size:xx-large"><Fa icon={faFileUpload} /></b>
164
+ <span
165
+ ><b>Drag 'n' drop some files here, or click to select files</b>
166
+ <b>max file : {model.maxSize} mb</b></span
167
+ >
168
+ <p>
169
+ {#if model.accept}
170
+ {#each model.accept as ext}
171
+ {ext} ,
172
+ {/each}
173
+ {/if}
174
+ </p>
175
+ </DropZone>
176
+ </div>
177
+
178
+ <button id={submitBt} color="primary" style="display:none"><Fa icon={faSave} /></button>
179
+ {:else}
180
+ <!-- while data is not loaded show a loading information -->
181
+
182
+ <Spinner />
183
+ {/if}
184
+ </form>
@@ -0,0 +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: bool = 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>
@@ -0,0 +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} checked={item.key} />
18
+ <p>{item.value}</p>
19
+ </label>
20
+ {/each}
21
+ </InputContainer>
@@ -0,0 +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>
@@ -0,0 +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 value: string = '';
7
+
8
+ export let valid: boolean = false;
9
+ export let invalid: boolean = false;
10
+ export let required: boolean = false;
11
+ export let feedback: string[] = [''];
12
+ </script>
13
+
14
+ <InputContainer {label} {feedback} {required}>
15
+ <input
16
+ {id}
17
+ class="input variant-form-material"
18
+ type="date"
19
+ class:input-success={valid}
20
+ class:input-error={invalid}
21
+ bind:value
22
+ on:input
23
+ />
24
+ </InputContainer>
@@ -0,0 +1,44 @@
1
+ <script>
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 valid;
9
+ export let invalid;
10
+ export let feedback;
11
+ export let required;
12
+
13
+ $: selected = null;
14
+
15
+ $: updatedSelectedValue(target);
16
+ $: updatedTarget(selected);
17
+
18
+ function updatedSelectedValue(selection) {
19
+ if (selection != null) {
20
+ selected = selection.id;
21
+ }
22
+ }
23
+
24
+ function updatedTarget(id) {
25
+ target = source.find((opt) => opt.id === id);
26
+ }
27
+ </script>
28
+
29
+ <InputContainer label={title} {feedback} {required}>
30
+ <select
31
+ {id}
32
+ class="select variant-form-material"
33
+ class:input-success={valid}
34
+ class:input-error={invalid}
35
+ bind:value={selected}
36
+ on:change
37
+ on:select
38
+ >
39
+ <option value={null}>-- Please select --</option>
40
+ {#each source as e}
41
+ <option value={e.id}>{e.text}</option>
42
+ {/each}
43
+ </select>
44
+ </InputContainer>
@@ -0,0 +1,22 @@
1
+ <script lang="ts">
2
+ export let label: string = '';
3
+ export let required: boolean;
4
+ export let feedback: string[];
5
+ </script>
6
+
7
+ <label class="label">
8
+ <span
9
+ >{label}
10
+ {#if required} <span class="text-sm text-red-600">*</span> {/if}
11
+ </span>
12
+ <slot />
13
+ {#if feedback}
14
+ <span class="text-sm text-error-600">
15
+ <ul>
16
+ {#each feedback as message}
17
+ <li>{message}</li>
18
+ {/each}
19
+ </ul>
20
+ </span>
21
+ {/if}
22
+ </label>
@@ -0,0 +1,89 @@
1
+ <script>
2
+ import InputContainer from './InputContainer.svelte';
3
+
4
+ import Select from 'svelte-select';
5
+ import { onMount } from 'svelte';
6
+
7
+ export let source;
8
+ export let target;
9
+ export let title;
10
+ export let itemId = 'value';
11
+ export let label = 'label';
12
+ export let isMulti = true;
13
+ export let isComplex = false;
14
+ export let isTargetComplex = false;
15
+ export let required = false;
16
+ export let feedback = [];
17
+
18
+ let isLoaded = false;
19
+
20
+ $: value = null;
21
+ $: updateTarget(value);
22
+
23
+ function updateTarget(selection) {
24
+ //diffrent cases
25
+ //onsole.log("------");
26
+
27
+ //a) source is complex model is simple
28
+ if (isComplex && !isTargetComplex && isLoaded) {
29
+ target = [];
30
+ for (let i in selection) {
31
+ let item = selection[i];
32
+ target.push(item.key);
33
+ }
34
+ }
35
+
36
+ if (!isComplex && !isTargetComplex && isLoaded) {
37
+ target = [];
38
+ for (let i in selection) {
39
+ target.push(selection[i].value);
40
+ }
41
+ }
42
+ //console.log("selection "+title,selection);
43
+ //console.log("target "+title,target);
44
+ }
45
+
46
+ onMount(async () => {
47
+ //console.log("on mount multiselect");
48
+ //console.log(source);
49
+
50
+ //a) source is complex model is simple
51
+ if (isComplex && !isTargetComplex) {
52
+ let items = [];
53
+ // event.detail will be null unless isMulti is true and user has removed a single item
54
+ for (let i in target) {
55
+ let t = target[i];
56
+ items.push(source.find((item) => item.key === t));
57
+ }
58
+
59
+ isLoaded = true;
60
+ if (items.length > 0) {
61
+ value = items;
62
+ }
63
+ //console.log(value);
64
+ }
65
+
66
+ //b) simple liust and simple model
67
+ if (!isComplex && !isTargetComplex) {
68
+ //console.log("source", source);
69
+ //console.log("target",target);
70
+ isLoaded = true;
71
+ //set target only if its nit empty
72
+ if (target != null && target !== undefined && target != '') {
73
+ value = target;
74
+ }
75
+ }
76
+ });
77
+ </script>
78
+
79
+ <InputContainer label={title} {feedback} {required}>
80
+ <Select
81
+ class="select variant-form-material"
82
+ items={source}
83
+ {itemId}
84
+ {label}
85
+ multiple={isMulti}
86
+ bind:value
87
+ placeholder="-- Please select --"
88
+ />
89
+ </InputContainer>
@@ -0,0 +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 value: string = '';
7
+
8
+ export let valid: boolean = false;
9
+ export let invalid: boolean = false;
10
+ export let required: boolean = false;
11
+ export let feedback: string[] = [''];
12
+ </script>
13
+
14
+ <InputContainer {label} {feedback} {required}>
15
+ <input
16
+ {id}
17
+ class="input variant-form-material"
18
+ type="number"
19
+ class:input-success={valid}
20
+ class:input-error={invalid}
21
+ bind:value
22
+ on:input
23
+ />
24
+ </InputContainer>
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ import InputContainer from './InputContainer.svelte';
3
+
4
+ export let id: string = '';
5
+ export let label: string = '';
6
+ export let value: string = '';
7
+
8
+ export let valid: boolean = false;
9
+ export let invalid: boolean = false;
10
+ export let required: boolean = false;
11
+ export let feedback: string[] = [''];
12
+ </script>
13
+
14
+ <InputContainer {label} {feedback} {required}>
15
+ <textarea
16
+ {id}
17
+ class="textarea variant-form-material"
18
+ class:input-success={valid}
19
+ class:input-error={invalid}
20
+ bind:value
21
+ on:input
22
+ />
23
+ </InputContainer>
@@ -0,0 +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 value: string = '';
7
+
8
+ export let valid: boolean = false;
9
+ export let invalid: boolean = false;
10
+ export let required: boolean = false;
11
+ export let feedback: string[] = [''];
12
+ </script>
13
+
14
+ <InputContainer {label} {feedback} {required}>
15
+ <input
16
+ {id}
17
+ class="input variant-form-material"
18
+ type="text"
19
+ class:input-success={valid}
20
+ class:input-error={invalid}
21
+ bind:value
22
+ on:input
23
+ />
24
+ </InputContainer>
@@ -0,0 +1,9 @@
1
+ <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"
3
+ role="status"
4
+ >
5
+ <span
6
+ class="!absolute !-m-px !h-px !w-px !overflow-hidden !whitespace-nowrap !border-0 !p-0 ![clip:rect(0,0,0,0)]"
7
+ >Loading...</span
8
+ >
9
+ </div>
@@ -1,2 +1,5 @@
1
- /*place global styles here */
2
- html, body { @apply h-full; }
1
+ /*place global styles here */
2
+ html,
3
+ body {
4
+ @apply h-full;
5
+ }