Skip to content

Commit 9aaa6dc

Browse files
committed
rm public access from evetns and gallery fix spelling
1 parent 81996ae commit 9aaa6dc

3 files changed

Lines changed: 77 additions & 52 deletions

File tree

‎src/Pages/Events/Events.jsx‎

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ import CalendarMonthIcon from '@mui/icons-material/CalendarMonth';
3030
import LocationOnIcon from '@mui/icons-material/LocationOn';
3131
import ForumIcon from '@mui/icons-material/Forum';
3232
import AddBoxIcon from '@mui/icons-material/AddBox';
33+
import WarningIcon from '@mui/icons-material/Warning';
34+
import LockIcon from '@mui/icons-material/Lock';
3335

3436
const initialModalState = {
3537
openModal: false,
@@ -85,6 +87,29 @@ function modalReducer(state, action) {
8587
}
8688
}
8789

90+
function PermissionNotice({ icon: Icon, text }) {
91+
return (
92+
<Stack
93+
direction="row"
94+
spacing={1.5}
95+
sx={{
96+
alignItems: 'center',
97+
justifyContent: 'center',
98+
border: '1px solid rgba(255, 255, 255, 0.08)',
99+
p: 2,
100+
borderRadius: 2,
101+
bgcolor: 'rgba(0,0,0,0.2)',
102+
color: 'text.secondary',
103+
fontStyle: 'italic',
104+
mx: 'auto'
105+
}}
106+
>
107+
<Icon sx={{ fontSize: '1.2rem', color: 'primary.main' }} />
108+
<Typography variant="body2">{text}</Typography>
109+
</Stack>
110+
);
111+
}
112+
88113
export default function Events() {
89114
const { auth } = useAuth();
90115
const isLoggedIn = !!auth?.JWT;
@@ -308,7 +333,7 @@ export default function Events() {
308333
Anstehende Events
309334
</Typography>
310335

311-
{isLoggedIn ? (
336+
{isTeamMember ? (
312337
<Box sx={{ display: 'flex', justifyContent: 'center', mb: 6 }}>
313338
<Button
314339
variant="contained"
@@ -322,9 +347,13 @@ export default function Events() {
322347
</Box>
323348
) : (
324349
<Box sx={{ display: 'flex', justifyContent: 'center', mb: 6 }}>
325-
<Typography variant="body2" color="text.secondary" sx={{ fontStyle: 'italic', border: '1px solid rgba(255, 255, 255, 0.08)', p: 2, borderRadius: 2, bgcolor: 'rgba(0,0,0,0.2)' }}>
326-
🔒 Bitte einloggen, um Events zu erstellen oder zu bearbeiten.
327-
</Typography>
350+
<PermissionNotice
351+
icon={LockIcon}
352+
text={!isLoggedIn
353+
? "Bitte einloggen, um Events zu erstellen oder zu bearbeiten."
354+
: "Mindestens Rang 'Frischling' benötigt, um Events zu erstellen oder zu bearbeiten."
355+
}
356+
/>
328357
</Box>
329358
)}
330359

@@ -385,7 +414,7 @@ export default function Events() {
385414
<Box sx={{ position: 'relative' }}>
386415
{sortedEvents.map((event, index) => {
387416
const isCreator = event.creatorName === currentUsername;
388-
const canModify = isLoggedIn && (isCreator || isAdmin);
417+
const canModify = isTeamMember && (isCreator || isAdmin);
389418
const isFuture = new Date(event.eventDate) >= today;
390419
const isNextEvent = nextEvent && nextEvent.id === event.id;
391420
const daysToNext = isNextEvent ? Math.ceil((new Date(event.eventDate) - today) / (1000 * 60 * 60 * 24)) : 0;
@@ -711,7 +740,8 @@ export default function Events() {
711740
{/* Custom dialog for deleting event */}
712741
<Dialog open={deleteDialogOpen} onClose={handleCloseDelete} fullWidth maxWidth="xs">
713742
<DialogTitle sx={{ fontWeight: 'bold', borderBottom: '1px solid rgba(255,255,255,0.08)', color: 'error.main', display: 'flex', alignItems: 'center', gap: 1 }}>
714-
⚠️ Termin löschen?
743+
<WarningIcon color="error" />
744+
Termin löschen?
715745
</DialogTitle>
716746
<DialogContent sx={{ p: 3, mt: 1 }}>
717747
<Typography variant="body1" sx={{ mb: 2 }}>

‎src/Pages/Gallery/Gallery.jsx‎

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import LibraryAddIcon from '@mui/icons-material/LibraryAdd';
3131
import EditIcon from '@mui/icons-material/Edit';
3232
import DeleteIcon from '@mui/icons-material/Delete';
3333
import PersonIcon from '@mui/icons-material/Person';
34+
import WarningIcon from '@mui/icons-material/Warning';
3435

3536
const initialModalState = {
3637
openModal: false,
@@ -90,6 +91,7 @@ export default function Gallery() {
9091
const isLoggedIn = !!auth?.JWT;
9192
const isAdmin = auth?.roles === 'Admin';
9293
const currentUsername = auth?.user;
94+
const isTeamMember = isLoggedIn && ['Frischling', 'Mitglied', 'Vorstand', 'Admin'].includes(auth?.roles);
9395

9496
const proxyUrl = import.meta.env.VITE_IMMICH_PROXY_URL || "";
9597
const dropUrl = import.meta.env.VITE_IMMICH_DROP_URL || "";
@@ -239,37 +241,31 @@ export default function Gallery() {
239241
</Typography>
240242

241243
{/* Buttons & Actions */}
242-
<Stack direction={{ xs: 'column', sm: 'row' }} spacing={2} sx={{ justifyContent: 'center', alignItems: 'center', mb: 6 }}>
243-
{isLoggedIn ? (
244-
<>
245-
<Button
246-
variant="contained"
247-
color="secondary"
248-
startIcon={<AddPhotoAlternateIcon />}
249-
onClick={() => setShowUpload(!showUpload)}
250-
sx={{ px: 3, py: 1.2 }}
251-
>
252-
{showUpload ? "Upload ausblenden" : "Neue Bilder hochladen"}
253-
</Button>
254-
<Button
255-
variant="outlined"
256-
color="primary"
257-
startIcon={<LibraryAddIcon />}
258-
onClick={handleOpenAdd}
259-
sx={{ px: 3, py: 1.2 }}
260-
>
261-
Album hinzufügen
262-
</Button>
263-
</>
264-
) : (
265-
<Typography variant="body2" color="text.secondary" sx={{ fontStyle: 'italic', border: '1px solid rgba(255, 255, 255, 0.08)', p: 2, borderRadius: 2, bgcolor: 'rgba(0,0,0,0.2)' }}>
266-
🔒 Bitte einloggen, um Bilder hochzuladen oder Alben hinzuzufügen.
267-
</Typography>
268-
)}
269-
</Stack>
244+
{isTeamMember && (
245+
<Stack direction={{ xs: 'column', sm: 'row' }} spacing={2} sx={{ justifyContent: 'center', alignItems: 'center', mb: 6 }}>
246+
<Button
247+
variant="contained"
248+
color="secondary"
249+
startIcon={<AddPhotoAlternateIcon />}
250+
onClick={() => setShowUpload(!showUpload)}
251+
sx={{ px: 3, py: 1.2 }}
252+
>
253+
{showUpload ? "Upload ausblenden" : "Neue Bilder hochladen"}
254+
</Button>
255+
<Button
256+
variant="outlined"
257+
color="primary"
258+
startIcon={<LibraryAddIcon />}
259+
onClick={handleOpenAdd}
260+
sx={{ px: 3, py: 1.2 }}
261+
>
262+
Album hinzufügen
263+
</Button>
264+
</Stack>
265+
)}
270266

271267
{/* Immich Drop Upload Iframe */}
272-
{isLoggedIn && showUpload && (
268+
{isTeamMember && showUpload && (
273269
<Box sx={{
274270
width: '100%',
275271
height: 500,
@@ -290,7 +286,7 @@ export default function Gallery() {
290286
)}
291287

292288
{/* Timeline of DB Galleries */}
293-
{dbAlbums.length > 0 && (
289+
{isTeamMember && dbAlbums.length > 0 && (
294290
<Box sx={{ mb: 8 }}>
295291
<Typography variant="h4" sx={{ borderBottom: '2px solid', borderColor: 'primary.main', pb: 1, mb: 4, fontWeight: 'bold' }}>
296292
Events-Timeline & Alben
@@ -346,7 +342,7 @@ export default function Gallery() {
346342

347343
return sortedAlbums.map((album) => {
348344
const isCreator = album.creatorName === currentUsername;
349-
const canModify = isLoggedIn && (isCreator || isAdmin);
345+
const canModify = isTeamMember && (isCreator || isAdmin);
350346

351347
return (
352348
<Grid size={{ xs: 12, sm: 6, md: 4 }} key={album.id} sx={{ display: 'flex' }}>
@@ -509,8 +505,9 @@ export default function Gallery() {
509505

510506
{/* Custom dialog for deleting album */}
511507
<Dialog open={deleteDialogOpen} onClose={handleCloseDelete} fullWidth maxWidth="xs">
512-
<DialogTitle sx={{ fontWeight: 'bold', borderBottom: '1px solid rgba(255,255,255,0.08)', color: 'error.main' }}>
513-
⚠️ Album löschen?
508+
<DialogTitle sx={{ fontWeight: 'bold', borderBottom: '1px solid rgba(255,255,255,0.08)', color: 'error.main', display: 'flex', alignItems: 'center', gap: 1 }}>
509+
<WarningIcon color="error" />
510+
Album löschen?
514511
</DialogTitle>
515512
<DialogContent sx={{ p: 3, mt: 1 }}>
516513
<Typography variant="body1" sx={{ mb: 2 }}>

‎src/Pages/Rules/Rules.jsx‎

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,25 @@ import TextField from '@mui/material/TextField';
1414
import InputAdornment from '@mui/material/InputAdornment';
1515
import IconButton from '@mui/material/IconButton';
1616
import GavelIcon from '@mui/icons-material/Gavel';
17-
import LibraryBooksIcon from '@mui/icons-material/LibraryBooks';
1817
import SearchIcon from '@mui/icons-material/Search';
1918
import ClearIcon from '@mui/icons-material/Clear';
2019

2120
const generalRules = [
2221
{
2322
title: 'Mindestalter',
24-
text: '18 Jahre. Diese Grenze ist so gesetzt, da es für uns einfach vieles einfacher macht. Zudem sind die meisten Großevents erst ab 18 Jahren zugänglich.'
23+
text: '18 Jahre. Diese Grenze ist so gesetzt, da es vieles für uns einfacher macht. Zudem sind die meisten Großevents erst ab 18 Jahren zugänglich.'
2524
},
2625
{
2726
title: 'Teamtarn',
28-
text: 'Atacs-FG. Bei uns gibt es keine strikte Kleider- oder Ausrüstungsordnung. Grob gesagt, kann jeder spielen wie er möchte (Schutzbrille ausgenommen). Wenn wir als Gruppe bei größeren Events unterwegs sind, ist es gewünscht, dass alle im Teamtarn auftreten. Auf kleineren Events oder frei organisierten Spielen ist es jedem freigestellt, was er anzieht.'
27+
text: 'A-TACS FG. Bei uns gibt es keine strikte Kleider- oder Ausrüstungsordnung. Grob gesagt, kann jeder spielen, wie er möchte (Schutzbrille ausgenommen). Wenn wir als Gruppe bei größeren Events unterwegs sind, ist es gewünscht, dass alle im Teamtarn auftreten. Auf kleineren Events oder frei organisierten Spielen ist es jedem freigestellt, was er anzieht.'
2928
},
3029
{
3130
title: 'Spielstil',
32-
text: 'Hauptsächlich sind wir auf von uns oder Freunden organisierten Spielen unterwegs, egal ob in Frankreich, Tschechien oder Österreich. Diese Spiele gehen dann meistens in Richtung Speedsoft. Wir sind aber auch sehr gerne auf großen Events wie der Beerzone oder Borderwar unterwegs. Dort fügen wir uns den örtlichen Gegebenheiten und arbeiten strategisch in großen Gruppen. Auch die Events der Airsofthelden besuchen wir regelmäßig (Miliz auf der DE oder Tschernobyl).'
31+
text: 'Hauptsächlich sind wir auf von uns oder Freunden organisierten Spielen unterwegs, egal ob in Frankreich, Tschechien oder Österreich. Diese Spiele gehen dann meistens in Richtung Speedsoft. Wir sind aber auch sehr gerne auf großen Events wie der Beerzone oder Borderwar unterwegs. Dort passen wir uns den örtlichen Gegebenheiten an und arbeiten strategisch in großen Gruppen. Auch die Events der Airsofthelden besuchen wir regelmäßig (Miliz auf der DE oder Tschernobyl).'
3332
},
3433
{
3534
title: 'Mitgliedsbeitrag',
36-
text: 'Die Mitgliedschaft kostet bei uns 40 Euro pro Jahr. Dieser Betrag wird unter anderem für das Hosten der Webseite benutzt. Außerdem werden gemeinsame Feste und Investitionen aus der Teamkasse bezahlt.'
35+
text: 'Die Mitgliedschaft kostet bei uns 40 Euro pro Jahr. Dieser Betrag wird unter anderem für das Hosten der Webseite verwendet. Außerdem werden gemeinsame Feste und Investitionen aus der Teamkasse bezahlt.'
3736
}
3837
];
3938

@@ -45,7 +44,7 @@ const bylaws = [
4544
{
4645
section: '§2 Zweck, Aufgabe',
4746
content: [
48-
'Das Team bezweckt das Ausüben des Softairsports in Deutschland auf gesichertem Gelände / Gebiet und/oder anderen Ländern.',
47+
'Das Team bezweckt die Ausübung des Softairsports auf gesichertem Gelände / Gebiet in Deutschland und/oder in anderen Ländern.',
4948
'Der Zweck wird insbesondere verwirklicht durch die Errichtung eines Geländes zur Ausübung des taktischen Sports für Übungen und taktische Wettkämpfe. Das Team gibt allen deutschen und ausländischen Softairspielern die Möglichkeit, sich zu treffen und den Softairsport legal auszuüben.',
5049
'Das Team ist selbstlos tätig; es verfolgt nicht in erster Linie eigenwirtschaftliche Zwecke. Mittel des Teams dürfen nur für satzungsmäßige Zwecke verwendet werden.'
5150
]
@@ -56,15 +55,15 @@ const bylaws = [
5655
},
5756
{
5857
section: '§4 Beendigung der Mitgliedschaft',
59-
content: 'Die Mitgliedschaft endet durch Tod, Ausschluss oder durch Austritt aus dem Team. Der Austritt erfolgt durch schriftliche Erklärung gegenüber dem Vorstand. Kündigungsfristen gibt es keine, sofern alle dem Mitglied übertragenen Aufgaben erledigt sind.'
58+
content: 'Die Mitgliedschaft endet durch Tod, Ausschluss oder durch Austritt aus dem Team. Der Austritt erfolgt durch schriftliche Erklärung gegenüber dem Vorstand. Es gibt keine Kündigungsfristen, sofern alle dem Mitglied übertragenen Aufgaben erledigt sind.'
6059
},
6160
{
6261
section: '§5 Aufnahmebeitrag, Mitgliedsbeitrag, Umlagen',
6362
content: 'Von den Mitgliedern werden Jahresbeiträge (aktuell 40 Euro) erhoben. Zur Finanzierung besonderer Vorhaben können Umlagen erhoben werden. Die traditionelle Aufnahmegebühr beträgt einen Kasten Bier.'
6463
},
6564
{
6665
section: '§6 Rechte und Pflichten der Mitglieder',
67-
content: 'Die Mitglieder sind berechtigt, die Einrichtungen und Anlagen des Teams zu benutzen und an den Veranstaltungen teilzunehmen. Sie verpflichten sich zur Einhaltung der Ordnungsvorschriften und zur Förderung des gemeinsamen Vereinszwecks.'
66+
content: 'Die Mitglieder sind berechtigt, die Einrichtungen und Anlagen des Teams zu benutzen und an den Veranstaltungen teilzunehmen. Sie verpflichten sich zur Einhaltung der Ordnungsvorschriften und zur Förderung des gemeinsamen Teamzwecks.'
6867
},
6968
{
7069
section: '§7 Organe des Teams',
@@ -84,11 +83,11 @@ const bylaws = [
8483
},
8584
{
8685
section: '§11 Vorstände',
87-
content: 'Das Team hat drei gleichberechtigte Vorstände, von denen einer die Teamkasse verwaltet und ein Weiterer die Schrift führt.'
86+
content: 'Das Team hat drei gleichberechtigte Vorstände, von denen einer die Teamkasse verwaltet und ein weiterer die Schrift führt.'
8887
},
8988
{
9089
section: '§12 Zuständigkeit des Vorstandes',
91-
content: 'Der Vorstand führt die Geschäfte des Vereins und führt Beschlüsse der Mitgliederversammlung aus.'
90+
content: 'Der Vorstand führt die Geschäfte des Teams und setzt Beschlüsse der Mitgliederversammlung aus.'
9291
},
9392
{
9493
section: '§13 Wahl und Amtsdauer des Vorstands',
@@ -111,7 +110,7 @@ const bylaws = [
111110
content: 'Jedes Mitglied und jeder Gastspieler hat sich an die Satzung sowie die Spielregeln auf den Spielfeldern zu halten.'
112111
},
113112
{
114-
section: '§18 Beschluss und Inkrafttretung',
113+
section: '§18 Beschluss und Inkrafttreten',
115114
content: 'Dieses Regelwerk wurde am 14.12.2013 beschlossen und trat am 01.01.2014 in Kraft. Am 23.07.2019 wurde es überarbeitet und auf den aktuellen Teamnamen angepasst.'
116115
}
117116
];
@@ -168,7 +167,6 @@ export default function Rules() {
168167

169168
{/* Header Info */}
170169
<Stack direction="row" spacing={1.5} sx={{ alignItems: "center", mb: 3 }}>
171-
<LibraryBooksIcon color="primary" sx={{ fontSize: '2.5rem' }} />
172170
<Typography variant="h3" component="h1" sx={{ fontWeight: 'bold', color: 'primary.main' }}>
173171
Regeln & Satzung
174172
</Typography>
@@ -259,7 +257,7 @@ export default function Rules() {
259257
<Typography variant="h6" color="primary.main" sx={{ fontWeight: 'bold', mb: 1.5 }}>
260258
{highlightText(item.section, searchQuery)}
261259
</Typography>
262-
260+
263261
{Array.isArray(item.content) ? (
264262
item.content.map((paragraph, pIdx) => (
265263
<Typography key={pIdx} variant="body2" sx={{ mb: pIdx < item.content.length - 1 ? 1.5 : 0, lineHeight: 1.6, color: 'text.secondary' }}>

0 commit comments

Comments
 (0)