"Added picsInInternetAllowed field to Member model and updated related controllers, services, and views to handle new field; modified diary date activity routes and diary view; updated member service and member controller to handle new field; added new routes for diary date

This commit is contained in:
Torsten Schulz
2024-11-11 12:05:53 +01:00
parent 247f43f122
commit b5f675f807
11 changed files with 212 additions and 16 deletions

View File

@@ -179,7 +179,7 @@
member.firstName
}} {{
member.lastName }}</span>
<span @click="openNotesModal(member)" class="clickable">📝</span>
<span v-if="false" @click="openNotesModal(member)" class="clickable">📝</span>
<span @click="showPic(member)" class="img-icon" v-if="member.hasImage">&#x1F5BC;</span>
<span class="pointer" @click="openTagInfos(member)"></span>
</li>
@@ -192,7 +192,49 @@
<div class="modal-content">
<span class="close" @click="closeTagHistoryModal">&times;</span>
<h3>Tag-Historie {{ tagHistoryMember.firstName }} {{ tagHistoryMember.lastName }}</h3>
Diese Funktion ist noch nicht implementiert
<div>
<multiselect v-model="selectedMemberDayTags" :options="selectedActivityTags"
placeholder="Tags auswählen" label="name" track-by="id" multiple :close-on-select="false"
:taggable="false" @select="addNewTagForDay" :allow-empty="false" />
</div>
<div v-if="tagHistory">
<div v-for="tag in tagHistory" :key="tag.id">
<div class="tag-headerplement">{{ tag.name }}</div>
<ul class="tag-list">
<li v-for="entry in tag.diaryMemberTags" :key="entry.id">{{
getFormattedDate(entry.diaryDates.date) }}</li>
</ul>
</div>
</div>
</div>
</div>
<div v-if="showNotesModal" class="modal">
<div class="modal-content">
<span class="close" @click="closeNotesModal">&times;</span>
<h3>Notizen für {{ noteMember.firstName }} {{ noteMember.lastName }}</h3>
<div>Telefon-Nr.: {{ noteMember.phone }}</div>
<div class="modal-body">
<div class="modal-left">
<img v-if="noteMember.imageUrl" :src="noteMember.imageUrl" alt="Mitgliedsbild"
style="width: 250px; height: 250px; object-fit: cover;" />
</div>
<div class="modal-right">
<multiselect v-model="selectedMemberTags" :options="availableTags" placeholder="Tags auswählen"
label="name" track-by="id" multiple :close-on-select="false"
@tag="addNewTagForMemberFromSelection" @remove="removeMemberDayTag" allow-empty="false" />
<div>
<textarea v-model="newNoteContent" placeholder="Neue Notiz" rows="4" cols="30"></textarea>
<button @click="addMemberNote">Hinzufügen</button>
</div>
<ul>
<li v-for="note in notes" :key="note.id">
<button @click="deleteNote(note.id)" class="cancel-action">Löschen</button>
{{ note.content }}
</li>
</ul>
</div>
</div>
</div>
</div>
<div v-if="showImage" class="memberImage">
@@ -231,6 +273,7 @@ export default {
showNotesModal: false,
selectedActivityTags: [],
selectedMemberTags: [],
selectedMemberDayTags: [],
availableTags: [],
previousActivityTags: [],
previousMemberTags: [],
@@ -259,6 +302,7 @@ export default {
doMemberTagUpdates: true,
showTagHistoryModal: false,
tagHistoryMember: null,
tagHistory: null,
};
},
watch: {
@@ -887,13 +931,34 @@ export default {
this.editingGroupId = null;
},
async openTagInfos(member) {
if (!member) {
console.warn("Member is undefined or null");
return;
}
this.showTagHistoryModal = true;
this.tagHistoryMember = member;
const tags = await apiClient.get(`/diarydatetags/${this.currentClub}/${member.id}`);
this.tagHistory = tags.data;
},
closeTagHistoryModal() {
this.showTagHistoryModal = false;
this.tagHistoryMember = null;
},
async addNewTagForDay(tag) {
await apiClient.post(`/diarydatetags/${this.currentClub}`, {
dateId:this.date.id,
memberId: this.tagHistoryMember.id,
tag: tag,
});
},
async removeDayTag(tag) {
},
async addNewDayTagFromInput(event) {
const tag = event.target.value;
if (tag) {
await this.addNewTagForDay(tag);
}
},
},
async mounted() {
await this.init();
@@ -1162,4 +1227,12 @@ img {
display: flex;
flex-direction: column;
}
.tag-header {
margin: 0
}
.tag-list {
margin: 0 0 1em 1.5em;
}
</style>

View File

@@ -21,6 +21,7 @@
<label><span>Telefon-Nr.:</span> <input type="text" v-model="newPhone"></label>
<label><span>Email-Adresse:</span> <input type="email" v-model="newEmail"></label>
<label><span>Aktiv:</span> <input type="checkbox" v-model="newActive"></label>
<label><span>Pics in Internet erlaubt:</span> <input type="checkbox" v-model="newPicsInInternetAllowed"></label>
<label><span>Testmitgliedschaft:</span> <input type="checkbox" v-model="testMembership" </label>
<label><span>Bild:</span> <input type="file" @change="onFileSelected"></label>
<div v-if="memberImagePreview">
@@ -41,7 +42,7 @@
<table>
<thead>
<tr>
<th>Bild</th>
<th>Bild (Inet?)</th>
<th>Testm.</th>
<th>Name, Vorname</th>
<th>Adresse</th>
@@ -58,6 +59,7 @@
<img v-if="member.imageUrl" :src="member.imageUrl" alt="Mitgliedsbild"
style="max-width: 50px; max-height: 50px;"
@click.stop="openImageModal(member.imageUrl)">
<span>{{ member.picsInInternetAllowed ? '✓' : '' }}</span>
</td>
<td>{{ member.testMembership ? '*' : '' }}</td>
<td>{{ member.lastName }}, {{ member.firstName }}</td>
@@ -132,6 +134,7 @@ export default {
selectedImageUrl: null,
testMembership: false,
showInactiveMembers: false,
newPicsInInternetAllowed: false
}
},
async mounted() {
@@ -172,6 +175,8 @@ export default {
this.newPhone = '';
this.newEmail = '';
this.newActive = true;
this.newPicsInInternetAllowed = false;
this.testMembership = true;
this.memberImage = null;
this.memberImagePreview = null;
},
@@ -197,7 +202,8 @@ export default {
email: this.newEmail,
active: this.newActive,
id: this.memberToEdit ? this.memberToEdit.id : null,
testMembership: this.testMembership
testMembership: this.testMembership,
picsInInternetAllowed: this.newPicsInInternetAllowed,
};
let response;
@@ -241,6 +247,7 @@ export default {
const date = new Date(member.birthDate);
this.newBirthdate = date.toISOString().split('T')[0];
this.testMembership = member.testMembership;
this.newPicsInInternetAllowed = member.picsInInternetAllowed;
try {
const response = await apiClient.get(`/clubmembers/image/${member.id}`, {
responseType: 'blob'