@bexis2/bexis2-core-ui 0.2.31 → 0.2.32

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 (87) hide show
  1. package/README.md +5 -0
  2. package/dist/TableView.svelte +1 -1
  3. package/dist/components/File/FileIcon.svelte +45 -45
  4. package/dist/components/File/FileInfo.svelte +13 -13
  5. package/dist/components/ListView.svelte +5 -5
  6. package/dist/components/Table/Table.svelte +87 -25
  7. package/dist/components/Table/TableFilter.svelte +1 -1
  8. package/dist/components/form/Checkbox.svelte +13 -13
  9. package/dist/components/form/CheckboxKvPList.svelte +16 -16
  10. package/dist/components/form/CheckboxList.svelte +10 -10
  11. package/dist/components/form/DateInput.svelte +14 -14
  12. package/dist/components/form/DropdownKvP.svelte +54 -54
  13. package/dist/components/form/MultiSelect.svelte +181 -181
  14. package/dist/components/form/NumberInput.svelte +15 -15
  15. package/dist/components/form/TextArea.svelte +14 -14
  16. package/dist/components/form/TextInput.svelte +15 -15
  17. package/dist/components/page/Alert.svelte +28 -28
  18. package/dist/components/page/BackToTop.svelte +30 -30
  19. package/dist/components/page/Docs.svelte +22 -22
  20. package/dist/components/page/ErrorMessage.svelte +8 -8
  21. package/dist/components/page/Footer.svelte +5 -5
  22. package/dist/components/page/Header.svelte +5 -5
  23. package/dist/components/page/HelpPopUp.svelte +30 -30
  24. package/dist/components/page/PageCaller.js +19 -19
  25. package/dist/components/page/Spinner.svelte +14 -14
  26. package/dist/components/page/breadcrumb/Breadcrumb.svelte +19 -19
  27. package/dist/components/page/menu/MenuDataCaller.js +10 -10
  28. package/dist/css/core.ui.postcss +17 -17
  29. package/dist/css/themes/theme-bexis2.css +96 -96
  30. package/dist/css/themes/theme-crimson.css +101 -101
  31. package/dist/css/themes/theme-gold-nouveau.css +140 -140
  32. package/dist/css/themes/theme-hamlindigo.css +112 -112
  33. package/dist/css/themes/theme-modern.css +127 -127
  34. package/dist/css/themes/theme-rocket.css +119 -119
  35. package/dist/css/themes/theme-sahara.css +128 -128
  36. package/dist/css/themes/theme-seafoam.css +122 -122
  37. package/dist/css/themes/theme-seasonal.css +115 -115
  38. package/dist/css/themes/theme-skeleton.css +118 -118
  39. package/dist/css/themes/theme-vintage.css +125 -125
  40. package/dist/models/Models.d.ts +3 -0
  41. package/dist/services/BaseCaller.js +16 -16
  42. package/package.json +1 -1
  43. package/src/lib/TableView.svelte +1 -1
  44. package/src/lib/components/ListView.svelte +11 -11
  45. package/src/lib/components/Table/Table.svelte +107 -26
  46. package/src/lib/components/Table/TableFilter.svelte +2 -1
  47. package/src/lib/components/Table/filter.ts +141 -141
  48. package/src/lib/components/{File → file}/FileIcon.svelte +45 -45
  49. package/src/lib/components/{File → file}/FileInfo.svelte +13 -13
  50. package/src/lib/components/form/Checkbox.svelte +24 -24
  51. package/src/lib/components/form/CheckboxKvPList.svelte +29 -29
  52. package/src/lib/components/form/CheckboxList.svelte +21 -21
  53. package/src/lib/components/form/DateInput.svelte +27 -27
  54. package/src/lib/components/form/DropdownKvP.svelte +54 -54
  55. package/src/lib/components/form/MultiSelect.svelte +181 -181
  56. package/src/lib/components/form/NumberInput.svelte +30 -30
  57. package/src/lib/components/form/TextArea.svelte +28 -28
  58. package/src/lib/components/form/TextInput.svelte +28 -28
  59. package/src/lib/components/page/Alert.svelte +41 -41
  60. package/src/lib/components/page/BackToTop.svelte +30 -30
  61. package/src/lib/components/page/Docs.svelte +46 -46
  62. package/src/lib/components/page/ErrorMessage.svelte +10 -10
  63. package/src/lib/components/page/Footer.svelte +18 -18
  64. package/src/lib/components/page/Header.svelte +18 -18
  65. package/src/lib/components/page/HelpPopUp.svelte +72 -72
  66. package/src/lib/components/page/PageCaller.js +19 -19
  67. package/src/lib/components/page/Spinner.svelte +20 -20
  68. package/src/lib/components/page/breadcrumb/Breadcrumb.svelte +39 -39
  69. package/src/lib/components/page/menu/MenuDataCaller.js +10 -10
  70. package/src/lib/css/core.ui.postcss +17 -17
  71. package/src/lib/css/themes/theme-bexis2.css +96 -96
  72. package/src/lib/css/themes/theme-crimson.css +101 -101
  73. package/src/lib/css/themes/theme-gold-nouveau.css +140 -140
  74. package/src/lib/css/themes/theme-hamlindigo.css +112 -112
  75. package/src/lib/css/themes/theme-modern.css +127 -127
  76. package/src/lib/css/themes/theme-rocket.css +119 -119
  77. package/src/lib/css/themes/theme-sahara.css +128 -128
  78. package/src/lib/css/themes/theme-seafoam.css +122 -122
  79. package/src/lib/css/themes/theme-seasonal.css +115 -115
  80. package/src/lib/css/themes/theme-skeleton.css +118 -118
  81. package/src/lib/css/themes/theme-vintage.css +125 -125
  82. package/src/lib/models/Models.ts +10 -7
  83. package/src/lib/models/Page.ts +40 -40
  84. package/src/lib/services/Api.ts +55 -55
  85. package/src/lib/services/BaseCaller.js +16 -16
  86. package/src/lib/stores/apiStores.ts +31 -31
  87. /package/src/lib/components/{File → file}/FileUploader.svelte +0 -0
package/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # bexis-core-ui
2
2
 
3
+ ## 0.2.32
4
+
5
+ - resizability for Table rows and columns
6
+ - **fixedWidth** and **minWidth** options for columns
7
+
3
8
  ## 0.2.31
4
9
 
5
10
  - validation and syntax check for code editor component
@@ -1 +1 @@
1
- <h1>table</h1>
1
+ <h1>table</h1>
@@ -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>
@@ -18,6 +18,7 @@ let {
18
18
  id: tableId,
19
19
  data,
20
20
  columns,
21
+ resizable = "none",
21
22
  height = null,
22
23
  optionsComponent,
23
24
  defaultPageSize = 10,
@@ -105,7 +106,7 @@ const tableColumns = [
105
106
  header: key,
106
107
  accessor,
107
108
  cell: ({ value }) => {
108
- return value === void 0 ? "" : value;
109
+ return value ? value : "";
109
110
  },
110
111
  plugins: {
111
112
  sort: {
@@ -128,7 +129,7 @@ const tableColumns = [
128
129
  if (optionsComponent !== void 0) {
129
130
  tableColumns.push(
130
131
  table.display({
131
- id: "actionsColumn",
132
+ id: "optionsColumn",
132
133
  header: "",
133
134
  cell: ({ row }, _) => {
134
135
  return createRender(optionsComponent, {
@@ -142,13 +143,53 @@ if (optionsComponent !== void 0) {
142
143
  const createdTableColumns = table.createColumns(tableColumns);
143
144
  const { headerRows, pageRows, tableAttrs, tableBodyAttrs, pluginStates } = table.createViewModel(createdTableColumns);
144
145
  const { filterValue } = pluginStates.tableFilter;
146
+ const minWidth = (id) => {
147
+ if (columns && id in columns) {
148
+ return columns[id].minWidth ?? 0;
149
+ }
150
+ return 0;
151
+ };
152
+ const fixedWidth = (id) => {
153
+ if (columns && id in columns) {
154
+ return columns[id].fixedWidth ?? 0;
155
+ }
156
+ return 0;
157
+ };
158
+ const cellStyle = (id) => {
159
+ const minW = minWidth(id);
160
+ const fixedW = fixedWidth(id);
161
+ const styles = [];
162
+ minW && styles.push(`min-width: ${minW}px`);
163
+ fixedW && styles.push(`width: ${fixedW}px`);
164
+ return styles.join(";");
165
+ };
166
+ const resetResize = () => {
167
+ if (resizable === "columns" || resizable === "both") {
168
+ $headerRows.forEach((row) => {
169
+ row.cells.forEach((cell) => {
170
+ const minW = minWidth(cell.id);
171
+ const fixedW = fixedWidth(cell.id);
172
+ fixedW && document.getElementById(`th-${tableId}-${cell.id}`)?.style.setProperty("width", `${fixedW}px`);
173
+ minW && document.getElementById(`th-${tableId}-${cell.id}`)?.style.setProperty("min-width", `${minW}px`);
174
+ !minW && !fixedW && document.getElementById(`th-${tableId}-${cell.id}`)?.style.setProperty("width", "auto");
175
+ });
176
+ });
177
+ }
178
+ if (resizable === "rows" || resizable === "both") {
179
+ $pageRows.forEach((row) => {
180
+ row.cells.forEach((cell) => {
181
+ document.getElementById(`${tableId}-${cell.id}-${row.id}`)?.style.setProperty("height", "auto");
182
+ });
183
+ });
184
+ }
185
+ };
145
186
  </script>
146
187
 
147
188
  <div class="grid gap-2 overflow-auto" class:w-fit={!fitToScreen} class:w-full={fitToScreen}>
148
189
  <div class="table-container">
149
190
  {#if $data.length > 0}
150
191
  <input
151
- class="input p-2 mb-2 border border-primary-500"
192
+ class="input p-2 border border-primary-500"
152
193
  type="text"
153
194
  bind:value={$filterValue}
154
195
  placeholder="Search rows..."
@@ -156,24 +197,37 @@ const { filterValue } = pluginStates.tableFilter;
156
197
  />
157
198
  {/if}
158
199
 
159
- {#if toggle}
160
- <SlideToggle
161
- name="slider-label"
162
- active="bg-primary-500"
163
- size="sm"
164
- checked={fitToScreen}
165
- id="{tableId}-toggle"
166
- on:change={() => (fitToScreen = !fitToScreen)}>Fit to screen</SlideToggle
167
- >
168
- {/if}
200
+ <div class="flex justify-between items-center py-2 w-full">
201
+ <div>
202
+ {#if toggle}
203
+ <SlideToggle
204
+ name="slider-label"
205
+ active="bg-primary-500"
206
+ size="sm"
207
+ checked={fitToScreen}
208
+ id="{tableId}-toggle"
209
+ on:change={() => (fitToScreen = !fitToScreen)}>Fit to screen</SlideToggle
210
+ >
211
+ {/if}
212
+ </div>
213
+ <div>
214
+ {#if resizable !== 'none'}
215
+ <button
216
+ type="button"
217
+ class="btn btn-sm variant-filled-primary rounded-full order-last"
218
+ on:click|preventDefault={resetResize}>Reset sizing</button
219
+ >
220
+ {/if}
221
+ </div>
222
+ </div>
169
223
 
170
224
  <div class="overflow-auto" style="height: {height}px">
171
225
  <table
172
226
  {...$tableAttrs}
173
- class="table table-compact bg-tertiary-200 overflow-clip"
227
+ class="table table-auto table-compact bg-tertiary-500/30 overflow-clip"
174
228
  id="{tableId}-table"
175
229
  >
176
- <thead class={height != null ? `sticky top-0` : ''}>
230
+ <thead class=" {height != null ? `sticky top-0` : ''}">
177
231
  {#each $headerRows as headerRow (headerRow.id)}
178
232
  <Subscribe
179
233
  rowAttrs={headerRow.attrs()}
@@ -181,11 +235,19 @@ const { filterValue } = pluginStates.tableFilter;
181
235
  rowProps={headerRow.props()}
182
236
  let:rowProps
183
237
  >
184
- <tr {...rowAttrs} class="bg-primary-300">
238
+ <tr {...rowAttrs} class="bg-primary-300 items-stretch">
185
239
  {#each headerRow.cells as cell (cell.id)}
186
240
  <Subscribe attrs={cell.attrs()} props={cell.props()} let:props let:attrs>
187
- <th scope="col" class="!p-2 w-min" {...attrs}>
188
- <div class="flex w-full justify-between items-center">
241
+ <th
242
+ scope="col"
243
+ class="!p-2 overflow-auto"
244
+ class:resize-x={(resizable === 'columns' || resizable === 'both') &&
245
+ !fixedWidth(cell.id)}
246
+ {...attrs}
247
+ id="th-{tableId}-{cell.id}"
248
+ style={cellStyle(cell.id)}
249
+ >
250
+ <div class="flex justify-between items-center">
189
251
  <div class="flex gap-1 whitespace-pre-wrap">
190
252
  <span
191
253
  class:underline={props.sort.order}
@@ -225,18 +287,18 @@ const { filterValue } = pluginStates.tableFilter;
225
287
  <tbody class="overflow-auto" {...$tableBodyAttrs}>
226
288
  {#each $pageRows as row (row.id)}
227
289
  <Subscribe rowAttrs={row.attrs()} let:rowAttrs>
228
- <tr {...rowAttrs} id="{tableId}-row-{row.id}">
229
- {#each row.cells as cell (cell?.id)}
290
+ <tr {...rowAttrs} id="{tableId}-row-{row.id}" class="">
291
+ {#each row.cells as cell, index (cell?.id)}
230
292
  <Subscribe attrs={cell.attrs()} let:attrs>
231
293
  <td
232
294
  {...attrs}
233
- class="!p-2 w-max focus:resize"
295
+ class="!p-2 overflow-auto {index === 0 &&
296
+ (resizable === 'rows' || resizable === 'both')
297
+ ? 'resize-y'
298
+ : ''}"
234
299
  id="{tableId}-{cell.id}-{row.id}"
235
300
  >
236
- <div
237
- class="flex items-center h-max overflow-x-auto resize-none hover:resize"
238
- class:max-w-md={!fitToScreen}
239
- >
301
+ <div class="flex items-center h-max overflow-x-auto">
240
302
  <Render of={cell.render()} />
241
303
  </div>
242
304
  </td>
@@ -97,7 +97,7 @@ const popupFeatured = {
97
97
  target: popupId,
98
98
  placement: "bottom-start"
99
99
  };
100
- let type = "";
100
+ let type = "string";
101
101
  let isDate = false;
102
102
  $values.forEach((item) => {
103
103
  if (item) {
@@ -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>