[C28-38][@ant] правка: маски паспортных полей (строки, без спиннеров)
Typecheck / desktop (pull_request) Failing after 8m29s
Typecheck / controller (pull_request) Has been cancelled

- BaseInput: проп mask (проброс в q-input)
- форма паспорта: серия #### / номер ###### / код ###-### (только цифры,
  без стрелок number), плейсхолдеры + валидация полноты перед сохранением

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
coopops
2026-06-14 10:23:10 +00:00
parent 248375a1bf
commit b30cf4cdcc
3 changed files with 25 additions and 6 deletions
@@ -13,11 +13,11 @@
повторно.
</p>
<BaseInput v-model="series" label="Серия паспорта" type="number" required />
<BaseInput v-model="number" label="Номер паспорта" type="number" required />
<BaseInput v-model="series" label="Серия паспорта" mask="####" placeholder="7509" required />
<BaseInput v-model="number" label="Номер паспорта" mask="######" placeholder="712233" required />
<BaseInput v-model="issuedBy" label="Кем выдан" required />
<BaseInput v-model="issuedAt" label="Дата выдачи" type="date" required />
<BaseInput v-model="code" label="Код подразделения" placeholder="220-220" required />
<BaseInput v-model="code" label="Код подразделения" mask="###-###" placeholder="220-220" required />
<template #footer="{ loading }">
<BaseButton variant="ghost" :disabled="loading" @click="cancel">Отмена</BaseButton>
@@ -70,14 +70,30 @@ function cancel(): void {
}
async function submit(): Promise<void> {
const seriesStr = String(series.value ?? '').trim();
const numberStr = String(number.value ?? '').trim();
const codeStr = code.value.trim();
// маски ограничивают максимум; здесь проверяем полноту: серия — 4 цифры, номер — 6, код — NNN-NNN
if (!/^\d{4}$/.test(seriesStr)) {
FailAlert('Серия паспорта — 4 цифры');
return;
}
if (!/^\d{6}$/.test(numberStr)) {
FailAlert('Номер паспорта — 6 цифр');
return;
}
if (!/^\d{3}-\d{3}$/.test(codeStr)) {
FailAlert('Код подразделения — в формате 123-456');
return;
}
saving.value = true;
try {
const account = await api.saveMyPassport({
series: Number(series.value),
number: Number(number.value),
series: Number(seriesStr),
number: Number(numberStr),
issued_by: issuedBy.value,
issued_at: issuedAt.value,
code: code.value,
code: codeStr,
});
session.setCurrentUserAccount(account);
SuccessAlert('Паспортные данные сохранены');
@@ -5,6 +5,8 @@ export interface BaseInputProps {
error?: string;
placeholder?: string;
type?: 'text' | 'email' | 'password' | 'number' | 'tel' | 'url' | 'search' | 'date';
/** Маска ввода Quasar: `#` — цифра (например `####` — серия паспорта, `###-###` — код подразделения) */
mask?: string;
/** Моноширинный шрифт (для аккаунт-имён, hash, и т.п.) */
mono?: boolean;
/** Кнопка очистки значения (например, для фильтров по дате) */
@@ -12,6 +12,7 @@
:error-message="error"
:placeholder="placeholder"
:type="type"
:mask="mask"
:prefix="prefix"
:suffix="suffix"
:readonly="readonly"