diff --git a/app/src/plugins/tm@modal/task/z-task-modal.vue b/app/src/plugins/tm@modal/task/z-task-modal.vue index 7fd12f4..f474f8d 100644 --- a/app/src/plugins/tm@modal/task/z-task-modal.vue +++ b/app/src/plugins/tm@modal/task/z-task-modal.vue @@ -1051,6 +1051,13 @@ export default { return timesheet; }); + // Filter out existing attachments (from backend) and keep only new File objects + // Existing attachments have 'path' property, new files are File instances + const newFiles = (this.subtask.files || []).filter( + (file) => file instanceof File, + ); + this.subtask.files = newFiles; + // Convert timeblocks from internal format to BE format for update // Filter out completely empty timeblocks AND timeblocks without all required fields // Pre draft s multiple employees preskočiť - timeblocks sú v employees array @@ -1210,21 +1217,28 @@ export default { }, _mergeDeadlineTimeDate() { - // Override for concept tasks which may not have a deadline time set (check for invalid date) - if ( - isNaN(new Date(this.subtask.deadline).getTime()) || - !this.subtask._deadline_time - ) { - this.subtask.deadline = null; - } else { - const date = new Date(this.subtask.deadline); - const timeParts = this.subtask._deadline_time.split(':'); + // Check if deadline date is valid + const isValidDate = !isNaN(new Date(this.subtask.deadline).getTime()); + if (!isValidDate) { + this.subtask.deadline = null; + return; + } + + const date = new Date(this.subtask.deadline); + + // If time is set, use it; otherwise use default time (23:59) for concepts + if (this.subtask._deadline_time) { + const timeParts = this.subtask._deadline_time.split(':'); date.setHours(parseInt(timeParts[0])); date.setMinutes(parseInt(timeParts[1])); - - this.subtask.deadline = date; + } else { + // Default time for concepts without time specified + date.setHours(23); + date.setMinutes(59); } + + this.subtask.deadline = date; }, _filterValidEmployees(employees, isConcept) { diff --git a/be/app/Http/Controllers/SubTaskController.php b/be/app/Http/Controllers/SubTaskController.php index c6f4f1d..a9c24ed 100644 --- a/be/app/Http/Controllers/SubTaskController.php +++ b/be/app/Http/Controllers/SubTaskController.php @@ -381,7 +381,18 @@ class SubTaskController extends Controller } $data['data']['title'] = isset($request->all()['data']['title']) ? $request->all()['data']['title'] : null; $data['data']['deadline'] = isset($request->all()['data']['deadline']) ? $request->all()['data']['deadline'] : null; - $data['data']['estimated_time'] = $request->all()['data']['duration'] ?? $subtask->estimated_time; + + // Pre drafty s viacerými zamestnancami: prepočítaj estimated_time zo všetkých employees + if ($isDraftWithMultipleEmployees && $employeesData) { + $totalEstimatedTime = 0; + foreach ($employeesData as $employee) { + $totalEstimatedTime += $employee['duration'] ?? 0; + } + $data['data']['estimated_time'] = $totalEstimatedTime; + } else { + $data['data']['estimated_time'] = $request->all()['data']['duration'] ?? $subtask->estimated_time; + } + $data['data']['updated_by'] = User::getUserIdFromBearerToken($request->bearerToken()); // publikovanie draftu