'use strict'; define(['app', 'htmlDiff', 'angular'], function (app, htmlDiff, angular) { app.directive('jsHtmlDiff', ['$log', '$rootScope', function ($log, $rootScope) { return { scope : { issueVersion : "=" }, restrict : 'AE', templateUrl : '/custom_components/js-html-diff/js-html-diff.html', controller : function ($scope, $element, $attrs) { $scope.fn = { compareIssue : compareIssue, // 변경 정보를 비교한다. detectModifyAttr : detectModifyAttr, // 변경 사항 감지 setFormByIssueTypeCustomFields : setFormByIssueTypeCustomFields, // 사용자 정의 필드 가공 setUseValueByIssueTypeCustomFields : setUseValueByIssueTypeCustomFields, // 이슈에서 사용자가 선택한 사용자 정의 필드 값을 입력 폼에 셋팅한다. getTargetIssueVersion : getTargetIssueVersion, init : init // 데이터 초기화 }; $scope.vm = { title : { modify : false, target : "", // 이전 정보 result : "", // 비교 정보 }, description : { modify : false, target : "", result : "" }, priority : { modify : false, target : "", result : "" }, severity : { modify : false, target : "", result : "" }, issueStatus : { modify : false, target : "", result : "" }, issueType : { modify : false, target : "", result : "" }, period : { modify : false, target : "", result : "" }, userVos : { modify : false, target : "", result : "" }, attachedFileVos : { modify : false, target : "", result : "" }, customFieldVos : [], }; $scope.$watch("issueVersion", function (newValue) { if ($rootScope.isDefined(newValue.targetIssueVersionVo)) { var checkList = ["title", "description", "priority", "severity", "issueStatus", "issueType", "period", "userVos", "attachedFileVos", "customFieldVos"]; // 데이터 초기화 $scope.fn.init(); angular.forEach(checkList, function (check) { $scope.fn.compareIssue(check); }); } }); // 데이터 초기화 function init() { $scope.vm = { title : { modify : false, target : "", // 이전 정보 result : "", // 비교 정보 }, description : { modify : false, target : "", result : "" }, priority : { modify : false, target : "", result : "" }, severity : { modify : false, target : "", result : "" }, issueStatus : { modify : false, target : "", result : "" }, issueType : { modify : false, target : "", result : "" }, period : { modify : false, target : "", result : "" }, userVos : { modify : false, target : "", result : "" }, attachedFileVos : { modify : false, target : "", result : "" }, customFieldVos : [], }; } // 변경 정보를 비교한다. function compareIssue(attr) { var result = ""; var target = ""; var next = ""; switch (attr) { case "title": target = "" + $scope.issueVersion.targetIssueVersionVo.versionHistory.title + ""; next = "" + $scope.issueVersion.nextIssueVersionVo.versionHistory.title + ""; result = htmlDiff(target, next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { $scope.vm.title.modify = true; $scope.vm.title.target = target; $scope.vm.title.result = result; } break; case "description": target = $scope.issueVersion.targetIssueVersionVo.versionHistory.description; next = $scope.issueVersion.nextIssueVersionVo.versionHistory.description; // 이미지 추출해서 없애기 var imageList = []; $($scope.issueVersion.nextIssueVersionVo.versionHistory.description).find("img").each(function () { imageList.push($(this).attr("src")); }); result = htmlDiff(target, next); $(result).find("img").each(function () { var imageCheck = false; var imageFindCount = 0; for (var count in imageList) { var imageSrc = imageList[count]; if (imageSrc === $(this).attr("src") ) { imageCheck = true; imageFindCount = count; break; } } if (!imageCheck) { result = result.replace($(this)[0].outerHTML, ""); } else { imageList.splice(imageFindCount, 1); } }); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result) || !(target === next)) { $scope.vm.description.modify = true; $scope.vm.description.target = target; $scope.vm.description.result = result; } break; case "priority": target = "" + $scope.issueVersion.targetIssueVersionVo.versionHistory.priorityVo.name + ""; next = "" + $scope.issueVersion.nextIssueVersionVo.versionHistory.priorityVo.name + ""; result = htmlDiff(target, next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { $scope.vm.priority.modify = true; $scope.vm.priority.target = target; $scope.vm.priority.result = result; } break; case "severity": target = "" + $scope.issueVersion.targetIssueVersionVo.versionHistory.severityVo.name + ""; next = "" + $scope.issueVersion.nextIssueVersionVo.versionHistory.severityVo.name + ""; result = htmlDiff(target, next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { $scope.vm.severity.modify = true; $scope.vm.severity.target = target; $scope.vm.severity.result = result; } break; case "issueStatus": target = "" + $scope.issueVersion.targetIssueVersionVo.versionHistory.issueStatusVo.name + ""; next = "" + $scope.issueVersion.nextIssueVersionVo.versionHistory.issueStatusVo.name + ""; result = htmlDiff(target, next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { $scope.vm.issueStatus.modify = true; $scope.vm.issueStatus.target = target; $scope.vm.issueStatus.result = result; } break; case "issueType": target = "" + $scope.issueVersion.targetIssueVersionVo.versionHistory.issueTypeVo.name + ""; next = "" + $scope.issueVersion.nextIssueVersionVo.versionHistory.issueTypeVo.name + ""; result = htmlDiff(target, next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { $scope.vm.issueType.modify = true; $scope.vm.issueType.target = target; $scope.vm.issueType.result = result; } break; case "period": if ($rootScope.isDefined($scope.issueVersion.targetIssueVersionVo.versionHistory.completeDate)) { target = "" + $scope.issueVersion.targetIssueVersionVo.versionHistory.startDate + " ~ "; target += $scope.issueVersion.targetIssueVersionVo.versionHistory.completeDate + ""; } if ($rootScope.isDefined($scope.issueVersion.nextIssueVersionVo.versionHistory.completeDate)) { next = "" + $scope.issueVersion.nextIssueVersionVo.versionHistory.startDate + " ~ "; next += $scope.issueVersion.nextIssueVersionVo.versionHistory.completeDate + ""; } result = htmlDiff(target, next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { $scope.vm.period.modify = true; $scope.vm.period.target = target; $scope.vm.period.result = result; } break; case "userVos": // 이름 순으로 정렬 $scope.issueVersion.targetIssueVersionVo.versionHistory.userVos.sort(function (a, b) { return a.name < b.name ? -1 : (a.name > b.name) ? 1: 0; }); angular.forEach($scope.issueVersion.targetIssueVersionVo.versionHistory.userVos, function (userVo, index) { if (index > 0) { target += "
"; } /*target += "" + userVo.name + "";*/ target += "" + userVo.name + "(" + userVo.account + ")"; }); // 이름 순으로 정렬 $scope.issueVersion.nextIssueVersionVo.versionHistory.userVos = $scope.issueVersion.nextIssueVersionVo.versionHistory.userVos.sort(function (a, b) { return a.name < b.name ? -1 : (a.name > b.name) ? 1: 0; }); angular.forEach($scope.issueVersion.nextIssueVersionVo.versionHistory.userVos, function (userVo, index) { if (index > 0) { next += "
"; } /*next += "" + userVo.name + "";*/ next += "" + userVo.name + "(" + userVo.account + ")"; }); result = htmlDiff(target, next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { $scope.vm.userVos.modify = true; $scope.vm.userVos.target = target; $scope.vm.userVos.result = result; } break; case "attachedFileVos" : angular.forEach($scope.issueVersion.targetIssueVersionVo.versionHistory.attachedFileVos, function (attachedFileVo, index) { if (index > 0) { target += "
"; } target += "" + attachedFileVo.name + ""; }); angular.forEach($scope.issueVersion.nextIssueVersionVo.versionHistory.attachedFileVos, function (attachedFileVo, index) { if (index > 0) { next += "
"; } next += "" + attachedFileVo.name + ""; }); result = htmlDiff(target, next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { $scope.vm.attachedFileVos.modify = true; $scope.vm.attachedFileVos.target = target; $scope.vm.attachedFileVos.result = result; } break; case "customFieldVos": var totalCustomFieldObjects = $scope.issueVersion.targetIssueVersionVo.versionHistory.issueTypeCustomFieldVos.concat($scope.issueVersion.nextIssueVersionVo.versionHistory.issueTypeCustomFieldVos); var customFieldObjects = []; for (var totalCustomFieldCount in totalCustomFieldObjects) { var totalCustomFieldObject = totalCustomFieldObjects[totalCustomFieldCount]; var exist = false; for (var customFieldCount in customFieldObjects) { var customFieldObject = customFieldObjects[customFieldCount]; if (customFieldObject.customFieldVo.id === totalCustomFieldObject.customFieldVo.id) { exist = true; break; } } if (!exist) { customFieldObjects.push(totalCustomFieldObject); } } // 사용자 정의 필드 가공 $scope.fn.setFormByIssueTypeCustomFields(customFieldObjects); // 이슈에서 사용자가 선택한 사용자 정의 필드 값을 입력 폼에 셋팅한다. - 이전 $scope.fn.setUseValueByIssueTypeCustomFields($scope.issueVersion.targetIssueVersionVo.versionHistory.issueCustomFieldValueVos, "target"); // 이슈에서 사용자가 선택한 사용자 정의 필드 값을 입력 폼에 셋팅한다. - 현재 $scope.fn.setUseValueByIssueTypeCustomFields($scope.issueVersion.nextIssueVersionVo.versionHistory.issueCustomFieldValueVos, "next"); angular.forEach($scope.vm.customFieldVos, function (customFieldVo) { result = htmlDiff(customFieldVo.target, customFieldVo.next); // 변경 사항이 있는지 감지한다. if ($scope.fn.detectModifyAttr(result)) { customFieldVo.modify = true; customFieldVo.result = result; } }); break; } } // 변경 사항이 있는지 감지한다. function detectModifyAttr(result) { // del, ins return (result.match(/del/g) || result.match(/ins/g)); } // 사용자 정의 필드 가공 function setFormByIssueTypeCustomFields(issueTypeCustomFields) { $scope.vm.customFieldVos = []; angular.forEach(issueTypeCustomFields, function (issueTypeCustomField) { // 표시 여부 결정 issueTypeCustomField.modify = false; switch (issueTypeCustomField.customFieldVo.customFieldType) { case "INPUT" : case "SINGLE_SELECT" : case "NUMBER" : case "DATETIME" : case "IP_ADDRESS" : case "EMAIL" : case "SITE" : case "TEL" : issueTypeCustomField.target = ""; issueTypeCustomField.next = ""; break; case "MULTI_SELECT" : issueTypeCustomField.target = []; issueTypeCustomField.next = []; break; } $scope.vm.customFieldVos.push(issueTypeCustomField); }); } // 이슈에서 사용자가 선택한 사용자 정의 필드 값을 입력 폼에 셋팅한다. - 이전/현재 function setUseValueByIssueTypeCustomFields(issueCustomFieldValues, setType) { angular.forEach(issueCustomFieldValues, function (issueCustomFieldValue) { for (var count in $scope.vm.customFieldVos) { var issueCustomField = $scope.vm.customFieldVos[count]; if (issueCustomField.customFieldVo.id === issueCustomFieldValue.customFieldVo.id) { switch (setType) { case "target" : // 멀티셀렉트 일때 if (angular.isArray(issueCustomField.target)) { issueCustomField.target += "" + issueCustomFieldValue.useValue + ""; } else { issueCustomField.target = "" + issueCustomFieldValue.useValue + ""; } break; case "next" : // 멀티셀렉트 일때 if (angular.isArray(issueCustomField.next)) { issueCustomField.next += "" + issueCustomFieldValue.useValue + ""; } else { issueCustomField.next = "" + issueCustomFieldValue.useValue + ""; } break; } break; } } }); } function getTargetIssueVersion(id) { $rootScope.$broadcast("getIssueVersion", {id : id}); } }, link : function (scope, element, attrs) { } }; }]) });