fix(admin-ui): backlog sweep — 7 review items

This commit is contained in:
Александр Зимин
2026-05-10 19:21:33 +00:00
parent c7f6559bed
commit 48dd8a487a
6 changed files with 156 additions and 16 deletions
@@ -385,9 +385,18 @@ function DictionaryDetail() {
const rawRecordQuery = useRecordRaw(name, editingKey)
const handleSubmit = (req: CreateRecordRequest) => {
// Fill validFrom at submit (review #5): defaultValues в RHF берётся
// ТОЛЬКО при mount. Если user открыл modal в 12:00 и submit в 12:05 —
// `validFrom` в req это значение из 12:00. Backend check `validFrom >
// existingFrom` может fail если existing запись свежее. Submit-time
// refresh гарантирует что validFrom не устарел между mount и submit.
const submitReq: CreateRecordRequest = {
...req,
validFrom: req.validFrom && req.validFrom.length > 0 ? req.validFrom : nowIsoLocal(),
}
if (edit.kind === 'create') {
createMut.mutate(
{ payload: req, idempotencyKey: recordIdempotencyKey },
{ payload: submitReq, idempotencyKey: recordIdempotencyKey },
{
onSuccess: () => {
setEdit({ kind: 'closed' })
@@ -401,7 +410,7 @@ function DictionaryDetail() {
updateMut.mutate(
{
businessKey: edit.record.businessKey,
payload: req,
payload: submitReq,
idempotencyKey: recordIdempotencyKey,
},
{
@@ -436,6 +445,10 @@ function DictionaryDetail() {
(code === 'x_references_blocked_by_dependents' ||
code === 'x_references_cascade_required')
) {
// Reset closeMut.error до открытия cascade dialog'а — иначе stale
// 409 mesg может проскочить в открытом cascade UI пока user
// ещё не сделал retry (review #18).
closeMut.reset()
setEdit({ kind: 'closed' })
setCloseReason('')
setCascadeKey(targetKey)
@@ -914,11 +927,11 @@ function DictionaryDetail() {
businessKey: rawRecordQuery.data.businessKey,
data: rawRecordQuery.data.data,
// Edit в bitemporal model = «создаём новую версию с этого момента,
// старая закрывается». Дефолтим validFrom = now (а не historical
// validFrom существующей записи): иначе юзер выберет момент
// ДО любой версии и backend не найдёт что закрывать.
// старая закрывается». validFrom оставляем пустым — handleSubmit
// подставит nowIsoLocal() at submit-time (review #5: иначе stale
// если user долго держит modal открытым).
// validTo пустой = бессрочно (или до следующей правки).
validFrom: nowIsoLocal(),
validFrom: '',
validTo: '',
}}
onSubmit={handleSubmit}