Quellcode durchsuchen

trips: defaultYear + years autofiling

Viktoriia vor 1 Woche
Ursprung
Commit
73a836cacf

+ 44 - 8
src/screens/InAppScreens/TravelsScreen/AddNewTrip2025Screen/index.tsx

@@ -50,7 +50,7 @@ const isFullDate = (d?: DateValue | null): boolean =>
 
 const isValidDate = (d?: DateValue | null): boolean => {
   if (!d?.year) return false;
-  if (d.year === CURRENT_YEAR) return !!(d.month && d.day);
+  if (d.year >= CURRENT_YEAR) return !!(d.month && d.day);
   return true;
 };
 
@@ -232,7 +232,26 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
       const oldCount = oldRegions.length;
       const normalized = route.params.regionsToSave.map(normalizeRegion);
       const filled = autoFillAfterAppend(normalized, oldCount);
-      setRegions(filled);
+
+      const withDefaultYear =
+        defaultYear && !editTripId && Number(defaultYear) < CURRENT_YEAR
+          ? (() => {
+            const filledIdSet = new Set<number | string>();
+            return filled.map((r) => {
+              if (r.visitStartDate?.year) return r;
+              if (filledIdSet.has(r.id)) return r;
+              filledIdSet.add(r.id);
+              return {
+                ...r,
+                visitStartDate: { year: Number(defaultYear), month: null, day: null },
+                visitEndDate: { year: Number(defaultYear), month: null, day: null },
+                dateMode: 'approx' as CalendarMode
+              };
+            });
+          })()
+          : filled;
+
+      setRegions(withDefaultYear);
       setShouldScrollToEmpty(true);
     }
   }, [route.params?.regionsToSave]);
@@ -318,14 +337,14 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
       const id = r._instanceId ?? `idx-${i}`;
 
       if (!isValidDate(s)) {
-        errors[id] = s?.year === CURRENT_YEAR
-          ? 'Current year requires a full date'
+        errors[id] = s?.year && s.year >= CURRENT_YEAR
+          ? 'Current or future year requires a full date'
           : 'Please select visit dates';
         continue;
       }
       if (!isValidDate(e)) {
-        errors[id] = e?.year === CURRENT_YEAR
-          ? 'Current year requires a full date'
+        errors[id] = e?.year && e.year >= CURRENT_YEAR
+          ? 'Current or future year requires a full date'
           : 'Please select visit dates';
         continue;
       }
@@ -400,16 +419,33 @@ const AddNewTripScreen = ({ route }: { route: any }) => {
       const newIndex = sorted.findIndex((r) => r._instanceId === openedInstanceId);
       if (newIndex !== -1) {
         const next = sorted[newIndex + 1];
-        if (next && !isFullDate(next.visitStartDate)) {
+        if (next && !next.visitStartDate?.year) {
           sorted[newIndex + 1] = { ...next, visitStartDate: newEndDate, visitEndDate: newEndDate };
         }
         const prev = sorted[newIndex - 1];
-        if (prev && !isFullDate(prev.visitStartDate)) {
+        if (prev && !prev.visitStartDate?.year) {
           sorted[newIndex - 1] = { ...prev, visitStartDate: newStartDate, visitEndDate: newStartDate };
         }
       }
     } else {
       sorted = updatedBeforeSort;
+
+      const editedRegionId = regions?.[clickedInstanceIndex]?.id;
+      const propagatedIdSet = new Set<number | string>();
+      propagatedIdSet.add(editedRegionId);
+
+      sorted = sorted.map((r: any) => {
+        if (r._instanceId === openedInstanceId) return r;
+        if (r.visitStartDate?.year) return r;
+        if (propagatedIdSet.has(r.id)) return r;
+        propagatedIdSet.add(r.id);
+        return {
+          ...r,
+          visitStartDate: { year: approxYear, month: null, day: null },
+          visitEndDate: { year: approxYear, month: null, day: null },
+          dateMode: 'approx' as CalendarMode
+        };
+      });
     }
 
     setRegions(sorted);