w-web-perm 1.0.85 → 1.0.86

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 (66) hide show
  1. package/dist/index.tmp +1 -1
  2. package/dist/js/{chunk-vendors-legacy.7b6ae0b0.js → chunk-vendors-legacy.d85138b8.js} +1 -1
  3. package/dist/js/{chunk-vendors.7b6ae0b0.js → chunk-vendors.d85138b8.js} +1 -1
  4. package/dist/w-web-perm.umd.js +1 -1
  5. package/docs/WWebPerm.html +1 -1
  6. package/docs/global.html +1 -1
  7. package/docs/index.html +1 -1
  8. package/docs/server_WWebPerm.mjs.html +1 -1
  9. package/docs/server_procCore.mjs.html +1 -1
  10. package/docs/src_fetchJson.mjs.html +1 -1
  11. package/package.json +2 -2
  12. package/tableTags-web-perm.json +1 -1
  13. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/README.md +0 -58
  14. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/server_procLang.mjs.diff +0 -31
  15. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_App.vue.diff +0 -19
  16. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_LayoutContentGrups.vue.diff +0 -40
  17. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_LayoutContentPemis.vue.diff +0 -40
  18. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_ModeSelectChip.vue.new.diff +0 -124
  19. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_RelationChip.vue.new.diff +0 -116
  20. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_RelationChips.vue.new.diff +0 -152
  21. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCgrups.vue.diff +0 -76
  22. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCpemis.vue.diff +0 -76
  23. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCrules.vue.diff +0 -14
  24. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeGrupBlngUsers.vue.diff +0 -121
  25. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VePemiBlngGrups.vue.diff +0 -121
  26. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/server/procLang.mjs +0 -1049
  27. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/App.vue +0 -204
  28. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/LayoutContentGrups.vue +0 -1260
  29. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/LayoutContentPemis.vue +0 -1262
  30. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/ModeSelectChip.vue +0 -121
  31. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/RelationChip.vue +0 -113
  32. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/RelationChips.vue +0 -149
  33. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCgrups.vue +0 -943
  34. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCpemis.vue +0 -943
  35. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCrules.vue +0 -848
  36. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeGrupBlngUsers.vue +0 -1157
  37. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VePemiBlngGrups.vue +0 -1157
  38. 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
  39. 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
  40. 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
  41. 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
  42. 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
  43. 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
  44. 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
  45. 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
  46. 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
  47. 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
  48. 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
  49. 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
  50. 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
  51. 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
  52. 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
  53. 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
  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/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
  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/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
  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/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
  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/verify.json +0 -390
  58. 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 +0 -93
  59. 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 +0 -23
  60. 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 +0 -321
  61. 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 +0 -173
  62. 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 +0 -330
  63. package//345/273/272/350/255/260w-aggrid-vue/350/252/277/346/225/264.md +0 -193
  64. package//345/273/272/350/255/260w-component-vue/350/210/207wsemi/350/252/277/346/225/264.md +0 -76
  65. package//345/273/272/350/255/260w-web-perm/350/252/277/346/225/264.md +0 -244
  66. 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 +0 -166
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * w-web-perm v1.0.85
2
+ * w-web-perm v1.0.86
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
@@ -1045,7 +1045,7 @@
1045
1045
  <br class="clear">
1046
1046
 
1047
1047
  <footer>
1048
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 11:38:22 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1048
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 14:33:53 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1049
1049
  </footer>
1050
1050
 
1051
1051
  <script>prettyPrint();</script>
package/docs/global.html CHANGED
@@ -597,7 +597,7 @@
597
597
  <br class="clear">
598
598
 
599
599
  <footer>
600
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 11:38:22 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
600
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 14:33:53 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
601
601
  </footer>
602
602
 
603
603
  <script>prettyPrint();</script>
package/docs/index.html CHANGED
@@ -71,7 +71,7 @@
71
71
  <br class="clear">
72
72
 
73
73
  <footer>
74
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 11:38:22 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
74
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 14:33:53 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
75
75
  </footer>
76
76
 
77
77
  <script>prettyPrint();</script>
@@ -1221,7 +1221,7 @@ export default WWebPerm
1221
1221
  <br class="clear">
1222
1222
 
1223
1223
  <footer>
1224
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 11:38:22 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1224
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 14:33:53 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1225
1225
  </footer>
1226
1226
 
1227
1227
  <script>prettyPrint();</script>
@@ -298,7 +298,7 @@ export default proc
298
298
  <br class="clear">
299
299
 
300
300
  <footer>
301
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 11:38:22 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
301
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 14:33:53 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
302
302
  </footer>
303
303
 
304
304
  <script>prettyPrint();</script>
@@ -100,7 +100,7 @@ export default fetchJson
100
100
  <br class="clear">
101
101
 
102
102
  <footer>
103
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 11:38:22 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
103
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Thu Sep 17 2026 14:33:53 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
104
104
  </footer>
105
105
 
106
106
  <script>prettyPrint();</script>
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "w-web-perm",
3
- "version": "1.0.85",
3
+ "version": "1.0.86",
4
4
  "main": "dist/w-web-perm.umd.js",
5
5
  "dependencies": {
6
6
  "json5": "^2.2.3",
7
7
  "w-aggrid-vue": "^2.0.88",
8
- "w-component-vue": "^2.5.15",
8
+ "w-component-vue": "^2.5.16",
9
9
  "w-data-collector": "^1.0.37",
10
10
  "w-echarts-vue": "^1.0.11",
11
11
  "w-serv-hapi": "^1.0.88",
@@ -1 +1 @@
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"}
1
+ {"grups":"2026-09-17T11:40:07+08:00|bqCAik","pemis":"2026-09-17T11:40:07+08:00|30uZzg","targets":"2026-09-17T11:40:07+08:00|wDw3pI","users":"2026-09-17T11:40:07+08:00|TSRmPQ"}
@@ -1,58 +0,0 @@
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 冊。
@@ -1,31 +0,0 @@
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`,
@@ -1,19 +0,0 @@
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
- }
@@ -1,40 +0,0 @@
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',
@@ -1,40 +0,0 @@
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',
@@ -1,124 +0,0 @@
1
- --- /dev/null 2026-09-15 21:52:30.000000000 +0800
2
- +++ "./w-web-perm�\232��\231\204�\207�\226\231/src/components/ModeSelectChip.vue" 2026-09-15 21:52:29.942414300 +0800
3
- @@ -0,0 +1,121 @@
4
- +<template>
5
- + <div
6
- + :style="`display:inline-block; vertical-align:middle; line-height:20px; border-radius:${attached?'4px 0 0 4px':'4px'}; overflow:hidden;`"
7
- + >
8
- + <WTextSelect
9
- + :style="`width:${width}px;`"
10
- + :items="items"
11
- + :value="value"
12
- + :editable="editable"
13
- + :paddingStyle="{v:0,h:5}"
14
- + :borderRadius="0"
15
- + :shadow="false"
16
- + :textFontSize="'12px'"
17
- + :textColor="useTextColor"
18
- + :backgroundColor="useBackgroundColor"
19
- + :backgroundColorHover="useBackgroundColorHover"
20
- + :backgroundColorFocus="useBackgroundColorHover"
21
- + :borderColor="useBorderColor"
22
- + :borderColorHover="useBorderColorHover"
23
- + :borderColorFocus="useBorderColorHover"
24
- + :showExpansionIcon="editable"
25
- + :expansionIconSize="14"
26
- + :expansionIconColor="useIconColor"
27
- + :itemPaddingStyle="{v:6,h:10}"
28
- + :itemTextFontSize="'12px'"
29
- + :minWidth="width"
30
- + :placementDistX="placementDistX"
31
- + :labelContent="labelContent"
32
- + @input="(item)=>{$emit('input',item)}"
33
- + ></WTextSelect>
34
- + </div>
35
- +</template>
36
- +
37
- +<script>
38
- +import WTextSelect from 'w-component-vue/src/components/WTextSelect.vue'
39
- +
40
- +
41
- +//合併模式(OR/AND)控制項, 外觀為關聯 chip 之模式段(方角 4px、高 22px、字 12px), 內核仍為 WTextSelect(選項清單 Teleport 至 body, 屬性 wtlp 為 labelContent)
42
- +// - 獨立使用(VeCgrups/VeCpemis 之「合併…模式」欄): attached=false, 四角圓角
43
- +// - 嵌於本項 chip 之左段(VeGrupBlngUsers/VePemiBlngGrups): attached=true, 只有左側圓角, 右側與名稱段相接
44
- +// - 尺寸: 寬 56 = 最長項 'AND' 於 12px 之墨跡 27 + 左右內距 5×2 + 展開箭頭 14 + 箭頭前間隙 2 + 邊框 1×2 (取整), 固定寬使 OR/AND 切換時不跳動;
45
- +// 高 22 = line-height 20 + 上下邊框 1×2, 落在 ag-grid balham 之 27px 儲存格內不被裁切
46
- +// - 唯讀(editable=false): 沿用 WShellEllipse 之透明度 0.6 與無手指游標, 並不渲染展開箭頭
47
- +// - 清單浮層: minWidth 給整顆寬度使清單不窄於控制項(WPopup 之 autoFitMinWidth 只量觸發文字區, 會比外框窄), placementDistX 使清單左緣對齊外框左緣
48
- +export default {
49
- + components: {
50
- + WTextSelect,
51
- + },
52
- + props: {
53
- + value: {
54
- + type: String,
55
- + default: 'OR',
56
- + },
57
- + editable: {
58
- + type: Boolean,
59
- + default: true,
60
- + },
61
- + highlight: { //true 為本項(醒目色, 與 chip 醒目態同色), false 為一般(白底灰邊)
62
- + type: Boolean,
63
- + default: false,
64
- + },
65
- + attached: { //true 為嵌於 chip 左段(右側無圓角)
66
- + type: Boolean,
67
- + default: false,
68
- + },
69
- + width: {
70
- + type: Number,
71
- + default: 56,
72
- + },
73
- + placementDistX: { //清單浮層錨定於觸發文字, 往左退回內距 5 與邊框 1 使清單左緣對齊控制項外框左緣
74
- + type: Number,
75
- + default: -6,
76
- + },
77
- + labelContent: {
78
- + type: String,
79
- + default: 'modeSelect',
80
- + },
81
- + },
82
- + data: function() {
83
- + return {
84
- + items: ['OR', 'AND'],
85
- + }
86
- + },
87
- + computed: {
88
- +
89
- + useTextColor: function() {
90
- + let vo = this
91
- + return vo.highlight ? '#fff' : '#555'
92
- + },
93
- +
94
- + useIconColor: function() {
95
- + let vo = this
96
- + return vo.highlight ? '#fff' : '#777'
97
- + },
98
- +
99
- + useBackgroundColor: function() {
100
- + let vo = this
101
- + return vo.highlight ? '#be295a' : '#fff'
102
- + },
103
- +
104
- + useBackgroundColorHover: function() { //同色系加深, 不翻轉
105
- + let vo = this
106
- + return vo.highlight ? '#ac2451' : '#f5f5f5'
107
- + },
108
- +
109
- + useBorderColor: function() {
110
- + let vo = this
111
- + return vo.highlight ? '#ac2451' : '#aaa'
112
- + },
113
- +
114
- + useBorderColorHover: function() {
115
- + let vo = this
116
- + return vo.highlight ? '#9e2149' : '#888'
117
- + },
118
- +
119
- + },
120
- +}
121
- +</script>
122
- +
123
- +<style scoped>
124
- +</style>
@@ -1,116 +0,0 @@
1
- --- /dev/null 2026-09-15 21:52:30.000000000 +0800
2
- +++ "./w-web-perm�\232��\231\204�\207�\226\231/src/components/RelationChip.vue" 2026-09-15 21:52:29.958996500 +0800
3
- @@ -0,0 +1,113 @@
4
- +<template>
5
- + <div
6
- + :style="`display:inline-flex; align-items:stretch; height:22px; line-height:20px; font-size:12px; vertical-align:middle; white-space:nowrap;`"
7
- + :title="name"
8
- + >
9
- +
10
- + <!-- 模式段: 本項且可編輯時為下拉控制項, 其餘為純文字 -->
11
- + <ModeSelectChip
12
- + :value="mode"
13
- + :editable="true"
14
- + :highlight="true"
15
- + :attached="true"
16
- + :labelContent="labelContent"
17
- + @input="(item)=>{$emit('input',item)}"
18
- + v-if="modeEditable"
19
- + ></ModeSelectChip>
20
- + <div
21
- + :style="`box-sizing:border-box; height:22px; padding:0 5px; border-radius:4px 0 0 4px; border:1px solid ${useModeBorderColor}; border-right-color:${useModeBorderRightColor}; background:${useModeBackgroundColor}; color:${useTextColor};`"
22
- + v-else
23
- + >
24
- + {{ mode }}
25
- + </div>
26
- +
27
- + <!-- 名稱段: 超長名稱以省略號截斷, 全名放於 title -->
28
- + <div
29
- + :style="`box-sizing:border-box; height:22px; padding:0 5px; border-radius:0 4px 4px 0; border:1px solid ${useNameBorderColor}; border-left:none; background:${useNameBackgroundColor}; color:${useTextColor}; max-width:${nameMaxWidth}px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;`"
30
- + >
31
- + {{ name }}
32
- + </div>
33
- +
34
- + </div>
35
- +</template>
36
- +
37
- +<script>
38
- +import ModeSelectChip from './ModeSelectChip.vue'
39
- +
40
- +
41
- +//單顆關聯 chip: [模式段 | 名稱段], 整顆高 22px、方角 4px、字 12px
42
- +// - isCurrent=true 為本項(該列與對話框當前對象之關係), 醒目色; 其餘為白底灰邊之一般色
43
- +// - editable=true 且 isCurrent=true 時, 模式段即 ModeSelectChip(chip 即下拉); 其他 chip 之模式段只顯示不可改
44
- +export default {
45
- + components: {
46
- + ModeSelectChip,
47
- + },
48
- + props: {
49
- + name: {
50
- + type: String,
51
- + default: '',
52
- + },
53
- + mode: {
54
- + type: String,
55
- + default: 'OR',
56
- + },
57
- + isCurrent: {
58
- + type: Boolean,
59
- + default: false,
60
- + },
61
- + editable: {
62
- + type: Boolean,
63
- + default: false,
64
- + },
65
- + nameMaxWidth: {
66
- + type: Number,
67
- + default: 240,
68
- + },
69
- + labelContent: {
70
- + type: String,
71
- + default: 'modeSelect',
72
- + },
73
- + },
74
- + computed: {
75
- +
76
- + modeEditable: function() {
77
- + let vo = this
78
- + return vo.editable && vo.isCurrent
79
- + },
80
- +
81
- + useTextColor: function() {
82
- + let vo = this
83
- + return vo.isCurrent ? '#fff' : '#555'
84
- + },
85
- +
86
- + useModeBackgroundColor: function() {
87
- + let vo = this
88
- + return vo.isCurrent ? '#be295a' : '#fff'
89
- + },
90
- +
91
- + useModeBorderColor: function() {
92
- + let vo = this
93
- + return vo.isCurrent ? '#ac2451' : '#aaa'
94
- + },
95
- +
96
- + useModeBorderRightColor: function() {
97
- + let vo = this
98
- + return vo.isCurrent ? '#9e2149' : '#aaa'
99
- + },
100
- +
101
- + useNameBackgroundColor: function() {
102
- + let vo = this
103
- + return vo.isCurrent ? '#d22f64' : '#eee'
104
- + },
105
- +
106
- + useNameBorderColor: function() {
107
- + let vo = this
108
- + return vo.isCurrent ? '#ac2451' : '#aaa'
109
- + },
110
- +
111
- + },
112
- +}
113
- +</script>
114
- +
115
- +<style scoped>
116
- +</style>