foundation.ts 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { JsonViewer, JsonViewerOptions, CustomRenderRule } from '@douyinfe/semi-json-viewer-core';
  2. import BaseFoundation, { DefaultAdapter } from '../base/foundation';
  3. export type { JsonViewerOptions, CustomRenderRule };
  4. export interface JsonViewerAdapter<P = Record<string, any>, S = Record<string, any>> extends DefaultAdapter<P, S> {
  5. getEditorRef: () => HTMLElement;
  6. getSearchRef: () => HTMLInputElement;
  7. notifyChange: (value: string) => void;
  8. notifyHover: (value: string, el: HTMLElement) => HTMLElement | undefined;
  9. setSearchOptions: (key: string) => void;
  10. showSearchBar: () => void;
  11. notifyCustomRender: (customRenderMap: Map<HTMLElement, any>) => void
  12. }
  13. class JsonViewerFoundation extends BaseFoundation<JsonViewerAdapter> {
  14. constructor(adapter: JsonViewerAdapter) {
  15. super({ ...JsonViewerFoundation, ...adapter });
  16. }
  17. jsonViewer: JsonViewer | null = null;
  18. init() {
  19. const props = this.getProps();
  20. const editorRef = this._adapter.getEditorRef();
  21. this.jsonViewer = new JsonViewer(editorRef, props.value, props.options);
  22. this.jsonViewer.emitter.on('customRender', (e) => {
  23. this._adapter.notifyCustomRender(e.customRenderMap);
  24. });
  25. this.jsonViewer.layout();
  26. this.jsonViewer.emitter.on('contentChanged', (e) => {
  27. this._adapter.notifyChange(this.jsonViewer?.getModel().getValue());
  28. if (this.getState('showSearchBar')) {
  29. this.search(this._adapter.getSearchRef().value);
  30. }
  31. });
  32. }
  33. search(searchText: string, caseSensitive?: boolean, wholeWord?: boolean, regex?: boolean) {
  34. let options;
  35. if (caseSensitive !== undefined || wholeWord !== undefined || regex !== undefined) {
  36. options = {
  37. caseSensitive: caseSensitive ?? false,
  38. wholeWord: wholeWord ?? false,
  39. regex: regex ?? false
  40. };
  41. } else {
  42. options = this.getState('searchOptions');
  43. }
  44. const { caseSensitive: cs, wholeWord: ww, regex: rx } = options;
  45. this.jsonViewer?.getSearchWidget().search(searchText, cs, ww, rx);
  46. }
  47. prevSearch(step?: number) {
  48. if (step === undefined) {
  49. this.jsonViewer?.getSearchWidget().navigateResults(-1);
  50. } else {
  51. this.jsonViewer?.getSearchWidget().navigateResults(-step);
  52. }
  53. }
  54. nextSearch(step?: number) {
  55. if (step === undefined) {
  56. this.jsonViewer?.getSearchWidget().navigateResults(1);
  57. } else {
  58. this.jsonViewer?.getSearchWidget().navigateResults(step);
  59. }
  60. }
  61. replace(replaceText: string) {
  62. if (this.getProps().options.readOnly) {
  63. return;
  64. }
  65. this.jsonViewer?.getSearchWidget().replace(replaceText);
  66. }
  67. replaceAll(replaceText: string) {
  68. if (this.getProps().options.readOnly) {
  69. return;
  70. }
  71. this.jsonViewer?.getSearchWidget().replaceAll(replaceText);
  72. }
  73. setSearchOptions(key: string) {
  74. this._adapter.setSearchOptions(key);
  75. }
  76. showSearchBar() {
  77. this._adapter.showSearchBar();
  78. }
  79. getSearchResults() {
  80. return this.jsonViewer?.getSearchWidget().searchResults;
  81. }
  82. }
  83. export default JsonViewerFoundation;