UNPKG

datajunction-ui

Version:

DataJunction Metrics Platform UI

117 lines (112 loc) 3.31 kB
import { useContext, useEffect, useRef, useState } from 'react'; import * as React from 'react'; import DJClientContext from '../../providers/djclient'; import { Form, Formik } from 'formik'; import EditIcon from '../../icons/EditIcon'; import { displayMessageAfterSubmit } from '../../../utils/form'; export default function EditColumnDescriptionPopover({ column, node, onSubmit, }) { const djClient = useContext(DJClientContext).DataJunctionAPI; const [popoverAnchor, setPopoverAnchor] = useState(false); const ref = useRef(null); useEffect(() => { const handleClickOutside = event => { if (ref.current && !ref.current.contains(event.target)) { setPopoverAnchor(false); } }; document.addEventListener('click', handleClickOutside, true); return () => { document.removeEventListener('click', handleClickOutside, true); }; }, [setPopoverAnchor]); const saveDescription = async ( { node, column, description }, { setSubmitting, setStatus }, ) => { setSubmitting(false); const response = await djClient.setColumnDescription( node, column, description, ); if (response.status === 200 || response.status === 201) { setStatus({ success: 'Saved!' }); } else { setStatus({ failure: `${response.json.message}`, }); } onSubmit(); }; return ( <> <button className="edit_button" aria-label="EditColumnDescription" tabIndex="0" onClick={() => { setPopoverAnchor(!popoverAnchor); }} > <EditIcon /> </button> <div className="popover" role="dialog" aria-label="edit-description" style={{ display: popoverAnchor === false ? 'none' : 'block' }} ref={ref} > <Formik initialValues={{ column: column.name, node: node.name, description: column.description || '', }} onSubmit={saveDescription} > {function Render({ isSubmitting, status, setFieldValue }) { return ( <Form> {displayMessageAfterSubmit(status)} <div className="form-group mt-3"> <label htmlFor="description">Description</label> <textarea name="description" className="form-control" rows="3" onChange={e => setFieldValue('description', e.target.value)} defaultValue={column.description || ''} /> </div> <input hidden={true} name="column" value={column.name} readOnly={true} /> <input hidden={true} name="node" value={node.name} readOnly={true} /> <button className="btn btn-primary mt-3" type="submit" disabled={isSubmitting} > Save </button> </Form> ); }} </Formik> </div> </> ); }