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.

86 lines
2.5KB

  1. //
  2. // Copyright (C) Stanislaw Adaszewski, 2020
  3. // Contact: s.adaszewski@gmail.com
  4. // Website: https://adared.ch/wba
  5. // License: GNU Affero General Public License, Version 3
  6. //
  7. import { h, Component, createRef } from 'preact';
  8. import WBJsonViewer from 'wb-json-viewer';
  9. import WBAccordion from 'wb-accordion';
  10. import WBDialog from 'wb-dialog';
  11. class WbJsonEditorDialog extends Component {
  12. constructor(...args) {
  13. super(...args);
  14. this.dialogRef = createRef();
  15. }
  16. render({ name, onChange }, { editValue, parseError }) {
  17. return (
  18. <WBDialog title={ 'Edit ' + name } ref={ this.dialogRef }
  19. accept={ () => {
  20. onChange(JSON.parse(editValue));
  21. } }
  22. canAccept={ () => {
  23. try { JSON.parse(editValue) }
  24. catch (exc) { this.setState({ parseError: exc.message }); return false; }
  25. return true;
  26. } }>
  27. <div>
  28. <textarea class="form-control wb-json-editor" value={ editValue } rows="10"
  29. onChange={ e => this.setState({ editValue: e.target.value }) } />
  30. { parseError ? (
  31. <div class="alert alert-danger mt-2" role="alert">
  32. { parseError }
  33. </div>
  34. ) : null }
  35. </div>
  36. </WBDialog>
  37. );
  38. }
  39. show() {
  40. this.dialogRef.current.show();
  41. }
  42. }
  43. class WBJsonEditor extends Component {
  44. constructor(...args) {
  45. super(...args);
  46. this.dialogRef = createRef();
  47. }
  48. render({ app, name, value, stringify, pretty, onChange }, { editValue, parseError }) {
  49. return (
  50. <div>
  51. <WbJsonEditorDialog name={ name } onChange={ onChange } ref={ this.dialogRef } />
  52. <WBAccordion names={ [ name ] } extraHeaderUi={ [ (
  53. <button class="btn btn-link px-0" title="Edit"
  54. onclick={ () => {
  55. const dlg = this.dialogRef.current;
  56. dlg.setState({ parseError: null,
  57. editValue: stringify ?
  58. pretty ? JSON.stringify(value, null, 2)
  59. : JSON.stringify(value) : value });
  60. dlg.show();
  61. } }>
  62. <i class="fas fa-edit text-secondary" />
  63. </button>
  64. ) ] } cardHeaderClass="card-header-sm">
  65. <WBJsonViewer app={ app } value={ value } stringify={ stringify }
  66. pretty={ pretty } />
  67. </WBAccordion>
  68. </div>
  69. );
  70. }
  71. }
  72. WBJsonEditor.defaultProps = {
  73. stringify: true,
  74. pretty: true,
  75. onChange: () => {}
  76. };
  77. export default WBJsonEditor;