import { useState, useMemo, } from '@wordpress/element'; import {useSortable} from '@dnd-kit/sortable'; import {CSS} from '@dnd-kit/utilities'; import { Flex, FlexBlock, FlexItem, Tooltip, } from '@wordpress/components'; import SubControls from './SubControls'; import { __ } from '@wordpress/i18n'; type Props = { id: string; label: string; value?: any; sortLabel: string; isActive: boolean; disabled?: boolean; locked?: boolean; subControls?: string[]; onActive: () => void; } export default function SortableItem(props: Props) { const isMovementBlocked = props.disabled || props.locked || false; const { attributes, listeners, isDragging, setNodeRef, setActivatorNodeRef, transform, transition, } = useSortable({id: props.id, disabled: isMovementBlocked }); const style = { transform: CSS.Transform.toString(transform), transition, }; const [isOpen, setIsOpen] = useState(false); const toggleAccordion = () => { setIsOpen(!isOpen); }; const subControlIds = useMemo(() => props.subControls ?? [], [props.subControls]); // locked 状態のクラスを追加 const wrapClasses = [ 'apura-sortable-item', props.isActive ? '' : 'is-hidden', props.locked ? 'is-locked' : '', ].filter( Boolean ).join( ' ' ); // ハンドル表示判定: disabled または locked ならロックアイコン const showLockIcon = props.disabled || props.locked; // ツールチップ文言の分岐 const lockTooltipText = props.locked ? __( 'This item is locked by the current configuration.', 'apura' ) : __( 'This item is fixed and cannot be moved.', 'apura' ); return (
{showLockIcon ? ( ) : ( )} {props.label} {subControlIds.length > 0 && } { subControlIds.length > 0 && props.isActive && !props.locked && }
); }