w-web-perm 1.0.11 → 1.0.13

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 (73) hide show
  1. package/.github/workflows/ci-test.yml +1 -1
  2. package/.vscode/launch.json +0 -1
  3. package/README.md +0 -1
  4. package/dist/css/app.f22995d1.css +1 -0
  5. package/dist/index.tmp +1 -1
  6. package/dist/js/app-legacy.82274c39.js +2 -0
  7. package/dist/js/app-legacy.82274c39.js.map +1 -0
  8. package/dist/js/app.82274c39.js +2 -0
  9. package/dist/js/app.82274c39.js.map +1 -0
  10. package/dist/js/chunk-vendors-legacy.d89048a8.js +13 -0
  11. package/dist/js/chunk-vendors-legacy.d89048a8.js.map +1 -0
  12. package/dist/js/chunk-vendors.d89048a8.js +13 -0
  13. package/dist/js/chunk-vendors.d89048a8.js.map +1 -0
  14. package/dist/w-web-perm.umd.js +2 -2
  15. package/dist/w-web-perm.umd.js.map +1 -1
  16. package/docs/WWebPerm.html +2 -2
  17. package/docs/WWebPerm.mjs.html +212 -64
  18. package/docs/index.html +1 -1
  19. package/g.backupDb.mjs +1 -1
  20. package/g.initialData.mjs +211 -111
  21. package/g.initialTestData.mjs +2 -1
  22. package/g.mjs +0 -0
  23. package/g.provideGrups.mjs +87 -0
  24. package/g.providePemis.mjs +43 -0
  25. package/g.provideTargets.mjs +20 -13
  26. package/g.provideUsers.mjs +45 -13
  27. package/package.json +11 -11
  28. package/script.txt +22 -0
  29. package/server/WWebPerm.mjs +211 -63
  30. package/server/provideGrups.mjs +64 -0
  31. package/server/{provideRuleGroups.mjs → providePemis.mjs} +14 -15
  32. package/server/provideTargets.mjs +8 -5
  33. package/server/provideUsers.mjs +9 -9
  34. package/src/App.vue +18 -5
  35. package/src/components/Common/LoadingWinBar.vue +1 -1
  36. package/src/components/Layout.vue +13 -5
  37. package/src/components/LayoutContent.vue +31 -16
  38. package/src/components/LayoutContentGrups.vue +793 -0
  39. package/src/components/LayoutContentPemis.vue +793 -0
  40. package/src/components/LayoutContentTargets.vue +481 -307
  41. package/src/components/LayoutContentUsers.vue +796 -291
  42. package/src/components/LayoutState.vue +1 -1
  43. package/src/components/VeCgrups.vue +926 -0
  44. package/src/components/VeCpemis.vue +926 -0
  45. package/src/components/VeCrules.vue +820 -0
  46. package/src/main.js +2 -2
  47. package/src/perm.mjs +5 -5
  48. package/src/plugins/mDataSelectorSchema.mjs +2 -2
  49. package/src/plugins/mDataSupport.mjs +4 -4
  50. package/src/plugins/mShare.mjs +444 -153
  51. package/src/plugins/mUI.mjs +37 -19
  52. package/src/schema/gi.mjs +1 -1
  53. package/src/schema/index.mjs +4 -2
  54. package/src/schema/tables/grups.mjs +154 -0
  55. package/src/schema/tables/{ruleGroups.mjs → pemis.mjs} +27 -16
  56. package/src/schema/tables/targets.mjs +49 -16
  57. package/src/schema/tables/users.mjs +55 -27
  58. package/src/store/mutations.mjs +375 -150
  59. package/srv.mjs +2 -2
  60. package/tableTags-web-perm.json +1 -1
  61. package/dist/css/app.de0fb2b6.css +0 -1
  62. package/dist/js/app-legacy.b990ec2e.js +0 -2
  63. package/dist/js/app-legacy.b990ec2e.js.map +0 -1
  64. package/dist/js/app.b990ec2e.js +0 -2
  65. package/dist/js/app.b990ec2e.js.map +0 -1
  66. package/dist/js/chunk-vendors-legacy.d6cc2480.js +0 -13
  67. package/dist/js/chunk-vendors-legacy.d6cc2480.js.map +0 -1
  68. package/dist/js/chunk-vendors.d6cc2480.js +0 -13
  69. package/dist/js/chunk-vendors.d6cc2480.js.map +0 -1
  70. package/g.provideRuleGroups.mjs +0 -56
  71. package/src/components/LayoutContentGroups.vue +0 -671
  72. package/src/components/VeUser.vue +0 -446
  73. package/src/components/ruleGroup.vue +0 -645
@@ -0,0 +1,820 @@
1
+ <template>
2
+ <WDialog
3
+ :show.sync="bShow"
4
+ :title="$t('pemiEditCrules')"
5
+ :icon="mdiFormatListCheckbox"
6
+ :minWidth="800"
7
+ :maxWidth="800"
8
+ :fullscreen="fullscreen"
9
+ :contentBackgroundColor="'#fff'"
10
+ :headerBtns="useHeaderBtns"
11
+ :hasSaveBtn="isModified"
12
+ :save-btn-tooltip="$t('save')"
13
+ :close-btn-tooltip="$t('close')"
14
+ @click-btns="clickBtns"
15
+ @click-save="clickSave"
16
+ @click-close="clickClose"
17
+ @resize="resizeDialog"
18
+ >
19
+ <template v-slot:content>
20
+ <div>
21
+
22
+ <div
23
+ style="border-bottom:1px solid #ddd; background:#fff;"
24
+ v-domresize
25
+ @domresize="resizeHead"
26
+ >
27
+
28
+ <!-- 功能區 -->
29
+ <div style="padding:5px; background:#fff; display:flex; align-items:center;">
30
+
31
+ <template>
32
+
33
+ <WButtonCircle
34
+ :paddingStyle="{v:6,h:6}"
35
+ :tooltip="$t('cruleCheckAllYes')"
36
+ :icon="mdiCheckboxMultipleMarked"
37
+ :backgroundColor="'#fff'"
38
+ :backgroundColorHover="'#f2f2f2'"
39
+ _textColor="'#eee'"
40
+ _textColorHover="'#fff'"
41
+ :iconColor="'#444'"
42
+ :iconColorHover="'#222'"
43
+ :shadow="false"
44
+ @click="toggleItemsEnableAllYes"
45
+ ></WButtonCircle>
46
+
47
+ <div style="padding-left:6px;"></div>
48
+
49
+ </template>
50
+
51
+ <template>
52
+
53
+ <WButtonCircle
54
+ :paddingStyle="{v:6,h:6}"
55
+ :tooltip="$t('cruleCheckAllNo')"
56
+ :icon="mdiCheckboxMultipleBlankOutline"
57
+ :backgroundColor="'#fff'"
58
+ :backgroundColorHover="'#f2f2f2'"
59
+ _textColor="'#eee'"
60
+ _textColorHover="'#fff'"
61
+ :iconColor="'#444'"
62
+ :iconColorHover="'#222'"
63
+ :shadow="false"
64
+ @click="toggleItemsEnableAllNo"
65
+ ></WButtonCircle>
66
+
67
+ <div style="padding-left:6px;"></div>
68
+
69
+ </template>
70
+
71
+ <template>
72
+
73
+ <WButtonCircle
74
+ :paddingStyle="{v:6,h:6}"
75
+ :tooltip="$t('cruleCheckAllInv')"
76
+ :icon="mdiCodeTagsCheck"
77
+ :backgroundColor="'#fff'"
78
+ :backgroundColorHover="'#f2f2f2'"
79
+ _textColor="'#eee'"
80
+ _textColorHover="'#fff'"
81
+ :iconColor="'#444'"
82
+ :iconColorHover="'#222'"
83
+ :shadow="false"
84
+ @click="toggleItemsEnableAllInv"
85
+ ></WButtonCircle>
86
+
87
+ <div style="padding-left:6px;"></div>
88
+
89
+ </template>
90
+
91
+ <template v-if="hasItemsCheck">
92
+
93
+ <WButtonCircle
94
+ :paddingStyle="{v:6,h:6}"
95
+ :tooltip="$t('cruleDeleteCheckTargets')"
96
+ :icon="mdiTrashCanOutline"
97
+ :backgroundColor="'#fff'"
98
+ :backgroundColorHover="'#f2f2f2'"
99
+ _textColor="'#eee'"
100
+ _textColorHover="'#fff'"
101
+ :iconColor="'#444'"
102
+ :iconColorHover="'#222'"
103
+ :shadow="false"
104
+ @click="deleteItemsCheck"
105
+ ></WButtonCircle>
106
+
107
+ <div style="padding-left:6px;"></div>
108
+
109
+ </template>
110
+
111
+ </div>
112
+
113
+ </div>
114
+
115
+ <template v-if="items">
116
+ <WAggridVueDyn
117
+ ref="rftable"
118
+ :style="`width:100%;`"
119
+ :height="contentHeight"
120
+ :opt="opt"
121
+ >
122
+ </WAggridVueDyn>
123
+ </template>
124
+
125
+ <div style="padding:10px 15px; font-size:0.8rem;" v-else>
126
+ {{$t('waitingData')}}
127
+ </div>
128
+
129
+ </div>
130
+ </template>
131
+ </WDialog>
132
+ </template>
133
+
134
+ <script>
135
+ import { mdiDeleteForever, mdiFullscreen, mdiFullscreenExit, mdiFormatListCheckbox, mdiFileTree, mdiTrashCanOutline, mdiCheckboxMultipleBlankOutline, mdiCheckboxMultipleMarked, mdiCodeTagsCheck } from '@mdi/js/mdi.js'
136
+ import Vue from 'vue'
137
+ import JSON5 from 'json5'
138
+ import get from 'lodash-es/get.js'
139
+ import set from 'lodash-es/set.js'
140
+ import each from 'lodash-es/each.js'
141
+ import map from 'lodash-es/map.js'
142
+ import trim from 'lodash-es/trim.js'
143
+ import uniq from 'lodash-es/uniq.js'
144
+ import size from 'lodash-es/size.js'
145
+ import filter from 'lodash-es/filter.js'
146
+ import join from 'lodash-es/join.js'
147
+ import sortBy from 'lodash-es/sortBy.js'
148
+ import cloneDeep from 'lodash-es/cloneDeep.js'
149
+ import genPm from 'wsemi/src/genPm.mjs'
150
+ import sep from 'wsemi/src/sep.mjs'
151
+ import delay from 'wsemi/src/delay.mjs'
152
+ import iseobj from 'wsemi/src/iseobj.mjs'
153
+ import isestr from 'wsemi/src/isestr.mjs'
154
+ import WDialog from 'w-component-vue/src/components/WDialog.vue'
155
+ import WText from 'w-component-vue/src/components/WText.vue'
156
+ import WTextSuggest from 'w-component-vue/src/components/WTextSuggest.vue'
157
+ import WSwitch from 'w-component-vue/src/components/WSwitch.vue'
158
+ import WCheckbox from 'w-component-vue/src/components/WCheckbox.vue'
159
+ import WIcon from 'w-component-vue/src/components/WIcon.vue'
160
+ import WButtonChip from 'w-component-vue/src/components/WButtonChip.vue'
161
+ import WButtonCircle from 'w-component-vue/src/components/WButtonCircle.vue'
162
+ import WAggridVueDyn from 'w-component-vue/src/components/WAggridVueDyn.vue'
163
+
164
+
165
+ export default {
166
+ components: {
167
+ WDialog,
168
+ WText,
169
+ WTextSuggest,
170
+ WSwitch,
171
+ WCheckbox,
172
+ WIcon,
173
+ WButtonChip,
174
+ WButtonCircle,
175
+ WAggridVueDyn,
176
+ },
177
+ props: {
178
+ },
179
+ data: function() {
180
+ return {
181
+ mdiDeleteForever,
182
+ mdiFullscreen,
183
+ mdiFullscreenExit,
184
+ mdiFormatListCheckbox,
185
+ mdiFileTree,
186
+ mdiTrashCanOutline,
187
+ mdiCheckboxMultipleBlankOutline,
188
+ mdiCheckboxMultipleMarked,
189
+ mdiCodeTagsCheck,
190
+
191
+ bShow: false,
192
+ pm: null,
193
+
194
+ fullscreen: false,
195
+
196
+ panelWidth: 100,
197
+ panelHeight: 100,
198
+ headHeight: 100,
199
+
200
+ isModified: false,
201
+
202
+ pemi: null,
203
+
204
+ items: [],
205
+ itemsCheck: [],
206
+ opt: null,
207
+
208
+ }
209
+ },
210
+ mounted: function() {
211
+ //console.log('mounted')
212
+
213
+ let vo = this
214
+
215
+ //set
216
+ Vue.prototype.$dg.showVeCrules = vo.show
217
+ Vue.prototype.$dg.toggleItemEnableById = vo.toggleItemEnableById
218
+
219
+ },
220
+ computed: {
221
+
222
+ targets: function() {
223
+ let rs = get(this, `$store.state.targets`)
224
+ rs = sortBy(rs, 'order')
225
+ return rs
226
+ },
227
+
228
+ pemis: function() {
229
+ let rs = get(this, `$store.state.pemis`)
230
+ rs = sortBy(rs, 'order')
231
+ return rs
232
+ },
233
+
234
+ grups: function() {
235
+ let rs = get(this, `$store.state.grups`)
236
+ rs = sortBy(rs, 'order')
237
+ return rs
238
+ },
239
+
240
+ users: function() {
241
+ let rs = get(this, `$store.state.users`)
242
+ rs = sortBy(rs, 'order')
243
+ return rs
244
+ },
245
+
246
+ kpHeaderBtns: function() {
247
+ let vo = this
248
+ let kp = {
249
+ // delete: {
250
+ // icon: mdiDeleteForever,
251
+ // tooltip: `${vo.$t('delete')}${vo.tableNameCht}`,
252
+ // evName: 'delete'
253
+ // },
254
+ toFullscreen: {
255
+ icon: mdiFullscreen,
256
+ tooltip: vo.$t('screenFull'),
257
+ evName: 'toFullscreen'
258
+ },
259
+ toNormalscreen: {
260
+ icon: mdiFullscreenExit,
261
+ tooltip: vo.$t('screenNormal'),
262
+ evName: 'toNormalscreen'
263
+ },
264
+ }
265
+ return kp
266
+ },
267
+
268
+ useHeaderBtns: function() {
269
+ let vo = this
270
+ let bts = []
271
+ if (true) {
272
+ let k = vo.fullscreen ? 'toNormalscreen' : 'toFullscreen'
273
+ bts = [
274
+ ...bts,
275
+ vo.kpHeaderBtns[k]
276
+ ]
277
+ }
278
+ // if (vo.useDelete) {
279
+ // let k = 'delete'
280
+ // bts = [
281
+ // ...bts,
282
+ // vo.kpHeaderBtns[k]
283
+ // ]
284
+ // }
285
+ return bts
286
+ },
287
+
288
+ contentHeight: function() {
289
+ let vo = this
290
+
291
+ //h
292
+ let h = vo.panelHeight - vo.headHeight
293
+ h = Math.max(h, 0)
294
+
295
+ return h
296
+ },
297
+
298
+ hasItemsCheck: function() {
299
+ let vo = this
300
+
301
+ //h
302
+ let b = vo.itemsCheck.length > 0
303
+
304
+ return b
305
+ },
306
+
307
+ },
308
+ methods: {
309
+
310
+ resizeDialog: function(msg) {
311
+ // console.log('methods resizeDialog', msg)
312
+
313
+ let vo = this
314
+
315
+ //panelWidth, panelHeight
316
+ vo.panelWidth = msg.panelWidth
317
+ vo.panelHeight = msg.contentHeightMax
318
+
319
+ },
320
+
321
+ resizeHead: function(msg) {
322
+ // console.log('methods resizeHead', msg)
323
+
324
+ let vo = this
325
+
326
+ //headHeight
327
+ vo.headHeight = msg.snew.offsetHeight
328
+
329
+ },
330
+
331
+ genOpt: function() {
332
+ // console.log('methods genOpt')
333
+
334
+ let vo = this
335
+
336
+ //default
337
+ vo.itemsCheck = []
338
+
339
+ //opt
340
+ let opt = null
341
+ if (size(vo.items) > 0) {
342
+
343
+ //ks
344
+ let ks = [
345
+ 'id',
346
+ 'enable',
347
+ ]
348
+ // console.log('ks', ks)
349
+
350
+ //kpHead
351
+ let kpHead = {
352
+ 'id': vo.$t('targetId'),
353
+ 'enable': vo.$t('targetEnable'),
354
+ }
355
+
356
+ //opt
357
+ opt = {
358
+ language: vo.$t('aggridLanguage'),
359
+ rows: vo.items,
360
+ keys: ks,
361
+ kpHead,
362
+ autoFitColumn: true,
363
+ defHeadFilter: true,
364
+ defCellAlignH: 'left',
365
+ // kpCellEditable: {
366
+ // 'id': true,
367
+ // 'enable': true,
368
+ // },
369
+ kpHeadWidth: {
370
+ 'enable': 50,
371
+ },
372
+ // kpRowDrag: {
373
+ // 'id': true,
374
+ // },
375
+ // kpHeadFilter: {
376
+ // 'enable': false,
377
+ // },
378
+ kpHeadFilterType: {
379
+ 'id': 'text',
380
+ 'enable': 'text',
381
+ },
382
+ // kpHeadCheckBox: {
383
+ // 'id': true,
384
+ // },
385
+ kpCellRender: {
386
+ 'id': (v, k, r) => {
387
+ // console.log('kpCellRender id', v)
388
+
389
+ return v
390
+ },
391
+ 'enable': (v, k, r) => {
392
+ // console.log('kpCellRender enable', v, k, r)
393
+
394
+ //id
395
+ let id = get(r, 'id', '')
396
+ // console.log('id', id, k, r)
397
+
398
+ let t = `
399
+ <input type="checkbox" ${v === 'y' ? 'checked' : ''} onclick="$vo.$dg.toggleItemEnableById('${id}')" />
400
+ `
401
+
402
+ return t
403
+ },
404
+ },
405
+ rowsChange: (rs) => {
406
+ // console.log('rowsChange', rs)
407
+ // console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
408
+
409
+ //isModified
410
+ vo.isModified = true
411
+
412
+ },
413
+ rowChecked: (rs) => {
414
+ // console.log('rowChecked', rs)
415
+ // console.log('rowChecked cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
416
+
417
+ //save itemsCheck
418
+ vo.itemsCheck = cloneDeep(rs)
419
+
420
+ },
421
+ }
422
+ // console.log('opt', opt)
423
+
424
+ }
425
+
426
+ //save
427
+ vo.opt = opt
428
+
429
+ },
430
+
431
+ deleteItemsCheck: function() {
432
+ // console.log('method deleteItemsCheck')
433
+
434
+ let vo = this
435
+
436
+ //check
437
+ if (size(vo.itemsCheck) === 0) {
438
+ return
439
+ }
440
+
441
+ //cloneDeep
442
+ let rows = get(vo, 'opt.rows', [])
443
+
444
+ //cloneDeep
445
+ rows = cloneDeep(rows)
446
+
447
+ //filter
448
+ each(vo.itemsCheck, (v) => {
449
+ // console.log('v', v)
450
+ let id = get(v, 'data.id', '')
451
+ if (!isestr(id)) {
452
+ console.log(`invalid id`)
453
+ return true //跳出換下一個
454
+ }
455
+ rows = filter(rows, (vv) => {
456
+ return vv.id !== id
457
+ })
458
+ })
459
+
460
+ //clear
461
+ vo.itemsCheck = []
462
+
463
+ //save
464
+ vo.opt.rows = rows
465
+ // console.log('deleteItemsCheck cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
466
+
467
+ //isModified
468
+ vo.isModified = true
469
+
470
+ },
471
+
472
+ refresh: function() {
473
+ let vo = this
474
+
475
+ //cmp
476
+ let cmp = get(vo, '$refs.rftable.$refs.$self')
477
+ // console.log('cmp', cmp)
478
+
479
+ //refresh, 因set不會觸發kpCellRender, 故須另外調用組件函數refresh, 進而觸發kpCellRender, 使能更新數據
480
+ cmp.refresh()
481
+
482
+ },
483
+
484
+ getDisplayData: function() {
485
+ let vo = this
486
+
487
+ //cmp
488
+ let cmp = get(vo, '$refs.rftable.$refs.$self')
489
+ // console.log('cmp', cmp)
490
+
491
+ //getDisplayData
492
+ let rows = cmp.getDisplayData()
493
+
494
+ return rows
495
+ },
496
+
497
+ toggleItemEnableById: function(id) {
498
+ // console.log('toggleItemEnableById', id)
499
+
500
+ let vo = this
501
+
502
+ //check
503
+ if (!isestr(id)) {
504
+ vo.$alert(`${vo.$t('cruleEditNoId')}`, { type: 'error' })
505
+ return
506
+ }
507
+
508
+ //rows
509
+ let rows = get(vo, 'opt.rows', [])
510
+
511
+ //find
512
+ let r = null
513
+ let kr = null
514
+ each(rows, (v, k) => {
515
+ if (get(v, 'id', '') === id) {
516
+ r = v
517
+ kr = k
518
+ return false //跳出
519
+ }
520
+ })
521
+
522
+ //check
523
+ if (!iseobj(r)) {
524
+ vo.$alert(`${vo.$t('cruleEditNoRule')}`, { type: 'error' })
525
+ return
526
+ }
527
+
528
+ //enable
529
+ let _enable = get(r, 'enable', 'n')
530
+ let enable = _enable === 'y' ? 'n' : 'y'
531
+ // console.log('enable', enable)
532
+
533
+ //set
534
+ set(vo, `opt.rows[${kr}].enable`, enable)
535
+ // console.log('vo.opt.rows[kr]', cloneDeep(vo.opt.rows[kr]))
536
+
537
+ //refresh
538
+ vo.refresh()
539
+
540
+ //isModified
541
+ vo.isModified = true
542
+
543
+ },
544
+
545
+ toggleItemsEnableAllYes: function() {
546
+ // console.log('toggleItemsEnableAllYes')
547
+
548
+ let vo = this
549
+
550
+ //rows
551
+ let rows = get(vo, 'opt.rows', [])
552
+ // console.log('rows', rows)
553
+
554
+ //kpRow
555
+ let kpRow = {}
556
+ each(rows, (r, kr) => {
557
+ kpRow[r.id] = kr
558
+ })
559
+
560
+ //rowsEff
561
+ let rowsEff = vo.getDisplayData()
562
+ // console.log('rowsEff', rowsEff)
563
+
564
+ //toggle
565
+ each(rowsEff, (r) => {
566
+
567
+ //kr
568
+ let kr = kpRow[r.id]
569
+
570
+ //set
571
+ set(vo, `opt.rows[${kr}].enable`, 'y')
572
+ // console.log('vo.opt.rows[kr]', cloneDeep(vo.opt.rows[kr]))
573
+
574
+ })
575
+
576
+ //refresh
577
+ vo.refresh()
578
+
579
+ //isModified
580
+ vo.isModified = true
581
+
582
+ },
583
+
584
+ toggleItemsEnableAllNo: function() {
585
+ // console.log('toggleItemsEnableAllNo')
586
+
587
+ let vo = this
588
+
589
+ //rows
590
+ let rows = get(vo, 'opt.rows', [])
591
+ // console.log('rows', rows)
592
+
593
+ //kpRow
594
+ let kpRow = {}
595
+ each(rows, (r, kr) => {
596
+ kpRow[r.id] = kr
597
+ })
598
+
599
+ //rowsEff
600
+ let rowsEff = vo.getDisplayData()
601
+ // console.log('rowsEff', rowsEff)
602
+
603
+ //toggle
604
+ each(rowsEff, (r) => {
605
+
606
+ //kr
607
+ let kr = kpRow[r.id]
608
+
609
+ //set
610
+ set(vo, `opt.rows[${kr}].enable`, 'n')
611
+ // console.log('vo.opt.rows[kr]', cloneDeep(vo.opt.rows[kr]))
612
+
613
+ })
614
+
615
+ //refresh
616
+ vo.refresh()
617
+
618
+ //isModified
619
+ vo.isModified = true
620
+
621
+ },
622
+
623
+ toggleItemsEnableAllInv: function() {
624
+ // console.log('toggleItemsEnableAllInv')
625
+
626
+ let vo = this
627
+
628
+ //rows
629
+ let rows = get(vo, 'opt.rows', [])
630
+ // console.log('rows', rows)
631
+
632
+ //kpRow
633
+ let kpRow = {}
634
+ each(rows, (r, kr) => {
635
+ kpRow[r.id] = kr
636
+ })
637
+
638
+ //rowsEff
639
+ let rowsEff = vo.getDisplayData()
640
+ // console.log('rowsEff', rowsEff)
641
+
642
+ //toggle
643
+ each(rowsEff, (r) => {
644
+
645
+ //kr
646
+ let kr = kpRow[r.id]
647
+
648
+ //enable
649
+ let _enable = get(r, 'enable', 'n')
650
+ let enable = _enable === 'y' ? 'n' : 'y'
651
+
652
+ //set
653
+ set(vo, `opt.rows[${kr}].enable`, enable)
654
+ // console.log('vo.opt.rows[kr]', cloneDeep(vo.opt.rows[kr]))
655
+
656
+ })
657
+
658
+ //refresh
659
+ vo.refresh()
660
+
661
+ //isModified
662
+ vo.isModified = true
663
+
664
+ },
665
+
666
+ clickBtns: function(msg) {
667
+ // console.log('clickBtns', msg)
668
+
669
+ let vo = this
670
+
671
+ //evName
672
+ if (msg.evName === 'toFullscreen') {
673
+ vo.fullscreen = true
674
+ }
675
+ else if (msg.evName === 'toNormalscreen') {
676
+ vo.fullscreen = false
677
+ }
678
+
679
+ },
680
+
681
+ clickSave: function(msg) {
682
+ //console.log('methods clickSave', msg)
683
+
684
+ let vo = this
685
+
686
+ async function core() {
687
+
688
+ //show loading
689
+ vo.$ui.updateLoading(true)
690
+
691
+ //delay
692
+ await delay(300)
693
+
694
+ //rows
695
+ let rows = get(vo, 'opt.rows', [])
696
+ // console.log('rows', rows)
697
+
698
+ //kpRule
699
+ let kpRule = {}
700
+ each(rows, (r) => {
701
+ let id = get(r, 'id', '')
702
+ let enable = get(r, 'enable', '')
703
+ if (!isestr(id)) {
704
+ console.log(`invalid id`)
705
+ return true //跳出換下一個
706
+ }
707
+ if (!isestr(enable)) {
708
+ console.log(`invalid enable`)
709
+ return true //跳出換下一個
710
+ }
711
+ kpRule[id] = enable
712
+ })
713
+ // console.log('kpRule', kpRule)
714
+
715
+ //crules
716
+ let crules = JSON.stringify(kpRule)
717
+ // console.log('crules', crules)
718
+
719
+ return crules
720
+ }
721
+
722
+ //core
723
+ core()
724
+ .then((rows) => {
725
+
726
+ //resolve
727
+ vo.pm.resolve(rows)
728
+
729
+ //hide
730
+ vo.bShow = false
731
+
732
+ })
733
+ .catch(() => { })
734
+ .finally(() => {
735
+
736
+ //save按鈕解除loading
737
+ msg.pm.resolve()
738
+
739
+ //hide loading
740
+ vo.$ui.updateLoading(false)
741
+
742
+ })
743
+
744
+ },
745
+
746
+ clickClose: function() {
747
+ //console.log('methods clickClose')
748
+
749
+ let vo = this
750
+
751
+ //reject
752
+ vo.pm.reject('close window')
753
+
754
+ //hide
755
+ vo.bShow = false
756
+
757
+ },
758
+
759
+ show: function (pemi) {
760
+ // console.log('methods show', pemi)
761
+
762
+ let vo = this
763
+
764
+ //pm
765
+ vo.pm = genPm()
766
+
767
+ //default
768
+ vo.isModified = false
769
+
770
+ //cloneDeep
771
+ pemi = cloneDeep(pemi)
772
+
773
+ //crules
774
+ let crules = get(pemi, 'crules', '')
775
+
776
+ //kpRule
777
+ let kpRule = {}
778
+ if (isestr(crules)) {
779
+ try {
780
+ kpRule = JSON5.parse(crules)
781
+ }
782
+ catch (err) {
783
+ console.log('crules', crules)
784
+ console.log('err', err)
785
+ }
786
+
787
+ }
788
+ // console.log('kpRule', kpRule)
789
+
790
+ //items
791
+ let items = map(vo.targets, (v) => {
792
+ let enable = get(kpRule, v.id, '')
793
+ enable = enable === 'y' ? 'y' : 'n'
794
+ let r = {
795
+ id: v.id,
796
+ enable,
797
+ }
798
+ return r
799
+ })
800
+ // console.log('items', items)
801
+
802
+ //save
803
+ vo.pemi = pemi
804
+ vo.items = items
805
+
806
+ //genOpt
807
+ vo.genOpt()
808
+
809
+ //bShow
810
+ vo.bShow = true
811
+
812
+ return vo.pm
813
+ },
814
+
815
+ }
816
+ }
817
+ </script>
818
+
819
+ <style scoped>
820
+ </style>