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.

79 lines
2.3KB

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