PartnerAgreementServiceSelect.vue 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. selectedService.value = null;
  46. serviceOptions.value = [];
  47. if (!id) return;
  48. loading.value = true;
  49. try {
  50. const services = await getServicesByPartner(id);
  51. serviceOptions.value = services.map((s) => ({
  52. label: s.name,
  53. value: s.id,
  54. data: s,
  55. }));
  56. } catch (e) {
  57. console.error(e);
  58. } finally {
  59. loading.value = false;
  60. }
  61. },
  62. { immediate: true },
  63. );
  64. </script>