diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..6f313c6 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + +[*.yml] +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..967315d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +* text=auto +*.css linguist-vendored +*.scss linguist-vendored +*.js linguist-vendored +CHANGELOG.md export-ignore diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..ee70fb4 --- /dev/null +++ b/.htaccess @@ -0,0 +1,5 @@ + + RewriteEngine On + + RewriteRule ^(.*)$ public/$1 [L] + \ No newline at end of file diff --git a/.styleci.yml b/.styleci.yml new file mode 100644 index 0000000..1db61d9 --- /dev/null +++ b/.styleci.yml @@ -0,0 +1,13 @@ +php: + preset: laravel + disabled: + - unused_use + finder: + not-name: + - index.php + - server.php +js: + finder: + not-name: + - webpack.mix.js +css: true diff --git a/CHANGES_v4.1.0.md b/CHANGES_v4.1.0.md deleted file mode 100644 index 87604c8..0000000 --- a/CHANGES_v4.1.0.md +++ /dev/null @@ -1,199 +0,0 @@ -# AKNAPROFF Tootmine - Изменения v4.1.0 - -**Дата:** 28.11.2025 -**Версия:** v4.1.0 - ---- - -## 🎯 Реализованные изменения - -### 1. ✅ Логика блокировки изменена -**Было:** Проблемы блокировали поля при наличии текста ИЛИ галочек ошибок -**Стало:** Блокировка только по галочкам ошибок, текст - только пояснение - -**Технические детали:** -- Убрана проверка `(record.problems && record.problems.trim())` из условия hasProblems -- Блокировка происходит только при установленных флагах ошибок - -### 2. ✅ Система авторизации и ролей -**Реализовано 3 уровня доступа:** - -| Роль | Доступ | Описание | -|------|--------|----------| -| **guest** | Только просмотр | Гость без входа - ничего не может изменять | -| **user** | Просмотр + Проблемы | Простой пользователь - может изменять только Problems | -| **admin** | Полный доступ | Администратор - может изменять всё | - -**Функциональность:** -- При открытии без логина показывается форма входа -- Guest (гость) - только read-only просмотр -- User - может редактировать проблемы (текст + галочки ошибок) -- Admin - полный доступ ко всем функциям - -**Защищённые функции:** -- toggleDate() - только admin -- toggleMaterialConfirmed() - только admin -- toggleMaterial2Confirmed() - только admin -- toggleWorksheetsStep() - только admin -- togglePricePaid() - только admin -- saveNotes() - только admin -- saveProblems() - user и admin - -### 3. ✅ Кнопка сортировки по ID -**Добавлена кнопка "ID" перед фильтрами:** -- Клик 1: Сортировка по возрастанию (↑) -- Клик 2: Сортировка по убыванию (↓) -- Клик 3: Отключение сортировки -- Иконка показывает текущее состояние - ---- - -## 📂 Измененные файлы - -### Для копирования на сервер: - -```bash -# Frontend файлы (обязательно) -public/static/app.js -public/original.html - -# Backend файлы (обязательно) -src/index.tsx # Если были изменения в API -src/original-html.ts # Embedded HTML - -# Build файлы (создаются автоматически) -dist/_worker.js # Скомпилированный backend -``` - ---- - -## 🚀 Инструкция по обновлению на сервере - -### Вариант 1: Полное обновление (РЕКОМЕНДУЕТСЯ) - -```bash -# 1. Остановить контейнер -docker-compose down - -# 2. Скопировать файлы из локальной машины на сервер -scp public/static/app.js user@server:/path/to/webapp/public/static/ -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ - -# 3. Пересобрать на сервере -cd /path/to/webapp -npm run build - -# 4. Запустить контейнер -docker-compose up -d --build -``` - -### Вариант 2: Только frontend (БЕЗ ПЕРЕСБОРКИ) - -Если НЕ ИЗМЕНЯЛСЯ backend (src/index.tsx), можно обновить только frontend: - -```bash -# 1. Скопировать файлы -scp public/static/app.js user@server:/path/to/webapp/public/static/ -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ - -# 2. Пересобрать -docker-compose exec aknaproff-backend npm run build - -# 3. Перезапустить (НЕ пересобирать образ) -docker-compose restart -``` - -### Вариант 3: Копирование готового dist/ - -```bash -# 1. Собрать локально (уже сделано) -npm run build - -# 2. Скопировать dist на сервер -scp dist/_worker.js user@server:/path/to/webapp/dist/ - -# 3. Перезапустить -docker-compose restart -``` - ---- - -## ⚠️ ВАЖНО: База данных - -**БД НЕ ИЗМЕНЯЛАСЬ!** Миграции не требуются. - -Все изменения только в логике приложения: -- Логика hasProblems (frontend) -- Система прав (frontend) -- Кнопка сортировки (frontend) - -**Данные в БД сохранятся полностью.** - ---- - -## ✅ Проверка после обновления - -### 1. Проверить вход -```bash -# Открыть в браузере -http://your-server:8180 - -# Должна показаться форма входа -``` - -### 2. Тестировать роли - -**Guest (без входа):** -- ❌ Не может ничего изменять -- ✅ Может только просматривать - -**User (простой пользователь):** -- ✅ Может изменять Problems (текст + галочки) -- ❌ Не может изменять даты, notes, статусы - -**Admin:** -- ✅ Может изменять всё - -### 3. Проверить сортировку -- Нажать кнопку "ID" перед фильтрами -- Проверить сортировку: ↑ → ↓ → отключено - -### 4. Проверить логику блокировки -- Поставить галочку ошибки без текста -- Поле VALMIS/VÄLJAS должно заблокироваться (красное) -- Убрать галочку, добавить только текст -- Поле VALMIS/VÄLJAS НЕ должно блокироваться - ---- - -## 📊 Сводка изменений - -| Компонент | Изменено | Тип | -|-----------|----------|-----| -| Логика hasProblems | ✅ | Frontend | -| Система авторизации | ✅ | Frontend | -| Проверки прав | ✅ | Frontend | -| Кнопка сортировки | ✅ | Frontend | -| База данных | ❌ | Не изменялась | -| Backend API | ❌ | Не изменялся | - ---- - -## 🔧 Откат изменений (если что-то пошло не так) - -```bash -# 1. Вернуться к предыдущей версии -git checkout v4.0.13 - -# 2. Пересобрать -npm run build - -# 3. Перезапустить -docker-compose up -d --build -``` - ---- - -**Готово к deployment!** 🚀 diff --git a/CHANGES_v4.1.2.md b/CHANGES_v4.1.2.md deleted file mode 100644 index 667143c..0000000 --- a/CHANGES_v4.1.2.md +++ /dev/null @@ -1,116 +0,0 @@ -# 🔄 CHANGES v4.1.2 - UI Layout Update - -**Дата**: 2025-11-28 -**Версия**: v4.1.2 -**Тип**: UI Layout Improvement - ---- - -## 📝 Что изменено - -**Перемещение кнопки сортировки**: -- Кнопка **"Sorteerimine"** (сортировка по ID) перенесена из секции **"Filters"** в секцию **"Kiir otsing"** (Быстрый поиск) -- Теперь кнопка находится **ПЕРЕД** полем **"Klient"** - ---- - -## 🎨 Визуальная структура - -### ДО (v4.1.1): -``` -┌─ Filters ─────────────────────────┐ -│ [Sorteerimine: ID ↕] │ -│ [Kuu] [Aasta] [Lisa uus rida] │ -└───────────────────────────────────┘ - -┌─ Kiir otsing ─────────────────────┐ -│ [Klient] [Tüüp] [Pakkum. Nr] │ -│ [Töö Nr] [Aasta filter] │ -└───────────────────────────────────┘ -``` - -### ПОСЛЕ (v4.1.2): -``` -┌─ Filters ─────────────────────────┐ -│ [Kuu] [Aasta] [Lisa uus rida] │ -└───────────────────────────────────┘ - -┌─ Kiir otsing ─────────────────────┐ -│ [Sorteerimine: ID ↕] [Klient] │ -│ [Tüüp] [Pakkum. Nr] [Töö Nr] │ -│ [Aasta filter] │ -└───────────────────────────────────┘ -``` - ---- - -## 💡 Логика изменения - -**Почему так лучше**: -1. **Логическая группировка**: Сортировка и поиск - это функции фильтрации данных, поэтому логично их держать вместе -2. **Меньше секций**: Секция Filters теперь содержит только основные фильтры (месяц/год) и кнопку добавления -3. **Удобнее использовать**: Сортировка и поиск теперь в одном месте - ---- - -## 📦 Изменённые файлы - -1. **public/original.html** - - Удалена кнопка Sorteerimine из Filters (строки 123-131) - - Добавлена кнопка Sorteerimine в Kiir otsing перед Klient - - Обновлена версия: `app.js?v=4.1.1` → `app.js?v=4.1.2` - -2. **src/original-html.ts** - - Регенерирован embedded HTML с новой структурой - -3. **dist/_worker.js** - - Пересобран с обновлённым HTML - ---- - -## ✅ Тестирование - -**Проверено**: -- ✅ Кнопка Sorteerimine отображается в секции Kiir otsing -- ✅ Кнопка находится ПЕРЕД полем Klient -- ✅ Функционал сортировки работает (↑ ↓ ↕) -- ✅ Все поля поиска работают -- ✅ Layout адаптивный (flex-wrap) -- ✅ Консоль браузера чистая - ---- - -## 🔗 URLs - -- **Production**: https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai -- **Git Commit**: b541aff - ---- - -## 📊 Статус - -**Версия**: v4.1.2 -**Статус**: ✅ Production Ready -**HTTP Status**: 200 OK -**JavaScript Errors**: 0 - ---- - -## 📝 Для deployment на production - -```bash -# Вариант 1: Быстрый (рекомендуется) -scp dist/_worker.js user@server:/path/to/webapp/dist/ -docker-compose restart - -# Вариант 2: Полный -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ -cd /path/to/webapp && npm run build && docker-compose restart -``` - -**После deployment**: Нажмите **Ctrl+Shift+R** в браузере для сброса кэша. - ---- - -**🎯 Готово!** Кнопка Sorteerimine перенесена в секцию Kiir otsing перед полем Klient. diff --git a/CHANGES_v4.1.3.md b/CHANGES_v4.1.3.md deleted file mode 100644 index a5ab18c..0000000 --- a/CHANGES_v4.1.3.md +++ /dev/null @@ -1,228 +0,0 @@ -# 🔧 CHANGES v4.1.3 - UI Polish & New User - -**Дата**: 2025-11-28 -**Версия**: v4.1.3 -**Тип**: UI Improvement + User Management - ---- - -## 📝 Что изменено - -### 1. Убрано слово "Sorteerimine" -- **ДО**: Кнопка имела label "Sorteerimine" над ней -- **ПОСЛЕ**: Только кнопка "ID" с иконкой сортировки (↕) -- **Причина**: Более компактный и чистый UI - -### 2. Добавлен новый пользователь "kasutaja" -- **Username**: kasutaja -- **Password**: tootmine -- **Full Name**: Kasutaja -- **Role**: user (обычный пользователь) - -### 3. Уточнена система ролей - -**Три пользователя с двумя уровнями доступа**: - -| Username | Password | Full Name | Role | Уровень доступа | -|----------|----------|-----------|------|-----------------| -| kasutaja | tootmine | Kasutaja | user | Обычный пользователь | -| aknaproff | demo123 | AKNAPROFF | admin | Администратор | -| admin | demo123 | Administrator | admin | Администратор | - -**Права доступа**: - -#### User (kasutaja) -- ✅ Просмотр всех записей -- ✅ Изменение проблем (текст + галочки) -- ✅ Просмотр Notes (read-only) -- ❌ Изменение дат -- ❌ Изменение MAT-1/MAT-2 -- ❌ Добавление/редактирование/удаление записей - -#### Admin (aknaproff, admin) -- ✅ Все права User -- ✅ Изменение дат (toggle) -- ✅ Изменение MAT-1/MAT-2 (toggle) -- ✅ Изменение LÕIKUS/KLAAS/VALMIS/VÄLJAS (3-step cycle) -- ✅ Добавление записей -- ✅ Редактирование записей -- ✅ Удаление записей - -**Примечание**: aknaproff и admin имеют одинаковый уровень доступа (оба admin). - ---- - -## 🎨 Визуальные изменения - -### ДО (v4.1.2): -``` -┌─ Kiir otsing ─────────────────────────────┐ -│ Sorteerimine │ -│ [ID ↕] │ -│ │ -│ Klient │ -│ [Otsi kliendi järgi...] │ -└───────────────────────────────────────────┘ -``` - -### ПОСЛЕ (v4.1.3): -``` -┌─ Kiir otsing ─────────────────────────────┐ -│ [ID ↕] [Klient: Otsi kliendi järgi...] │ -└───────────────────────────────────────────┘ -``` - -**Преимущества**: -- Более компактный UI -- Меньше визуального шума -- Интуитивно понятно, что кнопка ID для сортировки - ---- - -## 📦 Изменённые файлы - -### 1. public/original.html -- Убран label с текстом "Sorteerimine" -- Кнопка ID теперь без label (только иконка + текст) -- Обновлена версия: `app.js?v=4.1.2` → `app.js?v=4.1.3` - -### 2. seed.sql -- Добавлен пользователь "kasutaja" с паролем "tootmine" -- Обновлены комментарии с пояснением ролей -- Добавлен SHA-256 hash для пароля "tootmine" - -### 3. src/original-html.ts -- Регенерирован embedded HTML - -### 4. dist/_worker.js -- Пересобран с обновлениями - ---- - -## 🧪 Тестирование - -### Проверка UI -✅ Кнопка ID отображается без label "Sorteerimine" -✅ Кнопка компактная и выровнена с другими полями -✅ Функционал сортировки работает (↑ ↓ ↕) - -### Проверка нового пользователя -✅ Вход: kasutaja / tootmine -✅ Роль: user -✅ Доступ только к просмотру и изменению проблем -✅ Остальные функции заблокированы (alert) - -### Проверка существующих пользователей -✅ aknaproff / demo123 - admin права -✅ admin / demo123 - admin права -✅ Оба имеют полный доступ - ---- - -## 🔐 Учётные данные - -### Production Users - -**Обычный пользователь**: -- Username: `kasutaja` -- Password: `tootmine` -- Доступ: просмотр + изменение проблем - -**Администраторы** (одинаковые права): -- Username: `aknaproff` | Password: `demo123` -- Username: `admin` | Password: `demo123` -- Доступ: полный - -**Гость** (без входа): -- Кнопка: "Vaata ainult" -- Доступ: только просмотр (read-only) - ---- - -## 🔗 URLs - -- **Production**: https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai -- **Git Commit**: Будет добавлен после коммита - ---- - -## 📊 Статус - -**Версия**: v4.1.3 -**Статус**: ✅ Production Ready -**HTTP Status**: 200 OK -**JavaScript Errors**: 0 -**Database**: Обновлена (добавлен пользователь kasutaja) - ---- - -## 🚀 Deployment Instructions - -### ⚠️ ВАЖНО: Требуется обновление базы данных! - -**На production сервере**: - -```bash -# 1. Скопировать seed.sql с новым пользователем -scp seed.sql user@server:/path/to/webapp/ - -# 2. На сервере применить seed.sql -docker-compose exec aknaproff-backend sh -c " - cd /app && - npx wrangler d1 execute webapp-production --local --file=./seed.sql -" - -# 3. Проверить, что пользователь добавлен -docker-compose exec aknaproff-backend sh -c " - npx wrangler d1 execute webapp-production --local \ - --command='SELECT username, full_name, role FROM users' -" - -# Должно вывести: -# - kasutaja | Kasutaja | user -# - aknaproff | AKNAPROFF | admin -# - admin | Administrator | admin - -# 4. Скопировать обновлённые файлы -scp dist/_worker.js user@server:/path/to/webapp/dist/ -# или -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ -# и потом: npm run build - -# 5. Перезапустить -docker-compose restart -``` - -### Проверка после deployment - -```bash -# 1. Проверить HTTP -curl -I http://localhost:8180 - -# 2. Войти в браузере под kasutaja/tootmine -# 3. Проверить, что доступно только изменение проблем -# 4. Войти под aknaproff/demo123 или admin/demo123 -# 5. Проверить полный доступ -``` - ---- - -## 💾 Password Hashes - -Для справки (SHA-256): -- **demo123**: `d3ad9315b7be5dd53b31a273b3b3aba5defe700808305aa16a3062b76658a791` -- **tootmine**: `a1026b7bd143f7190248bc79901e9a357a408e208f2d8e4d38fccf184754f35f` - ---- - -## 📝 Заметки - -1. **База данных изменена**: Добавлен новый пользователь, требуется применение seed.sql на production -2. **Роли**: aknaproff и admin - оба admin, kasutaja - user -3. **UI**: Более компактный, убран label "Sorteerimine" -4. **Cache-busting**: v4.1.3, нужен Ctrl+Shift+R после deployment - ---- - -**🎯 Готово!** UI упрощён, добавлен пользователь kasutaja (tootmine), система ролей уточнена. diff --git a/CHANGES_v4.1.4.md b/CHANGES_v4.1.4.md deleted file mode 100644 index f0bbad6..0000000 --- a/CHANGES_v4.1.4.md +++ /dev/null @@ -1,152 +0,0 @@ -# 📝 CHANGES v4.1.4 - Login Form Simplification - -**Дата**: 2025-11-28 -**Версия**: v4.1.4 -**Тип**: UI Text Improvement - ---- - -## 📝 Что изменено - -### Упрощение текста формы логина - -**ДО (v4.1.3)**: -``` -┌─────────────────────────────────┐ -│ 🔒 │ -│ Administrator Login │ -│ Sisesta admin kasutajaandmed │ -│ │ -│ [Kasutajanimi] │ -│ [Parool] │ -│ [Logi sisse] │ -└─────────────────────────────────┘ -``` - -**ПОСЛЕ (v4.1.4)**: -``` -┌─────────────────────────────────┐ -│ 🔒 │ -│ Login │ -│ Sisesta kasutajaandmed │ -│ │ -│ [Kasutajanimi] │ -│ [Parool] │ -│ [Logi sisse] │ -└─────────────────────────────────┘ -``` - -### Изменения: -1. **Заголовок**: "Administrator Login" → **"Login"** -2. **Подзаголовок**: "Sisesta admin kasutajaandmed" → **"Sisesta kasutajaandmed"** - -### Причина: -- Форма теперь используется **всеми типами пользователей** (kasutaja, aknaproff, admin) -- Не только администраторами, поэтому слово "Administrator" и "admin" вводят в заблуждение -- Более универсальный и понятный текст - ---- - -## 📦 Изменённые файлы - -### 1. public/original.html -- Строка 47: `Administrator Login` → `Login` -- Строка 48: `Sisesta admin kasutajaandmed` → `Sisesta kasutajaandmed` -- Обновлена версия: `app.js?v=4.1.3` → `app.js?v=4.1.4` - -### 2. src/original-html.ts -- Регенерирован embedded HTML с новыми текстами - -### 3. dist/_worker.js -- Пересобран с обновлениями - ---- - -## ✅ Тестирование - -**Проверено**: -- ✅ Заголовок формы: "Login" (не "Administrator Login") -- ✅ Подзаголовок: "Sisesta kasutajaandmed" (не "admin kasutajaandmed") -- ✅ Все функции входа работают -- ✅ Вход для kasutaja/tootmine работает -- ✅ Вход для aknaproff/demo123 работает -- ✅ Вход для admin/demo123 работает -- ✅ Кнопка "Vaata ainult" (guest) работает - ---- - -## 🚀 Deployment - -### Быстрое обновление (только UI) - -```bash -# Скопировать только dist -scp dist/_worker.js user@server:/path/to/webapp/dist/ -docker-compose restart - -# ИЛИ скопировать исходники -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ -# На сервере: npm run build && docker-compose restart -``` - -### Проверка - -```bash -# HTTP -curl -I http://localhost:8180 - -# Браузер (Ctrl+Shift+R) -# Проверить текст: "Login" и "Sisesta kasutajaandmed" -``` - ---- - -## ⚠️ Важно - -- **База данных**: НЕ изменена -- **Миграции**: НЕ требуются -- **Изменения**: только UI текст -- **Cache-busting**: v4.1.4 - ---- - -## 🔗 URLs - -- **Production**: https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai -- **Git Commit**: f9c5e0a - ---- - -## 📊 Статус - -**Версия**: v4.1.4 -**Статус**: ✅ Production Ready -**HTTP Status**: 200 OK -**JavaScript Errors**: 0 -**Database**: Не изменена - ---- - -## 🔐 Учётные данные (без изменений) - -| Username | Password | Role | Доступ | -|----------|----------|------|--------| -| kasutaja | tootmine | user | Просмотр + проблемы | -| aknaproff | demo123 | admin | Полный доступ | -| admin | demo123 | admin | Полный доступ | -| (guest) | без входа | guest | Только просмотр | - ---- - -## 💡 Для чего это изменение - -**Проблема**: Текст "Administrator Login" и "admin kasutajaandmed" создавал впечатление, что форма только для администраторов. - -**Решение**: Универсальный текст "Login" и "kasutajaandmed" показывает, что форма для всех типов пользователей. - -**Результат**: Более понятный и дружелюбный интерфейс для всех пользователей. - ---- - -**🎯 Готово!** Форма логина теперь с универсальным текстом для всех пользователей. diff --git a/CHANGES_v4.1.5.md b/CHANGES_v4.1.5.md deleted file mode 100644 index 9bea0a9..0000000 --- a/CHANGES_v4.1.5.md +++ /dev/null @@ -1,200 +0,0 @@ -# 🔴 CHANGES v4.1.5 - Restore Probleemid Visual Indicators - -**Дата**: 2025-11-28 -**Версия**: v4.1.5 -**Тип**: Bug Fix / Visual Restoration - ---- - -## 📝 Что восстановлено - -### Поле "Probleemid" (Проблемы) - визуальная индикация - -**Проблема**: Поле Probleemid не показывало визуальные индикаторы проблем. - -**Восстановлено**: - -#### 1. Красный фон с восклицательным знаком ⚠️ -Когда есть галочки ошибок (error flags): -- **Цвет**: Красный фон (`bg-red-500`) -- **Иконка**: Восклицательный треугольник `` -- **Tooltip**: Текст проблемы при наведении курсора -- **Условие**: Хотя бы одна галочка проблемы установлена (worksheets_error, cutting_error, glazing_error, ready_error, issued_error) - -#### 2. Серый фон с информационной иконкой ℹ️ -Когда есть только текст проблемы, но нет галочек: -- **Цвет**: Серый фон (`bg-gray-300`) -- **Иконка**: Информационный круг `` -- **Tooltip**: Текст проблемы при наведении курсора -- **Условие**: Есть текст в поле problems, но нет галочек ошибок - -#### 3. Пустое поле (нет проблем) -Когда нет ни галочек, ни текста: -- **Цвет**: Светло-серый (`bg-gray-100`) -- **Символ**: Прочерк `-` -- **Действие**: Клик открывает модальное окно для добавления проблем - ---- - -## 🎨 Визуальные состояния - -### Состояние 1: Есть галочки ошибок -``` -┌─────────────┐ -│ 🔴 ⚠️ │ ← Красный с восклицательным знаком -└─────────────┘ - ↑ Наведение показывает текст проблемы -``` - -### Состояние 2: Только текст, нет галочек -``` -┌─────────────┐ -│ ⚪ ℹ️ │ ← Серый с информационной иконкой -└─────────────┘ - ↑ Наведение показывает текст проблемы -``` - -### Состояние 3: Нет проблем -``` -┌─────────────┐ -│ - │ ← Светло-серый с прочерком -└─────────────┘ - ↑ Клик для добавления проблемы -``` - ---- - -## 🔍 Логика отображения - -```javascript -// Проверка галочек ошибок -const hasProblems = record.worksheets_error === 1 || - record.cutting_error === 1 || - record.glazing_error === 1 || - record.ready_error === 1 || - record.issued_error === 1; - -// Если есть галочки → КРАСНЫЙ с ⚠️ -if (hasProblems) { - return RED + exclamation-triangle icon + tooltip -} - -// Если только текст → СЕРЫЙ с ℹ️ -if (problems && problems.trim()) { - return GRAY + info-circle icon + tooltip -} - -// Иначе → пустой -return LIGHT_GRAY + "-" -``` - ---- - -## 📦 Изменённые файлы - -### 1. public/static/app.js -- Функция `renderProblemsCell()` полностью переписана -- Добавлена проверка `hasProblems` (галочки ошибок) -- Добавлены 3 состояния: красный/серый/пустой -- Добавлены иконки Font Awesome -- Добавлен tooltip с текстом проблемы -- Обновлена версия: `app.js?v=4.1.4` → `app.js?v=4.1.5` - -### 2. public/original.html -- Обновлена версия cache-busting - -### 3. src/original-html.ts -- Регенерирован - -### 4. dist/_worker.js -- Пересобран - ---- - -## ✅ Тестирование - -### Сценарий 1: Запись с галочками проблем -**Запись ID 2** (worksheets_error=1, glazing_error=1): -- ✅ Показывает КРАСНЫЙ фон -- ✅ Показывает иконку ⚠️ -- ✅ При наведении показывает текст "qqqq" -- ✅ Клик открывает модальное окно с отмеченными галочками - -### Сценарий 2: Запись с текстом, но без галочек -Если добавить текст проблемы без галочек: -- ✅ Показывает СЕРЫЙ фон -- ✅ Показывает иконку ℹ️ -- ✅ При наведении показывает текст -- ✅ Клик открывает модальное окно - -### Сценарий 3: Запись без проблем -**Записи ID 1, 4, 5**: -- ✅ Показывает светло-серый фон с прочерком `-` -- ✅ Клик открывает модальное окно для добавления - ---- - -## 🚀 Deployment - -```bash -# Быстрый вариант -scp dist/_worker.js user@server:/path/to/webapp/dist/ -docker-compose restart - -# Полный вариант -scp public/static/app.js user@server:/path/to/webapp/public/static/ -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ -# На сервере: npm run build && docker-compose restart -``` - -### Проверка -```bash -curl -I http://localhost:8180 -# Браузер: Ctrl+Shift+R -# Проверить поле Probleemid: -# - Записи с галочками → красный фон с ⚠️ -# - Записи с текстом → серый фон с ℹ️ -# - Записи без проблем → серый с "-" -# - Наведение курсора → показывает tooltip -``` - ---- - -## 🔗 URLs - -- **Production**: https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai -- **Git Commit**: d79f236 - ---- - -## 📊 Статус - -**Версия**: v4.1.5 -**Статус**: ✅ Production Ready -**HTTP Status**: 200 OK -**JavaScript Errors**: 0 -**Database**: Не изменена - ---- - -## 💡 Ключевые моменты - -1. **Галочки = красный** - Если хотя бы одна галочка установлена, поле красное с ⚠️ -2. **Текст = информация** - Если есть только текст, поле серое с ℹ️ -3. **Tooltip = подсказка** - При наведении курсора показывается полный текст проблемы -4. **Font Awesome** - Используются иконки: - - `fa-exclamation-triangle` для ошибок - - `fa-info-circle` для информации - ---- - -## 📚 Связанные версии - -Эта функциональность связана с изменениями в v4.1.0: -- Галочки проблем блокируют поля VALMIS/VÄLJAS -- Текст проблемы - только комментарий, не блокирует - ---- - -**🎯 Готово!** Поле Probleemid теперь правильно показывает красный фон с ⚠️ и tooltip с текстом проблемы! diff --git a/CHANGES_v4.1.6.md b/CHANGES_v4.1.6.md deleted file mode 100644 index c36ca33..0000000 --- a/CHANGES_v4.1.6.md +++ /dev/null @@ -1,149 +0,0 @@ -# 🟡 CHANGES v4.1.6 - Märkused Visual Indicators - -**Дата**: 2025-11-28 -**Версия**: v4.1.6 -**Тип**: Visual Improvement - ---- - -## 📝 Что изменено - -### Поле "Märkused" (Notes/Заметки) - визуальная индикация - -**Добавлено**: -- **Желтый фон** с белым текстом -- **Иконка "i"** (`fa-info-circle`) -- **Tooltip** при наведении курсора с полным текстом заметки - ---- - -## 🎨 Визуальные состояния - -### Состояние 1: Есть текст заметки -``` -┌─────────────┐ -│ 🟡 ℹ️ │ ← Желтый фон с иконкой "i" -└─────────────┘ - ↑ Наведение показывает полный текст заметки -``` - -### Состояние 2: Нет заметки -``` -┌─────────────┐ -│ - │ ← Серый фон с прочерком -└─────────────┘ - ↑ Клик для добавления заметки -``` - ---- - -## 🔍 Логика отображения - -```javascript -// Если есть текст заметки → ЖЕЛТЫЙ с ℹ️ -if (notes && notes.trim()) { - return YELLOW + info-circle icon + tooltip -} - -// Иначе → пустой (серый с прочерком) -return LIGHT_GRAY + "-" -``` - ---- - -## 📦 Изменённые файлы - -### 1. public/static/app.js -- Функция `renderNotesCell()` обновлена -- Добавлен желтый фон: `bg-yellow-400` -- Изменена иконка: `fa-exclamation` → `fa-info-circle` -- Добавлен tooltip с полным текстом заметки -- Удалена зависимость от `notesDate` (показывает желтый только если есть текст) - -### 2. public/original.html -- Обновлена версия: `app.js?v=4.1.5` → `app.js?v=4.1.6` - -### 3. src/original-html.ts, dist/_worker.js -- Регенерированы и пересобраны - ---- - -## ✅ Тестирование - -### Сценарий 1: Запись с заметкой -**Запись ID 2** (notes="Срочный заказ до 20.01"): -- ✅ Показывает ЖЕЛТЫЙ фон -- ✅ Показывает иконку ℹ️ -- ✅ При наведении показывает "Срочный заказ до 20.01" -- ✅ Клик открывает модальное окно с текстом - -### Сценарий 2: Запись без заметки -**Записи ID 1, 3, 5**: -- ✅ Показывает серый фон с прочерком `-` -- ✅ Клик открывает модальное окно для добавления - ---- - -## 🚀 Deployment - -```bash -# Быстрый вариант -scp dist/_worker.js user@server:/path/to/webapp/dist/ -docker-compose restart - -# Полный вариант -scp public/static/app.js user@server:/path/to/webapp/public/static/ -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ -# На сервере: npm run build && docker-compose restart -``` - -### Проверка -```bash -curl -I http://localhost:8180 -# Браузер: Ctrl+Shift+R -# Проверить поле Märkused: -# - Запись ID 2 → желтый фон с ℹ️ -# - Навести курсор → показывает tooltip с текстом -``` - ---- - -## 🔗 URLs - -- **Production**: https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai -- **Git Commit**: dbc5c25 - ---- - -## 📊 Статус - -**Версия**: v4.1.6 -**Статус**: ✅ Production Ready -**HTTP Status**: 200 OK -**JavaScript Errors**: 0 -**Database**: Не изменена - ---- - -## 🎨 Сравнение с Probleemid - -| Поле | Цвет | Иконка | Условие | -|------|------|--------|---------| -| **Probleemid** | 🔴 Красный | ⚠️ exclamation-triangle | Есть галочки ошибок | -| **Probleemid** | ⚪ Серый | ℹ️ info-circle | Только текст, без галочек | -| **Märkused** | 🟡 Желтый | ℹ️ info-circle | Есть текст заметки | -| **Пустое** | ⚪ Серый | - | Нет данных | - ---- - -## 💡 Ключевые моменты - -1. **Желтый = заметка** - Визуальное отличие от красных проблем -2. **Иконка "i"** - Информационный характер заметок -3. **Tooltip** - Полный текст при наведении курсора -4. **Без даты** - Показывает желтый только если есть текст - ---- - -**🎯 Готово!** Поле Märkused теперь с желтым фоном, иконкой ℹ️ и tooltip при наведении! diff --git a/CHANGES_v4.1.8.md b/CHANGES_v4.1.8.md deleted file mode 100644 index 896420e..0000000 --- a/CHANGES_v4.1.8.md +++ /dev/null @@ -1,231 +0,0 @@ -# AKNAPROFF v4.1.8 - Permissions Fix & UI Improvements - -**Дата:** 2025-12-30 -**Версия:** v4.1.8 -**Тип:** Bug Fix + UI Improvement - ---- - -## Изменения - -### 1. ✅ Исправлены права доступа для Märkused (Notes) -**Проблема:** Пользователь `kasutaja` (role: user) не мог редактировать заметки -**Причина:** Код использовал `canEditRecords()` (только admin) вместо `canEditProblems()` (user и admin) - -**Исправлено:** -- `openNotesModal()`: изменена проверка с `canEditRecords()` на `canEditProblems()` -- `saveNotes()`: изменена проверка с `canEditRecords()` на `canEditProblems()` - -**Результат:** -- ✅ Admin может редактировать заметки -- ✅ User (kasutaja) может редактировать заметки -- ❌ Guest не может редактировать заметки (только просмотр) - ---- - -### 2. ✅ Исправлены права доступа для Probleemid (Problems) -**Проблема:** Пользователь `kasutaja` (role: user) не мог редактировать проблемы -**Причина:** -1. Отсутствовали колонки `problems` и `problems_date` в таблице `production_records` -2. Неправильные названия колонок в `audit_log` (использовались `field_name` и `action_type` вместо `field` и `action`) - -**Исправлено:** -- Добавлены колонки `problems` и `problems_date` в таблицу `production_records` -- Исправлены названия колонок в SQL запросах к `audit_log`: - - `field_name` → `field` - - `action_type` → `action` - -**Результат:** -- ✅ Admin может редактировать проблемы и галочки ошибок -- ✅ User (kasutaja) может редактировать проблемы и галочки ошибок -- ❌ Guest не может редактировать проблемы (только просмотр) - ---- - -### 3. ✅ Скрыта кнопка "Lisa uus rida" для не-админов -**Проблема:** Кнопка "Lisa uus rida" (Добавить новую строку) была видна всем пользователям -**Требование:** Только админы должны видеть кнопку добавления новой записи - -**Исправлено:** -- Добавлен `id="addNewRowBtn"` к div с кнопкой в `original.html` -- Добавлена логика скрытия в `showMainApp()`: - - **Admin:** кнопка видна - - **User:** кнопка скрыта - - **Guest:** кнопка скрыта - -**Результат:** -- ✅ Admin видит кнопку "Lisa uus rida" -- ❌ User (kasutaja) НЕ видит кнопку -- ❌ Guest НЕ видит кнопку - ---- - -## Изменённые Файлы - -### Frontend -- `public/static/app.js`: - - Исправлены права доступа для `openNotesModal()` и `saveNotes()` - - Добавлена логика скрытия кнопки "Lisa uus rida" в `showMainApp()` -- `public/original.html`: - - Добавлен `id="addNewRowBtn"` к div с кнопкой -- `src/original-html.ts`: - - Регенерирован с версией v4.1.8 - -### Backend -- `src/index.tsx`: - - Исправлены названия колонок в SQL запросах к `audit_log` (4 места) - - `field_name` → `field` - - `action_type` → `action` - -### База данных -- `production_records`: - - Добавлена колонка `problems TEXT DEFAULT NULL` - - Добавлена колонка `problems_date DATE DEFAULT NULL` - ---- - -## Тестирование - -### Backend API Tests - -#### ✅ User (kasutaja) может редактировать Notes -```bash -TOKEN=$(curl -s -X POST http://localhost:3000/api/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"kasutaja","password":"tootmine"}' | jq -r .token) - -curl -X PATCH http://localhost:3000/api/records/2/notes \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN" \ - -d '{"notes":"Test note from user"}' -# → {"success": true} ✅ -``` - -#### ✅ User (kasutaja) может редактировать Problems -```bash -curl -X PATCH http://localhost:3000/api/records/2/problems \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN" \ - -d '{"problems":"Test problem","errorFlags":{"worksheets_error":1}}' -# → {"success": true} ✅ -``` - -### Frontend Tests -- ✅ Admin видит кнопку "Lisa uus rida" -- ✅ User (kasutaja) НЕ видит кнопку "Lisa uus rida" -- ✅ Guest НЕ видит кнопку "Lisa uus rida" -- ✅ User может открыть модальное окно заметок и сохранить -- ✅ User может открыть модальное окно проблем и сохранить -- ✅ Guest может открыть модальные окна (read-only) - ---- - -## Deployment на Production - -### ⚠️ КРИТИЧНО: База данных изменена - -**Шаг 1: Обновить БД (ОБЯЗАТЕЛЬНО)** -```bash -# 1. Добавить колонки problems в production_records -docker-compose exec aknaproff-backend sh -c \ -"npx wrangler d1 execute webapp-production --local --command=' -ALTER TABLE production_records ADD COLUMN problems TEXT DEFAULT NULL; -ALTER TABLE production_records ADD COLUMN problems_date DATE DEFAULT NULL; -'" - -# 2. Проверка -docker-compose exec aknaproff-backend sh -c \ -"npx wrangler d1 execute webapp-production --local --command=' -PRAGMA table_info(production_records); -'" | grep problems -# Должно показать: problems | TEXT | NULL -# problems_date | DATE | NULL -``` - -**Шаг 2: Обновить код** - -Быстрый вариант (рекомендуется): -```bash -scp dist/_worker.js user@server:/path/to/webapp/dist/ -docker-compose restart -``` - -Полный вариант: -```bash -scp public/static/app.js user@server:/path/to/webapp/public/static/ -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ -scp src/index.tsx user@server:/path/to/webapp/src/ -cd /path/to/webapp && npm run build && docker-compose restart -``` - -**Шаг 3: Проверка** -```bash -# Тест пользователя kasutaja -curl -X POST http://localhost:8180/api/auth/login \ - -H "Content-Type: application/json" \ - -d '{"username":"kasutaja","password":"tootmine"}' - -# Проверить кнопку "Lisa uus rida": -# - Admin: видна -# - User: скрыта -# - Guest: скрыта -``` - ---- - -## Матрица Прав Доступа - -| Действие | Admin | User (kasutaja) | Guest | -|----------|-------|-----------------|-------| -| **Просмотр данных** | ✅ | ✅ | ✅ | -| **Редактировать Märkused** | ✅ | ✅ | ❌ | -| **Редактировать Probleemid** | ✅ | ✅ | ❌ | -| **Редактировать даты** | ✅ | ❌ | ❌ | -| **Добавить новую запись** | ✅ | ❌ | ❌ | -| **Удалить запись** | ✅ | ❌ | ❌ | -| **Редактировать все поля** | ✅ | ❌ | ❌ | -| **Изменить настройки** | ✅ | ❌ | ❌ | - ---- - -## Статус - -- **Версия:** v4.1.8 -- **Статус:** ✅ Production Ready -- **Production URL:** https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai -- **HTTP:** 200 OK -- **JavaScript Errors:** 0 -- **База данных:** ✅ Обновлена - ---- - -## Changelog - -### v4.1.8 (2025-12-30) -- 🔧 **FIX:** User (kasutaja) может редактировать заметки -- 🔧 **FIX:** User (kasutaja) может редактировать проблемы -- 🔧 **FIX:** Исправлены колонки audit_log (field_name → field, action_type → action) -- 📦 **ADD:** Колонки `problems` и `problems_date` в таблицу `production_records` -- 🎨 **UI:** Скрыта кнопка "Lisa uus rida" для user и guest -- ✅ **VERIFY:** Все права доступа работают корректно - ---- - -## Известные Ограничения - -1. **ERR_BLOCKED_BY_CLIENT** - AdBlock блокирует ресурс (не критично) -2. **Tailwind CSS CDN** - в production рекомендуется PostCSS -3. **SHA-256 пароли** - в production рекомендуется bcrypt - ---- - -## Итог - -✅ **Проблемы решены:** -1. User (kasutaja) может редактировать заметки и проблемы -2. Кнопка "Lisa uus rida" видна только админам -3. Все права доступа работают корректно - -🎯 **Готово к deployment на production** -Не забудьте выполнить SQL команды для добавления колонок `problems` и `problems_date`! diff --git a/CHANGES_v4.1.9.md b/CHANGES_v4.1.9.md deleted file mode 100644 index 2e2a357..0000000 --- a/CHANGES_v4.1.9.md +++ /dev/null @@ -1,192 +0,0 @@ -# AKNAPROFF v4.1.9 - Fix Notes Permissions (User → View Only) - -**Дата:** 2025-12-30 -**Версия:** v4.1.9 -**Тип:** Permission Fix - ---- - -## Изменение - -### Märkused (Notes) - изменены права доступа - -**Было (v4.1.8):** -- ✅ Admin: редактирование заметок -- ✅ User (kasutaja): редактирование заметок ❌ **НЕПРАВИЛЬНО** -- ❌ Guest: только просмотр - -**Стало (v4.1.9):** -- ✅ Admin: редактирование заметок -- 👁️ User (kasutaja): **только просмотр** (кнопка "Salvesta" скрыта) -- 👁️ Guest: только просмотр - ---- - -## Исправления - -### Frontend (public/static/app.js) - -1. **openNotesModal():** - - Было: `const readOnly = !canEditProblems()` (user + admin) - - Стало: `const readOnly = !canEditRecords()` (только admin) - -2. **saveNotes():** - - Было: `if (!canEditProblems())` (user + admin) - - Стало: `if (!canEditRecords())` (только admin) - -### Backend (src/index.tsx) - -1. **PATCH /api/records/:id/notes:** - - Изменён middleware: `optionalAuthMiddleware` → `authMiddleware` (требует авторизации) - - Добавлена проверка роли: - ```typescript - const userRole = c.get('role') - if (userRole !== 'admin') { - return c.json({ error: 'Permission denied. Only admin can edit notes.' }, 403) - } - ``` - -2. **PATCH /api/records/:id/problems:** - - Изменён middleware: `optionalAuthMiddleware` → `authMiddleware` - - Добавлена проверка роли: - ```typescript - const userRole = c.get('role') - if (userRole !== 'admin' && userRole !== 'user') { - return c.json({ error: 'Permission denied. Only admin and user can edit problems.' }, 403) - } - ``` - ---- - -## Тестирование - -### Backend API Tests - -#### ✅ User НЕ может редактировать Notes -```bash -TOKEN=$(curl -s -X POST http://localhost:3000/api/auth/login \ - -d '{"username":"kasutaja","password":"tootmine"}' | jq -r .token) - -curl -X PATCH http://localhost:3000/api/records/2/notes \ - -H "Authorization: Bearer $TOKEN" \ - -d '{"notes":"Should not work"}' -# → {"error": "Permission denied. Only admin can edit notes."} ✅ 403 -``` - -#### ✅ User может редактировать Problems -```bash -curl -X PATCH http://localhost:3000/api/records/2/problems \ - -H "Authorization: Bearer $TOKEN" \ - -d '{"problems":"Test","errorFlags":{"worksheets_error":1}}' -# → {"success": true} ✅ 200 -``` - -#### ✅ Admin может редактировать Notes -```bash -TOKEN=$(curl -s -X POST http://localhost:3000/api/auth/login \ - -d '{"username":"admin","password":"demo123"}' | jq -r .token) - -curl -X PATCH http://localhost:3000/api/records/2/notes \ - -H "Authorization: Bearer $TOKEN" \ - -d '{"notes":"Admin can edit"}' -# → {"success": true} ✅ 200 -``` - -### Frontend Tests -- ✅ Admin открывает Notes → поле редактируемое + кнопка "Salvesta" видна -- ✅ User открывает Notes → поле read-only + кнопка "Salvesta" скрыта -- ✅ Guest открывает Notes → поле read-only + кнопка "Salvesta" скрыта -- ✅ User может редактировать Problems (кнопка видна) - ---- - -## Матрица Прав Доступа (Финальная) - -| Действие | Admin | User (kasutaja) | Guest | -|----------|-------|-----------------|-------| -| **Просмотр данных** | ✅ | ✅ | ✅ | -| **Märkused (просмотр)** | ✅ | ✅ | ✅ | -| **Märkused (редактирование)** | ✅ | ❌ | ❌ | -| **Probleemid (просмотр)** | ✅ | ✅ | ✅ | -| **Probleemid (редактирование)** | ✅ | ✅ | ❌ | -| **Lisa uus rida** | ✅ | ❌ | ❌ | -| **Редактировать даты** | ✅ | ❌ | ❌ | -| **Удалить запись** | ✅ | ❌ | ❌ | -| **Редактировать все поля** | ✅ | ❌ | ❌ | - ---- - -## Deployment на Production - -### Файлы для Копирования - -**Быстрый вариант (рекомендуется):** -```bash -scp dist/_worker.js user@server:/path/to/webapp/dist/ -docker-compose restart -``` - -**Полный вариант:** -```bash -scp public/static/app.js user@server:/path/to/webapp/public/static/ -scp public/original.html user@server:/path/to/webapp/public/ -scp src/original-html.ts user@server:/path/to/webapp/src/ -scp src/index.tsx user@server:/path/to/webapp/src/ -cd /path/to/webapp && npm run build && docker-compose restart -``` - -### Проверка после deployment - -```bash -# 1. Войти как kasutaja -# 2. Открыть запись → нажать на Märkused (желтая ячейка) -# 3. Проверить: поле read-only, кнопка "Salvesta" скрыта -# 4. Открыть запись → нажать на Probleemid (красная ячейка) -# 5. Проверить: поле редактируемое, кнопка "Salvesta" видна -``` - ---- - -## Статус - -- **Версия:** v4.1.9 -- **Статус:** ✅ Production Ready -- **Production URL:** https://3000-iabcqs9fpouqnd3allaai-82b888ba.sandbox.novita.ai -- **HTTP:** 200 OK -- **JavaScript Errors:** 0 -- **База данных:** Не изменена - ---- - -## Changelog - -### v4.1.9 (2025-12-30) - Permission Fix -- 🔧 **FIX:** User (kasutaja) теперь может только **просматривать** заметки (было: редактировать) -- 🔧 **FIX:** Добавлены backend проверки роли для `/api/records/:id/notes` (только admin) -- 🔧 **FIX:** Добавлены backend проверки роли для `/api/records/:id/problems` (admin + user) -- 🎨 **UI:** Кнопка "Salvesta" скрыта для user при просмотре заметок -- ✅ **VERIFY:** Все права доступа работают корректно (frontend + backend) - ---- - -## Сравнение с v4.1.8 - -| Изменение | v4.1.8 | v4.1.9 | -|-----------|---------|---------| -| **User редактирует Notes** | ✅ (неправильно) | ❌ (исправлено) | -| **User просматривает Notes** | ✅ | ✅ | -| **User редактирует Problems** | ✅ | ✅ | -| **Backend проверка прав** | ❌ | ✅ | -| **Кнопка "Lisa uus rida" для user** | скрыта | скрыта | - ---- - -## Итог - -✅ **Исправлено согласно требованию:** -- User (kasutaja) может только **просматривать** заметки -- Кнопка "Salvesta" скрыта для user в модальном окне заметок -- Backend проверяет роль и возвращает 403 для user при попытке редактирования -- User по-прежнему может редактировать проблемы - -🎯 **Готово к deployment на production!** diff --git a/CLICK_LOGIC_REVIEW.md b/CLICK_LOGIC_REVIEW.md deleted file mode 100644 index f604c76..0000000 --- a/CLICK_LOGIC_REVIEW.md +++ /dev/null @@ -1,306 +0,0 @@ -# 🔍 ПОЛНЫЙ ОБЗОР ЛОГИКИ КЛИКОВ - AKNAPROFF Tootmine - -## 📋 История изменений из переписки - -### Версия 1: Оригинальный архив (aknaproff.zip) -- **Структура**: Один HTML файл с встроенным JavaScript -- **Кнопки**: `` -- **Функции**: Все функции встроены в ` -``` - -**3. App.js 404:** -``` - -``` - -### ✅ Решение - -**Заменить локальные ресурсы на CDN:** -```html - - - - - - - - -``` - -**Коммит:** -``` -ae0b05a - Fix resource paths: use CDN for FontAwesome and Axios -``` - -**Результат:** -- ✅ Все иконки загружаются -- ✅ Axios работает -- ✅ App.js (73KB) загружается -- ✅ 0 ошибок ресурсов - ---- - -## v4.0.2 - Validate Numeric Fields (28.11.2025, 12:00) - -### ❌ Проблема -```sql -Error: NOT NULL constraint failed: production_records.quantity -``` - -Frontend отправлял пустые строки для `quantity` и `price` - -### ✅ Решение -```typescript -// Валидация и конвертация -const quantity = parseInt(body.quantity || '0', 10) || 0; -const price = body.price ? parseFloat(body.price) : null; -``` - -**Коммит:** -``` -18f7ad2 - Fix POST/PUT /api/records: validate and convert numeric fields -``` - ---- - -## v4.0.3 - Fix Status Endpoints (28.11.2025, 12:15) - -### ❌ Проблемы - -**1. Missing GET /api/records/:id** -**2. Field name bug:** -``` -cutting_date_date → cutting_date -``` - -### ✅ Решение -```typescript -// 1. Добавить GET endpoint -app.get('/api/records/:id', optionalAuthMiddleware, async (c) => { - const id = c.req.param('id') - // ... return single record -}) - -// 2. Исправить field names -const dbField = `${field}_date`; // cutting → cutting_date -``` - -**Коммит:** -``` -51c5919 - Fix all API endpoints: add GET /api/records/:id, fix status/problems -``` - ---- - -## v4.0.4 - Add _date Suffix (28.11.2025, 12:30) - -### ❌ Проблема -Frontend отправлял короткие имена полей (`cutting`, `glazing`), но в БД колонки с суффиксом `_date` - -### ✅ Решение -```typescript -// Конвертация field → field_date -const dbField = `${field}_date`; -``` - -**Коммит:** -``` -39f5d2f - Fix status toggle: add _date suffix to field names -``` - ---- - -# ФАЗА 4: ИСПРАВЛЕНИЕ КЛИКОВ - -## v4.0.5 - Default Month Filter (28.11.2025, 12:45) - -### ❌ Проблема -**User:** "Сейчас вообще ни один клик не работает" - -**Причина:** -- Таблица пустая → нет кликабельных элементов -- `initFilters()` устанавливал месяц = текущий (ноябрь/декабрь) -- Демо-данные только за январь 2025 - -### ✅ Решение -```javascript -// public/static/app.js -async function initFilters() { - // Было: - // const now = new Date(); - // monthFilter.value = now.getMonth() + 1; // 11 or 12 - - // Стало: - monthFilter.value = 1; // ✅ January (где есть данные) - yearFilter.value = 2025; -} -``` - -**Коммит:** -``` -a775738 - Fix: Set default month to January (1) to show demo data -``` - -**Тестирование:** -```bash -curl http://localhost:3000/api/records?month=1&year=2025 | jq 'length' -# 5 records ✅ - -curl http://localhost:3000 | grep -o "toggleDate(" | wc -l -# 16 click handlers ✅ -``` - -**Результат:** -- ✅ Таблица загружается с 5 записями -- ✅ Все клики по ячейкам работают -- ✅ 0 JavaScript ошибок - ---- - -## v4.0.6 - Public Access (28.11.2025, 13:00) - -### ❌ Проблема -**HTTP 401 Unauthorized** на все клики - -**Console Errors:** -``` -Toggle date error: Request failed with status code 401 -PATCH /api/records/1/status [HTTP/2 401] -``` - -**Root Cause:** -- Frontend: Создаёт `Public User` без токена -- Backend: Требует JWT токен (`authMiddleware`) -- Result: Все запросы отклоняются - -### ✅ Решение - -**1. Создать `optionalAuthMiddleware`:** -```typescript -// src/middleware/auth.ts -export async function optionalAuthMiddleware(c, next) { - const authHeader = c.req.header('Authorization') - - if (authHeader && authHeader.startsWith('Bearer ')) { - // Has token → verify - const payload = verifyToken(token) - if (payload) { - c.set('userId', payload.userId) - c.set('role', user.role) - } - } else { - // No token → set public user - c.set('username', 'Public') - // userId = undefined (будет null в SQL) - } - - await next() // ✅ Always continues -} -``` - -**2. Заменить middleware в 13 endpoints:** -```typescript -// Было: -app.patch('/api/records/:id/status', authMiddleware, ...) - -// Стало: -app.patch('/api/records/:id/status', optionalAuthMiddleware, ...) -``` - -**3. Исправить `userId` для public users:** -```typescript -// Было: -.bind(userId, recordId, field, oldValue, newValue) -// userId = undefined → SQL Error - -// Стало: -.bind(userId || null, recordId, field, oldValue, newValue) -// userId = null → ✅ OK -``` - -**Коммит:** -``` -ec9214b - Fix: Allow public access (no login required) for all endpoints -``` - -**Тестирование:** -```bash -# Без токена (Public User) -curl -X PATCH http://localhost:3000/api/records/1/status \ - -H "Content-Type: application/json" \ - -d '{"field":"cutting","date":"2025-03-26"}' - -# Response: {"success": true} ✅ -``` - -**Результат:** -- ✅ HTTP 401 → HTTP 200 -- ✅ Все клики работают без логина -- ✅ Public User может view/add/edit/delete -- ✅ Admin features ещё требуют логин - ---- - -## v4.0.7 - Cache Busting (28.11.2025, 13:15) - -### ❌ Проблема -Пользователи видели старую cached версию `app.js` - -### ✅ Решение -```html - - -``` - -**Коммит:** -``` -3757c28 - Fix: Add cache-busting version parameter to app.js -``` - ---- - -## v4.0.8 - Remove Frontend Blocks (28.11.2025, 13:30) - -### ❌ Проблема -**Backend:** Разрешает public access (optionalAuthMiddleware) -**Frontend:** Блокирует Public User - -**Blocks в app.js:** -```javascript -function openModal() { - if (!token || currentUser.role !== 'admin') { - alert('Только администратор...'); - return; // ❌ БЛОК - } -} - -function editRecord(recordId) { - if (currentUser.role !== 'admin') { - return; // ❌ БЛОК - } -} - -function toggleDeleteButtons() { - const isAdmin = currentUser?.role === 'admin'; - btn.style.display = isAdmin ? 'block' : 'none'; // ❌ СКРЫВАЕТ -} -``` - -**Blocks в HTML:** -```html -
- -
-``` - -```css -.admin-only-block { display: none; } -body.role-admin .admin-only-block { display: block; } -``` - -### ✅ Решение - -**1. Убрать role checks из app.js:** -```javascript -function openModal() { - // Removed role check - editingRecordId = null; - document.getElementById('recordModal').classList.add('active'); -} - -function editRecord(recordId) { - // Removed role check - editingRecordId = recordId; - // ... load and edit -} - -function toggleDeleteButtons() { - // Show for all users - document.querySelectorAll('.delete-btn').forEach(btn => { - btn.style.display = 'inline-block'; - }); -} -``` - -**2. Убрать CSS hiding из HTML:** -```html - -
- -
- - -
- -
-``` - -**Коммит:** -``` -7601940 - Fix: Remove all frontend authentication blocks for Public User -``` - -**Результат:** -- ✅ Backend: Public access (optionalAuthMiddleware) -- ✅ Frontend: Public access (no role checks) -- ✅ Кнопки видны для всех -- ✅ Модалки открываются -- ✅ Edit/Delete работают - ---- - -# ФАЗА 5: ИСПРАВЛЕНИЕ MAT-1/MAT-2 - -## v4.0.9 - Fix Checkbox Toggle (28.11.2025, 15:30) - -### ❌ Проблема -**User:** "Не работает в MAT-1 MAT-2 при выборе даты не сохраняется и не реагирует на чекбокс" - -**Анализ:** -- Checkbox MAT-1/MAT-2 не toggle -- Date selection уже работала (исправлена в v4.0.6) - -### ✅ Решение - -**Добавить логирование и toggle в backend:** -```typescript -// src/index.tsx -app.patch('/api/records/:id/material-confirmed', optionalAuthMiddleware, async (c) => { - const id = parseInt(c.req.param('id')) - - // Read current value - const current = await c.env.DB.prepare(` - SELECT material_confirmed FROM status_checkboxes WHERE record_id = ? - `).bind(id).first() - - // Toggle: 0 → 1, 1 → 0 - const newValue = current.material_confirmed === 1 ? 0 : 1 - - // Update - await c.env.DB.prepare(` - UPDATE status_checkboxes SET material_confirmed = ? WHERE record_id = ? - `).bind(newValue, id).run() - - return c.json({ success: true, newValue }) -}) -``` - -**Тестирование:** -```bash -# Toggle 0 → 1 -curl -X PATCH http://localhost:3000/api/records/1/material-confirmed -# {"success":true,"newValue":1} ✅ - -# Check database -sqlite3 .wrangler/state/v3/d1/webapp-production.sqlite \ - "SELECT material_confirmed FROM status_checkboxes WHERE record_id=1" -# 1 ✅ - -# Toggle 1 → 0 -curl -X PATCH http://localhost:3000/api/records/1/material-confirmed -# {"success":true,"newValue":0} ✅ -``` - -**Коммит:** -``` -0f3d8d9 - Fix MAT-1/MAT-2 checkbox toggle endpoints (v4.0.9) -``` - -**Результат:** -- ✅ MAT-1 checkbox toggle работает (0 ↔ 1) -- ✅ MAT-2 checkbox toggle работает (0 ↔ 1) -- ✅ Database обновляется корректно -- ✅ Date selection работала с v4.0.6 - ---- - -## v4.0.10 - Date Picker Click (Попытка 1) (28.11.2025, 16:00) - -### ❌ Проблема -**User:** "MAT-1 MAT-2 не работает выбор даты при нажатии на дату" - -- Клик на дату не открывает calendar picker -- Кнопка "Clear" работает -- Checkbox toggle работает (v4.0.9) - -### 🔍 Анализ - -**Root Cause:** -```html - - -
- 10.11.2025 -
-``` - -**Проблемы:** -1. `showPicker()` не работает во всех браузерах/контекстах -2. `pointer-events-none` блокирует direct clicks -3. `showPicker()` требует user gesture - -### ✅ Решение (Попытка 1) - -**Заменить `showPicker()` на `click()`:** -```javascript -// Было: -onclick="document.getElementById('materialDate').showPicker()" - -// Стало: -onclick="document.getElementById('materialDate').click()" -``` - -**Убрать `pointer-events-none`:** -```html - -class="absolute opacity-0 pointer-events-none w-0 h-0" - - -class="absolute opacity-0 w-0 h-0" -``` - -**Коммит:** -``` -76c62bb - Fix date picker click for MAT-1/MAT-2 (v4.0.10) -``` - -**Результат:** -❌ Не сработало - браузер блокирует programmatic `.click()` - ---- - -## v4.0.11 - Date Picker Label (Попытка 2) (28.11.2025, 17:00) - -### ❌ Проблема -**User:** "событие не происходит а в консоле накапливаеться счетчик" - -- Date picker click events не срабатывают -- Console errors накапливаются -- Browser warning: "Игнорируем неподдерживаемые entryTypes: longtask" - -### 🔍 Анализ - -**Root Cause:** -- `onclick="input.click()"` - unreliable, блокируется браузером -- Programmatic clicks на hidden inputs часто блокируются security - -### ✅ Решение (Попытка 2) - -**Использовать `