dc654167e5
Подключил порт-модули лимитов (creativeLimits/urlRule/imageRule/imageMeta) к CreativeForm.vue: живые счётчики и ошибки длин заголовка/второго заголовка/текста, живая проверка ссылки, проверка картинки до отправки (imageError через readImageMeta+checkImage). Текст объявления стал обязательным (звёздочка в лейбле + блок сабмита пустого текста). Добавил humanizeCreativeErrors.ts (TDD, тест до кода) — заменяет технические имена полей (title/title2/text/href/image) в сообщениях 422 от сервера на русские подписи; подключил в CreativeForm через humanFieldErrors. Баг двоения v-file-input не трогал — отдельная задача. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23 lines
1.1 KiB
TypeScript
23 lines
1.1 KiB
TypeScript
/**
|
|
* Очеловечивание сообщений 422 от B1 CreativeValidator для формы креатива.
|
|
* Сервер пишет технические имена полей движка (title/title2/text/href/image)
|
|
* в формах «Поле <field> …» / «… в поле <field> …» — заменяем их на русские
|
|
* подписи полей формы, остальной текст сообщения не трогаем.
|
|
*/
|
|
|
|
const FIELD_LABELS: Record<string, string> = {
|
|
title: 'Заголовок',
|
|
title2: 'Второй заголовок',
|
|
text: 'Текст объявления',
|
|
href: 'Ссылка на сайт',
|
|
image: 'Картинка',
|
|
};
|
|
|
|
/** Заменяет техническое имя поля после «Поле »/«поле » на закавыченную русскую подпись. */
|
|
export function humanizeMessage(msg: string): string {
|
|
return msg.replace(/(Поле|поле)\s+([a-zA-Z][a-zA-Z0-9_]*)/g, (match, poleWord: string, field: string) => {
|
|
const label = FIELD_LABELS[field];
|
|
return label ? `${poleWord} «${label}»` : match;
|
|
});
|
|
}
|