@bexis2/bexis2-core-ui 0.2.29 → 0.2.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.
Files changed (97) hide show
  1. package/README.md +18 -2
  2. package/dist/TableView.svelte +1 -1
  3. package/dist/components/CodeEditor/CodeEditor.svelte +32 -8
  4. package/dist/components/CodeEditor/CodeEditor.svelte.d.ts +1 -0
  5. package/dist/components/{file → File}/FileIcon.svelte +45 -45
  6. package/{src/lib/components/file → dist/components/File}/FileInfo.svelte +13 -13
  7. package/dist/components/ListView.svelte +5 -5
  8. package/dist/components/Table/Table.svelte +17 -2
  9. package/dist/components/Table/TableFilter.svelte +13 -6
  10. package/dist/components/form/Checkbox.svelte +13 -13
  11. package/dist/components/form/CheckboxKvPList.svelte +16 -16
  12. package/dist/components/form/CheckboxList.svelte +10 -10
  13. package/dist/components/form/DateInput.svelte +14 -14
  14. package/dist/components/form/DropdownKvP.svelte +54 -54
  15. package/dist/components/form/MultiSelect.svelte +181 -181
  16. package/dist/components/form/NumberInput.svelte +15 -15
  17. package/dist/components/form/TextArea.svelte +14 -14
  18. package/dist/components/form/TextInput.svelte +15 -15
  19. package/dist/components/page/Alert.svelte +28 -28
  20. package/dist/components/page/BackToTop.svelte +30 -30
  21. package/dist/components/page/Docs.svelte +22 -22
  22. package/dist/components/page/ErrorMessage.svelte +8 -8
  23. package/dist/components/page/Footer.svelte +5 -5
  24. package/dist/components/page/Header.svelte +5 -5
  25. package/dist/components/page/HelpPopUp.svelte +30 -30
  26. package/dist/components/page/PageCaller.js +19 -19
  27. package/dist/components/page/Spinner.svelte +14 -14
  28. package/dist/components/page/breadcrumb/Breadcrumb.svelte +19 -19
  29. package/dist/components/page/menu/MenuDataCaller.js +10 -10
  30. package/dist/css/core.ui.postcss +17 -17
  31. package/dist/css/themes/theme-bexis2.css +96 -96
  32. package/dist/css/themes/theme-crimson.css +101 -101
  33. package/dist/css/themes/theme-gold-nouveau.css +140 -140
  34. package/dist/css/themes/theme-hamlindigo.css +112 -112
  35. package/dist/css/themes/theme-modern.css +127 -127
  36. package/dist/css/themes/theme-rocket.css +119 -119
  37. package/dist/css/themes/theme-sahara.css +128 -128
  38. package/dist/css/themes/theme-seafoam.css +122 -122
  39. package/dist/css/themes/theme-seasonal.css +115 -115
  40. package/dist/css/themes/theme-skeleton.css +118 -118
  41. package/dist/css/themes/theme-vintage.css +125 -125
  42. package/dist/index.d.ts +3 -3
  43. package/dist/index.js +3 -3
  44. package/dist/models/Models.d.ts +3 -3
  45. package/dist/services/BaseCaller.js +16 -16
  46. package/package.json +3 -1
  47. package/src/lib/TableView.svelte +1 -1
  48. package/src/lib/components/CodeEditor/CodeEditor.svelte +43 -9
  49. package/src/lib/components/{file → File}/FileIcon.svelte +45 -45
  50. package/{dist/components/file → src/lib/components/File}/FileInfo.svelte +13 -13
  51. package/src/lib/components/ListView.svelte +11 -11
  52. package/src/lib/components/Table/Table.svelte +19 -3
  53. package/src/lib/components/Table/TableFilter.svelte +15 -6
  54. package/src/lib/components/Table/filter.ts +141 -141
  55. package/src/lib/components/form/Checkbox.svelte +24 -24
  56. package/src/lib/components/form/CheckboxKvPList.svelte +29 -29
  57. package/src/lib/components/form/CheckboxList.svelte +21 -21
  58. package/src/lib/components/form/DateInput.svelte +27 -27
  59. package/src/lib/components/form/DropdownKvP.svelte +54 -54
  60. package/src/lib/components/form/MultiSelect.svelte +181 -181
  61. package/src/lib/components/form/NumberInput.svelte +30 -30
  62. package/src/lib/components/form/TextArea.svelte +28 -28
  63. package/src/lib/components/form/TextInput.svelte +28 -28
  64. package/src/lib/components/page/Alert.svelte +41 -41
  65. package/src/lib/components/page/BackToTop.svelte +30 -30
  66. package/src/lib/components/page/Docs.svelte +46 -46
  67. package/src/lib/components/page/ErrorMessage.svelte +10 -10
  68. package/src/lib/components/page/Footer.svelte +18 -18
  69. package/src/lib/components/page/Header.svelte +18 -18
  70. package/src/lib/components/page/HelpPopUp.svelte +72 -72
  71. package/src/lib/components/page/PageCaller.js +19 -19
  72. package/src/lib/components/page/Spinner.svelte +20 -20
  73. package/src/lib/components/page/breadcrumb/Breadcrumb.svelte +39 -39
  74. package/src/lib/components/page/menu/MenuDataCaller.js +10 -10
  75. package/src/lib/css/core.ui.postcss +17 -17
  76. package/src/lib/css/themes/theme-bexis2.css +96 -96
  77. package/src/lib/css/themes/theme-crimson.css +101 -101
  78. package/src/lib/css/themes/theme-gold-nouveau.css +140 -140
  79. package/src/lib/css/themes/theme-hamlindigo.css +112 -112
  80. package/src/lib/css/themes/theme-modern.css +127 -127
  81. package/src/lib/css/themes/theme-rocket.css +119 -119
  82. package/src/lib/css/themes/theme-sahara.css +128 -128
  83. package/src/lib/css/themes/theme-seafoam.css +122 -122
  84. package/src/lib/css/themes/theme-seasonal.css +115 -115
  85. package/src/lib/css/themes/theme-skeleton.css +118 -118
  86. package/src/lib/css/themes/theme-vintage.css +125 -125
  87. package/src/lib/index.ts +3 -3
  88. package/src/lib/models/Models.ts +3 -3
  89. package/src/lib/models/Page.ts +40 -40
  90. package/src/lib/services/Api.ts +55 -55
  91. package/src/lib/services/BaseCaller.js +16 -16
  92. package/src/lib/stores/apiStores.ts +31 -31
  93. /package/dist/components/{file → File}/FileIcon.svelte.d.ts +0 -0
  94. /package/dist/components/{file → File}/FileInfo.svelte.d.ts +0 -0
  95. /package/dist/components/{file → File}/FileUploader.svelte +0 -0
  96. /package/dist/components/{file → File}/FileUploader.svelte.d.ts +0 -0
  97. /package/src/lib/components/{file → File}/FileUploader.svelte +0 -0
package/README.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # bexis-core-ui
2
+
3
+ ## 0.2.31
4
+
5
+ - validation and syntax check for code editor component
6
+
7
+ ## 0.2.30
8
+
9
+ - fix routes for 'file' components ('.../file/...' -> '.../File/...')
10
+ - 'Table' component is able to display heterogeneous data, that means data items/rows might have a different number of properties/columns.
11
+
2
12
  ## 0.2.29
13
+
3
14
  - add disbaled propertie to
4
15
  - TextInput
5
16
  - TextArea
@@ -7,20 +18,25 @@
7
18
  - DateInput
8
19
 
9
20
  ## 0.2.28
21
+
10
22
  - add disabled to multiselect
11
23
 
12
24
  ## 0.2.27
25
+
13
26
  - fix brand stretching
14
27
 
15
28
  ## 0.2.26
29
+
16
30
  - add fixLeft to page
17
31
 
18
32
  ## 0.2.25
33
+
19
34
  - hide console.logs
20
- - file uploader return list of uploaded files after success
35
+ - file uploader return list of uploaded files after success
21
36
 
22
37
  ## 0.2.24
23
- - add ids to table and code editor components
38
+
39
+ - add ids to table and code editor components
24
40
 
25
41
  ## 0.2.23
26
42
 
@@ -1 +1 @@
1
- <h1>table</h1>
1
+ <h1>table</h1>
@@ -1,9 +1,11 @@
1
1
  <script>import { createEventDispatcher } from "svelte";
2
2
  import CodeMirror from "svelte-codemirror-editor";
3
3
  import Fa from "svelte-fa/src/fa.svelte";
4
+ import Linter from "eslint4b-prebuilt";
4
5
  import { html } from "@codemirror/lang-html";
5
- import { javascript } from "@codemirror/lang-javascript";
6
- import { json } from "@codemirror/lang-json";
6
+ import { javascript, esLint } from "@codemirror/lang-javascript";
7
+ import { lintGutter, linter } from "@codemirror/lint";
8
+ import { json, jsonParseLinter } from "@codemirror/lang-json";
7
9
  import { oneDark } from "@codemirror/theme-one-dark";
8
10
  import { Modal, modalStore } from "@skeletonlabs/skeleton";
9
11
  import { faMoon, faSave, faSun } from "@fortawesome/free-regular-svg-icons";
@@ -16,6 +18,7 @@ export let language = "html";
16
18
  export let dark = true;
17
19
  export let toggle = true;
18
20
  export let actions = true;
21
+ export let isValid = false;
19
22
  export let styles = {
20
23
  "&": {
21
24
  borderRadius: "0.5rem",
@@ -32,14 +35,34 @@ const modal = {
32
35
  body: "Unsaved changes will be lost. Are you sure you want to continue?",
33
36
  response: (r) => r ? value = initialValue : null
34
37
  };
38
+ const extensions = language === "js" ? [linter(esLint(new Linter())), lintGutter()] : language === "json" ? [linter(jsonParseLinter()), lintGutter()] : [];
39
+ const isValidJSON = (str) => {
40
+ try {
41
+ JSON.parse(str);
42
+ } catch (e) {
43
+ return false;
44
+ }
45
+ return true;
46
+ };
47
+ const isValidJS = (str) => {
48
+ try {
49
+ new Function(str);
50
+ } catch (e) {
51
+ return false;
52
+ }
53
+ return true;
54
+ };
55
+ $:
56
+ isValid = language === "json" ? isValidJSON(value) : language === "js" ? isValidJS(value) : true;
35
57
  </script>
36
58
 
37
- <div class="items-center justify-center">
38
-
39
- <h1 class="h1 font-semibold text-primary-500 mb-3" id="{id}-title">{title}</h1>
59
+ <div class="grid items-stretch justify-stretch gap-1">
60
+ <label class="label" for="{id}-editor" id="{id}-title">
61
+ <span>{title}</span>
62
+ </label>
40
63
  <slot id="{id}-description" />
41
- <div class="grid gap-1 w-full h-full mt-5">
42
- <div class="rounded-lg shadow-lg w-full" id="{id}-editor">
64
+ <div class="grid gap-1 w-full h-full">
65
+ <div class="rounded-lg shadow-lg w-full overflow-auto" id="{id}-editor">
43
66
  <CodeMirror
44
67
  bind:value
45
68
  lang={language === 'html'
@@ -50,11 +73,11 @@ const modal = {
50
73
  theme={dark ? oneDark : null}
51
74
  class="flex w-full"
52
75
  {styles}
76
+ {extensions}
53
77
  />
54
78
  </div>
55
79
  </div>
56
80
 
57
-
58
81
  <div class="flex justify-between gap-2 items-center mt-3" id="{id}-footer">
59
82
  <div class="flex gap-2">
60
83
  <button
@@ -89,6 +112,7 @@ const modal = {
89
112
  <button
90
113
  class="btn variant-filled-primary"
91
114
  id="{id}-save"
115
+ disabled={!isValid}
92
116
  on:click|preventDefault={() => dispatch('save')}><Fa icon={faSave} /></button
93
117
  >
94
118
  </div>
@@ -10,6 +10,7 @@ declare const __propDef: {
10
10
  dark?: boolean | undefined;
11
11
  toggle?: boolean | undefined;
12
12
  actions?: boolean | undefined;
13
+ isValid?: boolean | undefined;
13
14
  styles?: ThemeSpec | undefined;
14
15
  };
15
16
  events: {
@@ -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,6 +1,6 @@
1
1
  <script>let result = { name: "david" };
2
- </script>
3
-
4
- <h1>MyList</h1>
5
- {result.name}
6
- <b>from bexis-lib</b>
2
+ </script>
3
+
4
+ <h1>MyList</h1>
5
+ {result.name}
6
+ <b>from bexis-lib</b>
@@ -36,7 +36,15 @@ const table = createTable(data, {
36
36
  page: addPagination({ initialPageSize: defaultPageSize }),
37
37
  expand: addExpandedRows()
38
38
  });
39
- const accessors = $data.length > 0 ? Object.keys($data[0]) : [];
39
+ const allCols = {};
40
+ $data.forEach((item) => {
41
+ Object.keys(item).forEach((key) => {
42
+ if (!allCols[key]) {
43
+ allCols[key] = {};
44
+ }
45
+ });
46
+ });
47
+ const accessors = Object.keys(allCols);
40
48
  const tableColumns = [
41
49
  ...accessors.filter((accessor) => {
42
50
  const key = accessor;
@@ -96,6 +104,9 @@ const tableColumns = [
96
104
  return table.column({
97
105
  header: key,
98
106
  accessor,
107
+ cell: ({ value }) => {
108
+ return value === void 0 ? "" : value;
109
+ },
99
110
  plugins: {
100
111
  sort: {
101
112
  invert: true
@@ -217,7 +228,11 @@ const { filterValue } = pluginStates.tableFilter;
217
228
  <tr {...rowAttrs} id="{tableId}-row-{row.id}">
218
229
  {#each row.cells as cell (cell?.id)}
219
230
  <Subscribe attrs={cell.attrs()} let:attrs>
220
- <td {...attrs} class="!p-2 w-max focus:resize" id="{tableId}-{cell.id}-{row.id}">
231
+ <td
232
+ {...attrs}
233
+ class="!p-2 w-max focus:resize"
234
+ id="{tableId}-{cell.id}-{row.id}"
235
+ >
221
236
  <div
222
237
  class="flex items-center h-max overflow-x-auto resize-none hover:resize"
223
238
  class:max-w-md={!fitToScreen}
@@ -97,12 +97,19 @@ const popupFeatured = {
97
97
  target: popupId,
98
98
  placement: "bottom-start"
99
99
  };
100
- let type = typeof (toFilterableValueFn ? toFilterableValueFn($values[0]) : $values[0]);
101
- if (type === "object") {
102
- if ($values[0] instanceof Date) {
103
- type = "date";
100
+ let type = "";
101
+ let isDate = false;
102
+ $values.forEach((item) => {
103
+ if (item) {
104
+ type = typeof (toFilterableValueFn ? toFilterableValueFn(item) : item);
105
+ if (type === "object") {
106
+ if (item instanceof Date) {
107
+ isDate = true;
108
+ }
109
+ }
104
110
  }
105
- }
111
+ });
112
+ type = isDate ? "date" : type;
106
113
  </script>
107
114
 
108
115
  <form class="">
@@ -116,7 +123,7 @@ if (type === "object") {
116
123
  <Fa icon={faFilter} size="12" />
117
124
  </button>
118
125
 
119
- <div data-popup={`${popupId}`} id="{popupId}" class="z-50">
126
+ <div data-popup={`${popupId}`} id={popupId} class="z-50">
120
127
  <div class="card p-3 grid gap-2 shadow-lg w-min bg-base-100">
121
128
  <button
122
129
  class="btn variant-filled-primary btn-sm"
@@ -6,16 +6,16 @@ export let valid;
6
6
  export let invalid;
7
7
  export let required;
8
8
  export let feedback;
9
- </script>
10
-
11
- <InputContainer {label} {feedback} {required}>
12
- <input
13
- {id}
14
- class="input variant-form-material"
15
- type="checkbox"
16
- class:input-success={valid}
17
- class:input-error={invalid}
18
- bind:checked
19
- on:input
20
- />
21
- </InputContainer>
9
+ </script>
10
+
11
+ <InputContainer {label} {feedback} {required}>
12
+ <input
13
+ {id}
14
+ class="input variant-form-material"
15
+ type="checkbox"
16
+ class:input-success={valid}
17
+ class:input-error={invalid}
18
+ bind:checked
19
+ on:input
20
+ />
21
+ </InputContainer>
@@ -8,19 +8,19 @@ export let key;
8
8
  export let help = false;
9
9
  let required = false;
10
10
  let feedback;
11
- </script>
12
-
13
- <InputContainer {id} label={title} {feedback} {required} {help}>
14
- {#each source as item}
15
- <label class="flex items-center space-x-2" for={key}>
16
- <input
17
- class="checkbox"
18
- type="checkbox"
19
- bind:group={target}
20
- checked={item.key}
21
- value={item.key}
22
- />
23
- <p>{item.value}</p>
24
- </label>
25
- {/each}
26
- </InputContainer>
11
+ </script>
12
+
13
+ <InputContainer {id} label={title} {feedback} {required} {help}>
14
+ {#each source as item}
15
+ <label class="flex items-center space-x-2" for={key}>
16
+ <input
17
+ class="checkbox"
18
+ type="checkbox"
19
+ bind:group={target}
20
+ checked={item.key}
21
+ value={item.key}
22
+ />
23
+ <p>{item.value}</p>
24
+ </label>
25
+ {/each}
26
+ </InputContainer>
@@ -6,13 +6,13 @@ export let description = "";
6
6
  export let key;
7
7
  let required = false;
8
8
  let feedback;
9
- </script>
10
-
11
- <InputContainer label={title} {feedback} {required}>
12
- {#each source as item}
13
- <label class="flex items-center space-x-2" for={key}>
14
- <input class="checkbox" type="checkbox" bind:group={target} value={item} />
15
- <p>{item}</p>
16
- </label>
17
- {/each}
18
- </InputContainer>
9
+ </script>
10
+
11
+ <InputContainer label={title} {feedback} {required}>
12
+ {#each source as item}
13
+ <label class="flex items-center space-x-2" for={key}>
14
+ <input class="checkbox" type="checkbox" bind:group={target} value={item} />
15
+ <p>{item}</p>
16
+ </label>
17
+ {/each}
18
+ </InputContainer>
@@ -8,17 +8,17 @@ export let required = false;
8
8
  export let feedback = [""];
9
9
  export let help = false;
10
10
  export let disabled = false;
11
- </script>
12
-
13
- <InputContainer {id} {label} {feedback} {required} {help}>
14
- <input
15
- {id}
16
- class="input variant-form-material"
17
- type="date"
18
- class:input-success={valid}
19
- class:input-error={invalid}
20
- bind:value
21
- on:input
22
- {disabled}
23
- />
24
- </InputContainer>
11
+ </script>
12
+
13
+ <InputContainer {id} {label} {feedback} {required} {help}>
14
+ <input
15
+ {id}
16
+ class="input variant-form-material"
17
+ type="date"
18
+ class:input-success={valid}
19
+ class:input-error={invalid}
20
+ bind:value
21
+ on:input
22
+ {disabled}
23
+ />
24
+ </InputContainer>
@@ -1,54 +1,54 @@
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 = false;
9
- export let invalid = false;
10
- export let feedback = [''];
11
- export let required = false;
12
- export let complexTarget = false;
13
- export let help = false;
14
-
15
- $: selected = null;
16
-
17
- $: updatedSelectedValue(target);
18
- $: updatedTarget(selected);
19
-
20
- function updatedSelectedValue(selection) {
21
- if (selection != null) {
22
- if (complexTarget) {
23
- selected = selection.id;
24
- } else {
25
- selected = selection;
26
- }
27
- }
28
- }
29
-
30
- function updatedTarget(id) {
31
- if (complexTarget) {
32
- target = source.find((opt) => opt.id === id);
33
- } else {
34
- target = id;
35
- }
36
- }
37
- </script>
38
-
39
- <InputContainer {id} label={title} {feedback} {required} {help}>
40
- <select
41
- {id}
42
- class="select variant-form-material"
43
- class:input-success={valid}
44
- class:input-error={invalid}
45
- bind:value={selected}
46
- on:change
47
- on:select
48
- >
49
- <option value={null}>-- Please select --</option>
50
- {#each source as e}
51
- <option value={e.id}>{e.text}</option>
52
- {/each}
53
- </select>
54
- </InputContainer>
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 = false;
9
+ export let invalid = false;
10
+ export let feedback = [''];
11
+ export let required = false;
12
+ export let complexTarget = false;
13
+ export let help = false;
14
+
15
+ $: selected = null;
16
+
17
+ $: updatedSelectedValue(target);
18
+ $: updatedTarget(selected);
19
+
20
+ function updatedSelectedValue(selection) {
21
+ if (selection != null) {
22
+ if (complexTarget) {
23
+ selected = selection.id;
24
+ } else {
25
+ selected = selection;
26
+ }
27
+ }
28
+ }
29
+
30
+ function updatedTarget(id) {
31
+ if (complexTarget) {
32
+ target = source.find((opt) => opt.id === id);
33
+ } else {
34
+ target = id;
35
+ }
36
+ }
37
+ </script>
38
+
39
+ <InputContainer {id} label={title} {feedback} {required} {help}>
40
+ <select
41
+ {id}
42
+ class="select variant-form-material"
43
+ class:input-success={valid}
44
+ class:input-error={invalid}
45
+ bind:value={selected}
46
+ on:change
47
+ on:select
48
+ >
49
+ <option value={null}>-- Please select --</option>
50
+ {#each source as e}
51
+ <option value={e.id}>{e.text}</option>
52
+ {/each}
53
+ </select>
54
+ </InputContainer>