w-web-perm 1.0.83 → 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 (86) hide show
  1. package/dist/css/{chunk-vendors.034f7a87.css → chunk-vendors.18034562.css} +1 -1
  2. package/dist/index.tmp +1 -1
  3. package/dist/js/app-legacy.aaaa3681.js +1 -0
  4. package/dist/js/app.aaaa3681.js +1 -0
  5. package/dist/js/{chunk-vendors-legacy.d0596078.js → chunk-vendors-legacy.7b6ae0b0.js} +3 -3
  6. package/dist/js/{chunk-vendors.d0596078.js → chunk-vendors.7b6ae0b0.js} +3 -3
  7. package/dist/w-web-perm.umd.js +2 -2
  8. package/dist/w-web-perm.umd.js.map +1 -1
  9. package/docs/WWebPerm.html +1 -1
  10. package/docs/global.html +1 -1
  11. package/docs/index.html +1 -1
  12. package/docs/server_WWebPerm.mjs.html +1 -1
  13. package/docs/server_procCore.mjs.html +1 -1
  14. package/docs/src_fetchJson.mjs.html +1 -1
  15. package/package.json +2 -2
  16. package/server/procLang.mjs +12 -4
  17. package/src/components/LayoutContentGrups.vue +6 -6
  18. package/src/components/LayoutContentPemis.vue +6 -6
  19. package/src/components/LayoutContentTargets.vue +2 -2
  20. package/src/components/LayoutContentUsers.vue +5 -3
  21. package/src/components/ModeSelectChip.vue +182 -0
  22. package/src/components/RelationChip.vue +114 -0
  23. package/src/components/RelationChips.vue +375 -0
  24. package/src/components/VeCgrups.vue +23 -20
  25. package/src/components/VeCpemis.vue +21 -20
  26. package/src/components/VeCrules.vue +8 -1
  27. package/src/components/VeGrupBlngUsers.vue +40 -51
  28. package/src/components/VePemiBlngGrups.vue +27 -41
  29. package/tableTags-web-perm.json +1 -1
  30. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/README.md +58 -0
  31. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/server_procLang.mjs.diff +31 -0
  32. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_App.vue.diff +19 -0
  33. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_LayoutContentGrups.vue.diff +40 -0
  34. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_LayoutContentPemis.vue.diff +40 -0
  35. 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
  36. 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
  37. 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
  38. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCgrups.vue.diff +76 -0
  39. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCpemis.vue.diff +76 -0
  40. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeCrules.vue.diff +14 -0
  41. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VeGrupBlngUsers.vue.diff +121 -0
  42. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/diff/src_components_VePemiBlngGrups.vue.diff +121 -0
  43. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/server/procLang.mjs +1049 -0
  44. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/App.vue +204 -0
  45. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/LayoutContentGrups.vue +1260 -0
  46. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/LayoutContentPemis.vue +1262 -0
  47. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/ModeSelectChip.vue +121 -0
  48. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/RelationChip.vue +113 -0
  49. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/RelationChips.vue +149 -0
  50. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCgrups.vue +943 -0
  51. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCpemis.vue +943 -0
  52. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeCrules.vue +848 -0
  53. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VeGrupBlngUsers.vue +1157 -0
  54. package/w-web-perm/351/232/250/351/231/204/350/263/207/346/226/231/src/components/VePemiBlngGrups.vue +1157 -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/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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  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/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
  74. 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
  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/build.log +93 -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/lint.log +23 -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_probe.mjs +321 -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_perm_zoom.mjs +173 -0
  79. 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
  80. package//345/273/272/350/255/260w-aggrid-vue/350/252/277/346/225/264.md +193 -0
  81. package//345/273/272/350/255/260w-component-vue/350/210/207wsemi/350/252/277/346/225/264.md +76 -0
  82. package//345/273/272/350/255/260w-web-perm/350/252/277/346/225/264.md +244 -0
  83. 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
  84. package/dist/index.html +0 -4
  85. package/dist/js/app-legacy.04fa72c9.js +0 -1
  86. package/dist/js/app.04fa72c9.js +0 -1
@@ -0,0 +1,124 @@
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>
@@ -0,0 +1,116 @@
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>
@@ -0,0 +1,152 @@
1
+ --- /dev/null 2026-09-15 21:52:30.000000000 +0800
2
+ +++ "./w-web-perm�\232��\231\204�\207�\226\231/src/components/RelationChips.vue" 2026-09-15 21:52:29.978398800 +0800
3
+ @@ -0,0 +1,149 @@
4
+ +<template>
5
+ + <span style="white-space:nowrap;">
6
+ +
7
+ + <!-- 展開全部: 固定在最左, 不隨 chip 溢出被裁; 點擊以浮層列出全部 chip(可換行、可捲動) -->
8
+ + <!-- WPopup(WTooltip) 之 displayType: 'block' 為 inline-block、'line' 為 block(命名與 CSS 相反), 此處須為行內元素以與其後之 chip 同列 -->
9
+ + <template v-if="n > 0">
10
+ + <WPopup
11
+ + style="vertical-align:middle;"
12
+ + :displayType="'block'"
13
+ + :isolated="true"
14
+ + :placement="'bottom-start'"
15
+ + :paddingStyle="{v:8,h:10}"
16
+ + :minWidth="320"
17
+ + :maxWidth="560"
18
+ + :labelContent="labelContentAll"
19
+ + >
20
+ + <template v-slot:trigger>
21
+ + <div
22
+ + :style="`display:inline-flex; align-items:center; box-sizing:border-box; height:22px; margin-right:4px; padding:0 6px; border:1px solid ${hoverAll?'#888':'#aaa'}; border-radius:4px; background:${hoverAll?'#f5f5f5':'#fff'}; color:${hoverAll?'#333':'#555'}; font-size:12px; line-height:20px; vertical-align:middle; cursor:pointer; user-select:none; transition:all 0.3s;`"
23
+ + :title="tooltipAll"
24
+ + @mouseenter="hoverAll=true"
25
+ + @mouseleave="hoverAll=false"
26
+ + >
27
+ + <WIcon
28
+ + :icon="mdiDotsHorizontal"
29
+ + :size="14"
30
+ + :color="hoverAll?'#333':'#555'"
31
+ + :colorHover="'#333'"
32
+ + ></WIcon>
33
+ + <span style="padding-left:3px;">{{ n }}</span>
34
+ + </div>
35
+ + </template>
36
+ + <template v-slot:content>
37
+ + <div style="font-size:12px; color:#666; padding-bottom:6px;">
38
+ + {{ usePopupTitle }}
39
+ + </div>
40
+ + <!-- 最大高 50vh: 於 900px 高之視窗自列位往下展開仍留得住底邊, 超過即於浮層內捲動 -->
41
+ + <div style="display:flex; flex-wrap:wrap; gap:4px 6px; max-height:50vh; max-width:540px; overflow:auto;">
42
+ + <RelationChip
43
+ + v-for="(item, kitem) in itemsSorted"
44
+ + :key="`p-${kitem}`"
45
+ + :name="item.name"
46
+ + :mode="item.mode"
47
+ + :isCurrent="item.enable==='y'"
48
+ + :editable="false"
49
+ + :nameMaxWidth="600"
50
+ + ></RelationChip>
51
+ + </div>
52
+ + </template>
53
+ + </WPopup>
54
+ + </template>
55
+ +
56
+ + <!-- 儲存格內之 chip: 本項永遠第 1 顆; 相鄰間距 4px; 溢出由儲存格裁切 -->
57
+ + <RelationChip
58
+ + v-for="(item, kitem) in itemsSorted"
59
+ + :key="`c-${kitem}`"
60
+ + :style="`margin-right:4px;`"
61
+ + :name="item.name"
62
+ + :mode="item.mode"
63
+ + :isCurrent="item.enable==='y'"
64
+ + :editable="editable"
65
+ + :labelContent="labelContent"
66
+ + @input="(item)=>{$emit('input',item)}"
67
+ + ></RelationChip>
68
+ +
69
+ + </span>
70
+ +</template>
71
+ +
72
+ +<script>
73
+ +import { mdiDotsHorizontal } from '@mdi/js/mdi.js'
74
+ +import get from 'lodash-es/get.js'
75
+ +import size from 'lodash-es/size.js'
76
+ +import filter from 'lodash-es/filter.js'
77
+ +import WIcon from 'w-component-vue/src/components/WIcon.vue'
78
+ +import WPopup from 'w-component-vue/src/components/WPopup.vue'
79
+ +import RelationChip from './RelationChip.vue'
80
+ +
81
+ +
82
+ +//關聯 chip 列表(供 VeGrupBlngUsers 之「所屬權限群組名稱」欄與 VePemiBlngGrups 之「所屬權限名稱」欄)
83
+ +// - items: genItems 產生之 grups/pemis 陣列, 各項含 name、mode、enable('y' 為本項)
84
+ +// - 顯示順序: enable='y'(本項)永遠第 1 顆, 其餘依原順序; 只改顯示, 不改儲存之 cgrups/cpemis 字串(權限合併結果與順序無關, 見 mShare.mjs 之 mergeRules)
85
+ +// - 本項 chip 之模式段即下拉(RelationChip 之 ModeSelectChip), 變更以 input 事件回傳新模式, 由呼叫端沿用既有 showXxxToggleItemModeByName 處理
86
+ +// - 「展開全部」鈕固定於最左, 浮層(WPopup, Teleport 至 body, 與 WDialog 共用 z-index 池故可疊於對話框上)內以 flex-wrap 列出全部 chip
87
+ +export default {
88
+ + components: {
89
+ + WIcon,
90
+ + WPopup,
91
+ + RelationChip,
92
+ + },
93
+ + props: {
94
+ + items: {
95
+ + type: Array,
96
+ + default: () => [],
97
+ + },
98
+ + editable: {
99
+ + type: Boolean,
100
+ + default: false,
101
+ + },
102
+ + popupTitle: { //浮層標題所用之欄名(如「所屬權限名稱」), 與數量合成 chipsPopupTitle
103
+ + type: String,
104
+ + default: '',
105
+ + },
106
+ + tooltipAll: {
107
+ + type: String,
108
+ + default: '',
109
+ + },
110
+ + labelContent: { //本項 chip 之模式下拉浮層之 wtlp 屬性值
111
+ + type: String,
112
+ + default: 'modeSelect',
113
+ + },
114
+ + labelContentAll: { //展開全部之浮層之 wtlp 屬性值
115
+ + type: String,
116
+ + default: 'relationChipsAll',
117
+ + },
118
+ + },
119
+ + data: function() {
120
+ + return {
121
+ + mdiDotsHorizontal,
122
+ + hoverAll: false,
123
+ + }
124
+ + },
125
+ + computed: {
126
+ +
127
+ + n: function() {
128
+ + let vo = this
129
+ + return size(vo.items)
130
+ + },
131
+ +
132
+ + itemsSorted: function() {
133
+ + let vo = this
134
+ + let a = filter(vo.items, (v) => get(v, 'enable', '') === 'y')
135
+ + let b = filter(vo.items, (v) => get(v, 'enable', '') !== 'y')
136
+ + return [...a, ...b]
137
+ + },
138
+ +
139
+ + usePopupTitle: function() {
140
+ + let vo = this
141
+ + let t = vo.$t('chipsPopupTitle')
142
+ + t = t.replace('{title}', vo.popupTitle)
143
+ + t = t.replace('{n}', vo.n)
144
+ + return t
145
+ + },
146
+ +
147
+ + },
148
+ +}
149
+ +</script>
150
+ +
151
+ +<style scoped>
152
+ +</style>
@@ -0,0 +1,76 @@
1
+ diff --git a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/VeCgrups.vue "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/VeCgrups.vue"
2
+ index b51b65d..0408bc8 100644
3
+ --- a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/VeCgrups.vue
4
+ +++ "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/VeCgrups.vue"
5
+ @@ -128,19 +128,13 @@
6
+ >
7
+ <template v-slot:cell-render="props">
8
+ <span v-if="props.key==='name'">{{ props.value }}</span>
9
+ - <WTextSelect
10
+ + <ModeSelectChip
11
+ v-else-if="props.key==='mode'"
12
+ - :style="`width:${modeSelectWidth}px;`"
13
+ - :items="modeItems"
14
+ :value="props.row.mode"
15
+ - :editable="isEditable"
16
+ - :paddingStyle="{v:0,h:10}"
17
+ - :shadow="false"
18
+ - :itemPaddingStyle="{v:8,h:10}"
19
+ - :placementDistX="-10"
20
+ + :editable="isEditable && props.row.enable === 'y'"
21
+ :labelContent="'modeSelect'"
22
+ @input="(item)=>{showVeCgrupsToggleItemModeByName(props.row.name, item)}"
23
+ - ></WTextSelect>
24
+ + ></ModeSelectChip>
25
+ <input v-else-if="props.key==='enable'" type="checkbox" :checked="props.value === 'y'" @click="showVeCgrupsToggleItemEnableByName(props.row.name)" :disabled="!isEditable" />
26
+ <span v-else>{{ props.value }}</span>
27
+ </template>
28
+ @@ -180,7 +174,7 @@ import isestr from 'wsemi/src/isestr.mjs'
29
+ import WDialog from 'w-component-vue/src/components/WDialog.vue'
30
+ import WButtonCircle from 'w-component-vue/src/components/WButtonCircle.vue'
31
+ import WAggridVue from 'w-aggrid-vue/src/components/WAggridVue.vue'
32
+ -import WTextSelect from 'w-component-vue/src/components/WTextSelect.vue'
33
+ +import ModeSelectChip from './ModeSelectChip.vue'
34
+
35
+
36
+ export default {
37
+ @@ -188,7 +182,7 @@ export default {
38
+ WDialog,
39
+ WButtonCircle,
40
+ WAggridVue,
41
+ - WTextSelect,
42
+ + ModeSelectChip,
43
+ },
44
+ props: {
45
+ },
46
+ @@ -217,10 +211,6 @@ export default {
47
+ isEditable: false,
48
+ isModified: false,
49
+
50
+ - //mode 欄之自製下拉(WTextSelect, 取代原生 select 以免彈出清單之 highlight 色由 OS 決定)
51
+ - modeItems: ['OR', 'AND'],
52
+ - modeSelectWidth: 72, //= 最長項 'AND' 文字實寬 + 左右內距 10×2 + 展開箭頭 18 + 邊框 1×2, 實測後定值(見 CLAUDE_experience.md)
53
+ -
54
+ user: null,
55
+
56
+ items: [],
57
+ @@ -410,7 +400,7 @@ export default {
58
+ 'enable': false,
59
+ },
60
+ kpHeadWidth: {
61
+ - 'mode': 100,
62
+ + 'mode': 90, //ModeSelectChip 寬 56 + 儲存格內距 11×2 = 78, 留餘裕
63
+ 'enable': 100,
64
+ },
65
+ // kpRowDrag: {
66
+ @@ -427,6 +417,10 @@ export default {
67
+ kpHeadCheckBox: {
68
+ 'name': true,
69
+ },
70
+ + kpHeadFocusHighlight: { //儲存格內已有自己的控制項(模式下拉、勾選框), 不再疊儲存格焦點框
71
+ + 'mode': false,
72
+ + 'enable': false,
73
+ + },
74
+ rowsChange: (rs) => {
75
+ // console.log('rowsChange', rs)
76
+ // console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
@@ -0,0 +1,76 @@
1
+ diff --git a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/VeCpemis.vue "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/VeCpemis.vue"
2
+ index 7abe87e..8aac5db 100644
3
+ --- a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/VeCpemis.vue
4
+ +++ "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/VeCpemis.vue"
5
+ @@ -128,19 +128,13 @@
6
+ >
7
+ <template v-slot:cell-render="props">
8
+ <span v-if="props.key==='name'">{{ props.value }}</span>
9
+ - <WTextSelect
10
+ + <ModeSelectChip
11
+ v-else-if="props.key==='mode'"
12
+ - :style="`width:${modeSelectWidth}px;`"
13
+ - :items="modeItems"
14
+ :value="props.row.mode"
15
+ - :editable="isEditable"
16
+ - :paddingStyle="{v:0,h:10}"
17
+ - :shadow="false"
18
+ - :itemPaddingStyle="{v:8,h:10}"
19
+ - :placementDistX="-10"
20
+ + :editable="isEditable && props.row.enable === 'y'"
21
+ :labelContent="'modeSelect'"
22
+ @input="(item)=>{showVeCpemisToggleItemModeByName(props.row.name, item)}"
23
+ - ></WTextSelect>
24
+ + ></ModeSelectChip>
25
+ <input v-else-if="props.key==='enable'" type="checkbox" :checked="props.value === 'y'" @click="showVeCpemisToggleItemEnableByName(props.row.name)" :disabled="!isEditable" />
26
+ <span v-else>{{ props.value }}</span>
27
+ </template>
28
+ @@ -180,7 +174,7 @@ import isestr from 'wsemi/src/isestr.mjs'
29
+ import WDialog from 'w-component-vue/src/components/WDialog.vue'
30
+ import WButtonCircle from 'w-component-vue/src/components/WButtonCircle.vue'
31
+ import WAggridVue from 'w-aggrid-vue/src/components/WAggridVue.vue'
32
+ -import WTextSelect from 'w-component-vue/src/components/WTextSelect.vue'
33
+ +import ModeSelectChip from './ModeSelectChip.vue'
34
+
35
+
36
+ export default {
37
+ @@ -188,7 +182,7 @@ export default {
38
+ WDialog,
39
+ WButtonCircle,
40
+ WAggridVue,
41
+ - WTextSelect,
42
+ + ModeSelectChip,
43
+ },
44
+ props: {
45
+ },
46
+ @@ -217,10 +211,6 @@ export default {
47
+ isEditable: false,
48
+ isModified: false,
49
+
50
+ - //mode 欄之自製下拉(WTextSelect, 取代原生 select 以免彈出清單之 highlight 色由 OS 決定)
51
+ - modeItems: ['OR', 'AND'],
52
+ - modeSelectWidth: 72, //= 最長項 'AND' 文字實寬 + 左右內距 10×2 + 展開箭頭 18 + 邊框 1×2, 實測後定值(見 CLAUDE_experience.md)
53
+ -
54
+ grup: null,
55
+
56
+ items: [],
57
+ @@ -410,7 +400,7 @@ export default {
58
+ 'enable': false,
59
+ },
60
+ kpHeadWidth: {
61
+ - 'mode': 100,
62
+ + 'mode': 90, //ModeSelectChip 寬 56 + 儲存格內距 11×2 = 78, 留餘裕
63
+ 'enable': 100,
64
+ },
65
+ // kpRowDrag: {
66
+ @@ -427,6 +417,10 @@ export default {
67
+ kpHeadCheckBox: {
68
+ 'name': true,
69
+ },
70
+ + kpHeadFocusHighlight: { //儲存格內已有自己的控制項(模式下拉、勾選框), 不再疊儲存格焦點框
71
+ + 'mode': false,
72
+ + 'enable': false,
73
+ + },
74
+ rowsChange: (rs) => {
75
+ // console.log('rowsChange', rs)
76
+ // console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
@@ -0,0 +1,14 @@
1
+ diff --git a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/VeCrules.vue "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/VeCrules.vue"
2
+ index a456c45..deb9b64 100644
3
+ --- a/../rddmanager_2_perm/node_modules/w-web-perm/src/components/VeCrules.vue
4
+ +++ "b/./w-web-perm\351\232\250\351\231\204\350\263\207\346\226\231/src/components/VeCrules.vue"
5
+ @@ -402,6 +402,9 @@ export default {
6
+ kpHeadCheckBox: {
7
+ 'id': true,
8
+ },
9
+ + kpHeadFocusHighlight: { //儲存格內已有自己的控制項(勾選框), 不再疊儲存格焦點框, 與其餘關聯對話框一致
10
+ + 'enable': false,
11
+ + },
12
+ rowsChange: (rs) => {
13
+ // console.log('rowsChange', rs)
14
+ // console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))