Some checks failed
Deploy Development / deploy (push) Successful in 47s
Test Suite / pytest-backend (push) Successful in 42s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 13s
Test Suite / k6 /health Baseline (push) Successful in 33s
Test Suite / playwright-tests (push) Failing after 1m21s
- Updated the OrgInboxContext to include handling for club creation requests, allowing for better management of inbox items. - Refactored components to utilize the new `canShowInboxNav` and `canAccessClubCreationInbox` flags for improved access control. - Enhanced the InboxPage to display club creation requests with appropriate actions for approval and rejection. - Updated the DashboardOrgInboxWidget to show both club creation and join requests, improving the user interface for managing inbox items.
87 lines
3.0 KiB
JavaScript
87 lines
3.0 KiB
JavaScript
import { Link } from 'react-router-dom'
|
|
import { Inbox } from 'lucide-react'
|
|
import { useOrgInbox } from '../context/OrgInboxContext'
|
|
|
|
/**
|
|
* Desktop-Dashboard: Hinweis auf offene Beitrittsanträge (nur ab 1024px sichtbar via CSS).
|
|
*/
|
|
export default function DashboardOrgInboxWidget() {
|
|
const {
|
|
canShowInboxNav,
|
|
inboxJoinRequests,
|
|
inboxClubCreationRequests,
|
|
clubCreationRequestCount,
|
|
inboxCount,
|
|
} = useOrgInbox()
|
|
|
|
if (!canShowInboxNav) return null
|
|
|
|
const preview = [
|
|
...(inboxClubCreationRequests || []).map((req) => ({
|
|
key: `creation-${req.id}`,
|
|
club: req.proposed_name || 'Neuer Verein',
|
|
applicant: req.applicant_name || req.applicant_email || 'Antragsteller/in',
|
|
kind: 'creation',
|
|
})),
|
|
...(inboxJoinRequests || []).map((req) => ({
|
|
key: `${req.club_id}-${req.id}`,
|
|
club: req.club_name || 'Verein',
|
|
applicant: req.applicant_name || req.applicant_email || 'Bewerber/in',
|
|
kind: 'join',
|
|
})),
|
|
].slice(0, 5)
|
|
|
|
return (
|
|
<section
|
|
className="dashboard-org-inbox-widget"
|
|
aria-labelledby="dash-org-inbox-title"
|
|
>
|
|
<div className="dashboard-org-inbox-widget__inner card">
|
|
<div className="dashboard-org-inbox-widget__head">
|
|
<h2 id="dash-org-inbox-title" className="dashboard-org-inbox-widget__title">
|
|
<Inbox size={20} strokeWidth={2} aria-hidden className="dashboard-org-inbox-widget__icon" />
|
|
Posteingang
|
|
</h2>
|
|
{inboxCount > 0 ? (
|
|
<span className="dashboard-org-inbox-widget__badge" aria-live="polite">
|
|
{inboxCount}
|
|
</span>
|
|
) : null}
|
|
</div>
|
|
<p className="muted dashboard-org-inbox-widget__lead">
|
|
{inboxCount === 0
|
|
? 'Keine offenen Anträge.'
|
|
: [
|
|
clubCreationRequestCount > 0
|
|
? `${clubCreationRequestCount} Gründungsantrag${clubCreationRequestCount === 1 ? '' : 'e'}`
|
|
: null,
|
|
(inboxJoinRequests || []).length > 0
|
|
? `${(inboxJoinRequests || []).length} Beitrittsantrag${(inboxJoinRequests || []).length === 1 ? '' : 'e'}`
|
|
: null,
|
|
]
|
|
.filter(Boolean)
|
|
.join(' · ')}
|
|
</p>
|
|
{preview.length > 0 ? (
|
|
<ul className="dashboard-org-inbox-widget__list">
|
|
{preview.map((req) => (
|
|
<li key={req.key} className="dashboard-org-inbox-widget__item">
|
|
<span className="dashboard-org-inbox-widget__club">
|
|
{req.kind === 'creation' ? 'Gründung: ' : ''}
|
|
{req.club}
|
|
</span>
|
|
<span className="dashboard-org-inbox-widget__applicant">{req.applicant}</span>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
) : null}
|
|
<div className="dashboard-org-inbox-widget__footer">
|
|
<Link to="/inbox" className="btn btn-secondary" style={{ textDecoration: 'none' }}>
|
|
Zum Posteingang
|
|
</Link>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
)
|
|
}
|