|
|
@@ -1,5 +1,9 @@
|
|
|
<template>
|
|
|
<div class="q-mx-md q-mb-md">
|
|
|
+ <div class="font16 fontbold gradient-diarista q-mb-sm">
|
|
|
+ {{ $t("dashboard_client.today_schedules.title") }}
|
|
|
+ </div>
|
|
|
+
|
|
|
<div class="scroll-wrapper">
|
|
|
<div class="scroll-track">
|
|
|
<q-card
|
|
|
@@ -31,7 +35,11 @@
|
|
|
|
|
|
<div class="col-7 column no-wrap overflow-hidden justify-center">
|
|
|
<span class="font12 fontmedium text-text leading-tight">
|
|
|
- <template v-if="cardState(item) === 'awaiting_code'">
|
|
|
+ <template v-if="cardState(item) === 'awaiting_code' && !hasStarted(item)">
|
|
|
+ {{ $t("dashboard_client.today_schedules.not_started_label") }}
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="cardState(item) === 'awaiting_code'">
|
|
|
{{ $t("dashboard_client.today_schedules.start_with") }}
|
|
|
</template>
|
|
|
|
|
|
@@ -71,7 +79,17 @@
|
|
|
<div
|
|
|
class="flex-shrink-0 q-ml-sm column items-center justify-start"
|
|
|
>
|
|
|
- <template v-if="cardState(item) === 'awaiting_code'">
|
|
|
+ <template v-if="cardState(item) === 'awaiting_code' && !hasStarted(item)">
|
|
|
+ <div class="clock-badge">
|
|
|
+ <q-icon
|
|
|
+ color="white"
|
|
|
+ name="mdi-clock-outline"
|
|
|
+ size="15px"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <template v-else-if="cardState(item) === 'awaiting_code' && hasStarted(item)">
|
|
|
<div class="column items-center">
|
|
|
<span class="font9 fontbold text-primary q-mb-xs">
|
|
|
{{ $t("dashboard_client.today_schedules.code_label") }}
|
|
|
@@ -201,7 +219,7 @@
|
|
|
{{ $t("dashboard_client.today_schedules.end_time_label") }}
|
|
|
|
|
|
<span class="gradient-diarista">
|
|
|
- {{ item.end_time?.slice(0, 5) }}
|
|
|
+ {{ calculateTimeUntilEnd(item.end_time) }}
|
|
|
</span>
|
|
|
</span>
|
|
|
</template>
|
|
|
@@ -277,6 +295,36 @@ const cardState = (item) => {
|
|
|
return "awaiting_code";
|
|
|
};
|
|
|
|
|
|
+const hasStarted = (item) => {
|
|
|
+ const [h, m] = (item.start_time || "00:00").slice(0, 5).split(":").map(Number);
|
|
|
+
|
|
|
+ const startTime = new Date();
|
|
|
+
|
|
|
+ startTime.setHours(h, m, 0, 0);
|
|
|
+
|
|
|
+ return now.value >= startTime.getTime();
|
|
|
+};
|
|
|
+
|
|
|
+const calculateTimeUntilEnd = (endTimeStr) => {
|
|
|
+ const [h, m] = (endTimeStr || "23:59").slice(0, 5).split(":").map(Number);
|
|
|
+
|
|
|
+ const endTime = new Date();
|
|
|
+
|
|
|
+ endTime.setHours(h, m, 0, 0);
|
|
|
+
|
|
|
+ const diffMs = endTime.getTime() - now.value;
|
|
|
+
|
|
|
+ if (diffMs <= 0) return "00:00:00";
|
|
|
+
|
|
|
+ const diffH = Math.floor(diffMs / (1000 * 60 * 60));
|
|
|
+
|
|
|
+ const diffM = Math.floor((diffMs % (1000 * 60 * 60)) / (1000 * 60));
|
|
|
+
|
|
|
+ const diffS = Math.floor((diffMs % (1000 * 60)) / 1000);
|
|
|
+
|
|
|
+ return `${String(diffH).padStart(2, "0")}:${String(diffM).padStart(2, "0")}:${String(diffS).padStart(2, "0")}`;
|
|
|
+};
|
|
|
+
|
|
|
const visibleItems = computed(() => {
|
|
|
return props.data.filter((item) => !item.client_reviewed);
|
|
|
});
|