eoss 0.1.0-alpha.21 → 0.1.0-alpha.22

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 (195) hide show
  1. package/lib/account-login.js +129 -129
  2. package/lib/alert.js +2 -2
  3. package/lib/aside.js +2 -2
  4. package/lib/autocomplete.js +216 -216
  5. package/lib/avatar.js +2 -2
  6. package/lib/backtop.js +2 -2
  7. package/lib/badge.js +2 -2
  8. package/lib/breadcrumb.js +2 -2
  9. package/lib/ca-login.js +6 -6
  10. package/lib/calendar.js +2 -2
  11. package/lib/card.js +2 -2
  12. package/lib/carousel-item.js +21 -21
  13. package/lib/carousel.js +16 -16
  14. package/lib/cascader-panel.js +6 -6
  15. package/lib/cascader.js +230 -230
  16. package/lib/checkbox-group.js +138 -138
  17. package/lib/col.js +2 -2
  18. package/lib/collapse-item.js +423 -410
  19. package/lib/collapse.js +426 -412
  20. package/lib/color-picker.js +23 -23
  21. package/lib/container.js +2 -2
  22. package/lib/cron.js +2 -2
  23. package/lib/data-table.js +123 -123
  24. package/lib/date-picker.js +233 -233
  25. package/lib/dialog.js +8 -8
  26. package/lib/divider.js +2 -2
  27. package/lib/drawer.js +4 -4
  28. package/lib/dropdown-item.js +2 -2
  29. package/lib/dropdown-menu.js +6 -6
  30. package/lib/dropdown.js +13 -13
  31. package/lib/email-login.js +124 -124
  32. package/lib/empty.js +2 -2
  33. package/lib/eoss.common.js +21948 -21788
  34. package/lib/flip.js +2 -2
  35. package/lib/flow-group.js +251 -251
  36. package/lib/flow.js +15934 -18947
  37. package/lib/flows.js +9195 -0
  38. package/lib/footer.js +2 -2
  39. package/lib/form-item.js +28 -17
  40. package/lib/form.js +426 -412
  41. package/lib/header.js +2 -2
  42. package/lib/icon.js +128 -128
  43. package/lib/icons.js +2 -2
  44. package/lib/image-viewer.js +6 -6
  45. package/lib/image.js +2 -2
  46. package/lib/index.js +1 -1
  47. package/lib/infinite-scroll.js +2 -2
  48. package/lib/input.js +4 -4
  49. package/lib/link.js +2 -2
  50. package/lib/loading.js +4 -4
  51. package/lib/login.js +190 -156
  52. package/lib/lowcode.js +562 -272
  53. package/lib/main.js +348 -282
  54. package/lib/marquee.js +6 -6
  55. package/lib/menu.js +209 -209
  56. package/lib/message-box.js +8 -8
  57. package/lib/message.js +8 -8
  58. package/lib/notification.js +8 -8
  59. package/lib/option-group.js +2 -2
  60. package/lib/option.js +4 -4
  61. package/lib/page-header.js +2 -2
  62. package/lib/pagination.js +6 -6
  63. package/lib/phone-login.js +124 -124
  64. package/lib/popconfirm.js +2 -2
  65. package/lib/popover.js +209 -209
  66. package/lib/progress.js +2 -2
  67. package/lib/qr-code.js +2 -2
  68. package/lib/qrcode-login.js +123 -123
  69. package/lib/radio-group.js +121 -121
  70. package/lib/rate.js +4 -4
  71. package/lib/row.js +2 -2
  72. package/lib/scrollbar.js +6 -6
  73. package/lib/select.js +470 -457
  74. package/lib/selector-panel.js +141 -141
  75. package/lib/selector.js +130 -130
  76. package/lib/step.js +426 -412
  77. package/lib/steps.js +6 -6
  78. package/lib/submenu.js +4 -4
  79. package/lib/switch.js +4 -4
  80. package/lib/tab-pane.js +2 -2
  81. package/lib/table-column.js +6 -6
  82. package/lib/table.js +460 -460
  83. package/lib/tabs.js +6 -6
  84. package/lib/tag.js +2 -2
  85. package/lib/theme-chalk/autocomplete.css +1 -1
  86. package/lib/theme-chalk/base.css +1 -1
  87. package/lib/theme-chalk/cascader-panel.css +1 -1
  88. package/lib/theme-chalk/cascader.css +1 -1
  89. package/lib/theme-chalk/checkbox-group.css +1 -1
  90. package/lib/theme-chalk/date-picker.css +1 -1
  91. package/lib/theme-chalk/descriptions-item.css +1 -1
  92. package/lib/theme-chalk/descriptions.css +1 -1
  93. package/lib/theme-chalk/empty.css +1 -1
  94. package/lib/theme-chalk/flow.css +1 -1
  95. package/lib/theme-chalk/flows.css +1 -0
  96. package/lib/theme-chalk/form.css +1 -1
  97. package/lib/theme-chalk/index.css +1 -1
  98. package/lib/theme-chalk/input-number.css +1 -1
  99. package/lib/theme-chalk/input.css +1 -1
  100. package/lib/theme-chalk/lowcode.css +1 -1
  101. package/lib/theme-chalk/main.css +1 -1
  102. package/lib/theme-chalk/menu.css +1 -1
  103. package/lib/theme-chalk/message-box.css +1 -1
  104. package/lib/theme-chalk/message.css +1 -1
  105. package/lib/theme-chalk/notification.css +1 -1
  106. package/lib/theme-chalk/pagination.css +1 -1
  107. package/lib/theme-chalk/scrollbar.css +1 -1
  108. package/lib/theme-chalk/select.css +1 -1
  109. package/lib/theme-chalk/selector-panel.css +1 -1
  110. package/lib/theme-chalk/selector.css +1 -1
  111. package/lib/theme-chalk/slider.css +1 -1
  112. package/lib/theme-chalk/table.css +1 -1
  113. package/lib/theme-chalk/tabs.css +1 -1
  114. package/lib/theme-chalk/time-picker.css +1 -1
  115. package/lib/theme-chalk/time-select.css +1 -1
  116. package/lib/theme-chalk/timeline-item.css +1 -1
  117. package/lib/theme-chalk/transfer.css +1 -1
  118. package/lib/theme-chalk/tree.css +1 -1
  119. package/lib/theme-chalk/upload.css +1 -1
  120. package/lib/time-picker.js +8 -8
  121. package/lib/time-select.js +6 -6
  122. package/lib/timeline-item.js +2 -2
  123. package/lib/timeline.js +2 -2
  124. package/lib/tips.js +124 -124
  125. package/lib/toolbar.js +4 -4
  126. package/lib/tooltip.js +209 -209
  127. package/lib/transfer.js +4 -4
  128. package/lib/tree-group.js +122 -122
  129. package/lib/tree.js +121 -121
  130. package/lib/upload.js +131 -131
  131. package/package.json +1 -1
  132. package/packages/carousel/src/carousel.vue +2 -2
  133. package/packages/flow/index.js +4 -4
  134. package/packages/flow/src/component/FreeCirculation.vue +4 -3
  135. package/packages/flow/src/component/SendMsg.vue +2 -4
  136. package/packages/flow/src/component/opinions.vue +203 -226
  137. package/packages/flow/src/component/taskUnionExamine.vue +2 -4
  138. package/packages/flow/src/freeStartFlow.vue +2 -2
  139. package/packages/flow/src/selectUser.vue +36 -1
  140. package/packages/flow/src/supervise.vue +4 -2
  141. package/packages/flows/index.js +7 -0
  142. package/packages/flows/readme.md +600 -0
  143. package/packages/flows/src/components/basis.vue +108 -0
  144. package/packages/flows/src/components/distribute.vue +42 -0
  145. package/packages/flows/src/components/opinions-file.vue +123 -0
  146. package/packages/{flow-copy/src/component → flows/src/components}/opinions.vue +227 -204
  147. package/packages/flows/src/components/quick-actions.vue +64 -0
  148. package/packages/flows/src/components/reject.vue +83 -0
  149. package/packages/flows/src/components/start-flow.vue +210 -0
  150. package/packages/flows/src/flow.vue +510 -0
  151. package/packages/{flow/src/flow.vue → flows/src/flows.vue} +40 -1327
  152. package/packages/form/src/form-item.vue +9 -2
  153. package/packages/form/src/label-wrap.vue +4 -1
  154. package/packages/login/src/login.vue +61 -32
  155. package/packages/lowcode/src/lowcode.vue +141 -40
  156. package/packages/lowcode/src/pages.vue +27 -7
  157. package/packages/lowcode/src/toolbar.vue +3 -18
  158. package/packages/main/src/components/pages.vue +97 -65
  159. package/packages/main/src/components/router-page.vue +0 -2
  160. package/packages/main/src/gzw.vue +3 -2
  161. package/packages/main/src/minxs.js +71 -51
  162. package/packages/select/src/select.vue +5 -0
  163. package/packages/theme-chalk/src/base.scss +6 -0
  164. package/packages/theme-chalk/src/checkbox-group.scss +1 -0
  165. package/packages/theme-chalk/src/common/var.scss +1 -1
  166. package/packages/theme-chalk/src/flow.scss +7 -4
  167. package/packages/theme-chalk/src/flows.scss +141 -0
  168. package/packages/theme-chalk/src/form.scss +1 -1
  169. package/packages/theme-chalk/src/index.scss +1 -0
  170. package/packages/theme-chalk/src/input.scss +1 -0
  171. package/packages/theme-chalk/src/select.scss +3 -1
  172. package/packages/theme-chalk/src/selector.scss +1 -1
  173. package/src/index.js +4 -1
  174. package/packages/flow/src/component/quick-actions.vue +0 -1168
  175. package/packages/flow-copy/index.js +0 -7
  176. package/packages/flow-copy/src/component/Circulate.vue +0 -452
  177. package/packages/flow-copy/src/component/CustomPreset.vue +0 -333
  178. package/packages/flow-copy/src/component/FreeCirculation.vue +0 -275
  179. package/packages/flow-copy/src/component/Preset.vue +0 -273
  180. package/packages/flow-copy/src/component/SendMsg.vue +0 -290
  181. package/packages/flow-copy/src/component/TimeLimit.vue +0 -205
  182. package/packages/flow-copy/src/component/taskUnionExamine.vue +0 -818
  183. package/packages/flow-copy/src/freeStartFlow.vue +0 -2912
  184. package/packages/flow-copy/src/processForm.vue +0 -1411
  185. package/packages/flow-copy/src/processReject.vue +0 -319
  186. package/packages/flow-copy/src/reset.vue +0 -944
  187. package/packages/flow-copy/src/selectUser.vue +0 -513
  188. package/packages/flow-copy/src/startTaskRead.vue +0 -723
  189. package/packages/flow-copy/src/supervise.vue +0 -182
  190. package/packages/flow-copy/src/table.vue +0 -65
  191. /package/packages/{flow-copy → flow}/src/component/FileList.vue +0 -0
  192. /package/packages/{flow-copy → flow}/src/main.vue +0 -0
  193. /package/packages/{flow-copy/src → flows/src/components}/form.vue +0 -0
  194. /package/packages/{flow/src/component → flows/src/components}/message.vue +0 -0
  195. /package/packages/{flow/src/component → flows/src/components}/opinions-list.vue +0 -0
@@ -4,7 +4,8 @@
4
4
  :style="itemStyle"
5
5
  :class="[
6
6
  {
7
- 'es-form-item--feedback': esForm && esForm.statusIcon,
7
+ 'es-form-item--feedback': esForm && esForm.statusIcon,
8
+ 'es-form--label-top': labelPosition === 'top',
8
9
  'is-error': validateState === 'error',
9
10
  'is-validating': validateState === 'validating',
10
11
  'is-success': validateState === 'success',
@@ -21,6 +22,7 @@
21
22
  :class="labelClass"
22
23
  :labelFor="labelFor"
23
24
  :contents="label"
25
+ :position="labelPosition"
24
26
  v-if="label || $slots.label"
25
27
  >
26
28
  <slot name="label" v-if="$slots.label"></slot>
@@ -100,10 +102,15 @@ export default {
100
102
  * 标签文本
101
103
  */
102
104
  label: [String, Array],
105
+ /**
106
+ * 标签位置
107
+ */
108
+ labelPosition: String,
103
109
  /**
104
110
  * 标签宽度
105
111
  */
106
112
  labelWidth: String,
113
+
107
114
  /**
108
115
  * 字段名,用于表单验证和数据绑定
109
116
  */
@@ -257,7 +264,7 @@ export default {
257
264
  const labelWidth = this.labelWidth || form.labelWidth;
258
265
  const label = this.label || this.$slots.label;
259
266
  // 快速路径:无需计算样式
260
- if (!label || form.labelPosition === 'top' || form.inline) return {};
267
+ if (!label || this.labelPosition === 'top' || form.labelPosition === 'top' || form.inline) return {};
261
268
  if (!this.labelWidth && this.isNested) return {};
262
269
 
263
270
  // 构建样式对象
@@ -44,6 +44,8 @@ export default {
44
44
  componentsName: 'LabelWrap',
45
45
  inheritAttrs: false,
46
46
  props: {
47
+ // 标签位置
48
+ position: String,
47
49
  // 标签关联的表单字段ID,确保label与form field正确关联
48
50
  labelFor: String,
49
51
  // 统一使用isAutoWidth来控制自动宽度计算
@@ -82,7 +84,8 @@ export default {
82
84
  if (
83
85
  !this.autoWidth &&
84
86
  this.esForm &&
85
- this.esForm.labelPosition !== 'top'
87
+ this.esForm.labelPosition !== 'top' &&
88
+ this.position !== 'top'
86
89
  ) {
87
90
  const labelWidth = parseInt(
88
91
  (this.esFormItem || {}).labelWidth ||
@@ -148,7 +148,9 @@
148
148
  <transition name="launch-fade">
149
149
  <div class="es-launch" :style="launchStyles" v-show="showLaunch">
150
150
  <div class="es-launch__text is-user">{{ userName }},您好!</div>
151
- <div class="es-launch__text">欢迎进入{{ welcome||subsystemName }}</div>
151
+ <div class="es-launch__text">
152
+ 欢迎进入{{ welcome || subsystemName }}
153
+ </div>
152
154
  </div>
153
155
  </transition>
154
156
 
@@ -602,7 +604,7 @@ export default {
602
604
  beforeCreate() {},
603
605
  created() {
604
606
  this.initLogin();
605
- this.alertNotice = throttle(300, true, this.doAlert);
607
+ this.alertNotice = throttle(300, this.doAlert);
606
608
  },
607
609
  mounted() {},
608
610
  /**
@@ -797,42 +799,69 @@ export default {
797
799
  }
798
800
  },
799
801
  /**
800
- * @param {Object} contents - 弹窗内容
802
+ * 显示弹窗提示
803
+ * @param {string|Object} contents - 弹窗内容,字符串表示内容文本,对象表示完整配置
801
804
  */
802
805
  doAlert(contents) {
803
- let { content, title, ...config } = contents;
806
+ let content, title, config;
807
+ if (typeof contents === 'string') {
808
+ content = contents;
809
+ title = '提示';
810
+ config = {};
811
+ } else {
812
+ ({ content, title, ...config } = contents);
813
+ }
804
814
  const regex = /\.md$/;
805
815
  let isMarkdown = regex.test(content);
816
+ const showAlert = () => {
817
+ console.log('showAlert called', { content, isMarkdown, title });
818
+ MessageBox.alert(content, title, {
819
+ dangerouslyUseHTMLString: isMarkdown,
820
+ setHeight: isMarkdown,
821
+ notice: true,
822
+ ...config
823
+ })
824
+ .then(() => {
825
+ this.$emit('notice', 1, { content, title, ...config });
826
+ })
827
+ .catch(() => {
828
+ this.$emit('notice', 0, { content, title, ...config });
829
+ });
830
+ };
806
831
  if (isMarkdown) {
807
- content = ajax({ url: content });
808
- content = content
809
- ? content
810
- .replace(/^#{1,6}\s+(.*?)$/gm, (match, text) => {
811
- const hLevel = match.indexOf('#');
812
- return `<h${hLevel}>${text}</h${hLevel}>`;
813
- })
814
- .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
815
- .replace(/\*(.*?)\*/g, '<em>$1</em>')
816
- .replace(
817
- /\[(.*?)\]\((.*?)\)/g,
818
- '<a href="$2" target="_blank">$1</a>'
819
- )
820
- .replace(/^(.*?)$/gm, '<p>$1</p>')
821
- : content;
822
- content = DOMPurify.sanitize(content);
832
+ ajax({ url: content })
833
+ .then((mdContent) => {
834
+ // 兼容接口返回对象的情况(如 { rCode: 0, results: '...' })
835
+ if (mdContent && typeof mdContent === 'object') {
836
+ mdContent =
837
+ mdContent.results || mdContent.data || mdContent.content || '';
838
+ }
839
+ mdContent = String(mdContent || '');
840
+ content = mdContent
841
+ ? mdContent
842
+ .replace(/^#{1,6}\s+(.*?)$/gm, (match, text) => {
843
+ const hLevel = match.indexOf('#');
844
+ return `<h${hLevel}>${text}</h${hLevel}>`;
845
+ })
846
+ .replace(/\*\*(.*?)\*\*/g, '<strong>$1</strong>')
847
+ .replace(/\*(.*?)\*/g, '<em>$1</em>')
848
+ .replace(
849
+ /\[(.*?)\]\((.*?)\)/g,
850
+ '<a href="$2" target="_blank">$1</a>'
851
+ )
852
+ .replace(/^(.*?)$/gm, '<p>$1</p>')
853
+ : content;
854
+ content = DOMPurify.sanitize(content);
855
+ showAlert();
856
+ })
857
+ .catch((error) => {
858
+ console.error('加载 Markdown 内容失败:', error);
859
+ content = '内容加载失败';
860
+ isMarkdown = false;
861
+ });
862
+ } else {
863
+ showAlert();
823
864
  }
824
- MessageBox.alert(content, title, {
825
- dangerouslyUseHTMLString: isMarkdown,
826
- setHeight: isMarkdown,
827
- notice: true,
828
- ...config
829
- })
830
- .then(() => {
831
- this.$emit('notice', 1, { content, title, ...config });
832
- })
833
- .catch(() => {
834
- this.$emit('notice', 0, { content, title, ...config });
835
- });
836
865
  },
837
866
  /**
838
867
  * 打开下载APP弹窗
@@ -20,22 +20,16 @@
20
20
  <Source :page="page" v-else />
21
21
  </es-dialog>
22
22
  <es-dialog
23
- title="完善页面信息"
23
+ title="信息完善"
24
24
  width="600px"
25
25
  height="380px"
26
26
  :visible.sync="visible"
27
27
  :close-on-click-modal="false"
28
28
  >
29
29
  <es-form :model="form" :rules="rules" ref="formRef" label-width="80px">
30
- <es-form-item label="编码" prop="code">
31
- <es-input v-model="form.code" placeholder="请输入编码" />
32
- </es-form-item>
33
30
  <es-form-item label="名称" prop="name">
34
31
  <es-input v-model="form.name" placeholder="请输入名称" />
35
32
  </es-form-item>
36
- <es-form-item label="标题" prop="title">
37
- <es-input v-model="form.title" placeholder="请输入页面标题" />
38
- </es-form-item>
39
33
  <es-form-item label="描述" prop="description">
40
34
  <es-input
41
35
  type="textarea"
@@ -43,11 +37,77 @@
43
37
  placeholder="请输入描述"
44
38
  />
45
39
  </es-form-item>
40
+ <es-form-item label="类型" prop="type">
41
+ <es-radio-group v-model="form.type">
42
+ <es-radio label="page">页面</es-radio>
43
+ <es-radio label="component">组件</es-radio>
44
+ </es-radio-group>
45
+ </es-form-item>
46
+ <es-form-item label="公开" prop="scopeType">
47
+ <es-radio-group v-model="form.scopeType">
48
+ <es-radio :label="0">是</es-radio>
49
+ <es-radio :label="3">否</es-radio>
50
+ </es-radio-group>
51
+ </es-form-item>
46
52
  <div class="es-lowcode__aside--form-btn">
47
53
  <es-button type="primary" @click="submitForm">确定</es-button>
48
54
  </div>
49
55
  </es-form>
50
56
  </es-dialog>
57
+ <es-dialog
58
+ :title="publishTitle"
59
+ width="600px"
60
+ height="360px"
61
+ :visible.sync="publishVisible"
62
+ :close-on-click-modal="false"
63
+ >
64
+ <es-form :model="publishForm" ref="publishForm" label-width="80px">
65
+ <es-form-item label="发布类型">
66
+ <es-radio-group v-model="scopeType" :disabled="readonly">
67
+ <es-radio label="菜单">菜单</es-radio>
68
+ <es-radio label="应用">应用</es-radio>
69
+ </es-radio-group>
70
+ </es-form-item>
71
+ <es-form-item
72
+ :label="`${scopeType}名称`"
73
+ prop="name"
74
+ :disabled="readonly"
75
+ >
76
+ <es-input
77
+ v-model="publishForm.name"
78
+ :placeholder="`请输入${scopeType}名称`"
79
+ />
80
+ </es-form-item>
81
+ <es-form-item
82
+ :label="`${scopeType}地址`"
83
+ prop="url"
84
+ :disabled="readonly"
85
+ >
86
+ <es-input
87
+ v-model="publishForm.url"
88
+ :placeholder="`请输入${scopeType}地址`"
89
+ >
90
+ <template slot="append"
91
+ ><es-button @click.stop="copyUrl">复制</es-button></template
92
+ >
93
+ </es-input>
94
+ </es-form-item>
95
+ <es-form-item :label="`父${scopeType}`" prop="parentId">
96
+ <es-select
97
+ v-model="publishForm.parentId"
98
+ label-key="name"
99
+ value-key="id"
100
+ tree
101
+ :disabled="readonly"
102
+ :data="parentData"
103
+ :placeholder="`请选择父${scopeType}`"
104
+ ></es-select>
105
+ </es-form-item>
106
+ <div class="es-lowcode__aside--form-btn" v-show="!readonly">
107
+ <es-button type="primary" @click="submitPublishForm">确定</es-button>
108
+ </div>
109
+ </es-form>
110
+ </es-dialog>
51
111
  </div>
52
112
  </template>
53
113
 
@@ -78,6 +138,11 @@ export default {
78
138
  components: { Toolbar, Aside, Canvas, Attribute },
79
139
 
80
140
  props: {
141
+ // url模式
142
+ urlMode: {
143
+ type: String,
144
+ required: true
145
+ },
81
146
  // 页面列表
82
147
  pages: {
83
148
  type: Array,
@@ -134,7 +199,8 @@ export default {
134
199
  name: '',
135
200
  title: '',
136
201
  code: '',
137
- description: ''
202
+ description: '',
203
+ scopeType: 0
138
204
  },
139
205
  rules: {
140
206
  name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
@@ -143,6 +209,17 @@ export default {
143
209
  //description: [
144
210
  // { required: true, message: '请输入描述', trigger: 'blur' }
145
211
  // ]
212
+ },
213
+ publishVisible: false,
214
+ publishTitle: '',
215
+ readonly: false,
216
+ scopeType: '菜单',
217
+ parentData: [],
218
+ publishForm: {
219
+ name: '',
220
+ code: '',
221
+ url: '',
222
+ parentId: ''
146
223
  }
147
224
  };
148
225
  },
@@ -249,36 +326,42 @@ export default {
249
326
  this.open.type = type;
250
327
  this.open.title = type === 'json' ? 'JSON' : '源码';
251
328
  });
252
- /** 保存 */
253
- bus.$on('save', () => {
254
- if (!this.page) {
329
+
330
+ /** 发布 */
331
+ bus.$on('publish', (index) => {
332
+ const page = this.pagesData[index];
333
+ if (page.id.startsWith('page_')) {
255
334
  Message.warning('请先选择要保存的页面');
256
335
  return;
257
336
  }
258
- if (this.save) {
259
- this.save(this.page);
260
- return;
261
- }
262
- this.submitPageData();
337
+ this.publishTitle = page.status === 1 ? '查看' : '发布';
338
+ const url = this.urlMode?this.urlMode.replace('{id}',page.id):'';
339
+ this.readonly = page.status === 1;
340
+ this.publishForm = { name: page.name, pid: page.pid||'', url: url};
341
+ this.parentData = this.pagesData.filter((item) => item.type === 'page');
342
+ this.scopeType = page.code ? '应用' : '菜单';
343
+ this.publishVisible = true;
263
344
  });
264
- /** 发布 */
265
- bus.$on('publish', (genre) => {
266
- if (!this.page) {
345
+
346
+ /** 保存 */
347
+ bus.$on('save', (index) => {
348
+ let page = this.page;
349
+ if (index !== undefined) {
350
+ page = this.pagesData[index];
351
+ } else if (!this.page) {
267
352
  Message.warning('请先选择要发布的页面');
268
353
  return;
269
354
  }
270
- this.page.type = genre;
271
- if (genre === 'page') {
272
- const { name, title, code, description } = this.page;
273
- this.form = { name, title, code, description };
274
- this.visible = true;
275
- } else {
276
- if (this.publish) {
277
- this.publish(this.page);
278
- return;
279
- }
280
- this.submitPageData({ status: 1 });
281
- }
355
+ const {
356
+ name,
357
+ title,
358
+ code,
359
+ description,
360
+ scopeType = 0,
361
+ type = 'page'
362
+ } = page;
363
+ this.form = { name, title, code, description, scopeType, type };
364
+ this.visible = true;
282
365
  });
283
366
  },
284
367
 
@@ -353,9 +436,7 @@ export default {
353
436
  extractPageData() {
354
437
  const {
355
438
  id,
356
- code,
357
439
  name,
358
- title,
359
440
  type,
360
441
  description,
361
442
  componentConfig,
@@ -372,9 +453,7 @@ export default {
372
453
 
373
454
  const meta = {
374
455
  id,
375
- code,
376
456
  name,
377
- title,
378
457
  type,
379
458
  description,
380
459
  componentConfig,
@@ -394,15 +473,14 @@ export default {
394
473
  * 根据页面状态提交保存或更新
395
474
  * @param {Object} extraData - 额外的合并数据(如表单数据)
396
475
  */
397
- submitPageData(extraData = {}) {
476
+ submitPageData() {
398
477
  const { meta, content } = this.extractPageData();
399
478
  const data = {
479
+ status: 0,
400
480
  ...meta,
401
- content: JSON.stringify(content),
402
- ...extraData
481
+ content: JSON.stringify(content)
403
482
  };
404
483
 
405
- // 根据是否有 id 判断是更新还是新建
406
484
  if (meta.status !== undefined) {
407
485
  this.updatePage(data);
408
486
  } else {
@@ -474,6 +552,11 @@ export default {
474
552
  },
475
553
  removePage(index) {
476
554
  const page = this.pagesData[index];
555
+ if (page.id.startsWith('page_')) {
556
+ Message.success('删除成功');
557
+ this.pagesData.splice(index, 1);
558
+ return;
559
+ }
477
560
  const loadingInstance = loading('删除中...');
478
561
  ajax({
479
562
  url: pageDelete,
@@ -524,7 +607,25 @@ export default {
524
607
  }
525
608
  }
526
609
  return null;
527
- }
610
+ },
611
+ /**
612
+ * 复制 URL 到剪贴板
613
+ */
614
+ copyUrl() {
615
+ navigator.clipboard.writeText(this.publishForm.url);
616
+ Message.success('复制成功');
617
+ },
618
+ /**
619
+ * 提交发布表单
620
+ */
621
+ submitPublishForm() {
622
+ this.$refs.publishForm.validate((valid) => {
623
+ if (valid) {
624
+ Message.warning('接口暂未开通,请复制地址手动创建菜单或应用');
625
+ //this.submitPageData(this.publishForm);
626
+ }
627
+ });
628
+ },
528
629
  },
529
630
  destroyed() {
530
631
  // 移除所有事件监听器,防止内存泄漏
@@ -1,6 +1,8 @@
1
1
  <template>
2
2
  <div class="es-lowcode__pages">
3
- <es-scrollbar :class="{'is-page':paginations.total > paginations.pageSize}">
3
+ <es-scrollbar
4
+ :class="{ 'is-page': paginations.total > paginations.pageSize }"
5
+ >
4
6
  <div
5
7
  v-for="(page, index) in pages"
6
8
  :key="page.id"
@@ -11,10 +13,16 @@
11
13
  <span class="es-lowcode__pages--item-name">{{
12
14
  page.name || page.id
13
15
  }}</span>
14
- <i
15
- class="es-icon-shanchu es-lowcode__pages--item-delete"
16
- @click.stop="handleDelete(index)"
17
- ></i>
16
+ <es-dropdown @command="(command) => handleCommand(command, index)">
17
+ <i class="es-icon-gengduo"></i>
18
+ <es-dropdown-menu slot="dropdown">
19
+ <es-dropdown-item command="delete">
20
+ 删除
21
+ </es-dropdown-item>
22
+ <es-dropdown-item command="edit">编辑</es-dropdown-item>
23
+ <es-dropdown-item command="publish">{{page.status === 1 ? '查看' : '发布'}}</es-dropdown-item>
24
+ </es-dropdown-menu>
25
+ </es-dropdown>
18
26
  </div>
19
27
  </es-scrollbar>
20
28
  <es-pagination
@@ -57,8 +65,7 @@ export default {
57
65
  immediate: true
58
66
  }
59
67
  },
60
- mounted() {
61
- },
68
+ mounted() {},
62
69
  methods: {
63
70
  /**
64
71
  * 处理页面选择事件
@@ -73,6 +80,19 @@ export default {
73
80
  this.active = page.id;
74
81
  bus.$emit('selectPage', page);
75
82
  },
83
+ /**
84
+ * 处理下拉菜单命令事件
85
+ * @param command 命令
86
+ */
87
+ handleCommand(command, index) {
88
+ if (command === 'delete') {
89
+ this.handleDelete(index);
90
+ } else if (command === 'edit') {
91
+ bus.$emit('save', index);
92
+ } else if (command === 'publish') {
93
+ bus.$emit('publish', index);
94
+ }
95
+ },
76
96
  /**
77
97
  * 处理页面删除事件
78
98
  * @param index 页面索引
@@ -68,9 +68,6 @@
68
68
  </es-button>
69
69
  </es-button-group>
70
70
  <es-button-group separate>
71
- <es-button type="primary" size="small" @click="handleSave">
72
- 保存
73
- </es-button>
74
71
  <es-button
75
72
  type="primary"
76
73
  class="es-margin-left-none"
@@ -79,19 +76,10 @@
79
76
  >
80
77
  预览
81
78
  </es-button>
82
- </es-button-group>
83
- <es-dropdown type="primary" @command="handlePublish" size="small">
84
- <es-button type="primary" size="small">
85
- 发布<i class="es-icon-xia"></i>
79
+ <es-button type="primary" size="small" @click="handleSave">
80
+ 保存
86
81
  </es-button>
87
-
88
- <template #dropdown>
89
- <es-dropdown-menu>
90
- <es-dropdown-item command="page">发布页面</es-dropdown-item>
91
- <es-dropdown-item command="component">发布组件</es-dropdown-item>
92
- </es-dropdown-menu>
93
- </template>
94
- </es-dropdown>
82
+ </es-button-group>
95
83
  </div>
96
84
  </div>
97
85
  </template>
@@ -154,9 +142,6 @@ export default {
154
142
  handlePreview() {
155
143
  bus.$emit('preview');
156
144
  },
157
- handlePublish(command) {
158
- bus.$emit('publish', command);
159
- }
160
145
  }
161
146
  };
162
147
  </script>