PartnerAgreementServiceSelect.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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, getServicesByConvenio } from "src/api/partnerAgreementService";
  23. import { useI18n } from "vue-i18n";
  24. import DefaultSelect from "src/components/defaults/DefaultSelect.vue";
  25. const { label, placeholder, partnerAgreementId, forAssociado } = 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. forAssociado: {
  39. type: Boolean,
  40. default: false,
  41. },
  42. });
  43. const selectedService = defineModel({ type: Object });
  44. const loading = ref(false);
  45. const serviceOptions = ref([]);
  46. watch(
  47. () => partnerAgreementId,
  48. async (id) => {
  49. const savedSelection = selectedService.value;
  50. selectedService.value = null;
  51. serviceOptions.value = [];
  52. if (!id) return;
  53. loading.value = true;
  54. try {
  55. const services = await (forAssociado ? getServicesByConvenio(id) : getServicesByPartner(id));
  56. serviceOptions.value = services.map((s) => ({
  57. label: s.name,
  58. value: s.id,
  59. data: s,
  60. }));
  61. if (savedSelection?.value) {
  62. const match = serviceOptions.value.find((s) => s.value === savedSelection.value);
  63. if (match) selectedService.value = match;
  64. }
  65. } catch (e) {
  66. console.error(e);
  67. } finally {
  68. loading.value = false;
  69. }
  70. },
  71. { immediate: true },
  72. );
  73. </script>