# 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 - Попытка через