diff --git a/src/demo/App.js b/src/demo/App.js index 8a46bab9..97da8633 100644 --- a/src/demo/App.js +++ b/src/demo/App.js @@ -9,7 +9,7 @@ import { ProfileUploader, useNotification, FormModel, - AutoSaveDefaultSpinner, + Spinner, ProfileViewer } from '@lib'; import { AccessControlList } from '@classes'; @@ -167,15 +167,18 @@ const App = () => { { @@ -199,7 +202,6 @@ const App = () => { console.log(response); } }} - autoSave liveUpdate /> { const { [UI.LABEL]: label } = data; const onChange = event => { - updateData(id, String(event.target.checked)); + const updatedPart = { ...data, value: String(event.target.checked) }; + updateData(id, updatedPart); }; return ( @@ -39,6 +40,7 @@ export const CheckBox = (props: Props) => { {label} { + const { id, data, updateData } = props; + const { theme } = useContext(ThemeContext); + + const { + [UI.LABEL]: label, + [UI.VALUE]: initialValue, + [UI.CATEGORY]: category, + [UI.VALUES]: values + } = data; -const Classifier = ({ - value, - id, - modifyFormObject, - formObject, - onSave, - autoSave, - onBlur, - ...rest -}: Props) => { const [options, setOptions] = useState([]); - const from = rest['ui:category'] || null; - const label = rest['ui:label'] || ''; + const [value, setValue] = useState(initialValue); + /** + * Init function to make use of async + * This function fetches the classifier option list from a helper, or returns the list of hardcoded values + * if such a list exists as a prop + * @returns {Promise} + */ const init = async () => { - const values = rest['ui:values']; - let docOptions = []; - if (from) { - docOptions = await n3Helper.getClassifierOptions(from); + let optionsList = []; + if (category) { + optionsList = await n3Helper.getClassifierOptions(category); } else { - docOptions = values ? [...values] : []; + optionsList = values ? [...values] : []; } - setOptions(docOptions); + setOptions(optionsList); }; - const getValueFromObject = useCallback(value => { - return typeof value === 'object' ? value.value : value; - }); + /** + * Initialize data for the dropdown + */ + useEffect(() => { + init(); + }, []); + /** + * Fetch a user-friendly label for the option. If the option is a link, this returns the predicate name + * @type {function(string): string} + */ const getDropDownLabel = useCallback((value: string) => { return value && value.includes('#') ? value.split('#')[1] : value; }); + const onChange = async event => { + await setValue(event.target.value); + }; + + useEffect(() => { + if (value !== initialValue) { + const updatedPart = { ...data, value }; + updateData(id, updatedPart); + } + }, [value]); + + /* + const getValueFromObject = useCallback(value => { + return typeof value === 'object' ? value.value : value; + }); + const onChange = ({ target }) => { const obj = { value: target.value, ...rest }; modifyFormObject(id, obj); }; + console.log(formObject); const actualValue = formObject[id] || formObject[id] === '' ? getValueFromObject(formObject[id].value) : value; - useEffect(() => { - init(); - }, []); +*/ return ( - - {({ theme }) => ( - - - - - )} - + + + + ); }; diff --git a/src/lib/components/FormModel/children/Form/UI/ColorPicker/color-picker.component.js b/src/lib/components/FormModel/children/Form/UI/ColorPicker/color-picker.component.js index fb33f655..5a0e94fe 100644 --- a/src/lib/components/FormModel/children/Form/UI/ColorPicker/color-picker.component.js +++ b/src/lib/components/FormModel/children/Form/UI/ColorPicker/color-picker.component.js @@ -25,7 +25,8 @@ const ColorPicker = (props: Props) => { const handleChangeComplete = color => { setColor(color.hex); - updateData(id, color.hex); + const updatedPart = { ...data, value: color.hex }; + updateData(id, updatedPart); }; const handleClick = () => { diff --git a/src/lib/components/FormModel/children/Form/UI/DateTimePicker/date-time-picker.component.js b/src/lib/components/FormModel/children/Form/UI/DateTimePicker/date-time-picker.component.js index affac2c7..87ab3eb1 100644 --- a/src/lib/components/FormModel/children/Form/UI/DateTimePicker/date-time-picker.component.js +++ b/src/lib/components/FormModel/children/Form/UI/DateTimePicker/date-time-picker.component.js @@ -34,7 +34,8 @@ export const DateTimePicker = props => { const onChange = date => { /* User wants to remove the date */ if (!date) { - updateData(id, ''); + const updatedPart = { ...data, value: '' }; + updateData(id, updatedPart); setDate(null); return; } @@ -45,7 +46,8 @@ export const DateTimePicker = props => { if (type === UITypes.DateField) value = format(date, DATE_FORMAT.DATE); if (type === UITypes.DateTimeField) value = date.toISOString(); - updateData(id, value); + const updatedPart = { ...data, value }; + updateData(id, updatedPart); setDate(date); }; diff --git a/src/lib/components/FormModel/children/Form/UI/Decimal/decimal.component.js b/src/lib/components/FormModel/children/Form/UI/Decimal/decimal.component.js index 13e0eaae..453edc9d 100644 --- a/src/lib/components/FormModel/children/Form/UI/Decimal/decimal.component.js +++ b/src/lib/components/FormModel/children/Form/UI/Decimal/decimal.component.js @@ -21,7 +21,10 @@ export const Decimal = props => { setValue(event.target.value); }; - const onBlur = () => updateData(id, value); + const onBlur = () => { + const updatedPart = { ...data, value }; + updateData(id, updatedPart); + }; return (
diff --git a/src/lib/components/FormModel/children/Form/UI/Email/email.component.js b/src/lib/components/FormModel/children/Form/UI/Email/email.component.js index 792d4800..d282221b 100644 --- a/src/lib/components/FormModel/children/Form/UI/Email/email.component.js +++ b/src/lib/components/FormModel/children/Form/UI/Email/email.component.js @@ -1,6 +1,7 @@ import React, { useState, useContext } from 'react'; import { InputTextTypes, UI, RDF } from '@constants'; import { ThemeContext } from '@context'; +import { InputGroup } from '../Input/input.styles'; type Props = { id: string, @@ -25,10 +26,13 @@ export const Email = (props: Props) => { const onChange = event => setValue(event.target.value); - const onBlur = () => updateData(id, value); + const onBlur = () => { + const updatedPart = { ...data, value }; + updateData(id, updatedPart); + }; return ( -
+ { onBlur }} /> -
+ ); }; diff --git a/src/lib/components/FormModel/children/Form/UI/Float/float.component.js b/src/lib/components/FormModel/children/Form/UI/Float/float.component.js index f87bf830..4c44593b 100644 --- a/src/lib/components/FormModel/children/Form/UI/Float/float.component.js +++ b/src/lib/components/FormModel/children/Form/UI/Float/float.component.js @@ -25,7 +25,10 @@ export const Float = (props: Props) => { const onChange = event => setValue(event.target.value); - const onBlur = () => updateData(id, value); + const onBlur = () => { + const updatedPart = { ...data, value }; + updateData(id, updatedPart); + }; return (
diff --git a/src/lib/components/FormModel/children/Form/UI/Input/input.component.js b/src/lib/components/FormModel/children/Form/UI/Input/input.component.js index c35cdf56..31e9809b 100644 --- a/src/lib/components/FormModel/children/Form/UI/Input/input.component.js +++ b/src/lib/components/FormModel/children/Form/UI/Input/input.component.js @@ -1,7 +1,6 @@ import React, { useContext, useState } from 'react'; - +import { InputGroup } from './input.styles'; import { ThemeContext } from '@context'; - import { UI, RDF, InputTextTypes } from '@constants'; export const Input = props => { @@ -22,11 +21,12 @@ export const Input = props => { }; const onBlur = () => { - updateData(id, value); + const updatedPart = { ...data, value }; + updateData(id, updatedPart); }; return ( -
+ { onBlur }} /> -
+ ); }; diff --git a/src/lib/components/FormModel/children/Form/UI/Integer/integer.component.js b/src/lib/components/FormModel/children/Form/UI/Integer/integer.component.js index 89586333..9be71739 100644 --- a/src/lib/components/FormModel/children/Form/UI/Integer/integer.component.js +++ b/src/lib/components/FormModel/children/Form/UI/Integer/integer.component.js @@ -26,7 +26,10 @@ export const Integer = (props: Props) => { if (event.target.value === '' || re.test(event.target.value)) setValue(event.target.value); }; - const onBlur = () => updateData(id, value); + const onBlur = () => { + const updatedPart = { ...data, value }; + updateData(id, updatedPart); + }; return (
diff --git a/src/lib/components/FormModel/children/Form/UI/Multiple/index.js b/src/lib/components/FormModel/children/Form/UI/Multiple/index.js deleted file mode 100644 index f6a6fcc5..00000000 --- a/src/lib/components/FormModel/children/Form/UI/Multiple/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import { Multiple } from './multiple.component'; - -export default Multiple; diff --git a/src/lib/components/FormModel/children/Form/UI/Multiple/multiple.component.js b/src/lib/components/FormModel/children/Form/UI/Multiple/multiple.component.js deleted file mode 100644 index 595c55b4..00000000 --- a/src/lib/components/FormModel/children/Form/UI/Multiple/multiple.component.js +++ /dev/null @@ -1,8 +0,0 @@ -import React from 'react'; - -export const Multiple = ({ field, addNewField, className }) => - field['rdf:type'].includes('Multiple') && ( - - ); diff --git a/src/lib/components/FormModel/children/Form/UI/Multiple/multiple.styles.js b/src/lib/components/FormModel/children/Form/UI/Multiple/multiple.styles.js deleted file mode 100644 index e69de29b..00000000 diff --git a/src/lib/components/FormModel/children/Form/UI/Phone/phone.component.js b/src/lib/components/FormModel/children/Form/UI/Phone/phone.component.js index 2f1ef5b7..ac1aad33 100644 --- a/src/lib/components/FormModel/children/Form/UI/Phone/phone.component.js +++ b/src/lib/components/FormModel/children/Form/UI/Phone/phone.component.js @@ -1,6 +1,7 @@ import React, { useState, useContext } from 'react'; import { InputTextTypes, UI, RDF } from '@constants'; import { ThemeContext } from '@context'; +import { InputGroup } from '../Input/input.styles'; type Props = { id: string, @@ -25,10 +26,13 @@ export const Phone = (props: Props) => { const onChange = event => setValue(event.target.value); - const onBlur = () => updateData(id, value); + const onBlur = () => { + const updatedPart = { ...data, value }; + updateData(id, updatedPart); + }; return ( -
+ { onBlur }} /> -
+ ); }; diff --git a/src/lib/components/FormModel/children/Form/UI/RadioButton/radio-button.component.js b/src/lib/components/FormModel/children/Form/UI/RadioButton/radio-button.component.js index db3f27b5..8ea57f3f 100644 --- a/src/lib/components/FormModel/children/Form/UI/RadioButton/radio-button.component.js +++ b/src/lib/components/FormModel/children/Form/UI/RadioButton/radio-button.component.js @@ -18,7 +18,10 @@ export const RadioButton = (props: Props) => { const onChange = event => setValue(event.target.value); - const onBlur = () => updateData(id, value); + const onBlur = () => { + const updatedPart = { ...data, value }; + updateData(id, updatedPart); + }; return (
diff --git a/src/lib/components/FormModel/children/Form/UI/TextArea/text-area.component.js b/src/lib/components/FormModel/children/Form/UI/TextArea/text-area.component.js index c5c2672c..1ca58fb9 100644 --- a/src/lib/components/FormModel/children/Form/UI/TextArea/text-area.component.js +++ b/src/lib/components/FormModel/children/Form/UI/TextArea/text-area.component.js @@ -1,7 +1,7 @@ import React, { useState, useContext } from 'react'; import { ThemeContext } from '@context'; - import { UI } from '@constants'; +import { TextAreaGroup } from './text-area.styles'; type Props = { id: string, @@ -19,19 +19,23 @@ export const TextArea = (props: Props) => { const onChange = event => setValue(event.target.value); - const onBlur = () => updateData(id, value); + const onBlur = () => { + const updatedPart = { ...data, value }; + updateData(id, updatedPart); + }; return ( -
+