2024-06-07 20:17:03 +03:00
|
|
|
'use client';
|
|
|
|
|
2025-01-16 16:31:03 +03:00
|
|
|
import { createContext, useCallback, useContext, useEffect, useState } from 'react';
|
2024-06-07 20:17:03 +03:00
|
|
|
import { toast } from 'react-toastify';
|
|
|
|
|
2024-07-24 18:11:28 +03:00
|
|
|
import { urls } from '@/app/urls';
|
2025-01-21 20:33:05 +03:00
|
|
|
import { useAuth } from '@/backend/auth/useAuth';
|
2024-08-17 22:30:49 +03:00
|
|
|
import { useLibrary } from '@/context/LibraryContext';
|
2024-07-24 18:11:28 +03:00
|
|
|
import { useConceptNavigation } from '@/context/NavigationContext';
|
2024-06-07 20:17:03 +03:00
|
|
|
import { useOSS } from '@/context/OssContext';
|
2024-08-05 23:53:07 +03:00
|
|
|
import { AccessPolicy, ILibraryItemEditor, LibraryItemID } from '@/models/library';
|
2024-07-20 18:26:32 +03:00
|
|
|
import { Position2D } from '@/models/miscellaneous';
|
2024-09-19 16:26:49 +03:00
|
|
|
import { calculateInsertPosition } from '@/models/miscellaneousAPI';
|
2024-07-28 21:29:46 +03:00
|
|
|
import {
|
2024-10-23 15:18:46 +03:00
|
|
|
ICstRelocateData,
|
2024-07-28 21:29:46 +03:00
|
|
|
IOperationCreateData,
|
2024-08-15 23:23:10 +03:00
|
|
|
IOperationDeleteData,
|
2024-07-28 21:29:46 +03:00
|
|
|
IOperationPosition,
|
|
|
|
IOperationSchema,
|
|
|
|
IOperationSetInputData,
|
2024-07-29 22:30:24 +03:00
|
|
|
IOperationUpdateData,
|
2024-08-15 23:23:10 +03:00
|
|
|
OperationID,
|
|
|
|
OperationType
|
2024-07-28 21:29:46 +03:00
|
|
|
} from '@/models/oss';
|
2025-01-15 23:03:23 +03:00
|
|
|
import { UserID, UserRole } from '@/models/user';
|
2025-01-16 16:31:03 +03:00
|
|
|
import { useDialogsStore } from '@/stores/dialogs';
|
2025-01-14 21:57:32 +03:00
|
|
|
import { usePreferencesStore } from '@/stores/preferences';
|
2025-01-15 23:03:23 +03:00
|
|
|
import { useRoleStore } from '@/stores/role';
|
2024-08-02 11:17:27 +03:00
|
|
|
import { PARAMETER } from '@/utils/constants';
|
2024-08-17 22:30:49 +03:00
|
|
|
import { errors, information } from '@/utils/labels';
|
2024-06-07 20:17:03 +03:00
|
|
|
|
2024-08-19 19:53:51 +03:00
|
|
|
import { RSTabID } from '../RSFormPage/RSTabs';
|
|
|
|
|
2024-08-02 11:17:27 +03:00
|
|
|
export interface ICreateOperationPrompt {
|
2024-09-16 19:38:24 +03:00
|
|
|
defaultX: number;
|
|
|
|
defaultY: number;
|
2024-08-02 11:17:27 +03:00
|
|
|
inputs: OperationID[];
|
|
|
|
positions: IOperationPosition[];
|
|
|
|
callback: (newID: OperationID) => void;
|
|
|
|
}
|
|
|
|
|
2024-08-05 23:53:07 +03:00
|
|
|
export interface IOssEditContext extends ILibraryItemEditor {
|
2024-06-07 20:17:03 +03:00
|
|
|
schema?: IOperationSchema;
|
2024-07-23 23:03:58 +03:00
|
|
|
selected: OperationID[];
|
2024-06-07 20:17:03 +03:00
|
|
|
|
|
|
|
isMutable: boolean;
|
|
|
|
isProcessing: boolean;
|
2024-08-05 23:53:07 +03:00
|
|
|
isAttachedToOSS: boolean;
|
2024-06-07 20:17:03 +03:00
|
|
|
|
2024-07-26 00:33:22 +03:00
|
|
|
showTooltip: boolean;
|
2024-11-21 00:26:04 +03:00
|
|
|
setShowTooltip: (newValue: boolean) => void;
|
2024-07-26 00:33:22 +03:00
|
|
|
|
2024-06-07 20:17:03 +03:00
|
|
|
setOwner: (newOwner: UserID) => void;
|
|
|
|
setAccessPolicy: (newPolicy: AccessPolicy) => void;
|
|
|
|
promptEditors: () => void;
|
|
|
|
promptLocation: () => void;
|
|
|
|
|
2024-07-23 23:03:58 +03:00
|
|
|
setSelected: React.Dispatch<React.SetStateAction<OperationID[]>>;
|
|
|
|
|
2024-06-07 20:17:03 +03:00
|
|
|
share: () => void;
|
2024-07-20 18:26:32 +03:00
|
|
|
|
2024-07-24 18:11:28 +03:00
|
|
|
openOperationSchema: (target: OperationID) => void;
|
|
|
|
|
2024-07-23 23:03:58 +03:00
|
|
|
savePositions: (positions: IOperationPosition[], callback?: () => void) => void;
|
2024-08-02 11:17:27 +03:00
|
|
|
promptCreateOperation: (props: ICreateOperationPrompt) => void;
|
2024-08-15 23:23:10 +03:00
|
|
|
canDelete: (target: OperationID) => boolean;
|
|
|
|
promptDeleteOperation: (target: OperationID, positions: IOperationPosition[]) => void;
|
2024-07-28 00:37:33 +03:00
|
|
|
createInput: (target: OperationID, positions: IOperationPosition[]) => void;
|
2024-07-28 21:29:46 +03:00
|
|
|
promptEditInput: (target: OperationID, positions: IOperationPosition[]) => void;
|
2024-07-29 16:55:48 +03:00
|
|
|
promptEditOperation: (target: OperationID, positions: IOperationPosition[]) => void;
|
2024-07-29 23:14:45 +03:00
|
|
|
executeOperation: (target: OperationID, positions: IOperationPosition[]) => void;
|
2024-10-28 23:55:12 +03:00
|
|
|
promptRelocateConstituents: (target: OperationID | undefined, positions: IOperationPosition[]) => void;
|
2024-06-07 20:17:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
const OssEditContext = createContext<IOssEditContext | null>(null);
|
|
|
|
export const useOssEdit = () => {
|
|
|
|
const context = useContext(OssEditContext);
|
|
|
|
if (context === null) {
|
2024-12-12 21:58:07 +03:00
|
|
|
throw new Error('useOssEdit has to be used within <OssEditState>');
|
2024-06-07 20:17:03 +03:00
|
|
|
}
|
|
|
|
return context;
|
|
|
|
};
|
|
|
|
|
|
|
|
interface OssEditStateProps {
|
2024-07-23 23:03:58 +03:00
|
|
|
selected: OperationID[];
|
|
|
|
setSelected: React.Dispatch<React.SetStateAction<OperationID[]>>;
|
2024-06-07 20:17:03 +03:00
|
|
|
}
|
|
|
|
|
2024-09-19 17:48:48 +03:00
|
|
|
export const OssEditState = ({ selected, setSelected, children }: React.PropsWithChildren<OssEditStateProps>) => {
|
2024-07-24 18:11:28 +03:00
|
|
|
const router = useConceptNavigation();
|
2024-06-07 20:17:03 +03:00
|
|
|
const { user } = useAuth();
|
2025-01-14 21:57:32 +03:00
|
|
|
const adminMode = usePreferencesStore(state => state.adminMode);
|
2025-01-15 23:03:23 +03:00
|
|
|
|
|
|
|
const role = useRoleStore(state => state.role);
|
|
|
|
const adjustRole = useRoleStore(state => state.adjustRole);
|
2024-06-07 20:17:03 +03:00
|
|
|
const model = useOSS();
|
2024-08-17 22:30:49 +03:00
|
|
|
const library = useLibrary();
|
2024-06-07 20:17:03 +03:00
|
|
|
|
2025-01-15 23:03:23 +03:00
|
|
|
const isMutable = role > UserRole.READER && !model.schema?.read_only;
|
2024-06-07 20:17:03 +03:00
|
|
|
|
2024-07-26 00:33:22 +03:00
|
|
|
const [showTooltip, setShowTooltip] = useState(true);
|
|
|
|
|
2024-07-20 18:26:32 +03:00
|
|
|
const [insertPosition, setInsertPosition] = useState<Position2D>({ x: 0, y: 0 });
|
2024-08-02 11:17:27 +03:00
|
|
|
const [createCallback, setCreateCallback] = useState<((newID: OperationID) => void) | undefined>(undefined);
|
|
|
|
|
2025-01-16 16:31:03 +03:00
|
|
|
const showEditEditors = useDialogsStore(state => state.showEditEditors);
|
|
|
|
const showEditLocation = useDialogsStore(state => state.showChangeLocation);
|
|
|
|
const showEditInput = useDialogsStore(state => state.showChangeInputSchema);
|
|
|
|
const showEditOperation = useDialogsStore(state => state.showEditOperation);
|
|
|
|
const showDeleteOperation = useDialogsStore(state => state.showDeleteOperation);
|
|
|
|
const showRelocateConstituents = useDialogsStore(state => state.showRelocateConstituents);
|
|
|
|
const showCreateOperation = useDialogsStore(state => state.showCreateOperation);
|
|
|
|
|
2024-07-21 15:17:36 +03:00
|
|
|
const [positions, setPositions] = useState<IOperationPosition[]>([]);
|
2024-07-20 18:26:32 +03:00
|
|
|
|
2024-12-12 20:57:45 +03:00
|
|
|
useEffect(
|
2024-06-07 20:17:03 +03:00
|
|
|
() =>
|
2025-01-15 23:03:23 +03:00
|
|
|
adjustRole({
|
|
|
|
isOwner: model.isOwned,
|
|
|
|
isEditor: (user && model.schema?.editors.includes(user?.id)) ?? false,
|
|
|
|
isStaff: user?.is_staff ?? false,
|
|
|
|
adminMode: adminMode
|
2024-06-07 20:17:03 +03:00
|
|
|
}),
|
2025-01-15 23:03:23 +03:00
|
|
|
[model.schema, adjustRole, model.isOwned, user, adminMode]
|
2024-06-07 20:17:03 +03:00
|
|
|
);
|
|
|
|
|
|
|
|
const handleSetLocation = useCallback(
|
|
|
|
(newLocation: string) => {
|
|
|
|
if (!model.schema) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
model.setLocation(newLocation, () => toast.success(information.moveComplete));
|
|
|
|
},
|
|
|
|
[model]
|
|
|
|
);
|
|
|
|
|
|
|
|
const share = useCallback(() => {
|
|
|
|
const currentRef = window.location.href;
|
|
|
|
const url = currentRef.includes('?') ? currentRef + '&share' : currentRef + '?share';
|
|
|
|
navigator.clipboard
|
|
|
|
.writeText(url)
|
|
|
|
.then(() => toast.success(information.linkReady))
|
|
|
|
.catch(console.error);
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
const setOwner = useCallback(
|
|
|
|
(newOwner: UserID) => {
|
|
|
|
model.setOwner(newOwner, () => toast.success(information.changesSaved));
|
|
|
|
},
|
|
|
|
[model]
|
|
|
|
);
|
|
|
|
|
|
|
|
const setAccessPolicy = useCallback(
|
|
|
|
(newPolicy: AccessPolicy) => {
|
|
|
|
model.setAccessPolicy(newPolicy, () => toast.success(information.changesSaved));
|
|
|
|
},
|
|
|
|
[model]
|
|
|
|
);
|
|
|
|
|
2025-01-16 16:31:03 +03:00
|
|
|
const handleSetEditors = useCallback(
|
2024-06-07 20:17:03 +03:00
|
|
|
(newEditors: UserID[]) => {
|
|
|
|
model.setEditors(newEditors, () => toast.success(information.changesSaved));
|
|
|
|
},
|
|
|
|
[model]
|
|
|
|
);
|
|
|
|
|
2024-07-24 18:11:28 +03:00
|
|
|
const openOperationSchema = useCallback(
|
|
|
|
(target: OperationID) => {
|
|
|
|
const node = model.schema?.operationByID.get(target);
|
2024-08-06 14:38:10 +03:00
|
|
|
if (!node?.result) {
|
2024-07-24 18:11:28 +03:00
|
|
|
return;
|
|
|
|
}
|
2024-08-19 19:53:51 +03:00
|
|
|
router.push(urls.schema_props({ id: node.result, tab: RSTabID.CST_LIST }));
|
2024-07-24 18:11:28 +03:00
|
|
|
},
|
|
|
|
[router, model]
|
|
|
|
);
|
|
|
|
|
2024-07-23 23:03:58 +03:00
|
|
|
const savePositions = useCallback(
|
|
|
|
(positions: IOperationPosition[], callback?: () => void) => {
|
|
|
|
model.savePositions({ positions: positions }, () => {
|
|
|
|
positions.forEach(item => {
|
|
|
|
const operation = model.schema?.operationByID.get(item.id);
|
|
|
|
if (operation) {
|
|
|
|
operation.position_x = item.position_x;
|
|
|
|
operation.position_y = item.position_y;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
toast.success(information.changesSaved);
|
2024-12-04 22:52:45 +03:00
|
|
|
callback?.();
|
2024-07-23 23:03:58 +03:00
|
|
|
});
|
|
|
|
},
|
|
|
|
[model]
|
|
|
|
);
|
|
|
|
|
2024-07-20 18:26:32 +03:00
|
|
|
const handleCreateOperation = useCallback(
|
|
|
|
(data: IOperationCreateData) => {
|
2024-09-19 16:26:49 +03:00
|
|
|
const target = calculateInsertPosition(
|
|
|
|
model.schema!,
|
|
|
|
data.item_data.operation_type,
|
|
|
|
data.arguments!,
|
|
|
|
positions,
|
|
|
|
insertPosition
|
|
|
|
);
|
2024-07-29 16:55:48 +03:00
|
|
|
data.positions = positions;
|
2024-09-16 19:38:24 +03:00
|
|
|
data.item_data.position_x = target.x;
|
|
|
|
data.item_data.position_y = target.y;
|
2024-08-02 11:17:27 +03:00
|
|
|
model.createOperation(data, operation => {
|
|
|
|
toast.success(information.newOperation(operation.alias));
|
|
|
|
if (createCallback) {
|
|
|
|
setTimeout(() => createCallback(operation.id), PARAMETER.refreshTimeout);
|
|
|
|
}
|
|
|
|
});
|
2024-07-20 18:26:32 +03:00
|
|
|
},
|
2024-08-02 11:17:27 +03:00
|
|
|
[model, positions, insertPosition, createCallback]
|
2024-07-20 18:26:32 +03:00
|
|
|
);
|
|
|
|
|
2024-07-29 22:30:24 +03:00
|
|
|
const handleEditOperation = useCallback(
|
|
|
|
(data: IOperationUpdateData) => {
|
|
|
|
data.positions = positions;
|
|
|
|
model.updateOperation(data, () => toast.success(information.changesSaved));
|
|
|
|
},
|
|
|
|
[model, positions]
|
|
|
|
);
|
2024-07-29 16:55:48 +03:00
|
|
|
|
2024-08-15 23:23:10 +03:00
|
|
|
const canDelete = useCallback(
|
|
|
|
(target: OperationID) => {
|
|
|
|
if (!model.schema) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
const operation = model.schema.operationByID.get(target);
|
|
|
|
if (!operation) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (operation.operation_type === OperationType.INPUT) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return model.schema.graph.expandOutputs([target]).length === 0;
|
|
|
|
},
|
|
|
|
[model]
|
|
|
|
);
|
|
|
|
|
2025-01-16 16:31:03 +03:00
|
|
|
const handleDeleteOperation = useCallback(
|
|
|
|
(targetID: OperationID, keepConstituents: boolean, deleteSchema: boolean) => {
|
2024-08-15 23:23:10 +03:00
|
|
|
const data: IOperationDeleteData = {
|
2025-01-16 16:31:03 +03:00
|
|
|
target: targetID,
|
2024-08-15 23:23:10 +03:00
|
|
|
positions: positions,
|
|
|
|
keep_constituents: keepConstituents,
|
|
|
|
delete_schema: deleteSchema
|
|
|
|
};
|
|
|
|
model.deleteOperation(data, () => toast.success(information.operationDestroyed));
|
|
|
|
},
|
2025-01-16 16:31:03 +03:00
|
|
|
[model, positions]
|
2024-08-15 23:23:10 +03:00
|
|
|
);
|
|
|
|
|
2024-07-28 00:37:33 +03:00
|
|
|
const createInput = useCallback(
|
|
|
|
(target: OperationID, positions: IOperationPosition[]) => {
|
2024-08-17 22:30:49 +03:00
|
|
|
const operation = model.schema?.operationByID.get(target);
|
|
|
|
if (!model.schema || !operation) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (library.items.find(item => item.alias === operation.alias && item.location === model.schema!.location)) {
|
|
|
|
toast.error(errors.inputAlreadyExists);
|
|
|
|
return;
|
|
|
|
}
|
2024-07-28 00:37:33 +03:00
|
|
|
model.createInput({ target: target, positions: positions }, new_schema => {
|
|
|
|
toast.success(information.newLibraryItem);
|
|
|
|
router.push(urls.schema(new_schema.id));
|
|
|
|
});
|
|
|
|
},
|
2024-08-17 22:30:49 +03:00
|
|
|
[model, library.items, router]
|
2024-07-28 00:37:33 +03:00
|
|
|
);
|
|
|
|
|
2024-07-28 21:29:46 +03:00
|
|
|
const setTargetInput = useCallback(
|
2025-01-16 16:31:03 +03:00
|
|
|
(target: OperationID, newInput: LibraryItemID | undefined) => {
|
2024-07-28 21:29:46 +03:00
|
|
|
const data: IOperationSetInputData = {
|
2025-01-16 16:31:03 +03:00
|
|
|
target: target,
|
2024-07-28 21:29:46 +03:00
|
|
|
positions: positions,
|
|
|
|
input: newInput ?? null
|
|
|
|
};
|
|
|
|
model.setInput(data, () => toast.success(information.changesSaved));
|
|
|
|
},
|
2025-01-16 16:31:03 +03:00
|
|
|
[model, positions]
|
2024-07-29 23:14:45 +03:00
|
|
|
);
|
|
|
|
|
2024-10-28 14:52:30 +03:00
|
|
|
const handleRelocateConstituents = useCallback(
|
|
|
|
(data: ICstRelocateData) => {
|
2024-10-28 23:55:12 +03:00
|
|
|
if (
|
|
|
|
positions.every(item => {
|
|
|
|
const operation = model.schema!.operationByID.get(item.id)!;
|
|
|
|
return operation.position_x === item.position_x && operation.position_y === item.position_y;
|
|
|
|
})
|
|
|
|
) {
|
|
|
|
model.relocateConstituents(data, () => toast.success(information.changesSaved));
|
|
|
|
} else {
|
|
|
|
model.savePositions({ positions: positions }, () =>
|
|
|
|
model.relocateConstituents(data, () => toast.success(information.changesSaved))
|
|
|
|
);
|
|
|
|
}
|
2024-10-28 14:52:30 +03:00
|
|
|
},
|
|
|
|
[model, positions]
|
|
|
|
);
|
2024-10-23 15:18:46 +03:00
|
|
|
|
2025-01-16 16:31:03 +03:00
|
|
|
const executeOperation = useCallback(
|
|
|
|
(target: OperationID, positions: IOperationPosition[]) => {
|
|
|
|
const data = {
|
|
|
|
target: target,
|
|
|
|
positions: positions
|
|
|
|
};
|
|
|
|
model.executeOperation(data, () => toast.success(information.operationExecuted));
|
|
|
|
},
|
|
|
|
[model]
|
|
|
|
);
|
|
|
|
|
|
|
|
const promptEditors = useCallback(() => {
|
|
|
|
if (!model.schema) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
showEditEditors({ editors: model.schema.editors, setEditors: handleSetEditors });
|
|
|
|
}, [model.schema, showEditEditors, handleSetEditors]);
|
|
|
|
|
|
|
|
const promptLocation = useCallback(() => {
|
|
|
|
if (!model.schema) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
showEditLocation({ initial: model.schema.location, onChangeLocation: handleSetLocation });
|
|
|
|
}, [model.schema, showEditLocation, handleSetLocation]);
|
|
|
|
|
|
|
|
const promptCreateOperation = useCallback(
|
|
|
|
({ defaultX, defaultY, inputs, positions, callback }: ICreateOperationPrompt) => {
|
|
|
|
if (!model.schema) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
setInsertPosition({ x: defaultX, y: defaultY });
|
|
|
|
setPositions(positions);
|
|
|
|
setCreateCallback(() => callback);
|
|
|
|
showCreateOperation({ oss: model.schema, onCreate: handleCreateOperation, initialInputs: inputs });
|
|
|
|
},
|
|
|
|
[model.schema, showCreateOperation, handleCreateOperation]
|
|
|
|
);
|
|
|
|
|
|
|
|
const promptEditOperation = useCallback(
|
|
|
|
(target: OperationID, positions: IOperationPosition[]) => {
|
|
|
|
const operation = model.schema?.operationByID.get(target);
|
|
|
|
if (!model.schema || !operation) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
setPositions(positions);
|
|
|
|
showEditOperation({ oss: model.schema, target: operation, onSubmit: handleEditOperation });
|
|
|
|
},
|
|
|
|
[model.schema, showEditOperation, handleEditOperation]
|
|
|
|
);
|
|
|
|
|
|
|
|
const promptDeleteOperation = useCallback(
|
|
|
|
(target: OperationID, positions: IOperationPosition[]) => {
|
|
|
|
const operation = model.schema?.operationByID.get(target);
|
|
|
|
if (!model.schema || !operation) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
setPositions(positions);
|
|
|
|
showDeleteOperation({ target: operation, onSubmit: handleDeleteOperation });
|
|
|
|
},
|
|
|
|
[model.schema, showDeleteOperation, handleDeleteOperation]
|
|
|
|
);
|
|
|
|
|
|
|
|
const promptEditInput = useCallback(
|
|
|
|
(target: OperationID, positions: IOperationPosition[]) => {
|
|
|
|
const operation = model.schema?.operationByID.get(target);
|
|
|
|
if (!model.schema || !operation) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
setPositions(positions);
|
|
|
|
showEditInput({ oss: model.schema, target: operation, onSubmit: setTargetInput });
|
|
|
|
},
|
|
|
|
[model.schema, showEditInput, setTargetInput]
|
|
|
|
);
|
|
|
|
|
|
|
|
const promptRelocateConstituents = useCallback(
|
|
|
|
(target: OperationID | undefined, positions: IOperationPosition[]) => {
|
|
|
|
if (!model.schema) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const operation = target ? model.schema?.operationByID.get(target) : undefined;
|
|
|
|
setPositions(positions);
|
|
|
|
showRelocateConstituents({ oss: model.schema, initialTarget: operation, onSubmit: handleRelocateConstituents });
|
|
|
|
},
|
|
|
|
[model.schema, showRelocateConstituents, handleRelocateConstituents]
|
|
|
|
);
|
|
|
|
|
2024-06-07 20:17:03 +03:00
|
|
|
return (
|
2024-12-12 21:58:07 +03:00
|
|
|
<OssEditContext
|
2024-06-07 20:17:03 +03:00
|
|
|
value={{
|
|
|
|
schema: model.schema,
|
2024-07-23 23:03:58 +03:00
|
|
|
selected,
|
|
|
|
|
2024-07-26 00:33:22 +03:00
|
|
|
showTooltip,
|
|
|
|
setShowTooltip,
|
|
|
|
|
2024-06-07 20:17:03 +03:00
|
|
|
isMutable,
|
|
|
|
isProcessing: model.processing,
|
2024-08-05 23:53:07 +03:00
|
|
|
isAttachedToOSS: false,
|
2024-06-07 20:17:03 +03:00
|
|
|
|
|
|
|
setOwner,
|
|
|
|
setAccessPolicy,
|
|
|
|
promptEditors,
|
|
|
|
promptLocation,
|
|
|
|
|
2024-07-20 18:26:32 +03:00
|
|
|
share,
|
2024-07-23 23:03:58 +03:00
|
|
|
setSelected,
|
2024-07-20 18:26:32 +03:00
|
|
|
|
2024-07-24 18:11:28 +03:00
|
|
|
openOperationSchema,
|
2024-07-23 23:03:58 +03:00
|
|
|
savePositions,
|
|
|
|
promptCreateOperation,
|
2024-08-15 23:23:10 +03:00
|
|
|
canDelete,
|
|
|
|
promptDeleteOperation,
|
2024-07-28 21:29:46 +03:00
|
|
|
createInput,
|
2024-07-29 16:55:48 +03:00
|
|
|
promptEditInput,
|
2024-07-29 22:30:24 +03:00
|
|
|
promptEditOperation,
|
2024-10-23 15:18:46 +03:00
|
|
|
executeOperation,
|
|
|
|
promptRelocateConstituents
|
2024-06-07 20:17:03 +03:00
|
|
|
}}
|
|
|
|
>
|
|
|
|
{children}
|
2024-12-12 21:58:07 +03:00
|
|
|
</OssEditContext>
|
2024-06-07 20:17:03 +03:00
|
|
|
);
|
|
|
|
};
|