w-web-perm 1.0.49 → 1.0.50
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.
- package/README.md +5 -5
- package/dist/css/app.8781355a.css +1 -0
- package/dist/css/{chunk-vendors.2d3ef2ba.css → chunk-vendors.58917286.css} +1 -1
- package/dist/index.tmp +1 -1
- package/dist/js/app-legacy.b2754bb1.js +1 -0
- package/dist/js/app.b2754bb1.js +1 -0
- package/dist/js/{chunk-vendors-legacy.8fdd4435.js → chunk-vendors-legacy.c14a1ed1.js} +6 -6
- package/dist/js/{chunk-vendors.8fdd4435.js → chunk-vendors.c14a1ed1.js} +6 -6
- package/dist/w-web-perm.umd.js +2 -2
- package/dist/w-web-perm.umd.js.map +1 -1
- package/docs/WWebPerm.html +3 -3
- package/docs/WWebPerm.mjs.html +33 -20
- package/docs/index.html +1 -1
- package/logs/2026-06-19T16.log +191 -0
- package/logs/2026-06-20T00.log +207 -0
- package/logs/2026-06-20T11.log +221 -0
- package/logs/2026-06-20T12.log +146 -0
- package/logs/2026-06-20T13.log +134 -0
- package/logs/2026-06-20T14.log +296 -0
- package/logs/2026-06-20T15.log +225 -0
- package/logs/2026-06-20T16.log +174 -0
- package/logs/2026-06-21T16.log +110 -0
- package/logs/2026-06-21T17.log +301 -0
- package/logs/2026-06-21T18.log +238 -0
- package/logs/2026-06-21T19.log +141 -0
- package/logs/2026-06-21T20.log +99 -0
- package/logs/2026-06-21T21.log +143 -0
- package/logs/2026-06-21T23.log +26 -0
- package/logs/2026-06-22T00.log +33 -0
- package/logs/2026-06-22T08.log +235 -0
- package/logs/2026-06-22T09.log +246 -0
- package/logs/2026-06-22T10.log +301 -0
- package/logs/2026-06-22T11.log +140 -0
- package/logs/2026-06-22T12.log +22 -0
- package/logs/2026-06-22T14.log +44 -0
- package/logs/2026-06-22T23.log +951 -0
- package/logs/2026-06-23T00.log +263 -0
- package/logs/2026-06-23T08.log +611 -0
- package/logs/2026-06-30T21.log +3609 -0
- package/logs/2026-06-30T22.log +3682 -0
- package/logs/2026-06-30T23.log +592 -0
- package/logs/2026-07-01T12.log +0 -0
- package/logs/2026-07-09T22.log +2220 -0
- package/logs/2026-07-09T23.log +1140 -0
- package/logs/2026-07-10T12.log +6 -0
- package/logs/2026-07-10T13.log +351 -0
- package/logs/2026-07-10T16.log +1272 -0
- package/logs/2026-07-10T19.log +6 -0
- package/logs/2026-07-10T20.log +1883 -0
- package/logs/2026-07-10T21.log +3505 -0
- package/logs/2026-07-10T22.log +3395 -0
- package/logs/2026-07-11T00.log +1338 -0
- package/logs/2026-07-11T01.log +2492 -0
- package/logs/2026-07-11T17.log +19 -0
- package/package.json +18 -15
- package/server/WWebPerm.mjs +32 -19
- package/server/procCore.mjs +22 -4
- package/server/procLang.mjs +84 -65
- package/server/procStaInfor.mjs +10 -0
- package/server/staLogs/filterVpfsByWindow.mjs +27 -0
- package/server/staLogs/staEvent.mjs +2 -0
- package/server/staLogs/staEventTable.mjs +2 -0
- package/settings.json +3 -0
- package/src/components/LayoutContent.vue +0 -2
- package/src/components/LayoutContentGrups.vue +0 -2
- package/src/components/LayoutContentPemis.vue +0 -2
- package/src/components/LayoutContentStaInfor.vue +0 -2
- package/src/components/LayoutContentTargets.vue +3 -5
- package/src/components/LayoutContentUsers.vue +0 -2
- package/src/components/VeCgrups.vue +7 -6
- package/src/components/VeCpemis.vue +7 -6
- package/src/components/VeCrules.vue +7 -6
- package/src/components/VeGrupBlngUsers.vue +21 -27
- package/src/components/VePemiBlngGrups.vue +21 -27
- package/src/main.js +3 -9
- package/src/perm.mjs +3 -4
- package/src/plugins/mUI.mjs +0 -48
- package/src/store/mutations.mjs +0 -10
- package/src/store/types.mjs +0 -2
- package/tableTags.json +1 -1
- package/z/344/277/256/346/255/243/350/246/217/345/212/203/346/233/270.md +450 -0
- package/_gh-pages-deploy/WWebPerm.html +0 -938
- package/_gh-pages-deploy/WWebPerm.mjs.html +0 -1228
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.eot +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.eot +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff +0 -0
- package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +0 -978
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +0 -1049
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
- package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
- package/_gh-pages-deploy/index.html +0 -84
- package/_gh-pages-deploy/scripts/collapse.js +0 -39
- package/_gh-pages-deploy/scripts/commonNav.js +0 -28
- package/_gh-pages-deploy/scripts/linenumber.js +0 -25
- package/_gh-pages-deploy/scripts/nav.js +0 -12
- package/_gh-pages-deploy/scripts/polyfill.js +0 -4
- package/_gh-pages-deploy/scripts/prettify/Apache-License-2.0.txt +0 -202
- package/_gh-pages-deploy/scripts/prettify/lang-css.js +0 -2
- package/_gh-pages-deploy/scripts/prettify/prettify.js +0 -28
- package/_gh-pages-deploy/scripts/search.js +0 -99
- package/_gh-pages-deploy/styles/jsdoc.css +0 -776
- package/_gh-pages-deploy/styles/prettify.css +0 -80
- package/dist/css/app.d8b16216.css +0 -1
- package/dist/js/app-legacy.fb48310a.js +0 -1
- package/dist/js/app.fb48310a.js +0 -1
- package/server/staLogs/test_staEvent.mjs +0 -22
- package/src/plugins/mDataSelectorSchema.mjs +0 -30
- package/tableTags-web-perm.json +0 -1
- /package/{_gh-pages-deploy/.nojekyll → logs/2026-06-19T23.log} +0 -0
|
@@ -284,7 +284,6 @@ export default {
|
|
|
284
284
|
mdiPencilOutline,
|
|
285
285
|
mdiContentCopy,
|
|
286
286
|
|
|
287
|
-
panelWidth: 100,
|
|
288
287
|
panelHeight: 100,
|
|
289
288
|
headHeight: 100,
|
|
290
289
|
|
|
@@ -489,9 +488,9 @@ export default {
|
|
|
489
488
|
|
|
490
489
|
let c = ''
|
|
491
490
|
let b = false
|
|
492
|
-
b = iseobj(vo.
|
|
491
|
+
b = iseobj(vo.errItemsById)
|
|
493
492
|
if (b) {
|
|
494
|
-
c = vo.$t('
|
|
493
|
+
c = vo.$t('errInIds')
|
|
495
494
|
}
|
|
496
495
|
|
|
497
496
|
return c
|
|
@@ -522,7 +521,6 @@ export default {
|
|
|
522
521
|
let vo = this
|
|
523
522
|
|
|
524
523
|
//panelWidth, panelHeight
|
|
525
|
-
vo.panelWidth = msg.snew.offsetWidth
|
|
526
524
|
vo.panelHeight = msg.snew.offsetHeight
|
|
527
525
|
|
|
528
526
|
},
|
|
@@ -610,7 +608,7 @@ export default {
|
|
|
610
608
|
defHeadMinWidth: 150,
|
|
611
609
|
kpHeadWidth: {
|
|
612
610
|
'id': isnum(vo.widthTargetId) ? cdbl(vo.widthTargetId) : 600,
|
|
613
|
-
'description': isnum(vo.
|
|
611
|
+
'description': isnum(vo.widthTargetDescription) ? cdbl(vo.widthTargetDescription) : 600,
|
|
614
612
|
'timeCreate': 220,
|
|
615
613
|
'timeUpdate': 220,
|
|
616
614
|
},
|
|
@@ -300,7 +300,6 @@ export default {
|
|
|
300
300
|
mdiPencilOutline,
|
|
301
301
|
mdiContentCopy,
|
|
302
302
|
|
|
303
|
-
panelWidth: 100,
|
|
304
303
|
panelHeight: 100,
|
|
305
304
|
headHeight: 100,
|
|
306
305
|
|
|
@@ -618,7 +617,6 @@ export default {
|
|
|
618
617
|
let vo = this
|
|
619
618
|
|
|
620
619
|
//panelWidth, panelHeight
|
|
621
|
-
vo.panelWidth = msg.snew.offsetWidth
|
|
622
620
|
vo.panelHeight = msg.snew.offsetHeight
|
|
623
621
|
|
|
624
622
|
},
|
|
@@ -198,7 +198,6 @@ export default {
|
|
|
198
198
|
|
|
199
199
|
fullscreen: false,
|
|
200
200
|
|
|
201
|
-
panelWidth: 100,
|
|
202
201
|
panelHeight: 100,
|
|
203
202
|
headHeight: 100,
|
|
204
203
|
|
|
@@ -339,7 +338,6 @@ export default {
|
|
|
339
338
|
let vo = this
|
|
340
339
|
|
|
341
340
|
//panelWidth, panelHeight
|
|
342
|
-
vo.panelWidth = msg.panelWidth
|
|
343
341
|
vo.panelHeight = msg.contentHeightMax
|
|
344
342
|
|
|
345
343
|
},
|
|
@@ -411,9 +409,9 @@ export default {
|
|
|
411
409
|
'mode': 'text',
|
|
412
410
|
'enable': 'text',
|
|
413
411
|
},
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
412
|
+
kpHeadCheckBox: {
|
|
413
|
+
'name': true,
|
|
414
|
+
},
|
|
417
415
|
rowsChange: (rs) => {
|
|
418
416
|
// console.log('rowsChange', rs)
|
|
419
417
|
// console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
|
|
@@ -814,7 +812,10 @@ export default {
|
|
|
814
812
|
vo.bShow = false
|
|
815
813
|
|
|
816
814
|
})
|
|
817
|
-
.catch(() => {
|
|
815
|
+
.catch((err) => {
|
|
816
|
+
console.log('doSave', err)
|
|
817
|
+
vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' }) //§5.1: 非預期例外須告知, 不靜默吞 (失敗時 .then 不執行→視窗不關)
|
|
818
|
+
})
|
|
818
819
|
.finally(() => {
|
|
819
820
|
|
|
820
821
|
//hide loading
|
|
@@ -198,7 +198,6 @@ export default {
|
|
|
198
198
|
|
|
199
199
|
fullscreen: false,
|
|
200
200
|
|
|
201
|
-
panelWidth: 100,
|
|
202
201
|
panelHeight: 100,
|
|
203
202
|
headHeight: 100,
|
|
204
203
|
|
|
@@ -339,7 +338,6 @@ export default {
|
|
|
339
338
|
let vo = this
|
|
340
339
|
|
|
341
340
|
//panelWidth, panelHeight
|
|
342
|
-
vo.panelWidth = msg.panelWidth
|
|
343
341
|
vo.panelHeight = msg.contentHeightMax
|
|
344
342
|
|
|
345
343
|
},
|
|
@@ -411,9 +409,9 @@ export default {
|
|
|
411
409
|
'mode': 'text',
|
|
412
410
|
'enable': 'text',
|
|
413
411
|
},
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
412
|
+
kpHeadCheckBox: {
|
|
413
|
+
'name': true,
|
|
414
|
+
},
|
|
417
415
|
rowsChange: (rs) => {
|
|
418
416
|
// console.log('rowsChange', rs)
|
|
419
417
|
// console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
|
|
@@ -814,7 +812,10 @@ export default {
|
|
|
814
812
|
vo.bShow = false
|
|
815
813
|
|
|
816
814
|
})
|
|
817
|
-
.catch(() => {
|
|
815
|
+
.catch((err) => {
|
|
816
|
+
console.log('doSave', err)
|
|
817
|
+
vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' }) //§5.1: 非預期例外須告知, 不靜默吞 (失敗時 .then 不執行→視窗不關)
|
|
818
|
+
})
|
|
818
819
|
.finally(() => {
|
|
819
820
|
|
|
820
821
|
//hide loading
|
|
@@ -194,7 +194,6 @@ export default {
|
|
|
194
194
|
|
|
195
195
|
fullscreen: false,
|
|
196
196
|
|
|
197
|
-
panelWidth: 100,
|
|
198
197
|
panelHeight: 100,
|
|
199
198
|
headHeight: 100,
|
|
200
199
|
|
|
@@ -334,7 +333,6 @@ export default {
|
|
|
334
333
|
let vo = this
|
|
335
334
|
|
|
336
335
|
//panelWidth, panelHeight
|
|
337
|
-
vo.panelWidth = msg.panelWidth
|
|
338
336
|
vo.panelHeight = msg.contentHeightMax
|
|
339
337
|
|
|
340
338
|
},
|
|
@@ -401,9 +399,9 @@ export default {
|
|
|
401
399
|
'id': 'text',
|
|
402
400
|
'enable': 'text',
|
|
403
401
|
},
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
402
|
+
kpHeadCheckBox: {
|
|
403
|
+
'id': true,
|
|
404
|
+
},
|
|
407
405
|
rowsChange: (rs) => {
|
|
408
406
|
// console.log('rowsChange', rs)
|
|
409
407
|
// console.log('rowsChange cloneDeep(vo.opt.rows)', cloneDeep(vo.opt.rows))
|
|
@@ -749,7 +747,10 @@ export default {
|
|
|
749
747
|
vo.bShow = false
|
|
750
748
|
|
|
751
749
|
})
|
|
752
|
-
.catch(() => {
|
|
750
|
+
.catch((err) => {
|
|
751
|
+
console.log('doSave', err)
|
|
752
|
+
vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' }) //§5.1: 非預期例外須告知, 不靜默吞 (失敗時 .then 不執行→視窗不關)
|
|
753
|
+
})
|
|
753
754
|
.finally(() => {
|
|
754
755
|
|
|
755
756
|
//hide loading
|
|
@@ -225,7 +225,6 @@ export default {
|
|
|
225
225
|
|
|
226
226
|
fullscreen: false,
|
|
227
227
|
|
|
228
|
-
panelWidth: 100,
|
|
229
228
|
panelHeight: 100,
|
|
230
229
|
headHeight: 100,
|
|
231
230
|
|
|
@@ -374,7 +373,6 @@ export default {
|
|
|
374
373
|
let vo = this
|
|
375
374
|
|
|
376
375
|
//panelWidth, panelHeight
|
|
377
|
-
vo.panelWidth = msg.panelWidth
|
|
378
376
|
vo.panelHeight = msg.contentHeightMax
|
|
379
377
|
|
|
380
378
|
},
|
|
@@ -960,30 +958,19 @@ export default {
|
|
|
960
958
|
|
|
961
959
|
let vo = this
|
|
962
960
|
|
|
963
|
-
//
|
|
964
|
-
let
|
|
965
|
-
|
|
966
|
-
//check
|
|
967
|
-
if (size(rows) === 0) {
|
|
968
|
-
vo.$ui.updateLoading(false) //showCheckYes 前關 loading(modal 阻斷、避免 clickSave 包裝層 loading 疊在 modal 後)
|
|
969
|
-
await vo.$dg.showCheckYes(`${vo.$t('userSaveUsersEmpty')}`)
|
|
970
|
-
return
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
//updateUsers
|
|
961
|
+
//3) updateUsers, 各自 catch + okX 旗標短路 (canonical 五段結構; 空清單檢查已上移至 doSave core())
|
|
962
|
+
let okSave = false
|
|
974
963
|
await vo.$fapi.updateUsers(rows)
|
|
975
|
-
.
|
|
976
|
-
|
|
964
|
+
.then(() => { okSave = true })
|
|
965
|
+
.catch(async (err) => {
|
|
966
|
+
vo.$ui.updateLoading(false) //showCheckYes 前關 loading(modal 阻斷期間避免 loading 疊在底下)
|
|
967
|
+
await vo.$dg.showCheckYes(`${vo.$t('userSaveUsersFail')}: ${vo.$tErr(err)}`)
|
|
977
968
|
})
|
|
978
|
-
|
|
979
|
-
//check
|
|
980
|
-
if (errTemp !== null) {
|
|
981
|
-
vo.$ui.updateLoading(false)
|
|
982
|
-
await vo.$dg.showCheckYes(`${vo.$t('userSaveUsersFail')}: ${vo.$tErr(errTemp)}`)
|
|
969
|
+
if (!okSave) {
|
|
983
970
|
return
|
|
984
971
|
}
|
|
985
972
|
|
|
986
|
-
//alert
|
|
973
|
+
//alert(showCheckYes 前關 loading,避免 modal 等待期間 loading 疊在底下)
|
|
987
974
|
vo.$ui.updateLoading(false)
|
|
988
975
|
await vo.$dg.showCheckYes(vo.$t('userSaveUsersSuccess'), { type: 'success' })
|
|
989
976
|
|
|
@@ -1023,16 +1010,20 @@ export default {
|
|
|
1023
1010
|
|
|
1024
1011
|
async function core() {
|
|
1025
1012
|
|
|
1026
|
-
//
|
|
1013
|
+
//1) 事先檢測 (所有同步檢查在開 loading 之前, 空清單不應先閃 loading)
|
|
1014
|
+
let rows = get(vo, 'opt.rows', [])
|
|
1015
|
+
// console.log('rows', rows)
|
|
1016
|
+
if (size(rows) === 0) {
|
|
1017
|
+
await vo.$dg.showCheckYes(`${vo.$t('userSaveUsersEmpty')}`)
|
|
1018
|
+
return
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
//2) 確定打 API 才開 loading
|
|
1027
1022
|
vo.$ui.updateLoading(true)
|
|
1028
1023
|
|
|
1029
1024
|
//delay
|
|
1030
1025
|
await delay(300)
|
|
1031
1026
|
|
|
1032
|
-
//rows
|
|
1033
|
-
let rows = get(vo, 'opt.rows', [])
|
|
1034
|
-
// console.log('rows', rows)
|
|
1035
|
-
|
|
1036
1027
|
//users
|
|
1037
1028
|
let users = cloneDeep(vo.users)
|
|
1038
1029
|
// console.log('users', users)
|
|
@@ -1099,7 +1090,10 @@ export default {
|
|
|
1099
1090
|
vo.bShow = false
|
|
1100
1091
|
|
|
1101
1092
|
})
|
|
1102
|
-
.catch(() => {
|
|
1093
|
+
.catch((err) => {
|
|
1094
|
+
console.log('doSave', err)
|
|
1095
|
+
vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' }) //§5.1: 非預期例外須告知, 不靜默吞 (失敗時 .then 不執行→視窗不關)
|
|
1096
|
+
})
|
|
1103
1097
|
.finally(() => {
|
|
1104
1098
|
|
|
1105
1099
|
//hide loading
|
|
@@ -225,7 +225,6 @@ export default {
|
|
|
225
225
|
|
|
226
226
|
fullscreen: false,
|
|
227
227
|
|
|
228
|
-
panelWidth: 100,
|
|
229
228
|
panelHeight: 100,
|
|
230
229
|
headHeight: 100,
|
|
231
230
|
|
|
@@ -374,7 +373,6 @@ export default {
|
|
|
374
373
|
let vo = this
|
|
375
374
|
|
|
376
375
|
//panelWidth, panelHeight
|
|
377
|
-
vo.panelWidth = msg.panelWidth
|
|
378
376
|
vo.panelHeight = msg.contentHeightMax
|
|
379
377
|
|
|
380
378
|
},
|
|
@@ -960,30 +958,19 @@ export default {
|
|
|
960
958
|
|
|
961
959
|
let vo = this
|
|
962
960
|
|
|
963
|
-
//
|
|
964
|
-
let
|
|
965
|
-
|
|
966
|
-
//check
|
|
967
|
-
if (size(rows) === 0) {
|
|
968
|
-
vo.$ui.updateLoading(false) //showCheckYes 前關 loading(modal 阻斷、避免 clickSave 包裝層 loading 疊在 modal 後)
|
|
969
|
-
await vo.$dg.showCheckYes(`${vo.$t('grupSaveGrupsEmpty')}`)
|
|
970
|
-
return
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
//updateGrups
|
|
961
|
+
//3) updateGrups, 各自 catch + okX 旗標短路 (canonical 五段結構; 空清單檢查已上移至 doSave core())
|
|
962
|
+
let okSave = false
|
|
974
963
|
await vo.$fapi.updateGrups(rows)
|
|
975
|
-
.
|
|
976
|
-
|
|
964
|
+
.then(() => { okSave = true })
|
|
965
|
+
.catch(async (err) => {
|
|
966
|
+
vo.$ui.updateLoading(false) //showCheckYes 前關 loading(modal 阻斷期間避免 loading 疊在底下)
|
|
967
|
+
await vo.$dg.showCheckYes(`${vo.$t('grupSaveGrupsFail')}: ${vo.$tErr(err)}`)
|
|
977
968
|
})
|
|
978
|
-
|
|
979
|
-
//check
|
|
980
|
-
if (errTemp !== null) {
|
|
981
|
-
vo.$ui.updateLoading(false)
|
|
982
|
-
await vo.$dg.showCheckYes(`${vo.$t('grupSaveGrupsFail')}: ${vo.$tErr(errTemp)}`)
|
|
969
|
+
if (!okSave) {
|
|
983
970
|
return
|
|
984
971
|
}
|
|
985
972
|
|
|
986
|
-
//alert
|
|
973
|
+
//alert(showCheckYes 前關 loading,避免 modal 等待期間 loading 疊在底下)
|
|
987
974
|
vo.$ui.updateLoading(false)
|
|
988
975
|
await vo.$dg.showCheckYes(vo.$t('grupSaveGrupsSuccess'), { type: 'success' })
|
|
989
976
|
|
|
@@ -1023,16 +1010,20 @@ export default {
|
|
|
1023
1010
|
|
|
1024
1011
|
async function core() {
|
|
1025
1012
|
|
|
1026
|
-
//
|
|
1013
|
+
//1) 事先檢測 (所有同步檢查在開 loading 之前, 空清單不應先閃 loading)
|
|
1014
|
+
let rows = get(vo, 'opt.rows', [])
|
|
1015
|
+
// console.log('rows', rows)
|
|
1016
|
+
if (size(rows) === 0) {
|
|
1017
|
+
await vo.$dg.showCheckYes(`${vo.$t('grupSaveGrupsEmpty')}`)
|
|
1018
|
+
return
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
//2) 確定打 API 才開 loading
|
|
1027
1022
|
vo.$ui.updateLoading(true)
|
|
1028
1023
|
|
|
1029
1024
|
//delay
|
|
1030
1025
|
await delay(300)
|
|
1031
1026
|
|
|
1032
|
-
//rows
|
|
1033
|
-
let rows = get(vo, 'opt.rows', [])
|
|
1034
|
-
// console.log('rows', rows)
|
|
1035
|
-
|
|
1036
1027
|
//grups
|
|
1037
1028
|
let grups = cloneDeep(vo.grups)
|
|
1038
1029
|
// console.log('grups', grups)
|
|
@@ -1099,7 +1090,10 @@ export default {
|
|
|
1099
1090
|
vo.bShow = false
|
|
1100
1091
|
|
|
1101
1092
|
})
|
|
1102
|
-
.catch(() => {
|
|
1093
|
+
.catch((err) => {
|
|
1094
|
+
console.log('doSave', err)
|
|
1095
|
+
vo.$alert(vo.$t('anUnexpectedErrorOccurred'), { type: 'error' }) //§5.1: 非預期例外須告知, 不靜默吞 (失敗時 .then 不執行→視窗不關)
|
|
1096
|
+
})
|
|
1103
1097
|
.finally(() => {
|
|
1104
1098
|
|
|
1105
1099
|
//hide loading
|
package/src/main.js
CHANGED
|
@@ -2,13 +2,10 @@ import Vue from 'vue'
|
|
|
2
2
|
import get from 'lodash-es/get.js'
|
|
3
3
|
import WServHapiClient from 'w-serv-hapi/src/WServHapiClient.mjs'
|
|
4
4
|
import WAlert from 'w-component-vue/src/components/WAlert.mjs'
|
|
5
|
-
import domMutation from 'w-component-vue/src/js/domMutation.mjs'
|
|
6
5
|
import domResize from 'w-component-vue/src/js/domResize.mjs'
|
|
7
|
-
import domDragDrop from 'w-component-vue/src/js/domDragDrop.mjs'
|
|
8
6
|
import App from './App.vue'
|
|
9
7
|
import store from './store/index.mjs'
|
|
10
8
|
import ui from './plugins/mUI.mjs'
|
|
11
|
-
import mDataSelectorSchema from './plugins/mDataSelectorSchema.mjs'
|
|
12
9
|
import * as s from './plugins/mShare.mjs'
|
|
13
10
|
import ds from './schema/index.mjs'
|
|
14
11
|
// console.log('ds', ds)
|
|
@@ -26,22 +23,16 @@ Vue.prototype.$alert = function() {
|
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
25
|
|
|
29
|
-
//dssm
|
|
30
|
-
let dssm = mDataSelectorSchema(ds)
|
|
31
|
-
|
|
32
26
|
//prototype
|
|
33
27
|
Vue.prototype.$ui = ui
|
|
34
28
|
Vue.prototype.$t = ui.getKpText
|
|
35
29
|
Vue.prototype.$tErr = ui.tErr
|
|
36
30
|
Vue.prototype.$s = s
|
|
37
|
-
Vue.prototype.$dssm = dssm
|
|
38
31
|
Vue.prototype.$ds = ds
|
|
39
32
|
Vue.prototype.$dg = {}
|
|
40
33
|
|
|
41
34
|
//directive
|
|
42
35
|
Vue.directive('domresize', domResize())
|
|
43
|
-
Vue.directive('dommutation', domMutation())
|
|
44
|
-
Vue.directive('domdragdrop', domDragDrop())
|
|
45
36
|
|
|
46
37
|
//WServHapiClient
|
|
47
38
|
// let bFirstSync = false //不需要bFirstSync, 由getWebInfor結束代表第1次完成同步
|
|
@@ -76,6 +67,9 @@ WServHapiClient({
|
|
|
76
67
|
})
|
|
77
68
|
.catch((err) => {
|
|
78
69
|
console.log(err)
|
|
70
|
+
//getWebInfor 失敗時, connState 已為 csLogin 但 webInfor 為空 → ready 永遠為 false 會永久卡「已登入」轉圈畫面.
|
|
71
|
+
//改落到 csErrConn, 讓 LayoutState 顯示「無法連線」狀態畫面 (使用者可見錯誤而非靜默卡死).
|
|
72
|
+
ui.updateConnState('csErrConn')
|
|
79
73
|
})
|
|
80
74
|
|
|
81
75
|
},
|
package/src/perm.mjs
CHANGED
|
@@ -23,12 +23,11 @@ function perm() {
|
|
|
23
23
|
if (!isestr(url)) {
|
|
24
24
|
throw new Error(`invalid url`)
|
|
25
25
|
}
|
|
26
|
-
if (url.indexOf('token=')
|
|
26
|
+
if (url.indexOf('token=') < 0) {
|
|
27
27
|
throw new Error(`url does not include 'token='`)
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
29
|
+
//註: conn() 為通用連線, getPerm 之 url 僅含 token=、getPermUserInfor 才含 userId=,
|
|
30
|
+
//故此處不強制 userId=(端點專屬之 userId 驗證由後端對應 handler 負責)。
|
|
32
31
|
|
|
33
32
|
//permSuccess
|
|
34
33
|
let permSuccess = get(opt, 'permSuccess')
|
package/src/plugins/mUI.mjs
CHANGED
|
@@ -1,45 +1,11 @@
|
|
|
1
1
|
import Vue from 'vue'
|
|
2
|
-
import min from 'lodash-es/min.js'
|
|
3
|
-
import size from 'lodash-es/size.js'
|
|
4
|
-
import take from 'lodash-es/take.js'
|
|
5
|
-
import isEqual from 'lodash-es/isEqual.js'
|
|
6
|
-
import uniq from 'lodash-es/uniq.js'
|
|
7
|
-
import set from 'lodash-es/set.js'
|
|
8
2
|
import get from 'lodash-es/get.js'
|
|
9
3
|
import each from 'lodash-es/each.js'
|
|
10
|
-
import map from 'lodash-es/map.js'
|
|
11
|
-
import filter from 'lodash-es/filter.js'
|
|
12
|
-
import last from 'lodash-es/last.js'
|
|
13
|
-
import split from 'lodash-es/split.js'
|
|
14
|
-
import join from 'lodash-es/join.js'
|
|
15
|
-
import drop from 'lodash-es/drop.js'
|
|
16
|
-
import dropRight from 'lodash-es/dropRight.js'
|
|
17
|
-
import groupBy from 'lodash-es/groupBy.js'
|
|
18
|
-
import sortBy from 'lodash-es/sortBy.js'
|
|
19
4
|
import cloneDeep from 'lodash-es/cloneDeep.js'
|
|
20
|
-
import cint from 'wsemi/src/cint.mjs'
|
|
21
5
|
import delay from 'wsemi/src/delay.mjs'
|
|
22
|
-
import isarr from 'wsemi/src/isarr.mjs'
|
|
23
6
|
import isestr from 'wsemi/src/isestr.mjs'
|
|
24
7
|
import isfun from 'wsemi/src/isfun.mjs'
|
|
25
|
-
import isearr from 'wsemi/src/isearr.mjs'
|
|
26
|
-
import isEle from 'wsemi/src/isEle.mjs'
|
|
27
|
-
import strleft from 'wsemi/src/strleft.mjs'
|
|
28
|
-
import strdelleft from 'wsemi/src/strdelleft.mjs'
|
|
29
|
-
import sep from 'wsemi/src/sep.mjs'
|
|
30
|
-
import aes2str from 'wsemi/src/aes2str.mjs'
|
|
31
|
-
import str2aes from 'wsemi/src/str2aes.mjs'
|
|
32
|
-
import haskey from 'wsemi/src/haskey.mjs'
|
|
33
|
-
import genPm from 'wsemi/src/genPm.mjs'
|
|
34
|
-
import pmSeries from 'wsemi/src/pmSeries.mjs'
|
|
35
8
|
import waitFun from 'wsemi/src/waitFun.mjs'
|
|
36
|
-
import browserView from 'wsemi/src/browserView.mjs'
|
|
37
|
-
import arrHas from 'wsemi/src/arrHas.mjs'
|
|
38
|
-
import arrSort from 'wsemi/src/arrSort.mjs'
|
|
39
|
-
import arrInsert from 'wsemi/src/arrInsert.mjs'
|
|
40
|
-
import replace from 'wsemi/src/replace.mjs'
|
|
41
|
-
import timemsTZ2past from 'wsemi/src/timemsTZ2past.mjs'
|
|
42
|
-
import convertToTree from 'wsemi/src/convertToTree.mjs'
|
|
43
9
|
// import WUiDwload from 'w-ui-dwload/src/WUiDwload.mjs'
|
|
44
10
|
|
|
45
11
|
|
|
@@ -225,19 +191,6 @@ function tErr(err) {
|
|
|
225
191
|
}
|
|
226
192
|
|
|
227
193
|
|
|
228
|
-
function gv(o, k, cv = null) {
|
|
229
|
-
let r = get(o, k, '')
|
|
230
|
-
if (!isestr(r)) {
|
|
231
|
-
let def = getKpText('empty')
|
|
232
|
-
return def
|
|
233
|
-
}
|
|
234
|
-
if (isfun(cv)) {
|
|
235
|
-
r = cv(r)
|
|
236
|
-
}
|
|
237
|
-
return r
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
|
|
241
194
|
function syncHeight() {
|
|
242
195
|
|
|
243
196
|
//heightToolbar
|
|
@@ -302,7 +255,6 @@ let mUI = {
|
|
|
302
255
|
getKpText,
|
|
303
256
|
tErr,
|
|
304
257
|
|
|
305
|
-
gv,
|
|
306
258
|
syncHeight,
|
|
307
259
|
|
|
308
260
|
// waitData,
|
package/src/store/mutations.mjs
CHANGED
|
@@ -74,12 +74,6 @@ export let mutations = {
|
|
|
74
74
|
state[msg.tableName] = msg.data
|
|
75
75
|
},
|
|
76
76
|
|
|
77
|
-
[types.UpdateData] (state, msg) {
|
|
78
|
-
//msg.path內為存取路徑, 需使用set處理
|
|
79
|
-
// console.log('UpdateData msg', msg)
|
|
80
|
-
set(state, msg.path, msg.data)
|
|
81
|
-
},
|
|
82
|
-
|
|
83
77
|
[types.UpdateHeightApp] (state, heightApp) {
|
|
84
78
|
state.heightApp = heightApp
|
|
85
79
|
},
|
|
@@ -92,10 +86,6 @@ export let mutations = {
|
|
|
92
86
|
state.heightToolbar = heightToolbar
|
|
93
87
|
},
|
|
94
88
|
|
|
95
|
-
[types.UpdateMenu] (state, menu) {
|
|
96
|
-
state.menu = menu
|
|
97
|
-
},
|
|
98
|
-
|
|
99
89
|
[types.UpdateUserToken] (state, userToken) {
|
|
100
90
|
state.userToken = userToken
|
|
101
91
|
},
|
package/src/store/types.mjs
CHANGED
|
@@ -6,10 +6,8 @@ export const UpdateSyncState = 'UpdateSyncState'
|
|
|
6
6
|
export const UpdateLoading = 'UpdateLoading'
|
|
7
7
|
// export const UpdateViewState = 'UpdateViewState'
|
|
8
8
|
export const UpdateTableData = 'UpdateTableData'
|
|
9
|
-
export const UpdateData = 'UpdateData'
|
|
10
9
|
export const UpdateHeightApp = 'UpdateHeightApp'
|
|
11
10
|
export const UpdateHeightAppEff = 'UpdateHeightAppEff'
|
|
12
11
|
export const UpdateHeightToolbar = 'UpdateHeightToolbar'
|
|
13
|
-
export const UpdateMenu = 'UpdateMenu'
|
|
14
12
|
export const UpdateUserToken = 'UpdateUserToken'
|
|
15
13
|
export const UpdateUserSelf = 'UpdateUserSelf'
|
package/tableTags.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"grups":"2026-
|
|
1
|
+
{"grups":"2026-07-11T17:38:16+08:00|oibw7P","pemis":"2026-07-11T17:38:16+08:00|cnWe25","targets":"2026-07-11T17:38:16+08:00|OChCfm","users":"2026-07-11T17:38:16+08:00|7oyfiw"}
|