@tmagic/editor 1.3.0-alpha.9 → 1.3.0-beta.1

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.
Files changed (139) hide show
  1. package/dist/style.css +106 -219
  2. package/dist/tmagic-editor.js +6253 -5042
  3. package/dist/tmagic-editor.js.map +1 -1
  4. package/dist/tmagic-editor.umd.cjs +6280 -5055
  5. package/dist/tmagic-editor.umd.cjs.map +1 -1
  6. package/package.json +15 -15
  7. package/src/Editor.vue +4 -5
  8. package/src/components/CodeBlockEditor.vue +266 -0
  9. package/src/components/CodeParams.vue +60 -0
  10. package/src/components/ContentMenu.vue +97 -43
  11. package/src/components/Resizer.vue +8 -30
  12. package/src/components/SplitView.vue +3 -2
  13. package/src/editorProps.ts +30 -5
  14. package/src/fields/Code.vue +23 -19
  15. package/src/fields/CodeLink.vue +6 -7
  16. package/src/fields/CodeSelect.vue +12 -9
  17. package/src/fields/CodeSelectCol.vue +70 -81
  18. package/src/fields/DataSourceFieldSelect.vue +47 -0
  19. package/src/fields/DataSourceFields.vue +38 -22
  20. package/src/fields/DataSourceInput.vue +21 -58
  21. package/src/fields/DataSourceMethodSelect.vue +136 -0
  22. package/src/fields/DataSourceMethods.vue +104 -0
  23. package/src/fields/DataSourceSelect.vue +5 -12
  24. package/src/fields/EventSelect.vue +53 -19
  25. package/src/fields/KeyValue.vue +9 -11
  26. package/src/fields/UISelect.vue +54 -14
  27. package/src/hooks/index.ts +21 -0
  28. package/src/hooks/use-code-block-edit.ts +84 -0
  29. package/src/hooks/use-data-source-method.ts +100 -0
  30. package/src/hooks/use-getso.ts +35 -0
  31. package/src/{utils/stage.ts → hooks/use-stage.ts} +4 -7
  32. package/src/icons/CenterIcon.vue +13 -0
  33. package/src/icons/CodeIcon.vue +0 -2
  34. package/src/icons/FolderMinusIcon.vue +22 -0
  35. package/src/icons/PinIcon.vue +25 -0
  36. package/src/icons/PinnedIcon.vue +25 -0
  37. package/src/index.ts +14 -0
  38. package/src/initService.ts +69 -16
  39. package/src/layouts/CodeEditor.vue +35 -3
  40. package/src/layouts/Framework.vue +7 -3
  41. package/src/layouts/PropsPanel.vue +8 -3
  42. package/src/layouts/sidebar/ComponentListPanel.vue +4 -6
  43. package/src/layouts/sidebar/LayerMenu.vue +20 -21
  44. package/src/layouts/sidebar/LayerPanel.vue +12 -2
  45. package/src/layouts/sidebar/Sidebar.vue +22 -36
  46. package/src/layouts/sidebar/code-block/CodeBlockList.vue +81 -119
  47. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +64 -0
  48. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +27 -47
  49. package/src/layouts/sidebar/data-source/DataSourceList.vue +145 -0
  50. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +58 -85
  51. package/src/layouts/workspace/Workspace.vue +1 -1
  52. package/src/layouts/workspace/viewer/NodeListMenu.vue +159 -0
  53. package/src/layouts/workspace/viewer/NodeListMenuTitle.vue +68 -0
  54. package/src/layouts/workspace/{Stage.vue → viewer/Stage.vue} +5 -2
  55. package/src/layouts/workspace/{ViewerMenu.vue → viewer/ViewerMenu.vue} +10 -35
  56. package/src/services/codeBlock.ts +18 -71
  57. package/src/services/dataSource.ts +16 -1
  58. package/src/services/dep.ts +22 -20
  59. package/src/services/editor.ts +46 -18
  60. package/src/services/props.ts +2 -2
  61. package/src/theme/code-block.scss +5 -117
  62. package/src/theme/code-editor.scss +27 -2
  63. package/src/theme/content-menu.scss +26 -2
  64. package/src/theme/data-source-methods.scss +13 -0
  65. package/src/theme/data-source.scss +11 -0
  66. package/src/theme/event.scss +15 -12
  67. package/src/theme/framework.scss +0 -3
  68. package/src/theme/index.scss +8 -0
  69. package/src/theme/layout.scss +4 -0
  70. package/src/theme/sidebar.scss +18 -60
  71. package/src/theme/theme.scss +1 -0
  72. package/src/type.ts +49 -7
  73. package/src/utils/content-menu.ts +92 -0
  74. package/src/utils/data-source/formConfigs/base.ts +28 -30
  75. package/src/utils/data-source/formConfigs/http.ts +9 -0
  76. package/src/utils/data-source/index.ts +65 -2
  77. package/src/utils/dep.ts +33 -7
  78. package/src/utils/index.ts +1 -1
  79. package/src/utils/props.ts +308 -189
  80. package/src/utils/undo-redo.ts +1 -1
  81. package/types/Editor.vue.d.ts +30 -6
  82. package/types/components/CodeBlockEditor.vue.d.ts +25 -0
  83. package/types/components/CodeParams.vue.d.ts +26 -0
  84. package/types/components/ContentMenu.vue.d.ts +27 -8
  85. package/types/components/Resizer.vue.d.ts +1 -3
  86. package/types/components/ToolButton.vue.d.ts +3 -3
  87. package/types/editorProps.d.ts +19 -5
  88. package/types/fields/Code.vue.d.ts +24 -19
  89. package/types/fields/CodeLink.vue.d.ts +12 -21
  90. package/types/fields/CodeSelect.vue.d.ts +6 -17
  91. package/types/fields/CodeSelectCol.vue.d.ts +10 -14
  92. package/types/fields/DataSourceFieldSelect.vue.d.ts +29 -0
  93. package/types/fields/DataSourceFields.vue.d.ts +7 -18
  94. package/types/fields/DataSourceInput.vue.d.ts +10 -30
  95. package/types/fields/DataSourceMethodSelect.vue.d.ts +29 -0
  96. package/types/fields/DataSourceMethods.vue.d.ts +32 -0
  97. package/types/fields/DataSourceSelect.vue.d.ts +13 -29
  98. package/types/fields/EventSelect.vue.d.ts +2 -13
  99. package/types/fields/KeyValue.vue.d.ts +9 -24
  100. package/types/fields/UISelect.vue.d.ts +2 -11
  101. package/types/hooks/index.d.ts +3 -0
  102. package/types/{components/FunctionEditor.vue.d.ts → hooks/use-code-block-edit.d.ts} +36 -119
  103. package/types/hooks/use-data-source-method.d.ts +130 -0
  104. package/types/hooks/use-getso.d.ts +5 -0
  105. package/types/icons/CenterIcon.vue.d.ts +2 -0
  106. package/types/icons/FolderMinusIcon.vue.d.ts +2 -0
  107. package/types/icons/PinIcon.vue.d.ts +2 -0
  108. package/types/icons/PinnedIcon.vue.d.ts +2 -0
  109. package/types/index.d.ts +7 -0
  110. package/types/initService.d.ts +2 -2
  111. package/types/layouts/CodeEditor.vue.d.ts +7 -4
  112. package/types/layouts/PropsPanel.vue.d.ts +274 -2
  113. package/types/layouts/sidebar/Sidebar.vue.d.ts +0 -3
  114. package/types/layouts/sidebar/code-block/CodeBlockList.vue.d.ts +4 -9
  115. package/types/layouts/sidebar/code-block/{CodeBlockEditor.vue.d.ts → CodeBlockListPanel.vue.d.ts} +9 -5
  116. package/types/layouts/sidebar/data-source/DataSourceConfigPanel.vue.d.ts +3 -1
  117. package/types/layouts/sidebar/data-source/DataSourceList.vue.d.ts +14 -0
  118. package/types/layouts/sidebar/data-source/DataSourceListPanel.vue.d.ts +1 -11
  119. package/types/layouts/workspace/viewer/NodeListMenu.vue.d.ts +15 -0
  120. package/types/layouts/workspace/viewer/NodeListMenuTitle.vue.d.ts +15 -0
  121. package/types/layouts/workspace/{Stage.vue.d.ts → viewer/Stage.vue.d.ts} +1 -1
  122. package/types/layouts/workspace/{ViewerMenu.vue.d.ts → viewer/ViewerMenu.vue.d.ts} +1 -1
  123. package/types/services/codeBlock.d.ts +6 -37
  124. package/types/services/dataSource.d.ts +7 -1
  125. package/types/services/dep.d.ts +12 -21
  126. package/types/services/editor.d.ts +1 -1
  127. package/types/services/props.d.ts +10 -115
  128. package/types/type.d.ts +44 -7
  129. package/types/utils/content-menu.d.ts +7 -0
  130. package/types/utils/data-source/formConfigs/base.d.ts +1 -2
  131. package/types/utils/data-source/index.d.ts +5 -0
  132. package/types/utils/dep.d.ts +4 -2
  133. package/types/utils/index.d.ts +1 -1
  134. package/types/utils/props.d.ts +13 -102
  135. package/src/components/CodeDraftEditor.vue +0 -148
  136. package/src/components/FunctionEditor.vue +0 -197
  137. package/src/layouts/sidebar/code-block/CodeBlockEditor.vue +0 -100
  138. package/types/components/CodeDraftEditor.vue.d.ts +0 -61
  139. /package/types/{utils/stage.d.ts → hooks/use-stage.d.ts} +0 -0
@@ -1,197 +0,0 @@
1
- <template>
2
- <TMagicCard shadow="never">
3
- <template #header>
4
- <div class="code-name-wrapper">
5
- <div class="code-name-label">代码块名称</div>
6
- <TMagicInput class="code-name-input" v-model="codeName" :disabled="!editable" />
7
- </div>
8
- <div class="code-name-wrapper">
9
- <div class="code-name-label">参数</div>
10
- <m-form-table
11
- style="width: 800px"
12
- :config="tableConfig"
13
- :model="tableModel"
14
- :enableToggleMode="false"
15
- name="params"
16
- prop="params"
17
- size="small"
18
- >
19
- </m-form-table>
20
- </div>
21
- </template>
22
- <CodeDraftEditor
23
- ref="codeDraftEditor"
24
- :id="id"
25
- :content="codeContent"
26
- :editable="editable"
27
- :autoSaveDraft="autoSaveDraft"
28
- :codeOptions="codeOptions"
29
- language="javascript"
30
- @saveAndClose="saveAndClose"
31
- @close="close"
32
- ></CodeDraftEditor>
33
- </TMagicCard>
34
- </template>
35
- <script lang="ts" setup>
36
- import { inject, provide, ref, watchEffect } from 'vue';
37
- import { cloneDeep } from 'lodash-es';
38
-
39
- import { TMagicCard, TMagicInput, tMagicMessage } from '@tmagic/design';
40
- import { ColumnConfig, TableConfig } from '@tmagic/form';
41
- import { CodeParam, Id } from '@tmagic/schema';
42
-
43
- import type { Services } from '@editor/type';
44
- import { getConfig } from '@editor/utils/config';
45
-
46
- import CodeDraftEditor from './CodeDraftEditor.vue';
47
-
48
- defineOptions({
49
- name: 'MEditorFunctionEditor',
50
- });
51
-
52
- provide('mForm', null);
53
-
54
- const defaultParamColConfig: ColumnConfig = {
55
- type: 'row',
56
- label: '参数类型',
57
- items: [
58
- {
59
- text: '参数类型',
60
- labelWidth: '70px',
61
- type: 'select',
62
- name: 'type',
63
- options: [
64
- {
65
- text: '数字',
66
- label: '数字',
67
- value: 'number',
68
- },
69
- {
70
- text: '字符串',
71
- label: '字符串',
72
- value: 'text',
73
- },
74
- ],
75
- },
76
- ],
77
- };
78
-
79
- const props = withDefaults(
80
- defineProps<{
81
- /** 代码块id */
82
- id: Id;
83
- /** 代码块名称 */
84
- name: string;
85
- /** 代码内容 */
86
- content: string;
87
- /** 是否可编辑 */
88
- editable?: boolean;
89
- /** 是否自动保存草稿 */
90
- autoSaveDraft?: boolean;
91
- /** 编辑器扩展参数 */
92
- codeOptions?: object;
93
- /** 代码参数扩展配置 */
94
- paramsColConfig?: ColumnConfig;
95
- }>(),
96
- {
97
- editable: true,
98
- autoSaveDraft: true,
99
- },
100
- );
101
-
102
- const paramsColConfig = props.paramsColConfig || defaultParamColConfig;
103
-
104
- const tableConfig: TableConfig = {
105
- type: 'table',
106
- border: true,
107
- enableFullscreen: false,
108
- name: 'params',
109
- maxHeight: '300px',
110
- dropSort: false,
111
- items: [
112
- {
113
- type: 'text',
114
- label: '参数名',
115
- name: 'name',
116
- width: 200,
117
- },
118
- {
119
- type: 'text',
120
- label: '参数注释',
121
- name: 'tip',
122
- width: 200,
123
- },
124
- paramsColConfig,
125
- ],
126
- };
127
-
128
- const services = inject<Services>('services');
129
-
130
- const codeName = ref<string>('');
131
- const codeContent = ref<string>('');
132
- const evalRes = ref(true);
133
-
134
- const tableModel = ref<{ params: CodeParam[] }>();
135
- watchEffect(() => {
136
- codeName.value = props.name;
137
- codeContent.value = props.content;
138
- });
139
-
140
- const initTableModel = (): void => {
141
- const codeDsl = cloneDeep(services?.codeBlockService.getCodeDsl());
142
- if (!codeDsl) return;
143
- tableModel.value = {
144
- params: codeDsl[props.id]?.params || [],
145
- };
146
- };
147
-
148
- initTableModel();
149
-
150
- // 保存前钩子
151
- const beforeSave = (codeValue: string): boolean => {
152
- try {
153
- // 检测js代码是否存在语法错误
154
- getConfig('parseDSL')(codeValue);
155
- return true;
156
- } catch (e: any) {
157
- tMagicMessage.error(e.stack);
158
- return false;
159
- }
160
- };
161
-
162
- // 保存代码
163
- const saveCode = async (codeValue: string): Promise<void> => {
164
- if (!props.editable) return;
165
- evalRes.value = beforeSave(codeValue);
166
- if (evalRes.value) {
167
- // 存入dsl
168
- await services?.codeBlockService.setCodeDslById(props.id, {
169
- name: codeName.value,
170
- content: codeValue,
171
- params: tableModel.value?.params || [],
172
- });
173
- tMagicMessage.success('代码成功保存到本地');
174
- // 删除草稿
175
- services?.codeBlockService.removeCodeDraft(props.id);
176
- }
177
- };
178
-
179
- // 保存并关闭
180
- const saveAndClose = async (codeValue: string): Promise<void> => {
181
- await saveCode(codeValue);
182
- if (evalRes.value) {
183
- close();
184
- }
185
- };
186
-
187
- // 关闭弹窗
188
- const close = (): void => {
189
- services?.codeBlockService.setCodeEditorShowStatus(false);
190
- };
191
-
192
- const codeDraftEditor = ref<InstanceType<typeof CodeDraftEditor>>();
193
-
194
- defineExpose({
195
- codeDraftEditor,
196
- });
197
- </script>
@@ -1,100 +0,0 @@
1
- <template>
2
- <TMagicDrawer
3
- class="code-editor-dialog"
4
- :model-value="true"
5
- :title="currentTitle"
6
- :close-on-press-escape="true"
7
- :append-to-body="true"
8
- :show-close="false"
9
- :close-on-click-modal="true"
10
- :size="size"
11
- :before-close="handleClose"
12
- >
13
- <SplitView v-model:left="left" :min-left="45" class="code-editor-layout">
14
- <!-- 右侧区域 -->
15
- <template #center>
16
- <div v-if="!isEmpty(codeConfig)" class="m-editor-code-block-editor-panel">
17
- <slot name="code-block-edit-panel-header" :id="id"></slot>
18
- <FunctionEditor
19
- ref="functionEditor"
20
- v-if="codeConfig"
21
- :id="id"
22
- :name="codeConfig.name"
23
- :content="codeConfig.content"
24
- :paramsColConfig="paramsColConfig"
25
- :editable="!!editable"
26
- :autoSaveDraft="true"
27
- :codeOptions="codeOptions"
28
- ></FunctionEditor>
29
- </div>
30
- </template>
31
- </SplitView>
32
- </TMagicDrawer>
33
- </template>
34
-
35
- <script lang="ts" setup>
36
- import { computed, inject, reactive, ref, watchEffect } from 'vue';
37
- import { cloneDeep, forIn, isEmpty } from 'lodash-es';
38
-
39
- import { TMagicDrawer } from '@tmagic/design';
40
- import { ColumnConfig } from '@tmagic/form';
41
- import { CodeBlockContent } from '@tmagic/schema';
42
-
43
- import FunctionEditor from '@editor/components/FunctionEditor.vue';
44
- import SplitView from '@editor/components/SplitView.vue';
45
- import type { ListState, Services } from '@editor/type';
46
- import { serializeConfig } from '@editor/utils/editor';
47
-
48
- defineOptions({
49
- name: 'MEditorCodeBlockEditor',
50
- });
51
-
52
- const services = inject<Services>('services');
53
- const codeOptions = inject('codeOptions', {});
54
-
55
- defineProps<{
56
- paramsColConfig?: ColumnConfig;
57
- }>();
58
-
59
- const size = computed(() => globalThis.document.body.clientWidth - (services?.uiService.get('columnWidth').left || 0));
60
-
61
- const left = ref(200);
62
- const currentTitle = ref('');
63
- // 编辑器当前需展示的代码块内容
64
- const codeConfig = ref<CodeBlockContent | null>(null);
65
- // select选择的内容(ListState)
66
- const state = reactive<ListState>({
67
- codeList: [],
68
- });
69
-
70
- const id = computed(() => services?.codeBlockService.getId() || '');
71
- const editable = computed(() => services?.codeBlockService.getEditStatus());
72
- // 当前选中组件绑定的代码块id数组
73
- const selectedIds = computed(() => services?.codeBlockService.getCombineIds() || []);
74
-
75
- watchEffect(async () => {
76
- codeConfig.value = cloneDeep(await services?.codeBlockService.getCodeContentById(id.value)) || null;
77
- if (!codeConfig.value) return;
78
- codeConfig.value.content = serializeConfig(codeConfig.value.content);
79
- });
80
-
81
- watchEffect(async () => {
82
- const codeDsl = (await services?.codeBlockService.getCodeDslByIds(selectedIds.value)) || null;
83
- if (!codeDsl) return;
84
- state.codeList = [];
85
- forIn(codeDsl, (value: CodeBlockContent, key: string) => {
86
- state.codeList.push({
87
- id: key,
88
- name: value.name,
89
- });
90
- });
91
- currentTitle.value = state.codeList[0]?.name || '';
92
- });
93
-
94
- const functionEditor = ref<InstanceType<typeof FunctionEditor>>();
95
-
96
- const handleClose = async () => {
97
- // 触发codeDraftEditor组件关闭事件
98
- await functionEditor.value?.codeDraftEditor?.close();
99
- };
100
- </script>
@@ -1,61 +0,0 @@
1
- import { Id } from '@tmagic/schema';
2
- declare const _default: import("vue").DefineComponent<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
3
- /** 代码id */
4
- id: Id;
5
- /** 代码内容 */
6
- content: string;
7
- /** 是否可编辑 */
8
- editable?: boolean | undefined;
9
- /** 是否自动保存草稿 */
10
- autoSaveDraft?: boolean | undefined;
11
- /** 编辑器参数 */
12
- codeOptions?: Object | undefined;
13
- /** 编辑器语言 */
14
- language?: string | undefined;
15
- }>, {
16
- editable: boolean;
17
- autoSaveDraft: boolean;
18
- }>, {
19
- saveAndClose: () => void;
20
- close: () => Promise<void>;
21
- }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, ("close" | "saveAndClose")[], "close" | "saveAndClose", import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<__VLS_WithDefaults<__VLS_TypePropsToRuntimeProps<{
22
- /** 代码id */
23
- id: Id;
24
- /** 代码内容 */
25
- content: string;
26
- /** 是否可编辑 */
27
- editable?: boolean | undefined;
28
- /** 是否自动保存草稿 */
29
- autoSaveDraft?: boolean | undefined;
30
- /** 编辑器参数 */
31
- codeOptions?: Object | undefined;
32
- /** 编辑器语言 */
33
- language?: string | undefined;
34
- }>, {
35
- editable: boolean;
36
- autoSaveDraft: boolean;
37
- }>>> & {
38
- onClose?: ((...args: any[]) => any) | undefined;
39
- onSaveAndClose?: ((...args: any[]) => any) | undefined;
40
- }, {
41
- editable: boolean;
42
- autoSaveDraft: boolean;
43
- }, {}>;
44
- export default _default;
45
- type __VLS_NonUndefinedable<T> = T extends undefined ? never : T;
46
- type __VLS_TypePropsToRuntimeProps<T> = {
47
- [K in keyof T]-?: {} extends Pick<T, K> ? {
48
- type: import('vue').PropType<__VLS_NonUndefinedable<T[K]>>;
49
- } : {
50
- type: import('vue').PropType<T[K]>;
51
- required: true;
52
- };
53
- };
54
- type __VLS_WithDefaults<P, D> = {
55
- [K in keyof Pick<P, keyof P>]: K extends keyof D ? __VLS_Prettify<P[K] & {
56
- default: D[K];
57
- }> : P[K];
58
- };
59
- type __VLS_Prettify<T> = {
60
- [K in keyof T]: T[K];
61
- } & {};