IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
2.0KB

  1. import { h, Component, createRef } from 'preact';
  2. import WBJsonViewer from 'wb-json-viewer';
  3. import WBAccordion from 'wb-accordion';
  4. import WBDialog from 'wb-dialog';
  5. class WBJsonEditor extends Component {
  6. constructor(...args) {
  7. super(...args);
  8. this.dialogRef = createRef();
  9. }
  10. render({ app, name, value, stringify, pretty, onChange }, { editValue, parseError }) {
  11. return (
  12. <div>
  13. <WBDialog title={ 'Edit ' + name } ref={ this.dialogRef }
  14. accept={ () => {
  15. onChange(JSON.parse(editValue));
  16. } }
  17. canAccept={ () => {
  18. try { JSON.parse(editValue) }
  19. catch (exc) { this.setState({ parseError: exc.message }); return false; }
  20. return true;
  21. } }>
  22. <div>
  23. <textarea class="form-control wb-json-editor" value={ editValue } rows="10"
  24. onChange={ e => this.setState({ editValue: e.target.value }) } />
  25. { parseError ? (
  26. <div class="alert alert-danger" role="alert">
  27. { parseError }
  28. </div>
  29. ) : null }
  30. </div>
  31. </WBDialog>
  32. <WBAccordion names={ [ name ] } extraHeaderUi={ [ (
  33. <button class="btn btn-link px-0" title="Edit"
  34. onclick={ () => {
  35. this.setState({ parseError: null,
  36. editValue: stringify ?
  37. pretty ? JSON.stringify(value, null, 2)
  38. : JSON.stringify(value) : value });
  39. this.dialogRef.current.show();
  40. } }>
  41. <i class="fas fa-edit text-secondary" />
  42. </button>
  43. ) ] } cardHeaderClass="card-header-sm">
  44. <WBJsonViewer app={ app } value={ value } stringify={ stringify }
  45. pretty={ pretty } />
  46. </WBAccordion>
  47. </div>
  48. );
  49. }
  50. }
  51. WBJsonEditor.defaultProps = {
  52. stringify: true,
  53. pretty: true,
  54. onChange: () => {}
  55. };
  56. export default WBJsonEditor;