It is necessary to create a custom Vuetify component (a combination of v-combobox + v-chips)
It should work like a v-combobox, but also support customized chips,
which can be:
- dragged and dropped
- selected (selected true/false)
- chosen from a list (by tags)
I am attaching a video explanation to the technical specification.
You can propose any implementation based on v-combobox or v-text-field or v-input (choose at your discretion).
Draggable library:
vue-draggable-plus (drag and drop components)
https://vue-draggable-plus.pages.dev/en/
https://github.com/Alfred-Skyblue/vue-draggable-plus
Approximate structure (but you can add or change as you wish):
items: [
{ itemText: 'Carrot', tags: ['vegetables', 'orange'], selected: false, id: 1 },
{ itemText: 'Potato', tags: ['vegetables', 'brown'], selected: true, id: 2 },
{ itemText: 'Cucumber', tags: ['vegetables', 'green'], selected: false, id: 4 },
{ itemText: 'Tomato', tags: ['vegetables', 'red'], selected: false, id: 5 },
{ itemText: 'Zucchini', tags: ['vegetables', 'green'], selected: false, id: 6 },
{ itemText: 'Onion', tags: ['vegetables', 'white'], selected: false, id: 7 },
{ itemText: 'Pepper', tags: ['vegetables', 'red'], selected: false, id: 8 },
{ itemText: 'Eggplant', tags: ['vegetables', 'purple'], selected: false, id: 9 },
{ itemText: 'Beet', tags: ['vegetables', 'red'], selected: false, id: 10 },
{ itemText: 'Cabbage', tags: ['vegetables', 'green'], selected: false, id: 11 },
{ itemText: 'Apple', tags: ['fruits', 'red'], selected: false, id: 12 },
{ itemText: 'Banana', tags: ['fruits', 'yellow'], selected: false, id: 13 },
{ itemText: 'Orange', tags: ['fruits', 'orange'], selected: false, id: 14 },
{ itemText: 'Pear', tags: ['fruits', 'green'], selected: false, id: 15 },
{ itemText: 'Grape', tags: ['fruits', 'purple'], selected: false, id: 16 },
{ itemText: 'Lemon', tags: ['fruits', 'yellow'], selected: true, id: 17 },
{ itemText: 'Kiwi', tags: ['fruits', 'brown'], selected: false, id: 18 },
{ itemText: 'Pineapple', tags: ['fruits', 'yellow'], selected: false, id: 19 },
{ itemText: 'Strawberry', tags: ['fruits', 'red'], selected: false, id: 20 },
{ itemText: 'Mango', tags: ['fruits', 'green'], selected: false, id: 21 },
{ itemText: 'Chocolate', tags: ['sweets', 'brown'], selected: false, id: 22 },
{ itemText: 'Marshmallow', tags: ['sweets', 'white'], selected: false, id: 23 },
{ itemText: 'Cake', tags: ['sweets', 'white'], selected: true, id: 24 },
{ itemText: 'Lollipop', tags: ['sweets', 'red'], selected: false, id: 25 },
{ itemText: 'Cookie', tags: ['sweets', 'golden'], selected: false, id: 26 },
{ itemText: 'Marshmallow', tags: ['sweets', 'pink'], selected: true, id: 27 },
{ itemText: 'Waffles', tags: ['sweets', 'beige'], selected: false, id: 28 },
{ itemText: 'Caramel', tags: ['sweets', 'amber'], selected: false, id: 29 },
{ itemText: 'Pastila', tags: ['sweets', 'white'], selected: false, id: 30 },
{ itemText: 'Gingerbread', tags: ['sweets', 'brown'], selected: false, id: 31 }
]
STYLISTIC PROPS FOR V-CHIP:
label (chip shape)
close-icon="mdi-close" (close icon)
filter-icon="mdi-alert-outline" (selected icon)
selected-class="text-warning" (selected style)
closable
filter (to allow selection)
draggable (to allow dragging)
Documentation for components:
https://vuetifyjs.com/en/components/combobox/
https://vuetifyjs.com/en/api/v-combobox/
https://vuetifyjs.com/en/components/text-fields/
https://vuetifyjs.com/en/api/v-text-field/
https://vuetifyjs.com/en/components/inputs/
https://vuetifyjs.com/en/api/v-input/
https://vuetifyjs.com/en/components/chips/
https://vuetifyjs.com/en/api/v-chip/
https://vuetifyjs.com/en/components/chip-groups/
https://vuetifyjs.com/en/api/v-chip-group/