@tmagic/editor 1.6.0 → 1.7.0-beta.0

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/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.6.0",
2
+ "version": "1.7.0-beta.0",
3
3
  "name": "@tmagic/editor",
4
4
  "type": "module",
5
5
  "sideEffects": [
@@ -58,11 +58,11 @@
58
58
  "moveable": "^0.53.0",
59
59
  "serialize-javascript": "^6.0.2",
60
60
  "sortablejs": "^1.15.6",
61
- "@tmagic/design": "1.6.0",
62
- "@tmagic/form": "1.6.0",
63
- "@tmagic/stage": "1.6.0",
64
- "@tmagic/utils": "1.6.0",
65
- "@tmagic/table": "1.6.0"
61
+ "@tmagic/design": "1.7.0-beta.0",
62
+ "@tmagic/form": "1.7.0-beta.0",
63
+ "@tmagic/utils": "1.7.0-beta.0",
64
+ "@tmagic/stage": "1.7.0-beta.0",
65
+ "@tmagic/table": "1.7.0-beta.0"
66
66
  },
67
67
  "devDependencies": {
68
68
  "@types/events": "^3.0.3",
@@ -74,9 +74,9 @@
74
74
  },
75
75
  "peerDependencies": {
76
76
  "monaco-editor": "^0.48.0",
77
- "typescript": "^5.9.2",
78
- "vue": "^3.5.20",
79
- "@tmagic/core": "1.6.0"
77
+ "typescript": "^5.9.3",
78
+ "vue": "^3.5.22",
79
+ "@tmagic/core": "1.7.0-beta.0"
80
80
  },
81
81
  "peerDependenciesMeta": {
82
82
  "typescript": {
@@ -12,13 +12,20 @@
12
12
 
13
13
  <template v-else-if="data.type === 'button'">
14
14
  <TMagicTooltip v-if="data.tooltip" effect="dark" placement="bottom-start" :content="data.tooltip">
15
- <TMagicButton size="small" link :disabled="disabled"
16
- ><MIcon v-if="data.icon" :icon="data.icon"></MIcon><span>{{ data.text }}</span></TMagicButton
17
- >
15
+ <TMagicButton size="small" link :disabled="disabled">
16
+ <template #icon v-if="data.icon">
17
+ <MIcon :icon="data.icon"></MIcon>
18
+ </template>
19
+ <template #default v-if="data.text">{{ data.text }}</template>
20
+ </TMagicButton>
18
21
  </TMagicTooltip>
19
- <TMagicButton v-else size="small" link :disabled="disabled" :title="data.text"
20
- ><MIcon v-if="data.icon" :icon="data.icon"></MIcon><span>{{ data.text }}</span></TMagicButton
21
- >
22
+
23
+ <TMagicButton v-else size="small" link :disabled="disabled" :title="data.text">
24
+ <template #icon v-if="data.icon">
25
+ <MIcon :icon="data.icon"></MIcon>
26
+ </template>
27
+ <template #default v-if="data.text">{{ data.text }}</template>
28
+ </TMagicButton>
22
29
  </template>
23
30
 
24
31
  <TMagicDropdown
@@ -32,7 +32,6 @@
32
32
  content="选择数据源"
33
33
  >
34
34
  <TMagicButton
35
- style="margin-left: 5px"
36
35
  :type="showDataSourceFieldSelect ? 'primary' : 'default'"
37
36
  :size="size"
38
37
  @click="showDataSourceFieldSelect = !showDataSourceFieldSelect"
@@ -55,7 +55,7 @@ const config = computed<GroupListConfig>(() => ({
55
55
  {
56
56
  type: 'table',
57
57
  name: 'cond',
58
- operateColWidth: 100,
58
+ operateColWidth: 80,
59
59
  enableToggleMode: false,
60
60
  items: [
61
61
  parentFields.value.length
@@ -93,7 +93,7 @@ const config = computed<GroupListConfig>(() => ({
93
93
  type: 'cond-op-select',
94
94
  parentFields: parentFields.value,
95
95
  label: '条件',
96
- width: 160,
96
+ width: 140,
97
97
  name: 'op',
98
98
  },
99
99
  {
@@ -1,14 +1,19 @@
1
1
  <template>
2
- <div class="m-fields-style-setter">
3
- <TMagicCollapse :model-value="collapseValue">
4
- <template v-for="(item, index) in list" :key="index">
5
- <TMagicCollapseItem :name="`${index}`">
6
- <template #title><MIcon :icon="Grid"></MIcon>{{ item.title }}</template>
7
- <component v-if="item.component" :is="item.component" :values="model[name]" @change="change"></component>
8
- </TMagicCollapseItem>
9
- </template>
10
- </TMagicCollapse>
11
- </div>
2
+ <TMagicCollapse class="m-fields-style-setter" v-model="collapseValue">
3
+ <template v-for="(item, index) in list" :key="index">
4
+ <TMagicCollapseItem :name="`${index}`">
5
+ <template #title><MIcon :icon="Grid"></MIcon>{{ item.title }}</template>
6
+ <component
7
+ v-if="item.component"
8
+ :is="item.component"
9
+ :values="model[name]"
10
+ :size="size"
11
+ :disabled="disabled"
12
+ @change="change"
13
+ ></component>
14
+ </TMagicCollapseItem>
15
+ </template>
16
+ </TMagicCollapse>
12
17
  </template>
13
18
 
14
19
  <script setup lang="ts">
@@ -6,13 +6,21 @@
6
6
  :key="index"
7
7
  link
8
8
  :class="model[name] === item.value && 'btn-active'"
9
+ :disabled="disabled"
9
10
  @click="changeHandler(item.value)"
10
11
  >
11
12
  <div :class="['position-icon', item.class, model[name] === item.value && 'active']"></div>
12
13
  </TMagicButton>
13
14
  </div>
14
15
  <div class="custom-value">
15
- <TMagicInput v-model="model[name]" size="small" placeholder="自定义背景位置" clearable @change="changeHandler">
16
+ <TMagicInput
17
+ v-model="model[name]"
18
+ placeholder="自定义背景位置"
19
+ clearable
20
+ :size="size"
21
+ :disabled="disabled"
22
+ @change="changeHandler"
23
+ >
16
24
  </TMagicInput>
17
25
  </div>
18
26
  </div>
@@ -30,7 +30,7 @@
30
30
  </div>
31
31
  </div>
32
32
  <div class="border-value-container">
33
- <MContainer :config="config" :model="model" @change="change"></MContainer>
33
+ <MContainer :config="config" :model="model" :size="size" :disabled="disabled" @change="change"></MContainer>
34
34
  </div>
35
35
  </div>
36
36
  </template>
@@ -67,7 +67,6 @@ const config = computed(() => ({
67
67
  {
68
68
  name: `border${direction.value}Style`,
69
69
  text: '边框样式',
70
-
71
70
  labelWidth: '68px',
72
71
  type: 'data-source-field-select',
73
72
  fieldConfig: {
@@ -90,6 +89,8 @@ const emit = defineEmits<{
90
89
  withDefaults(
91
90
  defineProps<{
92
91
  model: FormValue;
92
+ disabled?: boolean;
93
+ size?: 'large' | 'default' | 'small';
93
94
  }>(),
94
95
  {},
95
96
  );
@@ -4,10 +4,11 @@
4
4
  <span class="help-txt" v-if="item.text">{{ item.text }}</span>
5
5
  <span class="next-input">
6
6
  <input
7
- v-model="model[item.name]"
7
+ :model-value="model[item.name]"
8
+ placeholder="0"
8
9
  :title="model[item.name]"
10
+ :disabled="disabled"
9
11
  @change="change($event, item.name)"
10
- placeholder="0"
11
12
  />
12
13
  </span>
13
14
  </div>
@@ -60,6 +61,8 @@ const emit = defineEmits<{
60
61
 
61
62
  withDefaults(
62
63
  defineProps<{
64
+ disabled?: boolean;
65
+ size?: 'large' | 'default' | 'small';
63
66
  model: FormValue;
64
67
  }>(),
65
68
  {},
@@ -3,10 +3,11 @@
3
3
  <div v-for="(item, index) in list" :key="index" :class="item.class">
4
4
  <span class="next-input">
5
5
  <input
6
- v-model="model[item.name]"
6
+ :model-value="model[item.name]"
7
+ placeholder="0"
7
8
  :title="model[item.name]"
9
+ :disabled="disabled"
8
10
  @change="change($event, item.name)"
9
- placeholder="0"
10
11
  />
11
12
  </span>
12
13
  </div>
@@ -42,6 +43,8 @@ const emit = defineEmits<{
42
43
  withDefaults(
43
44
  defineProps<{
44
45
  model: FormValue;
46
+ disabled?: boolean;
47
+ size?: 'large' | 'default' | 'small';
45
48
  }>(),
46
49
  {},
47
50
  );
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" @change="change"></MContainer>
2
+ <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
3
3
  </template>
4
4
 
5
5
  <script lang="ts" setup>
@@ -11,7 +11,11 @@ import type { StyleSchema } from '@tmagic/schema';
11
11
  import BackgroundPosition from '../components/BackgroundPosition.vue';
12
12
  import { BackgroundNoRepeat, BackgroundRepeat, BackgroundRepeatX, BackgroundRepeatY } from '../icons/background-repeat';
13
13
 
14
- defineProps<{ values: Partial<StyleSchema> }>();
14
+ defineProps<{
15
+ values: Partial<StyleSchema>;
16
+ disabled?: boolean;
17
+ size?: 'large' | 'default' | 'small';
18
+ }>();
15
19
 
16
20
  const emit = defineEmits<{
17
21
  change: [v: StyleSchema, eventData: ContainerChangeEventData];
@@ -1,6 +1,6 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" @change="change"></MContainer>
3
- <Border :model="values" @change="change"></Border>
2
+ <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
3
+ <Border :model="values" :size="size" :disabled="disabled" @change="change"></Border>
4
4
  </template>
5
5
 
6
6
  <script lang="ts" setup>
@@ -9,7 +9,11 @@ import type { StyleSchema } from '@tmagic/schema';
9
9
 
10
10
  import Border from '../components/Border.vue';
11
11
 
12
- defineProps<{ values: Partial<StyleSchema> }>();
12
+ defineProps<{
13
+ values: Partial<StyleSchema>;
14
+ disabled?: boolean;
15
+ size?: 'large' | 'default' | 'small';
16
+ }>();
13
17
 
14
18
  const emit = defineEmits<{
15
19
  change: [v: StyleSchema, eventData: ContainerChangeEventData];
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" @change="change"></MContainer>
2
+ <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
3
3
  </template>
4
4
 
5
5
  <script lang="ts" setup>
@@ -10,7 +10,11 @@ import type { StyleSchema } from '@tmagic/schema';
10
10
 
11
11
  import { AlignCenter, AlignLeft, AlignRight } from '../icons/text-align';
12
12
 
13
- defineProps<{ values: Partial<StyleSchema> }>();
13
+ defineProps<{
14
+ values: Partial<StyleSchema>;
15
+ disabled?: boolean;
16
+ size?: 'large' | 'default' | 'small';
17
+ }>();
14
18
 
15
19
  const emit = defineEmits<{
16
20
  change: [v: StyleSchema, eventData: ContainerChangeEventData];
@@ -1,6 +1,12 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" @change="change"></MContainer>
3
- <Box v-show="!['fixed', 'absolute'].includes(values.position)" :model="values" @change="change"></Box>
2
+ <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
3
+ <Box
4
+ v-show="!['fixed', 'absolute'].includes(values.position)"
5
+ :model="values"
6
+ :size="size"
7
+ :disabled="disabled"
8
+ @change="change"
9
+ ></Box>
4
10
  </template>
5
11
 
6
12
  <script lang="ts" setup>
@@ -28,6 +34,8 @@ import {
28
34
 
29
35
  defineProps<{
30
36
  values: Partial<StyleSchema>;
37
+ disabled?: boolean;
38
+ size?: 'large' | 'default' | 'small';
31
39
  }>();
32
40
 
33
41
  const emit = defineEmits<{
@@ -1,12 +1,16 @@
1
1
  <template>
2
- <MContainer :config="config" :model="values" @change="change"></MContainer>
2
+ <MContainer :config="config" :model="values" :size="size" :disabled="disabled" @change="change"></MContainer>
3
3
  </template>
4
4
 
5
5
  <script lang="ts" setup>
6
6
  import { ContainerChangeEventData, MContainer } from '@tmagic/form';
7
7
  import type { StyleSchema } from '@tmagic/schema';
8
8
 
9
- const props = defineProps<{ values: Partial<StyleSchema> }>();
9
+ const props = defineProps<{
10
+ values: Partial<StyleSchema>;
11
+ disabled?: boolean;
12
+ size?: 'large' | 'default' | 'small';
13
+ }>();
10
14
 
11
15
  const emit = defineEmits<{
12
16
  change: [v: string | StyleSchema, eventData: ContainerChangeEventData];
@@ -11,19 +11,21 @@
11
11
  :width="160"
12
12
  :destroy-on-close="true"
13
13
  >
14
- <div>
15
- <slot name="page-list-popover" :list="list">
16
- <ToolButton
17
- v-for="(item, index) in list"
18
- :data="{
19
- type: 'button',
20
- text: item.devconfig?.tabName || item.name || item.id,
21
- className: item.id === page?.id ? 'active' : '',
22
- handler: () => switchPage(item.id),
23
- }"
24
- :key="index"
25
- ></ToolButton>
26
- </slot>
14
+ <div class="page-bar-popover-wrapper">
15
+ <div class="page-bar-popover-inner">
16
+ <slot name="page-list-popover" :list="list">
17
+ <ToolButton
18
+ v-for="(item, index) in list"
19
+ :data="{
20
+ type: 'button',
21
+ text: item.devconfig?.tabName || item.name || item.id,
22
+ className: item.id === page?.id ? 'active' : '',
23
+ handler: () => switchPage(item.id),
24
+ }"
25
+ :key="index"
26
+ ></ToolButton>
27
+ </slot>
28
+ </div>
27
29
  </div>
28
30
  <template #reference>
29
31
  <TMagicIcon class="m-editor-page-list-menu-icon">
@@ -5,7 +5,7 @@
5
5
  <SearchInput @search="filterTextChangeHandler"></SearchInput>
6
6
 
7
7
  <slot name="component-list" :component-group-list="list">
8
- <TMagicCollapse class="ui-component-panel" :model-value="collapseValue">
8
+ <TMagicCollapse class="ui-component-panel" v-model="collapseValue">
9
9
  <template v-for="(group, index) in list">
10
10
  <TMagicCollapseItem v-if="group.items && group.items.length" :key="index" :name="`${index}`">
11
11
  <template #title><MIcon :icon="Grid"></MIcon>{{ group.title }}</template>
@@ -34,7 +34,7 @@
34
34
  </template>
35
35
 
36
36
  <script lang="ts" setup>
37
- import { computed, inject, ref } from 'vue';
37
+ import { computed, inject, ref, watch } from 'vue';
38
38
  import { Grid } from '@element-plus/icons-vue';
39
39
  import serialize from 'serialize-javascript';
40
40
 
@@ -74,10 +74,19 @@ const list = computed<ComponentGroup[]>(() =>
74
74
  items: group.items.filter((item: ComponentItem) => item.text.includes(searchText.value)),
75
75
  })),
76
76
  );
77
- const collapseValue = computed(() =>
78
- Array(list.value?.length)
79
- .fill(1)
80
- .map((x, i) => `${i}`),
77
+
78
+ const collapseValue = ref();
79
+
80
+ watch(
81
+ list,
82
+ () => {
83
+ collapseValue.value = Array(list.value?.length)
84
+ .fill(1)
85
+ .map((x, i) => `${i}`);
86
+ },
87
+ {
88
+ immediate: true,
89
+ },
81
90
  );
82
91
 
83
92
  let timeout: ReturnType<typeof setTimeout> | undefined;
@@ -574,8 +574,6 @@ class Editor extends BaseService {
574
574
  nodes.splice(targetIndex, 1, newConfig);
575
575
  this.set('nodes', [...nodes]);
576
576
 
577
- // update后会触发依赖收集,收集完后会掉stage.update方法
578
-
579
577
  if (isPage(newConfig) || isPageFragment(newConfig)) {
580
578
  this.set('page', newConfig as MPage | MPageFragment);
581
579
  }
@@ -591,6 +589,7 @@ class Editor extends BaseService {
591
589
 
592
590
  /**
593
591
  * 更新节点
592
+ * update后会触发依赖收集,收集完后会掉stage.update方法
594
593
  * @param config 新的节点配置,配置中需要有id信息
595
594
  * @returns 更新后的节点配置
596
595
  */
@@ -11,6 +11,17 @@
11
11
  border-bottom: 1px solid $border-color;
12
12
  margin-bottom: 10px;
13
13
  }
14
+
15
+ > .el-collapse-item__header {
16
+ padding: 0 10px;
17
+ box-sizing: border-box;
18
+ }
19
+ }
20
+
21
+ .el-collapse-item__title {
22
+ display: flex;
23
+ align-items: center;
24
+ gap: 3px;
14
25
  }
15
26
 
16
27
  .el-collapse-item__header,
@@ -13,4 +13,8 @@
13
13
  flex: 2;
14
14
  }
15
15
  }
16
+ .tmagic-design-button {
17
+ margin-left: 5px;
18
+ padding: 5px 8px;
19
+ }
16
20
  }
@@ -18,6 +18,7 @@
18
18
 
19
19
  > div {
20
20
  display: flex;
21
+ gap: 3px;
21
22
  height: 100%;
22
23
  z-index: 1;
23
24
  align-items: center;
@@ -76,5 +77,10 @@
76
77
  transform: rotate(-90deg);
77
78
  }
78
79
  }
80
+
81
+ .t-button {
82
+ padding-left: 1px;
83
+ padding-right: 1px;
84
+ }
79
85
  }
80
86
  }
@@ -92,6 +92,11 @@
92
92
  padding: 4px 0;
93
93
  }
94
94
 
95
+ .page-bar-popover-wrapper {
96
+ max-height: calc(100vh - $page-bar-height - 20px);
97
+ overflow: auto;
98
+ }
99
+
95
100
  .menu-item {
96
101
  cursor: pointer;
97
102
  transition: all 0.2s ease 0s;
@@ -72,11 +72,6 @@
72
72
  align-items: center;
73
73
  border-bottom: 2px solid $border-color;
74
74
  }
75
-
76
- .tmagic-design-form {
77
- padding-right: 10px;
78
- padding-left: 10px;
79
- }
80
75
  }
81
76
 
82
77
  .m-editor-props-panel-src-icon {
@@ -1,3 +1,5 @@
1
+ @use "../common/var" as *;
2
+
1
3
  .background-position-container {
2
4
  display: flex;
3
5
  width: 100%;
@@ -6,8 +8,8 @@
6
8
  flex-wrap: wrap;
7
9
  width: 80px;
8
10
  height: auto;
9
- .el-button {
10
- & + .el-button {
11
+ .tmagic-design-button {
12
+ & + .tmagic-design-button {
11
13
  margin-left: 2px;
12
14
  }
13
15
  &:nth-child(3n + 1) {
@@ -15,13 +17,18 @@
15
17
  }
16
18
  }
17
19
 
20
+ .t-button--variant-text {
21
+ padding-left: 2px;
22
+ padding-right: 2px;
23
+ }
24
+
18
25
  .position-icon {
19
26
  position: relative;
20
27
  width: 14px;
21
28
  height: 14px;
22
29
  border: 1px solid #1d1f24;
23
30
  &.active {
24
- background-color: var(--el-color-primary);
31
+ background-color: var($theme-color);
25
32
  &::after {
26
33
  border: 1px solid #fff;
27
34
  }
@@ -8,12 +8,25 @@
8
8
  .tmagic-design-collapse-item {
9
9
  > .el-collapse-item__header {
10
10
  background-color: #f2f3f7;
11
- height: 36px;
12
- padding: 10px;
11
+ height: 26px;
12
+ min-height: 26px;
13
+ line-height: 26px;
14
+ padding: 0 20px;
15
+ box-sizing: border-box;
13
16
  }
14
17
 
15
18
  .el-collapse-item__wrap {
16
- padding: 0 10px;
19
+ padding: 10px 20px;
20
+ }
21
+
22
+ .el-collapse-item__title {
23
+ display: flex;
24
+ align-items: center;
25
+ gap: 3px;
26
+ }
27
+
28
+ .el-collapse-item__content {
29
+ padding: 0;
17
30
  }
18
31
  }
19
32
  }
@@ -17,7 +17,12 @@
17
17
  * limitations under the License.
18
18
  */
19
19
 
20
- import { NODE_CONDS_KEY, NODE_DISABLE_CODE_BLOCK_KEY, NODE_DISABLE_DATA_SOURCE_KEY } from '@tmagic/core';
20
+ import {
21
+ NODE_CONDS_KEY,
22
+ NODE_CONDS_RESULT_KEY,
23
+ NODE_DISABLE_CODE_BLOCK_KEY,
24
+ NODE_DISABLE_DATA_SOURCE_KEY,
25
+ } from '@tmagic/core';
21
26
  import { tMagicMessage } from '@tmagic/design';
22
27
  import type { FormConfig, FormState, TabConfig, TabPaneConfig } from '@tmagic/form';
23
28
 
@@ -163,8 +168,20 @@ export const advancedTabConfig: TabPaneConfig = {
163
168
 
164
169
  export const displayTabConfig: TabPaneConfig = {
165
170
  title: '显示条件',
166
- display: (_vm: FormState, { model }: any) => model.type !== 'page',
171
+ display: (_state: FormState, { model }: any) => model.type !== 'page',
167
172
  items: [
173
+ {
174
+ name: NODE_CONDS_RESULT_KEY,
175
+ type: 'select',
176
+ text: '条件成立时',
177
+ defaultValue: false,
178
+ options: [
179
+ { text: '显示', value: false },
180
+ { text: '隐藏', value: true },
181
+ ],
182
+ extra: (_state, { model }) =>
183
+ `条件成立时${model[NODE_CONDS_RESULT_KEY] ? '隐藏' : '显示'},不成立时${model[NODE_CONDS_RESULT_KEY] ? '显示' : '隐藏'};<br />同一条件组内的所有条件配置同时成立时表示该条件组成立,任意一个条件组成立时表示条件成立(条件组内为且的关系,条件组间为或的关系);<br />条件为空时表示成立;`,
184
+ },
168
185
  {
169
186
  type: 'display-conds',
170
187
  name: NODE_CONDS_KEY,