w-web-perm 1.0.84 → 1.0.85

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 (84) hide show
  1. package/dist/index.tmp +1 -1
  2. package/dist/js/app-legacy.aaaa3681.js +1 -0
  3. package/dist/js/app.aaaa3681.js +1 -0
  4. package/dist/js/{chunk-vendors-legacy.61021940.js → chunk-vendors-legacy.7b6ae0b0.js} +3 -3
  5. package/dist/js/{chunk-vendors.61021940.js → chunk-vendors.7b6ae0b0.js} +3 -3
  6. package/dist/w-web-perm.umd.js +2 -2
  7. package/dist/w-web-perm.umd.js.map +1 -1
  8. package/docs/WWebPerm.html +1 -1
  9. package/docs/global.html +1 -1
  10. package/docs/index.html +1 -1
  11. package/docs/server_WWebPerm.mjs.html +1 -1
  12. package/docs/server_procCore.mjs.html +1 -1
  13. package/docs/src_fetchJson.mjs.html +1 -1
  14. package/package.json +2 -2
  15. package/server/procLang.mjs +12 -4
  16. package/src/components/LayoutContentGrups.vue +5 -5
  17. package/src/components/LayoutContentPemis.vue +5 -5
  18. package/src/components/LayoutContentTargets.vue +2 -2
  19. package/src/components/LayoutContentUsers.vue +4 -2
  20. package/src/components/ModeSelectChip.vue +182 -0
  21. package/src/components/RelationChip.vue +114 -0
  22. package/src/components/RelationChips.vue +375 -0
  23. package/src/components/VeCgrups.vue +23 -20
  24. package/src/components/VeCpemis.vue +21 -20
  25. package/src/components/VeCrules.vue +8 -1
  26. package/src/components/VeGrupBlngUsers.vue +40 -51
  27. package/src/components/VePemiBlngGrups.vue +27 -41
  28. package/tableTags-web-perm.json +1 -1
  29. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/README.md +58 -0
  30. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/server_procLang.mjs.diff +31 -0
  31. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_App.vue.diff +19 -0
  32. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_LayoutContentGrups.vue.diff +40 -0
  33. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_LayoutContentPemis.vue.diff +40 -0
  34. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_ModeSelectChip.vue.new.diff +124 -0
  35. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_RelationChip.vue.new.diff +116 -0
  36. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_RelationChips.vue.new.diff +152 -0
  37. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCgrups.vue.diff +76 -0
  38. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCpemis.vue.diff +76 -0
  39. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCrules.vue.diff +14 -0
  40. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeGrupBlngUsers.vue.diff +121 -0
  41. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VePemiBlngGrups.vue.diff +121 -0
  42. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/server/procLang.mjs +1049 -0
  43. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/App.vue +204 -0
  44. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/LayoutContentGrups.vue +1260 -0
  45. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/LayoutContentPemis.vue +1262 -0
  46. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/ModeSelectChip.vue +121 -0
  47. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/RelationChip.vue +113 -0
  48. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/RelationChips.vue +149 -0
  49. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCgrups.vue +943 -0
  50. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCpemis.vue +943 -0
  51. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCrules.vue +848 -0
  52. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeGrupBlngUsers.vue +1157 -0
  53. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VePemiBlngGrups.vue +1157 -0
  54. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/A-/347/256/241/347/220/206/346/254/212/351/231/220/344/270/273/350/241/250.png +0 -0
  55. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/A-/347/256/241/347/220/206/346/254/212/351/231/220/347/276/244/347/265/204/344/270/273/350/241/250.png +0 -0
  56. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B1-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/260/215/350/251/261/346/241/206.png +0 -0
  57. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B2-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-hover/346/234/254/351/240/205chip.png +0 -0
  58. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B3-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/346/234/254/351/240/205chip/346/270/205/345/226/256.png +0 -0
  59. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B4-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/346/234/254/351/240/205chip/345/267/262/347/202/272AND.png +0 -0
  60. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B5-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/345/205/250/351/203/250/346/265/256/345/261/244.png +0 -0
  61. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/B6-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/213/276/351/201/270/345/276/214/346/234/254/351/240/205chip/345/234/250/351/246/226/344/275/215.png +0 -0
  62. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/C1-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220-/345/260/215/350/251/261/346/241/206.png +0 -0
  63. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/C2-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220-hover/345/267/262/345/213/276/351/201/270/345/210/227/346/216/247/345/210/266/351/240/205.png +0 -0
  64. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/C3-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220-/345/261/225/351/226/213/346/270/205/345/226/256.png +0 -0
  65. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/D1-/347/267/250/350/274/257/346/211/200/345/261/254/344/275/277/347/224/250/350/200/205-/345/260/215/350/251/261/346/241/206.png +0 -0
  66. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/E1-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220/347/276/244/347/265/204-hover.png +0 -0
  67. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/E2-/347/267/250/350/274/257/344/275/277/347/224/250/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/346/270/205/345/226/256.png +0 -0
  68. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/F1-/345/261/225/347/244/272/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/224/257/350/256/200/346/205/213.png +0 -0
  69. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/F2-/345/261/225/347/244/272/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/345/205/250/351/203/250.png +0 -0
  70. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/G1-zoom-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/211/215/345/205/255/345/210/227.png +0 -0
  71. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/G2-zoom-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-hover/346/234/254/351/240/205chip.png +0 -0
  72. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/G3-zoom-/347/267/250/350/274/257/346/211/200/345/261/254/346/254/212/351/231/220/347/276/244/347/265/204-/345/261/225/351/226/213/346/270/205/345/226/256.png +0 -0
  73. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/346/210/252/345/234/226/verify.json +390 -0
  74. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/build.log +93 -0
  75. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/lint.log +23 -0
  76. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/zz_perm_probe.mjs +321 -0
  77. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/zz_perm_zoom.mjs +173 -0
  78. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231//351/251/227/350/255/211/350/205/263/346/234/254/zz_wwp_verify.mjs +330 -0
  79. package//345/273/272/350/255/260w-aggrid-vue/350/252/277/346/225/264.md +193 -0
  80. package//345/273/272/350/255/260w-component-vue/350/210/207wsemi/350/252/277/346/225/264.md +76 -0
  81. package//345/273/272/350/255/260w-web-perm/350/252/277/346/225/264.md +244 -0
  82. package//346/226/275/345/267/245/345/226/256_/345/273/272/350/255/260w-web-perm/350/252/277/346/225/264.md +166 -0
  83. package/dist/js/app-legacy.b759fca8.js +0 -1
  84. package/dist/js/app.b759fca8.js +0 -1
@@ -140,32 +140,16 @@
140
140
  :opt="opt"
141
141
  >
142
142
  <template v-slot:cell-render="props">
143
- <template v-if="props.key==='grupsNames'">
144
- <span v-for="(item, idx) in props.row.grups" :key="idx" style="display:inline-block; line-height:20px; height:20px;">
145
- <div style="display:flex;">
146
- <div :style="'padding:0px 5px; border-top-left-radius:4px; border-bottom-left-radius:4px; ' + (item.enable === 'y' ? 'border-left:1px solid #ac2451; border-right:1px solid #9e2149; border-top:1px solid #ac2451; border-bottom:1px solid #ac2451; background:#be295a; color:#fff;' : 'border-left:1px solid #aaaaaa; border-right:1px solid #aaaaaa; border-top:1px solid #aaaaaa; border-bottom:1px solid #aaaaaa; background:#ffffff; color:#555;')">
147
- {{ item.mode }}
148
- </div>
149
- <div :style="'padding:0px 5px; border-top-right-radius:4px; border-bottom-right-radius:4px; ' + (item.enable === 'y' ? '_border-left:1px solid #ac2451; border-right:1px solid #ac2451; border-top:1px solid #ac2451; border-bottom:1px solid #ac2451; background:#d22f64; color:#fff;' : '_border-left:1px solid #aaaaaa; border-right:1px solid #aaaaaa; border-top:1px solid #aaaaaa; border-bottom:1px solid #aaaaaa; background:#eeeeee; color:#555;')">
150
- {{ item.name }}
151
- </div>
152
- </div>
153
- </span>
154
- </template>
155
- <WTextSelect
156
- v-else-if="props.key==='mode'"
157
- :style="`width:${modeSelectWidth}px;`"
158
- :items="modeItems"
159
- :value="props.row.mode"
143
+ <RelationChips
144
+ v-if="props.key==='grupsNames'"
145
+ :items="props.row.grups"
160
146
  :editable="isEditable"
161
- :paddingStyle="{v:0,h:10}"
162
- :shadow="false"
163
- :itemPaddingStyle="{v:8,h:10}"
164
- :placementDistX="-10"
147
+ :popupTitle="$t('belongGrupsNames')"
148
+ :tooltipAll="$t('chipsShowAll')"
165
149
  :labelContent="'modeSelect'"
166
- @input="(item)=>{showVeGrupBlngUsersToggleItemModeByName(props.row.name, item)}"
167
- ></WTextSelect>
168
- <input v-else-if="props.key==='enable'" type="checkbox" :checked="props.value === 'y'" @click="showVeGrupBlngUsersToggleItemEnableByName(props.row.name)" :disabled="!isEditable" />
150
+ @input="(item)=>{showVeGrupBlngUsersToggleItemModeByName(props.row.name, item, props.row.id)}"
151
+ ></RelationChips>
152
+ <input v-else-if="props.key==='enable'" type="checkbox" :checked="props.value === 'y'" @click="showVeGrupBlngUsersToggleItemEnableByName(props.row.name, props.row.id)" :disabled="!isEditable" />
169
153
  <span v-else>{{ props.value }}</span>
170
154
  </template>
171
155
  </WAggridVue>
@@ -207,7 +191,7 @@ import isestr from 'wsemi/src/isestr.mjs'
207
191
  import WDialog from 'w-component-vue/src/components/WDialog.vue'
208
192
  import WButtonCircle from 'w-component-vue/src/components/WButtonCircle.vue'
209
193
  import WAggridVue from 'w-aggrid-vue/src/components/WAggridVue.vue'
210
- import WTextSelect from 'w-component-vue/src/components/WTextSelect.vue'
194
+ import RelationChips from './RelationChips.vue'
211
195
 
212
196
 
213
197
  export default {
@@ -215,7 +199,7 @@ export default {
215
199
  WDialog,
216
200
  WButtonCircle,
217
201
  WAggridVue,
218
- WTextSelect,
202
+ RelationChips,
219
203
  },
220
204
  props: {
221
205
  },
@@ -244,10 +228,6 @@ export default {
244
228
  isEditable: false,
245
229
  isModified: false,
246
230
 
247
- //mode 欄之自製下拉(WTextSelect, 取代原生 select 以免彈出清單之 highlight 色由 OS 決定)
248
- modeItems: ['OR', 'AND'],
249
- modeSelectWidth: 72, //= 最長項 'AND' 文字實寬 + 左右內距 10×2 + 展開箭頭 18 + 邊框 1×2, 實測後定值(見 CLAUDE_experience.md)
250
-
251
231
  grup: null,
252
232
 
253
233
  items: [],
@@ -414,21 +394,19 @@ export default {
414
394
  let opt = null
415
395
  if (size(vo.items) > 0) {
416
396
 
417
- //ks
397
+ //ks, 本列自己可改的(是否使用)在左, 由其他權限群組帶來的(所屬權限群組名稱)在右; 合併模式併入 grupsNames 欄之本項 chip(RelationChips), 不再獨立成欄
418
398
  let ks = [
419
399
  'name',
420
- 'grupsNames',
421
- 'mode',
422
400
  'enable',
401
+ 'grupsNames',
423
402
  ]
424
403
  // console.log('ks', ks)
425
404
 
426
405
  //kpHead
427
406
  let kpHead = {
428
407
  'name': vo.$t('userName'),
429
- 'grupsNames': vo.$t('belongGrupsNames'),
430
- 'mode': vo.$t('operGrupMode'),
431
408
  'enable': vo.$t('operEnable'),
409
+ 'grupsNames': vo.$t('belongGrupsNames'),
432
410
  }
433
411
 
434
412
  //opt
@@ -442,12 +420,13 @@ export default {
442
420
  defHeadFilter: true,
443
421
  defCellAlignH: 'left',
444
422
  kpCellEditable: {
445
- 'name': vo.isEditable,
446
- 'mode': false,
423
+ //name 一律唯讀: 列固定為全部既有使用者(genItems 產生, 無新增/刪除列); doSave 只回寫 u.cgrups、
424
+ // 完全不讀列上之 name, 故就地改名會被靜默丟棄——有可編輯外觀卻無對應行為(全域 §2.1 第 6 條之半吊子)。
425
+ // 與 VeCgrups/VeCpemis 同類一併關閉(§2.1 第 4 條 對稱性)。
426
+ 'name': false,
447
427
  'enable': false,
448
428
  },
449
429
  kpHeadWidth: {
450
- 'mode': 100,
451
430
  'enable': 100,
452
431
  },
453
432
  // kpRowDrag: {
@@ -459,14 +438,14 @@ export default {
459
438
  kpHeadFilterType: {
460
439
  'name': 'text',
461
440
  'grupsNames': 'text',
462
- 'mode': 'text',
463
441
  'enable': 'text',
464
442
  },
465
443
  // kpHeadCheckBox: {
466
444
  // 'name': true,
467
445
  // },
468
- kpHeadFocusHighlight: { //本欄內容為唯讀徽章(無可聚焦元素), 焦點框徒增干擾故關閉; 與三個清單頁之按鈕欄同一慣例, 該處另受 w-aggrid-vue 2.0.87 之 :focus-within 修正(本欄不可聚焦, 不受影響)
446
+ kpHeadFocusHighlight: { //兩欄之儲存格內皆有自己的控制項(chip 之模式下拉、勾選框), 焦點框徒增干擾故關閉; 控制項取得焦點時之焦點框由 w-aggrid-vue 2.0.87 之 :focus-within 規則一併擋下
469
447
  'grupsNames': false,
448
+ 'enable': false,
470
449
  },
471
450
  rowsChange: (rs) => {
472
451
  // console.log('rowsChange', rs)
@@ -649,6 +628,7 @@ export default {
649
628
  // console.log(u.name, 'grupsNames', grupsNames)
650
629
 
651
630
  return {
631
+ id: u.id, //列識別: 使用者 name 允許重複(僅前端警告、後端不擋), 切換處理須以 id 找列, 不可以 name(否則同名者會改到第一位)
652
632
  name: u.name,
653
633
  grupsNames,
654
634
  mode,
@@ -752,8 +732,8 @@ export default {
752
732
 
753
733
  },
754
734
 
755
- showVeGrupBlngUsersToggleItemModeByName: function(name, mode) {
756
- // console.log('showVeGrupBlngUsersToggleItemModeByName', name, mode)
735
+ showVeGrupBlngUsersToggleItemModeByName: function(name, mode, id) {
736
+ // console.log('showVeGrupBlngUsersToggleItemModeByName', name, mode, id)
757
737
 
758
738
  let vo = this
759
739
 
@@ -766,11 +746,11 @@ export default {
766
746
  //rows
767
747
  let rows = get(vo, 'opt.rows', [])
768
748
 
769
- //find
749
+ //find, 有 id 以 id 找列(使用者 name 可重複, 以 name 會改到第一位同名者); 未給 id 之既有 $dg 呼叫端維持以 name 找
770
750
  let r = null
771
751
  let kr = null
772
752
  each(rows, (v, k) => {
773
- if (get(v, 'name', '') === name) {
753
+ if (isestr(id) ? get(v, 'id', '') === id : get(v, 'name', '') === name) {
774
754
  r = v
775
755
  kr = k
776
756
  return false //跳出
@@ -799,8 +779,8 @@ export default {
799
779
 
800
780
  },
801
781
 
802
- showVeGrupBlngUsersToggleItemEnableByName: function(name) {
803
- // console.log('showVeGrupBlngUsersToggleItemEnableByName', name)
782
+ showVeGrupBlngUsersToggleItemEnableByName: function(name, id) {
783
+ // console.log('showVeGrupBlngUsersToggleItemEnableByName', name, id)
804
784
 
805
785
  let vo = this
806
786
 
@@ -813,11 +793,11 @@ export default {
813
793
  //rows
814
794
  let rows = get(vo, 'opt.rows', [])
815
795
 
816
- //find
796
+ //find, 理由同 showVeGrupBlngUsersToggleItemModeByName: 有 id 以 id 找列
817
797
  let r = null
818
798
  let kr = null
819
799
  each(rows, (v, k) => {
820
- if (get(v, 'name', '') === name) {
800
+ if (isestr(id) ? get(v, 'id', '') === id : get(v, 'name', '') === name) {
821
801
  r = v
822
802
  kr = k
823
803
  return false //跳出
@@ -982,13 +962,14 @@ export default {
982
962
  await vo.$dg.showCheckYes(`${vo.$t('userSaveUsersFail')}: ${vo.$tErr(err)}`)
983
963
  })
984
964
  if (!okSave) {
985
- return
965
+ return false //回報失敗: 呼叫端 doSave 據此不關閉對話框, 保留未存變更供修正後重按儲存
986
966
  }
987
967
 
988
968
  //alert(showCheckYes 前關 loading,避免 modal 等待期間 loading 疊在底下)
989
969
  vo.$ui.updateLoading(false)
990
970
  await vo.$dg.showCheckYes(vo.$t('userSaveUsersSuccess'), { type: 'success' })
991
971
 
972
+ return true
992
973
  },
993
974
 
994
975
  clickBtns: function(msg) {
@@ -1089,8 +1070,11 @@ export default {
1089
1070
  // return
1090
1071
  // }
1091
1072
 
1092
- //saveUsers
1093
- await vo.saveUsers(usersNew)
1073
+ //saveUsers, 失敗時回 false: 失敗提示已由 saveUsers 顯示, 此處不關閉對話框(保留未存變更供重按儲存)
1074
+ let okSave = await vo.saveUsers(usersNew)
1075
+ if (!okSave) {
1076
+ return false
1077
+ }
1094
1078
 
1095
1079
  }
1096
1080
 
@@ -1098,6 +1082,11 @@ export default {
1098
1082
  core()
1099
1083
  .then((rows) => {
1100
1084
 
1085
+ //存檔失敗: 不 resolve、不關窗(規格「若寫入失敗…對話框不關閉,可修正後重按儲存」; 舊版於此無條件關窗, 2026-09-17 審計查出)
1086
+ if (rows === false) {
1087
+ return
1088
+ }
1089
+
1101
1090
  //resolve
1102
1091
  vo.pm.resolve(rows)
1103
1092
 
@@ -140,31 +140,15 @@
140
140
  :opt="opt"
141
141
  >
142
142
  <template v-slot:cell-render="props">
143
- <template v-if="props.key==='pemisNames'">
144
- <span v-for="(item, idx) in props.row.pemis" :key="idx" style="display:inline-block; line-height:20px; height:20px;">
145
- <div style="display:flex;">
146
- <div :style="'padding:0px 5px; border-top-left-radius:4px; border-bottom-left-radius:4px; ' + (item.enable === 'y' ? 'border-left:1px solid #ac2451; border-right:1px solid #9e2149; border-top:1px solid #ac2451; border-bottom:1px solid #ac2451; background:#be295a; color:#fff;' : 'border-left:1px solid #aaaaaa; border-right:1px solid #aaaaaa; border-top:1px solid #aaaaaa; border-bottom:1px solid #aaaaaa; background:#ffffff; color:#555;')">
147
- {{ item.mode }}
148
- </div>
149
- <div :style="'padding:0px 5px; border-top-right-radius:4px; border-bottom-right-radius:4px; ' + (item.enable === 'y' ? '_border-left:1px solid #ac2451; border-right:1px solid #ac2451; border-top:1px solid #ac2451; border-bottom:1px solid #ac2451; background:#d22f64; color:#fff;' : '_border-left:1px solid #aaaaaa; border-right:1px solid #aaaaaa; border-top:1px solid #aaaaaa; border-bottom:1px solid #aaaaaa; background:#eeeeee; color:#555;')">
150
- {{ item.name }}
151
- </div>
152
- </div>
153
- </span>
154
- </template>
155
- <WTextSelect
156
- v-else-if="props.key==='mode'"
157
- :style="`width:${modeSelectWidth}px;`"
158
- :items="modeItems"
159
- :value="props.row.mode"
143
+ <RelationChips
144
+ v-if="props.key==='pemisNames'"
145
+ :items="props.row.pemis"
160
146
  :editable="isEditable"
161
- :paddingStyle="{v:0,h:10}"
162
- :shadow="false"
163
- :itemPaddingStyle="{v:8,h:10}"
164
- :placementDistX="-10"
147
+ :popupTitle="$t('belongPemisNames')"
148
+ :tooltipAll="$t('chipsShowAll')"
165
149
  :labelContent="'modeSelect'"
166
150
  @input="(item)=>{showVePemiBlngGrupsToggleItemModeByName(props.row.name, item)}"
167
- ></WTextSelect>
151
+ ></RelationChips>
168
152
  <input v-else-if="props.key==='enable'" type="checkbox" :checked="props.value === 'y'" @click="showVePemiBlngGrupsToggleItemEnableByName(props.row.name)" :disabled="!isEditable" />
169
153
  <span v-else>{{ props.value }}</span>
170
154
  </template>
@@ -207,7 +191,7 @@ import isestr from 'wsemi/src/isestr.mjs'
207
191
  import WDialog from 'w-component-vue/src/components/WDialog.vue'
208
192
  import WButtonCircle from 'w-component-vue/src/components/WButtonCircle.vue'
209
193
  import WAggridVue from 'w-aggrid-vue/src/components/WAggridVue.vue'
210
- import WTextSelect from 'w-component-vue/src/components/WTextSelect.vue'
194
+ import RelationChips from './RelationChips.vue'
211
195
 
212
196
 
213
197
  export default {
@@ -215,7 +199,7 @@ export default {
215
199
  WDialog,
216
200
  WButtonCircle,
217
201
  WAggridVue,
218
- WTextSelect,
202
+ RelationChips,
219
203
  },
220
204
  props: {
221
205
  },
@@ -244,10 +228,6 @@ export default {
244
228
  isEditable: false,
245
229
  isModified: false,
246
230
 
247
- //mode 欄之自製下拉(WTextSelect, 取代原生 select 以免彈出清單之 highlight 色由 OS 決定)
248
- modeItems: ['OR', 'AND'],
249
- modeSelectWidth: 72, //= 最長項 'AND' 文字實寬 + 左右內距 10×2 + 展開箭頭 18 + 邊框 1×2, 實測後定值(見 CLAUDE_experience.md)
250
-
251
231
  pemi: null,
252
232
 
253
233
  items: [],
@@ -414,21 +394,19 @@ export default {
414
394
  let opt = null
415
395
  if (size(vo.items) > 0) {
416
396
 
417
- //ks
397
+ //ks, 本列自己可改的(是否使用)在左, 由其他權限帶來的(所屬權限名稱)在右; 合併模式併入 pemisNames 欄之本項 chip(RelationChips), 不再獨立成欄
418
398
  let ks = [
419
399
  'name',
420
- 'pemisNames',
421
- 'mode',
422
400
  'enable',
401
+ 'pemisNames',
423
402
  ]
424
403
  // console.log('ks', ks)
425
404
 
426
405
  //kpHead
427
406
  let kpHead = {
428
407
  'name': vo.$t('grupName'),
429
- 'pemisNames': vo.$t('belongPemisNames'),
430
- 'mode': vo.$t('operPemiMode'),
431
408
  'enable': vo.$t('operEnable'),
409
+ 'pemisNames': vo.$t('belongPemisNames'),
432
410
  }
433
411
 
434
412
  //opt
@@ -442,12 +420,11 @@ export default {
442
420
  defHeadFilter: true,
443
421
  defCellAlignH: 'left',
444
422
  kpCellEditable: {
445
- 'name': vo.isEditable,
446
- 'mode': false,
423
+ //name 一律唯讀: 理由同 VeGrupBlngUsers——doSave 只回寫 cpemis、不讀列上之 name, 改名會被靜默丟棄。
424
+ 'name': false,
447
425
  'enable': false,
448
426
  },
449
427
  kpHeadWidth: {
450
- 'mode': 100,
451
428
  'enable': 100,
452
429
  },
453
430
  // kpRowDrag: {
@@ -459,14 +436,14 @@ export default {
459
436
  kpHeadFilterType: {
460
437
  'name': 'text',
461
438
  'pemisNames': 'text',
462
- 'mode': 'text',
463
439
  'enable': 'text',
464
440
  },
465
441
  // kpHeadCheckBox: {
466
442
  // 'name': true,
467
443
  // },
468
- kpHeadFocusHighlight: { //本欄內容為唯讀徽章(無可聚焦元素), 焦點框徒增干擾故關閉; 與三個清單頁之按鈕欄同一慣例, 該處另受 w-aggrid-vue 2.0.87 之 :focus-within 修正(本欄不可聚焦, 不受影響)
444
+ kpHeadFocusHighlight: { //兩欄之儲存格內皆有自己的控制項(chip 之模式下拉、勾選框), 焦點框徒增干擾故關閉; 控制項取得焦點時之焦點框由 w-aggrid-vue 2.0.87 之 :focus-within 規則一併擋下
469
445
  'pemisNames': false,
446
+ 'enable': false,
470
447
  },
471
448
  rowsChange: (rs) => {
472
449
  // console.log('rowsChange', rs)
@@ -982,13 +959,14 @@ export default {
982
959
  await vo.$dg.showCheckYes(`${vo.$t('grupSaveGrupsFail')}: ${vo.$tErr(err)}`)
983
960
  })
984
961
  if (!okSave) {
985
- return
962
+ return false //回報失敗: 呼叫端 doSave 據此不關閉對話框, 保留未存變更供修正後重按儲存
986
963
  }
987
964
 
988
965
  //alert(showCheckYes 前關 loading,避免 modal 等待期間 loading 疊在底下)
989
966
  vo.$ui.updateLoading(false)
990
967
  await vo.$dg.showCheckYes(vo.$t('grupSaveGrupsSuccess'), { type: 'success' })
991
968
 
969
+ return true
992
970
  },
993
971
 
994
972
  clickBtns: function(msg) {
@@ -1089,8 +1067,11 @@ export default {
1089
1067
  // return
1090
1068
  // }
1091
1069
 
1092
- //saveGrups
1093
- await vo.saveGrups(grupsNew)
1070
+ //saveGrups, 失敗時回 false: 失敗提示已由 saveGrups 顯示, 此處不關閉對話框(保留未存變更供重按儲存)
1071
+ let okSave = await vo.saveGrups(grupsNew)
1072
+ if (!okSave) {
1073
+ return false
1074
+ }
1094
1075
 
1095
1076
  }
1096
1077
 
@@ -1098,6 +1079,11 @@ export default {
1098
1079
  core()
1099
1080
  .then((rows) => {
1100
1081
 
1082
+ //存檔失敗: 不 resolve、不關窗(規格「若寫入失敗…對話框不關閉,可修正後重按儲存」; 舊版於此無條件關窗, 2026-09-17 審計查出)
1083
+ if (rows === false) {
1084
+ return
1085
+ }
1086
+
1101
1087
  //resolve
1102
1088
  vo.pm.resolve(rows)
1103
1089
 
@@ -1 +1 @@
1
- {"grups":"2026-09-16T15:01:20+08:00|0Lr4Fj","pemis":"2026-09-16T14:57:54+08:00|Lt1oSV","targets":"2026-09-16T14:57:54+08:00|9AnMSx","users":"2026-09-16T14:57:54+08:00|lXyOQd"}
1
+ {"grups":"2026-09-17T11:37:36+08:00|gTYuDo","pemis":"2026-09-17T11:38:08+08:00|hOfypy","targets":"2026-09-17T11:37:36+08:00|H5JFDN","users":"2026-09-17T11:37:36+08:00|UGtQAM"}
@@ -0,0 +1,58 @@
1
+ # w-web-perm 隨附資料:依「建議w-web-perm調整.md」實作之修改版原始檔、差異檔與驗證證據
2
+
3
+ - 基準版本:`w-web-perm` 1.0.83(取自 `rddmanager_2_perm/node_modules/w-web-perm`);建置與驗證所用之相依:`vue` 2.7.16、`w-component-vue` 2.5.15、`w-aggrid-vue` 2.0.86、`ag-grid-community` 31.3.4、`@vue/cli-service` 5.0.9
4
+ - 產出日期:2026-09-15
5
+ - 對應建議書:主專案根之 `建議w-web-perm調整.md`(問題盤查、對標、矩陣、方案與規格);另有 `建議w-aggrid-vue修正.md`(本次連帶查出之 w-aggrid-vue 缺陷)
6
+ - 本資料夾內之檔案皆為**可直接覆蓋至套件對應路徑**之完整檔(非片段),`diff/` 另附對 1.0.83 之差異供審閱
7
+
8
+ ## 1. 檔案清單與各檔改了什麼
9
+
10
+ | 路徑(對應套件內路徑) | 性質 | 內容 |
11
+ |---|---|---|
12
+ | `src/components/ModeSelectChip.vue` | 新增 | 合併模式(OR/AND)控制項:內核 `WTextSelect`(`labelContent` 仍為 `modeSelect`),外觀為 chip 模式段(56×22、方角 4px、字 12px、內距 0 5、箭頭 14),`highlight`(醒目色)與 `attached`(右側無圓角,嵌於 chip 左段)兩個外觀開關;唯讀時透明度 0.6、無箭頭、不展開;清單 `minWidth` 給整顆寬使清單不窄於控制項、`placementDistX -6` 使清單左緣對齊外框 |
13
+ | `src/components/RelationChip.vue` | 新增 | 單顆關聯 chip(模式段+名稱段,整顆 22px);`isCurrent` 為本項時用醒目色;`editable && isCurrent` 時模式段即 `ModeSelectChip`(chip 即下拉),其餘 chip 之模式段為純文字;名稱段 `max-width 240px` 省略號截斷、全名放 `title` |
14
+ | `src/components/RelationChips.vue` | 新增 | chip 列表:本項永遠排第 1 顆(只改顯示順序)、相鄰間距 4px;最左固定「⋯ N」展開鈕(`title` 為 `$t('chipsShowAll')`),點開 `WPopup`(`labelContent` 為 `relationChipsAll`、寬 320~560、內容 `flex-wrap` 且最大高 50vh 可捲)列出全部 chip;標題文字用 `$t('chipsPopupTitle')` 之 `{title}`/`{n}` 佔位 |
15
+ | `src/components/VeGrupBlngUsers.vue` | 修改 | `grupsNames` 欄改用 `RelationChips`(`@input` 沿用 `showVeGrupBlngUsersToggleItemModeByName`);移除 `mode` 欄與 `WTextSelect`、`modeItems`、`modeSelectWidth`;`ks` 改為 `name`、`enable`、`grupsNames`(本列自己可改的在左);`kpHeadFocusHighlight` 加 `enable:false`。`genItems`/`revRows`/`doSave` 之資料流不動 |
16
+ | `src/components/VePemiBlngGrups.vue` | 修改 | 同上,對象為 `pemisNames`/`showVePemiBlngGrupsToggleItemModeByName` |
17
+ | `src/components/VeCgrups.vue` | 修改 | `mode` 欄改用 `ModeSelectChip`,`editable` 綁 `isEditable && props.row.enable === 'y'`(未勾選列淡化不可操作);`kpHeadWidth.mode` 100 改 90;加 `kpHeadFocusHighlight { mode:false, enable:false }`;移除 `WTextSelect`、`modeItems`、`modeSelectWidth` |
18
+ | `src/components/VeCpemis.vue` | 修改 | 同上 |
19
+ | `src/components/VeCrules.vue` | 修改 | 只加 `kpHeadFocusHighlight { enable:false }`(與其餘關聯對話框一致) |
20
+ | `src/components/LayoutContentGrups.vue` | 修改 | `tabKeys`/`tabKeysPick`/`tabKeysShow` 之 `cpemis` 移到 `belongUsers` 之前(主表欄序:管控使用權限、管控所屬使用者) |
21
+ | `src/components/LayoutContentPemis.vue` | 修改 | 同上,`crules` 移到 `belongGrups` 之前(管控對象、管控所屬權限群組) |
22
+ | `src/App.vue` | 修改 | 全域樣式加一條 `.CompCssWAggridVue .no-border.ag-cell:focus-within { border-color:transparent !important; }`,補 w-aggrid-vue 2.0.86 只覆寫 `:focus` 之缺口(詳 `建議w-aggrid-vue修正.md`),該套件修正後可移除 |
23
+ | `server/procLang.mjs` | 修改 | `belongGrups.cht` 改「管控所屬權限群組」;新增 `chipsShowAll`(展開全部)與 `chipsPopupTitle`(`{title}:共 {n} 項`)兩鍵,eng 同步 |
24
+ | `diff/*.diff` | 差異 | 對 1.0.83 原檔之 unified diff(`git diff --no-index`);三個新檔為 `*.new.diff`(`diff -u /dev/null`) |
25
+ | `驗證截圖/*.png`、`驗證截圖/verify.json` | 證據 | 修改版於真瀏覽器之量測與截圖(見第 3 節) |
26
+ | `驗證腳本/zz_wwp_verify.mjs` | 工具 | Playwright 驗證腳本(27 項判準);`zz_perm_probe.mjs`/`zz_perm_zoom.mjs` 為修改前之量測腳本(w-screenctl/Playwright) |
27
+ | `驗證腳本/build.log`、`lint.log` | 證據 | vue-cli 建置與 eslint 輸出 |
28
+
29
+ 未隨附:`dist/`(請依套件自身流程 `npm run build` 再 `toolg/genEntry.mjs` 產 `index.tmp`)、`docs/`、`w-web-perm.umd.js`(`src/perm.mjs`/`getPerm.mjs` 未動,umd 不受影響)。
30
+
31
+ ## 2. 建置與驗證方式(可重現)
32
+
33
+ 1. 把 1.0.83 之 `src/`、`public/`、`babel.config.js`、`vue.config.js`、`package.json`、`.eslintrc.js` 複製到主專案 `tmp/wwp_build/`,覆蓋本資料夾之 `src/`,以主專案之 `@vue/cli-service` 5.0.9 建置(相依皆自主專案 `node_modules` 解析,版本與 `rddmanager_2_perm` 相同):`vue-cli-service build`,12 秒完成,無錯誤。
34
+ 2. `vue-cli-service lint --no-fix` 掃上列 11 檔:新增之三檔與本次改動之行皆無錯誤;剩餘 8 筆 `brace-style` 全在原檔既有之 `.then(() => { okSave = true })` 一行寫法(`LayoutContentGrups.vue:1224`、`LayoutContentPemis.vue:1226`、`VeGrupBlngUsers.vue:956`、`VePemiBlngGrups.vue:956`),非本次改動,未動。
35
+ 3. 以 `rddmanager_2_perm/test/e2e-srv.mjs` 於另一 cwd(含建置後之 `dist/`)啟動第二個後端於埠 11016,資料庫為 e2e 種子快照之複本,設定檔以 `kpLangExt` 帶入 `belongGrups`/`chipsShowAll`/`chipsPopupTitle`(效果同 `server/procLang.mjs` 之修改,因後端仍載入 node_modules 內之原版 procLang)。
36
+ 4. `驗證腳本/zz_wwp_verify.mjs`:Playwright 1600×900(放大圖 DPR 3),自單一登入系統以真實 UI 登入取得權杖後開 `http://localhost:11016/?token=…`,真滑鼠 hover/點擊,逐條量測。
37
+
38
+ ## 3. 驗證結果(27 項判準全數通過,`驗證截圖/verify.json`)
39
+
40
+ | 判準(對應建議書第 8 節) | 實測 |
41
+ |---|---|
42
+ | 主表欄序 | 管理權限群組:名稱、說明、管控使用權限、管控所屬使用者;管理權限:名稱、說明、管控對象、管控所屬權限群組(`A-*.png`) |
43
+ | 模式控制項幾何 | 整顆 56×22(外框 `border-radius` 獨立 4px、嵌 chip `4px 0 0 4px`),落在 27px 儲存格內(y 297.8~319.8 對 293~320),四個對話框皆同(`B1`、`C1`、`D1`、`E1`) |
44
+ | 儲存格焦點框 | hover 與點擊後儲存格 `border` 皆為透明,class 含 `no-border`(`B2`、`B3`、`G2`、`G3`) |
45
+ | 清單浮層 | 56 寬、兩列各 28px、依序 OR、AND,左緣與控制項對齊(941 對 940.9);點 AND 後 chip 顯示 AND 且清單收起(`B3`、`B4`、`C3`、`E2`、`G3`) |
46
+ | chip | 相鄰間距 4px、整顆與內層皆 22px(`G1`);`系統管理者編輯_權限群組` 列 94 顆時儲存格內第 1 個元素為「⋯ 94」鈕、第 2 個為本項醒目 chip(`B1`、`G1`) |
47
+ | 展開全部 | 浮層 560×488(位於視窗內),列出 94 顆、本項第 1 顆且醒目,標題「所屬權限名稱:共 94 項」(`B5`);唯讀態仍可開(`F2`) |
48
+ | 未勾選列 | 所屬對話框:無任何模式控制項;勾選後本項 chip 立即成為第 1 顆並帶下拉(`B6`)。使用對話框:控制項透明度 0.6、無箭頭、點擊不展開(`C1`~`C3`) |
49
+ | 唯讀(展示)態 | 本項 chip 之模式段為純文字、無箭頭、無下拉;勾選框 `disabled`(`F1`) |
50
+
51
+ ## 4. 已知事項與未涵蓋
52
+
53
+ 1. 儲存格焦點框之根因在 `w-aggrid-vue`(`WAggridVue.vue:2874` 只寫 `:focus`),本修改版於 `App.vue` 先行覆寫,見 `建議w-aggrid-vue修正.md`。
54
+ 2. `WPopup` 展開中按 Escape 不關閉(`w-component-vue` 之 `modeHide` 只有 click/mousedown),本次未動。
55
+ 3. 只驗證 `cht`;`eng` 之字串已同步但未開畫面看。
56
+ 4. 套件自身之測試(若有)未執行;`dist/` 未重建。
57
+ 5. 兩個「所屬」對話框之欄序改為「名稱、是否使用、所屬…名稱」,若不採用,只需把 `genOpt` 之 `ks` 順序改回並保留其餘改動。
58
+ 6. 主系統端後續(非套件端工作):套件發版後重寫 `rddmanager_2_perm/spec` 之相關案例、重產標準圖、改 e2e helper(原以 `width:72px` 行內樣式定位下拉整顆,改後為 `width:56px`,且本項 chip 之下拉須以 chip 為錨)、改操作手冊 C 冊。
@@ -0,0 +1,31 @@
1
+ diff --git a/../rddmanager_2_perm/node_modules/w-web-perm/server/procLang.mjs "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/server/procLang.mjs"
2
+ index 3550d24..17966da 100644
3
+ --- a/../rddmanager_2_perm/node_modules/w-web-perm/server/procLang.mjs
4
+ +++ "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/server/procLang.mjs"
5
+ @@ -262,9 +262,9 @@ let kpLang = {
6
+ eng: `Use users`,
7
+ cht: `管控所屬使用者`,
8
+ },
9
+ - belongGrups: {
10
+ + belongGrups: { //與 belongUsers(管控所屬使用者)同類之反向參照欄, 中文補「管控」以對稱(2026-09-15 業主指正)
11
+ eng: `Use groups`,
12
+ - cht: `所屬權限群組`,
13
+ + cht: `管控所屬權限群組`,
14
+ },
15
+ //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
16
+ // belongPemis: {
17
+ @@ -279,6 +279,14 @@ let kpLang = {
18
+ eng: `Use permissions`,
19
+ cht: `所屬權限名稱`,
20
+ },
21
+ + chipsShowAll: { //關聯 chip 列表(RelationChips)之「展開全部」鈕提示
22
+ + eng: `Show all`,
23
+ + cht: `展開全部`,
24
+ + },
25
+ + chipsPopupTitle: { //關聯 chip 列表之展開浮層標題, {title} 為欄名(belongGrupsNames/belongPemisNames), {n} 為數量
26
+ + eng: `{title} ({n} in total)`,
27
+ + cht: `{title}:共 {n} 項`,
28
+ + },
29
+
30
+ isAdmin: {
31
+ eng: `Administrator`,
@@ -0,0 +1,19 @@
1
+ diff --git a/../rddmanager_2_perm/node_modules/w-web-perm/src/App.vue "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/App.vue"
2
+ index 55ec0af..315c79e 100644
3
+ --- a/../rddmanager_2_perm/node_modules/w-web-perm/src/App.vue
4
+ +++ "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/App.vue"
5
+ @@ -175,6 +175,14 @@ button {
6
+ font-family: inherit;
7
+ }
8
+
9
+ +/* 關聯對話框之儲存格內有自己的控制項(模式下拉、勾選框、chip 下拉)時, 各 Ve*.vue 以 kpHeadFocusHighlight=false 讓 w-aggrid-vue 加 no-border,
10
+ + 但 w-aggrid-vue 2.0.86 之覆寫只寫 :focus(WAggridVue.vue:2874), 焦點落在儲存格之子元素時 ag-grid 31 以 :focus-within 畫框(ag-grid.css:6230),
11
+ + 故此處補 :focus-within; 待 w-aggrid-vue 修正(見 建議w-aggrid-vue修正.md)後可移除 */
12
+ +.CompCssWAggridVue .no-border.ag-cell:focus-within {
13
+ + border-color: transparent !important;
14
+ + outline: none;
15
+ +}
16
+ +
17
+ .fade-enter-active {
18
+ animation: go 1s;
19
+ }
@@ -0,0 +1,40 @@
1
+ diff --git a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/LayoutContentGrups.vue "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/LayoutContentGrups.vue"
2
+ index f6b9ad4..e1f5076 100644
3
+ --- a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/LayoutContentGrups.vue
4
+ +++ "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/LayoutContentGrups.vue"
5
+ @@ -306,13 +306,13 @@ export default {
6
+ isEditable: false,
7
+ isModified: false,
8
+
9
+ - tabKeys: [
10
+ + tabKeys: [ //關聯欄之欄序: 本項自己管控的(管控使用權限)在左, 由上層帶過來的(管控所屬使用者)在右
11
+ 'id',
12
+ 'name',
13
+ 'description',
14
+ 'from',
15
+ - 'belongUsers',
16
+ 'cpemis',
17
+ + 'belongUsers',
18
+ 'userId',
19
+ 'timeCreate',
20
+ 'userIdUpdate',
21
+ @@ -322,8 +322,8 @@ export default {
22
+ 'name',
23
+ 'description',
24
+ 'from',
25
+ - 'belongUsers',
26
+ 'cpemis',
27
+ + 'belongUsers',
28
+ 'userId',
29
+ 'timeCreate',
30
+ 'userIdUpdate',
31
+ @@ -333,8 +333,8 @@ export default {
32
+ 'name',
33
+ 'description',
34
+ // 'from',
35
+ - 'belongUsers',
36
+ 'cpemis',
37
+ + 'belongUsers',
38
+ // 'userId',
39
+ // 'timeCreate',
40
+ // 'userIdUpdate',
@@ -0,0 +1,40 @@
1
+ diff --git a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/LayoutContentPemis.vue "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/LayoutContentPemis.vue"
2
+ index 524b4bd..77f32c9 100644
3
+ --- a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/LayoutContentPemis.vue
4
+ +++ "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/LayoutContentPemis.vue"
5
+ @@ -306,13 +306,13 @@ export default {
6
+ isEditable: false,
7
+ isModified: false,
8
+
9
+ - tabKeys: [
10
+ + tabKeys: [ //關聯欄之欄序: 本項自己管控的(管控對象)在左, 由上層帶過來的(管控所屬權限群組)在右
11
+ 'id',
12
+ 'name',
13
+ 'description',
14
+ 'from',
15
+ - 'belongGrups',
16
+ 'crules',
17
+ + 'belongGrups',
18
+ 'userId',
19
+ 'timeCreate',
20
+ 'userIdUpdate',
21
+ @@ -322,8 +322,8 @@ export default {
22
+ 'name',
23
+ 'description',
24
+ 'from',
25
+ - 'belongGrups',
26
+ 'crules',
27
+ + 'belongGrups',
28
+ 'userId',
29
+ 'timeCreate',
30
+ 'userIdUpdate',
31
+ @@ -333,8 +333,8 @@ export default {
32
+ 'name',
33
+ 'description',
34
+ // 'from',
35
+ - 'belongGrups',
36
+ 'crules',
37
+ + 'belongGrups',
38
+ // 'userId',
39
+ // 'timeCreate',
40
+ // 'userIdUpdate',