diff --git a/apps/web/src/app/App.tsx b/apps/web/src/app/App.tsx index 215d4ec57134c57e86329b7101cf9fe4e39993db..6770b4382a4570a5cd68d91ed424e31618e8ea80 100644 --- a/apps/web/src/app/App.tsx +++ b/apps/web/src/app/App.tsx @@ -6,7 +6,6 @@ import { useQuerybuilderGraph, useQuerybuilderSettings, useSessionCache, - useQuerybuilderUnionTypes, } from '@graphpolaris/shared/lib/data-access'; import { addError, setCurrentTheme } from '@graphpolaris/shared/lib/data-access/store/configSlice'; import { resetGraphQueryResults, queryingBackend } from '@graphpolaris/shared/lib/data-access/store/graphQueryResultSlice'; @@ -39,7 +38,6 @@ export function App(props: App) { const dispatch = useAppDispatch(); const queryBuilderSettings = useQuerybuilderSettings(); const [monitoringOpen, setMonitoringOpen] = useState<boolean>(false); - const unionTypes = useQuerybuilderUnionTypes(); const runQuery = () => { if (session?.currentSaveState && query) { @@ -47,7 +45,7 @@ export function App(props: App) { dispatch(resetGraphQueryResults()); } else { dispatch(queryingBackend()); - wsQueryRequest(Query2BackendQuery(session.currentSaveState, query, queryBuilderSettings, ml, unionTypes)); + wsQueryRequest(Query2BackendQuery(session.currentSaveState, query, queryBuilderSettings, ml, queryBuilderSettings.unionTypes)); } } }; diff --git a/libs/shared/lib/data-access/api/eventBus.tsx b/libs/shared/lib/data-access/api/eventBus.tsx index d48c70bc64eb36fd1cbfcf4a65533ebdf38b30f8..fb61c6fe5211cc5edee3817d51e77038edc4450d 100644 --- a/libs/shared/lib/data-access/api/eventBus.tsx +++ b/libs/shared/lib/data-access/api/eventBus.tsx @@ -14,14 +14,12 @@ import { wsSchemaSubscription, useQuerybuilderAttributesShown, wsSchemaStatsRequest, - useQuerybuilderUnionTypes, } from '@graphpolaris/shared/lib/data-access'; import { Broker, wsQuerySubscription, wsQueryTranslationSubscription } from '@graphpolaris/shared/lib/data-access/broker'; import { addInfo } from '@graphpolaris/shared/lib/data-access/store/configSlice'; import { allMLTypes, LinkPredictionInstance, setMLResult } from '@graphpolaris/shared/lib/data-access/store/mlSlice'; import { QueryBuilderText, - queryUnionTypes, setQueryText, setQuerybuilderNodes, } from '@graphpolaris/shared/lib/data-access/store/querybuilderSlice'; @@ -70,7 +68,6 @@ export const EventBus = (props: { onRunQuery: Function; onAuthorized: Function } const mlHash = useMLEnabledHash(); const visState = useVisualization(); const queryBuilderSettings = useQuerybuilderSettings(); - const unionTypes = useQuerybuilderUnionTypes(); function loadSaveState(saveStateID: string | undefined, saveStates: Record<string, SaveStateI>) { if (saveStateID && saveStates && saveStateID in saveStates) { @@ -291,7 +288,7 @@ export const EventBus = (props: { onRunQuery: Function; onAuthorized: Function } // body: { type: 'query_builder_state', status: '', value: queryBuilder }, // }); } - }, [queryHash, mlHash, queryBuilderSettings, unionTypes]); + }, [queryHash, mlHash, queryBuilderSettings, queryBuilderSettings.unionTypes]); return <div className="hide"></div>; }; diff --git a/libs/shared/lib/data-access/store/hooks.ts b/libs/shared/lib/data-access/store/hooks.ts index 16fc370b5030a06ec10e737fdc2027df79293421..7df070ec3db2feda79faa4292e42fbe9c9b9a626 100644 --- a/libs/shared/lib/data-access/store/hooks.ts +++ b/libs/shared/lib/data-access/store/hooks.ts @@ -20,7 +20,6 @@ import { queryBuilderState, selectQuerybuilderGraph, selectQuerybuilderHash, - queryUnionTypes, QueryUnionType } from '@graphpolaris/shared/lib/data-access/store/querybuilderSlice'; import { activeSaveState, activeSaveStateAuthorization, SessionCacheI, sessionCacheState } from './sessionSlice'; @@ -69,7 +68,6 @@ export const useQuerybuilderHash: () => string = () => useAppSelector(selectQuer export const useQuerybuilderSettings: () => QueryBuilderSettings = () => useAppSelector(queryBuilderSettingsState); export const useQuerybuilder: () => QueryBuilderState = () => useAppSelector(queryBuilderState); export const useQuerybuilderAttributesShown: () => QueryGraphEdgeHandle[] = () => useAppSelector(queryBuilderAttributesShown); -export const useQuerybuilderUnionTypes: () => {[nodeId: string]: QueryUnionType} = () => useAppSelector(queryUnionTypes); // Overall Configuration of the app export const useConfig: () => ConfigStateI = () => useAppSelector(configState); diff --git a/libs/shared/lib/data-access/store/querybuilderSlice.ts b/libs/shared/lib/data-access/store/querybuilderSlice.ts index d6b771370819e30054cb45b74f8d73766a806fce..79dba632784780e64ae643b5cb0de19025bb161c 100644 --- a/libs/shared/lib/data-access/store/querybuilderSlice.ts +++ b/libs/shared/lib/data-access/store/querybuilderSlice.ts @@ -13,6 +13,7 @@ export type QueryBuilderSettings = { depth: { min: number; max: number }; layout: AllLayoutAlgorithms | 'manual'; autocompleteRelation: boolean; + unionTypes: { [nodeId: string]: QueryUnionType }; }; export type QueryBuilderText = { @@ -33,7 +34,6 @@ export type QueryBuilderState = { settings: QueryBuilderSettings; queryTranslation: QueryBuilderText; attributesBeingShown: QueryGraphEdgeHandle[]; - unionTypes: { [nodeId: string]: QueryUnionType }; }; export type SchemaState = { @@ -49,13 +49,13 @@ export const initialState: QueryBuilderState = { depth: { min: 1, max: 1 }, layout: 'manual', autocompleteRelation: true, + unionTypes: {}, }, queryTranslation: { queryId: '', result: '', }, attributesBeingShown: [], - unionTypes: {}, // schemaLayout: 'Graphology_noverlap', } as QueryBuilderState; @@ -100,7 +100,10 @@ export const querybuilderSlice = createSlice({ } }, setQueryUnionType: (state: QueryBuilderState, action: PayloadAction<{ nodeId: string; unionType: QueryUnionType }>) => { - state.unionTypes[action.payload.nodeId] = action.payload.unionType; + if (state.settings.unionTypes == null) { + state.settings.unionTypes = {}; + } + state.settings.unionTypes[action.payload.nodeId] = action.payload.unionType; }, }, }); @@ -169,6 +172,4 @@ export const { setQueryUnionType, } = querybuilderSlice.actions; -export const queryBuilderAttributesShown = (state: RootState) => state.querybuilder.attributesBeingShown; - -export const queryUnionTypes = (state: RootState) => state.querybuilder.unionTypes; +export const queryBuilderAttributesShown = (state: RootState) => state.querybuilder.attributesBeingShown; \ No newline at end of file diff --git a/libs/shared/lib/querybuilder/panel/ContextMenu.tsx b/libs/shared/lib/querybuilder/panel/ContextMenu.tsx index 283b18e2b50b337503320ed33617f37f976cd0e0..020d9130bb4bbe1f2e2f53aa862b76d5136e90d6 100644 --- a/libs/shared/lib/querybuilder/panel/ContextMenu.tsx +++ b/libs/shared/lib/querybuilder/panel/ContextMenu.tsx @@ -7,7 +7,7 @@ import { useQuerybuilderAttributesShown, useQuerybuilderGraph, useQuerybuilderHash, - useQuerybuilderUnionTypes, + useQuerybuilderSettings } from '../..'; import { isEqual } from 'lodash-es'; import { @@ -31,6 +31,8 @@ export const ContextMenu = (props: { const dispatch = useAppDispatch(); const graph = useQuerybuilderGraph(); const qbHash = useQuerybuilderHash(); + const settings = useQuerybuilderSettings(); + const unionType = settings.unionTypes == null || props.node == null ? QueryUnionType.AND : settings.unionTypes[props.node.id]; const graphologyGraph = useMemo(() => toQuerybuilderGraphology(graph), [graph, qbHash]); @@ -69,7 +71,6 @@ export const ContextMenu = (props: { dispatch(attributeShownToggle(attribute.handleData)); } - const unionType = useQuerybuilderUnionTypes(); function setUnionType(unionType: QueryUnionType) { if (!props.node) return; dispatch(setQueryUnionType({ nodeId: props.node.id, unionType: unionType })); @@ -125,12 +126,12 @@ export const ContextMenu = (props: { <DropdownItem value="AND" onClick={(_) => setUnionType(QueryUnionType.AND)} - selected={props.node ? unionType[props.node.id] != QueryUnionType.OR : false} // Also selected when null + selected={props.node ? unionType != QueryUnionType.OR : false} // Also selected when null />, <DropdownItem value="OR" onClick={(_) => setUnionType(QueryUnionType.OR)} - selected={props.node ? unionType[props.node.id] == QueryUnionType.OR : false} + selected={props.node ? unionType == QueryUnionType.OR : false} />, ]} /> diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/QueryEntityPill.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/QueryEntityPill.tsx index 5fd9ea36d925ff9a721c8ae965fcd53245bde2cf..8a535d9fa1f159b6e331ea0e69d512273331ebbc 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/QueryEntityPill.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/entitypill/QueryEntityPill.tsx @@ -2,7 +2,7 @@ import { useQuerybuilderAttributesShown, useQuerybuilderGraph, useQuerybuilderHash, - useQuerybuilderUnionTypes, + useQuerybuilderSettings, } from '@graphpolaris/shared/lib/data-access'; import { setQuerybuilderGraphology, @@ -38,9 +38,10 @@ export const QueryEntityPill = React.memo((node: SchemaReactflowEntityNode) => { () => graph.edges.filter((edge) => edge.source === node.id && !!edge?.attributes?.sourceHandleData.attributeType), [graph], ); + const settings = useQuerybuilderSettings(); const uniqueAttributes = useMemo(() => uniqBy(data.attributes, (attr) => attr.handleData.attributeName), [data.attributes]); - const unionType = useQuerybuilderUnionTypes()[node.id]; + const unionType = settings.unionTypes == null ? QueryUnionType.AND : settings.unionTypes[node.id]; return ( <div className="w-fit h-fit nowheel" ref={ref} id="asd"> diff --git a/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/QueryRelationPill.tsx b/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/QueryRelationPill.tsx index de647855b7fc43f8071cdbff9d23a2f6d0a90674..93252a7e2da08c1fd152d37872c3ed7b2270f911 100644 --- a/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/QueryRelationPill.tsx +++ b/libs/shared/lib/querybuilder/pills/customFlowPills/relationpill/QueryRelationPill.tsx @@ -4,13 +4,13 @@ import { useAppDispatch, useQuerybuilderGraph, useQuerybuilderSettings, - useQuerybuilderUnionTypes, } from '@graphpolaris/shared/lib/data-access'; import { addWarning } from '@graphpolaris/shared/lib/data-access/store/configSlice'; import { setQuerybuilderGraphology, toQuerybuilderGraphology, attributeShownToggle, + QueryUnionType } from '@graphpolaris/shared/lib/data-access/store/querybuilderSlice'; import { PillAttributes } from '../../pillattributes/PillAttributes'; import { @@ -91,7 +91,7 @@ export const QueryRelationPill = memo((node: SchemaReactflowRelationNode) => { dispatch(attributeShownToggle(attribute.handleData)); } - const unionType = useQuerybuilderUnionTypes()[node.id]; + const unionType = settings.unionTypes == null ? QueryUnionType.AND : settings.unionTypes[node.id]; const attributesBeingShown = useQuerybuilderAttributesShown(); function isAttributeAdded(attribute: NodeAttribute): boolean {