- Реструктуризация: 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
9.1 KiB
🔍 ПОЛНЫЙ ОБЗОР ЛОГИКИ КЛИКОВ - AKNAPROFF Tootmine
📋 История изменений из переписки
Версия 1: Оригинальный архив (aknaproff.zip)
- Структура: Один HTML файл с встроенным JavaScript
- Кнопки:
<button onclick="openModal()">Lisa uus rida</button> - Функции: Все функции встроены в
<script>теги внутри HTML - Аутентификация: НЕТ - приложение работало без логина
- Статус: ✅ Все клики работали
Версия 2: Разделение на фронт + бэк (v3.x - v4.0.6)
Что было сделано:
- HTML извлечён в
public/original.html - JavaScript извлечён в
public/static/app.js - Backend создан с Hono + D1 Database
- Добавлена JWT аутентификация
Проблемы:
- ❌ Кнопки требовали admin роль, но Public User не мог их видеть
- ❌ Backend требовал JWT токен (authMiddleware)
- ❌ Frontend показывал только для
body.role-admin
Версия 3: Текущая (v4.0.7)
Что исправлено:
- ✅ Backend:
authMiddleware→optionalAuthMiddleware(13 endpoints) - ✅ Backend:
userId || nullдля audit_log - ✅ Backend: Все PATCH/POST/PUT/DELETE работают без токена
- ✅ Default month: Изменён на January (1) где есть демо-данные
- ✅ Cache busting: Добавлен
?v=4.0.6к app.js
Что НЕ ИСПРАВЛЕНО:
- ❌ Frontend: Кнопка "Lisa uus rida" всё ещё скрыта для Public User
- ❌ Frontend:
openModal()проверяетrole === 'admin'и блокирует - ❌ CSS:
.admin-only-block { display: none }скрывает кнопки
🎯 ТЕКУЩЕЕ СОСТОЯНИЕ КЛИКОВ
✅ Что РАБОТАЕТ
1. Клики по ячейкам таблицы (Date Toggle)
<td onclick="toggleDate(1, 'cutting', '2025-01-10')">
Функция:
async function toggleDate(recordId, field, date) {
await axios.patch(`/api/records/${recordId}/status`, { field, date });
await loadRecords();
}
Status: ✅ РАБОТАЕТ (без токена, optionalAuthMiddleware)
2. Клики по Worksheets Cycle
<button onclick="toggleWorksheetsStep(1)">
Функция:
async function toggleWorksheetsStep(recordId) {
await axios.patch(`/api/records/${recordId}/worksheets-cycle`);
await loadRecords();
}
Status: ✅ РАБОТАЕТ (без токена)
3. Фильтры (Month/Year)
<select id="monthFilter">
Event Listener:
document.getElementById('monthFilter').addEventListener('change', loadRecords);
Status: ✅ РАБОТАЕТ
4. Поиск (Search Inputs)
<input id="searchClient">
Event Listener:
document.getElementById('searchClient').addEventListener('input', handleSearchFilter);
Status: ✅ РАБОТАЕТ
❌ Что НЕ РАБОТАЕТ
1. Кнопка "Lisa uus rida" (Add Record)
<div class="admin-only-block">
<button onclick="openModal()">Lisa uus rida</button>
</div>
CSS:
.admin-only-block { display: none; }
body.role-admin .admin-only-block { display: block; }
Проблема: Кнопка СКРЫТА для Public User
Функция:
function openModal() {
if (!token || !currentUser || currentUser.role !== 'admin') {
alert('Ainult administraator saab lisada uusi kirjeid');
openLoginModal();
return; // ❌ БЛОКИРУЕТ для Public User
}
document.getElementById('recordModal').classList.add('active');
}
Status: ❌ НЕ РАБОТАЕТ (скрыта + блокируется)
2. Edit Record Button
<button onclick="editRecord(1)">
Функция:
function editRecord(recordId) {
if (!token || !currentUser || currentUser.role !== 'admin') {
alert('Ainult administraator saab muuta kirjeid');
openLoginModal();
return; // ❌ БЛОКИРУЕТ
}
// ... load and edit
}
Status: ❌ ЧАСТИЧНО (видна, но блокируется)
3. Delete Record Button
<button onclick="confirmDelete(1)" class="delete-btn">
CSS:
.delete-btn { display: none; }
JavaScript Toggle:
function toggleDeleteButtons() {
const isAdmin = currentUser?.role === 'admin';
document.querySelectorAll('.delete-btn').forEach(btn => {
btn.style.display = isAdmin ? 'inline-block' : 'none';
});
}
Status: ❌ НЕ РАБОТАЕТ (скрыта для Public User)
🔧 КОРНЕВАЯ ПРИЧИНА
Несоответствие Frontend ↔ Backend
Backend (v4.0.6):
// ✅ Разрешает публичный доступ
app.post('/api/records', optionalAuthMiddleware, async (c) => {
// userId может быть null для Public User
})
Frontend (app.js):
// ❌ Блокирует публичный доступ
function openModal() {
if (currentUser.role !== 'admin') {
alert('Только администратор...');
return; // БЛОК!
}
}
CSS:
/* ❌ Скрывает кнопки для Public User */
.admin-only-block { display: none; }
body.role-admin .admin-only-block { display: block; }
📊 СРАВНЕНИЕ: Оригинал vs Текущий
| Функция | Оригинал | Текущий v4.0.7 | Причина проблемы |
|---|---|---|---|
| Toggle Date | ✅ Работает | ✅ Работает | Backend: optionalAuth |
| Worksheets | ✅ Работает | ✅ Работает | Backend: optionalAuth |
| Add Record | ✅ Работает | ❌ Скрыта | CSS: admin-only-block |
| Edit Record | ✅ Работает | ❌ Блокируется | JS: role check |
| Delete Record | ✅ Работает | ❌ Скрыта | JS: toggleDeleteButtons |
| Filters | ✅ Работает | ✅ Работает | No auth needed |
| Search | ✅ Работает | ✅ Работает | No auth needed |
🎯 ЧТО НУЖНО ИСПРАВИТЬ
Проблема 1: Кнопка "Lisa uus rida" скрыта
Файл: public/original.html
Сейчас:
<div class="admin-only-block">
<button onclick="openModal()">Lisa uus rida</button>
</div>
Исправить на:
<div>
<button onclick="openModal()">Lisa uus rida</button>
</div>
Проблема 2: openModal() блокирует Public User
Файл: public/static/app.js
Сейчас:
function openModal() {
if (!token || !currentUser || currentUser.role !== 'admin') {
alert('Ainult administraator...');
openLoginModal();
return;
}
// ...
}
Исправить на:
function openModal() {
// Allow all users to open modal
editingRecordId = null;
document.getElementById('modalTitle').textContent = 'Lisa uus kirje';
document.getElementById('recordForm').reset();
document.getElementById('recordModal').classList.add('active');
updateMat2State();
}
Проблема 3: editRecord() блокирует Public User
Исправить на:
function editRecord(recordId) {
// Allow all users to edit
editingRecordId = recordId;
// ... load and show modal
}
Проблема 4: Delete buttons скрыты
Файл: public/static/app.js
Сейчас:
function toggleDeleteButtons() {
const isAdmin = currentUser?.role === 'admin';
document.querySelectorAll('.delete-btn').forEach(btn => {
btn.style.display = isAdmin ? 'inline-block' : 'none';
});
}
Исправить на:
function toggleDeleteButtons() {
// Show delete buttons for all users
document.querySelectorAll('.delete-btn').forEach(btn => {
btn.style.display = 'inline-block';
});
}
✅ ИТОГО
РЕАЛЬНО РАБОТАЕТ:
- ✅ Клики по ячейкам таблицы (toggleDate)
- ✅ Worksheets cycle button
- ✅ Фильтры (month/year)
- ✅ Поиск (client/type/offer/work)
- ✅ Сортировка (sortRecords)
- ✅ Backend API (26/26 endpoints с optionalAuth)
НЕ РАБОТАЕТ (причина - Frontend блокировки):
- ❌ Кнопка "Lisa uus rida" - СКРЫТА (admin-only-block CSS)
- ❌ openModal() - БЛОКИРУЕТСЯ (role check в JS)
- ❌ editRecord() - БЛОКИРУЕТСЯ (role check в JS)
- ❌ Delete buttons - СКРЫТЫ (toggleDeleteButtons)
ПРИЧИНА: Backend был сделан публичным (optionalAuthMiddleware), но Frontend всё ещё требует admin роль.
РЕШЕНИЕ:
Убрать все проверки role === 'admin' из app.js и удалить класс admin-only-block у кнопок.