ConceptPortal-public/rsconcept/frontend/src/context/RSFormContext.tsx

647 lines
18 KiB
TypeScript
Raw Normal View History

'use client';
import { createContext, useCallback, useContext, useMemo, useState } from 'react';
2023-07-25 20:27:29 +03:00
import { DataCallback } from '@/backend/apiTransport';
import { patchConstituenta } from '@/backend/constituents';
2023-07-25 20:27:29 +03:00
import {
2023-12-28 14:04:44 +03:00
deleteUnsubscribe,
patchEditorsSet,
patchLibraryItem,
patchSetAccessPolicy,
patchSetLocation,
patchSetOwner,
postSubscribe
} from '@/backend/library';
import { patchInlineSynthesis } from '@/backend/operations';
import {
getTRSFile,
2023-12-28 14:04:44 +03:00
patchDeleteConstituenta,
patchMoveConstituenta,
2024-03-15 12:34:41 +03:00
patchProduceStructure,
2023-12-28 14:04:44 +03:00
patchRenameConstituenta,
patchResetAliases,
2024-04-24 10:27:17 +03:00
patchRestoreOrder,
patchSubstituteConstituents,
2023-12-28 14:04:44 +03:00
patchUploadTRS,
2024-07-21 15:19:57 +03:00
postCreateConstituenta,
postCreateVersion
} from '@/backend/rsforms';
import { deleteVersion, patchRestoreVersion, patchVersion } from '@/backend/versions';
2024-04-24 10:27:17 +03:00
import { type ErrorData } from '@/components/info/InfoError';
import useRSFormDetails from '@/hooks/useRSFormDetails';
import { AccessPolicy, ILibraryItem, IVersionData, VersionID } from '@/models/library';
2024-04-24 10:27:17 +03:00
import { ILibraryUpdateData } from '@/models/library';
2024-07-21 15:19:57 +03:00
import { ICstSubstituteData } from '@/models/oss';
2024-04-24 10:27:17 +03:00
import {
ConstituentaID,
IConstituentaList,
IConstituentaMeta,
ICstCreateData,
ICstMovetoData,
ICstRenameData,
ICstUpdateData,
IInlineSynthesisData,
IRSForm,
IRSFormData,
IRSFormUploadData,
ITargetCst
2024-04-24 10:27:17 +03:00
} from '@/models/rsform';
2024-05-27 20:42:34 +03:00
import { UserID } from '@/models/user';
import { contextOutsideScope } from '@/utils/labels';
import { useAuth } from './AuthContext';
import { useLibrary } from './LibraryContext';
2023-07-15 17:46:19 +03:00
interface IRSFormContext {
2023-12-28 14:04:44 +03:00
schema?: IRSForm;
2024-06-04 23:00:22 +03:00
itemID: string;
2024-05-18 19:22:26 +03:00
versionID?: string;
2023-12-28 14:04:44 +03:00
loading: boolean;
errorLoading: ErrorData;
2023-12-28 14:04:44 +03:00
processing: boolean;
processingError: ErrorData;
2024-03-04 19:22:22 +03:00
isArchive: boolean;
2023-12-28 14:04:44 +03:00
isOwned: boolean;
isSubscribed: boolean;
2023-12-28 14:04:44 +03:00
update: (data: ILibraryUpdateData, callback?: DataCallback<ILibraryItem>) => void;
download: (callback: DataCallback<Blob>) => void;
upload: (data: IRSFormUploadData, callback: () => void) => void;
2024-05-27 20:42:34 +03:00
subscribe: (callback?: () => void) => void;
unsubscribe: (callback?: () => void) => void;
setOwner: (newOwner: UserID, callback?: () => void) => void;
setAccessPolicy: (newPolicy: AccessPolicy, callback?: () => void) => void;
setLocation: (newLocation: string, callback?: () => void) => void;
2024-05-27 20:42:34 +03:00
setEditors: (newEditors: UserID[], callback?: () => void) => void;
2023-12-28 14:04:44 +03:00
resetAliases: (callback: () => void) => void;
2024-04-24 10:27:17 +03:00
restoreOrder: (callback: () => void) => void;
produceStructure: (data: ITargetCst, callback?: DataCallback<ConstituentaID[]>) => void;
inlineSynthesis: (data: IInlineSynthesisData, callback?: DataCallback<IRSFormData>) => void;
2023-12-28 14:04:44 +03:00
cstCreate: (data: ICstCreateData, callback?: DataCallback<IConstituentaMeta>) => void;
cstRename: (data: ICstRenameData, callback?: DataCallback<IConstituentaMeta>) => void;
cstSubstitute: (data: ICstSubstituteData, callback?: () => void) => void;
2023-12-28 14:04:44 +03:00
cstUpdate: (data: ICstUpdateData, callback?: DataCallback<IConstituentaMeta>) => void;
cstDelete: (data: IConstituentaList, callback?: () => void) => void;
cstMoveTo: (data: ICstMovetoData, callback?: () => void) => void;
2024-03-04 19:22:22 +03:00
2024-05-27 20:42:34 +03:00
versionCreate: (data: IVersionData, callback?: (version: VersionID) => void) => void;
versionUpdate: (target: VersionID, data: IVersionData, callback?: () => void) => void;
versionDelete: (target: VersionID, callback?: () => void) => void;
2024-05-18 19:22:26 +03:00
versionRestore: (target: string, callback?: () => void) => void;
2023-07-15 17:46:19 +03:00
}
2023-12-28 14:04:44 +03:00
const RSFormContext = createContext<IRSFormContext | null>(null);
export const useRSForm = () => {
2023-12-28 14:04:44 +03:00
const context = useContext(RSFormContext);
if (context === null) {
throw new Error(contextOutsideScope('useRSForm', 'RSFormState'));
}
return context;
2023-12-28 14:04:44 +03:00
};
2023-07-15 17:46:19 +03:00
interface RSFormStateProps {
2024-06-04 23:00:22 +03:00
itemID: string;
2024-03-04 19:22:22 +03:00
versionID?: string;
2023-12-28 14:04:44 +03:00
children: React.ReactNode;
2023-07-15 17:46:19 +03:00
}
2024-06-04 23:00:22 +03:00
export const RSFormState = ({ itemID, versionID, children }: RSFormStateProps) => {
2023-08-27 15:39:49 +03:00
const library = useLibrary();
2023-08-09 17:19:12 +03:00
const { user } = useAuth();
2024-03-04 19:22:22 +03:00
const {
schema, // prettier: split lines
reload,
error: errorLoading,
2024-03-04 19:22:22 +03:00
setSchema,
loading
} = useRSFormDetails({
2024-06-04 23:00:22 +03:00
target: itemID,
2024-03-04 19:22:22 +03:00
version: versionID
});
const [processing, setProcessing] = useState(false);
const [processingError, setProcessingError] = useState<ErrorData>(undefined);
2023-07-15 17:46:19 +03:00
const [toggleTracking, setToggleTracking] = useState(false);
2023-07-20 17:11:03 +03:00
2023-12-28 14:04:44 +03:00
const isOwned = useMemo(() => {
2023-08-25 22:51:20 +03:00
return user?.id === schema?.owner || false;
}, [user, schema?.owner]);
2024-03-04 19:22:22 +03:00
const isArchive = useMemo(() => !!versionID, [versionID]);
2023-12-28 14:04:44 +03:00
const isSubscribed = useMemo(() => {
2023-08-26 19:39:49 +03:00
if (!user || !schema || !user.id) {
2023-08-26 17:26:49 +03:00
return false;
}
return schema.subscribers.includes(user.id);
2023-12-28 14:04:44 +03:00
// eslint-disable-next-line react-hooks/exhaustive-deps
2023-08-26 17:26:49 +03:00
}, [user, schema, toggleTracking]);
2023-07-20 17:11:03 +03:00
const update = useCallback(
2023-12-28 14:04:44 +03:00
(data: ILibraryUpdateData, callback?: DataCallback<ILibraryItem>) => {
if (!schema) {
return;
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchLibraryItem(itemID, {
2023-12-28 14:04:44 +03:00
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: newData => {
setSchema(Object.assign(schema, newData));
library.localUpdateItem(newData);
if (callback) callback(newData);
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, setSchema, schema, library]
2023-12-28 14:04:44 +03:00
);
2023-07-27 22:04:25 +03:00
const upload = useCallback(
2023-12-28 14:04:44 +03:00
(data: IRSFormUploadData, callback?: () => void) => {
if (!schema) {
return;
2023-07-27 22:04:25 +03:00
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchUploadTRS(itemID, {
2023-12-28 14:04:44 +03:00
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: newData => {
setSchema(newData);
library.localUpdateItem(newData);
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, setSchema, schema, library]
2023-12-28 14:04:44 +03:00
);
2023-07-15 17:46:19 +03:00
2023-12-28 14:04:44 +03:00
const subscribe = useCallback(
(callback?: () => void) => {
if (!schema || !user) {
return;
2023-08-26 17:26:49 +03:00
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
postSubscribe(itemID, {
2023-12-28 14:04:44 +03:00
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: () => {
if (user.id && !schema.subscribers.includes(user.id)) {
schema.subscribers.push(user.id);
}
if (!user.subscriptions.includes(schema.id)) {
user.subscriptions.push(schema.id);
}
setToggleTracking(prev => !prev);
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema, user]
2023-12-28 14:04:44 +03:00
);
2023-08-26 17:26:49 +03:00
const unsubscribe = useCallback(
2023-12-28 14:04:44 +03:00
(callback?: () => void) => {
if (!schema || !user) {
return;
2023-08-26 17:26:49 +03:00
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
deleteUnsubscribe(itemID, {
2023-12-28 14:04:44 +03:00
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: () => {
if (user.id && schema.subscribers.includes(user.id)) {
schema.subscribers.splice(schema.subscribers.indexOf(user.id), 1);
}
if (user.subscriptions.includes(schema.id)) {
user.subscriptions.splice(user.subscriptions.indexOf(schema.id), 1);
}
setToggleTracking(prev => !prev);
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema, user]
2023-12-28 14:04:44 +03:00
);
2023-07-15 17:46:19 +03:00
2024-05-27 20:42:34 +03:00
const setOwner = useCallback(
(newOwner: UserID, callback?: () => void) => {
if (!schema) {
return;
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchSetOwner(itemID, {
2024-05-27 20:42:34 +03:00
data: {
user: newOwner
},
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2024-05-27 20:42:34 +03:00
onSuccess: () => {
schema.owner = newOwner;
library.localUpdateItem(schema);
2024-05-27 20:42:34 +03:00
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema, library]
);
const setAccessPolicy = useCallback(
(newPolicy: AccessPolicy, callback?: () => void) => {
if (!schema) {
return;
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchSetAccessPolicy(itemID, {
data: {
access_policy: newPolicy
},
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
onSuccess: () => {
schema.access_policy = newPolicy;
library.localUpdateItem(schema);
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema, library]
);
const setLocation = useCallback(
(newLocation: string, callback?: () => void) => {
if (!schema) {
return;
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchSetLocation(itemID, {
data: {
location: newLocation
},
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
onSuccess: () => {
schema.location = newLocation;
2024-06-19 22:10:15 +03:00
library.reloadItems(callback);
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema, library]
2024-05-27 20:42:34 +03:00
);
const setEditors = useCallback(
(newEditors: UserID[], callback?: () => void) => {
if (!schema) {
return;
}
setProcessingError(undefined);
patchEditorsSet(itemID, {
2024-05-27 20:42:34 +03:00
data: {
users: newEditors
},
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2024-05-27 20:42:34 +03:00
onSuccess: () => {
schema.editors = newEditors;
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema]
2024-05-27 20:42:34 +03:00
);
2023-07-27 22:04:25 +03:00
const resetAliases = useCallback(
2023-12-28 14:04:44 +03:00
(callback?: () => void) => {
if (!schema || !user) {
return;
2023-07-27 22:04:25 +03:00
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchResetAliases(itemID, {
2023-12-28 14:04:44 +03:00
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: newData => {
2024-06-16 16:00:28 +03:00
setSchema(newData);
2023-12-28 14:04:44 +03:00
library.localUpdateTimestamp(newData.id);
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema, library, user, setSchema]
2023-12-28 14:04:44 +03:00
);
2023-07-27 22:04:25 +03:00
2024-04-24 10:27:17 +03:00
const restoreOrder = useCallback(
(callback?: () => void) => {
if (!schema || !user) {
return;
}
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchRestoreOrder(itemID, {
2024-04-24 10:27:17 +03:00
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2024-04-24 10:27:17 +03:00
onSuccess: newData => {
2024-06-16 16:00:28 +03:00
setSchema(newData);
2024-04-24 10:27:17 +03:00
library.localUpdateTimestamp(newData.id);
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema, library, user, setSchema]
2024-04-24 10:27:17 +03:00
);
2024-03-15 12:34:41 +03:00
const produceStructure = useCallback(
(data: ITargetCst, callback?: DataCallback<ConstituentaID[]>) => {
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchProduceStructure(itemID, {
2024-03-15 12:34:41 +03:00
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2024-03-15 12:34:41 +03:00
onSuccess: newData => {
setSchema(newData.schema);
library.localUpdateTimestamp(newData.schema.id);
if (callback) callback(newData.cst_list);
}
});
},
2024-06-04 23:00:22 +03:00
[setSchema, library, itemID]
2024-03-15 12:34:41 +03:00
);
const download = useCallback(
2023-12-28 14:04:44 +03:00
(callback: DataCallback<Blob>) => {
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
getTRSFile(itemID, String(schema?.version ?? ''), {
2023-12-28 14:04:44 +03:00
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: callback
});
},
2024-06-04 23:00:22 +03:00
[itemID, schema]
2023-12-28 14:04:44 +03:00
);
2023-07-16 22:25:23 +03:00
const cstCreate = useCallback(
2023-12-28 14:04:44 +03:00
(data: ICstCreateData, callback?: DataCallback<IConstituentaMeta>) => {
setProcessingError(undefined);
2024-07-21 15:19:57 +03:00
postCreateConstituenta(itemID, {
2023-12-28 14:04:44 +03:00
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: newData => {
setSchema(newData.schema);
library.localUpdateTimestamp(newData.schema.id);
if (callback) callback(newData.new_cst);
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, library, setSchema]
2023-12-28 14:04:44 +03:00
);
2023-07-18 14:55:40 +03:00
const cstDelete = useCallback(
2023-12-28 14:04:44 +03:00
(data: IConstituentaList, callback?: () => void) => {
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchDeleteConstituenta(itemID, {
2023-12-28 14:04:44 +03:00
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: newData => {
setSchema(newData);
library.localUpdateTimestamp(newData.id);
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, library, setSchema]
2023-12-28 14:04:44 +03:00
);
const cstUpdate = useCallback(
2023-12-28 14:04:44 +03:00
(data: ICstUpdateData, callback?: DataCallback<IConstituentaMeta>) => {
setProcessingError(undefined);
2023-12-28 14:04:44 +03:00
patchConstituenta(String(data.id), {
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: newData =>
reload(setProcessing, () => {
2024-06-04 23:00:22 +03:00
library.localUpdateTimestamp(Number(itemID));
2023-12-28 14:04:44 +03:00
if (callback) callback(newData);
})
});
},
2024-06-04 23:00:22 +03:00
[itemID, library, reload]
2023-12-28 14:04:44 +03:00
);
2023-07-25 20:27:29 +03:00
2023-08-23 01:36:17 +03:00
const cstRename = useCallback(
2023-12-28 14:04:44 +03:00
(data: ICstRenameData, callback?: DataCallback<IConstituentaMeta>) => {
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchRenameConstituenta(itemID, {
2023-12-28 14:04:44 +03:00
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: newData => {
setSchema(newData.schema);
library.localUpdateTimestamp(newData.schema.id);
if (callback) callback(newData.new_cst);
}
});
},
2024-06-04 23:00:22 +03:00
[setSchema, library, itemID]
2023-12-28 14:04:44 +03:00
);
2023-08-23 01:36:17 +03:00
const cstSubstitute = useCallback(
(data: ICstSubstituteData, callback?: () => void) => {
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchSubstituteConstituents(itemID, {
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
onSuccess: newData => {
setSchema(newData);
library.localUpdateTimestamp(newData.id);
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[setSchema, library, itemID]
);
2023-07-25 20:27:29 +03:00
const cstMoveTo = useCallback(
2023-12-28 14:04:44 +03:00
(data: ICstMovetoData, callback?: () => void) => {
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
patchMoveConstituenta(itemID, {
2023-12-28 14:04:44 +03:00
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2023-12-28 14:04:44 +03:00
onSuccess: newData => {
setSchema(newData);
2024-06-04 23:00:22 +03:00
library.localUpdateTimestamp(Number(itemID));
2023-12-28 14:04:44 +03:00
if (callback) callback();
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, library, setSchema]
2023-12-28 14:04:44 +03:00
);
2024-03-04 19:22:22 +03:00
const versionCreate = useCallback(
(data: IVersionData, callback?: (version: number) => void) => {
setProcessingError(undefined);
2024-06-04 23:00:22 +03:00
postCreateVersion(itemID, {
2024-03-04 19:22:22 +03:00
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2024-03-04 19:22:22 +03:00
onSuccess: newData => {
setSchema(newData.schema);
2024-06-04 23:00:22 +03:00
library.localUpdateTimestamp(Number(itemID));
if (callback) callback(newData.version);
2024-03-04 19:22:22 +03:00
}
});
},
2024-06-04 23:00:22 +03:00
[itemID, library, setSchema]
2024-03-04 19:22:22 +03:00
);
const versionUpdate = useCallback(
(target: number, data: IVersionData, callback?: () => void) => {
setProcessingError(undefined);
2024-03-04 19:22:22 +03:00
patchVersion(String(target), {
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2024-03-04 19:22:22 +03:00
onSuccess: () => {
schema!.versions = schema!.versions.map(prev => {
if (prev.id === target) {
prev.description = data.description;
prev.version = data.version;
return prev;
} else {
return prev;
}
});
setSchema(schema);
if (callback) callback();
}
});
},
[schema, setSchema]
2024-03-04 19:22:22 +03:00
);
const versionDelete = useCallback(
(target: number, callback?: () => void) => {
setProcessingError(undefined);
2024-03-04 19:22:22 +03:00
deleteVersion(String(target), {
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2024-03-04 19:22:22 +03:00
onSuccess: () => {
schema!.versions = schema!.versions.filter(prev => prev.id !== target);
setSchema(schema);
if (callback) callback();
}
});
},
[schema, setSchema]
2024-03-04 19:22:22 +03:00
);
2024-05-18 19:22:26 +03:00
const versionRestore = useCallback(
(target: string, callback?: () => void) => {
setProcessingError(undefined);
2024-05-18 19:22:26 +03:00
patchRestoreVersion(target, {
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
2024-06-16 16:00:28 +03:00
onSuccess: newData => {
setSchema(newData);
library.localUpdateItem(newData);
2024-05-18 19:22:26 +03:00
if (callback) callback();
}
});
},
2024-06-16 16:00:28 +03:00
[setSchema, library]
2024-05-18 19:22:26 +03:00
);
const inlineSynthesis = useCallback(
(data: IInlineSynthesisData, callback?: DataCallback<IRSFormData>) => {
setProcessingError(undefined);
patchInlineSynthesis({
data: data,
showError: true,
setLoading: setProcessing,
onError: setProcessingError,
onSuccess: newData => {
setSchema(newData);
2024-06-04 23:00:22 +03:00
library.localUpdateTimestamp(Number(itemID));
if (callback) callback(newData);
}
});
},
2024-06-04 23:00:22 +03:00
[library, itemID, setSchema]
);
2023-07-15 17:46:19 +03:00
return (
2023-12-28 14:04:44 +03:00
<RSFormContext.Provider
value={{
schema,
2024-06-04 23:00:22 +03:00
itemID,
2024-05-18 19:22:26 +03:00
versionID,
2023-12-28 14:04:44 +03:00
loading,
errorLoading,
2023-12-28 14:04:44 +03:00
processing,
processingError,
2023-12-28 14:04:44 +03:00
isOwned,
isSubscribed,
2024-03-04 19:22:22 +03:00
isArchive,
2023-12-28 14:04:44 +03:00
update,
download,
upload,
2024-04-24 10:27:17 +03:00
restoreOrder,
2023-12-28 14:04:44 +03:00
resetAliases,
2024-03-15 12:34:41 +03:00
produceStructure,
inlineSynthesis,
2024-05-27 20:42:34 +03:00
2023-12-28 14:04:44 +03:00
subscribe,
unsubscribe,
2024-05-27 20:42:34 +03:00
setOwner,
setEditors,
setAccessPolicy,
setLocation,
2024-05-27 20:42:34 +03:00
2023-12-28 14:04:44 +03:00
cstUpdate,
cstCreate,
cstRename,
cstSubstitute,
2023-12-28 14:04:44 +03:00
cstDelete,
2024-03-04 19:22:22 +03:00
cstMoveTo,
versionCreate,
versionUpdate,
2024-05-18 19:22:26 +03:00
versionDelete,
versionRestore
2023-12-28 14:04:44 +03:00
}}
>
{children}
</RSFormContext.Provider>
);
};