UNPKG

model-navigator-standalone

Version:

Standalone MDF graph model visualizer

126 lines (120 loc) 4.63 kB
/* eslint-disable no-unused-vars */ import React, { useRef, useContext, useEffect } from 'react'; import { useSelector, useDispatch } from 'react-redux'; import { Button } from '@mui/material'; import withStyles from '@mui/styles/withStyles'; import './AutoCompleteInput.css'; import CloseIcon from '@mui/icons-material/Close'; import SearchIcon from '@mui/icons-material/Search'; import styles from './AutoCompleteInputStyle'; import { ModelContext } from '../../../Model/ModelContext'; import { prepareSearchData, searchKeyword } from '../DictionarySearcher/searchHelper.js'; import { changedVisAcCloseIcon, searchStarted, searchDataPrepared, searchCompleted, searchResultCleared, suggestionItemClicked, suggestionItemReset, suggestionsCleared, selectSearchData, selectClickedSuggestionItem, historyItemClicked, historyItemReset, selectAcCloseIconHidden, selectClickedHistoryItem } from '../../../../../features/search/searchSlice'; import { selectModelID } from '../../../../../features/graph/graphSlice'; // import acInputReducer from './AutoCompleteInputReducer'; function AutoCompleteInput(_ref) { let { classes, placeHolderText, inputTitle } = _ref; const dispatch = useDispatch(); const closeIconHidden = useSelector(selectAcCloseIconHidden); const clickedSuggestionItem = useSelector(selectClickedSuggestionItem); const clickedHistoryItem = useSelector(selectClickedHistoryItem); const model = useContext(ModelContext); const modelID = useSelector(selectModelID); const searchData = useSelector(selectSearchData); let inputRef = useRef(null); const search = function search(str) { let save = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; dispatch(searchStarted(str)); const { result, msg } = searchKeyword(searchData, "".concat(str).toLowerCase()); dispatch(searchCompleted({ result, errorMsg: msg, save })); return result && result.length > 0 ? result : null; }; const suggest = str => { search(str, false); }; // handler produces a submitted search const handleSubmitInput = inputText => { search(inputText); }; // handler produces autocomplete const handleInputChange = inputText => { if (inputText.length > 1) { suggest(inputText); } dispatch(changedVisAcCloseIcon(!!inputText ? 'show' : 'hide')); }; const handleChange = () => { handleInputChange(inputRef.current.value); }; const handleClickedSuggItem = () => { if (inputRef.current) { inputRef.current.value = clickedSuggestionItem.fullString; handleSubmit(); dispatch(suggestionsCleared()); } }; const handleClickedHistItem = () => { if (inputRef.current) { inputRef.current.value = clickedHistoryItem.keywordStr; handleSubmit(); dispatch(historyItemReset()); } }; const handleClear = () => { inputRef.current.value = ''; handleInputChange(''); dispatch(searchResultCleared()); dispatch(suggestionsCleared()); dispatch(changedVisAcCloseIcon('hide')); }; const handleSubmit = e => { e && e.preventDefault(); handleSubmitInput(inputRef.current.value); }; // update search data when new model appears useEffect(() => { let id = modelID; const searchData = prepareSearchData(model); dispatch(searchDataPrepared(searchData)); }, [modelID]); return /*#__PURE__*/React.createElement("div", { className: classes.autoCompleteInput }, clickedSuggestionItem && handleClickedSuggItem(), clickedHistoryItem && handleClickedHistItem(), /*#__PURE__*/React.createElement("form", { className: classes.autoCompleteInputForm, onSubmit: handleSubmit }, /*#__PURE__*/React.createElement("input", { title: inputTitle, className: classes.autoCompleteInputBox, onChange: handleChange, placeholder: placeHolderText, ref: inputRef })), !closeIconHidden && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, { onClick: handleClear, disableRipple: true, className: classes.closeBtn, "aria-label": "Clear search" }, /*#__PURE__*/React.createElement(CloseIcon, { className: classes.closeIcon })), /*#__PURE__*/React.createElement("i", { className: classes.verticalLine })), /*#__PURE__*/React.createElement(Button, { onClick: handleSubmit, disableRipple: true, className: classes.searchBtn, "aria-label": "Submit search" }, /*#__PURE__*/React.createElement(SearchIcon, { className: classes.searchIcon }))); } export default withStyles(styles)(AutoCompleteInput);