Preselect options from the value key in selects.json (#2953)

This commit is contained in:
Paweł Kuna authored and GitHub committed 2026-09-05 14:54:16 +02:00
1 parent 632b69f5e4
commit b3e873a0f7
3 files changed
+17 -5

No files matched your search

@@ -0,0 +1,5 @@
---
"@tabler/preview": patch
---
Fixed the `value` key in `selects.json` not preselecting options in the demo selects on the modals and form elements pages.
+11 -4
View File
@@ -36,6 +36,12 @@ const data = (selects as Record<string, any>)[key] ?? {};
const isMultiple = Boolean(data.multiple); const isMultiple = Boolean(data.multiple);
// `value` in selects.json marks the preselected option(s): a string/number or an array of them.
const preselected = new Set<string>(
(Array.isArray(data.value) ? data.value : data.value === undefined ? [] : [data.value]).map(String),
);
const isSelected = (value: string) => preselected.has(value);
// Build the option list. // Build the option list.
let options: SelectOption[] = []; let options: SelectOption[] = [];
let optgroups: SelectOptgroup[] = []; let optgroups: SelectOptgroup[] = [];
@@ -50,22 +56,23 @@ if (values) {
? `<span class="avatar avatar-xs" style="background-image: url(./${person.photo})"></span>` ? `<span class="avatar avatar-xs" style="background-image: url(./${person.photo})"></span>`
: `<span class="avatar avatar-xs">${firstLetters(person.full_name ?? '')}</span>`; : `<span class="avatar avatar-xs">${firstLetters(person.full_name ?? '')}</span>`;
} }
return { value: String(person.id), text: person.full_name ?? '', custom }; const value = String(person.id);
return { value, text: person.full_name ?? '', custom, selected: isSelected(value) };
}); });
} else if (data.data === 'optgroup') { } else if (data.data === 'optgroup') {
optgroups = (data.options as { title: string; options: string[] }[]).map((group) => ({ optgroups = (data.options as { title: string; options: string[] }[]).map((group) => ({
label: group.title, label: group.title,
options: group.options.map((option) => ({ value: option, text: option })), options: group.options.map((option) => ({ value: option, text: option, selected: isSelected(option) })),
})); }));
} else if (Array.isArray(data.options)) { } else if (Array.isArray(data.options)) {
options = (data.options as string[]).map((option) => ({ value: option, text: option })); options = (data.options as string[]).map((option) => ({ value: option, text: option, selected: isSelected(option) }));
} else if (data.options) { } else if (data.options) {
// object of { key: { name, flag?, label?, selected? } } — with optional indicator // object of { key: { name, flag?, label?, selected? } } — with optional indicator
options = Object.entries(data.options as Record<string, any>).map(([optKey, v]) => { options = Object.entries(data.options as Record<string, any>).map(([optKey, v]) => {
let custom: string | undefined; let custom: string | undefined;
if (indicator === 'flag') custom = `<span class="flag flag-xs flag-country-${v.flag}"></span>`; if (indicator === 'flag') custom = `<span class="flag flag-xs flag-country-${v.flag}"></span>`;
else if (indicator === 'label') custom = `<span class="badge bg-primary-lt">${v.label}</span>`; else if (indicator === 'label') custom = `<span class="badge bg-primary-lt">${v.label}</span>`;
return { value: optKey, text: v.name, custom, selected: Boolean(v.selected) }; return { value: optKey, text: v.name, custom, selected: Boolean(v.selected) || isSelected(optKey) };
}); });
} }
--- ---
+1 -1
View File
@@ -42,7 +42,7 @@ const selectId = `select-${id}`;
optgroups.map((group) => ( optgroups.map((group) => (
<optgroup label={group.label}> <optgroup label={group.label}>
{group.options.map((option) => ( {group.options.map((option) => (
<option value={option.value}>{option.text}</option> <option value={option.value} selected={option.selected || undefined}>{option.text}</option>
))} ))}
</optgroup> </optgroup>
)) ))