browsebylist.html.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php $canOrder = (common::hasPriv('program', 'updateOrder') and strpos($orderBy, 'order') !== false)?>
  2. <form class='main-table' id='programForm' method='post' data-ride='table' data-nested='true' data-expand-nest-child='false' data-checkable='false' data-enable-empty-nested-row='true' data-replace-id='programTableList' data-preserve-nested='true' data-nest-level-indent='22'>
  3. <table class='table has-sort-head table-fixed table-nested' id='programList'>
  4. <?php $vars = "status=$status&orderBy=%s";?>
  5. <thead>
  6. <tr>
  7. <th class='table-nest-title'>
  8. <?php echo $lang->nameAB;?>
  9. <a class='table-nest-toggle table-nest-toggle-global' data-expand-text='<?php echo $lang->expand; ?>' data-collapse-text='<?php echo $lang->collapse;?>'></a>
  10. </th>
  11. <th class='c-status'> <?php common::printOrderLink('status', $orderBy, $vars, $lang->program->status);?></th>
  12. <th class='c-user'><?php common::printOrderLink('PM', $orderBy, $vars, $lang->program->PM);?></th>
  13. <th class='text-right c-budget'><?php common::printOrderLink('budget', $orderBy, $vars, $lang->project->budget);?></th>
  14. <th class='c-date'><?php common::printOrderLink('begin', $orderBy, $vars, $lang->project->begin);?></th>
  15. <th class='c-date'><?php common::printOrderLink('end', $orderBy, $vars, $lang->project->end);?></th>
  16. <th class='c-progress'><?php echo $lang->project->progress;?></th>
  17. <?php
  18. $extendFields = $this->program->getFlowExtendFields();
  19. foreach($extendFields as $extendField) echo "<th>{$extendField->name}</th>";
  20. ?>
  21. <th class='text-center c-actions-6'><?php echo $lang->actions;?></th>
  22. </tr>
  23. </thead>
  24. <tbody id='programTableList'>
  25. <?php $originOrders = array(); ?>
  26. <?php foreach($programs as $program):?>
  27. <?php
  28. $trClass = '';
  29. $trAttrs = "data-id='$program->id' data-order='$program->order' data-parent='$program->parent'";
  30. if($program->type == 'program')
  31. {
  32. $trAttrs .= " data-nested='true'";
  33. $trClass .= $program->parent == '0' ? ' is-top-level table-nest-child-hide' : ' table-nest-hide';
  34. }
  35. if($program->parent and isset($programs[$program->parent]))
  36. {
  37. if($program->type != 'program') $trClass .= ' is-nest-child';
  38. if(empty($program->path)) $program->path = $programs[$program->parent]->path . "$program->id,";
  39. $trClass .= ' table-nest-hide';
  40. $trAttrs .= " data-nest-parent='$program->parent' data-nest-path='$program->path'";
  41. }
  42. elseif($program->type != 'program')
  43. {
  44. $trClass .= ' no-nest';
  45. }
  46. $trAttrs .= " class='$trClass'";
  47. $originOrders[] = $program->order;
  48. ?>
  49. <tr <?php echo $trAttrs;?> data-type="<?php echo $program->type;?>" data-status="<?php echo $program->status?>">
  50. <td class='c-name text-left <?php if($canOrder) echo 'sort-handler';?> has-prefix has-suffix' title='<?php echo $program->name?>'>
  51. <?php
  52. $icon = '';
  53. if($program->type == 'program') $icon = ' icon-program';
  54. if($program->type == 'project') $icon = ' icon-common icon-' . $program->model;
  55. $class = $program->type == 'program' ? ' table-nest-toggle' : '';
  56. ?>
  57. <span class="table-nest-icon icon <?php echo $class . $icon;?>"></span>
  58. <?php if($program->type == 'program'):?>
  59. &nbsp;<span class="icon icon-cards-view" style="color: #888fa1;"></span>
  60. <?php echo ($app->user->admin or strpos(",{$app->user->view->programs},", ",$program->id,") !== false) ? html::a($this->createLink('program', 'product', "programID=$program->id"), $program->name) : $program->name;?>
  61. <?php else:?>
  62. <?php echo html::a($this->createLink('project', 'index', "projectID=$program->id", '', '', $program->id), $program->name, '', "class='text-ellipsis' title='{$program->name}'");?>
  63. <?php
  64. if($program->status != 'done' and $program->status != 'closed' and $program->status != 'suspended')
  65. {
  66. $delay = helper::diffDate(helper::today(), $program->end);
  67. if($delay > 0) echo "<span class='label label-danger label-badge'>{$lang->project->statusList['delay']}</span>";
  68. }
  69. ?>
  70. <?php endif;?>
  71. </td>
  72. <td class='c-status'><span class="status-program status-<?php echo $program->status?>"><?php echo zget($lang->project->statusList, $program->status, '');?></span></td>
  73. <td class="c-manager">
  74. <?php if(!empty($program->PM)):?>
  75. <?php $userName = zget($users, $program->PM);?>
  76. <?php echo html::smallAvatar(array('avatar' => $usersAvatar[$program->PM], 'account' => $program->PM, 'name' => $userName), (($program->type == 'program' and $program->grade == 1 )? 'avatar-circle avatar-top avatar-' : 'avatar-circle avatar-') . zget($userIdPairs, $program->PM)); ?>
  77. <?php $userID = isset($PMList[$program->PM]) ? $PMList[$program->PM]->id : '';?>
  78. <?php echo html::a($this->createLink('user', 'profile', "userID=$userID", '', true), $userName, '', "title='{$userName}' data-toggle='modal' data-type='iframe' data-width='600'");?>
  79. <?php endif;?>
  80. </td>
  81. <?php $programBudget = $this->loadModel('project')->getBudgetWithUnit($program->budget);?>
  82. <td class='text-right c-budget'><?php echo $program->budget != 0 ? zget($lang->project->currencySymbol, $program->budgetUnit) . ' ' . $programBudget : $lang->project->future;?></td>
  83. <td><?php echo $program->begin;?></td>
  84. <td><?php echo $program->end == LONG_TIME ? $lang->program->longTime : $program->end;?></td>
  85. <td>
  86. <?php if(isset($progressList[$program->id])):?>
  87. <div class='progress-pie' data-doughnut-size='85' data-color='#00DA88' data-value='<?php echo round($progressList[$program->id])?>' data-width='26' data-height='26' data-back-color='#e8edf3'>
  88. <div class='progress-info'><?php echo round($progressList[$program->id]);?></div>
  89. </div>
  90. <?php endif;?>
  91. </td>
  92. <?php foreach($extendFields as $extendField) echo "<td>" . $this->loadModel('flow')->getFieldValue($extendField, $program) . "</td>";?>
  93. <td class='c-actions'>
  94. <?php echo $this->program->buildOperateMenu($program, 'browse');?>
  95. </td>
  96. </tr>
  97. <?php endforeach;?>
  98. </tbody>
  99. </table>
  100. <div class='table-footer <?php if($status == 'bySearch') echo 'hide';?>'>
  101. <div id="programSummary" class="table-statistic">&nbsp;<?php echo $summary;?></div>
  102. <?php if($status != 'bySearch') $pager->show('right', 'pagerjs');?>
  103. </div>
  104. </form>
  105. <style>
  106. th.table-nest-title {padding-left: 12px !important;}
  107. th.table-nest-title > .table-nest-toggle-global {left: auto; right: 6px; font-size: 12px; color: #888fa1;}
  108. th.table-nest-title > .table-nest-toggle-global:before {width: 100%; left: 0 !important;}
  109. #programTableList td.c-name span.icon.table-nest-toggle {cursor: pointer;}
  110. #programTableList.sortable-sorting > tr {opacity: 0.7}
  111. #programTableList.sortable-sorting > tr.drag-row {opacity: 1;}
  112. #programTableList > tr.drop-not-allowed {opacity: 0.1!important}
  113. #programList .c-actions {overflow: visible;}
  114. #programList .c-actions .btn-group:last-child {margin-left: -4px;}
  115. #programList > thead > tr > th .table-nest-toggle-global {top: 6px}
  116. #programList > thead > tr > th .table-nest-toggle-global:before {color: #a6aab8;}
  117. #programTableList > tr:last-child .c-actions .dropdown-menu {top: auto; bottom: 100%; margin-bottom: -5px;}
  118. #programTableList .icon-common:before {width: 22px; height: 22px; background: none; color: rgb(166, 170, 184); top: 0; line-height: 22px; margin-right: 2px; font-size: 14px}
  119. #programTableList .icon-project:before {content: '\e99c';}
  120. #programTableList .icon-scrum:before {content: '\e9a2';}
  121. #programTableList .icon-waterfall:before {content: '\e9a4';}
  122. #programTableList .icon-kanban:before {content: '\e983';}
  123. #programTableList .icon-waterfallplus:before {content: '\e9ed';}
  124. #programTableList .icon-agileplus:before {content: '\e9ee';}
  125. #programTableList .icon-ipd:before {content: "\e9f9";}
  126. #programTableList > tr[data-type="program"] > .c-name > a {color: #0b0f18;}
  127. #programTableList > tr[data-nest-parent] {background: #f8f8f8;}
  128. </style>
  129. <?php js::set('originOrders', $originOrders);?>
  130. <script>
  131. $(function()
  132. {
  133. /* Init orders numbers list */
  134. var ordersList = [];
  135. for(var i = 0; i < originOrders.length; ++i) ordersList.push(parseInt(originOrders[i]));
  136. ordersList.sort(function(x, y){return x - y;});
  137. var $list = $('#programTableList');
  138. $list.addClass('sortable').sortable(
  139. {
  140. reverse: orderBy === 'order_desc',
  141. selector: 'tr',
  142. dragCssClass: 'drag-row',
  143. trigger: $list.find('.sort-handler').length ? '.sort-handler' : null,
  144. before: function(e)
  145. {
  146. if($(e.event.target).closest('a,.btn').length) return false;
  147. },
  148. canMoveHere: function($ele, $target)
  149. {
  150. return $ele.data('parent') === $target.data('parent');
  151. },
  152. start: function(e)
  153. {
  154. e.targets.filter('[data-parent!="' + e.element.attr('data-parent') + '"]').addClass('drop-not-allowed');
  155. },
  156. finish: function(e)
  157. {
  158. var projects = '';
  159. e.list.each(function()
  160. {
  161. projects += $(this.item).data('id') + ',' ;
  162. });
  163. $.post(createLink('project', 'updateOrder'), {'projects' : projects, 'orderBy' : orderBy});
  164. var $thead = $list.closest('table').children('thead');
  165. $thead.find('.headerSortDown, .headerSortUp').removeClass('headerSortDown headerSortUp').addClass('header');
  166. $thead.find('th.sort-default .header').removeClass('header').addClass('headerSortDown');
  167. e.element.addClass('drop-success');
  168. setTimeout(function(){e.element.removeClass('drop-success');}, 800);
  169. $list.children('.drop-not-allowed').removeClass('drop-not-allowed');
  170. $('#programForm').table('initNestedList')
  171. }
  172. });
  173. $('#programForm').on('tableNestStateChanged', function()
  174. {
  175. /* Ensure visible progress pie inited after toggle nest states. */
  176. $('.progress-pie:visible').progressPie();
  177. });
  178. });
  179. </script>