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,1262 @@
1
+ <template>
2
+ <div
3
+ style="height:100%;"
4
+ v-domresize
5
+ @domresize="resizePanel"
6
+ :changeParams="changeParams"
7
+ >
8
+
9
+ <div
10
+ style="_border-bottom:1px solid #ddd; background:#fff;"
11
+ v-domresize
12
+ @domresize="resizeHead"
13
+ >
14
+
15
+ <!-- 標題區 -->
16
+ <div style="padding:10px 10px 10px 20px;">
17
+ <div :style="`display:flex; align-items:center; padding:${drawer?'5px':'5px 5px 5px 20px'};`">
18
+
19
+ <WIcon
20
+ :icon="mdiStackOverflow"
21
+ :color="'#000'"
22
+ :size="32"
23
+ ></WIcon>
24
+
25
+ <div style="padding-left:12px;">
26
+
27
+ <div style="font-size:1.4rem; color:#000;">
28
+ {{$t('mmPemis')}}
29
+ </div>
30
+
31
+ <div style="padding-top:2px; font-size:0.8rem; color:#666;">
32
+ {{$t('mmPemisMsg')}}
33
+ </div>
34
+
35
+ </div>
36
+
37
+ </div>
38
+ </div>
39
+
40
+ <!-- 功能區 -->
41
+ <div
42
+ data-fmid="pemis-toolbar"
43
+ style="padding:5px; border-top:1px solid #ddd; display:flex; align-items:center;"
44
+ _v-if="showIsEditable || isEditable"
45
+ >
46
+
47
+ <template v-if="showIsEditable">
48
+
49
+ <div style="padding:6px 0px 4px 4px;">
50
+ <WSwitch
51
+ :checkedSwitchCircleColor="'#F68200'"
52
+ :checkedSwitchCircleColorHover="'#FB8C00'"
53
+ :checkedSwitchBarColor="'#FFE0B2'"
54
+ :checkedSwitchBarColorHover="'#FFE6B8'"
55
+ v-model="isEditable"
56
+ :text="$t('modeEdit')"
57
+ ></WSwitch>
58
+ </div>
59
+
60
+ <div style="padding-left:10px;"></div>
61
+
62
+ </template>
63
+
64
+ <template v-if="true">
65
+
66
+ <WPopup
67
+ :isolated="true"
68
+ _show=""
69
+ _hide=""
70
+ >
71
+ <template v-slot:trigger>
72
+ <WButtonCircle
73
+ :paddingStyle="{v:6,h:6}"
74
+ :tooltip="$t('showTabCols')"
75
+ :icon="mdiTableHeadersEye"
76
+ :backgroundColor="'#fff'"
77
+ :backgroundColorHover="'#f2f2f2'"
78
+ _textColor="'#eee'"
79
+ _textColorHover="'#fff'"
80
+ :iconColor="'#444'"
81
+ :iconColorHover="'#222'"
82
+ :shadow="false"
83
+ _click=""
84
+ ></WButtonCircle>
85
+ </template>
86
+
87
+ <template v-slot:content>
88
+ <div style="padding:10px 0px 10px 0px;">
89
+
90
+ <div style="padding:7px 10px; font-size:0.85rem; color:#222; background:#f2f2f2;">
91
+ {{$t('showTabCols')}}
92
+ </div>
93
+
94
+ <div style="padding:7px 9px 0px 7px;">
95
+ <WInputCheckbox
96
+ :items="tabKeysPick"
97
+ v-model="tabKeysShow"
98
+ @input="toggleTabKeys"
99
+ >
100
+ <template v-slot="props">
101
+ <div style="padding-left:3px; display:flex; align-items:center; font-size:0.85rem; height:24px; cursor:pointer;">
102
+ {{getHead(props.item.data)}}
103
+ </div>
104
+ </template>
105
+ </WInputCheckbox>
106
+ </div>
107
+
108
+ </div>
109
+ </template>
110
+ </WPopup>
111
+
112
+ <div style="padding-left:4px;"></div>
113
+
114
+ </template>
115
+
116
+ <template v-if="isEditable">
117
+
118
+ <WButtonCircle
119
+ :paddingStyle="{v:6,h:6}"
120
+ :tooltip="$t('pemiAdd')"
121
+ :icon="mdiPlus"
122
+ :backgroundColor="'#fff'"
123
+ :backgroundColorHover="'#f2f2f2'"
124
+ _textColor="'#eee'"
125
+ _textColorHover="'#fff'"
126
+ :iconColor="'#444'"
127
+ :iconColorHover="'#222'"
128
+ :shadow="false"
129
+ @click="addItem"
130
+ ></WButtonCircle>
131
+
132
+ <div style="padding-left:4px;"></div>
133
+
134
+ </template>
135
+
136
+ <template v-if="isEditable && hasItemCheckOne">
137
+
138
+ <WButtonCircle
139
+ :paddingStyle="{v:6,h:6}"
140
+ :tooltip="$t('pemiCopy')"
141
+ :icon="mdiContentCopy"
142
+ :backgroundColor="'#fff'"
143
+ :backgroundColorHover="'#f2f2f2'"
144
+ _textColor="'#eee'"
145
+ _textColorHover="'#fff'"
146
+ :iconColor="'#444'"
147
+ :iconColorHover="'#222'"
148
+ :shadow="false"
149
+ @click="copyItem"
150
+ ></WButtonCircle>
151
+
152
+ <div style="padding-left:4px;"></div>
153
+
154
+ </template>
155
+
156
+ <template v-if="isEditable && hasItemsCheck">
157
+
158
+ <WButtonCircle
159
+ :paddingStyle="{v:6,h:6}"
160
+ :tooltip="$t('pemiDeleteCheckPemis')"
161
+ :icon="mdiTrashCanOutline"
162
+ :backgroundColor="'#fff'"
163
+ :backgroundColorHover="'#f2f2f2'"
164
+ _textColor="'#eee'"
165
+ _textColorHover="'#fff'"
166
+ :iconColor="'#444'"
167
+ :iconColorHover="'#222'"
168
+ :shadow="false"
169
+ @click="deleteItemsCheck"
170
+ ></WButtonCircle>
171
+
172
+ <div style="padding-left:4px;"></div>
173
+
174
+ </template>
175
+
176
+ <template v-if="isEditable && isModified">
177
+
178
+ <WButtonCircle
179
+ :paddingStyle="{v:6,h:6}"
180
+ :tooltip="$t('saveChanges')"
181
+ :icon="mdiCloudUploadOutline"
182
+ :backgroundColor="'rgba(255,0,50,0.7)'"
183
+ :backgroundColorHover="'rgba(255,0,50,0.8)'"
184
+ :textColor="'#eee'"
185
+ :textColorHover="'#fff'"
186
+ :iconColor="'#eee'"
187
+ :iconColorHover="'#fff'"
188
+ :shadow="false"
189
+ :promiseUnlock="true"
190
+ @click="savePemis"
191
+ ></WButtonCircle>
192
+
193
+ <div style="padding-left:4px;"></div>
194
+
195
+ </template>
196
+
197
+ </div>
198
+
199
+ </div>
200
+
201
+ <template
202
+ v-if="!firstLoading"
203
+ >
204
+
205
+ <template v-if="items">
206
+ <WAggridVue
207
+ ref="rftable"
208
+ :style="`width:100%;`"
209
+ :height="contentHeight"
210
+ :opt="opt"
211
+ >
212
+ <template v-slot:cell-render="props">
213
+ <template v-if="props.key==='name'">
214
+ <span v-if="errItemsByName[props.value]" :title="errItemsByName[props.value]">
215
+ <span style="color:#F57C00;">{{ props.value }}</span>
216
+ <img style="vertical-align:sub; width:16px; height:16px;" :src="$ui.getIcon('warning')" />
217
+ </span>
218
+ <span v-else>{{ props.value }}</span>
219
+ </template>
220
+ <template v-else-if="props.key==='belongGrups'">
221
+ <div @click.stop.prevent @mousedown.stop.prevent>
222
+ <button style="width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;" @click="$dg.showVePemiBlngGrupsById(props.row.id)">{{ props.value }}</button>
223
+ </div>
224
+ </template>
225
+ <template v-else-if="props.key==='crules'">
226
+ <div @click.stop.prevent @mousedown.stop.prevent>
227
+ <button style="width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;" @click="$dg.showVeCrulesById(props.row.id)">{{ getCrulesText(props.value) }}</button>
228
+ </div>
229
+ </template>
230
+ <span v-else>{{ props.value }}</span>
231
+ </template>
232
+ </WAggridVue>
233
+ </template>
234
+
235
+ </template>
236
+
237
+ <div
238
+ style="padding:10px 15px; font-size:0.8rem;"
239
+ v-else
240
+ >
241
+ {{$t('waitingData')}}
242
+ </div>
243
+
244
+ </div>
245
+ </template>
246
+
247
+ <script>
248
+ import { mdiStackOverflow, mdiVectorPolylinePlus, mdiCheckboxMarkedCircle, mdiCloudUploadOutline, mdiTrashCanOutline, mdiTableHeadersEye, mdiPlus, mdiPencilOutline, mdiContentCopy } from '@mdi/js/mdi.js'
249
+ import JSON5 from 'json5'
250
+ import get from 'lodash-es/get.js'
251
+ import set from 'lodash-es/set.js'
252
+ import each from 'lodash-es/each.js'
253
+ import map from 'lodash-es/map.js'
254
+ import size from 'lodash-es/size.js'
255
+ import filter from 'lodash-es/filter.js'
256
+ import sortBy from 'lodash-es/sortBy.js'
257
+ import cloneDeep from 'lodash-es/cloneDeep.js'
258
+ import haskey from 'wsemi/src/haskey.mjs'
259
+ import isestr from 'wsemi/src/isestr.mjs'
260
+ import iseobj from 'wsemi/src/iseobj.mjs'
261
+ import isnum from 'wsemi/src/isnum.mjs'
262
+ import cdbl from 'wsemi/src/cdbl.mjs'
263
+ import arrPull from 'wsemi/src/arrPull.mjs'
264
+ import WIcon from 'w-component-vue/src/components/WIcon.vue'
265
+ import WSwitch from 'w-component-vue/src/components/WSwitch.vue'
266
+ import WButtonCircle from 'w-component-vue/src/components/WButtonCircle.vue'
267
+ import WPopup from 'w-component-vue/src/components/WPopup.vue'
268
+ import WInputCheckbox from 'w-component-vue/src/components/WInputCheckbox.vue'
269
+ import WAggridVue from 'w-aggrid-vue/src/components/WAggridVue.vue'
270
+
271
+
272
+ export default {
273
+ components: {
274
+ WIcon,
275
+ WSwitch,
276
+ WButtonCircle,
277
+ WPopup,
278
+ WInputCheckbox,
279
+ WAggridVue,
280
+ },
281
+ props: {
282
+ drawer: {
283
+ type: Boolean,
284
+ default: false,
285
+ },
286
+ },
287
+ data: function() {
288
+ return {
289
+ mdiStackOverflow,
290
+ mdiVectorPolylinePlus,
291
+ mdiCheckboxMarkedCircle,
292
+ mdiCloudUploadOutline,
293
+ mdiTrashCanOutline,
294
+ mdiTableHeadersEye,
295
+ mdiPlus,
296
+ mdiPencilOutline,
297
+ mdiContentCopy,
298
+
299
+ panelHeight: 100,
300
+ headHeight: 100,
301
+
302
+ firstLoading: true,
303
+ firstSetting: true,
304
+ systemProcing: false, //程式端載入/重載清單資料期間為 true, 用於排除非使用者操作之 rowsChange (見 $ui.markDataReload)
305
+ showIsEditable: false,
306
+ isEditable: false,
307
+ isModified: false,
308
+
309
+ tabKeys: [ //關聯欄之欄序: 本項自己管控的(管控對象)在左, 由上層帶過來的(管控所屬權限群組)在右
310
+ 'id',
311
+ 'name',
312
+ 'description',
313
+ 'from',
314
+ 'crules',
315
+ 'belongGrups',
316
+ 'userId',
317
+ 'timeCreate',
318
+ 'userIdUpdate',
319
+ 'timeUpdate',
320
+ ],
321
+ tabKeysPick: [
322
+ 'name',
323
+ 'description',
324
+ 'from',
325
+ 'crules',
326
+ 'belongGrups',
327
+ 'userId',
328
+ 'timeCreate',
329
+ 'userIdUpdate',
330
+ 'timeUpdate',
331
+ ],
332
+ tabKeysShow: [
333
+ 'name',
334
+ 'description',
335
+ // 'from',
336
+ 'crules',
337
+ 'belongGrups',
338
+ // 'userId',
339
+ // 'timeCreate',
340
+ // 'userIdUpdate',
341
+ // 'timeUpdate',
342
+ ],
343
+
344
+ widthPemisName: null,
345
+ widthPemisDescription: null,
346
+
347
+ items: [],
348
+ itemsCheck: [],
349
+ opt: null,
350
+
351
+ }
352
+ },
353
+ mounted: function() {
354
+ // console.log('mounted')
355
+
356
+ let vo = this
357
+
358
+ //註冊至$dg供使用
359
+ vo.$dg.showVePemiBlngGrupsById = vo.showVePemiBlngGrupsById
360
+ vo.$dg.showVeCrulesById = vo.showVeCrulesById
361
+
362
+ //firstSetting
363
+ if (vo.firstSetting) {
364
+ // console.log('webInfor', vo.webInfor)
365
+
366
+ let showModeEditPemis = get(vo, 'webInfor.showModeEditPemis', '')
367
+ vo.showIsEditable = showModeEditPemis === 'y'
368
+ let modeEditPemis = get(vo, 'webInfor.modeEditPemis', '')
369
+ vo.isEditable = modeEditPemis === 'y'
370
+
371
+ vo.widthPemisName = get(vo, 'webInfor.widthPemisName', '')
372
+ vo.widthPemisDescription = get(vo, 'webInfor.widthPemisDescription', '')
373
+
374
+ //會觸發數據變更再導致opt變更導致觸發rowsChange等事件, 故得要延遲, 供組件偵測初始設定數據初始化之用
375
+ setTimeout(() => {
376
+ vo.firstSetting = false
377
+ // console.log('firstSetting', vo.firstSetting)
378
+ }, 1)
379
+
380
+ }
381
+
382
+ },
383
+ computed: {
384
+
385
+ syncState: function() {
386
+ let vo = this
387
+ return get(vo, '$store.state.syncState')
388
+ },
389
+
390
+ webInfor: function() {
391
+ let wi = get(this, `$store.state.webInfor`)
392
+ return wi
393
+ },
394
+
395
+ targets: function() {
396
+ let rs = get(this, `$store.state.targets`)
397
+ rs = sortBy(rs, 'order')
398
+ return rs
399
+ },
400
+
401
+ pemis: function() {
402
+ let rs = get(this, `$store.state.pemis`)
403
+ rs = sortBy(rs, 'order')
404
+ return rs
405
+ },
406
+
407
+ grups: function() {
408
+ let rs = get(this, `$store.state.grups`)
409
+ rs = sortBy(rs, 'order')
410
+ return rs
411
+ },
412
+
413
+ users: function() {
414
+ let rs = get(this, `$store.state.users`)
415
+ rs = sortBy(rs, 'order')
416
+ return rs
417
+ },
418
+
419
+ useGrups: function() {
420
+ let vo = this
421
+
422
+ //parse cpemis
423
+ let grups = map(vo.grups, (g) => {
424
+
425
+ //cloneDeep
426
+ g = cloneDeep(g)
427
+
428
+ //kpPemi
429
+ let kpPemi = {}
430
+ try {
431
+ // console.log('g.cpemis', g.cpemis)
432
+ kpPemi = JSON5.parse(g.cpemis)
433
+ }
434
+ catch (err) {}
435
+
436
+ //save kpPemi
437
+ g.kpPemi = kpPemi
438
+
439
+ return g
440
+ })
441
+ // console.log('grups', grups)
442
+
443
+ return grups
444
+ },
445
+
446
+ kpPemiGrup: function() {
447
+ let vo = this
448
+
449
+ //kp
450
+ let kp = {}
451
+ each(vo.useGrups, (g) => {
452
+ each(g.kpPemi, (v, k) => {
453
+ let isActive = get(v, 'isActive', '')
454
+ if (isActive !== 'y') {
455
+ return true //跳出換下一個
456
+ }
457
+ if (!haskey(kp, k)) {
458
+ kp[k] = []
459
+ }
460
+ kp[k].push({
461
+ grup: g,
462
+ pemi: v,
463
+ })
464
+ })
465
+ })
466
+ // console.log('kp', kp)
467
+
468
+ return kp
469
+ },
470
+
471
+ kpUsePemiGrup: function() {
472
+ let vo = this
473
+
474
+ //_kp
475
+ let _kp = {}
476
+ each(vo.pemis, (v, k) => {
477
+ _kp[v.name] = true
478
+ })
479
+ // console.log('_kp', _kp)
480
+
481
+ //kp
482
+ let kp = {}
483
+ each(vo.kpPemiGrup, (v, k) => {
484
+ if (haskey(_kp, k)) {
485
+ kp[k] = v
486
+ }
487
+ })
488
+ // console.log('kp', kp)
489
+
490
+ return kp
491
+ },
492
+
493
+ changeParams: function() {
494
+ // console.log('computed changeParams')
495
+
496
+ let vo = this
497
+
498
+ //trigger
499
+ let isEditable = vo.isEditable
500
+ let pemis = cloneDeep(vo.pemis)
501
+ let kpUsePemiGrup = cloneDeep(vo.kpUsePemiGrup)
502
+
503
+ //items
504
+ let items = vo.genItems(pemis, kpUsePemiGrup)
505
+
506
+ //save
507
+ vo.items = items
508
+
509
+ //genOpt
510
+ vo.genOpt({ isEditable })
511
+
512
+ //firstLoading
513
+ vo.firstLoading = false
514
+
515
+ return ''
516
+ },
517
+
518
+ contentHeight: function() {
519
+ let vo = this
520
+
521
+ //h
522
+ let h = vo.panelHeight - vo.headHeight
523
+ h = Math.max(h, 0)
524
+
525
+ return h
526
+ },
527
+
528
+ hasItemsCheck: function() {
529
+ let vo = this
530
+
531
+ //h
532
+ let b = size(vo.itemsCheck) > 0
533
+
534
+ return b
535
+ },
536
+
537
+ hasItemCheckOne: function() {
538
+ let vo = this
539
+
540
+ //h
541
+ let b = size(vo.itemsCheck) === 1
542
+
543
+ return b
544
+ },
545
+
546
+ errItemsByName: function() {
547
+ let vo = this
548
+
549
+ //rows
550
+ let rows = get(vo, 'opt.rows', [])
551
+
552
+ //kpErr
553
+ let kpErr = {}
554
+ let kpName = {}
555
+ each(rows, (v, k) => {
556
+
557
+ //name
558
+ let name = get(v, 'name', '')
559
+
560
+ //check
561
+ if (!isestr(name)) {
562
+
563
+ //kpErr
564
+ kpErr[name] = vo.$t(`pemiNameEmpty`)
565
+
566
+ return true //跳出換下一個
567
+ }
568
+
569
+ //check
570
+ if (haskey(kpName, name)) {
571
+
572
+ //kpErr
573
+ kpErr[name] = vo.$t(`pemiNameDuplicate`)
574
+
575
+ return true //跳出換下一個
576
+ }
577
+
578
+ //kpName
579
+ kpName[name] = true
580
+
581
+ })
582
+
583
+ return kpErr
584
+ },
585
+
586
+ isError: function() {
587
+ let vo = this
588
+
589
+ let c = ''
590
+ let b = false
591
+ b = iseobj(vo.errItemsByName)
592
+ if (b) {
593
+ c = vo.$t('errInNames')
594
+ }
595
+
596
+ return c
597
+ },
598
+
599
+ kpHead: function() {
600
+ let vo = this
601
+
602
+ let kp = {
603
+ 'id': vo.$t('id'),
604
+ 'name': vo.$t('name'),
605
+ 'description': vo.$t('description'),
606
+ 'from': vo.$t('from'),
607
+ 'belongGrups': vo.$t('belongGrups'),
608
+ 'crules': vo.$t('pemiCrules'),
609
+ 'userId': vo.$t('userId'),
610
+ 'timeCreate': vo.$t('timeCreate'),
611
+ 'userIdUpdate': vo.$t('userIdUpdate'),
612
+ 'timeUpdate': vo.$t('timeUpdate'),
613
+ }
614
+
615
+ return kp
616
+ },
617
+
618
+ },
619
+ methods: {
620
+
621
+ resizePanel: function(msg) {
622
+ // console.log('methods resizePanel', msg)
623
+
624
+ let vo = this
625
+
626
+ //panelWidth, panelHeight
627
+ vo.panelHeight = msg.snew.offsetHeight
628
+
629
+ },
630
+
631
+ resizeHead: function(msg) {
632
+ // console.log('methods resizeHead', msg)
633
+
634
+ let vo = this
635
+
636
+ //headHeight
637
+ vo.headHeight = msg.snew.offsetHeight
638
+
639
+ },
640
+
641
+ getHead: function(key) {
642
+ // console.log('methods getHead', key)
643
+
644
+ let vo = this
645
+
646
+ let head = get(vo, `kpHead.${key}`, '')
647
+
648
+ return head
649
+ },
650
+
651
+ genOpt: function() {
652
+ // console.log('methods genOpt')
653
+
654
+ let vo = this
655
+
656
+ //default
657
+ vo.itemsCheck = []
658
+
659
+ //opt
660
+ let opt = null
661
+ if (size(vo.items) > 0) {
662
+
663
+ //ks
664
+ let ks = vo.tabKeys
665
+ // console.log('ks', ks)
666
+
667
+ //kpHead
668
+ let kpHead = vo.kpHead
669
+
670
+ //kpCellEditable, kpRowDrag, kpHeadCheckBox
671
+ let kpCellEditable = {}
672
+ let kpRowDrag = {}
673
+ let kpHeadCheckBox = {}
674
+ if (vo.isEditable) {
675
+ kpCellEditable = {
676
+ 'name': true,
677
+ 'description': true,
678
+ 'from': true,
679
+ }
680
+ kpRowDrag = {
681
+ 'name': true,
682
+ }
683
+ kpHeadCheckBox = {
684
+ 'name': true,
685
+ }
686
+ }
687
+
688
+ //kpHeadHide
689
+ let kpHeadHide = {
690
+ 'id': true,
691
+ }
692
+ if (true) {
693
+ let tabKeysHide = arrPull(vo.tabKeysPick, vo.tabKeysShow)
694
+ each(tabKeysHide, (k) => {
695
+ kpHeadHide[k] = true
696
+ })
697
+ }
698
+
699
+ //opt
700
+ opt = {
701
+ language: vo.$t('aggridLanguage'),
702
+ rows: vo.items,
703
+ keys: ks,
704
+ kpHead,
705
+ // autoFitColumn: true,
706
+ defCellEditable: false, //vo.isEditable,
707
+ defHeadFilter: true,
708
+ defCellAlignH: 'left',
709
+ kpHeadHide,
710
+ kpHeadFixLeft: {
711
+ 'name': true,
712
+ },
713
+ defHeadMinWidth: 150,
714
+ kpHeadWidth: {
715
+ 'name': isnum(vo.widthPemisName) ? cdbl(vo.widthPemisName) : 300,
716
+ 'description': isnum(vo.widthPemisDescription) ? cdbl(vo.widthPemisDescription) : 300,
717
+ 'belongGrups': 300,
718
+ 'crules': 300,
719
+ 'timeCreate': 220,
720
+ 'timeUpdate': 220,
721
+ },
722
+ kpHeadFilterType: {
723
+ 'id': 'text',
724
+ 'name': 'text',
725
+ 'description': 'text',
726
+ 'from': 'text',
727
+ 'belongGrups': 'text',
728
+ 'crules': 'text',
729
+ 'userId': 'text',
730
+ 'timeCreate': 'text',
731
+ 'userIdUpdate': 'text',
732
+ 'timeUpdate': 'text',
733
+ },
734
+ kpCellEditable,
735
+ kpRowDrag,
736
+ kpHeadCheckBox,
737
+ kpHeadFilter: {
738
+ 'belongGrups': false,
739
+ 'crules': false,
740
+ },
741
+ kpHeadSort: {
742
+ 'belongGrups': false,
743
+ 'crules': false,
744
+ },
745
+ kpHeadFocusHighlight: { //雖然效果不完全, 但因按鈕與cell有padding可被點擊, 故還是需要開啟
746
+ 'belongGrups': false,
747
+ 'crules': false,
748
+ },
749
+ rowsChange: (rs) => {
750
+ // console.log('rowsChange', rs)
751
+ // console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
752
+
753
+ //check
754
+ if (!vo.syncState || vo.firstLoading || vo.firstSetting || vo.systemProcing) {
755
+ return
756
+ }
757
+
758
+ //isModified
759
+ vo.isModified = true
760
+
761
+ },
762
+ rowChecked: (rs) => {
763
+ // console.log('rowChecked', rs)
764
+ // console.log('rowChecked cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
765
+
766
+ //save itemsCheck
767
+ vo.itemsCheck = cloneDeep(rs)
768
+
769
+ },
770
+ }
771
+ // console.log('opt', opt)
772
+
773
+ }
774
+
775
+ //markDataReload, 重建 opt 屬程式端寫入, 其後非同步觸發之 rowsChange 不得視為使用者變更
776
+ vo.$ui.markDataReload(vo)
777
+
778
+ //save
779
+ vo.opt = opt
780
+
781
+ },
782
+
783
+ refresh: function() {
784
+ let vo = this
785
+
786
+ //cmp
787
+ let cmp = get(vo, '$refs.rftable')
788
+ // console.log('cmp', cmp)
789
+
790
+ //refresh, 因set不會觸發ag-grid重繪, 故須另外調用組件函數refresh(內為redrawRows)重繪各列, 使cell-render slot內容更新(w-aggrid-vue 2.0.56起以cell-render slot取代opt.kpCellRender)
791
+ cmp.refresh()
792
+
793
+ },
794
+
795
+ toggleTabKeys: function() {
796
+ let vo = this
797
+
798
+ //cmp
799
+ let cmp = get(vo, '$refs.rftable')
800
+ // console.log('cmp', cmp)
801
+
802
+ //showKeys
803
+ cmp.showKeys(vo.tabKeysShow)
804
+ // console.log('tabKeysShow', vo.tabKeysShow)
805
+
806
+ },
807
+
808
+ genItems: function(pemis, kpUsePemiGrup) {
809
+ // console.log('method genItems', pemis, kpUsePemiGrup)
810
+
811
+ let vo = this
812
+
813
+ //items
814
+ let items = map(pemis, (p) => {
815
+
816
+ //gs
817
+ let gs = []
818
+ if (haskey(kpUsePemiGrup, p.name)) {
819
+ gs = kpUsePemiGrup[p.name]
820
+ }
821
+ // console.log('gs', gs)
822
+
823
+ //belongGrups
824
+ let belongGrups = vo.$t('pemiBlngRnderNoGrup')
825
+ let t = vo.$t('pemiBlngRnderGrups')
826
+ let n = size(gs)
827
+ if (n > 0) {
828
+ t = t.replace('{n}', n)
829
+ if (n === 1) {
830
+ t = t.replace('{nms}', `(${gs[0].grup.name})`)
831
+ }
832
+ else {
833
+ t = t.replace('{nms}', '')
834
+ }
835
+ belongGrups = t
836
+ }
837
+
838
+ //save belongGrups, gs
839
+ p.belongGrups = belongGrups
840
+ p.gs = gs
841
+ // console.log('p', p)
842
+
843
+ return p
844
+ })
845
+ // console.log('items', items)
846
+
847
+ return items
848
+ },
849
+
850
+ addItem: function() {
851
+ // console.log('method addItem')
852
+
853
+ let vo = this
854
+
855
+ //cloneDeep
856
+ let rows = get(vo, 'opt.rows', [])
857
+
858
+ //cloneDeep
859
+ rows = cloneDeep(rows)
860
+
861
+ //r
862
+ let r = vo.$ds.pemis.funNew()
863
+ r.name = vo.$s.getNameNew(rows, 'name', '', vo.$t('pemiAddNameNew'))
864
+ // r.crules = ''
865
+ r.userId = `{${vo.$t('pemiAddIdNew')}}`
866
+ r.timeCreate = `{${vo.$t('pemiAddIdNew')}}`
867
+ r.userIdUpdate = `{${vo.$t('pemiAddIdNew')}}`
868
+ r.timeUpdate = `{${vo.$t('pemiAddIdNew')}}`
869
+ // console.log('r', r)
870
+
871
+ //belongGrups, gs
872
+ let gs = []
873
+ let belongGrups = vo.$t('pemiBlngRnderNoGrup')
874
+
875
+ //save belongGrups, gs
876
+ r.belongGrups = belongGrups
877
+ r.gs = gs
878
+ // console.log('r', r)
879
+
880
+ //添加至最首
881
+ rows = [
882
+ r,
883
+ ...rows,
884
+ ]
885
+
886
+ //save
887
+ vo.opt.rows = rows
888
+ // console.log('cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
889
+
890
+ //isModified
891
+ vo.isModified = true
892
+
893
+ },
894
+
895
+ copyItem: function() {
896
+ // console.log('method copyItem')
897
+
898
+ let vo = this
899
+
900
+ //check
901
+ if (size(vo.itemsCheck) !== 1) {
902
+ console.log(`size(vo.itemsCheck) !== 1`, vo.itemsCheck)
903
+ vo.$alert(`${vo.$t('anUnexpectedErrorOccurred')}`, { type: 'error' })
904
+ return
905
+ }
906
+
907
+ //cloneDeep
908
+ let rows = get(vo, 'opt.rows', [])
909
+
910
+ //cloneDeep
911
+ rows = cloneDeep(rows)
912
+
913
+ //find
914
+ let tar = vo.itemsCheck[0]
915
+ let tarId = get(tar, 'data.id', '')
916
+ let row = null
917
+ each(rows, (v) => {
918
+ let id = get(v, 'id', '')
919
+ if (id === tarId) {
920
+ row = v
921
+ return false //跳出
922
+ }
923
+ })
924
+ // console.log('tar', tar)
925
+ // console.log('row', row)
926
+
927
+ //check
928
+ if (!iseobj(row)) {
929
+ console.log(`!iseobj(row)`, row)
930
+ vo.$alert(`${vo.$t('anUnexpectedErrorOccurred')}`, { type: 'error' })
931
+ return
932
+ }
933
+
934
+ //r
935
+ let r = cloneDeep(row)
936
+ let nameOld = r.name
937
+ let _r = vo.$ds.pemis.funNew()
938
+ r.id = _r.id //使用新建方式預先產生id避免重複
939
+ r.name = vo.$s.getNameNew(rows, 'name', nameOld, vo.$t('pemiCopyNameNew'))
940
+ r.userId = `{${vo.$t('pemiAddIdNew')}}`
941
+ r.timeCreate = `{${vo.$t('pemiAddIdNew')}}`
942
+ r.userIdUpdate = `{${vo.$t('pemiAddIdNew')}}`
943
+ r.timeUpdate = `{${vo.$t('pemiAddIdNew')}}`
944
+ // console.log('r', r)
945
+
946
+ //belongGrups, gs
947
+ let gs = []
948
+ let belongGrups = vo.$t('pemiBlngRnderNoGrup')
949
+
950
+ //save belongGrups, gs
951
+ r.belongGrups = belongGrups
952
+ r.gs = gs
953
+ // console.log('r', r)
954
+
955
+ //添加至最首
956
+ rows = [
957
+ r,
958
+ ...rows,
959
+ ]
960
+
961
+ //save
962
+ vo.opt.rows = rows
963
+ // console.log('cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
964
+
965
+ //isModified
966
+ vo.isModified = true
967
+
968
+ },
969
+
970
+ deleteItemsCheck: function() {
971
+ // console.log('method deleteItemsCheck')
972
+
973
+ let vo = this
974
+
975
+ //check
976
+ if (size(vo.itemsCheck) === 0) {
977
+ console.log(`size(vo.itemsCheck) === 0`, vo.itemsCheck)
978
+ vo.$alert(`${vo.$t('anUnexpectedErrorOccurred')}`, { type: 'error' })
979
+ return
980
+ }
981
+
982
+ //cloneDeep
983
+ let rows = get(vo, 'opt.rows', [])
984
+
985
+ //cloneDeep
986
+ rows = cloneDeep(rows)
987
+
988
+ //filter
989
+ each(vo.itemsCheck, (v) => {
990
+ // console.log('v', v)
991
+ let id = get(v, 'data.id', '')
992
+ if (!isestr(id)) {
993
+ console.log(`invalid id`)
994
+ return true //跳出換下一個
995
+ }
996
+ rows = filter(rows, (vv) => {
997
+ return vv.id !== id
998
+ })
999
+ })
1000
+
1001
+ //clear
1002
+ vo.itemsCheck = []
1003
+
1004
+ //save
1005
+ vo.opt.rows = rows
1006
+ // console.log('deleteItemsCheck cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
1007
+
1008
+ //isModified
1009
+ vo.isModified = true
1010
+
1011
+ },
1012
+
1013
+ fltKpRule: function(kp) {
1014
+ // console.log('fltKpRule', kp)
1015
+
1016
+ let vo = this
1017
+
1018
+ //_kp
1019
+ let _kp = {}
1020
+ each(vo.targets, (v, k) => {
1021
+ _kp[v.id] = true //管控對象須使用id
1022
+ })
1023
+ // console.log('_kp', _kp)
1024
+
1025
+ //kpt
1026
+ let kpt = {}
1027
+ each(kp, (v, k) => {
1028
+ if (haskey(_kp, k)) {
1029
+ kpt[k] = v
1030
+ }
1031
+ })
1032
+
1033
+ return kpt
1034
+ },
1035
+
1036
+ getCrulesText: function(crules) {
1037
+ // console.log('method getCrulesText', crules)
1038
+
1039
+ let vo = this
1040
+
1041
+ //kpRule
1042
+ let kpRule = {}
1043
+ try {
1044
+ // console.log('crules', crules)
1045
+ kpRule = JSON5.parse(crules)
1046
+ }
1047
+ catch (err) {}
1048
+ // console.log('kpRule', kpRule)
1049
+
1050
+ //fltKpRule
1051
+ kpRule = vo.fltKpRule(kpRule)
1052
+ // console.log('kpRule(fltKpRule)', kpRule)
1053
+
1054
+ //vs
1055
+ let vs = []
1056
+ each(kpRule, (v, k) => {
1057
+ // console.log(k, 'v', v)
1058
+
1059
+ //isActive
1060
+ let isActive = v //crules各值為直接儲存y或n
1061
+ if (isActive !== 'y') {
1062
+ return true //跳出換下一個
1063
+ }
1064
+ // console.log(k, '_isActive', _isActive)
1065
+
1066
+ //push
1067
+ vs.push(k)
1068
+
1069
+ })
1070
+
1071
+ //crulesText
1072
+ let crulesText = vo.$t('pemiRnderCrulesNoRule')
1073
+ let t = vo.$t('pemiRnderCrulesHasNRule')
1074
+ let n = size(vs)
1075
+ if (n > 0) {
1076
+ t = t.replace('{n}', n)
1077
+ // if (n === 1) {
1078
+ // t = t.replace('{nms}', `(${vs[0]})`)
1079
+ // }
1080
+ // else {
1081
+ // t = t.replace('{nms}', '')
1082
+ // }
1083
+ t = t.replace('{nms}', '') //管控對象id太長, 顯示按鈕預設寬度小, 故皆僅顯示數量
1084
+ crulesText = t
1085
+ }
1086
+
1087
+ return crulesText
1088
+ },
1089
+
1090
+ showVePemiBlngGrupsById: function(id) {
1091
+ // console.log('method showVePemiBlngGrupsById', id)
1092
+
1093
+ let vo = this
1094
+
1095
+ //check
1096
+ if (!isestr(id)) {
1097
+ vo.$alert(`${vo.$t('pemiEditBlngGrupsNoPemiId')}`, { type: 'error' })
1098
+ return
1099
+ }
1100
+
1101
+ //rows
1102
+ let rows = get(vo, 'opt.rows', [])
1103
+
1104
+ //find
1105
+ let r = null
1106
+ // let kr = null
1107
+ each(rows, (v, k) => {
1108
+ if (get(v, 'id', '') === id) {
1109
+ r = v
1110
+ // kr = k
1111
+ return false //跳出
1112
+ }
1113
+ })
1114
+ // console.log('r', r)
1115
+
1116
+ //check
1117
+ if (!iseobj(r)) {
1118
+ vo.$alert(`${vo.$t('pemiEditBlngGrupsNoPemiData')}`, { type: 'error' })
1119
+ return
1120
+ }
1121
+
1122
+ //showVePemiBlngGrups
1123
+ vo.$dg.showVePemiBlngGrups({
1124
+ isEditable: vo.isEditable,
1125
+ pemi: r,
1126
+ })
1127
+ .then(() => {})
1128
+ .catch(() => {})
1129
+
1130
+ },
1131
+
1132
+ showVeCrulesById: function(id) {
1133
+ // console.log('method showVeCrulesById', id)
1134
+
1135
+ let vo = this
1136
+
1137
+ //check
1138
+ if (!isestr(id)) {
1139
+ vo.$alert(`${vo.$t('pemiEditCrulesNoPemiId')}`, { type: 'error' })
1140
+ return
1141
+ }
1142
+
1143
+ //rows
1144
+ let rows = get(vo, 'opt.rows', [])
1145
+
1146
+ //find
1147
+ let r = null
1148
+ let kr = null
1149
+ each(rows, (v, k) => {
1150
+ if (get(v, 'id', '') === id) {
1151
+ r = v
1152
+ kr = k
1153
+ return false //跳出
1154
+ }
1155
+ })
1156
+
1157
+ //check
1158
+ if (!iseobj(r)) {
1159
+ vo.$alert(`${vo.$t('pemiEditCrulesNoPemiData')}`, { type: 'error' })
1160
+ return
1161
+ }
1162
+
1163
+ //showVeCrules
1164
+ vo.$dg.showVeCrules({
1165
+ isEditable: vo.isEditable,
1166
+ pemi: r,
1167
+ })
1168
+ .then((crules) => {
1169
+ // console.log('crules', crules)
1170
+
1171
+ //set
1172
+ set(vo, `opt.rows[${kr}].crules`, crules)
1173
+ // console.log('vo.opt.rows[kr]', cloneDeep(vo.opt.rows[kr]))
1174
+
1175
+ //refresh
1176
+ vo.refresh()
1177
+
1178
+ //isModified
1179
+ vo.isModified = true
1180
+
1181
+ })
1182
+ .catch(() => {})
1183
+
1184
+ },
1185
+
1186
+ savePemis: function(msg) {
1187
+
1188
+ let vo = this
1189
+
1190
+ //第一行立刻釋放按鈕視覺鎖
1191
+ msg.pm.resolve()
1192
+
1193
+ //fire-and-forget, 不 await
1194
+ vo.doSavePemis()
1195
+
1196
+ },
1197
+
1198
+ doSavePemis: function() {
1199
+ // console.log('method doSavePemis')
1200
+
1201
+ let vo = this
1202
+
1203
+ async function core() {
1204
+
1205
+ //1) 同步檢測 (在開 loading 之前)
1206
+ if (isestr(vo.isError)) {
1207
+ await vo.$dg.showCheckYes(`${vo.isError}`)
1208
+ return
1209
+ }
1210
+
1211
+ //rows
1212
+ let rows = get(vo, 'opt.rows', [])
1213
+
1214
+ //check
1215
+ if (size(rows) === 0) {
1216
+ await vo.$dg.showCheckYes(`${vo.$t('pemiAddEmpty')}`)
1217
+ return
1218
+ }
1219
+
1220
+ //2) 確定打 API 才開 loading
1221
+ vo.$ui.updateLoading(true)
1222
+
1223
+ //3) updatePemis, 各自 catch + 旗標短路
1224
+ let okSave = false
1225
+ await vo.$fapi.updatePemis(rows)
1226
+ .then(() => { okSave = true })
1227
+ .catch(async (err) => {
1228
+ vo.$ui.updateLoading(false) //showCheckYes 前關 loading(modal 阻斷期間避免 loading 疊在底下)
1229
+ await vo.$dg.showCheckYes(`${vo.$t('pemiSavePemisFail')}: ${vo.$tErr(err)}`)
1230
+ })
1231
+ if (!okSave) return
1232
+
1233
+ //isModified
1234
+ vo.isModified = false
1235
+
1236
+ //alert(showCheckYes 前關 loading,避免 modal 等待期間 loading 疊在底下)
1237
+ vo.$ui.updateLoading(false)
1238
+ await vo.$dg.showCheckYes(vo.$t('pemiSavePemisSuccess'), { type: 'success' })
1239
+
1240
+ }
1241
+
1242
+ //core
1243
+ core()
1244
+ .catch((err) => {
1245
+ console.log('catch', err)
1246
+ vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' })
1247
+ })
1248
+ .finally(() => {
1249
+
1250
+ //hide loading
1251
+ vo.$ui.updateLoading(false)
1252
+
1253
+ })
1254
+
1255
+ },
1256
+
1257
+ }
1258
+ }
1259
+ </script>
1260
+
1261
+ <style scoped>
1262
+ </style>