Commit Graph

15 Commits

Author SHA1 Message Date
gorbenko.pavel f2d4fd1768 fix: захардкодить SHAREPOINT_SITE_URL и SHAREPOINT_LIST_NAME
Убрал требование задавать их через .env на сервере — значения одни
и те же для единственного прод-окружения.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 11:42:17 +05:00
gorbenko.pavel 07bafde43f feat: отправка формы обращения в SharePoint через api.tnsu.kz
POST /feedback собирает поля формы в столбцы списка (Company резолвится
в название по справочнику, Type/Title — по виду обращения) и создаёт
элемент через api.tnsu.kz /SharePoint/ListItem. Ошибки авторизации и
апстрима логируются в stdout и возвращаются клиенту как 502, чтобы сбой
на проде было видно явно.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 11:39:20 +05:00
gorbenko.pavel 49bf9b3c4e fix: переименовать вид обращения "Жалоба" в "Обращение"
Обновлены label в KIND_OPTIONS, комментарии и placeholder ФИО в форме.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-24 11:13:23 +05:00
gorbenko.pavel e4678210ab Merge remote-tracking branch 'origin/main' into initial-fixes 2026-08-24 09:09:22 +05:00
admin a8d46208a6 добавлена авторизация для запросов на api.tnsu.kz
Tests / frontend-test (pull_request) Successful in 18s
2026-08-21 17:11:34 +05:00
admin 60e654c80e fix: update port mapping for hr-appeals-web service to use 80:80 2026-08-21 16:36:27 +05:00
admin 838fd644e9 Настроен деплой 2026-08-21 15:47:43 +05:00
gorbenko.pavel 836a472fe0 fix: делает "Предложение" видом обращения по умолчанию
Tests / frontend-test (push) Successful in 12s
Порядок вариантов синхронизирован с новым дефолтом и восстановлен как в
исходной форме: "Предложение" первым в списке, а не "Жалоба".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 12:16:41 +05:00
gorbenko.pavel ebadf795e8 fix: убирает сворачиваемые секции формы
Tests / frontend-test (push) Successful in 3m40s
CollapseSection превращал заголовки "Кто обращается" / "Суть обращения" в
кнопки — по клику секция пряталась целиком, вместе с обязательными полями.
Легко было свернуть случайно и не заметить, что часть формы больше не видна
(и не отправляется). Заменены на обычные div с отступом: контент всегда
на экране, сворачивать нечего.

Один из двух известных факторов, из-за которых форма на мобильном "теряла"
часть контента (второй — фикс на 100dvh, отдельным коммитом): свёрнутая
секция резко уменьшала высоту страницы, из-за чего казалось, что скролл
пропал и форма "не двигается вниз".

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 10:43:18 +05:00
gorbenko.pavel 7809741299 fix: добавляет 100dvh для корректной высоты страницы на мобильных
vh на мобильных браузерах считается от максимальной высоты экрана (без
адресной строки/клавиатуры), из-за чего высота, заданная в CSS, может не
совпадать с реально видимой областью. dvh считается от текущей видимой
высоты — правится вслед за появлением клавиатуры или сворачиванием адресной
строки. Оставлен как дополнение к vh, а не замена: браузеры без поддержки dvh
просто проигнорируют вторую строку.

Пока не подтверждённая, но вероятная причина репортнутого "скролл пропал,
форма не двигается вниз" на мобильном — само по себе это исправление
безопасно независимо от того, окажется ли оно достаточным.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 10:43:02 +05:00
gorbenko.pavel 3cf46fa55c test: добавляет Vitest и CI-workflow по образцу request-portal
Покрыты чистые функции бизнес-логики: validateFeedback (обязательность полей
по видам обращения, минимальная длина текста, анонимность) и
getAppealFieldsConfig (согласованность конфига — обязательное поле не может
быть скрыто). React-компоненты пока не тестируются: сначала нужно решить,
куда форма отправляет данные, иначе тесты придётся сразу переписывать.

vite.config.ts: defineConfig теперь из 'vitest/config' — один файл конфига
на сборку и тесты вместо двух рассинхронизирующихся. globals: true и
environment: 'node', т.к. тестируется логика, а не DOM.

.gitea/workflows/test.yml — тот же принцип, что в request-portal (push в
main, PR, ретраи npm install), но npm run ci вместо heft test: здесь нет
SPFx/Jest, и деплой пока не добавлен — куда разворачивать dist/, не решено.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 09:45:05 +05:00
gorbenko.pavel 05cd491769 fix: делает "Предложение по улучшению" необязательным для жалобы, убирает дубль заголовка
Каждый вид обращения раньше показывал одинаковый набор обязательных полей.
getAppealFieldsConfig теперь описывает и видимость, и обязательность отдельно:
жалоба — предложение по-прежнему можно оставить, но требовать его как для
самостоятельного вида "Предложение" неверно. validateFeedback читает то же
правило, что и форма, — иначе одно поле могло бы требовать то, что другое
не показывает.

FormCard в FeedbackForm дублировал заголовок и подзаголовок PageShell — убран
(пустой title у ui-kit не создаёт строки, гэпа не остаётся).

Подсказка у переключателя "Обращение анонимное" разбита на две сноски (* и **),
как в исходной форме, а не слитный абзац.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-21 09:44:48 +05:00
gorbenko.pavel 51339b3f9a appeals 2026-08-20 18:29:27 +05:00
gorbenko.pavel 010f78b138 feat: форма обращения сотрудника в HR департамент
Переносит вопросы из Microsoft Forms в собственный интерфейс: компания,
анонимность, ФИО и должность, вид обращения, описание ситуации и предложение.

Поля автора скрываются при анонимном обращении, а не блокируются: требовать ФИО
у анонима — противоречие, а серое неактивное поле выглядит как ошибка формы.

Состояние целиком в useFeedbackForm, правила заполнения — в отдельной чистой
функции validateFeedback: её можно покрыть тестами без React.

Отправки пока нет — по договорённости делаем только UI, submit пишет данные в
консоль (TODO в useFeedbackForm).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 18:15:10 +05:00
gorbenko.pavel e921062e3b chore: каркас проекта на Vite + React + TypeScript
Основа для формы обращений в HR взамен встроенной Microsoft Forms.

React зафиксирован на 17: этого требует @tnsu/ui-kit в peerDependencies.
Дизайн-токены скопированы из request-portal, чтобы формы компании выглядели
одинаково; подключаются явным @use в каждом SCSS-модуле, как там же.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 18:14:54 +05:00