PartnerAgreementServiceSelect.vue 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <template>
  2. <DefaultSelect
  3. v-model="selectedService"
  4. v-bind="$attrs"
  5. :options="serviceOptions"
  6. :label
  7. :loading
  8. :placeholder
  9. :disable="!partnerAgreementId"
  10. >
  11. <template #no-option>
  12. <q-item>
  13. <q-item-section class="text-grey">
  14. {{ $t("http.errors.no_records_found") }}
  15. </q-item-section>
  16. </q-item>
  17. </template>
  18. </DefaultSelect>
  19. </template>
  20. <script setup>
  21. import { ref, watch } from "vue";
  22. import { getServicesByPartner } from "src/api/partnerAgreementService";
  23. import { useI18n } from "vue-i18n";
  24. import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
  25. const { label, placeholder, partnerAgreementId } = defineProps({
  26. label: {
  27. type: String,
  28. default: () => useI18n().t("associado.service"),
  29. },
  30. placeholder: {
  31. type: String,
  32. default: () => useI18n().t("common.actions.search"),
  33. },
  34. partnerAgreementId: {
  35. type: Number,
  36. default: null,
  37. },
  38. });
  39. const selectedService = defineModel({ type: Object });
  40. const loading = ref(false);
  41. const serviceOptions = ref([]);
  42. watch(
  43. () => partnerAgreementId,
  44. async (id) => {
  45. const savedSelection = selectedService.value;
  46. selectedService.value = null;
  47. serviceOptions.value = [];
  48. if (!id) return;
  49. loading.value = true;
  50. try {
  51. const services = await getServicesByPartner(id);
  52. serviceOptions.value = services.map((s) => ({
  53. label: s.name,
  54. value: s.id,
  55. data: s,
  56. }));
  57. if (savedSelection?.value) {
  58. const match = serviceOptions.value.find((s) => s.value === savedSelection.value);
  59. if (match) selectedService.value = match;
  60. }
  61. } catch (e) {
  62. console.error(e);
  63. } finally {
  64. loading.value = false;
  65. }
  66. },
  67. { immediate: true },
  68. );
  69. </script>