|
22 | 22 | color="positive" |
23 | 23 | /> |
24 | 24 | </div> |
25 | | - <div class="row items-center q-mb-md"> |
26 | | - <q-input |
27 | | - v-model="planTime.value" |
28 | | - type="time" |
29 | | - label="Ziel-Termin" |
30 | | - class="col" |
31 | | - /> |
32 | | - </div> |
| 25 | + <q-separator /> |
33 | 26 | <div class="q-mb-sm"> |
34 | 27 | <div class="text-subtitle2 q-mb-sm q-mt-sm">Wiederholungen</div> |
35 | 28 | <q-btn-group spread> |
|
52 | 45 | label="Wöchentlich" |
53 | 46 | /> |
54 | 47 | </q-btn-group> |
55 | | - <div v-if="planFrequency.value === 'once'" class="q-mt-sm"> |
56 | | - <q-input |
57 | | - v-model="planOnceDate.value" |
58 | | - type="date" |
59 | | - label="Datum" |
60 | | - :min="new Date().toISOString().split('T')[0]" |
61 | | - /> |
62 | | - </div> |
63 | 48 | <!-- Weekly buttons --> |
64 | 49 | <div |
65 | 50 | v-if="planFrequency.value === 'weekly'" |
66 | | - class="q-mt-sm row items-center q-gutter-sm justify-center no-wrap" |
| 51 | + class="row items-center q-gutter-sm justify-center no-wrap q-mt-xs" |
67 | 52 | > |
68 | 53 | <div v-for="(day, index) in weekDays" :key="day"> |
69 | 54 | <q-btn |
|
78 | 63 | /> |
79 | 64 | </div> |
80 | 65 | </div> |
| 66 | + <div class="text-subtitle2 q-mt-sm">Ziel-Termin</div> |
| 67 | + <div class="row items-center q-mb-md"> |
| 68 | + <q-input |
| 69 | + v-if="planFrequency.value === 'once'" |
| 70 | + class="q-mr-lg col" |
| 71 | + v-model="planOnceDate.value" |
| 72 | + type="date" |
| 73 | + label="Ziel-Datum" |
| 74 | + :min="new Date().toISOString().split('T')[0]" |
| 75 | + /> |
| 76 | + <q-input |
| 77 | + v-else |
| 78 | + class="q-mr-lg col" |
| 79 | + :model-value=" |
| 80 | + planFrequency.value === 'daily' ? today : firstSelectedWeekday |
| 81 | + " |
| 82 | + label="Ziel-Datum" |
| 83 | + readonly |
| 84 | + /> |
| 85 | + <q-input |
| 86 | + v-model="planTime.value" |
| 87 | + type="time" |
| 88 | + label="Ziel-Uhrzeit" |
| 89 | + class="col" |
| 90 | + /> |
| 91 | + </div> |
81 | 92 | </div> |
| 93 | + <q-separator /> |
82 | 94 | <SliderStandard |
83 | | - class="q-mb-sm" |
| 95 | + class="q-my-sm" |
84 | 96 | :title="planDcChargingEnabled ? 'Ladestrom (AC)' : 'Ladestrom'" |
85 | 97 | :min="6" |
86 | 98 | :max="32" |
@@ -237,20 +249,47 @@ const emit = defineEmits(['close']); |
237 | 249 | const mqttStore = useMqttStore(); |
238 | 250 | const $q = useQuasar(); |
239 | 251 |
|
| 252 | +const formatDateDayMonthYear = (dateString: string): string => { |
| 253 | + if (!dateString) return ''; |
| 254 | + const [year, month, day] = dateString.split('-'); |
| 255 | + return `${day}.${month}.${year}`; |
| 256 | +}; |
| 257 | +const today = formatDateDayMonthYear(new Date().toISOString().split('T')[0]); |
240 | 258 | const weekDays = ['Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So']; |
241 | 259 |
|
242 | | -const phaseOptions = [ |
243 | | - { value: 1, label: '1' }, |
244 | | - { value: 3, label: 'Maximum' }, |
245 | | - { value: 0, label: 'Automatik' }, |
246 | | -]; |
247 | | -
|
248 | 260 | const selectDay = (index: number) => { |
249 | 261 | const newArray = [...selectedWeekDays.value]; |
250 | 262 | newArray[index] = !newArray[index]; |
251 | 263 | selectedWeekDays.value = newArray; |
252 | 264 | }; |
253 | 265 |
|
| 266 | +const firstSelectedWeekday = computed(() => { |
| 267 | + const today = new Date(); |
| 268 | + // 0=Sonntag, ..., 6=Samstag >> 0=Montag, ..., 6=Sonntag |
| 269 | + const todayIndex = (today.getDay() + 6) % 7; |
| 270 | + const userSelection = selectedWeekDays.value |
| 271 | + .map((isSelected, index) => (isSelected ? index : -1)) |
| 272 | + .filter((index) => index !== -1); |
| 273 | + if (userSelection.length === 0) return ''; |
| 274 | + // For all selected days, calculate the distance to today |
| 275 | + const daysUntilSelected = userSelection.map((idx) => { |
| 276 | + let daysUntil = idx - todayIndex; |
| 277 | + if (daysUntil < 0) daysUntil += 7; |
| 278 | + return daysUntil; |
| 279 | + }); |
| 280 | + // Take the smallest distance (this is the next day) |
| 281 | + const nearestDay = Math.min(...daysUntilSelected); |
| 282 | + const dateNextDay = new Date(today); |
| 283 | + dateNextDay.setDate(today.getDate() + nearestDay); |
| 284 | + return formatDateDayMonthYear(dateNextDay.toISOString().split('T')[0]); |
| 285 | +}); |
| 286 | +
|
| 287 | +const phaseOptions = [ |
| 288 | + { value: 1, label: '1' }, |
| 289 | + { value: 3, label: 'Maximum' }, |
| 290 | + { value: 0, label: 'Automatik' }, |
| 291 | +]; |
| 292 | +
|
254 | 293 | const planActive = computed(() => |
255 | 294 | mqttStore.vehicleScheduledChargingPlanActive( |
256 | 295 | props.chargePointId, |
|
0 commit comments