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
Co-authored-by: Mariya Trishina <trishina.mariya@tnsu.kz> Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/hr-appeals/pulls/2
82 lines
3.1 KiB
TypeScript
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>>;
|