@netang/quasar 0.1.20 → 0.1.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@netang/quasar",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "description": "netang-quasar",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"
package/utils/$form.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { ref, provide, inject } from 'vue'
2
2
 
3
3
  import $n_has from 'lodash/has'
4
+ import $n_cloneDeep from 'lodash/cloneDeep'
4
5
 
5
6
  import { NPowerKey, NFormKey } from './symbols'
6
7
 
@@ -28,9 +29,9 @@ function create(params) {
28
29
  // 表单节点
29
30
  formRef: ref(null),
30
31
  // 原始表单数据(用于业务使用)
31
- rawFormData: o.formData,
32
+ rawFormData: ref(o.formData),
32
33
  // 请求服务器的原始表单数据(只有执行 setRaw 方法才会生成, 用于请求接口使用)
33
- requestRawFormData: null,
34
+ requestRawFormData: ref(null),
34
35
  // 表单数据
35
36
  formData: ref(o.formData),
36
37
  }
@@ -39,11 +40,11 @@ function create(params) {
39
40
  * 设置原始数据
40
41
  */
41
42
  resForm.setRaw = function (value) {
42
- resForm.rawFormData = value
43
- resForm.requestRawFormData = value
43
+ resForm.rawFormData.value = $n_cloneDeep(value)
44
+ resForm.requestRawFormData.value = resForm.rawFormData.value
44
45
  return value
45
46
  }
46
-
47
+
47
48
  if ($power) {
48
49
  $power.update(function(data, _data) {
49
50
  _data.$form = resForm
package/utils/$power.js CHANGED
@@ -1006,9 +1006,9 @@ async function request(options) {
1006
1006
  requestData = $n_merge({}, formatQuery(query, false), o.$form.formData.value)
1007
1007
 
1008
1008
  // 合并请求原始表单数据
1009
- if ($n_isValidObject(o.$form.requestRawFormData)) {
1009
+ if ($n_isValidObject(o.$form.requestRawFormData.value)) {
1010
1010
  Object.assign(requestData, {
1011
- n__raw: o.$form.requestRawFormData
1011
+ n__raw: o.$form.requestRawFormData.value
1012
1012
  })
1013
1013
  }
1014
1014
 
package/utils/$tree.js CHANGED
@@ -16,10 +16,9 @@ import $n_storage from '@netang/utils/storage'
16
16
 
17
17
  import $n_toast from './toast'
18
18
  import $n_confirm from './confirm'
19
- import $n_dialog from './dialog'
20
19
  import $n_alert from './alert'
21
20
 
22
- import { isRef, watch, inject, ref } from 'vue'
21
+ import { isRef, watch, inject, ref, computed } from 'vue'
23
22
 
24
23
  import { NPowerKey } from './symbols'
25
24
 
@@ -78,6 +77,8 @@ function create(options) {
78
77
  nodes,
79
78
  // 树展开节点
80
79
  expanded,
80
+ // 菜单参数
81
+ menu: menuOptions,
81
82
  // 原始表单数据
82
83
  rawFormData,
83
84
  // 表单数据
@@ -91,6 +92,8 @@ function create(options) {
91
92
  path: '',
92
93
  // 路由参数
93
94
  query: {},
95
+ // 菜单参数
96
+ menu: {},
94
97
  // 是否开启展开节点缓存
95
98
  cache: false,
96
99
  }, options)
@@ -130,6 +133,42 @@ function create(options) {
130
133
  })
131
134
  }
132
135
 
136
+ // 获取菜单状态
137
+ const menuStatus = computed(function() {
138
+
139
+ const o = Object.assign({
140
+ updateName: 'update',
141
+ moveName: 'move',
142
+ copyName: 'copy',
143
+ deleteName: 'realdel',
144
+ statusName: 'status'
145
+ }, menuOptions)
146
+
147
+ const maps = {}
148
+ maps[o.updateName] = 'update'
149
+ maps[o.moveName] = 'move'
150
+ maps[o.copyName] = 'copy'
151
+ maps[o.deleteName] = 'delete'
152
+ maps[o.statusName] = 'status'
153
+
154
+ const allPowerBtn = {}
155
+ for (const item of powerBtns.value) {
156
+ if ($n_has(maps, $n_get(item, 'name'))) {
157
+ allPowerBtn[maps[item.name]] = item
158
+ }
159
+ }
160
+
161
+ return {
162
+ all: $n_isValidObject(allPowerBtn),
163
+ update: $n_has(allPowerBtn, 'update'),
164
+ move: $n_has(allPowerBtn, 'move'),
165
+ copy: $n_has(allPowerBtn, 'copy'),
166
+ delete: $n_has(allPowerBtn, 'delete'),
167
+ status: $n_has(allPowerBtn, 'status'),
168
+ allPowerBtn,
169
+ }
170
+ })
171
+
133
172
  /**
134
173
  * 获取节点
135
174
  */
@@ -212,44 +251,6 @@ function create(options) {
212
251
  }
213
252
  }
214
253
 
215
- /**
216
- * 获取菜单状态
217
- */
218
- function getMenuStatus(options) {
219
-
220
- const o = Object.assign({
221
- updateName: 'update',
222
- moveName: 'move',
223
- copyName: 'copy',
224
- deleteName: 'realdel',
225
- statusName: 'status'
226
- }, options)
227
-
228
- const maps = {}
229
- maps[o.updateName] = 'update'
230
- maps[o.moveName] = 'move'
231
- maps[o.copyName] = 'copy'
232
- maps[o.deleteName] = 'delete'
233
- maps[o.statusName] = 'status'
234
-
235
- const allPowerBtn = {}
236
- for (const item of powerBtns.value) {
237
- if ($n_has(maps, $n_get(item, 'name'))) {
238
- allPowerBtn[maps[item.name]] = item
239
- }
240
- }
241
-
242
- return {
243
- all: $n_isValidObject(allPowerBtn),
244
- update: $n_has(allPowerBtn, 'update'),
245
- move: $n_has(allPowerBtn, 'move'),
246
- copy: $n_has(allPowerBtn, 'copy'),
247
- delete: $n_has(allPowerBtn, 'delete'),
248
- status: $n_has(allPowerBtn, 'status'),
249
- allPowerBtn,
250
- }
251
- }
252
-
253
254
  /**
254
255
  * 确认菜单
255
256
  */
@@ -281,170 +282,17 @@ function create(options) {
281
282
  // 添加下级
282
283
  case 'update':
283
284
  // 更新表单数据
284
- formData.value = Object.assign({}, rawFormData, {
285
+ formData.value = Object.assign({}, rawFormData.value, {
285
286
  pid: o.node.attr.id,
286
287
  })
287
288
  break
288
289
 
289
- // 移至节点上
290
- case 'moveUp':
291
- // 移至节点内
292
- case 'moveIn':
293
- // 移至节点下
294
- case 'moveDown':
295
-
296
- if (! $n_get(o.menuStatus, 'value.allPowerBtn.move.url')) {
297
- console.error('没有找到复制地址')
298
- return
299
- }
300
-
301
- // 创建对话框
302
- $n_dialog.create({
303
- // 标题
304
- title: `移动至节点的${o.type === 'moveUp' ? '上方' : (o.type === 'moveDown' ? '下方' : '内部')}`,
305
- // 宽度
306
- width: 500,
307
- // 组件标识
308
- name: 'moveToTree',
309
- // 组件参数
310
- props: {
311
- // 树节点列表
312
- nodes,
313
- // 树展开节点
314
- expanded,
315
- },
316
- // 显示取消按钮
317
- cancel: true,
318
- // 点击确认执行
319
- async onConfirm({ value: moveNodeId }) {
320
-
321
- // 是否为正确的 id
322
- if (! $n_hasId(moveNodeId)) {
323
- $n_toast({
324
- message: '请选择节点',
325
- })
326
- return false
327
- }
328
-
329
- // 如果节点是自己
330
- if (moveNodeId === o.node.id) {
331
- $n_toast({
332
- message: '不能选择当前节点',
333
- })
334
- return false
335
- }
336
-
337
- // 获取需移动至的节点
338
- const moveNodeItem = getNode(moveNodeId)
339
- if (! moveNodeItem) {
340
- $n_alert({
341
- message: '移动至的节点不存在',
342
- })
343
- return false
344
- }
345
-
346
- // 克隆当前树列表数据
347
- const nodesClone = $n_cloneDeep(nodes.value)
348
-
349
- // 获取当前节点
350
- const nodeItem = getNode(o.node.id)
351
-
352
- // 获取当前节点的父节点
353
- const parentNodeItem = getNode(o.node.attr.pid)
354
-
355
- // 移动列表数据
356
- const moveLists = []
357
-
358
- // 如果是移动至节点内部
359
- // --------------------------------------------------
360
- if (o.type === 'moveIn') {
361
-
362
- // 修改当前节点数据
363
- nodeItem.attr.pid = moveNodeItem.attr.id
364
-
365
- nodeItem.attr.sort =
366
- // 如果移动至的节点有子节点
367
- moveNodeItem.children.length
368
- // 则获取移动至的节点中最后一个子节点的排序号 + 1
369
- ? moveNodeItem.children[moveNodeItem.children.length - 1].attr.sort + 1
370
- // 否则排序号设为 1
371
- : 1
372
-
373
- // 添加移动列表数据
374
- moveLists.push({
375
- id: nodeItem.id,
376
- pid: nodeItem.attr.pid,
377
- sort: nodeItem.attr.sort,
378
- })
379
-
380
- // 将本节点从原父节点中删除
381
- const nodeItemIndex = $n_findIndex(parentNodeItem.children, { id: nodeItem.id })
382
- parentNodeItem.children.splice(nodeItemIndex, 1)
383
-
384
- // 将本节点添加至移动至的节点的子节点中
385
- moveNodeItem.children.push(nodeItem)
386
-
387
- // 否则移动至节点的上方/下方
388
- // --------------------------------------------------
389
- } else {
390
-
391
- // 获取移动至节点的父节点
392
- let moveParentNodeItem = getNode(moveNodeItem.attr.pid)
393
-
394
- // 修改当前节点数据
395
- nodeItem.attr.pid = moveNodeItem.attr.pid
396
- nodeItem.attr.sort = moveNodeItem.attr.sort + (o.type === 'moveUp' ? 0 : 1)
397
-
398
- // 添加移动列表数据
399
- moveLists.push({
400
- id: nodeItem.id,
401
- pid: nodeItem.attr.pid,
402
- sort: nodeItem.attr.sort,
403
- })
404
-
405
- // 将本节点从原父节点中删除
406
- const nodeItemIndex = $n_findIndex(parentNodeItem.children, { id: nodeItem.id })
407
- parentNodeItem.children.splice(nodeItemIndex, 1)
408
-
409
- // 获取移动至节点的索引
410
- const moveNodeItemIndex = $n_findIndex(moveParentNodeItem.children, { id: moveNodeId })
411
-
412
- for (let i = moveNodeItemIndex + (o.type === 'moveUp' ? 0 : 1); i < moveParentNodeItem.children.length; i++) {
413
- const item = moveParentNodeItem.children[i]
414
- item.attr.sort = item.attr.sort + 1
415
- moveLists.push({
416
- id: item.id,
417
- pid: item.attr.pid,
418
- sort: item.attr.sort,
419
- })
420
- }
421
-
422
- // 将本节点插入移动至位置
423
- moveParentNodeItem.children.splice(moveNodeItemIndex + (o.type === 'moveUp' ? 0 : 1), 0, nodeItem)
424
- }
425
-
426
- // 请求 - 移动
427
- const { status } = await $n_http({
428
- url: o.menuStatus.value.allPowerBtn.move.url,
429
- data: {
430
- data: moveLists,
431
- },
432
- })
433
- if (! status) {
434
- // 移动失败, 还原数据
435
- nodes.value = nodesClone
436
- return false
437
- }
438
- },
439
- })
440
- break
441
-
442
290
  // 复制
443
291
  case 'copy':
444
292
  // 确认菜单
445
293
  confirmMenu(async function() {
446
294
 
447
- if (! $n_get(o.menuStatus, 'value.allPowerBtn.copy.url')) {
295
+ if (! $n_get(menuStatus.value, 'allPowerBtn.copy.url')) {
448
296
  console.error('没有找到复制地址')
449
297
  return
450
298
  }
@@ -469,7 +317,7 @@ function create(options) {
469
317
 
470
318
  // 请求 - 复制
471
319
  const { status, data: res } = await $n_http({
472
- url: o.menuStatus.value.allPowerBtn.copy.url,
320
+ url: menuStatus.value.allPowerBtn.copy.url,
473
321
  data: {
474
322
  data: copyLists,
475
323
  },
@@ -526,7 +374,7 @@ function create(options) {
526
374
  return
527
375
  }
528
376
 
529
- if (! $n_get(o.menuStatus, 'value.allPowerBtn.delete.url')) {
377
+ if (! $n_get(menuStatus.value, 'allPowerBtn.delete.url')) {
530
378
  console.error('没有找到删除地址')
531
379
  return
532
380
  }
@@ -536,7 +384,7 @@ function create(options) {
536
384
 
537
385
  // 请求 - 删除
538
386
  const { status } = await $n_http({
539
- url: o.menuStatus.value.allPowerBtn.delete.url,
387
+ url: menuStatus.value.allPowerBtn.delete.url,
540
388
  data: {
541
389
  id: o.node.id,
542
390
  },
@@ -561,7 +409,7 @@ function create(options) {
561
409
  // 全部正常
562
410
  case 'statusNormal':
563
411
 
564
- if (! $n_get(o.menuStatus, 'value.allPowerBtn.status.url')) {
412
+ if (! $n_get(menuStatus.value, 'allPowerBtn.status.url')) {
565
413
  console.error('没有找到状态地址')
566
414
  return
567
415
  }
@@ -587,7 +435,7 @@ function create(options) {
587
435
 
588
436
  // 请求 - 全部禁用/正常
589
437
  const { status } = await $n_http({
590
- url: o.menuStatus.value.allPowerBtn.status.url,
438
+ url: menuStatus.value.allPowerBtn.status.url,
591
439
  data: {
592
440
  // ids
593
441
  ids: statusIds,
@@ -669,6 +517,95 @@ function create(options) {
669
517
  expanded.value = [0]
670
518
  }
671
519
 
520
+ /**
521
+ * 判断节点能否被拖拽
522
+ */
523
+ function allowDrag(draggingNode) {
524
+ return $n_hasId(draggingNode.id)
525
+ }
526
+
527
+ /**
528
+ * 拖拽时判定目标节点能否被放置, type 参数: top / inner / bottom / none ( 目标节点上方 / 目标节点内部 / 目标节点下方 / 无任何操作 )
529
+ */
530
+ function allowDrop(draggingNode, dropNode, dropType) {
531
+ return dropType === 'inner'
532
+ || $n_hasId(dropNode.id)
533
+ }
534
+
535
+ /**
536
+ * 树节点拖拽结束
537
+ */
538
+ async function nodeDragEnd(draggingNode, dropNode, dropType, doDrop) {
539
+ if (dropType !== 'none') {
540
+
541
+ if (! $n_get(menuStatus.value, 'allPowerBtn.move.url')) {
542
+
543
+ // 提示框
544
+ $n_alert({
545
+ message: '没有找到移动地址',
546
+ })
547
+
548
+ return
549
+ }
550
+
551
+ // 克隆当前树列表数据
552
+ const nodesClone = $n_cloneDeep(nodes.value)
553
+
554
+ // 开始拖拽
555
+ const children = doDrop()
556
+ if (children === false) {
557
+ return
558
+ }
559
+
560
+ // 修改拖拽节点的父级 id
561
+ draggingNode.attr.pid =
562
+ // 如果拖动节点 在 目标节点的 内部
563
+ dropType === 'inner' ?
564
+ // 将拖动节点的 pid 改为 目标节点的 id
565
+ dropNode.attr.id
566
+ // 将拖动节点的 pid 改为 目标节点的 pid
567
+ : dropNode.attr.pid
568
+
569
+ // 移动列表
570
+ const moveLists = []
571
+
572
+ // 当前拖拽节点在新列表中的索引
573
+ const dropIndex = $n_findIndex(children, e => e.id === draggingNode.id)
574
+ if (dropIndex > -1) {
575
+
576
+ for (let i = dropIndex; i < children.length; i++) {
577
+ const { attr } = children[i]
578
+ attr.sort = i + 1
579
+ moveLists.push({
580
+ id: attr.id,
581
+ pid: attr.pid,
582
+ sort: attr.sort,
583
+ })
584
+ }
585
+
586
+ // 如果有移动列表
587
+ if (moveLists.length) {
588
+
589
+ // 请求 - 移动
590
+ const { status } = await $n_http({
591
+ url: menuStatus.value.allPowerBtn.move.url,
592
+ data: {
593
+ data: moveLists,
594
+ },
595
+ })
596
+
597
+ // 移动成功
598
+ if (status) {
599
+ return
600
+ }
601
+ }
602
+ }
603
+
604
+ // 移动失败, 还原数据
605
+ nodes.value = nodesClone
606
+ }
607
+ }
608
+
672
609
  return {
673
610
  // 当前路由全路径
674
611
  routeFullPath: $route.fullPath,
@@ -676,6 +613,8 @@ function create(options) {
676
613
  routePath: $route.path,
677
614
  // 当前路由参数
678
615
  routeQuery: $route.query,
616
+ // 菜单状态
617
+ menuStatus,
679
618
  // 获取当前路由
680
619
  getRoute() {
681
620
  return $route
@@ -686,8 +625,6 @@ function create(options) {
686
625
  updateNode,
687
626
  // 删除节点
688
627
  deleteNode,
689
- // 获取菜单状态
690
- getMenuStatus,
691
628
  // 菜单点击
692
629
  menuClick,
693
630
  // 获取展开节点缓存
@@ -698,6 +635,12 @@ function create(options) {
698
635
  expandAll,
699
636
  // 收起全部
700
637
  collapseAll,
638
+ // 判断节点能否被拖拽
639
+ allowDrag,
640
+ // 拖拽时判定目标节点能否被放置, type 参数: top / inner / bottom / none ( 目标节点上方 / 目标节点内部 / 目标节点下方 / 无任何操作 )
641
+ allowDrop,
642
+ // 树节点拖拽结束
643
+ nodeDragEnd,
701
644
  }
702
645
  }
703
646