mirror of
https://github.com/simstudioai/sim.git
synced 2026-09-24 15:45:35 +08:00
improvement(start): only allow one starter block
This commit is contained in:
@@ -6,9 +6,10 @@ import { useWorkflowStore } from '@/stores/workflow/store'
|
||||
|
||||
interface ActionBarProps {
|
||||
blockId: string
|
||||
blockType: string
|
||||
}
|
||||
|
||||
export function ActionBar({ blockId }: ActionBarProps) {
|
||||
export function ActionBar({ blockId, blockType }: ActionBarProps) {
|
||||
const removeBlock = useWorkflowStore((state) => state.removeBlock)
|
||||
const toggleBlockEnabled = useWorkflowStore((state) => state.toggleBlockEnabled)
|
||||
const toggleBlockHandles = useWorkflowStore((state) => state.toggleBlockHandles)
|
||||
@@ -18,6 +19,8 @@ export function ActionBar({ blockId }: ActionBarProps) {
|
||||
(state) => state.blocks[blockId]?.horizontalHandles ?? false
|
||||
)
|
||||
|
||||
const isStarterBlock = blockType === 'starter'
|
||||
|
||||
return (
|
||||
<div className="absolute top-0 -right-20 flex flex-col items-center gap-2 p-2 bg-background rounded-md shadow-sm border border-gray-200 dark:border-gray-800">
|
||||
{/* <Tooltip>
|
||||
@@ -51,19 +54,21 @@ export function ActionBar({ blockId }: ActionBarProps) {
|
||||
<TooltipContent side="right">{isEnabled ? 'Disable Block' : 'Enable Block'}</TooltipContent>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={() => duplicateBlock(blockId)}
|
||||
className="text-gray-500"
|
||||
>
|
||||
<Copy className="h-4 w-4" />
|
||||
</Button>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent side="right">Duplicate Block</TooltipContent>
|
||||
</Tooltip>
|
||||
{!isStarterBlock && (
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={() => duplicateBlock(blockId)}
|
||||
className="text-gray-500"
|
||||
>
|
||||
<Copy className="h-4 w-4" />
|
||||
</Button>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent side="right">Duplicate Block</TooltipContent>
|
||||
</Tooltip>
|
||||
)}
|
||||
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
@@ -85,19 +90,21 @@ export function ActionBar({ blockId }: ActionBarProps) {
|
||||
</TooltipContent>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={() => removeBlock(blockId)}
|
||||
className="text-gray-500 hover:text-red-600"
|
||||
>
|
||||
<Trash2 className="h-4 w-4" />
|
||||
</Button>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent side="right">Delete Block</TooltipContent>
|
||||
</Tooltip>
|
||||
{!isStarterBlock && (
|
||||
<Tooltip>
|
||||
<TooltipTrigger asChild>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="sm"
|
||||
onClick={() => removeBlock(blockId)}
|
||||
className="text-gray-500 hover:text-red-600"
|
||||
>
|
||||
<Trash2 className="h-4 w-4" />
|
||||
</Button>
|
||||
</TooltipTrigger>
|
||||
<TooltipContent side="right">Delete Block</TooltipContent>
|
||||
</Tooltip>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -191,7 +191,7 @@ export function WorkflowBlock({ id, data, selected }: NodeProps<WorkflowBlockPro
|
||||
isActiveBlock && 'ring-2 animate-pulse-ring'
|
||||
)}
|
||||
>
|
||||
{selected && <ActionBar blockId={id} />}
|
||||
{selected && <ActionBar blockId={id} blockType={type} />}
|
||||
<ConnectionBlocks blockId={id} setIsConnecting={setIsConnecting} />
|
||||
|
||||
{/* Input Handle - Don't show for starter blocks */}
|
||||
|
||||
@@ -16,15 +16,16 @@ export function Toolbar() {
|
||||
const [isCollapsed, setIsCollapsed] = useState(false)
|
||||
|
||||
const blocks = useMemo(() => {
|
||||
if (!searchQuery.trim()) {
|
||||
return getBlocksByCategory(activeTab)
|
||||
}
|
||||
const filteredBlocks = !searchQuery.trim() ? getBlocksByCategory(activeTab) : getAllBlocks()
|
||||
|
||||
const query = searchQuery.toLowerCase()
|
||||
return getAllBlocks().filter(
|
||||
(block) =>
|
||||
block.name.toLowerCase().includes(query) || block.description.toLowerCase().includes(query)
|
||||
)
|
||||
return filteredBlocks.filter((block) => {
|
||||
if (block.type === 'starter') return false
|
||||
return (
|
||||
!searchQuery.trim() ||
|
||||
block.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
||||
block.description.toLowerCase().includes(searchQuery.toLowerCase())
|
||||
)
|
||||
})
|
||||
}, [searchQuery, activeTab])
|
||||
|
||||
if (isCollapsed) {
|
||||
|
||||
Reference in New Issue
Block a user