Files
hr-appeals/src/features/feedback/model.ts
T
gorbenko.pavel dea024f3a9
build-and-deploy / prepare (push) Successful in 0s
build-and-deploy / build-and-push (., Dockerfile, hr-appeals-web) (push) Successful in 8s
Tests / frontend-test (push) Successful in 11s
build-and-deploy / build-and-push (server, server/Dockerfile, hr-appeals-auth) (push) Successful in 4s
build-and-deploy / deploy (push) Successful in 15s
шлется на реальный сервер (#2)
Co-authored-by: Mariya Trishina <trishina.mariya@tnsu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/hr-appeals/pulls/2
2026-08-24 08:54:41 +00:00

82 lines
3.1 KiB
TypeScript

import type { ISelectOption } from '@tnsu/ui-kit';
/** Вид обращения. Union вместо строк, чтобы опечатку поймал компилятор. */
export type AppealKind = 'complaint' | 'suggestion' | 'other';
/** Данные формы обращения. Одна плоская структура — один источник истины. */
export interface IFeedbackData {
company: string;
/** true — автор не указывает себя и не получит ответ. */
isAnonymous: boolean;
fullName: string;
position: string;
wantsFeedback: boolean;
kind: AppealKind;
/** Заполняется только при kind === 'other'. */
kindOther: string;
situation: string;
suggestion: string;
}
// Порядок как в исходной форме: «Предложение» первым — совпадает с дефолтным
// значением ниже (EMPTY_FEEDBACK.kind), так что выбор пользователя.
export const KIND_OPTIONS: ISelectOption[] = [
{ value: 'suggestion', label: 'Предложение' },
{ value: 'complaint', label: 'Обращение' },
{ value: 'other', label: 'Другое' }
];
/** Показывать поле или нет, и если показывать — обязательно ли оно. */
export interface IAppealFieldConfig {
visible: boolean;
required: boolean;
}
/** Настройка текстовых полей для выбранного вида обращения. */
export interface IAppealFieldsConfig {
situation: IAppealFieldConfig;
suggestion: IAppealFieldConfig;
}
/**
* Состав полей зависит от вида обращения:
* обращение — обязательно описание, а предложение — на желание автора;
* предложение — только само предложение, «ситуации» ещё нет;
* другое — свободное описание, без предложения.
* Одно правило на форму и на валидацию, чтобы они не разошлись.
*/
export function getAppealFieldsConfig(kind: AppealKind): IAppealFieldsConfig {
switch (kind) {
case 'complaint':
return {
situation: { visible: true, required: true },
suggestion: { visible: true, required: false }
};
case 'suggestion':
return {
situation: { visible: false, required: false },
suggestion: { visible: true, required: true }
};
case 'other':
return {
situation: { visible: true, required: true },
suggestion: { visible: false, required: false }
};
}
}
export const EMPTY_FEEDBACK: IFeedbackData = {
company: '',
isAnonymous: false,
fullName: '',
position: '',
wantsFeedback: false,
kind: 'suggestion',
kindOther: '',
situation: '',
suggestion: ''
};
/** Ключи полей, по которым показываем ошибку валидации. */
export type FeedbackErrors = Partial<Record<keyof IFeedbackData, string>>;