2025-01-27 15:03:48 +03:00
|
|
|
import { queryOptions } from '@tanstack/react-query';
|
2025-02-05 15:55:56 +03:00
|
|
|
import { z } from 'zod';
|
2025-01-27 15:03:48 +03:00
|
|
|
|
2025-02-05 12:43:16 +03:00
|
|
|
import { axiosGet, axiosPatch, axiosPost } from '@/backend/apiTransport';
|
2025-01-27 15:03:48 +03:00
|
|
|
import { DELAYS } from '@/backend/configuration';
|
2025-02-10 01:32:55 +03:00
|
|
|
import {
|
|
|
|
ILibraryItemReference,
|
|
|
|
ILibraryItemVersioned,
|
|
|
|
LibraryItemID,
|
|
|
|
VersionID
|
|
|
|
} from '@/features/library/models/library';
|
2025-02-12 02:12:08 +03:00
|
|
|
import { errorMsg, infoMsg } from '@/utils/labels';
|
2025-02-10 01:32:55 +03:00
|
|
|
|
2025-01-27 15:03:48 +03:00
|
|
|
import {
|
|
|
|
ConstituentaID,
|
|
|
|
CstType,
|
|
|
|
IConstituentaList,
|
|
|
|
IConstituentaMeta,
|
2025-01-30 19:55:38 +03:00
|
|
|
IInheritanceInfo,
|
2025-01-27 15:03:48 +03:00
|
|
|
ITargetCst,
|
|
|
|
TermForm
|
2025-02-10 01:32:55 +03:00
|
|
|
} from '../models/rsform';
|
|
|
|
import { IArgumentInfo, IExpressionParse, ParsingStatus, ValueClass } from '../models/rslang';
|
2025-01-27 15:03:48 +03:00
|
|
|
|
2025-01-30 19:55:38 +03:00
|
|
|
/**
|
|
|
|
* 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[];
|
|
|
|
}
|
|
|
|
|
2025-01-27 15:03:48 +03:00
|
|
|
/**
|
|
|
|
* Represents data, used for uploading {@link IRSForm} as file.
|
|
|
|
*/
|
|
|
|
export interface IRSFormUploadDTO {
|
|
|
|
itemID: LibraryItemID;
|
|
|
|
load_metadata: boolean;
|
|
|
|
file: File;
|
|
|
|
fileName: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents {@link IConstituenta} data, used in creation process.
|
|
|
|
*/
|
|
|
|
export interface ICstCreateDTO {
|
|
|
|
alias: string;
|
|
|
|
cst_type: CstType;
|
|
|
|
definition_raw: string;
|
|
|
|
term_raw: string;
|
|
|
|
convention: string;
|
|
|
|
definition_formal: string;
|
|
|
|
term_forms: TermForm[];
|
|
|
|
|
|
|
|
insert_after: ConstituentaID | null;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data response when creating {@link IConstituenta}.
|
|
|
|
*/
|
|
|
|
export interface ICstCreatedResponse {
|
|
|
|
new_cst: IConstituentaMeta;
|
2025-01-30 19:55:38 +03:00
|
|
|
schema: IRSFormDTO;
|
2025-01-27 15:03:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used in updating persistent attributes in {@link IConstituenta}.
|
|
|
|
*/
|
2025-02-10 14:11:28 +03:00
|
|
|
export const schemaCstUpdate = z.object({
|
2025-02-05 15:55:56 +03:00
|
|
|
target: z.number(),
|
|
|
|
item_data: z.object({
|
|
|
|
convention: z.string().optional(),
|
|
|
|
definition_formal: z.string().optional(),
|
|
|
|
definition_raw: z.string().optional(),
|
|
|
|
term_raw: z.string().optional(),
|
|
|
|
term_forms: z.array(z.object({ text: z.string(), tags: z.string() })).optional()
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used in updating persistent attributes in {@link IConstituenta}.
|
|
|
|
*/
|
2025-02-10 14:11:28 +03:00
|
|
|
export type ICstUpdateDTO = z.infer<typeof schemaCstUpdate>;
|
2025-01-27 15:03:48 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used in renaming {@link IConstituenta}.
|
|
|
|
*/
|
2025-02-10 14:11:28 +03:00
|
|
|
export const schemaCstRename = z.object({
|
2025-02-07 20:45:32 +03:00
|
|
|
target: z.number(),
|
|
|
|
alias: z.string(),
|
|
|
|
cst_type: z.nativeEnum(CstType)
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used in renaming {@link IConstituenta}.
|
|
|
|
*/
|
2025-02-10 14:11:28 +03:00
|
|
|
export type ICstRenameDTO = z.infer<typeof schemaCstRename>;
|
2025-01-27 15:03:48 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used in ordering a list of {@link IConstituenta}.
|
|
|
|
*/
|
|
|
|
export interface ICstMoveDTO {
|
|
|
|
items: ConstituentaID[];
|
|
|
|
move_to: number; // Note: 0-base index
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data response when creating producing structure of {@link IConstituenta}.
|
|
|
|
*/
|
|
|
|
export interface IProduceStructureResponse {
|
|
|
|
cst_list: ConstituentaID[];
|
2025-01-30 19:55:38 +03:00
|
|
|
schema: IRSFormDTO;
|
2025-01-27 15:03:48 +03:00
|
|
|
}
|
|
|
|
|
2025-02-12 02:12:08 +03:00
|
|
|
/**
|
|
|
|
* Represents data, used in merging single {@link IConstituenta}.
|
|
|
|
*/
|
|
|
|
export const schemaCstSubstitute = z.object({
|
|
|
|
original: z.number(),
|
|
|
|
substitution: z.number()
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used in merging single {@link IConstituenta}.
|
|
|
|
*/
|
|
|
|
export type ICstSubstitute = z.infer<typeof schemaCstSubstitute>;
|
|
|
|
|
2025-01-27 15:03:48 +03:00
|
|
|
/**
|
|
|
|
* Represents input data for inline synthesis.
|
|
|
|
*/
|
2025-02-12 12:21:19 +03:00
|
|
|
export const schemaInlineSynthesis = z.object({
|
|
|
|
receiver: z.number(),
|
|
|
|
source: z.number().nullable(),
|
|
|
|
items: z.array(z.number()),
|
|
|
|
substitutions: z.array(schemaCstSubstitute)
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents input data for inline synthesis.
|
|
|
|
*/
|
|
|
|
export type IInlineSynthesisDTO = z.infer<typeof schemaInlineSynthesis>;
|
2025-01-27 15:03:48 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents {@link IConstituenta} data, used for checking expression.
|
|
|
|
*/
|
|
|
|
export interface ICheckConstituentaDTO {
|
|
|
|
alias: string;
|
|
|
|
cst_type: CstType;
|
|
|
|
definition_formal: string;
|
|
|
|
}
|
|
|
|
|
2025-02-12 02:12:08 +03:00
|
|
|
/**
|
|
|
|
* Represents data, used in renaming {@link IConstituenta}.
|
|
|
|
*/
|
|
|
|
export const schemaCstSubstitutions = z.object({
|
|
|
|
substitutions: z.array(schemaCstSubstitute).min(1, { message: errorMsg.emptySubstitutions })
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Represents data, used in merging multiple {@link IConstituenta}.
|
|
|
|
*/
|
|
|
|
export type ICstSubstitutionsDTO = z.infer<typeof schemaCstSubstitutions>;
|
|
|
|
|
2025-01-27 15:03:48 +03:00
|
|
|
export const rsformsApi = {
|
|
|
|
baseKey: 'rsform',
|
|
|
|
|
|
|
|
getRSFormQueryOptions: ({ itemID, version }: { itemID?: LibraryItemID; version?: VersionID }) => {
|
|
|
|
return queryOptions({
|
|
|
|
queryKey: [rsformsApi.baseKey, 'item', itemID, version ?? ''],
|
|
|
|
staleTime: DELAYS.staleShort,
|
|
|
|
queryFn: meta =>
|
|
|
|
!itemID
|
|
|
|
? undefined
|
2025-01-30 19:55:38 +03:00
|
|
|
: axiosGet<IRSFormDTO>({
|
2025-01-28 19:47:24 +03:00
|
|
|
endpoint: version ? `/api/library/${itemID}/versions/${version}` : `/api/rsforms/${itemID}/details`,
|
|
|
|
options: { signal: meta.signal }
|
|
|
|
})
|
2025-01-27 15:03:48 +03:00
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
download: ({ itemID, version }: { itemID: LibraryItemID; version?: VersionID }) =>
|
2025-01-28 19:47:24 +03:00
|
|
|
axiosGet<Blob>({
|
|
|
|
endpoint: version ? `/api/versions/${version}/export-file` : `/api/rsforms/${itemID}/export-trs`,
|
|
|
|
options: { responseType: 'blob' }
|
|
|
|
}),
|
2025-01-27 15:03:48 +03:00
|
|
|
upload: (data: IRSFormUploadDTO) =>
|
2025-01-30 19:55:38 +03:00
|
|
|
axiosPatch<IRSFormUploadDTO, IRSFormDTO>({
|
2025-01-28 19:47:24 +03:00
|
|
|
endpoint: `/api/rsforms/${data.itemID}/load-trs`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
2025-02-12 01:35:41 +03:00
|
|
|
successMessage: infoMsg.uploadSuccess
|
2025-01-28 19:47:24 +03:00
|
|
|
},
|
|
|
|
options: {
|
2025-01-27 15:03:48 +03:00
|
|
|
headers: {
|
|
|
|
'Content-Type': 'multipart/form-data'
|
|
|
|
}
|
2025-01-28 19:47:24 +03:00
|
|
|
}
|
|
|
|
}),
|
2025-01-27 15:03:48 +03:00
|
|
|
|
|
|
|
cstCreate: ({ itemID, data }: { itemID: LibraryItemID; data: ICstCreateDTO }) =>
|
2025-01-28 19:47:24 +03:00
|
|
|
axiosPost<ICstCreateDTO, ICstCreatedResponse>({
|
|
|
|
endpoint: `/api/rsforms/${itemID}/create-cst`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
2025-02-12 01:35:41 +03:00
|
|
|
successMessage: response => infoMsg.newConstituent(response.new_cst.alias)
|
2025-01-28 19:47:24 +03:00
|
|
|
}
|
|
|
|
}),
|
2025-01-27 15:03:48 +03:00
|
|
|
cstUpdate: ({ itemID, data }: { itemID: LibraryItemID; data: ICstUpdateDTO }) =>
|
2025-01-28 19:47:24 +03:00
|
|
|
axiosPatch<ICstUpdateDTO, IConstituentaMeta>({
|
|
|
|
endpoint: `/api/rsforms/${itemID}/update-cst`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
2025-02-12 01:35:41 +03:00
|
|
|
successMessage: infoMsg.changesSaved
|
2025-01-28 19:47:24 +03:00
|
|
|
}
|
|
|
|
}),
|
2025-01-27 15:03:48 +03:00
|
|
|
cstDelete: ({ itemID, data }: { itemID: LibraryItemID; data: IConstituentaList }) =>
|
2025-02-05 12:43:16 +03:00
|
|
|
axiosPatch<IConstituentaList, IRSFormDTO>({
|
2025-01-28 19:47:24 +03:00
|
|
|
endpoint: `/api/rsforms/${itemID}/delete-multiple-cst`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
2025-02-12 01:35:41 +03:00
|
|
|
successMessage: infoMsg.constituentsDestroyed(data.items.length)
|
2025-01-28 19:47:24 +03:00
|
|
|
}
|
|
|
|
}),
|
2025-01-27 15:03:48 +03:00
|
|
|
cstRename: ({ itemID, data }: { itemID: LibraryItemID; data: ICstRenameDTO }) =>
|
2025-01-28 19:47:24 +03:00
|
|
|
axiosPatch<ICstRenameDTO, ICstCreatedResponse>({
|
|
|
|
endpoint: `/api/rsforms/${itemID}/rename-cst`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
2025-02-12 01:35:41 +03:00
|
|
|
successMessage: infoMsg.changesSaved
|
2025-01-28 19:47:24 +03:00
|
|
|
}
|
|
|
|
}),
|
2025-02-12 02:12:08 +03:00
|
|
|
cstSubstitute: ({ itemID, data }: { itemID: LibraryItemID; data: ICstSubstitutionsDTO }) =>
|
|
|
|
axiosPatch<ICstSubstitutionsDTO, IRSFormDTO>({
|
2025-01-28 19:47:24 +03:00
|
|
|
endpoint: `/api/rsforms/${itemID}/substitute`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
2025-02-12 01:35:41 +03:00
|
|
|
successMessage: infoMsg.substituteSingle
|
2025-01-28 19:47:24 +03:00
|
|
|
}
|
|
|
|
}),
|
2025-01-27 15:03:48 +03:00
|
|
|
cstMove: ({ itemID, data }: { itemID: LibraryItemID; data: ICstMoveDTO }) =>
|
2025-01-30 19:55:38 +03:00
|
|
|
axiosPatch<ICstMoveDTO, IRSFormDTO>({
|
2025-01-28 19:47:24 +03:00
|
|
|
endpoint: `/api/rsforms/${itemID}/move-cst`,
|
|
|
|
request: { data: data }
|
|
|
|
}),
|
2025-01-27 15:03:48 +03:00
|
|
|
|
|
|
|
produceStructure: ({ itemID, data }: { itemID: LibraryItemID; data: ITargetCst }) =>
|
2025-02-12 02:12:08 +03:00
|
|
|
axiosPatch<ITargetCst, IProduceStructureResponse>({
|
2025-01-28 19:47:24 +03:00
|
|
|
endpoint: `/api/rsforms/${itemID}/produce-structure`,
|
|
|
|
request: {
|
|
|
|
data: data,
|
2025-02-12 01:35:41 +03:00
|
|
|
successMessage: response => infoMsg.addedConstituents(response.cst_list.length)
|
2025-01-28 19:47:24 +03:00
|
|
|
}
|
|
|
|
}),
|
2025-02-12 12:21:19 +03:00
|
|
|
inlineSynthesis: (data: IInlineSynthesisDTO) =>
|
|
|
|
axiosPatch<IInlineSynthesisDTO, IRSFormDTO>({
|
|
|
|
endpoint: `/api/rsforms/inline-synthesis`,
|
2025-01-28 19:47:24 +03:00
|
|
|
request: {
|
|
|
|
data: data,
|
2025-02-12 01:35:41 +03:00
|
|
|
successMessage: infoMsg.inlineSynthesisComplete
|
2025-01-28 19:47:24 +03:00
|
|
|
}
|
|
|
|
}),
|
|
|
|
restoreOrder: ({ itemID }: { itemID: LibraryItemID }) =>
|
2025-01-30 19:55:38 +03:00
|
|
|
axiosPatch<undefined, IRSFormDTO>({
|
2025-01-28 19:47:24 +03:00
|
|
|
endpoint: `/api/rsforms/${itemID}/restore-order`,
|
2025-02-12 01:35:41 +03:00
|
|
|
request: { successMessage: infoMsg.reorderComplete }
|
2025-01-28 19:47:24 +03:00
|
|
|
}),
|
|
|
|
resetAliases: ({ itemID }: { itemID: LibraryItemID }) =>
|
2025-01-30 19:55:38 +03:00
|
|
|
axiosPatch<undefined, IRSFormDTO>({
|
2025-01-28 19:47:24 +03:00
|
|
|
endpoint: `/api/rsforms/${itemID}/reset-aliases`,
|
2025-02-12 01:35:41 +03:00
|
|
|
request: { successMessage: infoMsg.reindexComplete }
|
2025-01-28 19:47:24 +03:00
|
|
|
}),
|
2025-01-27 15:03:48 +03:00
|
|
|
|
|
|
|
checkConstituenta: ({ itemID, data }: { itemID: LibraryItemID; data: ICheckConstituentaDTO }) =>
|
2025-01-28 19:47:24 +03:00
|
|
|
axiosPost<ICheckConstituentaDTO, IExpressionParse>({
|
|
|
|
endpoint: `/api/rsforms/${itemID}/check-constituenta`,
|
|
|
|
request: { data: data }
|
|
|
|
})
|
2025-01-27 15:03:48 +03:00
|
|
|
};
|