import { Colors, IconButton } from 'browndash-components'; import { action, computed, makeObservable, observable, reaction } from 'mobx'; import { observer } from 'mobx-react'; import React from 'react'; import { Doc } from '../../fields/Doc'; import { DocData } from '../../fields/DocSymbols'; import { List } from '../../fields/List'; import { DragManager, SetupDrag } from '../util/DragManager'; import { SnappingManager } from '../util/SnappingManager'; import { DocumentView } from './nodes/DocumentView'; import { ObservableReactComponent } from './ObservableReactComponent'; interface KeywordItemProps { doc: Doc; label: string; setToEditing: () => void; isEditing: boolean; } @observer export class KeywordItem extends ObservableReactComponent { constructor(props: any) { super(props); makeObservable(this); this.ref = React.createRef(); } private _dropDisposer?: DragManager.DragDropDisposer; private ref: React.RefObject; protected createDropTarget = (ele: HTMLDivElement) => { this._dropDisposer?.(); SetupDrag(this.ref, () => undefined); //ele && (this._dropDisposer = DragManager. (ele, this.onInternalDrop.bind(this), this.layoutDoc)); //ele && (this._dropDisposer = DragManager.MakeDropTarget(ele, this.onInternalDrop.bind(this), this.layoutDoc)); }; @action removeLabel = () => { if (this._props.doc[DocData].data_labels) { this._props.doc[DocData].data_labels = (this._props.doc[DocData].data_labels as List).filter(label => label !== this._props.label) as List; this._props.doc![DocData][`${this._props.label}`] = false; } }; render() { return (
{}} ref={this.ref}> {this._props.label} {this.props.isEditing && }
); } } interface KeywordBoxProps { doc: Doc; isEditing: boolean; } @observer export class KeywordBox extends ObservableReactComponent { @observable _currentInput: string = ''; //private disposer: () => void; constructor(props: any) { super(props); makeObservable(this); } // componentDidMount(): void { // reaction( // () => ({ // isDragging: SnappingManager.IsDragging, // selectedDoc: DocumentView.SelectedDocs().lastElement(), // isEditing: this._props.isEditing, // }), // ({ isDragging, selectedDoc, isEditing }) => { // if (isDragging || selectedDoc !== this._props.doc || !isEditing) { // this.setToView(); // } // } // ); // } // componentWillUnmount() { // this.disposer(); // } @action setToEditing = () => { this._props.isEditing = true; }; @action setToView = () => { this._props.isEditing = false; }; submitLabel = () => { if (this._currentInput.trim()) { if (!this._props.doc[DocData].data_labels) { this._props.doc[DocData].data_labels = new List(); } (this._props.doc![DocData].data_labels! as List).push(this._currentInput.trim()); this._props.doc![DocData][`${this._currentInput}`] = true; this._currentInput = ''; // Clear the input box } }; @action onInputChange = (e: React.ChangeEvent) => { this._currentInput = e.target.value; }; render() { const keywordsList = this._props.doc[DocData].data_labels ? this._props.doc[DocData].data_labels : new List(); const seldoc = DocumentView.SelectedDocs().lastElement(); if (SnappingManager.IsDragging || !(seldoc === this._props.doc) || !this._props.isEditing) { setTimeout( action(() => { if ((keywordsList as List).length === 0) { this._props.doc[DocData].showLabels = false; } this.setToView(); }) ); } return (
{(keywordsList as List).map(label => { return ; })}
{this._props.isEditing ? (
{ e.key === 'Enter' ? this.submitLabel() : null; e.stopPropagation(); }} type="text" placeholder="Input keywords for document..." aria-label="keyword-input" className="keyword-input" style={{ width: '100%', borderRadius: '5px' }} />
{ if ((keywordsList as List).length === 0) { this._props.doc[DocData].showLabels = false; } else { this.setToView(); } }} icon={'x'} style={{ width: '4px' }} />
) : (
)}
); } }