todoblock.html.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. <?php
  2. /**
  3. * The todo block view file of block module of ZenTaoPMS.
  4. *
  5. * @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.cnezsoft.com)
  6. * @license ZPL(http://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
  7. * @author Yidong Wang <yidong@cnezsoft.com>
  8. * @package block
  9. * @version $Id$
  10. * @link https://www.zentao.net
  11. */
  12. if($isExternalCall) die(include('./todolist.html.php'));
  13. ?>
  14. <style>
  15. .block-todoes .panel-body {position: relative; padding-top: 42px; overflow: visible !important; padding-bottom: 0;}
  16. .block-todoes .todoes-input {position: absolute; top: 0; right: 0; left: 0; padding: 0 20px 20px 20px;}
  17. .block-todoes .todoes-input .form-control::-webkit-input-placeholder {font-size: 12px; line-height: 20px;color: #a4a8b6;}
  18. .block-todoes .todoes-input .form-control::-moz-placeholder {font-size: 12px; line-height: 20px; color: #a4a8b6;}
  19. .block-todoes .todoes-input .form-control:-ms-input-placeholder {font-size: 12px; line-height: 20px;color: #a4a8b6;}
  20. .block-todoes .todoes-input .form-control::placeholder {font-size: 12px; line-height: 20px; color: #a4a8b6;}
  21. .block-todoes .todoes {padding: 0 10px 10px 10px; margin: 0 -10px; max-height: 350px; overflow: auto; overflow-x:hidden}
  22. .block-todoes .todoes > li {position: relative; padding: 5px 10px 5px 35px; list-style: none; white-space:nowrap; overflow: auto; overflow-x:hidden;}
  23. .block-todoes .todoes > li:hover {background-color: #e9f2fb;}
  24. .block-todoes .todo-title {padding: 0px;}
  25. .titleBox {max-width: 1440px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; display: block;}
  26. .block-todoes .todo-pri {margin: 0 5px;}
  27. .block-todoes .todo-time {display: inline-block; padding: 0 5px; font-size: 12px; color: #8e939a; width: 95px; min-width: 95px;}
  28. .block-todoes .todo-check {position: absolute; top: 5px; left: 10px; display: block; width: 20px; height: 20px; font-size: 20px; color: transparent; cursor: pointer; background: #fff; border: 2px solid #eee; border-radius: 50%;}
  29. .block-todoes .todo-check:hover {border-color: #8e939a;}
  30. .block-todoes .active > .todo-check {color: #00da88; background: transparent;border: none;}
  31. .block-todoes .todoes-form {position: absolute; top: -45px; right: 0; left: 0; z-index: 1011; max-width: 100%; padding: 12px 20px 20px; visibility: hidden; background: #fff; -webkit-box-shadow: 0 0 20px 0 #bdc9d8; box-shadow: 0 0 20px 0 #bdc9d8; opacity: 0;-webkit-transition: .4s cubic-bezier(.175, .885, .32, 1); -o-transition: .4s cubic-bezier(.175, .885, .32, 1); transition: .4s cubic-bezier(.175, .885, .32, 1); -webkit-transition-property: opacity, visibility; -o-transition-property: opacity, visibility; transition-property: opacity, visibility;}
  32. .block-todoes .todoes-form .form-group > label {padding-left: 0;}
  33. .block-todoes .todoes-form .form-group > label.text-center {text-align: center!important;}
  34. .block-todoes .todoes-form > .form-group:last-child {margin-bottom: 0;}
  35. .block-todoes .todoes-form > h3 {padding: 0 20px 15px; margin: 0 -20px 5px; font-size: 14px; line-height: 20px;}
  36. .block-todoes.show-form .todoes-form {visibility: visible; opacity: 1;}
  37. .block-todoes .todo-flexbetween {display: flex; justify-content: space-between;}
  38. .block-todoes #todoList {display: flex; overflow: hidden;}
  39. .block-todoes .label-todo {width: 50px; min-width: 50px!important; border: none; color: #43A047;}
  40. .block-todoes .todo-title.text-ellipsis {text-overflow: unset;}
  41. [lang^='en'] .block-todoes .todo-pri {width: 60px; min-width: 60px;}
  42. .block-todoes .todoes-input .todo-form-trigger > .btn-info {width: 98%; opacity: 0.8; margin-left: 10px;}
  43. .block-todoes .todoes > li:hover {width: 98%; margin-left: 10px; padding-left: 25px;}
  44. .block-todoes .todoes > li:hover > span {left: 0;}
  45. </style>
  46. <div class='block-todoes'>
  47. <div class='panel-body'>
  48. <div class="todoes-input">
  49. <div class="todo-form-trigger">
  50. <button class='btn btn-info'><i class='icon icon-plus'></i> <?php echo $lang->todo->create;?></button>
  51. </div>
  52. <form class="form-horizontal todoes-form layer not-watch" method='post' target='hiddenwin' action='<?php echo $this->createLink('todo', 'create', 'date=today&userID=&from=block');?>'>
  53. <h3><?php echo $lang->todo->create;?></h3>
  54. <?php $leftWidth = common::checkNotCN() ? 'col-sm-3' : 'col-sm-2';?>
  55. <div class="form-group">
  56. <label for="todoDate" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->date?></label>
  57. <div class="col-sm-9">
  58. <div class="input-control has-icon-right">
  59. <input type="text" class="form-control date" id="todoDate" name="date" placeholder="" autocomplete='off'>
  60. <label for='todoDate' class="input-control-icon-right"><i class="icon icon-delay"></i></label>
  61. </div>
  62. </div>
  63. </div>
  64. <div class="form-group">
  65. <label for="todoPri" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->pri?></label>
  66. <div class="col-sm-4"><?php echo html::select('pri', $lang->todo->priList, '', "class='form-control chosen'");?></div>
  67. </div>
  68. <div class="form-group">
  69. <label for="todoName" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->name?></label>
  70. <div class="col-sm-9 required"><input type="text" class="form-control" autocomplete="off" name="name"></div>
  71. </div>
  72. <div class="form-group">
  73. <label for="todoBegin" class="<?php echo $leftWidth;?>"><?php echo $lang->todo->beginAndEnd?></label>
  74. <div class="col-sm-4">
  75. <select name="begin" id="todoBegin" class="form-control">
  76. <option value=""><?php echo $lang->todo->lblDisableDate;?></option>
  77. </select>
  78. </div>
  79. <label class="col-sm-1 text-center hide-empty-begin" for="todoEnd"> ~ </label>
  80. <div class="col-sm-4 hide-empty-begin">
  81. <select name="end" id="todoEnd" class="form-control"></select>
  82. </div>
  83. </div>
  84. <div class="form-group">
  85. <div class="<?php echo $leftWidth;?>"></div>
  86. <div class="col-sm-9">
  87. <div class="checkbox-primary">
  88. <input type="checkbox" name="private" id="private" value="1">
  89. <label for="private"><?php echo $lang->todo->private?></label>
  90. </div>
  91. </div>
  92. </div>
  93. <div class="form-group">
  94. <div class="col-sm-12 form-actions no-margin text-center">
  95. <?php echo html::hidden('type', 'custom');?>
  96. <?php echo html::commonButton($lang->save, "onclick='ajaxCreateTodo(this)'", "btn btn-primary btn-wide commitButton");?>
  97. <button type="button" class="btn btn-wide todo-form-trigger" data-trigger="false"><?php echo $lang->goback;?></button>
  98. </div>
  99. </div>
  100. </form>
  101. </div>
  102. <div class='table-row'>
  103. <ul class="todoes">
  104. <?php foreach($todos as $id => $todo):?>
  105. <?php
  106. $appid = isset($_GET['entry']) ? "class='app-btn' data-id='{$this->get->entry}'" : '';
  107. $viewLink = $this->createLink('todo', 'view', "todoID={$todo->id}&from=my", 'html', true);
  108. ?>
  109. <li data-id='<?php echo $todo->id?>' class='titleBox'>
  110. <span class="todo-check icon icon-check-circle"></span>
  111. <a href="<?php echo empty($sso) ? $viewLink : $sso . $sign . 'referer=' . base64_encode($viewLink);?>" class='iframe todo-flexbetween' data-width='1000px' data-toggle='modal' <?php echo $appid?>>
  112. <div id='todoList'>
  113. <?php if ($todo->date == '2030-01-01') :?>
  114. <div class="todo-time"><?php echo $lang->todo->periods['future'] ?></div>
  115. <?php else:?>
  116. <div class="todo-time"><?php echo date(DT_DATE4, strtotime($todo->date)) . ' ' . $todo->begin;?></div>
  117. <?php endif;?>
  118. <div class="todo-pri label-pri label-pri-<?php echo $todo->pri?>" title="<?php echo zget($lang->todo->priList, $todo->pri);?>"><?php echo zget($lang->todo->priList, $todo->pri);?></div>
  119. <div class="todo-title text-ellipsis" title='<?php echo $todo->name;?>'><?php echo $todo->name;?></div>
  120. </div>
  121. <span class="label label-id label-todo hidden"><?php echo $lang->block->done;?></span>
  122. </a>
  123. </li>
  124. <?php endforeach;?>
  125. </ul>
  126. </div>
  127. </div>
  128. <script>
  129. $(function()
  130. {
  131. // Todoes block
  132. if(!$.fn.blockTodoes)
  133. {
  134. $.fn.blockTodoes = function()
  135. {
  136. $(this).closest('.col-main').css('max-width', ($('#subHeader .container').outerWidth() - $('.container .col-side').outerWidth() - 80) + 'px');
  137. return this.each(function()
  138. {
  139. var $block = $(this);
  140. if($block.data('blockTodoes')) return;
  141. $block.data('blockTodoes', 1);
  142. var $form = $block.find('form');
  143. var $titleInput = $form.find('[name="name"]');
  144. var toggleForm = function(toggle)
  145. {
  146. if(toggle === undefined)
  147. {
  148. toggle = !$block.hasClass('show-form');
  149. }
  150. $block.toggleClass('show-form', toggle);
  151. $block.find('.date').datepicker();
  152. if(toggle)
  153. {
  154. setTimeout(function() {$titleInput.focus();}, 50);
  155. }
  156. };
  157. $block.on('click', '.todo-form-trigger', function()
  158. {
  159. toggleForm($(this).data('trigger'));
  160. $('.block-todoes .commitButton').removeClass('disabled');
  161. });
  162. $form.timeSpanControl(
  163. {
  164. onChange: function($control)
  165. {
  166. $control.trigger('chosen:updated');
  167. }
  168. }).find('[name="begin"]').trigger('chosen:updated');
  169. });
  170. };
  171. }
  172. $('.block-todoes').blockTodoes().on('click', '.todo-check', function()
  173. {
  174. var $liTag = $(this).closest('li');
  175. var isFinished = $liTag.hasClass('active');
  176. var todoID = $liTag.data('id');
  177. var methodName = isFinished ? 'activate' : 'finish';
  178. $.get(createLink('todo', methodName, "todoID=" + todoID), function()
  179. {
  180. if(!isFinished) $liTag.addClass('active');
  181. if(isFinished) $liTag.removeClass('active');
  182. });
  183. if(isFinished)
  184. {
  185. $(this).next().find('.label-todo').addClass('hidden');
  186. }
  187. else
  188. {
  189. $(this).next().find('.label-todo').removeClass('hidden');
  190. }
  191. });
  192. });
  193. function ajaxCreateTodo(obj)
  194. {
  195. var $todoes = $(obj).closest('.block-todoes');
  196. var $form = $(obj).closest('form');
  197. var $name = $form.find("input[name='name']").val();
  198. if($name == '')
  199. {
  200. $("input[name='name']").addClass('has-error');
  201. $('#nameLabel').remove();
  202. $("input[name='name']").after('<div id="nameLabel" class="text-danger help-text"><?php echo sprintf($lang->error->notempty, $lang->todo->name) ?></div>');
  203. setTimeout('clearError()', 2000)
  204. return false;
  205. }
  206. $('.commitButton').addClass('disabled');
  207. $.ajax(
  208. {
  209. type: "POST",
  210. dataType: "json",
  211. url: $form.attr('action'),
  212. data: $form.serialize(),
  213. success: function(todo)
  214. {
  215. $todoes.removeClass('show-form');
  216. $todoes.closest('.show-form').removeClass('show-form');
  217. $todoes.find('.show-form').removeClass('show-form');
  218. refreshBlock($todoes.parents('div.panel[id^=block]'));
  219. }
  220. });
  221. }
  222. function clearError()
  223. {
  224. $("input[name='name']").removeClass('has-error');
  225. $('#nameLabel').remove();
  226. }
  227. </script>
  228. </div>