| @@ -3,6 +3,41 @@ import WBJsonViewer from 'wb-json-viewer'; | |||||
| import WBAccordion from 'wb-accordion'; | import WBAccordion from 'wb-accordion'; | ||||
| import WBDialog from 'wb-dialog'; | 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 { | class WBJsonEditor extends Component { | ||||
| constructor(...args) { | constructor(...args) { | ||||
| super(...args); | super(...args); | ||||
| @@ -12,33 +47,16 @@ class WBJsonEditor extends Component { | |||||
| render({ app, name, value, stringify, pretty, onChange }, { editValue, parseError }) { | render({ app, name, value, stringify, pretty, onChange }, { editValue, parseError }) { | ||||
| return ( | return ( | ||||
| <div> | <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={ [ ( | <WBAccordion names={ [ name ] } extraHeaderUi={ [ ( | ||||
| <button class="btn btn-link px-0" title="Edit" | <button class="btn btn-link px-0" title="Edit" | ||||
| onclick={ () => { | onclick={ () => { | ||||
| this.setState({ parseError: null, | |||||
| const dlg = this.dialogRef.current; | |||||
| dlg.setState({ parseError: null, | |||||
| editValue: stringify ? | editValue: stringify ? | ||||
| pretty ? JSON.stringify(value, null, 2) | pretty ? JSON.stringify(value, null, 2) | ||||
| : JSON.stringify(value) : value }); | : JSON.stringify(value) : value }); | ||||
| this.dialogRef.current.show(); | |||||
| dlg.show(); | |||||
| } }> | } }> | ||||
| <i class="fas fa-edit text-secondary" /> | <i class="fas fa-edit text-secondary" /> | ||||
| </button> | </button> | ||||