feat: форма обращения сотрудника в HR департамент

Переносит вопросы из Microsoft Forms в собственный интерфейс: компания,
анонимность, ФИО и должность, вид обращения, описание ситуации и предложение.

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

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

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

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-20 18:15:10 +05:00
parent e921062e3b
commit 010f78b138
18 changed files with 739 additions and 0 deletions
+66
View File
@@ -0,0 +1,66 @@
# hr-appeals
Форма обращений сотрудников в HR департамент.
Заменяет встроенную Microsoft Forms: даёт собственный интерфейс в фирменном стиле
(общие токены и компоненты, что и `request-portal`) без чужого брендинга и служебных
плашек в подвале.
## Стек
- React 17 + TypeScript (строгий режим)
- Vite 6
- SCSS Modules
- [`@tnsu/ui-kit`](http://git.tnsu.kz/timur.gorodetskiy/tnsu-ui-kit) — общие UI-компоненты
React именно 17-й: `@tnsu/ui-kit` объявляет его в `peerDependencies`.
## Запуск
Пакеты `@tnsu/*` лежат в приватном реестре — он прописан в `.npmrc`, отдельная
настройка не нужна, но нужен доступ к `git.tnsu.kz`.
```bash
npm install
npm run dev
```
Прочие команды:
```bash
npm run build # проверка типов + production-сборка в dist/
npm run typecheck # только проверка типов
npm run preview # просмотр собранной версии
```
## Структура
```
src/
components/ переиспользуемые UI-обёртки
Field/ FormField из ui-kit + текст ошибки валидации
PageShell/ шапка страницы и центрированный контент
features/feedback/ собственно форма обращения
model.ts типы данных, справочники, пустое состояние
texts.ts все пользовательские строки (задел под локализацию)
validateFeedback.ts правила заполнения — чистая функция
useFeedbackForm.ts состояние формы, валидация, отправка
FeedbackForm.tsx сборка формы из секций
ThankYouScreen.tsx экран после отправки
sections/ секции формы
styles/
_design-tokens.scss фирменные токены (копия из request-portal)
global.scss
```
Состояние формы целиком живёт в `useFeedbackForm`; секции получают срез данных и
колбэк `set`, но своим состоянием не владеют.
## Что не сделано
**Отправка данных.** Бэкенда пока нет: `useFeedbackForm.submit` валидирует форму и
пишет результат в консоль (см. `TODO` в файле). Реальную интеграцию нужно подключить
отдельно — только там, без правок в компонентах.
**Список компаний.** В `model.ts` заполнено одно значение — «ТОО АСТЕЛ-К», единственное
видимое в исходной форме. Полный список нужно уточнить у владельца формы.