diff --git a/module/branch/lang/zh-tw.php b/module/branch/lang/zh-tw.php
index 32b3cc684d..19f458e650 100644
--- a/module/branch/lang/zh-tw.php
+++ b/module/branch/lang/zh-tw.php
@@ -3,6 +3,7 @@ $lang->branch->common = '分支';
$lang->branch->manage = '分支管理';
$lang->branch->sort = '排序';
$lang->branch->delete = '分支刪除';
+$lang->branch->add = '添加';
$lang->branch->manageTitle = '%s管理';
$lang->branch->all = '所有';
diff --git a/module/common/lang/zh-tw.php b/module/common/lang/zh-tw.php
index 02bca87613..f41c593689 100644
--- a/module/common/lang/zh-tw.php
+++ b/module/common/lang/zh-tw.php
@@ -59,9 +59,11 @@ $lang->history = '歷史記錄';
$lang->attatch = '附件';
$lang->reverse = '切換順序';
$lang->switchDisplay = '切換顯示';
+$lang->expand = '展開全部';
+$lang->collapse = '收起';
$lang->addFiles = '上傳了附件 ';
$lang->files = '附件 ';
-$lang->pasteText = '粘貼文本 ';
+$lang->pasteText = '多項錄入';
$lang->uploadImages = '多圖上傳 ';
$lang->timeout = '連接超時,請檢查網絡環境,或重試!';
$lang->repairTable = '資料庫表可能損壞,請用phpmyadmin或myisamchk檢查修復。';
@@ -74,6 +76,7 @@ $lang->tutorial = '新手教程';
$lang->changeLog = '修改日誌';
$lang->manual = '手冊';
$lang->customMenu = '自定義導航';
+$lang->customField = '自定義表單項';
$lang->tutorialConfirm = '檢測到你尚未退出新手教程模式,是否現在退出?';
$lang->preShortcutKey = '[快捷鍵:←]';
@@ -191,15 +194,15 @@ $lang->product = new stdclass();
$lang->product->menu = new stdclass();
$lang->product->menu->story = array('link' => '需求|product|browse|productID=%s', 'alias' => 'batchedit', 'subModule' => 'story');
-$lang->product->menu->dynamic = '動態|product|dynamic|productID=%s';
$lang->product->menu->plan = array('link' => '計劃|productplan|browse|productID=%s', 'subModule' => 'productplan');
$lang->product->menu->release = array('link' => '發佈|release|browse|productID=%s', 'subModule' => 'release');
-$lang->product->menu->roadmap = '路線圖|product|roadmap|productID=%s';
+$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s";
$lang->product->menu->doc = array('link' => '文檔|doc|objectLibs|type=product&objectID=%s&from=product', 'subModule' => 'doc');
+$lang->product->menu->dynamic = '動態|product|dynamic|productID=%s';
+$lang->product->menu->roadmap = '路線圖|product|roadmap|productID=%s';
$lang->product->menu->branch = '@branch@|branch|manage|productID=%s';
$lang->product->menu->module = '模組|tree|browse|productID=%s&view=story';
$lang->product->menu->view = array('link' => '概況|product|view|productID=%s', 'alias' => 'edit');
-$lang->product->menu->project = "{$lang->projectCommon}|product|project|status=all&productID=%s";
$lang->story = new stdclass();
$lang->productplan = new stdclass();
diff --git a/module/file/lang/zh-tw.php b/module/file/lang/zh-tw.php
index 4ce0889ff1..2901182513 100644
--- a/module/file/lang/zh-tw.php
+++ b/module/file/lang/zh-tw.php
@@ -18,7 +18,7 @@ $lang->file->edit = '重命名';
$lang->file->inputFileName = '請輸入附件名稱';
$lang->file->delete = '刪除附件';
$lang->file->label = '標題:';
-$lang->file->maxUploadSize = "%s";
+$lang->file->maxUploadSize = "(不超過%s)";
$lang->file->applyTemplate = "應用模板";
$lang->file->tplTitle = "模板名稱";
$lang->file->setPublic = "設置公共模板";
@@ -39,15 +39,15 @@ $lang->file->addedDate = '添加時間';
$lang->file->downloads = '下載次數';
$lang->file->extra = '備註';
-$lang->file->dragFile = '請拖拽檔案到此處';
-$lang->file->errorNotExists = "檔案夾 '%s' 不存在";
-$lang->file->errorCanNotWrite = "檔案夾 '%s' 不可寫,請改變檔案夾的權限。在linux中輸入指令:sudo chmod -R 777 %s";
-$lang->file->confirmDelete = " 您確定刪除該附件嗎?";
-$lang->file->errorFileSize = " 檔案大小已經超過限制,可能不能成功上傳!";
-$lang->file->errorFileUpload = " 檔案上傳失敗,檔案大小可能超出限制";
-$lang->file->errorFileFormate = " 檔案上傳失敗,檔案格式不在規定範圍內";
-$lang->file->errorFileMove = " 檔案上傳失敗,移動檔案時出錯";
-$lang->file->dangerFile = " 您選擇的檔案存在安全風險,系統將不予上傳。";
-$lang->file->errorSuffix = '壓縮包格式錯誤,只能上傳zip壓縮包!';
-$lang->file->errorExtract = '解壓縮失敗!可能檔案已經損壞,或壓縮包裡含有非法上傳檔案。';
+$lang->file->dragFile = '請拖拽檔案到此處';
+$lang->file->errorNotExists = "檔案夾 '%s' 不存在";
+$lang->file->errorCanNotWrite = "檔案夾 '%s' 不可寫,請改變檔案夾的權限。在linux中輸入指令:sudo chmod -R 777 %s";
+$lang->file->confirmDelete = " 您確定刪除該附件嗎?";
+$lang->file->errorFileSize = " 檔案大小已經超過%s,可能不能成功上傳!";
+$lang->file->errorFileUpload = " 檔案上傳失敗,檔案大小可能超出限制";
+$lang->file->errorFileFormate = " 檔案上傳失敗,檔案格式不在規定範圍內";
+$lang->file->errorFileMove = " 檔案上傳失敗,移動檔案時出錯";
+$lang->file->dangerFile = " 您選擇的檔案存在安全風險,系統將不予上傳。";
+$lang->file->errorSuffix = '壓縮包格式錯誤,只能上傳zip壓縮包!';
+$lang->file->errorExtract = '解壓縮失敗!可能檔案已經損壞,或壓縮包裡含有非法上傳檔案。';
$lang->file->uploadImagesExplain = '註:請上傳"jpg, jpeg, gif, png"格式的圖片,程序會以檔案名作為標題,以圖片作為內容。';
diff --git a/module/product/lang/zh-tw.php b/module/product/lang/zh-tw.php
index 3c6dc12185..30e1c77288 100644
--- a/module/product/lang/zh-tw.php
+++ b/module/product/lang/zh-tw.php
@@ -56,20 +56,26 @@ $lang->product->confirmDelete = " 您確定刪除該{$lang->productCommon}嗎
$lang->product->errorNoProduct = "還沒有創建{$lang->productCommon}!";
$lang->product->accessDenied = "您無權訪問該{$lang->productCommon}";
-$lang->product->id = "編號";
-$lang->product->name = "{$lang->productCommon}名稱";
-$lang->product->code = "{$lang->productCommon}代號";
-$lang->product->line = '產品綫';
-$lang->product->order = '排序';
-$lang->product->type = "{$lang->productCommon}類型";
-$lang->product->status = '狀態';
-$lang->product->desc = "{$lang->productCommon}描述";
-$lang->product->PO = "{$lang->productCommon}負責人";
-$lang->product->QD = '測試負責人';
-$lang->product->RD = '發佈負責人';
-$lang->product->acl = '訪問控制';
-$lang->product->whitelist = '分組白名單';
-$lang->product->branch = '所屬%s';
+$lang->product->id = "編號";
+$lang->product->name = "{$lang->productCommon}名稱";
+$lang->product->code = "{$lang->productCommon}代號";
+$lang->product->line = '產品綫';
+$lang->product->order = '排序';
+$lang->product->type = "{$lang->productCommon}類型";
+$lang->product->status = '狀態';
+$lang->product->desc = "{$lang->productCommon}描述";
+$lang->product->manager = '負責人';
+$lang->product->PO = "{$lang->productCommon}負責人";
+$lang->product->QD = '測試負責人';
+$lang->product->RD = '發佈負責人';
+$lang->product->acl = '訪問控制';
+$lang->product->whitelist = '分組白名單';
+$lang->product->branch = '所屬%s';
+$lang->product->qa = '測試';
+$lang->product->release = '發佈';
+$lang->product->latestDynamic = "最新動態";
+$lang->product->iteration = "版本迭代";
+$lang->product->iterationInfo = "迭代 %s 次";
$lang->product->searchStory = '搜索';
$lang->product->assignedToMe = '指給我';
diff --git a/module/productplan/view/browse.html.php b/module/productplan/view/browse.html.php
index 1892b087db..66d2f9ccba 100644
--- a/module/productplan/view/browse.html.php
+++ b/module/productplan/view/browse.html.php
@@ -66,7 +66,7 @@
- id?>
+ id;?>
-
-
-
+ $link = $this->createLink('task', 'create', "project=$projectID" . (isset($moduleID) ? "&storyID=&moduleID=$moduleID" : ''));
+ if(common::hasPriv('task', 'create')) echo html::a($link, "
{$lang->task->create}", '', "class='btn btn-primary'");
+ ?>
@@ -207,7 +202,7 @@ js::set('browseType', $browseType);
-
+
task->printCell($field, $task, $users, $browseType, $branchGroups, $modulePairs, $useDatatable ? 'datatable' : 'table');?>
children)):?>
diff --git a/module/story/config.php b/module/story/config.php
index 6af3cf4beb..cc7e2ea343 100644
--- a/module/story/config.php
+++ b/module/story/config.php
@@ -193,5 +193,5 @@ $config->story->datatable->fieldList['caseCount']['name'] = $lang->story->ca
$config->story->datatable->fieldList['actions']['title'] = 'actions';
$config->story->datatable->fieldList['actions']['fixed'] = 'right';
-$config->story->datatable->fieldList['actions']['width'] = '160';
+$config->story->datatable->fieldList['actions']['width'] = '156';
$config->story->datatable->fieldList['actions']['required'] = 'yes';
diff --git a/module/story/lang/zh-tw.php b/module/story/lang/zh-tw.php
index 228e22c989..601617f8a3 100644
--- a/module/story/lang/zh-tw.php
+++ b/module/story/lang/zh-tw.php
@@ -23,6 +23,7 @@ $lang->story->batchClose = '批量關閉';
$lang->story->activate = '激活';
$lang->story->delete = "刪除";
$lang->story->view = "需求詳情";
+$lang->story->setting = "設置";
$lang->story->tasks = "相關任務";
$lang->story->bugs = "相關Bug";
$lang->story->cases = "相關用例";
diff --git a/module/task/config.php b/module/task/config.php
index 93bc0664bd..89f09267bc 100644
--- a/module/task/config.php
+++ b/module/task/config.php
@@ -55,7 +55,7 @@ if($config->global->flow == 'onlyTask')
}
$config->task->datatable = new stdclass();
-$config->task->datatable->defaultField = array('id', 'pri', 'name', 'status', 'deadline', 'openedDate', 'assignedTo', 'finishedBy', 'estimate', 'consumed', 'left', 'actions');
+$config->task->datatable->defaultField = array('id', 'pri', 'name', 'status', 'assignedTo', 'finishedBy', 'estimate', 'consumed', 'left', 'progress', 'deadline', 'actions');
$config->task->datatable->fieldList['id']['title'] = 'idAB';
$config->task->datatable->fieldList['id']['fixed'] = 'left';
@@ -79,27 +79,27 @@ $config->task->datatable->fieldList['type']['required'] = 'no';
$config->task->datatable->fieldList['status']['title'] = 'statusAB';
$config->task->datatable->fieldList['status']['fixed'] = 'no';
-$config->task->datatable->fieldList['status']['width'] = '60';
+$config->task->datatable->fieldList['status']['width'] = '70';
$config->task->datatable->fieldList['status']['required'] = 'no';
$config->task->datatable->fieldList['estimate']['title'] = 'estimateAB';
$config->task->datatable->fieldList['estimate']['fixed'] = 'no';
-$config->task->datatable->fieldList['estimate']['width'] = '57';
+$config->task->datatable->fieldList['estimate']['width'] = '70';
$config->task->datatable->fieldList['estimate']['required'] = 'no';
$config->task->datatable->fieldList['consumed']['title'] = 'consumedAB';
$config->task->datatable->fieldList['consumed']['fixed'] = 'no';
-$config->task->datatable->fieldList['consumed']['width'] = '50';
+$config->task->datatable->fieldList['consumed']['width'] = '70';
$config->task->datatable->fieldList['consumed']['required'] = 'no';
$config->task->datatable->fieldList['left']['title'] = 'leftAB';
$config->task->datatable->fieldList['left']['fixed'] = 'no';
-$config->task->datatable->fieldList['left']['width'] = '40';
+$config->task->datatable->fieldList['left']['width'] = '70';
$config->task->datatable->fieldList['left']['required'] = 'no';
$config->task->datatable->fieldList['progress']['title'] = 'progress';
$config->task->datatable->fieldList['progress']['fixed'] = 'no';
-$config->task->datatable->fieldList['progress']['width'] = '40';
+$config->task->datatable->fieldList['progress']['width'] = '70';
$config->task->datatable->fieldList['progress']['required'] = 'no';
$config->task->datatable->fieldList['progress']['sort'] = 'no';
@@ -130,7 +130,7 @@ $config->task->datatable->fieldList['realStarted']['required'] = 'no';
$config->task->datatable->fieldList['assignedTo']['title'] = 'assignedTo';
$config->task->datatable->fieldList['assignedTo']['fixed'] = 'no';
-$config->task->datatable->fieldList['assignedTo']['width'] = '80';
+$config->task->datatable->fieldList['assignedTo']['width'] = '120';
$config->task->datatable->fieldList['assignedTo']['required'] = 'no';
$config->task->datatable->fieldList['assignedDate']['title'] = 'assignedDate';
@@ -197,5 +197,5 @@ $config->task->datatable->fieldList['lastEditedDate']['required'] = 'no';
$config->task->datatable->fieldList['actions']['title'] = 'actions';
$config->task->datatable->fieldList['actions']['fixed'] = 'right';
-$config->task->datatable->fieldList['actions']['width'] = '180';
+$config->task->datatable->fieldList['actions']['width'] = '156';
$config->task->datatable->fieldList['actions']['required'] = 'yes';
diff --git a/module/task/lang/zh-cn.php b/module/task/lang/zh-cn.php
index bc7de853a2..7756eba616 100644
--- a/module/task/lang/zh-cn.php
+++ b/module/task/lang/zh-cn.php
@@ -53,9 +53,9 @@ $lang->task->type = '任务类型';
$lang->task->pri = '优先级';
$lang->task->mailto = '抄送给';
$lang->task->estimate = '最初预计';
-$lang->task->estimateAB = '预';
+$lang->task->estimateAB = '预计';
$lang->task->left = '预计剩余';
-$lang->task->leftAB = '剩';
+$lang->task->leftAB = '剩余';
$lang->task->consumed = '总消耗';
$lang->task->consumedAB = '消耗';
$lang->task->hour = '小时';
diff --git a/module/task/lang/zh-tw.php b/module/task/lang/zh-tw.php
index 9c9b30446c..74064b18e4 100644
--- a/module/task/lang/zh-tw.php
+++ b/module/task/lang/zh-tw.php
@@ -53,9 +53,9 @@ $lang->task->type = '任務類型';
$lang->task->pri = '優先順序';
$lang->task->mailto = '抄送給';
$lang->task->estimate = '最初預計';
-$lang->task->estimateAB = '預';
+$lang->task->estimateAB = '預計';
$lang->task->left = '預計剩餘';
-$lang->task->leftAB = '剩';
+$lang->task->leftAB = '剩餘';
$lang->task->consumed = '總消耗';
$lang->task->consumedAB = '消耗';
$lang->task->hour = '小時';
diff --git a/module/task/model.php b/module/task/model.php
index 6b9592c6cc..a4ea4e4a10 100644
--- a/module/task/model.php
+++ b/module/task/model.php
@@ -2073,18 +2073,30 @@ class taskModel extends model
*/
public function printCell($col, $task, $users, $browseType, $branchGroups, $modulePairs = array(), $mode = 'datatable', $child = false)
{
+ $canBatchEdit = common::hasPriv('task', 'batchEdit', !empty($task) ? $task : null);
+ $canBatchClose = (common::hasPriv('task', 'batchClose', !empty($task) ? $task : null) && strtolower($browseType) != 'closedBy');
+ $canBatchCancel = common::hasPriv('task', 'batchCancel', !empty($task) ? $task : null);
+ $canBatchChangeModule = common::hasPriv('task', 'batchChangeModule', !empty($task) ? $task : null);
+ $canBatchAssignTo = common::hasPriv('task', 'batchAssignTo', !empty($task) ? $task : null);
+
+ $canBatchAction = $canBatchEdit or $canBatchClose or $canBatchCancel or $canBatchChangeModule or $canBatchAssignTo;
+
$canView = common::hasPriv('task', 'view');
$taskLink = helper::createLink('task', 'view', "taskID=$task->id");
$account = $this->app->user->account;
$id = $col->id;
if($col->show)
{
- $class = '';
+ $class = "c-{$id}";
if($id == 'status') $class .= ' task-' . $task->status;
if($id == 'id') $class .= ' cell-id';
if($id == 'name') $class .= ' text-left';
if($id == 'deadline' and isset($task->delay)) $class .= ' delayed';
- if($id == 'assignedTo' && $task->assignedTo == $account) $class .= ' red';
+ if($id == 'assignedTo')
+ {
+ $class .= ' c-actions';
+ if($task->assignedTo == $account) $class .= ' red';
+ }
$title = '';
if($id == 'name') $title = " title='{$task->name}'";
@@ -2094,12 +2106,14 @@ class taskModel extends model
switch($id)
{
case 'id':
- if($mode == 'table') echo " ";
- echo $canView ? html::a($taskLink, sprintf('%03d', $task->id)) : sprintf('%03d', $task->id);
+ echo "";
+ if($mode == 'table' && $canBatchAction) echo "";
+ echo sprintf('%03d', $task->id);
+ echo '
';
break;
case 'pri':
- echo "";
- echo $task->pri == '0' ? '' : zget($this->lang->task->priList, $task->pri);
+ echo "";
+ echo zget($this->lang->task->priList, $task->pri, $task->pri);
echo "";
break;
case 'name':
@@ -2146,6 +2160,7 @@ class taskModel extends model
echo $task->realStarted;
break;
case 'assignedTo':
+ common::printIcon('task', 'assignTo', "projectID=$task->project&taskID=$task->id", $task, 'list', '', '', 'iframe', true);
echo zget($users, $task->assignedTo);
break;
case 'assignedDate':
@@ -2201,16 +2216,22 @@ class taskModel extends model
echo substr($task->lastEditedDate, 5, 11);
break;
case 'actions':
- common::printIcon('task', 'assignTo', "projectID=$task->project&taskID=$task->id", $task, 'list', '', '', 'iframe', true);
- common::printIcon('task', 'start', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
-
- if($browseType == 'needconfirm')
+ if($task->storyStatus == 'changed' or $browseType == 'needconfirm')
{
$this->lang->task->confirmStoryChange = $this->lang->confirm;
- common::printIcon('task', 'confirmStoryChange', "taskid=$task->id", '', 'list', '', 'hiddenwin');
+ common::printIcon('task', 'confirmStoryChange', "taskid=$task->id", '', 'list', '', 'hiddenwin', 'btn-wide');
+ break;
}
- common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
- if($task->status == 'finished') common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
+
+ echo "";
+ if($task->status == 'wait') common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
+ echo "
";
+
+ if($task->status == 'wait') common::printIcon('task', 'start', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
+ if($task->status == 'pause') common::printIcon('task', 'restart', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
+ if($task->status == 'done' or $task->status == 'cancel' or $task->status == 'closed') common::printIcon('task', 'close', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
+ if($task->status == 'doing') common::printIcon('task', 'finish', "taskID=$task->id", $task, 'list', '', '', 'iframe', true);
+
common::printIcon('task', 'recordEstimate', "taskID=$task->id", $task, 'list', 'time', '', 'iframe', true);
common::printIcon('task', 'edit', "taskID=$task->id", $task, 'list');
if(empty($task->team) or empty($task->children))