blob: 254944ea15da1700347b3f2a7d2a0bba5c9de2d6 [file] [log] [blame]
<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-->
<template>
<v-container grid-list-xl fluid v-scroll:#scroll-target="onScroll">
<v-layout row wrap>
<v-flex lg12>
<breadcrumb title="apiDocs" :items="breads"></breadcrumb>
</v-flex>
<v-flex lg12>
<v-card flat color="transparent">
<v-card-text>
<v-form>
<v-layout row wrap>
<v-text-field
id="dubboProviderIP"
:label="$t('apiDocsRes.dubboProviderIP')"
:rules="rules"
placeholder="127.0.0.1"
value="127.0.0.1"
outline
></v-text-field>
<v-text-field style="marginLeft: 10px;"
id="dubboProviderPort"
:label="$t('apiDocsRes.dubboProviderPort')"
:rules="rules"
placeholder="20880"
value="20881"
outline
></v-text-field>
<v-btn @click="submit" color="primary" large>{{ $t('apiDocsRes.loadApiList') }}</v-btn>
</v-layout>
</v-form>
</v-card-text>
</v-card>
</v-flex>
</v-layout>
<v-layout row wrap>
<v-flex lg3 :class="{'sticky_top':isApiListDivFixed,'menu_panel_class':isBigScreen}" >
<v-card id="apiListDiv"
class="mx-auto"
>
<v-toolbar>
<v-toolbar-side-icon></v-toolbar-side-icon>
<v-toolbar-title>{{ $t('apiDocsRes.apiListText') }}</v-toolbar-title>
<v-spacer></v-spacer>
</v-toolbar>
<v-list :class="isBigScreen?'menu_panel_content':''">
<v-list-group
v-for="item in apiModules"
:key="item.title"
no-action
>
<template v-slot:activator>
<v-list-tile>
<v-list-tile-content>
<v-list-tile-title>{{ item.title }}</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
</template>
<v-list-tile
class="apiListListTile"
v-for="child in item.apis"
:key="child.title"
@click="showApiForm(child.formInfo, $event)"
>
<v-list-tile-content>
<v-list-tile-title>{{ child.title }}</v-list-tile-title>
</v-list-tile-content>
</v-list-tile>
</v-list-group>
</v-list>
</v-card>
</v-flex>
<v-flex lg9 :class="isBigScreen?'apidocs_content':''">
<v-card id="apiFormDiv" ref="apiFormDiv">
<apiForm :formInfo="formInfo" />
</v-card>
</v-flex>
</v-layout>
</v-container>
</template>
<script>
import Breadcrumb from '@/components/public/Breadcrumb'
import ApiForm from '@/components/apiDocs/ApiForm'
export default {
name: 'ApiDocs',
components: {
Breadcrumb,
ApiForm
},
computed:{
isBigScreen:function(){
const _this = this;
var isBigScreen = false;
if(_this.$vuetify.breakpoint){
isBigScreen = _this.$vuetify.breakpoint.md || _this.$vuetify.breakpoint.lg || _this.$vuetify.breakpoint.xl;
}
return isBigScreen;
}
},
created(){
const _this = this;
console.debug(_this.$vuetify.breakpoint.md);
},
data: () => ({
breads: [
{
text: 'apiDocs',
href: '/apiDocs'
}
],
rules: [
value => !!value || 'Required.'
],
apiModules: [],
formInfo: {},
isApiListDivFixed: false
}),
methods: {
submit () {
const dubboProviderIP = document.querySelector('#dubboProviderIP').value.trim()
const dubboProviderPort = document.querySelector('#dubboProviderPort').value.trim()
this.$axios.get('/docs/apiModuleList', {
params: {
dubboIp: dubboProviderIP,
dubboPort: dubboProviderPort
}
}).then(response => {
const resultData = []
if (response && response.data && response.data !== '') {
const menuData = JSON.parse(response.data)
menuData.sort((a, b) => {
return a.moduleDocName > b.moduleDocName
})
for (let i = 0; i < menuData.length; i++) {
const menu = menuData[i]
menu.moduleApiList.sort((a, b) => {
return a.apiName > b.apiName
})
const menu2 = {
title: menu.moduleDocName,
apis: []
}
const menuItems = menu.moduleApiList
for (let j = 0; j < menuItems.length; j++) {
const menuItem = menuItems[j]
const menuItem2 = {
title: menuItem.apiDocName,
formInfo: {
moduleClassName: menu.moduleClassName,
dubboIp: dubboProviderIP,
dubboPort: dubboProviderPort,
apiName: menuItem.apiName,
apiRespDec: menuItem.apiRespDec,
apiDocName: menuItem.apiDocName,
description: menuItem.description,
apiVersion: menuItem.apiVersion,
apiGroup: menuItem.apiGroup,
paramsDesc: menuItem.paramsDesc || ''
}
}
menu2.apis.push(menuItem2)
}
resultData.push(menu2)
}
}
this.apiModules = resultData
}).catch(error => {
console.log('error', error.message)
})
},
showApiForm (formInfo, e) {
this.formInfo = formInfo
const apiListListTileList = document.getElementsByClassName('apiListListTile')
for (var i = 0; i < apiListListTileList.length; i++) {
apiListListTileList[i].childNodes.forEach(function (curr, index, arr) {
curr.classList.remove('primary--text')
})
}
e.currentTarget.classList.add('primary--text')
},
fixedApiListDiv () {
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
var apiListDivTop = document.getElementById('apiFormDiv').offsetTop
var apiListDivWidth = document.getElementById('apiListDiv').offsetWidth
if (!this.isApiListDivFixed && scrollTop >= apiListDivTop) {
this.isApiListDivFixed = true
document.getElementById('apiListDiv').classList.add('apiListDiv-fixed')
document.getElementById('apiListDiv').style.top = '75px'
document.getElementById('apiListDiv').style.width = apiListDivWidth + 'px'
}
if (this.isApiListDivFixed && scrollTop <= apiListDivTop) {
this.isApiListDivFixed = false
document.getElementById('apiListDiv').classList.remove('apiListDiv-fixed')
document.getElementById('apiListDiv').style.top = '0px'
}
},
onScroll () {
const _this = this;
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop
var offsetTop = document.getElementById('apiFormDiv').offsetTop
if(scrollTop >= offsetTop && _this.isBigScreen){
_this.isApiListDivFixed = true;
}else{
_this.isApiListDivFixed = false;
}
}
},
mounted () {
window.addEventListener('scroll', this.onScroll)
}
}
</script>
<style scoped>
.sticky_top{
position: fixed;
top:64px;
}
.menu_panel_content{
max-height: 500px;
overflow-y: scroll;
}
.apiListDiv-fixed{
position: fixed;
}
.menu_panel_class{
position: fixed;
width: 25%;
z-index: 1000;
}
.apidocs_content{
margin-left:30%;
}
</style>