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
@@ -1,671 +0,0 @@
1
- <template>
2
- <div
3
- style="height:100%;"
4
- v-domresize
5
- @domresize="resizePanel"
6
- :changeGroups="changeGroups"
7
- >
8
-
9
- <div
10
- style="border-bottom:1px solid #ddd; background:#fff;"
11
- v-domresize
12
- @domresize="resizeHead"
13
- >
14
-
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;">
18
-
19
- <WIcon
20
- :icon="mdiStackOverflow"
21
- :color="'#FF9800'"
22
- ></WIcon>
23
-
24
- <div style="padding-left:10px; font-size:1.3rem; color:#d3912c;">
25
- {{$t('permissionGroups')}}
26
- </div>
27
-
28
- </div>
29
- </div>
30
-
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
- ></WSwitch>
45
- </div>
46
-
47
- <div style="padding-top:5px; font-size:0.8rem; _color:#f26;" v-if="isOperatable">
48
- <div style="padding:3px 0px;">
49
- 1. {{$t('groupMsg1')}}
50
- </div>
51
- <div style="padding:3px 0px;">
52
- 2. {{$t('groupMsg2')}}
53
- </div>
54
- </div>
55
-
56
- </div>
57
-
58
- </div>
59
-
60
- <!-- 儲存變更提示區 -->
61
- <div
62
- 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;"
63
- v-if="isModified"
64
- >
65
-
66
- <WButtonChip
67
- :paddingStyle="{v:0,h:11}"
68
- :text="$t('saveChanges')"
69
- :icon="mdiCloudUploadOutline"
70
- :backgroundColor="'rgba(255,0,50,0.7)'"
71
- :backgroundColorHover="'rgba(255,0,50,0.8)'"
72
- :textColor="'#eee'"
73
- :textColorHover="'#fff'"
74
- :iconColor="'#eee'"
75
- :iconColorHover="'#fff'"
76
- @click="saveGroups"
77
- ></WButtonChip>
78
-
79
- </div>
80
-
81
- </div>
82
-
83
- <div
84
- :style="`padding:${spacePading}px;`"
85
- v-if="!firstLoading"
86
- >
87
-
88
- <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);">
89
-
90
- <div
91
- v-domresize
92
- @domresize="resizeGroupInfor"
93
- >
94
-
95
- <!-- 權限群組區(含新增) -->
96
- <div style="padding:10px 20px; border-bottom:3px solid #ddd;">
97
-
98
- <WGroupTags
99
- :keyText="'name'"
100
- :draggable="isOperatable"
101
- :editableClose="isOperatable"
102
- :editableInput="isOperatable"
103
- :addButtonText="$t('addGroup')"
104
- :addButtonTooltip="$t('addPermissionGroup')"
105
- :addButtonTextColor="'#eee'"
106
- :addButtonTextColorHover="'#fff'"
107
- :addButtonIconColor="'#eee'"
108
- :addButtonIconColorHover="'#fff'"
109
- :addButtonBackgroundColor="'rgba(255,0,50,0.7)'"
110
- :addButtonBackgroundColorHover="'rgba(255,0,50,0.8)'"
111
- :value="groupsTrans"
112
- @input="dragGroupsOrder"
113
- @click="clickGroup"
114
- @click-add="clickAddGroup"
115
- @click-close="clickRemoveGroup"
116
- ></WGroupTags>
117
-
118
- </div>
119
-
120
- </div>
121
-
122
- <ruleGroup
123
- :height="ruleGroupHeight"
124
- :group="pickGroup"
125
- :editable="isOperatable"
126
- @update="modifyGroup"
127
- v-if="pickGroup"
128
- ></ruleGroup>
129
-
130
- <div
131
- style="padding:20px; _color:#666; font-size:0.85rem;"
132
- v-else
133
- >
134
- {{$t('groupMsgNoPick')}}
135
- </div>
136
-
137
- </div>
138
-
139
- </div>
140
-
141
- <div style="padding:10px 15px; font-size:0.8rem;" v-else>
142
- {{$t('waitingData')}}
143
- </div>
144
-
145
- </div>
146
- </template>
147
-
148
- <script>
149
- import { mdiStackOverflow, mdiVectorPolylinePlus, mdiCheckboxMarkedCircle, mdiCloudUploadOutline } from '@mdi/js/mdi.js'
150
- // import JSON5 from 'json5'
151
- import get from 'lodash-es/get.js'
152
- import each from 'lodash-es/each.js'
153
- import map from 'lodash-es/map.js'
154
- import find from 'lodash-es/find.js'
155
- import size from 'lodash-es/size.js'
156
- import max from 'lodash-es/max.js'
157
- import sortBy from 'lodash-es/sortBy.js'
158
- import isEqual from 'lodash-es/isEqual.js'
159
- import cloneDeep from 'lodash-es/cloneDeep.js'
160
- import genID from 'wsemi/src/genID.mjs'
161
- import isestr from 'wsemi/src/isestr.mjs'
162
- import iseobj from 'wsemi/src/iseobj.mjs'
163
- import cstr from 'wsemi/src/cstr.mjs'
164
- import waitFun from 'wsemi/src/waitFun.mjs'
165
- import WIcon from 'w-component-vue/src/components/WIcon.vue'
166
- import WButtonChip from 'w-component-vue/src/components/WButtonChip.vue'
167
- import WSwitch from 'w-component-vue/src/components/WSwitch.vue'
168
- import WGroupTags from 'w-component-vue/src/components/WGroupTags.vue'
169
- import ruleGroup from './ruleGroup.vue'
170
-
171
-
172
- export default {
173
- components: {
174
- WIcon,
175
- WButtonChip,
176
- WSwitch,
177
- WGroupTags,
178
- ruleGroup,
179
- },
180
- props: {
181
- },
182
- data: function() {
183
- return {
184
- mdiStackOverflow,
185
- mdiVectorPolylinePlus,
186
- mdiCheckboxMarkedCircle,
187
- mdiCloudUploadOutline,
188
-
189
- panelWidth: 100,
190
- panelHeight: 100,
191
- headHeight: 100,
192
- groupInforHeight: 100,
193
-
194
- firstLoading: true,
195
- isOperatable: true,
196
- isModified: false,
197
-
198
- groupsTrans: [],
199
-
200
- pickGroupId: '',
201
-
202
- }
203
- },
204
- computed: {
205
-
206
- ruleGroups: function() {
207
- return get(this, `$store.state.ruleGroups`)
208
- },
209
-
210
- groups: function() {
211
- // console.log('computed groups')
212
-
213
- let vo = this
214
-
215
- //rs
216
- let rs = map(vo.ruleGroups, (v) => {
217
- // let rules = JSON5.parse(v.crules)
218
- return {
219
- ...v,
220
- // rules,
221
- }
222
- })
223
-
224
- //sortBy
225
- rs = sortBy(rs, 'order')
226
-
227
- return rs
228
- },
229
-
230
- changeGroups: function() {
231
- // console.log('computed changeGroups')
232
-
233
- let vo = this
234
-
235
- //default
236
- vo.groupsTrans = []
237
-
238
- //check
239
- if (size(vo.groups) === 0) { //不能用被修改的groupsTrans, 否則會反覆觸發
240
- return ''
241
- }
242
-
243
- //save
244
- vo.groupsTrans = cloneDeep(vo.groups)
245
-
246
- //firstLoading
247
- vo.firstLoading = false
248
-
249
- return ''
250
- },
251
-
252
- spacePading: function() {
253
- let vo = this
254
- if (vo.panelWidth < 400) {
255
- return 0
256
- }
257
- else if (vo.panelWidth < 800) {
258
- return 10
259
- }
260
- return 20
261
- },
262
-
263
- ruleGroupHeight: function() {
264
- let vo = this
265
-
266
- //h
267
- let h = vo.panelHeight - vo.headHeight - 2 * vo.spacePading - vo.groupInforHeight
268
- h = Math.max(h, 0)
269
-
270
- return h
271
- },
272
-
273
- pickGroup: function() {
274
- // console.log('computed pickGroup')
275
-
276
- let vo = this
277
-
278
- //find, 點擊權限按鈕提供權限物件, 刪除後找不到亦可自動清空
279
- let r = find(vo.groupsTrans, { id: vo.pickGroupId })
280
-
281
- return r
282
- },
283
-
284
- },
285
- methods: {
286
-
287
- resizePanel: function(msg) {
288
- // console.log('methods resizePanel', msg)
289
-
290
- let vo = this
291
-
292
- //panelWidth, panelHeight
293
- vo.panelWidth = msg.snew.offsetWidth
294
- vo.panelHeight = msg.snew.offsetHeight
295
-
296
- },
297
-
298
- resizeHead: function(msg) {
299
- // console.log('methods resizeHead', msg)
300
-
301
- let vo = this
302
-
303
- //headHeight
304
- vo.headHeight = msg.snew.offsetHeight
305
-
306
- },
307
-
308
- resizeGroupInfor: function(msg) {
309
- // console.log('methods resizeGroupInfor', msg)
310
-
311
- let vo = this
312
-
313
- //groupInforHeight
314
- vo.groupInforHeight = msg.snew.offsetHeight
315
-
316
- },
317
-
318
- getDescription: function(g) {
319
- // console.log('methods getDescription', g)
320
-
321
- let vo = this
322
-
323
- //r
324
- let r = get(g, 'description', '')
325
-
326
- //check
327
- if (!isestr(r)) {
328
- r = vo.$t('noDescription')
329
- }
330
-
331
- return r
332
- },
333
-
334
- clickGroup: function(msg) {
335
- // console.log('methods clickGroup', msg)
336
-
337
- let vo = this
338
-
339
- //g
340
- let g = get(msg, 'item', {})
341
- // console.log('g', g)
342
-
343
- //id
344
- let id = get(g, 'id', '')
345
-
346
- //save
347
- vo.pickGroupId = id
348
-
349
- },
350
-
351
- clickAddGroup: function() {
352
- // console.log('methods clickAddGroup')
353
-
354
- let vo = this
355
-
356
- async function core() {
357
- let errTemp = null
358
-
359
- //show loading
360
- vo.$ui.updateLoading(true)
361
-
362
- //orderMax
363
- let orderMax = null
364
- orderMax = map(vo.groupsTrans, 'order')
365
- orderMax = max(orderMax) + 1
366
-
367
- //g
368
- let g = {
369
- id: genID(),
370
- name: vo.$t('newGroup'),
371
- crules: `{ "___all___": { "show": "n", "active": "n" } }`,
372
- order: orderMax,
373
- }
374
-
375
- //save
376
- await vo.$fapi.ruleGroups.insert(g)
377
- .catch((err) => {
378
- errTemp = err
379
- })
380
-
381
- //check
382
- if (errTemp !== null) {
383
- vo.$alert(`${vo.$t('failedToAddPermissionGroup')}: ${errTemp}`, { type: 'error' })
384
- }
385
-
386
- //gn
387
- let gn = null
388
- await waitFun(() => {
389
- gn = find(vo.groupsTrans, { id: g.id })
390
- let b = iseobj(gn) //確認g.id已存在
391
- // console.log('waitFun', gn, b)
392
- return b
393
- })
394
- // console.log('gn', gn)
395
-
396
- //alert
397
- vo.$alert(vo.$t('successfulToAddPermissionGroup'))
398
-
399
- }
400
-
401
- //core
402
- core()
403
- // .then((res) => {
404
- // console.log('then', res)
405
- // })
406
- .catch((err) => {
407
- console.log('catch', err)
408
- vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' })
409
- })
410
- .finally(() => {
411
-
412
- //hide loading
413
- vo.$ui.updateLoading(false)
414
-
415
- })
416
-
417
- },
418
-
419
- clickRemoveGroup: function(msg) {
420
- // console.log('methods clickRemoveGroup', msg)
421
-
422
- let vo = this
423
-
424
- async function core() {
425
- let errTemp = null
426
-
427
- //g
428
- let g = get(msg, 'item', {})
429
-
430
- //name
431
- let name = get(g, 'name', vo.$t('unknow'))
432
-
433
- //showCheckYesNo
434
- let bExit = false
435
- let t_confirmToDeletePermissionGroup = vo.$t('confirmToDeletePermissionGroup')
436
- t_confirmToDeletePermissionGroup = t_confirmToDeletePermissionGroup.replace('{name}', name)
437
- await vo.$dg.showCheckYesNo(t_confirmToDeletePermissionGroup)
438
- .catch(() => {
439
- bExit = true
440
- })
441
- if (bExit) {
442
- return
443
- }
444
-
445
- //show loading
446
- vo.$ui.updateLoading(true)
447
-
448
- //save
449
- await vo.$fapi.ruleGroups.del(g)
450
- .catch((err) => {
451
- errTemp = err
452
- })
453
-
454
- //check
455
- if (errTemp !== null) {
456
- vo.$alert(`${vo.$t('failedToDeletePermissionGroup')}: ${errTemp}`, { type: 'error' })
457
- return
458
- }
459
-
460
- //gn
461
- let gn = null
462
- await waitFun(() => {
463
- gn = find(vo.groupsTrans, { id: g.id })
464
- let b = !iseobj(gn) //確認g.id已不存在
465
- // console.log('waitFun', gn, b)
466
- return b
467
- })
468
- // console.log('gn', gn)
469
-
470
- //alert
471
- vo.$alert(vo.$t('successfulToDeletePermissionGroup'))
472
-
473
- }
474
-
475
- //core
476
- core()
477
- // .then((res) => {
478
- // console.log('then', res)
479
- // })
480
- .catch((err) => {
481
- console.log('catch', err)
482
- vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' })
483
- })
484
- .finally(() => {
485
-
486
- //hide loading
487
- vo.$ui.updateLoading(false)
488
-
489
- })
490
-
491
- },
492
-
493
- dragGroupsOrder: function(groupsNew) {
494
- // console.log('dragGroupsOrder', groupsNew)
495
-
496
- let vo = this
497
-
498
- async function core() {
499
- let errTemp = null
500
-
501
- //check, 新增或刪除皆跳出, 僅處理排序之操作
502
- if (size(vo.groupsTrans) !== size(groupsNew)) {
503
- return
504
- }
505
- // console.log(`size(vo.groupsTrans)`, size(vo.groupsTrans))
506
- // console.log(`size(groupsNew)`, size(groupsNew))
507
-
508
- //show loading
509
- vo.$ui.updateLoading(true)
510
-
511
- //gs
512
- let gs = []
513
- each(groupsNew, (v, k) => {
514
- gs.push({
515
- id: v.id,
516
- order: k,
517
- })
518
- })
519
- // console.log('gs', gs)
520
-
521
- //save
522
- await vo.$fapi.ruleGroups.save(gs)
523
- .catch((err) => {
524
- errTemp = err
525
- })
526
-
527
- //check
528
- if (errTemp !== null) {
529
- vo.$alert(`${vo.$t('failedToChangeOrderPermissionGroup')}: ${errTemp}`, { type: 'error' })
530
- return
531
- }
532
-
533
- //gsn
534
- let gsn = null
535
- await waitFun(() => {
536
- gsn = map(vo.groupsTrans, (v, k) => {
537
- return {
538
- id: v.id,
539
- order: k,
540
- }
541
- })
542
- return isEqual(gsn, gs)
543
- })
544
- // console.log('gsn', gsn)
545
-
546
- //alert
547
- vo.$alert(vo.$t('successfulToChangeOrderPermissionGroup'))
548
-
549
- }
550
-
551
- //core
552
- core()
553
- // .then((res) => {
554
- // console.log('then', res)
555
- // })
556
- .catch((err) => {
557
- console.log('catch', err)
558
- vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' })
559
- })
560
- .finally(() => {
561
-
562
- //hide loading
563
- vo.$ui.updateLoading(false)
564
-
565
- })
566
-
567
- },
568
-
569
- modifyGroup: function(group) {
570
- // console.log('methods modifyGroup', group)
571
-
572
- let vo = this
573
-
574
- //check
575
- if (!isestr(group.name)) {
576
- vo.$alert(vo.$t('rememberToGivePermissionGroupName'), { type: 'warning' })
577
- }
578
-
579
- //modify
580
- each(vo.groupsTrans, (v, k) => {
581
- if (v.id === group.id) {
582
- vo.groupsTrans[k] = group
583
- }
584
- })
585
- // console.log('vo.groupsTrans', cloneDeep(vo.groupsTrans))
586
-
587
- //isModified
588
- vo.isModified = true
589
-
590
- },
591
-
592
- saveGroups: function() {
593
- // console.log('methods saveGroups')
594
-
595
- let vo = this
596
-
597
- async function core() {
598
- let errTemp = null
599
-
600
- //check
601
- let b = false
602
- each(vo.groupsTrans, (v, k) => {
603
- if (!isestr(v.name)) {
604
- let t_isPermissionGroupNameEmpty = vo.$t('isPermissionGroupNameEmpty')
605
- t_isPermissionGroupNameEmpty = t_isPermissionGroupNameEmpty.replace('{n}', cstr(k + 1))
606
- vo.$alert(t_isPermissionGroupNameEmpty, { type: 'error' })
607
- b = true
608
- }
609
- })
610
- if (b) {
611
- return
612
- }
613
-
614
- //show loading
615
- vo.$ui.updateLoading(true)
616
-
617
- //groups
618
- let groups = map(vo.groupsTrans, (group) => {
619
- let g = {
620
- id: group.id,
621
- name: group.name,
622
- description: group.description,
623
- crules: group.crules,
624
- }
625
- return g
626
- })
627
-
628
- //save
629
- await vo.$fapi.ruleGroups.save(groups)
630
- .catch((err) => {
631
- errTemp = err
632
- })
633
-
634
- //check
635
- if (errTemp !== null) {
636
- vo.$alert(`${vo.$t('failedToSavePermissionGroup')}: ${errTemp}`, { type: 'error' })
637
- return
638
- }
639
-
640
- //isModified
641
- vo.isModified = false
642
-
643
- //alert
644
- vo.$alert(vo.$t('successfulToSavePermissionGroup'))
645
-
646
- }
647
-
648
- //core
649
- core()
650
- // .then((res) => {
651
- // console.log('then', res)
652
- // })
653
- .catch((err) => {
654
- console.log('catch', err)
655
- vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' })
656
- })
657
- .finally(() => {
658
-
659
- //hide loading
660
- vo.$ui.updateLoading(false)
661
-
662
- })
663
-
664
- },
665
-
666
- }
667
- }
668
- </script>
669
-
670
- <style scoped>
671
- </style>