eoss 0.1.0-alpha.21 → 0.1.0-alpha.23

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 (213) hide show
  1. package/lib/account-login.js +125 -125
  2. package/lib/alert.js +2 -2
  3. package/lib/aside.js +2 -2
  4. package/lib/autocomplete.js +239 -239
  5. package/lib/avatar.js +2 -2
  6. package/lib/backtop.js +4 -4
  7. package/lib/badge.js +2 -2
  8. package/lib/breadcrumb-item.js +2 -2
  9. package/lib/breadcrumb.js +2 -2
  10. package/lib/button-group.js +2 -2
  11. package/lib/button.js +2 -2
  12. package/lib/ca-login.js +6 -6
  13. package/lib/calendar.js +2 -2
  14. package/lib/card.js +2 -2
  15. package/lib/carousel-item.js +22 -22
  16. package/lib/carousel.js +40 -26
  17. package/lib/cascader-panel.js +12 -12
  18. package/lib/cascader.js +506 -492
  19. package/lib/checkbox-button.js +2 -2
  20. package/lib/checkbox-group.js +137 -137
  21. package/lib/checkbox.js +2 -2
  22. package/lib/col.js +2 -2
  23. package/lib/collapse-item.js +1224 -1030
  24. package/lib/collapse.js +1225 -1030
  25. package/lib/color-picker.js +12 -12
  26. package/lib/container.js +2 -2
  27. package/lib/cron.js +2 -2
  28. package/lib/data-table.js +121 -121
  29. package/lib/date-picker.js +225 -225
  30. package/lib/dialog.js +17 -17
  31. package/lib/divider.js +2 -2
  32. package/lib/drawer.js +6 -6
  33. package/lib/dropdown-item.js +2 -2
  34. package/lib/dropdown-menu.js +10 -10
  35. package/lib/dropdown.js +13 -13
  36. package/lib/email-login.js +365 -365
  37. package/lib/empty.js +2 -2
  38. package/lib/eoss.common.js +21402 -20724
  39. package/lib/flip.js +2 -2
  40. package/lib/flow-group.js +251 -251
  41. package/lib/flow.js +15933 -18946
  42. package/lib/flows.js +9195 -0
  43. package/lib/footer.js +2 -2
  44. package/lib/form-item.js +28 -17
  45. package/lib/form.js +1228 -1033
  46. package/lib/header.js +2 -2
  47. package/lib/icon.js +129 -129
  48. package/lib/icons.js +4 -4
  49. package/lib/image-viewer.js +6 -6
  50. package/lib/image.js +4 -4
  51. package/lib/index.js +1 -1
  52. package/lib/infinite-scroll.js +4 -4
  53. package/lib/input-number.js +11 -11
  54. package/lib/input.js +28 -14
  55. package/lib/link.js +2 -2
  56. package/lib/loading.js +6 -6
  57. package/lib/login.js +277 -229
  58. package/lib/lowcode.js +964 -325
  59. package/lib/main.js +634 -565
  60. package/lib/marquee.js +6 -6
  61. package/lib/menu-item-group.js +2 -2
  62. package/lib/menu-item.js +2 -2
  63. package/lib/menu.js +1934 -1934
  64. package/lib/message-box.js +12 -12
  65. package/lib/message.js +10 -10
  66. package/lib/notification.js +16 -16
  67. package/lib/option-group.js +2 -2
  68. package/lib/option.js +6 -6
  69. package/lib/page-header.js +2 -2
  70. package/lib/pagination.js +16 -16
  71. package/lib/phone-login.js +127 -127
  72. package/lib/popconfirm.js +4 -4
  73. package/lib/popover.js +219 -219
  74. package/lib/progress.js +2 -2
  75. package/lib/qr-code.js +8 -8
  76. package/lib/qrcode-login.js +119 -119
  77. package/lib/radio-button.js +2 -2
  78. package/lib/radio-group.js +119 -119
  79. package/lib/radio.js +2 -2
  80. package/lib/rate.js +6 -6
  81. package/lib/row.js +2 -2
  82. package/lib/scrollbar.js +46 -32
  83. package/lib/select.js +823 -796
  84. package/lib/selector-panel.js +141 -141
  85. package/lib/selector.js +1040 -160
  86. package/lib/slider.js +2 -2
  87. package/lib/step.js +1225 -1030
  88. package/lib/steps.js +6 -6
  89. package/lib/submenu.js +27 -27
  90. package/lib/switch.js +15 -15
  91. package/lib/tab-pane.js +2 -2
  92. package/lib/table-column.js +8 -8
  93. package/lib/table.js +2530 -2516
  94. package/lib/tabs.js +28 -14
  95. package/lib/tag.js +2 -2
  96. package/lib/theme-chalk/autocomplete.css +1 -1
  97. package/lib/theme-chalk/base.css +1 -1
  98. package/lib/theme-chalk/cascader-panel.css +1 -1
  99. package/lib/theme-chalk/cascader.css +1 -1
  100. package/lib/theme-chalk/checkbox-group.css +1 -1
  101. package/lib/theme-chalk/date-picker.css +1 -1
  102. package/lib/theme-chalk/descriptions-item.css +1 -1
  103. package/lib/theme-chalk/descriptions.css +1 -1
  104. package/lib/theme-chalk/empty.css +1 -1
  105. package/lib/theme-chalk/flow.css +1 -1
  106. package/lib/theme-chalk/flows.css +1 -0
  107. package/lib/theme-chalk/form.css +1 -1
  108. package/lib/theme-chalk/index.css +1 -1
  109. package/lib/theme-chalk/input-number.css +1 -1
  110. package/lib/theme-chalk/input.css +1 -1
  111. package/lib/theme-chalk/lowcode.css +1 -1
  112. package/lib/theme-chalk/main.css +1 -1
  113. package/lib/theme-chalk/menu.css +1 -1
  114. package/lib/theme-chalk/message-box.css +1 -1
  115. package/lib/theme-chalk/message.css +1 -1
  116. package/lib/theme-chalk/notification.css +1 -1
  117. package/lib/theme-chalk/pagination.css +1 -1
  118. package/lib/theme-chalk/scrollbar.css +1 -1
  119. package/lib/theme-chalk/select.css +1 -1
  120. package/lib/theme-chalk/selector-panel.css +1 -1
  121. package/lib/theme-chalk/selector.css +1 -1
  122. package/lib/theme-chalk/slider.css +1 -1
  123. package/lib/theme-chalk/table.css +1 -1
  124. package/lib/theme-chalk/tabs.css +1 -1
  125. package/lib/theme-chalk/time-picker.css +1 -1
  126. package/lib/theme-chalk/time-select.css +1 -1
  127. package/lib/theme-chalk/timeline-item.css +1 -1
  128. package/lib/theme-chalk/transfer.css +1 -1
  129. package/lib/theme-chalk/tree.css +1 -1
  130. package/lib/theme-chalk/upload.css +1 -1
  131. package/lib/time-picker.js +16 -16
  132. package/lib/time-select.js +15 -15
  133. package/lib/timeline-item.js +2 -2
  134. package/lib/timeline.js +2 -2
  135. package/lib/tips.js +129 -129
  136. package/lib/toolbar.js +4 -4
  137. package/lib/tooltip.js +220 -220
  138. package/lib/transfer.js +8 -8
  139. package/lib/tree-group.js +124 -124
  140. package/lib/tree.js +144 -144
  141. package/lib/upload.js +155 -155
  142. package/lib/utils/resize-event.js +20 -6
  143. package/package.json +3 -1
  144. package/packages/carousel/src/carousel.vue +2 -2
  145. package/packages/flow/index.js +4 -4
  146. package/packages/flow/src/component/FreeCirculation.vue +4 -3
  147. package/packages/flow/src/component/SendMsg.vue +2 -4
  148. package/packages/flow/src/component/opinions.vue +203 -226
  149. package/packages/flow/src/component/taskUnionExamine.vue +2 -4
  150. package/packages/flow/src/freeStartFlow.vue +2 -2
  151. package/packages/flow/src/selectUser.vue +36 -1
  152. package/packages/flow/src/supervise.vue +4 -2
  153. package/packages/flows/index.js +7 -0
  154. package/packages/flows/readme.md +600 -0
  155. package/packages/flows/src/components/basis.vue +108 -0
  156. package/packages/flows/src/components/distribute.vue +42 -0
  157. package/packages/flows/src/components/opinions-file.vue +123 -0
  158. package/packages/{flow-copy/src/component → flows/src/components}/opinions.vue +227 -204
  159. package/packages/flows/src/components/quick-actions.vue +64 -0
  160. package/packages/flows/src/components/reject.vue +83 -0
  161. package/packages/flows/src/components/start-flow.vue +210 -0
  162. package/packages/flows/src/flow.vue +510 -0
  163. package/packages/{flow/src/flow.vue → flows/src/flows.vue} +40 -1327
  164. package/packages/form/src/form-item.vue +9 -2
  165. package/packages/form/src/label-wrap.vue +4 -1
  166. package/packages/login/src/login.vue +61 -32
  167. package/packages/lowcode/src/aside.vue +15 -2
  168. package/packages/lowcode/src/editor.vue +187 -0
  169. package/packages/lowcode/src/lowcode.vue +195 -41
  170. package/packages/lowcode/src/pages.vue +174 -26
  171. package/packages/lowcode/src/toolbar.vue +3 -18
  172. package/packages/main/src/components/pages.vue +97 -65
  173. package/packages/main/src/components/router-page.vue +0 -2
  174. package/packages/main/src/gzw.vue +3 -2
  175. package/packages/main/src/minxs.js +72 -51
  176. package/packages/menu/src/menu.vue +4 -4
  177. package/packages/select/src/select.vue +5 -0
  178. package/packages/selector/src/selector.vue +147 -17
  179. package/packages/theme-chalk/src/base.scss +6 -0
  180. package/packages/theme-chalk/src/checkbox-group.scss +1 -0
  181. package/packages/theme-chalk/src/common/var.scss +1 -1
  182. package/packages/theme-chalk/src/flow.scss +7 -4
  183. package/packages/theme-chalk/src/flows.scss +141 -0
  184. package/packages/theme-chalk/src/form.scss +1 -1
  185. package/packages/theme-chalk/src/index.scss +1 -0
  186. package/packages/theme-chalk/src/input.scss +1 -0
  187. package/packages/theme-chalk/src/lowcode.scss +21 -18
  188. package/packages/theme-chalk/src/select.scss +3 -1
  189. package/packages/theme-chalk/src/selector.scss +11 -5
  190. package/src/index.js +4 -1
  191. package/src/utils/resize-event.js +21 -7
  192. package/packages/flow/src/component/quick-actions.vue +0 -1168
  193. package/packages/flow-copy/index.js +0 -7
  194. package/packages/flow-copy/src/component/Circulate.vue +0 -452
  195. package/packages/flow-copy/src/component/CustomPreset.vue +0 -333
  196. package/packages/flow-copy/src/component/FreeCirculation.vue +0 -275
  197. package/packages/flow-copy/src/component/Preset.vue +0 -273
  198. package/packages/flow-copy/src/component/SendMsg.vue +0 -290
  199. package/packages/flow-copy/src/component/TimeLimit.vue +0 -205
  200. package/packages/flow-copy/src/component/taskUnionExamine.vue +0 -818
  201. package/packages/flow-copy/src/freeStartFlow.vue +0 -2912
  202. package/packages/flow-copy/src/processForm.vue +0 -1411
  203. package/packages/flow-copy/src/processReject.vue +0 -319
  204. package/packages/flow-copy/src/reset.vue +0 -944
  205. package/packages/flow-copy/src/selectUser.vue +0 -513
  206. package/packages/flow-copy/src/startTaskRead.vue +0 -723
  207. package/packages/flow-copy/src/supervise.vue +0 -182
  208. package/packages/flow-copy/src/table.vue +0 -65
  209. /package/packages/{flow-copy → flow}/src/component/FileList.vue +0 -0
  210. /package/packages/{flow-copy → flow}/src/main.vue +0 -0
  211. /package/packages/{flow-copy/src → flows/src/components}/form.vue +0 -0
  212. /package/packages/{flow/src/component → flows/src/components}/message.vue +0 -0
  213. /package/packages/{flow/src/component → flows/src/components}/opinions-list.vue +0 -0
@@ -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,103 @@
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>
111
+ <es-dialog
112
+ title="页面授权"
113
+ width="600px"
114
+ height="380px"
115
+ :visible.sync="selectorVisible"
116
+ :close-on-click-modal="false"
117
+ >
118
+ <div class="es-lowcode__authorize">
119
+ <es-selector
120
+ v-model="selectorData"
121
+ value-type="string"
122
+ method="post"
123
+ mix
124
+ max-height="auto"
125
+ title="授权对象"
126
+ :types="authorizeType"
127
+ :collapse-tags="5"
128
+ ></es-selector>
129
+ <div class="es-lowcode__authorize--btn">
130
+ <es-button size="medium" @click="handleCancel">取消</es-button>
131
+ <es-button size="medium" type="primary" @click="handleConfirm"
132
+ >确定</es-button
133
+ >
134
+ </div>
135
+ </div>
136
+ </es-dialog>
51
137
  </div>
52
138
  </template>
53
139
 
@@ -78,6 +164,16 @@ export default {
78
164
  components: { Toolbar, Aside, Canvas, Attribute },
79
165
 
80
166
  props: {
167
+ // url模式
168
+ urlMode: {
169
+ type: String,
170
+ required: true
171
+ },
172
+ // 授权类型
173
+ authorizeType: {
174
+ type: Array,
175
+ default: () => ['enterprise', 'person', 'department', 'role']
176
+ },
81
177
  // 页面列表
82
178
  pages: {
83
179
  type: Array,
@@ -97,7 +193,7 @@ export default {
97
193
  pagination: {
98
194
  type: Object,
99
195
  default: () => ({
100
- total: 0,
196
+ total: 100,
101
197
  currentPage: 1,
102
198
  pageSize: 20
103
199
  })
@@ -134,7 +230,8 @@ export default {
134
230
  name: '',
135
231
  title: '',
136
232
  code: '',
137
- description: ''
233
+ description: '',
234
+ scopeType: 0
138
235
  },
139
236
  rules: {
140
237
  name: [{ required: true, message: '请输入名称', trigger: 'blur' }],
@@ -143,7 +240,21 @@ export default {
143
240
  //description: [
144
241
  // { required: true, message: '请输入描述', trigger: 'blur' }
145
242
  // ]
146
- }
243
+ },
244
+ publishVisible: false,
245
+ publishTitle: '',
246
+ readonly: false,
247
+ scopeType: '菜单',
248
+ parentData: [],
249
+ publishForm: {
250
+ name: '',
251
+ code: '',
252
+ url: '',
253
+ parentId: ''
254
+ },
255
+ selectorVisible: false,
256
+ selectorData: [],
257
+ selectorDatas: []
147
258
  };
148
259
  },
149
260
 
@@ -216,6 +327,12 @@ export default {
216
327
  this.removePage(index);
217
328
  });
218
329
 
330
+ /** 页面授权 **/
331
+ bus.$on('authorize', (page) => {
332
+ this.selectorVisible = true;
333
+ //this.selectorData = page.authorize;
334
+ });
335
+
219
336
  /** 组件/页面属性更新(来自 attribute 面板) */
220
337
  bus.$on('updateComponent', (updates) => {
221
338
  if (!this.page || !updates.id) return;
@@ -249,36 +366,47 @@ export default {
249
366
  this.open.type = type;
250
367
  this.open.title = type === 'json' ? 'JSON' : '源码';
251
368
  });
252
- /** 保存 */
253
- bus.$on('save', () => {
254
- if (!this.page) {
369
+
370
+ /** 发布 */
371
+ bus.$on('publish', (page) => {
372
+ if (page.id.startsWith('page_')) {
255
373
  Message.warning('请先选择要保存的页面');
256
374
  return;
257
375
  }
258
- if (this.save) {
259
- this.save(this.page);
260
- return;
261
- }
262
- this.submitPageData();
376
+ this.publishTitle = page.status === 1 ? '查看' : '发布';
377
+ const url = this.urlMode
378
+ ? this.urlMode.replace(
379
+ '{id}',
380
+ page.childrens && page.childrens.length > 0 ? '' : page.id
381
+ )
382
+ : '';
383
+ this.readonly = page.status === 1;
384
+ this.publishForm = { name: page.name, pid: page.pid || '', url: url };
385
+ this.parentData = this.pagesData.filter((item) => item.type === 'page');
386
+ this.scopeType = page.code ? '应用' : '菜单';
387
+ this.publishVisible = true;
263
388
  });
264
- /** 发布 */
265
- bus.$on('publish', (genre) => {
266
- if (!this.page) {
389
+
390
+ /** 保存 */
391
+ bus.$on('save', (newPage) => {
392
+ let page = this.page;
393
+ if (newPage.id !== page.id) {
394
+ page = newPage;
395
+ } else if (!this.page) {
267
396
  Message.warning('请先选择要发布的页面');
268
397
  return;
269
398
  }
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
- }
399
+ const {
400
+ pid,
401
+ name,
402
+ title,
403
+ code,
404
+ description,
405
+ scopeType = 0,
406
+ type = 'page'
407
+ } = page;
408
+ this.form = { pid, name, title, code, description, scopeType, type };
409
+ this.visible = true;
282
410
  });
283
411
  },
284
412
 
@@ -353,9 +481,7 @@ export default {
353
481
  extractPageData() {
354
482
  const {
355
483
  id,
356
- code,
357
484
  name,
358
- title,
359
485
  type,
360
486
  description,
361
487
  componentConfig,
@@ -372,9 +498,7 @@ export default {
372
498
 
373
499
  const meta = {
374
500
  id,
375
- code,
376
501
  name,
377
- title,
378
502
  type,
379
503
  description,
380
504
  componentConfig,
@@ -394,15 +518,14 @@ export default {
394
518
  * 根据页面状态提交保存或更新
395
519
  * @param {Object} extraData - 额外的合并数据(如表单数据)
396
520
  */
397
- submitPageData(extraData = {}) {
521
+ submitPageData() {
398
522
  const { meta, content } = this.extractPageData();
399
523
  const data = {
524
+ status: 0,
400
525
  ...meta,
401
- content: JSON.stringify(content),
402
- ...extraData
526
+ content: JSON.stringify(content)
403
527
  };
404
528
 
405
- // 根据是否有 id 判断是更新还是新建
406
529
  if (meta.status !== undefined) {
407
530
  this.updatePage(data);
408
531
  } else {
@@ -474,6 +597,11 @@ export default {
474
597
  },
475
598
  removePage(index) {
476
599
  const page = this.pagesData[index];
600
+ if (page.id.startsWith('page_')) {
601
+ Message.success('删除成功');
602
+ this.pagesData.splice(index, 1);
603
+ return;
604
+ }
477
605
  const loadingInstance = loading('删除中...');
478
606
  ajax({
479
607
  url: pageDelete,
@@ -524,6 +652,32 @@ export default {
524
652
  }
525
653
  }
526
654
  return null;
655
+ },
656
+ /**
657
+ * 复制 URL 到剪贴板
658
+ */
659
+ copyUrl() {
660
+ navigator.clipboard.writeText(this.publishForm.url);
661
+ Message.success('复制成功');
662
+ },
663
+ /**
664
+ * 提交发布表单
665
+ */
666
+ submitPublishForm() {
667
+ this.$refs.publishForm.validate((valid) => {
668
+ if (valid) {
669
+ Message.warning('接口暂未开通,请复制地址手动创建菜单或应用');
670
+ //this.submitPageData(this.publishForm);
671
+ }
672
+ });
673
+ },
674
+ handleConfirm() {
675
+ console.log('handleConfirm', this.selectorData);
676
+ this.selectorVisible = false;
677
+ },
678
+ handleCancel() {
679
+ this.selectorVisible = false;
680
+ this.selectorData = JSON.parse(JSON.stringify(this.selectorDatas));
527
681
  }
528
682
  },
529
683
  destroyed() {
@@ -1,22 +1,95 @@
1
1
  <template>
2
2
  <div class="es-lowcode__pages">
3
- <es-scrollbar :class="{'is-page':paginations.total > paginations.pageSize}">
3
+ <div
4
+ class="es-lowcode__pages--container"
5
+ :class="{ 'is-page': paginations.total > paginations.pageSize }"
6
+ >
7
+ <es-tree
8
+ height="100%"
9
+ highlight-current
10
+ :default-expanded-keys="expandeds"
11
+ :current-node-key="active"
12
+ :data="newPages"
13
+ :default-active="active"
14
+ :props="defaultProps"
15
+ @current-change="handleSelect"
16
+ >
17
+ <div class="es-lowcode__pages--item" slot-scope="{ node, data }">
18
+ <div class="es-lowcode__pages--item-label">{{ node.label }}</div>
19
+ <es-dropdown @command="(command) => handleCommand(command, data)">
20
+ <i class="es-icon-gengduo"></i>
21
+ <es-dropdown-menu slot="dropdown">
22
+ <es-dropdown-item command="add" v-if="!data.pid">
23
+ 新增
24
+ </es-dropdown-item>
25
+ <es-dropdown-item
26
+ command="authorize"
27
+ v-if="!data.childrens || !data.childrens.length"
28
+ >
29
+ 授权
30
+ </es-dropdown-item>
31
+ <es-dropdown-item command="delete"> 删除 </es-dropdown-item>
32
+ <es-dropdown-item command="edit">编辑</es-dropdown-item>
33
+ <es-dropdown-item command="publish" v-if="!data.pid">{{
34
+ data.status === 1 ? '查看' : '发布'
35
+ }}</es-dropdown-item>
36
+ </es-dropdown-menu>
37
+ </es-dropdown>
38
+ </div>
39
+ </es-tree>
40
+ </div>
41
+ <!-- <es-scrollbar
42
+ :class="{ 'is-page': paginations.total > paginations.pageSize }"
43
+ >
4
44
  <div
5
- v-for="(page, index) in pages"
45
+ v-for="page in newPages"
6
46
  :key="page.id"
7
47
  @click="handleSelect(page)"
8
48
  class="es-lowcode__pages--item"
9
49
  :class="{ 'is-active': active === page.id }"
10
50
  >
11
- <span class="es-lowcode__pages--item-name">{{
12
- page.name || page.id
13
- }}</span>
14
- <i
15
- class="es-icon-shanchu es-lowcode__pages--item-delete"
16
- @click.stop="handleDelete(index)"
17
- ></i>
51
+ <div class="es-lowcode__pages--item-content">
52
+ <span class="es-lowcode__pages--item-name">{{
53
+ page.name || page.id
54
+ }}</span>
55
+ <es-dropdown @command="(command) => handleCommand(command, page)">
56
+ <i class="es-icon-gengduo"></i>
57
+ <es-dropdown-menu slot="dropdown">
58
+ <es-dropdown-item command="add"> 新增 </es-dropdown-item>
59
+ <es-dropdown-item command="delete"> 删除 </es-dropdown-item>
60
+ <es-dropdown-item command="edit">编辑</es-dropdown-item>
61
+ <es-dropdown-item command="publish">{{
62
+ page.status === 1 ? '查看' : '发布'
63
+ }}</es-dropdown-item>
64
+ </es-dropdown-menu>
65
+ </es-dropdown>
66
+ </div>
67
+ <template v-if="page.children && page.children.length">
68
+ <div
69
+ v-for="child in page.children"
70
+ :key="child.id"
71
+ @click="handleSelect(child)"
72
+ class="es-lowcode__pages--item-content"
73
+ :class="{ 'is-active': active === child.id }"
74
+ >
75
+ <span class="es-lowcode__pages--item-name">{{
76
+ child.name || child.id
77
+ }}</span>
78
+ <es-dropdown @command="(command) => handleCommand(command, page)">
79
+ <i class="es-icon-gengduo"></i>
80
+ <es-dropdown-menu slot="dropdown">
81
+ <es-dropdown-item command="add"> 新增 </es-dropdown-item>
82
+ <es-dropdown-item command="delete"> 删除 </es-dropdown-item>
83
+ <es-dropdown-item command="edit">编辑</es-dropdown-item>
84
+ <es-dropdown-item command="publish">{{
85
+ page.status === 1 ? '查看' : '发布'
86
+ }}</es-dropdown-item>
87
+ </es-dropdown-menu>
88
+ </es-dropdown>
89
+ </div>
90
+ </template>
18
91
  </div>
19
- </es-scrollbar>
92
+ </es-scrollbar> -->
20
93
  <es-pagination
21
94
  layout="prev, pager, next"
22
95
  :hide-on-single-page="true"
@@ -27,10 +100,19 @@
27
100
  </div>
28
101
  </template>
29
102
  <script>
103
+ import EsTree from 'eoss/packages/tree';
104
+ import EsMenuItem from 'eoss/packages/menu-item';
105
+ import EsSubmenu from 'eoss/packages/submenu';
30
106
  import bus from 'eoss/src/utils/bus.js';
107
+ import { active } from 'sortablejs';
31
108
  export default {
32
109
  name: 'Pages',
33
110
  inject: ['lowcode'],
111
+ components: {
112
+ EsTree,
113
+ EsMenuItem,
114
+ EsSubmenu
115
+ },
34
116
  props: {
35
117
  pages: {
36
118
  type: Array,
@@ -39,52 +121,118 @@ export default {
39
121
  },
40
122
  data() {
41
123
  return {
42
- active: ''
124
+ newPages: [],
125
+ expandeds: [],
126
+ active: '',
127
+ defaultProps: {
128
+ children: 'childrens',
129
+ label: 'name'
130
+ }
43
131
  };
44
132
  },
45
133
  computed: {
134
+ height() {
135
+ return this.paginations.total > this.paginations.pageSize
136
+ ? 'calc(100% - 48px)'
137
+ : '100%';
138
+ },
46
139
  paginations() {
47
140
  return this.lowcode.paginations;
48
141
  }
49
142
  },
50
143
  watch: {
51
144
  pages: {
52
- handler(newPages) {
53
- this.active = (newPages[0] && newPages[0].id) || '';
145
+ handler(pages) {
146
+ // 深拷贝,避免直接修改 props
147
+ const newPages = pages
148
+ .filter((page) => !page.pid)
149
+ .map((page) => ({ ...page }));
150
+ const childrens = pages.filter((page) => page.pid);
151
+ newPages.forEach((page) => {
152
+ const children = childrens.filter((child) => child.pid === page.id);
153
+ if (children.length) {
154
+ page.childrens = children;
155
+ }
156
+ });
157
+ const first = newPages[0];
158
+ const firstChild = first && first.childrens && first.childrens[0];
159
+ if (firstChild) {
160
+ this.expandeds = [first.id];
161
+ }
162
+ this.active = (firstChild || first || {}).id || '';
163
+ this.newPages = newPages;
54
164
  // 延迟发送事件,确保父组件监听器已注册
55
- this.active && this.$nextTick(() => this.handleSelect(newPages[0]));
165
+ this.active &&
166
+ this.$nextTick(() => this.handleSelect(firstChild || first));
56
167
  },
57
168
  immediate: true
58
169
  }
59
170
  },
60
- mounted() {
61
- },
62
171
  methods: {
63
172
  /**
64
173
  * 处理页面选择事件
65
174
  * @param page 页面对象
66
175
  */
67
- handleSelect(page) {
68
- const pageList = localStorage.getItem('pageList');
69
- if (pageList) {
176
+ handleSelect(data) {
177
+ if (data.childrens && data.childrens.length) {
178
+ return;
179
+ }
180
+ console.log('handleSelect', data);
181
+ if (localStorage.getItem('pageList')) {
70
182
  this.$message.warning('请先保存当前页面');
71
183
  return;
72
184
  }
73
- this.active = page.id;
74
- bus.$emit('selectPage', page);
185
+ bus.$emit('selectPage', data);
186
+ },
187
+ /**
188
+ * 处理下拉菜单命令事件
189
+ * @param {string} command 命令
190
+ * @param {Object} page 页面对象
191
+ */
192
+ handleCommand(command, page) {
193
+ this[command](page);
194
+ },
195
+ /**
196
+ * 处理页面新增事件
197
+ */
198
+ add(page) {
199
+ this.$emit('add', page);
200
+ },
201
+ /**
202
+ * 处理页面编辑事件
203
+ * @param {Object} page 页面对象
204
+ */
205
+ edit(page) {
206
+ bus.$emit('save', page);
207
+ },
208
+ /**
209
+ * 处理页面发布事件
210
+ * @param {Object} page 页面对象
211
+ */
212
+ publish(page) {
213
+ bus.$emit('publish', page);
214
+ },
215
+ /**
216
+ * 处理页面授权事件
217
+ * @param {Object} page 页面对象
218
+ */
219
+ authorize(page) {
220
+ bus.$emit('authorize', page);
75
221
  },
76
222
  /**
77
223
  * 处理页面删除事件
78
- * @param index 页面索引
224
+ * @param {Object} page 页面对象
79
225
  */
80
- handleDelete(index) {
226
+ delete() {
81
227
  this.$confirm('确定删除该页面吗?', '提示', {
82
228
  confirmButtonText: '确定',
83
229
  cancelButtonText: '取消',
84
230
  type: 'warning'
85
- }).then(() => {
86
- bus.$emit('removePage', index);
87
- });
231
+ })
232
+ .then(() => {
233
+ bus.$emit('removePage', page);
234
+ })
235
+ .catch(() => {});
88
236
  }
89
237
  }
90
238
  };
@@ -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>