diff --git a/.gitignore b/.gitignore index a89d92d..8a8d91a 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ backend/node_modules frontend/.env backend/.env +backend/images/* diff --git a/backend/controllers/memberController.js b/backend/controllers/memberController.js index 04bfa98..f815467 100644 --- a/backend/controllers/memberController.js +++ b/backend/controllers/memberController.js @@ -53,7 +53,6 @@ const getMemberImage = async (req, res) => { try { const { clubId, memberId } = req.params; const { authcode: userToken } = req.headers; - console.log('-------------------->', clubId, memberId, userToken); const result = await MemberService.getMemberImage(userToken, clubId, memberId); if (result.status === 200) { res.sendFile(result.imagePath); diff --git a/backend/server.js b/backend/server.js index fc444b2..27733ce 100644 --- a/backend/server.js +++ b/backend/server.js @@ -33,7 +33,7 @@ app.use(express.json()); app.use('/api/auth', authRoutes); app.use('/api/clubs', clubRoutes); -app.use('/api/clubmembers', memberRoutes); +app.use('/api/clubmembers', memberRoutes); app.use('/api/diary', diaryRoutes); app.use('/api/participants', participantRoutes); app.use('/api/activities', activityRoutes); diff --git a/backend/services/memberService.js b/backend/services/memberService.js index c6a2e24..bbd5ac3 100644 --- a/backend/services/memberService.js +++ b/backend/services/memberService.js @@ -17,18 +17,34 @@ class MemberService { where: { clubId: clubId, approved: false, - userId: user.id + userId: user.id } }); } - async getClubMembers(userToken, clubId) { + getClubMembers(userToken, clubId) { console.log('[getClubMembers] - Check access'); - await checkAccess(userToken, clubId); + checkAccess(userToken, clubId); console.log('[getClubMembers] - Find members'); - const members = await Member.findAll({ where: { clubId: clubId }}); - console.log('[getClubMembers] - return members'); - return members; + return Member.findAll({ where: { clubId: clubId } }) + .then(members => { + return members.map(member => { + const imagePath = path.join('images', 'members', `${member.id}.jpg`); + const hasImage = fs.existsSync(imagePath); + return { + ...member.toJSON(), + hasImage: hasImage + }; + }); + }) + .then(membersWithImageStatus => { + console.log('[getClubMembers] - return members'); + return membersWithImageStatus; + }) + .catch(error => { + console.error('[getClubMembers] - Error:', error); + throw error; + }); } async setClubMember(userToken, clubId, memberId, firstName, lastName, street, city, birthdate, phone, email, active = true) { diff --git a/frontend/src/views/DiaryView.vue b/frontend/src/views/DiaryView.vue index de177f1..dd5ed33 100644 --- a/frontend/src/views/DiaryView.vue +++ b/frontend/src/views/DiaryView.vue @@ -96,10 +96,11 @@

Teilnehmer

Aktivitäten

@@ -147,6 +148,9 @@ +
+ +
@@ -189,6 +193,8 @@ export default { }, predefinedActivities: [], showDropdown: false, + showImage: false, + imageUrl: '', }; }, watch: { @@ -647,7 +653,26 @@ export default { } return firstNameComparison; }); - } + }, + async showPic(member) { + this.loadMemberImage(member); + this.showImage = true; + }, + closeImage() { + this.showImage = false; + this.imageUrl = ''; + }, + async loadMemberImage(member) { + try { + const response = await apiClient.get(`/clubmembers/${this.currentClub}/image/${member.id}`, { + responseType: 'blob', + }); + this.imageUrl = URL.createObjectURL(response.data); + } catch (error) { + console.error("Failed to load member image:", error); + this.imageUrl = null; + } + }, }, async mounted() { await this.init(); @@ -838,4 +863,24 @@ input[type="number"] { .modal-right { flex: 1; } + +.img-icon { + cursor: pointer; +} + +.memberImage { + position: fixed; + max-width: 500px; + max-height: 500px; + top: calc(50% - 250px); + left: calc(50% - 250px); + border: 2px solid #555; + box-shadow: 4px 4px 3px #aaa; + overflow: hidden; + padding: 3px; +} +.memberImage > img { + max-width: 100%; + max-height: 100%; +} diff --git a/frontend/src/views/MembersView.vue b/frontend/src/views/MembersView.vue index c1c40cd..45e9c00 100644 --- a/frontend/src/views/MembersView.vue +++ b/frontend/src/views/MembersView.vue @@ -272,7 +272,7 @@ export default { member.imageUrl = imageUrl; } catch (error) { console.error("Failed to load member image:", error); - member.imageUrl = null; // Fallback, falls das Bild nicht geladen werden kann + member.imageUrl = null; } }, }