From d9f0986e2672a83830163ec21a4b45aefefe1cb4 Mon Sep 17 00:00:00 2001 From: Ricky Stretch Date: Wed, 18 Mar 2026 15:21:29 -0400 Subject: [PATCH] V0.7.78 fixes --- .env.example | 2 +- backend/package.json | 2 +- build.sh | 2 +- frontend/package.json | 2 +- frontend/src/components/SchedulePage.jsx | 52 +++++++++++++++++++++--- 5 files changed, 51 insertions(+), 9 deletions(-) diff --git a/.env.example b/.env.example index a3a61fe..d45a041 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.77 +JAMA_VERSION=0.9.78 # App port — the host port Docker maps to the container PORT=3000 diff --git a/backend/package.json b/backend/package.json index a03f3a7..aa49ec6 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "jama-backend", - "version": "0.9.77", + "version": "0.9.78", "description": "TeamChat backend server", "main": "src/index.js", "scripts": { diff --git a/build.sh b/build.sh index aebf93f..0fa4b24 100644 --- a/build.sh +++ b/build.sh @@ -13,7 +13,7 @@ # ───────────────────────────────────────────────────────────── set -euo pipefail -VERSION="${1:-0.9.77}" +VERSION="${1:-0.9.78}" ACTION="${2:-}" REGISTRY="${REGISTRY:-}" IMAGE_NAME="jama" diff --git a/frontend/package.json b/frontend/package.json index 8626620..87a532a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "jama-frontend", - "version": "0.9.77", + "version": "0.9.78", "private": true, "scripts": { "dev": "vite", diff --git a/frontend/src/components/SchedulePage.jsx b/frontend/src/components/SchedulePage.jsx index eb45065..54d298c 100644 --- a/frontend/src/components/SchedulePage.jsx +++ b/frontend/src/components/SchedulePage.jsx @@ -597,10 +597,27 @@ function EventDetailModal({ event, onClose, onEdit, onAvailabilityChange, isTool } // ── Event Types Panel ───────────────────────────────────────────────────────── -function EventTypesPanel({ eventTypes, userGroups, onUpdated }) { +function EventTypesPanel({ eventTypes, userGroups, onUpdated, isMobile=false }) { const toast=useToast(); const [editingType,setEditingType]=useState(null); const [showForm,setShowForm]=useState(false); + // Mobile bottom sheet state + const [sheetMode,setSheetMode]=useState(null); // null | 'create' | 'edit' + const [sheetName,setSheetName]=useState(''); + const [sheetColour,setSheetColour]=useState('#6366f1'); + const [sheetSaving,setSheetSaving]=useState(false); + const openCreateSheet=()=>{setSheetName('');setSheetColour('#6366f1');setSheetMode('create');}; + const openEditSheet=(et)=>{setSheetName(et.name);setSheetColour(et.colour);setEditingType(et);setSheetMode('edit');}; + const closeSheet=()=>{setSheetMode(null);setEditingType(null);}; + const saveSheet=async()=>{ + if(!sheetName.trim()) return; + setSheetSaving(true); + try{ + if(sheetMode==='create') await api.createEventType({name:sheetName.trim(),colour:sheetColour}); + else await api.updateEventType(editingType.id,{name:sheetName.trim(),colour:sheetColour}); + onUpdated(); closeSheet(); + }catch(e){} finally{setSheetSaving(false);} + }; const handleDel=async et=>{ if(!confirm(`Delete "${et.name}"?`)) return; try{await api.deleteEventType(et.id);toast('Deleted','success');onUpdated();}catch(e){toast(e.message,'error');} @@ -609,7 +626,10 @@ function EventTypesPanel({ eventTypes, userGroups, onUpdated }) {
Event Types
-
{showForm&&!editingType&&onUpdated()} onClose={()=>setShowForm(false)}/>}
+
+ + {!isMobile&&showForm&&!editingType&&onUpdated()} onClose={()=>setShowForm(false)}/>} +
{eventTypes.map(et=>( @@ -619,14 +639,36 @@ function EventTypesPanel({ eventTypes, userGroups, onUpdated }) { {et.default_duration_hrs&&{et.default_duration_hrs}hr default} {!et.is_protected?(
- - {showForm&&editingType?.id===et.id&&{onUpdated();setShowForm(false);setEditingType(null);}} onClose={()=>{setShowForm(false);setEditingType(null);}}/>} + + {!isMobile&&showForm&&editingType?.id===et.id&&{onUpdated();setShowForm(false);setEditingType(null);}} onClose={()=>{setShowForm(false);setEditingType(null);}}/>}
):{et.is_default?'Default':'Protected'}}
))}
+ + {/* Mobile bottom sheet for create/edit event type */} + {isMobile && sheetMode && ( +
e.target===e.currentTarget&&closeSheet()}> +
+
+ {sheetMode==='create'?'New Event Type':'Edit Event Type'} + +
+ setSheetName(e.target.value)} onKeyDown={e=>e.key==='Enter'&&saveSheet()} placeholder="Type name…" + style={{width:'100%',padding:'12px 14px',border:'1px solid var(--border)',borderRadius:'var(--radius)',fontSize:16,marginBottom:12,boxSizing:'border-box',background:'var(--background)',color:'var(--text-primary)'}}/> +
+ + setSheetColour(e.target.value)} style={{flex:1,height:40,border:'1px solid var(--border)',borderRadius:'var(--radius)',padding:3,cursor:'pointer'}}/> +
+ +
+
+ )} ); } @@ -1130,7 +1172,7 @@ export default function SchedulePage({ isToolManager, isMobile, onProfile, onHel

Event Types

- + )} {panel === 'bulkImport' && isToolManager && (