feat: implement collapsible accordions for event protocol list and form
This commit is contained in:
@@ -6421,3 +6421,44 @@ body.app-tour-active .feedback-modal-overlay--tour .disclaimer-modal-panel {
|
|||||||
color: #e2e8f0;
|
color: #e2e8f0;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Accordion Styling */
|
||||||
|
.accordion-header {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
padding: 8px 12px;
|
||||||
|
margin: -8px -12px;
|
||||||
|
border-radius: 8px;
|
||||||
|
transition: background-color 0.2s ease, color 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.accordion-header:hover {
|
||||||
|
background-color: var(--app-surface-hover, rgba(255, 255, 255, 0.03));
|
||||||
|
}
|
||||||
|
|
||||||
|
.accordion-header-title {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.accordion-chevron {
|
||||||
|
color: var(--app-text-muted, #94a3b8);
|
||||||
|
transition: transform 0.2s ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Specific styling for nested member-editor-card header */
|
||||||
|
.member-editor-card .accordion-header {
|
||||||
|
margin: 0 0 16px 0;
|
||||||
|
padding: 8px 12px;
|
||||||
|
border-radius: 6px;
|
||||||
|
background: rgba(255, 255, 255, 0.01);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
.member-editor-card .accordion-header:hover {
|
||||||
|
background: var(--app-surface-hover, rgba(255, 255, 255, 0.03));
|
||||||
|
}
|
||||||
|
|||||||
@@ -296,6 +296,9 @@ export default function LogEntryEditor({
|
|||||||
const [evLocationName, setEvLocationName] = useState('')
|
const [evLocationName, setEvLocationName] = useState('')
|
||||||
const [activeCourseTab, setActiveCourseTab] = useState<'mgk' | 'rwk'>('mgk')
|
const [activeCourseTab, setActiveCourseTab] = useState<'mgk' | 'rwk'>('mgk')
|
||||||
|
|
||||||
|
const [eventsCollapsed, setEventsCollapsed] = useState(true)
|
||||||
|
const [addEventFormCollapsed, setAddEventFormCollapsed] = useState(false)
|
||||||
|
|
||||||
const [loading, setLoading] = useState(false)
|
const [loading, setLoading] = useState(false)
|
||||||
const [saving, setSaving] = useState(false)
|
const [saving, setSaving] = useState(false)
|
||||||
const [exporting, setExporting] = useState(false)
|
const [exporting, setExporting] = useState(false)
|
||||||
@@ -1407,6 +1410,7 @@ export default function LogEntryEditor({
|
|||||||
if (!ev) return
|
if (!ev) return
|
||||||
fillEventForm(ev)
|
fillEventForm(ev)
|
||||||
setEditingEventIndex(index)
|
setEditingEventIndex(index)
|
||||||
|
setAddEventFormCollapsed(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleCancelEventEdit = () => {
|
const handleCancelEventEdit = () => {
|
||||||
@@ -1853,13 +1857,33 @@ export default function LogEntryEditor({
|
|||||||
|
|
||||||
{/* Section 3: Event Journal Entries */}
|
{/* Section 3: Event Journal Entries */}
|
||||||
<div className="form-card">
|
<div className="form-card">
|
||||||
<div className="form-header mb-4">
|
<div
|
||||||
|
className="form-header mb-4 accordion-header"
|
||||||
|
onClick={() => setEventsCollapsed(!eventsCollapsed)}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
if (e.key === 'Enter' || e.key === ' ') {
|
||||||
|
e.preventDefault()
|
||||||
|
setEventsCollapsed(!eventsCollapsed)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
role="button"
|
||||||
|
aria-expanded={!eventsCollapsed}
|
||||||
|
tabIndex={0}
|
||||||
|
>
|
||||||
|
<div className="accordion-header-title">
|
||||||
<Compass size={20} className="form-icon" />
|
<Compass size={20} className="form-icon" />
|
||||||
<h3>{t('logs.event_title')}</h3>
|
<h3>{t('logs.event_title')}</h3>
|
||||||
</div>
|
</div>
|
||||||
|
{eventsCollapsed ? (
|
||||||
|
<ChevronDown size={20} className="accordion-chevron" />
|
||||||
|
) : (
|
||||||
|
<ChevronUp size={20} className="accordion-chevron" />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
{/* List existing events */}
|
{/* List existing events */}
|
||||||
{events.length === 0 ? (
|
{!eventsCollapsed && (
|
||||||
|
events.length === 0 ? (
|
||||||
<div className="dashboard-status-msg mb-6">{t('logs.no_events')}</div>
|
<div className="dashboard-status-msg mb-6">{t('logs.no_events')}</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
@@ -2091,15 +2115,44 @@ export default function LogEntryEditor({
|
|||||||
})}
|
})}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
)
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{/* Add New Event Form Sub-Card */}
|
{/* Add New Event Form Sub-Card */}
|
||||||
{!readOnly && (
|
{!readOnly && (
|
||||||
<div className="member-editor-card glass">
|
<div className="member-editor-card glass">
|
||||||
<h4 style={{ margin: '0 0 16px 0', color: '#fbbf24' }}>
|
<div
|
||||||
|
className="accordion-header"
|
||||||
|
onClick={() => setAddEventFormCollapsed(!addEventFormCollapsed)}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
if (e.key === 'Enter' || e.key === ' ') {
|
||||||
|
e.preventDefault()
|
||||||
|
setAddEventFormCollapsed(!addEventFormCollapsed)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
role="button"
|
||||||
|
aria-expanded={!addEventFormCollapsed}
|
||||||
|
tabIndex={0}
|
||||||
|
style={{
|
||||||
|
margin: '0 0 16px 0',
|
||||||
|
padding: '8px 12px',
|
||||||
|
borderRadius: '6px',
|
||||||
|
background: 'rgba(255, 255, 255, 0.01)',
|
||||||
|
border: '1px solid rgba(255, 255, 255, 0.03)'
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<h4 style={{ margin: 0, color: '#fbbf24' }}>
|
||||||
{editingEventIndex !== null ? t('logs.edit_event') : t('logs.add_event')}
|
{editingEventIndex !== null ? t('logs.edit_event') : t('logs.add_event')}
|
||||||
</h4>
|
</h4>
|
||||||
|
{addEventFormCollapsed ? (
|
||||||
|
<ChevronDown size={18} style={{ color: '#fbbf24' }} className="accordion-chevron" />
|
||||||
|
) : (
|
||||||
|
<ChevronUp size={18} style={{ color: '#fbbf24' }} className="accordion-chevron" />
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{!addEventFormCollapsed && (
|
||||||
|
<>
|
||||||
<div className="form-grid mb-4">
|
<div className="form-grid mb-4">
|
||||||
<div className="input-group">
|
<div className="input-group">
|
||||||
<label>
|
<label>
|
||||||
@@ -2445,6 +2498,8 @@ export default function LogEntryEditor({
|
|||||||
{editingEventIndex !== null ? t('logs.save_event_btn') : t('logs.add_event_btn')}
|
{editingEventIndex !== null ? t('logs.save_event_btn') : t('logs.add_event_btn')}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user