// Copyright (C) The Arvados Authors. All rights reserved. // // SPDX-License-Identifier: AGPL-3.0 import * as React from 'react'; import { Chip, Grid } from '@material-ui/core'; import { DragSource, DragSourceSpec, DragSourceCollector, ConnectDragSource, DragDropContextProvider, DropTarget, DropTargetSpec, DropTargetCollector, ConnectDropTarget } from 'react-dnd'; import HTML5Backend from 'react-dnd-html5-backend'; import { compose } from 'lodash/fp'; interface ChipsFieldProps { values: Value[]; getLabel?: (value: Value) => string; onChange: (value: Value[]) => void; } export class Chips extends React.Component> { render() { const { values } = this.props; return {values.map(this.renderChip)} ; } renderChip = (value: Value, index: number) => type = 'chip'; dragSpec: DragSourceSpec, { value: Value }> = { beginDrag: ({ value }) => ({ value }), endDrag: ({ value: dragValue }, monitor) => { const { value: dropValue } = monitor.getDropResult(); const dragIndex = this.props.values.indexOf(dragValue); const dropIndex = this.props.values.indexOf(dropValue); const newValues = this.props.values.slice(0); newValues.splice(dragIndex, 1, dropValue); newValues.splice(dropIndex, 1, dragValue); this.props.onChange(newValues); } }; dragCollector: DragSourceCollector<{}> = connect => ({ connectDragSource: connect.dragSource(), }) dropSpec: DropTargetSpec> = { drop: ({ value }) => ({ value }), }; dropCollector: DropTargetCollector<{}> = (connect, monitor) => ({ connectDropTarget: connect.dropTarget(), isOver: monitor.isOver(), }) chip = compose( DragSource(this.type, this.dragSpec, this.dragCollector), DropTarget(this.type, this.dropSpec, this.dropCollector), )( ({ connectDragSource, connectDropTarget, isOver, value }: DraggableChipProps & CollectedProps) => compose( connectDragSource, connectDropTarget, )( ) ); deleteValue = (value: Value) => () => { const { values } = this.props; const index = values.indexOf(value); const newValues = values.slice(0); newValues.splice(index, 1); this.props.onChange(newValues); } } interface CollectedProps { connectDragSource: ConnectDragSource; connectDropTarget: ConnectDropTarget; isOver: boolean; } interface DraggableChipProps { value: Value; }