index.html.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  1. <?php
  2. /**
  3. * The index view file of admin module of ZenTaoPMS.
  4. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
  5. * @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  6. * @author Gang Liu <liugang@easycorp.ltd>
  7. * @package admin
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. /* Get latest data from zentao.net if ZenTaoPMS has internet and the user is admin. */
  12. jsVar('hasInternet', $zentaoData->hasData || $hasInternet);
  13. jsVar('isAdminUser', $this->app->user->admin);
  14. $isEn = $app->getClientLang() == 'en';
  15. $buildHeader = function(string $title, string $actionUrl = '', string $titleIcon = '', string $actionLang = '', string $actionIcon = ''): h
  16. {
  17. global $lang;
  18. return div
  19. (
  20. setClass('flex justify-between items-center pl-4 h-10'),
  21. div
  22. (
  23. setClass('panel-title'),
  24. $titleIcon ? icon
  25. (
  26. setClass('text-lg text-primary pr-1'),
  27. $titleIcon
  28. ) : null,
  29. $title
  30. ),
  31. $actionUrl ? a
  32. (
  33. setClass('text-gray pr-3'),
  34. set::target('_blank'),
  35. set::href($actionUrl),
  36. $actionLang ? $actionLang : $lang->more,
  37. icon($actionIcon ? $actionIcon : 'caret-right')
  38. ) : null
  39. );
  40. };
  41. $buildPluginHeader = function($name, $url): h
  42. {
  43. return div
  44. (
  45. setClass('flex justify-between items-center'),
  46. div
  47. (
  48. setClass('panel-title py-2.5'),
  49. $name
  50. ),
  51. a
  52. (
  53. //setClass('flex items-center'),
  54. set::href($url),
  55. set::target('_blank'),
  56. icon
  57. (
  58. setClass('text-primary bg-primary-100 p-1'),
  59. 'download-alt'
  60. )
  61. )
  62. );
  63. };
  64. $buildUsed = function(int $amount, string $unit = ''): array
  65. {
  66. return array
  67. (
  68. $amount ? span
  69. (
  70. setClass('bg-gray-100 rounded-md text-lg mx-1 px-1 py-0.5'),
  71. $amount
  72. ) : null,
  73. $amount ? $unit : ''
  74. );
  75. };
  76. $settingItems = array();
  77. $flowItems = array();
  78. foreach($lang->admin->menuList as $menuKey => $menu)
  79. {
  80. if($config->vision == 'lite' and !in_array($menuKey, $config->admin->liteMenuList)) continue;
  81. $items = div
  82. (
  83. setClass('pb-4 pr-4 h-32 w-1/' . ($config->vision == 'lite' || $isEn ? 3 : 5)),
  84. col
  85. (
  86. setClass('setting-box cursor-pointer border border-hover rounded-md px-2 py-1 h-full'),
  87. set('data-id', $menuKey),
  88. empty($menu['disabled']) ? set('data-url', zget($menu, 'link', '')) : null,
  89. !empty($menu['disabled']) ? setClass('disabled') : null,
  90. !empty($menu['disabled']) ? set::title($lang->admin->noPriv) : null,
  91. h4
  92. (
  93. setClass('flex my-2.5 w-full'),
  94. 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]) ?
  95. a
  96. (
  97. setClass('text-gray'),
  98. set::href($config->admin->helpURL[$menuKey]),
  99. set::title($lang->help),
  100. set::target('_blank'),
  101. icon('help')
  102. ) : '')
  103. ),
  104. p
  105. (
  106. setClass('overflow-hidden text-left text-gray pb-4 h-12 leading-6'),
  107. set::title($menu['desc']),
  108. $menu['desc']
  109. )
  110. )
  111. );
  112. if(!empty($menu['group']) && $menu['group'] == 'flow')
  113. {
  114. $flowItems[] = $items;
  115. }
  116. else
  117. {
  118. $settingItems[] = $items;
  119. }
  120. }
  121. $pluginItems = array();
  122. if($zentaoData->plugins)
  123. {
  124. foreach($zentaoData->plugins as $plugin)
  125. {
  126. if(!$plugin) continue;
  127. $pluginDesc = empty($plugin->abstract) ? '' : preg_replace('/[[:cntrl:]]/mu', '', strip_tags($plugin->abstract));
  128. $pluginItems[] = div
  129. (
  130. setClass('pr-4 pb-4 w-1/3 h-32'),
  131. div
  132. (
  133. setClass('border rounded-md px-3 py-2'),
  134. $buildPluginHeader($plugin->name, $plugin->viewLink),
  135. div
  136. (
  137. setClass('overflow-hidden text-gray h-12 leading-6'),
  138. set::title($pluginDesc),
  139. $pluginDesc
  140. )
  141. )
  142. );
  143. }
  144. }
  145. $classItems = array();
  146. if($zentaoData->classes)
  147. {
  148. foreach($zentaoData->classes as $class)
  149. {
  150. $classItems[] = a
  151. (
  152. setClass('border border-hover rounded-md mr-4 mb-4 p-1 w-1/3'),
  153. set::href($class->viewLink),
  154. set::target('_blank'),
  155. img
  156. (
  157. set::src($class->image)
  158. ),
  159. div
  160. (
  161. setClass('overflow-hidden text-md text-center font-bold text-black mb-1.5 p-1 h-6'),
  162. $class->name
  163. )
  164. );
  165. }
  166. }
  167. $dynamicItems = array();
  168. foreach($zentaoData->dynamics as $dynamic)
  169. {
  170. $dynamicItems[] = div
  171. (
  172. setClass('relative oeverflow-hidden flex justify-between border-t px-4 py-3 h-18'),
  173. div
  174. (
  175. setClass('flex-1 overflow-hidden h-11 leading-normal'),
  176. set::title($dynamic->title),
  177. icon
  178. (
  179. setClass('text-lg text-primary pr-1'),
  180. 'horn'
  181. ),
  182. span(substr($dynamic->addedDate, 0, 10)),
  183. a
  184. (
  185. setClass('text-black ml-1'),
  186. set::href($dynamic->link),
  187. set::target('_blank'),
  188. $dynamic->title
  189. )
  190. )
  191. );
  192. }
  193. $patchItems = array();
  194. foreach($zentaoData->patches as $patch)
  195. {
  196. $patchItems[] = div
  197. (
  198. setClass('border-t pt-2.5 pb-3 px-4'),
  199. $buildPluginHeader($patch->name, $patch->viewLink),
  200. div
  201. (
  202. setClass('overflow-hidden h-10'),
  203. $patch->desc
  204. )
  205. );
  206. }
  207. if($config->edition != 'ipd')
  208. {
  209. $upgradeEditions = array('biz', 'max', 'ipd');
  210. if($config->edition == 'biz') $upgradeEditions = array('max', 'ipd');
  211. if($config->edition == 'max') $upgradeEditions = array('ipd');
  212. $upgradeItems = array();
  213. foreach($upgradeEditions as $edition)
  214. {
  215. $featureItems = array();
  216. foreach($lang->admin->productFeature[$edition] as $feature)
  217. {
  218. $featureItems[] = div(
  219. setClass('flex items-center my-1 pl-5' . ($isEn ? '' : ' h-5')),
  220. div(
  221. setClass('rounded-full light mr-2 w-2 h-2')
  222. ),
  223. $feature
  224. );
  225. }
  226. $upgradeItems[] = div(
  227. setClass('border-t py-1.5'),
  228. $buildHeader($lang->admin->{$edition . 'Tag'}, $config->admin->apiRoot, 'zentao', $lang->admin->productDetail),
  229. $featureItems
  230. );
  231. }
  232. }
  233. $isZeroDay = empty($dateUsed->year) && empty($dateUsed->month) && empty($dateUsed->day);
  234. div
  235. (
  236. setClass('flex w-full'),
  237. div
  238. (
  239. setClass('flex-1'),
  240. $settingItems ? div
  241. (
  242. setID('settings'),
  243. setClass('bg-white rounded-md mb-4'),
  244. $buildHeader($lang->admin->setting),
  245. div
  246. (
  247. setClass('flex flex-wrap pl-4'),
  248. on::click('redirectSetting'),
  249. $settingItems
  250. )
  251. ) : null,
  252. $flowItems ? div
  253. (
  254. setID('flows'),
  255. setClass('bg-white rounded-md mb-4'),
  256. $buildHeader($lang->admin->setFlow),
  257. div
  258. (
  259. setClass('flex flex-wrap pl-4'),
  260. on::click('redirectSetting'),
  261. $flowItems
  262. )
  263. ) : null,
  264. $pluginItems ? div
  265. (
  266. setID('plugin'),
  267. setClass('bg-white rounded-md mb-4'),
  268. $buildHeader($lang->admin->pluginRecommendation, $config->admin->extensionURL),
  269. div
  270. (
  271. setClass('flex flex-wrap pl-4'),
  272. $pluginItems
  273. )
  274. ) : null,
  275. div
  276. (
  277. setID('official'),
  278. setClass('flex'),
  279. div
  280. (
  281. setClass('bg-white rounded-md mb-4 w-1/3'),
  282. $buildHeader($lang->admin->officialAccount),
  283. div
  284. (
  285. setClass('flex px-4'),
  286. img
  287. (
  288. setClass('w-1/3'),
  289. set::src('static/images/wechat.jpg')
  290. ),
  291. div
  292. (
  293. setClass('pl-2 w-2/3'),
  294. $lang->admin->followUs,
  295. div
  296. (
  297. setClass('text-gray'),
  298. $lang->admin->followUsContent
  299. )
  300. )
  301. ),
  302. !$bind && !$ignore && $hasInternet && common::hasPriv('admin', 'register') ? div
  303. (
  304. setClass('px-4 pb-4'),
  305. substr($lang->admin->notice->register, 0, strpos($lang->admin->notice->register, '%s')),
  306. a
  307. (
  308. set::href(inlink('register')),
  309. $lang->admin->registerNotice->submitHere
  310. ),
  311. substr($lang->admin->notice->register, strpos($lang->admin->notice->register, '%s') + 2)
  312. ) : null
  313. ),
  314. div
  315. (
  316. setID('publicClass'),
  317. setClass('bg-white rounded-md ml-4 mb-4 w-2/3'),
  318. $buildHeader($lang->admin->publicClass, $config->admin->classURL),
  319. div
  320. (
  321. setClass('flex pl-4'),
  322. $classItems
  323. )
  324. )
  325. )
  326. ),
  327. div
  328. (
  329. setID('zentaoinfo'),
  330. setClass('bg-white rounded-md ml-4 px-4 w-1/3'),
  331. div
  332. (
  333. setClass('flex justify-between items-center h-14'),
  334. div
  335. (
  336. setClass('panel-title text-md py-2.5'),
  337. $lang->admin->zentaoInfo
  338. ),
  339. div
  340. (
  341. setStyle(array('letter-spacing' => '1px')),
  342. $lang->admin->zentaoUsed,
  343. $buildUsed((int)$dateUsed->year, $lang->year),
  344. $buildUsed((int)$dateUsed->month, $lang->admin->mon),
  345. $buildUsed((int)$dateUsed->day, $lang->admin->day),
  346. $isZeroDay ? span
  347. (
  348. setClass('bg-gray-100 rounded-md text-lg mx-1 px-1 py-0.5'),
  349. 0
  350. ) : null,
  351. $isZeroDay ? $lang->admin->day : null
  352. )
  353. ),
  354. div
  355. (
  356. setClass('border rounded-md mb-4'),
  357. $buildHeader($lang->admin->updateDynamics, $config->admin->dynamicURL),
  358. $dynamicItems
  359. ),
  360. div
  361. (
  362. setClass('border rounded-md mb-4'),
  363. $buildHeader($lang->admin->updatePatch, $config->admin->patchURL),
  364. $patchItems
  365. ),
  366. $config->edition != 'ipd' ? div
  367. (
  368. setClass('border rounded-md mb-4'),
  369. $buildHeader($lang->admin->upgradeRecommend),
  370. $upgradeItems
  371. ) : null
  372. )
  373. );
  374. render();