Vorname/Nachname für Mitarbeiter, Aufgaben-Duplizierung, Zeitstrahl im Zeitplan
- employees: name-Feld in first_name/last_name aufgeteilt (Schema, API, Formular, alle Namensanzeigen) - Aufgaben können mit neuem Start-/Enddatum dupliziert werden (POST /api/tasks/:id/duplicate übernimmt Name, Stunden, Status und Zuweisungen 1:1, nur die Termine ändern sich) - Zeitplan zeigt jetzt einen Zeitstrahl mit Kalenderwochen und Tagesnummern oberhalb der Projekt-Balken
This commit is contained in:
@@ -1,11 +1,12 @@
|
||||
<script setup>
|
||||
import { reactive } from 'vue';
|
||||
import { store } from './store.js';
|
||||
import { formatDate } from './helpers.js';
|
||||
import { formatDate, fullName } from './helpers.js';
|
||||
|
||||
const newProject = reactive({ name: '', description: '', start_date: '', end_date: '', color: '#4f46e5' });
|
||||
const newTask = reactive({});
|
||||
const newAssignment = reactive({});
|
||||
const newDuplicate = reactive({});
|
||||
const expanded = reactive({});
|
||||
|
||||
async function addProject() {
|
||||
@@ -37,6 +38,18 @@ async function addAssignment(projectId, taskId) {
|
||||
await store.assignEmployee(projectId, taskId, Number(form.employee_id), Number(form.allocated_hours_per_week));
|
||||
Object.assign(form, { employee_id: '', allocated_hours_per_week: 8 });
|
||||
}
|
||||
|
||||
function duplicateForm(taskId) {
|
||||
if (!newDuplicate[taskId]) newDuplicate[taskId] = { start_date: '', end_date: '' };
|
||||
return newDuplicate[taskId];
|
||||
}
|
||||
|
||||
async function duplicateTask(projectId, taskId) {
|
||||
const form = duplicateForm(taskId);
|
||||
if (!form.start_date || !form.end_date) return;
|
||||
await store.duplicateTask(projectId, taskId, { ...form });
|
||||
Object.assign(form, { start_date: '', end_date: '' });
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -103,15 +116,23 @@ async function addAssignment(projectId, taskId) {
|
||||
<button class="btn" @click="addTask(project.id)">Hinzufügen</button>
|
||||
</div>
|
||||
|
||||
<div v-for="task in project.tasks" :key="'assign-' + task.id" class="form-row">
|
||||
<span style="width: 180px">{{ task.name }}:</span>
|
||||
<select v-model="assignmentForm(task.id).employee_id">
|
||||
<option value="" disabled>Mitarbeiter wählen</option>
|
||||
<option v-for="e in store.employees" :key="e.id" :value="e.id">{{ e.name }}</option>
|
||||
</select>
|
||||
<input v-model.number="assignmentForm(task.id).allocated_hours_per_week" type="number" style="width: 90px" placeholder="Std/Woche" />
|
||||
<button class="btn secondary" @click="addAssignment(project.id, task.id)">Zuweisen</button>
|
||||
<button class="btn danger" @click="store.deleteTask(project.id, task.id)">Aufgabe löschen</button>
|
||||
<div v-for="task in project.tasks" :key="'manage-' + task.id" style="border: 1px solid var(--border); border-radius: 6px; padding: 8px; margin-bottom: 8px">
|
||||
<strong>{{ task.name }}</strong>
|
||||
<div class="form-row">
|
||||
<select v-model="assignmentForm(task.id).employee_id">
|
||||
<option value="" disabled>Mitarbeiter wählen</option>
|
||||
<option v-for="e in store.employees" :key="e.id" :value="e.id">{{ fullName(e) }}</option>
|
||||
</select>
|
||||
<input v-model.number="assignmentForm(task.id).allocated_hours_per_week" type="number" style="width: 90px" placeholder="Std/Woche" />
|
||||
<button class="btn secondary" @click="addAssignment(project.id, task.id)">Zuweisen</button>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<span class="muted">Aufgabe zu anderem Zeitraum wiederholen:</span>
|
||||
<input v-model="duplicateForm(task.id).start_date" type="date" />
|
||||
<input v-model="duplicateForm(task.id).end_date" type="date" />
|
||||
<button class="btn secondary" @click="duplicateTask(project.id, task.id)">Duplizieren</button>
|
||||
<button class="btn danger" @click="store.deleteTask(project.id, task.id)">Aufgabe löschen</button>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user