decap-cms-widget-object 2.8.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _reactImmutableProptypes = _interopRequireDefault(require("react-immutable-proptypes"));
10
+ var _core = require("@emotion/core");
11
+ var _immutable = require("immutable");
12
+ var _decapCmsUiDefault = require("decap-cms-ui-default");
13
+ var _decapCmsLibWidgets = require("decap-cms-lib-widgets");
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
16
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
17
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
18
+ const styleStrings = {
19
+ nestedObjectControl: `
20
+ padding: 6px 14px 14px;
21
+ border-top: 0;
22
+ border-top-left-radius: 0;
23
+ border-top-right-radius: 0;
24
+ `,
25
+ objectWidgetTopBarContainer: `
26
+ padding: ${_decapCmsUiDefault.lengths.objectWidgetTopBarContainerPadding};
27
+ `,
28
+ collapsedObjectControl: `
29
+ display: none;
30
+ `
31
+ };
32
+ class ObjectControl extends _react.default.Component {
33
+ constructor(props) {
34
+ super(props);
35
+ _defineProperty(this, "componentValidate", {});
36
+ _defineProperty(this, "validate", () => {
37
+ const {
38
+ field
39
+ } = this.props;
40
+ let fields = field.get('field') || field.get('fields');
41
+ fields = _immutable.List.isList(fields) ? fields : (0, _immutable.List)([fields]);
42
+ fields.forEach(field => {
43
+ if (field.get('widget') === 'hidden') return;
44
+ this.componentValidate[field.get('name')]();
45
+ });
46
+ });
47
+ _defineProperty(this, "handleCollapseToggle", () => {
48
+ this.setState({
49
+ collapsed: !this.state.collapsed
50
+ });
51
+ });
52
+ _defineProperty(this, "renderFields", (multiFields, singleField) => {
53
+ if (multiFields) {
54
+ return multiFields.map((f, idx) => this.controlFor(f, idx));
55
+ }
56
+ return this.controlFor(singleField);
57
+ });
58
+ _defineProperty(this, "objectLabel", () => {
59
+ const {
60
+ value,
61
+ field
62
+ } = this.props;
63
+ const label = field.get('label', field.get('name'));
64
+ const summary = field.get('summary');
65
+ return summary ? _decapCmsLibWidgets.stringTemplate.compileStringTemplate(summary, null, '', value) : label;
66
+ });
67
+ this.state = {
68
+ collapsed: props.field.get('collapsed', false)
69
+ };
70
+ }
71
+
72
+ /*
73
+ * Always update so that each nested widget has the option to update. This is
74
+ * required because ControlHOC provides a default `shouldComponentUpdate`
75
+ * which only updates if the value changes, but every widget must be allowed
76
+ * to override this.
77
+ */
78
+ shouldComponentUpdate() {
79
+ return true;
80
+ }
81
+ controlFor(field, key) {
82
+ const {
83
+ value,
84
+ onChangeObject,
85
+ onValidateObject,
86
+ clearFieldErrors,
87
+ metadata,
88
+ fieldsErrors,
89
+ editorControl: EditorControl,
90
+ controlRef,
91
+ parentIds,
92
+ isFieldDuplicate,
93
+ isFieldHidden,
94
+ locale
95
+ } = this.props;
96
+ if (field.get('widget') === 'hidden') {
97
+ return null;
98
+ }
99
+ const fieldName = field.get('name');
100
+ const fieldValue = value && _immutable.Map.isMap(value) ? value.get(fieldName) : value;
101
+ const isDuplicate = isFieldDuplicate && isFieldDuplicate(field);
102
+ const isHidden = isFieldHidden && isFieldHidden(field);
103
+ return (0, _core.jsx)(EditorControl, {
104
+ key: key,
105
+ field: field,
106
+ value: fieldValue,
107
+ onChange: onChangeObject,
108
+ clearFieldErrors: clearFieldErrors,
109
+ fieldsMetaData: metadata,
110
+ fieldsErrors: fieldsErrors,
111
+ onValidate: onValidateObject,
112
+ processControlRef: controlRef && controlRef.bind(this),
113
+ controlRef: controlRef,
114
+ parentIds: parentIds,
115
+ isDisabled: isDuplicate,
116
+ isHidden: isHidden,
117
+ isFieldDuplicate: isFieldDuplicate,
118
+ isFieldHidden: isFieldHidden,
119
+ locale: locale
120
+ });
121
+ }
122
+ render() {
123
+ const {
124
+ field,
125
+ forID,
126
+ classNameWrapper,
127
+ forList,
128
+ hasError,
129
+ t
130
+ } = this.props;
131
+ const collapsed = forList ? this.props.collapsed : this.state.collapsed;
132
+ const multiFields = field.get('fields');
133
+ const singleField = field.get('field');
134
+ if (multiFields || singleField) {
135
+ return (0, _core.jsx)(_core.ClassNames, null, ({
136
+ css,
137
+ cx
138
+ }) => (0, _core.jsx)("div", {
139
+ id: forID,
140
+ className: cx(classNameWrapper, css`
141
+ ${styleStrings.objectWidgetTopBarContainer}
142
+ `, {
143
+ [css`
144
+ ${styleStrings.nestedObjectControl}
145
+ `]: forList
146
+ }, {
147
+ [css`
148
+ border-color: ${_decapCmsUiDefault.colors.textFieldBorder};
149
+ `]: forList ? !hasError : false
150
+ })
151
+ }, forList ? null : (0, _core.jsx)(_decapCmsUiDefault.ObjectWidgetTopBar, {
152
+ collapsed: collapsed,
153
+ onCollapseToggle: this.handleCollapseToggle,
154
+ heading: collapsed && this.objectLabel(),
155
+ t: t
156
+ }), (0, _core.jsx)("div", {
157
+ className: cx({
158
+ [css`
159
+ ${styleStrings.collapsedObjectControl}
160
+ `]: collapsed
161
+ })
162
+ }, this.renderFields(multiFields, singleField))));
163
+ }
164
+ return (0, _core.jsx)("h3", null, "No field(s) defined for this widget");
165
+ }
166
+ }
167
+ exports.default = ObjectControl;
168
+ _defineProperty(ObjectControl, "propTypes", {
169
+ onChangeObject: _propTypes.default.func.isRequired,
170
+ onValidateObject: _propTypes.default.func,
171
+ value: _propTypes.default.oneOfType([_propTypes.default.node, _propTypes.default.object, _propTypes.default.bool]),
172
+ field: _propTypes.default.object,
173
+ forID: _propTypes.default.string,
174
+ classNameWrapper: _propTypes.default.string.isRequired,
175
+ forList: _propTypes.default.bool,
176
+ controlRef: _propTypes.default.func,
177
+ editorControl: _propTypes.default.elementType.isRequired,
178
+ resolveWidget: _propTypes.default.func.isRequired,
179
+ clearFieldErrors: _propTypes.default.func.isRequired,
180
+ fieldsErrors: _reactImmutableProptypes.default.map,
181
+ hasError: _propTypes.default.bool,
182
+ t: _propTypes.default.func,
183
+ locale: _propTypes.default.string
184
+ });
185
+ _defineProperty(ObjectControl, "defaultProps", {
186
+ value: (0, _immutable.Map)()
187
+ });
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _decapCmsUiDefault = require("decap-cms-ui-default");
10
+ var _core = require("@emotion/core");
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ function ObjectPreview({
13
+ field
14
+ }) {
15
+ return (0, _core.jsx)(_decapCmsUiDefault.WidgetPreviewContainer, null, field && field.get('fields') || field.get('field') || null);
16
+ }
17
+ ObjectPreview.propTypes = {
18
+ field: _propTypes.default.node
19
+ };
20
+ var _default = ObjectPreview;
21
+ exports.default = _default;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.DecapCmsWidgetObject = void 0;
7
+ var _ObjectControl = _interopRequireDefault(require("./ObjectControl"));
8
+ var _ObjectPreview = _interopRequireDefault(require("./ObjectPreview"));
9
+ var _schema = _interopRequireDefault(require("./schema"));
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
12
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
13
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
14
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
15
+ function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
16
+ function Widget(opts = {}) {
17
+ return _objectSpread({
18
+ name: 'object',
19
+ controlComponent: _ObjectControl.default,
20
+ previewComponent: _ObjectPreview.default,
21
+ schema: _schema.default
22
+ }, opts);
23
+ }
24
+ const DecapCmsWidgetObject = {
25
+ Widget,
26
+ controlComponent: _ObjectControl.default,
27
+ previewComponent: _ObjectPreview.default
28
+ };
29
+ exports.DecapCmsWidgetObject = DecapCmsWidgetObject;
30
+ var _default = DecapCmsWidgetObject;
31
+ exports.default = _default;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _default = {
8
+ properties: {
9
+ collapsed: {
10
+ type: 'boolean'
11
+ },
12
+ i18n: {
13
+ type: 'boolean'
14
+ }
15
+ }
16
+ };
17
+ exports.default = _default;
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "decap-cms-widget-object",
3
+ "description": "Widget for displaying an object of fields for Decap CMS.",
4
+ "version": "2.8.0-beta.0",
5
+ "homepage": "https://www.decapcms.org/docs/widgets/#object",
6
+ "repository": "https://github.com/decaporg/decap-cms/tree/master/packages/decap-cms-widget-object",
7
+ "bugs": "https://github.com/decaporg/decap-cms/issues",
8
+ "module": "dist/esm/index.js",
9
+ "main": "dist/decap-cms-widget-object.js",
10
+ "license": "MIT",
11
+ "keywords": [
12
+ "decap-cms",
13
+ "widget",
14
+ "fields",
15
+ "object",
16
+ "nested"
17
+ ],
18
+ "sideEffects": false,
19
+ "scripts": {
20
+ "develop": "yarn build:esm --watch",
21
+ "build": "cross-env NODE_ENV=production webpack",
22
+ "build:esm": "cross-env NODE_ENV=esm babel src --out-dir dist/esm --ignore \"**/__tests__\" --root-mode upward"
23
+ },
24
+ "peerDependencies": {
25
+ "@emotion/core": "^10.0.35",
26
+ "@emotion/styled": "^10.0.27",
27
+ "decap-cms-ui-default": "^2.12.1",
28
+ "immutable": "^3.7.6",
29
+ "lodash": "^4.17.11",
30
+ "prop-types": "^15.7.2",
31
+ "react": "^16.8.4 || ^17.0.0",
32
+ "react-immutable-proptypes": "^2.1.0"
33
+ },
34
+ "gitHead": "1bdf716e5655bf088a343cd90210a2d361a9db52"
35
+ }
@@ -0,0 +1,195 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import ImmutablePropTypes from 'react-immutable-proptypes';
4
+ import { ClassNames } from '@emotion/core';
5
+ import { List, Map } from 'immutable';
6
+ import { colors, lengths, ObjectWidgetTopBar } from 'decap-cms-ui-default';
7
+ import { stringTemplate } from 'decap-cms-lib-widgets';
8
+
9
+ const styleStrings = {
10
+ nestedObjectControl: `
11
+ padding: 6px 14px 14px;
12
+ border-top: 0;
13
+ border-top-left-radius: 0;
14
+ border-top-right-radius: 0;
15
+ `,
16
+ objectWidgetTopBarContainer: `
17
+ padding: ${lengths.objectWidgetTopBarContainerPadding};
18
+ `,
19
+ collapsedObjectControl: `
20
+ display: none;
21
+ `,
22
+ };
23
+
24
+ export default class ObjectControl extends React.Component {
25
+ componentValidate = {};
26
+
27
+ static propTypes = {
28
+ onChangeObject: PropTypes.func.isRequired,
29
+ onValidateObject: PropTypes.func,
30
+ value: PropTypes.oneOfType([PropTypes.node, PropTypes.object, PropTypes.bool]),
31
+ field: PropTypes.object,
32
+ forID: PropTypes.string,
33
+ classNameWrapper: PropTypes.string.isRequired,
34
+ forList: PropTypes.bool,
35
+ controlRef: PropTypes.func,
36
+ editorControl: PropTypes.elementType.isRequired,
37
+ resolveWidget: PropTypes.func.isRequired,
38
+ clearFieldErrors: PropTypes.func.isRequired,
39
+ fieldsErrors: ImmutablePropTypes.map,
40
+ hasError: PropTypes.bool,
41
+ t: PropTypes.func,
42
+ locale: PropTypes.string,
43
+ };
44
+
45
+ static defaultProps = {
46
+ value: Map(),
47
+ };
48
+
49
+ constructor(props) {
50
+ super(props);
51
+ this.state = {
52
+ collapsed: props.field.get('collapsed', false),
53
+ };
54
+ }
55
+
56
+ /*
57
+ * Always update so that each nested widget has the option to update. This is
58
+ * required because ControlHOC provides a default `shouldComponentUpdate`
59
+ * which only updates if the value changes, but every widget must be allowed
60
+ * to override this.
61
+ */
62
+ shouldComponentUpdate() {
63
+ return true;
64
+ }
65
+
66
+ validate = () => {
67
+ const { field } = this.props;
68
+ let fields = field.get('field') || field.get('fields');
69
+ fields = List.isList(fields) ? fields : List([fields]);
70
+ fields.forEach(field => {
71
+ if (field.get('widget') === 'hidden') return;
72
+ this.componentValidate[field.get('name')]();
73
+ });
74
+ };
75
+
76
+ controlFor(field, key) {
77
+ const {
78
+ value,
79
+ onChangeObject,
80
+ onValidateObject,
81
+ clearFieldErrors,
82
+ metadata,
83
+ fieldsErrors,
84
+ editorControl: EditorControl,
85
+ controlRef,
86
+ parentIds,
87
+ isFieldDuplicate,
88
+ isFieldHidden,
89
+ locale,
90
+ } = this.props;
91
+
92
+ if (field.get('widget') === 'hidden') {
93
+ return null;
94
+ }
95
+ const fieldName = field.get('name');
96
+ const fieldValue = value && Map.isMap(value) ? value.get(fieldName) : value;
97
+
98
+ const isDuplicate = isFieldDuplicate && isFieldDuplicate(field);
99
+ const isHidden = isFieldHidden && isFieldHidden(field);
100
+
101
+ return (
102
+ <EditorControl
103
+ key={key}
104
+ field={field}
105
+ value={fieldValue}
106
+ onChange={onChangeObject}
107
+ clearFieldErrors={clearFieldErrors}
108
+ fieldsMetaData={metadata}
109
+ fieldsErrors={fieldsErrors}
110
+ onValidate={onValidateObject}
111
+ processControlRef={controlRef && controlRef.bind(this)}
112
+ controlRef={controlRef}
113
+ parentIds={parentIds}
114
+ isDisabled={isDuplicate}
115
+ isHidden={isHidden}
116
+ isFieldDuplicate={isFieldDuplicate}
117
+ isFieldHidden={isFieldHidden}
118
+ locale={locale}
119
+ />
120
+ );
121
+ }
122
+
123
+ handleCollapseToggle = () => {
124
+ this.setState({ collapsed: !this.state.collapsed });
125
+ };
126
+
127
+ renderFields = (multiFields, singleField) => {
128
+ if (multiFields) {
129
+ return multiFields.map((f, idx) => this.controlFor(f, idx));
130
+ }
131
+ return this.controlFor(singleField);
132
+ };
133
+
134
+ objectLabel = () => {
135
+ const { value, field } = this.props;
136
+ const label = field.get('label', field.get('name'));
137
+ const summary = field.get('summary');
138
+ return summary ? stringTemplate.compileStringTemplate(summary, null, '', value) : label;
139
+ };
140
+
141
+ render() {
142
+ const { field, forID, classNameWrapper, forList, hasError, t } = this.props;
143
+ const collapsed = forList ? this.props.collapsed : this.state.collapsed;
144
+ const multiFields = field.get('fields');
145
+ const singleField = field.get('field');
146
+
147
+ if (multiFields || singleField) {
148
+ return (
149
+ <ClassNames>
150
+ {({ css, cx }) => (
151
+ <div
152
+ id={forID}
153
+ className={cx(
154
+ classNameWrapper,
155
+ css`
156
+ ${styleStrings.objectWidgetTopBarContainer}
157
+ `,
158
+ {
159
+ [css`
160
+ ${styleStrings.nestedObjectControl}
161
+ `]: forList,
162
+ },
163
+ {
164
+ [css`
165
+ border-color: ${colors.textFieldBorder};
166
+ `]: forList ? !hasError : false,
167
+ },
168
+ )}
169
+ >
170
+ {forList ? null : (
171
+ <ObjectWidgetTopBar
172
+ collapsed={collapsed}
173
+ onCollapseToggle={this.handleCollapseToggle}
174
+ heading={collapsed && this.objectLabel()}
175
+ t={t}
176
+ />
177
+ )}
178
+ <div
179
+ className={cx({
180
+ [css`
181
+ ${styleStrings.collapsedObjectControl}
182
+ `]: collapsed,
183
+ })}
184
+ >
185
+ {this.renderFields(multiFields, singleField)}
186
+ </div>
187
+ </div>
188
+ )}
189
+ </ClassNames>
190
+ );
191
+ }
192
+
193
+ return <h3>No field(s) defined for this widget</h3>;
194
+ }
195
+ }
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { WidgetPreviewContainer } from 'decap-cms-ui-default';
4
+
5
+ function ObjectPreview({ field }) {
6
+ return (
7
+ <WidgetPreviewContainer>
8
+ {(field && field.get('fields')) || field.get('field') || null}
9
+ </WidgetPreviewContainer>
10
+ );
11
+ }
12
+
13
+ ObjectPreview.propTypes = {
14
+ field: PropTypes.node,
15
+ };
16
+
17
+ export default ObjectPreview;
package/src/index.js ADDED
@@ -0,0 +1,16 @@
1
+ import controlComponent from './ObjectControl';
2
+ import previewComponent from './ObjectPreview';
3
+ import schema from './schema';
4
+
5
+ function Widget(opts = {}) {
6
+ return {
7
+ name: 'object',
8
+ controlComponent,
9
+ previewComponent,
10
+ schema,
11
+ ...opts,
12
+ };
13
+ }
14
+
15
+ export const DecapCmsWidgetObject = { Widget, controlComponent, previewComponent };
16
+ export default DecapCmsWidgetObject;
package/src/schema.js ADDED
@@ -0,0 +1,6 @@
1
+ export default {
2
+ properties: {
3
+ collapsed: { type: 'boolean' },
4
+ i18n: { type: 'boolean' },
5
+ },
6
+ };
@@ -0,0 +1,3 @@
1
+ const { getConfig } = require('../../scripts/webpack.js');
2
+
3
+ module.exports = getConfig();