w-web-api 1.0.38 → 1.0.40

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 (43) hide show
  1. package/README.md +4 -4
  2. package/db/wapis/apis/data.mdb +0 -0
  3. package/db/wapis/apis/lock.mdb +0 -0
  4. package/dist/css/{app.99a58617.css → app.02bbf3c6.css} +1 -1
  5. package/dist/index.tmp +2 -2
  6. package/dist/js/app-legacy.d2226e7d.js +2 -0
  7. package/dist/js/app-legacy.d2226e7d.js.map +1 -0
  8. package/dist/js/app.d2226e7d.js +2 -0
  9. package/dist/js/app.d2226e7d.js.map +1 -0
  10. package/dist/js/{chunk-vendors.767ef893.js → chunk-vendors-legacy.10dbc55a.js} +3 -3
  11. package/dist/js/chunk-vendors-legacy.10dbc55a.js.map +1 -0
  12. package/dist/js/{chunk-vendors-legacy.767ef893.js → chunk-vendors.10dbc55a.js} +3 -3
  13. package/dist/js/chunk-vendors.10dbc55a.js.map +1 -0
  14. package/dist/w-web-api.umd.js +2 -2
  15. package/dist/w-web-api.umd.js.map +1 -1
  16. package/docs/WWebApi.html +6 -6
  17. package/docs/WWebApi.mjs.html +120 -34
  18. package/docs/index.html +1 -1
  19. package/g.getSettings.mjs +6 -4
  20. package/g.mOrm.mjs +2 -2
  21. package/package.json +7 -7
  22. package/public/index.html +1 -1
  23. package/script.txt +0 -1
  24. package/server/WWebApi.mjs +119 -33
  25. package/src/App.vue +25 -4
  26. package/src/components/Layout.vue +56 -26
  27. package/src/components/LayoutContent.vue +51 -37
  28. package/src/components/LayoutState.vue +20 -8
  29. package/src/main.js +17 -20
  30. package/src/plugins/mLang.mjs +250 -0
  31. package/src/plugins/mUI.mjs +140 -51
  32. package/src/schema/tables/apis.mjs +6 -8
  33. package/src/store/mutations.mjs +8 -102
  34. package/src/store/types.mjs +1 -1
  35. package/srv.mjs +6 -6
  36. package/tableTags.json +1 -1
  37. package/dist/js/app-legacy.f7e293ef.js +0 -2
  38. package/dist/js/app-legacy.f7e293ef.js.map +0 -1
  39. package/dist/js/app.f7e293ef.js +0 -2
  40. package/dist/js/app.f7e293ef.js.map +0 -1
  41. package/dist/js/chunk-vendors-legacy.767ef893.js.map +0 -1
  42. package/dist/js/chunk-vendors.767ef893.js.map +0 -1
  43. package/src/plugins/mDataSupport.mjs +0 -66
@@ -8,6 +8,7 @@ import iseobj from 'wsemi/src/iseobj.mjs'
8
8
  import isestr from 'wsemi/src/isestr.mjs'
9
9
  import isearr from 'wsemi/src/isearr.mjs'
10
10
  import ispint from 'wsemi/src/ispint.mjs'
11
+ import isErr from 'wsemi/src/isErr.mjs'
11
12
  import isfun from 'wsemi/src/isfun.mjs'
12
13
  import ispm from 'wsemi/src/ispm.mjs'
13
14
  import cint from 'wsemi/src/cint.mjs'
@@ -30,10 +31,10 @@ import ds from '../src/schema/index.mjs'
30
31
  *
31
32
  * @class
32
33
  * @param {Function} WOrm 輸入資料庫ORM函數
33
- * @param {String} url 輸入資料庫連線字串,例如'mongodb://sername:password@$127.0.0.1:27017'
34
+ * @param {String} url 輸入資料庫連線字串,例如w-orm-lmdb為'./db',或w-orm-mongodb為'mongodb://username:password@$127.0.0.1:27017'
34
35
  * @param {String} db 輸入資料庫名稱字串
35
36
  * @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
36
- * @param {Function} verifyBrowserUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
37
+ * @param {Function} verifyClientUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
37
38
  * @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
38
39
  * @param {Object} [opt={}] 輸入設定物件,預設{}
39
40
  * @param {Integer} [opt.serverPort=11005] 輸入伺服器通訊port,預設11005
@@ -48,7 +49,7 @@ import ds from '../src/schema/index.mjs'
48
49
  * @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
49
50
  * @example
50
51
  *
51
- * import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
52
+ * import WOrm from 'w-orm-lmdb/src/WOrmLmdb.mjs'
52
53
  * import WWebApi from './server/WWebApi.mjs'
53
54
  * import getSettings from './g.getSettings.mjs'
54
55
  *
@@ -56,7 +57,7 @@ import ds from '../src/schema/index.mjs'
56
57
  * //st
57
58
  * let st = getSettings()
58
59
  *
59
- * let url = `mongodb://${st.dbUsername}:${st.dbPassword}@${st.dbIP}:${st.dbPort}` //使用Mongodb測試
60
+ * let url = st.dbUrl
60
61
  * let db = st.dbName
61
62
  * let opt = {
62
63
  *
@@ -103,14 +104,14 @@ import ds from '../src/schema/index.mjs'
103
104
  * return {}
104
105
  * }
105
106
  *
106
- * let verifyBrowserUser = (user, caller) => {
107
- * console.log('verifyBrowserUser/user', user)
107
+ * let verifyClientUser = (user, from) => {
108
+ * console.log('verifyClientUser/user', user)
108
109
  * // return false //測試無法登入
109
110
  * console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
110
111
  * return user.isAdmin === 'y' //測試僅系統管理者使用
111
112
  * }
112
113
  *
113
- * let verifyAppUser = (user, caller) => {
114
+ * let verifyAppUser = (user, from) => {
114
115
  * console.log('verifyAppUser/user', user)
115
116
  * // return false //測試無法登入
116
117
  * console.log('於生產環境時得加入限制應用程式使用者身份機制')
@@ -118,14 +119,14 @@ import ds from '../src/schema/index.mjs'
118
119
  * }
119
120
  *
120
121
  * //WWebApi
121
- * let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt)
122
+ * let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser, opt)
122
123
  *
123
124
  * instWWebApi.on('error', (err) => {
124
125
  * console.log(err)
125
126
  * })
126
127
  *
127
128
  */
128
- function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser, opt = {}) {
129
+ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser, opt = {}) {
129
130
  let instWServHapiServer = null
130
131
 
131
132
 
@@ -157,10 +158,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
157
158
  }
158
159
 
159
160
 
160
- //check verifyBrowserUser
161
- if (!isfun(verifyBrowserUser)) {
162
- console.log('invalid verifyBrowserUser', verifyBrowserUser)
163
- throw new Error('invalid verifyBrowserUser')
161
+ //check verifyClientUser
162
+ if (!isfun(verifyClientUser)) {
163
+ console.log('invalid verifyClientUser', verifyClientUser)
164
+ throw new Error('invalid verifyClientUser')
164
165
  }
165
166
 
166
167
 
@@ -245,6 +246,37 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
245
246
  }
246
247
 
247
248
 
249
+ //checkUser
250
+ let checkUser = async(user) => {
251
+ let id = get(user, 'id', '')
252
+ if (!isestr(id)) {
253
+ console.log('user', user)
254
+ console.log('can not get the userId')
255
+ return Promise.reject(`can not get the userId`)
256
+ }
257
+ let email = get(user, 'email', '')
258
+ if (!isestr(email)) {
259
+ console.log('user', user)
260
+ console.log('can not get the email of user')
261
+ return Promise.reject(`can not get the email of user`)
262
+ }
263
+ let name = get(user, 'name', '')
264
+ if (!isestr(name)) {
265
+ console.log('user', user)
266
+ console.log('can not get userName')
267
+ return Promise.reject(`can not get userName`)
268
+ }
269
+ let isAdmin = get(user, 'isAdmin', '')
270
+ if (isAdmin !== 'y' && isAdmin !== 'n') {
271
+ console.log('user', user)
272
+ console.log('user.isAdmin is not y or n', user.isAdmin)
273
+ console.log('can not get the role of user')
274
+ return Promise.reject(`can not get the role of user`)
275
+ }
276
+ return true
277
+ }
278
+
279
+
248
280
  //getTokenUser
249
281
  let getTokenUser = async (token) => {
250
282
 
@@ -255,24 +287,43 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
255
287
  }
256
288
 
257
289
  //check
258
- if (!iseobj(userSelf)) {
259
- console.log(`token`, token)
260
- console.log(`can not find the user from token`)
261
- return Promise.reject(`can not find the user from token`)
290
+ if (true) {
291
+ // if (!iseobj(userSelf)) {
292
+ // console.log(`token`, token)
293
+ // console.log(`can not find the user from token`)
294
+ // return Promise.reject(`can not find the user from token`)
295
+ // }
296
+ await checkUser(userSelf)
262
297
  }
263
298
 
264
299
  return userSelf
265
300
  }
266
301
 
267
302
 
303
+ //p
304
+ let p = {
305
+ checkToken: async(token) => {
306
+
307
+ //getUserByToken
308
+ let u = await getUserByToken(token)
309
+ // console.log('u', u)
310
+
311
+ //checkUser
312
+ await checkUser(u)
313
+
314
+ return true
315
+ },
316
+ }
317
+
318
+
268
319
  //getAndVerifyBrowserTokenUser
269
- let getAndVerifyBrowserTokenUser = async (token, caller = '') => {
320
+ let getAndVerifyBrowserTokenUser = async (token, from = '') => {
270
321
 
271
322
  //getTokenUser
272
323
  let userSelf = await getTokenUser(token)
273
324
 
274
- //verifyBrowserUser
275
- let b = verifyBrowserUser(userSelf, caller)
325
+ //verifyClientUser
326
+ let b = verifyClientUser(userSelf, from)
276
327
  if (ispm(b)) {
277
328
  b = await b
278
329
  }
@@ -289,13 +340,13 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
289
340
 
290
341
 
291
342
  //getAndVerifyAppTokenUser
292
- let getAndVerifyAppTokenUser = async (token, caller = '') => {
343
+ let getAndVerifyAppTokenUser = async (token, from = '') => {
293
344
 
294
345
  //getTokenUser
295
346
  let userSelf = await getTokenUser(token)
296
347
 
297
348
  //verifyAppUser
298
- let b = verifyAppUser(userSelf, caller)
349
+ let b = verifyAppUser(userSelf, from)
299
350
  if (ispm(b)) {
300
351
  b = await b
301
352
  }
@@ -486,13 +537,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
486
537
  // return 'someAPI'
487
538
  // },
488
539
  // },
489
- {
490
- method: 'GET',
491
- path: '/getWebInfor',
492
- handler: async function (req, res) {
493
- return getWebInfor()
494
- },
495
- },
540
+
496
541
  {
497
542
  method: 'GET',
498
543
  path: '/api/getUserByToken', //未登入界面需先檢測token是否為系統管理員, 確認後回傳為系統管理員資訊物件, getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
@@ -520,6 +565,9 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
520
565
 
521
566
  //pm2resolve core
522
567
  let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 會提取state進行判斷
568
+ if (isErr(r.msg)) {
569
+ r.msg = r.msg.message
570
+ }
523
571
  // console.log('getUserByToken', r)
524
572
 
525
573
  return r
@@ -555,7 +603,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
555
603
 
556
604
  //pm2resolve core
557
605
  let r = await pm2resolve(core)()
558
- // console.log('verifyIdentity', r)
606
+ if (isErr(r.msg)) {
607
+ r.msg = r.msg.message
608
+ }
609
+ // console.log('getAPIsList', r)
559
610
 
560
611
  return r
561
612
  },
@@ -594,7 +645,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
594
645
 
595
646
  //pm2resolve core
596
647
  let r = await pm2resolve(core)()
597
- // console.log('verifyIdentity', r)
648
+ if (isErr(r.msg)) {
649
+ r.msg = r.msg.message
650
+ }
651
+ // console.log('updateAPIs', r)
598
652
 
599
653
  return r
600
654
  },
@@ -633,7 +687,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
633
687
 
634
688
  //pm2resolve core
635
689
  let r = await pm2resolve(core)()
636
- // console.log('verifyIdentity', r)
690
+ if (isErr(r.msg)) {
691
+ r.msg = r.msg.message
692
+ }
693
+ // console.log('syncAndReplaceApis', r)
637
694
 
638
695
  return r
639
696
  },
@@ -653,7 +710,30 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
653
710
  instWServHapiServer = new WServHapiServer({
654
711
  port: opt.serverPort,
655
712
  pathStaticFiles,
713
+ apiName: 'api',
656
714
  apis,
715
+ tokenType: 'Bearer',
716
+ verifyConn: async ({ apiType, authorization, query, headers, req }) => {
717
+ // console.log('verifyConn', `apiType[${apiType}]`, `authorization[${authorization}]`)
718
+
719
+ //token
720
+ let token = strdelleft(authorization, 7) //刪除Bearer
721
+ // console.log('token', token)
722
+
723
+ //check
724
+ if (!isestr(token)) {
725
+ console.log('apiType', apiType)
726
+ console.log('authorization', authorization)
727
+ console.log('invalid token')
728
+ return false
729
+ }
730
+
731
+ //checkToken
732
+ let b = await p.checkToken(token)
733
+ // console.log('b', b)
734
+
735
+ return b
736
+ },
657
737
  getUserIdByToken: async (token) => { //可使用async或sync函數
658
738
  // console.log('getUserIdByToken', token)
659
739
  return ''
@@ -673,11 +753,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
673
753
  methodsExec: ['select', 'insert', 'save', 'del'], //mix需於procOrm內註冊以提供
674
754
  tableNamesSync,
675
755
  kpFunExt: { //接收參數第1個為userId, 之後才是前端給予參數
756
+
676
757
  getWebInfor,
758
+
677
759
  getAPIsList: (userId, query = {}) => {
678
760
  return getAPIsList(query)
679
761
  },
680
- //...
762
+
763
+ // updateApis: (userId, rows) => {
764
+ // return updateApis(rows)
765
+ // },
766
+
681
767
  },
682
768
  fnTableTags: 'tableTags-web-api.json',
683
769
  })
package/src/App.vue CHANGED
@@ -10,6 +10,11 @@
10
10
  <Layout v-if="ready"></Layout>
11
11
  </transition>
12
12
 
13
+ <!--
14
+ <LoadingWinBar></LoadingWinBar>
15
+ <CheckYesNo></CheckYesNo>
16
+ <CheckYes></CheckYes> -->
17
+
13
18
  </div>
14
19
  </template>
15
20
 
@@ -17,6 +22,7 @@
17
22
  import get from 'lodash-es/get.js'
18
23
  import cloneDeep from 'lodash-es/cloneDeep.js'
19
24
  import isestr from 'wsemi/src/isestr.mjs'
25
+ import iseobj from 'wsemi/src/iseobj.mjs'
20
26
  import isDev from 'wsemi/src/isDev.mjs'
21
27
  import wui from 'w-ui-loginout/src/WUiLoginout.mjs'
22
28
  import Layout from './components/Layout.vue'
@@ -41,16 +47,21 @@ export default {
41
47
  //setVo, 更換ui內vo, 才能使用廣播技術, 更換語系才能用廣播通知全部組件forceUpdate
42
48
  vo.$ui.setVo(vo)
43
49
 
50
+ //setLang
51
+ let lang = get(window, '___pmwperm___.language', '')
52
+ vo.$ui.setLang(lang, 'app init') //初始化先讀取html內語系設定進行變更
53
+ // console.log('lang', lang)
54
+
44
55
  function loginSuccess(data) {
45
56
  console.log('login success', cloneDeep(data.user))
46
- vo.$ui.updateConnState('已連線')
57
+ vo.$ui.updateConnState('csLogin')
47
58
  vo.$ui.updateUserToken(data.token)
48
59
  vo.$ui.updateUserSelf(data.user)
49
60
  }
50
61
 
51
62
  function loginError(data) {
52
63
  console.log('login error', cloneDeep(data))
53
- vo.$ui.updateConnState(data.text)
64
+ vo.$ui.updateConnState('csErrLogin')
54
65
  vo.$ui.updateUserToken('')
55
66
  let urlRedirect = get(window, '___pmwapi___.urlRedirect', '')
56
67
  if (!isestr(urlRedirect)) {
@@ -86,8 +97,18 @@ export default {
86
97
  computed: {
87
98
 
88
99
  ready: function() {
89
- let connState = get(this, `$store.state.connState`)
90
- return connState === '已連線'
100
+ //console.log('computed ready')
101
+
102
+ let vo = this
103
+
104
+ let connState = get(vo, `$store.state.connState`)
105
+ let webInfor = get(vo, `$store.state.webInfor`)
106
+
107
+ let b1 = connState === 'csLogin'
108
+ let b2 = iseobj(webInfor)
109
+ let b = b1 && b2
110
+
111
+ return b
91
112
  },
92
113
 
93
114
  },
@@ -16,7 +16,7 @@
16
16
  <div style="display:flex; align-items:center;">
17
17
 
18
18
  <div style="padding-right:10px; display:flex; align-items:center;" v-if="webLogo">
19
- <img style="width:36px; height:36px;" :src="webLogo" />
19
+ <img style="width:36px; _min-width:36px; height:36px;" :src="webLogo" />
20
20
  </div>
21
21
 
22
22
  <div>
@@ -29,13 +29,23 @@
29
29
 
30
30
  <div style="width:100%;"></div>
31
31
 
32
- <div style="padding-right:10px; white-space:nowrap">
32
+ <div
33
+ style="padding-right:10px; white-space:nowrap;"
34
+ v-if="showLangSelect"
35
+ >
33
36
  <WTextSelect
34
37
  style="width:100px;"
35
- :items="tgLangs"
36
- v-model="tgLangSelect"
37
- @input="changeLang"
38
- ></WTextSelect>
38
+ :items="keysLang"
39
+ :value="lang"
40
+ @input="toggleLang"
41
+ >
42
+ <template v-slot:select="props">
43
+ {{getLangText(props.item)}}
44
+ </template>
45
+ <template v-slot:item="props">
46
+ {{getLangText(props.item)}}
47
+ </template>
48
+ </WTextSelect>
39
49
  </div>
40
50
 
41
51
  </div>
@@ -70,30 +80,37 @@ export default {
70
80
 
71
81
  drawer: false, //null,
72
82
 
73
- tgLangs: [
74
- {
75
- id: 'cht',
76
- text: '中文',
77
- },
78
- {
79
- id: 'eng',
80
- text: 'English',
81
- },
83
+ firstSetting: true,
84
+
85
+ showLangSelect: false,
86
+
87
+ keysLang: [
88
+ 'eng',
89
+ 'cht',
82
90
  ],
83
- tgLangSelect: {
84
- id: 'cht',
85
- text: '中文',
91
+ kpLangSelect: {
92
+ 'eng': 'English',
93
+ 'cht': '中文',
86
94
  },
87
95
 
88
96
  }
89
97
  },
90
- beforeMount: function() {
91
- // console.log('beforeMount')
98
+ mounted: function() {
99
+ // console.log('mounted')
92
100
 
93
101
  let vo = this
94
102
 
95
- //setLang
96
- vo.$ui.setLang(vo.tgLangSelect.id)
103
+ //firstSetting
104
+ if (vo.firstSetting) {
105
+ // console.log('webInfor', vo.webInfor)
106
+ let showLanguage = get(vo, 'webInfor.showLanguage', '')
107
+ // console.log('showLanguage', showLanguage)
108
+ vo.showLangSelect = showLanguage === 'y'
109
+ let language = get(vo, 'webInfor.language', '')
110
+ // console.log('language', language)
111
+ vo.$ui.setLang(language, 'layout mounted')
112
+ vo.firstSetting = false
113
+ }
97
114
 
98
115
  },
99
116
  computed: {
@@ -138,11 +155,24 @@ export default {
138
155
  },
139
156
  methods: {
140
157
 
141
- changeLang: function(msg) {
142
- // console.log('methods changeLang', msg)
158
+ getLangText: function(lang) {
159
+ // console.log('methods getLangText', lang)
160
+
161
+ let vo = this
162
+
163
+ let t = get(vo, `kpLangSelect.${lang}`, '')
164
+
165
+ return t
166
+ },
167
+
168
+ toggleLang: function(lang) {
169
+ // console.log('methods toggleLang', lang)
170
+
143
171
  let vo = this
144
- let lang = msg.id
145
- vo.$ui.setLang(lang)
172
+
173
+ //setLang
174
+ vo.$ui.setLang(lang, 'toggle')
175
+
146
176
  },
147
177
 
148
178
  }
@@ -1,9 +1,9 @@
1
1
  <template>
2
2
  <div
3
3
  style="height:100%; width:100%;"
4
- :changeApis="changeApis"
5
4
  v-domresize
6
5
  @domresize="resize"
6
+ :changeApis="changeApis"
7
7
  >
8
8
 
9
9
  <template v-if="syncState">
@@ -25,47 +25,55 @@
25
25
  <template v-slot:drawer="props">
26
26
  <div :style="`height:${props.height}px; background:#fff; position:relative;`">
27
27
 
28
- <WTree
29
- :style="`height:${props.height}px;`"
30
- :viewHeightMax="props.height"
31
- :data="apisTree"
32
- :iconHeight="lineHeightTree"
33
- :defItemHeight="lineHeightTree"
34
- :activable="true"
35
- :itemActive="apiActive"
36
- :funActive="funActive"
37
- :itemTextColorActive="'#000'"
38
- :itemBackgroundColorActive ="'rgba(100,100,100,0.15)'"
39
- >
40
- <template v-slot:item="props">
28
+ <template v-if="apisTree.length>0">
29
+ <WTree
30
+ :style="`height:${props.height}px;`"
31
+ :viewHeightMax="props.height"
32
+ :data="apisTree"
33
+ :iconHeight="lineHeightTree"
34
+ :defItemHeight="lineHeightTree"
35
+ :activable="true"
36
+ :itemActive="apiActive"
37
+ :funActive="funActive"
38
+ :itemTextColorActive="'#000'"
39
+ :itemBackgroundColorActive ="'rgba(100,100,100,0.15)'"
40
+ >
41
+ <template v-slot:item="props">
41
42
 
42
- <div
43
- :style="`display:flex; align-items:center; min-height:${lineHeightTree}px;`"
44
- v-if="props.data.type!=='node'"
45
- >
46
- {{props.data.key}}
47
- </div>
43
+ <div
44
+ :style="`display:flex; align-items:center; min-height:${lineHeightTree}px;`"
45
+ v-if="props.data.type!=='node'"
46
+ >
47
+ {{props.data.key}}
48
+ </div>
48
49
 
49
- <div
50
- :style="`display:flex; align-items:center; min-height:${lineHeightTree}px; cursor:pointer;`"
51
- @click="ckItem(getItemByKey(props.data.text))"
52
- v-else
53
- >
50
+ <div
51
+ :style="`display:flex; align-items:center; min-height:${lineHeightTree}px; cursor:pointer;`"
52
+ @click="ckItem(getItemByKey(props.data.text))"
53
+ v-else
54
+ >
54
55
 
55
- <div style="padding-right:5px;">
56
- <div :style="`padding:0px 6px; font-size:0.7rem; border-radius:10px; border:1px solid #ddd; color:#fff; background:${getMethodColorByKey(props.data.text)};`">
57
- {{getMethodByKey(props.data.text)}}
56
+ <div style="padding-right:5px;">
57
+ <div :style="`padding:0px 6px; font-size:0.7rem; border-radius:10px; border:1px solid #ddd; color:#fff; background:${getMethodColorByKey(props.data.text)};`">
58
+ {{getMethodByKey(props.data.text)}}
59
+ </div>
58
60
  </div>
59
- </div>
60
61
 
61
- <div>
62
- {{$ui.gv(getItemByKey(props.data.text),'name')}}
63
- </div>
62
+ <div>
63
+ {{$ui.gv(getItemByKey(props.data.text),'name')}}
64
+ </div>
64
65
 
65
- </div>
66
+ </div>
66
67
 
67
- </template>
68
- </WTree>
68
+ </template>
69
+ </WTree>
70
+ </template>
71
+ <div
72
+ style="padding:20px; font-size:0.9rem;"
73
+ v-else
74
+ >
75
+ {{$t('waitingData')}}
76
+ </div>
69
77
 
70
78
  <div
71
79
  :style="`position:absolute; top:1px; right:12px;`"
@@ -405,6 +413,7 @@
405
413
  import get from 'lodash-es/get.js'
406
414
  import set from 'lodash-es/set.js'
407
415
  import each from 'lodash-es/each.js'
416
+ import size from 'lodash-es/size.js'
408
417
  import trim from 'lodash-es/trim.js'
409
418
  import find from 'lodash-es/find.js'
410
419
  import cloneDeep from 'lodash-es/cloneDeep.js'
@@ -522,9 +531,16 @@ export default {
522
531
  let vo = this
523
532
 
524
533
  //default
534
+ vo.apiActive = null
535
+ vo.apiSelect = null
525
536
  vo.apisTree = []
526
537
  vo.kpApisTree = {}
527
538
 
539
+ //check
540
+ if (size(vo.apis) === 0) {
541
+ return
542
+ }
543
+
528
544
  //cloneDeep
529
545
  let apis = cloneDeep(vo.apis)
530
546
  // console.log('apis', cloneDeep(apis))
@@ -554,8 +570,6 @@ export default {
554
570
  let tree = convertToTree(tr, { bindRoot: '全部' })
555
571
  // console.log('tree', cloneDeep(tree))
556
572
 
557
- //filepathToTree
558
-
559
573
  //apiSelect, 預先選定api項目, 非tree選單active物件, 因id由convertToTree轉換提供, 故不能直接算得active選單物件id
560
574
  let apiSelect = get(apis, 0, null)
561
575
  // console.log('apiSelect', cloneDeep(apiSelect))