- Реструктуризация: src/ разбит на middleware/, utils/, repositories/ (удалены), routes/ (удалены) - Добавлен src/original-html.ts — полный HTML с reportModal - Добавлен src/index.tsx.backup — React-компонент с reportModal - Миграции переименованы (0001_initial_schema.sql) - Добавлена миграция 0018 (удалена позже) - Docker: multi-stage build, wrangler.toml - Frontend: public/static/app.js + style.css - seed.sql добавлен - Документация: CHANGELOG, CHANGES_v4.1.0-4.1.9, PROJECT_STRUCTURE
7.0 KiB
7.0 KiB
🔧 HOTFIX v4.1.15 - DATE FIELDS DISPLAY FIX
Release Date: 2026-01-14
Priority: CRITICAL - Fixes invisible date fields
Status: ✅ Production Ready
🐛 ПРОБЛЕМА
Симптомы:
- Даты НЕ отображаются в полях: PAKETT, Töölehti, LÕIKUS, KLAAS, VALMIS, VÄLJAS
- Клик по ячейке не показывает дату
- API запросы проходят без ошибок
- Frontend получает
nullвместо дат
Причина:
- Строковые "null" вместо SQL NULL в БД
- Backend записывал строку
"null"вместо настоящего NULL - Toggle отправлял
date: null, что интерпретировалось как "установить NULL"
✅ ИСПРАВЛЕНИЯ
1. Backend UPDATE для status_checkboxes (v4.1.12 → v4.1.13)
Файл: src/index.tsx
// ❌ БЫЛО:
data.material_date || null,
data.material2_date || null,
data.package_date || null,
// ✅ СТАЛО:
const materialDate = (data.material_date && data.material_date !== 'null') ? data.material_date : null
const material2Date = (data.material2_date && data.material2_date !== 'null') ? data.material2_date : null
const packageDate = (data.package_date && data.package_date !== 'null') ? data.package_date : null
2. Backend PATCH /api/records/:id/status (v4.1.13 → v4.1.14)
Файл: src/index.tsx
// ❌ БЫЛО:
const newDate = date !== undefined ? date : (oldRecord?.[dbField] ? null : new Date().toISOString().split('T')[0])
// ✅ СТАЛО:
let newDate: string | null
if (date !== undefined) {
// Явная конвертация строки "null" в NULL
newDate = (date && date !== 'null') ? date : null
} else {
// Toggle: если дата есть → удалить, если нет → установить сегодня
newDate = oldRecord?.[dbField] ? null : new Date().toISOString().split('T')[0]
}
3. Frontend toggleDate (v4.1.14 → v4.1.15)
Файл: public/static/app.js
// ❌ БЫЛО:
{ field, date: currentDate } // Передавался null, блокируя toggle
// ✅ СТАЛО:
{ field } // НЕ передаётся date, активируется toggle логика
4. Database Fix
Исправлены все строковые "null" в БД:
UPDATE status_checkboxes SET material_date = NULL WHERE material_date = 'null';
UPDATE status_checkboxes SET material2_date = NULL WHERE material2_date = 'null';
UPDATE status_checkboxes SET package_date = NULL WHERE package_date = 'null';
UPDATE status_checkboxes SET worksheets_date = NULL WHERE worksheets_date = 'null';
UPDATE status_checkboxes SET cutting_date = NULL WHERE cutting_date = 'null';
UPDATE status_checkboxes SET glazing_date = NULL WHERE glazing_date = 'null';
UPDATE status_checkboxes SET ready_date = NULL WHERE ready_date = 'null';
UPDATE status_checkboxes SET issued_date = NULL WHERE issued_date = 'null';
✅ РЕЗУЛЬТАТ
Протестировано:
- MAT-1, MAT-2, PAKETT - календари работают ✅
- Töölehti, LÕIKUS, KLAAS - toggle работает ✅
- VALMIS, VÄLJAS - toggle с блокировкой работает ✅
- Даты отображаются в API и таблице ✅
- Toggle ON/OFF корректно работает ✅
Тестовые команды:
# Toggle ON
curl -X PATCH "http://localhost:3000/api/records/49/status" \
-H "Authorization: Bearer $TOKEN" \
-d '{"field":"worksheets"}'
# Результат: worksheets_date = "2026-01-14"
# Toggle OFF
curl -X PATCH "http://localhost:3000/api/records/49/status" \
-H "Authorization: Bearer $TOKEN" \
-d '{"field":"worksheets"}'
# Результат: worksheets_date = null
🚀 РАЗВЁРТЫВАНИЕ
Быстрое обновление:
# 1. Остановить сервис
docker-compose down
# 2. Бэкап данных
cp -r data data.backup.$(date +%Y%m%d)
# 3. Распаковать v4.1.15
unzip aknaproff_production_v4.1.15_FINAL.zip
cd backend
# 4. Исправить БД (ВАЖНО!)
cat > /tmp/fix_nulls.sql << 'EOF'
UPDATE status_checkboxes SET material_date = NULL WHERE material_date = 'null';
UPDATE status_checkboxes SET material2_date = NULL WHERE material2_date = 'null';
UPDATE status_checkboxes SET package_date = NULL WHERE package_date = 'null';
UPDATE status_checkboxes SET worksheets_date = NULL WHERE worksheets_date = 'null';
UPDATE status_checkboxes SET cutting_date = NULL WHERE cutting_date = 'null';
UPDATE status_checkboxes SET glazing_date = NULL WHERE glazing_date = 'null';
UPDATE status_checkboxes SET ready_date = NULL WHERE ready_date = 'null';
UPDATE status_checkboxes SET issued_date = NULL WHERE issued_date = 'null';
EOF
# Применить исправление (если используется SQLite напрямую)
sqlite3 data/v3/d1/miniflare-D1DatabaseObject/*.sqlite < /tmp/fix_nulls.sql
# 5. Запустить сервис
docker-compose up -d --build
# 6. Проверить
curl http://localhost:8180/api/records?month=1&year=2025
📊 СРАВНЕНИЕ ВЕРСИЙ
| Функция | v4.1.12 | v4.1.15 |
|---|---|---|
| Даты отображаются | ❌ Все NULL | ✅ Корректно |
| Toggle работает | ❌ Не работает | ✅ Работает |
| Редактирование дат | ❌ Строковые "null" | ✅ Настоящие NULL |
| Backend UPDATE | ❌ || null |
✅ Явная конвертация |
| Frontend toggle | ❌ Передаёт date: null |
✅ Не передаёт date |
| БД целостность | ❌ Строковые "null" | ✅ SQL NULL |
📝 CHANGELOG
v4.1.15 (2026-01-14) - HOTFIX
- ✅ Frontend: toggleDate НЕ передаёт date параметр
- ✅ Cache version обновлён до 4.1.15
v4.1.14 (2026-01-14) - HOTFIX
- ✅ Backend: улучшена логика toggle с явной конвертацией "null"
- ✅ БД: исправлены все строковые "null" → SQL NULL
v4.1.13 (2026-01-14) - HOTFIX
- ✅ Backend: добавлена конвертация "null" строк в UPDATE status_checkboxes
- ✅ Frontend: price default изменён с null на 0
v4.1.12 (2026-01-14)
- ✅ Backend: UPDATE теперь обновляет ОБЕ таблицы
- ✅ Frontend: исправлен price || null → || 0
🎯 СТАТУС
ВСЁ РАБОТАЕТ!
- ✅ Даты видны в таблице
- ✅ Toggle работает (ON/OFF)
- ✅ Календари работают (MAT-1, MAT-2, PAKETT)
- ✅ Блокировка VALMIS/VÄLJAS работает
- ✅ Audit log записывается
- ✅ Права доступа корректны
Version: v4.1.15 FINAL
Build Date: 2026-01-14
Status: Production Ready ✅