403 lines
12 KiB
PHP
Executable file
403 lines
12 KiB
PHP
Executable file
<?php
|
|
declare(strict_types=1);
|
|
/**
|
|
* The index view file of admin 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 Gang Liu <liugang@easycorp.ltd>
|
|
* @package admin
|
|
* @link https://www.zentao.net
|
|
*/
|
|
|
|
namespace zin;
|
|
|
|
/* Get latest data from zentao.net if ZenTaoPMS has internet and the user is admin. */
|
|
jsVar('hasInternet', $zentaoData->hasData || $hasInternet);
|
|
jsVar('isAdminUser', $this->app->user->admin);
|
|
$isEn = $app->getClientLang() == 'en';
|
|
|
|
$buildHeader = function(string $title, string $actionUrl = '', string $titleIcon = '', string $actionLang = '', string $actionIcon = ''): h
|
|
{
|
|
global $lang;
|
|
|
|
return div
|
|
(
|
|
setClass('flex justify-between items-center pl-4 h-10'),
|
|
div
|
|
(
|
|
setClass('panel-title'),
|
|
$titleIcon ? icon
|
|
(
|
|
setClass('text-lg text-primary pr-1'),
|
|
$titleIcon
|
|
) : null,
|
|
$title
|
|
),
|
|
$actionUrl ? a
|
|
(
|
|
setClass('text-gray pr-3'),
|
|
set::target('_blank'),
|
|
set::href($actionUrl),
|
|
$actionLang ? $actionLang : $lang->more,
|
|
icon($actionIcon ? $actionIcon : 'caret-right')
|
|
) : null
|
|
);
|
|
};
|
|
|
|
$buildPluginHeader = function($name, $url): h
|
|
{
|
|
return div
|
|
(
|
|
setClass('flex justify-between items-center'),
|
|
div
|
|
(
|
|
setClass('panel-title py-2.5'),
|
|
$name
|
|
),
|
|
a
|
|
(
|
|
//setClass('flex items-center'),
|
|
set::href($url),
|
|
set::target('_blank'),
|
|
icon
|
|
(
|
|
setClass('text-primary bg-primary-100 p-1'),
|
|
'download-alt'
|
|
)
|
|
)
|
|
);
|
|
};
|
|
|
|
$buildUsed = function(int $amount, string $unit = ''): array
|
|
{
|
|
return array
|
|
(
|
|
$amount ? span
|
|
(
|
|
setClass('bg-gray-100 rounded-md text-lg mx-1 px-1 py-0.5'),
|
|
$amount
|
|
) : null,
|
|
$amount ? $unit : ''
|
|
);
|
|
};
|
|
|
|
$settingItems = array();
|
|
$flowItems = array();
|
|
foreach($lang->admin->menuList as $menuKey => $menu)
|
|
{
|
|
if($config->vision == 'lite' and !in_array($menuKey, $config->admin->liteMenuList)) continue;
|
|
|
|
$items = div
|
|
(
|
|
setClass('pb-4 pr-4 h-32 w-1/' . ($config->vision == 'lite' || $isEn ? 3 : 5)),
|
|
col
|
|
(
|
|
setClass('setting-box cursor-pointer border border-hover rounded-md px-2 py-1 h-full'),
|
|
set('data-id', $menuKey),
|
|
empty($menu['disabled']) ? set('data-url', zget($menu, 'link', '')) : null,
|
|
!empty($menu['disabled']) ? setClass('disabled') : null,
|
|
!empty($menu['disabled']) ? set::title($lang->admin->noPriv) : null,
|
|
h4
|
|
(
|
|
setClass('flex my-2.5 w-full'),
|
|
div
|
|
(
|
|
setClass('flex gap-1 font-bold text-md'),
|
|
!empty($menu['icon']) ? icon(setClass("svg-icon rounded-lg content-center bg-{$menu['bg']} text-white"), $menu['icon']) : img(set::src("static/svg/admin-{$menuKey}.svg")),
|
|
$menu['name'],
|
|
!empty($config->admin->helpURL[$menuKey]) ?
|
|
a
|
|
(
|
|
setClass('text-gray'),
|
|
set::href($config->admin->helpURL[$menuKey]),
|
|
set::title($lang->help),
|
|
set::target('_blank'),
|
|
icon('help')
|
|
) : '',
|
|
)
|
|
),
|
|
p
|
|
(
|
|
setClass('overflow-hidden text-left text-gray pb-4 h-12 leading-6'),
|
|
set::title($menu['desc']),
|
|
$menu['desc']
|
|
)
|
|
)
|
|
);
|
|
|
|
if(!empty($menu['group']) && $menu['group'] == 'flow')
|
|
{
|
|
$flowItems[] = $items;
|
|
}
|
|
else
|
|
{
|
|
$settingItems[] = $items;
|
|
}
|
|
}
|
|
|
|
$pluginItems = array();
|
|
if($zentaoData->plugins)
|
|
{
|
|
foreach($zentaoData->plugins as $plugin)
|
|
{
|
|
if(!$plugin) continue;
|
|
|
|
$pluginDesc = empty($plugin->abstract) ? '' : preg_replace('/[[:cntrl:]]/mu', '', strip_tags($plugin->abstract));
|
|
|
|
$pluginItems[] = div
|
|
(
|
|
setClass('pr-4 pb-4 w-1/3 h-32'),
|
|
div
|
|
(
|
|
setClass('border rounded-md px-3 py-2'),
|
|
$buildPluginHeader($plugin->name, $plugin->viewLink),
|
|
div
|
|
(
|
|
setClass('overflow-hidden text-gray h-12 leading-6'),
|
|
set::title($pluginDesc),
|
|
$pluginDesc
|
|
)
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
$classItems = array();
|
|
if($zentaoData->classes)
|
|
{
|
|
foreach($zentaoData->classes as $class)
|
|
{
|
|
$classItems[] = a
|
|
(
|
|
setClass('border border-hover rounded-md mr-4 mb-4 p-1 w-1/3'),
|
|
set::href($class->viewLink),
|
|
set::target('_blank'),
|
|
img
|
|
(
|
|
set::src($class->image)
|
|
),
|
|
div
|
|
(
|
|
setClass('overflow-hidden text-md text-center font-bold text-black mb-1.5 p-1 h-6'),
|
|
$class->name
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
$dynamicItems = array();
|
|
foreach($zentaoData->dynamics as $dynamic)
|
|
{
|
|
$dynamicItems[] = div
|
|
(
|
|
setClass('relative oeverflow-hidden flex justify-between border-t px-4 py-3 h-18'),
|
|
div
|
|
(
|
|
setClass('flex-1 overflow-hidden h-11 leading-normal'),
|
|
set::title($dynamic->title),
|
|
icon
|
|
(
|
|
setClass('text-lg text-primary pr-1'),
|
|
'horn'
|
|
),
|
|
span(substr($dynamic->addedDate, 0, 10)),
|
|
a
|
|
(
|
|
setClass('text-black ml-1'),
|
|
set::href($dynamic->link),
|
|
set::target('_blank'),
|
|
$dynamic->title
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
$patchItems = array();
|
|
foreach($zentaoData->patches as $patch)
|
|
{
|
|
$patchItems[] = div
|
|
(
|
|
setClass('border-t pt-2.5 pb-3 px-4'),
|
|
$buildPluginHeader($patch->name, $patch->viewLink),
|
|
div
|
|
(
|
|
setClass('overflow-hidden h-10'),
|
|
$patch->desc
|
|
)
|
|
);
|
|
}
|
|
|
|
if($config->edition != 'ipd')
|
|
{
|
|
$upgradeEditions = array('biz', 'max', 'ipd');
|
|
if($config->edition == 'biz') $upgradeEditions = array('max', 'ipd');
|
|
if($config->edition == 'max') $upgradeEditions = array('ipd');
|
|
|
|
$upgradeItems = array();
|
|
foreach($upgradeEditions as $edition)
|
|
{
|
|
$featureItems = array();
|
|
foreach($lang->admin->productFeature[$edition] as $feature)
|
|
{
|
|
$featureItems[] = div(
|
|
setClass('flex items-center my-1 pl-5' . ($isEn ? '' : ' h-5')),
|
|
div(
|
|
setClass('rounded-full light mr-2 w-2 h-2')
|
|
),
|
|
$feature
|
|
);
|
|
}
|
|
|
|
$upgradeItems[] = div(
|
|
setClass('border-t py-1.5'),
|
|
$buildHeader($lang->admin->{$edition . 'Tag'}, $config->admin->apiRoot, 'zentao', $lang->admin->productDetail),
|
|
$featureItems
|
|
);
|
|
}
|
|
}
|
|
|
|
$isZeroDay = empty($dateUsed->year) && empty($dateUsed->month) && empty($dateUsed->day);
|
|
div
|
|
(
|
|
setClass('flex w-full'),
|
|
div
|
|
(
|
|
setClass('flex-1'),
|
|
$settingItems ? div
|
|
(
|
|
setID('settings'),
|
|
setClass('bg-white rounded-md mb-4'),
|
|
$buildHeader($lang->admin->setting),
|
|
div
|
|
(
|
|
setClass('flex flex-wrap pl-4'),
|
|
on::click('redirectSetting'),
|
|
$settingItems
|
|
)
|
|
) : null,
|
|
$flowItems ? div
|
|
(
|
|
setID('flows'),
|
|
setClass('bg-white rounded-md mb-4'),
|
|
$buildHeader($lang->admin->setFlow),
|
|
div
|
|
(
|
|
setClass('flex flex-wrap pl-4'),
|
|
on::click('redirectSetting'),
|
|
$flowItems
|
|
)
|
|
) : null,
|
|
$pluginItems ? div
|
|
(
|
|
setID('plugin'),
|
|
setClass('bg-white rounded-md mb-4'),
|
|
$buildHeader($lang->admin->pluginRecommendation, $config->admin->extensionURL),
|
|
div
|
|
(
|
|
setClass('flex flex-wrap pl-4'),
|
|
$pluginItems
|
|
)
|
|
) : null,
|
|
div
|
|
(
|
|
setID('official'),
|
|
setClass('flex'),
|
|
div
|
|
(
|
|
setClass('bg-white rounded-md mb-4 w-1/3'),
|
|
$buildHeader($lang->admin->officialAccount),
|
|
div
|
|
(
|
|
setClass('flex px-4'),
|
|
img
|
|
(
|
|
setClass('w-1/3'),
|
|
set::src('static/images/wechat.jpg')
|
|
),
|
|
div
|
|
(
|
|
setClass('pl-2 w-2/3'),
|
|
$lang->admin->followUs,
|
|
div
|
|
(
|
|
setClass('text-gray'),
|
|
$lang->admin->followUsContent
|
|
)
|
|
)
|
|
),
|
|
!$bind && !$ignore && $hasInternet && common::hasPriv('admin', 'register') ? div
|
|
(
|
|
setClass('px-4 pb-4'),
|
|
substr($lang->admin->notice->register, 0, strpos($lang->admin->notice->register, '%s')),
|
|
a
|
|
(
|
|
set::href(inlink('register')),
|
|
$lang->admin->registerNotice->submitHere
|
|
),
|
|
substr($lang->admin->notice->register, strpos($lang->admin->notice->register, '%s') + 2)
|
|
) : null
|
|
),
|
|
div
|
|
(
|
|
setID('publicClass'),
|
|
setClass('bg-white rounded-md ml-4 mb-4 w-2/3'),
|
|
$buildHeader($lang->admin->publicClass, $config->admin->classURL),
|
|
div
|
|
(
|
|
setClass('flex pl-4'),
|
|
$classItems
|
|
)
|
|
)
|
|
)
|
|
),
|
|
div
|
|
(
|
|
setID('zentaoinfo'),
|
|
setClass('bg-white rounded-md ml-4 px-4 w-1/3'),
|
|
div
|
|
(
|
|
setClass('flex justify-between items-center h-14'),
|
|
div
|
|
(
|
|
setClass('panel-title text-md py-2.5'),
|
|
$lang->admin->zentaoInfo
|
|
),
|
|
div
|
|
(
|
|
setStyle(array('letter-spacing' => '1px')),
|
|
$lang->admin->zentaoUsed,
|
|
$buildUsed((int)$dateUsed->year, $lang->year),
|
|
$buildUsed((int)$dateUsed->month, $lang->admin->mon),
|
|
$buildUsed((int)$dateUsed->day, $lang->admin->day),
|
|
$isZeroDay ? span
|
|
(
|
|
setClass('bg-gray-100 rounded-md text-lg mx-1 px-1 py-0.5'),
|
|
0
|
|
) : null,
|
|
$isZeroDay ? $lang->admin->day : null
|
|
|
|
)
|
|
),
|
|
div
|
|
(
|
|
setClass('border rounded-md mb-4'),
|
|
$buildHeader($lang->admin->updateDynamics, $config->admin->dynamicURL),
|
|
$dynamicItems
|
|
),
|
|
div
|
|
(
|
|
setClass('border rounded-md mb-4'),
|
|
$buildHeader($lang->admin->updatePatch, $config->admin->patchURL),
|
|
$patchItems
|
|
),
|
|
$config->edition != 'ipd' ? div
|
|
(
|
|
setClass('border rounded-md mb-4'),
|
|
$buildHeader($lang->admin->upgradeRecommend),
|
|
$upgradeItems
|
|
) : null
|
|
)
|
|
);
|
|
|
|
render();
|