Make dropdown component usable as heading
This commit is contained in:
parent
eb1d814680
commit
abe60e7468
|
|
@ -9,6 +9,8 @@ interface Props {
|
||||||
items?: DropdownSelectable[];
|
items?: DropdownSelectable[];
|
||||||
borderless?: boolean;
|
borderless?: boolean;
|
||||||
placeholderText?: string | null;
|
placeholderText?: string | null;
|
||||||
|
asHeading?: boolean; // style the dropdown to be used as a page heading
|
||||||
|
typeName?: string; // to display the type of the selected item, e.g. `Circle: Fahrzeug` instead of `Fahrzeug`
|
||||||
}
|
}
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
|
|
@ -24,6 +26,8 @@ const props = withDefaults(defineProps<Props>(), {
|
||||||
},
|
},
|
||||||
items: () => [],
|
items: () => [],
|
||||||
placeholderText: null,
|
placeholderText: null,
|
||||||
|
asHeading: false,
|
||||||
|
typeName: "",
|
||||||
});
|
});
|
||||||
|
|
||||||
const dropdownSelected = computed<DropdownSelectable>({
|
const dropdownSelected = computed<DropdownSelectable>({
|
||||||
|
|
@ -36,26 +40,34 @@ const dropdownSelected = computed<DropdownSelectable>({
|
||||||
<Listbox v-model="dropdownSelected" as="div">
|
<Listbox v-model="dropdownSelected" as="div">
|
||||||
<div class="relative w-full">
|
<div class="relative w-full">
|
||||||
<ListboxButton
|
<ListboxButton
|
||||||
class="relative flex w-full cursor-default flex-row items-center bg-white py-3 pl-5 pr-10 text-left"
|
:class="[
|
||||||
:class="{
|
{
|
||||||
border: !props.borderless,
|
border: !borderless && !asHeading,
|
||||||
'font-bold': !props.borderless,
|
'font-bold': !borderless,
|
||||||
}"
|
},
|
||||||
|
asHeading
|
||||||
|
? 'group flex w-full items-center gap-1 rounded-md bg-transparent px-3 text-base focus:outline-none'
|
||||||
|
: 'relative flex w-full cursor-default flex-row items-center bg-white py-3 pl-5 pr-10 text-left',
|
||||||
|
]"
|
||||||
data-cy="dropdown-select"
|
data-cy="dropdown-select"
|
||||||
>
|
>
|
||||||
<span v-if="dropdownSelected.iconName" class="mr-4">
|
<span v-if="dropdownSelected.iconName" class="mr-4">
|
||||||
<component :is="dropdownSelected.iconName"></component>
|
<component :is="dropdownSelected.iconName"></component>
|
||||||
</span>
|
</span>
|
||||||
<span class="block truncate">
|
<span class="block h-11 truncate text-4xl">
|
||||||
{{ dropdownSelected.name }}
|
{{ typeName }} {{ dropdownSelected.name }}
|
||||||
<span v-if="placeholderText && !dropdownSelected.name" class="text-gray-900">
|
<span v-if="placeholderText && !dropdownSelected.name" class="text-gray-900">
|
||||||
{{ placeholderText }}
|
{{ placeholderText }}
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<span
|
<span
|
||||||
class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"
|
class="pointer-events-none flex items-center pr-2"
|
||||||
|
:class="asHeading ? '' : 'absolute inset-y-0 right-0'"
|
||||||
>
|
>
|
||||||
<it-icon-arrow-down class="h-5 w-5" aria-hidden="true" />
|
<it-icon-arrow-down
|
||||||
|
:class="asHeading ? 'h-12 w-12' : 'h-5 w-5'"
|
||||||
|
aria-hidden="true"
|
||||||
|
/>
|
||||||
</span>
|
</span>
|
||||||
</ListboxButton>
|
</ListboxButton>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,12 @@ const props = defineProps<{
|
||||||
</script>
|
</script>
|
||||||
<template>
|
<template>
|
||||||
<div v-if="expertCockpitStore.circles?.length">
|
<div v-if="expertCockpitStore.circles?.length">
|
||||||
<div v-if="expertCockpitStore.currentCircle" class="container-large">
|
<div v-if="expertCockpitStore.currentCircle" class="container-large pt-10">
|
||||||
<div class="mb-9 flex flex-col lg:flex-row lg:items-center lg:justify-between">
|
<div class="mb-9 flex flex-col lg:flex-row lg:items-center lg:justify-between">
|
||||||
<ItDropdownSelect
|
<ItDropdownSelect
|
||||||
|
:as-heading="true"
|
||||||
:model-value="expertCockpitStore.currentCircle"
|
:model-value="expertCockpitStore.currentCircle"
|
||||||
|
type-name="Circle:"
|
||||||
class="mt-4 w-full lg:mt-0 lg:w-96"
|
class="mt-4 w-full lg:mt-0 lg:w-96"
|
||||||
:items="expertCockpitStore.circles"
|
:items="expertCockpitStore.circles"
|
||||||
@update:model-value="expertCockpitStore.setCurrentCourseCircleFromEvent"
|
@update:model-value="expertCockpitStore.setCurrentCourseCircleFromEvent"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue