diff --git a/rsconcept/frontend/src/backend/cctext/api.ts b/rsconcept/frontend/src/backend/cctext/api.ts index 210ca1bc..c89e2311 100644 --- a/rsconcept/frontend/src/backend/cctext/api.ts +++ b/rsconcept/frontend/src/backend/cctext/api.ts @@ -1,5 +1,4 @@ import { axiosPost } from '@/backend/apiTransport'; -import { ILexemeData, IWordFormPlain } from '@/models/language'; /** * Represents API result for text output. @@ -8,11 +7,26 @@ export interface ITextResult { result: string; } +/** + * Represents wordform data used for backend communication. + */ +export interface IWordFormDTO { + text: string; + grams: string; +} + +/** + * Represents lexeme response containing multiple {@link Wordform}s. + */ +export interface ILexemeResponse { + items: IWordFormDTO[]; +} + export const cctextApi = { baseKey: 'cctext', - inflectText: (data: IWordFormPlain) => - axiosPost({ + inflectText: (data: IWordFormDTO) => + axiosPost({ endpoint: '/api/cctext/inflect', request: { data: data } }), @@ -22,7 +36,7 @@ export const cctextApi = { request: { data: data } }), generateLexeme: (data: { text: string }) => - axiosPost<{ text: string }, ILexemeData>({ + axiosPost<{ text: string }, ILexemeResponse>({ endpoint: '/api/cctext/generate-lexeme', request: { data: data } }) diff --git a/rsconcept/frontend/src/backend/cctext/useGenerateLexeme.tsx b/rsconcept/frontend/src/backend/cctext/useGenerateLexeme.tsx index c96479ca..f0f79014 100644 --- a/rsconcept/frontend/src/backend/cctext/useGenerateLexeme.tsx +++ b/rsconcept/frontend/src/backend/cctext/useGenerateLexeme.tsx @@ -1,9 +1,8 @@ import { useMutation } from '@tanstack/react-query'; import { DataCallback } from '@/backend/apiTransport'; -import { ILexemeData } from '@/models/language'; -import { cctextApi } from './api'; +import { cctextApi, ILexemeResponse } from './api'; export const useGenerateLexeme = () => { const mutation = useMutation({ @@ -13,7 +12,7 @@ export const useGenerateLexeme = () => { return { generateLexeme: ( data: { text: string }, // - onSuccess?: DataCallback + onSuccess?: DataCallback ) => mutation.mutate(data, { onSuccess }) }; }; diff --git a/rsconcept/frontend/src/backend/cctext/useInflectText.tsx b/rsconcept/frontend/src/backend/cctext/useInflectText.tsx index a8239263..24da915d 100644 --- a/rsconcept/frontend/src/backend/cctext/useInflectText.tsx +++ b/rsconcept/frontend/src/backend/cctext/useInflectText.tsx @@ -1,9 +1,8 @@ import { useMutation } from '@tanstack/react-query'; import { DataCallback } from '@/backend/apiTransport'; -import { IWordFormPlain } from '@/models/language'; -import { cctextApi, ITextResult } from './api'; +import { cctextApi, ITextResult, IWordFormDTO } from './api'; export const useInflectText = () => { const mutation = useMutation({ @@ -12,7 +11,7 @@ export const useInflectText = () => { }); return { inflectText: ( - data: IWordFormPlain, // + data: IWordFormDTO, // onSuccess?: DataCallback ) => mutation.mutate(data, { onSuccess }) }; diff --git a/rsconcept/frontend/src/backend/library/api.ts b/rsconcept/frontend/src/backend/library/api.ts index be076512..73212e3c 100644 --- a/rsconcept/frontend/src/backend/library/api.ts +++ b/rsconcept/frontend/src/backend/library/api.ts @@ -3,7 +3,7 @@ import { queryOptions } from '@tanstack/react-query'; import { axiosDelete, axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport'; import { DELAYS } from '@/backend/configuration'; import { ossApi } from '@/backend/oss/api'; -import { rsformsApi } from '@/backend/rsform/api'; +import { IRSFormDTO, rsformsApi } from '@/backend/rsform/api'; import { AccessPolicy, ILibraryItem, @@ -13,7 +13,7 @@ import { LibraryItemType, VersionID } from '@/models/library'; -import { ConstituentaID, IRSFormData } from '@/models/rsform'; +import { ConstituentaID } from '@/models/rsform'; import { UserID } from '@/models/user'; import { information } from '@/utils/labels'; @@ -60,7 +60,7 @@ export interface IVersionCreateDTO { */ export interface IVersionCreatedResponse { version: number; - schema: IRSFormData; + schema: IRSFormDTO; } export const libraryApi = { @@ -157,7 +157,7 @@ export const libraryApi = { } }), cloneItem: (data: IRSFormCloneDTO) => - axiosPost({ + axiosPost({ endpoint: `/api/library/${data.id}/clone`, request: { data: data, @@ -182,7 +182,7 @@ export const libraryApi = { } }), versionRestore: ({ versionID }: { versionID: VersionID }) => - axiosPatch({ + axiosPatch({ endpoint: `/api/versions/${versionID}/restore`, request: { successMessage: information.versionRestored diff --git a/rsconcept/frontend/src/backend/library/useCloneItem.tsx b/rsconcept/frontend/src/backend/library/useCloneItem.tsx index 219aad9d..dc9b0910 100644 --- a/rsconcept/frontend/src/backend/library/useCloneItem.tsx +++ b/rsconcept/frontend/src/backend/library/useCloneItem.tsx @@ -1,8 +1,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { DataCallback } from '@/backend/apiTransport'; -import { IRSFormData } from '@/models/rsform'; +import { IRSFormDTO } from '../rsform/api'; import { IRSFormCloneDTO, libraryApi } from './api'; export const useCloneItem = () => { @@ -15,7 +15,7 @@ export const useCloneItem = () => { return { cloneItem: ( data: IRSFormCloneDTO, // - onSuccess?: DataCallback + onSuccess?: DataCallback ) => mutation.mutate(data, { onSuccess }) }; }; diff --git a/rsconcept/frontend/src/backend/library/useSetAccessPolicy.tsx b/rsconcept/frontend/src/backend/library/useSetAccessPolicy.tsx index 1754b768..37f27303 100644 --- a/rsconcept/frontend/src/backend/library/useSetAccessPolicy.tsx +++ b/rsconcept/frontend/src/backend/library/useSetAccessPolicy.tsx @@ -1,9 +1,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { ossApi } from '@/backend/oss/api'; +import { IOperationSchemaDTO, ossApi } from '@/backend/oss/api'; import { rsformsApi } from '@/backend/rsform/api'; import { AccessPolicy, ILibraryItem, LibraryItemID } from '@/models/library'; -import { IOperationSchemaData } from '@/models/oss'; import { libraryApi } from './api'; @@ -14,7 +13,7 @@ export const useSetAccessPolicy = () => { mutationFn: libraryApi.setAccessPolicy, onSuccess: (_, variables) => { const ossKey = ossApi.getOssQueryOptions({ itemID: variables.itemID }).queryKey; - const ossData: IOperationSchemaData | undefined = client.getQueryData(ossKey); + const ossData: IOperationSchemaDTO | undefined = client.getQueryData(ossKey); if (ossData) { client.setQueryData(ossKey, { ...ossData, access_policy: variables.policy }); return Promise.allSettled([ diff --git a/rsconcept/frontend/src/backend/library/useSetLocation.tsx b/rsconcept/frontend/src/backend/library/useSetLocation.tsx index 80803e83..2dcaa19e 100644 --- a/rsconcept/frontend/src/backend/library/useSetLocation.tsx +++ b/rsconcept/frontend/src/backend/library/useSetLocation.tsx @@ -1,9 +1,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { ossApi } from '@/backend/oss/api'; +import { IOperationSchemaDTO, ossApi } from '@/backend/oss/api'; import { rsformsApi } from '@/backend/rsform/api'; import { ILibraryItem, LibraryItemID } from '@/models/library'; -import { IOperationSchemaData } from '@/models/oss'; import { libraryApi } from './api'; @@ -14,7 +13,7 @@ export const useSetLocation = () => { mutationFn: libraryApi.setLocation, onSuccess: (_, variables) => { const ossKey = ossApi.getOssQueryOptions({ itemID: variables.itemID }).queryKey; - const ossData: IOperationSchemaData | undefined = client.getQueryData(ossKey); + const ossData: IOperationSchemaDTO | undefined = client.getQueryData(ossKey); if (ossData) { client.setQueryData(ossKey, { ...ossData, location: variables.location }); return Promise.allSettled([ diff --git a/rsconcept/frontend/src/backend/library/useSetOwner.tsx b/rsconcept/frontend/src/backend/library/useSetOwner.tsx index 7ec5ff84..09bd4ef9 100644 --- a/rsconcept/frontend/src/backend/library/useSetOwner.tsx +++ b/rsconcept/frontend/src/backend/library/useSetOwner.tsx @@ -1,9 +1,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { ossApi } from '@/backend/oss/api'; +import { IOperationSchemaDTO, ossApi } from '@/backend/oss/api'; import { rsformsApi } from '@/backend/rsform/api'; import { ILibraryItem, LibraryItemID } from '@/models/library'; -import { IOperationSchemaData } from '@/models/oss'; import { UserID } from '@/models/user'; import { libraryApi } from './api'; @@ -15,7 +14,7 @@ export const useSetOwner = () => { mutationFn: libraryApi.setOwner, onSuccess: (_, variables) => { const ossKey = ossApi.getOssQueryOptions({ itemID: variables.itemID }).queryKey; - const ossData: IOperationSchemaData | undefined = client.getQueryData(ossKey); + const ossData: IOperationSchemaDTO | undefined = client.getQueryData(ossKey); if (ossData) { client.setQueryData(ossKey, { ...ossData, owner: variables.owner }); return Promise.allSettled([ diff --git a/rsconcept/frontend/src/backend/library/useUpdateItem.tsx b/rsconcept/frontend/src/backend/library/useUpdateItem.tsx index 4c53e9ed..4f2f689b 100644 --- a/rsconcept/frontend/src/backend/library/useUpdateItem.tsx +++ b/rsconcept/frontend/src/backend/library/useUpdateItem.tsx @@ -1,10 +1,9 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { ossApi } from '@/backend/oss/api'; +import { IOperationSchemaDTO, ossApi } from '@/backend/oss/api'; import { ILibraryItem, LibraryItemType } from '@/models/library'; -import { IOperationSchemaData } from '@/models/oss'; -import { IRSFormData } from '@/models/rsform'; +import { IRSFormDTO } from '../rsform/api'; import { ILibraryUpdateDTO, libraryApi } from './api'; export const useUpdateItem = () => { @@ -17,11 +16,11 @@ export const useUpdateItem = () => { client.setQueryData(libraryApi.libraryListKey, (prev: ILibraryItem[] | undefined) => prev?.map(item => (item.id === data.id ? data : item)) ); - client.setQueryData(itemKey, (prev: IRSFormData | IOperationSchemaData | undefined) => + client.setQueryData(itemKey, (prev: IRSFormDTO | IOperationSchemaDTO | undefined) => !prev ? undefined : { ...prev, ...data } ); if (data.item_type === LibraryItemType.RSFORM) { - const schema: IRSFormData | undefined = client.getQueryData(itemKey); + const schema: IRSFormDTO | undefined = client.getQueryData(itemKey); if (schema) { return Promise.allSettled( schema.oss.map(item => diff --git a/rsconcept/frontend/src/backend/library/useVersionDelete.tsx b/rsconcept/frontend/src/backend/library/useVersionDelete.tsx index ec3765a8..df6fa608 100644 --- a/rsconcept/frontend/src/backend/library/useVersionDelete.tsx +++ b/rsconcept/frontend/src/backend/library/useVersionDelete.tsx @@ -1,8 +1,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { rsformsApi } from '@/backend/rsform/api'; +import { IRSFormDTO, rsformsApi } from '@/backend/rsform/api'; import { LibraryItemID, VersionID } from '@/models/library'; -import { IRSFormData } from '@/models/rsform'; import { libraryApi } from './api'; @@ -14,7 +13,7 @@ export const useVersionDelete = () => { onSuccess: (_, variables) => { client.setQueryData( rsformsApi.getRSFormQueryOptions({ itemID: variables.itemID }).queryKey, - (prev: IRSFormData | undefined) => + (prev: IRSFormDTO | undefined) => !prev ? undefined : { diff --git a/rsconcept/frontend/src/backend/library/useVersionUpdate.tsx b/rsconcept/frontend/src/backend/library/useVersionUpdate.tsx index 7507f023..2967598c 100644 --- a/rsconcept/frontend/src/backend/library/useVersionUpdate.tsx +++ b/rsconcept/frontend/src/backend/library/useVersionUpdate.tsx @@ -1,8 +1,7 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; -import { rsformsApi } from '@/backend/rsform/api'; +import { IRSFormDTO, rsformsApi } from '@/backend/rsform/api'; import { IVersionData, VersionID } from '@/models/library'; -import { IRSFormData } from '@/models/rsform'; import { libraryApi } from './api'; @@ -14,7 +13,7 @@ export const useVersionUpdate = () => { onSuccess: data => { client.setQueryData( rsformsApi.getRSFormQueryOptions({ itemID: data.item }).queryKey, - (prev: IRSFormData | undefined) => + (prev: IRSFormDTO | undefined) => !prev ? undefined : { diff --git a/rsconcept/frontend/src/models/OssLoader.ts b/rsconcept/frontend/src/backend/oss/OssLoader.ts similarity index 87% rename from rsconcept/frontend/src/models/OssLoader.ts rename to rsconcept/frontend/src/backend/oss/OssLoader.ts index ed16daf2..36a673fc 100644 --- a/rsconcept/frontend/src/models/OssLoader.ts +++ b/rsconcept/frontend/src/backend/oss/OssLoader.ts @@ -2,29 +2,24 @@ * Module: OSS data loading and processing. */ -import { Graph } from './Graph'; -import { ILibraryItem, LibraryItemID } from './library'; -import { - IOperation, - IOperationSchema, - IOperationSchemaData, - IOperationSchemaStats, - OperationID, - OperationType -} from './oss'; +import { Graph } from '@/models/Graph'; +import { ILibraryItem, LibraryItemID } from '@/models/library'; +import { IOperation, IOperationSchema, IOperationSchemaStats, OperationID, OperationType } from '@/models/oss'; + +import { IOperationSchemaDTO } from './api'; /** - * Loads data into an {@link IOperationSchema} based on {@link IOperationSchemaData}. + * Loads data into an {@link IOperationSchema} based on {@link IOperationSchemaDTO}. * */ export class OssLoader { - private oss: IOperationSchemaData; + private oss: IOperationSchemaDTO; private graph: Graph = new Graph(); private operationByID = new Map(); private schemaIDs: LibraryItemID[] = []; private items: ILibraryItem[]; - constructor(input: IOperationSchemaData, items: ILibraryItem[]) { + constructor(input: IOperationSchemaDTO, items: ILibraryItem[]) { this.oss = input; this.items = items; } diff --git a/rsconcept/frontend/src/backend/oss/api.ts b/rsconcept/frontend/src/backend/oss/api.ts index aed0bcaa..04516828 100644 --- a/rsconcept/frontend/src/backend/oss/api.ts +++ b/rsconcept/frontend/src/backend/oss/api.ts @@ -2,18 +2,33 @@ import { queryOptions } from '@tanstack/react-query'; import { axiosDelete, axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport'; import { DELAYS } from '@/backend/configuration'; -import { ILibraryItem, LibraryItemID } from '@/models/library'; +import { ILibraryItem, ILibraryItemData, LibraryItemID } from '@/models/library'; import { + IArgument, ICstSubstitute, - IOperationData, + ICstSubstituteEx, + IOperation, IOperationPosition, - IOperationSchemaData, OperationID, OperationType } from '@/models/oss'; import { ConstituentaID, IConstituentaReference, ITargetCst } from '@/models/rsform'; import { information } from '@/utils/labels'; +/** + * Represents {@link IOperation} data from server. + */ +export interface IOperationDTO extends Omit {} + +/** + * Represents backend data for {@link IOperationSchema}. + */ +export interface IOperationSchemaDTO extends ILibraryItemData { + items: IOperationDTO[]; + arguments: IArgument[]; + substitutions: ICstSubstituteEx[]; +} + /** * Represents {@link IOperation} data, used in creation process. */ @@ -36,8 +51,8 @@ export interface IOperationCreateDTO { * Represents data response when creating {@link IOperation}. */ export interface IOperationCreatedResponse { - new_operation: IOperationData; - oss: IOperationSchemaData; + new_operation: IOperationDTO; + oss: IOperationSchemaDTO; } /** @@ -61,7 +76,7 @@ export interface IOperationDeleteDTO extends ITargetOperation { */ export interface IInputCreatedResponse { new_schema: ILibraryItem; - oss: IOperationSchemaData; + oss: IOperationSchemaDTO; } /** @@ -102,7 +117,7 @@ export const ossApi = { queryFn: meta => !itemID ? undefined - : axiosGet({ + : axiosGet({ endpoint: `/api/oss/${itemID}/details`, options: { signal: meta.signal } }) @@ -135,7 +150,7 @@ export const ossApi = { } }), operationDelete: ({ itemID, data }: { itemID: LibraryItemID; data: IOperationDeleteDTO }) => - axiosDelete({ + axiosDelete({ endpoint: `/api/oss/${itemID}/delete-operation`, request: { data: data, @@ -151,7 +166,7 @@ export const ossApi = { } }), inputUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: IInputUpdateDTO }) => - axiosPatch({ + axiosPatch({ endpoint: `/api/oss/${itemID}/set-input`, request: { data: data, @@ -159,7 +174,7 @@ export const ossApi = { } }), operationUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: IOperationUpdateDTO }) => - axiosPatch({ + axiosPatch({ endpoint: `/api/oss/${itemID}/update-operation`, request: { data: data, @@ -167,7 +182,7 @@ export const ossApi = { } }), operationExecute: ({ itemID, data }: { itemID: LibraryItemID; data: ITargetOperation }) => - axiosPost({ + axiosPost({ endpoint: `/api/oss/${itemID}/execute-operation`, request: { data: data, @@ -176,7 +191,7 @@ export const ossApi = { }), relocateConstituents: ({ itemID, data }: { itemID: LibraryItemID; data: ICstRelocateDTO }) => - axiosPost({ + axiosPost({ endpoint: `/api/oss/${itemID}/relocate-constituents`, request: { data: data, diff --git a/rsconcept/frontend/src/backend/oss/useOSS.tsx b/rsconcept/frontend/src/backend/oss/useOSS.tsx index 70c88211..7805b707 100644 --- a/rsconcept/frontend/src/backend/oss/useOSS.tsx +++ b/rsconcept/frontend/src/backend/oss/useOSS.tsx @@ -1,8 +1,8 @@ import { useQuery, useSuspenseQuery } from '@tanstack/react-query'; import { useLibrary, useLibrarySuspense } from '@/backend/library/useLibrary'; +import { OssLoader } from '@/backend/oss/OssLoader'; import { LibraryItemID } from '@/models/library'; -import { OssLoader } from '@/models/OssLoader'; import { queryClient } from '../queryClient'; import { ossApi } from './api'; diff --git a/rsconcept/frontend/src/backend/oss/useOperationCreate.tsx b/rsconcept/frontend/src/backend/oss/useOperationCreate.tsx index e1187712..97ca7167 100644 --- a/rsconcept/frontend/src/backend/oss/useOperationCreate.tsx +++ b/rsconcept/frontend/src/backend/oss/useOperationCreate.tsx @@ -3,9 +3,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { DataCallback } from '@/backend/apiTransport'; import { useUpdateTimestamp } from '@/backend/library/useUpdateTimestamp'; import { LibraryItemID } from '@/models/library'; -import { IOperationData } from '@/models/oss'; -import { IOperationCreateDTO, ossApi } from './api'; +import { IOperationCreateDTO, IOperationDTO, ossApi } from './api'; export const useOperationCreate = () => { const client = useQueryClient(); @@ -24,7 +23,7 @@ export const useOperationCreate = () => { itemID: LibraryItemID; // data: IOperationCreateDTO; }, - onSuccess?: DataCallback + onSuccess?: DataCallback ) => mutation.mutate(data, { onSuccess: response => onSuccess?.(response.new_operation) }) }; }; diff --git a/rsconcept/frontend/src/models/RSFormLoader.ts b/rsconcept/frontend/src/backend/rsform/RSFormLoader.ts similarity index 93% rename from rsconcept/frontend/src/models/RSFormLoader.ts rename to rsconcept/frontend/src/backend/rsform/RSFormLoader.ts index 9b6dd30b..4d97405b 100644 --- a/rsconcept/frontend/src/models/RSFormLoader.ts +++ b/rsconcept/frontend/src/backend/rsform/RSFormLoader.ts @@ -2,27 +2,29 @@ * Module: RSForm data loading and processing. */ -import { Graph } from './Graph'; -import { LibraryItemID } from './library'; -import { ConstituentaID, CstType, IConstituenta, IRSForm, IRSFormData, IRSFormStats } from './rsform'; -import { inferClass, inferStatus, inferTemplate, isBaseSet, isFunctional } from './rsformAPI'; -import { ParsingStatus, ValueClass } from './rslang'; -import { extractGlobals, isSimpleExpression, splitTemplateDefinition } from './rslangAPI'; +import { Graph } from '@/models/Graph'; +import { LibraryItemID } from '@/models/library'; +import { ConstituentaID, CstType, IConstituenta, IRSForm, IRSFormStats } from '@/models/rsform'; +import { inferClass, inferStatus, inferTemplate, isBaseSet, isFunctional } from '@/models/rsformAPI'; +import { ParsingStatus, ValueClass } from '@/models/rslang'; +import { extractGlobals, isSimpleExpression, splitTemplateDefinition } from '@/models/rslangAPI'; + +import { IRSFormDTO } from './api'; /** - * Loads data into an {@link IRSForm} based on {@link IRSFormData}. + * Loads data into an {@link IRSForm} based on {@link IRSFormDTO}. * * @remarks * This function processes the provided input, initializes the IRSForm, and calculates statistics * based on the loaded data. It also establishes dependencies between concepts in the graph. */ export class RSFormLoader { - private schema: IRSFormData; + private schema: IRSFormDTO; private graph: Graph = new Graph(); private cstByAlias = new Map(); private cstByID = new Map(); - constructor(input: IRSFormData) { + constructor(input: IRSFormDTO) { this.schema = input; } @@ -159,7 +161,8 @@ export class RSFormLoader { } else if (sources.size !== 1) { return false; } else { - const base = this.cstByID.get(sources.values().next().value!)!; + const cstID = sources.values().next().value!; + const base = this.cstByID.get(cstID)!; return !isFunctional(base.cst_type) || splitTemplateDefinition(base.definition_formal).head !== expression.head; } }; diff --git a/rsconcept/frontend/src/backend/rsform/api.ts b/rsconcept/frontend/src/backend/rsform/api.ts index 5b4d9d89..f21986ad 100644 --- a/rsconcept/frontend/src/backend/rsform/api.ts +++ b/rsconcept/frontend/src/backend/rsform/api.ts @@ -2,20 +2,42 @@ import { queryOptions } from '@tanstack/react-query'; import { axiosDelete, axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport'; import { DELAYS } from '@/backend/configuration'; -import { LibraryItemID, VersionID } from '@/models/library'; +import { ILibraryItemReference, ILibraryItemVersioned, LibraryItemID, VersionID } from '@/models/library'; import { ICstSubstitute, ICstSubstitutions } from '@/models/oss'; import { ConstituentaID, CstType, IConstituentaList, IConstituentaMeta, - IRSFormData, + IInheritanceInfo, ITargetCst, TermForm } from '@/models/rsform'; -import { IExpressionParse } from '@/models/rslang'; +import { IArgumentInfo, IExpressionParse, ParsingStatus, ValueClass } from '@/models/rslang'; import { information } from '@/utils/labels'; +/** + * Represents {@link IConstituenta} data from server. + */ +export interface IConstituentaDTO extends IConstituentaMeta { + parse: { + status: ParsingStatus; + valueClass: ValueClass; + typification: string; + syntaxTree: string; + args: IArgumentInfo[]; + }; +} + +/** + * Represents data for {@link IRSForm} provided by backend. + */ +export interface IRSFormDTO extends ILibraryItemVersioned { + items: IConstituentaDTO[]; + inheritance: IInheritanceInfo[]; + oss: ILibraryItemReference[]; +} + /** * Represents data, used for uploading {@link IRSForm} as file. */ @@ -46,7 +68,7 @@ export interface ICstCreateDTO { */ export interface ICstCreatedResponse { new_cst: IConstituentaMeta; - schema: IRSFormData; + schema: IRSFormDTO; } /** @@ -85,7 +107,7 @@ export interface ICstMoveDTO { */ export interface IProduceStructureResponse { cst_list: ConstituentaID[]; - schema: IRSFormData; + schema: IRSFormDTO; } /** @@ -117,7 +139,7 @@ export const rsformsApi = { queryFn: meta => !itemID ? undefined - : axiosGet({ + : axiosGet({ endpoint: version ? `/api/library/${itemID}/versions/${version}` : `/api/rsforms/${itemID}/details`, options: { signal: meta.signal } }) @@ -130,7 +152,7 @@ export const rsformsApi = { options: { responseType: 'blob' } }), upload: (data: IRSFormUploadDTO) => - axiosPatch({ + axiosPatch({ endpoint: `/api/rsforms/${data.itemID}/load-trs`, request: { data: data, @@ -160,7 +182,7 @@ export const rsformsApi = { } }), cstDelete: ({ itemID, data }: { itemID: LibraryItemID; data: IConstituentaList }) => - axiosDelete({ + axiosDelete({ endpoint: `/api/rsforms/${itemID}/delete-multiple-cst`, request: { data: data, @@ -176,7 +198,7 @@ export const rsformsApi = { } }), cstSubstitute: ({ itemID, data }: { itemID: LibraryItemID; data: ICstSubstitutions }) => - axiosPatch({ + axiosPatch({ endpoint: `/api/rsforms/${itemID}/substitute`, request: { data: data, @@ -184,7 +206,7 @@ export const rsformsApi = { } }), cstMove: ({ itemID, data }: { itemID: LibraryItemID; data: ICstMoveDTO }) => - axiosPatch({ + axiosPatch({ endpoint: `/api/rsforms/${itemID}/move-cst`, request: { data: data } }), @@ -198,7 +220,7 @@ export const rsformsApi = { } }), inlineSynthesis: ({ itemID, data }: { itemID: LibraryItemID; data: IInlineSynthesisDTO }) => - axiosPost({ + axiosPost({ endpoint: `/api/rsforms/${itemID}/inline-synthesis`, request: { data: data, @@ -206,12 +228,12 @@ export const rsformsApi = { } }), restoreOrder: ({ itemID }: { itemID: LibraryItemID }) => - axiosPatch({ + axiosPatch({ endpoint: `/api/rsforms/${itemID}/restore-order`, request: { successMessage: information.reorderComplete } }), resetAliases: ({ itemID }: { itemID: LibraryItemID }) => - axiosPatch({ + axiosPatch({ endpoint: `/api/rsforms/${itemID}/reset-aliases`, request: { successMessage: information.reindexComplete } }), diff --git a/rsconcept/frontend/src/backend/rsform/useInlineSynthesis.tsx b/rsconcept/frontend/src/backend/rsform/useInlineSynthesis.tsx index 4cb68644..69286841 100644 --- a/rsconcept/frontend/src/backend/rsform/useInlineSynthesis.tsx +++ b/rsconcept/frontend/src/backend/rsform/useInlineSynthesis.tsx @@ -4,9 +4,8 @@ import { DataCallback } from '@/backend/apiTransport'; import { useUpdateTimestamp } from '@/backend/library/useUpdateTimestamp'; import { ossApi } from '@/backend/oss/api'; import { LibraryItemID } from '@/models/library'; -import { IRSFormData } from '@/models/rsform'; -import { IInlineSynthesisDTO, rsformsApi } from './api'; +import { IInlineSynthesisDTO, IRSFormDTO, rsformsApi } from './api'; export const useInlineSynthesis = () => { const client = useQueryClient(); @@ -33,7 +32,7 @@ export const useInlineSynthesis = () => { itemID: LibraryItemID; // data: IInlineSynthesisDTO; }, - onSuccess?: DataCallback + onSuccess?: DataCallback ) => mutation.mutate(data, { onSuccess }) }; }; diff --git a/rsconcept/frontend/src/backend/rsform/useRSForm.tsx b/rsconcept/frontend/src/backend/rsform/useRSForm.tsx index ea7d03a0..b3313fae 100644 --- a/rsconcept/frontend/src/backend/rsform/useRSForm.tsx +++ b/rsconcept/frontend/src/backend/rsform/useRSForm.tsx @@ -1,7 +1,7 @@ import { useQuery, useSuspenseQuery } from '@tanstack/react-query'; import { LibraryItemID, VersionID } from '@/models/library'; -import { RSFormLoader } from '@/models/RSFormLoader'; +import { RSFormLoader } from '@/backend/rsform/RSFormLoader'; import { queryClient } from '../queryClient'; import { rsformsApi } from './api'; diff --git a/rsconcept/frontend/src/backend/rsform/useRSForms.tsx b/rsconcept/frontend/src/backend/rsform/useRSForms.tsx index deb6804f..b93387f2 100644 --- a/rsconcept/frontend/src/backend/rsform/useRSForms.tsx +++ b/rsconcept/frontend/src/backend/rsform/useRSForms.tsx @@ -1,7 +1,7 @@ import { useQueries } from '@tanstack/react-query'; import { LibraryItemID } from '@/models/library'; -import { RSFormLoader } from '@/models/RSFormLoader'; +import { RSFormLoader } from '@/backend/rsform/RSFormLoader'; import { DELAYS } from '../configuration'; import { rsformsApi } from './api'; diff --git a/rsconcept/frontend/src/dialogs/DlgEditWordForms/DlgEditWordForms.tsx b/rsconcept/frontend/src/dialogs/DlgEditWordForms/DlgEditWordForms.tsx index cbc84da2..c0261808 100644 --- a/rsconcept/frontend/src/dialogs/DlgEditWordForms/DlgEditWordForms.tsx +++ b/rsconcept/frontend/src/dialogs/DlgEditWordForms/DlgEditWordForms.tsx @@ -13,7 +13,7 @@ import Label from '@/components/ui/Label'; import MiniButton from '@/components/ui/MiniButton'; import Modal from '@/components/ui/Modal'; import TextArea from '@/components/ui/TextArea'; -import { Grammeme, IWordForm, IWordFormPlain } from '@/models/language'; +import { Grammeme, IWordForm } from '@/models/language'; import { parseGrammemes, wordFormEquals } from '@/models/languageAPI'; import { HelpTopic } from '@/models/miscellaneous'; import { IConstituenta, TermForm } from '@/models/rsform'; @@ -79,11 +79,13 @@ function DlgEditWordForms() { } function handleInflect() { - const data: IWordFormPlain = { - text: term, - grams: inputGrams.map(gram => gram.value).join(',') - }; - inflectText(data, response => setInputText(response.result)); + inflectText( + { + text: term, + grams: inputGrams.map(gram => gram.value).join(',') + }, + response => setInputText(response.result) + ); } function handleParse() { diff --git a/rsconcept/frontend/src/models/language.ts b/rsconcept/frontend/src/models/language.ts index 09c706b2..7dbc3811 100644 --- a/rsconcept/frontend/src/models/language.ts +++ b/rsconcept/frontend/src/models/language.ts @@ -214,21 +214,6 @@ export interface IWordForm { grams: GramData[]; } -/** - * Represents wordform data used for backend communication. - */ -export interface IWordFormPlain { - text: string; - grams: string; -} - -/** - * Represents lexeme response containing multiple {@link Wordform}s. - */ -export interface ILexemeData { - items: IWordFormPlain[]; -} - // ====== Reference resolution ===== /** @@ -270,11 +255,3 @@ export interface IReference { type: ReferenceType; data: IEntityReference | ISyntacticReference; } - -/** - * Represents single resolved reference data. - */ -export interface IResolvedReference extends IReference { - pos_input: ITextPosition; - pos_output: ITextPosition; -} diff --git a/rsconcept/frontend/src/models/oss.ts b/rsconcept/frontend/src/models/oss.ts index 6f1100f6..f17e9491 100644 --- a/rsconcept/frontend/src/models/oss.ts +++ b/rsconcept/frontend/src/models/oss.ts @@ -42,11 +42,6 @@ export interface IOperation { arguments: OperationID[]; } -/** - * Represents {@link IOperation} data from server. - */ -export interface IOperationData extends Omit {} - /** * Represents {@link IOperation} position. */ @@ -115,20 +110,14 @@ export interface IOperationSchemaStats { count_owned: number; } -/** - * Represents backend data for {@link IOperationSchema}. - */ -export interface IOperationSchemaData extends ILibraryItemData { - items: IOperationData[]; - arguments: IArgument[]; - substitutions: ICstSubstituteEx[]; -} - /** * Represents OperationSchema. */ -export interface IOperationSchema extends IOperationSchemaData { +export interface IOperationSchema extends ILibraryItemData { items: IOperation[]; + arguments: IArgument[]; + substitutions: ICstSubstituteEx[]; + graph: Graph; schemas: LibraryItemID[]; stats: IOperationSchemaStats; diff --git a/rsconcept/frontend/src/models/ossAPI.ts b/rsconcept/frontend/src/models/ossAPI.ts index 24e4f30b..3047b505 100644 --- a/rsconcept/frontend/src/models/ossAPI.ts +++ b/rsconcept/frontend/src/models/ossAPI.ts @@ -2,6 +2,7 @@ * Module: API for OperationSystem. */ +import { ConstituentaID, CstClass, CstType, IConstituenta, IRSForm } from '@/models/rsform'; import { limits } from '@/utils/constants'; import { describeSubstitutionError, information } from '@/utils/labels'; import { TextMatcher } from '@/utils/utils'; @@ -9,7 +10,6 @@ import { TextMatcher } from '@/utils/utils'; import { Graph } from './Graph'; import { ILibraryItem, LibraryItemID } from './library'; import { ICstSubstitute, IOperation, IOperationSchema, OperationID, SubstitutionErrorType } from './oss'; -import { ConstituentaID, CstClass, CstType, IConstituenta, IRSForm } from './rsform'; import { AliasMapping, ParsingStatus } from './rslang'; import { applyAliasMapping, applyTypificationMapping, extractGlobals, isSetTypification } from './rslangAPI'; @@ -49,7 +49,6 @@ export function sortItemsForOSS(oss: IOperationSchema, items: ILibraryItem[]): I type CrossMapping = Map; -// TODO: test validator /** * Validator for Substitution table. */ @@ -459,7 +458,6 @@ export function getRelocateCandidates( const original = oss.substitutions.find(sub => sub.substitution === parent)?.original; if (original) { continue; - // TODO: test if original schema is destination schema } } unreachableBases.push(cst.id); diff --git a/rsconcept/frontend/src/models/rsform.ts b/rsconcept/frontend/src/models/rsform.ts index 5abb8f3d..e27963ba 100644 --- a/rsconcept/frontend/src/models/rsform.ts +++ b/rsconcept/frontend/src/models/rsform.ts @@ -83,9 +83,9 @@ export interface ITargetCst { } /** - * Represents {@link IConstituenta} data from server. + * Represents Constituenta. */ -export interface IConstituentaData extends IConstituentaMeta { +export interface IConstituenta extends IConstituentaMeta { parse: { status: ParsingStatus; valueClass: ValueClass; @@ -93,12 +93,7 @@ export interface IConstituentaData extends IConstituentaMeta { syntaxTree: string; args: IArgumentInfo[]; }; -} -/** - * Represents Constituenta. - */ -export interface IConstituenta extends IConstituentaData { /** {@link LibraryItemID} of this {@link IConstituenta}. */ schema: LibraryItemID; @@ -172,27 +167,21 @@ export interface IRSFormStats { /** * Represents inheritance data for {@link IRSForm}. */ -export interface IInheritanceData { +export interface IInheritanceInfo { child: ConstituentaID; child_source: LibraryItemID; parent: ConstituentaID; parent_source: LibraryItemID; } -/** - * Represents data for {@link IRSForm} provided by backend. - */ -export interface IRSFormData extends ILibraryItemVersioned { - items: IConstituentaData[]; - inheritance: IInheritanceData[]; - oss: ILibraryItemReference[]; -} - /** * Represents formal explication for set of concepts. */ -export interface IRSForm extends IRSFormData { +export interface IRSForm extends ILibraryItemVersioned { items: IConstituenta[]; + inheritance: IInheritanceInfo[]; + oss: ILibraryItemReference[]; + stats: IRSFormStats; graph: Graph; cstByAlias: Map;