From db5bbe29f9f724dcafd87b33cc1efd150ed0f489 Mon Sep 17 00:00:00 2001 From: jhjang <jhjang@maprex.co.kr> Date: 월, 25 10월 2021 14:17:50 +0900 Subject: [PATCH] 하위/연관 일감 검색 view추가 --- src/main/webapp/scripts/app/issue/issueAddTreeTableConfig.controller.js | 186 ++++++ src/main/webapp/views/issue/issueAddTreeTableConfig.html | 95 +++ src/main/webapp/scripts/app/issue/issue.js | 4 src/main/webapp/views/issue/issueListTree.html | 410 ++++++++++++++ src/main/webapp/views/issue/issueList.html | 7 src/main/webapp/i18n/ko/global.json | 1 src/main/webapp/assets/styles/main.css | 36 + src/main/webapp/scripts/app/issue/issueListTree.controller.js | 880 +++++++++++++++++++++++++++++++ src/main/webapp/scripts/main.js | 2 9 files changed, 1,619 insertions(+), 2 deletions(-) diff --git a/src/main/webapp/assets/styles/main.css b/src/main/webapp/assets/styles/main.css index c336ec9..5db069e 100644 --- a/src/main/webapp/assets/styles/main.css +++ b/src/main/webapp/assets/styles/main.css @@ -30174,3 +30174,39 @@ } /* 媛꾪듃李⑦듃 end */ + +/* �듃由ш뎄議� �엫�떆 */ + +.tree-container { + background-color: #f1f0f0; + border: 1px solid #c2c2c2; + padding: 20px; +} + + +.tree-body { +} + +.tree{ + margin-top: 5px; +} + +.tree{ + list-style: none; /* 湲곕낯 由ъ뒪�듃 �뒪���씪 �젣嫄� */ + padding-left: 0px; +} + +.tree ul { + list-style: none; /* 湲곕낯 由ъ뒪�듃 �뒪���씪 �젣嫄� */ +} + +.tree li { + padding-top: 5px; + margin-bottom: 5px; + list-style-position: inside; + padding-left: 10px; +} + +.tree li:before{ + content: '�뵒 ' +} diff --git a/src/main/webapp/i18n/ko/global.json b/src/main/webapp/i18n/ko/global.json index fbf9907..f5c23a1 100644 --- a/src/main/webapp/i18n/ko/global.json +++ b/src/main/webapp/i18n/ko/global.json @@ -275,6 +275,7 @@ "relationIssueType6" : "�떎�쓬 �씪媛먯쓣 �슦�꽑 吏꾪뻾", "updateIssueUser" : "�씪媛� �떞�떦�옄 蹂�寃�", "normalList" : "�씪媛� 紐⑸줉", + "treeList" : "�븯�쐞/�뿰愿� �씪媛� 寃��깋", "timeLine" : "���엫 �씪�씤" }, "project": { diff --git a/src/main/webapp/scripts/app/issue/issue.js b/src/main/webapp/scripts/app/issue/issue.js index 7725198..806e9cd 100644 --- a/src/main/webapp/scripts/app/issue/issue.js +++ b/src/main/webapp/scripts/app/issue/issue.js @@ -33,11 +33,11 @@ loadController: ["$q", function ($q) { var deferred = $q.defer(); require([ - 'issueListTimelineController', 'issueManagerController', 'issueListController', 'issueAddController', 'issueModifyController', 'issueDetailController', 'issueImportExcelController', + 'issueListTreeController','issueListTimelineController', 'issueManagerController', 'issueListController', 'issueAddController', 'issueModifyController', 'issueDetailController', 'issueImportExcelController', 'chartLoader', 'jsTable', 'tableColumnGenerator', 'modalFormAutoScroll', 'summerNote', 'summerNote-ko-KR', 'fullScroll', 'workflowService', 'priorityService', 'issueSearchService', 'issueTableConfigService', 'inputRegex', 'severityService', 'issueTypeService', 'issueTypeCustomFieldService', 'issueService', 'issueStatusService', 'issueUserService', 'issueModifyUserController', 'customFieldService', 'issueSearchFieldKeyViewElement', 'issueSearchCustomFieldViewElement', 'tableUserImage', 'fullScroll', 'issueCommentService', 'detectIssueEditor', 'formSubmit', 'issueModifyStatusController', 'jsShortCut', - 'issueAddTableConfigController', 'domAppend', 'issueDetailImagePreview', 'issueSendMailController', 'htmlDiff', 'issueVersionViewController', 'issueVersionService', + 'issueAddTableConfigController','issueAddTreeTableConfigController', 'domAppend', 'issueDetailImagePreview', 'issueSendMailController', 'htmlDiff', 'issueVersionViewController', 'issueVersionService', 'jsHtmlDiff', 'issueReservationController', 'issueReservationService', 'issueVersionService', 'issueStatusAutoFocus', 'issueRelationService' ], function () { deferred.resolve(); diff --git a/src/main/webapp/scripts/app/issue/issueAddTreeTableConfig.controller.js b/src/main/webapp/scripts/app/issue/issueAddTreeTableConfig.controller.js new file mode 100644 index 0000000..65614d4 --- /dev/null +++ b/src/main/webapp/scripts/app/issue/issueAddTreeTableConfig.controller.js @@ -0,0 +1,186 @@ +/** + * Created by wisestone on 2019-02-07. + */ +'use strict'; + +define([ + 'app', + 'angular' + ], + function (app, angular) { + app.controller('issueAddTreeTableConfigController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$uibModalInstance', 'SweetAlert', '$timeout', 'IssueTableConfig', 'CustomField', '$q', '$filter', + function ($scope, $rootScope, $log, $resourceProvider, $uibModalInstance, SweetAlert, $timeout, IssueTableConfig, CustomField, $q, $filter) { + + // �븿�닔 紐⑥쓬 + $scope.fn = { + cancel : cancel, // �뙘�뾽 李� �떕湲� + formSubmit : formSubmit, // �뤌 �쟾�넚 + formCheck : formCheck, // �뤌 泥댄겕 + getCustomFields : getCustomFields, // �궗�슜�옄 �젙�쓽 �븘�뱶 紐⑸줉�쓣 媛��졇�삩�떎. + getIssueTableConfigs : getIssueTableConfigs // �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 �젙蹂대�� 媛��졇�삩�떎. + }; + + // 蹂��닔 紐⑥쓬 + $scope.vm = { + issueTableConfigs : [{ + name : $filter("translate")("common.priority"), // �슦�꽑�닚�쐞 + key : "PRIORITY", + width : "width-100-p", + position : 1, + display : true + }, { + name : $filter("translate")("common.importance"), // 以묒슂�룄 + key : "SEVERITY", + width : "width-80-p", + position : 2, + display : true + }, { + name : $filter("translate")("issue.issueType"), // �씠�뒋 ���엯 + key : "ISSUE_TYPE", + width : "width-140-p", + position : 3, + display : true + }, { + name : $filter("translate")("common.assignee"), // �떞�떦�옄 + key : "ASSIGNEE", + width : "width-100-p", + position : 4, + display : true + }, { + name : $filter("translate")("common.register"), // �벑濡앹옄 + key : "REGISTER", + width : "width-100-p", + position : 5, + display : false + }, { + name : $filter("translate")("common.period"), // 湲곌컙 + key : "PERIOD", + width : "width-140-p", + position : 6, + display : false + }, { + name : $filter("translate")("common.lastChangeDate"), // 理쒓렐 蹂�寃쎌씪 + key : "MODIFY_DATE", + width : "width-100-p", + position : 7, + display : false + }] + }; + + + // �뤌 �쟾�넚 + function formCheck(formInvalid) { + if (formInvalid) { + return true; + } + + return false; + } + + // �뤌 �쟾�넚 + function formSubmit() { + $rootScope.spinner = true; + + var content = { + issueTableConfigs : JSON.stringify($scope.vm.issueTableConfigs) + }; + + IssueTableConfig.add($resourceProvider.getContent(content, + $resourceProvider.getPageContent(0, 0))).then(function (result) { + + if (result.data.message.status === "success") { + SweetAlert.success($filter("translate")("issue.completedSavingIssueTable"), $filter("translate")("issue.saveIssueTableSettingsInformation")); // "�씠�뒋 �뀒�씠釉� �꽕�젙 ���옣 �셿猷�", "�씠�뒋 �뀒�씠釉� �꽕�젙 �젙蹂닿� ���옣�릺�뿀�뒿�땲�떎." + // 蹂�寃쎈맂 �씠�뒋 �뀒�씠釉� �젙蹂대�� �씠�뒋 紐⑸줉 �뀒�씠釉붿뿉 媛깆떊�븳�떎. + $rootScope.$broadcast("getIssueTableConfigs", {}); + } + else { + SweetAlert.error($filter("translate")("issue.failedToSaveIssueTableSetting"), result.data.message.message); // �씠�뒋 �뀒�씠釉� �꽕�젙 ���옣 �떎�뙣 + } + + $rootScope.spinner = false; + }); + } + + + // �뙘�뾽 李� �떕湲� + function cancel() { + $rootScope.$broadcast("closeLayer"); // �뙘�뾽�씠 �뿴由ш퀬 �굹�꽌 js-multi, js-single �벑�뿉�꽌 body �씠踰ㅽ듃媛� �궇�븘媛��뒗 �쁽�긽 �닔�젙 + $uibModalInstance.dismiss('cancel'); + $(document).unbind("keydown"); // �떒異뺥궎 �씠踰ㅽ듃 �젣嫄� + } + + // �궗�슜�옄 �젙�쓽 �븘�뱶 紐⑸줉�쓣 媛��졇�삩�떎. + function getCustomFields() { + var deferred = $q.defer(); + + CustomField.find($resourceProvider.getContent({}, + $resourceProvider.getPageContent(0, 1000))).then(function (result) { + if (result.data.message.status !== "success") { + SweetAlert.error($filter("translate")("issue.failedToUserDefinedFieldListLookup"), result.data.message.message); // �궗�슜�옄 �젙�쓽 �븘�뱶 紐⑸줉 議고쉶 �떎�뙣 + } + + deferred.resolve(result.data.data); + }); + + return deferred.promise; + } + + // �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 �젙蹂대�� 媛��졇�삩�떎. + function getIssueTableConfigs() { + var deferred = $q.defer(); + + IssueTableConfig.detail($resourceProvider.getContent({}, + $resourceProvider.getPageContent(0, 1000))).then(function (result) { + if (result.data.message.status !== "success") { + SweetAlert.error($filter("translate")("issue.failedToIssueTableColumnLookup"), result.data.message.message); // �씠�뒋 �뀒�씠釉� 而щ읆 議고쉶 �떎�뙣 + } + + deferred.resolve(result.data.data); + }); + + return deferred.promise; + } + + // �궗�슜�옄 �젙�쓽 �븘�뱶瑜� 議고쉶�븳 �썑 �몴�떆�븷 �씠�뒋 �뀒�씠釉� 而щ읆�쓣 以�鍮꾪븳�떎. + $scope.fn.getCustomFields().then(function (result) { + var count = 7; + angular.forEach(result, function (customField) { + $scope.vm.issueTableConfigs.push({ + name : customField.name, + key : "CUSTOM_FIELD_" + customField.id, + width : "width-100-p", + display : false, + position : count + }); + + count++; + }); + + // �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 �젙蹂대�� 媛��졇�삩�떎. + $scope.fn.getIssueTableConfigs().then(function (issueTableConfigs) { + if ($rootScope.isDefined(issueTableConfigs)) { + $rootScope.spinner = true; + + var saveTableConfigs = JSON.parse(issueTableConfigs); + + angular.forEach(saveTableConfigs, function (saveTableConfig) { + + for (var count in $scope.vm.issueTableConfigs) { + var issueTableConfig = $scope.vm.issueTableConfigs[count]; + + if (issueTableConfig.key === saveTableConfig.key) { + issueTableConfig.display = saveTableConfig.display; + issueTableConfig.width = saveTableConfig.width; + issueTableConfig.position = saveTableConfig.position; + break; + } + } + }); + + $rootScope.spinner = false; + } + }); + }); + + }]); + }); diff --git a/src/main/webapp/scripts/app/issue/issueListTree.controller.js b/src/main/webapp/scripts/app/issue/issueListTree.controller.js new file mode 100644 index 0000000..9e94ec7 --- /dev/null +++ b/src/main/webapp/scripts/app/issue/issueListTree.controller.js @@ -0,0 +1,880 @@ +/** + * Created by wisestone on 2017-12-21. + */ +'use strict'; + +define([ + 'app', + 'angular' + ], + function (app, angular) { + app.controller('issueListTreeController', ['$scope', '$rootScope', '$log', '$resourceProvider', '$tableProvider', '$state', '$uibModal', '$q', + '$controller', '$injector', 'SweetAlert', 'Issue', 'IssueType', 'Priority', 'Severity', 'IssueStatus', 'CustomField', 'IssueSearch', 'IssueTableConfig', '$timeout', '$filter', + function ($scope, $rootScope, $log, $resourceProvider, $tableProvider, $state, $uibModal, $q, $controller, $injector, SweetAlert, Issue, IssueType, Priority, Severity, IssueStatus, CustomField, + IssueSearch, IssueTableConfig, $timeout, $filter) { + + // �븿�닔 + $scope.fn = { + initSearch : initSearch, // 寃��깋 珥덇린�솕 + getPageList : getPageList, // 紐⑸줉 議고쉶 + changePageRowCount : changePageRowCount, // �럹�씠吏� 蹂�寃� + makeTableConfigs : makeTableConfigs, // �뀒�씠釉� �꽕�젙 + setTableColumn : setTableColumn, // �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎. + add : add, // �씠�뒋 �깮�꽦 + modify : modify, // �씠�뒋 �닔�젙 + modifyMultiIssueStatus : modifyMultiIssueStatus, // �씠�뒋 �떎以� �긽�깭 蹂�寃� + removes : removes, // �씠�뒋 �궘�젣 + addIssueTableConfig : addIssueTableConfig, // �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 + listView : listView, // 紐⑸줉 �솕硫댁쑝濡� 蹂�寃� + importExcel : importExcel, // �뿊�� import 湲곕뒫 �뙘�뾽 �샇異� + getIssueTypes : getIssueTypes, // �씠�뒋 �쑀�삎 紐⑸줉�쓣 媛��졇�삩�떎. + getPriorities : getPriorities, // �슦�꽑�닚�쐞 紐⑸줉�쓣 媛��졇�삩�떎. + getSeverities : getSeverities, // 以묒슂�룄 紐⑸줉�쓣 媛��졇�삩�떎. + getIssueStatuses : getIssueStatuses, // �씠�뒋 �긽�깭 紐⑸줉�쓣 媛��졇�삩�떎. + getCustomFields : getCustomFields, // �궗�슜�옄 �젙�쓽 �븘�뱶 紐⑸줉�쓣 媛��졇�삩�떎. + makeVmSearchObject : makeVmSearchObject, // 寃��깋 議곌굔�쓣 湲곗뼲�븳�떎. + getVmSearchObject : getVmSearchObject, // ���옣�븳 寃��깋 議곌굔�쓣 媛��졇���꽌 vm �뿉 �뀑�똿�븳�떎. + makeSearchConditions : makeSearchConditions, // 寃��깋 議곌굔�쓣 留뚮뱺�떎. + getIssueTableConfigs : getIssueTableConfigs, // �궗�슜�옄 �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 媛믪쓣 媛��졇���꽌 �쟻�슜�븳�떎. + startExecute : startExecute // 而⑦듃濡� 濡쒕뵫�떆 泥섏쓬�쑝濡� �떆�옉�릺�뒗 �븿�닔 + }; + + // 蹂��닔 + $scope.vm = { + search : { + title : "", // �젣紐� + description : "", // �궡�슜 + combinationIssueNumber : "", // �씠�뒋 踰덊샇 + projectType : "BTS_PROJECT", // �봽濡쒖젥�듃 �쑀�삎 + registerDateRange : "", // �벑濡앹씪 湲곌컙 寃��깋 + startDateRange : "", // �떆�옉�씪 湲곌컙 寃��깋 + completeDateRange : "", // �셿猷뚯씪 湲곌컙 寃��깋 + severityIds : [], // 以묒슂�룄 寃��깋 + priorityIds : [], // �슦�꽑�닚�쐞 寃��깋 + issueStatusIds : [], // �씠�뒋 �긽�깭 寃��깋 + issueTypeIds : [] // �씠�뒋 �쑀�삎 寃��깋 + }, + searchView : false, // �긽�꽭 寃��깋 議곌굔 �몴�떆 �뿬遺� + detailView : false, // �긽�꽭 紐⑤뱶 蹂�寃� 媛� + page : { + selectedPage : 0, + selectedPageRowCount : String(10) + }, + tableConfigs : [], // �뀒�씠釉� �뀑�똿 �젙蹂� + responseData : { + data : [] + }, + projectName : "", // �봽濡쒖젥�듃 寃��깋 + userName : "", // �떞�떦�옄 寃��깋 + registerName : "", // �벑濡앹옄 寃��깋 + projects : [], // �봽濡쒖젥�듃 + issueStatuses : [], // �씠�뒋 �긽�깭 + issueTypes : [], // �씠�뒋 �쑀�삎 + priorities : [], // �슦�꽑 �닚�쐞 + severities : [], // 以묒슂�룄 + users : [], // �떞�떦�옄 + registers : [], // �벑濡앹옄 + customFields : [], // �궗�슜�옄 �젙�쓽 �븘�뱶 + issueTableConfigs : [] // �씠�뒋 �뀒�씠釉� �꽕�젙 + }; + + // �뀒�씠釉� �씠踰ㅽ듃 + $scope.tableEvent = { + changeDetailView : changeDetailView // �긽�꽭 �솕硫댁쑝濡� 蹂�寃� + }; + + angular.extend(this, $controller('autoCompleteController', {$scope : $scope, $injector : $injector})); + + // �씠�뒋 紐⑸줉 �뜲�씠�꽣 媛깆떊 + $scope.$on("getIssueList", function () { + $scope.fn.getPageList($scope.vm.page.selectedPage - 1); + }); + + // �씠�뒋 �뀒�씠釉� �꽕�젙 �젙蹂� 媛깆떊 + $scope.$on("getIssueTableConfigs", function () { + $scope.fn.startExecute(); + }); + + // 寃��깋 議곌굔�쓣 湲곗뼲�븳�떎. - �쟻�슜 蹂대쪟 + function makeVmSearchObject() { + var content = { + conditions : JSON.stringify({ + search : $scope.vm.search, + projects : $scope.vm.projects, + users : $scope.vm.users, + registers : $scope.vm.registers + }) + }; + + IssueSearch.add($resourceProvider.getContent(content, + $resourceProvider.getPageContent(0, 0))).then(function (result) { + + if (result.data.message.status === "success") { + + } + else { + SweetAlert.error($filter("translate")("issue.failedToSaveFieldConditions"), result.data.message.message); // 寃��깋 �븘�뱶 議곌굔 ���옣 �떎�뙣 + } + }); + } + + // �꽌踰꾩뿉 ���옣�븳 �씠�뒋 寃��깋 議곌굔�쓣 媛��졇�삩�떎. + function getVmSearchObject() { + IssueSearch.detail($resourceProvider.getContent({}, $resourceProvider.getPageContent(0, 0))).then(function (result) { + + if (result.data.message.status === "success") { + if ($rootScope.isDefined(result.data.data)) { + var issueListSearchObject = JSON.parse(result.data.data); + // �씠�뒋 踰덊샇留� �쟻�슜�븳�떎. - �궘�젣�떆 泥섎━諛⑸쾿�븣臾몄뿉 �떎瑜� �냽�꽦�� �쟻�슜 蹂대쪟 + $scope.vm.search = issueListSearchObject.search; + /*$scope.vm.users = issueListSearchObject.users; + $scope.vm.projects = issueListSearchObject.projects; + $scope.vm.registers = issueListSearchObject.registers;*/ + + $scope.fn.getPageList(0, true); + } else { + $scope.fn.getPageList(0); + } + } + else { + SweetAlert.error($filter("translate")("issue.failedToGetSearchFieldCondition"), result.data.message.message); // 寃��깋 �븘�뱶 議곌굔 媛��졇�삤湲� �떎�뙣 + } + }); + } + + // �긽�꽭 �솕硫댁쑝濡� 蹂�寃쏀븳�떎. + function changeDetailView(id) { + $scope.vm.tableConfigs = []; + $scope.vm.detailView = true; + + $scope.fn.makeTableConfigs(); + + // chrome �뿉�꽌 留덉슦�뒪 �뼚�궃嫄� 媛먯� 紐삵빐�꽌 �씠踰ㅽ듃 異붽�. + $(".full-height-scroll").trigger("mouseleave"); + // �뀒�씠釉붿쓣 �떎�떆 洹몃┫�닔 �엳寃� �뜲�씠�꽣 諛붿씤�뵫�쓣 �떎�떆�븳�떎. + var temp = angular.copy($scope.vm.responseData.data); + $scope.vm.responseData.data = angular.copy(temp); + // �쁽�옱 �긽�꽭�솕硫댁쑝濡� 蹂대젮怨좏븯�뒗 �씠�뒋 id瑜� 湲곗뼲�븳�떎. + $rootScope.currentDetailIssueId = id; + // �씠�뒋 �긽�꽭 �솕硫� �슂泥� + $rootScope.$broadcast("getIssueDetail", { + id : id + }); + } + + // 紐⑸줉 �솕硫댁쑝濡� 蹂�寃쏀븳�떎. + function listView() { + $scope.vm.detailView = false; + // �씠�뒋 �뀒�씠釉� �꽕�젙 + $scope.fn.makeTableConfigs(); + var temp = angular.copy($scope.vm.responseData.data); + $scope.vm.responseData.data = angular.copy(temp); + // 留덉�留됱쑝濡� 蹂닿퀬�엳�뜕 �씠�뒋 id瑜� 珥덇린�솕�븳�떎. + $rootScope.currentDetailIssueId = null; + } + + // �씠�뒋 �뀒�씠釉� �꽕�젙 + function makeTableConfigs() { + $scope.vm.tableConfigs = []; + + $scope.vm.tableConfigs.push($tableProvider.config() + .setDType("checkbox") + .setHWidth("width-20-p") + .setDAlign("text-center")); + + // �긽�꽭�삎 �씪�븣�븣 + if ($scope.vm.detailView) { + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("issue.issueTitle") + .setDName("title") + .setDType("renderer") + .setHWidth("width-100 bold") + .setDRenderer("ISSUE_DETAIL_FLOATING")); + } + else { + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("issue.issueTitle") + .setDName("title") + .setDType("renderer") + .setHWidth("bold") + .setDRenderer("ISSUE_DETAIL_FLOATING")); + + angular.forEach($scope.vm.issueTableConfigs, function (issueTableConfig) { + // �몴�떆 ���긽�씤 而щ읆留� �솕硫댁뿉 洹몃젮以��떎. + if (issueTableConfig.display) { + // �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎. + $scope.fn.setTableColumn(issueTableConfig); + } + }); + } + } + + // �뀒�씠釉붿쓽 而щ읆�쓣 留뚮뱾�뼱以��떎. + function setTableColumn(issueTableConfig) { + + // �씪諛� 而щ읆 + switch(issueTableConfig.key) { + case "PRIORITY" : // �슦�꽑�닚�쐞 + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("common.priority") + .setDName("priorityName") + .setDType("renderer") + .setHWidth("bold " + issueTableConfig.width) + .setDAlign("text-center") + .setDRenderer("COMMON_PRIORITY")); + break; + case "SEVERITY" : // 以묒슂�룄 + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("common.importance") + .setDName("severityName") + .setDType("renderer") + .setHWidth("bold " + issueTableConfig.width) + .setDAlign("text-center") + .setDRenderer("COMMON_SEVERITY")); + break; + case "ISSUE_TYPE" : // �씠�뒋 ���엯 + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("issue.issueType") + .setHWidth("bold " + issueTableConfig.width) + .setDAlign("text-center") + .setDName("issueTypeName")); + break; + case "ASSIGNEE" : // �떞�떦�옄 + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("common.assignee") + .setDType("renderer") + .setHWidth("bold " + issueTableConfig.width) + .setDAlign("text-center") + .setDRenderer("ISSUE_USER")); + break; + case "REGISTER" : // �벑濡앹옄 + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("common.register") + .setDType("renderer") + .setHWidth("bold " + issueTableConfig.width) + .setDAlign("text-center") + .setDRenderer("REGISTER")); + break; + case "PERIOD" : // 湲곌컙 + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("common.period") + .setDType("renderer") + .setHWidth("bold " + issueTableConfig.width) + .setDAlign("text-center") + .setDRenderer("ISSUE_DUE_DATE")); + break; + case "MODIFY_DATE" : // 理쒓렐 蹂�寃쎌씪 + $scope.vm.tableConfigs.push($tableProvider.config() + .setHName("common.lastChangeDate") + .setHWidth("bold " + issueTableConfig.width) + .setDAlign("text-center") + .setDName("modifyDate")); + break; + } + + // �궗�슜�옄 �젙�쓽 �븘�뱶 而щ읆 + if (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() + .setHName(customField.name) + .setDType("renderer") + .setHWidth("bold " + issueTableConfig.width) + .setDAlign("text-center") + .setColumnHint(customField) + .setDRenderer("ISSUE_CUSTOM_FIELD_VALUE_VIEW")); + break; + } + } + } + } + + // 寃��깋 �븘�뱶 珥덇린�솕 + function initSearch() { + $state.go($state.current, {}, {reload : true}); + /*IssueSearch.remove($resourceProvider.getContent({screen : "ISSUE_LIST"}, + $resourceProvider.getPageContent(0, 0))).then(function (result) { + + if (result.data.message.status == "success") { + $state.go($state.current, {}, {reload : true}); + } + else { + SweetAlert.swal("寃��깋 �븘�뱶 珥덇린�솕 �떎�뙣", result.data.message.message, "error"); + } + });*/ + } + + // �씠�뒋 寃��깋 議곌굔�쓣 留뚮뱺�떎. + function makeSearchConditions() { + var conditions = { + title : $scope.vm.search.title, + description : $scope.vm.search.description, + projectType : $scope.vm.search.projectType, + combinationIssueNumber : $scope.vm.search.combinationIssueNumber.trim(), + beginRegisterDate : "", + endRegisterDate : "", + beginStartDate : "", + endStartDate : "", + beginCompleteDate : "", + endCompleteDate : "", + projectIds : (function () { + var projectIds = []; + + angular.forEach($scope.vm.projects, function (project) { + projectIds.push(project.id); + }); + + return projectIds; + })(), + issueStatusIds : (function () { + var issueStatusIds = []; + + angular.forEach($scope.vm.search.issueStatusIds, function (issueStatusId) { + issueStatusIds.push(issueStatusId.fieldKey); + }); + + return issueStatusIds; + })(), + issueTypeIds : (function () { + var issueTypeIds = []; + + angular.forEach($scope.vm.search.issueTypeIds, function (issueTypeId) { + issueTypeIds.push(issueTypeId.fieldKey); + }); + + return issueTypeIds; + })(), + priorityIds : (function () { + var priorityIds = []; + + angular.forEach($scope.vm.search.priorityIds, function (priorityId) { + priorityIds.push(priorityId.fieldKey); + }); + + return priorityIds; + })(), + severityIds : (function () { + var severityIds = []; + + angular.forEach($scope.vm.search.severityIds, function (severityId) { + severityIds.push(severityId.fieldKey); + }); + + return severityIds; + })(), + userIds : (function () { + var userIds = []; + + angular.forEach($scope.vm.users, function (user) { + userIds.push(user.id); + }); + + return userIds; + })(), + registerIds : (function () { + var registerIds = []; + + angular.forEach($scope.vm.registers, function (register) { + registerIds.push(register.id); + }); + + return registerIds; + })(), + issueCustomFields : (function () { + var issueCustomFields = []; + + angular.forEach($scope.vm.customFields, function (customField) { + var useValues = []; + + if (angular.isArray(customField.useValues)) { + angular.forEach(customField.useValues, function (useValue) { + useValues.push(useValue.value); + }); + } + else { + useValues.push(customField.useValues); + } + + // useValues 瑜� 諛곗뿴濡� 蹂��솚�븳�떎. + var temp = angular.copy(customField); + temp.useValues = useValues; + issueCustomFields.push(temp); + }); + + return issueCustomFields; + })() + }; + + // �벑濡앹씪 + if ($rootScope.isDefined($scope.vm.search.registerDateRange)) { + var registerDateRange = $scope.vm.search.registerDateRange.split("~"); + conditions.beginRegisterDate = registerDateRange[0].trim(); + conditions.endRegisterDate = registerDateRange[1].trim(); + } + + // �떆�옉�씪 + if ($rootScope.isDefined($scope.vm.search.startDateRange)) { + var startDateRange = $scope.vm.search.startDateRange.split("~"); + conditions.beginStartDate = startDateRange[0].trim(); + conditions.endStartDate = startDateRange[1].trim(); + } + // 醫낅즺�씪 + if ($rootScope.isDefined($scope.vm.search.completeDateRange)) { + var completeDateRange = $scope.vm.search.completeDateRange.split("~"); + conditions.beginCompleteDate = completeDateRange[0].trim(); + conditions.endCompleteDate = completeDateRange[1].trim(); + } + + return conditions; + } + + // �씠�뒋 紐⑸줉�쓣 議고쉶�븳�떎. + function getPageList(selectedPage, detail = false) { + if (selectedPage < 0) { + selectedPage = 0; + } + // �쁽�옱 �럹�씠吏� �젙蹂� + var currentPage = 0; + + // 荑좏궎�뿉 �꽑�깮�븳 �럹�씠吏� �젙蹂닿� �뾾�쑝硫� 湲곕낯 �럹�씠吏� �젙蹂� 0 �쓣 ���옣 + if (angular.isUndefined(selectedPage) || selectedPage === "") { + currentPage = $scope.vm.page.selectedPage; + } + else { + currentPage = selectedPage; + } + + + // 寃��깋 議곌굔�쓣 ���옣�븳�떎. + //$scope.fn.makeVmSearchObject(); + + + // �쁽�옱 �꽑�깮�맂 �봽濡쒖젥�듃瑜� 寃��깋 湲곕낯�쑝濡� 異붽� + if ($rootScope.workProject != null && $rootScope.workProject.id > -1) { + var find = findProjectSearch($rootScope.workProject.id); + if (!find) { + $scope.vm.projects.push($rootScope.workProject); + } + } + + // �씠�뒋 寃��깋 議곌굔�쓣 留뚮뱺�떎. + var conditions = $scope.fn.makeSearchConditions(); + + Issue.find($resourceProvider.getContent(conditions, + $resourceProvider.getPageContent(currentPage, $scope.vm.page.selectedPageRowCount))).then(function (result) { + + if (result.data.message.status === "success") { + $scope.vm.page.selectedPage = currentPage + 1; + $scope.vm.responseData = result.data; + if (detail) { + changeDetailView(result.data.data[0].id); + } + } + else { + SweetAlert.error($filter("translate")("issue.failedIssueLookup"), result.data.message.message); // �씠�뒋 議고쉶 �떎�뙣 + } + }); + } + + // 寃��깋議곌굔�뿉�꽌 �빐�떦 �봽濡쒖젥�듃 李얘린 + function findProjectSearch(projectId) { + var projects = $scope.vm.projects; + var find = false; + + for (let i = 0; i < projects.length; i++) { + if (projects[i].id == projectId) { + find = true; + break; + } + } + return find; + } + + // �럹�씠吏� 蹂�寃� + function changePageRowCount() { + $scope.fn.getPageList(0); + } + + // �뿊�� import �뙘�뾽 �샇異� + function importExcel() { + $uibModal.open({ + templateUrl : 'views/issue/issueExcelImport.html', + size : "lg", + controller : 'issueImportExcelController', + backdrop : 'static' + }); + } + + // �씠�뒋 �깮�꽦 �뙘�뾽 �샇異� + function add() { + $uibModal.open({ + templateUrl : 'views/issue/issueAdd.html', + size : "lg", + controller : 'issueAddController', + backdrop : 'static' + }); + } + + // �씠�뒋 �떎以� �긽�깭 蹂�寃� + function modifyMultiIssueStatus() { + var issueIds = []; + + angular.forEach($scope.vm.responseData.data, function (data) { + if (data.checked) { + issueIds.push(data.id); + } + }); + + if (issueIds.length < 1) { + SweetAlert.warning($filter("translate")("issue.selectionCheck"), $filter("translate")("issue.selectIssueToChangeStatus")); // �꽑�깮 ���긽 �솗�씤, �긽�깭 蹂�寃쏀븷 �씠�뒋瑜� �꽑�깮�븯�꽭�슂. + return; + } + + $uibModal.open({ + templateUrl : 'views/issue/issueModifyStatus.html', + size : "md", + controller : 'issueModifyStatusController', + backdrop : 'static', + resolve : { + parameter : function () { + return { + issueIds : issueIds + }; + } + } + }); + } + + // �씠�뒋 �닔�젙 �뙘�뾽 �샇異� + function modify(id) { + $uibModal.open({ + templateUrl : 'views/issue/issueModify.html', + size : "lg", + controller : 'issueModifyController', + backdrop : 'static', + resolve : { + parameter : function () { + return { + id : id + }; + } + } + }); + } + + // �씠�뒋 �궘�젣 + function removes() { + var removeIds = []; + var removePermission = true; + + angular.forEach($scope.vm.responseData.data, function (data) { + if (data.checked && data.modifyPermissionCheck) { + removeIds.push(data.id); + } + + if (data.checked && !data.modifyPermissionCheck) { + removePermission = false; + } + }); + + if (!removePermission) { + SweetAlert.swal({ + html : true, + title : $filter("translate")("common.deleteFailed"), // �궘�젣 �떎�뙣 + text : $filter("translate")("issue.notHaveDeletePermissionExistsAnIssue"), // �궘�젣 沅뚰븳�씠 �뾾�뒗 �씠�뒋媛� 議댁옱�빀�땲�떎. + type : "error" + }); + return; + } + + if (removeIds.length < 1) { + SweetAlert.swal({ + title : $filter("translate")("common.checkPurgingTargets"), // �궘�젣 ���긽 �솗�씤 + text : $filter("translate")("common.selectDestinationDeletion"), // �궘�젣 ���긽�쓣 �꽑�깮�븯�꽭�슂. + type : "warning" + }); + return; + } + + // �궘�젣 �븣由� + SweetAlert.swal({ + title : $filter("translate")("issue.deleteIssue"), // �씠�뒋 �궘�젣 + text : $filter("translate")("issue.wantToDeleteSelectIssue"), // �꽑�깮�븳 �씠�뒋�쓣 �궘�젣�븯寃좎뒿�땲源�? �궘�젣�맂 �씠�뒋�� 蹂듦뎄�븷 �닔 �뾾�뒿�땲�떎. + type : "warning", + showCancelButton : true, + confirmButtonColor : "#DD6B55", + confirmButtonText : $filter("translate")("common.delete"), // �궘�젣 + cancelButtonText : $filter("translate")("common.cancel"), // 痍⑥냼 + closeOnConfirm : false, + closeOnCancel : true + }, + function (isConfirm) { + SweetAlert.close(); + + if (isConfirm) { + $rootScope.spinner = true; + + Issue.remove($resourceProvider.getContent( + { removeIds : removeIds }, + $resourceProvider.getPageContent(0, 0))).then(function (result) { + + if (result.data.message.status === "success") { + $timeout(function () { + SweetAlert.success($filter("translate")("common.deleteSucceeded"), result.data.message.message); // �궘�젣 �꽦怨� + }, 100); + + $scope.fn.listView(); + + $scope.fn.getPageList(0); + } + else { + $timeout(function () { + SweetAlert.error($filter("translate")("common.deleteFailed"), result.data.message.message); // �궘�젣 �떎�뙣 + }, 100); + } + + $rootScope.spinner = false; + }); + } + }); + } + + // �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 + function addIssueTableConfig() { + $uibModal.open({ + templateUrl : 'views/issue/issueAddTreeTableConfig.html', + size : "lg", + controller : 'issueAddTreeTableConfigController', + backdrop : 'static', + resolve : {} + }); + } + + // �씠�뒋 �긽�깭 紐⑸줉 + function getIssueStatuses() { + var deferred = $q.defer(); + $scope.vm.issueStatuses = []; + + IssueStatus.find($resourceProvider.getContent({}, + $resourceProvider.getPageContent(0, 1000))).then(function (result) { + if (result.data.message.status === "success") { + angular.forEach(result.data.data, function (issueType) { + $scope.vm.issueStatuses.push({ + fieldKey : issueType.id, + fieldValue : issueType.name + }); + }); + } + else { + SweetAlert.swal($filter("translate")("common.failedToIssueStatusListLookup"), result.data.message.message, "error"); // �씠�뒋 �긽�깭 紐⑸줉 議고쉶 �떎�뙣 + } + + deferred.resolve(result.data.data); + }); + + return deferred.promise; + } + + // �씠�뒋 �쑀�삎 紐⑸줉 + function getIssueTypes() { + var deferred = $q.defer(); + $scope.vm.issueTypes = []; + + IssueType.find($resourceProvider.getContent({}, + $resourceProvider.getPageContent(0, 1000))).then(function (result) { + if (result.data.message.status === "success") { + angular.forEach(result.data.data, function (issueType) { + $scope.vm.issueTypes.push({ + fieldKey : issueType.id, + fieldValue : issueType.name + }); + }); + } + else { + SweetAlert.swal($filter("translate")("issue.failedToIssueTypeListLookup"), result.data.message.message, "error"); // �씠�뒋 �쑀�삎 紐⑸줉 議고쉶 �떎�뙣 + } + + deferred.resolve(result.data.data); + }); + + return deferred.promise; + } + + // �슦�꽑�닚�쐞 紐⑸줉 + function getPriorities() { + var deferred = $q.defer(); + $scope.vm.priorities = []; + + Priority.find($resourceProvider.getContent({}, + $resourceProvider.getPageContent(0, 1000))).then(function (result) { + if (result.data.message.status === "success") { + angular.forEach(result.data.data, function (prioritiy) { + $scope.vm.priorities.push({ + fieldKey : prioritiy.id, + fieldValue : prioritiy.name + }); + }); + } + else { + SweetAlert.swal($filter("translate")("issue.failedToPriorityListLookup"), result.data.message.message, "error"); // �슦�꽑�닚�쐞 紐⑸줉 議고쉶 �떎�뙣 + } + + deferred.resolve(result.data.data); + }); + + return deferred.promise; + } + + // 以묒슂�룄 紐⑸줉 + function getSeverities() { + var deferred = $q.defer(); + $scope.vm.severities = []; + + Severity.find($resourceProvider.getContent({}, + $resourceProvider.getPageContent(0, 1000))).then(function (result) { + if (result.data.message.status === "success") { + angular.forEach(result.data.data, function (severity) { + $scope.vm.severities.push({ + fieldKey : severity.id, + fieldValue : severity.name + }); + }); + } + else { + SweetAlert.swal($filter("translate")("issue.failedToCriticalListLookup"), result.data.message.message, "error"); // 以묒슂�룄 紐⑸줉 議고쉶 �떎�뙣 + } + + deferred.resolve(result.data.data); + }); + + return deferred.promise; + } + + // �궗�슜�옄 �젙�쓽 �븘�뱶 紐⑸줉 + function getCustomFields() { + var deferred = $q.defer(); + $scope.vm.customFields = []; + + CustomField.find($resourceProvider.getContent({}, + $resourceProvider.getPageContent(0, 1000))).then(function (result) { + if (result.data.message.status === "success") { + + angular.forEach(result.data.data, function (customField) { + switch (customField.customFieldType) { + case "INPUT" : + customField.useValues = ""; + break; + + case "MULTI_SELECT" : + case "SINGLE_SELECT" : + customField.useValues = []; + break; + } + + $scope.vm.customFields.push(customField); + }); + } + else { + SweetAlert.swal($filter("translate")("issue.failedToUserDefinedFieldListLookup"), result.data.message.message, "error"); // �궗�슜�옄 �젙�쓽 �븘�뱶 紐⑸줉 議고쉶 �떎�뙣 + } + + deferred.resolve(result.data.data); + }); + + return deferred.promise; + } + + // �궗�슜�옄 �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 媛믪쓣 媛��졇���꽌 �쟻�슜�븳�떎. + function getIssueTableConfigs() { + var deferred = $q.defer(); + + IssueTableConfig.detail($resourceProvider.getContent({}, + $resourceProvider.getPageContent(0, 1000))).then(function (result) { + if (result.data.message.status !== "success") { + SweetAlert.error($filter("translate")("issue.failedToIssueTableColumnLookup"), result.data.message.message); // �씠�뒋 �뀒�씠釉� 而щ읆 議고쉶 �떎�뙣 + } + + deferred.resolve(result.data.data); + }); + + return deferred.promise; + } + + // 理쒖큹 �떎�뻾 + function startExecute() { + // �뙆�씪誘명꽣 �씫湲� + var params = $rootScope.previousGetParams; + if ($rootScope.isDefined(params)) { + $rootScope.$broadcast("makeIssueSearch", { projectKey : params.projectKey, issueNumber : params.issueNumber }); + $rootScope.previousGetParams = null; + return; + } + + var promises = { + getIssueTypes : $scope.fn.getIssueTypes(), + getPriorities : $scope.fn.getPriorities(), + getSeverities : $scope.fn.getSeverities(), + getIssueStatuses : $scope.fn.getIssueStatuses(), + getCustomFields : $scope.fn.getCustomFields() + }; + + $q.all(promises).then(function (results){ + $log.debug("promises 寃곌낵 " , results); + // �씠�뒋 �뀒�씠釉� �꽕�젙 議고쉶 諛� �쟻�슜 �썑 + // �씠�뒋 寃��깋 議곌굔 媛��졇�삤湲� �썑 + // �씠�뒋 議고쉶 + + // �궗�슜�옄 �씠�뒋 紐⑸줉 �뀒�씠釉� �꽕�젙 媛믪쓣 媛��졇���꽌 �쟻�슜�븳�떎. + $scope.fn.getIssueTableConfigs().then(function (issueTableConfigs) { + if ($rootScope.isDefined(issueTableConfigs)) { + // �씠�뒋 �뀒�씠釉� �꽕�젙 �젙蹂대�� ���옣 �븳�떎. + $scope.vm.issueTableConfigs = JSON.parse(issueTableConfigs); + $scope.vm.issueTableConfigs.sort(function (a, b) { + return a.position < b.position ? -1 : a.position > b.position ? 1: 0; + }); + } + else { + // 理쒖큹 �뾽臾� 怨듦컙�뿉 �뱾�뼱�솕�쓣 寃쎌슦 + $scope.vm.issueTableConfigs = [{ + name : $filter("translate")("common.priority"), // �슦�꽑�닚�쐞 + key : "PRIORITY", + width : "width-80-p", + position : 1, + display : true + }, { + name : $filter("translate")("common.importance"), // 以묒슂�룄 + key : "SEVERITY", + width : "width-80-p", + position : 2, + display : true + }, { + name : $filter("translate")("issue.issueType"), // �씠�뒋 ���엯 + key : "ISSUE_TYPE", + width : "width-140-p", + position : 3, + display : true + }, { + name : $filter("translate")("common.assignee"), // �떞�떦�옄 + key : "ASSIGNEE", + width : "width-140-p", + position : 4, + display : true + }]; + } + + // �씠�뒋 �뀒�씠釉� �꽕�젙 + $scope.fn.makeTableConfigs(); + // �꽌踰꾩뿉 ���옣�븳 �씠�뒋 寃��깋 議곌굔�쓣 媛��졇���꽌 �씠�뒋 紐⑸줉 寃��깋�쓣 吏꾪뻾�븳�떎. + $scope.fn.getVmSearchObject(); + }); + }); + } + + $scope.fn.startExecute(); + } + ]); + } +); diff --git a/src/main/webapp/scripts/main.js b/src/main/webapp/scripts/main.js index 6413765..7bf0ada 100644 --- a/src/main/webapp/scripts/main.js +++ b/src/main/webapp/scripts/main.js @@ -179,10 +179,12 @@ 'issueModifyController' : 'app/issue/issueModify.controller', // �씠�뒋 �닔�젙 而⑦듃濡ㅻ윭 'issueDetailController' : 'app/issue/issueDetail.controller', // �씠�뒋 �긽�꽭 而⑦듃濡ㅻ윭 'issueListController' : 'app/issue/issueList.controller', // �씠�뒋 紐⑸줉 而⑦듃濡ㅻ윭 + 'issueListTreeController' : 'app/issue/issueListTree.controller', // �씠�뒋 �븯�쐞/�뿰愿��씪媛� 寃��깋 而⑦듃濡ㅻ윭 'issueManagerController' : 'app/issue/issueManager.controller', // �씠�뒋 愿�由� 而⑦듃濡ㅻ윭 'issueImportExcelController' : 'app/issue/issueImportExcel.controller', // �씠�뒋 �뿊�� ���웾 import 'issueModifyStatusController' : 'app/issue/issueModifyStatus.controller', // �씠�뒋 �떎以� �긽�깭 蹂�寃� 而⑦듃濡ㅻ윭 'issueAddTableConfigController' : 'app/issue/issueAddTableConfig.controller', // �씠�뒋 �뀒�씠釉� �꽕�젙 而⑦듃濡ㅻ윭 + 'issueAddTreeTableConfigController' : 'app/issue/issueAddTreeTableConfig.controller', // �씠�뒋 �븯�쐞/�뿰愿��씪媛� 寃��깋 �뀒�씠釉� �꽕�젙 而⑦듃濡ㅻ윭 'issueSendMailController' : 'app/issue/issueSendMail.controller', // �씠�뒋 �씠硫붿씪 諛쒖넚 而⑦듃濡ㅻ윭 'issueVersionViewController' : 'app/issue/issueVersionView.controller', // �씠�뒋 踰꾩쟾 �솗�씤 而⑦듃濡ㅻ윭 'issueReservationController' : 'app/issue/issueReservation.controller', // �씠�뒋 諛쒖깮 �삁�빟 而⑦듃濡ㅻ윭 diff --git a/src/main/webapp/views/issue/issueAddTreeTableConfig.html b/src/main/webapp/views/issue/issueAddTreeTableConfig.html new file mode 100644 index 0000000..297b78e --- /dev/null +++ b/src/main/webapp/views/issue/issueAddTreeTableConfig.html @@ -0,0 +1,95 @@ +<div class="formModal"> + <div class="modal-header faded smaller"> + <div class="modal-title"> + <strong translate="issue.setIssueTableDisplay">�씠�뒋 �뀒�씠釉� �몴�떆 �꽕�젙</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="issueTableConfigForm"> + <table class="table table-dash table-lightborder table-layout-fixed"> + <thead> + <tr> + <th class="text-center width-80-p"> + <span translate="issue.columnName">而щ읆紐�</span> + </th> +<!-- <th class="text-center width-80-p">--> +<!-- <span translate="issue.area">�꼻�씠</span>--> +<!-- </th>--> + <th class="text-center width-80-p"> + <span translate="issue.displayed">�몴�떆 �뿬遺�</span> + </th> + <th class="text-center width-40-p"> + <span translate="issue.sequence">�닚�꽌</span> + </th> + </tr> + </thead> + <tbody> + <tr> + <td class="text-center"> + <span class="bold" translate="issue.issueTitle">�씠�뒋 �젣紐�</span> + </td> + <td class="text-center" colspan="2"> + <span class="text-danger bold" translate="issue.cannotChangedIssueTitle">�씠�뒋 �젣紐⑹� 蹂�寃쏀븷 �닔 �뾾�뒿�땲�떎.</span> + </td> + </tr> + <tr ng-repeat="issueTableConfig in vm.issueTableConfigs"> + <td class="text-center"> + <span class="bold">{{issueTableConfig.name}}</span> + </td> +<!-- <td class="text-center">--> +<!-- <select class="form-control" ng-model="issueTableConfig.width">--> +<!-- <option>�꽑�깮�븯�꽭�슂.</option>--> +<!-- <option value="width-20-p">20px</option>--> +<!-- <option value="width-30-p">30px</option>--> +<!-- <option value="width-40-p">40px</option>--> +<!-- <option value="width-50-p">50px</option>--> +<!-- <option value="width-60-p">60px</option>--> +<!-- <option value="width-70-p">70px</option>--> +<!-- <option value="width-80-p">80px</option>--> +<!-- <option value="width-90-p">90px</option>--> +<!-- <option value="width-100-p">100px</option>--> +<!-- <option value="width-110-p">110px</option>--> +<!-- <option value="width-120-p">120px</option>--> +<!-- <option value="width-130-p">130px</option>--> +<!-- <option value="width-140-p">140px</option>--> +<!-- <option value="width-150-p">150px</option>--> +<!-- <option value="width-160-p">160px</option>--> +<!-- <option value="width-170-p">170px</option>--> +<!-- <option value="width-180-p">180px</option>--> +<!-- <option value="width-190-p">190px</option>--> +<!-- <option value="width-200-p">200px</option>--> +<!-- <option value="width-220-p">220px</option>--> +<!-- <option value="width-240-p">240px</option>--> +<!-- <option value="width-260-p">260px</option>--> +<!-- <option value="width-280-p">280px</option>--> +<!-- <option value="width-300-p">300px</option>--> +<!-- <option value="width-20">20%</option>--> +<!-- <option value="width-30">30%</option>--> +<!-- <option value="width-40">40%</option>--> +<!-- <option value="width-50">50%</option>--> +<!-- </select>--> +<!-- </td>--> + <td class="text-center"> + <label class='switch'><input type='checkbox' ng-model='issueTableConfig.display'><span class='slider round'></span></label> + </td> + <td class="text-center"> + <input type="text" class="form-control" ng-model="issueTableConfig.position" maxlength="2" input-regex="[^0-9]"> + </td> + </tr> + </tbody> + </table> + </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.close">�떕湲�</span></button> + <button type="button" class="btn btn-md btn-primary bold" + ng-disabled="fn.formCheck(issueTableConfigForm.$invalid)" + ng-click="fn.formSubmit()"><span translate="common.save">���옣</span> + </button> + </div> +</div> diff --git a/src/main/webapp/views/issue/issueList.html b/src/main/webapp/views/issue/issueList.html index 50d4a57..2fa8185 100644 --- a/src/main/webapp/views/issue/issueList.html +++ b/src/main/webapp/views/issue/issueList.html @@ -9,6 +9,9 @@ <a class="nav-link cursor" ng-class="{ 'active' : vm.tab == 'ISSUE_LIST' }" ng-click="fn.changeTab('ISSUE_LIST')" translate="issue.normalList">�씪媛� 紐⑸줉</a> </li> <li class="nav-item"> + <a class="nav-link cursor" ng-class="{ 'active' : vm.tab == 'ISSUE_TREE_LIST' }" ng-click="fn.changeTab('ISSUE_TREE_LIST')" translate="issue.treeList">援ъ“ 紐⑸줉</a> + </li> + <li class="nav-item"> <a class="nav-link cursor" ng-class="{ 'active' : vm.tab == 'ISSUE_TIMELINE' }" ng-click="fn.changeTab('ISSUE_TIMELINE')" translate="issue.timeLine">���엫 �씪�씤</a> </li> </ul> @@ -21,6 +24,10 @@ <div ng-include include-replace src="'views/issue/issueListNormal.html'"></div> </div> + <div ng-show="vm.tab == 'ISSUE_TREE_LIST'"> + <div ng-include include-replace src="'views/issue/issueListTree.html'"></div> + </div> + <div ng-show="vm.tab == 'ISSUE_TIMELINE'"> <div ng-include include-replace src="'views/issue/issueListTimeline.html'"></div> </div> diff --git a/src/main/webapp/views/issue/issueListTree.html b/src/main/webapp/views/issue/issueListTree.html new file mode 100644 index 0000000..8612831 --- /dev/null +++ b/src/main/webapp/views/issue/issueListTree.html @@ -0,0 +1,410 @@ +<div class="container-fluid" ng-controller="issueListTreeController"> + <div class="row"> + <div class="col-sm-12" > + <div class="element-wrapper" ng-if="!vm.detailView"> + <div class="element-box"> + <div class="row" > + <div class="col-sm-12"> + <div class="searchdiv"> + <form name="issueSearchForm" role="form" ng-enter="fn.getPageList(0)"> + <div class="row"> + <div class="col-sm-6"> + <div class="input-group"> + <input class="form-control" + type="text" + tabindex="-1" + maxlength="300" + kr-input + owl-auto-focus + ng-model="vm.search.title" + placeholder="{{'issue.pleaseEnterIssueName' | translate}}"> + <div class="input-group-prepend ml-10"> + <button class="btn btn-navy" ng-click="fn.getPageList(0)"> <span translate="common.search">寃��깋</span></button> + </div> + </div> + </div> + </div> + + <div class="row"> + <div class="col-sm-12"> + <div class="tabfilter"> + <div translate="common.selectedSearchCriteria">�꽑�깮�븳 寃��깋 議곌굔</div> + <!-- �봽濡쒖젥�듃 --> + <issue-search-array-view-element lists="vm.projects" + type="'project'"></issue-search-array-view-element> + + <!-- �씠�뒋 ���엯 --> + <issue-search-field-key-view-element lists="vm.issueTypes" + keys="vm.search.issueTypeIds"></issue-search-field-key-view-element> + + <!-- �씠�뒋 �긽�깭 --> + <issue-search-field-key-view-element lists="vm.issueStatuses" + keys="vm.search.issueStatusIds"></issue-search-field-key-view-element> + + <!-- �씠�뒋 踰덊샇 --> + <p ng-if="$root.isDefined(vm.search.combinationIssueNumber)"> + {{vm.search.combinationIssueNumber}} + <span ng-click="vm.search.combinationIssueNumber = ''">횞</span> + </p> + + <!-- �씠�뒋 �궡�슜 --> + <p ng-if="$root.isDefined(vm.search.description)"> + {{vm.search.description}} + <span ng-click="vm.search.description = ''">횞</span> + </p> + + <!-- �슦�꽑 �닚�쐞 --> + <issue-search-field-key-view-element lists="vm.priorities" + keys="vm.search.priorityIds"></issue-search-field-key-view-element> + + <!-- 以묒슂�룄 --> + <issue-search-field-key-view-element lists="vm.severities" + keys="vm.search.severityIds"></issue-search-field-key-view-element> + + <!-- �떞�떦�옄 --> + <issue-search-array-view-element lists="vm.users" + type="'user'"></issue-search-array-view-element> + + <!-- �벑濡앹옄 --> + <issue-search-array-view-element lists="vm.registers" + type="'user'"></issue-search-array-view-element> + + <!-- �떆�옉�씪 --> + <p ng-if="$root.isDefined(vm.search.startDateRange)"> + {{vm.search.startDateRange}} + <span ng-click="vm.search.startDateRange = ''">횞</span> + </p> + + <!-- 醫낅즺�씪 --> + <p ng-if="$root.isDefined(vm.search.completeDateRange)"> + {{vm.search.completeDateRange}} + <span ng-click="vm.search.completeDateRange = ''">횞</span> + </p> + + <!-- �벑濡앹씪 --> + <p ng-if="$root.isDefined(vm.search.registerDateRange)"> + {{vm.search.registerDateRange}} + <span ng-click="vm.search.registerDateRange = ''">횞</span> + </p> + + <!-- �뀓�뒪�듃 �엯�젰 �븘�뱶 --> + <issue-search-custom-field-view-element + custom-fields="vm.customFields"></issue-search-custom-field-view-element> + </div> + </div> + </div> + + + <div class=""> + <label class="issue-search-label" ng-class="{ 'icon-reverse' : vm.searchView }" + ng-click="vm.searchView = !vm.searchView"> + <span translate="common.detailedSearch">�긽�꽭寃��깋</span> + </label> + <div ng-if="vm.searchView"> + <div class="row"> + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="common.project">�봽濡쒖젥�듃</span></label> + <js-autocomplete-multi data-input-name="projects" + selected-model="vm.projects" + search="vm.projectName" + input-disabled="false" + translation-texts="{ empty : 'common.emptyProject', selectList : 'common.' }" + source="fn.getProjectList(vm.projectName, vm.projects, null, null, ['01', '02', '03'])" + extra-settings="{ displayProp : 'name' , idProp : 'id', imageable : false, imagePathProp : '', type : '', maxlength : 100}"></js-autocomplete-multi> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="issue.issueType">�씠�뒋 ���엯</span></label> + <ng-dropdown-multiselect class="multiSelect cursor" + data-input-name="issueStatuses" + selected-model="vm.search.issueTypeIds" + options="::vm.issueTypes"></ng-dropdown-multiselect> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="issue.issueStatus">�씠�뒋 �긽�깭</span></label> + <ng-dropdown-multiselect class="multiSelect cursor" + data-input-name="issueStatuses" + selected-model="vm.search.issueStatusIds" + options="::vm.issueStatuses"></ng-dropdown-multiselect> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="issue.issueNumber">�씠�뒋 踰덊샇</span></label> + <input type="text" + name="name" + class="form-control input-sm" + autocomplete="off" + kr-input + maxlength="20" + ng-model="vm.search.combinationIssueNumber"> + </div> + </div> + </div> + + <div class="row"> + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="issue.issueContent">�씠�뒋 �궡�슜</span></label> + <input type="text" + name="description" + class="form-control input-sm" + kr-input + maxlength="20" + autocomplete="off" + ng-model="vm.search.description"> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="common.priority">�슦�꽑 �닚�쐞</span></label> + <ng-dropdown-multiselect class="multiSelect cursor" + data-input-name="priorities" + selected-model="vm.search.priorityIds" + options="::vm.priorities"></ng-dropdown-multiselect> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="common.importance">以묒슂�룄</span></label> + <ng-dropdown-multiselect class="multiSelect cursor" + data-input-name="severities" + selected-model="vm.search.severityIds" + options="::vm.severities"></ng-dropdown-multiselect> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="common.assignee">�떞�떦�옄</span></label> + <js-autocomplete-multi data-input-name="users" + selected-model="vm.users" + search="vm.userName" + input-disabled="false" + source="fn.getUserList(vm.userName, vm.users)" + translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }" + extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'user', maxlength : 100 }"> + </js-autocomplete-multi> + </div> + </div> + </div> + + <div class="row"> + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="common.register">�벑濡앹옄</span></label> + <js-autocomplete-multi data-input-name="registers" + selected-model="vm.registers" + search="vm.registerName" + input-disabled="false" + source="fn.getUserList(vm.registerName, vm.registers)" + translation-texts="{ count : 'common.userNum', empty : 'common.emptyUser' }" + extra-settings="{ displayProp : 'byName' , idProp : 'id', widthable : false, width : '', imageable : true, imagePathProp : 'profile', type : 'user', maxlength : 100 }"> + </js-autocomplete-multi> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="common.registrationDate">�벑濡앹씪</span></label> + <input type="text" + readonly + class="form-control input-sm input-readonly" + ng-model="vm.search.registerDateRange" + modal-form-auto-scroll + date-format="YY-MM-DD" + parent-el="'#createdWidget'" + date-range-picker> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="common.startDate">�떆�옉�씪</span></label> + <input type="text" + readonly + class="form-control input-sm input-readonly" + ng-model="vm.search.startDateRange" + date-format="YY-MM-DD" + parent-el="'#createdWidget'" + date-range-picker> + </div> + </div> + + <div class="col-lg-3"> + <div class="form-group"> + <label> <span translate="common.endDate">醫낅즺�씪</span></label> + <input type="text" + readonly + class="form-control input-sm input-readonly" + ng-model="vm.search.completeDateRange" + modal-form-auto-scroll + date-format="YY-MM-DD" + parent-el="'#createdWidget'" + date-range-picker> + </div> + </div> + + <div class="col-lg-3" ng-repeat="customField in vm.customFields"> + <label>{{::customField.name}}</label> + + <div ng-switch on="customField.customFieldType"> + <div ng-switch-when="INPUT"> + <input type="text" class="form-control input-sm" + ng-model="customField.useValues" + maxlength="100"> + </div> + + <div ng-switch-default> + <ng-dropdown-multiselect class="multiSelect cursor" + data-input-name="customField.name" + selected-model="customField.useValues" + extra-settings="{ 'idProp' : 'value', 'externalIdProp' : 'value', 'displayProp' : 'value', 'stringTypeOption' : 'true', 'stopRemoveBodyEvent' : 'true' }" + options="::customField.customFieldValueVos"></ng-dropdown-multiselect> + </div> + </div> + </div> + + </div> + + <div class="row"> + <div class="col-sm-12"> + <div class="form-buttons-w text-center mb-20"> + <button class="btn btn-xlg btn-navy" ng-click="fn.getPageList(0)"> + <i class="os-icon os-icon-ui-37"></i> + <span translate="common.search">寃��깋</span> + </button> + <button class="btn btn-xlg btn-white" ng-click="fn.initSearch()"> + <i class="os-icon os-icon-grid-18"></i> + <span translate="common.reset">珥덇린�솕</span> + </button> + </div> + </div> + </div> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="controls-above-table mt-30"> + <div class="row"> + <!-- 醫뚯륫 --> + <div class="col-7"> + <div class="dataTables_length"> + <label> + <select name="pageRow" + tabindex="-1" + class="form-control form-control-sm" + ng-change="fn.changePageRowCount()" + ng-model="vm.page.selectedPageRowCount"> + <option value="10">10</option> + <option value="50">50</option> + <option value="100">100</option> + </select> 1-1 / 2嫄�</span> + </label> + </div> + </div> + <!-- �슦痢� --> + <div class="col-5 " > + <form class="form-inline justify-content-sm-end pull-right" method="post" action="/issue/downloadExcel" name="issueListForm" > + <!--span class="badge-tip" function-tool-tip data-placement="top" data-toggle="tooltip" data-original-title="�뿊�� �떎�슫濡쒕뱶, �씪愿� 蹂�寃� �벑 �떎�뼇�븳 湲곕뒫�쓣 �젣怨듯빀�땲�떎.">?</span--> + <input type="hidden" name="conditions"> + <div class="btn-group"> + <button aria-expanded="false" aria-haspopup="true" + tabindex="-1" + class="btn btn-secondary dropdown-toggle" + data-toggle="dropdown" type="button"><span translate="common.addFunction">異붽�湲곕뒫</span> + </button> + <div aria-labelledby="dropdownMenuButton2" class="dropdown-menu left-menu" + x-placement="bottom-start" > + <a class="dropdown-item cursor" ng-click="fn.addIssueTableConfig()"> <span translate="issue.settingTableDisplay">�뀒�씠釉� �몴�떆 �꽕�젙</span></a> + </div> + </div> + </form> + </div> + </div> + </div> +<!-- + <div class="table-responsive"> + <js-table data="vm.responseData.data" table-configs="vm.tableConfigs" + event="tableEvent" detail-view="vm.detailView"></js-table> + </div> + --> + + <!-- �듃由ш뎄議� �엫�떆 --> + <div class="tree-container"> + <div class="tree-body"> + <h5 class="tree-title"><button class="btn btn-primary">�솃�럹�씠吏� 蹂�議� �깘吏�</button></h5> + <ul class="tree"> + <li> + <a href="#" class="btn btn-success">https://land.daum.com/news/expertColumnView.naver?artcl_seq=6580&page= | 2020.10.13 22:10:22</a> + <a href="#" class="btn btn-info">�뿰愿� �씪媛�1</a> + <a href="#" class="btn btn-info">�뿰愿� �씪媛�2</a> + <ul> + <li> + <a href="#" class="btn btn-warning">https://dict.daum.com/elkodict/moderngreek/#/main | 2020.10.13 22:10:22</a> + </li> + </ul> + </li> + <li> + <a href="#" class="btn btn-success">https://land.naver.com/news/region.naver | 2020.10.13 22:10:22</a> + <a href="#" class="btn btn-info">�뿰愿� �씪媛�1</a> + <ul> + <li> + <a href="#" class="btn btn-warning">https://sports.news.naver.com/news.nhn?oid=236&aid=0000218017 | 2020.10.13 22:10:22</a> + </li> + </ul> + </li> + </ul> + </div> + <hr> + <div class="tree-body"> + <h5 class="tree-title"><button class="btn btn-primary">MCF</button></h5> + <ul class="tree"> + <li> + <a href="#" class="btn btn-success">https://land.naver.com/news/region.naver | 2020.10.13 22:10:22</a> + <a href="#" class="btn btn-info">�뿰愿� �씪媛�1</a> + <ul> + <li> + <a href="#" class="btn btn-warning">https://sports.news.naver.com/news.nhn?oid=236&aid=0000218017 | 2020.10.13 22:10:22</a> + </li> + </ul> + </li> + </ul> + </div> + </div> + + <div class="controls-below-table text-center"> + <ul uib-pagination + boundary-links-numbes="true" + items-per-page="vm.page.selectedPageRowCount" + total-items="vm.responseData.page.totalCount" + ng-model="vm.page.selectedPage" + max-size="10" + ng-click="fn.getPageList(vm.page.selectedPage - 1)" + class="pagination pagination-sm" + previous-text="<" + next-text=">" + first-text="" + last-text=""> + </ul> + </div> + </div> + </div> + </div> + </div> + + <div class="row support-index" ng-show="vm.detailView"> + <div ng-include include-replace src="'views/issue/issueDetail.html'"></div> + </div> +</div> \ No newline at end of file -- Gitblit v1.8.0