UNPKG

sanity-plugin-json-input

Version:

Ace editor for objects in sanity

159 lines (127 loc) 4.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _get2 = _interopRequireDefault(require("lodash/get")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _reactAce = _interopRequireDefault(require("react-ace")); var _patchEvent = require("part:@sanity/form-builder/patch-event"); var _JSONInput = _interopRequireDefault(require("./JSONInput.css")); var _default = _interopRequireDefault(require("part:@sanity/components/formfields/default")); require("brace/mode/json"); require("brace/theme/github"); require("brace/theme/monokai"); require("brace/theme/terminal"); require("brace/theme/tomorrow"); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /* eslint-enable import/no-unassigned-import */ var DEFAULT_THEME = 'tomorrow'; var SUPPORTED_THEMES = ['github', 'monokai', 'terminal', 'tomorrow']; class JSONInput extends _react.PureComponent { constructor() { super(...arguments); _defineProperty(this, "state", { value: undefined, validJsonMarker: undefined }); _defineProperty(this, "handleCodeChange", json => { var _this$props = this.props, type = _this$props.type, onChange = _this$props.onChange; this.setState({ value: json || '{ }' }); var parsedJSON; try { parsedJSON = JSON.parse(json); this.setState({ validJsonMarker: undefined }); } catch (e) { parsedJSON = undefined; this.setState({ validJsonMarker: { level: 'error', type: 'validation', item: { message: 'Must be valid JSON', name: 'ValidationError' } } }); } if (typeof parsedJSON === 'object') { onChange(_patchEvent.PatchEvent.from([(0, _patchEvent.setIfMissing)({ _type: type.name }), (0, _patchEvent.set)(parsedJSON)])); } }); _defineProperty(this, "handleEditorLoad", editor => { this.editor = editor; this.editor.focus(); }); _defineProperty(this, "renderEditor", () => { var value = this.props.value; return _react.default.createElement(_reactAce.default, { className: _JSONInput.default.aceEditor, mode: "json", theme: this.getTheme(), width: "100%", onChange: this.handleCodeChange, name: "".concat(this._inputId, "__aceEditor"), value: this.state.value || JSON.stringify(value, null, '\t') || '{\n\n}', onLoad: this.handleEditorLoad, tabSize: 2, setOptions: { useSoftTabs: true, navigateWithinSoftTabs: true }, editorProps: { $blockScrolling: true } }); }); } focus() { this.editor.focus(); } getTheme() { var preferredTheme = (0, _get2.default)(this.props.type, 'options.theme'); return preferredTheme && SUPPORTED_THEMES.find(theme => theme === preferredTheme) ? preferredTheme : DEFAULT_THEME; } render() { var _this$props2 = this.props, type = _this$props2.type, level = _this$props2.level, markers = _this$props2.markers; var validJsonMarker = this.state.validJsonMarker; return _react.default.createElement(_default.default, { label: type.title, description: type.description, level: level, markers: [...markers, validJsonMarker].filter(Boolean) }, this.renderEditor()); } } exports.default = JSONInput; _defineProperty(JSONInput, "propTypes", { level: _propTypes.default.number.isRequired, value: _propTypes.default.object, markers: _propTypes.default.array, type: _propTypes.default.shape({ name: _propTypes.default.string, title: _propTypes.default.string, description: _propTypes.default.string, fields: _propTypes.default.arrayOf(_propTypes.default.shape({ name: _propTypes.default.string.isRequired })) }).isRequired, onChange: _propTypes.default.func }); _defineProperty(JSONInput, "defaultProps", { onChange() {} });