Skip to main content
Glama
piece-actions.tsx4.54 kB
import { t } from 'i18next'; import React from 'react'; import { Checkbox } from '@/components/ui/checkbox'; import { ScrollArea } from '@/components/ui/scroll-area'; import { piecesHooks } from '@/features/pieces/lib/pieces-hooks'; import { PieceStepMetadataWithSuggestions } from '@/lib/types'; import { isNil } from '@activepieces/shared'; import { ConnectionDropdown } from './connection-dropdown'; import { ActionInfo } from '.'; interface PieceActionsDialogProps { piece: PieceStepMetadataWithSuggestions; selectedActions: ActionInfo[]; onSelectAction: (action: ActionInfo) => void; onSelectAll: (checked: boolean) => void; selectedConnectionExternalId: string | null; setSelectedConnectionExternalId: ( connectionExternalId: string | null, ) => void; showValidationErrors?: boolean; } export const PieceActionsDialog: React.FC<PieceActionsDialogProps> = ({ piece, selectedActions, onSelectAction, onSelectAll, selectedConnectionExternalId, setSelectedConnectionExternalId, showValidationErrors = false, }) => { const { pieces } = piecesHooks.usePieces({}); const selectedPiece = pieces?.find((p) => p.name === piece.pieceName); const allSelected = piece.suggestedActions && piece.suggestedActions.length > 0 && piece.suggestedActions.every((a) => selectedActions.some((action) => action.actionName === a.name), ); const someSelected = selectedActions.length > 0 && !allSelected; const pieceHasAuth = selectedPiece && !isNil(selectedPiece.auth); return ( <> {pieceHasAuth && ( <div className="px-3 mb-4"> <div className="space-y-3"> <h4 className="text-sm font-semibold">{t('Connection')}</h4> <ConnectionDropdown piece={selectedPiece} value={selectedConnectionExternalId} onChange={setSelectedConnectionExternalId} placeholder={t('Select a connection')} showLabel={false} required={true} showError={showValidationErrors} /> </div> </div> )} <div className="flex items-center mb-2 gap-4 px-3"> <Checkbox checked={allSelected ? true : someSelected ? 'indeterminate' : false} onCheckedChange={(checked) => onSelectAll(!!checked)} /> <span className="text-sm font-bold select-none">{t('Select all')}</span> </div> <ScrollArea className="flex-grow overflow-y-auto rounded-md"> <div className="flex flex-col gap-2"> {piece.suggestedActions && piece.suggestedActions.map((action) => ( <div key={action.name} className="flex items-start gap-4 rounded-md px-3 py-2 hover:bg-accent cursor-pointer" onClick={() => onSelectAction({ actionName: action.name, actionDisplayName: action.displayName, }) } > <Checkbox checked={selectedActions.some( (selectedAction) => selectedAction.actionName === action.name, )} onCheckedChange={() => onSelectAction({ actionName: action.name, actionDisplayName: action.displayName, }) } className="mt-1" onClick={(e) => e.stopPropagation()} /> <div className="flex gap-2"> <img src={piece.logoUrl} alt="" className="w-5 h-5 mt-1" /> <div className="flex-1"> <div className="flex items-center gap-2"> <span className="font-medium text-sm"> {action.displayName} </span> </div> {action.description && ( <div className="text-xs text-muted-foreground mt-0.5 line-clamp-2"> {action.description} </div> )} </div> </div> </div> ))} {piece.suggestedActions && piece.suggestedActions.length === 0 && ( <div className="text-center text-muted-foreground py-8"> {t('No actions available')} </div> )} </div> </ScrollArea> </> ); };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/activepieces/activepieces'

If you have feedback or need assistance with the MCP directory API, please join our Discord server