/* * Copyright OpenSearch Contributors * SPDX-License-Identifier: Apache-2.0 */ import { i18n } from '@osd/i18n'; import { EuiButtonIcon, EuiDragDropContext, EuiDraggable, EuiDroppable, EuiFormRow, EuiPanel, EuiText, DropResult, } from '@elastic/eui'; import React, { useCallback, useState } from 'react'; import { IDropAttributes, IDropState } from '../../utils/drag_drop'; import './dropbox.scss'; import { useDropbox } from './use'; import { UseDropboxProps } from './use/use_dropbox'; import { usePrefersReducedMotion } from './use/use_prefers_reduced_motion'; export interface DropboxDisplay { label: string; id: string; } interface DropboxProps extends IDropState { id: string; label: string; fields: DropboxDisplay[]; limit?: number; onAddField: () => void; onEditField: (id: string) => void; onDeleteField: (id: string) => void; onReorderField: ({ sourceAggId, destinationAggId, }: { sourceAggId: string; destinationAggId: string; }) => void; dropProps: IDropAttributes; } const DropboxComponent = ({ id: dropboxId, label: boxLabel, fields, onAddField, onDeleteField, onEditField, onReorderField, limit = 1, isValidDropTarget, canDrop, dropProps, }: DropboxProps) => { const prefersReducedMotion = usePrefersReducedMotion(); const [closing, setClosing] = useState(false); const handleDragEnd = useCallback( ({ source, destination }: DropResult) => { if (!destination) return; onReorderField({ sourceAggId: fields[source.index].id, destinationAggId: fields[destination.index].id, }); }, [fields, onReorderField] ); const animateDelete = useCallback( (id: string) => { setClosing(id); setTimeout( () => { onDeleteField(id); setClosing(false); }, prefersReducedMotion ? 0 : 350 // Also update speed in dropbox.scss ); }, [onDeleteField, prefersReducedMotion] ); return (
{fields.map(({ id, label }, index) => ( onEditField(id)}> {label} animateDelete(id)} data-test-subj="dropBoxRemoveBtn" /> ))} {fields.length < limit && ( {i18n.translate('visBuilder.dropbox.addField.title', { defaultMessage: 'Click or drop to add', })} onAddField()} data-test-subj="dropBoxAddBtn" /> )}
); }; const Dropbox = React.memo((dropBox: UseDropboxProps) => { const props = useDropbox(dropBox); return ; }); export { Dropbox, DropboxComponent, DropboxProps };