| @@ -3,6 +3,41 @@ import WBJsonViewer from 'wb-json-viewer'; | |||
| import WBAccordion from 'wb-accordion'; | |||
| import WBDialog from 'wb-dialog'; | |||
| class WbJsonEditorDialog extends Component { | |||
| constructor(...args) { | |||
| super(...args); | |||
| this.dialogRef = createRef(); | |||
| } | |||
| render({ name, onChange }, { editValue, parseError }) { | |||
| return ( | |||
| <WBDialog title={ 'Edit ' + name } ref={ this.dialogRef } | |||
| accept={ () => { | |||
| onChange(JSON.parse(editValue)); | |||
| } } | |||
| canAccept={ () => { | |||
| try { JSON.parse(editValue) } | |||
| catch (exc) { this.setState({ parseError: exc.message }); return false; } | |||
| return true; | |||
| } }> | |||
| <div> | |||
| <textarea class="form-control wb-json-editor" value={ editValue } rows="10" | |||
| onChange={ e => this.setState({ editValue: e.target.value }) } /> | |||
| { parseError ? ( | |||
| <div class="alert alert-danger mt-2" role="alert"> | |||
| { parseError } | |||
| </div> | |||
| ) : null } | |||
| </div> | |||
| </WBDialog> | |||
| ); | |||
| } | |||
| show() { | |||
| this.dialogRef.current.show(); | |||
| } | |||
| } | |||
| class WBJsonEditor extends Component { | |||
| constructor(...args) { | |||
| super(...args); | |||
| @@ -12,33 +47,16 @@ class WBJsonEditor extends Component { | |||
| render({ app, name, value, stringify, pretty, onChange }, { editValue, parseError }) { | |||
| return ( | |||
| <div> | |||
| <WBDialog title={ 'Edit ' + name } ref={ this.dialogRef } | |||
| accept={ () => { | |||
| onChange(JSON.parse(editValue)); | |||
| } } | |||
| canAccept={ () => { | |||
| try { JSON.parse(editValue) } | |||
| catch (exc) { this.setState({ parseError: exc.message }); return false; } | |||
| return true; | |||
| } }> | |||
| <div> | |||
| <textarea class="form-control wb-json-editor" value={ editValue } rows="10" | |||
| onChange={ e => this.setState({ editValue: e.target.value }) } /> | |||
| { parseError ? ( | |||
| <div class="alert alert-danger mt-2" role="alert"> | |||
| { parseError } | |||
| </div> | |||
| ) : null } | |||
| </div> | |||
| </WBDialog> | |||
| <WbJsonEditorDialog name={ name } onChange={ onChange } ref={ this.dialogRef } /> | |||
| <WBAccordion names={ [ name ] } extraHeaderUi={ [ ( | |||
| <button class="btn btn-link px-0" title="Edit" | |||
| onclick={ () => { | |||
| this.setState({ parseError: null, | |||
| const dlg = this.dialogRef.current; | |||
| dlg.setState({ parseError: null, | |||
| editValue: stringify ? | |||
| pretty ? JSON.stringify(value, null, 2) | |||
| : JSON.stringify(value) : value }); | |||
| this.dialogRef.current.show(); | |||
| dlg.show(); | |||
| } }> | |||
| <i class="fas fa-edit text-secondary" /> | |||
| </button> | |||