fix(ui): edit-форма уважает as-of таймлайна (не now)
This commit is contained in:
@@ -316,12 +316,23 @@ export const mySchemaDraftsQuery = (page = 0, size = 50) =>
|
|||||||
export const useMySchemaDrafts = (page = 0, size = 50) =>
|
export const useMySchemaDrafts = (page = 0, size = 50) =>
|
||||||
useQuery(mySchemaDraftsQuery(page, size))
|
useQuery(mySchemaDraftsQuery(page, size))
|
||||||
|
|
||||||
export const recordRawQuery = (dictionaryName: string, businessKey: string) =>
|
export const recordRawQuery = (
|
||||||
|
dictionaryName: string,
|
||||||
|
businessKey: string,
|
||||||
|
at?: string,
|
||||||
|
) =>
|
||||||
queryOptions({
|
queryOptions({
|
||||||
queryKey: ['record-raw', dictionaryName, businessKey] as const,
|
// at в queryKey — иначе time-travel snapshot закешируется под тем же ключом
|
||||||
|
// что и now-версия, и при смене as-of вернётся stale.
|
||||||
|
queryKey: ['record-raw', dictionaryName, businessKey, at ?? null] as const,
|
||||||
queryFn: async (): Promise<RecordResponse> => {
|
queryFn: async (): Promise<RecordResponse> => {
|
||||||
const { data } = await apiClient.get<RecordResponse>(
|
const { data } = await apiClient.get<RecordResponse>(
|
||||||
`/dictionaries/${dictionaryName}/records/${encodeURIComponent(businessKey)}`,
|
`/dictionaries/${dictionaryName}/records/${encodeURIComponent(businessKey)}`,
|
||||||
|
// at пробрасываем в backend (GET принимает ?at=) — резолв активной
|
||||||
|
// версии на момент таймлайна, а не на now. Без этого открытие записи
|
||||||
|
// в time-travel режиме бьёт now → RECORD_NOT_ACTIVE для записей,
|
||||||
|
// закрытых между as-of и now.
|
||||||
|
at ? { params: { at } } : undefined,
|
||||||
)
|
)
|
||||||
return data
|
return data
|
||||||
},
|
},
|
||||||
@@ -948,9 +959,10 @@ export const useAiFeatureAvailable = () => useQuery(aiFeatureAvailableQuery)
|
|||||||
export const useRecordRaw = (
|
export const useRecordRaw = (
|
||||||
dictionaryName: string,
|
dictionaryName: string,
|
||||||
businessKey: string | undefined,
|
businessKey: string | undefined,
|
||||||
|
at?: string,
|
||||||
) =>
|
) =>
|
||||||
useQuery({
|
useQuery({
|
||||||
...recordRawQuery(dictionaryName, businessKey ?? ''),
|
...recordRawQuery(dictionaryName, businessKey ?? '', at),
|
||||||
enabled: Boolean(businessKey),
|
enabled: Boolean(businessKey),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -659,7 +659,10 @@ function DictionaryDetail() {
|
|||||||
}, [extraColumns, t])
|
}, [extraColumns, t])
|
||||||
|
|
||||||
const editingKey = edit.kind === 'edit' ? edit.record.businessKey : undefined
|
const editingKey = edit.kind === 'edit' ? edit.record.businessKey : undefined
|
||||||
const rawRecordQuery = useRecordRaw(name, editingKey)
|
// timeTravelAt пробрасываем: в time-travel режиме edit-форма должна
|
||||||
|
// резолвить запись на момент таймлайна, а не на now (иначе закрытая между
|
||||||
|
// as-of и now запись → RECORD_NOT_ACTIVE).
|
||||||
|
const rawRecordQuery = useRecordRaw(name, editingKey, timeTravelAt)
|
||||||
|
|
||||||
const handleSubmit = (req: CreateRecordRequest) => {
|
const handleSubmit = (req: CreateRecordRequest) => {
|
||||||
// Fill validFrom at submit (review #5): defaultValues в RHF берётся
|
// Fill validFrom at submit (review #5): defaultValues в RHF берётся
|
||||||
|
|||||||
Reference in New Issue
Block a user