diff --git a/dev-test/config.yml b/dev-test/config.yml index f985684151a7..323fb7167723 100644 --- a/dev-test/config.yml +++ b/dev-test/config.yml @@ -147,11 +147,31 @@ collections: # A list of collections the CMS should be able to edit display_fields: ['title', 'datetime'] search_fields: ['title', 'body'] value_field: 'title' - - { label: 'Title', name: 'title', widget: 'string' } - - { label: 'Boolean', name: 'boolean', widget: 'boolean', default: true } + - { + label: 'Title', + name: 'title', + widget: 'string', + prefix: 'This string:', + suffix: 'is a title' + } + - { + label: 'Boolean', + name: 'boolean', + widget: 'boolean', + prefix: 'OFF', + suffix: 'ON', + hint: 'Toggle this to switch on/off', + default: true + } - { label: 'Map', name: 'map', widget: 'map' } - { label: 'Text', name: 'text', widget: 'text', hint: 'Plain text, not markdown' } - - { label: 'Number', name: 'number', widget: 'number', hint: 'To infinity and beyond!' } + - { + label: 'Number', + name: 'number', + widget: 'number', + suffix: 'px', + hint: 'To infinity and beyond!' + } - { label: 'Markdown', name: 'markdown', widget: 'markdown' } - { label: 'Datetime', name: 'datetime', widget: 'datetime' } - { label: 'Image', name: 'image', widget: 'image' } diff --git a/packages/decap-cms-widget-boolean/src/BooleanControl.js b/packages/decap-cms-widget-boolean/src/BooleanControl.js index 3667c1bd372a..62a25f8ea29d 100644 --- a/packages/decap-cms-widget-boolean/src/BooleanControl.js +++ b/packages/decap-cms-widget-boolean/src/BooleanControl.js @@ -4,6 +4,11 @@ import ImmutablePropTypes from 'react-immutable-proptypes'; import { css } from '@emotion/react'; import { Toggle, ToggleBackground, colors } from 'decap-cms-ui-default'; +const innerWrapper = css` + display: flex; + align-items: center; +`; + function BooleanBackground({ isActive, ...props }) { return ( - +
+ {prefix && {prefix} } + + {suffix &&  {suffix}} +
); } } - -BooleanControl.propTypes = { - field: ImmutablePropTypes.map.isRequired, - onChange: PropTypes.func.isRequired, - classNameWrapper: PropTypes.string.isRequired, - setActiveStyle: PropTypes.func.isRequired, - setInactiveStyle: PropTypes.func.isRequired, - forID: PropTypes.string, - value: PropTypes.bool, -}; - -BooleanControl.defaultProps = { - value: false, -}; diff --git a/packages/decap-cms-widget-number/src/NumberControl.js b/packages/decap-cms-widget-number/src/NumberControl.js index 2d74dcabd182..e4260eeea2df 100644 --- a/packages/decap-cms-widget-number/src/NumberControl.js +++ b/packages/decap-cms-widget-number/src/NumberControl.js @@ -1,6 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; import ImmutablePropTypes from 'react-immutable-proptypes'; +import { css } from '@emotion/react'; + const ValidationErrorTypes = { PRESENCE: 'PRESENCE', PATTERN: 'PATTERN', @@ -8,6 +10,11 @@ const ValidationErrorTypes = { CUSTOM: 'CUSTOM', }; +const innerWrapper = css` + display: flex; + align-items: baseline; +`; + export function validateMinMax(value, min, max, field, t) { let error; @@ -105,19 +112,31 @@ export default class NumberControl extends React.Component { const min = field.get('min', ''); const max = field.get('max', ''); const step = field.get('step', field.get('value_type') === 'int' ? 1 : ''); + + const prefix = field.get('prefix', false); + const suffix = field.get('suffix', false); + return ( - +
+
+ {prefix && {prefix} } + + {suffix &&  {suffix}} +
+
); } } diff --git a/packages/decap-cms-widget-string/src/StringControl.js b/packages/decap-cms-widget-string/src/StringControl.js index 864d7274fd6b..598524e4a495 100644 --- a/packages/decap-cms-widget-string/src/StringControl.js +++ b/packages/decap-cms-widget-string/src/StringControl.js @@ -1,8 +1,16 @@ import React from 'react'; import PropTypes from 'prop-types'; +import ImmutablePropTypes from 'react-immutable-proptypes'; +import { css } from '@emotion/react'; + +const innerWrapper = css` + display: flex; + align-items: baseline; +`; export default class StringControl extends React.Component { static propTypes = { + field: ImmutablePropTypes.map.isRequired, onChange: PropTypes.func.isRequired, forID: PropTypes.string, value: PropTypes.node, @@ -46,21 +54,32 @@ export default class StringControl extends React.Component { }; render() { - const { forID, value, classNameWrapper, setActiveStyle, setInactiveStyle } = this.props; + const { field, forID, value, classNameWrapper, setActiveStyle, setInactiveStyle } = this.props; + + const prefix = field.get('prefix', false); + const suffix = field.get('suffix', false); return ( - { - this._el = el; - }} - type="text" - id={forID} - className={classNameWrapper} - value={value || ''} - onChange={this.handleChange} - onFocus={setActiveStyle} - onBlur={setInactiveStyle} - /> +
+
+ {prefix && {prefix} } + { + this._el = el; + }} + type="text" + id={forID} + value={value || ''} + onChange={this.handleChange} + onFocus={setActiveStyle} + onBlur={setInactiveStyle} + css={css` + flex-grow: 1; + `} + /> + {suffix &&  {suffix}} +
+
); } } diff --git a/packages/decap-server/package.json b/packages/decap-server/package.json index 873f964a6bbd..03585c99ecd4 100644 --- a/packages/decap-server/package.json +++ b/packages/decap-server/package.json @@ -52,7 +52,5 @@ "engines": { "node": ">=v10.22.1" }, - "bin": { - "decap-server": "./dist/index.js" - } + "bin": "./dist/index.js" }