mirror of
https://github.com/IRBorisov/ConceptPortal.git
synced 2025-06-26 04:50:36 +03:00
M: allow single operand synthesis
Some checks failed
Frontend CI / build (22.x) (push) Has been cancelled
Some checks failed
Frontend CI / build (22.x) (push) Has been cancelled
This commit is contained in:
parent
636a9a1650
commit
6338888095
|
@ -45,7 +45,7 @@ function DlgCreateOperation({ hideWindow, oss, onCreate, initialInputs }: DlgCre
|
|||
if (alias === '') {
|
||||
return false;
|
||||
}
|
||||
if (activeTab === TabID.SYNTHESIS && inputs.length === 1) {
|
||||
if (activeTab === TabID.SYNTHESIS && inputs.length === 0) {
|
||||
return false;
|
||||
}
|
||||
if (activeTab === TabID.INPUT && !attachedID) {
|
||||
|
|
|
@ -50,7 +50,7 @@ function NodeContextMenu({
|
|||
}
|
||||
|
||||
const argumentIDs = controller.schema.graph.expandInputs([operation.id]);
|
||||
if (!argumentIDs || argumentIDs.length < 2) {
|
||||
if (!argumentIDs || argumentIDs.length < 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -24,7 +24,7 @@ import { useConceptOptions } from '@/context/ConceptOptionsContext';
|
|||
import { useOSS } from '@/context/OssContext';
|
||||
import useLocalStorage from '@/hooks/useLocalStorage';
|
||||
import { OssNode } from '@/models/miscellaneous';
|
||||
import { OperationID, OperationType } from '@/models/oss';
|
||||
import { OperationID } from '@/models/oss';
|
||||
import { PARAMETER, storage } from '@/utils/constants';
|
||||
import { errors } from '@/utils/labels';
|
||||
|
||||
|
@ -132,48 +132,11 @@ function OssFlow({ isModified, setIsModified }: OssFlowProps) {
|
|||
return;
|
||||
}
|
||||
|
||||
let target = { x: 0, y: 0 };
|
||||
const positions = getPositions();
|
||||
if (positions.length == 0) {
|
||||
target = flow.project({ x: window.innerWidth / 2, y: window.innerHeight / 2 });
|
||||
} else if (inputs.length <= 1) {
|
||||
let inputsNodes = positions.filter(pos =>
|
||||
controller.schema!.items.find(
|
||||
operation => operation.operation_type === OperationType.INPUT && operation.id === pos.id
|
||||
)
|
||||
);
|
||||
if (inputsNodes.length > 0) {
|
||||
inputsNodes = positions;
|
||||
}
|
||||
const maxX = Math.max(...inputsNodes.map(node => node.position_x));
|
||||
const minY = Math.min(...inputsNodes.map(node => node.position_y));
|
||||
target.x = maxX + 180;
|
||||
target.y = minY;
|
||||
} else {
|
||||
const inputsNodes = positions.filter(pos => inputs.includes(pos.id));
|
||||
const maxY = Math.max(...inputsNodes.map(node => node.position_y));
|
||||
const minX = Math.min(...inputsNodes.map(node => node.position_x));
|
||||
const maxX = Math.max(...inputsNodes.map(node => node.position_x));
|
||||
target.x = Math.ceil((maxX + minX) / 2 / PARAMETER.ossGridSize) * PARAMETER.ossGridSize;
|
||||
target.y = maxY + 100;
|
||||
}
|
||||
|
||||
let flagIntersect = false;
|
||||
do {
|
||||
flagIntersect = positions.some(
|
||||
position =>
|
||||
Math.abs(position.position_x - target.x) < PARAMETER.ossMinDistance &&
|
||||
Math.abs(position.position_y - target.y) < PARAMETER.ossMinDistance
|
||||
);
|
||||
if (flagIntersect) {
|
||||
target.x += PARAMETER.ossMinDistance;
|
||||
target.y += PARAMETER.ossMinDistance;
|
||||
}
|
||||
} while (flagIntersect);
|
||||
|
||||
const target = flow.project({ x: window.innerWidth / 2, y: window.innerHeight / 2 });
|
||||
controller.promptCreateOperation({
|
||||
x: target.x,
|
||||
y: target.y,
|
||||
defaultX: target.x,
|
||||
defaultY: target.y,
|
||||
inputs: inputs,
|
||||
positions: positions,
|
||||
callback: () => flow.fitView({ duration: PARAMETER.zoomDuration })
|
||||
|
|
|
@ -76,7 +76,7 @@ function ToolbarOssGraph({
|
|||
}
|
||||
|
||||
const argumentIDs = controller.schema.graph.expandInputs([selectedOperation.id]);
|
||||
if (!argumentIDs || argumentIDs.length < 2) {
|
||||
if (!argumentIDs || argumentIDs.length < 1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -36,8 +36,8 @@ import { errors, information } from '@/utils/labels';
|
|||
import { RSTabID } from '../RSFormPage/RSTabs';
|
||||
|
||||
export interface ICreateOperationPrompt {
|
||||
x: number;
|
||||
y: number;
|
||||
defaultX: number;
|
||||
defaultY: number;
|
||||
inputs: OperationID[];
|
||||
positions: IOperationPosition[];
|
||||
callback: (newID: OperationID) => void;
|
||||
|
@ -221,19 +221,58 @@ export const OssEditState = ({ selected, setSelected, children }: OssEditStatePr
|
|||
[model]
|
||||
);
|
||||
|
||||
const promptCreateOperation = useCallback(({ x, y, inputs, positions, callback }: ICreateOperationPrompt) => {
|
||||
setInsertPosition({ x: x, y: y });
|
||||
setInitialInputs(inputs);
|
||||
setPositions(positions);
|
||||
setCreateCallback(() => callback);
|
||||
setShowCreateOperation(true);
|
||||
}, []);
|
||||
const promptCreateOperation = useCallback(
|
||||
({ defaultX, defaultY, inputs, positions, callback }: ICreateOperationPrompt) => {
|
||||
setInsertPosition({ x: defaultX, y: defaultY });
|
||||
setInitialInputs(inputs);
|
||||
setPositions(positions);
|
||||
setCreateCallback(() => callback);
|
||||
setShowCreateOperation(true);
|
||||
},
|
||||
[]
|
||||
);
|
||||
|
||||
const handleCreateOperation = useCallback(
|
||||
(data: IOperationCreateData) => {
|
||||
const target = insertPosition;
|
||||
if (data.item_data.operation_type === OperationType.INPUT) {
|
||||
let inputsNodes = positions.filter(pos =>
|
||||
model.schema!.items.find(
|
||||
operation => operation.operation_type === OperationType.INPUT && operation.id === pos.id
|
||||
)
|
||||
);
|
||||
if (inputsNodes.length > 0) {
|
||||
inputsNodes = positions;
|
||||
}
|
||||
const maxX = Math.max(...inputsNodes.map(node => node.position_x));
|
||||
const minY = Math.min(...inputsNodes.map(node => node.position_y));
|
||||
target.x = maxX + PARAMETER.ossDistanceX;
|
||||
target.y = minY;
|
||||
} else {
|
||||
const argNodes = positions.filter(pos => data.arguments!.includes(pos.id));
|
||||
const maxY = Math.max(...argNodes.map(node => node.position_y));
|
||||
const minX = Math.min(...argNodes.map(node => node.position_x));
|
||||
const maxX = Math.max(...argNodes.map(node => node.position_x));
|
||||
target.x = Math.ceil((maxX + minX) / 2 / PARAMETER.ossGridSize) * PARAMETER.ossGridSize;
|
||||
target.y = maxY + PARAMETER.ossDistanceY;
|
||||
}
|
||||
|
||||
let flagIntersect = false;
|
||||
do {
|
||||
flagIntersect = positions.some(
|
||||
position =>
|
||||
Math.abs(position.position_x - target.x) < PARAMETER.ossMinDistance &&
|
||||
Math.abs(position.position_y - target.y) < PARAMETER.ossMinDistance
|
||||
);
|
||||
if (flagIntersect) {
|
||||
target.x += PARAMETER.ossMinDistance;
|
||||
target.y += PARAMETER.ossMinDistance;
|
||||
}
|
||||
} while (flagIntersect);
|
||||
|
||||
data.positions = positions;
|
||||
data.item_data.position_x = insertPosition.x;
|
||||
data.item_data.position_y = insertPosition.y;
|
||||
data.item_data.position_x = target.x;
|
||||
data.item_data.position_y = target.y;
|
||||
model.createOperation(data, operation => {
|
||||
toast.success(information.newOperation(operation.alias));
|
||||
if (createCallback) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user