diff --git a/.env.example b/.env.example index 70f2b1f..024a7ff 100644 --- a/.env.example +++ b/.env.example @@ -10,7 +10,7 @@ PROJECT_NAME=jama # Image version to run (set by build.sh, or use 'latest') -JAMA_VERSION=0.9.54 +JAMA_VERSION=0.9.56 # App port — the host port Docker maps to the container PORT=3000 diff --git a/backend/package.json b/backend/package.json index 7deb8fb..faeaf95 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "jama-backend", - "version": "0.9.54", + "version": "0.9.56", "description": "TeamChat backend server", "main": "src/index.js", "scripts": { diff --git a/build.sh b/build.sh index fc11dc3..4dccd87 100644 --- a/build.sh +++ b/build.sh @@ -13,7 +13,7 @@ # ───────────────────────────────────────────────────────────── set -euo pipefail -VERSION="${1:-0.9.54}" +VERSION="${1:-0.9.56}" ACTION="${2:-}" REGISTRY="${REGISTRY:-}" IMAGE_NAME="jama" diff --git a/frontend/package.json b/frontend/package.json index 1b78732..4065730 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "jama-frontend", - "version": "0.9.54", + "version": "0.9.56", "private": true, "scripts": { "dev": "vite", diff --git a/frontend/src/components/SchedulePage.jsx b/frontend/src/components/SchedulePage.jsx index 4882d5f..8c39cf4 100644 --- a/frontend/src/components/SchedulePage.jsx +++ b/frontend/src/components/SchedulePage.jsx @@ -138,6 +138,18 @@ function EventTypePopup({ userGroups, onSave, onClose, editing=null }) { ); } +// ── Shared Row layout — defined OUTSIDE EventForm so it's stable across renders ─ +function FormRow({ label, children, required }) { + return ( +
+
+ {label}{required&& *} +
+
{children}
+
+ ); +} + // ── Event Form ──────────────────────────────────────────────────────────────── function EventForm({ event, userGroups, eventTypes, selectedDate, onSave, onCancel, onDelete, isToolManager }) { const toast=useToast(); @@ -218,15 +230,6 @@ function EventForm({ event, userGroups, eventTypes, selectedDate, onSave, onCanc try{const body={title:title.trim(),eventTypeId:typeId||null,startAt:allDay?`${sd}T00:00:00`:buildISO(sd,st),endAt:allDay?`${ed}T23:59:59`:buildISO(ed,et),allDay,location:loc,description:desc,isPublic:pub,trackAvailability:track,userGroupIds:[...grps]};const r=event?await api.updateEvent(event.id,body):await api.createEvent(body);onSave(r.event);}catch(e){toast(e.message,'error');}finally{setSaving(false);} }; - const Row=({label,children,required})=>( -
-
- {label}{required&& *} -
-
{children}
-
- ); - return (
@@ -237,7 +240,7 @@ function EventForm({ event, userGroups, eventTypes, selectedDate, onSave, onCanc
{/* Event Type */} - +
setSd(e.target.value)} style={{width:150,flexShrink:0}}/> @@ -275,18 +278,18 @@ function EventForm({ event, userGroups, eventTypes, selectedDate, onSave, onCanc
- + {/* Availability */} - + - + {/* Groups — required when tracking */} - +
{userGroups.length===0 @@ -304,27 +307,27 @@ function EventForm({ event, userGroups, eventTypes, selectedDate, onSave, onCanc : `${grps.size} group${grps.size!==1?'s':''} selected`}

- + {/* Visibility — only shown if groups selected OR tracking */} {(grps.size>0||track) && ( - + - + )} {/* Location */} - + setLoc(e.target.value)}/> - + {/* Description */} - +