From af3bc4d303ab8926bdbdf3dc3ba0459c8b13ddfe Mon Sep 17 00:00:00 2001 From: Jozef Harag <32jojo32@gmail.com> Date: Tue, 25 Aug 2020 14:24:55 +0200 Subject: [PATCH] WIP: Add autocompletion --- components/search/forms/simple.jsx | 84 ++++++++++++++++------- components/search/forms/styles.module.css | 17 +++++ design.config.js | 26 +++++++ pages/index.jsx | 4 +- 4 files changed, 105 insertions(+), 26 deletions(-) create mode 100644 components/search/forms/styles.module.css create mode 100644 design.config.js diff --git a/components/search/forms/simple.jsx b/components/search/forms/simple.jsx index 6088018d5..3415c5e16 100644 --- a/components/search/forms/simple.jsx +++ b/components/search/forms/simple.jsx @@ -1,24 +1,55 @@ -import React from 'react' -import { Button, InputGroup, InputGroupAddon, Input } from 'reactstrap' +import React, { useRef } from 'react' +import { Select } from '@oacore/design' -const SearchField = ({ - size = '', - id = 'search-form-field', - label = 'Search in CORE', - ...fieldProps -}) => ( - <> - - - - - - - - -) +import styles from './styles.module.css' + +const options = [ + { id: 1, icon: '#magnify', value: 'Option A' }, + { id: 2, icon: '#magnify', value: 'Option B' }, + { id: 3, icon: '#magnify', value: 'Option C' }, + { id: 4, icon: '#magnify', value: 'Option D' }, + { id: 5, icon: '#magnify', value: 'Option E' }, +] + +const SearchAutocompletion = ({ formRef, ...passProps }) => { + const [suggestions, setSuggestions] = React.useState(options) + const [value, setValue] = React.useState('') + + const handleOnChange = data => { + if (data.value === '') return + formRef.current.submit() + } + + const handleOnInput = data => { + // if id doesn't exists it means user type own text + // and didn't use suggestion + if (!data.id) { + setSuggestions( + options.slice(0, Math.max(0, options.length - data.value.length)) + ) + } + + setValue(data.value) + } + + return ( + + ) +} const SearchForm = ({ action, @@ -26,10 +57,13 @@ const SearchForm = ({ onSubmit, id = 'search-form', ...fieldProps -}) => ( -
- - -) +}) => { + const ref = useRef(null) + return ( +
+ + + ) +} export default SearchForm diff --git a/components/search/forms/styles.module.css b/components/search/forms/styles.module.css new file mode 100644 index 000000000..401cab1fe --- /dev/null +++ b/components/search/forms/styles.module.css @@ -0,0 +1,17 @@ +.search-box { + --form-control-corner-radius: 0.3rem; + --form-control-color: var(--gray-500); + --form-label-color: var(--gray-500); +} + +.search-box:focus-within { + --form-control-color: var(--primary); +} + +.search-box:focus-within div:nth-child(2){ + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05), 0 1px 2px rgba(0, 0, 0, 0.25); +} + +.search-box:focus-within div:nth-child(2) > * { + border-color: transparent; +} diff --git a/design.config.js b/design.config.js new file mode 100644 index 000000000..e83b2602a --- /dev/null +++ b/design.config.js @@ -0,0 +1,26 @@ +const path = require('path') + +const icons = ['magnify'] + +const iconsRoot = path.join( + path.dirname(require.resolve('@mdi/svg/package.json')), + './svg' +) + +const config = { + icons: { + path: iconsRoot, + files: icons, + }, + + output: { + path: path.join(__dirname, 'public/design'), + publicPath: '/design', + icons: { + files: 'icons', + sprite: 'icons.svg', + }, + }, +} + +module.exports = config diff --git a/pages/index.jsx b/pages/index.jsx index 74b287c76..7737addf5 100644 --- a/pages/index.jsx +++ b/pages/index.jsx @@ -85,7 +85,9 @@ const IndexPage = () => ( {page.covid19Notice}