|
|
@@ -0,0 +1,165 @@
|
|
|
+<template>
|
|
|
+ <div class="col-12">
|
|
|
+ <div class="text-h6 q-mb-md">{{ $t('provider_services_types.header') }}</div>
|
|
|
+
|
|
|
+ <div class="row items-center col-12">
|
|
|
+ <ServiceTypeSelect
|
|
|
+ v-model="selectedServiceType"
|
|
|
+ :label="$t('provider_services_types.select_placeholder')"
|
|
|
+ :disable="!providerId || loading"
|
|
|
+ :exclude-ids="excludedServiceTypeIds"
|
|
|
+ class="col-md-6 col-12 q-pb-none q-mr-sm"
|
|
|
+ />
|
|
|
+
|
|
|
+ <div class="col-auto">
|
|
|
+ <q-btn
|
|
|
+ color="primary"
|
|
|
+ :label="$t('provider_services_types.add_button')"
|
|
|
+ :disable="!selectedServiceType || loading"
|
|
|
+ :loading="adding"
|
|
|
+ padding="16px 16px"
|
|
|
+ @click="handleAdd"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-if="loading" class="q-mt-md text-center">
|
|
|
+ <q-spinner color="primary" size="40px" />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-else-if="providerServiceTypes.length > 0" class="q-mt-md q-gutter-sm">
|
|
|
+ <q-chip
|
|
|
+ v-for="item in providerServiceTypes"
|
|
|
+ :key="item.id"
|
|
|
+ removable
|
|
|
+ color="primary"
|
|
|
+ text-color="white"
|
|
|
+ @remove="handleRemove(item)"
|
|
|
+ >
|
|
|
+ {{ item.service_type?.description || '-' }}
|
|
|
+ </q-chip>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-else class="q-mt-md text-grey-7 text-center">
|
|
|
+ {{ $t('provider_services_types.empty_state') }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref, computed, watch, onMounted } from 'vue'
|
|
|
+import { useQuasar } from 'quasar'
|
|
|
+import { useI18n } from 'vue-i18n'
|
|
|
+import ServiceTypeSelect from 'src/components/serviceType/ServiceTypeSelect.vue'
|
|
|
+import {
|
|
|
+ getProviderServiceTypes,
|
|
|
+ createProviderServiceType,
|
|
|
+ deleteProviderServiceType
|
|
|
+} from 'src/api/providerServicesType.js'
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ providerId: {
|
|
|
+ type: Number,
|
|
|
+ default: null
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const $q = useQuasar()
|
|
|
+const { t } = useI18n()
|
|
|
+
|
|
|
+const providerServiceTypes = ref([])
|
|
|
+const selectedServiceType = ref(null)
|
|
|
+const loading = ref(false)
|
|
|
+const adding = ref(false)
|
|
|
+
|
|
|
+const excludedServiceTypeIds = computed(() => {
|
|
|
+ return providerServiceTypes.value.map(item => item.service_type_id)
|
|
|
+})
|
|
|
+
|
|
|
+const loadProviderServiceTypes = async () => {
|
|
|
+ if (!props.providerId) {
|
|
|
+ providerServiceTypes.value = []
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ loading.value = true
|
|
|
+ const response = await getProviderServiceTypes(props.providerId)
|
|
|
+ console.log(response)
|
|
|
+ providerServiceTypes.value = response.payload || []
|
|
|
+ } catch (error) {
|
|
|
+ console.error('Error loading provider service types:', error)
|
|
|
+ $q.notify({
|
|
|
+ type: 'negative',
|
|
|
+ message: error.response?.data?.message || t('http.errors.failed')
|
|
|
+ })
|
|
|
+ } finally {
|
|
|
+ loading.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const handleAdd = async () => {
|
|
|
+ if (!selectedServiceType.value) return
|
|
|
+
|
|
|
+ try {
|
|
|
+ adding.value = true
|
|
|
+ await createProviderServiceType(props.providerId, {
|
|
|
+ service_type_id: selectedServiceType.value.value
|
|
|
+ })
|
|
|
+
|
|
|
+ $q.notify({
|
|
|
+ type: 'positive',
|
|
|
+ message: t('http.success')
|
|
|
+ })
|
|
|
+
|
|
|
+ selectedServiceType.value = null
|
|
|
+ await loadProviderServiceTypes()
|
|
|
+ } catch (error) {
|
|
|
+ console.error('Error adding service type:', error)
|
|
|
+ $q.notify({
|
|
|
+ type: 'negative',
|
|
|
+ message: error.response?.data?.message || t('http.errors.failed')
|
|
|
+ })
|
|
|
+ } finally {
|
|
|
+ adding.value = false
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const handleRemove = async (item) => {
|
|
|
+ $q.dialog({
|
|
|
+ title: t('common.messages.confirm'),
|
|
|
+ message: t('provider_services_types.remove_confirm'),
|
|
|
+ cancel: true,
|
|
|
+ persistent: true
|
|
|
+ }).onOk(async () => {
|
|
|
+ try {
|
|
|
+ await deleteProviderServiceType(props.providerId, item.id)
|
|
|
+
|
|
|
+ $q.notify({
|
|
|
+ type: 'positive',
|
|
|
+ message: t('common.messages.deleted_successfully')
|
|
|
+ })
|
|
|
+
|
|
|
+ await loadProviderServiceTypes()
|
|
|
+ } catch (error) {
|
|
|
+ console.error('Error removing service type:', error)
|
|
|
+ $q.notify({
|
|
|
+ type: 'negative',
|
|
|
+ message: error.response?.data?.message || t('common.messages.error_deleting')
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+watch(() => props.providerId, () => {
|
|
|
+ loadProviderServiceTypes()
|
|
|
+}, { immediate: true })
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ loadProviderServiceTypes()
|
|
|
+})
|
|
|
+
|
|
|
+defineExpose({
|
|
|
+ loadProviderServiceTypes
|
|
|
+})
|
|
|
+</script>
|