Files
Aknaproff/HOTFIX_v4.1.17.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

5.3 KiB
Raw Blame History

🔧 HOTFIX v4.1.17 - TOGGLE FIX (LÕIKUS, KLAAS, VALMIS, VÄLJAS)

Дата: 2026-01-14
Тип: Critical Bugfix Release
Статус: Production Ready


🚨 КРИТИЧЕСКАЯ ПРОБЛЕМА ИСПРАВЛЕНА

Проблема: LÕIKUS, KLAAS, VALMIS, VÄLJAS не работали

Симптом:

  • Клик по ячейке есть
  • API запрос уходит (200 OK)
  • Даты НЕ появляются после клика
  • Даты исчезают после первого клика

Причина 1: Frontend не передавал date

В текущем коде:

// app.js:1123 (❌ НЕПРАВИЛЬНО)
{ field }  // date отсутствует!

В оригинальном коде:

// original app.js:1047 (✅ ПРАВИЛЬНО)
{ field, date: currentDate }

Причина 2: Backend toggle логика неправильная

Старая логика:

if (date === oldRecord?.[dbField]) {
  newDate = null  // Clear
} else if (!date) {
  newDate = TODAY  // Add today
}

Проблема: null === null → true → очищает вместо добавления!

Новая логика:

if (!date || date === 'null') {
  // null/empty clicked
  if (oldRecord?.[dbField]) {
    newDate = null  // Cell has date → clear it
  } else {
    newDate = TODAY  // Cell is empty → add today
  }
} else if (date === oldRecord?.[dbField]) {
  newDate = null  // Same date → toggle off
} else {
  newDate = date  // Different date → use it
}

РЕШЕНИЕ

1. Frontend: Передавать currentDate

// public/static/app.js:1121
const response = await axios.patch(
  `${API_BASE}/api/records/${recordId}/status`,
  { field, date: currentDate },  // ✅ Добавлен date
  { headers }
);

2. Backend: Правильная toggle логика

// src/index.tsx:329
if (!date || date === 'null') {
  // Пустая ячейка кликнута
  if (oldRecord?.[dbField]) {
    newDate = null  // Есть дата → удалить
  } else {
    newDate = new Date().toISOString().split('T')[0]  // Нет даты → добавить сегодня
  }
} else if (date === oldRecord?.[dbField]) {
  // Та же дата → toggle off
  newDate = null
} else {
  // Другая дата → использовать её
  newDate = date
}

🧪 ТЕСТИРОВАНИЕ

Test 1: Toggle с датой

# Initial: has date (2025-01-11)
GET /api/records → glazing_date: "2025-01-11"

# Click: same date → should clear
PATCH /api/records/2/status {"field":"glazing","date":"2025-01-11"}
→ Result: null ✅

Test 2: Toggle пустой ячейки

# Initial: empty
GET /api/records → glazing_date: null

# Click: null → should add today
PATCH /api/records/2/status {"field":"glazing","date":null}
→ Result: "2026-01-14"

Test 3: Toggle сегодняшней даты

# Initial: has today
GET /api/records → glazing_date: "2026-01-14"

# Click: today's date → should clear
PATCH /api/records/2/status {"field":"glazing","date":"2026-01-14"}
→ Result: null ✅

📊 СРАВНЕНИЕ

Действие v4.1.16 v4.1.17
Клик по пустой ячейке Ничего Добавляет сегодня
Клик по ячейке с датой Не меняется / исчезает Удаляет дату
Передача date в API Не передавалось Передается currentDate
Toggle логика Неправильная (null === null) Правильная (проверяет oldRecord)

📦 ИЗМЕНЁННЫЕ ФАЙЛЫ

  1. public/static/app.js (строка 1121-1125)

    • Добавлен date: currentDate в PATCH запрос
  2. src/index.tsx (строка 329-348)

    • Исправлена toggle логика
    • Добавлена проверка oldRecord перед toggle
  3. dist/_worker.js (133.43 kB)

    • Пересобран с новой логикой

🚀 ОБНОВЛЕНИЕ

На сервере:

# 1. Остановить
docker-compose down

# 2. Распаковать v4.1.17
unzip aknaproff_production_v4.1.17_FINAL.zip

# 3. Запустить
cd backend/
docker-compose up -d --build

# 4. Проверить
curl http://localhost:8180/api/records?month=1&year=2025 | jq '.[0]'

Проверка:

# Даты видны
→ worksheets_date: "2025-11-26"
→ cutting_date: "2025-01-10"
→ glazing_date: "2025-01-12"
→ ready_date: "2025-01-14"
→ issued_date: "2025-01-15"

СТАТУС

  • LÕIKUS toggle работает
  • KLAAS toggle работает
  • VALMIS toggle работает
  • VÄLJAS toggle работает
  • Töölehti 3-цикл работает
  • MAT-1, MAT-2, PAKETT календари работают
  • 48 реальных записей на месте
  • Production ready

Версия: AKNAPROFF v4.1.17 FINAL
Дата: 2026-01-14
Архив: aknaproff_production_v4.1.17_FINAL.tar.gz
Статус: Production Ready