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 @@
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]