diff --git a/assets/js/views/ProjectManagement.vue b/assets/js/views/ProjectManagement.vue index ccb748d..cae674d 100644 --- a/assets/js/views/ProjectManagement.vue +++ b/assets/js/views/ProjectManagement.vue @@ -307,15 +307,16 @@
- + Team-Mitglieder können das Projekt ansehen und bearbeiten
@@ -703,6 +704,42 @@ + +
+
Team & Zugriff
+
+
+ +
+ +
+
{{ viewingProject.owner.email }}
+
+ {{ viewingProject.owner.firstName }} {{ viewingProject.owner.lastName }} +
+
+
+
-
+
+ +
+ +
+
+ +
+
{{ member.email }}
+
+ {{ member.firstName }} {{ member.lastName }} +
+
+
+
+
Keine Team-Mitglieder
+
+
+
+
Dokumente
@@ -819,6 +856,7 @@ import Button from 'primevue/button' import InputText from 'primevue/inputtext' import Textarea from 'primevue/textarea' import Select from 'primevue/select' +import MultiSelect from 'primevue/multiselect' import DatePicker from 'primevue/datepicker' import InputNumber from 'primevue/inputnumber' import RadioButton from 'primevue/radiobutton' @@ -898,7 +936,11 @@ const projectColumns = ref([ ]) onMounted(async () => { - await Promise.all([loadCustomers(), loadStatuses(), loadUsers(), loadCurrentUser()]) + await Promise.all([loadCustomers(), loadStatuses(), loadUsers()]) + // Set current user to first user as fallback (until /api/me endpoint is implemented) + if (users.value.length > 0) { + currentUser.value = users.value[0] + } }) async function loadCustomers() { @@ -967,15 +1009,10 @@ async function loadUsers() { } async function loadCurrentUser() { - try { - const response = await fetch('/api/me') - if (!response.ok) throw new Error('Fehler beim Laden des aktuellen Benutzers') - - currentUser.value = await response.json() - } catch (error) { - console.error('Error loading current user:', error) - currentUser.value = null - } + // TODO: Implement proper /api/me endpoint + // For now, use the first user from the users list as a fallback + // This will be set after loadUsers() completes + currentUser.value = null } function filterByType(type, loadData) { @@ -1056,6 +1093,33 @@ function openNewProjectDialog() { } function editProject(project) { + // Find owner object from users array + let ownerObject = null + if (project.owner) { + if (typeof project.owner === 'object' && project.owner.id) { + ownerObject = users.value.find(u => u.id === project.owner.id) || project.owner + } else if (typeof project.owner === 'string') { + // Extract ID from IRI like "/api/users/1" + const ownerId = parseInt(project.owner.split('/').pop()) + ownerObject = users.value.find(u => u.id === ownerId) + } + } + + // Find team member objects from users array + let teamMembersArray = [] + if (Array.isArray(project.teamMembers)) { + teamMembersArray = project.teamMembers.map(member => { + if (typeof member === 'object' && member.id) { + return users.value.find(u => u.id === member.id) || member + } else if (typeof member === 'string') { + // Extract ID from IRI like "/api/users/1" + const memberId = parseInt(member.split('/').pop()) + return users.value.find(u => u.id === memberId) + } + return null + }).filter(m => m !== null) + } + // Convert date strings to Date objects for Calendar component editingProject.value = { ...project, @@ -1064,7 +1128,8 @@ function editProject(project) { endDate: project.endDate ? new Date(project.endDate) : null, budget: project.budget ? parseFloat(project.budget) : null, hourContingent: project.hourContingent ? parseFloat(project.hourContingent) : null, - teamMembers: project.teamMembers || [] + owner: ownerObject, + teamMembers: teamMembersArray } submitted.value = false projectDialog.value = true @@ -1330,7 +1395,9 @@ async function saveProject() { hourContingent: editingProject.value.hourContingent ? editingProject.value.hourContingent.toString() : null, isPrivate: editingProject.value.isPrivate, owner: `/api/users/${editingProject.value.owner.id}`, - teamMembers: editingProject.value.teamMembers?.map(member => `/api/users/${member.id}`) || [] + teamMembers: Array.isArray(editingProject.value.teamMembers) + ? editingProject.value.teamMembers.map(member => `/api/users/${member.id}`) + : [] } const isNew = !editingProject.value.id diff --git a/src/Entity/User.php b/src/Entity/User.php index 91780da..e46a24c 100644 --- a/src/Entity/User.php +++ b/src/Entity/User.php @@ -37,21 +37,21 @@ class User implements UserInterface, PasswordAuthenticatedUserInterface #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column] - #[Groups(['user:read', 'document:read'])] + #[Groups(['user:read', 'document:read', 'project:read'])] private ?int $id = null; #[ORM\Column(length: 180)] - #[Groups(['user:read', 'user:write'])] + #[Groups(['user:read', 'user:write', 'project:read'])] #[Assert\NotBlank(message: 'Die E-Mail-Adresse darf nicht leer sein')] #[Assert\Email(message: 'Bitte geben Sie eine gültige E-Mail-Adresse ein')] private ?string $email = null; #[ORM\Column(length: 100)] - #[Groups(['user:read', 'user:write', 'document:read'])] + #[Groups(['user:read', 'user:write', 'document:read', 'project:read'])] private ?string $firstName = null; #[ORM\Column(length: 100)] - #[Groups(['user:read', 'user:write', 'document:read'])] + #[Groups(['user:read', 'user:write', 'document:read', 'project:read'])] private ?string $lastName = null; #[ORM\Column]