diff --git a/docker-compose.yml b/docker-compose.yml
index 1008918..588eecf 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -299,74 +299,71 @@ services:
# - usda-vision-network
# restart: unless-stopped
#
- # ============================================================================
- # Vision API Service - DISABLED FOR DEVELOPMENT
- # ============================================================================
- # api:
- # container_name: usda-vision-api
- # build:
- # context: ./camera-management-api
- # dockerfile: Dockerfile
- # working_dir: /app
- # restart: unless-stopped # Automatically restart container if it fails or exits
- # healthcheck:
- # test: ["CMD-SHELL", "python3 -c 'import urllib.request; urllib.request.urlopen(\"http://localhost:8000/health\").read()' || exit 1"]
- # interval: 30s
- # timeout: 10s
- # retries: 3
- # start_period: 60s
- # volumes:
- # - ./camera-management-api:/app
- # - /mnt/nfs_share:/mnt/nfs_share
- # - /etc/localtime:/etc/localtime:ro
- # - /etc/timezone:/etc/timezone:ro
- # environment:
- # - PYTHONUNBUFFERED=1
- # - LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib
- # - PYTHONPATH=/app:/app/camera_sdk
- # - TZ=America/New_York
- # - MEDIAMTX_HOST=localhost
- # - MEDIAMTX_RTSP_PORT=8554
- # command: >
- # sh -lc "
- # set -e # Exit on error
- #
- # # Only install system packages if not already installed (check for ffmpeg)
- # if ! command -v ffmpeg &> /dev/null; then
- # echo 'Installing system dependencies...';
- # apt-get update && apt-get install -y --no-install-recommends libusb-1.0-0-dev ffmpeg;
- # else
- # echo 'System dependencies already installed';
- # fi
+ api:
+ container_name: usda-vision-api
+ build:
+ context: ./camera-management-api
+ dockerfile: Dockerfile
+ working_dir: /app
+ restart: unless-stopped # Automatically restart container if it fails or exits
+ healthcheck:
+ test: ["CMD-SHELL", "python3 -c 'import urllib.request; urllib.request.urlopen(\"http://localhost:8000/health\").read()' || exit 1"]
+ interval: 30s
+ timeout: 10s
+ retries: 3
+ start_period: 60s
+ volumes:
+ - ./camera-management-api:/app
+ - /mnt/nfs_share:/mnt/nfs_share
+ - /etc/localtime:/etc/localtime:ro
+ - /etc/timezone:/etc/timezone:ro
+ environment:
+ - PYTHONUNBUFFERED=1
+ - LD_LIBRARY_PATH=/usr/local/lib:/lib:/usr/lib
+ - PYTHONPATH=/app:/app/camera_sdk
+ - TZ=America/New_York
+ - MEDIAMTX_HOST=localhost
+ - MEDIAMTX_RTSP_PORT=8554
+ command: >
+ sh -lc "
+ set -e # Exit on error
+
+ # Only install system packages if not already installed (check for ffmpeg)
+ if ! command -v ffmpeg &> /dev/null; then
+ echo 'Installing system dependencies...';
+ apt-get update && apt-get install -y --no-install-recommends libusb-1.0-0-dev ffmpeg;
+ else
+ echo 'System dependencies already installed';
+ fi
- # # Install camera SDK if not already installed
- # if [ ! -f /lib/libMVSDK.so ] && [ -f 'camera_sdk/linuxSDK_V2.1.0.49(250108)/install.sh' ]; then
- # echo 'Installing camera SDK...';
- # cd 'camera_sdk/linuxSDK_V2.1.0.49(250108)';
- # chmod +x install.sh;
- # ./install.sh || echo 'Warning: Camera SDK installation may have failed';
- # cd /app;
- # else
- # echo 'Camera SDK already installed or install script not found';
- # fi;
+ # Install camera SDK if not already installed
+ if [ ! -f /lib/libMVSDK.so ] && [ -f 'camera_sdk/linuxSDK_V2.1.0.49(250108)/install.sh' ]; then
+ echo 'Installing camera SDK...';
+ cd 'camera_sdk/linuxSDK_V2.1.0.49(250108)';
+ chmod +x install.sh;
+ ./install.sh || echo 'Warning: Camera SDK installation may have failed';
+ cd /app;
+ else
+ echo 'Camera SDK already installed or install script not found';
+ fi;
- # # Install Python dependencies (only if requirements.txt changed or packages missing)
- # if [ -f requirements.txt ]; then
- # pip install --no-cache-dir -r requirements.txt || echo 'Warning: Some Python packages may have failed to install';
- # else
- # pip install --no-cache-dir -e . || echo 'Warning: Package installation may have failed';
- # fi;
+ # Install Python dependencies (only if requirements.txt changed or packages missing)
+ if [ -f requirements.txt ]; then
+ pip install --no-cache-dir -r requirements.txt || echo 'Warning: Some Python packages may have failed to install';
+ else
+ pip install --no-cache-dir -e . || echo 'Warning: Package installation may have failed';
+ fi;
- # # Start the application with error handling
- # echo 'Starting USDA Vision Camera System...';
- # python main.py --config config.compose.json || {
- # echo 'Application exited with error code: $?';
- # echo 'Waiting 5 seconds before exit...';
- # sleep 5;
- # exit 1;
- # }
- # "
- # network_mode: host
+ # Start the application with error handling
+ echo 'Starting USDA Vision Camera System...';
+ python main.py --config config.compose.json || {
+ echo 'Application exited with error code: $?';
+ echo 'Waiting 5 seconds before exit...';
+ sleep 5;
+ exit 1;
+ }
+ "
+ network_mode: host
web:
container_name: usda-vision-web
@@ -424,31 +421,28 @@ services:
networks:
- usda-vision-network
- # ============================================================================
- # Vision System Remote - DISABLED FOR DEVELOPMENT
- # ============================================================================
- # vision-system-remote:
- # container_name: usda-vision-vision-system-remote
- # image: node:20-alpine
- # working_dir: /app
- # environment:
- # - CHOKIDAR_USEPOLLING=true
- # - TZ=America/New_York
- # # Use environment variable with fallback to localhost
- # - VITE_VISION_API_URL=${VITE_VISION_API_URL:-http://localhost:8000}
- # volumes:
- # - ./vision-system-remote:/app
- # command: >
- # sh -lc "
- # npm install;
- # npm run dev:watch
- # "
- # extra_hosts:
- # - "host.docker.internal:host-gateway"
- # ports:
- # - "3002:3002"
- # networks:
- # - usda-vision-network
+ vision-system-remote:
+ container_name: usda-vision-vision-system-remote
+ image: node:20-alpine
+ working_dir: /app
+ environment:
+ - CHOKIDAR_USEPOLLING=true
+ - TZ=America/New_York
+ # Use environment variable with fallback to localhost
+ - VITE_VISION_API_URL=${VITE_VISION_API_URL:-http://localhost:8000}
+ volumes:
+ - ./vision-system-remote:/app
+ command: >
+ sh -lc "
+ npm install;
+ npm run dev:watch
+ "
+ extra_hosts:
+ - "host.docker.internal:host-gateway"
+ ports:
+ - "3002:3002"
+ networks:
+ - usda-vision-network
scheduling-remote:
container_name: usda-vision-scheduling-remote
@@ -473,36 +467,33 @@ services:
networks:
- usda-vision-network
- # ============================================================================
- # Media API Service - DISABLED FOR DEVELOPMENT
- # ============================================================================
- # media-api:
- # container_name: usda-vision-media-api
- # build:
- # context: ./media-api
- # dockerfile: Dockerfile
- # environment:
- # - MEDIA_VIDEOS_DIR=/mnt/nfs_share
- # - MEDIA_THUMBS_DIR=/mnt/nfs_share/.thumbnails
- # - MAX_CONCURRENT_TRANSCODING=2 # Limit concurrent transcoding operations
- # volumes:
- # - /mnt/nfs_share:/mnt/nfs_share
- # ports:
- # - "8090:8090"
- # networks:
- # - usda-vision-network
- # deploy:
- # resources:
- # limits:
- # cpus: '4' # Limit to 4 CPU cores (adjust based on your system)
- # memory: 2G # Limit to 2GB RAM per container
- # reservations:
- # cpus: '1' # Reserve at least 1 CPU core
- # memory: 512M # Reserve at least 512MB RAM
- # # Alternative syntax for older Docker Compose versions:
- # # cpus: '4'
- # # mem_limit: 2g
- # # mem_reservation: 512m
+ media-api:
+ container_name: usda-vision-media-api
+ build:
+ context: ./media-api
+ dockerfile: Dockerfile
+ environment:
+ - MEDIA_VIDEOS_DIR=/mnt/nfs_share
+ - MEDIA_THUMBS_DIR=/mnt/nfs_share/.thumbnails
+ - MAX_CONCURRENT_TRANSCODING=2 # Limit concurrent transcoding operations
+ volumes:
+ - /mnt/nfs_share:/mnt/nfs_share
+ ports:
+ - "8090:8090"
+ networks:
+ - usda-vision-network
+ deploy:
+ resources:
+ limits:
+ cpus: '4' # Limit to 4 CPU cores (adjust based on your system)
+ memory: 2G # Limit to 2GB RAM per container
+ reservations:
+ cpus: '1' # Reserve at least 1 CPU core
+ memory: 512M # Reserve at least 512MB RAM
+ # Alternative syntax for older Docker Compose versions:
+ # cpus: '4'
+ # mem_limit: 2g
+ # mem_reservation: 512m
mediamtx:
container_name: usda-vision-mediamtx
diff --git a/scheduling-remote/src/components/HorizontalTimelineCalendar.tsx b/scheduling-remote/src/components/HorizontalTimelineCalendar.tsx
index aefd77b..33d2235 100644
--- a/scheduling-remote/src/components/HorizontalTimelineCalendar.tsx
+++ b/scheduling-remote/src/components/HorizontalTimelineCalendar.tsx
@@ -67,6 +67,7 @@ function RepetitionBorder({
onScheduleRepetition,
visibleMarkers,
getTimePosition,
+ isScheduledInDb = false,
children
}: {
left: number
@@ -91,6 +92,7 @@ function RepetitionBorder({
onScheduleRepetition?: (repId: string, experimentId: string) => void
visibleMarkers: Array<{ id: string; startTime: Date; assignedConductors: string[] }>
getTimePosition: (time: Date) => number
+ isScheduledInDb?: boolean
children?: React.ReactNode
}) {
const [isHovered, setIsHovered] = useState(false)
@@ -148,6 +150,9 @@ function RepetitionBorder({
? '8px 0 0 8px' // No radius on right side (markers extend to future)
: '8px' // Full radius (default)
+ // Muted styling for repetitions that have been fully scheduled in DB (gray out, but don't collapse)
+ const isMuted = isScheduledInDb && !isHovered && !isDragging
+
return (
{/* Text content (non-clickable) */}
- {phaseName &&
{phaseName}
}
- {experimentNumber !== undefined &&
Exp {experimentNumber}
}
- {repetitionNumber !== undefined &&
Rep {repetitionNumber}
}
+ {isScheduledInDb ? (
+ <>
+ {experimentNumber !== undefined &&
{`Exp ${experimentNumber}`}
}
+ {repetitionNumber !== undefined &&
{`Rep ${repetitionNumber}`}
}
+ >
+ ) : (
+ <>
+ {phaseName &&
{phaseName}
}
+ {experimentNumber !== undefined &&
Exp {experimentNumber}
}
+ {repetitionNumber !== undefined &&
Rep {repetitionNumber}
}
+ >
+ )}
{/* Go to repetition button */}
@@ -215,7 +232,7 @@ function RepetitionBorder({