diff --git a/libs/shared/lib/querybuilder/model/logic/numberFilters.tsx b/libs/shared/lib/querybuilder/model/logic/numberFilters.tsx index 3f1ba9d851027a07b1182c42b4ba1087f62df174..904882cd4c347b20b6e7d89580f5241f716425dc 100644 --- a/libs/shared/lib/querybuilder/model/logic/numberFilters.tsx +++ b/libs/shared/lib/querybuilder/model/logic/numberFilters.tsx @@ -18,7 +18,7 @@ export const MathFilters: Record<NumberFilterTypes, GeneralDescription<NumberFil inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '==', type: 'float' }, logic: ['==', '@i', '@1'], - icon: '=', + icon: 'icon-[ic--baseline-equals]', }, [NumberFilterTypes.NOT_EQUAL]: { key: 'numberFilterNotEqual', @@ -30,7 +30,7 @@ export const MathFilters: Record<NumberFilterTypes, GeneralDescription<NumberFil inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '!=', type: 'float' }, logic: ['!=', '@i', '@1'], - icon: '≠', + icon: 'icon-[ic--baseline-not-equal]', }, [NumberFilterTypes.LESS_THAN]: { key: 'numberFilterLessThan', @@ -42,7 +42,7 @@ export const MathFilters: Record<NumberFilterTypes, GeneralDescription<NumberFil inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '<', type: 'float' }, logic: ['<', '@i', '@1'], - icon: '<', + icon: 'icon-[ic--baseline-less-than]', }, [NumberFilterTypes.LESS_THAN_EQUAL]: { key: 'numberFilterLessThanOrEqual', @@ -54,7 +54,7 @@ export const MathFilters: Record<NumberFilterTypes, GeneralDescription<NumberFil inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '<=', type: 'float' }, logic: ['<=', '@i', '@1'], - icon: '≤', + icon: 'icon-[ic--baseline-less-than-equal]', }, [NumberFilterTypes.GREATER_THAN]: { key: 'numberFilterGreaterThan', @@ -66,7 +66,7 @@ export const MathFilters: Record<NumberFilterTypes, GeneralDescription<NumberFil inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '>', type: 'float' }, logic: ['>', '@i', '@1'], - icon: '>', + icon: 'icon-[ic--baseline-greater-than]', }, [NumberFilterTypes.GREATER_THAN_EQUAL]: { key: 'numberFilterGreaterThanOrEqual', @@ -78,7 +78,7 @@ export const MathFilters: Record<NumberFilterTypes, GeneralDescription<NumberFil inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '>=', type: 'float' }, logic: ['>=', '@i', '@1'], - icon: '≥', + icon: 'icon-[ic--baseline-greater-than-equal]', }, }; diff --git a/libs/shared/lib/querybuilder/model/logic/numberFunctions.tsx b/libs/shared/lib/querybuilder/model/logic/numberFunctions.tsx index 65f70fd7d360521edbe81ddd384912161e330c24..1e173ff31cda2ad7a66abbff15a423a398ad2e2a 100644 --- a/libs/shared/lib/querybuilder/model/logic/numberFunctions.tsx +++ b/libs/shared/lib/querybuilder/model/logic/numberFunctions.tsx @@ -18,7 +18,7 @@ export const NumberFunctions: Record<NumberFunctionTypes, GeneralDescription<Num inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '+', type: 'float' }, logic: ['+', '@i', '@1'], - icon: '+', + icon: 'icon-[ic--baseline-plus]', }, [NumberFunctionTypes.SUBTRACT]: { key: 'numberFunctionSubtract', @@ -30,7 +30,7 @@ export const NumberFunctions: Record<NumberFunctionTypes, GeneralDescription<Num inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '-', type: 'float' }, logic: ['-', '@i', '@1'], - icon: '-', + icon: 'icon-[ic--baseline-minus]', }, [NumberFunctionTypes.MULTIPLY]: { key: 'numberFunctionMultiply', @@ -42,7 +42,7 @@ export const NumberFunctions: Record<NumberFunctionTypes, GeneralDescription<Num inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '*', type: 'float' }, logic: ['*', '@i', '@1'], - icon: '×', + icon: 'icon-[ic--baseline-clear]', }, [NumberFunctionTypes.DIVIDE]: { key: 'numberFunctionDivide', @@ -54,7 +54,7 @@ export const NumberFunctions: Record<NumberFunctionTypes, GeneralDescription<Num inputs: [{ name: '1', type: 'float', default: 0 }], output: { name: '/', type: 'float' }, logic: ['/', '@i', '@1'], - icon: '÷', + icon: 'icon-[ic--baseline-divide]', }, }; diff --git a/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx b/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx index b392032c70a0418ebee83768310b09ccdf366bec..ec05da457a2eeda6fde3a5d99f85d60ca73677ec 100644 --- a/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx +++ b/libs/shared/lib/querybuilder/panel/QueryBuilder.tsx @@ -36,9 +36,9 @@ import { ConnectionDragLine, ConnectionLine, QueryEntityPill, QueryRelationPill import { QueryLogicPill } from '../pills/customFlowPills/logicpill/QueryLogicPill'; import { dragPillStarted, movePillTo } from '../pills/dragging/dragPill'; import styles from './querybuilder.module.scss'; -import { QueryBuilderLogicPillsPanel } from './querysidepanel/queryBuilderLogicPillsPanel'; -import { QueryBuilderRelatedNodesPanel } from './querysidepanel/queryBuilderRelatedNodesPanel'; -import { QueryMLDialog } from './querysidepanel/queryMLDialog'; +import { QueryBuilderLogicPillsPanel } from './querysidepanel/QueryBuilderLogicPillsPanel'; +import { QueryBuilderRelatedNodesPanel } from './querysidepanel/QueryBuilderRelatedNodesPanel'; +import { QueryMLDialog } from './querysidepanel/QueryMLDialog'; import { ConnectingNodeDataI } from './utils/connectorDrop'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../components/tooltip'; import { resultSetFocus } from '../../data-access/store/interactionSlice'; @@ -622,7 +622,7 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { if (!ret) setToggleSettings(undefined); }} > - <DialogContent className="w-fit"> + <DialogContent className="w-fit rounded-none"> <QueryBuilderLogicPillsPanel onClick={(v) => { connectingNodeId.current = null; @@ -630,13 +630,12 @@ export const QueryBuilderInner = (props: QueryBuilderProps) => { setToggleSettings(undefined); }} reactFlowWrapper={reactFlowWrapper.current} - title="Logic Pills usable by the node" - className="min-h-[75vh] max-h-[75vh]" + title="Available Logic Pills" + className="max-h-[75vh] min-h-[45vh]" onDrag={() => {}} connection={connectingNodeId?.current} editNode={editLogicNode.current} /> - <DialogClose>Cancel</DialogClose> </DialogContent> </Dialog> <Dialog diff --git a/libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderLogicPillsPanel.tsx b/libs/shared/lib/querybuilder/panel/querysidepanel/QueryBuilderLogicPillsPanel.tsx similarity index 65% rename from libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderLogicPillsPanel.tsx rename to libs/shared/lib/querybuilder/panel/querysidepanel/QueryBuilderLogicPillsPanel.tsx index 3b389e4c6695ca500b12fa141d11029120fcea47..13cf045ec1d5bcfcf1a53fb19dad460f419df7d3 100644 --- a/libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderLogicPillsPanel.tsx +++ b/libs/shared/lib/querybuilder/panel/querysidepanel/QueryBuilderLogicPillsPanel.tsx @@ -154,19 +154,35 @@ export const QueryBuilderLogicPillsPanel = (props: { props.onClick(value); }; + const AllLogicMapAvailable = Object.values(AllLogicMap) + .filter((item) => !filterType || item.key.toLowerCase().includes(filterType)) + .filter((item) => selectedOp === -1 || item.key.toLowerCase().includes(dataOps?.[selectedOp].title)) + .filter((item) => selectedType === -1 || item.key.toLowerCase().includes(dataTypes?.[selectedType].title)); + + const dataOpsPresent: { [key: string]: boolean } = {}; + + dataOps.forEach((dataOp) => { + const hasMatch = AllLogicMapAvailable.some((item) => { + return item.key.toLowerCase().includes(dataOp.title.toLowerCase()); + }); + + dataOpsPresent[dataOp.title] = hasMatch; + }); + return ( - <div className={props.className + ' card w-fit'}> - {props.title && <h1 className="card-title mb-7">{props.title}</h1>} - <div className="gap-1 flex w-fit"> + <div className={props.className + ' card'}> + {props.title && <h1 className="card-title mb-2 mx-auto">{props.title}</h1>} + <div className="gap-1 flex justify-center"> <TooltipProvider delayDuration={50}> {dataOps.map((item, index) => ( - <Tooltip key={item.title}> + <Tooltip key={'QB_Type_' + item.title}> <TooltipContent>{item.description}</TooltipContent> <TooltipTrigger> <Button iconComponent={item.icon} size="sm" variant={selectedOp === index ? 'solid' : 'outline'} + disabled={!dataOpsPresent[item.title]} onClick={(e) => { e.preventDefault(); index === selectedOp ? setSelectedOp(-1) : setSelectedOp(index); @@ -175,52 +191,57 @@ export const QueryBuilderLogicPillsPanel = (props: { </TooltipTrigger> </Tooltip> ))} + {dataTypes.map((item, index) => ( + <Tooltip key={'QB_Type_' + item.title}> + <TooltipContent>{item.description}</TooltipContent> + <TooltipTrigger> + <Button + iconComponent={item.icon} + size="sm" + variant={selectedType === index ? 'solid' : 'outline'} + onClick={(e) => { + e.preventDefault(); + index === selectedType ? setSelectedType(-1) : setSelectedType(index); + }} + ></Button> + </TooltipTrigger> + </Tooltip> + ))} </TooltipProvider> - <div className="w-2" /> - {dataTypes.map((item, index) => ( - <div key={item.title} data-tip={item.description} className="tooltip tooltip-top m-0 p-0"> - <Button - iconComponent={item.icon} - size="sm" - variant={selectedType === index ? 'solid' : 'outline'} - onClick={(e) => { - e.preventDefault(); - index === selectedType ? setSelectedType(-1) : setSelectedType(index); - }} - ></Button> - </div> - ))} </div> <div className="mt-1 overflow-x-hidden h-[80vh]"> - <ul className="pb-10 gap-1 flex flex-col w-full h-full"> - {Object.values(AllLogicMap) - .filter((item) => !filterType || item.key.toLowerCase().includes(filterType)) - .filter((item) => selectedOp === -1 || item.key.toLowerCase().includes(dataOps?.[selectedOp].title)) - .filter((item) => selectedType === -1 || item.key.toLowerCase().includes(dataTypes?.[selectedType].title)) - .map((item, index) => ( - <li key={item.key + item.description} className="px-3 py-2 h-fit bg-white border-[1px] border-secondary-500 rounded-sm"> - <span - data-tip={item.description} - className="flex before:w-[10rem] before:text-center tooltip tooltip-bottom text-start " - onDragStart={(e) => onDragStart(e, item)} - draggable={true} - onClick={() => { - if (props.editNode) onEditNodeFromPopup(item); - else onNewNodeFromPopup(item); - }} - > - <span className="w-full">{item.name}</span> - <span className="flex scale-75"> - {item.key.toLowerCase().includes('filter') && <Icon component="icon-[ic--baseline-filter-alt]" size={20} />} - {item.key.toLowerCase().includes('function') && <Icon component="icon-[ic--baseline-functions]" size={20} />} - {item.key.toLowerCase().includes('aggregation') && <Icon component="icon-[ic--baseline-grid-on]" size={20} />} - {item.key.toLowerCase().includes('number') && <Icon component="icon-[ic--baseline-numbers]" size={20} />} - {item.key.toLowerCase().includes('string') && <Icon component="icon-[ic--baseline-abc]" size={20} />} - </span> - </span> - </li> + <TooltipProvider delayDuration={50}> + <ul className="pb-10 gap-1 flex flex-col w-full h-full"> + {AllLogicMapAvailable.map((item, index) => ( + <Tooltip key={'QB_Options_' + index}> + <TooltipContent>{item.description}</TooltipContent> + <TooltipTrigger> + <li key={item.key + item.description} className="px-3 py-2 h-fit bg-white border-[1px] border-secondary-500 min-w-72"> + <span + className="flex gap-1" + onDragStart={(e) => onDragStart(e, item)} + draggable={true} + onClick={() => { + if (props.editNode) onEditNodeFromPopup(item); + else onNewNodeFromPopup(item); + }} + > + {item.icon && <Icon component={item.icon} size={24} />} + <span className="w-full">{item.name}</span> + <span className="flex scale-75"> + {item.key.toLowerCase().includes('filter') && <Icon component="icon-[ic--baseline-filter-alt]" size={20} />} + {item.key.toLowerCase().includes('function') && <Icon component="icon-[ic--baseline-functions]" size={20} />} + {item.key.toLowerCase().includes('aggregation') && <Icon component="icon-[ic--baseline-grid-on]" size={20} />} + {item.key.toLowerCase().includes('number') && <Icon component="icon-[ic--baseline-numbers]" size={20} />} + {item.key.toLowerCase().includes('string') && <Icon component="icon-[ic--baseline-abc]" size={20} />} + </span> + </span> + </li> + </TooltipTrigger> + </Tooltip> ))} - </ul> + </ul> + </TooltipProvider> </div> </div> ); diff --git a/libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderRelatedNodesPanel.tsx b/libs/shared/lib/querybuilder/panel/querysidepanel/QueryBuilderRelatedNodesPanel.tsx similarity index 100% rename from libs/shared/lib/querybuilder/panel/querysidepanel/queryBuilderRelatedNodesPanel.tsx rename to libs/shared/lib/querybuilder/panel/querysidepanel/QueryBuilderRelatedNodesPanel.tsx diff --git a/libs/shared/lib/querybuilder/panel/querysidepanel/queryMLDialog.tsx b/libs/shared/lib/querybuilder/panel/querysidepanel/QueryMLDialog.tsx similarity index 100% rename from libs/shared/lib/querybuilder/panel/querysidepanel/queryMLDialog.tsx rename to libs/shared/lib/querybuilder/panel/querysidepanel/QueryMLDialog.tsx