瀏覽代碼

no message

kuaifan 5 年之前
父節點
當前提交
68e45f7dc7

+ 11 - 2
app/Http/Controllers/Api/ProjectController.php

@@ -1320,6 +1320,7 @@ class ProjectController extends Controller
      * @apiParam {Number} [labelid]             项目子分类ID
      * @apiParam {Number} [level]               任务紧急级别(1~4,默认:2)
      * @apiParam {String} [username]            任务负责人用户名(如果项目ID为空时此参数无效,负责人为自己)
+     * @apiParam {Number} [insertbottom]        是否添加至列表结尾(1:是,默认:0,仅适用于项目分类列表)
      *
      * @throws \Throwable
      */
@@ -1334,6 +1335,7 @@ class ProjectController extends Controller
         //
         $projectid = intval(Request::input('projectid'));
         $labelid = intval(Request::input('labelid'));
+        $insertbottom = intval(Request::input('insertbottom'));
         if ($projectid > 0) {
             $projectDetail = Base::DBC2A(DB::table('project_lists')->where('id', $projectid)->where('delete', 0)->first());
             if (empty($projectDetail)) {
@@ -1376,6 +1378,13 @@ class ProjectController extends Controller
         }
         //
         $level = max(1, min(4, intval(Request::input('level'))));
+        if (empty($projectid)) {
+            $inorder = 0;
+        } else {
+            $inorder = intval(DB::table('project_task')->where('projectid', $projectid)->orderBy('inorder', $insertbottom ? 'asc' : 'desc')->value('inorder')) + ($insertbottom ? -1 : 1);
+        }
+        $userorder = intval(DB::table('project_task')->where('username', $user['username'])->where('level', $level)->orderByDesc('userorder')->value('userorder')) + 1;
+        //
         $inArray = [
             'projectid' => $projectid,
             'labelid' => $labelid,
@@ -1383,8 +1392,8 @@ class ProjectController extends Controller
             'username' => $username,
             'title' => $title,
             'level' => $level,
-            'inorder' => empty($projectid) ? 0 : intval(DB::table('project_task')->where('projectid', $projectid)->orderByDesc('inorder')->value('inorder')) + 1,
-            'userorder' => intval(DB::table('project_task')->where('username', $user['username'])->where('level', $level)->orderByDesc('userorder')->value('userorder')) + 1,
+            'inorder' => $inorder,
+            'userorder' => $userorder,
             'indate' => Base::time(),
             'startdate' => Base::time(),
             'subtask' => Base::array2string([]),

+ 7 - 6
package.json

@@ -1,10 +1,11 @@
 {
-    "version": "1.4.17",
+    "version": "1.4.18",
     "name": "wookteam",
     "private": true,
     "scripts": {
         "ide-helper": "php artisan ide-helper:generate",
         "laravels-start": "php bin/laravels start",
+        "laravels-watch": "./bin/fswatch ./app",
         "dev": "npm run development",
         "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
         "watch": "npm run development -- --watch",
@@ -20,11 +21,11 @@
         "jquery": "^3.5.1",
         "jspdf": "^1.5.3",
         "laravel-mix": "^2.0",
-        "lodash": "^4.17.15",
-        "stylus": "^0.54.7",
+        "lodash": "^4.17.19",
+        "stylus": "^0.54.8",
         "stylus-loader": "^3.0.2",
         "vue": "^2.6.11",
-        "vue-router": "^3.3.2",
+        "vue-router": "^3.4.2",
         "vue-template-compiler": "^2.6.11"
     },
     "dependencies": {
@@ -35,7 +36,7 @@
         "vue-emoji-picker": "^1.0.1",
         "vue-kityminder-gg": "^1.3.1",
         "vuedraggable": "^2.24.0",
-        "x-data-spreadsheet": "^1.1.4",
-        "xlsx": "^0.16.3"
+        "x-data-spreadsheet": "^1.1.6",
+        "xlsx": "^0.16.5"
     }
 }

+ 41 - 3
resources/assets/js/main/components/project/task/add.vue

@@ -35,7 +35,15 @@
                         </div>
                     </div>
                 </Poptip>
-                <Button class="enter-module-btn" type="info" size="small" @click="clickAdd">{{$L('添加任务')}}</Button>
+                <div class="enter-module-btn">
+                    <Button class="enter-module-btn-1" type="info" size="small" @click="clickAdd">{{$L('添加任务')}}</Button>
+                    <Dropdown class="enter-module-btn-drop" @on-click="dropAdd" placement="bottom-end" transfer>
+                        <Button class="enter-module-btn-2" type="info" size="small"><Icon type="ios-arrow-down"></Icon></Button>
+                        <DropdownMenu slot="list" class="enter-module-btn-drop-list">
+                            <DropdownItem name="insertbottom">{{$L('添加至列表结尾')}}</DropdownItem>
+                        </DropdownMenu>
+                    </Dropdown>
+                </div>
             </div>
         </div>
         <div v-if="loadIng > 0" class="load-box" @click.stop="">
@@ -44,6 +52,14 @@
     </div>
 </template>
 
+<style lang="scss">
+    .enter-module-btn-drop-list {
+        .ivu-dropdown-item {
+            padding: 5px 16px;
+            font-size: 12px !important;
+        }
+    }
+</style>
 <style lang="scss" scoped>
     .task-input-box {
         position: relative;
@@ -137,7 +153,22 @@
                     flex: 1;
                 }
                 .enter-module-btn {
-                    font-size: 12px;
+                    button {
+                        font-size: 12px;
+                    }
+                    .enter-module-btn-1 {
+                        border-top-right-radius: 0;
+                        border-bottom-right-radius: 0;
+                    }
+                    .enter-module-btn-2 {
+                        padding: 0 2px;
+                        border-top-left-radius: 0;
+                        border-bottom-left-radius: 0;
+                    }
+                    .enter-module-btn-drop {
+                        margin-left: -4px;
+                        border-left: 1px solid #c0daff;
+                    }
                 }
             }
         }
@@ -193,7 +224,12 @@
             changeUser(user) {
                 this.addUserimg = user.userimg;
             },
-            clickAdd() {
+            dropAdd(name) {
+                if (name == 'insertbottom') {
+                    this.clickAdd(true);
+                }
+            },
+            clickAdd(insertbottom = false) {
                 let addText = this.addText.trim();
                 if ($A.count(addText) == 0 || this.loadIng > 0) {
                     return;
@@ -207,6 +243,7 @@
                         title: addText,
                         level: this.addLevel,
                         username: this.addUsername,
+                        insertbottom: insertbottom ? 1 : 0,
                     },
                     complete: () => {
                         this.loadIng--;
@@ -219,6 +256,7 @@
                             this.addText = '';
                             this.addFocus = false;
                             this.$Message.success(res.msg);
+                            res.data.insertbottom = insertbottom;
                             this.$emit('on-add-success', res.data);
                             $A.triggerTaskInfoListener('create', res.data);
                             $A.triggerTaskInfoChange(res.data.id);

+ 17 - 4
resources/assets/js/main/components/project/task/detail/detail.vue

@@ -70,7 +70,7 @@
                     <div v-if="detail.subtask.length == 0" class="detail-subtask-none" @click="handleTask('subtaskAdd')">{{$L('暂无子任务')}}</div>
                     <div v-else>
                         <Progress class="detail-subtask-progress" :percent="subtaskProgress" :stroke-width="5" status="active" />
-                        <div v-for="(subitem, subindex) in detail.subtask" :key="subindex" class="detail-subtask-item">
+                        <div v-for="(subitem, subindex) in detail.subtask" :key="subindex" :data-id="subitem.id" class="detail-subtask-item">
                             <Checkbox v-model="subitem.status"
                                       true-value="complete"
                                       false-value="unfinished"
@@ -78,6 +78,7 @@
                             <Input v-model="subitem.detail"
                                    type="textarea"
                                    class="detail-subtask-input"
+                                   :readonly="subitem.status=='complete'"
                                    :ref="`subtaskInput_${subindex}`"
                                    :class="{'subtask-complete':subitem.status=='complete'}"
                                    :rows="1"
@@ -469,7 +470,13 @@
                         if (!$A.isArray(this.detail.subtask)) {
                             this.detail.subtask = [];
                         }
-                        this.detail.subtask.push({status: 'unfinished', detail: '' });
+                        this.detail.subtask.push({
+                            id: $A.randomString(6),
+                            uname: $A.getUserName(),
+                            time: Math.round(new Date().getTime()/1000),
+                            status: 'unfinished',
+                            detail: ''
+                        });
                         this.$nextTick(() => {
                             this.$refs['subtaskInput_' + (this.detail.subtask.length  - 1)][0].focus();
                         });
@@ -506,7 +513,7 @@
                         ajaxData.content = tempArray;
                         ajaxCallback = (res) => {
                             if (res !== 1) {
-                                this.$set(this.detail, act, this.bakData[act]);
+                                this.$set(this.detail, act, cloneDeep(this.bakData[act]));
                             }
                         };
                         break;
@@ -704,7 +711,13 @@
                             this.bakData = cloneDeep(this.detail);
                             while (tempArray.length > 0 && tempArray[tempArray.length - 1].detail == '') {
                                 tempArray.splice(tempArray.length - 1, 1);
-                                this.detail.subtask.push({status: 'unfinished', detail: '' })
+                                this.detail.subtask.push({
+                                    id: $A.randomString(6),
+                                    uname: $A.getUserName(),
+                                    time: Math.round(new Date().getTime()/1000),
+                                    status: 'unfinished',
+                                    detail: ''
+                                });
                             }
                             $A.triggerTaskInfoListener(ajaxData.act, res.data);
                             $A.triggerTaskInfoChange(ajaxData.taskid);

+ 10 - 2
resources/assets/js/main/pages/project/panel.vue

@@ -462,7 +462,11 @@
                                 let tempLists = label.taskLists.filter((res) => { return res.id == detail.id });
                                 if (tempLists.length == 0) {
                                     detail.isNewtask = true;
-                                    label.taskLists.unshift(detail);
+                                    if (detail.insertbottom) {
+                                        label.taskLists.push(detail);
+                                    } else {
+                                        label.taskLists.unshift(detail);
+                                    }
                                     this.$nextTick(() => {
                                         this.$set(detail, 'isNewtask', false);
                                     });
@@ -776,7 +780,11 @@
             addTaskSuccess(taskDetail, label) {
                 if (label.taskLists instanceof Array) {
                     taskDetail.isNewtask = true;
-                    label.taskLists.unshift(taskDetail);
+                    if (taskDetail.insertbottom) {
+                        label.taskLists.push(taskDetail);
+                    } else {
+                        label.taskLists.unshift(taskDetail);
+                    }
                     this.$nextTick(() => {
                         this.$set(taskDetail, 'isNewtask', false);
                     });