* [bug#57432,start,4h] add renameFiles to rename default files and modify deleteFiles.
This commit is contained in:
@@ -22,6 +22,8 @@ class fileSelector extends wg
|
||||
'gridHeight?: string|int', // 网格模式的高度。
|
||||
'gridGap?: string|int', // 网格模式的间距。
|
||||
'defaultFiles?: array[]', // 默认显示的文件列表。
|
||||
'deleteName: string="deleteFiles"', // 默认显示文件中被删除的文件。
|
||||
'renameName: string="renameFiles"', // 默认显示文件中被重命名的文件。
|
||||
'multiple?: bool=true', // 是否允许在文件选择对话框中一次性选择多个文件(需要操作系统支持)。
|
||||
'itemProps?: array|callback', // 文件项的属性。
|
||||
'draggable?: bool=true', // 是否允许拖拽。
|
||||
@@ -135,16 +137,6 @@ class fileSelector extends wg
|
||||
}
|
||||
$checkFiles = $checkFiles->do('return file');
|
||||
$this->setProp('onAdd', $checkFiles);
|
||||
|
||||
$removeFile = jsCallback('file')
|
||||
->do(<<<'JS'
|
||||
if(file.url != undefined && file.file == undefined)
|
||||
{
|
||||
const $form = $(event.target).closest('form');
|
||||
if($form.length > 0) $('<input />').attr('type', 'hidden').attr('name', 'deleteFiles[' + file.id + ']').attr('value', file.id).appendTo($form);
|
||||
}
|
||||
JS)->do('return file;');
|
||||
$this->setProp('onRemove', $removeFile);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+6
-36
@@ -1842,41 +1842,6 @@ class bugZen extends bug
|
||||
return !empty($file) ? $file : array();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建bug后存储上传的文件。
|
||||
* Save files after create a bug.
|
||||
*
|
||||
* @param int $bugID
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
private function updateFileAfterCreate(int $bugID): bool
|
||||
{
|
||||
$this->loadModel('file');
|
||||
if(!empty($_POST['fileList']))
|
||||
{
|
||||
$fileList = $this->post->fileList;
|
||||
if($fileList) $fileList = json_decode($fileList, true);
|
||||
if(!empty($_POST['deleteFiles']))
|
||||
{
|
||||
foreach($this->post->deleteFiles as $deletedCaseFileID) unset($fileList[$deletedCaseFileID]);
|
||||
}
|
||||
foreach($fileList as $file)
|
||||
{
|
||||
unset($file['id']);
|
||||
$file['objectType'] = 'bug';
|
||||
$file['objectID'] = $bugID;
|
||||
$this->file->saveFile($file, 'url,deleted,realPath,webPath,name,url,extra');
|
||||
}
|
||||
}
|
||||
|
||||
$uid = $this->post->uid ? $this->post->uid : '';
|
||||
$this->file->updateObjectID($uid, $bugID, 'bug');
|
||||
$this->file->saveUpload('bug', $bugID);
|
||||
|
||||
return !dao::isError();
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建bug后更新执行看板。
|
||||
* Update execution kanban after create a bug.
|
||||
@@ -1959,7 +1924,12 @@ class bugZen extends bug
|
||||
/* Set module of bug to cookie. */
|
||||
helper::setcookie('lastBugModule', (string)$bug->module);
|
||||
|
||||
$this->updateFileAfterCreate($bug->id);
|
||||
if(!empty($_POST['fileList']))
|
||||
{
|
||||
$fileList = $this->post->fileList;
|
||||
if($fileList) $fileList = json_decode($fileList, true);
|
||||
$this->loadModel('file')->saveDefaultFiles($fileList, 'bug', $bug->id);
|
||||
}
|
||||
|
||||
list($laneID, $columnID) = $this->getKanbanVariable($params);
|
||||
$this->updateKanbanAfterCreate($bug, $laneID, $columnID, $from);
|
||||
|
||||
@@ -1304,4 +1304,51 @@ class fileModel extends model
|
||||
if($this->config->file->storageType == 'fs') return $file->realPath;
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存默认文件。
|
||||
* Save default files.
|
||||
*
|
||||
* @param array $fileList
|
||||
* @param string $objectType
|
||||
* @param int|array $objectID
|
||||
* @param string|int $extra
|
||||
* @access public
|
||||
*/
|
||||
public function saveDefaultFiles(array $fileList, string $objectType, int|array $objectIdList, string|int $extra = '')
|
||||
{
|
||||
if(is_int($objectIdList)) $objectIdList = array($objectIdList);
|
||||
if(!empty($fileList))
|
||||
{
|
||||
if(!empty($_POST['deleteFiles']))
|
||||
{
|
||||
foreach($this->post->deleteFiles as $deletedFileID) unset($fileList[$deletedFileID]);
|
||||
}
|
||||
if(!empty($_POST['renameFiles']))
|
||||
{
|
||||
foreach($this->post->renameFiles as $renamedFileID => $newName) $fileList[$renamedFileID]['title'] = $newName;
|
||||
}
|
||||
|
||||
foreach($objectIdList as $objectID)
|
||||
{
|
||||
$fileIdList = '';
|
||||
foreach($fileList as $file)
|
||||
{
|
||||
unset($file['id']);
|
||||
$file['objectType'] = $objectType;
|
||||
$file['objectID'] = $objectID;
|
||||
$file['extra'] = $extra;
|
||||
$fileIdList .= ',' . $this->fileTao->saveFile($file, 'url,deleted,realPath,webPath,name,url');
|
||||
}
|
||||
if($objectType == 'story') $this->dao->update(TABLE_STORYSPEC)->set("files = CONCAT(files, '{$fileIdList}')")->where('story')->eq($objectID)->exec();
|
||||
}
|
||||
}
|
||||
|
||||
foreach($objectIdList as $objectID)
|
||||
{
|
||||
$uid = $this->post->uid ? $this->post->uid : '';
|
||||
$this->updateObjectID($uid, $objectID, $objectType);
|
||||
$this->saveUpload($objectType, $objectID, $extra);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -383,4 +383,30 @@ class fileTest
|
||||
|
||||
return array('old' => $oldObject, 'new' => $newObject, 'count' => $count);
|
||||
}
|
||||
|
||||
/**
|
||||
* 测试保存默认文件。
|
||||
* Test save default files.
|
||||
*
|
||||
* @param array $fileIdList
|
||||
* @param string $objectType
|
||||
* @param int|array $objectID
|
||||
* @param string|int $extra
|
||||
* @access public
|
||||
* @return array
|
||||
*/
|
||||
public function saveDefaultFilesTest(array $fileIdList, string $objectType, int|array $objectID, string|int $extra): array|string
|
||||
{
|
||||
$fileList = $this->objectModel->getByIdList($fileIdList);
|
||||
$fileList = json_decode(json_encode($fileList), true);
|
||||
$this->objectModel->saveDefaultFiles($fileList, $objectType, $objectID, $extra);
|
||||
|
||||
global $tester;
|
||||
$objects = $tester->dao->select('id')->from(TABLE_FILE)->where('objectID')->in($objectID)->andWhere('objectType')->eq($objectType)->andWhere('extra')->eq($extra)->fetchPairs('id');
|
||||
|
||||
if(dao::isError()) return dao::getError();
|
||||
|
||||
if(!$objects) return '0';
|
||||
return implode(',', $objects);
|
||||
}
|
||||
}
|
||||
|
||||
Executable
+67
@@ -0,0 +1,67 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/**
|
||||
|
||||
title=测试 fileModel->updateObjectID();
|
||||
cid=0
|
||||
|
||||
- 测试保存默认文件 1 到 需求 1001 extra 空 中 @6
|
||||
- 测试保存默认文件 1 到 需求 1001 extra 1 中 @7
|
||||
- 测试保存默认文件 1 到 需求 1001 1002 extra 空 中 @6,8,9
|
||||
|
||||
- 测试保存默认文件 1 到 需求 1001 1002 extra 1 中 @7,10,11
|
||||
|
||||
- 测试保存默认文件 1 到 任务 1001 extra 空 中 @12
|
||||
- 测试保存默认文件 1 到 任务 1001 extra 1 中 @13
|
||||
- 测试保存默认文件 1 到 任务 1001 1002 extra 空 中 @12,14,15
|
||||
|
||||
- 测试保存默认文件 1 到 任务 1001 1002 extra 1 中 @13,16,17
|
||||
|
||||
- 测试保存默认文件 1 2 到 需求 1001 extra 空 中 @6,8,18,19
|
||||
|
||||
- 测试保存默认文件 1 2 到 需求 1001 extra 1 中 @7,10,20,21
|
||||
|
||||
- 测试保存默认文件 1 2 到 需求 1001 1002 extra 空 中 @6,8,9,18,19,22,23,24,25
|
||||
|
||||
- 测试保存默认文件 1 2 到 需求 1001 1002 extra 1 中 @7,10,11,20,21,26,27,28,29-
|
||||
|
||||
- 测试保存默认文件 1 2 到 任务 1001 extra 空 中 @12,14,30,31
|
||||
|
||||
- 测试保存默认文件 1 2 到 任务 1001 extra 1 中 @13,16,32,33
|
||||
|
||||
- 测试保存默认文件 1 2 到 任务 1001 1002 extra 空 中 @12,14,15,30,31,34,35,36,37
|
||||
|
||||
- 测试保存默认文件 1 2 到 任务 1001 1002 extra 1 中 @13,16,17,32,33,38,39,40,41
|
||||
|
||||
*/
|
||||
include dirname(__FILE__, 5) . '/test/lib/init.php';
|
||||
include dirname(__FILE__, 2) . '/lib/file.unittest.class.php';
|
||||
su('admin');
|
||||
|
||||
zenData('file')->gen(5);
|
||||
|
||||
$uid = '98390890341';
|
||||
|
||||
$objectID = array(1001, array(1001, 1002));
|
||||
$objectType = array('story', 'task');
|
||||
$extra = array('', 1);
|
||||
$fileIdList = array(array(1), array(1,2));
|
||||
|
||||
$file = new fileTest();
|
||||
|
||||
r($file->saveDefaultFilesTest($fileIdList[0], $objectType[0], $objectID[0], $extra[0])) && p() && e('6'); // 测试保存默认文件 1 到 需求 1001 extra 空 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[0], $objectType[0], $objectID[0], $extra[1])) && p() && e('7'); // 测试保存默认文件 1 到 需求 1001 extra 1 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[0], $objectType[0], $objectID[1], $extra[0])) && p() && e('6,8,9'); // 测试保存默认文件 1 到 需求 1001 1002 extra 空 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[0], $objectType[0], $objectID[1], $extra[1])) && p() && e('7,10,11'); // 测试保存默认文件 1 到 需求 1001 1002 extra 1 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[0], $objectType[1], $objectID[0], $extra[0])) && p() && e('12'); // 测试保存默认文件 1 到 任务 1001 extra 空 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[0], $objectType[1], $objectID[0], $extra[1])) && p() && e('13'); // 测试保存默认文件 1 到 任务 1001 extra 1 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[0], $objectType[1], $objectID[1], $extra[0])) && p() && e('12,14,15'); // 测试保存默认文件 1 到 任务 1001 1002 extra 空 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[0], $objectType[1], $objectID[1], $extra[1])) && p() && e('13,16,17'); // 测试保存默认文件 1 到 任务 1001 1002 extra 1 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[1], $objectType[0], $objectID[0], $extra[0])) && p() && e('6,8,18,19'); // 测试保存默认文件 1 2 到 需求 1001 extra 空 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[1], $objectType[0], $objectID[0], $extra[1])) && p() && e('7,10,20,21'); // 测试保存默认文件 1 2 到 需求 1001 extra 1 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[1], $objectType[0], $objectID[1], $extra[0])) && p() && e('6,8,9,18,19,22,23,24,25'); // 测试保存默认文件 1 2 到 需求 1001 1002 extra 空 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[1], $objectType[0], $objectID[1], $extra[1])) && p() && e('7,10,11,20,21,26,27,28,29 '); // 测试保存默认文件 1 2 到 需求 1001 1002 extra 1 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[1], $objectType[1], $objectID[0], $extra[0])) && p() && e('12,14,30,31'); // 测试保存默认文件 1 2 到 任务 1001 extra 空 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[1], $objectType[1], $objectID[0], $extra[1])) && p() && e('13,16,32,33'); // 测试保存默认文件 1 2 到 任务 1001 extra 1 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[1], $objectType[1], $objectID[1], $extra[0])) && p() && e('12,14,15,30,31,34,35,36,37'); // 测试保存默认文件 1 2 到 任务 1001 1002 extra 空 中
|
||||
r($file->saveDefaultFilesTest($fileIdList[1], $objectType[1], $objectID[1], $extra[1])) && p() && e('13,16,17,32,33,38,39,40,41'); // 测试保存默认文件 1 2 到 任务 1001 1002 extra 1 中
|
||||
@@ -78,7 +78,12 @@ class story extends control
|
||||
$storyID = $this->story->{$createFunction}($storyData, $objectID, $bugID, $extra, $todoID);
|
||||
if(empty($storyID) || dao::isError()) return $this->send(array('result' => 'fail', 'message' => dao::getError()));
|
||||
|
||||
$this->storyZen->updateFileAfterCreate($storyID, $storyType);
|
||||
if(!empty($_POST['fileList']))
|
||||
{
|
||||
$fileList = $this->post->fileList;
|
||||
if($fileList) $fileList = json_decode($fileList, true);
|
||||
$this->loadModel('file')->saveDefaultFiles($fileList, 'story', $storyID, 1);
|
||||
}
|
||||
|
||||
$productID = $this->post->product ? $this->post->product : $productID;
|
||||
$message = $this->executeHooks($storyID);
|
||||
|
||||
@@ -2045,44 +2045,4 @@ class storyZen extends story
|
||||
}
|
||||
return $storyIdList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建需求后存储上传的文件。
|
||||
* Save files after create a story.
|
||||
*
|
||||
* @param int $storyID
|
||||
* @param string $storyType
|
||||
* @access public
|
||||
* @return bool
|
||||
*/
|
||||
public function updateFileAfterCreate(int $storyID, string $storyType): bool
|
||||
{
|
||||
$this->loadModel('file');
|
||||
if(!empty($_POST['fileList']))
|
||||
{
|
||||
$fileList = $this->post->fileList;
|
||||
if($fileList) $fileList = json_decode($fileList, true);
|
||||
if(!empty($_POST['deleteFiles']))
|
||||
{
|
||||
foreach($this->post->deleteFiles as $deletedCaseFileID) unset($fileList[$deletedCaseFileID]);
|
||||
}
|
||||
|
||||
$fileIdList = '';
|
||||
foreach($fileList as $file)
|
||||
{
|
||||
unset($file['id']);
|
||||
$file['objectType'] = $storyType;
|
||||
$file['objectID'] = $storyID;
|
||||
$file['extra'] = 1;
|
||||
$fileIdList .= ',' . $this->file->saveFile($file, 'url,deleted,realPath,webPath,name,url');
|
||||
}
|
||||
$this->dao->update(TABLE_STORYSPEC)->set("files = CONCAT(files, '{$fileIdList}')")->where('story')->eq($storyID)->exec();
|
||||
}
|
||||
|
||||
$uid = $this->post->uid ? $this->post->uid : '';
|
||||
$this->file->updateObjectID($uid, $storyID, $storyType);
|
||||
$this->file->saveUpload($storyType, $storyID, 1);
|
||||
|
||||
return !dao::isError();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -106,7 +106,13 @@ class task extends control
|
||||
$this->task->afterCreate($taskData, $taskIdList, $bugID, $todoID);
|
||||
$this->task->updateKanbanData($taskData->execution, $taskIdList, (int)$this->post->lane, $columnID);
|
||||
setCookie("lastTaskModule", (string)$this->post->module, $this->config->cookieLife, $this->config->webRoot, '', $this->config->cookieSecure, true);
|
||||
$this->taskZen->updateFileAfterCreate($taskIdList);
|
||||
|
||||
if(!empty($_POST['fileList']))
|
||||
{
|
||||
$fileList = $this->post->fileList;
|
||||
if($fileList) $fileList = json_decode($fileList, true);
|
||||
$this->loadModel('file')->saveDefaultFiles($fileList, 'task', $taskIdList);
|
||||
}
|
||||
|
||||
/* Get the information returned after a task is created. */
|
||||
$response = $this->taskZen->responseAfterCreate($taskData, $execution, $this->post->after ? $this->post->after : '');
|
||||
|
||||
@@ -2048,46 +2048,4 @@ class taskZen extends task
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建任务后存储上传的文件。
|
||||
* Save files after create a task.
|
||||
*
|
||||
* @param int $taskID
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
public function updateFileAfterCreate(array $taskIdList): bool
|
||||
{
|
||||
$this->loadModel('file');
|
||||
if(!empty($_POST['fileList']))
|
||||
{
|
||||
$fileList = $this->post->fileList;
|
||||
if($fileList) $fileList = json_decode($fileList, true);
|
||||
if(!empty($_POST['deleteFiles']))
|
||||
{
|
||||
foreach($this->post->deleteFiles as $deletedCaseFileID) unset($fileList[$deletedCaseFileID]);
|
||||
}
|
||||
|
||||
foreach($taskIdList as $taskID)
|
||||
{
|
||||
foreach($fileList as $file)
|
||||
{
|
||||
unset($file['id']);
|
||||
$file['objectType'] = 'task';
|
||||
$file['objectID'] = $taskID;
|
||||
$this->file->saveFile($file, 'url,deleted,realPath,webPath,name,url,extra');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach($taskIdList as $taskID)
|
||||
{
|
||||
$uid = $this->post->uid ? $this->post->uid : '';
|
||||
$this->file->updateObjectID($uid, $taskID, 'task');
|
||||
$this->file->saveUpload('task', $taskID);
|
||||
}
|
||||
|
||||
return !dao::isError();
|
||||
}
|
||||
}
|
||||
|
||||
+4
-35
@@ -2393,47 +2393,16 @@ class testcaseZen extends testcase
|
||||
helper::setcookie('lastCaseScene', (string)$case->scene);
|
||||
helper::setcookie('caseModule', '0');
|
||||
|
||||
/* 创建用例后存储上传的文件。*/
|
||||
$this->updateFileAfterCreate($caseID);
|
||||
|
||||
/* 如果需求关联到项目,把用例也关联到项目。 */
|
||||
/* If the story is linked project, make the case link the project. */
|
||||
$this->testcase->syncCase2Project($case, $caseID);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建testcase后存储上传的文件。
|
||||
* Save files after create a testcase.
|
||||
*
|
||||
* @param int $testcaseID
|
||||
* @access private
|
||||
* @return bool
|
||||
*/
|
||||
private function updateFileAfterCreate(int $testcaseID): bool
|
||||
{
|
||||
$this->loadModel('file');
|
||||
if(!empty($_POST['fileList']))
|
||||
{
|
||||
$fileList = $this->post->fileList;
|
||||
if($fileList) $fileList = json_decode($fileList, true);
|
||||
if(!empty($_POST['deleteFiles']))
|
||||
{
|
||||
foreach($this->post->deleteFiles as $deletedCaseFileID) unset($fileList[$deletedCaseFileID]);
|
||||
}
|
||||
foreach($fileList as $file)
|
||||
{
|
||||
unset($file['id']);
|
||||
$file['objectType'] = 'testcase';
|
||||
$file['objectID'] = $testcaseID;
|
||||
$this->file->saveFile($file, 'url,deleted,realPath,webPath,name,url,extra');
|
||||
}
|
||||
$this->loadModel('file')->saveDefaultFiles($fileList, 'testcase', $caseID);
|
||||
}
|
||||
|
||||
$uid = $this->post->uid ? $this->post->uid : '';
|
||||
$this->file->updateObjectID($uid, $testcaseID, 'testcase');
|
||||
$this->file->saveUpload('testcase', $testcaseID);
|
||||
|
||||
return !dao::isError();
|
||||
/* 如果需求关联到项目,把用例也关联到项目。 */
|
||||
/* If the story is linked project, make the case link the project. */
|
||||
$this->testcase->syncCase2Project($case, $caseID);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user