znt/module/api/ui/view.html.php

176 lines
5.1 KiB
PHP

<?php
declare(strict_types=1);
/**
* The index view file of api module of ZenTaoPMS.
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
* @author Sun Guangming<sunguangming@easycorp.ltd>
* @package api
* @link https://www.zentao.net
*/
namespace zin;
$apiHeader = $apiQuery = $apiParams = $apiResponse = array();
$parseTree = function($data, $typeList, $level = 0) use(&$parseTree)
{
global $lang;
$field = '';
for($i = 0; $i < $level; $i++) $field .= '&nbsp;&nbsp;'. ($i == $level-1 ? '∟' : '&nbsp;') . '&nbsp;&nbsp;';
$field .= $data['field'];
$tbody[] = h::tr
(
h::td(html($field)),
h::td(zget($typeList, (string)$data['paramsType'], '')),
h::td(zget($lang->api->boolList, (string)$data['required'], '')),
h::td($data['desc'])
);
if(isset($data['children']) && count($data['children']) > 0)
{
$level++;
foreach($data['children'] as $item) $tbody[] = $parseTree($item, $typeList, $level);
}
return $tbody;
};
if(!empty($api->params['header']))
{
$tbody = array();
foreach($api->params['header'] as $param)
{
$tbody[] = h::tr
(
h::td($param['field']),
h::td('String'),
h::td(zget($lang->api->boolList, (string)$param['required'])),
h::td($param['desc'])
);
}
$apiHeader[] = h3($lang->api->header);
$apiHeader[] = h::table
(
setClass('table condensed bordered'),
h::tr
(
h::th($lang->api->req->name),
h::th($lang->api->req->type),
h::th($lang->api->req->required),
h::th($lang->api->req->desc)
),
$tbody
);
}
if(!empty($api->params['query']))
{
$tbody = array();
foreach($api->params['query'] as $param)
{
$tbody[] = h::tr
(
h::td($param['field']),
h::td('String'),
h::td(zget($lang->api->boolList, (string)$param['required'])),
h::td($param['desc'])
);
}
$apiQuery[] = h3($lang->api->query);
$apiQuery[] = h::table
(
setClass('table condensed bordered'),
h::tr
(
h::th($lang->api->req->name),
h::th($lang->api->req->type),
h::th($lang->api->req->required),
h::th($lang->api->req->desc)
),
$tbody
);
}
if(!empty($api->params['params']))
{
$tbody = array();
foreach($api->params['params'] as $param) $tbody = array_merge($tbody, $parseTree($param, $typeList));
$apiParams[] = h3($lang->api->params);
$apiParams[] = h::table
(
setClass('table condensed bordered'),
h::tr
(
h::th($lang->api->req->name),
h::th($lang->api->req->type),
h::th($lang->api->req->required),
h::th($lang->api->req->desc)
),
$tbody
);
}
if($api->response)
{
$tbody = array();
foreach($api->response as $response) $tbody = array_merge($tbody, $parseTree($response, $typeList));
$apiResponse[] = h3($lang->api->response);
$apiResponse[] = h::table
(
setClass('table condensed bordered'),
h::tr
(
h::th($lang->api->req->name),
h::th($lang->api->req->type),
h::th($lang->api->req->required),
h::th($lang->api->req->desc)
),
$tbody
);
}
$unsetProps = array('commonParams', 'params', 'paramsExample', 'response', 'responseExample');
$apiData = (array)$api;
foreach($unsetProps as $prop) unset($apiData[$prop]);
$apiData['api'] = true;
$apiData['title'] = "$api->method $api->path $api->title";
$apiData['desc'] = htmlspecialchars_decode($apiData['desc']);
div
(
setID('api-content'),
setClass('article pb-6'),
div
(
setClass("api-list-item row items-center mb-1 gap-2 flex-auto is-$api->method rounded"),
div(setClass('font-mono w-14 text-center api-method py-1 rounded rounded-r-none'), $api->method),
div(setClass('font-mono font-bold text-md api-path'), $api->path)
),
div
(
setClass('flex gap-2 items-center'),
h2(setClass('flex-none min-w-0 max-w-full'), $api->title),
(isset($api->deleted) && $api->deleted) ? span(setClass('label danger flex-none'), $lang->deleted) : null
),
div(setClass('desc'), html(htmlspecialchars_decode($api->desc))),
$apiHeader,
$apiQuery,
$apiParams,
$api->paramsExample ? h3($lang->api->paramsExample) : null,
$api->paramsExample ? html("<pre><code>" . $api->paramsExample . "</code></pre>") : null,
$apiResponse,
$api->responseExample ? h3($lang->api->responseExample) : null,
$api->responseExample ? html("<pre><code>" . $api->responseExample . "</code></pre>") : null,
on::init()->do(
'const docApp = zui.DocApp.query("#api-content");',
'if(!docApp) return;',
'const apiData = ' . json_encode($apiData) . ';',
'docApp.$.update("doc", docApp.$.formatDataItem("doc", apiData));'
)
);