СЛМ (CL MANAGEMENT), Selin Invest, ОСН Беркут, ТехЛаб и Seline Holding Ltd
по сути не действуют — фильтруем их по Id при получении справочника
компаний из api.tnsu.kz, чтобы они не появлялись в выпадающем списке формы.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Порядок вариантов синхронизирован с новым дефолтом и восстановлен как в
исходной форме: "Предложение" первым в списке, а не "Жалоба".
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
CollapseSection превращал заголовки "Кто обращается" / "Суть обращения" в
кнопки — по клику секция пряталась целиком, вместе с обязательными полями.
Легко было свернуть случайно и не заметить, что часть формы больше не видна
(и не отправляется). Заменены на обычные div с отступом: контент всегда
на экране, сворачивать нечего.
Один из двух известных факторов, из-за которых форма на мобильном "теряла"
часть контента (второй — фикс на 100dvh, отдельным коммитом): свёрнутая
секция резко уменьшала высоту страницы, из-за чего казалось, что скролл
пропал и форма "не двигается вниз".
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
vh на мобильных браузерах считается от максимальной высоты экрана (без
адресной строки/клавиатуры), из-за чего высота, заданная в CSS, может не
совпадать с реально видимой областью. dvh считается от текущей видимой
высоты — правится вслед за появлением клавиатуры или сворачиванием адресной
строки. Оставлен как дополнение к vh, а не замена: браузеры без поддержки dvh
просто проигнорируют вторую строку.
Пока не подтверждённая, но вероятная причина репортнутого "скролл пропал,
форма не двигается вниз" на мобильном — само по себе это исправление
безопасно независимо от того, окажется ли оно достаточным.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Покрыты чистые функции бизнес-логики: 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>
Каждый вид обращения раньше показывал одинаковый набор обязательных полей.
getAppealFieldsConfig теперь описывает и видимость, и обязательность отдельно:
жалоба — предложение по-прежнему можно оставить, но требовать его как для
самостоятельного вида "Предложение" неверно. validateFeedback читает то же
правило, что и форма, — иначе одно поле могло бы требовать то, что другое
не показывает.
FormCard в FeedbackForm дублировал заголовок и подзаголовок PageShell — убран
(пустой title у ui-kit не создаёт строки, гэпа не остаётся).
Подсказка у переключателя "Обращение анонимное" разбита на две сноски (* и **),
как в исходной форме, а не слитный абзац.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Переносит вопросы из Microsoft Forms в собственный интерфейс: компания,
анонимность, ФИО и должность, вид обращения, описание ситуации и предложение.
Поля автора скрываются при анонимном обращении, а не блокируются: требовать ФИО
у анонима — противоречие, а серое неактивное поле выглядит как ошибка формы.
Состояние целиком в useFeedbackForm, правила заполнения — в отдельной чистой
функции validateFeedback: её можно покрыть тестами без React.
Отправки пока нет — по договорённости делаем только UI, submit пишет данные в
консоль (TODO в useFeedbackForm).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Основа для формы обращений в HR взамен встроенной Microsoft Forms.
React зафиксирован на 17: этого требует @tnsu/ui-kit в peerDependencies.
Дизайн-токены скопированы из request-portal, чтобы формы компании выглядели
одинаково; подключаются явным @use в каждом SCSS-модуле, как там же.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>