w-web-api 1.0.52 → 1.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/_gh-pages-deploy/.nojekyll +0 -0
  2. package/_gh-pages-deploy/WWebApi.html +898 -0
  3. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  4. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  5. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  6. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  7. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  8. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  9. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  10. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  11. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  12. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  13. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  14. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  15. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  16. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  17. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  18. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  19. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  20. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  21. package/_gh-pages-deploy/index.html +84 -0
  22. package/_gh-pages-deploy/scripts/collapse.js +39 -0
  23. package/_gh-pages-deploy/scripts/commonNav.js +28 -0
  24. package/_gh-pages-deploy/scripts/linenumber.js +25 -0
  25. package/_gh-pages-deploy/scripts/nav.js +12 -0
  26. package/_gh-pages-deploy/scripts/polyfill.js +4 -0
  27. package/_gh-pages-deploy/scripts/prettify/Apache-License-2.0.txt +202 -0
  28. package/_gh-pages-deploy/scripts/prettify/lang-css.js +2 -0
  29. package/_gh-pages-deploy/scripts/prettify/prettify.js +28 -0
  30. package/_gh-pages-deploy/scripts/search.js +99 -0
  31. package/{docs/WWebApi.mjs.html → _gh-pages-deploy/server_WWebApi.mjs.html} +96 -39
  32. package/_gh-pages-deploy/src_components_Common_CheckYesNo.vue.html +187 -0
  33. package/_gh-pages-deploy/styles/jsdoc.css +776 -0
  34. package/_gh-pages-deploy/styles/prettify.css +80 -0
  35. package/dist/css/app.fe69497a.css +1 -0
  36. package/dist/index.tmp +4 -2
  37. package/dist/js/app-legacy.15819aa7.js +1 -0
  38. package/dist/js/app.15819aa7.js +1 -0
  39. package/dist/js/chunk-vendors-legacy.c1a32dd1.js +15 -0
  40. package/dist/js/chunk-vendors.c1a32dd1.js +15 -0
  41. package/dist/w-web-api.umd.js +2 -2
  42. package/dist/w-web-api.umd.js.map +1 -1
  43. package/docs/WWebApi.html +2 -2
  44. package/docs/index.html +1 -1
  45. package/docs/server_WWebApi.mjs.html +1012 -0
  46. package/docs/src_components_Common_CheckYesNo.vue.html +187 -0
  47. package/g.getSettings.mjs +3 -0
  48. package/package.json +15 -11
  49. package/public/index.html +9 -2
  50. package/server/WWebApi.mjs +93 -36
  51. package/server/procApis.mjs +62 -0
  52. package/server/procLang.mjs +386 -0
  53. package/server/procProxy.mjs +120 -0
  54. package/server/srLog.mjs +30 -0
  55. package/server/staLogs/staEvent.mjs +129 -0
  56. package/server/staLogs/test_staEvent.mjs +132 -0
  57. package/settings.json +14 -0
  58. package/src/App.vue +11 -7
  59. package/src/assets/scalar-ui.css +113 -0
  60. package/src/components/Common/CheckYes.vue +102 -0
  61. package/src/components/Common/CheckYesNo.vue +115 -0
  62. package/src/components/Common/LoadingWinBar.vue +114 -0
  63. package/src/components/Layout.vue +8 -7
  64. package/src/components/LayoutContent.vue +308 -333
  65. package/src/components/LayoutContentEdit.vue +577 -0
  66. package/src/components/LayoutContentStats.vue +485 -0
  67. package/src/components/LayoutContentTest.vue +799 -0
  68. package/src/components/MdPanel.vue +80 -58
  69. package/src/main.js +8 -0
  70. package/src/plugins/mUI.mjs +19 -4
  71. package/src/schema/tables/apis.mjs +30 -0
  72. package/srv.mjs +47 -19
  73. package/tableTags.json +1 -1
  74. package/.github/workflows/ci-test.yml +0 -24
  75. package/.vscode/launch.json +0 -18
  76. package/db/wapis/apis/data.mdb +0 -0
  77. package/db/wapis/apis/lock.mdb +0 -0
  78. package/dist/css/app.b5cf2ef5.css +0 -1
  79. package/dist/js/app-legacy.927b5679.js +0 -1
  80. package/dist/js/app.927b5679.js +0 -1
  81. package/dist/js/chunk-vendors-legacy.ffb0c6c5.js +0 -13
  82. package/dist/js/chunk-vendors.ffb0c6c5.js +0 -13
  83. package/tableTags-web-api.json +0 -1
  84. package/test/all.test.mjs +0 -10
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
 
5
5
  <meta charset="utf-8">
6
- <title>WWebApi.mjs - Documentation</title>
6
+ <title>server/WWebApi.mjs - Documentation</title>
7
7
 
8
8
 
9
9
  <script src="scripts/prettify/prettify.js"></script>
@@ -35,7 +35,7 @@
35
35
 
36
36
  <div id="main">
37
37
 
38
- <h1 class="page-title">WWebApi.mjs</h1>
38
+ <h1 class="page-title">server/WWebApi.mjs</h1>
39
39
 
40
40
 
41
41
 
@@ -73,6 +73,10 @@ import replace from 'wsemi/src/replace.mjs'
73
73
  import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
74
74
  import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
75
75
  import procLang from './procLang.mjs'
76
+ import procProxy from './procProxy.mjs'
77
+ import procApis from './procApis.mjs'
78
+ import staEvent from './staLogs/staEvent.mjs'
79
+ import srLogInit from './srLog.mjs'
76
80
  import ds from '../src/schema/index.mjs'
77
81
 
78
82
 
@@ -273,6 +277,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
273
277
  //params
274
278
  let showLanguage = get(opt, 'showLanguage', 'y')
275
279
  let language = get(opt, 'language', 'eng')
280
+ let logFd = get(opt, 'logFd', './_logs') //srLog 寫入 + staEvent 統計共用之 log 資料夾
276
281
 
277
282
 
278
283
  //kpLangExt
@@ -299,6 +304,35 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
299
304
  let { woItems, procOrm } = wp
300
305
 
301
306
 
307
+ //srLog(後端 log;錯誤一律 log err-key 供識別,對齊 w-web-sso)
308
+ let srLog = srLogInit(opt)
309
+
310
+ //kpFunExt 邊界統一處理:成功記 info(供 staEvent 統計呼叫頻率);catch 後端錯誤 → srLog 該 err-key →
311
+ //原樣 re-reject(前端依 key 查自己 lang 顯示)。event 統一加 'kpfun-' 前綴 → 專用事件、與 api/verifyConn 區分。
312
+ let wrapErrLog = (event, fn) => {
313
+ let ev = 'kpfun-' + event
314
+ return async (...args) => {
315
+ try {
316
+ let result = await fn(...args)
317
+ srLog.info({ event: ev }) //成功也記 info
318
+ return result
319
+ }
320
+ catch (err) {
321
+ srLog.error({ event: ev, err })
322
+ return Promise.reject(err)
323
+ }
324
+ }
325
+ }
326
+
327
+
328
+ //procProxy
329
+ let { proxyRequest } = procProxy({ srLog })
330
+
331
+
332
+ //procApis
333
+ let { getApisList, saveApi, deleteApi } = procApis({ woItems, procOrm, ds })
334
+
335
+
302
336
  //getWebInfor
303
337
  let getWebInfor = (userId) => {
304
338
  return {
@@ -321,26 +355,26 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
321
355
  if (!isestr(id)) {
322
356
  console.log('user', user)
323
357
  console.log('can not get the userId')
324
- return Promise.reject(`can not get the userId`)
358
+ return Promise.reject('errUserIdMissing')
325
359
  }
326
360
  let email = get(user, 'email', '')
327
361
  if (!isestr(email)) {
328
362
  console.log('user', user)
329
363
  console.log('can not get the email of user')
330
- return Promise.reject(`can not get the email of user`)
364
+ return Promise.reject('errUserEmailMissing')
331
365
  }
332
366
  let name = get(user, 'name', '')
333
367
  if (!isestr(name)) {
334
368
  console.log('user', user)
335
369
  console.log('can not get userName')
336
- return Promise.reject(`can not get userName`)
370
+ return Promise.reject('errUserNameMissing')
337
371
  }
338
372
  let isAdmin = get(user, 'isAdmin', '')
339
373
  if (isAdmin !== 'y' &amp;&amp; isAdmin !== 'n') {
340
374
  console.log('user', user)
341
375
  console.log('user.isAdmin is not y or n', user.isAdmin)
342
376
  console.log('can not get the role of user')
343
- return Promise.reject(`can not get the role of user`)
377
+ return Promise.reject('errUserRoleMissing')
344
378
  }
345
379
  return true
346
380
  }
@@ -360,7 +394,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
360
394
  // if (!iseobj(userSelf)) {
361
395
  // console.log(`token`, token)
362
396
  // console.log(`can not find the user from token`)
363
- // return Promise.reject(`can not find the user from token`)
397
+ // return Promise.reject('errUserNotFound')
364
398
  // }
365
399
  await checkUser(userSelf)
366
400
  }
@@ -402,9 +436,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
402
436
  if (!b) {
403
437
  console.log('user', user)
404
438
  console.log(`user does not have permission`)
405
- return Promise.reject(`user does not have permission`)
439
+ return Promise.reject('errUserNoPermission')
406
440
  }
407
441
 
442
+ srLog.info({ event: 'verifyClientUser', from, userId: get(user, 'id', '') }) //瀏覽使用者驗證通過
408
443
  return user
409
444
  }
410
445
 
@@ -427,7 +462,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
427
462
  if (!iseobj(user)) {
428
463
  console.log(`token`, token)
429
464
  console.log(`can not find the user from token`)
430
- return Promise.reject(`can not find the user from token`)
465
+ return Promise.reject('errUserNotFound')
431
466
  }
432
467
 
433
468
  //verifyAppUser
@@ -440,9 +475,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
440
475
  if (!b) {
441
476
  console.log('user', user)
442
477
  console.log(`user does not have permission`)
443
- return Promise.reject(`user does not have permission`)
478
+ return Promise.reject('errUserNoPermission')
444
479
  }
445
480
 
481
+ srLog.info({ event: 'verifyAppUser', from, userId: get(user, 'id', '') }) //應用程式使用者驗證通過
446
482
  return user
447
483
  }
448
484
 
@@ -469,7 +505,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
469
505
  if (!iseobj(payload)) {
470
506
  console.log('payload', payload)
471
507
  console.log(`invalid payload in req`)
472
- return Promise.reject(`invalid payload in req`)
508
+ return Promise.reject('errPayloadInvalid')
473
509
  }
474
510
 
475
511
  //group
@@ -479,7 +515,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
479
515
  if (!isestr(group)) {
480
516
  console.log('payload', payload)
481
517
  console.log(`invalid group in payload`)
482
- return Promise.reject(`invalid group in payload`)
518
+ return Promise.reject('errGroupInvalid')
483
519
  }
484
520
 
485
521
  //rows
@@ -489,7 +525,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
489
525
  if (!isearr(rows)) {
490
526
  console.log('payload', payload)
491
527
  console.log(`invalid rows in payload`)
492
- return Promise.reject(`invalid rows in payload`)
528
+ return Promise.reject('errRowsInvalid')
493
529
  }
494
530
 
495
531
  //r
@@ -529,7 +565,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
529
565
  console.log('inp', inp)
530
566
  console.log('group', group)
531
567
  console.log(`invalid group`)
532
- return Promise.reject(`invalid group`)
568
+ return Promise.reject('errGroupInvalid')
533
569
  }
534
570
 
535
571
  //rows
@@ -540,7 +576,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
540
576
  if (!isearr(rows)) {
541
577
  console.log('inp', inp)
542
578
  console.log('keyTable', keyTable)
543
- return Promise.reject(`invalid rows`)
579
+ return Promise.reject('errRowsInvalid')
544
580
  }
545
581
 
546
582
  //save from
@@ -611,6 +647,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
611
647
  c = replace(c, '/mapi/', '{sfd}/') //方法同genEntry
612
648
  c = replace(c, '{sfd}', subfolder)
613
649
  c = replace(c, '{urlRedirect}', urlRedirect)
650
+ c = replace(c, '{language}', language) //注入初始語系 → window.___pmwperm___.language(前端 getLang 之來源之一)
614
651
  fs.writeFileSync(fpEntryOut, c, 'utf8')
615
652
  }
616
653
  catch (err) {
@@ -639,7 +676,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
639
676
  console.log('token', token)
640
677
  console.log('[API]getUserByToken/check token: invalid token')
641
678
  console.log(`token does not have permission`)
642
- return Promise.reject(`token does not have permission`)
679
+ return Promise.reject('errTokenNoPermission')
643
680
  }
644
681
 
645
682
  //getAndVerifyClientUser
@@ -650,9 +687,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
650
687
  console.log('token', token)
651
688
  console.log('[API]getUserByToken/check user: invalid user')
652
689
  console.log(`token does not have permission`)
653
- return Promise.reject(`token does not have permission`)
690
+ return Promise.reject('errTokenNoPermission')
654
691
  }
655
692
 
693
+ srLog.info({ event: 'api/getUserByToken', userId: get(user, 'id', '') })
656
694
  return user
657
695
  }
658
696
 
@@ -684,7 +722,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
684
722
  // console.log('token', token)
685
723
  // console.log('[API]getAPIsList/check token: invalid token')
686
724
  // console.log(`token does not have permission`)
687
- // return Promise.reject(`token does not have permission`)
725
+ // return Promise.reject('errTokenNoPermission')
688
726
  // }
689
727
 
690
728
  // //getAndVerifyClientUser
@@ -695,7 +733,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
695
733
  // console.log('token', token)
696
734
  // console.log('[API]getAPIsList/check user: invalid user')
697
735
  // console.log(`token does not have permission`)
698
- // return Promise.reject(`token does not have permission`)
736
+ // return Promise.reject('errTokenNoPermission')
699
737
  // }
700
738
 
701
739
  // //getAPIsList
@@ -733,7 +771,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
733
771
  // console.log('token', token)
734
772
  // console.log('[API]updateAPIs/check token: invalid token')
735
773
  // console.log(`token does not have permission`)
736
- // return Promise.reject(`token does not have permission`)
774
+ // return Promise.reject('errTokenNoPermission')
737
775
  // }
738
776
 
739
777
  // //getAndVerifyClientUser
@@ -744,7 +782,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
744
782
  // console.log('token', token)
745
783
  // console.log('[API]updateAPIs/check user: invalid user')
746
784
  // console.log(`token does not have permission`)
747
- // return Promise.reject(`token does not have permission`)
785
+ // return Promise.reject('errTokenNoPermission')
748
786
  // }
749
787
 
750
788
  // //parsePayload
@@ -785,7 +823,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
785
823
  console.log('token', token)
786
824
  console.log('[API]syncAndReplaceTabs/check token: invalid token')
787
825
  console.log(`token does not have permission`)
788
- return Promise.reject(`token does not have permission`)
826
+ return Promise.reject('errTokenNoPermission')
789
827
  }
790
828
 
791
829
  //keyTable
@@ -797,14 +835,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
797
835
  console.log('keyTable', keyTable)
798
836
  console.log('[API]syncAndReplaceTabs/check keyTable: invalid keyTable')
799
837
  console.log(`token does not have permission`)
800
- return Promise.reject(`token does not have permission`)
838
+ return Promise.reject('errTokenNoPermission')
801
839
  }
802
840
 
803
841
  //check keyTable
804
842
  let allowedTables = ['apis']
805
843
  if (!allowedTables.includes(keyTable)) {
806
844
  console.log('[API]syncAndReplaceTabs/check keyTable: unexpected keyTable', keyTable)
807
- return Promise.reject(`invalid keyTable: ${keyTable}`)
845
+ return Promise.reject('errKeyTableInvalid')
808
846
  }
809
847
 
810
848
  //getAndVerifyAppUser
@@ -815,7 +853,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
815
853
  console.log('token', token)
816
854
  console.log('[API]syncAndReplaceTabs/check user: invalid user')
817
855
  console.log(`token does not have permission`)
818
- return Promise.reject(`token does not have permission`)
856
+ return Promise.reject('errTokenNoPermission')
819
857
  }
820
858
 
821
859
  //userId
@@ -827,7 +865,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
827
865
  console.log('user', user)
828
866
  console.log('[API]syncAndReplaceTabs/check userId: invalid userId')
829
867
  console.log(`token does not have permission`)
830
- return Promise.reject(`token does not have permission`)
868
+ return Promise.reject('errTokenNoPermission')
831
869
  }
832
870
 
833
871
  //parsePayload
@@ -836,6 +874,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
836
874
  //syncAndReplaceTabs
837
875
  let r = await syncAndReplaceTabs(userId, inp, keyTable)
838
876
 
877
+ srLog.info({ event: 'api/syncAndReplaceTabs', userId, keyTable })
839
878
  return r
840
879
  }
841
880
 
@@ -887,19 +926,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
887
926
  let b = await p.checkToken(token)
888
927
  // console.log('b', b)
889
928
 
929
+ srLog.info({ event: 'verifyConn', apiType }) //連線驗證通過(checkToken 失敗時會 throw 不到此)
890
930
  return b
891
931
  },
892
932
  getUserIdByToken: async (token) => { //可使用async或sync函數
893
933
  // console.log('getUserIdByToken', token)
894
- return ''
895
- // let user = await getUserByToken(token) //api儲存時須使用
896
- // let userId = get(user, 'id', '')
897
- // if (!isestr(userId)) {
898
- // console.log('token', token)
899
- // console.log('userId', userId)
900
- // return Promise.reject(`can not find user.id`)
901
- // }
902
- // return userId
934
+ if (!isestr(token)) {
935
+ return ''
936
+ }
937
+ let user = await getUserByToken(token)
938
+ let userId = get(user, 'id', '')
939
+ return userId
903
940
  },
904
941
  useDbOrm: true,
905
942
  kpOrm: woItems,
@@ -907,9 +944,29 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
907
944
  tableNamesExec,
908
945
  methodsExec: ['select', 'insert', 'save', 'del'], //mix需於procOrm內註冊以提供
909
946
  tableNamesSync,
910
- kpFunExt: { //接收參數第1個為userId, 之後才是前端給予參數
911
-
912
- getWebInfor,
947
+ kpFunExt: { //接收參數第1個為userId, 之後才是前端給予參數(皆經 wrapErrLog:錯誤 srLog err-key 後 re-reject)
948
+
949
+ getWebInfor: wrapErrLog('getWebInfor', getWebInfor),
950
+
951
+ proxyRequest: wrapErrLog('proxyRequest', (userId, reqSpec) => {
952
+ return proxyRequest(reqSpec)
953
+ }),
954
+
955
+ getApisList: wrapErrLog('getApisList', (userId) => {
956
+ return getApisList(userId)
957
+ }),
958
+ saveApi: wrapErrLog('saveApi', (userId, row) => {
959
+ return saveApi(userId, row)
960
+ }),
961
+ deleteApi: wrapErrLog('deleteApi', (userId, id) => {
962
+ return deleteApi(userId, id)
963
+ }),
964
+
965
+ //統計資訊頁:回傳各 event 之時段發生頻率(讀 logFd 之 log)。連線已由 verifyClientUser 限管理員,
966
+ //故此處不另檢查(同 getApisList)。timeLength 天數 / timeInterval 'hr'|'day'。
967
+ getStaEvent: wrapErrLog('getStaEvent', (userId, timeLength = 7, timeInterval = 'hr') => {
968
+ return staEvent(timeLength, timeInterval, { fdLog: logFd })
969
+ }),
913
970
 
914
971
  // getAPIsList: (userId, query = {}) => { //待提供api管理系統界面使用
915
972
  // return getAPIsList(query)
@@ -942,7 +999,7 @@ export default WWebApi
942
999
  <br class="clear">
943
1000
 
944
1001
  <footer>
945
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Sat Mar 28 2026 23:43:26 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1002
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Jun 22 2026 15:42:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
946
1003
  </footer>
947
1004
 
948
1005
  <script>prettyPrint();</script>
@@ -0,0 +1,187 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>src/components/Common/CheckYesNo.vue - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WWebApi.html">WWebApi</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">src/components/Common/CheckYesNo.vue</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>&lt;template>
49
+ &lt;WConfirm
50
+ :show.sync="bShow"
51
+ :title="$t('systemMessage')"
52
+ :content="content"
53
+ :_contentColor="'white'"
54
+ :_contentIconColor="'white'"
55
+ :_contentBackgroundColor="'orange lighten-5'"
56
+ :_titleColor="'white'"
57
+ :headerBackgroundColor="'grey lighten-3'"
58
+ :noBtnText="$t('no')"
59
+ :yesBtnText="$t('yes')"
60
+ @click-no="clickBtn(false)"
61
+ @click-yes="clickBtn(true)"
62
+ >&lt;/WConfirm>
63
+ &lt;/template>
64
+
65
+ &lt;script>
66
+ import Vue from 'vue'
67
+ import genPm from 'wsemi/src/genPm.mjs'
68
+ import WConfirm from 'w-component-vue/src/components/WConfirm.vue'
69
+
70
+ export default {
71
+ components: {
72
+ WConfirm,
73
+ },
74
+ props: {
75
+ },
76
+ data: function() {
77
+ return {
78
+
79
+ bShow: false,
80
+ pm: null,
81
+
82
+ content: '',
83
+
84
+ }
85
+ },
86
+ mounted: function() {
87
+ //console.log('mounted')
88
+
89
+ let vo = this
90
+
91
+ //set
92
+ Vue.prototype.$dg.showCheckYesNo = vo.show
93
+
94
+ },
95
+ computed: {
96
+ },
97
+ methods: {
98
+
99
+ /**
100
+ * 顯示 Yes/No 確認對話框並回傳 Promise。
101
+ *
102
+ * **Contract** (caller 須遵守):
103
+ * - 使用者點 **Yes** → Promise `resolve()` (無值, 進 `.then()`)
104
+ * - 使用者點 **No** → Promise `reject('close')` (進 `.catch(err => err === 'close')`)
105
+ *
106
+ * 正確 caller pattern:
107
+ *
108
+ * vo.$dg.showCheckYesNo('確定要 X?')
109
+ * .then(() => {
110
+ * //使用者點 Yes
111
+ * doX()
112
+ * })
113
+ * .catch((err) => {
114
+ * //使用者點 No (err === 'close') 為正常路徑, 靜默處理
115
+ * if (err === 'close') return
116
+ * //非預期錯誤 (CheckYesNo 本身故障等)
117
+ * console.log('showCheckYesNo unexpected error', err)
118
+ * })
119
+ *
120
+ * @param {string} content - 顯示在 modal 中的訊息文字
121
+ * @returns {Promise&lt;void>} Yes → resolve(); No → reject('close')
122
+ */
123
+ show: function(content) {
124
+ //console.log('methods show', content)
125
+
126
+ let vo = this
127
+
128
+ //pm
129
+ vo.pm = genPm()
130
+
131
+ //save
132
+ vo.content = content
133
+
134
+ //show
135
+ vo.bShow = true
136
+
137
+ return vo.pm
138
+ },
139
+
140
+ clickBtn: function(mode) {
141
+ //console.log('methods clickBtn', mode)
142
+
143
+ let vo = this
144
+
145
+ if (mode) {
146
+ vo.pm.resolve()
147
+ }
148
+ else {
149
+ vo.pm.reject('close')
150
+ }
151
+
152
+ //hide
153
+ vo.bShow = false
154
+
155
+ },
156
+
157
+ }
158
+ }
159
+ &lt;/script>
160
+
161
+ &lt;style scoped>
162
+ &lt;/style>
163
+ </code></pre>
164
+ </article>
165
+ </section>
166
+
167
+
168
+
169
+
170
+
171
+
172
+ </div>
173
+
174
+ <br class="clear">
175
+
176
+ <footer>
177
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Jun 22 2026 15:42:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
178
+ </footer>
179
+
180
+ <script>prettyPrint();</script>
181
+ <script src="scripts/polyfill.js"></script>
182
+ <script src="scripts/linenumber.js"></script>
183
+
184
+
185
+
186
+ </body>
187
+ </html>