154 lines
4.6 KiB
Vue
154 lines
4.6 KiB
Vue
<template>
|
|
<v-card
|
|
class="pa-4 rounded-lg elevation-2 d-flex flex-column ticket-card"
|
|
color="white"
|
|
style="border-top: 8px solid #FFB95F;"
|
|
height="100%"
|
|
>
|
|
<div class="d-flex align-center justify-center mb-4">
|
|
<v-icon size="36" color="orange-lighten-2" class="mr-2">mdi-hospital-box-outline</v-icon>
|
|
<div class="text-h6 font-weight-bold text-orange-lighten-2">{{ title }}</div>
|
|
</div>
|
|
|
|
<v-divider class="mb-4"></v-divider>
|
|
|
|
<div class="timeline-scroll-container flex-grow-1">
|
|
<v-timeline density="compact" align="start" line-inset="12" line-color="#FFB95F">
|
|
<v-timeline-item
|
|
v-for="(step, index) in steps"
|
|
:key="index"
|
|
:dot-color="getStepColor(index)"
|
|
:icon="getStepIcon(index)"
|
|
size="small"
|
|
icon-color="white"
|
|
>
|
|
<div class="d-flex flex-column align-start">
|
|
<span
|
|
class="font-weight-bold"
|
|
:class="index === currentStepIndex ? 'text-orange-lighten-1' : index < currentStepIndex ? 'text-success' : 'text-grey-darken-1'"
|
|
>
|
|
{{ step.label }}
|
|
</span>
|
|
<span class="text-caption text-grey-darken-1">
|
|
{{ step.date !== '-' ? `${step.date}, ${step.time}` : 'Menunggu' }}
|
|
</span>
|
|
</div>
|
|
</v-timeline-item>
|
|
</v-timeline>
|
|
</div>
|
|
|
|
<v-divider class="mt-4 mb-4"></v-divider>
|
|
|
|
<v-btn
|
|
size="large"
|
|
variant="tonal"
|
|
color="#FFA532"
|
|
class="mt-auto font-weight-bold reprint-button"
|
|
prepend-icon="mdi-printer"
|
|
block
|
|
>
|
|
Cetak Ulang Tiket
|
|
</v-btn>
|
|
</v-card>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { computed } from 'vue';
|
|
|
|
const props = defineProps({
|
|
title: String,
|
|
steps: Array,
|
|
color: String,
|
|
currentStepLabel: String,
|
|
});
|
|
|
|
const currentStepIndex = computed(() => {
|
|
return props.steps.findIndex(step => step.label === props.currentStepLabel);
|
|
});
|
|
|
|
const getStepIcon = (index) => {
|
|
if (index < currentStepIndex.value) {
|
|
return 'mdi-check';
|
|
} else if (index === currentStepIndex.value) {
|
|
return 'mdi-progress-check';
|
|
} else {
|
|
return 'mdi-circle-outline';
|
|
}
|
|
};
|
|
|
|
const getStepColor = (index) => {
|
|
if (index < currentStepIndex.value) {
|
|
return 'success';
|
|
} else if (index === currentStepIndex.value) {
|
|
return 'orange-lighten-1';
|
|
}
|
|
return 'grey-lighten-1';
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
/* =============================================== */
|
|
/* SCROLLABLE TIMELINE STYLES (Menggunakan Tinggi Tetap) */
|
|
/* =============================================== */
|
|
.timeline-scroll-container {
|
|
/* Flex grow untuk mengisi ruang yang tersedia */
|
|
flex: 1 1 auto;
|
|
min-height: 200px;
|
|
max-height: 400px;
|
|
|
|
/* Membuat konten scrollable di sumbu Y jika melebihi height */
|
|
overflow-y: auto;
|
|
|
|
/* Memberi jarak internal di bagian scrollable */
|
|
padding-right: 8px;
|
|
}
|
|
|
|
/* PENTING: Menghilangkan padding bawah dari V-Timeline bawaan */
|
|
.v-timeline {
|
|
padding-bottom: 0 !important;
|
|
margin-bottom: 0 !important;
|
|
}
|
|
|
|
/* Kustomisasi scrollbar untuk tampilan yang lebih bersih (Opsional) */
|
|
.timeline-scroll-container::-webkit-scrollbar {
|
|
width: 6px;
|
|
}
|
|
|
|
.timeline-scroll-container::-webkit-scrollbar-thumb {
|
|
background-color: rgba(0, 0, 0, 0.2);
|
|
border-radius: 3px;
|
|
}
|
|
|
|
/* =============================================== */
|
|
/* V-TIMELINE KUSTOMISASI */
|
|
/* =============================================== */
|
|
.v-timeline-item :deep(.v-timeline-item__body) {
|
|
padding-inline-start: 16px !important;
|
|
}
|
|
|
|
.v-timeline-item :deep(.v-timeline-item__opposite) {
|
|
display: none;
|
|
}
|
|
|
|
/* =============================================== */
|
|
/* TICKET CARD - FIXED HEIGHT */
|
|
/* =============================================== */
|
|
.ticket-card {
|
|
min-height: 550px !important;
|
|
display: flex !important;
|
|
flex-direction: column !important;
|
|
}
|
|
|
|
/* =============================================== */
|
|
/* REPRINT BUTTON - FIXED SIZE */
|
|
/* =============================================== */
|
|
.reprint-button {
|
|
min-height: 48px !important;
|
|
height: 48px !important;
|
|
max-height: 48px !important;
|
|
font-size: 14px !important;
|
|
letter-spacing: 0.5px;
|
|
flex-shrink: 0 !important;
|
|
margin-top: auto !important;
|
|
}
|
|
</style> |