@placeholderco/placeholder-ui 1.0.12 → 2.0.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.
- package/LICENSE +1 -1
- package/README.md +134 -130
- package/dist/app.css +178 -0
- package/dist/bootstrap.min.css +3600 -0
- package/dist/cards/GitCard.svelte +115 -0
- package/dist/cards/GitCard.svelte.d.ts +22 -0
- package/dist/display/Avatar.svelte +29 -17
- package/dist/display/Avatar.svelte.d.ts +12 -2
- package/dist/display/LinkCollection.svelte +40 -18
- package/dist/display/LinkCollection.svelte.d.ts +9 -2
- package/dist/display/Paper.svelte +31 -19
- package/dist/display/Paper.svelte.d.ts +12 -3
- package/dist/display/alert/Alert.svelte +129 -0
- package/dist/display/alert/Alert.svelte.d.ts +15 -0
- package/dist/display/alert/AlertVariant.d.ts +1 -0
- package/dist/display/alert/AlertVariant.js +1 -0
- package/dist/display/filetree/FileTree.svelte +259 -0
- package/dist/display/filetree/FileTree.svelte.d.ts +76 -0
- package/dist/display/filetree/FileTreeItem.svelte +396 -0
- package/dist/display/filetree/FileTreeItem.svelte.d.ts +40 -0
- package/dist/display/filetree/FileTreeNode.d.ts +46 -0
- package/dist/display/filetree/FileTreeNode.js +115 -0
- package/dist/display/filetree/index.d.ts +5 -0
- package/dist/display/filetree/index.js +3 -0
- package/dist/editors/CodeMirror.svelte +306 -0
- package/dist/editors/CodeMirror.svelte.d.ts +31 -0
- package/dist/editors/tiptap/LinkActionMenu.svelte +307 -0
- package/dist/editors/tiptap/LinkActionMenu.svelte.d.ts +8 -0
- package/dist/editors/tiptap/TipTap.svelte +856 -0
- package/dist/editors/tiptap/TipTap.svelte.d.ts +54 -0
- package/dist/editors/tiptap/TipTapBubble.svelte +790 -0
- package/dist/editors/tiptap/TipTapBubble.svelte.d.ts +44 -0
- package/dist/editors/tiptap/collaboration.d.ts +55 -0
- package/dist/editors/tiptap/collaboration.js +1 -0
- package/dist/editors/tiptap/extensions/Alert.d.ts +18 -0
- package/dist/editors/tiptap/extensions/Alert.js +72 -0
- package/dist/editors/tiptap/extensions/CodeBlockEditor.d.ts +21 -0
- package/dist/editors/tiptap/extensions/CodeBlockEditor.js +326 -0
- package/dist/editors/tiptap/extensions/Div.d.ts +19 -0
- package/dist/editors/tiptap/extensions/Div.js +89 -0
- package/dist/editors/tiptap/extensions/Span.d.ts +5 -0
- package/dist/editors/tiptap/extensions/Span.js +56 -0
- package/dist/editors/tiptap/extensions/codeBlockEditor.css +236 -0
- package/dist/editors/tiptap/extensions/codeBlockLanguages.d.ts +17 -0
- package/dist/editors/tiptap/extensions/codeBlockLanguages.js +124 -0
- package/dist/editors/tiptap/extensions/index.d.ts +7 -0
- package/dist/editors/tiptap/extensions/index.js +5 -0
- package/dist/editors/tiptap/toolbar/AlertButton.svelte +261 -0
- package/dist/editors/tiptap/toolbar/AlertButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignCenterButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignJustifyButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignLeftButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/AlignRightButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/AlignRightButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/BoldButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/BoldButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/BulletListButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/BulletListButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/CodeBlockButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/CodeButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/CodeButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ColorButton.svelte +299 -0
- package/dist/editors/tiptap/toolbar/ColorButton.svelte.d.ts +20 -0
- package/dist/editors/tiptap/toolbar/DocumentButton.svelte +58 -0
- package/dist/editors/tiptap/toolbar/DocumentButton.svelte.d.ts +9 -0
- package/dist/editors/tiptap/toolbar/HeadingButton.svelte +30 -0
- package/dist/editors/tiptap/toolbar/HeadingButton.svelte.d.ts +8 -0
- package/dist/editors/tiptap/toolbar/HtmlButton.svelte +68 -0
- package/dist/editors/tiptap/toolbar/HtmlButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ImageButton.svelte +54 -0
- package/dist/editors/tiptap/toolbar/ImageButton.svelte.d.ts +8 -0
- package/dist/editors/tiptap/toolbar/ItalicButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/ItalicButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/LinkButton.svelte +257 -0
- package/dist/editors/tiptap/toolbar/LinkButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/OrderedListButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/OrderedListButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/RedoButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/RedoButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/StrikethroughButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/SubscriptButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/SubscriptButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/SuperscriptButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/TableButton.svelte +258 -0
- package/dist/editors/tiptap/toolbar/TableButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/ToolbarButton.svelte +84 -0
- package/dist/editors/tiptap/toolbar/ToolbarButton.svelte.d.ts +10 -0
- package/dist/editors/tiptap/toolbar/UnderlineButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/UnderlineButton.svelte.d.ts +7 -0
- package/dist/editors/tiptap/toolbar/UndoButton.svelte +18 -0
- package/dist/editors/tiptap/toolbar/UndoButton.svelte.d.ts +7 -0
- package/dist/form/Autocomplete.svelte +86 -135
- package/dist/form/Autocomplete.svelte.d.ts +6 -8
- package/dist/form/AutocompleteMulti.svelte +385 -227
- package/dist/form/AutocompleteMulti.svelte.d.ts +59 -10
- package/dist/form/Checkbox.svelte +59 -54
- package/dist/form/Checkbox.svelte.d.ts +14 -5
- package/dist/form/Chips.svelte +29 -13
- package/dist/form/Chips.svelte.d.ts +16 -2
- package/dist/form/ComboBox.svelte +30 -20
- package/dist/form/ComboBox.svelte.d.ts +1 -1
- package/dist/form/ComboBoxItemBuilder.svelte +161 -188
- package/dist/form/ComboBoxItemBuilder.svelte.d.ts +19 -2
- package/dist/form/ComboBoxMulti.svelte +38 -24
- package/dist/form/ComboBoxMulti.svelte.d.ts +1 -1
- package/dist/form/CronBuilder.svelte +84 -67
- package/dist/form/CronBuilder.svelte.d.ts +16 -3
- package/dist/form/DatePicker.svelte +148 -195
- package/dist/form/DateRangePicker.svelte +101 -98
- package/dist/form/DateTimePicker.svelte +167 -208
- package/dist/form/DateTimePicker.svelte.d.ts +10 -2
- package/dist/form/FormGroup.svelte +33 -10
- package/dist/form/FormGroup.svelte.d.ts +12 -2
- package/dist/form/Number.svelte +70 -47
- package/dist/form/Number.svelte.d.ts +36 -6
- package/dist/form/Radio.svelte +18 -18
- package/dist/form/RadioGroup.svelte +23 -12
- package/dist/form/RadioGroup.svelte.d.ts +13 -2
- package/dist/form/SegmentedControl.svelte +76 -56
- package/dist/form/SegmentedControl.svelte.d.ts +9 -4
- package/dist/form/Select.svelte +150 -233
- package/dist/form/Select.svelte.d.ts +29 -5
- package/dist/form/SelectMulti.svelte +163 -277
- package/dist/form/SelectMulti.svelte.d.ts +36 -7
- package/dist/form/Slider.svelte +183 -269
- package/dist/form/Slider.svelte.d.ts +32 -17
- package/dist/form/StringArrayBuilder.svelte +249 -0
- package/dist/form/StringArrayBuilder.svelte.d.ts +15 -0
- package/dist/form/Switch.svelte +164 -106
- package/dist/form/Switch.svelte.d.ts +22 -3
- package/dist/form/TextArea.svelte +49 -29
- package/dist/form/TextArea.svelte.d.ts +23 -3
- package/dist/form/Textbox.svelte +69 -68
- package/dist/form/Textbox.svelte.d.ts +32 -4
- package/dist/form/TimePicker.svelte +42 -47
- package/dist/form/TimePicker.svelte.d.ts +12 -2
- package/dist/form/comboBoxCore.svelte.d.ts +99 -0
- package/dist/form/comboBoxCore.svelte.js +243 -0
- package/dist/icon/Icon.svelte +8 -3
- package/dist/icon/Icon.svelte.d.ts +8 -3
- package/dist/icon/file-type-bmp.svg +1 -0
- package/dist/icon/file-type-csv.svg +1 -0
- package/dist/icon/file-type-doc.svg +1 -0
- package/dist/icon/file-type-docx.svg +1 -0
- package/dist/icon/file-type-jpg.svg +1 -0
- package/dist/icon/file-type-pdf.svg +1 -0
- package/dist/icon/file-type-png.svg +1 -0
- package/dist/icon/file-type-ppt.svg +1 -0
- package/dist/icon/file-type-svg.svg +1 -0
- package/dist/icon/file-type-txt.svg +1 -0
- package/dist/icon/file-type-xls.svg +1 -0
- package/dist/icon/file-type-zip.svg +1 -0
- package/dist/icon/index.d.ts +166 -151
- package/dist/icon/index.js +166 -152
- package/dist/icon/logo-placeholder.svg +6 -0
- package/dist/icon/source-code.svg +1 -0
- package/dist/icon/sun-moon.svg +1 -0
- package/dist/icon/table.svg +6 -0
- package/dist/index.d.ts +87 -26
- package/dist/index.js +25 -28
- package/dist/layout/AppShell.svelte +12 -162
- package/dist/layout/AppShell.svelte.d.ts +6 -27
- package/dist/layout/CustomNavbar.svelte +9 -7
- package/dist/layout/CustomNavbar.svelte.d.ts +4 -2
- package/dist/layout/Navbar.svelte +161 -129
- package/dist/layout/Navbar.svelte.d.ts +29 -15
- package/dist/layout/NavbarItemDisplay.svelte +2 -2
- package/dist/layout/NavbarItemView.svelte +182 -0
- package/dist/layout/NavbarItemView.svelte.d.ts +10 -0
- package/dist/layout/Sidenav.svelte +280 -341
- package/dist/layout/Sidenav.svelte.d.ts +36 -4
- package/dist/models/ComboBoxItem.d.ts +2 -0
- package/dist/models/Employee.d.ts +53 -0
- package/dist/models/Employee.js +23 -0
- package/dist/models/Hyperlink.d.ts +3 -1
- package/dist/models/LinkCollectionItem.d.ts +3 -1
- package/dist/models/NavbarItem.d.ts +6 -2
- package/dist/theme.svelte.d.ts +0 -1
- package/dist/theme.svelte.js +46 -58
- package/dist/ui/Accordion.svelte +81 -242
- package/dist/ui/Accordion.svelte.d.ts +37 -14
- package/dist/ui/AccordionItem.svelte +303 -0
- package/dist/ui/AccordionItem.svelte.d.ts +21 -0
- package/dist/ui/ActionIcon.svelte +25 -21
- package/dist/ui/ActionIcon.svelte.d.ts +15 -2
- package/dist/ui/Badge.svelte +163 -171
- package/dist/ui/Badge.svelte.d.ts +13 -5
- package/dist/ui/Button.svelte +178 -205
- package/dist/ui/Button.svelte.d.ts +19 -2
- package/dist/ui/ButtonVariant.d.ts +15 -1
- package/dist/ui/ContextMenu.svelte +146 -0
- package/dist/ui/ContextMenu.svelte.d.ts +37 -0
- package/dist/ui/ContextMenuList.svelte +188 -0
- package/dist/ui/ContextMenuList.svelte.d.ts +12 -0
- package/dist/ui/Dialog.svelte +183 -111
- package/dist/ui/Dialog.svelte.d.ts +21 -4
- package/dist/ui/Drawer.svelte +237 -184
- package/dist/ui/Drawer.svelte.d.ts +20 -2
- package/dist/ui/Dropdown.svelte +24 -14
- package/dist/ui/Dropdown.svelte.d.ts +11 -2
- package/dist/ui/Dropzone.svelte +159 -57
- package/dist/ui/Dropzone.svelte.d.ts +29 -2
- package/dist/ui/Link.svelte +12 -4
- package/dist/ui/Link.svelte.d.ts +8 -2
- package/dist/ui/Loader.svelte +23 -18
- package/dist/ui/Loader.svelte.d.ts +5 -2
- package/dist/ui/Logo.svelte +37 -0
- package/dist/ui/Logo.svelte.d.ts +16 -0
- package/dist/ui/MultiSortable.svelte +287 -0
- package/dist/ui/MultiSortable.svelte.d.ts +50 -0
- package/dist/ui/Pagination.svelte +15 -9
- package/dist/ui/Pagination.svelte.d.ts +6 -2
- package/dist/ui/Popover.svelte +43 -65
- package/dist/ui/Popover.svelte.d.ts +14 -5
- package/dist/ui/ProgressBar.svelte +28 -30
- package/dist/ui/ProgressBarVariant.d.ts +7 -1
- package/dist/ui/SegmentedControl.svelte +0 -0
- package/dist/ui/SegmentedControl.svelte.d.ts +26 -0
- package/dist/ui/Sortable.svelte +163 -0
- package/dist/ui/Sortable.svelte.d.ts +47 -0
- package/dist/ui/Table.svelte +383 -80
- package/dist/ui/Table.svelte.d.ts +43 -2
- package/dist/ui/Tabs.svelte +22 -18
- package/dist/ui/Tabs.svelte.d.ts +6 -2
- package/dist/ui/ThemeSwitcher.svelte +26 -7
- package/dist/ui/ThemeSwitcher.svelte.d.ts +4 -2
- package/dist/ui/Tooltip.svelte +312 -180
- package/dist/ui/Tooltip.svelte.d.ts +4 -3
- package/dist/uiTheme.svelte.d.ts +86 -0
- package/dist/uiTheme.svelte.js +214 -0
- package/dist/util/DateFunctions.js +1 -1
- package/dist/util/DragDrop.d.ts +50 -0
- package/dist/util/DragDrop.js +154 -0
- package/dist/util/NavigateTo.js +2 -2
- package/dist/util/dayjs.d.ts +4 -0
- package/dist/util/dayjs.js +15 -0
- package/package.json +66 -26
- package/dist/display/Alert.svelte +0 -179
- package/dist/display/Alert.svelte.d.ts +0 -13
- package/dist/form/FileInput.svelte +0 -235
- package/dist/form/FileInput.svelte.d.ts +0 -23
- package/dist/form/PasswordInput.svelte +0 -253
- package/dist/form/PasswordInput.svelte.d.ts +0 -34
- package/dist/form/Rating.svelte +0 -235
- package/dist/form/Rating.svelte.d.ts +0 -21
- package/dist/styles/components.css +0 -199
- package/dist/styles/dark.css +0 -146
- package/dist/styles/index.css +0 -116
- package/dist/styles/reset.css +0 -110
- package/dist/styles/semantic.css +0 -86
- package/dist/styles/tokens.css +0 -203
- package/dist/styles/utilities.css +0 -523
- package/dist/ui/Breadcrumbs.svelte +0 -131
- package/dist/ui/Breadcrumbs.svelte.d.ts +0 -16
- package/dist/ui/LoadingOverlay.svelte +0 -53
- package/dist/ui/LoadingOverlay.svelte.d.ts +0 -11
- package/dist/ui/Progress.svelte +0 -191
- package/dist/ui/Progress.svelte.d.ts +0 -15
- package/dist/ui/RingProgress.svelte +0 -141
- package/dist/ui/RingProgress.svelte.d.ts +0 -18
- package/dist/ui/Skeleton.svelte +0 -85
- package/dist/ui/Skeleton.svelte.d.ts +0 -12
- package/dist/ui/Stepper.svelte +0 -355
- package/dist/ui/Stepper.svelte.d.ts +0 -24
- package/dist/ui/Timeline.svelte +0 -225
- package/dist/ui/Timeline.svelte.d.ts +0 -23
- /package/dist/{actions → util}/ClickOutside.d.ts +0 -0
- /package/dist/{actions → util}/ClickOutside.js +0 -0
- /package/dist/{transitions → util}/Transitions.d.ts +0 -0
- /package/dist/{transitions → util}/Transitions.js +0 -0
|
@@ -39,6 +39,10 @@
|
|
|
39
39
|
hideNoResults?: boolean;
|
|
40
40
|
/** Prevent updating value when an option is selected */
|
|
41
41
|
preventChangeOnSelection?: boolean;
|
|
42
|
+
/** Allow suggesting a new value be added when the input doesn't match an existing option */
|
|
43
|
+
allowAdd?: boolean;
|
|
44
|
+
/** Builds the label shown for the "add new value" suggestion (default: `Add "<value>"`) */
|
|
45
|
+
addItemLabel?: (value: string) => string;
|
|
42
46
|
/** Text shown while loading options */
|
|
43
47
|
loadingText?: string;
|
|
44
48
|
/** CSS classes for the FormGroup wrapper */
|
|
@@ -69,23 +73,17 @@
|
|
|
69
73
|
onSelect?: (e: ComboBoxItem) => void;
|
|
70
74
|
/** Callback when selection changes (returns full item object) */
|
|
71
75
|
onchangeRaw?: (e: ComboBoxItem | undefined) => void;
|
|
72
|
-
/**
|
|
73
|
-
|
|
74
|
-
/** Show a "no results" message when no options match */
|
|
75
|
-
showNoResultsMessage?: boolean;
|
|
76
|
-
/** Show required indicator (alias for required) */
|
|
77
|
-
showRequired?: boolean;
|
|
78
|
-
/** Callback when a new option is created (requires allowCreate) */
|
|
79
|
-
onCreate?: (value: string) => void;
|
|
76
|
+
/** Callback when the user chooses to add the typed value as a new item */
|
|
77
|
+
onItemAdded?: (value: string) => void;
|
|
80
78
|
}
|
|
81
79
|
</script>
|
|
82
80
|
|
|
83
81
|
<script lang="ts">
|
|
84
82
|
import ComboBoxMulti from './ComboBoxMulti.svelte';
|
|
85
|
-
import { clickOutside } from '../
|
|
83
|
+
import { clickOutside } from '../util/ClickOutside.js';
|
|
86
84
|
import Textbox from './Textbox.svelte';
|
|
87
|
-
import
|
|
88
|
-
import {
|
|
85
|
+
import { ComboBoxCore, findItemByValue } from './comboBoxCore.svelte.js';
|
|
86
|
+
import { tick } from 'svelte';
|
|
89
87
|
import { useDialogEvents } from '../ui/DialogEvents.svelte.js';
|
|
90
88
|
|
|
91
89
|
let {
|
|
@@ -104,6 +102,8 @@
|
|
|
104
102
|
autofocusDialog = false,
|
|
105
103
|
hideNoResults = false,
|
|
106
104
|
preventChangeOnSelection = false,
|
|
105
|
+
allowAdd = false,
|
|
106
|
+
addItemLabel = (v: string) => `Add "${v}"`,
|
|
107
107
|
loadingText = '',
|
|
108
108
|
groupClass = '',
|
|
109
109
|
leftIconSvg,
|
|
@@ -119,40 +119,51 @@
|
|
|
119
119
|
enterPressed = undefined,
|
|
120
120
|
onSelect = undefined,
|
|
121
121
|
onchangeRaw = undefined,
|
|
122
|
-
|
|
123
|
-
showNoResultsMessage = false,
|
|
124
|
-
showRequired = false,
|
|
125
|
-
onCreate = undefined
|
|
122
|
+
onItemAdded = undefined
|
|
126
123
|
}: AutocompleteProps = $props();
|
|
127
124
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
125
|
+
const core = new ComboBoxCore({
|
|
126
|
+
getOptions: () => options,
|
|
127
|
+
getGroupedOptions: () => groupedOptions,
|
|
128
|
+
getValue: () => value,
|
|
129
|
+
setValue: (v) => (value = v ?? ''),
|
|
130
|
+
setRawValue: (r) => (rawValue = r),
|
|
131
|
+
getFetchFunction: () => fetchFunction,
|
|
132
|
+
getSearchFunction: () => searchFunction,
|
|
133
|
+
getRetrieveLabelFunction: () => retrieveLabelFunction,
|
|
134
|
+
clearUnknownStatic: false,
|
|
135
|
+
onOptionsChanged: () => {
|
|
136
|
+
if (value) core.filterLocal(value);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
131
139
|
|
|
132
|
-
|
|
133
|
-
let
|
|
140
|
+
/** Synthetic "add new value" suggestion shown when the typed value matches no option */
|
|
141
|
+
let addOption: ComboBoxItem | undefined = $derived.by(() => {
|
|
142
|
+
const trimmed = value?.trim();
|
|
143
|
+
if (!allowAdd || !trimmed) return undefined;
|
|
144
|
+
|
|
145
|
+
const exists = core.allGroups
|
|
146
|
+
.flatMap((x) => x.items)
|
|
147
|
+
.some(
|
|
148
|
+
(x) =>
|
|
149
|
+
x.label.toLowerCase() === trimmed.toLowerCase() ||
|
|
150
|
+
x.value.toLowerCase() === trimmed.toLowerCase()
|
|
151
|
+
);
|
|
152
|
+
if (exists) return undefined;
|
|
153
|
+
|
|
154
|
+
return { label: addItemLabel(trimmed), value: trimmed, isAddNew: true };
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
/** Groups passed to the dropdown, including the add suggestion when applicable */
|
|
158
|
+
let displayGroups: ComboBoxGroup[] = $derived(
|
|
159
|
+
addOption
|
|
160
|
+
? [...core.filteredGroups, { label: '', items: [addOption], showGroupName: false }]
|
|
161
|
+
: core.filteredGroups
|
|
162
|
+
);
|
|
134
163
|
|
|
135
164
|
let open = $state(false);
|
|
136
165
|
let internalValue = $state(value);
|
|
137
166
|
|
|
138
|
-
onMount(() => {
|
|
139
|
-
if (fetchFunction) {
|
|
140
|
-
preloading = true;
|
|
141
|
-
fetchFunction().then((response: NotifyModel<ComboBoxItem[]>) => {
|
|
142
|
-
convertOptions(response.object!);
|
|
143
|
-
preloadValues();
|
|
144
|
-
preloading = false;
|
|
145
|
-
});
|
|
146
|
-
} else {
|
|
147
|
-
if (groupedOptions.length) {
|
|
148
|
-
convertGroupOptions(groupedOptions);
|
|
149
|
-
} else if (options.length) {
|
|
150
|
-
convertOptions(options);
|
|
151
|
-
}
|
|
152
|
-
preloadValues();
|
|
153
|
-
}
|
|
154
|
-
});
|
|
155
|
-
|
|
156
167
|
useDialogEvents({
|
|
157
168
|
onFirstOpen: () => {
|
|
158
169
|
if (autofocus) {
|
|
@@ -178,76 +189,28 @@
|
|
|
178
189
|
$effect(() => {
|
|
179
190
|
if (value !== internalValue) {
|
|
180
191
|
internalValue = value;
|
|
181
|
-
rawValue =
|
|
182
|
-
allGroups.flatMap((x) => x.items).find((x) => x.value === value) ?? undefined;
|
|
192
|
+
rawValue = findItemByValue(core.allGroups, value);
|
|
183
193
|
onchangeRaw?.(rawValue);
|
|
184
|
-
preloadValues();
|
|
194
|
+
core.preloadValues();
|
|
185
195
|
}
|
|
186
196
|
});
|
|
187
197
|
|
|
188
|
-
function preloadValues() {
|
|
189
|
-
if (!value) {
|
|
190
|
-
rawValue = undefined;
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const foundOption = allGroups.flatMap((x) => x.items).find((x) => x.value === value);
|
|
195
|
-
|
|
196
|
-
if (foundOption !== undefined) {
|
|
197
|
-
rawValue = foundOption;
|
|
198
|
-
} else if (searchFunction && retrieveLabelFunction) {
|
|
199
|
-
preloading = true;
|
|
200
|
-
retrieveLabelFunction(value).then((response) => {
|
|
201
|
-
rawValue = {
|
|
202
|
-
label: response.object ?? value!.toString(),
|
|
203
|
-
value: value!
|
|
204
|
-
};
|
|
205
|
-
preloading = false;
|
|
206
|
-
});
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
function convertOptions(opts: ComboBoxItem[]) {
|
|
211
|
-
const allOptions = opts.map((option) => ({
|
|
212
|
-
...option,
|
|
213
|
-
selected: option.value === value
|
|
214
|
-
}));
|
|
215
|
-
allGroups = [{ label: '', items: [...allOptions] }];
|
|
216
|
-
filteredGroups = [{ label: '', items: [...allOptions] }];
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
function convertGroupOptions(groups: ComboBoxGroup[]) {
|
|
220
|
-
allGroups = groups.map((group) => ({
|
|
221
|
-
...group,
|
|
222
|
-
items: group.items.map((option) => ({
|
|
223
|
-
...option,
|
|
224
|
-
selected: option.value === value,
|
|
225
|
-
groupName: group.label
|
|
226
|
-
}))
|
|
227
|
-
}));
|
|
228
|
-
filteredGroups = [...allGroups];
|
|
229
|
-
}
|
|
230
|
-
|
|
231
198
|
let selectionJustMade = false;
|
|
232
199
|
|
|
233
200
|
function onSelection(selectedValue: ComboBoxItem) {
|
|
234
201
|
selectionJustMade = true;
|
|
235
202
|
open = false;
|
|
236
203
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const created = selectedValue.value;
|
|
240
|
-
value = created;
|
|
241
|
-
internalValue = value;
|
|
242
|
-
rawValue = { value: created, label: created };
|
|
243
|
-
onCreate?.(created);
|
|
244
|
-
onchangeRaw?.(rawValue);
|
|
204
|
+
if (selectedValue.isAddNew) {
|
|
205
|
+
addItem(selectedValue.value);
|
|
245
206
|
return;
|
|
246
207
|
}
|
|
247
208
|
|
|
248
|
-
allGroups
|
|
249
|
-
|
|
250
|
-
|
|
209
|
+
core.allGroups
|
|
210
|
+
.flatMap((x) => x.items)
|
|
211
|
+
.forEach((option) => {
|
|
212
|
+
option.selected = option.value === selectedValue.value;
|
|
213
|
+
});
|
|
251
214
|
|
|
252
215
|
if (!preventChangeOnSelection) {
|
|
253
216
|
value = selectedValue.value;
|
|
@@ -260,48 +223,36 @@
|
|
|
260
223
|
onchangeRaw?.(selectedValue);
|
|
261
224
|
}
|
|
262
225
|
|
|
226
|
+
function addItem(newValue: string) {
|
|
227
|
+
open = false;
|
|
228
|
+
|
|
229
|
+
const newItem: ComboBoxItem = { label: newValue, value: newValue };
|
|
230
|
+
|
|
231
|
+
if (!preventChangeOnSelection) {
|
|
232
|
+
value = newValue;
|
|
233
|
+
internalValue = value;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
rawValue = newItem;
|
|
237
|
+
|
|
238
|
+
onItemAdded?.(newValue);
|
|
239
|
+
onchangeRaw?.(newItem);
|
|
240
|
+
}
|
|
241
|
+
|
|
263
242
|
function onFilterChange(filterValue: string) {
|
|
264
243
|
if (filterValue.length === 0) {
|
|
265
|
-
|
|
244
|
+
core.filterLocal('');
|
|
266
245
|
open = true;
|
|
267
246
|
return;
|
|
268
247
|
}
|
|
269
248
|
|
|
270
249
|
if (searchFunction && filterValue) {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
searchFunction(filterValue).then((response: NotifyModel<ComboBoxItem[]>) => {
|
|
275
|
-
convertOptions(response.object!);
|
|
276
|
-
searching = false;
|
|
277
|
-
open = true;
|
|
278
|
-
});
|
|
279
|
-
}, 300);
|
|
280
|
-
} else if (allGroups.length) {
|
|
281
|
-
filteredGroups = allGroups
|
|
282
|
-
.map((group) => ({
|
|
283
|
-
...group,
|
|
284
|
-
items: group.items.filter((x) =>
|
|
285
|
-
x.label.toLowerCase().includes(filterValue.toLowerCase())
|
|
286
|
-
)
|
|
287
|
-
}))
|
|
288
|
-
.filter((group) => group.items.length > 0);
|
|
250
|
+
core.search(filterValue, () => (open = true));
|
|
251
|
+
} else {
|
|
252
|
+
core.filterLocal(filterValue);
|
|
289
253
|
open = true;
|
|
290
254
|
}
|
|
291
255
|
|
|
292
|
-
if (allowCreate && filterValue) {
|
|
293
|
-
const hasExact = filteredGroups
|
|
294
|
-
.flatMap((g) => g.items)
|
|
295
|
-
.some((x) => x.label.toLowerCase() === filterValue.toLowerCase());
|
|
296
|
-
if (!hasExact) {
|
|
297
|
-
const createItem: ComboBoxItem = { value: filterValue, label: `Create "${filterValue}"` };
|
|
298
|
-
filteredGroups = [
|
|
299
|
-
...filteredGroups,
|
|
300
|
-
{ label: '', items: [createItem] }
|
|
301
|
-
];
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
|
|
305
256
|
onchange?.(filterValue);
|
|
306
257
|
}
|
|
307
258
|
|
|
@@ -345,16 +296,16 @@
|
|
|
345
296
|
{label}
|
|
346
297
|
class={classes}
|
|
347
298
|
{containerClass}
|
|
348
|
-
|
|
299
|
+
{required}
|
|
349
300
|
{showError}
|
|
350
301
|
{errorText}
|
|
351
302
|
{tooltipLocation}
|
|
352
303
|
{tooltipContent}
|
|
353
304
|
{tooltipText}
|
|
354
305
|
bind:textboxElement
|
|
355
|
-
placeholder={preloading ? 'Loading...' : placeholder}
|
|
356
|
-
loading={searching || preloading}
|
|
357
|
-
disabled={preloading || disabled}
|
|
306
|
+
placeholder={core.preloading ? 'Loading...' : placeholder}
|
|
307
|
+
loading={core.searching || core.preloading}
|
|
308
|
+
disabled={core.preloading || disabled}
|
|
358
309
|
autocomplete="off"
|
|
359
310
|
{groupClass}
|
|
360
311
|
{leftIconSvg}
|
|
@@ -371,11 +322,11 @@
|
|
|
371
322
|
bind:this={comboBoxEl}
|
|
372
323
|
filterString={value}
|
|
373
324
|
values={rawValue ? [rawValue] : []}
|
|
374
|
-
|
|
375
|
-
groupedOptions={
|
|
325
|
+
{onSelection}
|
|
326
|
+
groupedOptions={displayGroups}
|
|
376
327
|
{open}
|
|
377
|
-
loading={searching}
|
|
378
|
-
|
|
328
|
+
loading={core.searching}
|
|
329
|
+
{hideNoResults}
|
|
379
330
|
{loadingText}
|
|
380
331
|
/>
|
|
381
332
|
</div>
|
|
@@ -31,6 +31,10 @@ export interface AutocompleteProps {
|
|
|
31
31
|
hideNoResults?: boolean;
|
|
32
32
|
/** Prevent updating value when an option is selected */
|
|
33
33
|
preventChangeOnSelection?: boolean;
|
|
34
|
+
/** Allow suggesting a new value be added when the input doesn't match an existing option */
|
|
35
|
+
allowAdd?: boolean;
|
|
36
|
+
/** Builds the label shown for the "add new value" suggestion (default: `Add "<value>"`) */
|
|
37
|
+
addItemLabel?: (value: string) => string;
|
|
34
38
|
/** Text shown while loading options */
|
|
35
39
|
loadingText?: string;
|
|
36
40
|
/** CSS classes for the FormGroup wrapper */
|
|
@@ -61,14 +65,8 @@ export interface AutocompleteProps {
|
|
|
61
65
|
onSelect?: (e: ComboBoxItem) => void;
|
|
62
66
|
/** Callback when selection changes (returns full item object) */
|
|
63
67
|
onchangeRaw?: (e: ComboBoxItem | undefined) => void;
|
|
64
|
-
/**
|
|
65
|
-
|
|
66
|
-
/** Show a "no results" message when no options match */
|
|
67
|
-
showNoResultsMessage?: boolean;
|
|
68
|
-
/** Show required indicator (alias for required) */
|
|
69
|
-
showRequired?: boolean;
|
|
70
|
-
/** Callback when a new option is created (requires allowCreate) */
|
|
71
|
-
onCreate?: (value: string) => void;
|
|
68
|
+
/** Callback when the user chooses to add the typed value as a new item */
|
|
69
|
+
onItemAdded?: (value: string) => void;
|
|
72
70
|
}
|
|
73
71
|
declare const Autocomplete: import("svelte").Component<AutocompleteProps, {}, "value" | "rawValue">;
|
|
74
72
|
type Autocomplete = ReturnType<typeof Autocomplete>;
|