import { state } from '../state.js';
import { renderExercise } from './exercise-card.js';
import { renderCardioItem } from './cardio-card.js';
import { formatDate } from '../utils.js';
export function renderWorkoutCard(w) {
const isActive = !w.endTime;
const isExpanded = state.expandedWorkoutId === w.id;
const isReadOnly = w.synced && w.endTime;
// Определяем цвет тренировки
let clientColor = null;
let clientName = null;
if (w.client_id) {
const client = state.clients.find(c => c.id == w.client_id);
if (client) {
clientColor = client.color;
clientName = client.full_name;
}
}
const div = document.createElement('div');
div.className = 'workout-accordion';
// Добавляем цветной border-left, если есть клиент
if (clientColor) {
div.style.borderLeft = `4px solid ${clientColor}`;
}
const headerClass = `workout-header ${isActive ? 'active' : 'completed'}`;
const dateStr = formatDate(w.startTime);
const typeStr = w.type || 'тип не выбран';
const exCount = w.exercises.length;
const cardioCount = w.cardio.length;
let statusBadge;
if (isReadOnly) statusBadge = '✓ архив';
else if (w.synced) statusBadge = '✓';
else statusBadge = '● не сохранено';
const editDateBtn = !isReadOnly
? `
✎
`
: '';
// Метка клиента (если есть)
const clientLabel = clientName
? `
👤 ${clientName}
`
: '';
div.innerHTML = `
`;
const body = document.createElement('div');
body.className = `workout-body ${isExpanded ? 'expanded' : ''}`;
if (isExpanded) {
body.appendChild(renderWorkoutDetails(w));
}
div.appendChild(body);
return div;
}
export function renderWorkoutDetails(w) {
const wrap = document.createElement('div');
const isActive = !w.endTime;
const isReadOnly = w.synced && w.endTime;
if (isReadOnly) {
const banner = document.createElement('div');
banner.className = 'read-only-banner';
banner.textContent = '🔒 Тренировка в архиве — только просмотр';
wrap.appendChild(banner);
}
// Тип тренировки
const typeCard = document.createElement('div');
typeCard.className = 'card';
if (isReadOnly) {
typeCard.innerHTML = `
Тип тренировки
${w.type || '—'}
`;
} else {
typeCard.innerHTML = `
`;
}
wrap.appendChild(typeCard);
// Кнопки добавления
if (isActive && !isReadOnly) {
const addSection = document.createElement('div');
addSection.className = 'add-section';
addSection.innerHTML = `
`;
wrap.appendChild(addSection);
}
// Кардио: разминка сверху
const cardioWarmup = w.cardio.filter(c => c.purpose === 'warmup' || c.purpose === 'separate');
const cardioCooldown = w.cardio.filter(c => c.purpose === 'cooldown');
if (cardioWarmup.length > 0) {
const title = document.createElement('h4');
title.style.margin = '16px 0 8px';
title.textContent = '🔥 Разминка / Кардио';
wrap.appendChild(title);
cardioWarmup.forEach(c => wrap.appendChild(renderCardioItem(w.id, c, isReadOnly)));
}
// Упражнения
[...w.exercises].reverse().forEach(ex => {
wrap.appendChild(renderExercise(w, ex, isReadOnly));
});
// Заминка внизу
if (cardioCooldown.length > 0) {
const title = document.createElement('h4');
title.style.margin = '16px 0 8px';
title.textContent = '🧘 Заминка';
wrap.appendChild(title);
cardioCooldown.forEach(c => wrap.appendChild(renderCardioItem(w.id, c, isReadOnly)));
}
// Комментарий
const notesCard = document.createElement('div');
notesCard.className = 'card mt-10';
if (isReadOnly) {
notesCard.innerHTML = `
Комментарий
${w.notes || '—'}
`;
} else {
notesCard.innerHTML = `
`;
notesCard.querySelector('textarea').oninput = (e) => {
w.notes = e.target.value;
window.App.saveAndRender();
};
}
wrap.appendChild(notesCard);
// Блок завершения
const finishBlock = document.createElement('div');
finishBlock.className = 'finish-block';
if (isReadOnly) {
finishBlock.innerHTML = `
🔒 Архив
Тренировка синхронизирована и завершена. Редактирование недоступно.
`;
} else if (isActive) {
// Проверяем, есть ли уже данные в тренировке
const hasData = (w.exercises && w.exercises.length > 0) || (w.cardio && w.cardio.length > 0);
// Кнопка отмены показывается ТОЛЬКО если тренировка пустая
const cancelBtnHtml = !hasData ? `
` : '';
finishBlock.innerHTML = `
Завершение тренировки
После завершения данные останутся локально до синхронизации
${cancelBtnHtml}
`;
} else {
finishBlock.innerHTML = `
Тренировка завершена
До синхронизации можно редактировать
`;
}
wrap.appendChild(finishBlock);
return wrap;
}