no message
This commit is contained in:
parent
b936e61429
commit
a6ab9a797d
@ -14,6 +14,7 @@ use App\Models\User;
|
|||||||
use App\Models\WebSocketDialogMsg;
|
use App\Models\WebSocketDialogMsg;
|
||||||
use App\Module\Base;
|
use App\Module\Base;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Support\Arr;
|
||||||
use Request;
|
use Request;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -578,9 +579,8 @@ class ProjectController extends AbstractController
|
|||||||
$user = User::IDE($user['data']);
|
$user = User::IDE($user['data']);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
$column_id = intval(Request::input('column_id'));
|
$data = Request::all();
|
||||||
$name = trim(Request::input('name'));
|
$column_id = intval($data['column_id']);
|
||||||
$color = trim(Request::input('color'));
|
|
||||||
// 列表
|
// 列表
|
||||||
$column = ProjectColumn::whereId($column_id)->first();
|
$column = ProjectColumn::whereId($column_id)->first();
|
||||||
if (empty($column)) {
|
if (empty($column)) {
|
||||||
@ -596,8 +596,8 @@ class ProjectController extends AbstractController
|
|||||||
return Base::retError('项目不存在或不在成员列表内');
|
return Base::retError('项目不存在或不在成员列表内');
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
if ($name) $column->name = $name;
|
if (Arr::exists($data, 'name')) $column->name = $data['name'];
|
||||||
if ($color) $column->color = $color;
|
if (Arr::exists($data, 'color')) $column->color = $data['color'];
|
||||||
$column->save();
|
$column->save();
|
||||||
return Base::retSuccess('修改成功', $column);
|
return Base::retSuccess('修改成功', $column);
|
||||||
}
|
}
|
||||||
@ -659,17 +659,9 @@ class ProjectController extends AbstractController
|
|||||||
} else {
|
} else {
|
||||||
$user = User::IDE($user['data']);
|
$user = User::IDE($user['data']);
|
||||||
}
|
}
|
||||||
$project_id = Base::getPostInt('project_id');
|
parse_str(Request::getContent(), $data);
|
||||||
$column_id = Base::getPostValue('column_id');
|
$project_id = intval($data['project_id']);
|
||||||
$name = Base::getPostValue('name');
|
$column_id = $data['column_id'];
|
||||||
$content = Base::getPostValue('content');
|
|
||||||
$times = Base::getPostValue('times');
|
|
||||||
$owner = Base::getPostValue('owner');
|
|
||||||
$subtasks = Base::getPostValue('subtasks');
|
|
||||||
$p_level = Base::getPostValue('p_level');
|
|
||||||
$p_name = Base::getPostValue('p_name');
|
|
||||||
$p_color = Base::getPostValue('p_color');
|
|
||||||
$top = Base::getPostInt('top');
|
|
||||||
// 项目
|
// 项目
|
||||||
$project = Project::select($this->projectSelect)
|
$project = Project::select($this->projectSelect)
|
||||||
->join('project_users', 'projects.id', '=', 'project_users.project_id')
|
->join('project_users', 'projects.id', '=', 'project_users.project_id')
|
||||||
@ -701,20 +693,11 @@ class ProjectController extends AbstractController
|
|||||||
return Base::retError('任务列表不存在或已被删除');
|
return Base::retError('任务列表不存在或已被删除');
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
$result = ProjectTask::addTask([
|
$result = ProjectTask::addTask(array_merge($data, [
|
||||||
'parent_id' => 0,
|
'parent_id' => 0,
|
||||||
'project_id' => $project->id,
|
'project_id' => $project->id,
|
||||||
'column_id' => $column->id,
|
'column_id' => $column->id,
|
||||||
'name' => $name,
|
]));
|
||||||
'content' => $content,
|
|
||||||
'times' => $times,
|
|
||||||
'owner' => $owner,
|
|
||||||
'subtasks' => $subtasks,
|
|
||||||
'p_level' => $p_level,
|
|
||||||
'p_name' => $p_name,
|
|
||||||
'p_color' => $p_color,
|
|
||||||
'top' => $top,
|
|
||||||
]);
|
|
||||||
if (Base::isSuccess($result)) {
|
if (Base::isSuccess($result)) {
|
||||||
$result['data'] = ProjectTask::with(['taskUser', 'taskTag'])->whereId($result['data']['id'])->first();
|
$result['data'] = ProjectTask::with(['taskUser', 'taskTag'])->whereId($result['data']['id'])->first();
|
||||||
}
|
}
|
||||||
@ -742,13 +725,8 @@ class ProjectController extends AbstractController
|
|||||||
$user = User::IDE($user['data']);
|
$user = User::IDE($user['data']);
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
$task_id = Base::getPostInt('task_id');
|
parse_str(Request::getContent(), $data);
|
||||||
$name = Base::getPostValue('name');
|
$task_id = intval($data['task_id']);
|
||||||
$color = Base::getPostValue('color');
|
|
||||||
$content = Base::getPostValue('content');
|
|
||||||
$times = Base::getPostValue('times');
|
|
||||||
$owner = Base::getPostValue('owner');
|
|
||||||
$complete_at = Base::getPostValue('complete_at');
|
|
||||||
// 任务
|
// 任务
|
||||||
$task = ProjectTask::whereId($task_id)->first();
|
$task = ProjectTask::whereId($task_id)->first();
|
||||||
if (empty($task)) {
|
if (empty($task)) {
|
||||||
@ -764,27 +742,21 @@ class ProjectController extends AbstractController
|
|||||||
return Base::retError('项目不存在或不在成员列表内');
|
return Base::retError('项目不存在或不在成员列表内');
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
if ($complete_at === false || $complete_at === "false") {
|
if (Base::isDate($data['complete_at'])) {
|
||||||
// 标记未完成
|
|
||||||
if (!$task->complete_at) {
|
|
||||||
return Base::retError('未完成任务');
|
|
||||||
}
|
|
||||||
$result = $task->completeTask(null);
|
|
||||||
} elseif (Base::isDate($complete_at)) {
|
|
||||||
// 标记已完成
|
// 标记已完成
|
||||||
if ($task->complete_at) {
|
if ($task->complete_at) {
|
||||||
return Base::retError('任务已完成');
|
return Base::retError('任务已完成');
|
||||||
}
|
}
|
||||||
$result = $task->completeTask(Carbon::now());
|
$result = $task->completeTask(Carbon::now());
|
||||||
|
} elseif (Arr::exists($data, 'complete_at')) {
|
||||||
|
// 标记未完成
|
||||||
|
if (!$task->complete_at) {
|
||||||
|
return Base::retError('未完成任务');
|
||||||
|
}
|
||||||
|
$result = $task->completeTask(null);
|
||||||
} else {
|
} else {
|
||||||
// 更新任务
|
// 更新任务
|
||||||
$result = $task->updateTask([
|
$result = $task->updateTask($data);
|
||||||
'name' => $name,
|
|
||||||
'color' => $color,
|
|
||||||
'content' => $content,
|
|
||||||
'times' => $times,
|
|
||||||
'owner' => $owner,
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
if (Base::isSuccess($result)) {
|
if (Base::isSuccess($result)) {
|
||||||
$result['data'] = $task->toArray();
|
$result['data'] = $task->toArray();
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use App\Module\Base;
|
use App\Module\Base;
|
||||||
|
use Arr;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
|
||||||
@ -210,32 +211,33 @@ class ProjectTask extends AbstractModel
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加任务
|
* 添加任务
|
||||||
* @param $params
|
* @param $data
|
||||||
* @return array|bool
|
* @return array|bool
|
||||||
*/
|
*/
|
||||||
public static function addTask($params)
|
public static function addTask($data)
|
||||||
{
|
{
|
||||||
$parent_id = intval($params['parent_id']);
|
$parent_id = intval($data['parent_id']);
|
||||||
$project_id = intval($params['project_id']);
|
$project_id = intval($data['project_id']);
|
||||||
$column_id = intval($params['column_id']);
|
$column_id = intval($data['column_id']);
|
||||||
$name = $params['name'];
|
$name = $data['name'];
|
||||||
$content = $params['content'];
|
$content = $data['content'];
|
||||||
$times = $params['times'];
|
$times = $data['times'];
|
||||||
$owner = $params['owner'];
|
$owner = $data['owner'];
|
||||||
$subtasks = $params['subtasks'];
|
$subtasks = $data['subtasks'];
|
||||||
$p_level = intval($params['p_level']);
|
$p_level = intval($data['p_level']);
|
||||||
$p_name = $params['p_name'];
|
$p_name = $data['p_name'];
|
||||||
$p_color = $params['p_color'];
|
$p_color = $data['p_color'];
|
||||||
$top = intval($params['top']);
|
$top = intval($data['top']);
|
||||||
//
|
//
|
||||||
$retPre = $parent_id ? '子任务' : '任务';
|
$retPre = $parent_id ? '子任务' : '任务';
|
||||||
$task = self::createInstance();
|
$task = self::createInstance([
|
||||||
$task->parent_id = $parent_id;
|
'parent_id' => $parent_id,
|
||||||
$task->project_id = $project_id;
|
'project_id' => $project_id,
|
||||||
$task->column_id = $column_id;
|
'column_id' => $column_id,
|
||||||
$task->p_level = $p_level;
|
'p_level' => $p_level,
|
||||||
$task->p_name = $p_name;
|
'p_name' => $p_name,
|
||||||
$task->p_color = $p_color;
|
'p_color' => $p_color,
|
||||||
|
]);
|
||||||
if ($content) {
|
if ($content) {
|
||||||
$task->desc = Base::getHtml($content);
|
$task->desc = Base::getHtml($content);
|
||||||
}
|
}
|
||||||
@ -310,53 +312,31 @@ class ProjectTask extends AbstractModel
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 标记已完成、未完成
|
|
||||||
* @param Carbon|null $complete_at 完成时间
|
|
||||||
* @return array|bool
|
|
||||||
*/
|
|
||||||
public function completeTask($complete_at)
|
|
||||||
{
|
|
||||||
return AbstractModel::transaction(function () use ($complete_at) {
|
|
||||||
if ($complete_at === null) {
|
|
||||||
// 标记未完成
|
|
||||||
$this->complete_at = null;
|
|
||||||
} else {
|
|
||||||
// 标记已完成
|
|
||||||
if ($this->parent_id == 0) {
|
|
||||||
if (self::whereParentId($this->id)->whereCompleteAt(null)->exists()) {
|
|
||||||
return Base::retError('子任务未完成');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$this->complete_at = $complete_at;
|
|
||||||
}
|
|
||||||
$this->save();
|
|
||||||
return Base::retSuccess('修改成功');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改任务
|
* 修改任务
|
||||||
* @param $params
|
* @param $data
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function updateTask($params)
|
public function updateTask($data)
|
||||||
{
|
{
|
||||||
return AbstractModel::transaction(function () use ($params) {
|
return AbstractModel::transaction(function () use ($data) {
|
||||||
$name = $params['name'];
|
$content = $data['content'];
|
||||||
$color = $params['color'];
|
$times = $data['times'];
|
||||||
$content = $params['content'];
|
$owner = $data['owner'];
|
||||||
$times = $params['times'];
|
// 标题
|
||||||
$owner = $params['owner'];
|
if (Arr::exists($data, 'name')) {
|
||||||
// 子任务禁止修改项
|
if (empty($data['name'])) {
|
||||||
if ($this->parent_id > 0) {
|
return Base::retError('任务描述不能为空');
|
||||||
$color = null;
|
} elseif (mb_strlen($data['name']) > 255) {
|
||||||
$content = null;
|
return Base::retError('任务描述最多只能设置255个字');
|
||||||
|
}
|
||||||
|
$this->name = $data['name'];
|
||||||
}
|
}
|
||||||
// 名称、背景色
|
// 背景色
|
||||||
if ($name) $this->name = $name;
|
if (Arr::exists($data, 'color')) {
|
||||||
if ($color) $this->color = $color;
|
$this->color = $data['color'];
|
||||||
if ($content) {
|
}
|
||||||
|
if ($content && $this->parent_id === 0) {
|
||||||
ProjectTaskContent::updateInsert([
|
ProjectTaskContent::updateInsert([
|
||||||
'project_id' => $this->parent_id,
|
'project_id' => $this->parent_id,
|
||||||
'task_id' => $this->id,
|
'task_id' => $this->id,
|
||||||
@ -396,4 +376,29 @@ class ProjectTask extends AbstractModel
|
|||||||
return Base::retSuccess('修改成功');
|
return Base::retSuccess('修改成功');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 标记已完成、未完成
|
||||||
|
* @param Carbon|null $complete_at 完成时间
|
||||||
|
* @return array|bool
|
||||||
|
*/
|
||||||
|
public function completeTask($complete_at)
|
||||||
|
{
|
||||||
|
return AbstractModel::transaction(function () use ($complete_at) {
|
||||||
|
if ($complete_at === null) {
|
||||||
|
// 标记未完成
|
||||||
|
$this->complete_at = null;
|
||||||
|
} else {
|
||||||
|
// 标记已完成
|
||||||
|
if ($this->parent_id == 0) {
|
||||||
|
if (self::whereParentId($this->id)->whereCompleteAt(null)->exists()) {
|
||||||
|
return Base::retError('子任务未完成');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->complete_at = $complete_at;
|
||||||
|
}
|
||||||
|
$this->save();
|
||||||
|
return Base::retSuccess('修改成功');
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1955,7 +1955,7 @@ class Base
|
|||||||
public static function getPostValue($key, $default = null)
|
public static function getPostValue($key, $default = null)
|
||||||
{
|
{
|
||||||
$value = self::getContentValue($key, $default);
|
$value = self::getContentValue($key, $default);
|
||||||
if (empty($value)) {
|
if (!isset($value)) {
|
||||||
$value = Request::post($key, $default);
|
$value = Request::post($key, $default);
|
||||||
}
|
}
|
||||||
return $value;
|
return $value;
|
||||||
|
@ -122,7 +122,7 @@
|
|||||||
@remove="sortUpdate">
|
@remove="sortUpdate">
|
||||||
<div
|
<div
|
||||||
v-for="item in panelTask(column.project_task)"
|
v-for="item in panelTask(column.project_task)"
|
||||||
class="task-item task-draggable"
|
:class="['task-item task-draggable', item.complete_at ? 'complete' : '']"
|
||||||
:style="item.color ? {backgroundColor: item.color} : null">
|
:style="item.color ? {backgroundColor: item.color} : null">
|
||||||
<div :class="['task-head', item.desc ? 'has-desc' : '']">
|
<div :class="['task-head', item.desc ? 'has-desc' : '']">
|
||||||
<div class="task-title"><pre>{{item.name}}</pre></div>
|
<div class="task-title"><pre>{{item.name}}</pre></div>
|
||||||
@ -177,7 +177,7 @@
|
|||||||
:class="['task-time', item.today ? 'today' : '', item.overdue ? 'overdue' : '']"
|
:class="['task-time', item.today ? 'today' : '', item.overdue ? 'overdue' : '']"
|
||||||
:open-delay="600"
|
:open-delay="600"
|
||||||
:content="item.end_at">
|
:content="item.end_at">
|
||||||
<div><Icon type="ios-time-outline"/>{{ expiresFormat(item.end_at) }}</div>
|
<div v-if="!item.complete_at"><Icon type="ios-time-outline"/>{{ expiresFormat(item.end_at) }}</div>
|
||||||
</ETooltip>
|
</ETooltip>
|
||||||
</div>
|
</div>
|
||||||
<em v-if="item.p_name" class="priority-color" :style="{backgroundColor:item.p_color}"></em>
|
<em v-if="item.p_name" class="priority-color" :style="{backgroundColor:item.p_color}"></em>
|
||||||
|
37
resources/assets/sass/project-list.scss
vendored
37
resources/assets/sass/project-list.scss
vendored
@ -290,7 +290,7 @@
|
|||||||
background-color: #ffffff;
|
background-color: #ffffff;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
padding: 12px;
|
padding: 12px;
|
||||||
transition: box-shadow 0.3s;
|
transition: box-shadow 0.3s, opacity 0.3s;
|
||||||
position: relative;
|
position: relative;
|
||||||
&:hover {
|
&:hover {
|
||||||
box-shadow: 0 0 10px #e6ecfa;
|
box-shadow: 0 0 10px #e6ecfa;
|
||||||
@ -298,14 +298,6 @@
|
|||||||
&:first-child {
|
&:first-child {
|
||||||
margin-top: 16px;
|
margin-top: 16px;
|
||||||
}
|
}
|
||||||
.priority-color {
|
|
||||||
position: absolute;
|
|
||||||
top: 12px;
|
|
||||||
left: 0;
|
|
||||||
width: 3px;
|
|
||||||
height: 42px;
|
|
||||||
border-radius: 2px;
|
|
||||||
}
|
|
||||||
.task-head {
|
.task-head {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: flex-start;
|
align-items: flex-start;
|
||||||
@ -422,6 +414,33 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.priority-color {
|
||||||
|
position: absolute;
|
||||||
|
top: 12px;
|
||||||
|
left: 0;
|
||||||
|
width: 3px;
|
||||||
|
height: 42px;
|
||||||
|
max-height: 50%;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
&.complete {
|
||||||
|
opacity: 0.5;
|
||||||
|
&:hover {
|
||||||
|
opacity: 0.8;
|
||||||
|
}
|
||||||
|
.task-head {
|
||||||
|
.task-title {
|
||||||
|
text-decoration: line-through;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.task-desc,
|
||||||
|
.task-tags,
|
||||||
|
.task-users,
|
||||||
|
.task-progress,
|
||||||
|
.priority-color {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user