diff --git a/module/api/control.php b/module/api/control.php index ccfa2b7ee8..d6602a2bb1 100755 --- a/module/api/control.php +++ b/module/api/control.php @@ -22,6 +22,8 @@ class api extends control /** * Api doc index page. * + * @param string $objectType + * @param int $objectID * @param int $libID * @param int $moduleID * @param int $apiID @@ -33,28 +35,23 @@ class api extends control * @access public * @return void */ - public function index($libID = 0, $moduleID = 0, $apiID = 0, $version = 0, $release = 0, $appendLib = 0, $browseType = '', $param = 0) + public function index($objectType = 'nolink', $objectID = 0, $libID = 0, $moduleID = 0, $apiID = 0, $version = 0, $release = 0, $appendLib = 0, $browseType = '', $param = 0) { /* Get all api doc libraries. */ - $libs = $this->doc->getApiLibs($appendLib); - if($libID == 0 and !empty($libs)) $libID = key($libs); + $libs = $this->doc->getApiLibs($appendLib, $objectType, $objectID); + if($libID == 0 and !empty($libs)) + { + $lib = current($libs); + $libID = $lib->id; + $objectType = $lib->product ? 'product' : ($lib->project ? 'project' : ''); + $objectID = $lib->product ? $lib->product : $lib->project; + } /* Get an api doc. */ if($apiID > 0) { - $api = $this->api->getLibById($apiID, $version, $release); - if($api) - { - $moduleID = $api->module; - $libID = $api->lib; - $api->desc = htmlspecialchars_decode($api->desc); - - $this->view->api = $api; - $this->view->apiID = $apiID; - $this->view->version = $version; - $this->view->typeList = $this->api->getTypeList($api->lib); - $this->view->actions = $apiID ? $this->action->getList('api', $apiID) : array(); - } + echo $this->fetch('api', 'view', "libID=$libID&apiID=$apiID&moduleID=$moduleID&release=$release&version=$version"); + return; } else { @@ -68,15 +65,9 @@ class api extends control $lib = $this->doc->getLibById($libID); $appendLib = (!empty($lib) and $lib->deleted == '1') ? $libID : 0; - /* Generate bread crumbs dropMenu. */ - if($libs) $this->lang->modulePageNav = $this->generateLibsDropMenu($libs, $libID, $release); - - $this->setMenu($libID, $moduleID); - $this->lang->TRActions = ' ' . $this->lang->api->search . '' . $this->lang->TRActions; - /* Build the search form. */ $queryID = $browseType == 'bySearch' ? (int)$param : 0; - $actionURL = $this->createLink('api', 'index', "libID=$libID&moduleID=0&apiID=0&version=0&release=0&appendLib=0&browseType=bySearch¶m=myQueryID"); + $actionURL = $this->createLink('api', 'index', "objectType=$objectType&objectID=$objectID&libID=$libID&moduleID=0&apiID=0&version=0&release=0&appendLib=0&browseType=bySearch¶m=myQueryID"); $this->api->buildSearchForm($lib,$queryID, $actionURL); if($browseType == 'bySearch') @@ -85,20 +76,54 @@ class api extends control $this->view->typeList = $this->api->getTypeList($libID); } - $this->view->lib = $lib; - $this->view->isRelease = $release > 0; - $this->view->release = $release; - $this->view->title = $this->lang->api->pageTitle; - $this->view->libID = $libID; - $this->view->apiID = $apiID; - $this->view->libs = $libs; - $this->view->browseType = $browseType; - $this->view->moduleTree = $libID ? $this->doc->getApiModuleTree($libID, $apiID, $release, $moduleID) : ''; - $this->view->users = $this->user->getPairs('noclosed,noletter'); + $this->view->lib = $lib; + $this->view->isRelease = $release > 0; + $this->view->release = $release; + $this->view->title = $this->lang->api->pageTitle; + $this->view->libID = $libID; + $this->view->apiID = $apiID; + $this->view->libs = $libs; + $this->view->browseType = $browseType; + $this->view->objectType = $objectType; + $this->view->objectID = $objectID; + $this->view->libTree = $this->loadModel('doc')->getLibTree($libID, $libs, 'api', $objectID); + $this->view->users = $this->user->getPairs('noclosed,noletter'); + $this->view->objectDropdown = $this->generateLibsDropMenu($libs[$libID], $release); $this->display(); } + public function view($libID, $apiID, $moduleID = 0, $release = 0, $version = 0) + { + /* Get all api doc libraries. */ + $libs = $this->doc->getApiLibs($libID); + + $api = $this->api->getLibById($apiID, $version, $release); + if($api) + { + $moduleID = $api->module; + $libID = $api->lib; + $api->desc = htmlspecialchars_decode($api->desc); + + $this->view->api = $api; + $this->view->apiID = $apiID; + $this->view->version = $version; + $this->view->typeList = $this->api->getTypeList($api->lib); + $this->view->actions = $apiID ? $this->action->getList('api', $apiID) : array(); + } + + $this->view->title = $this->lang->api->pageTitle; + $this->view->libs = $libs; + $this->view->isRelease = $release > 0; + $this->view->release = $release; + $this->view->libID = $libID; + $this->view->apiID = $apiID; + $this->view->users = $this->user->getPairs('noclosed,noletter'); + $this->view->moduleTree = $this->doc->getApiModuleTree($libID, $apiID, $release, $moduleID); + $this->view->objectDropdown = $this->generateLibsDropMenu($libs[$libID], $release); + $this->display(); + } + /** * Release list. * @@ -110,7 +135,7 @@ class api extends control { $libs = $this->doc->getApiLibs(); $this->app->loadClass('pager', $static = true); - $this->lang->modulePageNav = $this->generateLibsDropMenu($libs, $libID); + $this->lang->modulePageNav = $this->generateLibsDropMenu($libs[$libID]); $pager = new pager($recTotal, $recPerPage, $pageID); @@ -198,7 +223,7 @@ class api extends control { $libs = $this->doc->getApiLibs(); $this->app->loadClass('pager', $static = true); - $this->lang->modulePageNav = $this->generateLibsDropMenu($libs, $libID, $releaseID); + $this->lang->modulePageNav = $this->generateLibsDropMenu($libs[$libID], $releaseID); $pager = new pager($recTotal, $recPerPage, $pageID); @@ -615,7 +640,7 @@ class api extends control */ private function setMenu($libID = 0, $moduleID = 0) { - common::setMenuVars('doc', $libID); + common::setMenuVars('doc', ''); /* Global struct link. */ $menu = ''; @@ -658,76 +683,38 @@ class api extends control /** * Generate api doc index page dropMenu * - * @param array $libs - * @param int $libID - * @param int $version + * @param object $lib + * @param int $version * @access public * @return string */ - private function generateLibsDropMenu($libs, $libID, $version = 0) + private function generateLibsDropMenu($lib, $version = 0) { - if(empty($libs)) return ''; - if(!isset($libs[$libID])) return ''; + if(empty($lib)) return ''; - $methodName = $this->app->rawMethod; - - $libName = $libs[$libID]->name; - $output = << -
- -
"; - - /* Get lib version */ - $versions = $this->api->getReleaseListByApi($libID); - if(!empty($versions)) - { - $versionName = $version > 0 ? $versions[$version]->version : $this->lang->api->defaultVersion; - $output .= << -
- -
"; + $objectType = 'project'; + $objectID = $lib->project; + $project = $this->loadModel('project')->getByID($objectID); + $objectTitle = zget($project, 'name', ''); } + $dropMenuLink = helper::createLink('api', 'ajaxGetDropMenu', "objectType=$objectType&objectID=$objectID&libID=$lib->id&version=$version"); + + $output = "
"; return $output; } @@ -862,4 +849,35 @@ EOT; } $this->view->typeOptions = $options; } + + /** + * Ajax get objectType drop menu. + * + * @param string $objectType + * @param int $objectID + * @param string $module + * @param string $method + * @access public + * @return void + */ + public function ajaxGetDropMenu($objectType, $objectID, $module, $method) + { + list($normalObjects, $closedObjects) = $this->api->getOrderedObjects($objectType, 'nomerge', 'api'); + + $titleList = array($this->lang->api->noLinked); + $titleList += array_values($normalObjects['product']); + $titleList += array_values($normalObjects['project']); + $titleList += array_values($closedObjects['product']); + $titleList += array_values($closedObjects['project']); + + $this->view->objectType = $objectType; + $this->view->objectID = $objectID; + $this->view->module = $module; + $this->view->method = $method; + $this->view->normalObjects = array($this->lang->api->noLinked) + $normalObjects; + $this->view->closedObjects = $closedObjects; + $this->view->objectsPinYin = common::convert2Pinyin($titleList); + + $this->display(); + } } diff --git a/module/api/css/common.css b/module/api/css/common.css index 2af509f4d2..6dbf3b4d74 100644 --- a/module/api/css/common.css +++ b/module/api/css/common.css @@ -102,3 +102,75 @@ form .table-data, #content .table-data {border: 1px solid #e2e2e3;} .table-data thead {background: #f9f9f9;} #aclBox .acl-tip {color: #838a9d;} +.lib {width: 130px; margin-bottom: 10px;} +.addbtn {padding-top: 22px; height: 63px; border: 1px dashed #ddd; width: 60px;} +.addbtn .icon-plus {font-size: 18px; display: block; opacity: 0.5; transition: opacity .2s; text-shadow: 1px 1px 3px rgba(0,0,0,.2);} +.addbtn:hover .icon-plus {opacity: .9; animation: flash-icon 1s linear alternate infinite;} +#subHeader #dropMenu {min-width: 250px; box-sizing: inhert; max-height: inherit;} +#subHeader #dropMenu .table-col .list-group {padding-top: 10px;} +.main-col .block-files .panel-heading {padding-right: 20px;} +.main-col .block-files .panel-heading .panel-title {height: 35px; line-height: 30px;} +.side-col .action a {margin: 0 auto 3px; display: block; max-width: 200px;} +.side-col .tips {padding: 0 10px;} +.main-col .doc-title {display: flex; font-size: 16px; margin-bottom: 15px;} +.main-col .doc-title .title {margin: 0; line-height: 30px; font-size: 25px;} +.main-col .doc-title .http-method {line-height: 27px; height: 27px; font-size: 13px; margin-right: 10px; padding: 0 10px;} +.main-col .doc-title .path {line-height: 30px; font-size: 20px; margin-right: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} +.main-col .doc-title .info {flex: 1 1 0;} +.main-col .doc-title .version a {font-size: 13px; color: #8c8c8c;} +.main-col .doc-title .version .dropdown-menu a:hover {color: #ffffff;} +.main-col .doc-title .actions {min-width: 120px; display: inline-block;} +.main-col .doc-title .actions a + a {margin-left: 8px;} +.main-col .doc-title .actions i {font-size: 15px; color: #8c8c8c;} +#content h2.title {margin: 0; font-size: 17px;} +#content h3.title {font-weight: 500; font-size: 17px!important;} +#content .desc {margin: 10px 0; color: #57585b; word-wrap: break-word;} +#content .detail-content {padding-left: 10px;} +#mainContent .scrollbar-hover {max-height: 2000px; overflow: scroll;} +#sidebar {width: 275px;} +#sidebar>.cell {width: 100%;} +#sidebar>.sidebar-toggle {left: 3px; right: auto;} +.hide-sidebar #sidebar>.cell {display: none;} +.hide-sidebar #sidebar>.sidebar-toggle>.icon:before {content: "\e314";} +.detail.empty {line-height: 200px;} +.main-col+.side-col {padding-left: 16px;} +.main-col iframe {min-height: 380px;} +.article-content .keywords {margin-bottom: 15px;} + +.article-content {width: 100%; display: inline-block;} +.outline {position: relative;} +.outline .outline-toggle i.icon-angle-right, i.icon-angle-left {width: 18px; height: 18px; border-radius: 50%; position: absolute; padding-left: 2px; padding-top: 1px;} +.outline .outline-toggle i.icon-angle-right:before {content: "\e314"; cursor: pointer;} +.outline .outline-toggle i.icon-angle-left:before {content: "\e315"; cursor: pointer;} +.outline ul li {list-style: none;} +.outline-content {display: none; padding-top: 18px;} +.outline-content a {color: #838A9D;} +.outline-content li.text-ellipsis.active>a {font-weight: 700; color: #0c64eb;} +#outline li.has-list.open:before {content: unset;} + +.article-content.comment {width: 100% !important;} + +.cell .detail .detail-title {padding-left: 5px; list-style: none;} +.menu-actions {top: 5px!important; right: 45px;} +.no-content {width: 100px; height: 100px; margin: 0 auto;} +.notice {text-align: center; padding-left: 15px; padding-top: 20px;} +.no-content-button {text-align: center; padding-top: 20px;} +.no-content-button a:nth-child(2) {margin-left: 20px;} + +.paramsTable th {text-align: left!important; font-size: 14px;} +.paramsTable td {text-align: left;} + +.tree-group {position: relative;} +.tree-group > .module-name {white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; display: block;} +.tree li.active > .tree-group a {font-weight: 700; color: #0c64eb;} +.tree-actions {display: inline-block; margin-left: 5px; vertical-align: middle;} +.tree-group .tree-actions {display: none; position: absolute; right: 0; top: 0; background-color: #fff; white-space: nowrap;} +.tree-group:hover .tree-actions {display: block} +.tree-actions a {display: inline-block; margin-left: 5px; font-size: 13px; opacity: .6;} +.tree li.active > .tree-group a {font-weight: 700; color: #0c64eb;} + +.base-url {margin: 0; border-bottom: 1px solid #eee;} +.base-url > p {margin: 0; padding-left: 20px; color: black;} +.detail+.detail {border-top: 0px;} +.menu-title {display: flex; align-items: center; justify-content: space-between;} +.vision-drop.dropdown {padding-right: 35px;} diff --git a/module/api/css/index.css b/module/api/css/index.css deleted file mode 100644 index 8eeea75e8d..0000000000 --- a/module/api/css/index.css +++ /dev/null @@ -1,72 +0,0 @@ -.lib {width: 130px; margin-bottom: 10px;} -.addbtn {padding-top: 22px; height: 63px; border: 1px dashed #ddd; width: 60px;} -.addbtn .icon-plus {font-size: 18px; display: block; opacity: 0.5; transition: opacity .2s; text-shadow: 1px 1px 3px rgba(0,0,0,.2);} -.addbtn:hover .icon-plus {opacity: .9; animation: flash-icon 1s linear alternate infinite;} -#subHeader #dropMenu {min-width: 250px; box-sizing: inhert; max-height: inherit;} -#subHeader #dropMenu .table-col .list-group {padding-top: 10px;} -.main-col .block-files .panel-heading {padding-right: 20px;} -.main-col .block-files .panel-heading .panel-title {height: 35px; line-height: 30px;} -.side-col .action a {margin: 0 auto 3px; display: block; max-width: 200px;} -.side-col .tips {padding: 0 10px;} -.main-col .doc-title {display: flex; font-size: 16px; margin-bottom: 15px;} -.main-col .doc-title .title {margin: 0; line-height: 30px; font-size: 25px;} -.main-col .doc-title .http-method {line-height: 27px; height: 27px; font-size: 13px; margin-right: 10px; padding: 0 10px;} -.main-col .doc-title .path {line-height: 30px; font-size: 20px; margin-right: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;} -.main-col .doc-title .info {flex: 1 1 0;} -.main-col .doc-title .version a {font-size: 13px; color: #8c8c8c;} -.main-col .doc-title .version .dropdown-menu a:hover {color: #ffffff;} -.main-col .doc-title .actions {min-width: 120px; display: inline-block;} -.main-col .doc-title .actions a + a {margin-left: 8px;} -.main-col .doc-title .actions i {font-size: 15px; color: #8c8c8c;} -#content h2.title {margin: 0; font-size: 17px;} -#content h3.title {font-weight: 500; font-size: 17px!important;} -#content .desc {margin: 10px 0; color: #57585b; word-wrap: break-word;} -#content .detail-content {padding-left: 10px;} -#mainContent .scrollbar-hover {max-height: 2000px; overflow: scroll;} -#sidebar {width: 275px;} -#sidebar>.cell {width: 100%;} -#sidebar>.sidebar-toggle {left: 3px; right: auto;} -.hide-sidebar #sidebar>.cell {display: none;} -.hide-sidebar #sidebar>.sidebar-toggle>.icon:before {content: "\e314";} -.detail.empty {line-height: 200px;} -.main-col+.side-col {padding-left: 16px;} -.main-col iframe {min-height: 380px;} -.article-content .keywords {margin-bottom: 15px;} - -.article-content {width: 100%; display: inline-block;} -.outline {position: relative;} -.outline .outline-toggle i.icon-angle-right, i.icon-angle-left {width: 18px; height: 18px; border-radius: 50%; position: absolute; padding-left: 2px; padding-top: 1px;} -.outline .outline-toggle i.icon-angle-right:before {content: "\e314"; cursor: pointer;} -.outline .outline-toggle i.icon-angle-left:before {content: "\e315"; cursor: pointer;} -.outline ul li {list-style: none;} -.outline-content {display: none; padding-top: 18px;} -.outline-content a {color: #838A9D;} -.outline-content li.text-ellipsis.active>a {font-weight: 700; color: #0c64eb;} -#outline li.has-list.open:before {content: unset;} - -.article-content.comment {width: 100% !important;} - -.cell .detail .detail-title {padding-left: 5px; list-style: none;} -.menu-actions {top: 5px!important; right: 45px;} -.no-content {width: 100px; height: 100px; margin: 0 auto;} -.notice {text-align: center; padding-left: 15px; padding-top: 20px;} -.no-content-button {text-align: center; padding-top: 20px;} -.no-content-button a:nth-child(2) {margin-left: 20px;} - -.paramsTable th {text-align: left!important; font-size: 14px;} -.paramsTable td {text-align: left;} - -.tree-group {position: relative;} -.tree-group > .module-name {white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; display: block;} -.tree li.active > .tree-group a {font-weight: 700; color: #0c64eb;} -.tree-actions {display: inline-block; margin-left: 5px; vertical-align: middle;} -.tree-group .tree-actions {display: none; position: absolute; right: 0; top: 0; background-color: #fff; white-space: nowrap;} -.tree-group:hover .tree-actions {display: block} -.tree-actions a {display: inline-block; margin-left: 5px; font-size: 13px; opacity: .6;} -.tree li.active > .tree-group a {font-weight: 700; color: #0c64eb;} - -.base-url {margin: 0; border-bottom: 1px solid #eee;} -.base-url > p {margin: 0; padding-left: 20px; color: black;} -.detail+.detail {border-top: 0px;} -.menu-title {display: flex; align-items: center; justify-content: space-between;} -.vision-drop.dropdown {padding-right: 35px;} diff --git a/module/api/js/index.js b/module/api/js/index.js index 4c0c335dac..51d0de587f 100644 --- a/module/api/js/index.js +++ b/module/api/js/index.js @@ -15,6 +15,68 @@ $(document).ready(function() $('#outline li.has-list>i+ul').prev('i').remove(); }); }); + + $('#fileTree').tree( + { + initialState: 'active', + data: treeData, + itemCreator: function($li, item) + { + var libClass = 'lib'; + var hasChild = item.children ? !!item.children.length : false; + var $item = ''; + $item += '
'; + if(libClass == 'lib') $item += '
'; + $item += ''; + $item += item.name + $item += ''; + $item += ''; + $item += '
'; + $item += '
'; + + $li.append($item); + $li.addClass(libClass); + if(item.active) $li.addClass('active open in'); + } + }); + + $('li.has-list > ul, #fileTree').addClass("menu-active-primary menu-hover-primary"); + + $('#fileTree').on('mousemove', 'a', function() + { + if($(this).data('type') == 'annex') return; + + var libClass = '.libDorpdown'; + if(!$(this).hasClass('lib')) libClass = '.moduleDorpdown'; + if($(libClass).find('li').length == 0) return false; + + $(this).find('.icon').removeClass('hidden'); + $(this).addClass('show-icon'); + }).on('mouseout', 'a', function() + { + $(this).find('.icon').addClass('hidden'); + $(this).removeClass('show-icon'); + }).on('click', 'a', function(e) + { + var isLib = $(this).hasClass('lib'); + var moduleID = $(this).data('id'); + var libID = 0; + var params = ''; + + if(isLib) + { + if($(this).data('type') == 'annex') return false; + + libID = moduleID; + moduleID = 0; + } + else + { + libID = $(this).closest('.lib').data('id'); + } + linkParams = linkParams.replace('%s', '&libID=' + libID + '&moduleID=' + moduleID); + location.href = createLink('doc', 'tableContents', linkParams); + }); }); /** diff --git a/module/api/lang/de.php b/module/api/lang/de.php index 1bde5a3c22..62b489bc14 100644 --- a/module/api/lang/de.php +++ b/module/api/lang/de.php @@ -61,6 +61,7 @@ $lang->api->defaultVersion = "Current Version"; $lang->api->zentaoAPI = "Zentao API v1"; $lang->api->search = "Search"; $lang->api->allLibs = "AllLibs"; +$lang->api->noLinked = "No Linked"; /* Common access control lang. */ $lang->api->whiteList = 'Whitelist'; diff --git a/module/api/lang/en.php b/module/api/lang/en.php index 7c03c6cedb..9670e8feb4 100644 --- a/module/api/lang/en.php +++ b/module/api/lang/en.php @@ -61,6 +61,7 @@ $lang->api->defaultVersion = "Current Version"; $lang->api->zentaoAPI = "Zentao API v1"; $lang->api->search = "Search"; $lang->api->allLibs = "AllLibs"; +$lang->api->noLinked = "No Linked"; /* Common access control lang. */ $lang->api->whiteList = 'Whitelist'; diff --git a/module/api/lang/fr.php b/module/api/lang/fr.php index 742931b2b8..3e9ed3239c 100644 --- a/module/api/lang/fr.php +++ b/module/api/lang/fr.php @@ -61,6 +61,7 @@ $lang->api->defaultVersion = "Current Version"; $lang->api->zentaoAPI = "Zentao API v1"; $lang->api->search = "Search"; $lang->api->allLibs = "AllLibs"; +$lang->api->noLinked = "No Linked"; /* Common access control lang. */ $lang->api->whiteList = 'Whitelist'; diff --git a/module/api/lang/zh-cn.php b/module/api/lang/zh-cn.php index f8c54f79eb..9b5397e7ba 100755 --- a/module/api/lang/zh-cn.php +++ b/module/api/lang/zh-cn.php @@ -13,13 +13,13 @@ $lang->api->common = 'API接口'; $lang->api->getModel = '超级model调用接口'; $lang->api->sql = 'SQL查询接口'; -$lang->api->index = '接口库主页'; -$lang->api->editLib = '编辑接口库'; +$lang->api->index = '库主页'; +$lang->api->editLib = '编辑库'; $lang->api->releases = '版本管理'; $lang->api->deleteRelease = '删除版本'; -$lang->api->deleteLib = '删除接口库'; +$lang->api->deleteLib = '删除库'; $lang->api->createRelease = '发布接口'; -$lang->api->createLib = '创建接口库'; +$lang->api->createLib = '创建库'; $lang->api->createApi = '创建接口'; $lang->api->createAB = '创建'; $lang->api->createDemo = '导入禅道API'; @@ -35,9 +35,9 @@ $lang->api->result = '返回结果'; $lang->api->status = '状态'; $lang->api->data = '内容'; $lang->api->noParam = 'GET方式调试不需要输入参数,'; -$lang->api->noModule = '接口库下没有目录,请先维护目录'; +$lang->api->noModule = '库下没有目录,请先维护目录'; $lang->api->post = 'POST方式调试请参照页面表单'; -$lang->api->noUniqueName = '接口库名已存在。'; +$lang->api->noUniqueName = '库名已存在。'; $lang->api->noUniqueVersion = '版本已存在。'; $lang->api->version = '版本'; $lang->api->createStruct = '创建数据结构'; @@ -45,7 +45,7 @@ $lang->api->editStruct = '编辑数据结构'; $lang->api->deleteStruct = '删除数据结构'; $lang->api->create = '创建接口'; $lang->api->title = '接口名称'; -$lang->api->pageTitle = '接口库'; +$lang->api->pageTitle = '库'; $lang->api->module = '目录'; $lang->api->apiDoc = '接口'; $lang->api->manageType = '维护目录'; @@ -55,12 +55,13 @@ $lang->api->done = '开发完成'; $lang->api->basicInfo = '基本信息'; $lang->api->apiDesc = '接口说明'; $lang->api->confirmDelete = "您确定删除该接口吗?"; -$lang->api->confirmDeleteLib = "您确定删除该接口库吗?"; +$lang->api->confirmDeleteLib = "您确定删除该库吗?"; $lang->api->filterStruct = "使用数据结构填充"; $lang->api->defaultVersion = "当前版本"; $lang->api->zentaoAPI = "禅道API文档v1"; $lang->api->search = "搜索"; -$lang->api->allLibs = "全部接口库"; +$lang->api->allLibs = "全部库"; +$lang->api->noLinked = "无关联"; /* Common access control lang. */ $lang->api->whiteList = '白名单'; @@ -107,7 +108,7 @@ $lang->api->baseUrl = '请求基础路径'; $lang->api->baseUrlDesc = '网址或者路径,比如 test.zentao.net 或者 /v1'; $lang->api->desc = '描述'; $lang->api->control = '访问控制'; -$lang->api->noLib = '暂时没有接口库。'; +$lang->api->noLib = '暂时没有库。'; $lang->api->noApi = '暂时没有接口。'; $lang->api->noStruct = '暂时没有数据结构。'; $lang->api->lib = '所属库'; diff --git a/module/api/model.php b/module/api/model.php index cc05f51778..2faf3916bf 100644 --- a/module/api/model.php +++ b/module/api/model.php @@ -978,4 +978,62 @@ class apiModel extends model return $list; } + + /** + * Get ordered objects for dic. + * + * @access public + * @return array + */ + public function getOrderedObjects() + { + $normalObjects = $closedObjects = array('product' => array(), 'project' => array()); + + $products = $this->dao->select('t1.id, t1.name, t1.status')->from(TABLE_PRODUCT)->alias('t1') + ->leftjoin(TABLE_DOCLIB)->alias('t2')->on('t2.product=t1.id') + ->where('t2.id')->gt(0) + ->andWhere('t1.vision')->eq($this->config->vision) + ->andWhere('t2.vision')->eq($this->config->vision) + ->andWhere('t1.deleted')->eq(0) + ->andWhere('t2.type')->eq('api') + ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->products)->fi() + ->fetchAll('id'); + + foreach($products as $id => $product) + { + if($product->status == 'normal') + { + $normalObjects['product'][$id] = $product->name; + } + elseif($product->status == 'closed') + { + $closedObjects['product'][$id] = $product->name; + } + } + + $projects = $this->dao->select('t1.id, t1.name, t1.status')->from(TABLE_PROJECT)->alias('t1') + ->leftjoin(TABLE_DOCLIB)->alias('t2')->on('t2.project=t1.id') + ->where('t2.id')->gt(0) + ->andWhere('t1.vision')->eq($this->config->vision) + ->andWhere('t2.vision')->eq($this->config->vision) + ->andWhere('t2.type')->eq('api') + ->andWhere('t1.deleted')->eq(0) + ->beginIF(!$this->app->user->admin)->andWhere('t1.id')->in($this->app->user->view->projects)->fi() + ->orderBy('t1.hasProduct_asc') + ->fetchAll('id'); + + foreach($projects as $id => $project) + { + if($project->status != 'done' and $project->status != 'closed') + { + $normalObjects['project'][$id] = $project->name; + } + else if($project->status == 'done' or $project->status == 'closed') + { + $closedObjects['project'][$id] = $project->name; + } + } + + return array($normalObjects, $closedObjects); + } } diff --git a/module/api/view/ajaxgetdropmenu.html.php b/module/api/view/ajaxgetdropmenu.html.php new file mode 100644 index 0000000000..17d05da9d8 --- /dev/null +++ b/module/api/view/ajaxgetdropmenu.html.php @@ -0,0 +1,140 @@ + +'; +$closedObjectsHtml = ''; +$closedObjectsHtml .= ''; +?> + +
+
+
+
+
+ +
+
+
+ + + +
+ + +
+
+
+
+ + diff --git a/module/api/view/apilist.html.php b/module/api/view/apilist.html.php index 5fe1a41598..9321b6fc1b 100644 --- a/module/api/view/apilist.html.php +++ b/module/api/view/apilist.html.php @@ -103,7 +103,7 @@
  • - "; - echo html::a('javascript:;', "", '', "data-toggle='dropdown' class='btn btn-link'"); - echo "'; - } - ?> - - -
    - -
    api->noModule;?>
    - - - - + + +
    + +
    +

    + doc->noLib;?> + ' . $this->lang->doc->createLib, '', 'class="btn btn-info iframe"'); + ?> +

    +
    + + + +
    +
    >
    +
    + +
    + + + diff --git a/module/api/view/view.html.php b/module/api/view/view.html.php new file mode 100644 index 0000000000..bba2365fc8 --- /dev/null +++ b/module/api/view/view.html.php @@ -0,0 +1,58 @@ + + * @package doc + * @version $Id$ + * @link http://www.zentao.net + */ +?> + +api->confirmDelete);?> +
    >
    +
    + + +
    +
    +
    + + "; + echo html::a('javascript:;', "", '', "data-toggle='dropdown' class='btn btn-link'"); + echo "
    '; + } + ?> +
    + +
    + +
    api->noModule;?>
    + + + +
    +
    + + + + diff --git a/module/common/lang/menu.php b/module/common/lang/menu.php index a07cb93602..3a45e7d270 100644 --- a/module/common/lang/menu.php +++ b/module/common/lang/menu.php @@ -515,10 +515,6 @@ $lang->doc->menuOrder[20] = 'project'; $lang->doc->menuOrder[25] = 'api'; $lang->doc->menuOrder[30] = 'custom'; -$lang->doc->menu->api['subMenu'] = new stdclass(); -$lang->doc->menu->api['subMenu']->index = array('link' => "{$lang->doc->apiDoc}|api|index|libID=%s", 'alias' => 'create,edit'); -$lang->doc->menu->api['subMenu']->struct = array('link' => "{$lang->doc->apiStruct}|api|struct|libID=%s", 'alias' => 'createstruct,editstruct'); - /* Report menu.*/ $lang->report->menu = new stdclass(); $lang->report->menu->screen = array('link' => "{$lang->screen->common}|screen|browse"); diff --git a/module/doc/control.php b/module/doc/control.php index c29eee4a80..2340432e8d 100755 --- a/module/doc/control.php +++ b/module/doc/control.php @@ -1325,6 +1325,7 @@ class doc extends control $this->view->title = $title; $this->view->type = $type; + $this->view->objectType = $type; $this->view->browseType = $browseType; $this->view->param = $queryID; $this->view->users = $this->user->getPairs('noletter'); diff --git a/module/doc/model.php b/module/doc/model.php index 97f720ca06..615ff58973 100644 --- a/module/doc/model.php +++ b/module/doc/model.php @@ -47,7 +47,11 @@ class docModel extends model ->where('deleted')->eq(0) ->andWhere('type')->eq('api') ->beginIF(!empty($appendLib))->orWhere('id')->eq($appendLib)->fi() - ->beginIF(!empty($objectType))->andWhere($objectType)->eq($objectID)->fi() + ->beginIF(!empty($objectType) && $objectID > 0)->andWhere($objectType)->eq($objectID)->fi() + ->beginIF($objectType == 'nolink') + ->andWhere('product')->eq(0) + ->andWhere('project')->eq(0) + ->fi() ->orderBy('`order`_asc, id_desc') ->fetchAll('id'); @@ -2903,6 +2907,10 @@ class docModel extends model $libTree[$type][] = $annex; } + elseif($type == 'api') + { + $libTree[$type] = array_merge($libTree[$type], $apiLibs); + } $libTree = array_values($libTree[$type]); return $libTree; diff --git a/module/doc/view/ajaxgetdropmenu.html.php b/module/doc/view/ajaxgetdropmenu.html.php index 7220c5c16e..57fc104142 100644 --- a/module/doc/view/ajaxgetdropmenu.html.php +++ b/module/doc/view/ajaxgetdropmenu.html.php @@ -29,7 +29,7 @@ foreach($normalObjects as $normalObjectID => $normalObjectName) foreach($closedObjects as $closedObjectID => $closedObjectName) { $selected = $closedObjectID == $objectID ? 'selected' : ''; - $closedObjectsHtml .= '
  • ' . html::a(sprintf($link, $closedObjectID), $closedObjectName, '', "class='$selected clickable' title='{$normalObjectName}' data-key='" . zget($objectsPinYin, $closedObjectName, '') . "'") . '
  • '; + $closedObjectsHtml .= '
  • ' . html::a(sprintf($link, $closedObjectID), $closedObjectName, '', "class='$selected clickable' title='{$closedObjectName}' data-key='" . zget($objectsPinYin, $closedObjectName, '') . "'") . '
  • '; } $normalObjectsHtml .= '';