GroupSelect.vue 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <template>
  2. <DefaultSelect
  3. v-model="selectedGroup"
  4. v-bind="$attrs"
  5. use-input
  6. hide-selected
  7. fill-input
  8. clearable
  9. :options="filteredOptions"
  10. :loading="isLoading"
  11. :label
  12. @filter="filterFn"
  13. >
  14. <template #no-option>
  15. <q-item>
  16. <q-item-section class="text-grey">
  17. Nenhum grupo encontrado
  18. </q-item-section>
  19. </q-item>
  20. </template>
  21. </DefaultSelect>
  22. </template>
  23. <script setup>
  24. import { onMounted, ref } from "vue";
  25. import { getGroupsForSelect } from "src/api/group";
  26. import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
  27. const { label } = defineProps({
  28. label: { type: String, default: "Grupo" },
  29. });
  30. // model value: { label, value, unit_ids } | null
  31. const selectedGroup = defineModel({ type: Object });
  32. const groupOptions = ref([]);
  33. const filteredOptions = ref([]);
  34. const isLoading = ref(true);
  35. const filterFn = (val, update) => {
  36. update(() => {
  37. if (val === "") {
  38. filteredOptions.value = groupOptions.value;
  39. } else {
  40. const needle = val.toLowerCase();
  41. filteredOptions.value = groupOptions.value.filter((v) =>
  42. v.label.toLowerCase().includes(needle),
  43. );
  44. }
  45. });
  46. };
  47. onMounted(async () => {
  48. try {
  49. const response = await getGroupsForSelect();
  50. groupOptions.value = response.map((g) => ({
  51. label: g.name,
  52. value: g.id,
  53. unit_ids: g.unit_ids ?? [],
  54. }));
  55. filteredOptions.value = groupOptions.value;
  56. } catch (error) {
  57. console.error("Failed to load groups:", error);
  58. } finally {
  59. isLoading.value = false;
  60. }
  61. });
  62. </script>