This commit is contained in:
chaideqing
2023-04-28 15:59:46 +08:00
6 changed files with 276 additions and 247 deletions
+5
View File
@@ -35,3 +35,8 @@ $config->todo->assignTo->form['assignedTo'] = array('required' => true, 'type
$config->todo->batchClose = new stdclass;
$config->todo->batchClose->form = array();
$config->todo->batchClose->form['todoIDList'] = array('required' => true, 'type' => 'array');
$config->todo->batchEdit = new stdClass;
$config->todo->batchEdit->form = array();
$config->todo->batchEdit->form['todoIDList'] = array('required' => true, 'type' => 'array');
$config->todo->batchEdit->form['names'] = array('required' => true, 'type' => 'array');
+75 -168
View File
@@ -2,7 +2,7 @@
declare(strict_types=1);
/**
* The control file of example module of ZenTaoPMS.
* The control file of todo module of ZenTaoPMS.
*
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
@@ -29,15 +29,15 @@ class todo extends control
}
/**
* 创建待办
* 创建待办。
* Create a todo.
*
* @param string $date
* @param string $from todo|feedback|block
* @access public
* @return int|void
* @return int
*/
public function create(string $date = 'today', string $from = 'todo')
public function create(string $date = 'today', string $from = 'todo'): int
{
if($date == 'today') $date = date::today();
@@ -56,7 +56,7 @@ class todo extends control
if($from == 'block')
{
$todo = $this->todo->getById($todoID);
$todo = $this->todo->getByID($todoID);
$todo->begin = date::formatTime($todo->begin);
return $this->send(array('result' => 'success', 'id' => $todoID, 'name' => $todo->name, 'pri' => $todo->pri, 'priName' => $this->lang->todo->priList[$todo->pri], 'time' => date(DT_DATE4, strtotime($todo->date)) . ' ' . $todo->begin));
}
@@ -69,12 +69,7 @@ class todo extends control
unset($this->lang->todo->typeList['cycle']);
$this->view->title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->create;
$this->view->date = date('Y-m-d', strtotime($date));
$this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta);
$this->view->time = date::now();
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted|noempty');
$this->display();
$this->buildCreateForm($date);
}
/**
@@ -128,17 +123,16 @@ class todo extends control
}
/**
* 编辑待办数据
* 编辑待办数据。
* Edit a todo.
*
* @param string $todoID
* @access public
* @return void
* @return int
*/
public function edit(string $todoID)
public function edit(string $todoID): int
{
$todoID = (int)$todoID;
$todoID = (int)$todoID;
if(!empty($_POST))
{
$formData = form::data($this->config->todo->edit->form);
@@ -164,18 +158,12 @@ class todo extends control
}
/* Judge a private todo or not, If private, die. */
$todo = $this->todo->getById($todoID);
$todo = $this->todo->getByID($todoID);
if($todo->private and $this->app->user->account != $todo->account) return print('private');
unset($this->lang->todo->typeList['cycle']);
$todo->date = date("Y-m-d", strtotime($todo->date));
$this->view->title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->edit;
$this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta);
$this->view->todo = $todo;
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted|noempty');
$this->display();
$this->renderEditData($todoID);
}
/**
@@ -188,113 +176,26 @@ class todo extends control
* @access public
* @return void
*/
public function batchEdit($from = '', $type = 'today', $userID = '', $status = 'all')
public function batchEdit(string $from = '', string $type = 'today', string $userID = '', string $status = 'all')
{
/* Get form data for my-todo. */
if($from == 'myTodo')
if($from == 'myTodo') $this->todoZen->batchEditFromMyTodo($type, $userID, $status);
if($from == 'todoBatchEdit')
{
/* Initialize vars. */
$editedTodos = array();
$todoIDList = array();
$columns = 7;
if($userID == '') $userID = $this->app->user->id;
$user = $this->loadModel('user')->getById($userID, 'id');
$account = $user->account;
$reviews = array();
if($this->config->edition == 'max') $reviews = $this->loadModel('review')->getUserReviewPairs($account);
$allTodos = $this->todo->getList($type, $account, $status);
if($this->post->todoIDList) $todoIDList = $this->post->todoIDList;
/* Initialize todos whose need to edited. */
foreach($allTodos as $todo)
{
if(in_array($todo->id, $todoIDList))
{
$editedTodos[$todo->id] = $todo;
if($todo->type != 'custom')
{
if(!isset($objectIDList[$todo->type])) $objectIDList[$todo->type] = array();
$objectIDList[$todo->type][$todo->objectID] = $todo->objectID;
}
}
}
$bugs = $this->bug->getUserBugPairs($account, true, 0, '', '', isset($objectIDList['bug']) ? $objectIDList['bug'] : '');
$tasks = $this->task->getUserTaskPairs($account, 'wait,doing', '', isset($objectIDList['task']) ? $objectIDList['task'] : '');
$storys = $this->loadModel('story')->getUserStoryPairs($account, 10, 'story', '', isset($objectIDList['story']) ? $objectIDList['story'] : '');
if($this->config->edition != 'open') $this->view->feedbacks = $this->loadModel('feedback')->getUserFeedbackPairs($account, '', isset($objectIDList['feedback']) ? $objectIDList['feedback'] : '');
if($this->config->edition == 'max')
{
$issues = $this->loadModel('issue')->getUserIssuePairs($account);
$risks = $this->loadmodel('risk')->getUserRiskPairs($account);
$opportunities = $this->loadmodel('opportunity')->getUserOpportunityPairs($account);
}
$testtasks = $this->loadModel('testtask')->getUserTestTaskPairs($account);
/* Judge whether the edited todos is too large. */
$countInputVars = count($editedTodos) * $columns;
$showSuhosinInfo = common::judgeSuhosinSetting($countInputVars);
unset($this->lang->todo->typeList['cycle']);
/* Set Custom*/
foreach(explode(',', $this->config->todo->list->customBatchEditFields) as $field) $customFields[$field] = $this->lang->todo->$field;
$this->view->customFields = $customFields;
$this->view->showFields = $this->config->todo->custom->batchEditFields;
/* Assign. */
$title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->batchEdit;
$position[] = html::a($this->createLink('my', 'todo'), $this->lang->my->todo);
$position[] = $this->lang->todo->common;
$position[] = $this->lang->todo->batchEdit;
if($showSuhosinInfo) $this->view->suhosinInfo = extension_loaded('suhosin') ? sprintf($this->lang->suhosinInfo, $countInputVars) : sprintf($this->lang->maxVarsInfo, $countInputVars);
$this->view->bugs = $bugs;
$this->view->tasks = $tasks;
$this->view->storys = $storys;
if($this->config->edition == 'max')
{
$this->view->issues = $issues;
$this->view->risks = $risks;
$this->view->opportunities = $opportunities;
}
$this->view->reviews = $reviews;
$this->view->testtasks = $testtasks;
$this->view->editedTodos = $editedTodos;
$this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta);
$this->view->time = date::now();
$this->view->title = $title;
$this->view->position = $position;
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted|noempty');
$this->display();
}
/* Get form data from todo-batchEdit. */
elseif($from == 'todoBatchEdit')
{
$allChanges = $this->todo->batchUpdate();
foreach($allChanges as $todoID => $changes)
{
if(empty($changes)) continue;
$actionID = $this->loadModel('action')->create('todo', $todoID, 'edited');
$this->action->logHistory($actionID, $changes);
}
return print(js::locate($this->session->todoList, 'parent'));
$formData = form::data($this->config->todo->batchEdit->form);
$this->todoZen->batchEditFromTodoBatchEdit($formData);
}
}
/**
* 开启待办事项
* 开启待办事项。
* Start a todo.
*
* @param string $todoID
* @access public
* @return void
* @return int
*/
public function start(string $todoID)
public function start(string $todoID): int
{
$todoID = (int)$todoID;
$todo = $this->todo->getByID($todoID);
@@ -303,79 +204,86 @@ class todo extends control
if(in_array($todo->type, array('bug', 'task', 'story'))) return $this->todoZen->printConfirm($todo);
if(isonlybody()) return print(js::reload('parent.parent'));
echo js::reload('parent');
return print(js::reload('parent'));
}
/**
* 激活待办事项
* 激活待办事项。
* Activated a todo.
*
* @param string $todoID
* @access public
* @return void
* @return int
*/
public function activate(string $todoID)
public function activate(string $todoID): int
{
$todoID = (int)$todoID;
$todo = $this->todo->getByID($todoID);
if($todo->status == 'done' or $todo->status == 'closed') $this->todo->activate($todoID);
if($todo->status == 'done' || $todo->status == 'closed')
{
$isActivate = $this->todo->activate($todoID);
if($isActivate === false) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
}
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'success'));
if(isonlybody()) return print(js::reload('parent.parent'));
echo js::reload('parent');
return print(js::reload('parent'));
}
/**
* 关闭待办。
* Closed todo.
*
* @param $todoID
*
* @param string $todoID
* @access public
* @return void
* @return int
*/
public function close($todoID)
public function close(string $todoID): int
{
$todo = $this->todo->getById($todoID);
$todoID = (int)$todoID;
$todo = $this->todo->getByID($todoID);
if($todo->status == 'done') $this->todo->close($todoID);
if(isonlybody()) return print(js::reload('parent.parent'));
echo js::reload('parent');
return print(js::reload('parent'));
}
/**
* 指派待办.
* 指派待办。
* Assign todo.
*
* @param string $todoID
* @access public
* @return void
* @return int
*/
public function assignTo(string $todoID)
public function assignTo(string $todoID): int
{
$todoID = (int)$todoID;
if(!empty($_POST))
{
$formData = form::data($this->config->todo->assignTo->form);
$todo = $this->todoZen->beforeAssignTo($formData);
$todo->id = (int)$todoID;
$res = $this->todoZen->doAssignTo($todo);
if(!$res) return print(js::error(dao::getError()));
$todo->id = $todoID;
$isAssigned = $this->todoZen->doAssignTo($todo);
if(!$isAssigned) return print(js::error(dao::getError()));
return print(js::reload('parent.parent'));
}
$this->view->todo = $this->todo->getById((int)$todoID);
$this->view->todo = $this->todo->getByID($todoID);
$this->view->members = $this->loadModel('user')->getPairs('noclosed|noempty|nodeleted');
$this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta);
$this->view->actions = $this->loadModel('action')->getList('todo', (int)$todoID);
$this->view->actions = $this->loadModel('action')->getList('todo', $todoID);
$this->view->users = $this->user->getPairs('noletter');
$this->view->time = date::now();
$this->display();
}
/**
* 获取待办的信息.
* Get info of todo .
* 获取待办的信息。
* Get info of todo.
*
* @param string $todoID
* @param string $from my|company
@@ -383,9 +291,9 @@ class todo extends control
* @access public
* @return void
*/
public function view(string $todoID,string $from = 'company')
public function view(string $todoID, string $from = 'company')
{
$todo = $this->todo->getById((int)$todoID, true);
$todo = $this->todo->getByID((int)$todoID, true);
if(!$todo)
{
@@ -416,7 +324,6 @@ class todo extends control
if(!isset($this->session->project)) $this->session->set('project', (int)key($projects));
$this->view->title = $account == $todo->account ? "{$this->lang->todo->common} #$todo->id $todo->name" : $this->lang->todo->common;
$this->view->position[] = $this->lang->todo->view;
$this->view->todo = $todo;
$this->view->times = date::buildTimeList((int)$this->config->todo->times->begin, (int)$this->config->todo->times->end, 5);
$this->view->from = $from;
@@ -427,7 +334,7 @@ class todo extends control
}
/**
* 删除待办.
* 删除待办。
* Delete a todo.
*
* @param string $todoID
@@ -437,28 +344,23 @@ class todo extends control
*/
public function delete(string $todoID, string $confirm = 'no')
{
$todoID = (int)$todoID;
if($confirm == 'no')
{
return print(js::confirm($this->lang->todo->confirmDelete, $this->createLink('todo', 'delete', "todoID=(int)$todoID&confirm=yes")));
return print(js::confirm($this->lang->todo->confirmDelete, $this->createLink('todo', 'delete', "todoID={$todoID}&confirm=yes")));
}
else
{
$this->todo->delete(TABLE_TODO, (int)$todoID);
$this->todo->delete(TABLE_TODO, $todoID);
/* if ajax request, send result. */
if($this->server->ajax)
if(helper::isAjaxRequest())
{
$response = array();
$response = array('result' => 'success', 'message' => '');
if(dao::isError())
{
$response['result'] = 'fail';
$response['message'] = dao::getError();
}
else
{
$response['result'] = 'success';
$response['message'] = '';
}
return $this->send($response);
}
@@ -480,7 +382,7 @@ class todo extends control
*/
public function finish(string $todoID)
{
$todo = $this->todo->getById((int)$todoID);
$todo = $this->todo->getByID((int)$todoID);
if($todo->status != 'done' && $todo->status != 'closed') $this->todo->finish((int)$todoID);
if(in_array($todo->type, array('bug', 'task', 'story')))
@@ -488,15 +390,20 @@ class todo extends control
$confirmNote = 'confirm' . ucfirst($todo->type);
$okTarget = isonlybody() ? 'parent' : 'window.parent.$.apps.open';
$confirmURL = $this->createLink($todo->type, 'view', "id=$todo->objectID");
if($todo->type == 'bug') $app = 'qa';
if($todo->type == 'task') $app = 'execution';
if($todo->type == 'story') $app = 'product';
$cancelURL = $this->server->HTTP_REFERER;
$cancelURL = $this->server->http_referer;
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'success', 'message' => sprintf($this->lang->todo->$confirmNote, $todo->objectID), 'locate' => $confirmURL));
return print(strpos($cancelURL, 'calendar') ? json_encode(array(sprintf($this->lang->todo->$confirmNote, $todo->objectID), $confirmURL)) : js::confirm(sprintf($this->lang->todo->$confirmNote, $todo->objectID), $confirmURL, $cancelURL, $okTarget, 'parent', $app));
}
if(defined('RUN_MODE') && RUN_MODE == 'api') return $this->send(array('status' => 'success'));
if(defined('RUN_MODE') && RUN_MODE == 'api')
{
$this->send(array('status' => 'success'));
return;
}
if(isonlybody()) return print(js::reload('parent.parent'));
echo js::reload('parent');
}
@@ -518,8 +425,8 @@ class todo extends control
if($todo->status == 'done' || $todo->status == 'closed') unset($todoList[$todoID]);
}
$res = $this->todo->batchFinish((array)array_keys($todoList));
if(!$res) return false;
$isBatchFinished = $this->todo->batchFinish(array_keys($todoList));
if(!$isBatchFinished) return false;
return print(js::reload('parent'));
}
@@ -529,27 +436,27 @@ class todo extends control
* Batch close todos. The status of todo which need to close should be done.
*
* @access public
* @return void
* @return int
*/
public function batchClose(): void
public function batchClose(): int
{
$waitIdList = array();
$todoIdlist = form::data($this->config->todo->batchClose->form)->get('todoIDList');
foreach($todoIdlist as $todoID)
{
$todoID = (int) $todoID;
$todo = $this->todo->getById($todoID);
$todo = $this->todo->getByID($todoID);
if($todo->status == 'done') $this->todo->close($todoID);
if($todo->status != 'done' and $todo->status != 'closed') $waitIdList[] = $todoID;
}
if(!empty($waitIdList)) echo js::alert(sprintf($this->lang->todo->unfinishedTodo, implode(',', $waitIdList)));
echo js::reload('parent');
return print(js::reload('parent'));
}
/**
* 修改选中待办的日期。
* Import selected todoes to today.
* Import selected todos to today.
*
* @param string $todoID
* @access public
@@ -559,10 +466,10 @@ class todo extends control
{
$todoIDList = $_POST ? $this->post->todoIDList : array($todoID);
$date = !empty($_POST['date']) ? $_POST['date'] : date::today();
if(!$date || !$todoIDList) $this->locate((string)$this->session->todoList);
if(!$date || !$todoIDList) return $this->locate((string)$this->session->todoList);
$this->todo->editDate((array)$todoIDList, (string)$date);
$this->locate((string)$this->session->todoList);
return this->locate((string)$this->session->todoList);
}
/**
@@ -577,7 +484,7 @@ class todo extends control
{
if($_POST)
{
$user = $this->loadModel('user')->getById($userID, 'id');
$user = $this->loadModel('user')->getByID($userID, 'id');
$account = $user->account;
$todoLang = $this->lang->todo;
+44 -47
View File
@@ -2,7 +2,7 @@
declare(strict_types=1);
/**
* The model file of example module of ZenTaoPMS.
* The model file of todo module of ZenTaoPMS.
*
* @copyright Copyright 2009-2023 禅道软件(青岛)有限公司(ZenTao Software (Qingdao) Co., Ltd. www.zentao.net)
* @license ZPL(https://zpl.pub/page/zplv12.html) or AGPL(https://www.gnu.org/licenses/agpl-3.0.en.html)
@@ -128,7 +128,7 @@ class todoModel extends model
}
/**
* 更新待办数据
* 更新待办数据。
* update a todo.
*
* @param int $todoID
@@ -138,7 +138,7 @@ class todoModel extends model
*/
public function update(int $todoID, object $todo): array|false
{
$oldTodo = $this->dao->findById($todoID)->from(TABLE_TODO)->fetch();
$oldTodo = $this->dao->findByID($todoID)->from(TABLE_TODO)->fetch();
if(!$this->todoTao->updateRow($todoID, $todo)) return false;
@@ -271,8 +271,8 @@ class todoModel extends model
{
foreach($todoIDList as $todoID)
{
$res = $this->dealFinishData($todoID);
if(!$res) return $res;
$finishResult = $this->dealFinishData($todoID);
if(!$finishResult) return $finishResult;
}
return true;
}
@@ -288,20 +288,20 @@ class todoModel extends model
*/
public function getByID(int $todoID, $setImgSize = false): object|false
{
$todo = $this->dao->findById($todoID)->from(TABLE_TODO)->fetch();
$todo = $this->dao->findByID($todoID)->from(TABLE_TODO)->fetch();
if(!$todo) return false;
$todo = $this->loadModel('file')->replaceImgURL((object)$todo, 'desc');
if($setImgSize) $todo->desc = $this->file->setImgSize($todo->desc);
if($todo->type == 'story') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_STORY)->fetch('title');
if($todo->type == 'task') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_TASK)->fetch('name');
if($todo->type == 'bug') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_BUG)->fetch('title');
if($todo->type == 'issue' and $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_ISSUE)->fetch('title');
if($todo->type == 'risk' and $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_RISK)->fetch('name');
if($todo->type == 'opportunity' and $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_OPPORTUNITY)->fetch('name');
if($todo->type == 'review' and $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_REVIEW)->fetch('title');
if($todo->type == 'testtask') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_TESTTASK)->fetch('name');
if($todo->type == 'feedback') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_FEEDBACK)->fetch('title');
if($todo->type == 'story') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_STORY)->fetch('title');
if($todo->type == 'task') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_TASK)->fetch('name');
if($todo->type == 'bug') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_BUG)->fetch('title');
if($todo->type == 'issue' and $this->config->edition == 'max') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_ISSUE)->fetch('title');
if($todo->type == 'risk' and $this->config->edition == 'max') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_RISK)->fetch('name');
if($todo->type == 'opportunity' and $this->config->edition == 'max') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_OPPORTUNITY)->fetch('name');
if($todo->type == 'review' and $this->config->edition == 'max') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_REVIEW)->fetch('title');
if($todo->type == 'testtask') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_TESTTASK)->fetch('name');
if($todo->type == 'feedback') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_FEEDBACK)->fetch('title');
$todo->date = str_replace('-', '', $todo->date);
return $todo;
@@ -412,15 +412,15 @@ class todoModel extends model
while($todo = $stmt->fetch())
{
if($todo->type == 'story') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_STORY)->fetch('title');
if($todo->type == 'task') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_TASK)->fetch('name');
if($todo->type == 'bug') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_BUG)->fetch('title');
if($todo->type == 'testtask') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_TESTTASK)->fetch('name');
if($todo->type == 'issue' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_ISSUE)->fetch('title');
if($todo->type == 'risk' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_RISK)->fetch('name');
if($todo->type == 'opportunity' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_OPPORTUNITY)->fetch('name');
if($todo->type == 'review' && $this->config->edition == 'max') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_REVIEW)->fetch('title');
if($todo->type == 'feedback' and $this->config->edition != 'open') $todo->name = $this->dao->findById($todo->objectID)->from(TABLE_FEEDBACK)->fetch('title');
if($todo->type == 'story') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_STORY)->fetch('title');
if($todo->type == 'task') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_TASK)->fetch('name');
if($todo->type == 'bug') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_BUG)->fetch('title');
if($todo->type == 'testtask') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_TESTTASK)->fetch('name');
if($todo->type == 'issue' && $this->config->edition == 'max') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_ISSUE)->fetch('title');
if($todo->type == 'risk' && $this->config->edition == 'max') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_RISK)->fetch('name');
if($todo->type == 'opportunity' && $this->config->edition == 'max') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_OPPORTUNITY)->fetch('name');
if($todo->type == 'review' && $this->config->edition == 'max') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_REVIEW)->fetch('title');
if($todo->type == 'feedback' and $this->config->edition != 'open') $todo->name = $this->dao->findByID($todo->objectID)->from(TABLE_FEEDBACK)->fetch('title');
$todo->begin = date::formatTime($todo->begin);
$todo->end = date::formatTime($todo->end);
@@ -556,18 +556,16 @@ class todoModel extends model
{
$isClosed = $this->todoTao->closeTodo($todoID);
if($isClosed)
{
$this->loadModel('action')->create('todo', $todoID, 'closed', '', 'closed');
if(!$isClosed) return false;
if($this->config->edition == 'biz' || $this->config->edition == 'max')
{
$feedbackID = $this->dao->select('objectID')->from(TABLE_TODO)->where('id')->eq($todoID)->andWhere('type')->eq('feedback')->fetch('objectID');
if($feedbackID) $this->loadModel('feedback')->updateStatus('todo', $feedbackID, 'closed');
}
return true;
$this->loadModel('action')->create('todo', $todoID, 'closed', '', 'closed');
if($this->config->edition == 'biz' || $this->config->edition == 'max')
{
$feedbackID = $this->dao->select('objectID')->from(TABLE_TODO)->where('id')->eq($todoID)->andWhere('type')->eq('feedback')->fetch('objectID');
if($feedbackID) $this->loadModel('feedback')->updateStatus('todo', $feedbackID, 'closed');
}
return false;
return true;
}
/**
@@ -656,25 +654,24 @@ class todoModel extends model
$todo->finishedBy = $this->app->user->account;
$this->todoTao->updateRow($todoID, $todo);
if(!dao::isError())
{
$this->loadModel('action')->create('todo', $todoID, 'finished', '', 'done');
if(dao::isError()) return false;
if(($this->config->edition == 'biz' || $this->config->edition == 'max'))
{
$todo = $this->todoTao->fetch($todoID);
$feedbackID = $todo->idvalue ?? '' ;
if($feedbackID) $this->loadModel('feedback')->updateStatus('todo', $feedbackID, 'done');
}
return true;
$this->loadModel('action')->create('todo', $todoID, 'finished', '', 'done');
if(($this->config->edition == 'biz' || $this->config->edition == 'max'))
{
$todo = $this->todoTao->fetch($todoID);
$feedbackID = $todo->idvalue ?? '' ;
if($feedbackID) $this->loadModel('feedback')->updateStatus('todo', $feedbackID, 'done');
}
return false;
return true;
}
/** 修改待办事项的时间。
/**
* 修改待办事项的时间。
* Edit the date of todo.
*
* @param array $idList
* @param array $todoIDList
* @param string $date
* @access public
* @return int
+16 -17
View File
@@ -75,11 +75,10 @@ class todoTao extends todoModel
->where('id')->eq($todoID)
->exec();
return !dao::isError();
}
/*
* 处理要创建的todo的数据
/**
* 处理要创建的todo的数据。
* Process the data for the todo to be created.
*
* @param object $todoData
@@ -118,13 +117,13 @@ class todoTao extends todoModel
}
if(empty($todoData->cycle)) unset($todoData->config);
$todoData = $this->loadModel('file')->processImgURL($todoData, $this->config->todo->editor->create['id'], $this->post->uid);
return $todoData;
return $this->loadModel('file')->processImgURL($todoData, $this->config->todo->editor->create['id'], $this->post->uid);
}
/**
* 获取周期待办列表
* Get cycle list.
* 获取周期待办列表。
* Get cycle list.
*
* @param array $todoList
* @param string $orderBy
* @access protected
@@ -132,18 +131,18 @@ class todoTao extends todoModel
*/
protected function getCycleList(array $todoList, string $orderBy = 'date_asc'): array
{
return $this->dao->select('*')
->from(TABLE_TODO)->where('type')->eq('cycle')
return $this->dao->select('*')->from(TABLE_TODO)
->where('type')->eq('cycle')
->andWhere('deleted')->eq('0')
->andWhere('objectID')->in(array_keys($todoList))
->orderBy($orderBy)
->fetchAll('objectID');
}
/**
* 通过待办构建周期待办数据
* Build cycle todo.
*
* @param object $todo
* @access protected
* @return stdclass
@@ -168,9 +167,9 @@ class todoTao extends todoModel
}
/**
* 通过周期待办,获取要生成待办的日期
*
* 通过周期待办,获取要生成待办的日期。
* Gets the date by the cycle todo.
*
* @param object $todo
* @param object|string $lastCycle
* @param string $today
@@ -207,8 +206,7 @@ class todoTao extends todoModel
}
/**
* 通过周期待办,获取要生成每日待办的日期
*
* 通过周期待办,获取要生成每日待办的日期。
* Gets the daily todo date by the cycle todo.
*
* @param object $todo
@@ -305,6 +303,7 @@ class todoTao extends todoModel
return false;
}
$todoData->config['beforeDays'] = (int)$todoData->config['beforeDays'];
$todoData->config = json_encode($todoData->config);
$todoData->type = 'cycle';
@@ -317,11 +316,11 @@ class todoTao extends todoModel
*
* @param array $idList
* @param string $date
* @return int
* @return bool
*/
protected function updateDate(array $todoIdList, string $date): int
protected function updateDate(array $todoIdList, string $date): bool
{
$this->dao->update(TABLE_TODO)->set('date')->eq($date)->where('id')->in($todoIdList)->exec();
return dao::isError() ? 0 : 1;
return !dao::isError();
}
}
-1
View File
@@ -3,7 +3,6 @@
declare(strict_types=1);
include dirname(__FILE__, 5) . "/test/lib/init.php";
include dirname(__FILE__, 2) . '/todo.class.php';
su('admin');
/**
+136 -14
View File
@@ -3,11 +3,39 @@ declare(strict_types=1);
class todoZen extends todo
{
/**
* 生成创建待办视图数据。
* Build create form data.
*
* @param string $date
* @access protected
* @return void
*/
protected function buildCreateForm(string $date): void
{
$this->view->title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->create;
$this->view->date = date('Y-m-d', strtotime($date));
$this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta);
$this->view->time = date::now();
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted|noempty');
$this->display();
}
protected function renderEditData(int $todoID)
{
$todo->date = date("Y-m-d", strtotime($todo->date));
$this->view->title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->edit;
$this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta);
$this->view->todo = $todo;
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted|noempty');
$this->display();
}
/**
* 处理请求数据
* Processing request data.
*
* @process protected
* @param object $formData
* @access protected
* @return object
@@ -36,12 +64,13 @@ class todoZen extends todo
->stripTags($this->config->todo->editor->create['id'], $this->config->allowedTags)
->remove(implode(',', $this->config->todo->moduleList) . ',uid')
->get();
return $data;
}
/**
* Create a todo after data processing
* 创建完成待办后数据处理
* 创建完成待办后数据处理。
* Create a todo after data processing.
*
* @param object $todo
* @access protected
@@ -65,7 +94,7 @@ class todoZen extends todo
}
/**
* 处理编辑待办的请求数据
* 处理编辑待办的请求数据。
* Processing edit request data.
*
* @param int $todoID
@@ -75,7 +104,7 @@ class todoZen extends todo
*/
protected function beforeEdit(int $todoID, object $formData): object|false
{
$oldTodo = $this->dao->findById($todoID)->from(TABLE_TODO)->fetch();
$oldTodo = $this->dao->findByID($todoID)->from(TABLE_TODO)->fetch();
$objectID = 0;
$rowData = $formData->rawdata;
@@ -96,7 +125,7 @@ class todoZen extends todo
->remove(implode(',', $this->config->todo->moduleList) . ',uid')
->get();
$todo = (object) array_merge((array) $rowData, (array) $todo);
$todo = (object)array_merge((array)$rowData, (array)$todo);
if(in_array($todo->type, $this->config->todo->moduleList))
{
@@ -114,9 +143,7 @@ class todoZen extends todo
if(!empty($oldTodo->cycle)) $this->handleCycleConfig($todo);
$todo = $this->loadModel('file')->processImgURL($todo, $this->config->todo->editor->edit['id'], $rowData->uid);
return $todo;
return $this->loadModel('file')->processImgURL($todo, $this->config->todo->editor->edit['id'], $rowData->uid);
}
/**
@@ -135,15 +162,109 @@ class todoZen extends todo
$this->action->logHistory($actionID, $changes);
}
protected function batchEditFromMyTodo($type, $userID, $status)
{
/* Initialize vars. */
$editedTodos = array();
$todoIDList = array();
$reviews = array();
$columns = 7;
if($userID == '') $userID = $this->app->user->id;
$user = $this->loadModel('user')->getById($userID, 'id');
$account = $user->account;
if($this->config->edition == 'max') $reviews = $this->loadModel('review')->getUserReviewPairs($account);
$allTodos = $this->todo->getList($type, $account, $status);
if($this->post->todoIDList) $todoIDList = $this->post->todoIDList;
/* Initialize todos whose need to edited. */
foreach($allTodos as $todo)
{
if(in_array($todo->id, $todoIDList))
{
$editedTodos[$todo->id] = $todo;
if($todo->type != 'custom')
{
if(!isset($objectIDList[$todo->type])) $objectIDList[$todo->type] = array();
$objectIDList[$todo->type][$todo->objectID] = $todo->objectID;
}
}
}
$bugs = $this->bug->getUserBugPairs($account, true, 0, '', '', isset($objectIDList['bug']) ? $objectIDList['bug'] : '');
$tasks = $this->task->getUserTaskPairs($account, 'wait,doing', '', isset($objectIDList['task']) ? $objectIDList['task'] : '');
$storys = $this->loadModel('story')->getUserStoryPairs($account, 10, 'story', '', isset($objectIDList['story']) ? $objectIDList['story'] : '');
if($this->config->edition != 'open') $this->view->feedbacks = $this->loadModel('feedback')->getUserFeedbackPairs($account, '', isset($objectIDList['feedback']) ? $objectIDList['feedback'] : '');
if($this->config->edition == 'max')
{
$issues = $this->loadModel('issue')->getUserIssuePairs($account);
$risks = $this->loadmodel('risk')->getUserRiskPairs($account);
$opportunities = $this->loadmodel('opportunity')->getUserOpportunityPairs($account);
}
$testtasks = $this->loadModel('testtask')->getUserTestTaskPairs($account);
/* Judge whether the edited todos is too large. */
$countInputVars = count($editedTodos) * $columns;
$showSuhosinInfo = common::judgeSuhosinSetting($countInputVars);
unset($this->lang->todo->typeList['cycle']);
/* Set Custom*/
foreach(explode(',', $this->config->todo->list->customBatchEditFields) as $field) $customFields[$field] = $this->lang->todo->$field;
$this->view->customFields = $customFields;
$this->view->showFields = $this->config->todo->custom->batchEditFields;
/* Assign. */
$title = $this->lang->todo->common . $this->lang->colon . $this->lang->todo->batchEdit;
$position[] = html::a($this->createLink('my', 'todo'), $this->lang->my->todo);
$position[] = $this->lang->todo->common;
$position[] = $this->lang->todo->batchEdit;
if($showSuhosinInfo) $this->view->suhosinInfo = extension_loaded('suhosin') ? sprintf($this->lang->suhosinInfo, $countInputVars) : sprintf($this->lang->maxVarsInfo, $countInputVars);
$this->view->bugs = $bugs;
$this->view->tasks = $tasks;
$this->view->storys = $storys;
if($this->config->edition == 'max')
{
$this->view->issues = $issues;
$this->view->risks = $risks;
$this->view->opportunities = $opportunities;
}
$this->view->reviews = $reviews;
$this->view->testtasks = $testtasks;
$this->view->editedTodos = $editedTodos;
$this->view->times = date::buildTimeList($this->config->todo->times->begin, $this->config->todo->times->end, $this->config->todo->times->delta);
$this->view->time = date::now();
$this->view->title = $title;
$this->view->position = $position;
$this->view->users = $this->loadModel('user')->getPairs('noclosed|nodeleted|noempty');
$this->display();
}
protected function batchEditFromTodoBatchEdit($formData)
{
$allChanges = $this->todo->batchUpdate();
foreach($allChanges as $todoID => $changes)
{
if(empty($changes)) continue;
$actionID = $this->loadModel('action')->create('todo', $todoID, 'edited');
$this->action->logHistory($actionID, $changes);
}
return print(js::locate($this->session->todoList, 'parent'));
}
/**
* 处理循环待办的配置文件
* 处理周期待办的配置值。
* Handle cycle config.
*
* @param object $todo
* @access private
* @return void
*/
private function handleCycleConfig(object &$todo): void
private function handleCycleConfig(object $todo): void
{
$todo->date = date('Y-m-d');
$todo->config['begin'] = $todo->date;
@@ -215,7 +336,7 @@ class todoZen extends todo
}
/**
* 输出确认弹框
* 输出确认弹框。
* Output confirm alert.
*
* @param object $todo
@@ -230,7 +351,8 @@ class todoZen extends todo
if($todo->type == 'bug') $app = 'qa';
if($todo->type == 'task') $app = 'execution';
if($todo->type == 'story') $app = 'product';
$cancelURL = $this->server->HTTP_REFERER;
$cancelURL = $this->server->http_referer;
return print(js::confirm(sprintf($this->lang->todo->$confirmNote, $todo->objectID), $confirmURL, $cancelURL, $okTarget, 'parent', $app));
}
@@ -244,7 +366,7 @@ class todoZen extends todo
protected function getProjectPairsByModel(string $model): array
{
$model = $model == 'opportunity' ? 'waterfall' : 'all';
return $this->loadModel('project')->getPairsByModel((string)$model);
return $this->loadModel('project')->getPairsByModel($model);
}
/**