|
| 1 | +<script setup lang="ts"> |
| 2 | +import { laboratoryService } from "~/services"; |
| 3 | +
|
| 4 | +const emit = defineEmits<{ |
| 5 | + ( |
| 6 | + e: "select", |
| 7 | + lab: { id: string; name: string; room: string; branch: string } |
| 8 | + ): void; |
| 9 | +}>(); |
| 10 | +
|
| 11 | +const isLoading = ref(true); |
| 12 | +const labs = ref< |
| 13 | + Array<{ id: string; name: string; room: string; branch: string }> |
| 14 | +>([]); |
| 15 | +const selectedLabId = ref(""); |
| 16 | +const error = ref(""); |
| 17 | +
|
| 18 | +onMounted(async () => { |
| 19 | + try { |
| 20 | + const response = await laboratoryService.getLabsManagedByAdmin(0, 500, {}); |
| 21 | + labs.value = response.labs; |
| 22 | + } catch (err: any) { |
| 23 | + error.value = err.data?.message || "Failed to load laboratories"; |
| 24 | + } finally { |
| 25 | + isLoading.value = false; |
| 26 | + } |
| 27 | +}); |
| 28 | +
|
| 29 | +function handleSelect() { |
| 30 | + const selectedLab = labs.value.find((lab) => lab.id === selectedLabId.value); |
| 31 | + if (selectedLab) { |
| 32 | + emit("select", selectedLab); |
| 33 | + } |
| 34 | +} |
| 35 | +</script> |
| 36 | + |
| 37 | +<template> |
| 38 | + <div class="space-y-4"> |
| 39 | + <div v-if="isLoading" class="text-center py-4"> |
| 40 | + <div |
| 41 | + class="inline-block w-6 h-6 border-2 border-tertiary-darker border-t-transparent rounded-full animate-spin" |
| 42 | + ></div> |
| 43 | + <p class="mt-2 text-sm text-gray-500">Loading laboratories...</p> |
| 44 | + </div> |
| 45 | + |
| 46 | + <div v-else-if="error" class="text-center text-red-600"> |
| 47 | + {{ error }} |
| 48 | + </div> |
| 49 | + |
| 50 | + <div v-else-if="labs.length === 0" class="text-center text-gray-500"> |
| 51 | + No laboratories available. |
| 52 | + </div> |
| 53 | + |
| 54 | + <div v-else class="space-y-4"> |
| 55 | + <div class="space-y-2"> |
| 56 | + <Select v-model="selectedLabId"> |
| 57 | + <SelectTrigger id="lab-select" :disabled="isLoading"> |
| 58 | + <SelectValue placeholder="Select a laboratory" /> |
| 59 | + </SelectTrigger> |
| 60 | + <SelectContent> |
| 61 | + <div v-if="isLoading" class="flex items-center justify-center p-2"> |
| 62 | + <div |
| 63 | + class="w-4 h-4 border-2 border-gray-300 border-t-primary rounded-full animate-spin" |
| 64 | + ></div> |
| 65 | + </div> |
| 66 | + <SelectItem v-for="lab in labs" :key="lab.id" :value="lab.id"> |
| 67 | + {{ lab.room }}, {{ lab.branch }} |
| 68 | + </SelectItem> |
| 69 | + </SelectContent> |
| 70 | + </Select> |
| 71 | + </div> |
| 72 | + |
| 73 | + <Button |
| 74 | + :disabled="!selectedLabId" |
| 75 | + @click="handleSelect" |
| 76 | + class="w-full bg-tertiary-dark hover:bg-tertiary-darker" |
| 77 | + > |
| 78 | + Confirm Selection |
| 79 | + </Button> |
| 80 | + </div> |
| 81 | + </div> |
| 82 | +</template> |
0 commit comments