cmat 0.0.86 → 0.0.88
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/cmat-components-adapter.mjs +9 -9
- package/fesm2022/cmat-components-adapter.mjs.map +1 -1
- package/fesm2022/cmat-components-breadcrumb.mjs +98 -80
- package/fesm2022/cmat-components-breadcrumb.mjs.map +1 -1
- package/fesm2022/cmat-components-card.mjs +26 -34
- package/fesm2022/cmat-components-card.mjs.map +1 -1
- package/fesm2022/cmat-components-carousel.mjs +467 -556
- package/fesm2022/cmat-components-carousel.mjs.map +1 -1
- package/fesm2022/cmat-components-cascade.mjs +270 -259
- package/fesm2022/cmat-components-cascade.mjs.map +1 -1
- package/fesm2022/cmat-components-chip-input.mjs +200 -116
- package/fesm2022/cmat-components-chip-input.mjs.map +1 -1
- package/fesm2022/cmat-components-code-editor.mjs +85 -38
- package/fesm2022/cmat-components-code-editor.mjs.map +1 -1
- package/fesm2022/cmat-components-color-picker.mjs +841 -0
- package/fesm2022/cmat-components-color-picker.mjs.map +1 -0
- package/fesm2022/cmat-components-custom-formly.mjs +1395 -838
- package/fesm2022/cmat-components-custom-formly.mjs.map +1 -1
- package/fesm2022/cmat-components-data-picker.mjs +996 -0
- package/fesm2022/cmat-components-data-picker.mjs.map +1 -0
- package/fesm2022/cmat-components-date-range.mjs +310 -264
- package/fesm2022/cmat-components-date-range.mjs.map +1 -1
- package/fesm2022/cmat-components-date-time-display.mjs +16 -20
- package/fesm2022/cmat-components-date-time-display.mjs.map +1 -1
- package/fesm2022/cmat-components-drawer.mjs +120 -137
- package/fesm2022/cmat-components-drawer.mjs.map +1 -1
- package/fesm2022/cmat-components-empty-state.mjs +17 -24
- package/fesm2022/cmat-components-empty-state.mjs.map +1 -1
- package/fesm2022/cmat-components-file-preview.mjs +18 -24
- package/fesm2022/cmat-components-file-preview.mjs.map +1 -1
- package/fesm2022/cmat-components-filter-toolbar.mjs +30 -39
- package/fesm2022/cmat-components-filter-toolbar.mjs.map +1 -1
- package/fesm2022/cmat-components-form-actions.mjs +12 -12
- package/fesm2022/cmat-components-form-actions.mjs.map +1 -1
- package/fesm2022/cmat-components-fullscreen.mjs +10 -10
- package/fesm2022/cmat-components-fullscreen.mjs.map +1 -1
- package/fesm2022/cmat-components-highlight.mjs +48 -41
- package/fesm2022/cmat-components-highlight.mjs.map +1 -1
- package/fesm2022/cmat-components-image-viewer.mjs +104 -107
- package/fesm2022/cmat-components-image-viewer.mjs.map +1 -1
- package/fesm2022/cmat-components-inline-loading.mjs +12 -15
- package/fesm2022/cmat-components-inline-loading.mjs.map +1 -1
- package/fesm2022/cmat-components-json-editor.mjs +118 -75
- package/fesm2022/cmat-components-json-editor.mjs.map +1 -1
- package/fesm2022/cmat-components-knob-input.mjs +196 -178
- package/fesm2022/cmat-components-knob-input.mjs.map +1 -1
- package/fesm2022/cmat-components-masonry.mjs +26 -41
- package/fesm2022/cmat-components-masonry.mjs.map +1 -1
- package/fesm2022/cmat-components-material-color-picker.mjs +81 -80
- package/fesm2022/cmat-components-material-color-picker.mjs.map +1 -1
- package/fesm2022/cmat-components-material-datetimepicker.mjs +1212 -1287
- package/fesm2022/cmat-components-material-datetimepicker.mjs.map +1 -1
- package/fesm2022/cmat-components-navigation.mjs +467 -450
- package/fesm2022/cmat-components-navigation.mjs.map +1 -1
- package/fesm2022/cmat-components-opt-input.mjs +143 -132
- package/fesm2022/cmat-components-opt-input.mjs.map +1 -1
- package/fesm2022/cmat-components-org-chart.mjs +68 -83
- package/fesm2022/cmat-components-org-chart.mjs.map +1 -1
- package/fesm2022/cmat-components-page-header.mjs +18 -24
- package/fesm2022/cmat-components-page-header.mjs.map +1 -1
- package/fesm2022/cmat-components-pagination.mjs +220 -136
- package/fesm2022/cmat-components-pagination.mjs.map +1 -1
- package/fesm2022/cmat-components-password-strength.mjs +262 -215
- package/fesm2022/cmat-components-password-strength.mjs.map +1 -1
- package/fesm2022/cmat-components-popover.mjs +227 -195
- package/fesm2022/cmat-components-popover.mjs.map +1 -1
- package/fesm2022/cmat-components-progress-bar.mjs +15 -34
- package/fesm2022/cmat-components-progress-bar.mjs.map +1 -1
- package/fesm2022/cmat-components-qrcode.mjs +95 -88
- package/fesm2022/cmat-components-qrcode.mjs.map +1 -1
- package/fesm2022/cmat-components-rating.mjs +70 -67
- package/fesm2022/cmat-components-rating.mjs.map +1 -1
- package/fesm2022/cmat-components-rich-text-editor.mjs +23 -26
- package/fesm2022/cmat-components-rich-text-editor.mjs.map +1 -1
- package/fesm2022/cmat-components-select-search.mjs +190 -159
- package/fesm2022/cmat-components-select-search.mjs.map +1 -1
- package/fesm2022/cmat-components-select-table.mjs +276 -213
- package/fesm2022/cmat-components-select-table.mjs.map +1 -1
- package/fesm2022/cmat-components-select-tree.mjs +178 -128
- package/fesm2022/cmat-components-select-tree.mjs.map +1 -1
- package/fesm2022/cmat-components-skeleton.mjs +44 -28
- package/fesm2022/cmat-components-skeleton.mjs.map +1 -1
- package/fesm2022/cmat-components-speed-dial.mjs +107 -163
- package/fesm2022/cmat-components-speed-dial.mjs.map +1 -1
- package/fesm2022/cmat-components-status-tag.mjs +29 -36
- package/fesm2022/cmat-components-status-tag.mjs.map +1 -1
- package/fesm2022/cmat-components-table-toolbar.mjs +14 -18
- package/fesm2022/cmat-components-table-toolbar.mjs.map +1 -1
- package/fesm2022/cmat-components-timeline.mjs +111 -118
- package/fesm2022/cmat-components-timeline.mjs.map +1 -1
- package/fesm2022/cmat-components-toast.mjs +65 -66
- package/fesm2022/cmat-components-toast.mjs.map +1 -1
- package/fesm2022/cmat-components-transfer-picker.mjs +130 -160
- package/fesm2022/cmat-components-transfer-picker.mjs.map +1 -1
- package/fesm2022/cmat-components-treetable.mjs +32 -39
- package/fesm2022/cmat-components-treetable.mjs.map +1 -1
- package/fesm2022/cmat-components-upload.mjs +186 -176
- package/fesm2022/cmat-components-upload.mjs.map +1 -1
- package/fesm2022/cmat-directives-animate-on-scroll.mjs +25 -28
- package/fesm2022/cmat-directives-animate-on-scroll.mjs.map +1 -1
- package/fesm2022/cmat-directives-arrow-cursor.mjs +85 -92
- package/fesm2022/cmat-directives-arrow-cursor.mjs.map +1 -1
- package/fesm2022/cmat-directives-autofocus.mjs +3 -3
- package/fesm2022/cmat-directives-autofocus.mjs.map +1 -1
- package/fesm2022/cmat-directives-data-exporter.mjs +49 -50
- package/fesm2022/cmat-directives-data-exporter.mjs.map +1 -1
- package/fesm2022/cmat-directives-debounce.mjs +16 -19
- package/fesm2022/cmat-directives-debounce.mjs.map +1 -1
- package/fesm2022/cmat-directives-digit-only.mjs +60 -69
- package/fesm2022/cmat-directives-digit-only.mjs.map +1 -1
- package/fesm2022/cmat-directives-equal-validator.mjs +3 -3
- package/fesm2022/cmat-directives-equal-validator.mjs.map +1 -1
- package/fesm2022/cmat-directives-seamless-auto-scroll.mjs +31 -30
- package/fesm2022/cmat-directives-seamless-auto-scroll.mjs.map +1 -1
- package/fesm2022/cmat-lib-mock-api.mjs +6 -6
- package/fesm2022/cmat-lib-mock-api.mjs.map +1 -1
- package/fesm2022/cmat-pipes-bytes.mjs +3 -3
- package/fesm2022/cmat-pipes-bytes.mjs.map +1 -1
- package/fesm2022/cmat-pipes-date-format.mjs +3 -3
- package/fesm2022/cmat-pipes-date-format.mjs.map +1 -1
- package/fesm2022/cmat-pipes-find-by-key.mjs +3 -3
- package/fesm2022/cmat-pipes-find-by-key.mjs.map +1 -1
- package/fesm2022/cmat-pipes-group-by.mjs +3 -3
- package/fesm2022/cmat-pipes-group-by.mjs.map +1 -1
- package/fesm2022/cmat-pipes-keys.mjs +3 -3
- package/fesm2022/cmat-pipes-keys.mjs.map +1 -1
- package/fesm2022/cmat-pipes-secure.mjs +7 -13
- package/fesm2022/cmat-pipes-secure.mjs.map +1 -1
- package/fesm2022/cmat-pipes-uppercase.mjs +3 -3
- package/fesm2022/cmat-pipes-uppercase.mjs.map +1 -1
- package/fesm2022/cmat-services-alert.mjs +26 -27
- package/fesm2022/cmat-services-alert.mjs.map +1 -1
- package/fesm2022/cmat-services-config.mjs +14 -23
- package/fesm2022/cmat-services-config.mjs.map +1 -1
- package/fesm2022/cmat-services-confirmation.mjs +8 -8
- package/fesm2022/cmat-services-confirmation.mjs.map +1 -1
- package/fesm2022/cmat-services-data.mjs +6 -10
- package/fesm2022/cmat-services-data.mjs.map +1 -1
- package/fesm2022/cmat-services-export-as.mjs +3 -3
- package/fesm2022/cmat-services-export-as.mjs.map +1 -1
- package/fesm2022/cmat-services-loading.mjs +30 -47
- package/fesm2022/cmat-services-loading.mjs.map +1 -1
- package/fesm2022/cmat-services-local-storage.mjs +3 -3
- package/fesm2022/cmat-services-local-storage.mjs.map +1 -1
- package/fesm2022/cmat-services-media-watcher.mjs +43 -34
- package/fesm2022/cmat-services-media-watcher.mjs.map +1 -1
- package/fesm2022/cmat-services-platform.mjs +3 -3
- package/fesm2022/cmat-services-platform.mjs.map +1 -1
- package/fesm2022/cmat-services-splash-screen.mjs +3 -3
- package/fesm2022/cmat-services-splash-screen.mjs.map +1 -1
- package/fesm2022/cmat-services-title.mjs +3 -3
- package/fesm2022/cmat-services-title.mjs.map +1 -1
- package/fesm2022/cmat-services-translation.mjs +11 -11
- package/fesm2022/cmat-services-translation.mjs.map +1 -1
- package/fesm2022/cmat-services-utils.mjs +4 -4
- package/fesm2022/cmat-services-utils.mjs.map +1 -1
- package/fesm2022/cmat.mjs +9229 -7508
- package/fesm2022/cmat.mjs.map +1 -1
- package/icons/material-icons/heroicons-outline.svg +3 -0
- package/icons/material-icons/heroicons-solid.svg +3 -0
- package/package.json +10 -1
- package/styles/components/bundle.scss +21 -0
- package/styles/overrides/angular-material.scss +22 -1
- package/tailwind/plugins/theming.js +183 -183
- package/types/cmat-components-breadcrumb.d.ts +40 -37
- package/types/cmat-components-card.d.ts +11 -13
- package/types/cmat-components-carousel.d.ts +87 -113
- package/types/cmat-components-cascade.d.ts +84 -65
- package/types/cmat-components-chip-input.d.ts +29 -24
- package/types/cmat-components-code-editor.d.ts +28 -12
- package/types/cmat-components-color-picker.d.ts +236 -0
- package/types/cmat-components-custom-formly.d.ts +316 -184
- package/types/cmat-components-data-picker.d.ts +372 -0
- package/types/cmat-components-date-range.d.ts +31 -36
- package/types/cmat-components-date-time-display.d.ts +8 -8
- package/types/cmat-components-drawer.d.ts +30 -32
- package/types/cmat-components-empty-state.d.ts +9 -10
- package/types/cmat-components-file-preview.d.ts +9 -9
- package/types/cmat-components-filter-toolbar.d.ts +15 -15
- package/types/cmat-components-form-actions.d.ts +5 -5
- package/types/cmat-components-fullscreen.d.ts +5 -5
- package/types/cmat-components-highlight.d.ts +13 -14
- package/types/cmat-components-image-viewer.d.ts +29 -33
- package/types/cmat-components-inline-loading.d.ts +6 -6
- package/types/cmat-components-json-editor.d.ts +15 -17
- package/types/cmat-components-knob-input.d.ts +58 -55
- package/types/cmat-components-masonry.d.ts +9 -12
- package/types/cmat-components-material-color-picker.d.ts +16 -21
- package/types/cmat-components-material-datetimepicker.d.ts +174 -216
- package/types/cmat-components-navigation.d.ts +34 -39
- package/types/cmat-components-opt-input.d.ts +35 -33
- package/types/cmat-components-org-chart.d.ts +8 -9
- package/types/cmat-components-page-header.d.ts +9 -9
- package/types/cmat-components-pagination.d.ts +36 -40
- package/types/cmat-components-password-strength.d.ts +58 -64
- package/types/cmat-components-popover.d.ts +22 -32
- package/types/cmat-components-progress-bar.d.ts +7 -10
- package/types/cmat-components-qrcode.d.ts +22 -22
- package/types/cmat-components-rating.d.ts +17 -19
- package/types/cmat-components-rich-text-editor.d.ts +11 -12
- package/types/cmat-components-select-search.d.ts +48 -36
- package/types/cmat-components-select-table.d.ts +38 -34
- package/types/cmat-components-select-tree.d.ts +17 -15
- package/types/cmat-components-skeleton.d.ts +27 -10
- package/types/cmat-components-speed-dial.d.ts +24 -33
- package/types/cmat-components-status-tag.d.ts +19 -9
- package/types/cmat-components-table-toolbar.d.ts +7 -7
- package/types/cmat-components-timeline.d.ts +33 -34
- package/types/cmat-components-toast.d.ts +26 -30
- package/types/cmat-components-transfer-picker.d.ts +51 -56
- package/types/cmat-components-treetable.d.ts +12 -13
- package/types/cmat-components-upload.d.ts +33 -38
- package/types/cmat-components-x6-angular-shape.d.ts +1 -1
- package/types/cmat-directives-animate-on-scroll.d.ts +7 -7
- package/types/cmat-directives-arrow-cursor.d.ts +18 -20
- package/types/cmat-directives-data-exporter.d.ts +10 -10
- package/types/cmat-directives-debounce.d.ts +5 -5
- package/types/cmat-directives-digit-only.d.ts +13 -13
- package/types/cmat-directives-seamless-auto-scroll.d.ts +7 -7
- package/types/cmat-pipes-secure.d.ts +1 -3
- package/types/cmat-services-alert.d.ts +11 -12
- package/types/cmat-services-config.d.ts +2 -7
- package/types/cmat-services-confirmation.d.ts +2 -2
- package/types/cmat-services-data.d.ts +0 -1
- package/types/cmat-services-loading.d.ts +14 -22
- package/types/cmat-services-media-watcher.d.ts +5 -5
- package/types/cmat-services-translation.d.ts +4 -5
- package/types/cmat.d.ts +2167 -1746
|
@@ -1,57 +1,95 @@
|
|
|
1
1
|
import { DOCUMENT } from '@angular/common';
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { viewChild, output, input, signal, inject, effect, ViewEncapsulation, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
4
4
|
import { createAjvValidator, parseJSONPath, createMultiSelection, isJSONContent, isKeySelection, stringifyJSONPath, isMultiSelection, createJSONEditor } from 'vanilla-jsoneditor';
|
|
5
5
|
|
|
6
6
|
class CmatJsonEditorComponent {
|
|
7
7
|
constructor() {
|
|
8
|
-
this.
|
|
9
|
-
|
|
10
|
-
this.
|
|
8
|
+
this.jsonEditorContainer = viewChild('jsonEditorContainer', /* @ts-ignore */
|
|
9
|
+
...(ngDevMode ? [{ debugName: "jsonEditorContainer" }] : /* istanbul ignore next */ []));
|
|
10
|
+
this.contentChanged = output();
|
|
11
|
+
this.pathChanged = output();
|
|
12
|
+
this.options = input({}, /* @ts-ignore */
|
|
13
|
+
...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
14
|
+
this.data = input(/* @ts-ignore */
|
|
15
|
+
...(ngDevMode ? [undefined, { debugName: "data" }] : /* istanbul ignore next */ []));
|
|
11
16
|
this.id = 'cmatjsoneditor-' + crypto.randomUUID().slice(0, 8);
|
|
12
|
-
this.
|
|
17
|
+
this._content = {
|
|
13
18
|
text: undefined,
|
|
14
|
-
json: {}
|
|
19
|
+
json: {},
|
|
15
20
|
};
|
|
16
|
-
this.
|
|
21
|
+
this._editorSignal = signal(undefined, /* @ts-ignore */
|
|
22
|
+
...(ngDevMode ? [{ debugName: "_editorSignal" }] : /* istanbul ignore next */ []));
|
|
17
23
|
this._document = inject(DOCUMENT);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (changes.data) {
|
|
28
|
-
this.content = {
|
|
29
|
-
text: undefined,
|
|
30
|
-
json: this.data
|
|
31
|
-
};
|
|
32
|
-
if (this._editor) {
|
|
33
|
-
void this._editor.update(this.content);
|
|
24
|
+
this._destroyed = false;
|
|
25
|
+
effect(() => {
|
|
26
|
+
if (this._destroyed)
|
|
27
|
+
return;
|
|
28
|
+
const container = this.jsonEditorContainer();
|
|
29
|
+
const data = this.data();
|
|
30
|
+
const options = this.options();
|
|
31
|
+
if (container && !this._editorSignal()) {
|
|
32
|
+
this._initializeEditor(container.nativeElement, options, data);
|
|
34
33
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
else if (this._editorSignal()) {
|
|
35
|
+
// 如果编辑器已存在,处理数据或选项的变更
|
|
36
|
+
// 注意:effect 会在任何依赖的信号变化时运行,包括 data 和 options
|
|
37
|
+
// 我们需要区分是初始化还是更新
|
|
38
|
+
// 更新内容 (data 变化)
|
|
39
|
+
// 为了避免在初始化时重复设置,我们可以在 _initializeEditor 中设置初始内容
|
|
40
|
+
// 这里只处理后续的 data 变化
|
|
41
|
+
// 由于 effect 无法直接知道是哪个信号触发的,我们可能需要更细致的逻辑
|
|
42
|
+
// 或者简单地每次 data 变化都调用 update
|
|
43
|
+
// 更好的方式:分别监听 data 和 options 的变化
|
|
39
44
|
}
|
|
40
|
-
}
|
|
45
|
+
});
|
|
46
|
+
effect(() => {
|
|
47
|
+
const data = this.data();
|
|
48
|
+
const editor = this._editorSignal();
|
|
49
|
+
if (editor && !this._destroyed) {
|
|
50
|
+
console.log('[JSON Editor] Data changed, updating editor:', data);
|
|
51
|
+
const newContent = {
|
|
52
|
+
text: undefined,
|
|
53
|
+
json: data,
|
|
54
|
+
};
|
|
55
|
+
void editor.set(newContent);
|
|
56
|
+
this._content = newContent;
|
|
57
|
+
console.log('[JSON Editor] Editor set completed');
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
effect(() => {
|
|
61
|
+
const options = this.options();
|
|
62
|
+
const editor = this._editorSignal();
|
|
63
|
+
if (editor && !this._destroyed) {
|
|
64
|
+
void editor.updateProps(options);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
41
67
|
}
|
|
42
68
|
ngOnDestroy() {
|
|
43
69
|
this._destroyed = true;
|
|
44
|
-
|
|
70
|
+
const editor = this._editorSignal();
|
|
71
|
+
if (editor) {
|
|
72
|
+
void editor.destroy();
|
|
73
|
+
this._editorSignal.set(undefined);
|
|
74
|
+
}
|
|
45
75
|
}
|
|
46
76
|
setSchema(schema) {
|
|
47
|
-
const
|
|
48
|
-
|
|
77
|
+
const editor = this._editorSignal();
|
|
78
|
+
if (!editor)
|
|
79
|
+
return;
|
|
80
|
+
const validator = createAjvValidator({
|
|
81
|
+
schema: schema,
|
|
82
|
+
});
|
|
83
|
+
void editor.updateProps({ validator: validator });
|
|
49
84
|
}
|
|
50
85
|
setSelectionToPath(pathString) {
|
|
86
|
+
const editor = this._editorSignal();
|
|
87
|
+
if (!editor)
|
|
88
|
+
return;
|
|
51
89
|
const path = parseJSONPath(pathString);
|
|
52
90
|
const selection = createMultiSelection(path, path);
|
|
53
91
|
try {
|
|
54
|
-
void
|
|
92
|
+
void editor.select(selection);
|
|
55
93
|
}
|
|
56
94
|
catch (error) {
|
|
57
95
|
console.warn('Set selection to path not possible:', pathString, error);
|
|
@@ -59,26 +97,32 @@ class CmatJsonEditorComponent {
|
|
|
59
97
|
this.pathChanged.emit(pathString);
|
|
60
98
|
}
|
|
61
99
|
get() {
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
100
|
+
const editor = this._editorSignal();
|
|
101
|
+
if (!editor)
|
|
102
|
+
return undefined;
|
|
103
|
+
const content = editor.get();
|
|
104
|
+
if (isJSONContent(content)) {
|
|
105
|
+
return content.json;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const textContent = content;
|
|
109
|
+
const t = String(textContent.text ?? '');
|
|
110
|
+
try {
|
|
111
|
+
return JSON.parse(t);
|
|
67
112
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
const t = String(textContent.text ?? '');
|
|
71
|
-
const j = JSON.parse(t);
|
|
72
|
-
return j;
|
|
113
|
+
catch {
|
|
114
|
+
return undefined;
|
|
73
115
|
}
|
|
74
116
|
}
|
|
75
|
-
return undefined;
|
|
76
117
|
}
|
|
77
118
|
set(json) {
|
|
119
|
+
const editor = this._editorSignal();
|
|
120
|
+
if (!editor)
|
|
121
|
+
return;
|
|
78
122
|
const value = {
|
|
79
123
|
json: json,
|
|
80
124
|
};
|
|
81
|
-
void
|
|
125
|
+
void editor.set(value);
|
|
82
126
|
}
|
|
83
127
|
_onSelect(selection) {
|
|
84
128
|
if (isKeySelection(selection)) {
|
|
@@ -88,29 +132,38 @@ class CmatJsonEditorComponent {
|
|
|
88
132
|
this.pathChanged.emit(stringifyJSONPath(selection.anchorPath));
|
|
89
133
|
}
|
|
90
134
|
}
|
|
91
|
-
_initializeEditor() {
|
|
92
|
-
if (this._destroyed || this.
|
|
135
|
+
_initializeEditor(target, options, initialData) {
|
|
136
|
+
if (this._destroyed || this._editorSignal()) {
|
|
93
137
|
return;
|
|
94
138
|
}
|
|
95
|
-
this.
|
|
96
|
-
|
|
139
|
+
this._content = {
|
|
140
|
+
text: undefined,
|
|
141
|
+
json: initialData,
|
|
142
|
+
};
|
|
143
|
+
const editor = createJSONEditor({
|
|
144
|
+
target: target,
|
|
97
145
|
props: {
|
|
98
|
-
...
|
|
99
|
-
content: this.
|
|
146
|
+
...options,
|
|
147
|
+
content: this._content,
|
|
100
148
|
onChange: (updatedContent, _previousContent, { contentErrors }) => {
|
|
101
149
|
if (contentErrors) {
|
|
102
150
|
console.error('JSON Editor content errors:', contentErrors);
|
|
103
151
|
}
|
|
104
|
-
this.
|
|
152
|
+
this._content = updatedContent;
|
|
105
153
|
this.contentChanged.emit(updatedContent);
|
|
106
154
|
},
|
|
107
155
|
onSelect: this._onSelect.bind(this),
|
|
108
|
-
onRenderMenu(items,
|
|
156
|
+
onRenderMenu: (items,
|
|
109
157
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
110
|
-
context) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
158
|
+
context) => {
|
|
159
|
+
const itemsToRemove = ['table', 'jse-sort', 'jse-transform'];
|
|
160
|
+
for (let i = items.length - 1; i >= 0; i--) {
|
|
161
|
+
const item = items[i];
|
|
162
|
+
if (itemsToRemove.includes(item['text'] ?? '') ||
|
|
163
|
+
itemsToRemove.includes(item['className'] ?? '')) {
|
|
164
|
+
items.splice(i, 1);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
114
167
|
items.forEach((item) => {
|
|
115
168
|
const button = item;
|
|
116
169
|
switch (button['title']) {
|
|
@@ -131,10 +184,10 @@ class CmatJsonEditorComponent {
|
|
|
131
184
|
button.title = '切换到树模式(当前模式:树)';
|
|
132
185
|
break;
|
|
133
186
|
case 'Format JSON: add proper indentation and new lines (Ctrl+I)':
|
|
134
|
-
button.title = 'JSON
|
|
187
|
+
button.title = 'JSON格式化:添加适当的缩进和换行 (Ctrl+I)';
|
|
135
188
|
break;
|
|
136
189
|
case 'Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)':
|
|
137
|
-
button.title = '压缩 JSON
|
|
190
|
+
button.title = '压缩 JSON:删除所有空白间距和换行 (Ctrl+Shift+I)';
|
|
138
191
|
break;
|
|
139
192
|
case 'Search (Ctrl+F)':
|
|
140
193
|
button.title = '搜索 (Ctrl+F)';
|
|
@@ -152,7 +205,7 @@ class CmatJsonEditorComponent {
|
|
|
152
205
|
button.title = '全部折叠';
|
|
153
206
|
break;
|
|
154
207
|
case 'Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)':
|
|
155
|
-
button.title = '
|
|
208
|
+
button.title = '打开上下文菜单(单击此处、右键选择,或使用上下文菜单按钮,或 Ctrl+Q))';
|
|
156
209
|
break;
|
|
157
210
|
}
|
|
158
211
|
});
|
|
@@ -160,25 +213,15 @@ class CmatJsonEditorComponent {
|
|
|
160
213
|
},
|
|
161
214
|
},
|
|
162
215
|
});
|
|
216
|
+
this._editorSignal.set(editor);
|
|
163
217
|
}
|
|
164
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
165
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
218
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: CmatJsonEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
219
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: CmatJsonEditorComponent, isStandalone: true, selector: "cmat-json-editor", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { contentChanged: "contentChanged", pathChanged: "pathChanged" }, viewQueries: [{ propertyName: "jsonEditorContainer", first: true, predicate: ["jsonEditorContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON \u7F16\u8F91\u5668\u52A0\u8F7D\u4E2D...\r\n </div>\r\n}", styles: [".cmat-jsoneditor .jse-main.svelte-sxaskb{min-height:24rem}.cmat-jsoneditor{--jse-background-color: rgba(var(--cmat-bg-card-rgb), 1);--jse-text-color: var(--cmat-text-default);--jse-key-color: var(--cmat-text-default);--jse-delimiter-color: var(--cmat-text-hint);--jse-hover-background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
166
220
|
}
|
|
167
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
221
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: CmatJsonEditorComponent, decorators: [{
|
|
168
222
|
type: Component,
|
|
169
|
-
args: [{ selector: 'cmat-json-editor', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [], template: "@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON \u7F16\u8F91\u5668\u52A0\u8F7D\u4E2D...\r\n </div>\r\n}
|
|
170
|
-
}], propDecorators: { options: [{
|
|
171
|
-
type: Input
|
|
172
|
-
}], data: [{
|
|
173
|
-
type: Input
|
|
174
|
-
}], contentChanged: [{
|
|
175
|
-
type: Output
|
|
176
|
-
}], pathChanged: [{
|
|
177
|
-
type: Output
|
|
178
|
-
}], jsonEditorContainer: [{
|
|
179
|
-
type: ViewChild,
|
|
180
|
-
args: ['jsonEditorContainer']
|
|
181
|
-
}] } });
|
|
223
|
+
args: [{ selector: 'cmat-json-editor', preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, imports: [], template: "@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON \u7F16\u8F91\u5668\u52A0\u8F7D\u4E2D...\r\n </div>\r\n}", styles: [".cmat-jsoneditor .jse-main.svelte-sxaskb{min-height:24rem}.cmat-jsoneditor{--jse-background-color: rgba(var(--cmat-bg-card-rgb), 1);--jse-text-color: var(--cmat-text-default);--jse-key-color: var(--cmat-text-default);--jse-delimiter-color: var(--cmat-text-hint);--jse-hover-background-color:var(--mat-option-hover-state-layer-color, color-mix(in srgb, var(--mat-sys-on-surface) calc(var(--mat-sys-hover-state-layer-opacity) * 100%), transparent))}\n"] }]
|
|
224
|
+
}], ctorParameters: () => [], propDecorators: { jsonEditorContainer: [{ type: i0.ViewChild, args: ['jsonEditorContainer', { isSignal: true }] }], contentChanged: [{ type: i0.Output, args: ["contentChanged"] }], pathChanged: [{ type: i0.Output, args: ["pathChanged"] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }] } });
|
|
182
225
|
|
|
183
226
|
/**
|
|
184
227
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cmat-components-json-editor.mjs","sources":["../../../projects/cmat/components/json-editor/json-editor.component.ts","../../../projects/cmat/components/json-editor/json-editor.component.html","../../../projects/cmat/components/json-editor/cmat-components-json-editor.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewEncapsulation,\r\n inject,\r\n} from '@angular/core';\r\nimport {\r\n stringifyJSONPath,\r\n Content,\r\n MenuItem,\r\n createAjvValidator,\r\n JSONEditorPropsOptional,\r\n parseJSONPath,\r\n JSONEditorSelection,\r\n isKeySelection,\r\n isJSONContent,\r\n JSONContent,\r\n isMultiSelection,\r\n createMultiSelection,\r\n MenuButton,\r\n createJSONEditor,\r\n JsonEditor,\r\n} from 'vanilla-jsoneditor';\r\n\r\n@Component({\r\n selector: 'cmat-json-editor',\r\n templateUrl: './json-editor.component.html',\r\n preserveWhitespaces: false,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./json-editor.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n imports: []\r\n})\r\nexport class CmatJsonEditorComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() options: JSONEditorPropsOptional = {};\r\n @Input() data: unknown;\r\n\r\n @Output() contentChanged: EventEmitter<Content> = new EventEmitter<Content>();\r\n @Output() pathChanged: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n\r\n public id = 'cmatjsoneditor-' + crypto.randomUUID().slice(0, 8);\r\n content: Content = {\r\n text: undefined,\r\n json: {}\r\n };\r\n\r\n private _editor?: JsonEditor;\r\n private _jsonEditorContainer?: ElementRef<HTMLElement>;\r\n private _destroyed = false;\r\n private readonly _document = inject(DOCUMENT);\r\n\r\n @ViewChild('jsonEditorContainer')\r\n set jsonEditorContainer(value: ElementRef<HTMLElement> | undefined) {\r\n this._jsonEditorContainer = value;\r\n this._initializeEditor();\r\n }\r\n\r\n ngOnInit(): void {\r\n this._initializeEditor();\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes.data) {\r\n this.content = {\r\n text: undefined,\r\n json: this.data\r\n };\r\n\r\n if (this._editor) {\r\n void this._editor.update(this.content);\r\n }\r\n\r\n }\r\n\r\n if (changes.options) {\r\n if (this._editor) {\r\n void this._editor?.updateProps(this.options);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._destroyed = true;\r\n void this._editor?.destroy();\r\n }\r\n\r\n setSchema(schema: unknown): void {\r\n const validator = createAjvValidator({ schema: schema as import('vanilla-jsoneditor').JSONSchema });\r\n void this._editor?.updateProps({ validator: validator });\r\n }\r\n\r\n setSelectionToPath(pathString: string): void {\r\n const path = parseJSONPath(pathString);\r\n const selection = createMultiSelection(path, path);\r\n\r\n try {\r\n void this._editor?.select(selection);\r\n } catch (error) {\r\n console.warn('Set selection to path not possible:', pathString, error);\r\n }\r\n this.pathChanged.emit(pathString);\r\n }\r\n\r\n get(): JSON | undefined {\r\n if (this._editor) {\r\n const content: Content = this._editor.get();\r\n if (isJSONContent(content)) {\r\n const j = content.json as JSON;\r\n return j;\r\n } else {\r\n const textContent = content as { text?: string };\r\n const t = String(textContent.text ?? '');\r\n const j = JSON.parse(t) as JSON;\r\n return j;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n set(json: unknown): void {\r\n const value: JSONContent = {\r\n json: json,\r\n };\r\n\r\n void this._editor?.set(value);\r\n }\r\n\r\n private _onSelect(selection: JSONEditorSelection | undefined): void {\r\n if (isKeySelection(selection)) {\r\n this.pathChanged.emit(stringifyJSONPath(selection.path));\r\n } else if (isMultiSelection(selection)) {\r\n this.pathChanged.emit(stringifyJSONPath(selection.anchorPath));\r\n }\r\n }\r\n\r\n private _initializeEditor(): void {\r\n if (this._destroyed || this._editor || !this._jsonEditorContainer?.nativeElement) {\r\n return;\r\n }\r\n\r\n this._editor = createJSONEditor({\r\n target: this._jsonEditorContainer.nativeElement,\r\n props: {\r\n ...this.options,\r\n content: this.content,\r\n onChange: (\r\n updatedContent: Content,\r\n _previousContent: Content,\r\n { contentErrors }: { contentErrors?: unknown }\r\n ): void => {\r\n if (contentErrors) {\r\n console.error('JSON Editor content errors:', contentErrors);\r\n }\r\n this.content = updatedContent;\r\n this.contentChanged.emit(updatedContent);\r\n },\r\n onSelect: this._onSelect.bind(this),\r\n onRenderMenu(\r\n items: MenuItem[],\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n context: { mode: 'tree' | 'text' | 'table'; modal: boolean }\r\n ): MenuItem[] | undefined {\r\n items.splice(\r\n items.findIndex((i): boolean => (i as MenuButton)['text'] === 'table'),\r\n 1\r\n );\r\n items.splice(\r\n items.findIndex((i): boolean => (i as MenuButton)['className'] === 'jse-sort'),\r\n 1\r\n );\r\n items.splice(\r\n items.findIndex((i): boolean => (i as MenuButton)['className'] === 'jse-transform'),\r\n 1\r\n );\r\n\r\n items.forEach((item): void => {\r\n const button = item as MenuButton;\r\n switch (button['title']) {\r\n case 'Switch to text mode (current mode: text)':\r\n button.text = '文本';\r\n button.title = '切换到文本模式(当前模式:文本)';\r\n break;\r\n case 'Switch to tree mode (current mode: text)':\r\n button.text = '树';\r\n button.title = '切换到树模式(当前模式:文本)';\r\n break;\r\n case 'Switch to text mode (current mode: tree)':\r\n button.text = '文本';\r\n button.title = '切换到文本模式(当前模式:树)';\r\n break;\r\n case 'Switch to tree mode (current mode: tree)':\r\n button.text = '树';\r\n button.title = '切换到树模式(当前模式:树)';\r\n break;\r\n case 'Format JSON: add proper indentation and new lines (Ctrl+I)':\r\n button.title = 'JSON格式化:添加适当的缩进和换行 (Ctrl+I)';\r\n break;\r\n case 'Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)':\r\n button.title = '压缩 JSON:删除所有空白间距和换行 (Ctrl+Shift+I)';\r\n break;\r\n case 'Search (Ctrl+F)':\r\n button.title = '搜索 (Ctrl+F)';\r\n break;\r\n case 'Undo (Ctrl+Z)':\r\n button.title = '撤销 (Ctrl+Z)';\r\n break;\r\n case 'Redo (Ctrl+Shift+Z)':\r\n button.title = '重做 (Ctrl+Shift+Z)';\r\n break;\r\n case 'Expand all':\r\n button.title = '全部展开';\r\n break;\r\n case 'Collapse all':\r\n button.title = '全部折叠';\r\n break;\r\n case 'Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)':\r\n button.title = '打开上下文菜单(单击此处、右键选择,或使用上下文菜单按钮,或 Ctrl+Q)';\r\n break;\r\n }\r\n });\r\n return items;\r\n },\r\n },\r\n });\r\n }\r\n}\r\n","@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON 编辑器加载中...\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cmat-components-json-editor.mjs","sources":["../../../projects/cmat/components/json-editor/json-editor.component.ts","../../../projects/cmat/components/json-editor/json-editor.component.html","../../../projects/cmat/components/json-editor/cmat-components-json-editor.ts"],"sourcesContent":["import { DOCUMENT } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n ViewEncapsulation,\r\n inject,\r\n input,\r\n output,\r\n viewChild,\r\n effect,\r\n OnDestroy,\r\n signal,\r\n} from '@angular/core';\r\nimport {\r\n stringifyJSONPath,\r\n Content,\r\n MenuItem,\r\n createAjvValidator,\r\n JSONEditorPropsOptional,\r\n parseJSONPath,\r\n JSONEditorSelection,\r\n isKeySelection,\r\n isJSONContent,\r\n JSONContent,\r\n isMultiSelection,\r\n createMultiSelection,\r\n MenuButton,\r\n createJSONEditor,\r\n JsonEditor,\r\n} from 'vanilla-jsoneditor';\r\n\r\n@Component({\r\n selector: 'cmat-json-editor',\r\n templateUrl: './json-editor.component.html',\r\n preserveWhitespaces: false,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: ['./json-editor.component.scss'],\r\n encapsulation: ViewEncapsulation.None,\r\n imports: [],\r\n})\r\nexport class CmatJsonEditorComponent implements OnDestroy {\r\n readonly jsonEditorContainer = viewChild<ElementRef<HTMLElement>>('jsonEditorContainer');\r\n\r\n readonly contentChanged = output<Content>();\r\n readonly pathChanged = output<string>();\r\n\r\n readonly options = input<JSONEditorPropsOptional>({});\r\n readonly data = input<unknown>();\r\n\r\n public id = 'cmatjsoneditor-' + crypto.randomUUID().slice(0, 8);\r\n\r\n private _content: Content = {\r\n text: undefined,\r\n json: {},\r\n };\r\n\r\n private readonly _editorSignal = signal<JsonEditor | undefined>(undefined);\r\n\r\n\r\n private readonly _document = inject(DOCUMENT);\r\n private _destroyed = false;\r\n\r\n constructor() {\r\n effect(() => {\r\n if (this._destroyed) return;\r\n\r\n const container = this.jsonEditorContainer();\r\n const data = this.data();\r\n const options = this.options();\r\n\r\n if (container && !this._editorSignal()) {\r\n this._initializeEditor(container.nativeElement, options, data);\r\n } else if (this._editorSignal()) {\r\n // 如果编辑器已存在,处理数据或选项的变更\r\n // 注意:effect 会在任何依赖的信号变化时运行,包括 data 和 options\r\n // 我们需要区分是初始化还是更新\r\n\r\n // 更新内容 (data 变化)\r\n // 为了避免在初始化时重复设置,我们可以在 _initializeEditor 中设置初始内容\r\n // 这里只处理后续的 data 变化\r\n // 由于 effect 无法直接知道是哪个信号触发的,我们可能需要更细致的逻辑\r\n // 或者简单地每次 data 变化都调用 update\r\n\r\n // 更好的方式:分别监听 data 和 options 的变化\r\n }\r\n });\r\n\r\n\r\n effect(() => {\r\n const data = this.data();\r\n const editor = this._editorSignal();\r\n\r\n if (editor && !this._destroyed) {\r\n console.log('[JSON Editor] Data changed, updating editor:', data);\r\n const newContent: Content = {\r\n text: undefined,\r\n json: data,\r\n };\r\n\r\n void editor.set(newContent);\r\n this._content = newContent;\r\n console.log('[JSON Editor] Editor set completed');\r\n }\r\n });\r\n\r\n effect(() => {\r\n const options = this.options();\r\n const editor = this._editorSignal();\r\n\r\n if (editor && !this._destroyed) {\r\n void editor.updateProps(options);\r\n }\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._destroyed = true;\r\n const editor = this._editorSignal();\r\n if (editor) {\r\n void editor.destroy();\r\n this._editorSignal.set(undefined);\r\n }\r\n }\r\n\r\n setSchema(schema: unknown): void {\r\n const editor = this._editorSignal();\r\n if (!editor) return;\r\n\r\n const validator = createAjvValidator({\r\n schema: schema as import('vanilla-jsoneditor').JSONSchema,\r\n });\r\n void editor.updateProps({ validator: validator });\r\n }\r\n\r\n setSelectionToPath(pathString: string): void {\r\n const editor = this._editorSignal();\r\n if (!editor) return;\r\n\r\n const path = parseJSONPath(pathString);\r\n const selection = createMultiSelection(path, path);\r\n\r\n try {\r\n void editor.select(selection);\r\n } catch (error) {\r\n console.warn('Set selection to path not possible:', pathString, error);\r\n }\r\n this.pathChanged.emit(pathString);\r\n }\r\n\r\n get(): JSON | undefined {\r\n const editor = this._editorSignal();\r\n if (!editor) return undefined;\r\n\r\n const content: Content = editor.get();\r\n if (isJSONContent(content)) {\r\n return content.json as JSON;\r\n } else {\r\n const textContent = content as { text?: string };\r\n const t = String(textContent.text ?? '');\r\n try {\r\n return JSON.parse(t) as JSON;\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n }\r\n\r\n set(json: unknown): void {\r\n const editor = this._editorSignal();\r\n if (!editor) return;\r\n\r\n const value: JSONContent = {\r\n json: json,\r\n };\r\n void editor.set(value);\r\n }\r\n\r\n private _onSelect(selection: JSONEditorSelection | undefined): void {\r\n if (isKeySelection(selection)) {\r\n this.pathChanged.emit(stringifyJSONPath(selection.path));\r\n } else if (isMultiSelection(selection)) {\r\n this.pathChanged.emit(stringifyJSONPath(selection.anchorPath));\r\n }\r\n }\r\n\r\n private _initializeEditor(target: HTMLElement, options: JSONEditorPropsOptional, initialData: unknown): void {\r\n if (this._destroyed || this._editorSignal()) {\r\n return;\r\n }\r\n\r\n this._content = {\r\n text: undefined,\r\n json: initialData,\r\n };\r\n\r\n const editor = createJSONEditor({\r\n target: target,\r\n props: {\r\n ...options,\r\n content: this._content,\r\n onChange: (\r\n updatedContent: Content,\r\n _previousContent: Content,\r\n { contentErrors }: { contentErrors?: unknown },\r\n ): void => {\r\n if (contentErrors) {\r\n console.error('JSON Editor content errors:', contentErrors);\r\n }\r\n this._content = updatedContent;\r\n this.contentChanged.emit(updatedContent);\r\n },\r\n onSelect: this._onSelect.bind(this),\r\n onRenderMenu: (\r\n items: MenuItem[],\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n context: { mode: 'tree' | 'text' | 'table'; modal: boolean },\r\n ): MenuItem[] | undefined => {\r\n const itemsToRemove = ['table', 'jse-sort', 'jse-transform'];\r\n for (let i = items.length - 1; i >= 0; i--) {\r\n const item = items[i] as MenuButton;\r\n if (\r\n itemsToRemove.includes(item['text'] ?? '') ||\r\n itemsToRemove.includes(item['className'] ?? '')\r\n ) {\r\n items.splice(i, 1);\r\n }\r\n }\r\n\r\n items.forEach((item): void => {\r\n const button = item as MenuButton;\r\n switch (button['title']) {\r\n case 'Switch to text mode (current mode: text)':\r\n button.text = '文本';\r\n button.title = '切换到文本模式(当前模式:文本)';\r\n break;\r\n case 'Switch to tree mode (current mode: text)':\r\n button.text = '树';\r\n button.title = '切换到树模式(当前模式:文本)';\r\n break;\r\n case 'Switch to text mode (current mode: tree)':\r\n button.text = '文本';\r\n button.title = '切换到文本模式(当前模式:树)';\r\n break;\r\n case 'Switch to tree mode (current mode: tree)':\r\n button.text = '树';\r\n button.title = '切换到树模式(当前模式:树)';\r\n break;\r\n case 'Format JSON: add proper indentation and new lines (Ctrl+I)':\r\n button.title = 'JSON格式化:添加适当的缩进和换行 (Ctrl+I)';\r\n break;\r\n case 'Compact JSON: remove all white spacing and new lines (Ctrl+Shift+I)':\r\n button.title = '压缩 JSON:删除所有空白间距和换行 (Ctrl+Shift+I)';\r\n break;\r\n case 'Search (Ctrl+F)':\r\n button.title = '搜索 (Ctrl+F)';\r\n break;\r\n case 'Undo (Ctrl+Z)':\r\n button.title = '撤销 (Ctrl+Z)';\r\n break;\r\n case 'Redo (Ctrl+Shift+Z)':\r\n button.title = '重做 (Ctrl+Shift+Z)';\r\n break;\r\n case 'Expand all':\r\n button.title = '全部展开';\r\n break;\r\n case 'Collapse all':\r\n button.title = '全部折叠';\r\n break;\r\n case 'Open context menu (Click here, right click on the selection, or use the context menu button or Ctrl+Q)':\r\n button.title = '打开上下文菜单(单击此处、右键选择,或使用上下文菜单按钮,或 Ctrl+Q))';\r\n break;\r\n }\r\n });\r\n return items;\r\n },\r\n },\r\n });\r\n\r\n this._editorSignal.set(editor);\r\n }\r\n}","@defer (on viewport) {\r\n <div #jsonEditorContainer class=\"cmat-jsoneditor\" [id]=\"id\"></div>\r\n} @placeholder {\r\n <div class=\"flex min-h-64 items-center justify-center rounded-2xl border border-dashed border-default bg-card px-4 py-6 text-sm text-secondary shadow-sm\">\r\n JSON 编辑器加载中...\r\n </div>\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MAyCa,uBAAuB,CAAA;AAsBlC,IAAA,WAAA,GAAA;QArBS,IAAA,CAAA,mBAAmB,GAAG,SAAS,CAA0B,qBAAqB;gGAAC;QAE/E,IAAA,CAAA,cAAc,GAAG,MAAM,EAAW;QAClC,IAAA,CAAA,WAAW,GAAG,MAAM,EAAU;QAE9B,IAAA,CAAA,OAAO,GAAG,KAAK,CAA0B,EAAE;oFAAC;AAC5C,QAAA,IAAA,CAAA,IAAI,GAAG,KAAK;4FAAW;AAEzB,QAAA,IAAA,CAAA,EAAE,GAAG,iBAAiB,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;AAEvD,QAAA,IAAA,CAAA,QAAQ,GAAY;AAC1B,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,IAAI,EAAE,EAAE;SACT;QAEgB,IAAA,CAAA,aAAa,GAAG,MAAM,CAAyB,SAAS;0FAAC;AAGzD,QAAA,IAAA,CAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QACrC,IAAA,CAAA,UAAU,GAAG,KAAK;QAGxB,MAAM,CAAC,MAAK;YACV,IAAI,IAAI,CAAC,UAAU;gBAAE;AAErB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,EAAE;AAC5C,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;YAE9B,IAAI,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE;gBACtC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;YAChE;AAAO,iBAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;;;;;;;;;;YAYjC;AACF,QAAA,CAAC,CAAC;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AAEnC,YAAA,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAC9B,gBAAA,OAAO,CAAC,GAAG,CAAC,8CAA8C,EAAE,IAAI,CAAC;AACjE,gBAAA,MAAM,UAAU,GAAY;AAC1B,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,IAAI,EAAE,IAAI;iBACX;AAED,gBAAA,KAAK,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;AAC3B,gBAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;AAC1B,gBAAA,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC;YACnD;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AAEnC,YAAA,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;AAC9B,gBAAA,KAAK,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC;YAClC;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;QACnC,IAAI,MAAM,EAAE;AACV,YAAA,KAAK,MAAM,CAAC,OAAO,EAAE;AACrB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;QACnC;IACF;AAEA,IAAA,SAAS,CAAC,MAAe,EAAA;AACvB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM;YAAE;QAEb,MAAM,SAAS,GAAG,kBAAkB,CAAC;AACnC,YAAA,MAAM,EAAE,MAAiD;AAC1D,SAAA,CAAC;QACF,KAAK,MAAM,CAAC,WAAW,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IACnD;AAEA,IAAA,kBAAkB,CAAC,UAAkB,EAAA;AACnC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM;YAAE;AAEb,QAAA,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC;QACtC,MAAM,SAAS,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC;AAElD,QAAA,IAAI;AACF,YAAA,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;QAC/B;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE,UAAU,EAAE,KAAK,CAAC;QACxE;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC;IACnC;IAEA,GAAG,GAAA;AACD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,SAAS;AAE7B,QAAA,MAAM,OAAO,GAAY,MAAM,CAAC,GAAG,EAAE;AACrC,QAAA,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE;YAC1B,OAAO,OAAO,CAAC,IAAY;QAC7B;aAAO;YACL,MAAM,WAAW,GAAG,OAA4B;YAChD,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC;AACxC,YAAA,IAAI;AACF,gBAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAS;YAC9B;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,SAAS;YAClB;QACF;IACF;AAEA,IAAA,GAAG,CAAC,IAAa,EAAA;AACf,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM;YAAE;AAEb,QAAA,MAAM,KAAK,GAAgB;AACzB,YAAA,IAAI,EAAE,IAAI;SACX;AACD,QAAA,KAAK,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB;AAEQ,IAAA,SAAS,CAAC,SAA0C,EAAA;AAC1D,QAAA,IAAI,cAAc,CAAC,SAAS,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1D;AAAO,aAAA,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE;AACtC,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAChE;IACF;AAEQ,IAAA,iBAAiB,CAAC,MAAmB,EAAE,OAAgC,EAAE,WAAoB,EAAA;QACnG,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;YAC3C;QACF;QAEA,IAAI,CAAC,QAAQ,GAAG;AACd,YAAA,IAAI,EAAE,SAAS;AACf,YAAA,IAAI,EAAE,WAAW;SAClB;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAC9B,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,KAAK,EAAE;AACL,gBAAA,GAAG,OAAO;gBACV,OAAO,EAAE,IAAI,CAAC,QAAQ;gBACtB,QAAQ,EAAE,CACR,cAAuB,EACvB,gBAAyB,EACzB,EAAE,aAAa,EAA+B,KACtC;oBACR,IAAI,aAAa,EAAE;AACjB,wBAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,aAAa,CAAC;oBAC7D;AACA,oBAAA,IAAI,CAAC,QAAQ,GAAG,cAAc;AAC9B,oBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;gBAC1C,CAAC;gBACD,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;gBACnC,YAAY,EAAE,CACZ,KAAiB;;AAEjB,gBAAA,OAA4D,KAClC;oBAC1B,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC;AAC5D,oBAAA,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;AAC1C,wBAAA,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAe;wBACnC,IACE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;4BAC1C,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,EAC/C;AACA,4BAAA,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;wBACpB;oBACF;AAEA,oBAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAU;wBAC3B,MAAM,MAAM,GAAG,IAAkB;AACjC,wBAAA,QAAQ,MAAM,CAAC,OAAO,CAAC;AACrB,4BAAA,KAAK,0CAA0C;AAC7C,gCAAA,MAAM,CAAC,IAAI,GAAG,IAAI;AAClB,gCAAA,MAAM,CAAC,KAAK,GAAG,kBAAkB;gCACjC;AACF,4BAAA,KAAK,0CAA0C;AAC7C,gCAAA,MAAM,CAAC,IAAI,GAAG,GAAG;AACjB,gCAAA,MAAM,CAAC,KAAK,GAAG,iBAAiB;gCAChC;AACF,4BAAA,KAAK,0CAA0C;AAC7C,gCAAA,MAAM,CAAC,IAAI,GAAG,IAAI;AAClB,gCAAA,MAAM,CAAC,KAAK,GAAG,iBAAiB;gCAChC;AACF,4BAAA,KAAK,0CAA0C;AAC7C,gCAAA,MAAM,CAAC,IAAI,GAAG,GAAG;AACjB,gCAAA,MAAM,CAAC,KAAK,GAAG,gBAAgB;gCAC/B;AACF,4BAAA,KAAK,4DAA4D;AAC/D,gCAAA,MAAM,CAAC,KAAK,GAAG,6BAA6B;gCAC5C;AACF,4BAAA,KAAK,qEAAqE;AACxE,gCAAA,MAAM,CAAC,KAAK,GAAG,oCAAoC;gCACnD;AACF,4BAAA,KAAK,iBAAiB;AACpB,gCAAA,MAAM,CAAC,KAAK,GAAG,aAAa;gCAC5B;AACF,4BAAA,KAAK,eAAe;AAClB,gCAAA,MAAM,CAAC,KAAK,GAAG,aAAa;gCAC5B;AACF,4BAAA,KAAK,qBAAqB;AACxB,gCAAA,MAAM,CAAC,KAAK,GAAG,mBAAmB;gCAClC;AACF,4BAAA,KAAK,YAAY;AACf,gCAAA,MAAM,CAAC,KAAK,GAAG,MAAM;gCACrB;AACF,4BAAA,KAAK,cAAc;AACjB,gCAAA,MAAM,CAAC,KAAK,GAAG,MAAM;gCACrB;AACF,4BAAA,KAAK,wGAAwG;AAC3G,gCAAA,MAAM,CAAC,KAAK,GAAG,yCAAyC;gCACxD;;AAEN,oBAAA,CAAC,CAAC;AACF,oBAAA,OAAO,KAAK;gBACd,CAAC;AACF,aAAA;AACF,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;IAChC;8GA/OW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAvB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,kiBCzCpC,yWAMC,EAAA,MAAA,EAAA,CAAA,mcAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA,CAAA;;2FDmCY,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBATnC,SAAS;+BACE,kBAAkB,EAAA,mBAAA,EAEP,KAAK,EAAA,eAAA,EACT,uBAAuB,CAAC,MAAM,EAAA,aAAA,EAEhC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B,EAAE,EAAA,QAAA,EAAA,yWAAA,EAAA,MAAA,EAAA,CAAA,mcAAA,CAAA,EAAA;2GAGuD,qBAAqB,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,CAAA,EAAA,WAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,SAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AE1CzF;;AAEG;;;;"}
|