ajaxgetolddropmenu.html.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. <?php js::set('projectID', $projectID);?>
  2. <?php js::set('module', $module);?>
  3. <?php js::set('method', $method);?>
  4. <style>
  5. #navTabs {position: sticky; top: 0; background: #fff; z-index: 950;}
  6. #navTabs > li {padding: 0px 10px; display: inline-block}
  7. #navTabs > li > span {display: inline-block;}
  8. #navTabs > li > a {margin: 0!important; padding: 8px 0px; display: inline-block}
  9. #tabContent {margin-top: 5px; z-index: 900; max-width: 220px}
  10. .projectTree ul {list-style: none; margin: 0}
  11. .projectTree .projects > ul {padding-left: 7px;}
  12. .projectTree .projects > ul > li > div {display: flex; flex-flow: row nowrap; justify-content: flex-start; align-items: center;}
  13. .projectTree .projects > ul > li label {background: rgba(255,255,255,0.5); line-height: unset; color: #838a9d; border: 1px solid #d8d8d8; border-radius: 2px; padding: 1px 4px;}
  14. .projectTree li a i.icon {font-size: 15px !important;}
  15. .projectTree li a i.icon:before {min-width: 16px !important;}
  16. .projectTree li .label {position: unset; margin-bottom: 0;}
  17. .projectTree li > a, div.hide-in-search>a {display: block; padding: 2px 10px 2px 5px; overflow: hidden; line-height: 20px; text-overflow: ellipsis; white-space: nowrap; border-radius: 4px;}
  18. .projectTree .tree li > .list-toggle {line-height: 24px;}
  19. .projectTree .tree li.has-list.open:before {content: unset;}
  20. .tree.noProgram li {padding-left: 0;}
  21. #swapper li > div.hide-in-search>a:focus, #swapper li > div.hide-in-search>a:hover {color: #838a9d; cursor: default;}
  22. #swapper li > a {margin-top: 4px; margin-bottom: 4px;}
  23. #swapper li {padding-top: 0; padding-bottom: 0;}
  24. #swapper .tree li > .list-toggle {top: -1px;}
  25. #dropMenu div#closed {width: 90px; height: 25px; line-height: 25px; background-color: #ddd; color: #3c495c; text-align: center; margin-left: 15px; border-radius: 2px;}
  26. #gray-line {width:230px; height: 1px; margin-left: 10px; margin-bottom:2px; background-color: #ddd;}
  27. </style>
  28. <?php
  29. $projectCounts = array();
  30. $projectNames = array();
  31. $defaultLink = $link;
  32. $tabActive = '';
  33. $myProjects = 0;
  34. $others = 0;
  35. $dones = 0;
  36. $currentProject = '';
  37. foreach($projects as $programID => $programProjects)
  38. {
  39. $projectCounts[$programID]['myProject'] = 0;
  40. $projectCounts[$programID]['others'] = 0;
  41. $projectCounts[$programID]['closed'] = 0;
  42. foreach($programProjects as $project)
  43. {
  44. if($project->status != 'done' and $project->status != 'closed' and $project->PM == $this->app->user->account) $projectCounts[$programID]['myProject'] ++;
  45. if($project->status != 'done' and $project->status != 'closed' and !($project->PM == $this->app->user->account)) $projectCounts[$programID]['others'] ++;
  46. if($project->status == 'done' or $project->status == 'closed') $projectCounts[$programID]['closed'] ++;
  47. $projectNames[] = $project->name;
  48. }
  49. }
  50. $projectsPinYin = common::convert2Pinyin($projectNames);
  51. $myProjectsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '<ul class="tree noProgram">';
  52. $normalProjectsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '<ul class="tree noProgram">';
  53. $closedProjectsHtml = $config->systemMode == 'ALM' ? '<ul class="tree tree-angles" data-ride="tree">' : '<ul class="tree noProgram">';
  54. $indexLink = helper::createLink('project', 'index', "projectID=%s");
  55. foreach($projects as $programID => $programProjects)
  56. {
  57. /* Add the program name before project. */
  58. if(isset($programs[$programID]) and $config->systemMode == 'ALM')
  59. {
  60. $programName = zget($programs, $programID);
  61. if($projectCounts[$programID]['myProject']) $myProjectsHtml .= '<li><div class="hide-in-search"><a class="text-muted not-list-item" title="' . $programName . '">' . $programName . '</a> <label class="label">' . $lang->program->common . '</label></div><ul>';
  62. if($projectCounts[$programID]['others']) $normalProjectsHtml .= '<li><div class="hide-in-search"><a class="text-muted not-list-item" title="' . $programName . '">' . $programName . '</a> <label class="label">' . $lang->program->common . '</label></div><ul>';
  63. if($projectCounts[$programID]['closed']) $closedProjectsHtml .= '<li><div class="hide-in-search"><a class="text-muted not-list-item" title="' . $programName . '">' . $programName . '</a> <label class="label">' . $lang->program->common . '</label></div><ul>';
  64. }
  65. foreach($programProjects as $index => $project)
  66. {
  67. if($project->id == $projectID) $currentProject = $project;
  68. $selected = $project->id == $projectID ? 'selected' : '';
  69. $icon = '<i class="icon icon-sprint"></i> ';
  70. if($project->model != 'waterfall' and (in_array($module, $config->waterfallModules) or $method == 'track'))
  71. {
  72. $link = $indexLink;
  73. }
  74. elseif((in_array($project->model, array('scrum', 'agileplus'))) and
  75. (
  76. (in_array($module, array('issue', 'risk', 'meeting')) and !helper::hasFeature("{$project->model}_{$module}")) or
  77. ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("{$project->model}_measrecord"))
  78. ))
  79. {
  80. $link = $indexLink;
  81. }
  82. elseif(in_array($project->model, array('waterfall', 'waterfallplus')) and
  83. (
  84. (in_array($module, array('issue', 'risk', 'opportunity', 'measrecord', 'auditplan', 'meeting')) and !helper::hasFeature("{$project->model}_{$module}")) or
  85. ($module == 'pssp' and !helper::hasFeature("{$project->model}_process")) or
  86. ($module == 'report' and $method == 'projectsummary' and !helper::hasFeature("{$project->model}_measrecord"))
  87. ))
  88. {
  89. $link = $indexLink;
  90. }
  91. elseif($project->model == 'kanban' and (($module == 'project' and !in_array($method, array('build', 'view', 'manageproducts', 'team', 'whitelist', 'managemembers', 'addwhitelist'))) or $module != 'project'))
  92. {
  93. $link = $indexLink;
  94. }
  95. elseif(empty($project->hasProduct) and $module == 'project' and $method == 'manageproducts')
  96. {
  97. $link = $indexLink;
  98. }
  99. elseif(empty($project->multiple))
  100. {
  101. $link = $indexLink;
  102. }
  103. elseif(!empty($project->isTpl))
  104. {
  105. $link = helper::createLink('project', 'execution', "status=undone&projectID={$project->id}");
  106. }
  107. else
  108. {
  109. $link = $defaultLink;
  110. }
  111. /* Set link when project redefines permissions. */
  112. if($project->auth == 'reset') $link = helper::createLink('project', 'index', "projectID=%s");
  113. if($project->model != 'scrum') $icon = "<i class='icon icon-{$project->model}'></i> ";
  114. $projectName = $icon . $project->name;
  115. if($project->status != 'done' and $project->status != 'closed' and $project->PM == $this->app->user->account)
  116. {
  117. $myProjectsHtml .= '<li>' . html::a(sprintf($link, $project->id), $projectName, '', "class='$selected clickable' title='{$project->name}' data-key='" . zget($projectsPinYin, $project->name, '') . "'") . '</li>';
  118. if($selected == 'selected') $tabActive = 'myProject';
  119. $myProjects ++;
  120. }
  121. else if($project->status != 'done' and $project->status != 'closed' and !($project->PM == $this->app->user->account))
  122. {
  123. $normalProjectsHtml .= '<li>' . html::a(sprintf($link, $project->id), $projectName, '', "class='$selected clickable' title='{$project->name}' data-key='" . zget($projectsPinYin, $project->name, '') . "'") . '</li>';
  124. if($selected == 'selected') $tabActive = 'other';
  125. $others ++;
  126. }
  127. else if($project->status == 'done' or $project->status == 'closed')
  128. {
  129. $closedProjectsHtml .= '<li>' . html::a(sprintf($link, $project->id), $projectName, '', "class='$selected clickable' title='$project->name' data-key='" . zget($projectsPinYin, $project->name, '') . "'") . '</li>';
  130. if($selected == 'selected') $tabActive = 'closed';
  131. }
  132. /* If the project is the last one in the program, print the closed label. */
  133. if($config->systemMode == 'ALM' and isset($programs[$programID]) and !isset($programProjects[$index + 1]))
  134. {
  135. if($projectCounts[$programID]['myProject']) $myProjectsHtml .= '</ul></li>';
  136. if($projectCounts[$programID]['others']) $normalProjectsHtml .= '</ul></li>';
  137. if($projectCounts[$programID]['closed']) $closedProjectsHtml .= '</ul></li>';
  138. }
  139. }
  140. }
  141. $myProjectsHtml .= '</ul>';
  142. $normalProjectsHtml .= '</ul>';
  143. $closedProjectsHtml .= '</ul>';
  144. ?>
  145. <div class="table-row">
  146. <div class="table-col col-left">
  147. <div class='list-group'>
  148. <?php $tabActive = ($myProjects and ($tabActive == 'closed' or $tabActive == 'myProject')) ? 'myProject' : 'other';?>
  149. <?php if($myProjects): ?>
  150. <ul class="nav nav-tabs nav-tabs-primary" id="navTabs">
  151. <li class="<?php if($tabActive == 'myProject') echo 'active';?>"><?php echo html::a('#myProject', $lang->project->myProject, '', "data-toggle='tab' class='not-list-item not-clear-menu'");?><span class="label label-light label-badge"><?php echo $myProjects;?></span><li>
  152. <li class="<?php if($tabActive == 'other') echo 'active';?>"><?php echo html::a('#other', $lang->project->other, '', "data-toggle='tab' class='not-list-item not-clear-menu'")?><span class="label label-light label-badge"><?php echo $others;?></span><li>
  153. </ul>
  154. <?php endif;?>
  155. <div class="tab-content projectTree" id="tabContent">
  156. <div class="tab-pane projects <?php if($tabActive == 'myProject') echo 'active';?>" id="myProject">
  157. <?php echo $myProjectsHtml;?>
  158. </div>
  159. <div class="tab-pane projects <?php if($tabActive == 'other') echo 'active';?>" id="other">
  160. <?php echo $normalProjectsHtml;?>
  161. </div>
  162. </div>
  163. </div>
  164. <div class="col-footer">
  165. <?php //echo html::a(helper::createLink('project', 'browse', 'programID=0&browseType=all'), '<i class="icon icon-cards-view muted"></i> ' . $lang->project->all, '', 'class="not-list-item"'); ?>
  166. <a class='pull-right toggle-right-col not-list-item'><?php echo $lang->project->doneProjects?><i class='icon icon-angle-right'></i></a>
  167. </div>
  168. </div>
  169. <div id="gray-line" hidden></div>
  170. <div id="closed" hidden><?php echo $lang->project->closedProject?></div>
  171. <div class="table-col col-right projectTree">
  172. <div class='list-group projects'><?php echo $closedProjectsHtml;?></div>
  173. </div>
  174. </div>
  175. <script>
  176. $(function()
  177. {
  178. <?php if($currentProject->status == 'done' or $currentProject->status == 'closed'):?>
  179. $('.col-footer .toggle-right-col').click(function(){ scrollToSelected(); })
  180. <?php else:?>
  181. scrollToSelected();
  182. <?php endif;?>
  183. $('.nav-tabs li span').hide();
  184. $('.nav-tabs li.active').find('span').show();
  185. $('.nav-tabs > li a').click(function()
  186. {
  187. if($('#swapper input[type="search"]').val() == '')
  188. {
  189. $(this).siblings().show();
  190. $(this).parent().siblings('li').find('span').hide();
  191. }
  192. })
  193. $('#swapper [data-ride="tree"]').tree('expand');
  194. $('#swapper #dropMenu .search-box').on('onSearchChange', function(event, value)
  195. {
  196. if(value != '')
  197. {
  198. $('div.hide-in-search').siblings('i').addClass('hide-in-search');
  199. $('.nav-tabs li span').hide();
  200. }
  201. else
  202. {
  203. $('div.hide-in-search').siblings('i').removeClass('hide-in-search');
  204. $('li.has-list div.hide-in-search').removeClass('hidden');
  205. $('.nav-tabs li.active').find('span').show();
  206. }
  207. if($('.form-control.search-input').val().length > 0)
  208. {
  209. $('#closed').attr("hidden", false);
  210. $('#gray-line').attr("hidden", false);
  211. }
  212. else
  213. {
  214. $('#closed').attr("hidden", true);
  215. $('#gray-line').attr("hidden", true);
  216. }
  217. });
  218. $('#swapper #dropMenu').on('onSearchComplete', function(event, value)
  219. {
  220. if($('.list-group.projects').height() == 0)
  221. {
  222. $('#closed').attr("hidden", true);
  223. $('#gray-line').attr("hidden", true);
  224. }
  225. });
  226. })
  227. </script>