diff --git a/dev-test/config.yml b/dev-test/config.yml index d9bf6182a7cc..0214fd441c89 100644 --- a/dev-test/config.yml +++ b/dev-test/config.yml @@ -267,6 +267,20 @@ collections: # A list of collections the CMS should be able to edit fields: - { label: 'Image', name: 'image', widget: 'image' } - { label: 'File', name: 'file', widget: 'file' } + - label: Typed Object + name: typed_object + widget: object + types: + - name: copy + widget: object + fields: + - { name: text, widget: string } + - name: infographic + widget: object + fields: + - { name: caption, widget: string } + - { name: image, widget: image } + - { name: overlay, widget: image } - name: pages # a nested collection label: Pages label_singular: 'Page' diff --git a/packages/decap-cms-app/src/extensions.js b/packages/decap-cms-app/src/extensions.js index eef9ebd77063..5d3665cd414e 100644 --- a/packages/decap-cms-app/src/extensions.js +++ b/packages/decap-cms-app/src/extensions.js @@ -19,7 +19,6 @@ import DecapCmsWidgetFile from 'decap-cms-widget-file'; import DecapCmsWidgetSelect from 'decap-cms-widget-select'; import DecapCmsWidgetMarkdown from 'decap-cms-widget-markdown'; import DecapCmsWidgetList from 'decap-cms-widget-list'; -import DecapCmsWidgetObject from 'decap-cms-widget-object'; import DecapCmsWidgetRelation from 'decap-cms-widget-relation'; import DecapCmsWidgetBoolean from 'decap-cms-widget-boolean'; import DecapCmsWidgetMap from 'decap-cms-widget-map'; @@ -50,7 +49,7 @@ CMS.registerWidget([ DecapCmsWidgetSelect.Widget(), DecapCmsWidgetMarkdown.Widget(), DecapCmsWidgetList.Widget(), - DecapCmsWidgetObject.Widget(), + DecapCmsWidgetList.ObjectWidget(), DecapCmsWidgetRelation.Widget(), DecapCmsWidgetBoolean.Widget(), DecapCmsWidgetMap.Widget(), diff --git a/packages/decap-cms-widget-list/src/ListControl.js b/packages/decap-cms-widget-list/src/ListControl.js index 3db08db07e73..0bdc3ef2e4b2 100644 --- a/packages/decap-cms-widget-list/src/ListControl.js +++ b/packages/decap-cms-widget-list/src/ListControl.js @@ -749,3 +749,18 @@ export default class ListControl extends React.Component { } } } + +export class ObjectControlWrapper extends React.Component { + render() { + if (this.props.field.get('required') === false || this.props.field.get('types')) { + return ( + this.props.onChange(e.get(0))} + value={List([this.props.value].filter(Boolean))} + /> + ); + } + return ; + } +} diff --git a/packages/decap-cms-widget-list/src/index.js b/packages/decap-cms-widget-list/src/index.js index fbbe9624a403..113c0a91403d 100644 --- a/packages/decap-cms-widget-list/src/index.js +++ b/packages/decap-cms-widget-list/src/index.js @@ -1,6 +1,6 @@ import DecapCmsWidgetObject from 'decap-cms-widget-object'; -import controlComponent from './ListControl'; +import controlComponent, { ObjectControlWrapper } from './ListControl'; import schema from './schema'; const previewComponent = DecapCmsWidgetObject.previewComponent; @@ -15,5 +15,14 @@ function Widget(opts = {}) { }; } -export const DecapCmsWidgetList = { Widget, controlComponent, previewComponent }; +function ObjectWidget(opts = {}) { + return { + name: 'object', + controlComponent: ObjectControlWrapper, + previewComponent, + ...opts, + }; +} + +export const DecapCmsWidgetList = { Widget, controlComponent, previewComponent, ObjectWidget }; export default DecapCmsWidgetList;