space.html.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. /**
  3. * The space view file of kanban 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 Yuting Wang <wangyuting@easycorp.ltd>
  7. * @package kanban
  8. * @link https://www.zentao.net
  9. */
  10. namespace zin;
  11. featureBar
  12. (
  13. set::current($browseType),
  14. set::linkParams("browseType={key}"),
  15. li
  16. (
  17. set::className('nav-item ml-2'),
  18. checkbox
  19. (
  20. setID('showClosed'),
  21. on::change('changeShowClosed'),
  22. set::checked($this->cookie->showClosed),
  23. $lang->kanban->showClosed
  24. )
  25. )
  26. );
  27. $canCreateKanban = common::hasPriv('kanban', 'create');
  28. $canCreateSpace = common::hasPriv('kanban', 'createSpace');
  29. $canEditSpace = common::hasPriv('kanban', 'editSpace');
  30. $canCloseSpace = common::hasPriv('kanban', 'closeSpace');
  31. $canActivateSpace = common::hasPriv('kanban', 'activateSpace');
  32. $canDeleteSpace = common::hasPriv('kanban', 'deleteSpace');
  33. $canEditKanban = common::hasPriv('kanban','edit');
  34. $canDeleteKanban = common::hasPriv('kanban','delete');
  35. $canCloseKanban = common::hasPriv('kanban', 'close');
  36. $canActivateKanban = common::hasPriv('kanban', 'activate');
  37. toolbar
  38. (
  39. $canCreateKanban && !empty($unclosedSpace) && $browseType != 'involved' ? item(set::icon('plus'), set::text($lang->kanban->create), set::className('secondary'), set::url(createLink('kanban', 'create', "spaceID=0&type={$browseType}")), set('data-toggle', 'modal'), set('data-size', 'lg')) : null,
  40. $canCreateSpace && $browseType != 'involved' ? item(set::icon('plus'), set::text($lang->kanban->createSpace), set::className('primary'), set::url(createLink('kanban', 'createSpace', "type={$browseType}")), set('data-toggle', 'modal')) : null
  41. );
  42. $blocks = array();
  43. foreach($spaceList as $space)
  44. {
  45. $pattern = '/<br[^>]*>|<img[^>]*>/';
  46. $childActions = array();
  47. if($canEditSpace) $childActions[] = array('icon' => 'cog-outline', 'url' => createLink('kanban', 'editSpace', "spaceID={$space->id}"), 'text' => $lang->kanban->settingSpace, 'data-toggle' => 'modal');
  48. if($canCloseSpace && $space->status != 'closed') $childActions[] = array('icon' => 'off', 'url' => createLink('kanban', 'closeSpace', "spaceID={$space->id}"), 'text' => $lang->kanban->closeSpace, 'data-toggle' => 'modal');
  49. if($canActivateSpace && $space->status == 'closed') $childActions[] = array('icon' => 'magic', 'url' => createLink('kanban', 'activateSpace', "spaceID={$space->id}"), 'text' => $lang->kanban->activateSpace, 'data-toggle' => 'modal');
  50. if($canDeleteSpace) $childActions[] = array('icon' => 'trash', 'url' => createLink('kanban', 'deleteSpace', "spaceID={$space->id}"), 'text' => $lang->kanban->deleteSpace, 'innterClass' => 'ajax-btn', 'data-confirm' => $lang->kanban->confirmDeleteSpace);
  51. $headingActions = array();
  52. if($canCreateKanban && $space->status != 'closed' && $browseType != 'involved') $headingActions[] = array('type' => 'ghost', 'icon' => 'plus', 'url' => createLink('kanban', 'create', "spaceID={$space->id}&type={$space->type}"), 'text' => $lang->kanban->create, 'data-toggle' => 'modal', 'data-size' => 'lg');
  53. if(!empty($childActions)) $headingActions[] = array('type' => 'dropdown', 'btnType' => 'dropdown', 'icon' => 'cog-outline', 'text' => $lang->kanban->setting, 'caret' => true, 'items' => $childActions);
  54. $kanbans = array();
  55. if(!empty($space->kanbans))
  56. {
  57. foreach($space->kanbans as $kanbanID => $kanban)
  58. {
  59. $kanbanDescTitle = str_replace("\n", '', strip_tags($kanban->desc));
  60. $kanbanDesc = str_replace("\n", '', preg_replace($pattern, '', $kanban->desc));
  61. $teamPairs = array_filter(explode(',', ",$kanban->createdBy,$kanban->owner,$kanban->team"));
  62. $teamPairs = array_unique($teamPairs);
  63. $count = 0;
  64. $userAvatars = array();
  65. $teamCount = count($teamPairs);
  66. foreach($teamPairs as $member)
  67. {
  68. if($count > 3) break;
  69. if(empty($users[$member])) continue;
  70. $userAvatars[] = userAvatar(set::account($users[$member]), set::avatar($usersAvatar[$member]), set::realname($users[$member]), set::size('sm'));
  71. $count ++;
  72. }
  73. $cardActions = array();
  74. if($canEditKanban) $cardActions[] = array('icon' => 'edit', 'text' => $lang->kanban->edit, 'url' => createLink('kanban', 'edit', "kanbanID={$kanban->id}"), 'data-toggle' => 'modal', 'data-size' => 'lg');
  75. if($canCloseKanban && $kanban->status == 'active') $cardActions[] = array('icon' => 'off', 'text' => $lang->kanban->close, 'url' => createLink('kanban', 'close', "kanbanID={$kanban->id}"), 'data-toggle' => 'modal');
  76. if($canActivateKanban && $kanban->status == 'closed') $cardActions[] = array('icon' => 'magic', 'text' => $lang->kanban->activate, 'url' => createLink('kanban', 'activate', "kanbanID={$kanban->id}"), 'data-toggle' => 'modal');
  77. if($canDeleteKanban) $cardActions[] = array('icon' => 'trash', 'text' => $lang->kanban->delete, 'url' => createLink('kanban', 'delete', "kanbanID={$kanban->id}"), 'innterClass' => 'ajax-btn', 'data-confirm' => $lang->kanban->confirmDeleteKanban);
  78. $teamCountLang = ($teamCount > 1) ? $lang->kanban->teamSumCount : str_replace("Pers", "Person", $lang->kanban->teamSumCount);
  79. $cardsCount = ($kanban->cardsCount > 1) ? str_replace("Card", "Cards", $lang->kanban->cardsCount) : $lang->kanban->cardsCount;
  80. $kanbans[] = cell
  81. (
  82. set::width($app->getClientLang() == 'en' ? '1/3' : '1/4'),
  83. set::className('px-2 pb-4 overflow-hidden'),
  84. div
  85. (
  86. setID('kanban-' . $kanbanID),
  87. set::className('kanban-card border px-4 pb-2 pt-1 open-url'),
  88. set('data-url', createLink('kanban', 'view', "kanbanID=$kanbanID")),
  89. div
  90. (
  91. set::className('flex items-center'),
  92. cell(set::className('ellipsis font-bold mr-1'), set::title($kanban->name), $kanban->name),
  93. $kanban->status == 'closed' ? cell(set::className('label gray mx-1'), setStyle(array('min-width' => '44px')), $lang->kanban->closed) : null,
  94. $space->type == 'cooperation' && $kanban->owner == $this->app->user->account ? cell(set::className('label text-important ring-important mx-1'), setStyle(array('min-width' => '44px')), $lang->kanban->mine) : null,
  95. $cardActions ? cell
  96. (
  97. set::className('flex-1 text-right card-settings'),
  98. dropdown
  99. (
  100. btn
  101. (
  102. on::click()->prevent(),
  103. setClass('btn dropdown-toggle ghost'),
  104. set::icon('ellipsis-v'),
  105. set::caret(false)
  106. ),
  107. set::items($cardActions)
  108. )
  109. ) : null
  110. ),
  111. div(set::className('h-16 mb-2 overflow-hidden'), set::title($kanbanDescTitle), html($kanbanDesc)),
  112. div
  113. (
  114. set::className('flex items-center'),
  115. cell(set::className('flex items-center mr-2'), $userAvatars),
  116. cell(sprintf($teamCountLang, $teamCount)),
  117. cell(set::className('flex-1 text-right'), empty($kanban->cardsCount) ? $lang->kanban->noCard : sprintf($cardsCount, $kanban->cardsCount))
  118. )
  119. )
  120. );
  121. }
  122. }
  123. $blocks[] = blockPanel
  124. (
  125. set::className('mb-4'),
  126. set::title($space->name),
  127. set::titleIcon('cube'),
  128. $space->status == 'closed' ? to::titleSuffix(span(set::className('label gray'), $lang->kanban->closed)) : null,
  129. set::headingActions($headingActions),
  130. !empty($space->kanbans) ? div(set::className('flex flex-wrap'), $kanbans) : div(set::className('dtable'), div(set::className('dtable-empty-tip'), span(set::className('text-gray'), $lang->kanban->empty)))
  131. );
  132. }
  133. !empty($spaceList) ? $blocks : div(set::className('dtable'), setKey('empty-tip'), div(set::className('dtable-empty-tip'), span(set::className('text-gray'), $lang->kanbanspace->empty)));
  134. if(!empty($spaceList)) div(set::className('table-footer'), setKey('pager'), pager(set(usePager()), set::className('pull-right')));