@tmagic/editor 1.8.0-beta.2 → 1.8.0-beta.4

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 (84) hide show
  1. package/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +9 -0
  2. package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +46 -28
  3. package/dist/es/editorProps.js +2 -0
  4. package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +2 -5
  5. package/dist/es/hooks/use-code-block-edit.js +6 -3
  6. package/dist/es/hooks/use-data-source-edit.js +5 -2
  7. package/dist/es/hooks/use-stage.js +8 -4
  8. package/dist/es/index.js +3 -1
  9. package/dist/es/layouts/CodeEditor.vue_vue_type_script_setup_true_lang.js +2 -5
  10. package/dist/es/layouts/NavMenu.vue_vue_type_script_setup_true_lang.js +1 -1
  11. package/dist/es/layouts/history-list/Bucket.vue_vue_type_script_setup_true_lang.js +37 -14
  12. package/dist/es/layouts/history-list/BucketTab.js +5 -0
  13. package/dist/es/layouts/history-list/{CodeBlockTab.vue_vue_type_script_setup_true_lang.js → BucketTab.vue_vue_type_script_setup_true_lang.js} +30 -16
  14. package/dist/es/layouts/history-list/GroupRow.vue_vue_type_script_setup_true_lang.js +91 -60
  15. package/dist/es/layouts/history-list/HistoryDiffDialog.vue_vue_type_script_setup_true_lang.js +82 -30
  16. package/dist/es/layouts/history-list/HistoryListPanel.vue_vue_type_script_setup_true_lang.js +140 -66
  17. package/dist/es/layouts/history-list/InitialRow.vue_vue_type_script_setup_true_lang.js +15 -9
  18. package/dist/es/layouts/history-list/PageTab.vue_vue_type_script_setup_true_lang.js +15 -6
  19. package/dist/es/layouts/history-list/composables.js +72 -2
  20. package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +5 -1
  21. package/dist/es/layouts/sidebar/ComponentListPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  22. package/dist/es/layouts/sidebar/code-block/CodeBlockList.vue_vue_type_script_setup_true_lang.js +3 -3
  23. package/dist/es/layouts/sidebar/code-block/CodeBlockListPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  24. package/dist/es/layouts/sidebar/code-block/useContentMenu.js +1 -1
  25. package/dist/es/layouts/sidebar/data-source/DataSourceListPanel.vue_vue_type_script_setup_true_lang.js +1 -1
  26. package/dist/es/layouts/sidebar/data-source/useContentMenu.js +1 -1
  27. package/dist/es/layouts/sidebar/layer/LayerMenu.vue_vue_type_script_setup_true_lang.js +5 -5
  28. package/dist/es/layouts/sidebar/layer/LayerNodeTool.vue_vue_type_script_setup_true_lang.js +1 -1
  29. package/dist/es/layouts/workspace/viewer/Stage.vue_vue_type_script_setup_true_lang.js +1 -1
  30. package/dist/es/layouts/workspace/viewer/ViewerMenu.vue_vue_type_script_setup_true_lang.js +8 -8
  31. package/dist/es/services/codeBlock.js +25 -10
  32. package/dist/es/services/dataSource.js +24 -10
  33. package/dist/es/services/editor.js +98 -46
  34. package/dist/es/services/history.js +7 -2
  35. package/dist/es/services/keybinding.js +3 -3
  36. package/dist/es/style.css +60 -16
  37. package/dist/es/utils/content-menu.js +17 -9
  38. package/dist/style.css +60 -16
  39. package/dist/tmagic-editor.umd.cjs +795 -443
  40. package/package.json +7 -7
  41. package/src/Editor.vue +8 -0
  42. package/src/components/CompareForm.vue +50 -19
  43. package/src/editorProps.ts +7 -0
  44. package/src/fields/CodeLink.vue +2 -5
  45. package/src/hooks/use-code-block-edit.ts +4 -3
  46. package/src/hooks/use-data-source-edit.ts +2 -2
  47. package/src/hooks/use-stage.ts +4 -3
  48. package/src/index.ts +2 -0
  49. package/src/layouts/CodeEditor.vue +2 -5
  50. package/src/layouts/NavMenu.vue +1 -1
  51. package/src/layouts/history-list/Bucket.vue +58 -29
  52. package/src/layouts/history-list/BucketTab.vue +80 -0
  53. package/src/layouts/history-list/GroupRow.vue +110 -58
  54. package/src/layouts/history-list/HistoryDiffDialog.vue +53 -33
  55. package/src/layouts/history-list/HistoryListPanel.vue +165 -52
  56. package/src/layouts/history-list/InitialRow.vue +17 -6
  57. package/src/layouts/history-list/PageTab.vue +25 -7
  58. package/src/layouts/history-list/composables.ts +92 -1
  59. package/src/layouts/props-panel/PropsPanel.vue +5 -1
  60. package/src/layouts/sidebar/ComponentListPanel.vue +9 -5
  61. package/src/layouts/sidebar/code-block/CodeBlockList.vue +5 -5
  62. package/src/layouts/sidebar/code-block/CodeBlockListPanel.vue +1 -1
  63. package/src/layouts/sidebar/code-block/useContentMenu.ts +1 -1
  64. package/src/layouts/sidebar/data-source/DataSourceListPanel.vue +1 -1
  65. package/src/layouts/sidebar/data-source/useContentMenu.ts +1 -1
  66. package/src/layouts/sidebar/layer/LayerMenu.vue +19 -11
  67. package/src/layouts/sidebar/layer/LayerNodeTool.vue +7 -4
  68. package/src/layouts/workspace/viewer/Stage.vue +1 -1
  69. package/src/layouts/workspace/viewer/ViewerMenu.vue +8 -8
  70. package/src/services/codeBlock.ts +33 -9
  71. package/src/services/dataSource.ts +30 -8
  72. package/src/services/editor.ts +111 -34
  73. package/src/services/history.ts +10 -0
  74. package/src/services/keybinding.ts +3 -3
  75. package/src/theme/history-list-panel.scss +67 -14
  76. package/src/theme/props-panel.scss +3 -3
  77. package/src/type.ts +146 -0
  78. package/src/utils/content-menu.ts +18 -9
  79. package/types/index.d.ts +387 -156
  80. package/dist/es/layouts/history-list/CodeBlockTab.js +0 -5
  81. package/dist/es/layouts/history-list/DataSourceTab.js +0 -5
  82. package/dist/es/layouts/history-list/DataSourceTab.vue_vue_type_script_setup_true_lang.js +0 -62
  83. package/src/layouts/history-list/CodeBlockTab.vue +0 -61
  84. package/src/layouts/history-list/DataSourceTab.vue +0 -61
@@ -54,6 +54,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
54
54
  disabledMultiSelect: { type: Boolean },
55
55
  alwaysMultiSelect: { type: Boolean },
56
56
  disabledPageFragment: { type: Boolean },
57
+ disabledFlashTip: { type: Boolean },
57
58
  disabledStageOverlay: { type: Boolean },
58
59
  disabledShowSrc: { type: Boolean },
59
60
  disabledDataSource: { type: Boolean },
@@ -70,6 +71,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
70
71
  beforeDblclick: { type: Function },
71
72
  beforeLayerNodeDblclick: { type: Function },
72
73
  extendFormState: { type: Function },
74
+ historyListExtraTabs: {},
73
75
  pageBarSortOptions: {},
74
76
  pageFilterFunction: { type: Function }
75
77
  }, defaultEditorProps),
@@ -119,6 +121,7 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
119
121
  guidesOptions: props.guidesOptions,
120
122
  disabledMultiSelect: props.disabledMultiSelect,
121
123
  alwaysMultiSelect: props.alwaysMultiSelect,
124
+ disabledFlashTip: props.disabledFlashTip,
122
125
  beforeDblclick: props.beforeDblclick
123
126
  };
124
127
  stageOverlay_default.set("stageOptions", stageOptions);
@@ -131,6 +134,12 @@ var Editor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
131
134
  * 与 PropsPanel 通过 `:extend-state` 显式传入的方式保持等价。
132
135
  */
133
136
  provide("extendFormState", props.extendFormState);
137
+ /**
138
+ * 把历史记录面板的自定义扩展 tab 提供给深层的 HistoryListPanel(它挂在 NavMenu 中,
139
+ * 以 markRaw component 形式渲染,无法直接通过 props 透传)。业务方可借此在历史记录
140
+ * 面板内追加自定义模块的历史 tab。
141
+ */
142
+ provide("historyListExtraTabs", props.historyListExtraTabs);
134
143
  provide("eventBus", new EventEmitter());
135
144
  const propsPanelMountedHandler = (e) => {
136
145
  emit("props-panel-mounted", e);
@@ -16,15 +16,10 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
16
16
  dataSourceType: {},
17
17
  labelWidth: { default: "120px" },
18
18
  height: {},
19
- extendState: {}
19
+ extendState: {},
20
+ loadConfig: {}
20
21
  },
21
22
  setup(__props, { expose: __expose }) {
22
- /**
23
- * 对比类型:
24
- * - node: 节点组件,按 `type` 从 propsService 获取属性表单配置
25
- * - data-source: 数据源,按 `type`(base/http/...) 从 dataSourceService 获取数据源表单配置
26
- * - code-block: 数据源代码块,使用内置的代码块表单配置
27
- */
28
23
  const props = __props;
29
24
  const { propsService, dataSourceService, codeBlockService, editorService } = useServices();
30
25
  const services = useServices();
@@ -84,34 +79,57 @@ var CompareForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
84
79
  }
85
80
  return !isEqual(curValue, lastValue);
86
81
  };
87
- const loadConfig = async () => {
82
+ const removeStyleDisplayConfig = (formConfig) => formConfig.map((item) => {
83
+ if (!("type" in item)) return item;
84
+ if (item?.type !== "tab" || !Array.isArray(item.items)) return item;
85
+ return {
86
+ ...item,
87
+ items: item.items.map((tabPane) => {
88
+ if (tabPane?.title !== "样式" || !Array.isArray(tabPane.items)) return tabPane;
89
+ return {
90
+ ...tabPane,
91
+ display: true
92
+ };
93
+ })
94
+ };
95
+ });
96
+ /**
97
+ * 内置的默认 FormConfig 加载逻辑:按 `category` 从对应 service / 工具取配置。
98
+ * 作为 ctx.defaultLoadConfig 透传给自定义 `loadConfig`,方便复用与二次加工。
99
+ */
100
+ const defaultLoadConfig = async () => {
88
101
  switch (props.category) {
89
102
  case "node":
90
- if (!props.type) {
91
- config.value = [];
92
- return;
93
- }
94
- config.value = await propsService.getPropsConfig(props.type);
95
- break;
96
- case "data-source":
97
- config.value = dataSourceService.getFormConfig(props.type || "base");
98
- break;
99
- case "code-block":
100
- config.value = getCodeBlockFormConfig({
101
- paramColConfig: codeBlockService.getParamsColConfig(),
102
- isDataSource: () => Boolean(props.dataSourceType),
103
- dataSourceType: () => props.dataSourceType,
104
- codeOptions,
105
- editable: false
106
- });
107
- break;
108
- default: config.value = [];
103
+ if (!props.type) return [];
104
+ return removeStyleDisplayConfig(await propsService.getPropsConfig(props.type));
105
+ case "data-source": return dataSourceService.getFormConfig(props.type || "base");
106
+ case "code-block": return getCodeBlockFormConfig({
107
+ paramColConfig: codeBlockService.getParamsColConfig(),
108
+ isDataSource: () => Boolean(props.dataSourceType),
109
+ dataSourceType: () => props.dataSourceType,
110
+ codeOptions,
111
+ editable: false
112
+ });
113
+ default: return [];
114
+ }
115
+ };
116
+ const loadConfig = async () => {
117
+ if (props.loadConfig) {
118
+ config.value = await props.loadConfig({
119
+ category: props.category,
120
+ type: props.type,
121
+ dataSourceType: props.dataSourceType,
122
+ defaultLoadConfig
123
+ });
124
+ return;
109
125
  }
126
+ config.value = await defaultLoadConfig();
110
127
  };
111
128
  watch([
112
129
  () => props.category,
113
130
  () => props.type,
114
- () => props.dataSourceType
131
+ () => props.dataSourceType,
132
+ () => props.loadConfig
115
133
  ], () => {
116
134
  loadConfig();
117
135
  }, { immediate: true });
@@ -6,6 +6,7 @@ var defaultEditorProps = {
6
6
  disabledMultiSelect: false,
7
7
  alwaysMultiSelect: false,
8
8
  disabledPageFragment: false,
9
+ disabledFlashTip: false,
9
10
  disabledStageOverlay: false,
10
11
  containerHighlightClassName: CONTAINER_HIGHLIGHT_CLASS_NAME,
11
12
  containerHighlightDuration: 800,
@@ -15,6 +16,7 @@ var defaultEditorProps = {
15
16
  disabledCodeBlock: false,
16
17
  componentGroupList: () => [],
17
18
  datasourceList: () => [],
19
+ historyListExtraTabs: () => [],
18
20
  menu: () => ({
19
21
  left: [],
20
22
  right: []
@@ -1,6 +1,6 @@
1
1
  import { getEditorConfig } from "../utils/config.js";
2
+ import { serializeConfig } from "../utils/editor.js";
2
3
  import { computed, createBlock, defineComponent, openBlock, reactive, resolveComponent, watch } from "vue";
3
- import serialize from "serialize-javascript";
4
4
  //#region packages/editor/src/fields/CodeLink.vue?vue&type=script&setup=true&lang.ts
5
5
  var CodeLink_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
6
6
  name: "MFieldsCodeLink",
@@ -39,10 +39,7 @@ var CodeLink_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
39
39
  });
40
40
  const modelValue = reactive({ form: { [props.name]: "" } });
41
41
  watch(() => props.model[props.name], (value) => {
42
- modelValue.form = { [props.name]: serialize(value, {
43
- space: 2,
44
- unsafe: true
45
- }).replace(/"(\w+)":\s/g, "$1: ") };
42
+ modelValue.form = { [props.name]: serializeConfig(value) };
46
43
  }, { immediate: true });
47
44
  const changeHandler = (v) => {
48
45
  if (!props.name || !props.model) return;
@@ -33,12 +33,15 @@ var useCodeBlockEdit = (codeBlockService) => {
33
33
  await nextTick();
34
34
  codeBlockEditorRef.value?.show();
35
35
  };
36
- const deleteCode = async (key) => {
37
- codeBlockService.deleteCodeDslByIds([key]);
36
+ const deleteCode = async (key, { historySource } = {}) => {
37
+ codeBlockService.deleteCodeDslByIds([key], { historySource });
38
38
  };
39
39
  const submitCodeBlockHandler = async (values, eventData) => {
40
40
  if (!codeId.value) return;
41
- await codeBlockService.setCodeDslById(codeId.value, values, { changeRecords: eventData?.changeRecords });
41
+ await codeBlockService.setCodeDslById(codeId.value, values, {
42
+ changeRecords: eventData?.changeRecords,
43
+ historySource: "props"
44
+ });
42
45
  codeBlockEditorRef.value?.hide();
43
46
  };
44
47
  return {
@@ -12,8 +12,11 @@ var useDataSourceEdit = (dataSourceService) => {
12
12
  editDialog.value.show();
13
13
  };
14
14
  const submitDataSourceHandler = (value, eventData) => {
15
- if (value.id) dataSourceService.update(value, { changeRecords: eventData.changeRecords });
16
- else dataSourceService.add(value);
15
+ if (value.id) dataSourceService.update(value, {
16
+ changeRecords: eventData.changeRecords,
17
+ historySource: "props"
18
+ });
19
+ else dataSourceService.add(value, { historySource: "props" });
17
20
  editDialog.value?.hide();
18
21
  };
19
22
  return {
@@ -38,7 +38,8 @@ var useStage = (stageOptions) => {
38
38
  guidesOptions: stageOptions.guidesOptions,
39
39
  disabledMultiSelect: stageOptions.disabledMultiSelect,
40
40
  alwaysMultiSelect: stageOptions.alwaysMultiSelect,
41
- disabledRule: stageOptions.disabledRule
41
+ disabledRule: stageOptions.disabledRule,
42
+ disabledFlashTip: stageOptions.disabledFlashTip
42
43
  });
43
44
  watch(() => editor_default.get("disabledMultiSelect"), (disabledMultiSelect) => {
44
45
  if (disabledMultiSelect) stage.disableMultiSelect();
@@ -95,14 +96,17 @@ var useStage = (stageOptions) => {
95
96
  changeRecordList.push(buildChangeRecords(style, "style"));
96
97
  });
97
98
  if (configs.length === 0) return;
98
- editor_default.update(configs, { changeRecordList });
99
+ editor_default.update(configs, {
100
+ changeRecordList,
101
+ historySource: "stage"
102
+ });
99
103
  });
100
104
  stage.on("sort", (ev) => {
101
- editor_default.sort(ev.src, ev.dist);
105
+ editor_default.sort(ev.src, ev.dist, { historySource: "stage" });
102
106
  });
103
107
  stage.on("remove", (ev) => {
104
108
  const nodes = ev.data.map(({ el }) => editor_default.getNodeById(getIdFromEl()(el) || ""));
105
- editor_default.remove(nodes.filter((node) => Boolean(node)));
109
+ editor_default.remove(nodes.filter((node) => Boolean(node)), { historySource: "stage" });
106
110
  });
107
111
  stage.on("select-parent", () => {
108
112
  const parent = editor_default.get("parent");
package/dist/es/index.js CHANGED
@@ -32,7 +32,9 @@ import SplitView_default from "./components/SplitView.js";
32
32
  import Icon_default from "./components/Icon.js";
33
33
  import ToolButton_default from "./components/ToolButton.js";
34
34
  import CodeEditor_default from "./layouts/CodeEditor.js";
35
+ import Bucket_default from "./layouts/history-list/Bucket.js";
35
36
  import CompareForm_default from "./components/CompareForm.js";
37
+ import HistoryDiffDialog_default from "./layouts/history-list/HistoryDiffDialog.js";
36
38
  import FormPanel_default from "./layouts/props-panel/FormPanel.js";
37
39
  import PropsPanel_default from "./layouts/props-panel/PropsPanel.js";
38
40
  import FloatingBox_default from "./components/FloatingBox.js";
@@ -78,4 +80,4 @@ export * from "@tmagic/table";
78
80
  export * from "@tmagic/stage";
79
81
  export * from "@tmagic/design";
80
82
  export * from "@tmagic/utils";
81
- export { CODE_DRAFT_STORAGE_KEY, COPY_CODE_STORAGE_KEY, COPY_DS_STORAGE_KEY, COPY_STORAGE_KEY, CodeBlockEditor_default as CodeBlockEditor, CodeBlockList_default as CodeBlockList, CodeBlockListPanel_default as CodeBlockListPanel, CodeDeleteErrorType, CodeSelect_default as CodeSelect, CodeSelectCol_default as CodeSelectCol, ColumnLayout, CompareForm_default as CompareForm, ComponentListPanel_default as ComponentListPanel, CondOpSelect_default as CondOpSelect, ContentMenu_default as ContentMenu, DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, DataSourceAddButton_default as DataSourceAddButton, DataSourceConfigPanel_default as DataSourceConfigPanel, Index_default as DataSourceFieldSelect, DataSourceFields_default as DataSourceFields, DataSourceInput_default as DataSourceInput, DataSourceMethodSelect_default as DataSourceMethodSelect, DataSourceMethods_default as DataSourceMethods, DataSourceMocks_default as DataSourceMocks, DataSourceSelect_default as DataSourceSelect, DepTargetType, DisplayConds_default as DisplayConds, DragType, EventSelect_default as EventSelect, Fixed2Other, FloatingBox_default as FloatingBox, H_GUIDE_LINE_STORAGE_KEY, Icon_default as Icon, IdleTask, KeyBindingCommand, KeyValue_default as KeyValue, Keys, LEFT_COLUMN_WIDTH_STORAGE_KEY, LayerOffset, LayerPanel_default as LayerPanel, Layout, SplitView_default as LayoutContainer, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, PageFragmentSelect_default as PageFragmentSelect, FormPanel_default as PropsFormPanel, PropsPanel_default as PropsPanel, RIGHT_COLUMN_WIDTH_STORAGE_KEY, Resizer_default as Resizer, ScrollViewer, SideItemKey, SplitView_default as SplitView, StageCore, Index_default$1 as StyleSetter, CodeEditor_default as TMagicCodeEditor, Editor_default as TMagicEditor, ToolButton_default as ToolButton, Tree_default as Tree, TreeNode_default as TreeNode, UI_SELECT_MODE_EVENT_NAME, UndoRedo, V_GUIDE_LINE_STORAGE_KEY, advancedTabConfig, arrayOptions, beforePaste, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectRelatedNodes, dataSource_default as dataSourceService, debug, plugin_default as default, defaultIsExpandable, dep_default as depService, designPlugin, displayTabConfig, editorNodeMergeCustomizer, editor_default as editorService, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getDefaultConfig, getDisplayField, getEditorConfig, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getNodeIndex, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, info, isIncludeDataSource, monaco_editor_default as loadMonaco, log, moveItemsInContainer, numberOptions, props_default as propsService, resolveSelectedNode, serializeConfig, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, updateStatus, useCodeBlockEdit, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, warn };
83
+ export { CODE_DRAFT_STORAGE_KEY, COPY_CODE_STORAGE_KEY, COPY_DS_STORAGE_KEY, COPY_STORAGE_KEY, CodeBlockEditor_default as CodeBlockEditor, CodeBlockList_default as CodeBlockList, CodeBlockListPanel_default as CodeBlockListPanel, CodeDeleteErrorType, CodeSelect_default as CodeSelect, CodeSelectCol_default as CodeSelectCol, ColumnLayout, CompareForm_default as CompareForm, ComponentListPanel_default as ComponentListPanel, CondOpSelect_default as CondOpSelect, ContentMenu_default as ContentMenu, DEFAULT_LEFT_COLUMN_WIDTH, DEFAULT_RIGHT_COLUMN_WIDTH, DataSourceAddButton_default as DataSourceAddButton, DataSourceConfigPanel_default as DataSourceConfigPanel, Index_default as DataSourceFieldSelect, DataSourceFields_default as DataSourceFields, DataSourceInput_default as DataSourceInput, DataSourceMethodSelect_default as DataSourceMethodSelect, DataSourceMethods_default as DataSourceMethods, DataSourceMocks_default as DataSourceMocks, DataSourceSelect_default as DataSourceSelect, DepTargetType, DisplayConds_default as DisplayConds, DragType, EventSelect_default as EventSelect, Fixed2Other, FloatingBox_default as FloatingBox, H_GUIDE_LINE_STORAGE_KEY, HistoryDiffDialog_default as HistoryDiffDialog, Bucket_default as HistoryListBucket, Icon_default as Icon, IdleTask, KeyBindingCommand, KeyValue_default as KeyValue, Keys, LEFT_COLUMN_WIDTH_STORAGE_KEY, LayerOffset, LayerPanel_default as LayerPanel, Layout, SplitView_default as LayoutContainer, MIN_CENTER_COLUMN_WIDTH, MIN_LEFT_COLUMN_WIDTH, MIN_RIGHT_COLUMN_WIDTH, PROPS_PANEL_WIDTH_STORAGE_KEY, PageFragmentSelect_default as PageFragmentSelect, FormPanel_default as PropsFormPanel, PropsPanel_default as PropsPanel, RIGHT_COLUMN_WIDTH_STORAGE_KEY, Resizer_default as Resizer, ScrollViewer, SideItemKey, SplitView_default as SplitView, StageCore, Index_default$1 as StyleSetter, CodeEditor_default as TMagicCodeEditor, Editor_default as TMagicEditor, ToolButton_default as ToolButton, Tree_default as Tree, TreeNode_default as TreeNode, UI_SELECT_MODE_EVENT_NAME, UndoRedo, V_GUIDE_LINE_STORAGE_KEY, advancedTabConfig, arrayOptions, beforePaste, buildChangeRecords, calcAlignCenterStyle, calcLayerTargetIndex, calcMoveStyle, canUsePluginMethods, change2Fixed, classifyDragSources, codeBlock_default as codeBlockService, collectRelatedNodes, dataSource_default as dataSourceService, debug, plugin_default as default, defaultIsExpandable, dep_default as depService, designPlugin, displayTabConfig, editorNodeMergeCustomizer, editor_default as editorService, eqOptions, error, eventTabConfig, events_default as eventsService, fillConfig, fixNodeLeft, fixNodePosition, formPlugin, generatePageName, generatePageNameByApp, getAddParent, getCascaderOptionsFromFields, getCodeBlockFormConfig, getDefaultConfig, getDisplayField, getEditorConfig, getFieldType, getFormConfig, getFormValue, getGuideLineFromCache, getInitPositionStyle, getNodeIndex, getPageFragmentList, getPageList, getPageNameList, getPositionInContainer, getRelativeStyle, history_default as historyService, info, isIncludeDataSource, monaco_editor_default as loadMonaco, log, moveItemsInContainer, numberOptions, props_default as propsService, resolveSelectedNode, serializeConfig, setChildrenLayout, setEditorConfig, setLayout, stageOverlay_default as stageOverlayService, storage_default as storageService, styleTabConfig, tablePlugin, toggleFixedPosition, ui_default as uiService, updateStatus, useCodeBlockEdit, useEditorContentHeight, useFilter, useFloatBox, useGetSo, useNextFloatBoxPosition, useNodeStatus, useServices, useStage, useWindowRect, warn };
@@ -1,10 +1,10 @@
1
1
  import { getEditorConfig } from "../utils/config.js";
2
+ import { serializeConfig } from "../utils/editor.js";
2
3
  import monaco_editor_default from "../utils/monaco-editor.js";
3
4
  import Icon_default from "../components/Icon.js";
4
5
  import { TMagicButton } from "@tmagic/design";
5
6
  import { Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onUnmounted, openBlock, ref, unref, useTemplateRef, watch, withCtx } from "vue";
6
7
  import { throttle } from "lodash-es";
7
- import serialize from "serialize-javascript";
8
8
  import { FullScreen } from "@element-plus/icons-vue";
9
9
  //#region packages/editor/src/layouts/CodeEditor.vue?vue&type=script&setup=true&lang.ts
10
10
  var _hoisted_1 = { class: "magic-code-editor" };
@@ -94,10 +94,7 @@ var CodeEditor_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ def
94
94
  const toString = (v, language) => {
95
95
  let value;
96
96
  if (typeof v !== "string") if (language === "json") value = JSON.stringify(v, null, 2);
97
- else value = serialize(v, {
98
- space: 2,
99
- unsafe: true
100
- }).replace(/"(\w+)":\s/g, "$1: ");
97
+ else value = serializeConfig(v);
101
98
  else value = v;
102
99
  if (language === "javascript" && value.startsWith("{") && value.endsWith("}")) value = `(${value})`;
103
100
  return value;
@@ -45,7 +45,7 @@ var NavMenu_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ define
45
45
  disabled: () => editorService.get("node")?.type === NodeType.PAGE,
46
46
  handler: () => {
47
47
  const node = editorService.get("node");
48
- node && editorService.remove(node);
48
+ node && editorService.remove(node, { historySource: "toolbar" });
49
49
  }
50
50
  });
51
51
  break;
@@ -1,6 +1,7 @@
1
+ import { formatHistoryFullTime, formatHistoryTime, groupSource, groupTimestamp } from "./composables.js";
1
2
  import GroupRow_default from "./GroupRow.js";
2
3
  import InitialRow_default from "./InitialRow.js";
3
- import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, openBlock, renderList, toDisplayString } from "vue";
4
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, defineComponent, openBlock, renderList, toDisplayString, unref } from "vue";
4
5
  //#region packages/editor/src/layouts/history-list/Bucket.vue?vue&type=script&setup=true&lang.ts
5
6
  var _hoisted_1 = { class: "m-editor-history-list-bucket" };
6
7
  var _hoisted_2 = { class: "m-editor-history-list-bucket-title" };
@@ -13,11 +14,20 @@ var Bucket_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
13
14
  title: {},
14
15
  bucketId: {},
15
16
  prefix: {},
17
+ showInitial: {
18
+ type: Boolean,
19
+ default: true
20
+ },
16
21
  groups: {},
17
- describeGroup: { type: Function },
18
- describeStep: { type: Function },
19
- isStepDiffable: { type: Function },
20
- expanded: {}
22
+ describeGroup: {},
23
+ describeStep: {},
24
+ isStepDiffable: {},
25
+ isStepRevertable: {},
26
+ expanded: {},
27
+ gotoEnabled: {
28
+ type: Boolean,
29
+ default: true
30
+ }
21
31
  },
22
32
  emits: [
23
33
  "toggle",
@@ -36,14 +46,17 @@ var Bucket_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
36
46
  createElementVNode("code", null, toDisplayString(String(__props.bucketId)), 1),
37
47
  createElementVNode("span", _hoisted_3, toDisplayString(__props.groups.length) + " 组", 1)
38
48
  ]), createElementVNode("ul", _hoisted_4, [
39
- (openBlock(true), createElementBlock(Fragment, null, renderList(__props.groups, (group, gIdx) => {
49
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.groups, (group) => {
40
50
  return openBlock(), createBlock(GroupRow_default, {
41
- key: `${__props.prefix}-${__props.bucketId}-${gIdx}`,
42
- "group-key": `${__props.prefix}-${__props.bucketId}-${gIdx}`,
51
+ key: `${__props.prefix}-${__props.bucketId}-${group.steps[0]?.index}`,
52
+ "group-key": `${__props.prefix}-${__props.bucketId}-${group.steps[0]?.index}`,
43
53
  applied: group.applied,
44
54
  merged: group.steps.length > 1,
45
55
  "op-type": group.opType,
46
56
  desc: __props.describeGroup(group),
57
+ source: unref(groupSource)(group),
58
+ time: unref(formatHistoryTime)(unref(groupTimestamp)(group)),
59
+ "time-title": unref(formatHistoryFullTime)(unref(groupTimestamp)(group)),
47
60
  "step-count": group.steps.length,
48
61
  "sub-steps": group.steps.map((s) => ({
49
62
  index: s.index,
@@ -51,10 +64,14 @@ var Bucket_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
51
64
  isCurrent: s.isCurrent,
52
65
  desc: __props.describeStep(s.step),
53
66
  diffable: __props.isStepDiffable ? __props.isStepDiffable(s.step) : false,
54
- revertable: s.applied
67
+ revertable: s.applied && (__props.isStepRevertable ? __props.isStepRevertable(s.step) : true),
68
+ source: s.step.source,
69
+ time: unref(formatHistoryTime)(s.step.timestamp),
70
+ timeTitle: unref(formatHistoryFullTime)(s.step.timestamp)
55
71
  })),
56
72
  "is-current": group.isCurrent,
57
- expanded: !!__props.expanded[`${__props.prefix}-${__props.bucketId}-${gIdx}`],
73
+ expanded: !!__props.expanded[`${__props.prefix}-${__props.bucketId}-${group.steps[0]?.index}`],
74
+ "goto-enabled": __props.gotoEnabled,
58
75
  onToggle: _cache[0] || (_cache[0] = (key) => _ctx.$emit("toggle", key)),
59
76
  onGoto: _cache[1] || (_cache[1] = (index) => _ctx.$emit("goto", __props.bucketId, index)),
60
77
  onDiffStep: _cache[2] || (_cache[2] = (index) => _ctx.$emit("diff-step", __props.bucketId, index)),
@@ -65,17 +82,23 @@ var Bucket_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
65
82
  "merged",
66
83
  "op-type",
67
84
  "desc",
85
+ "source",
86
+ "time",
87
+ "time-title",
68
88
  "step-count",
69
89
  "sub-steps",
70
90
  "is-current",
71
- "expanded"
91
+ "expanded",
92
+ "goto-enabled"
72
93
  ]);
73
94
  }), 128)),
74
- createCommentVNode("\n 初始状态项:永远位于该 bucket 列表底部(同样按倒序展示,最底部 = 最早状态)。\n 当 bucket 内所有 group 都未 applied 时即为当前位置。\n "),
75
- createVNode(InitialRow_default, {
95
+ createCommentVNode("\n 初始状态项:永远位于该 bucket 列表底部(同样按倒序展示,最底部 = 最早状态)。\n 当 bucket 内所有 group 都未 applied 时即为当前位置。\n showInitial=false 时不展示(用于没有\"撤销到初始状态\"语义的自定义历史,如业务模块历史)。\n "),
96
+ __props.showInitial !== false ? (openBlock(), createBlock(InitialRow_default, {
97
+ key: 0,
76
98
  "is-current": isInitial.value,
99
+ "goto-enabled": __props.gotoEnabled,
77
100
  onGotoInitial: _cache[4] || (_cache[4] = ($event) => _ctx.$emit("goto-initial", __props.bucketId))
78
- }, null, 8, ["is-current"])
101
+ }, null, 8, ["is-current", "goto-enabled"])) : createCommentVNode("v-if", true)
79
102
  ])]);
80
103
  };
81
104
  }
@@ -0,0 +1,5 @@
1
+ import BucketTab_vue_vue_type_script_setup_true_lang_default from "./BucketTab.vue_vue_type_script_setup_true_lang.js";
2
+ //#region packages/editor/src/layouts/history-list/BucketTab.vue
3
+ var BucketTab_default = BucketTab_vue_vue_type_script_setup_true_lang_default;
4
+ //#endregion
5
+ export { BucketTab_default as default };
@@ -1,18 +1,27 @@
1
- import { describeCodeBlockGroup, describeCodeBlockStep } from "./composables.js";
2
1
  import Bucket_default from "./Bucket.js";
3
2
  import { TMagicScrollbar } from "@tmagic/design";
4
3
  import { Fragment, createBlock, createElementBlock, defineComponent, openBlock, renderList, unref, withCtx } from "vue";
5
- //#region packages/editor/src/layouts/history-list/CodeBlockTab.vue?vue&type=script&setup=true&lang.ts
4
+ //#region packages/editor/src/layouts/history-list/BucketTab.vue?vue&type=script&setup=true&lang.ts
6
5
  var _hoisted_1 = {
7
6
  key: 0,
8
7
  class: "m-editor-history-list-empty"
9
8
  };
10
- var CodeBlockTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
11
- name: "MEditorHistoryListCodeBlockTab",
12
- __name: "CodeBlockTab",
9
+ var BucketTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
10
+ name: "MEditorHistoryListBucketTab",
11
+ __name: "BucketTab",
13
12
  props: {
13
+ title: {},
14
+ prefix: {},
14
15
  buckets: {},
15
- expanded: {}
16
+ describeGroup: {},
17
+ describeStep: {},
18
+ isStepDiffable: {},
19
+ isStepRevertable: {},
20
+ expanded: {},
21
+ gotoEnabled: {
22
+ type: Boolean,
23
+ default: true
24
+ }
16
25
  },
17
26
  emits: [
18
27
  "toggle",
@@ -22,8 +31,6 @@ var CodeBlockTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
22
31
  "revert-step"
23
32
  ],
24
33
  setup(__props) {
25
- /** 仅 update(前后 content 都存在)时可查看差异。 */
26
- const isCodeBlockStepDiffable = (step) => Boolean(step.oldContent && step.newContent);
27
34
  return (_ctx, _cache) => {
28
35
  return !__props.buckets.length ? (openBlock(), createElementBlock("div", _hoisted_1, "暂无操作记录")) : (openBlock(), createBlock(unref(TMagicScrollbar), {
29
36
  key: 1,
@@ -31,26 +38,33 @@ var CodeBlockTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
31
38
  }, {
32
39
  default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.buckets, (bucket) => {
33
40
  return openBlock(), createBlock(Bucket_default, {
34
- key: `cb-${bucket.id}`,
35
- title: "代码块",
41
+ key: `${__props.prefix}-${bucket.id}`,
42
+ title: __props.title,
36
43
  "bucket-id": bucket.id,
37
- prefix: "cb",
44
+ prefix: __props.prefix,
38
45
  groups: bucket.groups,
39
- "describe-group": unref(describeCodeBlockGroup),
40
- "describe-step": unref(describeCodeBlockStep),
41
- "is-step-diffable": isCodeBlockStepDiffable,
46
+ "describe-group": __props.describeGroup,
47
+ "describe-step": __props.describeStep,
48
+ "is-step-diffable": __props.isStepDiffable,
49
+ "is-step-revertable": __props.isStepRevertable,
42
50
  expanded: __props.expanded,
51
+ "goto-enabled": __props.gotoEnabled,
43
52
  onToggle: _cache[0] || (_cache[0] = (key) => _ctx.$emit("toggle", key)),
44
53
  onGoto: _cache[1] || (_cache[1] = (id, index) => _ctx.$emit("goto", id, index)),
45
54
  onGotoInitial: _cache[2] || (_cache[2] = (id) => _ctx.$emit("goto-initial", id)),
46
55
  onDiffStep: _cache[3] || (_cache[3] = (id, index) => _ctx.$emit("diff-step", id, index)),
47
56
  onRevertStep: _cache[4] || (_cache[4] = (id, index) => _ctx.$emit("revert-step", id, index))
48
57
  }, null, 8, [
58
+ "title",
49
59
  "bucket-id",
60
+ "prefix",
50
61
  "groups",
51
62
  "describe-group",
52
63
  "describe-step",
53
- "expanded"
64
+ "is-step-diffable",
65
+ "is-step-revertable",
66
+ "expanded",
67
+ "goto-enabled"
54
68
  ]);
55
69
  }), 128))]),
56
70
  _: 1
@@ -59,4 +73,4 @@ var CodeBlockTab_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
59
73
  }
60
74
  });
61
75
  //#endregion
62
- export { CodeBlockTab_vue_vue_type_script_setup_true_lang_default as default };
76
+ export { BucketTab_vue_vue_type_script_setup_true_lang_default as default };