Files
Aknaproff/HOTFIX_v4.1.15.md
Deploy Bot 64403d6fd6 v4.1.21: Реструктуризация проекта для Synology ARM
- Реструктуризация: 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
2026-01-14 18:37:00 +02:00

7.0 KiB
Raw Blame History

🔧 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 вместо дат

Причина:

  1. Строковые "null" вместо SQL NULL в БД
  2. Backend записывал строку "null" вместо настоящего NULL
  3. 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';

РЕЗУЛЬТАТ

Протестировано:

  1. MAT-1, MAT-2, PAKETT - календари работают
  2. Töölehti, LÕIKUS, KLAAS - toggle работает
  3. VALMIS, VÄLJAS - toggle с блокировкой работает
  4. Даты отображаются в API и таблице
  5. 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