shinkan-jinkendo/frontend/src/utils/trainingUnitEditorCore.js

134 lines
4.8 KiB
JavaScript
Raw Normal View History

import { buildPlanPayloadForSave, defaultSection } from './trainingUnitSectionsForm'
import { sessionAssignDefaults } from './trainingPlanningPageHelpers'
/** Leeres Formular für neue Einheit (ohne async Varianten-Anreicherung). */
export function createEmptyTrainingUnitFormData({
groupId = '',
plannedDate = '',
timeStart = '',
timeEnd = '',
} = {}) {
return {
group_id: groupId != null ? String(groupId) : '',
planned_date: plannedDate || '',
planned_time_start: timeStart || '',
planned_time_end: timeEnd || '',
planned_focus: '',
actual_date: '',
actual_time_start: '',
actual_time_end: '',
attendance_count: '',
status: 'planned',
notes: '',
trainer_notes: '',
debrief_completed: false,
sections: [defaultSection('Hauptteil')],
...sessionAssignDefaults(),
}
}
/**
* API-Zeile → Formular (sync). `sections` müssen vorher via normalizeUnitToForm + enrich kommen.
* @param {object} fullUnit
* @param {object} sections — bereits angereicherte Editor-Sections
*/
export function trainingUnitToFormFields(fullUnit, sections) {
const efLead =
fullUnit.effective_lead_trainer_profile_id != null
? Number(fullUnit.effective_lead_trainer_profile_id)
: null
let assistantIds = []
if (Array.isArray(fullUnit.assistant_trainer_profile_ids)) {
assistantIds = fullUnit.assistant_trainer_profile_ids
.map((x) => Number(x))
.filter((n) => Number.isFinite(n) && n >= 1)
}
if (efLead != null && Number.isFinite(efLead)) {
assistantIds = assistantIds.filter((id) => id !== efLead)
}
return {
group_id: fullUnit.group_id,
planned_date: fullUnit.planned_date || '',
planned_time_start: fullUnit.planned_time_start?.slice?.(0, 5) || fullUnit.planned_time_start || '',
planned_time_end: fullUnit.planned_time_end?.slice?.(0, 5) || fullUnit.planned_time_end || '',
planned_focus: fullUnit.planned_focus || '',
actual_date: fullUnit.actual_date || '',
actual_time_start: fullUnit.actual_time_start?.slice?.(0, 5) || fullUnit.actual_time_start || '',
actual_time_end: fullUnit.actual_time_end?.slice?.(0, 5) || fullUnit.actual_time_end || '',
attendance_count: fullUnit.attendance_count ?? '',
status: fullUnit.status || 'planned',
notes: fullUnit.notes || '',
trainer_notes: fullUnit.trainer_notes || '',
debrief_completed: Boolean(fullUnit.debrief_completed_at),
sections,
lead_trainer_profile_id:
fullUnit.lead_trainer_profile_id != null && fullUnit.lead_trainer_profile_id !== ''
? String(fullUnit.lead_trainer_profile_id)
: '',
session_assistants_inherit:
fullUnit.assistant_trainer_profile_ids == null ||
fullUnit.assistant_trainer_profile_ids === undefined,
session_assistant_profile_ids: assistantIds,
}
}
/**
* Formular → API-Payload (identisch zur bisherigen Modal-Logik).
* @param {object} formData
* @param {{ editingUnit?: object|null, draftPlanTemplateId?: string }} opts
*/
export function buildTrainingUnitSavePayload(formData, { editingUnit = null, draftPlanTemplateId = '' } = {}) {
const planPart = buildPlanPayloadForSave(formData.sections)
const payload = {
planned_date: formData.planned_date,
planned_time_start: formData.planned_time_start || null,
planned_time_end: formData.planned_time_end || null,
planned_focus: formData.planned_focus || null,
actual_date: formData.actual_date || null,
actual_time_start: formData.actual_time_start || null,
actual_time_end: formData.actual_time_end || null,
attendance_count: formData.attendance_count ? parseInt(formData.attendance_count, 10) : null,
status: formData.status || 'planned',
notes: formData.notes || null,
trainer_notes: formData.trainer_notes || null,
...planPart,
}
if (editingUnit) {
payload.debrief_completed =
(formData.status || '') === 'completed' ? !!formData.debrief_completed : false
}
const leadStr = String(formData.lead_trainer_profile_id || '').trim()
if (leadStr) {
payload.lead_trainer_profile_id = parseInt(leadStr, 10)
} else if (editingUnit) {
payload.lead_trainer_profile_id = null
}
if (formData.session_assistants_inherit) {
if (editingUnit) payload.assistant_trainer_profile_ids = null
} else {
payload.assistant_trainer_profile_ids = [...(formData.session_assistant_profile_ids || [])].sort(
(a, b) => a - b
)
}
if (!editingUnit) {
payload.group_id = parseInt(formData.group_id, 10)
if (draftPlanTemplateId) {
payload.plan_template_id = parseInt(draftPlanTemplateId, 10)
}
}
return payload
}
export function validateTrainingUnitFormForSave(formData) {
if (!formData?.group_id || !formData?.planned_date) {
return { ok: false, message: 'Gruppe und Datum sind Pflichtfelder' }
}
return { ok: true }
}