From 6187146e861682ebb2cf3bcb932b5f6182eb8650 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Fri, 7 Feb 2025 15:21:40 +0300 Subject: [PATCH] F: Rework version editing --- rsconcept/frontend/src/backend/library/api.ts | 34 +++--- .../src/backend/library/useVersionUpdate.tsx | 5 +- .../src/components/ui/Control/MiniButton.tsx | 6 +- .../frontend/src/dialogs/DlgCreateVersion.tsx | 4 +- .../DlgEditVersions/DlgEditVersions.tsx | 115 ++++++++++-------- .../dialogs/DlgEditVersions/TableVersions.tsx | 9 +- rsconcept/frontend/src/models/library.ts | 8 -- .../EditorRSFormCard/ToolbarVersioning.tsx | 2 +- 8 files changed, 101 insertions(+), 82 deletions(-) diff --git a/rsconcept/frontend/src/backend/library/api.ts b/rsconcept/frontend/src/backend/library/api.ts index 5f0dd5bc..4e9e5623 100644 --- a/rsconcept/frontend/src/backend/library/api.ts +++ b/rsconcept/frontend/src/backend/library/api.ts @@ -5,15 +5,7 @@ import { axiosDelete, axiosGet, axiosPatch, axiosPost } from '@/backend/apiTrans import { DELAYS } from '@/backend/configuration'; import { ossApi } from '@/backend/oss/api'; import { IRSFormDTO, rsformsApi } from '@/backend/rsform/api'; -import { - AccessPolicy, - ILibraryItem, - IVersionData, - IVersionInfo, - LibraryItemID, - LibraryItemType, - VersionID -} from '@/models/library'; +import { AccessPolicy, ILibraryItem, IVersionInfo, LibraryItemID, LibraryItemType, VersionID } from '@/models/library'; import { validateLocation } from '@/models/libraryAPI'; import { ConstituentaID } from '@/models/rsform'; import { UserID } from '@/models/user'; @@ -90,7 +82,7 @@ export type IUpdateLibraryItemDTO = z.infer; /** * Create version metadata in persistent storage. */ -export const CreateVersionSchema = z.object({ +export const VersionCreateSchema = z.object({ version: z.string(), description: z.string(), items: z.array(z.number()).optional() @@ -99,7 +91,7 @@ export const CreateVersionSchema = z.object({ /** * Create version metadata in persistent storage. */ -export type IVersionCreateDTO = z.infer; +export type IVersionCreateDTO = z.infer; /** * Represents data response when creating {@link IVersionInfo}. @@ -109,6 +101,20 @@ export interface IVersionCreatedResponse { schema: IRSFormDTO; } +/** + * Represents version data, intended to update version metadata in persistent storage. + */ +export const VersionUpdateSchema = z.object({ + id: z.number(), + version: z.string().nonempty(errors.requiredField), + description: z.string() +}); + +/** + * Represents version data, intended to update version metadata in persistent storage. + */ +export type IVersionUpdateDTO = z.infer; + export const libraryApi = { baseKey: 'library', libraryListKey: ['library', 'list'], @@ -234,9 +240,9 @@ export const libraryApi = { successMessage: information.versionRestored } }), - versionUpdate: ({ versionID, data }: { versionID: VersionID; data: IVersionData }) => - axiosPatch({ - endpoint: `/api/versions/${versionID}`, + versionUpdate: (data: IVersionUpdateDTO) => + axiosPatch({ + endpoint: `/api/versions/${data.id}`, request: { data: data, successMessage: information.changesSaved diff --git a/rsconcept/frontend/src/backend/library/useVersionUpdate.tsx b/rsconcept/frontend/src/backend/library/useVersionUpdate.tsx index 2967598c..2d112fc4 100644 --- a/rsconcept/frontend/src/backend/library/useVersionUpdate.tsx +++ b/rsconcept/frontend/src/backend/library/useVersionUpdate.tsx @@ -1,9 +1,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { IRSFormDTO, rsformsApi } from '@/backend/rsform/api'; -import { IVersionData, VersionID } from '@/models/library'; -import { libraryApi } from './api'; +import { IVersionUpdateDTO, libraryApi } from './api'; export const useVersionUpdate = () => { const client = useQueryClient(); @@ -28,6 +27,6 @@ export const useVersionUpdate = () => { } }); return { - versionUpdate: (data: { versionID: VersionID; data: IVersionData }) => mutation.mutate(data) + versionUpdate: (data: IVersionUpdateDTO, onSuccess?: () => void) => mutation.mutate(data, { onSuccess }) }; }; diff --git a/rsconcept/frontend/src/components/ui/Control/MiniButton.tsx b/rsconcept/frontend/src/components/ui/Control/MiniButton.tsx index 85daf7e6..4721c64d 100644 --- a/rsconcept/frontend/src/components/ui/Control/MiniButton.tsx +++ b/rsconcept/frontend/src/components/ui/Control/MiniButton.tsx @@ -4,6 +4,9 @@ import { CProps } from '@/components/props'; import { globals } from '@/utils/constants'; interface MiniButtonProps extends CProps.Button { + /** Button type. */ + type?: 'button' | 'submit'; + /** Icon to display in the button. */ icon: React.ReactNode; @@ -25,12 +28,13 @@ export function MiniButton({ title, titleHtml, hideTitle, + type = 'button', className, ...restProps }: MiniButtonProps) { return (