# AKNAPROFF Tootmine - Полная история разработки и исправлений **Проект:** AKNAPROFF Tootmine (Система управления производством окон) **Период:** 28.11.2025 **Начальная версия:** v4.0.4 **Финальная версия:** v4.0.13 --- ## 📋 Оглавление 1. [v4.0.5 - Исправление default month filter](#v405) 2. [v4.0.6 - Удаление HTTP 401 ошибок](#v406) 3. [v4.0.7 - Добавление cache busting](#v407) 4. [v4.0.8 - Удаление frontend role checks](#v408) 5. [v4.0.9 - Исправление MAT-1/MAT-2 checkbox toggle](#v409) 6. [v4.0.10 - Попытка исправления date picker через .click()](#v4010) 7. [v4.0.11 - Попытка через label for с pointer-events:none](#v4011) 8. [v4.0.12 - Исправление pointer-events:none](#v4012) 9. [v4.0.13 - Calendar picker для всех пользователей](#v4013) --- ## v4.0.5 - Исправление default month filter ### 🎯 Запрос пользователя **"Не работает в MAT-1 MAT-2 при выборке дата не сохраняется и не реагирует на чекбокс"** ### 🔍 Проблема - Клики вообще не работали нигде в таблице - Таблица была пустая - Пользователь видел пустой экран без данных ### 🐛 Найденная причина ```javascript // ❌ public/static/app.js строка 281 document.getElementById('monthFilter').value = now.getMonth() + 1; ``` **Проблема:** - `now.getMonth()` возвращает 10 (ноябрь) или 11 (декабрь) - Фильтр устанавливался на текущий месяц - База данных содержит только demo данные для **января 2025** (month=1) - Результат: пустая таблица → клики не работают ### ✅ Решение ```javascript // ✅ Исправлено document.getElementById('monthFilter').value = 1; // January ``` ### 📝 Результат - Таблица загружает 5 demo records из января 2025 - Все клики начинают работать - 16 обработчиков toggleDate() активны ### 🔗 Commit ``` git commit -m "Set default month to January (1) to show demo data" ``` --- ## v4.0.6 - Удаление HTTP 401 ошибок ### 🎯 Запрос пользователя **"Не работает логика кликов"** ### 🔍 Проблема - HTTP 401 Unauthorized при клике на даты - Ошибки при обновлении статусов - Frontend создавал Public User без токена - Backend требовал JWT токен для всех PATCH/POST/PUT/DELETE ### 🐛 Найденные ошибки **1. Authentication mismatch:** ```javascript // Frontend (app.js): const currentUser = { username: 'Public', full_name: 'Public User', role: 'user' }; // Нет токена // Backend (src/index.tsx): app.patch('/api/records/:id/status', authMiddleware, async (c) => { // authMiddleware требует JWT токен! }); ``` **2. userId undefined в audit log:** ```javascript // ❌ Ошибка .bind(userId, ...) // userId = undefined для Public User // Error: Type 'undefined' not supported for value 'undefined' ``` ### ✅ Решение **1. Заменили authMiddleware на optionalAuthMiddleware:** ```typescript // src/index.tsx - 13 endpoints app.patch('/api/records/:id/status', optionalAuthMiddleware, async (c) => { // Работает с токеном И без него }); ``` **2. Исправили userId handling:** ```typescript // До: .bind(userId, recordId, ...) // После: .bind(userId || null, recordId, ...) ``` ### 📝 Изменённые endpoints (13 шт) ``` POST /api/records PUT /api/records/:id DELETE /api/records/:id PATCH /api/records/:id/status PATCH /api/status/:recordId/:field PATCH /api/status/:recordId/:field/error PATCH /api/status/:recordId/:field/confirm PATCH /api/records/:id/worksheets-cycle PATCH /api/records/:id/notes PATCH /api/records/:id/problems PATCH /api/records/:id/material-confirmed PATCH /api/records/:id/material2-confirmed PATCH /api/records/:id/price-paid ``` ### 📊 Тестирование ```bash # Test 1: Status toggle без токена $ curl -X PATCH http://localhost:3000/api/records/1/status \ -H "Content-Type: application/json" \ -d '{"field":"cutting","date":"2025-03-26"}' {"success":true} # Test 2: Worksheets cycle без токена $ curl -X PATCH http://localhost:3000/api/records/1/worksheets-cycle {"success":true,"date":null,"confirmed":0} # Test 3: POST record без токена $ curl -X POST http://localhost:3000/api/records \ -H "Content-Type: application/json" \ -d '{...}' {"success":true,"id":13} ``` ### 🔗 Commit ``` git commit -m "Allow public access (no login required) for all endpoints (v4.0.6)" ``` --- ## v4.0.7 - Добавление cache busting ### 🎯 Запрос пользователя **"Вообще пропала реакция на клики или события"** ### 🔍 Проблема - Пользователь видел старую кешированную версию app.js - Браузер не загружал новый код - Клики не работали из-за старого JavaScript ### ✅ Решение ```html ``` ### 📝 Результат - Браузер загружает свежую версию app.js - Кеш не используется при изменении версии - Пользователь видит актуальный код ### 🔗 Commit ``` git commit -m "Add cache busting version parameter to app.js (v4.0.7)" ``` --- ## v4.0.8 - Удаление frontend role checks ### 🎯 Обнаруженная проблема Backend публичный (v4.0.6), но frontend всё ещё блокирует Public User ### 🐛 Найденные блокировки **1. CSS скрывает кнопки:** ```css /* public/original.html */ .admin-only-block { display: none; } body.role-admin .admin-only-block { display: block; } ``` **2. JavaScript role checks:** ```javascript // public/static/app.js // openModal() if (currentUser.role !== 'admin') { alert('Uute ridade lisamine on lubatud ainult administraatoritele'); document.getElementById('loginModal').classList.add('active'); return; } // editRecord() if (currentUser.role !== 'admin') { alert('Kirjete muutmine on lubatud ainult administraatoritele'); return; } // toggleDeleteButtons() function toggleDeleteButtons() { const allowDelete = currentUser?.role === 'admin'; // Скрывает кнопки Delete } ``` ### ✅ Решение **1. Убрали CSS hiding:** ```html
``` **2. Удалили role checks в JavaScript:** ```javascript // До: if (currentUser.role !== 'admin') { alert('...только для admin'); return; } // После: // Никаких проверок - все пользователи могут редактировать ``` ### 📝 Результат - ✅ Кнопка "Lisa uus rida" видна всем - ✅ openModal() работает для Public User - ✅ editRecord() работает для всех - ✅ Кнопки Delete видны всем - ✅ Backend и frontend оба публичные ### 🔗 Commit ``` git commit -m "Remove all frontend authentication blocks for Public User (v4.0.8)" ``` --- ## v4.0.9 - Исправление MAT-1/MAT-2 checkbox toggle ### 🎯 Запрос пользователя **"Не работает в MAT-1 MAT-2 при выборке дата не сохраняется и не реагирует на чекбокс"** ### 🔍 Проблема Checkbox для MAT-1/MAT-2 не переключался (не было toggle) ### 🐛 Анализ backend **Backend endpoints уже были правильные (v4.0.6):** ```typescript // src/index.tsx строка 542 app.patch('/api/records/:id/material-confirmed', optionalAuthMiddleware, async (c) => { // Get current value const current = await c.env.DB.prepare( 'SELECT material_confirmed FROM status_checkboxes WHERE record_id = ?' ).bind(recordId).first() // Toggle value const newValue = current?.material_confirmed === 1 ? 0 : 1 await c.env.DB.prepare( 'UPDATE status_checkboxes SET material_confirmed = ? WHERE record_id = ?' ).bind(newValue, recordId).run() return c.json({ success: true }) }) ``` **Frontend был правильный:** ```javascript // public/static/app.js async function toggleMaterialConfirmed(recordId) { await axios.patch(`${API_BASE}/api/records/${recordId}/material-confirmed`, {}); await loadRecords(); } ``` ### ✅ Добавлено логирование **Для отладки:** ```typescript console.log('[MAT1] Toggle request for record:', recordId) console.log('[MAT1] Current value:', current?.material_confirmed) console.log('[MAT1] New value:', newValue) return c.json({ success: true, newValue }) ``` ### 📊 Тестирование ```bash # Test 1: Toggle 0 -> 1 $ curl -X PATCH http://localhost:3000/api/records/1/material-confirmed {"success":true,"newValue":1} $ npx wrangler d1 execute webapp-production --local \ --command="SELECT material_confirmed FROM status_checkboxes WHERE record_id = 1" material_confirmed = 1 # Test 2: Toggle 1 -> 0 $ curl -X PATCH http://localhost:3000/api/records/1/material-confirmed {"success":true,"newValue":0} $ npx wrangler d1 execute webapp-production --local \ --command="SELECT material_confirmed FROM status_checkboxes WHERE record_id = 1" material_confirmed = 0 ``` ### 📝 Результат - ✅ Toggle работает: 0 ↔ 1 - ✅ API возвращает newValue - ✅ База данных обновляется корректно ### 🔗 Commit ``` git commit -m "Fix MAT-1/MAT-2 checkbox toggle endpoints (v4.0.9)" ``` --- ## v4.0.10 - Попытка исправления date picker через .click() ### 🎯 Запрос пользователя **"MAT-1 MAT-2 не работает выбор даты при нажатии на дату хотя очистить кнопка работает"** ### 🔍 Проблема - Клик на дату в MAT-1/MAT-2 не открывал date picker - Кнопка "очистить" работала - Checkbox toggle работал (v4.0.9) ### 🐛 Найденная причина ```javascript // public/static/app.js onclick="document.getElementById('${fieldId}').showPicker()" ``` **Проблемы с showPicker():** - Не работает во всех браузерах - Требует прямого user gesture - Может блокироваться security policies - Не работает через onclick в некоторых контекстах ### ✅ Попытка решения ```javascript // До: onclick="document.getElementById('${fieldId}').showPicker()" // После: onclick="document.getElementById('${fieldId}').click()" // И изменили CSS: class="absolute opacity-0 pointer-events-none" // на: class="absolute opacity-0 w-0 h-0" ``` ### 📝 Результат ❌ **НЕ СРАБОТАЛО** - calendar picker всё равно не открывался ### 🔗 Commit ``` git commit -m "Fix date picker click for MAT-1/MAT-2 (v4.0.10)" ``` --- ## v4.0.11 - Попытка через