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
@@ -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 Wed Sep 16 2026 15:00:43 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 11:38:22 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 Wed Sep 16 2026 15:00:43 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 11:38:22 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 Wed Sep 16 2026 15:00:43 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 11:38:22 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 Wed Sep 16 2026 15:00:43 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 11:38:22 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 Wed Sep 16 2026 15:00:43 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 11:38:22 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 Wed Sep 16 2026 15:00:43 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 11:38:22 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,10 +1,10 @@
1
1
  {
2
2
  "name": "w-web-perm",
3
- "version": "1.0.84",
3
+ "version": "1.0.85",
4
4
  "main": "dist/w-web-perm.umd.js",
5
5
  "dependencies": {
6
6
  "json5": "^2.2.3",
7
- "w-aggrid-vue": "^2.0.87",
7
+ "w-aggrid-vue": "^2.0.88",
8
8
  "w-component-vue": "^2.5.15",
9
9
  "w-data-collector": "^1.0.37",
10
10
  "w-echarts-vue": "^1.0.11",
@@ -262,9 +262,9 @@ let kpLang = {
262
262
  eng: `Use users`,
263
263
  cht: `管控所屬使用者`,
264
264
  },
265
- belongGrups: {
265
+ belongGrups: { //與 belongUsers(管控所屬使用者)同類之反向參照欄, 中文補「管控」以對稱(2026-09-16 業主指正)
266
266
  eng: `Use groups`,
267
- cht: `所屬權限群組`,
267
+ cht: `管控所屬權限群組`,
268
268
  },
269
269
  //目前無引用,保留供日後使用(見 spec/設計要點與取捨.md ADR-014)
270
270
  // belongPemis: {
@@ -279,6 +279,14 @@ let kpLang = {
279
279
  eng: `Use permissions`,
280
280
  cht: `所屬權限名稱`,
281
281
  },
282
+ chipsShowAll: { //關聯 chip 列表(RelationChips)之「展開全部」鈕提示
283
+ eng: `Show all`,
284
+ cht: `展開全部`,
285
+ },
286
+ chipsPopupTitle: { //關聯 chip 列表之展開浮層標題, {title} 為欄名(belongGrupsNames/belongPemisNames), {n} 為數量
287
+ eng: `{title} ({n} in total)`,
288
+ cht: `{title}:共 {n} 項`,
289
+ },
282
290
 
283
291
  isAdmin: {
284
292
  eng: `Administrator`,
@@ -507,8 +515,8 @@ let kpLang = {
507
515
  eng: `Permission groups`,
508
516
  cht: `展示所屬權限群組`,
509
517
  },
510
- pemiBlngRnderNoGrup: {
511
- eng: `No users`,
518
+ pemiBlngRnderNoGrup: { //權限頁 belongGrups 欄之空狀態; eng 原誤植為 `No users`(與本欄語意不符, 2026-09-16 雙獨立審計查出), 隨 A3 同欄改字一併訂正
519
+ eng: `No permission groups`,
512
520
  cht: `無所屬權限群組`,
513
521
  },
514
522
  pemiBlngRnderGrups: {
@@ -311,8 +311,8 @@ export default {
311
311
  'name',
312
312
  'description',
313
313
  'from',
314
- 'belongUsers',
315
314
  'cpemis',
315
+ 'belongUsers',
316
316
  'userId',
317
317
  'timeCreate',
318
318
  'userIdUpdate',
@@ -322,8 +322,8 @@ export default {
322
322
  'name',
323
323
  'description',
324
324
  'from',
325
- 'belongUsers',
326
325
  'cpemis',
326
+ 'belongUsers',
327
327
  'userId',
328
328
  'timeCreate',
329
329
  'userIdUpdate',
@@ -333,8 +333,8 @@ export default {
333
333
  'name',
334
334
  'description',
335
335
  // 'from',
336
- 'belongUsers',
337
336
  'cpemis',
337
+ 'belongUsers',
338
338
  // 'userId',
339
339
  // 'timeCreate',
340
340
  // 'userIdUpdate',
@@ -799,8 +799,8 @@ export default {
799
799
  let cmp = get(vo, '$refs.rftable')
800
800
  // console.log('cmp', cmp)
801
801
 
802
- //showKeys
803
- cmp.showKeys(vo.tabKeysShow)
802
+ //showKeys, applyOrder:false 僅切換顯示與隱藏、維持目前欄序; 理由同 LayoutContentUsers 該處註解
803
+ cmp.showKeys(vo.tabKeysShow, { applyOrder: false })
804
804
  // console.log('tabKeysShow', vo.tabKeysShow)
805
805
 
806
806
  },
@@ -311,8 +311,8 @@ export default {
311
311
  'name',
312
312
  'description',
313
313
  'from',
314
- 'belongGrups',
315
314
  'crules',
315
+ 'belongGrups',
316
316
  'userId',
317
317
  'timeCreate',
318
318
  'userIdUpdate',
@@ -322,8 +322,8 @@ export default {
322
322
  'name',
323
323
  'description',
324
324
  'from',
325
- 'belongGrups',
326
325
  'crules',
326
+ 'belongGrups',
327
327
  'userId',
328
328
  'timeCreate',
329
329
  'userIdUpdate',
@@ -333,8 +333,8 @@ export default {
333
333
  'name',
334
334
  'description',
335
335
  // 'from',
336
- 'belongGrups',
337
336
  'crules',
337
+ 'belongGrups',
338
338
  // 'userId',
339
339
  // 'timeCreate',
340
340
  // 'userIdUpdate',
@@ -799,8 +799,8 @@ export default {
799
799
  let cmp = get(vo, '$refs.rftable')
800
800
  // console.log('cmp', cmp)
801
801
 
802
- //showKeys
803
- cmp.showKeys(vo.tabKeysShow)
802
+ //showKeys, applyOrder:false 僅切換顯示與隱藏、維持目前欄序; 理由同 LayoutContentUsers 該處註解
803
+ cmp.showKeys(vo.tabKeysShow, { applyOrder: false })
804
804
  // console.log('tabKeysShow', vo.tabKeysShow)
805
805
 
806
806
  },
@@ -678,8 +678,8 @@ export default {
678
678
  let cmp = get(vo, '$refs.rftable')
679
679
  // console.log('cmp', cmp)
680
680
 
681
- //showKeys
682
- cmp.showKeys(vo.tabKeysShow)
681
+ //showKeys, applyOrder:false 僅切換顯示與隱藏、維持目前欄序; 理由同 LayoutContentUsers 該處註解
682
+ cmp.showKeys(vo.tabKeysShow, { applyOrder: false })
683
683
  // console.log('tabKeysShow', vo.tabKeysShow)
684
684
 
685
685
  },
@@ -804,8 +804,10 @@ export default {
804
804
  let cmp = get(vo, '$refs.rftable')
805
805
  // console.log('cmp', cmp)
806
806
 
807
- //showKeys
808
- cmp.showKeys(vo.tabKeysShow)
807
+ //showKeys, applyOrder:false 僅切換顯示與隱藏、維持目前欄序(w-aggrid-vue 2.0.88 起提供)
808
+ // why: tabKeysShow 為 WInputCheckbox 之 v-model, 重新勾選之項一律被 push 到陣列尾端(WInputCheckbox.vue:379-381),
809
+ // 若沿用預設 applyOrder:true, 欄序會跟著點擊序走, 使用者隱藏再顯示某欄即跑到最右; 初始欄序由 opt.keys 決定, 本函式只在勾選時呼叫, 故不受影響
810
+ cmp.showKeys(vo.tabKeysShow, { applyOrder: false })
809
811
  // console.log('tabKeysShow', vo.tabKeysShow)
810
812
 
811
813
  },
@@ -0,0 +1,182 @@
1
+ <template>
2
+ <div
3
+ ref="frame"
4
+ :style="useFrameStyle"
5
+ @mouseenter="hovered=true"
6
+ @mouseleave="hovered=false"
7
+ @click="clickFrame"
8
+ >
9
+ <WTextSuggestCore
10
+ ref="core"
11
+ style="width:100%;"
12
+ :mode="'select'"
13
+ :items="items"
14
+ :value="value"
15
+ :textFontSize="'12px'"
16
+ :textColor="useTextColor"
17
+ :itemTextFontSize="'12px'"
18
+ :itemPaddingStyle="{v:6,h:6}"
19
+ :expansionIcon="editable?undefined:''"
20
+ :expansionIconSize="14"
21
+ :expansionIconColor="useIconColor"
22
+ :minWidth="width"
23
+ :placementDistX="placementDistX"
24
+ :labelContent="labelContent"
25
+ :editable="editable"
26
+ :showPanel="opened"
27
+ @update:showPanel="(v)=>{opened=v}"
28
+ @input="(item)=>{$emit('input',item)}"
29
+ ></WTextSuggestCore>
30
+ </div>
31
+ </template>
32
+
33
+ <script>
34
+ import WTextSuggestCore from 'w-component-vue/src/components/WTextSuggestCore.vue'
35
+
36
+
37
+ //合併模式(OR/AND)控制項: 自繪單層外框 + WTextSuggestCore(觸發文字、隨開合旋轉之箭頭、Teleport 至 body 之選項清單, 清單屬性 wtlp 為 labelContent)
38
+ // - 為何不再用 WTextSelect: WTextSelect 之外框由 WShellEllipse 以「單一圓角值」繪製 1px 邊框, 無法只圓左側兩角;
39
+ // 舊版改以外層 border-radius + overflow:hidden 裁切一個方角邊框, 實測四角往內 2px 皆為底色(缺角)且下邊框被整條裁掉
40
+ // (2026-09-17, tmp/probe-redesign-before.mjs)。現改由本元件之單一 div 直接畫邊框與圓角, 不再有任何裁切層。
41
+ // - 獨立使用(VeCgrups/VeCpemis 之「合併…模式」欄): attached=false, 四角圓角 4px
42
+ // - 嵌於本項 chip 之左段(RelationChip): attached=true, 只圓左側兩角, 右邊框為與名稱段之分隔色
43
+ // - 尺寸: 寬 56 = 最長項 'AND' 於 12px 之墨跡 27 + 左內距 5 + 箭頭 14 + 右內距 3 + 邊框 1×2 + 餘裕 5 (固定寬使 OR/AND 切換時不跳動);
44
+ // 高 22 = line-height 20 + 上下邊框 1×2, 於 27px 儲存格內須由呼叫端以 flex 置中(上下各 2.5)
45
+ // - 狀態: hover 或清單開啟中 → 加深色; 唯讀(editable=false) → 整體透明度 0.6、無箭頭、無手指游標、點擊不展開(唯讀時箭頭是空承諾)
46
+ // - 可點範圍: 內核之點擊觸發只綁在文字區(WTooltip 之 divTrigger), 外框內距與邊框原為死區; 有手指游標就須整顆可點(全域 §10.6-4),
47
+ // 故外框 click 若不在觸發區內即自行開啟清單
48
+ // - 清單對齊(全域 §10.6-6): 清單左緣錨定觸發文字左緣(外框 + 邊框 1 + 左內距 5), placementDistX=-6 使清單左緣退回外框左緣;
49
+ // 項目文字左緣由 itemPaddingStyle.h=6(邊框 1 + 內距 5)決定, 與觸發區文字左緣貼齊
50
+ export default {
51
+ components: {
52
+ WTextSuggestCore,
53
+ },
54
+ props: {
55
+ value: {
56
+ type: String,
57
+ default: 'OR',
58
+ },
59
+ editable: {
60
+ type: Boolean,
61
+ default: true,
62
+ },
63
+ highlight: { //true 為本項(醒目色, 與 chip 醒目態同色), false 為一般(白底灰邊)
64
+ type: Boolean,
65
+ default: false,
66
+ },
67
+ attached: { //true 為嵌於 chip 左段(只圓左側兩角)
68
+ type: Boolean,
69
+ default: false,
70
+ },
71
+ width: {
72
+ type: Number,
73
+ default: 56,
74
+ },
75
+ placementDistX: { //清單浮層錨定於觸發文字, 往左退回內距 5 與邊框 1 使清單左緣對齊控制項外框左緣
76
+ type: Number,
77
+ default: -6,
78
+ },
79
+ labelContent: {
80
+ type: String,
81
+ default: 'modeSelect',
82
+ },
83
+ },
84
+ data: function() {
85
+ return {
86
+ items: ['OR', 'AND'],
87
+ hovered: false,
88
+ opened: false,
89
+ }
90
+ },
91
+ computed: {
92
+
93
+ active: function() {
94
+ let vo = this
95
+ return vo.editable && (vo.hovered || vo.opened)
96
+ },
97
+
98
+ useTextColor: function() {
99
+ let vo = this
100
+ return vo.highlight ? '#fff' : '#555'
101
+ },
102
+
103
+ useIconColor: function() {
104
+ let vo = this
105
+ return vo.highlight ? '#fff' : '#777'
106
+ },
107
+
108
+ useBackgroundColor: function() {
109
+ let vo = this
110
+ if (vo.highlight) {
111
+ return vo.active ? '#ac2451' : '#be295a' //同色系加深, 不翻轉
112
+ }
113
+ return vo.active ? '#f5f5f5' : '#fff'
114
+ },
115
+
116
+ useBorderColor: function() {
117
+ let vo = this
118
+ if (vo.highlight) {
119
+ return vo.active ? '#9e2149' : '#ac2451'
120
+ }
121
+ return vo.active ? '#888' : '#aaa'
122
+ },
123
+
124
+ useBorderRightColor: function() { //嵌於 chip 時右邊框為與名稱段之分隔線, 與 RelationChip 唯讀模式段之分隔色一致
125
+ let vo = this
126
+ if (vo.attached && vo.highlight) {
127
+ return '#9e2149'
128
+ }
129
+ return vo.useBorderColor
130
+ },
131
+
132
+ useFrameStyle: function() {
133
+ let vo = this
134
+ return [
135
+ 'display:inline-flex;',
136
+ 'align-items:center;',
137
+ 'box-sizing:border-box;',
138
+ `width:${vo.width}px;`,
139
+ 'height:22px;',
140
+ 'line-height:20px;',
141
+ 'padding:0 3px 0 5px;',
142
+ `border:1px solid ${vo.useBorderColor};`,
143
+ `border-right-color:${vo.useBorderRightColor};`,
144
+ `border-radius:${vo.attached ? '4px 0 0 4px' : '4px'};`,
145
+ `background:${vo.useBackgroundColor};`,
146
+ `opacity:${vo.editable ? 1 : 0.6};`,
147
+ `cursor:${vo.editable ? 'pointer' : 'default'};`,
148
+ 'transition:background-color 0.3s, border-color 0.3s;',
149
+ 'vertical-align:middle;',
150
+ 'white-space:nowrap;',
151
+ ].join(' ')
152
+ },
153
+
154
+ },
155
+ methods: {
156
+
157
+ clickFrame: function(e) {
158
+ let vo = this
159
+
160
+ //check
161
+ if (!vo.editable || vo.opened) {
162
+ return
163
+ }
164
+
165
+ //點在觸發區(文字與箭頭)內者由內核自行開啟, 此處只補外框內距與邊框之死區
166
+ let core = vo.$refs.core
167
+ let elCore = core && core.$el
168
+ if (elCore && elCore.contains(e.target)) {
169
+ return
170
+ }
171
+
172
+ //open
173
+ vo.opened = true
174
+
175
+ },
176
+
177
+ },
178
+ }
179
+ </script>
180
+
181
+ <style scoped>
182
+ </style>
@@ -0,0 +1,114 @@
1
+ <template>
2
+ <div
3
+ :style="`display:inline-flex; align-items:stretch; height:22px; min-width:0; max-width:100%; line-height:20px; font-size:12px; vertical-align:middle; white-space:nowrap;`"
4
+ :title="name"
5
+ >
6
+
7
+ <!-- 模式段: 本項且可編輯時為下拉控制項, 其餘為純文字 -->
8
+ <ModeSelectChip
9
+ style="flex:0 0 auto;"
10
+ :value="mode"
11
+ :editable="true"
12
+ :highlight="true"
13
+ :attached="true"
14
+ :labelContent="labelContent"
15
+ @input="(item)=>{$emit('input',item)}"
16
+ v-if="modeEditable"
17
+ ></ModeSelectChip>
18
+ <div
19
+ :style="`flex:0 0 auto; 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};`"
20
+ v-else
21
+ >
22
+ {{ mode }}
23
+ </div>
24
+
25
+ <!-- 名稱段: 超長名稱以省略號截斷, 全名放於 title; 空間不足時由名稱段收縮讓位(模式段永遠完整, 本項之下拉永遠點得到) -->
26
+ <div
27
+ :style="`flex:0 1 auto; min-width:0; 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;`"
28
+ >
29
+ {{ name }}
30
+ </div>
31
+
32
+ </div>
33
+ </template>
34
+
35
+ <script>
36
+ import ModeSelectChip from './ModeSelectChip.vue'
37
+
38
+
39
+ //單顆關聯 chip: [模式段 | 名稱段], 整顆高 22px、方角 4px、字 12px
40
+ // - isCurrent=true 為本項(該列與對話框當前對象之關係), 醒目色; 其餘為白底灰邊之一般色
41
+ // - editable=true 且 isCurrent=true 時, 模式段即 ModeSelectChip(chip 即下拉); 其他 chip 之模式段只顯示不可改
42
+ export default {
43
+ components: {
44
+ ModeSelectChip,
45
+ },
46
+ props: {
47
+ name: {
48
+ type: String,
49
+ default: '',
50
+ },
51
+ mode: {
52
+ type: String,
53
+ default: 'OR',
54
+ },
55
+ isCurrent: {
56
+ type: Boolean,
57
+ default: false,
58
+ },
59
+ editable: {
60
+ type: Boolean,
61
+ default: false,
62
+ },
63
+ nameMaxWidth: {
64
+ type: Number,
65
+ default: 240,
66
+ },
67
+ labelContent: {
68
+ type: String,
69
+ default: 'modeSelect',
70
+ },
71
+ },
72
+ computed: {
73
+
74
+ modeEditable: function() {
75
+ let vo = this
76
+ return vo.editable && vo.isCurrent
77
+ },
78
+
79
+ useTextColor: function() {
80
+ let vo = this
81
+ return vo.isCurrent ? '#fff' : '#555'
82
+ },
83
+
84
+ useModeBackgroundColor: function() {
85
+ let vo = this
86
+ return vo.isCurrent ? '#be295a' : '#fff'
87
+ },
88
+
89
+ useModeBorderColor: function() {
90
+ let vo = this
91
+ return vo.isCurrent ? '#ac2451' : '#aaa'
92
+ },
93
+
94
+ useModeBorderRightColor: function() {
95
+ let vo = this
96
+ return vo.isCurrent ? '#9e2149' : '#aaa'
97
+ },
98
+
99
+ useNameBackgroundColor: function() {
100
+ let vo = this
101
+ return vo.isCurrent ? '#d22f64' : '#eee'
102
+ },
103
+
104
+ useNameBorderColor: function() {
105
+ let vo = this
106
+ return vo.isCurrent ? '#ac2451' : '#aaa'
107
+ },
108
+
109
+ },
110
+ }
111
+ </script>
112
+
113
+ <style scoped>
114
+ </style>