diff --git a/components/checkin/CheckInDialog.vue b/components/checkin/CheckInDialog.vue
index 59d426e..a3de6ff 100644
--- a/components/checkin/CheckInDialog.vue
+++ b/components/checkin/CheckInDialog.vue
@@ -96,7 +96,7 @@
Waktu Scan
-
{{ new Date().toLocaleTimeString('id-ID', { hour: '2-digit', minute: '2-digit' }) }}
+
{{ getCurrentTime() }}
@@ -164,6 +164,16 @@ const handleClose = () => {
emit('close')
emit('update:modelValue', false)
}
+
+const getCurrentTime = () => {
+ // Format jam dengan titik dua (HH:MM:SS)
+ const timeString = new Date().toLocaleTimeString('id-ID', {
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit'
+ })
+ return timeString.replace(/\./g, ':')
+}
\ No newline at end of file
diff --git a/components/features/queue/CurrentPatientCard.vue b/components/features/queue/CurrentPatientCard.vue
index 7cd364f..3a6e34b 100644
--- a/components/features/queue/CurrentPatientCard.vue
+++ b/components/features/queue/CurrentPatientCard.vue
@@ -120,7 +120,20 @@ defineEmits(['action', 'change-klinik', 'process-next', 'call']);
.call-button {
text-transform: none;
font-weight: 600;
+ font-size: 14px;
+ line-height: 20px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ transition: all 0.2s ease;
+}
+
+.call-button:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
+}
+
+.call-button:active {
+ transform: translateY(0);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}
.patient-details {
@@ -142,15 +155,16 @@ defineEmits(['action', 'change-klinik', 'process-next', 'call']);
.patient-number {
font-size: 28px;
- font-weight: 800;
+ line-height: 36px;
+ font-weight: 700;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
color: var(--color-neutral-900);
- line-height: 1;
}
.patient-info-text {
- font-size: 13px;
+ font-size: 14px;
+ line-height: 20px;
color: var(--color-neutral-700);
- line-height: 1.5;
}
.action-grid {
@@ -160,13 +174,58 @@ defineEmits(['action', 'change-klinik', 'process-next', 'call']);
margin-top: 12px;
}
+.action-grid .v-btn {
+ text-transform: none;
+ font-weight: 600;
+ font-size: 16px;
+ line-height: 24px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ transition: all 0.2s ease;
+}
+
+.action-grid .v-btn:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
+}
+
+.action-grid .v-btn:active {
+ transform: translateY(0);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
+.action-grid .v-btn:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ transform: none;
+}
+
.empty-state {
text-align: center;
padding: 32px 16px;
}
+.empty-state .v-btn {
+ text-transform: none;
+ font-weight: 600;
+ font-size: 16px;
+ line-height: 24px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ transition: all 0.2s ease;
+}
+
+.empty-state .v-btn:hover:not(:disabled) {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
+}
+
+.empty-state .v-btn:active:not(:disabled) {
+ transform: translateY(0);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
+}
+
.empty-text {
- font-size: 13px;
+ font-size: 14px;
+ line-height: 20px;
color: var(--color-neutral-600);
margin-top: 8px;
}
@@ -181,8 +240,10 @@ defineEmits(['action', 'change-klinik', 'process-next', 'call']);
.info-text {
font-size: 12px;
+ line-height: 16px;
color: var(--color-neutral-700);
font-weight: 600;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
@media (max-width: 960px) {
diff --git a/components/features/queue/QueueActionsCard.vue b/components/features/queue/QueueActionsCard.vue
index 7482220..a4c7e33 100644
--- a/components/features/queue/QueueActionsCard.vue
+++ b/components/features/queue/QueueActionsCard.vue
@@ -188,8 +188,22 @@ defineEmits(['call']);
.call-buttons .v-btn {
font-size: 16px;
+ line-height: 24px;
font-weight: 700;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
height: 44px;
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+ transition: all 0.2s ease;
+}
+
+.call-buttons .v-btn:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
+}
+
+.call-buttons .v-btn:active {
+ transform: translateY(0);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
}
@media (max-width: 960px) {
diff --git a/composables/useCheckInHistory.ts b/composables/useCheckInHistory.ts
index 897a180..441b2d8 100644
--- a/composables/useCheckInHistory.ts
+++ b/composables/useCheckInHistory.ts
@@ -78,7 +78,7 @@ export const useCheckInHistory = () => {
data: qrData,
timestamp: new Date().toISOString(),
date: new Date().toLocaleDateString('id-ID'),
- time: new Date().toLocaleTimeString('id-ID')
+ time: new Date().toLocaleTimeString('id-ID').replace(/\./g, ':')
})
// Simpan maksimal item sesuai constant
@@ -227,11 +227,13 @@ export const useCheckInHistory = () => {
const formatDateTime = (dateString: string) => {
const date = new Date(dateString)
- return date.toLocaleTimeString('id-ID', {
+ // Format jam dengan titik dua (HH:MM:SS)
+ const timeString = date.toLocaleTimeString('id-ID', {
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
})
+ return timeString.replace(/\./g, ':')
}
const formatDate = (dateString: string) => {
diff --git a/composables/useThermalPrint.ts b/composables/useThermalPrint.ts
index 72ec848..b6d9dc9 100644
--- a/composables/useThermalPrint.ts
+++ b/composables/useThermalPrint.ts
@@ -85,17 +85,20 @@ export const useThermalPrint = () => {
if (isNaN(date.getTime())) {
return new Date().toLocaleTimeString('id-ID', {
hour: '2-digit',
- minute: '2-digit'
+ minute: '2-digit',
+ second: '2-digit'
});
}
return date.toLocaleTimeString('id-ID', {
hour: '2-digit',
- minute: '2-digit'
+ minute: '2-digit',
+ second: '2-digit'
});
} catch (error) {
return new Date().toLocaleTimeString('id-ID', {
hour: '2-digit',
- minute: '2-digit'
+ minute: '2-digit',
+ second: '2-digit'
});
}
};
@@ -155,6 +158,7 @@ export const useThermalPrint = () => {
margin: 0;
padding: 0;
box-sizing: border-box;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
}
body {
@@ -162,10 +166,10 @@ export const useThermalPrint = () => {
max-width: 80mm;
margin: 0;
padding: 2mm 4mm 6mm 4mm;
- font-family: 'Courier New', monospace;
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
font-size: 12px;
font-weight: bold;
- line-height: 1.2;
+ line-height: 1.0;
background: white;
color: black;
}
@@ -180,36 +184,39 @@ export const useThermalPrint = () => {
}
.header {
- margin-bottom: 3mm;
+ margin-bottom: 2mm;
border-bottom: 2px solid #000;
- padding-bottom: 2mm;
+ padding-bottom: 1mm;
margin-top: 0;
}
.hospital-name {
font-size: 14px;
font-weight: bold;
- margin-bottom: 1mm;
+ margin-bottom: 0.5mm;
text-transform: uppercase;
letter-spacing: 1px;
+ line-height: 1.0;
}
.hospital-address {
font-size: 10px;
font-weight: bold;
- margin-bottom: 1mm;
+ margin-bottom: 0.5mm;
+ line-height: 1.0;
}
.ticket-title {
font-size: 12px;
font-weight: bold;
- margin-top: 2mm;
+ margin-top: 1mm;
text-transform: uppercase;
+ line-height: 1.0;
}
.qr-code-section {
- margin-top: -1.5mm;
- margin-bottom: 1mm;
+ margin-top: -1mm;
+ margin-bottom: 0.5mm;
text-align: center;
}
@@ -231,25 +238,27 @@ export const useThermalPrint = () => {
.barcode-number {
font-size: 10px;
font-weight: bold;
- margin-top: -1mm;
+ margin-top: -0.5mm;
word-break: break-all;
+ line-height: 1.0;
}
.info-section {
- margin-top: 3mm;
+ margin-top: 2mm;
text-align: left;
border-top: 1px dashed #000;
- padding-top: 2mm;
+ padding-top: 1mm;
padding-left: 3mm;
padding-right: 3mm;
}
.info-row {
- margin-bottom: 1.5mm;
+ margin-bottom: 0.8mm;
display: flex;
justify-content: space-between;
align-items: flex-start;
padding: 0;
+ line-height: 1.0;
}
.info-label-text {
@@ -258,6 +267,7 @@ export const useThermalPrint = () => {
text-align: left;
text-transform: uppercase;
word-break: keep-all;
+ line-height: 1.0;
}
.info-colon {
@@ -265,6 +275,7 @@ export const useThermalPrint = () => {
font-size: 10px;
margin-left: auto;
padding-right: 2mm;
+ line-height: 1.0;
}
.info-label-wrapper {
@@ -280,40 +291,45 @@ export const useThermalPrint = () => {
font-weight: bold;
text-align: right;
word-break: break-word;
+ line-height: 1.0;
}
.no-antrian {
font-size: 28px;
font-weight: bold;
- margin: 0.5mm 0;
+ margin: 0.3mm 0;
letter-spacing: 2px;
text-transform: uppercase;
+ line-height: 1.0;
}
.klinik-name {
font-size: 14px;
font-weight: bold;
- margin-top: 0.5mm;
+ margin-top: 0.3mm;
margin-bottom: 0;
padding-bottom: 0;
text-transform: uppercase;
overflow: visible;
+ line-height: 1.0;
}
.footer {
- margin-top: 3mm;
- padding-top: 2mm;
+ margin-top: 2mm;
+ padding-top: 1mm;
padding-bottom: 0;
margin-bottom: 6mm;
border-top: 2px solid #000;
font-size: 9px;
font-weight: bold;
text-align: center;
+ line-height: 1.0;
}
.footer-text {
- margin-bottom: 1mm;
+ margin-bottom: 0.5mm;
font-weight: bold;
+ line-height: 1.0;
}
.footer-text:last-child {
diff --git a/pages/AdminKlinikRuang/[kodeKlinik].vue b/pages/AdminKlinikRuang/[kodeKlinik].vue
index e21e9ec..2defa3f 100644
--- a/pages/AdminKlinikRuang/[kodeKlinik].vue
+++ b/pages/AdminKlinikRuang/[kodeKlinik].vue
@@ -9,20 +9,51 @@
theme="warning"
/>
+
+