v0.11.6 added event form rules.
This commit is contained in:
@@ -370,12 +370,14 @@ function EventForm({ event, userGroups, eventTypes, selectedDate, onSave, onCanc
|
||||
? (new Date(event.end_at) - new Date(event.start_at)) / 60000
|
||||
: null;
|
||||
const prevTypeIdRef = useRef(event?.event_type_id ? String(event.event_type_id) : '');
|
||||
const mountedRef = useRef(false); // skip all auto-calc effects on initial mount
|
||||
|
||||
// When event type changes:
|
||||
// - Creating: always apply the type's duration to compute end time
|
||||
// - Editing: only apply duration if the type HAS a defined duration
|
||||
// (if no duration on type, keep existing saved end time)
|
||||
useEffect(()=>{
|
||||
if(!mountedRef.current) return; // skip on initial mount
|
||||
if(!sd||!st) return;
|
||||
const typ=localTypes.find(t=>t.id===Number(typeId));
|
||||
const start=buildISO(sd,st);
|
||||
@@ -383,37 +385,40 @@ function EventForm({ event, userGroups, eventTypes, selectedDate, onSave, onCanc
|
||||
const typeChanged = typeId !== prevTypeIdRef.current;
|
||||
prevTypeIdRef.current = String(typeId);
|
||||
if(!event || typeChanged) {
|
||||
// New event or type change: apply eventType duration
|
||||
// New event or type change only: apply eventType duration
|
||||
const dur=typ?.default_duration_hrs||1;
|
||||
const endIso=addHours(start,dur);
|
||||
setEd(toDateIn(endIso)); setEt(toTimeIn(endIso));
|
||||
userSetEndTime.current = false;
|
||||
}
|
||||
// Editing with same type: do not override end time here (start-time effect handles it)
|
||||
if(typ?.default_user_group_id&&!event) setGrps(prev=>new Set([...prev,Number(typ.default_user_group_id)]));
|
||||
},[typeId]);
|
||||
|
||||
// When start date changes: match end date (both modes) unless user set it manually
|
||||
// When start date changes: recalculate end preserving duration
|
||||
useEffect(()=>{
|
||||
if(!userSetEndTime.current) setEd(sd);
|
||||
if(!mountedRef.current) return;
|
||||
if(!sd||!st) return;
|
||||
const start=buildISO(sd,st);
|
||||
if(!start) return;
|
||||
const durMins = (event && savedDurMins) ? savedDurMins : (localTypes.find(t=>t.id===Number(typeId))?.default_duration_hrs||1)*60;
|
||||
const endIso=addHours(start,durMins/60);
|
||||
setEd(toDateIn(endIso)); setEt(toTimeIn(endIso));
|
||||
},[sd]);
|
||||
|
||||
// When start time changes: recompute end preserving duration
|
||||
useEffect(()=>{
|
||||
if(!mountedRef.current) return;
|
||||
if(!sd||!st) return;
|
||||
if(userSetEndTime.current && event) {
|
||||
// Editing with user-preserved end: maintain saved duration
|
||||
const durMins = savedDurMins || 60;
|
||||
const start=buildISO(sd,st);
|
||||
if(start){ setEd(toDateIn(addHours(start,durMins/60))); setEt(toTimeIn(addHours(start,durMins/60))); }
|
||||
return;
|
||||
}
|
||||
const typ=localTypes.find(t=>t.id===Number(typeId));
|
||||
const dur=typ?.default_duration_hrs||1;
|
||||
const start=buildISO(sd,st);
|
||||
if(start){ setEd(toDateIn(addHours(start,dur))); setEt(toTimeIn(addHours(start,dur))); }
|
||||
if(!start) return;
|
||||
const durMins = (event && savedDurMins) ? savedDurMins : (localTypes.find(t=>t.id===Number(typeId))?.default_duration_hrs||1)*60;
|
||||
setEd(toDateIn(addHours(start,durMins/60)));
|
||||
setEt(toTimeIn(addHours(start,durMins/60)));
|
||||
},[st]);
|
||||
|
||||
// Mark mounted after all effects have registered — effects skip on initial render
|
||||
useEffect(()=>{ mountedRef.current = true; },[]);
|
||||
|
||||
const toggleGrp=id=>setGrps(prev=>{const n=new Set(prev);n.has(id)?n.delete(id):n.add(id);return n;});
|
||||
const groupsRequired=track; // when tracking, groups are required
|
||||
|
||||
|
||||
Reference in New Issue
Block a user