-
+
+
+ @input="onNewItemInputChange"
+ style="flex: 1;" />
@@ -430,6 +447,7 @@ import Multiselect from 'vue-multiselect';
import Sortable from 'sortablejs';
import PDFGenerator from '../components/PDFGenerator.js';
import CourtDrawingRender from '../components/CourtDrawingRender.vue';
+import CourtDrawingDialog from '../components/CourtDrawingDialog.vue';
import InfoDialog from '../components/InfoDialog.vue';
import ConfirmDialog from '../components/ConfirmDialog.vue';
import ImageDialog from '../components/ImageDialog.vue';
@@ -444,6 +462,7 @@ export default {
components: {
Multiselect,
CourtDrawingRender,
+ CourtDrawingDialog,
InfoDialog,
ConfirmDialog,
ImageDialog,
@@ -558,7 +577,9 @@ export default {
lastName: '',
birthDate: '',
gender: ''
- }
+ },
+ // Court Drawing Dialog
+ showDrawingDialog: false
};
},
watch: {
@@ -1731,10 +1752,58 @@ export default {
chooseNewItemSuggestion(s) {
this.newPlanItem.activity = (s.code && s.code.trim() !== '') ? s.code : s.name;
+ this.newPlanItem.durationText = s.durationText || '';
+ this.newPlanItem.duration = s.duration || '';
this.newItemShowDropdown = false;
this.newItemSearchResults = [];
},
+ async handleDrawingDialogOkForDiary(result) {
+ if (!result || !result.code) {
+ this.showInfo('Fehler', 'Keine Übungsdaten erhalten', '', 'error');
+ return;
+ }
+
+ try {
+ const code = result.code.trim();
+
+ // Suche nach existierender Aktivität mit diesem Code
+ const searchResults = await this.searchPredefinedActivities(code);
+ const existing = searchResults.find(a =>
+ a.code && a.code.trim().toLowerCase() === code.toLowerCase()
+ );
+
+ let activityToUse;
+
+ if (existing) {
+ // Aktivität existiert bereits - verwende diese
+ activityToUse = existing;
+ } else {
+ // Erstelle neue PredefinedActivity
+ const newActivity = {
+ name: result.name || result.fields?.name || '',
+ code: code,
+ description: result.description || result.fields?.description || '',
+ drawingData: result.drawingData || null
+ };
+
+ const response = await apiClient.post('/predefined-activities', newActivity);
+ activityToUse = response.data;
+ }
+
+ // Setze die Aktivität im Formular
+ this.chooseNewItemSuggestion(activityToUse);
+
+ // Erstelle automatisch den Plan-Eintrag
+ await this.addPlanItem();
+
+ } catch (error) {
+ console.error('Fehler beim Verarbeiten der Übungszeichnung:', error);
+ const msg = error.response?.data?.error || 'Fehler beim Erstellen der Aktivität';
+ this.showInfo('Fehler', msg, '', 'error');
+ }
+ },
+
async loadTrainingPlan() {
try {
this.trainingPlan = await apiClient.get(`/diary-date-activities/${this.currentClub}/${this.date.id}`).then(response => response.data);
@@ -2651,6 +2720,29 @@ img {
font-size: 0.9rem !important;
}
+.btn-palette {
+ background: linear-gradient(135deg, #4CAF50, #45a049);
+ color: white;
+ border: none;
+ border-radius: 4px;
+ padding: 0.25rem;
+ font-size: 1rem;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ width: 1.75rem;
+ height: 0.75rem;
+ margin: 0 !important;
+ margin-left: 0 !important;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.btn-palette:hover {
+ background: linear-gradient(135deg, #45a049, #3d8b40);
+ transform: translateY(-1px);
+}
+
.modal .btn-primary:hover {
background-color: #0056b3 !important;
}
diff --git a/frontend/src/views/PredefinedActivities.vue b/frontend/src/views/PredefinedActivities.vue
index 414b858..d40d5cc 100644
--- a/frontend/src/views/PredefinedActivities.vue
+++ b/frontend/src/views/PredefinedActivities.vue
@@ -47,6 +47,11 @@
{{ editModel.id ? 'Aktivität bearbeiten' : 'Neue Aktivität' }}
+
+
+
|