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"> ×</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