From dbd041f0d099e863c044197b2755e9e8ef3c3da1 Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 화, 07 12월 2021 14:00:43 +0900
Subject: [PATCH] 하위 이슈상태 전체변경

---
 src/main/webapp/scripts/app/issue/issue.js                            |    2 
 src/main/webapp/views/issue/downIssueModifyStatus.html                |   74 ++++++++++++
 src/main/resources/mybatis/query-template/issueStatus-template.xml    |   29 ++++
 src/main/webapp/i18n/ko/global.json                                   |    2 
 src/main/webapp/views/issue/issueDetail.html                          |   12 +
 src/main/webapp/scripts/app/issue/issueDetail.controller.js           |   20 +++
 src/main/webapp/scripts/main.js                                       |    1 
 src/main/webapp/scripts/app/issue/downIssueModifyStatus.controller.js |  165 +++++++++++++++++++++++++++
 8 files changed, 300 insertions(+), 5 deletions(-)

diff --git a/src/main/resources/mybatis/query-template/issueStatus-template.xml b/src/main/resources/mybatis/query-template/issueStatus-template.xml
index 14cf401..2f9ea73 100644
--- a/src/main/resources/mybatis/query-template/issueStatus-template.xml
+++ b/src/main/resources/mybatis/query-template/issueStatus-template.xml
@@ -3,6 +3,35 @@
 
 <mapper namespace="kr.wisestone.owl.mapper.IssueStatusMapper">
 
+    <!--<select id="find" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueStatusCondition">
+        SELECT
+        DISTINCT i.id as id,
+        i.name as name,
+        i.color as color,
+        i.issue_status_type as issueStatusType,
+        CASE i.default_yn WHEN 'Y' THEN 'true' ELSE 'false' END as defaultYn
+        FROM
+        issue_status i
+        INNER JOIN workspace ws on i.workspace_id = ws.id
+        WHERE 1=1
+        <if test="name != '' and name != null">
+            AND i.name like CONCAT('%',#{name},'%')
+        </if>
+        <choose>
+            <when test="issueStatusTypes.size != 0">
+                AND i.issue_status_type IN
+                <foreach collection="issueStatusTypes" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </when>
+        </choose>
+        AND ws.id = #{workspaceId}
+        ORDER BY i.name DESC
+        <if test="page != null and !page.equals('')">
+            limit #{pageSize} offset #{page};
+        </if>
+    </select>-->
+
     <select id="find" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueStatusCondition">
         SELECT
         DISTINCT i.id as id,
diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json
index 43be140..70c9614 100644
--- a/src/main/webapp/i18n/ko/global.json
+++ b/src/main/webapp/i18n/ko/global.json
@@ -729,6 +729,7 @@
         "updatableStatus": "蹂�寃� 媛��뒫�븳 �긽�깭",
         "testCase": "�뀒�뒪�듃 耳��씠�뒪",
         "updateStatus": "�긽�깭 蹂�寃�",
+        "updateDownIssueAllStatus": "�븯�쐞 �씠�뒋�긽�깭 �쟾泥� 蹂�寃�",
         "tcmProject": "�뀒�뒪�듃 耳��씠�뒪 愿�由� �봽濡쒖젥�듃",
         "btsProject": "�씠�뒋 愿�由� �봽濡쒖젥�듃",
         "projectName": "�봽濡쒖젥�듃紐�",
@@ -737,6 +738,7 @@
         "parentProject": "�긽�쐞 �봽濡쒖젥�듃",
         "setParticipatingInProject": "�봽濡쒖젥�듃�뿉 李몄뿬�븯�뒗 �궗�슜�옄瑜� �꽕�젙�븯�떗�떆�삤.",
         "noUpdatedStatus": "蹂�寃쏀븷 �닔 �엳�뒗 �긽�깭媛� �뾾�뒿�땲�떎.",
+        "notEqualedStatus": "�씠�뒋 �긽�깭媛� 媛숈쓣 寃쎌슦�뿉留� �쟾泥� 蹂�寃쎌씠 媛��뒫�빀�땲�떎.",
         "wait": "��湲�",
         "progress": "吏꾪뻾",
         "end": "醫낅즺",
diff --git a/src/main/webapp/scripts/app/issue/downIssueModifyStatus.controller.js b/src/main/webapp/scripts/app/issue/downIssueModifyStatus.controller.js
new file mode 100644
index 0000000..fa12bc5
--- /dev/null
+++ b/src/main/webapp/scripts/app/issue/downIssueModifyStatus.controller.js
@@ -0,0 +1,165 @@
+/**
+ * Created by wisestone on 2018-11-22.
+ */
+'use strict';
+
+define([
+        'app'
+    ],
+    function (app) {
+        app.controller('downIssueModifyStatusController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'SweetAlert', '$timeout', '$stateParams', 'parameter',
+            'Issue', 'IssueStatus', '$filter', '$injector', '$controller',
+            function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, SweetAlert, $timeout, $stateParams, parameter, Issue, IssueStatus, $filter, $injector, $controller) {
+
+                //  �븿�닔 紐⑥쓬
+                $scope.fn = {
+                    cancel: cancel,    //  �뙘�뾽 李� �떕湲�
+                    formSubmit: formSubmit,    //  �뤌 �쟾�넚
+                    formCheck: formCheck,  //  �뤌 泥댄겕
+                    findNextMultiIssueStatus: findNextMultiIssueStatus,  //  �씠�룞 媛��뒫�븳 �씠�뒋 �긽�깭瑜� 李얜뒗�떎.
+                    removeDepartment : removeDepartment,     // �떞�떦遺��꽌 �궘�젣
+                };
+
+                //  蹂��닔 紐⑥쓬
+                $scope.vm = {
+                    issueStatusList: [],   //  蹂�寃� 媛��뒫�븳 �긽�깭 紐⑸줉
+                    form: {
+                        departments: [],    // �떞�떦 遺��꽌 �꽑�깮 紐⑸줉
+                        issueStatusId: undefined,
+                        comment: ""
+                    },
+                    departmentName : ""
+                };
+
+                angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector}));
+
+                // �떞�떦遺��꽌 �궘�젣
+                function removeDepartment(index) {
+                    $scope.vm.form.departments.splice(index, 1);
+                }
+
+                $scope.$watch("vm.form.issueStatusId", function (newValue) {
+                    // �씠�뒋 �긽�깭蹂� �떞�떦遺��꽌 �몴�떆
+                    let selectIssueStatusId = $scope.vm.form.issueStatusId;
+                    let issueStatusList = $scope.vm.issueStatusList;
+                    $scope.vm.form.departments = [];
+
+                    if (issueStatusList != null && $scope.vm.issueStatusList.length > 0 && selectIssueStatusId !== "") {
+                        for (let i = 0; i < issueStatusList.length; i++) {
+                            if (issueStatusList[i].id.toString() === selectIssueStatusId) {
+                                let workflowDepartments = issueStatusList[i].workflowDepartmentVos;
+
+                                workflowDepartments.forEach(function (workflowDepartment) {
+                                    $scope.vm.form.departments.push(workflowDepartment.departmentVo);
+                                });
+                                break;
+                            }
+                        }
+                        $scope.vm.issueStatusList.forEach(function (issueStatus) {
+                            if (issueStatus.id === $scope.vm.form.issueStatusId) {
+
+                            }
+                        });
+                    }
+                });
+
+                //  �씠�룞 媛��뒫�븳 �씠�뒋 �긽�깭瑜� 李얜뒗�떎.
+                function findNextMultiIssueStatus() {
+                    $rootScope.spinner = true;
+
+                    var content = {
+                        issueIds : (function () {
+                            var issueIds = [];
+
+                            angular.forEach(parameter.downIssues, function (downIssue) {
+                                issueIds.push(downIssue.id);
+                            });
+
+                            return issueIds;
+                        })(),
+                    };
+
+                    IssueStatus.findNextMultiIssueStatus($resourceProvider.getContent(
+                        content,
+                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
+
+                        if (result.data.message.status === "success") {
+                            $scope.vm.issueStatusList = result.data.data;
+
+                        } else {
+                            SweetAlert.swal($filter("translate")("issue.failedIssueStatusCheck"), result.data.message.message, "error"); // �씠�룞 媛��뒫�븳 �씠�뒋 �긽�깭 議고쉶 �떎�뙣
+                        }
+
+                        $rootScope.spinner = false;
+                    });
+                }
+
+                //  �뤌 �쟾�넚
+                function formCheck(formInvalid) {
+                    if (formInvalid) {
+                        return true;
+                    }
+
+                    return false;
+                }
+
+                //  �뤌 �쟾�넚
+                function formSubmit() {
+                    $rootScope.spinner = true;
+
+                    var content = {
+                        ids: (function () {
+                            var issueIds = [];
+
+                            angular.forEach(parameter.downIssues, function (downIssue) {
+                                issueIds.push(downIssue.id);
+                            });
+
+                            return issueIds;
+                        })(),
+                        issueStatusId: $scope.vm.form.issueStatusId,
+                        comment: $scope.vm.form.comment,
+                        projectId : parameter.projectId,
+                        departmentIds : (function () {
+                            var departmentIds = [];
+
+                            angular.forEach($scope.vm.form.departments, function (department) {
+                                departmentIds.push(department.id);
+                            });
+
+                            return departmentIds;
+                        })(),
+                    };
+
+                    Issue.modifyMultiIssueStatus($resourceProvider.getContent(content,
+                        $resourceProvider.getPageContent(0, 0))).then(function (result) {
+
+                        if (result.data.message.status === "success") {
+                            $scope.fn.cancel();
+
+                            $rootScope.$broadcast("getIssueList", {});
+
+                            if ($rootScope.isDefined($rootScope.currentDetailIssueId)) {
+                                $rootScope.$broadcast("getIssueDetail", {id: $rootScope.currentDetailIssueId});
+                            }
+                        } else {
+                            SweetAlert.error($filter("translate")("issue.failedToChangeMultipleIssueStatus"), result.data.message.message); // �떎以� �씠�뒋 �긽�깭 蹂�寃� �떎�뙣
+                        }
+
+                        $rootScope.spinner = false;
+                    });
+                }
+
+
+                //  �뙘�뾽 李� �떕湲�
+                function cancel() {
+                    $rootScope.$broadcast("closeLayer");    //  �뙘�뾽�씠 �뿴由ш퀬 �굹�꽌 js-multi, js-single �벑�뿉�꽌 body �씠踰ㅽ듃媛� �궇�븘媛��뒗 �쁽�긽 �닔�젙
+                    $uibModalInstance.dismiss('cancel');
+                    $(document).unbind("keydown");  //  �떒異뺥궎 �씠踰ㅽ듃 �젣嫄�
+                }
+
+                //  �씠�룞 媛��뒫�븳 �씠�뒋 �긽�깭瑜� 李얜뒗�떎.
+                $scope.fn.findNextMultiIssueStatus();
+
+            }]);
+    });
diff --git a/src/main/webapp/scripts/app/issue/issue.js b/src/main/webapp/scripts/app/issue/issue.js
index 3858282..1e0adad 100644
--- a/src/main/webapp/scripts/app/issue/issue.js
+++ b/src/main/webapp/scripts/app/issue/issue.js
@@ -36,7 +36,7 @@
                                 'issueListTimelineController', 'issueManagerController', 'issueListController', 'issueAddController', 'issueModifyController', 'issueDetailController', 'issueAddRelationController', 'issueImportExcelController',
                                 'chartLoader', 'jsTable', 'tableColumnGenerator', 'modalFormAutoScroll', 'summerNote', 'summerNote-ko-KR', 'fullScroll', 'workflowService', 'priorityService', 'issueSearchService', 'issueTableConfigService', 'inputRegex',
                                 'severityService', 'issueTypeService', 'issueTypeCustomFieldService', 'issueService', 'issueStatusService', 'issueUserService','issueDepartmentService','issueModifyUserController', 'issueModifyDepartmentController', 'customFieldService', 'issueSearchFieldKeyViewElement',
-                                'issueSearchCustomFieldViewElement', 'tableUserImage', 'fullScroll', 'issueCommentService', 'detectIssueEditor', 'formSubmit', 'issueModifyStatusController', 'jsShortCut',
+                                'issueSearchCustomFieldViewElement', 'tableUserImage', 'fullScroll', 'issueCommentService', 'detectIssueEditor', 'formSubmit', 'issueModifyStatusController', 'downIssueModifyStatusController', 'jsShortCut',
                                 'issueAddTableConfigController','issueAddRelationTableConfigController','issueAddDownTableConfigController','domAppend', 'issueDetailImagePreview', 'issueSendMailPartnersController', 'htmlDiff', 'issueVersionViewController', 'issueVersionService',
                                 'jsHtmlDiff', 'issueReservationController', 'issueReservationService', 'issueVersionService', 'issueStatusAutoFocus', 'issueRelationService'
                             ], function () {
diff --git a/src/main/webapp/scripts/app/issue/issueDetail.controller.js b/src/main/webapp/scripts/app/issue/issueDetail.controller.js
index 7a41cc1..da36afb 100644
--- a/src/main/webapp/scripts/app/issue/issueDetail.controller.js
+++ b/src/main/webapp/scripts/app/issue/issueDetail.controller.js
@@ -28,6 +28,7 @@
                 $scope.fn.updateActiveHistory = updateActiveHistory;    //  �솢�룞 �궡�뿭�뿉�꽌 �쟾泥� 蹂닿린 �꺆�쓣 �닃���쓣 �븣 �뙎湲�, 湲곕줉 �젙蹂대�� �뾽�뜲�씠�듃 �븳�떎.
                 $scope.fn.getChangeIssueStatusList = getChangeIssueStatusList;    //  �씠�뒋�쓽 �쁽�옱 �긽�깭�뿉�꽌 蹂�寃� 媛��뒫�븳 �씠�뒋 �깄�깭 紐⑸줉 媛��졇�삤湲�
                 $scope.fn.modifyIssueStatus = modifyIssueStatus;    //  �씠�뒋 �긽�깭 蹂�寃�
+                $scope.fn.modifyDownIssueStatus = modifyDownIssueStatus;    //�븯�쐞 �씠�뒋 �긽�깭 蹂�寃�
                 $scope.fn.modifyIssueUser = modifyIssueUser;    //  �씠�뒋 �떞�떦�옄 蹂�寃�
                 $scope.fn.modifyIssueDepartment = modifyIssueDepartment;    //  �씠�뒋 �떞�떦遺��꽌 蹂�寃�
                 $scope.fn.initReload = initReload;  //  珥덇린�솕 �빐�빞�븷 �븷紐⑹쓣 吏��젙�븯�뿬 �떎瑜� �씠�뒋瑜� �겢由��븷 �븣 珥덇린�솕�빐以��떎.
@@ -720,6 +721,25 @@
                     });
                 }
 
+                function modifyDownIssueStatus() {
+                    $uibModal.open({
+                        templateUrl : 'views/issue/downIssueModifyStatus.html',
+                        size : "md",
+                        controller : 'downIssueModifyStatusController',
+                        backdrop : 'static',
+                        resolve : {
+                            parameter : function () {
+                                return {
+                                    issueTypeId : $scope.vm.viewer.issueTypeVo.id,
+                                    issueIds : [$scope.vm.viewer.id],
+                                    downIssues : $scope.vm.viewer.issueDownVos,
+                                    projectId : $scope.vm.viewer.projectVo.id
+                                };
+                            }
+                        }
+                    });
+                }
+
                 //  �떞�떦�옄 蹂�寃�
                 function modifyIssueUser() {
                     $uibModal.open({
diff --git a/src/main/webapp/scripts/main.js b/src/main/webapp/scripts/main.js
index 0757943..ce2f8de 100644
--- a/src/main/webapp/scripts/main.js
+++ b/src/main/webapp/scripts/main.js
@@ -184,6 +184,7 @@
         'issueManagerController' : 'app/issue/issueManager.controller',   //  �씠�뒋 愿�由� 而⑦듃濡ㅻ윭
         'issueImportExcelController' : 'app/issue/issueImportExcel.controller',    //  �씠�뒋 �뿊�� ���웾 import
         'issueModifyStatusController' : 'app/issue/issueModifyStatus.controller',   //  �씠�뒋 �떎以� �긽�깭 蹂�寃� 而⑦듃濡ㅻ윭
+        'downIssueModifyStatusController' : 'app/issue/downIssueModifyStatus.controller',   //  �븯�쐞 �씠�뒋 �긽�깭 蹂�寃� 而⑦듃濡ㅻ윭
         'issueAddTableConfigController' : 'app/issue/issueAddTableConfig.controller',   //  �씠�뒋 �뀒�씠釉� �꽕�젙 而⑦듃濡ㅻ윭
         'issueAddRelationTableConfigController' : 'app/issue/issueAddRelationTableConfig.controller',   //  �씠�뒋 �뀒�씠釉� �꽕�젙 而⑦듃濡ㅻ윭
         'issueAddDownTableConfigController' : 'app/issue/issueAddDownTableConfig.controller',   //  �씠�뒋 �뀒�씠釉� �꽕�젙 而⑦듃濡ㅻ윭
diff --git a/src/main/webapp/views/issue/downIssueModifyStatus.html b/src/main/webapp/views/issue/downIssueModifyStatus.html
new file mode 100644
index 0000000..5876cfa
--- /dev/null
+++ b/src/main/webapp/views/issue/downIssueModifyStatus.html
@@ -0,0 +1,74 @@
+<div class="formModal">
+    <div class="modal-header faded smaller">
+        <div class="modal-title">
+            <strong translate="common.updateIssueStatus">�씠�뒋 �긽�깭 蹂�寃�</strong>
+        </div>
+        <button aria-label="Close" class="close" type="button" ng-click="fn.cancel()">
+            <span aria-hidden="true"> &times;</span>
+        </button>
+    </div>
+
+    <div class="modal-body">
+        <form role="form" name="downIssueStatusModifyForm">
+            <div class="form-group">
+                <label for="downIssueStatusModifyForm1"><span translate="common.updatableStatus">蹂�寃� 媛��뒫�븳 �긽�깭</span> <code
+                        class="highlighter-rouge">*</code></label>
+                <select id="downIssueStatusModifyForm1"
+                        class="form-control"
+                        issue-status-auto-focus
+                        list="vm.issueStatusList"
+                        required
+                        ng-model="vm.form.issueStatusId">
+                    <option value="" translate="common.selectTarget">���긽 �꽑�깮</option>
+                    <option value="{{issueStatus.id}}" ng-repeat="issueStatus in vm.issueStatusList">
+                        {{issueStatus.name}}
+                    </option>
+                </select>
+                <div class="help-block form-text text-danger" ng-if="vm.issueStatusList.length < 1"
+                     translate="common.notEqualedStatus">
+                    �씠�뒋 �긽�깭媛� 媛숈쓣 寃쎌슦�뿉留� �쟾泥� 蹂�寃쎌씠 媛��뒫�빀�땲�떎.
+                </div>
+            </div>
+
+            <div class="form-group mgb5" ng-if="vm.form.issueStatusId !== undefined">
+                <label class="issue-label"> <span translate="common.assigneeTeam">�떞�떦遺��꽌</span> </label>
+                <js-autocomplete-multi data-input-name="departments"
+                                       selected-model="vm.form.departments"
+                                       search="vm.departmentName"
+                                       source="fn.getUserDepartmentList(vm.departmentName, vm.form.departments)"
+                                       input-disabled="false"
+                                       translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }"
+                                       extra-settings="{ displayProp : 'byName' , idProp : 'id', imageable : false, maxlength : 100, autoResize : true }"></js-autocomplete-multi>
+
+                <div class="select3-selection__choicediv mt-10">
+                            <span class="select3-selection__choice" ng-repeat="department in vm.form.departments">
+                                <span>{{department.byName}}</span> <!--�궗�슜�옄媛� �냽�빐 �엳�뒗 遺��꽌 �씠由� 異쒕젰-->
+                                <span class="select3-selection__choice__remove" ng-click="fn.removeDepartment($index)">횞</span>
+                            </span>
+                </div>
+            </div>
+
+            <div class="form-group">
+                <label for="downIssueStatusModifyForm2"><span translate="common.changeReason">蹂�寃� �궗�쑀</span> </label>
+                <input class="form-control input-sm"
+                       id="downIssueStatusModifyForm2"
+                       kr-input
+                       autocomplete="off"
+                       maxlength="300"
+                       ng-model="vm.form.comment"
+                       type="text">
+            </div>
+        </form>
+    </div>
+
+    <div class="modal-footer buttons-on-right">
+        <button type="button" class="btn btn-md btn-grey" ng-click="fn.cancel()"><span
+                translate="common.cancel">痍⑥냼</span></button>
+        <button type="button" class="btn btn-md btn-primary bold"
+                js-short-cut
+                js-short-cut-action="(fn.formCheck(downIssueStatusModifyForm.$invalid) || $root.spinner) ? null : fn.formSubmit()"
+                ng-disabled="fn.formCheck(downIssueStatusModifyForm.$invalid)"
+                ng-click="fn.formSubmit()"><span translate="common.save">���옣</span>
+        </button>
+    </div>
+</div>
diff --git a/src/main/webapp/views/issue/issueDetail.html b/src/main/webapp/views/issue/issueDetail.html
index 4be49d0..2d6b118 100644
--- a/src/main/webapp/views/issue/issueDetail.html
+++ b/src/main/webapp/views/issue/issueDetail.html
@@ -459,7 +459,7 @@
                         <span class="info_detail_font h3" translate="issue.relationIssue">�뿰愿� �씠�뒋</span>
                     </div>
                     <div class="col-md-1">
-                        <button class="btn btn-darkgrey offset-12" ng-click="fn.addRelationIssueTableConfig()" type="button"><span translate="issue.settingTableDisplay">�뀒�씠釉� �몴�떆 �꽕�젙</span></button>
+                        <button class="btn btn-darkgrey offset-10" ng-click="fn.addRelationIssueTableConfig()" type="button"><span translate="issue.settingTableDisplay">�뀒�씠釉� �몴�떆 �꽕�젙</span></button>
                     </div>
                 </div>
 
@@ -505,11 +505,15 @@
                 </div>
 
                 <div class="row mt-30">
-                    <div class="col-md-10">
+                    <div class="col-md-8">
                         <span class="info_detail_font h3" translate="issue.downIssue">�븯�쐞 �씠�뒋</span>
                     </div>
-                    <div class="col-md-1">
-                        <button class="btn btn-darkgrey offset-12"  ng-click="fn.addDownIssueTableConfig()" type="button"><span translate="issue.settingTableDisplay">�뀒�씠釉� �몴�떆 �꽕�젙</span></button>
+                    <div class="col-sm-2">
+                        <button type="button" class="btn btn-primary form-control input-sm offset-5" ng-click="fn.modifyDownIssueStatus()"
+                                translate="common.updateDownIssueAllStatus">�븯�쐞�씠�뒋 �긽�깭 �쟾泥� 蹂�寃�</button>
+                    </div>
+                    <div class="col-sm-1">
+                        <button class="btn btn-darkgrey offset-10"  ng-click="fn.addDownIssueTableConfig()" type="button"><span translate="issue.settingTableDisplay">�뀒�씠釉� �몴�떆 �꽕�젙</span></button>
                     </div>
                 </div>
 

--
Gitblit v1.8.0