From d348049a4a3c9fa32c3eb566c69df6d8adf652a8 Mon Sep 17 00:00:00 2001 From: wyu <kknd09321@nate.com> Date: 월, 29 11월 2021 01:57:02 +0900 Subject: [PATCH] 이슈 상세 유형별 수정 --- src/main/webapp/scripts/app/issue/issueDetail.controller.js | 219 ++++++++++++++++++++++++++++++++---------------------- 1 files changed, 131 insertions(+), 88 deletions(-) diff --git a/src/main/webapp/scripts/app/issue/issueDetail.controller.js b/src/main/webapp/scripts/app/issue/issueDetail.controller.js index 073e2ca..cb2300e 100644 --- a/src/main/webapp/scripts/app/issue/issueDetail.controller.js +++ b/src/main/webapp/scripts/app/issue/issueDetail.controller.js @@ -8,8 +8,9 @@ 'angular' ], function (app, angular) { - app.controller('issueDetailController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', '$q','SweetAlert', '$timeout', 'Issue', 'IssueComment', 'IssueRelation', 'AttachedFile', 'IssueStatus', 'IssueTableConfig', '$filter', - function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, $q, SweetAlert, $timeout, Issue, IssueComment, IssueRelation, AttachedFile, IssueStatus, IssueTableConfig, $filter) { + app.controller('issueDetailController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', '$q', + '$controller', '$injector', 'SweetAlert', '$timeout', 'Issue', 'IssueComment', 'IssueRelation', 'AttachedFile', 'Priority', 'Severity','IssueStatus', 'HostingField', 'IssueTableConfig', '$filter', + function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, $q, $controller, $injector, SweetAlert, $timeout, Issue, IssueComment, IssueRelation, AttachedFile, Priority, Severity, IssueStatus, HostingField, IssueTableConfig, $filter) { // IssueListController vm, fn 蹂��닔 �긽�냽. @@ -40,9 +41,11 @@ $scope.fn.addDownIssueTableConfig = addDownIssueTableConfig; // �븯�쐞 �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 $scope.fn.getRelTableConfigs = getRelTableConfigs; $scope.fn.getDownTableConfigs = getDownTableConfigs; + $scope.fn.containsPartner = containsPartner; + $scope.fn.getPartners = getPartners; // �씠�뒋 紐⑸줉 而⑦듃濡ㅻ윭 vm, fn �긽�냽 以� - $scope.vm.viewer = {}; + $scope.vm.viewer = []; $scope.vm.images = []; // 泥⑤��맂 �뙆�씪 以� �씠誘몄� �뙆�씪 $scope.vm.activeTab = "ALL"; // �솢�룞 �궡�뿭 �꺆 // �씠�뒋 �긽�깭 蹂�寃� �몴�떆 �뿬遺� @@ -111,6 +114,8 @@ // $rootScope.$broadcast("makeIssueSearch", issue); $scope.$parent.tableEvent.changeDetailView(issue.id); } + + angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector})); // �븯�쐞 �씠�뒋 �궘�젣 function removeDownIssue(id) { @@ -202,10 +207,12 @@ } // �뀒�씠釉붿쓽 �뿰愿� �씠�뒋 而щ읆�쓣 留뚮뱾�뼱以��떎. - function setRelTableColumn(issueTableConfig) { + function setRelTableColumn(Rel_issueTableConfig) { // �뿰愿� �씠�뒋 而щ읆 - switch(issueTableConfig.key) { + switch(Rel_issueTableConfig.key) { + + // �뿰愿� �씠�뒋 援щ텇 case "RELATION_ISSUE_TYPE" : $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("issue.relationIssueType") @@ -214,6 +221,7 @@ .setHSort(false) .setDRenderer("ISSUE_RELATION_TYPE")) break; + // �뿰愿� �씠�뒋 �젣紐� case "RELATION_ISSUE_TITLE" : $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("issue.relationIssueTitle") @@ -222,59 +230,53 @@ .setHSort(false) .setDRenderer("ISSUE_RELATION_MOVE")) break; - case "PRIORITY" : // �슦�꽑�닚�쐞 + case "PRIORITY" : // �뿰愿� �씠�뒋 �슦�꽑�닚�쐞 $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("common.priority") .setDName("priorityName") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Rel_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("COMMON_PRIORITY")); + .setDRenderer("REL_COMMON_PRIORITY")); break; - case "SEVERITY" : // 以묒슂�룄 + case "SEVERITY" : // �뿰愿� �씠�뒋 以묒슂�룄 $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("common.importance") .setDName("severityName") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Rel_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("COMMON_SEVERITY")); + .setDRenderer("REL_COMMON_SEVERITY")); break; - case "ISSUE_TYPE" : // �씠�뒋 ���엯 - $scope.vm.relTableConfigs.push($tableProvider.config() - .setHName("issue.issueType") - .setHWidth("bold " + issueTableConfig.width) - .setDAlign("text-center") - .setDName("issueTypeName")); - break; - case "ASSIGNEE_TEAM" : // �떞�떦遺��꽌 + case "ASSIGNEE_TEAM" : // �뿰愿� �씠�뒋 �떞�떦遺��꽌 $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("common.assigneeTeam") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Rel_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("ISSUE_DEPARTMENT")); + .setDRenderer("REL_ISSUE_DEPARTMENT")); break; - case "REGISTER" : // �벑濡앹옄 + + case "REGISTER" : // �뿰愿� �씠�뒋 �벑濡앹옄 $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("common.register") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Rel_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("REGISTER")); + .setDRenderer("REL_REGISTER")); break; - case "PERIOD" : // 湲곌컙 + case "PERIOD" : // �뿰愿� �씠�뒋 湲곌컙 $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("common.period") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Rel_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("ISSUE_DUE_DATE")); + .setDRenderer("REL_ISSUE_DUE_DATE")); break; - case "MODIFY_DATE" : // 理쒓렐 蹂�寃쎌씪 + case "MODIFY_DATE" : // �뿰愿� �씠�뒋 理쒓렐 蹂�寃쎌씪 $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("common.lastChangeDate") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Rel_issueTableConfig.width) .setDAlign("text-center") .setDName("modifyDate")); break; @@ -289,19 +291,19 @@ } // �궗�슜�옄 �젙�쓽 �븘�뱶 而щ읆 - if (issueTableConfig.key.indexOf("CUSTOM_FIELD_") !== -1) { + if (Rel_issueTableConfig.key.indexOf("CUSTOM_FIELD_") !== -1) { // 留뚯빟 �씠�뒋 �뀒�씠釉� 而щ읆紐낆씠 �몴�떆�릺吏� �븡�쑝硫� �씠履쎌씠 臾몄젣 for (var count in $scope.vm.customFields) { var customField = $scope.vm.customFields[count]; - if (customField.id === Number(issueTableConfig.key.substring(13))) { - $scope.vm.tableConfigs.push($tableProvider.config() + if (customField.id === Number(Rel_issueTableConfig.key.substring(13))) { + $scope.vm.relTableConfigs.push($tableProvider.config() .setHName(customField.name) .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Rel_issueTableConfig.width) .setDAlign("text-center") .setColumnHint(customField) - .setDRenderer("ISSUE_CUSTOM_FIELD_VALUE_VIEW")); + .setDRenderer("REL_ISSUE_CUSTOM_FIELD_VALUE_VIEW")); break; } } @@ -310,91 +312,85 @@ // �뀒�씠釉붿쓽 �븯�쐞 �씠�뒋 而щ읆�쓣 留뚮뱾�뼱以��떎. - function setDownTableColumn(issueTableConfig) { + function setDownTableColumn(Down_issueTableConfig) { // if (issueTableConfig == null) return; // �븯�쐞 �씠�뒋 而щ읆 - switch(issueTableConfig.key) { - case "DOWN_ISSUE_TITLE" : // �븯�쐞 �씠�뒋 �젣紐� + switch(Down_issueTableConfig.key) { + // �븯�쐞 �씠�뒋 �젣紐� + case "DOWN_ISSUE_TITLE" : $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("issue.downIssueTitle") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Down_issueTableConfig.width) .setDAlign("text-center") .setDRenderer("ISSUE_DOWN_MOVE")); break; - case "PRIORITY" : // �슦�꽑�닚�쐞 + case "PRIORITY" : // �븯�쐞 �씠�뒋 �슦�꽑�닚�쐞 $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("common.priority") .setDName("priorityName") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Down_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("COMMON_PRIORITY")); + .setDRenderer("DOWN_COMMON_PRIORITY")); break; case "SEVERITY" : // 以묒슂�룄 $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("common.importance") .setDName("severityName") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Down_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("COMMON_SEVERITY")); - break; - case "ISSUE_TYPE" : // �씠�뒋 ���엯 - $scope.vm.downTableConfigs.push($tableProvider.config() - .setHName("issue.issueType") - .setHWidth("bold " + issueTableConfig.width) - .setDAlign("text-center") - .setDName("issueTypeName")); + .setDRenderer("DOWN_COMMON_SEVERITY")); break; case "ASSIGNEE_TEAM" : // �떞�떦遺��꽌 $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("common.assigneeTeam") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Down_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("ISSUE_DEPARTMENT")); + .setDRenderer("DOWN_ISSUE_DEPARTMENT")); break; case "REGISTER" : // �벑濡앹옄 $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("common.register") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Down_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("REGISTER")); + .setDRenderer("DOWN_REGISTER")); break; case "PERIOD" : // 湲곌컙 $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("common.period") .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Down_issueTableConfig.width) .setDAlign("text-center") - .setDRenderer("ISSUE_DUE_DATE")); + .setDRenderer("DOWN_ISSUE_DUE_DATE")); break; case "MODIFY_DATE" : // 理쒓렐 蹂�寃쎌씪 $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("common.lastChangeDate") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Down_issueTableConfig.width) .setDAlign("text-center") .setDName("modifyDate")); break; } // �궗�슜�옄 �젙�쓽 �븘�뱶 而щ읆 - if (issueTableConfig.key.indexOf("CUSTOM_FIELD_") === -1) { + if (Down_issueTableConfig.key.indexOf("CUSTOM_FIELD_") !== -1) { // 留뚯빟 �씠�뒋 �뀒�씠釉� 而щ읆紐낆씠 �몴�떆�릺吏� �븡�쑝硫� �씠履쎌씠 臾몄젣 for (var count in $scope.vm.customFields) { var customField = $scope.vm.customFields[count]; - if (customField.id === Number(issueTableConfig.key.substring(13))) { + if (customField.id === Number(Down_issueTableConfig.key.substring(13))) { $scope.vm.downTableConfigs.push($tableProvider.config() .setHName(customField.name) .setDType("renderer") - .setHWidth("bold " + issueTableConfig.width) + .setHWidth("bold " + Down_issueTableConfig.width) .setDAlign("text-center") .setColumnHint(customField) - .setDRenderer("ISSUE_CUSTOM_FIELD_VALUE_VIEW")); + .setDRenderer("DOWN_ISSUE_CUSTOM_FIELD_VALUE_VIEW")); break; } } @@ -408,28 +404,31 @@ $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("issue.relationIssueType") .setDType("renderer") + .setDAlign("text-center") .setHWidth("width-30-p bold") .setHSort(false) .setDRenderer("ISSUE_RELATION_TYPE")) $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("issue.relationIssueTitle") .setDType("renderer") + .setDAlign("text-center") .setHWidth("width-60-p bold") .setHSort(false) .setDRenderer("ISSUE_RELATION_MOVE")) $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("issue.relationIssueDelete") .setDType("renderer") + .setDAlign("text-center") .setHWidth("width-20-p bold") .setDRenderer("ISSUE_RELATION_DELETE") .setHSort(false) .setDAlign("text-center")) - angular.forEach($scope.vm.relTableConfigs, function (issueTableConfig) { + angular.forEach($scope.vm.relTableConfigs, function (Rel_issueTableConfig) { // �몴�떆 ���긽�씤 而щ읆留� �솕硫댁뿉 洹몃젮以��떎. - if (issueTableConfig.display) { + if (Rel_issueTableConfig.display) { // �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎. - $scope.fn.setRelTableColumn(issueTableConfig); + $scope.fn.setRelTableColumn(Rel_issueTableConfig); } }); } @@ -440,22 +439,24 @@ $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("issue.downIssueTitle") .setDType("renderer") + .setDAlign("text-center") .setHWidth("width-60-p bold") .setHSort(false) .setDRenderer("ISSUE_DOWN_MOVE")) $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("issue.relationIssueDelete") .setDType("renderer") + .setDAlign("text-center") .setHWidth("width-20-p bold") .setDRenderer("ISSUE_DOWN_DELETE") .setHSort(false) .setDAlign("text-center")) - angular.forEach($scope.vm.downTableConfigs, function (issueTableConfig) { + angular.forEach($scope.vm.downTableConfigs, function (Down_issueTableConfig) { // �몴�떆 ���긽�씤 而щ읆留� �솕硫댁뿉 洹몃젮以��떎. - if (issueTableConfig.display) { + if (Down_issueTableConfig.display) { // �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎. - $scope.fn.setDownTableColumn(issueTableConfig); + $scope.fn.setDownTableColumn(Down_issueTableConfig); } }); } @@ -463,7 +464,8 @@ // �뿰愿� �씠�뒋 �긽�꽭 議고쉶 function getRelTableConfigs() { var content = { - issueId : $scope.vm.viewer.id + issueId : $scope.vm.viewer.id, + issueTypeId : $rootScope.getCurrentIssueTypeId() }; IssueTableConfig.relationDetail($resourceProvider.getContent( @@ -487,20 +489,22 @@ $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("issue.relationIssueType") .setDType("renderer") + .setDAlign("text-center") .setHWidth("width-30-p bold") .setHSort(false) .setDRenderer("ISSUE_RELATION_TYPE")) $scope.vm.relTableConfigs.push($tableProvider.config() .setHName("issue.relationIssueTitle") .setDType("renderer") + .setDAlign("text-center") .setHWidth("width-60-p bold") .setHSort(false) .setDRenderer("ISSUE_RELATION_MOVE")) - angular.forEach($scope.vm.issueRelTableConfigs, function (issueTableConfig) { + angular.forEach($scope.vm.issueRelTableConfigs, function (Rel_issueTableConfig) { // �몴�떆 ���긽�씤 而щ읆留� �솕硫댁뿉 洹몃젮以��떎. - if (issueTableConfig.display) { + if (Rel_issueTableConfig.display) { // �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎. - $scope.fn.setRelTableColumn(issueTableConfig); + $scope.fn.setRelTableColumn(Rel_issueTableConfig); } }); @@ -525,7 +529,8 @@ // �븯�쐞 �씠�뒋 �긽�꽭 議고쉶 function getDownTableConfigs() { var content = { - issueId : $scope.vm.viewer.id + issueId : $scope.vm.viewer.id, + issueTypeId : $rootScope.getCurrentIssueTypeId() }; IssueTableConfig.downDetail($resourceProvider.getContent( @@ -547,14 +552,15 @@ $scope.vm.downTableConfigs.push($tableProvider.config() .setHName("issue.downIssueTitle") .setDType("renderer") + .setDAlign("text-center") .setHWidth("width-60-p bold") .setHSort(false) .setDRenderer("ISSUE_DOWN_MOVE")) - angular.forEach($scope.vm.issueDownTableConfigs, function (issueTableConfig) { + angular.forEach($scope.vm.issueDownTableConfigs, function (Down_issueTableConfig) { // �몴�떆 ���긽�씤 而щ읆留� �솕硫댁뿉 洹몃젮以��떎. - if (issueTableConfig.display) { + if (Down_issueTableConfig.display) { // �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎. - $scope.fn.setDownTableColumn(issueTableConfig); + $scope.fn.setDownTableColumn(Down_issueTableConfig); } }); $scope.vm.downTableConfigs.push($tableProvider.config() @@ -651,9 +657,9 @@ $scope.vm.editor.issueStatus = false; $scope.vm.issueForm.issueStatusList = []; $scope.vm.issueForm.issueStatusId = ""; - if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') { + /*if ($scope.$root.$$phase !== '$apply' && $scope.$root.$$phase !== '$digest') { $scope.$apply(); - } + }*/ } // �씠�뒋 �긽�깭 蹂�寃� @@ -666,7 +672,8 @@ resolve : { parameter : function () { return { - issueIds : [$scope.vm.viewer.id] + issueIds : [$scope.vm.viewer.id], + projectId : $scope.vm.viewer.projectVo.id }; } } @@ -720,7 +727,14 @@ size : "lg", controller : 'issueAddRelationTableConfigController', backdrop : 'static', - resolve : {} + resolve : { + parameter : function () { + return { + issueTypeId : $scope.vm.viewer.issueTypeVo.id + + }; + } + } }); } @@ -731,7 +745,13 @@ size : "lg", controller : 'issueAddDownTableConfigController', backdrop : 'static', - resolve : {} + resolve : { + parameter : function () { + return { + issueTypeId : $scope.vm.viewer.issueTypeVo.id + }; + } + } }); } @@ -771,13 +791,14 @@ $scope.fn.getRelTableConfigs(); $scope.fn.getDownTableConfigs(); - Issue.detail($resourceProvider.getContent( + Issue.detail($resourceProvider.getContent( {id : $scope.vm.viewer.id, deep : "02"}, $resourceProvider.getPageContent(0, 1))).then(function (result) { if (result.data.message.status === "success") { if (angular.isDefined(result.data.data)) { $scope.vm.viewer = angular.copy(result.data.data); + // �씠�뒋 �씠誘몄� 誘몃━ 蹂닿린 留뚮뱾湲� $scope.fn.makePreviewImages(result.data.data.attachedFileVos); // �솢�룞 �씠�젰 留뚮뱾湲� @@ -790,7 +811,6 @@ $scope.fn.setFormByIssueTypeCustomFields(result.data.data.issueTypeCustomFieldVos); // �씠�뒋�뿉�꽌 �궗�슜�옄媛� �꽑�깮�븳 �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪쓣 �엯�젰 �뤌�뿉 �뀑�똿�븳�떎. $scope.fn.setUseValueByIssueTypeCustomFields(result.data.data.issueCustomFieldValueVos); - // �뿰愿� �씪媛� $scope.vm.issueName = ""; @@ -810,12 +830,6 @@ $scope.vm.form.issuesDown.push(issueDownVo.issue); }); - // wyu - angular.forEach(result.data.data.issueRelationVos, function (issueRelationColum){ - issueRelationColum.issueRelation = $scope.vm.issueRelation; - $scope.vm.form.issues.push(issueRelationColum.issueRelation); - }); - $scope.vm.viewer.issueRelationVos = result.data.data.issueRelationVos; $scope.vm.viewer.issueDownVos = result.data.data.issueDownVos; } @@ -826,8 +840,25 @@ }); } + // =================================================================================== + // �뾽泥�/ISP/�샇�뒪�똿 �씠由꾩씠 �룷�븿 �뿬遺� �솗�씤 + function containsPartner(name) { + var result = false; + // �씪�떒 viewer瑜� 留⑥쐞�뿉 �꽑�뼵�빐 {} �씠�젃寃� �꽑�뼵�빐 �몢�뿀�뒗�뜲 媛믩뱾�씠 �뼱�뼡�떇�쑝濡� 蹂��솚�씠 �맟�뒗吏��뒗 + // 紐곕씪�꽌 諛곗뿴濡� �꽆�뼱���꽌 珥덇린媛믪쓣 諛곗뿴濡� 諛붽씀�뿀�뜑�땲 �씠�뒋 �긽�꽭�뿉�꽌�뒗 蹂댁씤�떎 + // �씠�젣 �씠�뒋 異붽��뿉�꽌 媛믪씠 �뼱�뼸寃� �꽆�뼱�삤�뒗吏� �솗�씤�빐蹂댁옄! + if ($scope.vm.viewer.usePartnerVos != null) { + $scope.vm.viewer.usePartnerVos.forEach(function (partnerVo) { + if (name === partnerVo.name) { + result = true; + } + }); + } + return result; + + } // �씠�뒋 �씠誘몄� 誘몃━ 蹂닿린 留뚮뱾湲� function makePreviewImages(attachedFileVos) { // 誘몃━蹂닿린 �씠誘몄� 珥덇린�솕 @@ -1004,6 +1035,18 @@ }); } + function getPartners() { + + HostingField.getPartnerList($resourceProvider.getContent( + {}, + $resourceProvider.getPageContent(0, 1))).then(function (result) { + if (result.data.message.status === "success") { + $scope.vm.partnerVos = result.data.data.usePartnerVos; + } + }); + + } + // �듅�젙 �궗�슜�옄�뿉寃� �씠�뒋瑜� 硫붿씪濡� 諛쒖넚 function sendMail(issueId, projectId) { $uibModal.open({ -- Gitblit v1.8.0