@tmagic/editor 1.3.0-alpha.2 → 1.3.0-alpha.21

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 (167) hide show
  1. package/dist/style.css +91 -120
  2. package/dist/tmagic-editor.js +4609 -3257
  3. package/dist/tmagic-editor.js.map +1 -1
  4. package/dist/tmagic-editor.umd.cjs +5708 -4337
  5. package/dist/tmagic-editor.umd.cjs.map +1 -1
  6. package/package.json +21 -22
  7. package/src/Editor.vue +29 -7
  8. package/src/components/CodeBlockEditor.vue +170 -0
  9. package/src/components/CodeParams.vue +60 -0
  10. package/src/components/ContentMenu.vue +30 -11
  11. package/src/components/Icon.vue +5 -1
  12. package/src/components/Resizer.vue +45 -0
  13. package/src/components/ScrollBar.vue +5 -1
  14. package/src/components/ScrollViewer.vue +5 -1
  15. package/src/components/SearchInput.vue +4 -0
  16. package/src/components/{Layout.vue → SplitView.vue} +8 -4
  17. package/src/components/ToolButton.vue +5 -1
  18. package/src/editorProps.ts +35 -4
  19. package/src/fields/Code.vue +28 -20
  20. package/src/fields/CodeLink.vue +15 -10
  21. package/src/fields/CodeSelect.vue +19 -10
  22. package/src/fields/CodeSelectCol.vue +67 -83
  23. package/src/fields/DataSourceFieldSelect.vue +47 -0
  24. package/src/fields/DataSourceFields.vue +24 -21
  25. package/src/fields/DataSourceInput.vue +318 -0
  26. package/src/fields/DataSourceMethodSelect.vue +136 -0
  27. package/src/fields/DataSourceMethods.vue +103 -0
  28. package/src/fields/DataSourceSelect.vue +68 -0
  29. package/src/fields/EventSelect.vue +62 -22
  30. package/src/fields/KeyValue.vue +13 -11
  31. package/src/fields/UISelect.vue +59 -15
  32. package/src/hooks/index.ts +21 -0
  33. package/src/hooks/use-code-block-edit.ts +84 -0
  34. package/src/hooks/use-data-source-method.ts +100 -0
  35. package/src/{utils/stage.ts → hooks/use-stage.ts} +4 -7
  36. package/src/icons/AppManageIcon.vue +5 -1
  37. package/src/icons/CenterIcon.vue +13 -0
  38. package/src/icons/CodeIcon.vue +5 -3
  39. package/src/index.ts +24 -3
  40. package/src/initService.ts +75 -16
  41. package/src/layouts/AddPageBox.vue +5 -1
  42. package/src/layouts/CodeEditor.vue +66 -11
  43. package/src/layouts/Framework.vue +32 -28
  44. package/src/layouts/NavMenu.vue +5 -1
  45. package/src/layouts/PropsPanel.vue +14 -4
  46. package/src/layouts/sidebar/ComponentListPanel.vue +11 -10
  47. package/src/layouts/sidebar/LayerMenu.vue +13 -25
  48. package/src/layouts/sidebar/LayerNode.vue +40 -0
  49. package/src/layouts/sidebar/LayerPanel.vue +71 -28
  50. package/src/layouts/sidebar/Sidebar.vue +13 -17
  51. package/src/layouts/sidebar/code-block/CodeBlockList.vue +84 -118
  52. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +63 -0
  53. package/src/layouts/sidebar/data-source/DataSourceConfigPanel.vue +39 -34
  54. package/src/layouts/sidebar/data-source/DataSourceList.vue +145 -0
  55. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +17 -65
  56. package/src/layouts/workspace/Breadcrumb.vue +5 -1
  57. package/src/layouts/workspace/PageBar.vue +5 -1
  58. package/src/layouts/workspace/PageBarScrollContainer.vue +5 -1
  59. package/src/layouts/workspace/Stage.vue +30 -8
  60. package/src/layouts/workspace/ViewerMenu.vue +15 -36
  61. package/src/layouts/workspace/Workspace.vue +9 -134
  62. package/src/services/codeBlock.ts +20 -72
  63. package/src/services/dataSource.ts +17 -2
  64. package/src/services/dep.ts +23 -20
  65. package/src/services/editor.ts +3 -3
  66. package/src/services/keybinding.ts +185 -0
  67. package/src/services/props.ts +2 -2
  68. package/src/services/storage.ts +3 -2
  69. package/src/theme/code-block.scss +5 -117
  70. package/src/theme/code-editor.scss +27 -2
  71. package/src/theme/content-menu.scss +1 -1
  72. package/src/theme/data-source-input.scss +18 -0
  73. package/src/theme/data-source-methods.scss +13 -0
  74. package/src/theme/event.scss +15 -12
  75. package/src/theme/framework.scss +0 -3
  76. package/src/theme/layer-panel.scss +6 -0
  77. package/src/theme/layout.scss +4 -0
  78. package/src/theme/resizer.scss +25 -10
  79. package/src/theme/stage.scss +4 -0
  80. package/src/theme/theme.scss +2 -0
  81. package/src/type.ts +105 -7
  82. package/src/utils/config.ts +1 -1
  83. package/src/utils/content-menu.ts +92 -0
  84. package/src/utils/data-source/formConfigs/base.ts +35 -30
  85. package/src/utils/data-source/index.ts +75 -6
  86. package/src/utils/dep.ts +39 -7
  87. package/src/utils/index.ts +1 -1
  88. package/src/utils/keybinding-config.ts +120 -0
  89. package/src/utils/props.ts +298 -155
  90. package/src/utils/undo-redo.ts +1 -1
  91. package/types/Editor.vue.d.ts +37 -4
  92. package/types/components/CodeBlockEditor.vue.d.ts +23 -0
  93. package/types/components/CodeParams.vue.d.ts +26 -0
  94. package/types/components/ContentMenu.vue.d.ts +8 -3
  95. package/types/components/Icon.vue.d.ts +2 -2
  96. package/types/{layouts → components}/Resizer.vue.d.ts +2 -2
  97. package/types/components/ScrollBar.vue.d.ts +1 -1
  98. package/types/components/ScrollViewer.vue.d.ts +8 -5
  99. package/types/components/SearchInput.vue.d.ts +1 -1
  100. package/types/components/{Layout.vue.d.ts → SplitView.vue.d.ts} +9 -6
  101. package/types/components/ToolButton.vue.d.ts +10 -7
  102. package/types/editorProps.d.ts +23 -4
  103. package/types/fields/Code.vue.d.ts +23 -18
  104. package/types/fields/CodeLink.vue.d.ts +13 -22
  105. package/types/fields/CodeSelect.vue.d.ts +12 -20
  106. package/types/fields/CodeSelectCol.vue.d.ts +14 -15
  107. package/types/fields/DataSourceFieldSelect.vue.d.ts +29 -0
  108. package/types/fields/DataSourceFields.vue.d.ts +13 -21
  109. package/types/fields/DataSourceInput.vue.d.ts +34 -0
  110. package/types/fields/DataSourceMethodSelect.vue.d.ts +29 -0
  111. package/types/fields/DataSourceMethods.vue.d.ts +32 -0
  112. package/types/fields/DataSourceSelect.vue.d.ts +40 -0
  113. package/types/fields/EventSelect.vue.d.ts +3 -14
  114. package/types/fields/KeyValue.vue.d.ts +15 -27
  115. package/types/fields/UISelect.vue.d.ts +3 -12
  116. package/types/hooks/index.d.ts +3 -0
  117. package/types/hooks/use-code-block-edit.d.ts +125 -0
  118. package/types/hooks/use-data-source-method.d.ts +123 -0
  119. package/types/icons/AppManageIcon.vue.d.ts +1 -1
  120. package/types/icons/CenterIcon.vue.d.ts +2 -0
  121. package/types/icons/CodeIcon.vue.d.ts +1 -1
  122. package/types/index.d.ts +12 -2
  123. package/types/initService.d.ts +2 -2
  124. package/types/layouts/AddPageBox.vue.d.ts +1 -1
  125. package/types/layouts/CodeEditor.vue.d.ts +18 -10
  126. package/types/layouts/Framework.vue.d.ts +11 -32
  127. package/types/layouts/NavMenu.vue.d.ts +7 -4
  128. package/types/layouts/PropsPanel.vue.d.ts +276 -4
  129. package/types/layouts/sidebar/ComponentListPanel.vue.d.ts +4 -4
  130. package/types/layouts/sidebar/LayerMenu.vue.d.ts +2 -2
  131. package/types/layouts/sidebar/LayerNode.vue.d.ts +16 -0
  132. package/types/layouts/sidebar/LayerPanel.vue.d.ts +5 -5
  133. package/types/layouts/sidebar/Sidebar.vue.d.ts +16 -16
  134. package/types/layouts/sidebar/code-block/CodeBlockList.vue.d.ts +7 -12
  135. package/types/layouts/sidebar/code-block/CodeBlockListPanel.vue.d.ts +28 -0
  136. package/types/layouts/sidebar/data-source/DataSourceConfigPanel.vue.d.ts +4 -2
  137. package/types/layouts/sidebar/data-source/DataSourceList.vue.d.ts +14 -0
  138. package/types/layouts/sidebar/data-source/DataSourceListPanel.vue.d.ts +1 -11
  139. package/types/layouts/workspace/Breadcrumb.vue.d.ts +1 -1
  140. package/types/layouts/workspace/PageBar.vue.d.ts +5 -5
  141. package/types/layouts/workspace/PageBarScrollContainer.vue.d.ts +2 -2
  142. package/types/layouts/workspace/Stage.vue.d.ts +2 -2
  143. package/types/layouts/workspace/ViewerMenu.vue.d.ts +7 -4
  144. package/types/layouts/workspace/Workspace.vue.d.ts +9 -9
  145. package/types/services/codeBlock.d.ts +6 -37
  146. package/types/services/dataSource.d.ts +7 -1
  147. package/types/services/dep.d.ts +12 -21
  148. package/types/services/editor.d.ts +1 -1
  149. package/types/services/keybinding.d.ts +20 -0
  150. package/types/services/props.d.ts +10 -115
  151. package/types/type.d.ts +97 -7
  152. package/types/utils/config.d.ts +1 -1
  153. package/types/utils/content-menu.d.ts +7 -0
  154. package/types/utils/data-source/formConfigs/base.d.ts +2 -2
  155. package/types/utils/data-source/index.d.ts +7 -1
  156. package/types/utils/dep.d.ts +4 -2
  157. package/types/utils/index.d.ts +1 -1
  158. package/types/utils/keybinding-config.d.ts +3 -0
  159. package/types/utils/props.d.ts +13 -102
  160. package/src/components/CodeDraftEditor.vue +0 -144
  161. package/src/components/FunctionEditor.vue +0 -190
  162. package/src/layouts/Resizer.vue +0 -32
  163. package/src/layouts/sidebar/code-block/CodeBlockEditor.vue +0 -96
  164. package/types/components/CodeDraftEditor.vue.d.ts +0 -58
  165. package/types/components/FunctionEditor.vue.d.ts +0 -192
  166. package/types/layouts/sidebar/code-block/CodeBlockEditor.vue.d.ts +0 -25
  167. /package/types/{utils/stage.d.ts → hooks/use-stage.d.ts} +0 -0
@@ -1,8 +1,8 @@
1
1
  import type { PropType } from 'vue';
2
2
 
3
3
  import type { EventOption } from '@tmagic/core';
4
- import type { FormConfig } from '@tmagic/form';
5
- import type { MApp, MNode } from '@tmagic/schema';
4
+ import type { FormConfig, FormState } from '@tmagic/form';
5
+ import type { DataSourceSchema, MApp, MNode } from '@tmagic/schema';
6
6
  import StageCore, {
7
7
  CONTAINER_HIGHLIGHT_CLASS_NAME,
8
8
  ContainerHighlightType,
@@ -11,7 +11,15 @@ import StageCore, {
11
11
  UpdateDragEl,
12
12
  } from '@tmagic/stage';
13
13
 
14
- import type { ComponentGroup, MenuBarData, MenuButton, MenuComponent, SideBarData, StageRect } from './type';
14
+ import type {
15
+ ComponentGroup,
16
+ DatasourceTypeOption,
17
+ MenuBarData,
18
+ MenuButton,
19
+ MenuComponent,
20
+ SideBarData,
21
+ StageRect,
22
+ } from './type';
15
23
 
16
24
  export default {
17
25
  /** 页面初始值 */
@@ -27,6 +35,12 @@ export default {
27
35
  default: () => [],
28
36
  },
29
37
 
38
+ /** 左侧面板中的组件列表 */
39
+ datasourceList: {
40
+ type: Array as PropType<DatasourceTypeOption[]>,
41
+ default: () => [],
42
+ },
43
+
30
44
  /** 左侧面板配置 */
31
45
  sidebar: {
32
46
  type: Object as PropType<SideBarData>,
@@ -69,7 +83,7 @@ export default {
69
83
 
70
84
  /** 添加组件时的默认值 */
71
85
  propsValues: {
72
- type: Object as PropType<Record<string, MNode>>,
86
+ type: Object as PropType<Record<string, Partial<MNode>>>,
73
87
  default: () => ({}),
74
88
  },
75
89
 
@@ -79,6 +93,19 @@ export default {
79
93
  default: () => ({}),
80
94
  },
81
95
 
96
+ /** 组件的属性配置表单的dsl */
97
+ datasourceConfigs: {
98
+ type: Object as PropType<Record<string, FormConfig>>,
99
+ default: () => ({}),
100
+ },
101
+
102
+ /** 添加数据源时的默认值 */
103
+ datasourceValues: {
104
+ type: Object as PropType<Record<string, Partial<DataSourceSchema>>>,
105
+ default: () => ({}),
106
+ },
107
+
108
+ /** 数据源的属性配置表单的dsl */
82
109
  dataScourceConfigs: {
83
110
  type: Object as PropType<Record<string, FormConfig>>,
84
111
  default: () => ({}),
@@ -137,4 +164,8 @@ export default {
137
164
  disabledDragStart: {
138
165
  type: Boolean,
139
166
  },
167
+
168
+ extendFormState: {
169
+ type: Function as PropType<(state: FormState) => Record<string, any> | Promise<Record<string, any>>>,
170
+ },
140
171
  };
@@ -1,31 +1,39 @@
1
1
  <template>
2
- <magic-code-editor
3
- :style="`height: ${height}`"
2
+ <MagicCodeEditor
3
+ :height="config.height"
4
4
  :init-values="model[name]"
5
- :language="language"
6
- :options="config.options"
5
+ :language="config.language"
6
+ :options="{
7
+ ...config.options,
8
+ readOnly: disabled,
9
+ }"
7
10
  @save="save"
8
- ></magic-code-editor>
11
+ ></MagicCodeEditor>
9
12
  </template>
10
13
 
11
- <script lang="ts" setup name="MEditorCode">
12
- import { computed } from 'vue';
14
+ <script lang="ts" setup>
15
+ import type { FieldProps } from '@tmagic/form';
13
16
 
14
- const emit = defineEmits(['change']);
17
+ import MagicCodeEditor from '@editor/layouts/CodeEditor.vue';
18
+
19
+ defineOptions({
20
+ name: 'MEditorCode',
21
+ });
15
22
 
16
- const props = defineProps<{
17
- model: any;
18
- name: string;
19
- config: {
20
- language?: string;
21
- options?: Object;
22
- height?: string;
23
- };
24
- prop: string;
25
- }>();
23
+ const emit = defineEmits(['change']);
26
24
 
27
- const language = computed(() => props.config.language || 'javascript');
28
- const height = computed(() => props.config.height || `${document.body.clientHeight - 168}px`);
25
+ const props = withDefaults(
26
+ defineProps<
27
+ FieldProps<{
28
+ language?: string;
29
+ options?: Object;
30
+ height?: string;
31
+ }>
32
+ >(),
33
+ {
34
+ disabled: false,
35
+ },
36
+ );
29
37
 
30
38
  const save = (v: string) => {
31
39
  props.model[props.name] = v;
@@ -2,22 +2,27 @@
2
2
  <m-fields-link :config="formConfig" :model="modelValue" name="form" @change="changeHandler"></m-fields-link>
3
3
  </template>
4
4
 
5
- <script lang="ts" setup name="MEditorCodeLink">
5
+ <script lang="ts" setup>
6
6
  import { computed, reactive, watch } from 'vue';
7
7
  import serialize from 'serialize-javascript';
8
8
 
9
- const props = defineProps<{
10
- config: {
9
+ import type { FieldProps } from '@tmagic/form';
10
+
11
+ import { getConfig } from '@editor/utils/config';
12
+
13
+ defineOptions({
14
+ name: 'MEditorCodeLink',
15
+ });
16
+
17
+ const props = defineProps<
18
+ FieldProps<{
11
19
  type: 'code-link';
12
20
  name: string;
13
21
  text?: string;
14
22
  formTitle?: string;
15
23
  codeOptions?: Object;
16
- };
17
- model: any;
18
- name: string;
19
- prop: string;
20
- }>();
24
+ }>
25
+ >();
21
26
 
22
27
  const emit = defineEmits(['change']);
23
28
 
@@ -65,8 +70,8 @@ const changeHandler = (v: Record<string, any>) => {
65
70
  if (!props.name || !props.model) return;
66
71
 
67
72
  try {
68
- // eslint-disable-next-line no-eval
69
- props.model[props.name] = eval(`(${v[props.name]})`);
73
+ const parseDSL = getConfig('parseDSL');
74
+ props.model[props.name] = parseDSL(`(${v[props.name]})`);
70
75
  emit('change', props.model[props.name]);
71
76
  } catch (e) {
72
77
  console.error(e);
@@ -6,25 +6,30 @@
6
6
  </div>
7
7
  </template>
8
8
 
9
- <script lang="ts" setup name="MEditorCodeSelect">
10
- import { computed, defineEmits, defineProps, watch } from 'vue';
9
+ <script lang="ts" setup>
10
+ import { computed, inject, watch } from 'vue';
11
11
  import { isEmpty } from 'lodash-es';
12
12
 
13
13
  import { TMagicCard } from '@tmagic/design';
14
+ import type { FieldProps } from '@tmagic/form';
14
15
  import { HookType } from '@tmagic/schema';
15
16
 
17
+ import type { Services } from '@editor/type';
18
+
19
+ defineOptions({
20
+ name: 'MEditorCodeSelect',
21
+ });
22
+
16
23
  const emit = defineEmits(['change']);
17
24
 
25
+ const services = inject<Services>('services');
26
+
18
27
  const props = withDefaults(
19
- defineProps<{
20
- config: {
28
+ defineProps<
29
+ FieldProps<{
21
30
  className?: string;
22
- };
23
- model: any;
24
- prop: string;
25
- name: string;
26
- size: 'small' | 'default' | 'large';
27
- }>(),
31
+ }>
32
+ >(),
28
33
  {},
29
34
  );
30
35
 
@@ -32,10 +37,14 @@ const codeConfig = computed(() => ({
32
37
  type: 'group-list',
33
38
  name: 'hookData',
34
39
  enableToggleMode: false,
40
+ expandAll: true,
41
+ titleKey: 'codeId',
35
42
  items: [
36
43
  {
37
44
  type: 'code-select-col',
45
+ name: 'codeId',
38
46
  labelWidth: 0,
47
+ disabled: () => !services?.codeBlockService.getEditStatus(),
39
48
  },
40
49
  ],
41
50
  }));
@@ -9,53 +9,80 @@
9
9
  @change="onParamsChangeHandler"
10
10
  ></m-form-container>
11
11
  <!-- 查看/编辑按钮 -->
12
- <Icon class="icon" :icon="editable ? Edit : View" @click="editCode"></Icon>
12
+ <Icon v-if="model[name]" class="icon" :icon="!disabled ? Edit : View" @click="editCode(model[name])"></Icon>
13
13
  </div>
14
+
14
15
  <!-- 参数填写框 -->
15
- <m-form-container :config="codeParamsConfig" :model="model" @change="onParamsChangeHandler"></m-form-container>
16
+ <CodeParams
17
+ v-if="paramsConfig.length"
18
+ name="params"
19
+ :model="model"
20
+ :size="size"
21
+ :params-config="paramsConfig"
22
+ @change="onParamsChangeHandler"
23
+ ></CodeParams>
24
+
25
+ <CodeBlockEditor
26
+ ref="codeBlockEditor"
27
+ v-if="codeConfig"
28
+ :disabled="disabled"
29
+ :content="codeConfig"
30
+ @submit="submitCodeBlockHandler"
31
+ ></CodeBlockEditor>
16
32
  </div>
17
33
  </template>
18
34
 
19
- <script lang="ts" setup name="MEditorCodeSelectCol">
20
- import { computed, defineEmits, defineProps, inject, ref, watch } from 'vue';
35
+ <script lang="ts" setup name="">
36
+ import { computed, inject, ref } from 'vue';
21
37
  import { Edit, View } from '@element-plus/icons-vue';
22
38
  import { isEmpty, map } from 'lodash-es';
23
39
 
24
- import { createValues, FieldsetConfig, FormState } from '@tmagic/form';
25
- import { Id } from '@tmagic/schema';
40
+ import { createValues, FieldProps } from '@tmagic/form';
41
+ import type { Id } from '@tmagic/schema';
26
42
 
43
+ import CodeBlockEditor from '@editor/components/CodeBlockEditor.vue';
44
+ import CodeParams from '@editor/components/CodeParams.vue';
27
45
  import Icon from '@editor/components/Icon.vue';
28
- import type { CodeParamStatement, Services } from '@editor/type';
46
+ import { useCodeBlockEdit } from '@editor/hooks/use-code-block-edit';
47
+ import type { CodeParamStatement, CodeSelectColConfig, Services } from '@editor/type';
48
+
49
+ defineOptions({
50
+ name: 'MEditorCodeSelectCol',
51
+ });
29
52
 
30
53
  const services = inject<Services>('services');
31
- const mForm = inject<FormState>('mForm');
32
54
  const emit = defineEmits(['change']);
33
55
 
34
- const props = withDefaults(
35
- defineProps<{
36
- config: any;
37
- model: any;
38
- prop: string;
39
- name: string;
40
- size: 'small' | 'default' | 'large';
41
- }>(),
42
- {},
43
- );
44
- const codeDsl = computed(() => services?.codeBlockService.getCodeDsl());
45
- const editable = computed(() => services?.codeBlockService.getEditStatus());
46
- const codeParamsConfig = ref<FieldsetConfig>({
47
- type: 'fieldset',
48
- items: [],
49
- legend: '参数',
50
- labelWidth: '70px',
51
- name: 'params',
52
- display: false,
56
+ const props = withDefaults(defineProps<FieldProps<CodeSelectColConfig>>(), {
57
+ disabled: false,
53
58
  });
59
+
60
+ /**
61
+ * 根据代码块id获取代码块参数配置
62
+ * @param codeId 代码块ID
63
+ */
64
+ const getParamItemsConfig = (codeId?: Id): CodeParamStatement[] => {
65
+ if (!codeDsl.value || !codeId) return [];
66
+
67
+ const paramStatements = codeDsl.value[codeId]?.params;
68
+
69
+ if (isEmpty(paramStatements)) return [];
70
+
71
+ return paramStatements.map((paramState: CodeParamStatement) => ({
72
+ labelWidth: '100px',
73
+ text: paramState.name,
74
+ ...paramState,
75
+ }));
76
+ };
77
+
78
+ const codeDsl = computed(() => services?.codeBlockService.getCodeDsl());
79
+ const paramsConfig = ref<CodeParamStatement[]>(getParamItemsConfig(props.model[props.name]));
80
+
54
81
  const selectConfig = {
55
82
  type: 'select',
56
83
  text: '代码块',
57
- name: 'codeId',
58
- labelWidth: '70px',
84
+ name: props.name,
85
+ labelWidth: '80px',
59
86
  options: () => {
60
87
  if (codeDsl.value) {
61
88
  return map(codeDsl.value, (value, key) => ({
@@ -68,68 +95,25 @@ const selectConfig = {
68
95
  },
69
96
  onChange: (formState: any, codeId: Id, { model }: any) => {
70
97
  // 通过下拉框选择的codeId变化后修正model的值,避免写入其他codeId的params
71
- model.params = {};
72
- },
73
- };
98
+ paramsConfig.value = getParamItemsConfig(codeId);
74
99
 
75
- /**
76
- * 根据代码块id获取代码块参数配置
77
- * @param codeId 代码块ID
78
- */
79
- const getParamItemsConfig = (codeId: Id): CodeParamStatement[] => {
80
- if (!codeDsl.value) return [];
81
- const paramStatements = codeDsl.value[codeId]?.params;
82
- if (isEmpty(paramStatements)) return [];
83
- return paramStatements.map((paramState: CodeParamStatement) => ({
84
- labelWidth: '100px',
85
- text: paramState.name,
86
- ...paramState,
87
- }));
88
- };
100
+ if (paramsConfig.value.length) {
101
+ model.params = createValues(formState, paramsConfig.value, {}, model.params);
102
+ } else {
103
+ model.params = {};
104
+ }
89
105
 
90
- /**
91
- * 根据代码块id获取参数fieldset表单配置
92
- * @param codeId 代码块ID
93
- */
94
- const getCodeParamsConfig = (codeId: Id) => {
95
- const paramsConfig = getParamItemsConfig(codeId);
96
- // 如果参数没有填值,则使用createValues补全空值
97
- if (!props.model.params || isEmpty(props.model.params)) {
98
- props.model.params = {};
99
- createValues(mForm, paramsConfig, {}, props.model.params);
100
- }
101
- codeParamsConfig.value = {
102
- type: 'fieldset',
103
- items: paramsConfig,
104
- legend: '参数',
105
- labelWidth: '70px',
106
- name: 'params',
107
- display: !isEmpty(paramsConfig),
108
- };
106
+ return codeId;
107
+ },
109
108
  };
110
109
 
111
110
  /**
112
111
  * 参数值修改更新
113
112
  */
114
- const onParamsChangeHandler = () => {
113
+ const onParamsChangeHandler = (value: any) => {
114
+ props.model.params = value.params;
115
115
  emit('change', props.model);
116
116
  };
117
117
 
118
- // 监听代码块顺序变化以及下拉选择的变化,并更新参数配置
119
- // TODO onchange在watch之前触发
120
- watch(
121
- () => props.model.codeId,
122
- (codeId: Id) => {
123
- if (!codeId) return;
124
- getCodeParamsConfig(codeId);
125
- },
126
- {
127
- immediate: true,
128
- },
129
- );
130
-
131
- // 打开代码编辑框
132
- const editCode = () => {
133
- services?.codeBlockService.setCodeEditorContent(true, props.model.codeId);
134
- };
118
+ const { codeBlockEditor, codeConfig, editCode, submitCodeBlockHandler } = useCodeBlockEdit(services?.codeBlockService);
135
119
  </script>
@@ -0,0 +1,47 @@
1
+ <template>
2
+ <m-form-container
3
+ :config="{
4
+ ...config,
5
+ ...cascaderConfig,
6
+ }"
7
+ :model="model"
8
+ @change="onChangeHandler"
9
+ ></m-form-container>
10
+ </template>
11
+
12
+ <script setup lang="ts">
13
+ import { computed, inject } from 'vue';
14
+
15
+ import type { FieldProps } from '@tmagic/form';
16
+
17
+ import type { DataSourceFieldSelectConfig, Services } from '@editor/type';
18
+
19
+ const services = inject<Services>('services');
20
+ const emit = defineEmits(['change']);
21
+
22
+ const props = withDefaults(defineProps<FieldProps<DataSourceFieldSelectConfig>>(), {
23
+ disabled: false,
24
+ });
25
+
26
+ const dataSources = computed(() => services?.dataSourceService.get('dataSources'));
27
+
28
+ const cascaderConfig = {
29
+ type: 'cascader',
30
+ name: props.name,
31
+ options: () =>
32
+ dataSources.value
33
+ ?.filter((ds) => ds.fields?.length)
34
+ ?.map((ds) => ({
35
+ label: ds.title || ds.id,
36
+ value: ds.id,
37
+ children: ds.fields?.map((field) => ({
38
+ label: field.title,
39
+ value: field.name,
40
+ })),
41
+ })) || [],
42
+ };
43
+
44
+ const onChangeHandler = (value: any) => {
45
+ emit('change', value);
46
+ };
47
+ </script>
@@ -1,19 +1,21 @@
1
1
  <template>
2
2
  <div class="m-editor-data-source-fields">
3
- <MagicTable :data="model[name]" :columns="filedColumns"></MagicTable>
3
+ <MagicTable :data="model[name]" :columns="fieldColumns"></MagicTable>
4
4
 
5
5
  <div class="m-editor-data-source-fields-footer">
6
6
  <TMagicButton size="small" type="primary" :disabled="disabled" plain @click="newHandler()">添加</TMagicButton>
7
7
  </div>
8
8
 
9
- <MFormDialog
9
+ <MFormDrawer
10
10
  ref="addDialog"
11
+ label-width="80px"
11
12
  :title="filedTitle"
12
13
  :config="dataSourceFieldsConfig"
13
14
  :values="fieldValues"
14
15
  :parentValues="model[name]"
16
+ :disabled="disabled"
15
17
  @submit="fieldChange"
16
- ></MFormDialog>
18
+ ></MFormDrawer>
17
19
  </div>
18
20
  </template>
19
21
 
@@ -21,19 +23,19 @@
21
23
  import { ref } from 'vue';
22
24
 
23
25
  import { TMagicButton, tMagicMessageBox } from '@tmagic/design';
24
- import { FormConfig, FormState, MFormDialog } from '@tmagic/form';
26
+ import { FieldProps, FormConfig, FormState, MFormDrawer } from '@tmagic/form';
25
27
  import { MagicTable } from '@tmagic/table';
26
28
 
29
+ defineOptions({
30
+ name: 'MEditorDataSourceFields',
31
+ });
32
+
27
33
  const props = withDefaults(
28
- defineProps<{
29
- config: {
34
+ defineProps<
35
+ FieldProps<{
30
36
  type: 'data-source-fields';
31
- };
32
- model: any;
33
- prop: string;
34
- disabled: boolean;
35
- name: string;
36
- }>(),
37
+ }>
38
+ >(),
37
39
  {
38
40
  disabled: false,
39
41
  },
@@ -41,32 +43,29 @@ const props = withDefaults(
41
43
 
42
44
  const emit = defineEmits(['change']);
43
45
 
44
- const addDialog = ref<InstanceType<typeof MFormDialog>>();
46
+ const addDialog = ref<InstanceType<typeof MFormDrawer>>();
45
47
  const fieldValues = ref<Record<string, any>>({});
46
48
  const filedTitle = ref('');
47
49
 
48
50
  const newHandler = () => {
49
- if (!addDialog.value) return;
50
51
  fieldValues.value = {};
51
52
  filedTitle.value = '新增属性';
52
- addDialog.value.dialogVisible = true;
53
+ addDialog.value?.show();
53
54
  };
54
55
 
55
56
  const fieldChange = ({ index, ...value }: Record<string, any>) => {
56
- if (!addDialog.value) return;
57
-
58
57
  if (index > -1) {
59
58
  props.model[props.name][index] = value;
60
59
  } else {
61
60
  props.model[props.name].push(value);
62
61
  }
63
62
 
64
- addDialog.value.dialogVisible = false;
63
+ addDialog.value?.hide();
65
64
 
66
65
  emit('change', props.model[props.name]);
67
66
  };
68
67
 
69
- const filedColumns = [
68
+ const fieldColumns = [
70
69
  {
71
70
  label: '属性名称',
72
71
  prop: 'title',
@@ -79,6 +78,10 @@ const filedColumns = [
79
78
  label: '属性描述',
80
79
  prop: 'desc',
81
80
  },
81
+ {
82
+ label: '默认值',
83
+ prop: 'defaultValue',
84
+ },
82
85
  {
83
86
  label: '操作',
84
87
  fixed: 'right',
@@ -86,13 +89,12 @@ const filedColumns = [
86
89
  {
87
90
  text: '编辑',
88
91
  handler: (row: Record<string, any>, index: number) => {
89
- if (!addDialog.value) return;
90
92
  fieldValues.value = {
91
93
  ...row,
92
94
  index,
93
95
  };
94
96
  filedTitle.value = `编辑${row.title}`;
95
- addDialog.value.dialogVisible = true;
97
+ addDialog.value?.show();
96
98
  },
97
99
  },
98
100
  {
@@ -157,6 +159,7 @@ const dataSourceFieldsConfig: FormConfig = [
157
159
  {
158
160
  name: 'description',
159
161
  text: '描述',
162
+ type: 'textarea',
160
163
  },
161
164
  {
162
165
  name: 'defaultValue',