diff --git a/docs/advanced-customization/custom-templates.md b/docs/advanced-customization/custom-templates.md
index 5eabf6a5ee..bd91607a79 100644
--- a/docs/advanced-customization/custom-templates.md
+++ b/docs/advanced-customization/custom-templates.md
@@ -219,5 +219,6 @@ The following props are part of each element in `properties`:
- `name`: A string representing the property name.
- `disabled`: A boolean value stating if the object property is disabled.
- `readonly`: A boolean value stating if the property is read-only.
+- `hidden`: A boolean value stating if the property should be hidden.
> Note: Array and object field templates are always rendered inside of the FieldTemplate. To fully customize an object field template, you may need to specify both `ui:FieldTemplate` and `ui:ObjectFieldTemplate`.
diff --git a/packages/antd/src/templates/ObjectFieldTemplate/index.js b/packages/antd/src/templates/ObjectFieldTemplate/index.js
index c558435969..4652f18461 100644
--- a/packages/antd/src/templates/ObjectFieldTemplate/index.js
+++ b/packages/antd/src/templates/ObjectFieldTemplate/index.js
@@ -75,9 +75,6 @@ const ObjectFieldTemplate = ({
return defaultColSpan;
};
- const filterHidden = (element) =>
- element.content.props.uiSchema['ui:widget'] !== 'hidden';
-
return (
@@ -99,7 +96,7 @@ const ObjectFieldTemplate = ({
/>
)}
- {properties.filter(filterHidden).map((element) => (
+ {properties.filter((e) => !e.hidden).map((element) => (
{element.content}
diff --git a/packages/antd/test/Form.test.js b/packages/antd/test/Form.test.js
index 2e57ce61ef..d408c9710d 100644
--- a/packages/antd/test/Form.test.js
+++ b/packages/antd/test/Form.test.js
@@ -78,4 +78,23 @@ describe("single fields", () => {
.toJSON();
expect(tree).toMatchSnapshot();
});
+ test("hidden field", () => {
+ const schema = {
+ type: "object",
+ properties: {
+ "my-field": {
+ type: "string",
+ },
+ },
+ };
+ const uiSchema = {
+ "my-field": {
+ "ui:widget": "hidden",
+ },
+ };
+ const tree = renderer
+ .create()
+ .toJSON();
+ expect(tree).toMatchSnapshot();
+ });
});
diff --git a/packages/antd/test/__snapshots__/Form.test.js.snap b/packages/antd/test/__snapshots__/Form.test.js.snap
index 155f4967db..057c23adab 100644
--- a/packages/antd/test/__snapshots__/Form.test.js.snap
+++ b/packages/antd/test/__snapshots__/Form.test.js.snap
@@ -1,5 +1,39 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`single fields hidden field 1`] = `
+
+`;
+
exports[`single fields null field 1`] = `
`;
+exports[`single fields hidden field 1`] = `
+
+
+
+
+ Submit
+
+
+
+`;
+
exports[`single fields null field 1`] = `
() => void;
readonly: boolean;
diff --git a/packages/core/src/components/fields/ObjectField.js b/packages/core/src/components/fields/ObjectField.js
index 09de06e318..fa80926c45 100644
--- a/packages/core/src/components/fields/ObjectField.js
+++ b/packages/core/src/components/fields/ObjectField.js
@@ -229,6 +229,11 @@ class ObjectField extends Component {
const addedByAdditionalProperties = schema.properties[
name
].hasOwnProperty(ADDITIONAL_PROPERTY_FLAG);
+ const fieldUiSchema = addedByAdditionalProperties
+ ? uiSchema.additionalProperties
+ : uiSchema[name];
+ const hidden = fieldUiSchema && fieldUiSchema["ui:widget"] === "hidden";
+
return {
content: (
{
// TODO: do this better by not returning the form-group class from master.
classNames = "ms-Grid-col ms-sm12 " + classNames.replace("form-group", "");
return (
-
+
{children}
{/* {displayLabel &&
{label}
diff --git a/packages/fluent-ui/src/ObjectFieldTemplate/ObjectFieldTemplate.tsx b/packages/fluent-ui/src/ObjectFieldTemplate/ObjectFieldTemplate.tsx
index 3b7f9bda38..f5758e8069 100644
--- a/packages/fluent-ui/src/ObjectFieldTemplate/ObjectFieldTemplate.tsx
+++ b/packages/fluent-ui/src/ObjectFieldTemplate/ObjectFieldTemplate.tsx
@@ -29,7 +29,7 @@ const ObjectFieldTemplate = ({
- {properties.map((element: any) => element.content)}
+ {properties.map((element) => element.content)}
>
diff --git a/packages/fluent-ui/test/Form.test.tsx b/packages/fluent-ui/test/Form.test.tsx
index 08157ff539..779c36ba2a 100644
--- a/packages/fluent-ui/test/Form.test.tsx
+++ b/packages/fluent-ui/test/Form.test.tsx
@@ -2,6 +2,7 @@ import React from 'react';
import Form from "../src/index";
import { JSONSchema7 } from "json-schema";
import renderer from "react-test-renderer";
+import { UiSchema } from '@rjsf/core';
describe("single fields", () => {
describe("string field", () => {
@@ -72,4 +73,23 @@ describe("single fields", () => {
.toJSON();
expect(tree).toMatchSnapshot();
});
-});
\ No newline at end of file
+ test("hidden field", () => {
+ const schema: JSONSchema7 = {
+ type: "object",
+ properties: {
+ "my-field": {
+ type: "string",
+ },
+ },
+ };
+ const uiSchema: UiSchema = {
+ "my-field": {
+ "ui:widget": "hidden",
+ },
+ };
+ const tree = renderer
+ .create( )
+ .toJSON();
+ expect(tree).toMatchSnapshot();
+ });
+});
diff --git a/packages/fluent-ui/test/__snapshots__/Array.test.tsx.snap b/packages/fluent-ui/test/__snapshots__/Array.test.tsx.snap
index cc3c1d4902..d2c164a236 100644
--- a/packages/fluent-ui/test/__snapshots__/Array.test.tsx.snap
+++ b/packages/fluent-ui/test/__snapshots__/Array.test.tsx.snap
@@ -10,6 +10,7 @@ exports[`array fields array 1`] = `
className="ms-Grid-col ms-sm12 field field-array"
style={
Object {
+ "display": undefined,
"marginBottom": 15,
}
}
@@ -115,6 +116,7 @@ exports[`array fields checkboxes 1`] = `
className="ms-Grid-col ms-sm12 field field-array"
style={
Object {
+ "display": undefined,
"marginBottom": 15,
}
}
@@ -211,6 +213,7 @@ exports[`array fields fixed array 1`] = `
className="ms-Grid-col ms-sm12 field field-array"
style={
Object {
+ "display": undefined,
"marginBottom": 15,
}
}
@@ -232,6 +235,7 @@ exports[`array fields fixed array 1`] = `
className="ms-Grid-col ms-sm12 field field-string"
style={
Object {
+ "display": undefined,
"marginBottom": 15,
}
}
@@ -389,6 +393,7 @@ exports[`array fields fixed array 1`] = `
className="ms-Grid-col ms-sm12 field field-number"
style={
Object {
+ "display": undefined,
"marginBottom": 15,
}
}
diff --git a/packages/fluent-ui/test/__snapshots__/Form.test.tsx.snap b/packages/fluent-ui/test/__snapshots__/Form.test.tsx.snap
index a7e0e65ac7..d52ab3e749 100644
--- a/packages/fluent-ui/test/__snapshots__/Form.test.tsx.snap
+++ b/packages/fluent-ui/test/__snapshots__/Form.test.tsx.snap
@@ -1,5 +1,82 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`single fields hidden field 1`] = `
+
+
+
+
+
+
+
+
+
+ Submit
+
+
+
+
+
+
+
+`;
+
exports[`single fields null field 1`] = `
{
+ if (hidden) {
+ return children;
+ }
+
return (
)}
- {properties.map((element: any, index: number) => (
-
- {element.content}
-
- ))}
+ {properties.map((element, index) =>
+ // Remove the if the inner element is hidden as the
+ // itself would otherwise still take up space.
+ element.hidden ? (
+ element.content
+ ) : (
+
+ {element.content}
+
+ )
+ )}
{canExpand(schema, uiSchema, formData) && (
diff --git a/packages/material-ui/test/Form.test.tsx b/packages/material-ui/test/Form.test.tsx
index 39362a0365..e6590eb19e 100644
--- a/packages/material-ui/test/Form.test.tsx
+++ b/packages/material-ui/test/Form.test.tsx
@@ -197,6 +197,25 @@ describe("single fields", () => {
.toJSON();
expect(tree).toMatchSnapshot();
});
+ test("hidden field", () => {
+ const schema: JSONSchema7 = {
+ type: "object",
+ properties: {
+ "my-field": {
+ type: "string",
+ },
+ },
+ };
+ const uiSchema: UiSchema = {
+ "my-field": {
+ "ui:widget": "hidden",
+ },
+ };
+ const tree = renderer
+ .create( )
+ .toJSON();
+ expect(tree).toMatchSnapshot();
+ });
test("hidden label", () => {
const schema: JSONSchema7 = {
type: "string",
diff --git a/packages/material-ui/test/__snapshots__/Form.test.tsx.snap b/packages/material-ui/test/__snapshots__/Form.test.tsx.snap
index b75bba60d4..f4bddd0767 100644
--- a/packages/material-ui/test/__snapshots__/Form.test.tsx.snap
+++ b/packages/material-ui/test/__snapshots__/Form.test.tsx.snap
@@ -795,6 +795,58 @@ exports[`single fields format datetime 1`] = `
`;
+exports[`single fields hidden field 1`] = `
+
+
+
+
+
+ Submit
+
+
+
+
+
+`;
+
exports[`single fields hidden label 1`] = `
Submit
-