From 41395eb7c6bc269d61fccf427c9fe31186a1f014 Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 30 Jun 2025 22:19:46 +0300 Subject: [PATCH] 0.5.10-invites-crud --- CHANGELOG.md | 85 ++++++ panel/admin.tsx | 11 + panel/graphql/mutations.ts | 43 +++ panel/graphql/queries.ts | 156 +++++++--- panel/modals/CollectionEditModal.tsx | 187 ++++++++++++ panel/modals/CommunityEditModal.tsx | 192 ++++++++++++ panel/modals/InviteEditModal.tsx | 234 +++++++++++++++ panel/routes/collections.tsx | 258 ++-------------- panel/routes/communities.tsx | 152 +++------- panel/routes/invites.tsx | 424 +++++++++++++++++++++++++++ panel/routes/topics.tsx | 51 +++- resolvers/admin.py | 305 +++++++++++++++++++ schema/admin.graphql | 34 +++ schema/type.graphql | 1 + 14 files changed, 1748 insertions(+), 385 deletions(-) create mode 100644 panel/modals/CollectionEditModal.tsx create mode 100644 panel/modals/CommunityEditModal.tsx create mode 100644 panel/modals/InviteEditModal.tsx create mode 100644 panel/routes/invites.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 46fbf5a1..70d6a7cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,47 @@ # Changelog +## [0.5.10] - 2025-06-30 + +### Новая функциональность CRUD приглашений + +- **НОВОЕ**: Полноценное управление приглашениями в админ-панели: + - **Новая вкладка "Приглашения"**: Отдельная секция в админ-панели для управления приглашениями к сотрудничеству + - **Полная CRUD функциональность**: Создание, редактирование, удаление приглашений + - **Подробная таблица**: Приглашающий, приглашаемый, публикация, статус с детальной информацией + - **Клик для редактирования**: Нажатие на строку открывает модалку редактирования приглашения + - **Удаление с подтверждением**: Тонкая кнопка "×" для удаления с модальным окном подтверждения + - **Кнопка создания**: Возможность создания новых приглашений прямо из интерфейса + - **Фильтрация по статусу**: Все/Ожидает ответа/Принято/Отклонено + - **Поиск**: По email и именам приглашающего/приглашаемого, названию публикации, ID + - **Пагинация**: Полная поддержка пагинации для больших списков приглашений + +- **Серверная часть**: + - **GraphQL схема**: Новые queries, mutations и input types для приглашений: + - `adminGetInvites` - получение списка приглашений с фильтрацией и пагинацией + - `adminCreateInvite` - создание нового приглашения + - `adminUpdateInvite` - обновление статуса приглашения + - `adminDeleteInvite` - удаление приглашения + - **Резолверы**: Полный набор администраторских резолверов с проверкой прав доступа + - **Авторизация**: Требуется роль admin для создания/редактирования/удаления приглашений + - **Валидация данных**: Проверка существования всех связанных объектов (авторы, публикации) + - **Предотвращение дублирования**: Проверка уникальности приглашений по составному ключу + - **Подробное логирование**: Отслеживание всех операций с приглашениями для аудита + +- **Архитектурные улучшения**: + - **Модальное окно InviteEditModal**: Отдельный компонент для создания/редактирования приглашений + - **Автоматическое определение режима**: Модальное окно само определяет режим создания/редактирования + - **Валидация форм**: Проверка корректности ID, предотвращение самоприглашений + - **Составной первичный ключ**: Работа с уникальным идентификатором из трех полей (inviter_id, author_id, shout_id) + - **Статусные бейджи**: Цветовая индикация статусов (ожидает/принято/отклонено) + - **Информационные панели**: Отображение полной информации о связанных авторах и публикациях + +- **ТЕХНИЧЕСКАЯ АРХИТЕКТУРА**: + - **Следование паттернам проекта**: Использование существующих компонентов Button, Modal, Pagination + - **Переиспользование стилей**: CSS модули Table.module.css, Form.module.css, Modal.module.css + - **Консистентный API**: Единый стиль GraphQL операций admin* с другими админскими функциями + - **TypeScript типизация**: Полная типизация всех интерфейсов приглашений и связанных объектов + - **Обработка ошибок**: Централизованная обработка ошибок с детальными сообщениями пользователю + ## [0.5.9] - 2025-06-30 ### Новая функциональность CRUD коллекций @@ -44,6 +86,49 @@ - **Оптимизированная конфигурация маршрутов**: Четкое разделение между API, статикой и SPA fallback - **Совместимость с SolidJS Router**: Полная поддержка клиентского роутинга +### Исправления GraphQL схемы и расширение CRUD + +- **ИСПРАВЛЕНО**: Поле `pic` в типе Collection: + - **Проблема**: GraphQL ошибка "Cannot query field 'pic' on type 'Collection'" + - **Решение**: Добавлено поле `pic: String` в тип Collection в `schema/type.graphql` + - **Результат**: Картинки коллекций корректно отображаются в админ-панели + +- **НОВОЕ**: Полноценный CRUD для тем и сообществ: + - **Кнопки создания**: Добавлены кнопки "Создать тему" и "Создать сообщество" в соответствующие разделы админ-панели + - **Мутации создания**: + - `CREATE_TOPIC_MUTATION` для создания новых тем + - `CREATE_COMMUNITY_MUTATION` для создания новых сообществ + - **Модальные окна создания**: Полнофункциональные формы с валидацией для создания тем и сообществ + - **Интеграция с существующими резолверами**: Использование GraphQL мутаций `create_topic` и `create_community` + - **Результат**: Администраторы могут создавать новые темы и сообщества прямо из админ-панели + +- **Архитектурные улучшения**: + - **Переиспользование компонентов**: TopicEditModal используется как для создания, так и для редактирования тем + - **Консистентный UX**: Единый стиль модальных окон создания/редактирования для всех сущностей + - **Валидация форм**: Обязательные поля (slug, name) с placeholder'ами и подсказками + - **Автоматическое обновление**: После создания/редактирования списки автоматически перезагружаются + +### Рефакторинг модальных окон + +- **РЕФАКТОРИНГ**: Изоляция модальных окон в отдельные компоненты: + - **Проблема**: Модальные окна создания/редактирования находились прямо в компонентах маршрутов, нарушая принцип разделения ответственности + - **Решение**: Создание отдельных компонентов в папке `@/modals`: + - `CommunityEditModal.tsx` - для создания и редактирования сообществ + - `CollectionEditModal.tsx` - для создания и редактирования коллекций + - **Архитектурные улучшения**: + - **Следование традициям проекта**: Все модальные окна теперь изолированы в отдельные компоненты (`EnvVariableModal`, `RolesModal`, `ShoutBodyModal`, `TopicEditModal`) + - **Переиспользование паттернов**: Единый стиль props, валидации и обработки ошибок + - **Лучшая типизация**: TypeScript интерфейсы для всех props компонентов + - **Упрощение роутов**: Убрана сложная логика форм из маршрутов - теперь только логика API вызовов + - **Валидация форм**: Централизованная валидация в модальных компонентах с real-time обратной связью + - **Результат**: Более чистая архитектура, лучшее разделение ответственности, упрощение тестирования + +- **ТЕХНИЧЕСКАЯ АРХИТЕКТУРА**: + - **Унификация API**: Единый паттерн `onSave(data: Partial)` для всех модальных окон создания/редактирования + - **Автоматическое определение режима**: Модальные окна сами определяют режим создания/редактирования по наличию entity в props + - **Очистка состояния**: Автоматический сброс ошибок и формы при открытии/закрытии модальных окон + - **Консистентные стили**: Переиспользование CSS модулей `Form.module.css` и `Modal.module.css` + ## [0.5.8] - 2025-06-30 ### Улучшения интерфейса публикаций diff --git a/panel/admin.tsx b/panel/admin.tsx index 23211922..cb4c8d7b 100644 --- a/panel/admin.tsx +++ b/panel/admin.tsx @@ -12,6 +12,7 @@ import AuthorsRoute from './routes/authors' import CollectionsRoute from './routes/collections' import CommunitiesRoute from './routes/communities' import EnvRoute from './routes/env' +import InvitesRoute from './routes/invites' import ShoutsRoute from './routes/shouts' import TopicsRoute from './routes/topics' import styles from './styles/Admin.module.css' @@ -140,6 +141,12 @@ const AdminPage: Component = (props) => { > Коллекции +