R: Unify naming convention for frontend APIs

This commit is contained in:
Ivan 2025-04-20 16:20:43 +03:00
parent 6783300339
commit c07bdfbb3a
51 changed files with 262 additions and 253 deletions

View File

@ -15,12 +15,12 @@ import {
type AccessPolicy, type AccessPolicy,
type ICloneLibraryItemDTO, type ICloneLibraryItemDTO,
type ICreateLibraryItemDTO, type ICreateLibraryItemDTO,
type ICreateVersionDTO,
type ILibraryItem, type ILibraryItem,
type IRenameLocationDTO, type IRenameLocationDTO,
type IUpdateLibraryItemDTO, type IUpdateLibraryItemDTO,
type IVersionCreateDTO, type IUpdateVersionDTO,
type IVersionExInfo, type IVersionExInfo,
type IVersionUpdateDTO,
schemaLibraryItem, schemaLibraryItem,
schemaLibraryItemArray, schemaLibraryItemArray,
schemaVersionExInfo schemaVersionExInfo
@ -136,8 +136,8 @@ export const libraryApi = {
} }
}), }),
versionCreate: ({ itemID, data }: { itemID: number; data: IVersionCreateDTO }) => createVersion: ({ itemID, data }: { itemID: number; data: ICreateVersionDTO }) =>
axiosPost<IVersionCreateDTO, IVersionCreatedResponse>({ axiosPost<ICreateVersionDTO, IVersionCreatedResponse>({
schema: schemaVersionCreatedResponse, schema: schemaVersionCreatedResponse,
endpoint: `/api/library/${itemID}/create-version`, endpoint: `/api/library/${itemID}/create-version`,
request: { request: {
@ -145,7 +145,7 @@ export const libraryApi = {
successMessage: infoMsg.newVersion(data.version) successMessage: infoMsg.newVersion(data.version)
} }
}), }),
versionRestore: ({ versionID }: { versionID: number }) => restoreVersion: ({ versionID }: { versionID: number }) =>
axiosPatch<undefined, IRSFormDTO>({ axiosPatch<undefined, IRSFormDTO>({
schema: schemaRSForm, schema: schemaRSForm,
endpoint: `/api/versions/${versionID}/restore`, endpoint: `/api/versions/${versionID}/restore`,
@ -153,8 +153,8 @@ export const libraryApi = {
successMessage: infoMsg.versionRestored successMessage: infoMsg.versionRestored
} }
}), }),
versionUpdate: (data: { itemID: number; version: IVersionUpdateDTO }) => updateVersion: (data: { itemID: number; version: IUpdateVersionDTO }) =>
axiosPatch<IVersionUpdateDTO, IVersionExInfo>({ axiosPatch<IUpdateVersionDTO, IVersionExInfo>({
schema: schemaVersionExInfo, schema: schemaVersionExInfo,
endpoint: `/api/versions/${data.version.id}`, endpoint: `/api/versions/${data.version.id}`,
request: { request: {
@ -162,7 +162,7 @@ export const libraryApi = {
successMessage: infoMsg.changesSaved successMessage: infoMsg.changesSaved
} }
}), }),
versionDelete: (data: { itemID: number; versionID: number }) => deleteVersion: (data: { itemID: number; versionID: number }) =>
axiosDelete({ axiosDelete({
endpoint: `/api/versions/${data.versionID}`, endpoint: `/api/versions/${data.versionID}`,
request: { request: {

View File

@ -49,10 +49,10 @@ export type ICreateLibraryItemDTO = z.infer<typeof schemaCreateLibraryItem>;
export type IUpdateLibraryItemDTO = z.infer<typeof schemaUpdateLibraryItem>; export type IUpdateLibraryItemDTO = z.infer<typeof schemaUpdateLibraryItem>;
/** Create version metadata in persistent storage. */ /** Create version metadata in persistent storage. */
export type IVersionCreateDTO = z.infer<typeof schemaVersionCreate>; export type ICreateVersionDTO = z.infer<typeof schemaCreateVersion>;
/** Represents version data, intended to update version metadata in persistent storage. */ /** Represents version data, intended to update version metadata in persistent storage. */
export type IVersionUpdateDTO = z.infer<typeof schemaVersionUpdate>; export type IUpdateVersionDTO = z.infer<typeof schemaUpdateVersion>;
// ======= SCHEMAS ========= // ======= SCHEMAS =========
export const schemaLibraryItemType = z.enum(Object.values(LibraryItemType) as [LibraryItemType, ...LibraryItemType[]]); export const schemaLibraryItemType = z.enum(Object.values(LibraryItemType) as [LibraryItemType, ...LibraryItemType[]]);
@ -140,13 +140,13 @@ export const schemaVersionExInfo = schemaVersionInfo.extend({
item: z.number() item: z.number()
}); });
export const schemaVersionUpdate = z.strictObject({ export const schemaUpdateVersion = z.strictObject({
id: z.number(), id: z.number(),
version: z.string().nonempty(errorMsg.requiredField), version: z.string().nonempty(errorMsg.requiredField),
description: z.string() description: z.string()
}); });
export const schemaVersionCreate = z.strictObject({ export const schemaCreateVersion = z.strictObject({
version: z.string(), version: z.string(),
description: z.string(), description: z.string(),
items: z.array(z.number()) items: z.array(z.number())

View File

@ -3,15 +3,15 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { libraryApi } from './api'; import { libraryApi } from './api';
import { type IVersionCreateDTO } from './types'; import { type ICreateVersionDTO } from './types';
import { useUpdateTimestamp } from './use-update-timestamp'; import { useUpdateTimestamp } from './use-update-timestamp';
export const useVersionCreate = () => { export const useCreateVersion = () => {
const client = useQueryClient(); const client = useQueryClient();
const { updateTimestamp } = useUpdateTimestamp(); const { updateTimestamp } = useUpdateTimestamp();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, libraryApi.baseKey, 'create-version'], mutationKey: [KEYS.global_mutation, libraryApi.baseKey, 'create-version'],
mutationFn: libraryApi.versionCreate, mutationFn: libraryApi.createVersion,
onSuccess: data => { onSuccess: data => {
client.setQueryData(KEYS.composite.rsItem({ itemID: data.schema.id }), data.schema); client.setQueryData(KEYS.composite.rsItem({ itemID: data.schema.id }), data.schema);
updateTimestamp(data.schema.id); updateTimestamp(data.schema.id);
@ -19,7 +19,7 @@ export const useVersionCreate = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
versionCreate: (data: { itemID: number; data: IVersionCreateDTO }) => createVersion: (data: { itemID: number; data: ICreateVersionDTO }) =>
mutation.mutateAsync(data).then(response => response.version) mutation.mutateAsync(data).then(response => response.version)
}; };
}; };

View File

@ -6,11 +6,11 @@ import { KEYS } from '@/backend/configuration';
import { libraryApi } from './api'; import { libraryApi } from './api';
export const useVersionDelete = () => { export const useDeleteVersion = () => {
const client = useQueryClient(); const client = useQueryClient();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, libraryApi.baseKey, 'delete-version'], mutationKey: [KEYS.global_mutation, libraryApi.baseKey, 'delete-version'],
mutationFn: libraryApi.versionDelete, mutationFn: libraryApi.deleteVersion,
onSuccess: (_, variables) => { onSuccess: (_, variables) => {
client.setQueryData(KEYS.composite.rsItem({ itemID: variables.itemID }), (prev: IRSFormDTO | undefined) => client.setQueryData(KEYS.composite.rsItem({ itemID: variables.itemID }), (prev: IRSFormDTO | undefined) =>
!prev !prev
@ -24,6 +24,6 @@ export const useVersionDelete = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
versionDelete: (data: { itemID: number; versionID: number }) => mutation.mutateAsync(data) deleteVersion: (data: { itemID: number; versionID: number }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -4,11 +4,11 @@ import { KEYS } from '@/backend/configuration';
import { libraryApi } from './api'; import { libraryApi } from './api';
export const useVersionRestore = () => { export const useRestoreVersion = () => {
const client = useQueryClient(); const client = useQueryClient();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, libraryApi.baseKey, 'restore-version'], mutationKey: [KEYS.global_mutation, libraryApi.baseKey, 'restore-version'],
mutationFn: libraryApi.versionRestore, mutationFn: libraryApi.restoreVersion,
onSuccess: data => { onSuccess: data => {
client.setQueryData(KEYS.composite.rsItem({ itemID: data.id }), data); client.setQueryData(KEYS.composite.rsItem({ itemID: data.id }), data);
return client.invalidateQueries({ queryKey: [libraryApi.baseKey] }); return client.invalidateQueries({ queryKey: [libraryApi.baseKey] });
@ -16,6 +16,6 @@ export const useVersionRestore = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
versionRestore: (data: { versionID: number }) => mutation.mutateAsync(data) restoreVersion: (data: { versionID: number }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -5,13 +5,13 @@ import { type IRSFormDTO } from '@/features/rsform';
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { libraryApi } from './api'; import { libraryApi } from './api';
import { type IVersionUpdateDTO } from './types'; import { type IUpdateVersionDTO } from './types';
export const useVersionUpdate = () => { export const useUpdateVersion = () => {
const client = useQueryClient(); const client = useQueryClient();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, libraryApi.baseKey, 'update-version'], mutationKey: [KEYS.global_mutation, libraryApi.baseKey, 'update-version'],
mutationFn: libraryApi.versionUpdate, mutationFn: libraryApi.updateVersion,
onSuccess: (data, variables) => { onSuccess: (data, variables) => {
client.setQueryData(KEYS.composite.rsItem({ itemID: variables.itemID }), (prev: IRSFormDTO | undefined) => client.setQueryData(KEYS.composite.rsItem({ itemID: variables.itemID }), (prev: IRSFormDTO | undefined) =>
!prev !prev
@ -41,6 +41,6 @@ export const useVersionUpdate = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
versionUpdate: (data: { itemID: number; version: IVersionUpdateDTO }) => mutation.mutateAsync(data) updateVersion: (data: { itemID: number; version: IUpdateVersionDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -8,8 +8,8 @@ import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { errorMsg } from '@/utils/labels'; import { errorMsg } from '@/utils/labels';
import { type IVersionCreateDTO, type IVersionInfo, schemaVersionCreate } from '../backend/types'; import { type ICreateVersionDTO, type IVersionInfo, schemaCreateVersion } from '../backend/types';
import { useVersionCreate } from '../backend/use-version-create'; import { useCreateVersion } from '../backend/use-create-version';
import { nextVersion } from '../models/library-api'; import { nextVersion } from '../models/library-api';
export interface DlgCreateVersionProps { export interface DlgCreateVersionProps {
@ -24,10 +24,10 @@ export function DlgCreateVersion() {
const { itemID, versions, selected, totalCount, onCreate } = useDialogsStore( const { itemID, versions, selected, totalCount, onCreate } = useDialogsStore(
state => state.props as DlgCreateVersionProps state => state.props as DlgCreateVersionProps
); );
const { versionCreate } = useVersionCreate(); const { createVersion: versionCreate } = useCreateVersion();
const { register, handleSubmit, control } = useForm<IVersionCreateDTO>({ const { register, handleSubmit, control } = useForm<ICreateVersionDTO>({
resolver: zodResolver(schemaVersionCreate), resolver: zodResolver(schemaCreateVersion),
defaultValues: { defaultValues: {
version: versions.length > 0 ? nextVersion(versions[versions.length - 1].version) : '1.0.0', version: versions.length > 0 ? nextVersion(versions[versions.length - 1].version) : '1.0.0',
description: '', description: '',
@ -37,7 +37,7 @@ export function DlgCreateVersion() {
const version = useWatch({ control, name: 'version' }); const version = useWatch({ control, name: 'version' });
const canSubmit = !versions.find(ver => ver.version === version); const canSubmit = !versions.find(ver => ver.version === version);
function onSubmit(data: IVersionCreateDTO) { function onSubmit(data: ICreateVersionDTO) {
return versionCreate({ itemID, data }).then(onCreate); return versionCreate({ itemID, data }).then(onCreate);
} }

View File

@ -14,10 +14,10 @@ import { ModalView } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { errorMsg } from '@/utils/labels'; import { errorMsg } from '@/utils/labels';
import { type IVersionUpdateDTO, schemaVersionUpdate } from '../../backend/types'; import { type IUpdateVersionDTO, schemaUpdateVersion } from '../../backend/types';
import { useDeleteVersion } from '../../backend/use-delete-version';
import { useMutatingLibrary } from '../../backend/use-mutating-library'; import { useMutatingLibrary } from '../../backend/use-mutating-library';
import { useVersionDelete } from '../../backend/use-version-delete'; import { useUpdateVersion } from '../../backend/use-update-version';
import { useVersionUpdate } from '../../backend/use-version-update';
import { TableVersions } from './table-versions'; import { TableVersions } from './table-versions';
@ -31,8 +31,8 @@ export function DlgEditVersions() {
const hideDialog = useDialogsStore(state => state.hideDialog); const hideDialog = useDialogsStore(state => state.hideDialog);
const { schema } = useRSFormSuspense({ itemID }); const { schema } = useRSFormSuspense({ itemID });
const isProcessing = useMutatingLibrary(); const isProcessing = useMutatingLibrary();
const { versionDelete } = useVersionDelete(); const { deleteVersion: versionDelete } = useDeleteVersion();
const { versionUpdate } = useVersionUpdate(); const { updateVersion: versionUpdate } = useUpdateVersion();
const { const {
register, register,
@ -40,8 +40,8 @@ export function DlgEditVersions() {
control, control,
reset, reset,
formState: { isDirty, errors: formErrors } formState: { isDirty, errors: formErrors }
} = useForm<IVersionUpdateDTO>({ } = useForm<IUpdateVersionDTO>({
resolver: zodResolver(schemaVersionUpdate), resolver: zodResolver(schemaUpdateVersion),
defaultValues: { defaultValues: {
id: schema.versions[schema.versions.length - 1].id, id: schema.versions[schema.versions.length - 1].id,
version: schema.versions[schema.versions.length - 1].version, version: schema.versions[schema.versions.length - 1].version,
@ -77,7 +77,7 @@ export function DlgEditVersions() {
}); });
} }
function onUpdate(data: IVersionUpdateDTO) { function onUpdate(data: IUpdateVersionDTO) {
if (!isDirty || isProcessing || !isValid) { if (!isDirty || isProcessing || !isValid) {
return; return;
} }

View File

@ -6,16 +6,16 @@ import { infoMsg } from '@/utils/labels';
import { import {
type IConstituentaReference, type IConstituentaReference,
type ICstRelocateDTO, type ICreateOperationDTO,
type IDeleteOperationDTO,
type IInputCreatedResponse, type IInputCreatedResponse,
type IInputUpdateDTO,
type IOperationCreatedResponse, type IOperationCreatedResponse,
type IOperationCreateDTO,
type IOperationDeleteDTO,
type IOperationSchemaDTO, type IOperationSchemaDTO,
type IOperationUpdateDTO,
type IOssLayout, type IOssLayout,
type IRelocateConstituentsDTO,
type ITargetOperation, type ITargetOperation,
type IUpdateInputDTO,
type IUpdateOperationDTO,
schemaConstituentaReference, schemaConstituentaReference,
schemaInputCreatedResponse, schemaInputCreatedResponse,
schemaOperationCreatedResponse, schemaOperationCreatedResponse,
@ -49,8 +49,8 @@ export const ossApi = {
} }
}), }),
operationCreate: ({ itemID, data }: { itemID: number; data: IOperationCreateDTO }) => createOperation: ({ itemID, data }: { itemID: number; data: ICreateOperationDTO }) =>
axiosPost<IOperationCreateDTO, IOperationCreatedResponse>({ axiosPost<ICreateOperationDTO, IOperationCreatedResponse>({
schema: schemaOperationCreatedResponse, schema: schemaOperationCreatedResponse,
endpoint: `/api/oss/${itemID}/create-operation`, endpoint: `/api/oss/${itemID}/create-operation`,
request: { request: {
@ -58,8 +58,8 @@ export const ossApi = {
successMessage: response => infoMsg.newOperation(response.new_operation.alias) successMessage: response => infoMsg.newOperation(response.new_operation.alias)
} }
}), }),
operationDelete: ({ itemID, data }: { itemID: number; data: IOperationDeleteDTO }) => deleteOperation: ({ itemID, data }: { itemID: number; data: IDeleteOperationDTO }) =>
axiosPatch<IOperationDeleteDTO, IOperationSchemaDTO>({ axiosPatch<IDeleteOperationDTO, IOperationSchemaDTO>({
schema: schemaOperationSchema, schema: schemaOperationSchema,
endpoint: `/api/oss/${itemID}/delete-operation`, endpoint: `/api/oss/${itemID}/delete-operation`,
request: { request: {
@ -67,7 +67,7 @@ export const ossApi = {
successMessage: infoMsg.operationDestroyed successMessage: infoMsg.operationDestroyed
} }
}), }),
inputCreate: ({ itemID, data }: { itemID: number; data: ITargetOperation }) => createInput: ({ itemID, data }: { itemID: number; data: ITargetOperation }) =>
axiosPatch<ITargetOperation, IInputCreatedResponse>({ axiosPatch<ITargetOperation, IInputCreatedResponse>({
schema: schemaInputCreatedResponse, schema: schemaInputCreatedResponse,
endpoint: `/api/oss/${itemID}/create-input`, endpoint: `/api/oss/${itemID}/create-input`,
@ -76,8 +76,8 @@ export const ossApi = {
successMessage: infoMsg.newLibraryItem successMessage: infoMsg.newLibraryItem
} }
}), }),
inputUpdate: ({ itemID, data }: { itemID: number; data: IInputUpdateDTO }) => updateInput: ({ itemID, data }: { itemID: number; data: IUpdateInputDTO }) =>
axiosPatch<IInputUpdateDTO, IOperationSchemaDTO>({ axiosPatch<IUpdateInputDTO, IOperationSchemaDTO>({
schema: schemaOperationSchema, schema: schemaOperationSchema,
endpoint: `/api/oss/${itemID}/set-input`, endpoint: `/api/oss/${itemID}/set-input`,
request: { request: {
@ -85,8 +85,8 @@ export const ossApi = {
successMessage: infoMsg.changesSaved successMessage: infoMsg.changesSaved
} }
}), }),
operationUpdate: ({ itemID, data }: { itemID: number; data: IOperationUpdateDTO }) => updateOperation: ({ itemID, data }: { itemID: number; data: IUpdateOperationDTO }) =>
axiosPatch<IOperationUpdateDTO, IOperationSchemaDTO>({ axiosPatch<IUpdateOperationDTO, IOperationSchemaDTO>({
schema: schemaOperationSchema, schema: schemaOperationSchema,
endpoint: `/api/oss/${itemID}/update-operation`, endpoint: `/api/oss/${itemID}/update-operation`,
request: { request: {
@ -94,7 +94,7 @@ export const ossApi = {
successMessage: infoMsg.changesSaved successMessage: infoMsg.changesSaved
} }
}), }),
operationExecute: ({ itemID, data }: { itemID: number; data: ITargetOperation }) => executeOperation: ({ itemID, data }: { itemID: number; data: ITargetOperation }) =>
axiosPost<ITargetOperation, IOperationSchemaDTO>({ axiosPost<ITargetOperation, IOperationSchemaDTO>({
schema: schemaOperationSchema, schema: schemaOperationSchema,
endpoint: `/api/oss/${itemID}/execute-operation`, endpoint: `/api/oss/${itemID}/execute-operation`,
@ -104,8 +104,8 @@ export const ossApi = {
} }
}), }),
relocateConstituents: (data: ICstRelocateDTO) => relocateConstituents: (data: IRelocateConstituentsDTO) =>
axiosPost<ICstRelocateDTO, IOperationSchemaDTO>({ axiosPost<IRelocateConstituentsDTO, IOperationSchemaDTO>({
schema: schemaOperationSchema, schema: schemaOperationSchema,
endpoint: `/api/oss/relocate-constituents`, endpoint: `/api/oss/relocate-constituents`,
request: { request: {

View File

@ -1,7 +1,7 @@
import { z } from 'zod'; import { z } from 'zod';
import { schemaLibraryItem } from '@/features/library/backend/types'; import { schemaLibraryItem } from '@/features/library/backend/types';
import { schemaCstSubstitute } from '@/features/rsform/backend/types'; import { schemaSubstituteConstituents } from '@/features/rsform/backend/types';
import { errorMsg } from '@/utils/labels'; import { errorMsg } from '@/utils/labels';
@ -28,7 +28,7 @@ export type IOperationSchemaDTO = z.infer<typeof schemaOperationSchema>;
export type IOssLayout = z.infer<typeof schemaOssLayout>; export type IOssLayout = z.infer<typeof schemaOssLayout>;
/** Represents {@link IOperation} data, used in creation process. */ /** Represents {@link IOperation} data, used in creation process. */
export type IOperationCreateDTO = z.infer<typeof schemaOperationCreate>; export type ICreateOperationDTO = z.infer<typeof schemaCreateOperation>;
/** Represents data response when creating {@link IOperation}. */ /** Represents data response when creating {@link IOperation}. */
export type IOperationCreatedResponse = z.infer<typeof schemaOperationCreatedResponse>; export type IOperationCreatedResponse = z.infer<typeof schemaOperationCreatedResponse>;
@ -41,19 +41,19 @@ export interface ITargetOperation {
} }
/** Represents {@link IOperation} data, used in destruction process. */ /** Represents {@link IOperation} data, used in destruction process. */
export type IOperationDeleteDTO = z.infer<typeof schemaOperationDelete>; export type IDeleteOperationDTO = z.infer<typeof schemaDeleteOperation>;
/** Represents data response when creating {@link IRSForm} for Input {@link IOperation}. */ /** Represents data response when creating {@link IRSForm} for Input {@link IOperation}. */
export type IInputCreatedResponse = z.infer<typeof schemaInputCreatedResponse>; export type IInputCreatedResponse = z.infer<typeof schemaInputCreatedResponse>;
/** Represents {@link IOperation} data, used in setInput process. */ /** Represents {@link IOperation} data, used in setInput process. */
export type IInputUpdateDTO = z.infer<typeof schemaInputUpdate>; export type IUpdateInputDTO = z.infer<typeof schemaUpdateInput>;
/** Represents {@link IOperation} data, used in update process. */ /** Represents {@link IOperation} data, used in update process. */
export type IOperationUpdateDTO = z.infer<typeof schemaOperationUpdate>; export type IUpdateOperationDTO = z.infer<typeof schemaUpdateOperation>;
/** Represents data, used relocating {@link IConstituenta}s between {@link ILibraryItem}s. */ /** Represents data, used relocating {@link IConstituenta}s between {@link ILibraryItem}s. */
export type ICstRelocateDTO = z.infer<typeof schemaCstRelocate>; export type IRelocateConstituentsDTO = z.infer<typeof schemaRelocateConstituents>;
/** Represents {@link IConstituenta} reference. */ /** Represents {@link IConstituenta} reference. */
export type IConstituentaReference = z.infer<typeof schemaConstituentaReference>; export type IConstituentaReference = z.infer<typeof schemaConstituentaReference>;
@ -80,7 +80,7 @@ export const schemaBlock = z.strictObject({
parent: z.number().nullable() parent: z.number().nullable()
}); });
export const schemaCstSubstituteInfo = schemaCstSubstitute.extend({ export const schemaCstSubstituteInfo = schemaSubstituteConstituents.extend({
operation: z.number(), operation: z.number(),
original_alias: z.string(), original_alias: z.string(),
original_term: z.string(), original_term: z.string(),
@ -121,7 +121,7 @@ export const schemaOperationSchema = schemaLibraryItem.extend({
substitutions: z.array(schemaCstSubstituteInfo) substitutions: z.array(schemaCstSubstituteInfo)
}); });
export const schemaOperationCreate = z.strictObject({ export const schemaCreateOperation = z.strictObject({
layout: schemaOssLayout, layout: schemaOssLayout,
item_data: z.strictObject({ item_data: z.strictObject({
alias: z.string().nonempty(), alias: z.string().nonempty(),
@ -142,14 +142,14 @@ export const schemaOperationCreatedResponse = z.strictObject({
oss: schemaOperationSchema oss: schemaOperationSchema
}); });
export const schemaOperationDelete = z.strictObject({ export const schemaDeleteOperation = z.strictObject({
target: z.number(), target: z.number(),
layout: schemaOssLayout, layout: schemaOssLayout,
keep_constituents: z.boolean(), keep_constituents: z.boolean(),
delete_schema: z.boolean() delete_schema: z.boolean()
}); });
export const schemaInputUpdate = z.strictObject({ export const schemaUpdateInput = z.strictObject({
target: z.number(), target: z.number(),
layout: schemaOssLayout, layout: schemaOssLayout,
input: z.number().nullable() input: z.number().nullable()
@ -160,7 +160,7 @@ export const schemaInputCreatedResponse = z.strictObject({
oss: schemaOperationSchema oss: schemaOperationSchema
}); });
export const schemaOperationUpdate = z.strictObject({ export const schemaUpdateOperation = z.strictObject({
target: z.number(), target: z.number(),
layout: schemaOssLayout, layout: schemaOssLayout,
item_data: z.strictObject({ item_data: z.strictObject({
@ -169,10 +169,10 @@ export const schemaOperationUpdate = z.strictObject({
description: z.string() description: z.string()
}), }),
arguments: z.array(z.number()), arguments: z.array(z.number()),
substitutions: z.array(schemaCstSubstitute) substitutions: z.array(schemaSubstituteConstituents)
}); });
export const schemaCstRelocate = z.strictObject({ export const schemaRelocateConstituents = z.strictObject({
destination: z.number().nullable(), destination: z.number().nullable(),
items: z.array(z.number()).refine(data => data.length > 0) items: z.array(z.number()).refine(data => data.length > 0)
}); });

View File

@ -5,11 +5,11 @@ import { KEYS } from '@/backend/configuration';
import { ossApi } from './api'; import { ossApi } from './api';
import { type ITargetOperation } from './types'; import { type ITargetOperation } from './types';
export const useInputCreate = () => { export const useCreateInput = () => {
const client = useQueryClient(); const client = useQueryClient();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'input-create'], mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'input-create'],
mutationFn: ossApi.inputCreate, mutationFn: ossApi.createInput,
onSuccess: data => { onSuccess: data => {
client.setQueryData(ossApi.getOssQueryOptions({ itemID: data.oss.id }).queryKey, data.oss); client.setQueryData(ossApi.getOssQueryOptions({ itemID: data.oss.id }).queryKey, data.oss);
return Promise.allSettled([ return Promise.allSettled([
@ -20,7 +20,7 @@ export const useInputCreate = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
inputCreate: (data: { itemID: number; data: ITargetOperation }) => createInput: (data: { itemID: number; data: ITargetOperation }) =>
mutation.mutateAsync(data).then(response => response.new_schema) mutation.mutateAsync(data).then(response => response.new_schema)
}; };
}; };

View File

@ -5,14 +5,14 @@ import { useUpdateTimestamp } from '@/features/library/backend/use-update-timest
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { ossApi } from './api'; import { ossApi } from './api';
import { type IOperationCreateDTO } from './types'; import { type ICreateOperationDTO } from './types';
export const useOperationCreate = () => { export const useCreateOperation = () => {
const client = useQueryClient(); const client = useQueryClient();
const { updateTimestamp } = useUpdateTimestamp(); const { updateTimestamp } = useUpdateTimestamp();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'operation-create'], mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'operation-create'],
mutationFn: ossApi.operationCreate, mutationFn: ossApi.createOperation,
onSuccess: response => { onSuccess: response => {
client.setQueryData(ossApi.getOssQueryOptions({ itemID: response.oss.id }).queryKey, response.oss); client.setQueryData(ossApi.getOssQueryOptions({ itemID: response.oss.id }).queryKey, response.oss);
updateTimestamp(response.oss.id); updateTimestamp(response.oss.id);
@ -20,6 +20,6 @@ export const useOperationCreate = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
operationCreate: (data: { itemID: number; data: IOperationCreateDTO }) => mutation.mutateAsync(data) createOperation: (data: { itemID: number; data: ICreateOperationDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -3,13 +3,13 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { ossApi } from './api'; import { ossApi } from './api';
import { type IOperationDeleteDTO } from './types'; import { type IDeleteOperationDTO } from './types';
export const useOperationDelete = () => { export const useDeleteOperation = () => {
const client = useQueryClient(); const client = useQueryClient();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'operation-delete'], mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'operation-delete'],
mutationFn: ossApi.operationDelete, mutationFn: ossApi.deleteOperation,
onSuccess: data => { onSuccess: data => {
client.setQueryData(ossApi.getOssQueryOptions({ itemID: data.id }).queryKey, data); client.setQueryData(ossApi.getOssQueryOptions({ itemID: data.id }).queryKey, data);
return Promise.allSettled([ return Promise.allSettled([
@ -20,6 +20,6 @@ export const useOperationDelete = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
operationDelete: (data: { itemID: number; data: IOperationDeleteDTO }) => mutation.mutateAsync(data) deleteOperation: (data: { itemID: number; data: IDeleteOperationDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -5,11 +5,11 @@ import { KEYS } from '@/backend/configuration';
import { ossApi } from './api'; import { ossApi } from './api';
import { type ITargetOperation } from './types'; import { type ITargetOperation } from './types';
export const useOperationExecute = () => { export const useExecuteOperation = () => {
const client = useQueryClient(); const client = useQueryClient();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'operation-execute'], mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'operation-execute'],
mutationFn: ossApi.operationExecute, mutationFn: ossApi.executeOperation,
onSuccess: data => { onSuccess: data => {
client.setQueryData(ossApi.getOssQueryOptions({ itemID: data.id }).queryKey, data); client.setQueryData(ossApi.getOssQueryOptions({ itemID: data.id }).queryKey, data);
return Promise.allSettled([ return Promise.allSettled([
@ -20,6 +20,6 @@ export const useOperationExecute = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
operationExecute: (data: { itemID: number; data: ITargetOperation }) => mutation.mutateAsync(data) executeOperation: (data: { itemID: number; data: ITargetOperation }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -3,7 +3,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { ossApi } from './api'; import { ossApi } from './api';
import { type ICstRelocateDTO } from './types'; import { type IRelocateConstituentsDTO } from './types';
export const useRelocateConstituents = () => { export const useRelocateConstituents = () => {
const client = useQueryClient(); const client = useQueryClient();
@ -20,6 +20,6 @@ export const useRelocateConstituents = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
relocateConstituents: (data: ICstRelocateDTO) => mutation.mutateAsync(data) relocateConstituents: (data: IRelocateConstituentsDTO) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -3,13 +3,13 @@ import { useMutation, useQueryClient } from '@tanstack/react-query';
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { ossApi } from './api'; import { ossApi } from './api';
import { type IInputUpdateDTO } from './types'; import { type IUpdateInputDTO } from './types';
export const useInputUpdate = () => { export const useUpdateInput = () => {
const client = useQueryClient(); const client = useQueryClient();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'input-update'], mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'input-update'],
mutationFn: ossApi.inputUpdate, mutationFn: ossApi.updateInput,
onSuccess: data => { onSuccess: data => {
client.setQueryData(ossApi.getOssQueryOptions({ itemID: data.id }).queryKey, data); client.setQueryData(ossApi.getOssQueryOptions({ itemID: data.id }).queryKey, data);
return Promise.allSettled([ return Promise.allSettled([
@ -20,6 +20,6 @@ export const useInputUpdate = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
inputUpdate: (data: { itemID: number; data: IInputUpdateDTO }) => mutation.mutateAsync(data) updateInput: (data: { itemID: number; data: IUpdateInputDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -5,13 +5,13 @@ import { type ILibraryItem } from '@/features/library';
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { ossApi } from './api'; import { ossApi } from './api';
import { type IOperationUpdateDTO } from './types'; import { type IUpdateOperationDTO } from './types';
export const useOperationUpdate = () => { export const useUpdateOperation = () => {
const client = useQueryClient(); const client = useQueryClient();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'operation-update'], mutationKey: [KEYS.global_mutation, ossApi.baseKey, 'operation-update'],
mutationFn: ossApi.operationUpdate, mutationFn: ossApi.updateOperation,
onSuccess: (data, variables) => { onSuccess: (data, variables) => {
client.setQueryData(KEYS.composite.ossItem({ itemID: data.id }), data); client.setQueryData(KEYS.composite.ossItem({ itemID: data.id }), data);
const schemaID = data.operations.find(item => item.id === variables.data.target)?.result; const schemaID = data.operations.find(item => item.id === variables.data.target)?.result;
@ -32,6 +32,6 @@ export const useOperationUpdate = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
operationUpdate: (data: { itemID: number; data: IOperationUpdateDTO }) => mutation.mutateAsync(data) updateOperation: (data: { itemID: number; data: IUpdateOperationDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -13,8 +13,8 @@ import { Label } from '@/components/input';
import { ModalForm } from '@/components/modal'; import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type IInputUpdateDTO, type IOssLayout, schemaInputUpdate } from '../backend/types'; import { type IOssLayout, type IUpdateInputDTO, schemaUpdateInput } from '../backend/types';
import { useInputUpdate } from '../backend/use-input-update'; import { useUpdateInput } from '../backend/use-update-input';
import { type IOperation, type IOperationSchema } from '../models/oss'; import { type IOperation, type IOperationSchema } from '../models/oss';
import { sortItemsForOSS } from '../models/oss-api'; import { sortItemsForOSS } from '../models/oss-api';
@ -26,10 +26,10 @@ export interface DlgChangeInputSchemaProps {
export function DlgChangeInputSchema() { export function DlgChangeInputSchema() {
const { oss, target, layout } = useDialogsStore(state => state.props as DlgChangeInputSchemaProps); const { oss, target, layout } = useDialogsStore(state => state.props as DlgChangeInputSchemaProps);
const { inputUpdate } = useInputUpdate(); const { updateInput: inputUpdate } = useUpdateInput();
const { setValue, handleSubmit, control } = useForm<IInputUpdateDTO>({ const { setValue, handleSubmit, control } = useForm<IUpdateInputDTO>({
resolver: zodResolver(schemaInputUpdate), resolver: zodResolver(schemaUpdateInput),
defaultValues: { defaultValues: {
target: target.id, target: target.id,
layout: layout, layout: layout,
@ -44,7 +44,7 @@ export function DlgChangeInputSchema() {
return !oss.schemas.includes(item.id) || item.id === target.result; return !oss.schemas.includes(item.id) || item.id === target.result;
} }
function onSubmit(data: IInputUpdateDTO) { function onSubmit(data: IUpdateInputDTO) {
return inputUpdate({ itemID: oss.id, data: data }); return inputUpdate({ itemID: oss.id, data: data });
} }

View File

@ -10,8 +10,8 @@ import { ModalForm } from '@/components/modal';
import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs'; import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type IOperationCreateDTO, type IOssLayout, OperationType, schemaOperationCreate } from '../../backend/types'; import { type ICreateOperationDTO, type IOssLayout, OperationType, schemaCreateOperation } from '../../backend/types';
import { useOperationCreate } from '../../backend/use-operation-create'; import { useCreateOperation } from '../../backend/use-create-operation';
import { describeOperationType, labelOperationType } from '../../labels'; import { describeOperationType, labelOperationType } from '../../labels';
import { type IOperationSchema } from '../../models/oss'; import { type IOperationSchema } from '../../models/oss';
import { calculateInsertPosition } from '../../models/oss-api'; import { calculateInsertPosition } from '../../models/oss-api';
@ -35,14 +35,14 @@ export const TabID = {
export type TabID = (typeof TabID)[keyof typeof TabID]; export type TabID = (typeof TabID)[keyof typeof TabID];
export function DlgCreateOperation() { export function DlgCreateOperation() {
const { operationCreate } = useOperationCreate(); const { createOperation: operationCreate } = useCreateOperation();
const { oss, layout, initialInputs, onCreate, defaultX, defaultY } = useDialogsStore( const { oss, layout, initialInputs, onCreate, defaultX, defaultY } = useDialogsStore(
state => state.props as DlgCreateOperationProps state => state.props as DlgCreateOperationProps
); );
const methods = useForm<IOperationCreateDTO>({ const methods = useForm<ICreateOperationDTO>({
resolver: zodResolver(schemaOperationCreate), resolver: zodResolver(schemaCreateOperation),
defaultValues: { defaultValues: {
item_data: { item_data: {
operation_type: initialInputs.length === 0 ? OperationType.INPUT : OperationType.SYNTHESIS, operation_type: initialInputs.length === 0 ? OperationType.INPUT : OperationType.SYNTHESIS,
@ -64,7 +64,7 @@ export function DlgCreateOperation() {
const [activeTab, setActiveTab] = useState(initialInputs.length === 0 ? TabID.INPUT : TabID.SYNTHESIS); const [activeTab, setActiveTab] = useState(initialInputs.length === 0 ? TabID.INPUT : TabID.SYNTHESIS);
const isValid = !!alias && !oss.operations.some(operation => operation.alias === alias); const isValid = !!alias && !oss.operations.some(operation => operation.alias === alias);
function onSubmit(data: IOperationCreateDTO) { function onSubmit(data: ICreateOperationDTO) {
const target = calculateInsertPosition(oss, data.arguments, layout, { const target = calculateInsertPosition(oss, data.arguments, layout, {
x: defaultX, x: defaultX,
y: defaultY y: defaultY

View File

@ -11,7 +11,7 @@ import { IconReset } from '@/components/icons';
import { Checkbox, Label, TextArea, TextInput } from '@/components/input'; import { Checkbox, Label, TextArea, TextInput } from '@/components/input';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type IOperationCreateDTO } from '../../backend/types'; import { type ICreateOperationDTO } from '../../backend/types';
import { sortItemsForOSS } from '../../models/oss-api'; import { sortItemsForOSS } from '../../models/oss-api';
import { type DlgCreateOperationProps } from './dlg-create-operation'; import { type DlgCreateOperationProps } from './dlg-create-operation';
@ -26,7 +26,7 @@ export function TabInputOperation() {
control, control,
setValue, setValue,
formState: { errors } formState: { errors }
} = useFormContext<IOperationCreateDTO>(); } = useFormContext<ICreateOperationDTO>();
const createSchema = useWatch({ control, name: 'create_schema' }); const createSchema = useWatch({ control, name: 'create_schema' });
function baseFilter(item: ILibraryItem) { function baseFilter(item: ILibraryItem) {

View File

@ -3,7 +3,7 @@ import { Controller, useFormContext, useWatch } from 'react-hook-form';
import { Label, TextArea, TextInput } from '@/components/input'; import { Label, TextArea, TextInput } from '@/components/input';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type IOperationCreateDTO } from '../../backend/types'; import { type ICreateOperationDTO } from '../../backend/types';
import { PickMultiOperation } from '../../components/pick-multi-operation'; import { PickMultiOperation } from '../../components/pick-multi-operation';
import { type DlgCreateOperationProps } from './dlg-create-operation'; import { type DlgCreateOperationProps } from './dlg-create-operation';
@ -14,7 +14,7 @@ export function TabSynthesisOperation() {
register, register,
control, control,
formState: { errors } formState: { errors }
} = useFormContext<IOperationCreateDTO>(); } = useFormContext<ICreateOperationDTO>();
const inputs = useWatch({ control, name: 'arguments' }); const inputs = useWatch({ control, name: 'arguments' });
return ( return (

View File

@ -9,8 +9,8 @@ import { Checkbox, TextInput } from '@/components/input';
import { ModalForm } from '@/components/modal'; import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type IOperationDeleteDTO, type IOssLayout, schemaOperationDelete } from '../backend/types'; import { type IDeleteOperationDTO, type IOssLayout, schemaDeleteOperation } from '../backend/types';
import { useOperationDelete } from '../backend/use-operation-delete'; import { useDeleteOperation } from '../backend/use-delete-operation';
import { type IOperation, type IOperationSchema } from '../models/oss'; import { type IOperation, type IOperationSchema } from '../models/oss';
export interface DlgDeleteOperationProps { export interface DlgDeleteOperationProps {
@ -21,10 +21,10 @@ export interface DlgDeleteOperationProps {
export function DlgDeleteOperation() { export function DlgDeleteOperation() {
const { oss, target, layout } = useDialogsStore(state => state.props as DlgDeleteOperationProps); const { oss, target, layout } = useDialogsStore(state => state.props as DlgDeleteOperationProps);
const { operationDelete } = useOperationDelete(); const { deleteOperation: operationDelete } = useDeleteOperation();
const { handleSubmit, control } = useForm<IOperationDeleteDTO>({ const { handleSubmit, control } = useForm<IDeleteOperationDTO>({
resolver: zodResolver(schemaOperationDelete), resolver: zodResolver(schemaDeleteOperation),
defaultValues: { defaultValues: {
target: target.id, target: target.id,
layout: layout, layout: layout,
@ -33,7 +33,7 @@ export function DlgDeleteOperation() {
} }
}); });
function onSubmit(data: IOperationDeleteDTO) { function onSubmit(data: IDeleteOperationDTO) {
return operationDelete({ itemID: oss.id, data: data }); return operationDelete({ itemID: oss.id, data: data });
} }

View File

@ -11,8 +11,8 @@ import { ModalForm } from '@/components/modal';
import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs'; import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type IOperationUpdateDTO, type IOssLayout, OperationType, schemaOperationUpdate } from '../../backend/types'; import { type IOssLayout, type IUpdateOperationDTO, OperationType, schemaUpdateOperation } from '../../backend/types';
import { useOperationUpdate } from '../../backend/use-operation-update'; import { useUpdateOperation } from '../../backend/use-update-operation';
import { type IOperation, type IOperationSchema } from '../../models/oss'; import { type IOperation, type IOperationSchema } from '../../models/oss';
import { TabArguments } from './tab-arguments'; import { TabArguments } from './tab-arguments';
@ -34,10 +34,10 @@ export type TabID = (typeof TabID)[keyof typeof TabID];
export function DlgEditOperation() { export function DlgEditOperation() {
const { oss, target, layout } = useDialogsStore(state => state.props as DlgEditOperationProps); const { oss, target, layout } = useDialogsStore(state => state.props as DlgEditOperationProps);
const { operationUpdate } = useOperationUpdate(); const { updateOperation: operationUpdate } = useUpdateOperation();
const methods = useForm<IOperationUpdateDTO>({ const methods = useForm<IUpdateOperationDTO>({
resolver: zodResolver(schemaOperationUpdate), resolver: zodResolver(schemaUpdateOperation),
defaultValues: { defaultValues: {
target: target.id, target: target.id,
item_data: { item_data: {
@ -56,7 +56,7 @@ export function DlgEditOperation() {
}); });
const [activeTab, setActiveTab] = useState<TabID>(TabID.CARD); const [activeTab, setActiveTab] = useState<TabID>(TabID.CARD);
function onSubmit(data: IOperationUpdateDTO) { function onSubmit(data: IUpdateOperationDTO) {
return operationUpdate({ itemID: oss.id, data }); return operationUpdate({ itemID: oss.id, data });
} }

View File

@ -4,13 +4,13 @@ import { Controller, useFormContext } from 'react-hook-form';
import { Label } from '@/components/input'; import { Label } from '@/components/input';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type IOperationUpdateDTO } from '../../backend/types'; import { type IUpdateOperationDTO } from '../../backend/types';
import { PickMultiOperation } from '../../components/pick-multi-operation'; import { PickMultiOperation } from '../../components/pick-multi-operation';
import { type DlgEditOperationProps } from './dlg-edit-operation'; import { type DlgEditOperationProps } from './dlg-edit-operation';
export function TabArguments() { export function TabArguments() {
const { control, setValue } = useFormContext<IOperationUpdateDTO>(); const { control, setValue } = useFormContext<IUpdateOperationDTO>();
const { oss, target } = useDialogsStore(state => state.props as DlgEditOperationProps); const { oss, target } = useDialogsStore(state => state.props as DlgEditOperationProps);
const potentialCycle = [target.id, ...oss.graph.expandAllOutputs([target.id])]; const potentialCycle = [target.id, ...oss.graph.expandAllOutputs([target.id])];
const filtered = oss.operations.filter(item => !potentialCycle.includes(item.id)); const filtered = oss.operations.filter(item => !potentialCycle.includes(item.id));

View File

@ -2,13 +2,13 @@ import { useFormContext } from 'react-hook-form';
import { TextArea, TextInput } from '@/components/input'; import { TextArea, TextInput } from '@/components/input';
import { type IOperationUpdateDTO } from '../../backend/types'; import { type IUpdateOperationDTO } from '../../backend/types';
export function TabOperation() { export function TabOperation() {
const { const {
register, register,
formState: { errors } formState: { errors }
} = useFormContext<IOperationUpdateDTO>(); } = useFormContext<IUpdateOperationDTO>();
return ( return (
<div className='cc-fade-in cc-column'> <div className='cc-fade-in cc-column'>

View File

@ -8,14 +8,14 @@ import { PickSubstitutions } from '@/features/rsform/components';
import { TextArea } from '@/components/input'; import { TextArea } from '@/components/input';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type IOperationUpdateDTO } from '../../backend/types'; import { type IUpdateOperationDTO } from '../../backend/types';
import { SubstitutionValidator } from '../../models/oss-api'; import { SubstitutionValidator } from '../../models/oss-api';
import { type DlgEditOperationProps } from './dlg-edit-operation'; import { type DlgEditOperationProps } from './dlg-edit-operation';
export function TabSynthesis() { export function TabSynthesis() {
const { oss } = useDialogsStore(state => state.props as DlgEditOperationProps); const { oss } = useDialogsStore(state => state.props as DlgEditOperationProps);
const { control } = useFormContext<IOperationUpdateDTO>(); const { control } = useFormContext<IUpdateOperationDTO>();
const inputs = useWatch({ control, name: 'arguments' }); const inputs = useWatch({ control, name: 'arguments' });
const substitutions = useWatch({ control, name: 'substitutions' }); const substitutions = useWatch({ control, name: 'substitutions' });

View File

@ -16,7 +16,7 @@ import { Loader } from '@/components/loader';
import { ModalForm } from '@/components/modal'; import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type ICstRelocateDTO, type IOssLayout, schemaCstRelocate } from '../backend/types'; import { type IOssLayout, type IRelocateConstituentsDTO, schemaRelocateConstituents } from '../backend/types';
import { useRelocateConstituents } from '../backend/use-relocate-constituents'; import { useRelocateConstituents } from '../backend/use-relocate-constituents';
import { useUpdateLayout } from '../backend/use-update-layout'; import { useUpdateLayout } from '../backend/use-update-layout';
import { IconRelocationUp } from '../components/icon-relocation-up'; import { IconRelocationUp } from '../components/icon-relocation-up';
@ -40,8 +40,8 @@ export function DlgRelocateConstituents() {
control, control,
setValue, setValue,
formState: { isValid } formState: { isValid }
} = useForm<ICstRelocateDTO>({ } = useForm<IRelocateConstituentsDTO>({
resolver: zodResolver(schemaCstRelocate), resolver: zodResolver(schemaRelocateConstituents),
defaultValues: { defaultValues: {
items: [] items: []
}, },
@ -97,7 +97,7 @@ export function DlgRelocateConstituents() {
setValue('items', []); setValue('items', []);
} }
function onSubmit(data: ICstRelocateDTO) { function onSubmit(data: IRelocateConstituentsDTO) {
if (!layout || JSON.stringify(layout) === JSON.stringify(oss.layout)) { if (!layout || JSON.stringify(layout) === JSON.stringify(oss.layout)) {
return relocateConstituents(data); return relocateConstituents(data);
} else { } else {

View File

@ -5,8 +5,8 @@ import { toast } from 'react-toastify';
import { urls, useConceptNavigation } from '@/app'; import { urls, useConceptNavigation } from '@/app';
import { useLibrary } from '@/features/library/backend/use-library'; import { useLibrary } from '@/features/library/backend/use-library';
import { useInputCreate } from '@/features/oss/backend/use-input-create'; import { useCreateInput } from '@/features/oss/backend/use-create-input';
import { useOperationExecute } from '@/features/oss/backend/use-operation-execute'; import { useExecuteOperation } from '@/features/oss/backend/use-execute-operation';
import { Dropdown, DropdownButton } from '@/components/dropdown'; import { Dropdown, DropdownButton } from '@/components/dropdown';
import { import {
@ -51,8 +51,8 @@ export function NodeContextMenu({ isOpen, operation, cursorX, cursorY, onHide }:
const isProcessing = useMutatingOss(); const isProcessing = useMutatingOss();
const getLayout = useGetLayout(); const getLayout = useGetLayout();
const { inputCreate } = useInputCreate(); const { createInput: inputCreate } = useCreateInput();
const { operationExecute } = useOperationExecute(); const { executeOperation: operationExecute } = useExecuteOperation();
const showEditInput = useDialogsStore(state => state.showChangeInputSchema); const showEditInput = useDialogsStore(state => state.showChangeInputSchema);
const showRelocateConstituents = useDialogsStore(state => state.showRelocateConstituents); const showRelocateConstituents = useDialogsStore(state => state.showRelocateConstituents);

View File

@ -4,7 +4,7 @@ import { useReactFlow } from 'reactflow';
import { HelpTopic } from '@/features/help'; import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components'; import { BadgeHelp } from '@/features/help/components';
import { useOperationExecute } from '@/features/oss/backend/use-operation-execute'; import { useExecuteOperation } from '@/features/oss/backend/use-execute-operation';
import { useUpdateLayout } from '@/features/oss/backend/use-update-layout'; import { useUpdateLayout } from '@/features/oss/backend/use-update-layout';
import { MiniButton } from '@/components/control'; import { MiniButton } from '@/components/control';
@ -63,7 +63,7 @@ export function ToolbarOssGraph({
const toggleEdgeStraight = useOSSGraphStore(state => state.toggleEdgeStraight); const toggleEdgeStraight = useOSSGraphStore(state => state.toggleEdgeStraight);
const { updateLayout: updatePositions } = useUpdateLayout(); const { updateLayout: updatePositions } = useUpdateLayout();
const { operationExecute } = useOperationExecute(); const { executeOperation: operationExecute } = useExecuteOperation();
const showEditOperation = useDialogsStore(state => state.showEditOperation); const showEditOperation = useDialogsStore(state => state.showEditOperation);

View File

@ -7,20 +7,20 @@ import { infoMsg } from '@/utils/labels';
import { import {
type ICheckConstituentaDTO, type ICheckConstituentaDTO,
type IConstituentaBasicsDTO, type IConstituentaBasicsDTO,
type IConstituentaCreatedResponse,
type IConstituentaList, type IConstituentaList,
type ICstCreatedResponse, type ICreateConstituentaDTO,
type ICstCreateDTO,
type ICstMoveDTO,
type ICstRenameDTO,
type ICstSubstitutionsDTO,
type ICstUpdateDTO,
type IExpressionParseDTO, type IExpressionParseDTO,
type IInlineSynthesisDTO, type IInlineSynthesisDTO,
type IMoveConstituentsDTO,
type IProduceStructureResponse, type IProduceStructureResponse,
type IRenameConstituentaDTO,
type IRSFormDTO, type IRSFormDTO,
type IRSFormUploadDTO, type IRSFormUploadDTO,
type ISubstitutionsDTO,
type IUpdateConstituentaDTO,
schemaConstituentaBasics, schemaConstituentaBasics,
schemaCstCreatedResponse, schemaConstituentaCreatedResponse,
schemaExpressionParse, schemaExpressionParse,
schemaProduceStructureResponse, schemaProduceStructureResponse,
schemaRSForm schemaRSForm
@ -64,17 +64,17 @@ export const rsformsApi = {
} }
}), }),
cstCreate: ({ itemID, data }: { itemID: number; data: ICstCreateDTO }) => createConstituenta: ({ itemID, data }: { itemID: number; data: ICreateConstituentaDTO }) =>
axiosPost<ICstCreateDTO, ICstCreatedResponse>({ axiosPost<ICreateConstituentaDTO, IConstituentaCreatedResponse>({
schema: schemaCstCreatedResponse, schema: schemaConstituentaCreatedResponse,
endpoint: `/api/rsforms/${itemID}/create-cst`, endpoint: `/api/rsforms/${itemID}/create-cst`,
request: { request: {
data: data, data: data,
successMessage: response => infoMsg.newConstituent(response.new_cst.alias) successMessage: response => infoMsg.newConstituent(response.new_cst.alias)
} }
}), }),
cstUpdate: ({ itemID, data }: { itemID: number; data: ICstUpdateDTO }) => updateConstituenta: ({ itemID, data }: { itemID: number; data: IUpdateConstituentaDTO }) =>
axiosPatch<ICstUpdateDTO, IConstituentaBasicsDTO>({ axiosPatch<IUpdateConstituentaDTO, IConstituentaBasicsDTO>({
schema: schemaConstituentaBasics, schema: schemaConstituentaBasics,
endpoint: `/api/rsforms/${itemID}/update-cst`, endpoint: `/api/rsforms/${itemID}/update-cst`,
request: { request: {
@ -82,7 +82,7 @@ export const rsformsApi = {
successMessage: infoMsg.changesSaved successMessage: infoMsg.changesSaved
} }
}), }),
cstDelete: ({ itemID, data }: { itemID: number; data: IConstituentaList }) => deleteConstituents: ({ itemID, data }: { itemID: number; data: IConstituentaList }) =>
axiosPatch<IConstituentaList, IRSFormDTO>({ axiosPatch<IConstituentaList, IRSFormDTO>({
schema: schemaRSForm, schema: schemaRSForm,
endpoint: `/api/rsforms/${itemID}/delete-multiple-cst`, endpoint: `/api/rsforms/${itemID}/delete-multiple-cst`,
@ -91,17 +91,17 @@ export const rsformsApi = {
successMessage: infoMsg.constituentsDestroyed(data.items.length) successMessage: infoMsg.constituentsDestroyed(data.items.length)
} }
}), }),
cstRename: ({ itemID, data }: { itemID: number; data: ICstRenameDTO }) => renameConstituenta: ({ itemID, data }: { itemID: number; data: IRenameConstituentaDTO }) =>
axiosPatch<ICstRenameDTO, ICstCreatedResponse>({ axiosPatch<IRenameConstituentaDTO, IConstituentaCreatedResponse>({
schema: schemaCstCreatedResponse, schema: schemaConstituentaCreatedResponse,
endpoint: `/api/rsforms/${itemID}/rename-cst`, endpoint: `/api/rsforms/${itemID}/rename-cst`,
request: { request: {
data: data, data: data,
successMessage: infoMsg.changesSaved successMessage: infoMsg.changesSaved
} }
}), }),
cstSubstitute: ({ itemID, data }: { itemID: number; data: ICstSubstitutionsDTO }) => substituteConstituents: ({ itemID, data }: { itemID: number; data: ISubstitutionsDTO }) =>
axiosPatch<ICstSubstitutionsDTO, IRSFormDTO>({ axiosPatch<ISubstitutionsDTO, IRSFormDTO>({
schema: schemaRSForm, schema: schemaRSForm,
endpoint: `/api/rsforms/${itemID}/substitute`, endpoint: `/api/rsforms/${itemID}/substitute`,
request: { request: {
@ -109,8 +109,8 @@ export const rsformsApi = {
successMessage: infoMsg.substituteSingle successMessage: infoMsg.substituteSingle
} }
}), }),
cstMove: ({ itemID, data }: { itemID: number; data: ICstMoveDTO }) => moveConstituents: ({ itemID, data }: { itemID: number; data: IMoveConstituentsDTO }) =>
axiosPatch<ICstMoveDTO, IRSFormDTO>({ axiosPatch<IMoveConstituentsDTO, IRSFormDTO>({
schema: schemaRSForm, schema: schemaRSForm,
endpoint: `/api/rsforms/${itemID}/move-cst`, endpoint: `/api/rsforms/${itemID}/move-cst`,
request: { data: data } request: { data: data }

View File

@ -56,19 +56,19 @@ export interface IRSFormUploadDTO {
} }
/** Represents {@link IConstituenta} data, used in creation process. */ /** Represents {@link IConstituenta} data, used in creation process. */
export type ICstCreateDTO = z.infer<typeof schemaCstCreate>; export type ICreateConstituentaDTO = z.infer<typeof schemaCreateConstituenta>;
/** Represents data response when creating {@link IConstituenta}. */ /** Represents data response when creating {@link IConstituenta}. */
export type ICstCreatedResponse = z.infer<typeof schemaCstCreatedResponse>; export type IConstituentaCreatedResponse = z.infer<typeof schemaConstituentaCreatedResponse>;
/** Represents data, used in updating persistent attributes in {@link IConstituenta}. */ /** Represents data, used in updating persistent attributes in {@link IConstituenta}. */
export type ICstUpdateDTO = z.infer<typeof schemaCstUpdate>; export type IUpdateConstituentaDTO = z.infer<typeof schemaUpdateConstituenta>;
/** Represents data, used in renaming {@link IConstituenta}. */ /** Represents data, used in renaming {@link IConstituenta}. */
export type ICstRenameDTO = z.infer<typeof schemaCstRename>; export type IRenameConstituentaDTO = z.infer<typeof schemaRenameConstituenta>;
/** Represents data, used in ordering a list of {@link IConstituenta}. */ /** Represents data, used in ordering a list of {@link IConstituenta}. */
export interface ICstMoveDTO { export interface IMoveConstituentsDTO {
items: number[]; items: number[];
move_to: number; // Note: 0-base index move_to: number; // Note: 0-base index
} }
@ -77,7 +77,7 @@ export interface ICstMoveDTO {
export type IProduceStructureResponse = z.infer<typeof schemaProduceStructureResponse>; export type IProduceStructureResponse = z.infer<typeof schemaProduceStructureResponse>;
/** Represents data, used in merging single {@link IConstituenta}. */ /** Represents data, used in merging single {@link IConstituenta}. */
export type ICstSubstitute = z.infer<typeof schemaCstSubstitute>; export type ISubstituteConstituents = z.infer<typeof schemaSubstituteConstituents>;
/** Represents input data for inline synthesis. */ /** Represents input data for inline synthesis. */
export type IInlineSynthesisDTO = z.infer<typeof schemaInlineSynthesis>; export type IInlineSynthesisDTO = z.infer<typeof schemaInlineSynthesis>;
@ -90,7 +90,7 @@ export interface ICheckConstituentaDTO {
} }
/** Represents data, used in merging multiple {@link IConstituenta}. */ /** Represents data, used in merging multiple {@link IConstituenta}. */
export type ICstSubstitutionsDTO = z.infer<typeof schemaCstSubstitutions>; export type ISubstitutionsDTO = z.infer<typeof schemaSubstitutions>;
/** /**
* Represents Constituenta list. * Represents Constituenta list.
@ -322,7 +322,7 @@ export const schemaVersionCreatedResponse = z.strictObject({
schema: schemaRSForm schema: schemaRSForm
}); });
export const schemaCstCreate = schemaConstituentaBasics export const schemaCreateConstituenta = schemaConstituentaBasics
.pick({ .pick({
cst_type: true, cst_type: true,
alias: true, alias: true,
@ -336,12 +336,12 @@ export const schemaCstCreate = schemaConstituentaBasics
insert_after: z.number().nullable() insert_after: z.number().nullable()
}); });
export const schemaCstCreatedResponse = z.strictObject({ export const schemaConstituentaCreatedResponse = z.strictObject({
new_cst: schemaConstituentaBasics, new_cst: schemaConstituentaBasics,
schema: schemaRSForm schema: schemaRSForm
}); });
export const schemaCstUpdate = z.strictObject({ export const schemaUpdateConstituenta = z.strictObject({
target: z.number(), target: z.number(),
item_data: z.strictObject({ item_data: z.strictObject({
convention: z.string().optional(), convention: z.string().optional(),
@ -352,7 +352,7 @@ export const schemaCstUpdate = z.strictObject({
}) })
}); });
export const schemaCstRename = z.strictObject({ export const schemaRenameConstituenta = z.strictObject({
target: z.number(), target: z.number(),
alias: z.string(), alias: z.string(),
cst_type: schemaCstType cst_type: schemaCstType
@ -363,20 +363,20 @@ export const schemaProduceStructureResponse = z.strictObject({
schema: schemaRSForm schema: schemaRSForm
}); });
export const schemaCstSubstitute = z.strictObject({ export const schemaSubstituteConstituents = z.strictObject({
original: z.number(), original: z.number(),
substitution: z.number() substitution: z.number()
}); });
export const schemaCstSubstitutions = z.strictObject({ export const schemaSubstitutions = z.strictObject({
substitutions: z.array(schemaCstSubstitute).min(1, { message: errorMsg.emptySubstitutions }) substitutions: z.array(schemaSubstituteConstituents).min(1, { message: errorMsg.emptySubstitutions })
}); });
export const schemaInlineSynthesis = z.strictObject({ export const schemaInlineSynthesis = z.strictObject({
receiver: z.number(), receiver: z.number(),
source: z.number().nullable(), source: z.number().nullable(),
items: z.array(z.number()), items: z.array(z.number()),
substitutions: z.array(schemaCstSubstitute) substitutions: z.array(schemaSubstituteConstituents)
}); });
export const schemaRSErrorDescription = z.strictObject({ export const schemaRSErrorDescription = z.strictObject({

View File

@ -5,14 +5,14 @@ import { useUpdateTimestamp } from '@/features/library/backend/use-update-timest
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { rsformsApi } from './api'; import { rsformsApi } from './api';
import { type ICstCreateDTO } from './types'; import { type ICreateConstituentaDTO } from './types';
export const useCstCreate = () => { export const useCreateConstituenta = () => {
const client = useQueryClient(); const client = useQueryClient();
const { updateTimestamp } = useUpdateTimestamp(); const { updateTimestamp } = useUpdateTimestamp();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'create-cst'], mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'create-cst'],
mutationFn: rsformsApi.cstCreate, mutationFn: rsformsApi.createConstituenta,
onSuccess: data => { onSuccess: data => {
client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.schema.id }).queryKey, data.schema); client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.schema.id }).queryKey, data.schema);
updateTimestamp(data.schema.id); updateTimestamp(data.schema.id);
@ -28,7 +28,7 @@ export const useCstCreate = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
cstCreate: (data: { itemID: number; data: ICstCreateDTO }) => createConstituenta: (data: { itemID: number; data: ICreateConstituentaDTO }) =>
mutation.mutateAsync(data).then(response => response.new_cst) mutation.mutateAsync(data).then(response => response.new_cst)
}; };
}; };

View File

@ -7,12 +7,12 @@ import { KEYS } from '@/backend/configuration';
import { rsformsApi } from './api'; import { rsformsApi } from './api';
import { type IConstituentaList } from './types'; import { type IConstituentaList } from './types';
export const useCstDelete = () => { export const useDeleteConstituents = () => {
const client = useQueryClient(); const client = useQueryClient();
const { updateTimestamp } = useUpdateTimestamp(); const { updateTimestamp } = useUpdateTimestamp();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'delete-multiple-cst'], mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'delete-multiple-cst'],
mutationFn: rsformsApi.cstDelete, mutationFn: rsformsApi.deleteConstituents,
onSuccess: data => { onSuccess: data => {
client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.id }).queryKey, data); client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.id }).queryKey, data);
updateTimestamp(data.id); updateTimestamp(data.id);
@ -28,6 +28,6 @@ export const useCstDelete = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
cstDelete: (data: { itemID: number; data: IConstituentaList }) => mutation.mutateAsync(data) deleteConstituents: (data: { itemID: number; data: IConstituentaList }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -5,14 +5,14 @@ import { useUpdateTimestamp } from '@/features/library/backend/use-update-timest
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { rsformsApi } from './api'; import { rsformsApi } from './api';
import { type ICstMoveDTO } from './types'; import { type IMoveConstituentsDTO } from './types';
export const useCstMove = () => { export const useMoveConstituents = () => {
const client = useQueryClient(); const client = useQueryClient();
const { updateTimestamp } = useUpdateTimestamp(); const { updateTimestamp } = useUpdateTimestamp();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'move-cst'], mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'move-cst'],
mutationFn: rsformsApi.cstMove, mutationFn: rsformsApi.moveConstituents,
onSuccess: data => { onSuccess: data => {
client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.id }).queryKey, data); client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.id }).queryKey, data);
updateTimestamp(data.id); updateTimestamp(data.id);
@ -20,6 +20,6 @@ export const useCstMove = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
cstMove: (data: { itemID: number; data: ICstMoveDTO }) => mutation.mutateAsync(data) moveConstituents: (data: { itemID: number; data: IMoveConstituentsDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -5,14 +5,14 @@ import { useUpdateTimestamp } from '@/features/library/backend/use-update-timest
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { rsformsApi } from './api'; import { rsformsApi } from './api';
import { type ICstRenameDTO } from './types'; import { type IRenameConstituentaDTO } from './types';
export const useCstRename = () => { export const useRenameConstituenta = () => {
const client = useQueryClient(); const client = useQueryClient();
const { updateTimestamp } = useUpdateTimestamp(); const { updateTimestamp } = useUpdateTimestamp();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'rename-cst'], mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'rename-cst'],
mutationFn: rsformsApi.cstRename, mutationFn: rsformsApi.renameConstituenta,
onSuccess: data => { onSuccess: data => {
client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.schema.id }).queryKey, data.schema); client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.schema.id }).queryKey, data.schema);
updateTimestamp(data.schema.id); updateTimestamp(data.schema.id);
@ -28,6 +28,6 @@ export const useCstRename = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
cstRename: (data: { itemID: number; data: ICstRenameDTO }) => mutation.mutateAsync(data) renameConstituenta: (data: { itemID: number; data: IRenameConstituentaDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -5,14 +5,14 @@ import { useUpdateTimestamp } from '@/features/library/backend/use-update-timest
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { rsformsApi } from './api'; import { rsformsApi } from './api';
import { type ICstSubstitutionsDTO } from './types'; import { type ISubstitutionsDTO } from './types';
export const useCstSubstitute = () => { export const useSubstituteConstituents = () => {
const client = useQueryClient(); const client = useQueryClient();
const { updateTimestamp } = useUpdateTimestamp(); const { updateTimestamp } = useUpdateTimestamp();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'substitute-cst'], mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'substitute-cst'],
mutationFn: rsformsApi.cstSubstitute, mutationFn: rsformsApi.substituteConstituents,
onSuccess: data => { onSuccess: data => {
client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.id }).queryKey, data); client.setQueryData(rsformsApi.getRSFormQueryOptions({ itemID: data.id }).queryKey, data);
updateTimestamp(data.id); updateTimestamp(data.id);
@ -28,6 +28,6 @@ export const useCstSubstitute = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
cstSubstitute: (data: { itemID: number; data: ICstSubstitutionsDTO }) => mutation.mutateAsync(data) substituteConstituents: (data: { itemID: number; data: ISubstitutionsDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -5,14 +5,14 @@ import { useUpdateTimestamp } from '@/features/library/backend/use-update-timest
import { KEYS } from '@/backend/configuration'; import { KEYS } from '@/backend/configuration';
import { rsformsApi } from './api'; import { rsformsApi } from './api';
import { type ICstUpdateDTO } from './types'; import { type IUpdateConstituentaDTO } from './types';
export const useCstUpdate = () => { export const useUpdateConstituenta = () => {
const client = useQueryClient(); const client = useQueryClient();
const { updateTimestamp } = useUpdateTimestamp(); const { updateTimestamp } = useUpdateTimestamp();
const mutation = useMutation({ const mutation = useMutation({
mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'update-cst'], mutationKey: [KEYS.global_mutation, rsformsApi.baseKey, 'update-cst'],
mutationFn: rsformsApi.cstUpdate, mutationFn: rsformsApi.updateConstituenta,
onSuccess: (_, variables) => { onSuccess: (_, variables) => {
updateTimestamp(variables.itemID); updateTimestamp(variables.itemID);
@ -24,6 +24,6 @@ export const useCstUpdate = () => {
onError: () => client.invalidateQueries() onError: () => client.invalidateQueries()
}); });
return { return {
cstUpdate: (data: { itemID: number; data: ICstUpdateDTO }) => mutation.mutateAsync(data) updateConstituenta: (data: { itemID: number; data: IUpdateConstituentaDTO }) => mutation.mutateAsync(data)
}; };
}; };

View File

@ -14,7 +14,7 @@ import { cn } from '@/components/utils';
import { NoData } from '@/components/view'; import { NoData } from '@/components/view';
import { errorMsg } from '@/utils/labels'; import { errorMsg } from '@/utils/labels';
import { type ICstSubstitute } from '../backend/types'; import { type ISubstituteConstituents } from '../backend/types';
import { type IConstituenta, type IRSForm } from '../models/rsform'; import { type IConstituenta, type IRSForm } from '../models/rsform';
import { BadgeConstituenta } from './badge-constituenta'; import { BadgeConstituenta } from './badge-constituenta';
@ -29,10 +29,10 @@ interface IMultiSubstitution {
} }
interface PickSubstitutionsProps extends Styling { interface PickSubstitutionsProps extends Styling {
value: ICstSubstitute[]; value: ISubstituteConstituents[];
onChange: (newValue: ICstSubstitute[]) => void; onChange: (newValue: ISubstituteConstituents[]) => void;
suggestions?: ICstSubstitute[]; suggestions?: ISubstituteConstituents[];
rows?: number; rows?: number;
allowSelfSubstitution?: boolean; allowSelfSubstitution?: boolean;
@ -75,7 +75,7 @@ export function PickSubstitutions({
const [deleteRight, setDeleteRight] = useState(true); const [deleteRight, setDeleteRight] = useState(true);
const toggleDelete = () => setDeleteRight(prev => !prev); const toggleDelete = () => setDeleteRight(prev => !prev);
const [ignores, setIgnores] = useState<ICstSubstitute[]>([]); const [ignores, setIgnores] = useState<ISubstituteConstituents[]>([]);
const filteredSuggestions = const filteredSuggestions =
suggestions?.filter( suggestions?.filter(
item => !ignores.find(ignore => ignore.original === item.original && ignore.substitution === item.substitution) item => !ignores.find(ignore => ignore.original === item.original && ignore.substitution === item.substitution)
@ -122,7 +122,7 @@ export function PickSubstitutions({
if (!leftCst || !rightCst) { if (!leftCst || !rightCst) {
return; return;
} }
const newSubstitution: ICstSubstitute = { const newSubstitution: ISubstituteConstituents = {
original: deleteRight ? rightCst.id : leftCst.id, original: deleteRight ? rightCst.id : leftCst.id,
substitution: deleteRight ? leftCst.id : rightCst.id substitution: deleteRight ? leftCst.id : rightCst.id
}; };

View File

@ -7,32 +7,36 @@ import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { errorMsg } from '@/utils/labels'; import { errorMsg } from '@/utils/labels';
import { type IConstituentaBasicsDTO, type ICstCreateDTO, schemaCstCreate } from '../../backend/types'; import {
import { useCstCreate } from '../../backend/use-cst-create'; type IConstituentaBasicsDTO,
type ICreateConstituentaDTO,
schemaCreateConstituenta
} from '../../backend/types';
import { useCreateConstituenta } from '../../backend/use-create-constituenta';
import { type IRSForm } from '../../models/rsform'; import { type IRSForm } from '../../models/rsform';
import { validateNewAlias } from '../../models/rsform-api'; import { validateNewAlias } from '../../models/rsform-api';
import { FormCreateCst } from './form-create-cst'; import { FormCreateCst } from './form-create-cst';
export interface DlgCreateCstProps { export interface DlgCreateCstProps {
initial: ICstCreateDTO; initial: ICreateConstituentaDTO;
schema: IRSForm; schema: IRSForm;
onCreate: (data: IConstituentaBasicsDTO) => void; onCreate: (data: IConstituentaBasicsDTO) => void;
} }
export function DlgCreateCst() { export function DlgCreateCst() {
const { initial, schema, onCreate } = useDialogsStore(state => state.props as DlgCreateCstProps); const { initial, schema, onCreate } = useDialogsStore(state => state.props as DlgCreateCstProps);
const { cstCreate } = useCstCreate(); const { createConstituenta: cstCreate } = useCreateConstituenta();
const methods = useForm<ICstCreateDTO>({ const methods = useForm<ICreateConstituentaDTO>({
resolver: zodResolver(schemaCstCreate), resolver: zodResolver(schemaCreateConstituenta),
defaultValues: { ...initial } defaultValues: { ...initial }
}); });
const alias = useWatch({ control: methods.control, name: 'alias' }); const alias = useWatch({ control: methods.control, name: 'alias' });
const cst_type = useWatch({ control: methods.control, name: 'cst_type' }); const cst_type = useWatch({ control: methods.control, name: 'cst_type' });
const isValid = validateNewAlias(alias, cst_type, schema); const isValid = validateNewAlias(alias, cst_type, schema);
function onSubmit(data: ICstCreateDTO) { function onSubmit(data: ICreateConstituentaDTO) {
return cstCreate({ itemID: schema.id, data }).then(onCreate); return cstCreate({ itemID: schema.id, data }).then(onCreate);
} }

View File

@ -8,7 +8,7 @@ import { BadgeHelp } from '@/features/help/components';
import { TextArea, TextInput } from '@/components/input'; import { TextArea, TextInput } from '@/components/input';
import { CstType, type ICstCreateDTO } from '../../backend/types'; import { CstType, type ICreateConstituentaDTO } from '../../backend/types';
import { RSInput } from '../../components/rs-input'; import { RSInput } from '../../components/rs-input';
import { SelectCstType } from '../../components/select-cst-type'; import { SelectCstType } from '../../components/select-cst-type';
import { type IRSForm } from '../../models/rsform'; import { type IRSForm } from '../../models/rsform';
@ -24,7 +24,7 @@ export function FormCreateCst({ schema }: FormCreateCstProps) {
register, register,
control, control,
formState: { errors } formState: { errors }
} = useFormContext<ICstCreateDTO>(); } = useFormContext<ICreateConstituentaDTO>();
const [forceComment, setForceComment] = useState(false); const [forceComment, setForceComment] = useState(false);
const cst_type = useWatch({ control, name: 'cst_type' }); const cst_type = useWatch({ control, name: 'cst_type' });

View File

@ -11,8 +11,13 @@ import { ModalForm } from '@/components/modal';
import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs'; import { TabLabel, TabList, TabPanel, Tabs } from '@/components/tabs';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { CstType, type IConstituentaBasicsDTO, type ICstCreateDTO, schemaCstCreate } from '../../backend/types'; import {
import { useCstCreate } from '../../backend/use-cst-create'; CstType,
type IConstituentaBasicsDTO,
type ICreateConstituentaDTO,
schemaCreateConstituenta
} from '../../backend/types';
import { useCreateConstituenta } from '../../backend/use-create-constituenta';
import { type IRSForm } from '../../models/rsform'; import { type IRSForm } from '../../models/rsform';
import { generateAlias, validateNewAlias } from '../../models/rsform-api'; import { generateAlias, validateNewAlias } from '../../models/rsform-api';
import { FormCreateCst } from '../dlg-create-cst/form-create-cst'; import { FormCreateCst } from '../dlg-create-cst/form-create-cst';
@ -36,10 +41,10 @@ export type TabID = (typeof TabID)[keyof typeof TabID];
export function DlgCstTemplate() { export function DlgCstTemplate() {
const { schema, onCreate, insertAfter } = useDialogsStore(state => state.props as DlgCstTemplateProps); const { schema, onCreate, insertAfter } = useDialogsStore(state => state.props as DlgCstTemplateProps);
const { cstCreate } = useCstCreate(); const { createConstituenta: cstCreate } = useCreateConstituenta();
const methods = useForm<ICstCreateDTO>({ const methods = useForm<ICreateConstituentaDTO>({
resolver: zodResolver(schemaCstCreate), resolver: zodResolver(schemaCreateConstituenta),
defaultValues: { defaultValues: {
cst_type: CstType.TERM, cst_type: CstType.TERM,
insert_after: insertAfter ?? null, insert_after: insertAfter ?? null,
@ -57,7 +62,7 @@ export function DlgCstTemplate() {
const [activeTab, setActiveTab] = useState<TabID>(TabID.TEMPLATE); const [activeTab, setActiveTab] = useState<TabID>(TabID.TEMPLATE);
function onSubmit(data: ICstCreateDTO) { function onSubmit(data: ICreateConstituentaDTO) {
return cstCreate({ itemID: schema.id, data }).then(onCreate); return cstCreate({ itemID: schema.id, data }).then(onCreate);
} }

View File

@ -10,7 +10,7 @@ import { IconAccept, IconRemove, IconReset } from '@/components/icons';
import { NoData } from '@/components/view'; import { NoData } from '@/components/view';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type ICstCreateDTO } from '../../backend/types'; import { type ICreateConstituentaDTO } from '../../backend/types';
import { PickConstituenta } from '../../components/pick-constituenta'; import { PickConstituenta } from '../../components/pick-constituenta';
import { RSInput } from '../../components/rs-input'; import { RSInput } from '../../components/rs-input';
import { type IConstituenta } from '../../models/rsform'; import { type IConstituenta } from '../../models/rsform';
@ -23,7 +23,7 @@ const argumentsHelper = createColumnHelper<IArgumentValue>();
export function TabArguments() { export function TabArguments() {
const { schema } = useDialogsStore(state => state.props as DlgCstTemplateProps); const { schema } = useDialogsStore(state => state.props as DlgCstTemplateProps);
const { control } = useFormContext<ICstCreateDTO>(); const { control } = useFormContext<ICreateConstituentaDTO>();
const { args, onChangeArguments } = useTemplateContext(); const { args, onChangeArguments } = useTemplateContext();
const definition = useWatch({ control, name: 'definition_formal' }); const definition = useWatch({ control, name: 'definition_formal' });

View File

@ -5,7 +5,7 @@ import { useFormContext } from 'react-hook-form';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type ICstCreateDTO } from '../../backend/types'; import { type ICreateConstituentaDTO } from '../../backend/types';
import { type IConstituenta } from '../../models/rsform'; import { type IConstituenta } from '../../models/rsform';
import { generateAlias } from '../../models/rsform-api'; import { generateAlias } from '../../models/rsform-api';
import { type IArgumentValue } from '../../models/rslang'; import { type IArgumentValue } from '../../models/rslang';
@ -16,7 +16,7 @@ import { TemplateContext } from './template-context';
export const TemplateState = ({ children }: React.PropsWithChildren) => { export const TemplateState = ({ children }: React.PropsWithChildren) => {
const { schema } = useDialogsStore(state => state.props as DlgCstTemplateProps); const { schema } = useDialogsStore(state => state.props as DlgCstTemplateProps);
const { setValue } = useFormContext<ICstCreateDTO>(); const { setValue } = useFormContext<ICreateConstituentaDTO>();
const [templateID, setTemplateID] = useState<number | null>(null); const [templateID, setTemplateID] = useState<number | null>(null);
const [args, setArguments] = useState<IArgumentValue[]>([]); const [args, setArguments] = useState<IArgumentValue[]>([]);
const [prototype, setPrototype] = useState<IConstituenta | null>(null); const [prototype, setPrototype] = useState<IConstituenta | null>(null);

View File

@ -7,7 +7,7 @@ import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { prefixes } from '@/utils/constants'; import { prefixes } from '@/utils/constants';
import { useCstDelete } from '../../backend/use-cst-delete'; import { useDeleteConstituents } from '../../backend/use-delete-constituents';
import { type IRSForm } from '../../models/rsform'; import { type IRSForm } from '../../models/rsform';
import { ListConstituents } from './list-constituents'; import { ListConstituents } from './list-constituents';
@ -20,7 +20,7 @@ export interface DlgDeleteCstProps {
export function DlgDeleteCst() { export function DlgDeleteCst() {
const { selected, schema, afterDelete } = useDialogsStore(state => state.props as DlgDeleteCstProps); const { selected, schema, afterDelete } = useDialogsStore(state => state.props as DlgDeleteCstProps);
const { cstDelete } = useCstDelete(); const { deleteConstituents: cstDelete } = useDeleteConstituents();
const [expandOut, setExpandOut] = useState(false); const [expandOut, setExpandOut] = useState(false);
const expansion: number[] = schema.graph.expandAllOutputs(selected); const expansion: number[] = schema.graph.expandAllOutputs(selected);

View File

@ -15,7 +15,7 @@ import { useGenerateLexeme } from '../../backend/cctext/use-generate-lexeme';
import { useInflectText } from '../../backend/cctext/use-inflect-text'; import { useInflectText } from '../../backend/cctext/use-inflect-text';
import { useIsProcessingCctext } from '../../backend/cctext/use-is-processing-cctext'; import { useIsProcessingCctext } from '../../backend/cctext/use-is-processing-cctext';
import { useParseText } from '../../backend/cctext/use-parse-text'; import { useParseText } from '../../backend/cctext/use-parse-text';
import { useCstUpdate } from '../../backend/use-cst-update'; import { useUpdateConstituenta } from '../../backend/use-update-constituenta';
import { SelectMultiGrammeme } from '../../components/select-multi-grammeme'; import { SelectMultiGrammeme } from '../../components/select-multi-grammeme';
import { type Grammeme, type IWordForm, supportedGrammemes } from '../../models/language'; import { type Grammeme, type IWordForm, supportedGrammemes } from '../../models/language';
import { parseGrammemes, wordFormEquals } from '../../models/language-api'; import { parseGrammemes, wordFormEquals } from '../../models/language-api';
@ -30,7 +30,7 @@ export interface DlgEditWordFormsProps {
export function DlgEditWordForms() { export function DlgEditWordForms() {
const { itemID, target } = useDialogsStore(state => state.props as DlgEditWordFormsProps); const { itemID, target } = useDialogsStore(state => state.props as DlgEditWordFormsProps);
const { cstUpdate } = useCstUpdate(); const { updateConstituenta: cstUpdate } = useUpdateConstituenta();
const isProcessing = useIsProcessingCctext(); const isProcessing = useIsProcessingCctext();
const { inflectText } = useInflectText(); const { inflectText } = useInflectText();

View File

@ -9,8 +9,8 @@ import { TextInput } from '@/components/input';
import { ModalForm } from '@/components/modal'; import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type CstType, type ICstRenameDTO, schemaCstRename } from '../backend/types'; import { type CstType, type IRenameConstituentaDTO, schemaRenameConstituenta } from '../backend/types';
import { useCstRename } from '../backend/use-cst-rename'; import { useRenameConstituenta } from '../backend/use-rename-constituenta';
import { SelectCstType } from '../components/select-cst-type'; import { SelectCstType } from '../components/select-cst-type';
import { type IConstituenta, type IRSForm } from '../models/rsform'; import { type IConstituenta, type IRSForm } from '../models/rsform';
import { generateAlias, validateNewAlias } from '../models/rsform-api'; import { generateAlias, validateNewAlias } from '../models/rsform-api';
@ -22,10 +22,10 @@ export interface DlgRenameCstProps {
export function DlgRenameCst() { export function DlgRenameCst() {
const { schema, target } = useDialogsStore(state => state.props as DlgRenameCstProps); const { schema, target } = useDialogsStore(state => state.props as DlgRenameCstProps);
const { cstRename } = useCstRename(); const { renameConstituenta: cstRename } = useRenameConstituenta();
const { register, setValue, handleSubmit, control } = useForm<ICstRenameDTO>({ const { register, setValue, handleSubmit, control } = useForm<IRenameConstituentaDTO>({
resolver: zodResolver(schemaCstRename), resolver: zodResolver(schemaRenameConstituenta),
defaultValues: { defaultValues: {
target: target.id, target: target.id,
alias: target.alias, alias: target.alias,
@ -36,7 +36,7 @@ export function DlgRenameCst() {
const cst_type = useWatch({ control, name: 'cst_type' }); const cst_type = useWatch({ control, name: 'cst_type' });
const isValid = alias !== target.alias && validateNewAlias(alias, cst_type, schema); const isValid = alias !== target.alias && validateNewAlias(alias, cst_type, schema);
function onSubmit(data: ICstRenameDTO) { function onSubmit(data: IRenameConstituentaDTO) {
return cstRename({ itemID: schema.id, data: data }); return cstRename({ itemID: schema.id, data: data });
} }

View File

@ -9,33 +9,33 @@ import { ErrorField } from '@/components/input';
import { ModalForm } from '@/components/modal'; import { ModalForm } from '@/components/modal';
import { useDialogsStore } from '@/stores/dialogs'; import { useDialogsStore } from '@/stores/dialogs';
import { type ICstSubstitutionsDTO, schemaCstSubstitutions } from '../backend/types'; import { type ISubstitutionsDTO, schemaSubstitutions } from '../backend/types';
import { useCstSubstitute } from '../backend/use-cst-substitute'; import { useSubstituteConstituents } from '../backend/use-substitute-constituents';
import { PickSubstitutions } from '../components/pick-substitutions'; import { PickSubstitutions } from '../components/pick-substitutions';
import { type IRSForm } from '../models/rsform'; import { type IRSForm } from '../models/rsform';
export interface DlgSubstituteCstProps { export interface DlgSubstituteCstProps {
schema: IRSForm; schema: IRSForm;
onSubstitute: (data: ICstSubstitutionsDTO) => void; onSubstitute: (data: ISubstitutionsDTO) => void;
} }
export function DlgSubstituteCst() { export function DlgSubstituteCst() {
const { onSubstitute, schema } = useDialogsStore(state => state.props as DlgSubstituteCstProps); const { onSubstitute, schema } = useDialogsStore(state => state.props as DlgSubstituteCstProps);
const { cstSubstitute } = useCstSubstitute(); const { substituteConstituents: cstSubstitute } = useSubstituteConstituents();
const { const {
handleSubmit, handleSubmit,
control, control,
formState: { errors, isValid } formState: { errors, isValid }
} = useForm<ICstSubstitutionsDTO>({ } = useForm<ISubstitutionsDTO>({
resolver: zodResolver(schemaCstSubstitutions), resolver: zodResolver(schemaSubstitutions),
defaultValues: { defaultValues: {
substitutions: [] substitutions: []
}, },
mode: 'onChange' mode: 'onChange'
}); });
function onSubmit(data: ICstSubstitutionsDTO) { function onSubmit(data: ISubstitutionsDTO) {
return cstSubstitute({ itemID: schema.id, data: data }).then(() => onSubstitute(data)); return cstSubstitute({ itemID: schema.id, data: data }).then(() => onSubstitute(data));
} }

View File

@ -1,6 +1,6 @@
export { export {
CstType, CstType,
type ICstSubstitute, type ISubstituteConstituents as ICstSubstitute,
type IRSFormDTO, type IRSFormDTO,
type IVersionCreatedResponse, type IVersionCreatedResponse,
ParsingStatus, ParsingStatus,

View File

@ -17,13 +17,13 @@ import { promptUnsaved } from '@/utils/utils';
import { import {
CstType, CstType,
type ICstUpdateDTO,
type IExpressionParseDTO, type IExpressionParseDTO,
type IUpdateConstituentaDTO,
ParsingStatus, ParsingStatus,
schemaCstUpdate schemaUpdateConstituenta
} from '../../../backend/types'; } from '../../../backend/types';
import { useCstUpdate } from '../../../backend/use-cst-update';
import { useMutatingRSForm } from '../../../backend/use-mutating-rsform'; import { useMutatingRSForm } from '../../../backend/use-mutating-rsform';
import { useUpdateConstituenta } from '../../../backend/use-update-constituenta';
import { RefsInput } from '../../../components/refs-input'; import { RefsInput } from '../../../components/refs-input';
import { labelCstTypification, labelTypification } from '../../../labels'; import { labelCstTypification, labelTypification } from '../../../labels';
import { type IConstituenta, type IRSForm } from '../../../models/rsform'; import { type IConstituenta, type IRSForm } from '../../../models/rsform';
@ -50,9 +50,9 @@ export function FormConstituenta({ disabled, id, toggleReset, schema, activeCst,
control, control,
reset, reset,
formState: { isDirty } formState: { isDirty }
} = useForm<ICstUpdateDTO>({ resolver: zodResolver(schemaCstUpdate) }); } = useForm<IUpdateConstituentaDTO>({ resolver: zodResolver(schemaUpdateConstituenta) });
const { cstUpdate } = useCstUpdate(); const { updateConstituenta: cstUpdate } = useUpdateConstituenta();
const showTypification = useDialogsStore(state => state.showShowTypeGraph); const showTypification = useDialogsStore(state => state.showShowTypeGraph);
const showEditTerm = useDialogsStore(state => state.showEditWordForms); const showEditTerm = useDialogsStore(state => state.showEditWordForms);
const showRenameCst = useDialogsStore(state => state.showRenameCst); const showRenameCst = useDialogsStore(state => state.showRenameCst);
@ -104,7 +104,7 @@ export function FormConstituenta({ disabled, id, toggleReset, schema, activeCst,
return () => setIsModified(false); return () => setIsModified(false);
}, [isDirty, activeCst, setIsModified]); }, [isDirty, activeCst, setIsModified]);
function onSubmit(data: ICstUpdateDTO) { function onSubmit(data: IUpdateConstituentaDTO) {
return cstUpdate({ itemID: schema.id, data }).then(() => reset({ ...data })); return cstUpdate({ itemID: schema.id, data }).then(() => reset({ ...data }));
} }

View File

@ -4,7 +4,7 @@ import clsx from 'clsx';
import { HelpTopic } from '@/features/help'; import { HelpTopic } from '@/features/help';
import { BadgeHelp } from '@/features/help/components'; import { BadgeHelp } from '@/features/help/components';
import { useVersionRestore } from '@/features/library/backend/use-version-restore'; import { useRestoreVersion } from '@/features/library/backend/use-restore-version';
import { MiniButton } from '@/components/control'; import { MiniButton } from '@/components/control';
import { IconNewVersion, IconUpload, IconVersions } from '@/components/icons'; import { IconNewVersion, IconUpload, IconVersions } from '@/components/icons';
@ -22,7 +22,7 @@ interface ToolbarVersioningProps {
export function ToolbarVersioning({ blockReload, className }: ToolbarVersioningProps) { export function ToolbarVersioning({ blockReload, className }: ToolbarVersioningProps) {
const { isModified } = useModificationStore(); const { isModified } = useModificationStore();
const { versionRestore } = useVersionRestore(); const { restoreVersion: versionRestore } = useRestoreVersion();
const { schema, isMutable, isContentEditable, navigateVersion, activeVersion, selected } = useRSEdit(); const { schema, isMutable, isContentEditable, navigateVersion, activeVersion, selected } = useRSEdit();
const showCreateVersion = useDialogsStore(state => state.showCreateVersion); const showCreateVersion = useDialogsStore(state => state.showCreateVersion);

View File

@ -15,9 +15,9 @@ import { PARAMETER, prefixes } from '@/utils/constants';
import { promptText } from '@/utils/labels'; import { promptText } from '@/utils/labels';
import { promptUnsaved } from '@/utils/utils'; import { promptUnsaved } from '@/utils/utils';
import { CstType, type IConstituentaBasicsDTO, type ICstCreateDTO } from '../../backend/types'; import { CstType, type IConstituentaBasicsDTO, type ICreateConstituentaDTO } from '../../backend/types';
import { useCstCreate } from '../../backend/use-cst-create'; import { useCreateConstituenta } from '../../backend/use-create-constituenta';
import { useCstMove } from '../../backend/use-cst-move'; import { useMoveConstituents } from '../../backend/use-move-constituents';
import { useRSFormSuspense } from '../../backend/use-rsform'; import { useRSFormSuspense } from '../../backend/use-rsform';
import { type IConstituenta } from '../../models/rsform'; import { type IConstituenta } from '../../models/rsform';
import { generateAlias } from '../../models/rsform-api'; import { generateAlias } from '../../models/rsform-api';
@ -59,8 +59,8 @@ export const RSEditState = ({
const activeCst = selected.length === 0 ? null : schema.cstByID.get(selected[selected.length - 1])!; const activeCst = selected.length === 0 ? null : schema.cstByID.get(selected[selected.length - 1])!;
const { cstCreate } = useCstCreate(); const { createConstituenta: cstCreate } = useCreateConstituenta();
const { cstMove } = useCstMove(); const { moveConstituents: cstMove } = useMoveConstituents();
const { deleteItem } = useDeleteItem(); const { deleteItem } = useDeleteItem();
const showCreateCst = useDialogsStore(state => state.showCreateCst); const showCreateCst = useDialogsStore(state => state.showCreateCst);
@ -206,7 +206,7 @@ export const RSEditState = ({
function createCst(type: CstType | null, skipDialog: boolean, definition?: string) { function createCst(type: CstType | null, skipDialog: boolean, definition?: string) {
const targetType = type ?? activeCst?.cst_type ?? CstType.BASE; const targetType = type ?? activeCst?.cst_type ?? CstType.BASE;
const data: ICstCreateDTO = { const data: ICreateConstituentaDTO = {
insert_after: activeCst?.id ?? null, insert_after: activeCst?.id ?? null,
cst_type: targetType, cst_type: targetType,
alias: generateAlias(targetType, schema), alias: generateAlias(targetType, schema),