w-web-perm 1.0.12 → 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 (68) hide show
  1. package/.vscode/launch.json +0 -1
  2. package/README.md +0 -1
  3. package/dist/css/app.f22995d1.css +1 -0
  4. package/dist/index.tmp +1 -1
  5. package/dist/js/app-legacy.82274c39.js +2 -0
  6. package/dist/js/app-legacy.82274c39.js.map +1 -0
  7. package/dist/js/app.82274c39.js +2 -0
  8. package/dist/js/app.82274c39.js.map +1 -0
  9. package/dist/js/chunk-vendors-legacy.d89048a8.js +13 -0
  10. package/dist/js/chunk-vendors-legacy.d89048a8.js.map +1 -0
  11. package/dist/js/chunk-vendors.d89048a8.js +13 -0
  12. package/dist/js/chunk-vendors.d89048a8.js.map +1 -0
  13. package/dist/w-web-perm.umd.js +2 -2
  14. package/dist/w-web-perm.umd.js.map +1 -1
  15. package/docs/WWebPerm.html +2 -2
  16. package/docs/WWebPerm.mjs.html +212 -64
  17. package/docs/index.html +1 -1
  18. package/g.backupDb.mjs +1 -1
  19. package/g.initialData.mjs +211 -111
  20. package/g.initialTestData.mjs +2 -1
  21. package/g.mjs +0 -0
  22. package/g.provideGrups.mjs +87 -0
  23. package/g.providePemis.mjs +43 -0
  24. package/g.provideTargets.mjs +20 -13
  25. package/g.provideUsers.mjs +45 -13
  26. package/package.json +8 -8
  27. package/script.txt +5 -5
  28. package/server/WWebPerm.mjs +211 -63
  29. package/server/provideGrups.mjs +64 -0
  30. package/server/{provideRuleGroups.mjs → providePemis.mjs} +14 -15
  31. package/server/provideTargets.mjs +8 -5
  32. package/server/provideUsers.mjs +9 -9
  33. package/src/App.vue +16 -3
  34. package/src/components/Layout.vue +13 -5
  35. package/src/components/LayoutContent.vue +31 -16
  36. package/src/components/LayoutContentGrups.vue +793 -0
  37. package/src/components/LayoutContentPemis.vue +793 -0
  38. package/src/components/LayoutContentTargets.vue +481 -307
  39. package/src/components/LayoutContentUsers.vue +796 -291
  40. package/src/components/VeCgrups.vue +926 -0
  41. package/src/components/VeCpemis.vue +926 -0
  42. package/src/components/VeCrules.vue +820 -0
  43. package/src/main.js +2 -2
  44. package/src/perm.mjs +5 -5
  45. package/src/plugins/mShare.mjs +444 -153
  46. package/src/plugins/mUI.mjs +37 -19
  47. package/src/schema/gi.mjs +1 -1
  48. package/src/schema/index.mjs +4 -2
  49. package/src/schema/tables/grups.mjs +154 -0
  50. package/src/schema/tables/{ruleGroups.mjs → pemis.mjs} +27 -16
  51. package/src/schema/tables/targets.mjs +49 -16
  52. package/src/schema/tables/users.mjs +55 -27
  53. package/src/store/mutations.mjs +375 -150
  54. package/srv.mjs +2 -2
  55. package/tableTags-web-perm.json +1 -1
  56. package/dist/css/app.f6c50bec.css +0 -1
  57. package/dist/js/app-legacy.767522f1.js +0 -2
  58. package/dist/js/app-legacy.767522f1.js.map +0 -1
  59. package/dist/js/app.767522f1.js +0 -2
  60. package/dist/js/app.767522f1.js.map +0 -1
  61. package/dist/js/chunk-vendors-legacy.b0d63e17.js +0 -13
  62. package/dist/js/chunk-vendors-legacy.b0d63e17.js.map +0 -1
  63. package/dist/js/chunk-vendors.b0d63e17.js +0 -13
  64. package/dist/js/chunk-vendors.b0d63e17.js.map +0 -1
  65. package/g.provideRuleGroups.mjs +0 -56
  66. package/src/components/LayoutContentGroups.vue +0 -671
  67. package/src/components/VeUser.vue +0 -446
  68. package/src/components/ruleGroup.vue +0 -645
@@ -13,108 +13,124 @@
13
13
  >
14
14
 
15
15
  <!-- 標題區 -->
16
- <div style="display:inline-block; vertical-align:top; padding:10px 0px 5px 20px;">
17
- <div style="display:flex; align-items:center; padding:5px 15px 5px 5px; border-bottom:3px solid #FF9100;">
16
+ <div style="padding:10px 10px 10px 20px;">
17
+ <div :style="`display:flex; align-items:center; padding:${drawer?'5px':'5px 5px 5px 20px'};`">
18
18
 
19
19
  <WIcon
20
20
  :icon="mdiGamepadCircle"
21
- :color="'#FF9800'"
21
+ :color="'#000'"
22
+ :size="26"
22
23
  ></WIcon>
23
24
 
24
- <div style="padding-left:10px; font-size:1.3rem; color:#d3912c;">
25
+ <div style="padding-left:10px; font-size:1.4rem; color:#000;">
25
26
  {{$t('managementTargets')}}
26
27
  </div>
27
28
 
28
29
  </div>
29
30
  </div>
30
31
 
31
- <!-- 編輯設定區 -->
32
- <div style="display:inline-block; vertical-align:top;">
33
-
34
- <div style="padding:15px 20px 15px 20px; background:#fff;">
35
-
36
- <div style="display:flex;">
37
- <WSwitch
38
- :text="$t('isEditabled')"
39
- :checkedSwitchCircleColor="'#D81B60'"
40
- :checkedSwitchCircleColorHover="'#f26'"
41
- :checkedSwitchBarColor="'#F8BBD0'"
42
- :checkedSwitchBarColorHover="'#F8BBD0'"
43
- _v-model="isOperatable"
44
- :value="isOperatable"
45
- @input="updateIsOperatable"
46
- ></WSwitch>
47
- </div>
48
-
49
- <div style="padding-top:5px; font-size:0.8rem; _color:#f26;" v-if="isOperatable">
50
- <div style="padding:3px 0px;">
51
- 1. {{$t('targetMsg1')}}
52
- </div>
53
- <div style="padding:3px 0px;">
54
- 2. {{$t('targetMsg2')}}
55
- </div>
56
- </div>
57
-
58
- </div>
59
-
60
- </div>
61
-
62
- <!-- 儲存變更提示區 -->
63
- <div
64
- style="padding:10px 10px 12px 10px; border-top:1px solid #F48FB1; border-bottom:1px solid #F48FB1; background:#FCE4EC; display:flex; align-items:center; justify-content:flex-end;"
65
- v-if="isModified"
66
- >
67
-
68
- <WButtonChip
69
- :paddingStyle="{v:0,h:11}"
70
- :text="$t('saveChanges')"
71
- :icon="mdiCloudUploadOutline"
72
- :backgroundColor="'rgba(255,0,50,0.7)'"
73
- :backgroundColorHover="'rgba(255,0,50,0.8)'"
74
- :textColor="'#eee'"
75
- :textColorHover="'#fff'"
76
- :iconColor="'#eee'"
77
- :iconColorHover="'#fff'"
78
- @click="saveRuleGroupsAndTargets"
79
- ></WButtonChip>
32
+ <!-- 功能區 -->
33
+ <div style="padding:5px; border-top:1px solid #ddd; display:flex; align-items:center;">
34
+
35
+ <template>
36
+
37
+ <WButtonCircle
38
+ :paddingStyle="{v:6,h:6}"
39
+ :tooltip="$t('targetAdd')"
40
+ :icon="mdiPlus"
41
+ :backgroundColor="'#fff'"
42
+ :backgroundColorHover="'#f2f2f2'"
43
+ _textColor="'#eee'"
44
+ _textColorHover="'#fff'"
45
+ :iconColor="'#444'"
46
+ :iconColorHover="'#222'"
47
+ :shadow="false"
48
+ @click="addItem"
49
+ ></WButtonCircle>
50
+
51
+ <div style="padding-left:6px;"></div>
52
+
53
+ </template>
54
+
55
+ <template v-if="hasItemCheckOne">
56
+
57
+ <WButtonCircle
58
+ :paddingStyle="{v:6,h:6}"
59
+ :tooltip="$t('targetCopy')"
60
+ :icon="mdiContentCopy"
61
+ :backgroundColor="'#fff'"
62
+ :backgroundColorHover="'#f2f2f2'"
63
+ _textColor="'#eee'"
64
+ _textColorHover="'#fff'"
65
+ :iconColor="'#444'"
66
+ :iconColorHover="'#222'"
67
+ :shadow="false"
68
+ @click="copyItem"
69
+ ></WButtonCircle>
70
+
71
+ <div style="padding-left:6px;"></div>
72
+
73
+ </template>
74
+
75
+ <template v-if="hasItemsCheck">
76
+
77
+ <WButtonCircle
78
+ :paddingStyle="{v:6,h:6}"
79
+ :tooltip="$t('targetDeleteChecks')"
80
+ :icon="mdiTrashCanOutline"
81
+ :backgroundColor="'#fff'"
82
+ :backgroundColorHover="'#f2f2f2'"
83
+ _textColor="'#eee'"
84
+ _textColorHover="'#fff'"
85
+ :iconColor="'#444'"
86
+ :iconColorHover="'#222'"
87
+ :shadow="false"
88
+ @click="deleteItemsCheck"
89
+ ></WButtonCircle>
90
+
91
+ <div style="padding-left:6px;"></div>
92
+
93
+ </template>
94
+
95
+ <template v-if="isModified">
96
+
97
+ <WButtonCircle
98
+ :paddingStyle="{v:6,h:6}"
99
+ :tooltip="$t('saveChanges')"
100
+ :icon="mdiCloudUploadOutline"
101
+ :backgroundColor="'rgba(255,0,50,0.7)'"
102
+ :backgroundColorHover="'rgba(255,0,50,0.8)'"
103
+ :textColor="'#eee'"
104
+ :textColorHover="'#fff'"
105
+ :iconColor="'#eee'"
106
+ :iconColorHover="'#fff'"
107
+ :shadow="false"
108
+ @click="saveTargets"
109
+ ></WButtonCircle>
110
+
111
+ <div style="padding-left:6px;"></div>
112
+
113
+ </template>
80
114
 
81
115
  </div>
82
116
 
83
117
  </div>
84
118
 
85
- <div
86
- :style="`padding:${spacePading}px;`"
119
+ <template
87
120
  v-if="!firstLoading"
88
121
  >
89
122
 
90
- <div style="background:#fff; box-shadow:0 3px 1px -2px rgba(0,0,0,.2), 0 2px 2px 0 rgba(0,0,0,.14), 0 1px 5px 0 rgba(0,0,0,.12);">
91
- <WTree
92
- ref="wt"
93
- :viewHeightMax="treeHeight"
94
- :separatorColor="'rgba(0,0,0,0.1)'"
95
- :data.sync="treeBlocks"
96
- :indent="0.5"
97
- :iconToggleColor="'#666'"
98
- :iconToggleBackgroundColor="'transparent'"
99
- :iconToggleBackgroundColorHover="'transparent'"
100
- :operatable="isOperatable"
101
- :operateBtnTooltip="$t('edit')"
102
- :operateItemTextForRename="$t('changeName')"
103
- :operateItemTextForInsertBefore="$t('insertBefore')"
104
- :operateItemTextForInsertChild="$t('insertChild')"
105
- :operateItemTextForInsertAfter="$t('insertAfter')"
106
- :operateItemTextForDelete="$t('deleteTarget')"
107
- :editorRenameSaveBtnText="$t('save')"
108
- :editorRenameSaveBtnTextColor="'#444'"
109
- :editorRenameSaveBtnTextColorHover="'#222'"
110
- :editorRenameCancelBtnText="$t('cancel')"
111
- :editorRenameCancelBtnTextColor="'#444'"
112
- :editorRenameCancelBtnTextColorHover="'#222'"
113
- @click-operate-item="clickOperateItem"
114
- ></WTree>
115
- </div>
123
+ <template v-if="items">
124
+ <WAggridVueDyn
125
+ ref="rftable"
126
+ :style="`width:100%;`"
127
+ :height="contentHeight"
128
+ :opt="opt"
129
+ >
130
+ </WAggridVueDyn>
131
+ </template>
116
132
 
117
- </div>
133
+ </template>
118
134
 
119
135
  <div style="padding:10px 15px; font-size:0.8rem;" v-else>
120
136
  {{$t('waitingData')}}
@@ -124,38 +140,33 @@
124
140
  </template>
125
141
 
126
142
  <script>
127
- import { mdiGamepadCircle, mdiStackOverflow, mdiAccountGroupOutline, mdiBallotRecountOutline, mdiCloudUploadOutline } from '@mdi/js/mdi.js'
128
- import JSON5 from 'json5'
129
- import get from 'lodash-es/get.js'
130
- import set from 'lodash-es/set.js'
131
- import each from 'lodash-es/each.js'
132
- import map from 'lodash-es/map.js'
133
- import size from 'lodash-es/size.js'
134
- import dropRight from 'lodash-es/dropRight.js'
135
- import cloneDeep from 'lodash-es/cloneDeep.js'
143
+ import { mdiGamepadCircle, mdiStackOverflow, mdiAccountGroupOutline, mdiBallotRecountOutline, mdiCloudUploadOutline, mdiTrashCanOutline, mdiPlus, mdiPencilOutline, mdiContentCopy } from '@mdi/js/mdi.js'
144
+ import get from 'lodash-es/get.js'
145
+ import each from 'lodash-es/each.js'
146
+ import size from 'lodash-es/size.js'
147
+ import filter from 'lodash-es/filter.js'
148
+ import sortBy from 'lodash-es/sortBy.js'
149
+ import cloneDeep from 'lodash-es/cloneDeep.js'
136
150
  import haskey from 'wsemi/src/haskey.mjs'
137
- import genID from 'wsemi/src/genID.mjs'
138
- import delay from 'wsemi/src/delay.mjs'
139
- import flattenTree from 'wsemi/src/flattenTree.mjs'
151
+ import isestr from 'wsemi/src/isestr.mjs'
152
+ import iseobj from 'wsemi/src/iseobj.mjs'
153
+ import cstr from 'wsemi/src/cstr.mjs'
140
154
  import WIcon from 'w-component-vue/src/components/WIcon.vue'
141
- import WButtonChip from 'w-component-vue/src/components/WButtonChip.vue'
142
- import WSwitch from 'w-component-vue/src/components/WSwitch.vue'
143
- import WTree from 'w-component-vue/src/components/WTree.vue'
144
- import { getTreeBlocks } from '../plugins/mShare.mjs'
145
-
146
-
147
- //dlm
148
- let dlm = '.'
155
+ import WButtonCircle from 'w-component-vue/src/components/WButtonCircle.vue'
156
+ import WAggridVueDyn from 'w-component-vue/src/components/WAggridVueDyn.vue'
149
157
 
150
158
 
151
159
  export default {
152
160
  components: {
153
161
  WIcon,
154
- WButtonChip,
155
- WSwitch,
156
- WTree,
162
+ WButtonCircle,
163
+ WAggridVueDyn,
157
164
  },
158
165
  props: {
166
+ drawer: {
167
+ type: Boolean,
168
+ default: false,
169
+ },
159
170
  },
160
171
  data: function() {
161
172
  return {
@@ -164,37 +175,54 @@ export default {
164
175
  mdiAccountGroupOutline,
165
176
  mdiBallotRecountOutline,
166
177
  mdiCloudUploadOutline,
178
+ mdiTrashCanOutline,
179
+ mdiPlus,
180
+ mdiPencilOutline,
181
+ mdiContentCopy,
167
182
 
168
183
  panelWidth: 100,
169
184
  panelHeight: 100,
170
185
  headHeight: 100,
171
186
 
172
187
  firstLoading: true,
173
- isOperatable: true,
174
188
  isModified: false,
175
189
 
176
- treeBlocks: null,
177
- listRename: [],
190
+ items: [],
191
+ itemsCheck: [],
192
+ opt: null,
178
193
 
179
194
  }
180
195
  },
181
196
  mounted: function() {
182
197
  // console.log('mounted')
183
198
 
184
- let vo = this
185
-
186
- //clear
187
- vo.listRename = []
199
+ // let vo = this
188
200
 
189
201
  },
190
202
  computed: {
191
203
 
192
204
  targets: function() {
193
- return get(this, `$store.state.targets`)
205
+ let rs = get(this, `$store.state.targets`)
206
+ rs = sortBy(rs, 'order')
207
+ return rs
208
+ },
209
+
210
+ pemis: function() {
211
+ let rs = get(this, `$store.state.pemis`)
212
+ rs = sortBy(rs, 'order')
213
+ return rs
214
+ },
215
+
216
+ grups: function() {
217
+ let rs = get(this, `$store.state.grups`)
218
+ rs = sortBy(rs, 'order')
219
+ return rs
194
220
  },
195
221
 
196
- ruleGroups: function() {
197
- return get(this, `$store.state.ruleGroups`)
222
+ users: function() {
223
+ let rs = get(this, `$store.state.users`)
224
+ rs = sortBy(rs, 'order')
225
+ return rs
198
226
  },
199
227
 
200
228
  changeTargets: function() {
@@ -207,13 +235,14 @@ export default {
207
235
  return ''
208
236
  }
209
237
 
210
- //getTreeBlocks
211
- let treeBlocks = getTreeBlocks(vo.targets)
212
- // console.log('targets', vo.targets)
213
- // console.log('treeBlocks', treeBlocks)
238
+ //cloneDeep
239
+ let items = cloneDeep(vo.targets)
214
240
 
215
241
  //save
216
- vo.treeBlocks = treeBlocks
242
+ vo.items = items
243
+
244
+ //genOpt
245
+ vo.genOpt()
217
246
 
218
247
  //firstLoading
219
248
  vo.firstLoading = false
@@ -221,25 +250,85 @@ export default {
221
250
  return ''
222
251
  },
223
252
 
224
- spacePading: function() {
253
+ contentHeight: function() {
225
254
  let vo = this
226
- if (vo.panelWidth < 400) {
227
- return 0
228
- }
229
- else if (vo.panelWidth < 800) {
230
- return 10
231
- }
232
- return 20
255
+
256
+ //h
257
+ let h = vo.panelHeight - vo.headHeight
258
+ h = Math.max(h, 0)
259
+
260
+ return h
233
261
  },
234
262
 
235
- treeHeight: function() {
263
+ hasItemsCheck: function() {
236
264
  let vo = this
237
265
 
238
266
  //h
239
- let h = vo.panelHeight - vo.headHeight - 2 * vo.spacePading
240
- h = Math.max(h, 0)
267
+ let b = vo.itemsCheck.length > 0
241
268
 
242
- return h
269
+ return b
270
+ },
271
+
272
+ hasItemCheckOne: function() {
273
+ let vo = this
274
+
275
+ //h
276
+ let b = size(vo.itemsCheck) === 1
277
+
278
+ return b
279
+ },
280
+
281
+ errItemsById: function() {
282
+ let vo = this
283
+
284
+ //rows
285
+ let rows = get(vo, 'opt.rows', [])
286
+
287
+ //kpErr
288
+ let kpErr = {}
289
+ let kpId = {}
290
+ each(rows, (v, k) => {
291
+
292
+ //id
293
+ let id = get(v, 'id', '')
294
+
295
+ //check
296
+ if (!isestr(id)) {
297
+
298
+ //kpErr
299
+ kpErr[id] = vo.$t(`targetIdEmpty`)
300
+
301
+ return true //跳出換下一個
302
+ }
303
+
304
+ //check
305
+ if (haskey(kpId, id)) {
306
+
307
+ //kpErr
308
+ kpErr[id] = vo.$t(`targetIdDuplicate`)
309
+
310
+ return true //跳出換下一個
311
+ }
312
+
313
+ //kpId
314
+ kpId[id] = true
315
+
316
+ })
317
+
318
+ return kpErr
319
+ },
320
+
321
+ isError: function() {
322
+ let vo = this
323
+
324
+ let c = ''
325
+ let b = false
326
+ b = iseobj(vo.errItemsByName)
327
+ if (b) {
328
+ c = vo.$t('errInNames')
329
+ }
330
+
331
+ return c
243
332
  },
244
333
 
245
334
  },
@@ -266,250 +355,335 @@ export default {
266
355
 
267
356
  },
268
357
 
269
- updateIsOperatable: function(isOperatable) {
270
- // console.log('methods updateIsOperatable', isOperatable)
358
+ genOpt: function() {
359
+ // console.log('methods genOpt')
271
360
 
272
361
  let vo = this
273
362
 
274
- async function core() {
275
- // let errTemp = null
363
+ //default
364
+ vo.itemsCheck = []
365
+
366
+ //opt
367
+ let opt = null
368
+ if (size(vo.items) > 0) {
369
+
370
+ //ks
371
+ let ks = [
372
+ 'id',
373
+ 'description',
374
+ 'from',
375
+ 'userId',
376
+ 'timeCreate',
377
+ 'userIdUpdate',
378
+ 'timeUpdate',
379
+ ]
380
+ // console.log('ks', ks)
381
+
382
+ //kpHead
383
+ let kpHead = {
384
+ 'id': vo.$t('targetId'),
385
+ 'description': vo.$t('description'),
386
+ 'from': vo.$t('from'),
387
+ 'userId': vo.$t('userId'),
388
+ 'timeCreate': vo.$t('timeCreate'),
389
+ 'userIdUpdate': vo.$t('userIdUpdate'),
390
+ 'timeUpdate': vo.$t('timeUpdate'),
391
+ }
276
392
 
277
- //show loading
278
- vo.$ui.updateLoading(true)
393
+ //opt
394
+ opt = {
395
+ language: vo.$t('aggridLanguage'),
396
+ rows: vo.items,
397
+ keys: ks,
398
+ kpHead,
399
+ // autoFitColumn: true,
400
+ defHeadFilter: true,
401
+ defCellAlignH: 'left',
402
+ // kpHeadHide: {
403
+ // 'id': true,
404
+ // },
405
+ kpHeadFixLeft: {
406
+ 'id': true,
407
+ },
408
+ defHeadMinWidth: 150,
409
+ kpHeadWidth: {
410
+ 'id': 300,
411
+ 'timeCreate': 220,
412
+ 'timeUpdate': 220,
413
+ },
414
+ kpHeadFilterType: {
415
+ 'id': 'text',
416
+ 'description': 'text',
417
+ 'from': 'text',
418
+ 'userId': 'text',
419
+ 'timeCreate': 'text',
420
+ 'userIdUpdate': 'text',
421
+ 'timeUpdate': 'text',
422
+ },
423
+ kpCellEditable: {
424
+ 'id': true,
425
+ 'description': true,
426
+ 'from': true,
427
+ },
428
+ kpRowDrag: {
429
+ 'id': true,
430
+ },
431
+ kpHeadCheckBox: {
432
+ 'id': true,
433
+ },
434
+ kpCellRender: {
435
+ 'id': (v) => {
436
+ // console.log('kpCellRender', v)
437
+
438
+ //err
439
+ let err = get(vo.errItemsById, v, '')
440
+ // console.log(v, err)
441
+
442
+ //check
443
+ if (isestr(err)) {
444
+ v = `
445
+ <span title="${err}">
446
+ <span style="color:#F57C00;">${cstr(v)}</span>
447
+ <img style="vertical-align:sub; width:16px; height:16px;" src="${vo.$ui.getIcon('warning')}" />
448
+ </span>
449
+ `
450
+ }
451
+
452
+ return v
453
+ },
454
+ },
455
+ // kpCellTooltip: {
456
+ // 'id': (v) => {
457
+ // // console.log('kpCellTooltip', v)
458
+
459
+ // //err
460
+ // let err = get(vo.errItemsById, v, '')
461
+ // // console.log(v, err)
462
+
463
+ // //check
464
+ // let t = ''
465
+ // if (isestr(err)) {
466
+ // t = err
467
+ // }
468
+
469
+ // return t
470
+ // },
471
+ // },
472
+ rowsChange: (rs) => {
473
+ // console.log('rowsChange', rs)
474
+ // console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
475
+
476
+ //isModified
477
+ vo.isModified = true
478
+
479
+ },
480
+ rowChecked: (rs) => {
481
+ // console.log('rowChecked', rs)
482
+ // console.log('rowChecked cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
483
+
484
+ //save itemsCheck
485
+ vo.itemsCheck = cloneDeep(rs)
486
+
487
+ },
488
+ }
489
+ // console.log('opt', opt)
279
490
 
280
- //isOperatable
281
- if (isOperatable) {
282
- //切換至編輯模式時
283
- try {
491
+ }
284
492
 
285
- //先顯示全部節點
286
- let toUnfolding = true
287
- let toLevel = null
288
- vo.$refs.wt.toggleItemsAll(toUnfolding, toLevel)
493
+ //save
494
+ vo.opt = opt
289
495
 
290
- //若節點多顯示全部節點須一些時間, 故延遲變更
291
- await delay(300)
496
+ },
292
497
 
293
- //update
294
- vo.isOperatable = isOperatable
498
+ refresh: function() {
499
+ let vo = this
295
500
 
501
+ //cmp
502
+ let cmp = get(vo, '$refs.rftable.$refs.$self')
503
+ // console.log('cmp', cmp)
296
504
 
297
- }
298
- catch (err) {}
299
- }
300
- else {
301
- //切換至顯示模式時
505
+ //refresh, 因set不會觸發kpCellRender, 故須另外調用組件函數refresh, 進而觸發kpCellRender, 使能更新數據
506
+ cmp.refresh()
302
507
 
303
- //update
304
- vo.isOperatable = isOperatable
508
+ },
305
509
 
306
- }
510
+ addItem: function() {
511
+ // console.log('method addItem')
307
512
 
308
- }
513
+ let vo = this
309
514
 
310
- //core
311
- core()
312
- // .then((res) => {
313
- // console.log('then', res)
314
- // })
315
- .catch((err) => {
316
- console.log('catch', err)
317
- vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' })
318
- })
319
- .finally(() => {
515
+ //cloneDeep
516
+ let rows = get(vo, 'opt.rows', [])
320
517
 
321
- //hide loading
322
- vo.$ui.updateLoading(false)
518
+ //cloneDeep
519
+ rows = cloneDeep(rows)
323
520
 
324
- })
521
+ //r
522
+ let r = vo.$ds.targets.funNew()
523
+ r.id = vo.$s.getNameNew(rows, 'id', '', vo.$t('targetAddNameNew'))
524
+ r.userId = `{${vo.$t('targetAddIdNew')}}`
525
+ r.timeCreate = `{${vo.$t('targetAddIdNew')}}`
526
+ r.userIdUpdate = `{${vo.$t('targetAddIdNew')}}`
527
+ r.timeUpdate = `{${vo.$t('targetAddIdNew')}}`
528
+ // console.log('r', r)
529
+
530
+ //添加至最首
531
+ rows = [
532
+ r,
533
+ ...rows,
534
+ ]
535
+
536
+ //save
537
+ vo.opt.rows = rows
538
+ // console.log('cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
539
+
540
+ //isModified
541
+ vo.isModified = true
325
542
 
326
543
  },
327
544
 
328
- clickOperateItem: function(msg) {
329
- // console.log('methods clickOperateItem', msg)
545
+ copyItem: function() {
546
+ // console.log('method copyItem')
330
547
 
331
548
  let vo = this
332
549
 
333
- async function core() {
550
+ //check
551
+ if (size(vo.itemsCheck) !== 1) {
552
+ console.log(`size(vo.itemsCheck) !== 1`, vo.itemsCheck)
553
+ vo.$alert(`${vo.$t('anUnexpectedErrorOccurred')}`, { type: 'error' })
554
+ return
555
+ }
334
556
 
335
- //fun, 僅處理並回傳新項目, 不處理其他項目
336
- let fun = async function() {
337
- let id = genID()
338
- let text = vo.$t('newTarget')
339
- let dataNew = {
340
- id,
341
- text,
342
- }
343
- return dataNew
557
+ //cloneDeep
558
+ let rows = get(vo, 'opt.rows', [])
559
+
560
+ //cloneDeep
561
+ rows = cloneDeep(rows)
562
+
563
+ //find
564
+ let tar = vo.itemsCheck[0]
565
+ let tarId = get(tar, 'data.id', '')
566
+ let row = null
567
+ each(rows, (v) => {
568
+ let id = get(v, 'id', '')
569
+ if (id === tarId) {
570
+ row = v
571
+ return false //跳出
344
572
  }
573
+ })
574
+ // console.log('tar', tar)
575
+ // console.log('row', row)
345
576
 
346
- //targetInd
347
- let targetInd = msg.rowItem.index
348
-
349
- //operateItem
350
- await msg.operateItem(targetInd, msg.opItem.key, fun)
577
+ //check
578
+ if (!iseobj(row)) {
579
+ console.log(`!iseobj(row)`, row)
580
+ vo.$alert(`${vo.$t('anUnexpectedErrorOccurred')}`, { type: 'error' })
581
+ return
582
+ }
351
583
 
352
- //modifyTreeBlocks
353
- vo.modifyTreeBlocks()
584
+ //r
585
+ let r = cloneDeep(row)
586
+ let nameOld = r.id
587
+ let _r = vo.$ds.targets.funNew()
588
+ r.id = _r.id //使用新建方式預先產生id避免重複
589
+ r.id = vo.$s.getNameNew(rows, 'id', nameOld, vo.$t('targetCopyNameNew'))
590
+ r.userId = `{${vo.$t('targetAddIdNew')}}`
591
+ r.timeCreate = `{${vo.$t('targetAddIdNew')}}`
592
+ r.userIdUpdate = `{${vo.$t('targetAddIdNew')}}`
593
+ r.timeUpdate = `{${vo.$t('targetAddIdNew')}}`
594
+ // console.log('r', r)
595
+
596
+ //添加至最首
597
+ rows = [
598
+ r,
599
+ ...rows,
600
+ ]
354
601
 
355
- }
602
+ //save
603
+ vo.opt.rows = rows
604
+ // console.log('cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
356
605
 
357
- //core
358
- core()
359
- // .then((res) => {
360
- // console.log('then', res)
361
- // })
362
- .catch((err) => {
363
- console.log('catch', err)
364
- vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' })
365
- })
606
+ //isModified
607
+ vo.isModified = true
366
608
 
367
609
  },
368
610
 
369
- modifyTreeBlocks: function() {
370
- // console.log('methods modifyTreeBlocks')
611
+ deleteItemsCheck: function() {
612
+ // console.log('method deleteItemsCheck')
371
613
 
372
614
  let vo = this
373
615
 
374
- //treeBlocksTemp
375
- let treeBlocksTemp = cloneDeep(vo.treeBlocks)
616
+ //check
617
+ if (size(vo.itemsCheck) === 0) {
618
+ return
619
+ }
620
+
621
+ //cloneDeep
622
+ let rows = get(vo, 'opt.rows', [])
376
623
 
377
- //flattenTree
378
- let blocksNew = flattenTree(treeBlocksTemp)
379
- // console.log('blocksNew', cloneDeep(blocksNew))
624
+ //cloneDeep
625
+ rows = cloneDeep(rows)
380
626
 
381
- //calc id, parentId, order
382
- each(blocksNew, (v, k) => {
383
- if (size(v.nk) === 1) {
384
- v.parentId = ''
385
- v.id = v.text
386
- }
387
- else { //size(v.nk)>=3
388
- let nkParent = dropRight(v.nk, 2)
389
- let p = get(treeBlocksTemp, nkParent)
390
- v.parentId = p.id
391
- v.id = `${v.parentId}${dlm}${v.text}` //[tag:dlm]
627
+ //filter
628
+ each(vo.itemsCheck, (v) => {
629
+ // console.log('v', v)
630
+ let id = get(v, 'data.id', '')
631
+ if (!isestr(id)) {
632
+ console.log(`invalid id`)
633
+ return true //跳出換下一個
392
634
  }
393
- v.order = k //需重新給予order
394
- set(treeBlocksTemp, v.nk, v)
635
+ rows = filter(rows, (vv) => {
636
+ return vv.id !== id
637
+ })
395
638
  })
396
639
 
640
+ //clear
641
+ vo.itemsCheck = []
642
+
397
643
  //save
398
- vo.treeBlocks = treeBlocksTemp
399
- // console.log('treeBlocks', cloneDeep(treeBlocksTemp))
644
+ vo.opt.rows = rows
645
+ // console.log('deleteItemsCheck cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
400
646
 
401
647
  //isModified
402
648
  vo.isModified = true
403
649
 
404
650
  },
405
651
 
406
- saveRuleGroupsAndTargets: function() {
407
- // console.log('method saveRuleGroupsAndTargets')
652
+ saveTargets: function() {
653
+ // console.log('method saveTargets')
408
654
 
409
655
  let vo = this
410
656
 
411
- //replaceObjKeys
412
- let replaceObjKeys = (obj, kpKeys) => {
413
- // console.log('methods replaceObjKeys', obj, kpKeys)
414
-
415
- //r
416
- let b = false
417
- let r = {}
418
- each(obj, (v, k) => {
419
- if (haskey(kpKeys, k)) {
420
- b = true
421
- let kk = kpKeys[k]
422
- r[kk] = v
423
- }
424
- else {
425
- r[k] = v
426
- }
427
- })
428
-
429
- return {
430
- obj: r,
431
- isChanged: b,
432
- }
433
- }
434
-
435
657
  async function core() {
436
658
  let errTemp = null
437
659
 
438
660
  //show loading
439
661
  vo.$ui.updateLoading(true)
440
662
 
441
- //treeBlocksTemp
442
- let treeBlocksTemp = cloneDeep(vo.treeBlocks)
443
-
444
- //flattenTree
445
- let blocksNew = flattenTree(treeBlocksTemp)
446
- // console.log('blocksNew1', cloneDeep(blocksNew))
447
-
448
- //kpDiffs
449
- let kpDiffs = {}
450
- map(blocksNew, (v, k) => {
451
- if (v.id !== v.idTemp) {
452
- kpDiffs[v.idTemp] = v.id
453
- }
454
- })
455
- // console.log('kpDiffs', kpDiffs)
456
-
457
- //gs
458
- let gs = []
459
- each(vo.ruleGroups, (v) => {
460
- let rules = JSON5.parse(v.crules)
461
- let r = replaceObjKeys(rules, kpDiffs)
462
- if (r.isChanged) {
463
- gs.push({
464
- id: v.id,
465
- crules: JSON.stringify(r.obj),
466
- })
467
- }
468
- })
469
- // console.log('ruleGroups', vo.ruleGroups, gs)
470
-
471
- //save
472
- await vo.$fapi.ruleGroups.save(gs)
473
- .catch((err) => {
474
- errTemp = err
475
- })
476
-
477
663
  //check
478
- if (errTemp !== null) {
479
- vo.$alert(`${vo.$t('failedToChangePermissionGroups')}: ${errTemp}`, { type: 'error' })
664
+ if (isestr(vo.isError)) {
665
+ vo.$alert(`${vo.isError}`, { type: 'error' })
480
666
  return
481
667
  }
482
668
 
483
- //rs
484
- let rs = map(blocksNew, (v, k) => {
485
- return {
486
- id: v.id,
487
- order: v.order,
488
- }
489
- })
490
- // console.log('targets rs', rs)
491
-
492
- //delAll
493
- await vo.$fapi.targets.delAll()
494
- .catch((err) => {
495
- errTemp = err
496
- })
669
+ //rows
670
+ let rows = get(vo, 'opt.rows', [])
497
671
 
498
672
  //check
499
- if (errTemp !== null) {
500
- vo.$alert(`${vo.$t('failedToClearTargets')}: ${errTemp}`, { type: 'error' })
673
+ if (size(rows) === 0) {
674
+ vo.$alert(`${vo.$t('targetAddEmpty')}`, { type: 'error' })
501
675
  return
502
676
  }
503
677
 
504
- //save
505
- await vo.$fapi.targets.save(rs)
678
+ //updateTargets
679
+ await vo.$fapi.updateTargets(rows)
506
680
  .catch((err) => {
507
681
  errTemp = err
508
682
  })
509
683
 
510
684
  //check
511
685
  if (errTemp !== null) {
512
- vo.$alert(`${vo.$t('failedToSaveTargets')}: ${errTemp}`, { type: 'error' })
686
+ vo.$alert(`${vo.$t('targetSaveTargetsFail')}: ${errTemp}`, { type: 'error' })
513
687
  return
514
688
  }
515
689
 
@@ -517,7 +691,7 @@ export default {
517
691
  vo.isModified = false
518
692
 
519
693
  //alert
520
- vo.$alert(vo.$t('successfulToSaveTargets'))
694
+ vo.$alert(vo.$t('targetSaveTargetsSuccess'))
521
695
 
522
696
  }
523
697