firstly 0.0.12 → 0.0.14

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 (120) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/esm/ROUTES.d.ts +2 -0
  3. package/esm/ROUTES.js +1 -0
  4. package/esm/api/index.d.ts +9 -0
  5. package/esm/api/index.js +3 -1
  6. package/esm/auth/AuthController.d.ts +12 -23
  7. package/esm/auth/AuthController.js +12 -31
  8. package/esm/auth/server/AuthController.server.d.ts +11 -11
  9. package/esm/auth/server/AuthController.server.js +99 -34
  10. package/esm/auth/server/handleGuard.d.ts +16 -0
  11. package/esm/auth/server/handleGuard.js +67 -0
  12. package/esm/auth/server/helperFirstly.d.ts +1 -1
  13. package/esm/auth/server/helperFirstly.js +1 -0
  14. package/esm/auth/server/index.d.ts +3 -1
  15. package/esm/auth/server/index.js +3 -1
  16. package/esm/auth/server/module.d.ts +105 -89
  17. package/esm/auth/server/module.js +55 -42
  18. package/esm/auth/server/providers/github.d.ts +4 -2
  19. package/esm/auth/server/providers/github.js +2 -2
  20. package/esm/auth/static/assets/Page-B0XXxe0N.d.ts +6 -0
  21. package/esm/auth/static/assets/Page-B0XXxe0N.js +1 -0
  22. package/esm/auth/static/assets/Page-DdKMiUZn.d.ts +6 -0
  23. package/esm/auth/static/assets/Page-DdKMiUZn.js +20 -0
  24. package/esm/auth/static/assets/Page-UV_hqY7I.d.ts +6 -0
  25. package/esm/auth/static/assets/Page-UV_hqY7I.js +1 -0
  26. package/esm/auth/static/assets/Page-mK42zGEw.css +1 -0
  27. package/esm/auth/static/assets/index-C9jzxOBu.d.ts +151 -0
  28. package/esm/auth/static/assets/index-C9jzxOBu.js +42 -0
  29. package/esm/auth/static/assets/index-DKWpA6v7.css +4 -0
  30. package/esm/auth/static/index.html +11 -11
  31. package/esm/auth/types.d.ts +26 -3
  32. package/esm/bin/cmd.js +423 -152
  33. package/esm/cellsBuildor.js +1 -1
  34. package/esm/common.d.ts +5 -0
  35. package/esm/common.js +8 -0
  36. package/esm/cron/server/index.js +1 -1
  37. package/esm/feedback/FeedbackController.js +58 -53
  38. package/esm/feedback/server/index.d.ts +6 -15
  39. package/esm/feedback/server/index.js +4 -5
  40. package/esm/feedback/types.d.ts +14 -0
  41. package/esm/feedback/types.js +4 -0
  42. package/esm/feedback/ui/DialogIssue.svelte +131 -119
  43. package/esm/feedback/ui/DialogIssue.svelte.d.ts +20 -18
  44. package/esm/feedback/ui/DialogIssues.svelte +108 -99
  45. package/esm/feedback/ui/DialogIssues.svelte.d.ts +20 -18
  46. package/esm/feedback/ui/DialogMilestones.svelte +40 -34
  47. package/esm/feedback/ui/DialogMilestones.svelte.d.ts +18 -16
  48. package/esm/feedback/ui/Feedback.svelte +11 -9
  49. package/esm/feedback/ui/Feedback.svelte.d.ts +16 -14
  50. package/esm/index.d.ts +2 -5
  51. package/esm/index.js +2 -8
  52. package/esm/mail/server/index.d.ts +9 -2
  53. package/esm/mail/server/index.js +3 -1
  54. package/esm/mail/templates/DefaultMail.svelte +81 -61
  55. package/esm/mail/templates/DefaultMail.svelte.d.ts +28 -26
  56. package/esm/server/index.d.ts +0 -0
  57. package/esm/server/index.js +1 -0
  58. package/esm/storeItem.d.ts +1 -4
  59. package/esm/storeItem.js +1 -1
  60. package/esm/storeList.d.ts +1 -4
  61. package/esm/sveltekit/server/index.d.ts +3 -9
  62. package/esm/sveltekit/server/index.js +3 -0
  63. package/esm/ui/Button.svelte +112 -89
  64. package/esm/ui/Button.svelte.d.ts +34 -24
  65. package/esm/ui/Clipboardable.svelte +24 -17
  66. package/esm/ui/Clipboardable.svelte.d.ts +34 -23
  67. package/esm/ui/Field.svelte +328 -285
  68. package/esm/ui/Field.svelte.d.ts +15 -8
  69. package/esm/ui/FieldGroup.svelte +112 -91
  70. package/esm/ui/FieldGroup.svelte.d.ts +17 -6
  71. package/esm/ui/Grid.svelte +322 -308
  72. package/esm/ui/Grid.svelte.d.ts +17 -6
  73. package/esm/ui/GridLoading.svelte +28 -27
  74. package/esm/ui/GridLoading.svelte.d.ts +19 -17
  75. package/esm/ui/GridPaginate.svelte +68 -61
  76. package/esm/ui/GridPaginate.svelte.d.ts +21 -19
  77. package/esm/ui/Icon.svelte +116 -80
  78. package/esm/ui/Icon.svelte.d.ts +52 -43
  79. package/esm/ui/Loading.svelte +10 -8
  80. package/esm/ui/Loading.svelte.d.ts +29 -18
  81. package/esm/ui/Tooltip.svelte +38 -35
  82. package/esm/ui/Tooltip.svelte.d.ts +30 -20
  83. package/esm/ui/dialog/DialogForm.svelte +70 -63
  84. package/esm/ui/dialog/DialogForm.svelte.d.ts +18 -16
  85. package/esm/ui/dialog/DialogManagement.svelte +74 -74
  86. package/esm/ui/dialog/DialogManagement.svelte.d.ts +22 -21
  87. package/esm/ui/dialog/DialogPrimitive.svelte +82 -76
  88. package/esm/ui/dialog/DialogPrimitive.svelte.d.ts +35 -25
  89. package/esm/ui/dialog/FormEditAction.svelte +58 -50
  90. package/esm/ui/dialog/FormEditAction.svelte.d.ts +13 -6
  91. package/esm/ui/dialog/dialog.d.ts +1 -4
  92. package/esm/ui/internals/FieldContainer.svelte +24 -17
  93. package/esm/ui/internals/FieldContainer.svelte.d.ts +37 -28
  94. package/esm/ui/internals/Input.svelte +136 -102
  95. package/esm/ui/internals/Input.svelte.d.ts +34 -32
  96. package/esm/ui/internals/Textarea.svelte +60 -52
  97. package/esm/ui/internals/Textarea.svelte.d.ts +31 -28
  98. package/esm/ui/internals/select/MultiSelectMelt.svelte +243 -199
  99. package/esm/ui/internals/select/MultiSelectMelt.svelte.d.ts +29 -27
  100. package/esm/ui/internals/select/SelectMelt.svelte +254 -219
  101. package/esm/ui/internals/select/SelectMelt.svelte.d.ts +34 -32
  102. package/esm/ui/internals/select/SelectRadio.svelte +39 -33
  103. package/esm/ui/internals/select/SelectRadio.svelte.d.ts +24 -22
  104. package/esm/ui/link/Link.svelte +25 -20
  105. package/esm/ui/link/Link.svelte.d.ts +31 -23
  106. package/esm/ui/link/LinkPlus.svelte +52 -51
  107. package/esm/ui/link/LinkPlus.svelte.d.ts +20 -18
  108. package/esm/vite/index.d.ts +2 -3
  109. package/esm/vite/index.js +33 -26
  110. package/package.json +16 -20
  111. package/esm/auth/static/assets/Page-Bb8bFlrP.d.ts +0 -4
  112. package/esm/auth/static/assets/Page-Bb8bFlrP.js +0 -1
  113. package/esm/auth/static/assets/Page-BxomFlZ8.d.ts +0 -4
  114. package/esm/auth/static/assets/Page-BxomFlZ8.js +0 -1
  115. package/esm/auth/static/assets/Page-CaIYu0-y.d.ts +0 -6
  116. package/esm/auth/static/assets/Page-CaIYu0-y.js +0 -19
  117. package/esm/auth/static/assets/Page-MkYglNtu.css +0 -1
  118. package/esm/auth/static/assets/index-Bl0Bk5u0.d.ts +0 -64
  119. package/esm/auth/static/assets/index-Bl0Bk5u0.js +0 -2
  120. package/esm/auth/static/assets/index-R27C_TlP.css +0 -4
@@ -1,234 +1,269 @@
1
- <script>import { createCombobox, createSync } from "@melt-ui/svelte";
2
- import { createEventDispatcher, onMount, tick } from "svelte";
3
- import { fly } from "svelte/transition";
4
- import {
5
- Button,
6
- LibIcon_Check,
7
- LibIcon_Cross,
8
- LibIcon_Search,
9
- tw
10
- } from "../../../";
11
- import Icon from "../../Icon.svelte";
12
- export let id;
13
- export let disabled = false;
14
- export let placeholder = "";
15
- export let items = [];
16
- let totalCount = void 0;
17
- export let focus = false;
18
- const focusNow = (node) => {
19
- if (focus) {
20
- tick().then(() => {
21
- node.focus();
22
- });
23
- }
24
- };
25
- export let loadOptions = void 0;
26
- export let value = void 0;
27
- export let clearable = false;
28
- export let createOptionWhenNoResult = false;
29
- export let default_select_if_one_item = false;
30
- const dispatch = createEventDispatcher();
31
- function dispatchSelectedValue(_data) {
32
- dispatch("selected", _data);
33
- }
34
- function dispatchIssue(msg) {
35
- dispatch("issue", msg);
36
- }
37
- function dispatchCreateRequest(e, input2) {
38
- e.preventDefault();
39
- dispatch("createRequest", input2);
40
- }
41
- let lastSearch = void 0;
42
- const localLoadOptions = async (str) => {
43
- if (str === lastSearch) {
44
- return;
45
- }
46
- lastSearch = str;
47
- if (loadOptions) {
48
- const lo = await loadOptions(str);
49
- items = lo.items;
50
- totalCount = lo.totalCount;
51
- filteredItems = items;
52
- }
53
- };
54
- onMount(async () => {
55
- localLoadOptions("");
56
- sync.selected(getDefaultValue(value));
57
- });
58
- const getDefaultValue = (_selectedValue) => {
59
- if (!items) {
60
- return;
61
- }
62
- const found = items.find((c) => String(c?.id) === String(_selectedValue));
63
- if (found) {
64
- return toOption(found);
65
- } else {
66
- if (value !== null && value !== void 0 && items.length > 0) {
67
- dispatchIssue("VALUE_NOT_IN_ITEMS");
68
- }
69
- }
70
- };
71
- const toOption = (item) => ({
72
- value: item,
73
- label: item.caption
74
- // icon: item.icon,
75
- // disabled: item.disabled,
76
- });
77
- const {
78
- elements: { menu, input, option },
79
- states: { open, inputValue, touchedInput, selected: localSelected }
80
- // helpers: { isSelected },
81
- } = createCombobox({
82
- forceVisible: true,
83
- disabled,
84
- ids: { label: id }
85
- });
86
- const clearSelection = () => {
87
- sync.selected(void 0);
88
- };
89
- let debounceTimer;
90
- const debounce = (callback) => {
91
- clearTimeout(debounceTimer);
92
- debounceTimer = setTimeout(
93
- callback,
94
- // debounce only if we have a load option
95
- loadOptions ? 444 : 0
96
- );
97
- };
98
- const sync = createSync({ selected: localSelected });
99
- $: items && sync.selected(getDefaultValue(value), (v) => {
100
- if (v?.value?.id !== value) {
101
- dispatchSelectedValue(v?.value);
102
- }
103
- value = v?.value?.id;
104
- });
105
- $: if (!$open) {
106
- $inputValue = $localSelected?.label ?? "";
107
- }
108
- $: filteredItems = items;
109
- $: {
110
- if (items.length === 1 && default_select_if_one_item) {
111
- sync.selected(toOption(items[0]));
112
- }
113
- }
114
- const calcFilteredItems = (touched, str, value2) => {
115
- if (touched) {
116
- debounce(async () => {
117
- const normalizedInput = str.toLowerCase();
118
- updateFilteredItems(normalizedInput);
119
- });
120
- } else {
121
- updateFilteredItems("");
122
- }
123
- };
124
- const updateFilteredItems = async (normalizedInput) => {
125
- if (loadOptions) {
126
- await localLoadOptions(normalizedInput);
127
- } else {
128
- filteredItems = items.filter((item) => {
129
- return item.caption?.toLowerCase().includes(normalizedInput);
130
- });
131
- }
132
- };
133
- $: calcFilteredItems($touchedInput, $inputValue, value);
1
+ <script lang="ts">
2
+ import { createCombobox, createSync, type ComboboxOptionProps } from '@melt-ui/svelte'
3
+ import { createEventDispatcher, onMount, tick } from 'svelte'
4
+ import { fly } from 'svelte/transition'
5
+
6
+ import {
7
+ Button,
8
+ LibIcon_Check,
9
+ LibIcon_Cross,
10
+ LibIcon_Search,
11
+ tw,
12
+ type BaseItem,
13
+ type FF_Icon,
14
+ } from '../../../'
15
+ import Icon from '../../Icon.svelte'
16
+
17
+ export let id: string
18
+ export let disabled: boolean = false
19
+ export let placeholder: string = ''
20
+ export let items: BaseItem[] = []
21
+ let totalCount: number | undefined = undefined
22
+
23
+ export let focus: boolean = false
24
+ const focusNow = (node: any) => {
25
+ if (focus) {
26
+ tick().then(() => {
27
+ node.focus()
28
+ })
29
+ }
30
+ }
31
+
32
+ export let loadOptions:
33
+ | ((str: string) => Promise<{ items: BaseItem[]; totalCount: number }>)
34
+ | undefined = undefined
35
+ export let value: string | undefined = undefined
36
+ export let clearable = false
37
+ export let createOptionWhenNoResult = false
38
+ export let default_select_if_one_item = false
39
+
40
+ const dispatch = createEventDispatcher()
41
+
42
+ function dispatchSelectedValue(_data: BaseItem | undefined) {
43
+ dispatch('selected', _data)
44
+ }
45
+
46
+ function dispatchIssue(msg: 'VALUE_NOT_IN_ITEMS') {
47
+ dispatch('issue', msg)
48
+ }
49
+
50
+ function dispatchCreateRequest(e: any, input: string) {
51
+ e.preventDefault()
52
+ dispatch('createRequest', input)
53
+ }
54
+
55
+ let lastSearch: string | undefined = undefined
56
+ const localLoadOptions = async (str: string) => {
57
+ if (str === lastSearch) {
58
+ return
59
+ }
60
+ lastSearch = str
61
+ if (loadOptions) {
62
+ const lo = await loadOptions(str)
63
+ items = lo.items
64
+ totalCount = lo.totalCount
65
+ filteredItems = items
66
+ }
67
+ }
68
+
69
+ onMount(async () => {
70
+ localLoadOptions('')
71
+
72
+ // after we load items
73
+ sync.selected(getDefaultValue(value))
74
+ })
75
+
76
+ const getDefaultValue = (_selectedValue: string | undefined) => {
77
+ if (!items) {
78
+ return
79
+ }
80
+ const found = items.find((c) => String(c?.id) === String(_selectedValue))
81
+ if (found) {
82
+ return toOption(found)
83
+ } else {
84
+ if (value !== null && value !== undefined && items.length > 0) {
85
+ dispatchIssue('VALUE_NOT_IN_ITEMS')
86
+ }
87
+ }
88
+ }
89
+
90
+ const toOption = (
91
+ item: BaseItem,
92
+ ): ComboboxOptionProps<BaseItem> & {
93
+ icon?: FF_Icon
94
+ } => ({
95
+ value: item,
96
+ label: item.caption,
97
+ // icon: item.icon,
98
+ // disabled: item.disabled,
99
+ })
100
+
101
+ const {
102
+ elements: { menu, input, option },
103
+ states: { open, inputValue, touchedInput, selected: localSelected },
104
+ // helpers: { isSelected },
105
+ } = createCombobox<BaseItem>({
106
+ forceVisible: true,
107
+ disabled,
108
+ ids: { label: id },
109
+ })
110
+
111
+ const clearSelection = () => {
112
+ sync.selected(undefined)
113
+ }
114
+
115
+ let debounceTimer: ReturnType<typeof setTimeout>
116
+ const debounce = (callback: () => void) => {
117
+ clearTimeout(debounceTimer)
118
+ debounceTimer = setTimeout(
119
+ callback,
120
+ // debounce only if we have a load option
121
+ loadOptions ? 444 : 0,
122
+ )
123
+ }
124
+
125
+ const sync = createSync({ selected: localSelected })
126
+ $: items &&
127
+ sync.selected(getDefaultValue(value), (v) => {
128
+ // Only if different
129
+ if (v?.value?.id !== value) {
130
+ dispatchSelectedValue(v?.value)
131
+ }
132
+ value = v?.value?.id
133
+ })
134
+
135
+ $: if (!$open) {
136
+ $inputValue = $localSelected?.label ?? ''
137
+ }
138
+
139
+ $: filteredItems = items
140
+
141
+ $: {
142
+ if (items.length === 1 && default_select_if_one_item) {
143
+ sync.selected(toOption(items[0]))
144
+ }
145
+ }
146
+
147
+ const calcFilteredItems = (touched: boolean, str: string, value: any) => {
148
+ if (touched) {
149
+ debounce(async () => {
150
+ const normalizedInput = str.toLowerCase()
151
+ updateFilteredItems(normalizedInput)
152
+ })
153
+ } else {
154
+ updateFilteredItems('')
155
+ }
156
+ }
157
+
158
+ const updateFilteredItems = async (normalizedInput: string) => {
159
+ if (loadOptions) {
160
+ await localLoadOptions(normalizedInput)
161
+ } else {
162
+ filteredItems = items.filter((item) => {
163
+ return item.caption?.toLowerCase().includes(normalizedInput)
164
+ })
165
+ }
166
+ }
167
+
168
+ $: calcFilteredItems($touchedInput, $inputValue, value)
134
169
  </script>
135
170
 
136
171
  <div class="input input-bordered flex min-w-0 items-center {disabled && 'opacity-40'}">
137
- <div class="relative">
138
- {#if $localSelected?.value?.icon?.data}
139
- <Icon
140
- data={$localSelected.value.icon.data}
141
- class={tw(['relative', $localSelected.value.icon.class])}
142
- style={$localSelected.value.icon.style}
143
- size={$localSelected.value.icon.size}
144
- ></Icon>
145
- {:else}
146
- <Icon data={LibIcon_Search} class="relative"></Icon>
147
- {/if}
148
- </div>
149
- <!-- {id} -->
150
- <input
151
- {...$input}
152
- use:$input.action
153
- class="-ml-8 -mr-5 h-full min-w-0 flex-grow bg-transparent px-10"
154
- {placeholder}
155
- use:focusNow
156
- />
157
- <div class="pointer-events-none relative right-0 flex gap-2">
158
- {#if clearable && $localSelected}
159
- <button on:click={clearSelection} class="pointer-events-auto">
160
- <Icon data={LibIcon_Cross}></Icon>
161
- </button>
162
- {/if}
163
- <!-- {#if $open}
172
+ <div class="relative">
173
+ {#if $localSelected?.value?.icon?.data}
174
+ <Icon
175
+ data={$localSelected.value.icon.data}
176
+ class={tw(['relative', $localSelected.value.icon.class])}
177
+ style={$localSelected.value.icon.style}
178
+ size={$localSelected.value.icon.size}
179
+ ></Icon>
180
+ {:else}
181
+ <Icon data={LibIcon_Search} class="relative"></Icon>
182
+ {/if}
183
+ </div>
184
+ <!-- {id} -->
185
+ <input
186
+ {...$input}
187
+ use:$input.action
188
+ class="-ml-8 -mr-5 h-full min-w-0 flex-grow bg-transparent px-10"
189
+ {placeholder}
190
+ use:focusNow
191
+ />
192
+ <div class="pointer-events-none relative right-0 flex gap-2">
193
+ {#if clearable && $localSelected}
194
+ <button on:click={clearSelection} class="pointer-events-auto">
195
+ <Icon data={LibIcon_Cross}></Icon>
196
+ </button>
197
+ {/if}
198
+ <!-- {#if $open}
164
199
  <Icon data={LibIcon_ChevronUp}></Icon>
165
200
  {:else}
166
201
  <Icon data={LibIcon_ChevronDown}></Icon>
167
202
  {/if} -->
168
- </div>
203
+ </div>
169
204
  </div>
170
205
 
171
206
  {#if $open}
172
- <ul
173
- class="border-base-content/20 z-50 flex max-h-[300px] flex-col overflow-hidden rounded-lg border"
174
- {...$menu}
175
- use:$menu.action
176
- transition:fly={{ duration: 150, y: -5 }}
177
- >
178
- <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
179
- <div class="bg-base-100 flex max-h-full flex-col gap-0 overflow-y-auto py-2" tabindex="0">
180
- {#each filteredItems as item, index (index)}
181
- <li
182
- {...$option(toOption(item))}
183
- use:$option.action
184
- class="data-[highlighted]:bg-primary data-[highlighted]:text-primary-content relative flex cursor-pointer scroll-my-2 items-center
207
+ <ul
208
+ class="border-base-content/20 z-50 flex max-h-[300px] flex-col overflow-hidden rounded-lg border"
209
+ {...$menu}
210
+ use:$menu.action
211
+ transition:fly={{ duration: 150, y: -5 }}
212
+ >
213
+ <!-- svelte-ignore a11y-no-noninteractive-tabindex -->
214
+ <div class="bg-base-100 flex max-h-full flex-col gap-0 overflow-y-auto py-2" tabindex="0">
215
+ {#each filteredItems as item, index (index)}
216
+ <li
217
+ {...$option(toOption(item))}
218
+ use:$option.action
219
+ class="data-[highlighted]:bg-primary data-[highlighted]:text-primary-content relative flex cursor-pointer scroll-my-2 items-center
185
220
  rounded-md
186
221
  px-1
187
222
  py-2
188
223
  data-[disabled]:opacity-50"
189
- >
190
- {#if $localSelected?.value?.id === item.id}
191
- <Icon data={LibIcon_Check} class="w-6"></Icon>
192
- {:else}
193
- <!-- just to book the place -->
194
- <span class="w-6"></span>
195
- {/if}
196
- {#if item.icon?.data}
197
- <Icon
198
- data={item.icon.data}
199
- class={tw(['flex-shrink-0', item.icon.class])}
200
- style={item.icon.style}
201
- size={item.icon.size}
202
- ></Icon>
203
- {/if}
204
- <div class="pl-2">
205
- <span class="font-medium">{item.caption}</span>
206
- </div>
207
- </li>
208
- {:else}
209
- {#if createOptionWhenNoResult}
210
- <div class="p-4">
211
- <Button
212
- class="w-full"
213
- on:click={(e) => {
214
- dispatchCreateRequest(e, $inputValue)
215
- }}>Créer "{$inputValue}"</Button
216
- >
217
- </div>
218
- {:else}
219
- <li class="relative cursor-pointer rounded-md py-1 pl-8 pr-4">Aucun résultat</li>
220
- {/if}
221
- {/each}
222
- </div>
223
- {#if totalCount}
224
- <div class="bg-base-300 z-50 text-center text-xs">
225
- {#if items.length < totalCount}
226
- ({items.length} / {totalCount})
227
- {:else}
228
- <!-- yes, items.length can be bigger if the selected item is not in the limit -->
229
- ({items.length})
230
- {/if}
231
- </div>
232
- {/if}
233
- </ul>
224
+ >
225
+ {#if $localSelected?.value?.id === item.id}
226
+ <Icon data={LibIcon_Check} class="w-6"></Icon>
227
+ {:else}
228
+ <!-- just to book the place -->
229
+ <span class="w-6"></span>
230
+ {/if}
231
+ {#if item.icon?.data}
232
+ <Icon
233
+ data={item.icon.data}
234
+ class={tw(['flex-shrink-0', item.icon.class])}
235
+ style={item.icon.style}
236
+ size={item.icon.size}
237
+ ></Icon>
238
+ {/if}
239
+ <div class="pl-2">
240
+ <span class="font-medium">{item.caption}</span>
241
+ </div>
242
+ </li>
243
+ {:else}
244
+ {#if createOptionWhenNoResult}
245
+ <div class="p-4">
246
+ <Button
247
+ class="w-full"
248
+ on:click={(e) => {
249
+ dispatchCreateRequest(e, $inputValue)
250
+ }}>Créer "{$inputValue}"</Button
251
+ >
252
+ </div>
253
+ {:else}
254
+ <li class="relative cursor-pointer rounded-md py-1 pl-8 pr-4">Aucun résultat</li>
255
+ {/if}
256
+ {/each}
257
+ </div>
258
+ {#if totalCount}
259
+ <div class="bg-base-300 z-50 text-center text-xs">
260
+ {#if items.length < totalCount}
261
+ ({items.length} / {totalCount})
262
+ {:else}
263
+ <!-- yes, items.length can be bigger if the selected item is not in the limit -->
264
+ ({items.length})
265
+ {/if}
266
+ </div>
267
+ {/if}
268
+ </ul>
234
269
  {/if}
@@ -1,35 +1,37 @@
1
- import { SvelteComponent } from "svelte";
2
1
  import { type BaseItem } from '../../../';
3
- declare const __propDef: {
4
- props: {
5
- id: string;
6
- disabled?: boolean;
7
- placeholder?: string;
8
- items?: BaseItem[];
9
- focus?: boolean;
10
- loadOptions?: ((str: string) => Promise<{
11
- items: BaseItem[];
12
- totalCount: number;
13
- }>) | undefined;
14
- value?: string | undefined;
15
- clearable?: boolean;
16
- createOptionWhenNoResult?: boolean;
17
- default_select_if_one_item?: boolean;
2
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
3
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
+ $$bindings?: Bindings;
5
+ } & Exports;
6
+ (internal: unknown, props: Props & {
7
+ $$events?: Events;
8
+ $$slots?: Slots;
9
+ }): Exports & {
10
+ $set?: any;
11
+ $on?: any;
18
12
  };
19
- events: {
20
- selected: CustomEvent<any>;
21
- issue: CustomEvent<any>;
22
- createRequest: CustomEvent<any>;
23
- } & {
24
- [evt: string]: CustomEvent<any>;
25
- };
26
- slots: {};
27
- exports?: {} | undefined;
28
- bindings?: string | undefined;
29
- };
30
- export type SelectMeltProps = typeof __propDef.props;
31
- export type SelectMeltEvents = typeof __propDef.events;
32
- export type SelectMeltSlots = typeof __propDef.slots;
33
- export default class SelectMelt extends SvelteComponent<SelectMeltProps, SelectMeltEvents, SelectMeltSlots> {
13
+ z_$$bindings?: Bindings;
34
14
  }
35
- export {};
15
+ declare const SelectMelt: $$__sveltets_2_IsomorphicComponent<{
16
+ id: string;
17
+ disabled?: boolean;
18
+ placeholder?: string;
19
+ items?: BaseItem[];
20
+ focus?: boolean;
21
+ loadOptions?: ((str: string) => Promise<{
22
+ items: BaseItem[];
23
+ totalCount: number;
24
+ }>) | undefined;
25
+ value?: string | undefined;
26
+ clearable?: boolean;
27
+ createOptionWhenNoResult?: boolean;
28
+ default_select_if_one_item?: boolean;
29
+ }, {
30
+ selected: CustomEvent<any>;
31
+ issue: CustomEvent<any>;
32
+ createRequest: CustomEvent<any>;
33
+ } & {
34
+ [evt: string]: CustomEvent<any>;
35
+ }, {}, {}, string>;
36
+ type SelectMelt = InstanceType<typeof SelectMelt>;
37
+ export default SelectMelt;
@@ -1,37 +1,43 @@
1
- <script>import { createEventDispatcher } from "svelte";
2
- import Icon from "../../../ui/Icon.svelte";
3
- export let id;
4
- export let disabled = false;
5
- export let placeholder = "";
6
- export let items = [];
7
- export let value = void 0;
8
- const dispatch = createEventDispatcher();
9
- function dispatchSelected(_data) {
10
- dispatch("selected", _data);
11
- }
1
+ <script lang="ts">
2
+ import { createEventDispatcher } from 'svelte'
3
+
4
+ import type { BaseItem } from '../../../'
5
+ import Icon from '../../../ui/Icon.svelte'
6
+
7
+ export let id: string
8
+ export let disabled: boolean = false
9
+ export let placeholder: string = ''
10
+ export let items: BaseItem[] = []
11
+ export let value: string | number | undefined = undefined
12
+
13
+ const dispatch = createEventDispatcher()
14
+
15
+ function dispatchSelected(_data: BaseItem | undefined) {
16
+ dispatch('selected', _data)
17
+ }
12
18
  </script>
13
19
 
14
20
  <div {id} class="input input-bordered flex w-fit min-w-0 items-center">
15
- <div class="-mx-2 flex gap-2" title={placeholder}>
16
- {#each items as item}
17
- <button
18
- {disabled}
19
- on:click={() => {
20
- value = item.id
21
- dispatchSelected(items.find((i) => i.id === item.id))
22
- }}
23
- type="button"
24
- class="min-w-0 cursor-pointer rounded-md px-1.5 py-1 {value === item.id
25
- ? 'bg-primary text-primary-content'
26
- : ''}"
27
- >
28
- <div class="flex gap-2">
29
- {#if item.icon}
30
- <Icon {...item.icon} />
31
- {/if}
32
- {item.caption}
33
- </div>
34
- </button>
35
- {/each}
36
- </div>
21
+ <div class="-mx-2 flex gap-2" title={placeholder}>
22
+ {#each items as item}
23
+ <button
24
+ {disabled}
25
+ on:click={() => {
26
+ value = item.id
27
+ dispatchSelected(items.find((i) => i.id === item.id))
28
+ }}
29
+ type="button"
30
+ class="min-w-0 cursor-pointer rounded-md px-1.5 py-1 {value === item.id
31
+ ? 'bg-primary text-primary-content'
32
+ : ''}"
33
+ >
34
+ <div class="flex gap-2">
35
+ {#if item.icon}
36
+ <Icon {...item.icon} />
37
+ {/if}
38
+ {item.caption}
39
+ </div>
40
+ </button>
41
+ {/each}
42
+ </div>
37
43
  </div>