Enhance scheduling and drag-and-drop functionality in the Calendar component

- Improved drag-and-drop experience for event scheduling with visual feedback and better cursor styles.
- Added state management for tracking repetitions, including locked schedules and currently scheduling repetitions.
- Implemented re-staggering logic to prevent overlap of scheduled events.
- Enhanced event generation to include time points for soaking, airdrying, and cracking phases.
- Updated the calendar to preserve and restore scroll position during event updates.
- Refactored event handling to ensure smooth interaction and improved user experience.
This commit is contained in:
salirezav
2025-10-29 14:16:19 -04:00
parent 98c93f9e0e
commit 9f669e7dff
12 changed files with 560 additions and 574 deletions

View File

@@ -146,15 +146,13 @@ ON CONFLICT (experiment_number, phase_id) DO NOTHING;
-- Create soaking records for Meyer experiments (1-40)
INSERT INTO public.soaking (
experiment_id,
experiment_phase_id,
scheduled_start_time,
soaking_duration_minutes,
scheduled_end_time,
created_by
)
SELECT
e.experiment_number,
e.phase_id,
e.id,
NOW() + (e.experiment_number) * INTERVAL '1 day',
CASE e.experiment_number
WHEN 1 THEN 27 * 60 -- 27 hours = 1620 minutes
@@ -254,15 +252,13 @@ ON CONFLICT DO NOTHING;
-- Create airdrying records for Meyer experiments (1-40)
INSERT INTO public.airdrying (
experiment_id,
experiment_phase_id,
scheduled_start_time,
duration_minutes,
scheduled_end_time,
created_by
)
SELECT
e.experiment_number,
e.phase_id,
e.id,
NOW() + (e.experiment_number) * INTERVAL '1 day' + INTERVAL '2 days', -- Start 2 days after soaking
CASE e.experiment_number
WHEN 1 THEN 28 -- 28 minutes
@@ -362,14 +358,12 @@ ON CONFLICT DO NOTHING;
-- Create cracking records for Meyer experiments (1-40)
INSERT INTO public.cracking (
experiment_id,
experiment_phase_id,
machine_type_id,
scheduled_start_time,
created_by
)
SELECT
e.experiment_number,
e.phase_id,
e.id,
(SELECT id FROM public.machine_types WHERE name = 'Meyer Cracker'),
NOW() + (e.experiment_number) * INTERVAL '1 day' + INTERVAL '3 days', -- Start 3 days after soaking
e.created_by
@@ -383,14 +377,13 @@ ON CONFLICT DO NOTHING;
-- =============================================
-- Create Meyer cracker parameters for Meyer experiments (1-40)
-- First create the Meyer cracker parameters
INSERT INTO public.meyer_cracker_parameters (
cracking_id,
motor_speed_hz,
jig_displacement_inches,
spring_stiffness_nm
)
SELECT
c.id,
SELECT
CASE e.experiment_number
WHEN 1 THEN 33.0
WHEN 2 THEN 30.0
@@ -518,11 +511,31 @@ SELECT
WHEN 40 THEN 2000.0
END
FROM public.experiments e
JOIN public.cracking c ON c.experiment_id = e.experiment_number AND c.experiment_phase_id = e.phase_id
WHERE e.experiment_number BETWEEN 1 AND 40
AND e.phase_id = (SELECT id FROM public.experiment_phases WHERE name = 'Post Workshop Meyer Experiments')
ON CONFLICT DO NOTHING;
-- Now update the cracking records to reference the Meyer cracker parameters
-- Match them by the order they were created
WITH parameter_mapping AS (
SELECT
e.experiment_number,
mcp.id as param_id,
ROW_NUMBER() OVER (ORDER BY e.experiment_number) as exp_rn,
ROW_NUMBER() OVER (ORDER BY mcp.created_at) as param_rn
FROM public.experiments e
CROSS JOIN public.meyer_cracker_parameters mcp
WHERE e.experiment_number BETWEEN 1 AND 40
AND e.phase_id = (SELECT id FROM public.experiment_phases WHERE name = 'Post Workshop Meyer Experiments')
)
UPDATE public.cracking c
SET meyer_cracker_parameters_id = pm.param_id
FROM parameter_mapping pm
JOIN public.experiments e ON c.experiment_id = e.id
WHERE e.experiment_number = pm.experiment_number
AND pm.exp_rn = pm.param_rn
AND c.meyer_cracker_parameters_id IS NULL;
-- =============================================
-- CREATE EXPERIMENT REPETITIONS FOR MEYER EXPERIMENTS
-- =============================================
@@ -531,14 +544,12 @@ ON CONFLICT DO NOTHING;
-- Each experiment needs only 1 repetition
INSERT INTO public.experiment_repetitions (
experiment_id,
experiment_phase_id,
repetition_number,
status,
created_by
)
SELECT
e.experiment_number,
e.phase_id,
e.id,
1,
'pending',
e.created_by