From b59a9ebd29b501fc93aa5a092f04043e06d6b811 Mon Sep 17 00:00:00 2001 From: Mateusz Puczynski Date: Wed, 2 Jan 2019 14:22:51 +0100 Subject: [PATCH 01/15] add del button functionality --- src/components/fields/ObjectField.js | 16 +++++++ src/components/fields/SchemaField.js | 70 ++++++++++++++++++++++------ 2 files changed, 71 insertions(+), 15 deletions(-) diff --git a/src/components/fields/ObjectField.js b/src/components/fields/ObjectField.js index 4b7edb41f3..89a5d379b6 100644 --- a/src/components/fields/ObjectField.js +++ b/src/components/fields/ObjectField.js @@ -82,6 +82,10 @@ class ObjectField extends Component { onPropertyChange = name => { return (value, errorSchema) => { const newFormData = { ...this.props.formData, [name]: value }; + console.group(); + console.log(this.props.newFormData); + console.log({ [name]: value }); + console.groupEnd(); this.props.onChange( newFormData, errorSchema && @@ -93,6 +97,17 @@ class ObjectField extends Component { }; }; + onDropIndexClick = index => { + return event => { + if (event) { + event.preventDefault(); + } + const { onChange, formData } = this.props; + delete formData[index]; + onChange(formData); + }; + }; + getAvailableKey = (preferredKey, formData) => { var index = 0; var newKey = preferredKey; @@ -219,6 +234,7 @@ class ObjectField extends Component { registry={registry} disabled={disabled} readonly={readonly} + onDropIndexClick={this.onDropIndexClick} /> ), name, diff --git a/src/components/fields/SchemaField.js b/src/components/fields/SchemaField.js index fd7ff9a795..e9f9ec24c3 100644 --- a/src/components/fields/SchemaField.js +++ b/src/components/fields/SchemaField.js @@ -1,4 +1,5 @@ import { ADDITIONAL_PROPERTY_FLAG } from "../../utils"; +import IconButton from "../IconButton"; import React from "react"; import PropTypes from "prop-types"; @@ -121,31 +122,68 @@ function DefaultTemplate(props) { required, displayLabel, onKeyChange, + onDropIndexClick, } = props; if (hidden) { return children; } + const btnStyle = { + flex: 1, + paddingLeft: 10, + paddingRight: 10, + fontWeight: "bold", + height: "34px", + }; const additional = props.schema.hasOwnProperty(ADDITIONAL_PROPERTY_FLAG); - const keyLabel = `${label} Key`; + // const keyLabel = `Key`; + + const contentStyle = additional + ? { + clear: "both", + display: "flex", + marginBottom: 0, + } + : {}; return ( -
+
{additional && ( -
-
); } @@ -186,6 +224,7 @@ function SchemaFieldRender(props) { idPrefix, name, onKeyChange, + onDropIndexClick, required, registry = getDefaultRegistry(), } = props; @@ -285,6 +324,7 @@ function SchemaFieldRender(props) { label, hidden, onKeyChange, + onDropIndexClick, required, disabled, readonly, From a748ee13914c3e474128d05b238074420652e7a6 Mon Sep 17 00:00:00 2001 From: Mateusz Puczynski Date: Wed, 2 Jan 2019 14:45:17 +0100 Subject: [PATCH 02/15] delete unnecesary console.logs --- src/components/Form.js | 1 + src/components/fields/ObjectField.js | 4 ---- src/components/fields/SchemaField.js | 4 ++-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/components/Form.js b/src/components/Form.js index 6863d74374..cb7bee054b 100644 --- a/src/components/Form.js +++ b/src/components/Form.js @@ -130,6 +130,7 @@ export default class Form extends Component { errors: toErrorList(newErrorSchema), }; } + setState(this, state, () => { if (this.props.onChange) { this.props.onChange(this.state); diff --git a/src/components/fields/ObjectField.js b/src/components/fields/ObjectField.js index 89a5d379b6..3aef92d5f8 100644 --- a/src/components/fields/ObjectField.js +++ b/src/components/fields/ObjectField.js @@ -82,10 +82,6 @@ class ObjectField extends Component { onPropertyChange = name => { return (value, errorSchema) => { const newFormData = { ...this.props.formData, [name]: value }; - console.group(); - console.log(this.props.newFormData); - console.log({ [name]: value }); - console.groupEnd(); this.props.onChange( newFormData, errorSchema && diff --git a/src/components/fields/SchemaField.js b/src/components/fields/SchemaField.js index e9f9ec24c3..4b222f437f 100644 --- a/src/components/fields/SchemaField.js +++ b/src/components/fields/SchemaField.js @@ -135,7 +135,7 @@ function DefaultTemplate(props) { height: "34px", }; const additional = props.schema.hasOwnProperty(ADDITIONAL_PROPERTY_FLAG); - // const keyLabel = `Key`; + const keyLabel = `${label} Key`; const contentStyle = additional ? { @@ -154,7 +154,7 @@ function DefaultTemplate(props) { padding: 0, }}>
- {/*
); } - function DefaultTemplate(props) { const { id, @@ -164,10 +163,9 @@ function DefaultTemplate(props) {
)} +
- {displayLabel && ( -
); } - if (process.env.NODE_ENV !== "production") { DefaultTemplate.propTypes = { id: PropTypes.string, diff --git a/src/components/fields/StringField.js b/src/components/fields/StringField.js index 91fcf6911e..6ef3f3cbff 100644 --- a/src/components/fields/StringField.js +++ b/src/components/fields/StringField.js @@ -34,7 +34,6 @@ function StringField(props) { uiSchema ); const Widget = getWidget(schema, widget, widgets); - return ( { ArrayFieldTemplate, }); - expect(node.querySelectorAll(".field-array div")).to.have.length.of(3); + expect(node.querySelectorAll(".field-array div")).to.have.length.of(4); }); }); diff --git a/test/ArrayField_test.js b/test/ArrayField_test.js index 633c57347c..5e90802bc8 100644 --- a/test/ArrayField_test.js +++ b/test/ArrayField_test.js @@ -24,7 +24,8 @@ describe("ArrayField", () => { const { node } = createFormComponent({ schema: { type: "array" } }); expect( - node.querySelector(".field-array > .unsupported-field").textContent + node.querySelector(".field-array > div > .unsupported-field") + .textContent ).to.contain("Missing items definition"); }); }); diff --git a/test/ObjectField_test.js b/test/ObjectField_test.js index a0554e4b5f..51986e4f23 100644 --- a/test/ObjectField_test.js +++ b/test/ObjectField_test.js @@ -197,7 +197,7 @@ describe("ObjectField", () => { }, }); const labels = [].map.call( - node.querySelectorAll(".field > label"), + node.querySelectorAll(".field > div > label"), l => l.textContent ); @@ -212,7 +212,7 @@ describe("ObjectField", () => { }, }); const labels = [].map.call( - node.querySelectorAll(".field > label"), + node.querySelectorAll(".field > div > label"), l => l.textContent ); @@ -277,7 +277,7 @@ describe("ObjectField", () => { }, }); const labels = [].map.call( - node.querySelectorAll(".field > label"), + node.querySelectorAll(".field > div > label"), l => l.textContent ); @@ -310,7 +310,7 @@ describe("ObjectField", () => { }, }); const labels = [].map.call( - node.querySelectorAll(".field > label"), + node.querySelectorAll(".field > div > label"), l => l.textContent ); diff --git a/test/SchemaField_test.js b/test/SchemaField_test.js index fa503d767e..714375660a 100644 --- a/test/SchemaField_test.js +++ b/test/SchemaField_test.js @@ -313,7 +313,7 @@ describe("SchemaField", () => { submit(node); const matches = node.querySelectorAll( - "form > .form-group > div > .error-detail .text-danger" + "form > .form-group > div > div > .error-detail .text-danger" ); expect(matches).to.have.length.of(1); expect(matches[0].textContent).to.eql("container"); diff --git a/test/StringField_test.js b/test/StringField_test.js index 4a9625ca76..9fe1433391 100644 --- a/test/StringField_test.js +++ b/test/StringField_test.js @@ -28,7 +28,7 @@ describe("StringField", () => { }); expect( - node.querySelectorAll(".field input[type=text]") + node.querySelectorAll(".field input[type=text]"), ).to.have.length.of(1); }); @@ -408,7 +408,7 @@ describe("StringField", () => { }); expect( - node.querySelectorAll(".field [type=datetime-local]") + node.querySelectorAll(".field [type=datetime-local]"), ).to.have.length.of(1); }); @@ -440,7 +440,7 @@ describe("StringField", () => { }); expect(node.querySelector("[type=datetime-local]").value).eql( - utcToLocal(newDatetime) + utcToLocal(newDatetime), ); }); @@ -769,7 +769,7 @@ describe("StringField", () => { const lengths = [].map.call( node.querySelectorAll("select"), - node => node.length + node => node.length, ); expect(lengths).eql([ @@ -840,7 +840,7 @@ describe("StringField", () => { const buttonLabels = [].map.call( node.querySelectorAll("a.btn"), - x => x.textContent + x => x.textContent, ); expect(buttonLabels).eql(["Now", "Clear"]); }); @@ -1016,7 +1016,7 @@ describe("StringField", () => { const lengths = [].map.call( node.querySelectorAll("select"), - node => node.length + node => node.length, ); expect(lengths).eql([ @@ -1099,7 +1099,7 @@ describe("StringField", () => { const buttonLabels = [].map.call( node.querySelectorAll("a.btn"), - x => x.textContent + x => x.textContent, ); expect(buttonLabels).eql(["Now", "Clear"]); }); @@ -1117,7 +1117,7 @@ describe("StringField", () => { const expected = toDateString( parseDateString(new Date().toJSON()), - false + false, ); expect(comp.state.formData).eql(expected); }); @@ -1549,8 +1549,8 @@ describe("StringField", () => { return new Promise(setImmediate).then(() => expect(comp.state.formData).eql( - "data:text/plain;name=file1.txt;base64,x=" - ) + "data:text/plain;name=file1.txt;base64,x=", + ), ); }); From 8f5f597d5f9403a79a8c41268a6f89407ea8724c Mon Sep 17 00:00:00 2001 From: Mateusz Puczynski Date: Thu, 3 Jan 2019 14:10:49 +0100 Subject: [PATCH 04/15] remove unnecesary console.log --- src/components/fields/ObjectField.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/components/fields/ObjectField.js b/src/components/fields/ObjectField.js index ed4dc0703d..2c022df6fb 100644 --- a/src/components/fields/ObjectField.js +++ b/src/components/fields/ObjectField.js @@ -28,7 +28,6 @@ function DefaultObjectFieldTemplate(props) { }; const { TitleField, DescriptionField } = props; - console.log(props.properties); return (
{(props.uiSchema["ui:title"] || props.title) && ( @@ -82,10 +81,6 @@ class ObjectField extends Component { onPropertyChange = name => { return (value, errorSchema) => { - console.group(); - console.log(name); - console.log(value); - console.groupEnd(); const newFormData = { ...this.props.formData, [name]: value }; this.props.onChange( newFormData, @@ -209,7 +204,6 @@ class ObjectField extends Component { } const Template = registry.ObjectFieldTemplate || DefaultObjectFieldTemplate; - const templateProps = { title: uiSchema["ui:title"] || title, description, From ba1181dffc793f6a878b1e2fb3793550da830715 Mon Sep 17 00:00:00 2001 From: Mateusz Puczynski Date: Thu, 3 Jan 2019 15:05:04 +0100 Subject: [PATCH 05/15] Fix disappearing key-value pair and repair delete button --- src/components/fields/ObjectField.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/components/fields/ObjectField.js b/src/components/fields/ObjectField.js index 2c022df6fb..d070e87541 100644 --- a/src/components/fields/ObjectField.js +++ b/src/components/fields/ObjectField.js @@ -81,7 +81,7 @@ class ObjectField extends Component { onPropertyChange = name => { return (value, errorSchema) => { - const newFormData = { ...this.props.formData, [name]: value }; + const newFormData = { ...this.props.formData, [name]: value || "" }; this.props.onChange( newFormData, errorSchema && @@ -99,8 +99,9 @@ class ObjectField extends Component { event.preventDefault(); } const { onChange, formData } = this.props; - delete formData[index]; - onChange(formData); + const copiedFormData = { ...formData }; + delete copiedFormData[index]; + onChange(copiedFormData); }; }; @@ -136,7 +137,6 @@ class ObjectField extends Component { ); }; }; - getDefaultValue(type) { switch (type) { case "string": @@ -204,6 +204,7 @@ class ObjectField extends Component { } const Template = registry.ObjectFieldTemplate || DefaultObjectFieldTemplate; + const templateProps = { title: uiSchema["ui:title"] || title, description, From 939209c8325ab82e5133a624d66b3d93f82a0adc Mon Sep 17 00:00:00 2001 From: Mateusz Puczynski Date: Thu, 3 Jan 2019 15:06:00 +0100 Subject: [PATCH 06/15] Add .vscode to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 03c1b53ecb..ad934179f3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ build dist lib yarn.lock +.vscode \ No newline at end of file From d4569a97bd7dd4032242eee8cf0096fd1dd6c18f Mon Sep 17 00:00:00 2001 From: Mateusz Puczynski Date: Thu, 3 Jan 2019 15:36:49 +0100 Subject: [PATCH 07/15] fix tests --- src/components/fields/ObjectField.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/components/fields/ObjectField.js b/src/components/fields/ObjectField.js index d070e87541..c2b2939b7b 100644 --- a/src/components/fields/ObjectField.js +++ b/src/components/fields/ObjectField.js @@ -81,7 +81,10 @@ class ObjectField extends Component { onPropertyChange = name => { return (value, errorSchema) => { - const newFormData = { ...this.props.formData, [name]: value || "" }; + const newFormData = { + ...this.props.formData, + [name]: value, + }; this.props.onChange( newFormData, errorSchema && @@ -137,6 +140,7 @@ class ObjectField extends Component { ); }; }; + getDefaultValue(type) { switch (type) { case "string": @@ -187,7 +191,6 @@ class ObjectField extends Component { const title = schema.title === undefined ? name : schema.title; const description = uiSchema["ui:description"] || schema.description; let orderedProperties; - try { const properties = Object.keys(schema.properties); orderedProperties = orderProperties(properties, uiSchema["ui:order"]); From eb72a4e80ee247eb6770860f5d9b34917259085e Mon Sep 17 00:00:00 2001 From: Mateusz Puczynski Date: Thu, 3 Jan 2019 15:59:55 +0100 Subject: [PATCH 08/15] Make test work for select/radio button --- src/components/fields/ObjectField.js | 25 +++++++++++++++++++------ src/components/fields/SchemaField.js | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/components/fields/ObjectField.js b/src/components/fields/ObjectField.js index c2b2939b7b..f6489d3936 100644 --- a/src/components/fields/ObjectField.js +++ b/src/components/fields/ObjectField.js @@ -7,6 +7,7 @@ import { retrieveSchema, getDefaultRegistry, getUiOptions, + ADDITIONAL_PROPERTY_FLAG, } from "../../utils"; function DefaultObjectFieldTemplate(props) { @@ -79,12 +80,21 @@ class ObjectField extends Component { ); } - onPropertyChange = name => { + onPropertyChange = (name, additionalProperties = false) => { return (value, errorSchema) => { - const newFormData = { - ...this.props.formData, - [name]: value, - }; + let newFormData; + if (!value && additionalProperties) { + newFormData = { + ...this.props.formData, + [name]: "", + }; + } else { + newFormData = { + ...this.props.formData, + [name]: value, + }; + } + this.props.onChange( newFormData, errorSchema && @@ -214,6 +224,9 @@ class ObjectField extends Component { TitleField, DescriptionField, properties: orderedProperties.map(name => { + const additionalPropertyFlag = schema.properties[name].hasOwnProperty( + ADDITIONAL_PROPERTY_FLAG + ); return { content: ( -
+
)} -
+
{displayLabel &&