index.html.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. /**
  3. * The index view file of project 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 Yanyi Cao <caoyanyi@easycorp.ltd>
  7. * @package project
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. /* zin: Define the feature bar on main menu. */
  12. featureBar
  13. (
  14. set::current($browseType),
  15. set::linkParams("projectID={$project->id}&browseType={key}")
  16. );
  17. /* zin: Define the toolbar on main menu. */
  18. if(hasPriv('execution', 'create'))
  19. {
  20. toolbar
  21. (
  22. item(set(array
  23. (
  24. 'icon' => 'plus',
  25. 'text' => $lang->project->createKanban,
  26. 'class' => 'primary execution-create-btn',
  27. 'url' => createLink('execution', 'create', "projectID={$project->id}")
  28. )))
  29. );
  30. }
  31. $app->loadLang('kanban');
  32. $kanbanCards = array();
  33. $today = helper::today();
  34. if(!empty($kanbanList))
  35. {
  36. foreach($kanbanList as $kanban)
  37. {
  38. $status = ($kanban->end < $today && !in_array($kanban->status, array('done', 'closed', 'suspended'))) ? 'delay' : $kanban->status;
  39. $statusLabel = $config->project->statusLabelList[$status];
  40. $count = 0;
  41. $members = zget($memberGroup, $kanban->id, array());
  42. $memberAvatars = null;
  43. $lastMember = end($members);
  44. foreach($members as $key => $member)
  45. {
  46. if(!isset($userIdPairs[$member->account]))
  47. {
  48. $kanban->teamCount --;
  49. unset($members[$key]);
  50. continue;
  51. }
  52. if($count > 2) break;
  53. $memberAvatars[] = div
  54. (
  55. setClass('avatar circle size-sm'),
  56. set::title($userIdPairs[$member->account]),
  57. avatar
  58. (
  59. set::size('sm'),
  60. set::src(zget($usersAvatar, $member->account, '')),
  61. set::text(zget($member, 'realname', $member->account))
  62. )
  63. );
  64. $count ++;
  65. }
  66. $actionItems = array();
  67. foreach($actionList as $action)
  68. {
  69. if(!common::hasPriv('execution', $action)) continue;
  70. if(!$this->execution->isClickable($kanban, $action)) continue;
  71. $actionItem = $config->execution->actionList[$action];
  72. $actionItem['url'] = createLink('execution', $action, "executionID={$kanban->id}");
  73. if($action == 'edit')
  74. {
  75. $actionItem['text'] = $lang->edit;
  76. $actionItem['hint'] = $lang->edit;
  77. }
  78. elseif($action == 'delete')
  79. {
  80. $actionItem['text'] = $lang->delete;
  81. $actionItem['hint'] = $lang->delete;
  82. $actionItem['innerClass'] = $actionItem['className'];
  83. }
  84. $actionItems[] = $actionItem;
  85. }
  86. $cardCount = count($kanbanCards);
  87. $kanbanCards[] = div
  88. (
  89. setClass('col flex-none w-1/4 open-url cursor-pointer'),
  90. hasPriv('execution', 'kanban') ? set('data-url', createLink('execution', 'kanban', "kanbanID={$kanban->id}")) : null,
  91. div
  92. (
  93. setClass('border py-2 pl-4', $cardCount % 4 == 0 ? '' : 'ml-4', $cardCount > 3 ? 'mt-4' : ''),
  94. div
  95. (
  96. setClass('flex justify-between items-center'),
  97. span
  98. (
  99. setClass("project-status label rounded-full {$statusLabel} flex-none"),
  100. $status != 'delay' ? $lang->project->statusList[$status] : sprintf($lang->project->delayInfo, helper::diffDate($today, $kanban->end))
  101. ),
  102. a
  103. (
  104. setClass('project-name ml-2 flex-auto text-clip'),
  105. set::href(createLink('execution', 'kanban', "kanbanID={$kanban->id}")),
  106. set::title($kanban->name),
  107. h::strong($kanban->name)
  108. ),
  109. div
  110. (
  111. $actionItems ? dropdown
  112. (
  113. set::caret(false),
  114. btn
  115. (
  116. setClass('ghost square mr-2 open-url not-open-url'),
  117. set::icon('ellipsis-v')
  118. ),
  119. set::items($actionItems)
  120. ) : null
  121. )
  122. ),
  123. div
  124. (
  125. div
  126. (
  127. setClass('kanban-desc h-24 overflow-hidden pt-2 mr-4 text-gray'),
  128. set::title(strip_tags(htmlspecialchars_decode($kanban->desc))),
  129. strip_tags(htmlspecialchars_decode($kanban->desc))
  130. ),
  131. div
  132. (
  133. setClass('project-footer pt-2'),
  134. div
  135. (
  136. setClass('flex justify-between items-center'),
  137. div
  138. (
  139. setClass('project-members avatar-group gap-4'),
  140. $memberAvatars,
  141. $kanban->teamCount > 4 ? span
  142. (
  143. '…'
  144. ) : null,
  145. $kanban->teamCount > 3 ? div(setClass('avatar size-sm circle'), set::title($lastMember->realname), avatar
  146. (
  147. set::size('sm'),
  148. set::text($lastMember->realname),
  149. set::src(zget($usersAvatar, $lastMember->account, ''))
  150. )) : null,
  151. span
  152. (
  153. setClass('project-members-total pl-2 mt-1'),
  154. sprintf($lang->project->teamSumCount, count($members))
  155. )
  156. ),
  157. div
  158. (
  159. setClass('kanban-acl flex items-center justify-center pr-4'),
  160. icon
  161. (
  162. $kanban->acl == 'private' ? 'lock' : 'inherit-space',
  163. setClass('mr-1')
  164. ),
  165. zget($lang->execution->kanbanAclList, $kanban->acl, '')
  166. )
  167. )
  168. )
  169. )
  170. )
  171. );
  172. }
  173. }
  174. panel
  175. (
  176. setID('cards'),
  177. setClass('row cell canvas'),
  178. set::bodyClass('w-full'),
  179. empty($kanbanList) ? div
  180. (
  181. setClass('dtable-empty-tip'),
  182. div
  183. (
  184. setClass('row gap-4 items-center'),
  185. span
  186. (
  187. setClass('text-gray'),
  188. $lang->noData
  189. ),
  190. hasPriv('execution', 'create') ? btn(set(array
  191. (
  192. 'icon' => 'plus',
  193. 'text' => $lang->project->createKanban,
  194. 'class' => 'btn primary-pale border-primary',
  195. 'url' => createLink('execution', 'create', "projectID={$project->id}")
  196. ))) : null
  197. )
  198. ) : div(
  199. setClass('flex flex-wrap'),
  200. $kanbanCards
  201. ),
  202. !empty($kanbanList) ? div
  203. (
  204. setClass('pt-4 flex justify-end'),
  205. pager
  206. (
  207. set(usePager(array(
  208. 'linkCreator' => helper::createLink('project', 'index', "projectID={$project->id}&browseType={$browseType}&recTotal={recTotal}&recPerPage={recPerPage}&pageID={page}")
  209. )))
  210. )
  211. ) : null
  212. );
  213. /* ====== Render page ====== */
  214. render();