|
|
@@ -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);
|