@tmagic/editor 1.8.0-beta.12 → 1.8.0-beta.14
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/dist/es/Editor.vue_vue_type_script_setup_true_lang.js +15 -3
- package/dist/es/components/CodeBlockEditor.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/components/CompareForm.vue_vue_type_script_setup_true_lang.js +13 -121
- package/dist/es/components/ContentMenu.vue_vue_type_script_setup_true_lang.js +11 -4
- package/dist/es/components/FloatingBox.vue_vue_type_script_setup_true_lang.js +7 -2
- package/dist/es/components/ViewForm.js +5 -0
- package/dist/es/components/ViewForm.vue_vue_type_script_setup_true_lang.js +58 -0
- package/dist/es/fields/Code.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/CodeLink.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/CodeSelect.vue_vue_type_script_setup_true_lang.js +80 -55
- package/dist/es/fields/CodeSelectCol.vue_vue_type_script_setup_true_lang.js +5 -1
- package/dist/es/fields/CondOpSelect.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceFieldSelect/Index.vue_vue_type_script_setup_true_lang.js +10 -7
- package/dist/es/fields/DataSourceFields.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceInput.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceMethodSelect.vue_vue_type_script_setup_true_name_true_lang.js +4 -1
- package/dist/es/fields/DataSourceMethods.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceMocks.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DataSourceSelect.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/DisplayConds.vue_vue_type_script_setup_true_lang.js +8 -2
- package/dist/es/fields/EventSelect.vue_vue_type_script_setup_true_lang.js +99 -64
- package/dist/es/fields/KeyValue.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/PageFragmentSelect.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/StyleSetter/Index.vue_vue_type_script_setup_true_lang.js +5 -4
- package/dist/es/fields/StyleSetter/components/BackgroundPosition.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/fields/StyleSetter/components/Border.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/es/fields/StyleSetter/icons/align-items/Center.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/FlexEnd.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/FlexStart.js +31 -0
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceAround.js +50 -0
- package/dist/es/fields/StyleSetter/icons/align-items/SpaceBetween.js +50 -0
- package/dist/es/fields/StyleSetter/icons/background-repeat/NoRepeat.js +6 -6
- package/dist/es/fields/StyleSetter/icons/background-repeat/Repeat.js +5 -2
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatX.js +28 -5
- package/dist/es/fields/StyleSetter/icons/background-repeat/RepeatY.js +31 -5
- package/dist/es/fields/StyleSetter/icons/flex-direction/Column.js +10 -2
- package/dist/es/fields/StyleSetter/icons/flex-direction/ColumnReverse.js +10 -2
- package/dist/es/fields/StyleSetter/icons/flex-direction/Row.js +10 -2
- package/dist/es/fields/StyleSetter/icons/flex-direction/RowReverse.js +10 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/Center.js +16 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexEnd.js +18 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/FlexStart.js +18 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceAround.js +36 -2
- package/dist/es/fields/StyleSetter/icons/justify-content/SpaceBetween.js +32 -2
- package/dist/es/fields/StyleSetter/pro/Background.vue_vue_type_script_setup_true_lang.js +7 -6
- package/dist/es/fields/StyleSetter/pro/Font.vue_vue_type_script_setup_true_lang.js +6 -3
- package/dist/es/fields/StyleSetter/pro/Layout.vue_vue_type_script_setup_true_lang.js +47 -25
- package/dist/es/fields/UISelect.vue_vue_type_script_setup_true_lang.js +4 -1
- package/dist/es/hooks/use-compare-form.js +119 -0
- package/dist/es/icons/DatasourceIcon.js +17 -0
- package/dist/es/index.js +6 -4
- package/dist/es/layouts/Framework.vue_vue_type_script_setup_true_lang.js +14 -10
- package/dist/es/layouts/props-panel/PropsPanel.vue_vue_type_script_setup_true_lang.js +10 -1
- package/dist/es/layouts/sidebar/Sidebar.vue_vue_type_script_setup_true_lang.js +3 -3
- package/dist/es/plugin.js +2 -1
- package/dist/es/services/codeBlock.js +1 -1
- package/dist/es/services/editor.js +54 -13
- package/dist/es/services/history.js +1 -1
- package/dist/es/services/props.js +1 -1
- package/dist/es/services/storage.js +1 -1
- package/dist/es/services/ui.js +5 -3
- package/dist/es/style.css +303 -40
- package/dist/es/utils/config.js +4 -1
- package/dist/es/utils/const.js +2 -2
- package/dist/es/utils/props.js +69 -30
- package/dist/style.css +303 -40
- package/dist/themes/magic-admin.css +3000 -0
- package/dist/tmagic-editor.umd.cjs +1748 -1079
- package/package.json +7 -7
- package/src/Editor.vue +22 -1
- package/src/components/CompareForm.vue +15 -202
- package/src/components/ContentMenu.vue +10 -2
- package/src/components/FloatingBox.vue +8 -2
- package/src/components/ViewForm.vue +55 -0
- package/src/editorProps.ts +4 -0
- package/src/fields/CodeSelect.vue +54 -43
- package/src/fields/CodeSelectCol.vue +1 -0
- package/src/fields/DataSourceFieldSelect/Index.vue +14 -5
- package/src/fields/DisplayConds.vue +4 -1
- package/src/fields/EventSelect.vue +56 -32
- package/src/fields/StyleSetter/Index.vue +1 -4
- package/src/fields/StyleSetter/components/Border.vue +1 -1
- package/src/fields/StyleSetter/icons/align-items/Center.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/FlexEnd.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/FlexStart.vue +19 -0
- package/src/fields/StyleSetter/icons/align-items/SpaceAround.vue +34 -0
- package/src/fields/StyleSetter/icons/align-items/SpaceBetween.vue +34 -0
- package/src/fields/StyleSetter/icons/align-items/index.ts +5 -0
- package/src/fields/StyleSetter/icons/background-repeat/NoRepeat.vue +20 -4
- package/src/fields/StyleSetter/icons/background-repeat/Repeat.vue +10 -28
- package/src/fields/StyleSetter/icons/background-repeat/RepeatX.vue +4 -5
- package/src/fields/StyleSetter/icons/background-repeat/RepeatY.vue +4 -5
- package/src/fields/StyleSetter/icons/flex-direction/Column.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/ColumnReverse.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/Row.vue +4 -3
- package/src/fields/StyleSetter/icons/flex-direction/RowReverse.vue +4 -3
- package/src/fields/StyleSetter/icons/justify-content/Center.vue +5 -2
- package/src/fields/StyleSetter/icons/justify-content/FlexEnd.vue +15 -2
- package/src/fields/StyleSetter/icons/justify-content/FlexStart.vue +15 -2
- package/src/fields/StyleSetter/icons/justify-content/SpaceAround.vue +28 -3
- package/src/fields/StyleSetter/icons/justify-content/SpaceBetween.vue +28 -2
- package/src/fields/StyleSetter/pro/Background.vue +7 -2
- package/src/fields/StyleSetter/pro/Font.vue +3 -3
- package/src/fields/StyleSetter/pro/Layout.vue +98 -28
- package/src/hooks/index.ts +1 -0
- package/src/hooks/use-compare-form.ts +187 -0
- package/src/icons/DatasourceIcon.vue +7 -0
- package/src/index.ts +4 -0
- package/src/layouts/Framework.vue +7 -1
- package/src/layouts/props-panel/PropsPanel.vue +19 -1
- package/src/layouts/sidebar/Sidebar.vue +3 -3
- package/src/plugin.ts +3 -2
- package/src/services/editor.ts +54 -11
- package/src/services/ui.ts +20 -5
- package/src/theme/code-block.scss +37 -0
- package/src/theme/common/var.scss +1 -1
- package/src/theme/component-list-panel.scss +2 -2
- package/src/theme/data-source-field.scss +4 -0
- package/src/theme/display-conds.scss +11 -0
- package/src/theme/event.scss +58 -4
- package/src/theme/framework.scss +4 -1
- package/src/theme/history-list-panel.scss +9 -9
- package/src/theme/nav-menu.scss +5 -1
- package/src/theme/props-panel.scss +2 -1
- package/src/theme/style-setter/border.scss +14 -5
- package/src/theme/theme.scss +1 -0
- package/src/theme/themes/magic-admin/index.scss +214 -0
- package/src/theme/ui-select.scss +1 -1
- package/src/type.ts +79 -6
- package/src/utils/config.ts +9 -1
- package/src/utils/const.ts +3 -2
- package/src/utils/props.ts +51 -9
- package/types/index.d.ts +314 -203
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
// magic-admin 主题:所有规则均以 `.m-editor.m-editor--magic-admin` 为前缀,
|
|
2
|
+
// 仅在 `<MEditor theme="magic-admin" />` 时生效,避免污染默认样式。
|
|
3
|
+
|
|
4
|
+
@use "@tmagic/design/src/theme/themes/magic-admin/index.scss" as tMagicDesign;
|
|
5
|
+
@use "@tmagic/table/src/theme/index.scss" as tMagicTable;
|
|
6
|
+
@use "@tmagic/form/src/theme/themes/magic-admin/index.scss" as tMagicForm;
|
|
7
|
+
@use "../../theme.scss";
|
|
8
|
+
|
|
9
|
+
.fade-enter-active,
|
|
10
|
+
.fade-leave-active {
|
|
11
|
+
transition: opacity 0.5s;
|
|
12
|
+
}
|
|
13
|
+
.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
|
|
14
|
+
opacity: 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// 仅作用于编辑器内部 DOM 的具体样式仍保留「双类」,避免误中 portal 上只挂 `m-theme--*`
|
|
18
|
+
// 的节点。
|
|
19
|
+
.m-editor.m-editor--magic-admin {
|
|
20
|
+
// 主题级 CSS 变量入口:想覆盖 nav 高度等 token 时,改这里一行即可;
|
|
21
|
+
// 走 CSS 级联,运行时切主题(换 `.m-editor--magic-admin` class)即可即时生效,
|
|
22
|
+
// 不受 SCSS `@use` 加载顺序限制。fallback 值定义在 common/var.scss,未启用主题
|
|
23
|
+
// 时自动回落 35px。
|
|
24
|
+
--editor-nav-height: 40px;
|
|
25
|
+
|
|
26
|
+
.m-editor-sidebar {
|
|
27
|
+
.m-editor-sidebar-header {
|
|
28
|
+
// padding: 8px 0;
|
|
29
|
+
width: 61px;
|
|
30
|
+
padding-top: 4px;
|
|
31
|
+
// sidebar 父容器是 `display: flex` (row),同级 `.m-editor-sidebar-content` 的 width
|
|
32
|
+
// 是 `calc(100% - 40px)`(sidebar.scss:52,40 是老 header 宽度)。当 header 改成 61px
|
|
33
|
+
// 后,两者之和会溢出 21px 左右,默认 `flex-shrink: 1` 会按权重压缩 header,最终渲染
|
|
34
|
+
// 出 56.3px 而非 61px。这里强制 `flex-shrink: 0` 让 header 守住宽度,多余的部分由
|
|
35
|
+
// content 侧承担(content 的 `100% - 40` 会自然让出)。
|
|
36
|
+
flex-shrink: 0;
|
|
37
|
+
border-right: 1px solid rgba(0, 84, 225, 0.1);
|
|
38
|
+
display: flex;
|
|
39
|
+
background-color: #fff;
|
|
40
|
+
box-sizing: border-box;
|
|
41
|
+
flex-direction: column;
|
|
42
|
+
align-items: center;
|
|
43
|
+
.m-editor-sidebar-header-item {
|
|
44
|
+
display: flex;
|
|
45
|
+
flex-direction: column;
|
|
46
|
+
align-items: center;
|
|
47
|
+
border-radius: 4px;
|
|
48
|
+
padding: 4px 2px;
|
|
49
|
+
width: 52px;
|
|
50
|
+
margin-bottom: 4px;
|
|
51
|
+
box-sizing: border-box;
|
|
52
|
+
background-color: transparent;
|
|
53
|
+
color: #84909d;
|
|
54
|
+
&:hover {
|
|
55
|
+
background-color: rgba(0, 0, 0, 0.05);
|
|
56
|
+
}
|
|
57
|
+
> i {
|
|
58
|
+
color: #84909d;
|
|
59
|
+
font-size: 20px;
|
|
60
|
+
}
|
|
61
|
+
&.is-active {
|
|
62
|
+
background-color: var(--el-button-hover-bg-color, rgb(230, 238, 253));
|
|
63
|
+
color: var(--el-color-primary);
|
|
64
|
+
&:hover {
|
|
65
|
+
background-color: var(
|
|
66
|
+
--el-button-hover-bg-color,
|
|
67
|
+
rgb(230, 238, 253)
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
> i {
|
|
71
|
+
color: var(--el-color-primary);
|
|
72
|
+
}
|
|
73
|
+
.magic-editor-tab-panel-title {
|
|
74
|
+
color: var(--el-color-primary);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
.magic-editor-tab-panel-title {
|
|
78
|
+
font-size: 12px;
|
|
79
|
+
line-height: 14px;
|
|
80
|
+
font-weight: 400;
|
|
81
|
+
margin: 0 4px;
|
|
82
|
+
width: 52px;
|
|
83
|
+
text-align: center;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
.m-editor-sidebar-content {
|
|
88
|
+
width: calc(100% - 61px);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
.m-editor-props-panel .el-input__wrapper {
|
|
92
|
+
border-radius: 4px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.border-box-container .border-icon-container .border-icon {
|
|
96
|
+
border-color: #ccc;
|
|
97
|
+
--unuse-border-style: solid;
|
|
98
|
+
&.configured {
|
|
99
|
+
border-color: var(--el-color-success, var(--td-success-color, #2ba471));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
&.active {
|
|
103
|
+
border-color: var(--el-color-primary);
|
|
104
|
+
background-color: rgba(0, 84, 225, 0.1);
|
|
105
|
+
&.center {
|
|
106
|
+
border-width: 2px;
|
|
107
|
+
}
|
|
108
|
+
// 命中 `.border-icon-<side>` 时只保留该侧 2px,其余三边清零。
|
|
109
|
+
// 用 `@each` 循环避免四面手抄;后续要加禁用、hover 等状态也可以照搬这套结构。
|
|
110
|
+
@each $side in (top, right, bottom, left) {
|
|
111
|
+
&.border-icon-#{$side} {
|
|
112
|
+
border-width: 0;
|
|
113
|
+
border-#{$side}-width: 2px;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
&.center {
|
|
119
|
+
border-width: 2px;
|
|
120
|
+
}
|
|
121
|
+
border-radius: 2px;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.m-container-code-select {
|
|
125
|
+
> .el-form-item:first-child {
|
|
126
|
+
> .el-form-item__label:first-child > :not(.m-form-tip) {
|
|
127
|
+
color: #111;
|
|
128
|
+
font-weight: 500;
|
|
129
|
+
font-size: 16px;
|
|
130
|
+
line-height: 24px;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.m-editor.m-theme--magic-admin {
|
|
137
|
+
.m-editor-props-form-panel-form {
|
|
138
|
+
> .m-container-tab {
|
|
139
|
+
> .tmagic-design-tabs {
|
|
140
|
+
> .el-tabs__content {
|
|
141
|
+
background-color: #fafafa;
|
|
142
|
+
border-radius: 8px;
|
|
143
|
+
padding-left: 16px;
|
|
144
|
+
padding-right: 16px;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.m-editor.m-theme--magic-admin {
|
|
152
|
+
.m-fields-style-setter {
|
|
153
|
+
border: 0;
|
|
154
|
+
.tmagic-design-collapse-item {
|
|
155
|
+
.el-collapse-item__wrap {
|
|
156
|
+
padding: 16px;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.m-editor.m-theme--magic-admin {
|
|
163
|
+
.magic-right-panel-tabs-top {
|
|
164
|
+
> .el-tabs {
|
|
165
|
+
> .el-tabs__header {
|
|
166
|
+
.el-tabs__nav-wrap.is-top {
|
|
167
|
+
.el-tabs__nav.is-top {
|
|
168
|
+
.el-tabs__active-bar {
|
|
169
|
+
display: none;
|
|
170
|
+
}
|
|
171
|
+
.el-tabs__item {
|
|
172
|
+
&:not(:last-child)::after {
|
|
173
|
+
content: "";
|
|
174
|
+
position: absolute;
|
|
175
|
+
right: 0;
|
|
176
|
+
top: 50%;
|
|
177
|
+
transform: translateY(-50%);
|
|
178
|
+
height: 12px;
|
|
179
|
+
border-right: 1px solid #e6e6e6;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
&::after {
|
|
184
|
+
display: none;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
.m-editor.m-theme--magic-admin {
|
|
193
|
+
.m-editor-nav-menu {
|
|
194
|
+
.menu-right,
|
|
195
|
+
.menu-left {
|
|
196
|
+
> .menu-item {
|
|
197
|
+
> button {
|
|
198
|
+
color: #111;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
.menu-item {
|
|
203
|
+
margin-right: 8px;
|
|
204
|
+
.el-button--small {
|
|
205
|
+
font-size: 14px;
|
|
206
|
+
}
|
|
207
|
+
> button {
|
|
208
|
+
> i {
|
|
209
|
+
font-size: 16px;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
package/src/theme/ui-select.scss
CHANGED
package/src/type.ts
CHANGED
|
@@ -140,6 +140,7 @@ export type BeforeAdd = (config: MNode, parent: MContainer) => Promise<MNode> |
|
|
|
140
140
|
export type GetConfig = (config: FormConfig) => Promise<FormConfig> | FormConfig;
|
|
141
141
|
|
|
142
142
|
export interface EditorInstallOptions {
|
|
143
|
+
flat?: boolean;
|
|
143
144
|
parseDSL: <T = any>(dsl: string) => T;
|
|
144
145
|
customCreateMonacoEditor: (
|
|
145
146
|
monaco: typeof import('monaco-editor'),
|
|
@@ -566,6 +567,58 @@ export interface CompareFormLoadConfigContext {
|
|
|
566
567
|
* 可通过 `ctx.defaultLoadConfig()` 复用默认结果再做二次加工。
|
|
567
568
|
*/
|
|
568
569
|
export type CompareFormLoadConfig = (ctx: CompareFormLoadConfigContext) => FormConfig | Promise<FormConfig>;
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* CompareForm / ViewForm 共用的基础 props。
|
|
573
|
+
* 两者都基于同一套「按 category 加载 FormConfig + 注入 services/stage」的逻辑(见 useCompareForm),
|
|
574
|
+
* 差异仅在于是否做新旧值对比。这里抽出公共字段避免重复定义。
|
|
575
|
+
*/
|
|
576
|
+
export interface CompareFormBaseProps {
|
|
577
|
+
/** 当前值(对比场景下为修改后的值) */
|
|
578
|
+
value: Partial<MNode> | Partial<DataSourceSchema> | Partial<CodeBlockContent> | Record<string, any>;
|
|
579
|
+
/**
|
|
580
|
+
* 类型说明:
|
|
581
|
+
* - `category` 为 `node` 时,`type` 为节点组件的类型,例如 'text'、'button'、'page'、'container' 等
|
|
582
|
+
* - `category` 为 `data-source` 时,`type` 为数据源类型,例如 'base'、'http'
|
|
583
|
+
* - `category` 为 `code-block` 时,`type` 可不传
|
|
584
|
+
*/
|
|
585
|
+
type?: string;
|
|
586
|
+
/** 表单配置类别,决定从哪里取 FormConfig */
|
|
587
|
+
category?: CompareCategory;
|
|
588
|
+
/** 数据源代码块场景下的数据源类型(base/http),用于代码块表单中"执行时机"展示 */
|
|
589
|
+
dataSourceType?: string;
|
|
590
|
+
labelWidth?: string;
|
|
591
|
+
/**
|
|
592
|
+
* 外层容器高度。设置后表单内容超出时会在组件内部出现滚动条,
|
|
593
|
+
* 避免 dialog / 面板使用方需要自行处理滚动。可传任意 CSS 长度,例如 `60vh` / `400px` / `100%`。
|
|
594
|
+
*/
|
|
595
|
+
height?: string;
|
|
596
|
+
/**
|
|
597
|
+
* 用户自定义注入到 MForm.formState 的扩展字段,与 Editor 顶层的 `extendFormState`、
|
|
598
|
+
* PropsPanel 的 `extend-state` 语义一致。表单 item 的 `display` / `disabled` 等
|
|
599
|
+
* filterFunction 经常依赖这里注入的字段(如 stage、自定义业务上下文等),
|
|
600
|
+
* 因此在对比 / 展示场景下也需要透传,避免出现 `formState.xxx is undefined` 的运行时错误。
|
|
601
|
+
*/
|
|
602
|
+
extendState?: (_state: FormState) => Record<string, any> | Promise<Record<string, any>>;
|
|
603
|
+
/**
|
|
604
|
+
* 外部透传的基础 formState(通常来自 PropsPanel 主属性表单)。
|
|
605
|
+
* 组件会提取其中的扩展字段覆盖到自己的 formState,保证 filterFunction 上下文一致。
|
|
606
|
+
*/
|
|
607
|
+
baseFormState?: FormState;
|
|
608
|
+
/**
|
|
609
|
+
* 表单内组件的尺寸(透传给 MForm 的 `size`),可选 'large' | 'default' | 'small'。
|
|
610
|
+
* 缺省时使用 MForm 内置默认尺寸。
|
|
611
|
+
*/
|
|
612
|
+
size?: FieldSize;
|
|
613
|
+
/**
|
|
614
|
+
* 自定义 FormConfig 加载逻辑。传入后将接管内置的按 `category`(node/data-source/code-block)
|
|
615
|
+
* 取配置逻辑,调用方可根据业务自行返回(或异步返回)表单配置。可通过
|
|
616
|
+
* `ctx.defaultLoadConfig()` 复用默认结果再做二次加工。
|
|
617
|
+
*/
|
|
618
|
+
loadConfig?: CompareFormLoadConfig;
|
|
619
|
+
/** 编辑器服务集合,由调用方传入(不再通过 inject('services') 获取)。 */
|
|
620
|
+
services?: Services;
|
|
621
|
+
}
|
|
569
622
|
// #endregion CompareForm
|
|
570
623
|
|
|
571
624
|
// #region SideItemKey
|
|
@@ -1286,17 +1339,37 @@ export interface EditorUpdateChangeItem {
|
|
|
1286
1339
|
page: StoreState['page'];
|
|
1287
1340
|
}
|
|
1288
1341
|
|
|
1342
|
+
/** {@link EditorEvents.change} 各操作类型共有的历史相关字段。 */
|
|
1343
|
+
export interface EditorChangeEventHistoryMeta {
|
|
1344
|
+
/**
|
|
1345
|
+
* 本次变更的「历史来源」(调用 DSL 操作时传入的 {@link HistoryOpOptions.historySource},
|
|
1346
|
+
* 撤销 / 重做时则为被应用 step 上记录的 `source`),未携带时为 undefined。
|
|
1347
|
+
*/
|
|
1348
|
+
historySource?: HistoryOpSource;
|
|
1349
|
+
/**
|
|
1350
|
+
* 本次操作是否未写入历史记录(即调用时传入的 {@link HistoryOpOptions.doNotPushHistory},缺省为 false);
|
|
1351
|
+
* 撤销 / 重做路径补发的事件恒为 true(撤销/重做本身不再入栈)。
|
|
1352
|
+
*/
|
|
1353
|
+
doNotPushHistory?: boolean;
|
|
1354
|
+
}
|
|
1355
|
+
|
|
1289
1356
|
/**
|
|
1290
1357
|
* {@link EditorEvents.change} 的回调参数:以 `type` 区分操作类型,并携带对应的操作内容。
|
|
1291
1358
|
* `data` 为本次变更的节点列表,每项包含 node 及其所属的 page(可能为 null);
|
|
1292
|
-
* `move-layer` 额外带层级偏移 `offset`,`drag-to` 额外带目标位置 `targetIndex` / `targetParent
|
|
1359
|
+
* `move-layer` 额外带层级偏移 `offset`,`drag-to` 额外带目标位置 `targetIndex` / `targetParent`;
|
|
1360
|
+
* 历史相关字段(historySource / doNotPushHistory)见 {@link EditorChangeEventHistoryMeta}。
|
|
1293
1361
|
*/
|
|
1294
1362
|
export type EditorChangeEvent =
|
|
1295
|
-
| { type: 'add'; data: EditorChangeItem[] }
|
|
1296
|
-
| { type: 'remove'; data: EditorChangeItem[] }
|
|
1297
|
-
| { type: 'update'; data: EditorUpdateChangeItem[] }
|
|
1298
|
-
| { type: 'move-layer'; data: EditorChangeItem[]; offset: number | LayerOffset }
|
|
1299
|
-
| {
|
|
1363
|
+
| ({ type: 'add'; data: EditorChangeItem[] } & EditorChangeEventHistoryMeta)
|
|
1364
|
+
| ({ type: 'remove'; data: EditorChangeItem[] } & EditorChangeEventHistoryMeta)
|
|
1365
|
+
| ({ type: 'update'; data: EditorUpdateChangeItem[] } & EditorChangeEventHistoryMeta)
|
|
1366
|
+
| ({ type: 'move-layer'; data: EditorChangeItem[]; offset: number | LayerOffset } & EditorChangeEventHistoryMeta)
|
|
1367
|
+
| ({
|
|
1368
|
+
type: 'drag-to';
|
|
1369
|
+
data: EditorChangeItem[];
|
|
1370
|
+
targetIndex: number;
|
|
1371
|
+
targetParent: MContainer;
|
|
1372
|
+
} & EditorChangeEventHistoryMeta);
|
|
1300
1373
|
// #endregion EditorChangeEvent
|
|
1301
1374
|
|
|
1302
1375
|
export interface HistoryEvents {
|
package/src/utils/config.ts
CHANGED
|
@@ -16,14 +16,22 @@
|
|
|
16
16
|
* limitations under the License.
|
|
17
17
|
*/
|
|
18
18
|
|
|
19
|
+
import { ref } from 'vue';
|
|
20
|
+
|
|
19
21
|
import { EditorInstallOptions } from '@editor/type';
|
|
20
22
|
|
|
21
23
|
let $TMAGIC_EDITOR: EditorInstallOptions = {} as any;
|
|
22
24
|
|
|
25
|
+
// 用 ref 持有 flat 全局开关:const 引用本身不可变,符合 `import/no-mutable-exports`;
|
|
26
|
+
// 通过 `.value` 改值仍保持模块级响应式语义,与 editor/plugin.ts、design/index.ts 里
|
|
27
|
+
// 的同名变量写法对齐。
|
|
28
|
+
const isGlobalFlat = ref(false);
|
|
29
|
+
|
|
23
30
|
const setEditorConfig = (option: EditorInstallOptions): void => {
|
|
24
31
|
$TMAGIC_EDITOR = option;
|
|
32
|
+
isGlobalFlat.value = option.flat ?? false;
|
|
25
33
|
};
|
|
26
34
|
|
|
27
35
|
const getEditorConfig = <K extends keyof EditorInstallOptions>(key: K): EditorInstallOptions[K] => $TMAGIC_EDITOR[key];
|
|
28
36
|
|
|
29
|
-
export { getEditorConfig, setEditorConfig };
|
|
37
|
+
export { getEditorConfig, isGlobalFlat, setEditorConfig };
|
package/src/utils/const.ts
CHANGED
|
@@ -5,10 +5,11 @@ export const LEFT_COLUMN_WIDTH_STORAGE_KEY = '$MagicEditorLeftColumnWidthData';
|
|
|
5
5
|
export const RIGHT_COLUMN_WIDTH_STORAGE_KEY = '$MagicEditorRightColumnWidthData';
|
|
6
6
|
export const PROPS_PANEL_WIDTH_STORAGE_KEY = '$MagicEditorPropsPanelWidthData';
|
|
7
7
|
|
|
8
|
-
export const DEFAULT_LEFT_COLUMN_WIDTH =
|
|
8
|
+
export const DEFAULT_LEFT_COLUMN_WIDTH = 345;
|
|
9
9
|
export const DEFAULT_RIGHT_COLUMN_WIDTH = 480;
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
// 2026-06-11 设计稿修改,固定左侧栏存在时最小宽度为 345
|
|
12
|
+
export const MIN_LEFT_COLUMN_WIDTH = 345;
|
|
12
13
|
export const MIN_CENTER_COLUMN_WIDTH = 400;
|
|
13
14
|
export const MIN_RIGHT_COLUMN_WIDTH = 300;
|
|
14
15
|
|
package/src/utils/props.ts
CHANGED
|
@@ -180,6 +180,7 @@ export const advancedTabConfig: TabPaneConfig = {
|
|
|
180
180
|
name: NODE_DISABLE_CODE_BLOCK_KEY,
|
|
181
181
|
text: '禁用代码块',
|
|
182
182
|
type: 'switch',
|
|
183
|
+
labelPosition: 'left',
|
|
183
184
|
defaultValue: false,
|
|
184
185
|
extra: '开启后,配置的代码块将不会被执行',
|
|
185
186
|
},
|
|
@@ -187,15 +188,16 @@ export const advancedTabConfig: TabPaneConfig = {
|
|
|
187
188
|
name: NODE_DISABLE_DATA_SOURCE_KEY,
|
|
188
189
|
text: '禁用数据源',
|
|
189
190
|
type: 'switch',
|
|
191
|
+
labelPosition: 'left',
|
|
190
192
|
defaultValue: false,
|
|
191
193
|
extra: '开启后,组件内配置的数据源相关配置将不会被编译,显隐条件将失效',
|
|
192
194
|
},
|
|
193
195
|
{
|
|
194
196
|
name: 'created',
|
|
195
|
-
text: '
|
|
197
|
+
text: 'Created',
|
|
196
198
|
labelPosition: 'top',
|
|
197
199
|
type: 'code-select',
|
|
198
|
-
|
|
200
|
+
titleExtra: '组件初始化时执行',
|
|
199
201
|
rules: [
|
|
200
202
|
{ typeMatch: true, trigger: 'change' },
|
|
201
203
|
{
|
|
@@ -210,10 +212,10 @@ export const advancedTabConfig: TabPaneConfig = {
|
|
|
210
212
|
},
|
|
211
213
|
{
|
|
212
214
|
name: 'mounted',
|
|
213
|
-
text: '
|
|
215
|
+
text: 'Mounted',
|
|
214
216
|
labelPosition: 'top',
|
|
215
217
|
type: 'code-select',
|
|
216
|
-
|
|
218
|
+
titleExtra: '组件挂载到dom时执行',
|
|
217
219
|
rules: [
|
|
218
220
|
{ typeMatch: true, trigger: 'change' },
|
|
219
221
|
{
|
|
@@ -228,8 +230,8 @@ export const advancedTabConfig: TabPaneConfig = {
|
|
|
228
230
|
},
|
|
229
231
|
{
|
|
230
232
|
name: 'display',
|
|
231
|
-
text: '
|
|
232
|
-
|
|
233
|
+
text: 'Display',
|
|
234
|
+
titleExtra: '控制组件是否渲染,关系的代码块返回值为false时不渲染',
|
|
233
235
|
labelPosition: 'top',
|
|
234
236
|
type: 'code-select',
|
|
235
237
|
rules: [
|
|
@@ -263,10 +265,17 @@ export const displayTabConfig: TabPaneConfig<DisplayCondsConfig> = {
|
|
|
263
265
|
extra: (_state, { model }) =>
|
|
264
266
|
`条件成立时${model[NODE_CONDS_RESULT_KEY] ? '隐藏' : '显示'},不成立时${model[NODE_CONDS_RESULT_KEY] ? '显示' : '隐藏'};<br />同一条件组内的所有条件配置同时成立时表示该条件组成立,任意一个条件组成立时表示条件成立(条件组内为且的关系,条件组间为或的关系);<br />条件为空时表示成立;`,
|
|
265
267
|
},
|
|
268
|
+
{
|
|
269
|
+
text: '条件组配置',
|
|
270
|
+
static: true,
|
|
271
|
+
className: 'display-conds-title',
|
|
272
|
+
},
|
|
266
273
|
{
|
|
267
274
|
type: 'display-conds',
|
|
268
275
|
name: NODE_CONDS_KEY,
|
|
269
276
|
titlePrefix: '条件组',
|
|
277
|
+
fixed: 'right',
|
|
278
|
+
operateColWidth: 112,
|
|
270
279
|
defaultValue: [],
|
|
271
280
|
rules: [{ typeMatch: true }],
|
|
272
281
|
},
|
|
@@ -303,10 +312,13 @@ export const fillConfig = (
|
|
|
303
312
|
name: 'id',
|
|
304
313
|
text: 'ID',
|
|
305
314
|
type: 'text',
|
|
306
|
-
disabled
|
|
315
|
+
// 走纯文本渲染,避免出现 disabled 的灰底输入框;append 仍正常显示。
|
|
316
|
+
static: true,
|
|
317
|
+
|
|
307
318
|
append: {
|
|
308
|
-
type: '
|
|
309
|
-
text: '
|
|
319
|
+
type: 'icon',
|
|
320
|
+
text: 'https://vip.image.video.qpic.cn/vupload/20260615/36cf7e1781493669935.svg',
|
|
321
|
+
extra: '复制',
|
|
310
322
|
handler: (vm, { model }) => {
|
|
311
323
|
navigator.clipboard
|
|
312
324
|
.writeText(`${model.id}`)
|
|
@@ -339,6 +351,7 @@ export const fillConfig = (
|
|
|
339
351
|
const tabConfig: TabConfig = {
|
|
340
352
|
type: 'tab',
|
|
341
353
|
labelWidth,
|
|
354
|
+
className: 'magic-right-panel-tabs-top',
|
|
342
355
|
items: [
|
|
343
356
|
{
|
|
344
357
|
title: '属性',
|
|
@@ -362,6 +375,35 @@ export const fillConfig = (
|
|
|
362
375
|
return [tabConfig];
|
|
363
376
|
};
|
|
364
377
|
|
|
378
|
+
/**
|
|
379
|
+
* 将属性表单配置中「样式」tab-pane 的 `display` 强制置为 `true`。
|
|
380
|
+
*
|
|
381
|
+
* `propsService.getPropsConfig` 返回的样式 tab 默认带有
|
|
382
|
+
* `display: ({ services }) => !(services?.uiService?.get('showStylePanel') ?? true)`,
|
|
383
|
+
* 在对比 / 只读展示场景(CompareForm / ViewForm)下并不需要跟随 uiService 状态隐藏,
|
|
384
|
+
* 这里统一放开,保证样式 tab 始终可见。
|
|
385
|
+
*
|
|
386
|
+
* @param formConfig 组件属性表单配置
|
|
387
|
+
* @returns 处理后的表单配置(不修改入参,返回浅拷贝)
|
|
388
|
+
*/
|
|
389
|
+
export const removeStyleDisplayConfig = (formConfig: FormConfig): FormConfig =>
|
|
390
|
+
formConfig.map((item) => {
|
|
391
|
+
if (!('type' in item)) return item;
|
|
392
|
+
if (item?.type !== 'tab' || !Array.isArray(item.items)) return item;
|
|
393
|
+
|
|
394
|
+
return {
|
|
395
|
+
...item,
|
|
396
|
+
items: item.items.map((tabPane) => {
|
|
397
|
+
if (tabPane?.title !== '样式' || !Array.isArray(tabPane.items)) return tabPane;
|
|
398
|
+
|
|
399
|
+
return {
|
|
400
|
+
...tabPane,
|
|
401
|
+
display: true,
|
|
402
|
+
};
|
|
403
|
+
}),
|
|
404
|
+
};
|
|
405
|
+
});
|
|
406
|
+
|
|
365
407
|
// #region ValidatePropsFormOptions
|
|
366
408
|
/**
|
|
367
409
|
* validatePropsForm 参数
|