diff --git a/src/BackofficeMainCtrl.js b/src/BackofficeMainCtrl.js index 48ce33a..81f634a 100644 --- a/src/BackofficeMainCtrl.js +++ b/src/BackofficeMainCtrl.js @@ -35,7 +35,9 @@ $scope.changeLanguage = function (lang_id) { UserService.setUiLanguage(lang_id); - UserProfileService.updateProfile({language:lang_id},function(){}); + UserProfileService.updateProfile({language:lang_id}, function () { + $rootScope.$broadcast('languageChanged'); + }); gettextCatalog.setCurrentLanguage($rootScope.languages[lang_id].code); $rootScope.uiLanguage = $rootScope.languages[lang_id].flag; $scope.updatePaginationLabels(); diff --git a/src/kb/info/BackofficeKbInfoCtrl.js b/src/kb/info/BackofficeKbInfoCtrl.js index f47a4dd..ce20937 100644 --- a/src/kb/info/BackofficeKbInfoCtrl.js +++ b/src/kb/info/BackofficeKbInfoCtrl.js @@ -77,6 +77,7 @@ .controller('BackofficeKbInfoCtrl', [ '$scope', '$stateParams', 'toastr', '$mdMedia', '$mdDialog', 'gettextCatalog', 'TableHelperService', 'AssetService', 'ThreatService', 'VulnService', 'AmvService', 'MeasureService', 'TagService', 'RiskService', 'ObjlibService', '$state', + 'RiskSourceService', '$timeout', '$http', 'DownloadService', '$rootScope', 'SOACategoryService', 'ReferentialService', 'MeasureMeasureService', 'UserService', BackofficeKbInfoCtrl ]); @@ -86,7 +87,7 @@ */ function BackofficeKbInfoCtrl($scope, $stateParams, toastr, $mdMedia, $mdDialog, gettextCatalog, TableHelperService, AssetService, ThreatService, VulnService, AmvService, MeasureService, TagService, RiskService, ObjlibService, - $state, $timeout, $http, DownloadService, $rootScope, SOACategoryService, ReferentialService, + $state, RiskSourceService, $timeout, $http, DownloadService, $rootScope, SOACategoryService, ReferentialService, MeasureMeasureService, UserService) { $scope.tab = $stateParams.tab; @@ -117,18 +118,21 @@ case 'vulns': $scope.currentTabIndex = 2; break; - case 'measures': + case 'risk-sources': $scope.currentTabIndex = 3; break; - case 'categories': + case 'measures': $scope.currentTabIndex = 4; break; - case 'amvs': + case 'categories': $scope.currentTabIndex = 5; break; - case 'objlibs': + case 'amvs': $scope.currentTabIndex = 6; break; + case 'objlibs': + $scope.currentTabIndex = 7; + break; } } $scope.selectTab($scope.tab); @@ -768,6 +772,145 @@ }); }; + /* + * RISK SOURCES TAB + */ + $scope.riskSourcesKb = TableHelperService.build('label', 20, 1, ''); + $scope.riskSourcesKb.activeFilter = 1; + var riskSourcesFilterWatch; + var riskSourcesLanguageWatch; + + $scope.selectRiskSourcesTab = function () { + $state.transitionTo('main.kb_mgmt.info_risk', { + 'tab': 'risk-sources' + }); + var initRiskSourcesFilter = true; + riskSourcesFilterWatch = $scope.$watch('riskSourcesKb.activeFilter', function () { + if (initRiskSourcesFilter) { + initRiskSourcesFilter = false; + } else { + $scope.updateRiskSources(); + } + }); + riskSourcesLanguageWatch = $rootScope.$on('languageChanged', function () { + $scope.updateRiskSources(); + }); + TableHelperService.watchSearch( + $scope, + 'riskSourcesKb.query.filter', + $scope.riskSourcesKb.query, + $scope.updateRiskSources, + $scope.riskSourcesKb + ); + $scope.updateRiskSources(); + }; + + $scope.deselectRiskSourcesTab = function () { + if (riskSourcesFilterWatch) { + riskSourcesFilterWatch(); + } + if (riskSourcesLanguageWatch) { + riskSourcesLanguageWatch(); + } + TableHelperService.unwatchSearch($scope.riskSourcesKb); + }; + + $scope.updateRiskSources = function () { + var query = angular.copy($scope.riskSourcesKb.query); + query.status = $scope.riskSourcesKb.activeFilter; + + if ($scope.riskSourcesKb.previousQueryOrder != $scope.riskSourcesKb.query.order) { + $scope.riskSourcesKb.query.page = query.page = 1; + $scope.riskSourcesKb.previousQueryOrder = $scope.riskSourcesKb.query.order; + } + + $scope.riskSourcesKb.promise = RiskSourceService.getRiskSources(query); + $scope.riskSourcesKb.promise.then(function (data) { + $scope.riskSourcesKb.items = data; + }); + }; + + $scope.removeRiskSourcesFilter = function () { + TableHelperService.removeFilter($scope.riskSourcesKb); + }; + + $scope.openRiskSourceDialog = function (ev, riskSource) { + var showDialog = function (riskSourceData) { + $mdDialog.show({ + controller: ['$scope', '$mdDialog', 'gettextCatalog', '$rootScope', 'riskSource', RiskSourceDialogCtrl], + templateUrl: 'views/create.risk_source.html', + clickOutsideToClose: true, + multiple: true, + targetEvent: ev, + locals: { + riskSource: riskSourceData ? angular.copy(riskSourceData) : null + } + }).then(function (payload) { + if (riskSource) { + payload.id = riskSource.id; + RiskSourceService.updateRiskSource(payload, function () { + $scope.updateRiskSources(); + toastr.success( + gettextCatalog.getString('The risk source has been edited successfully.'), + gettextCatalog.getString('Edition successful') + ); + }); + } else { + RiskSourceService.createRiskSource(payload, function () { + $scope.updateRiskSources(); + toastr.success( + gettextCatalog.getString('The risk source has been created successfully.'), + gettextCatalog.getString('Creation successful') + ); + }); + } + }, function (reject) { + $scope.handleRejectionDialog(reject); + }); + }; + + if (riskSource) { + RiskSourceService.getRiskSource(riskSource.id).then(showDialog); + } else { + showDialog(null); + } + }; + + $scope.toggleRiskSourceStatus = function (riskSource) { + RiskSourceService.updateRiskSource({ + id: riskSource.id, + isActive: !riskSource.isActive + }, function () { + $scope.updateRiskSources(); + }); + }; + + $scope.removeRiskSource = function (ev, riskSource) { + var confirm = $mdDialog.confirm() + .title(gettextCatalog.getString('Are you sure you want to delete risk source?', { + label: riskSource.label + })) + .textContent(gettextCatalog.getString('This operation is irreversible.')) + .targetEvent(ev) + .theme('light') + .ok(gettextCatalog.getString('Delete')) + .cancel(gettextCatalog.getString('Cancel')); + + $mdDialog.show(confirm).then(function () { + RiskSourceService.deleteRiskSource(riskSource.id, function () { + $scope.updateRiskSources(); + toastr.success( + gettextCatalog.getString('The risk source has been deleted.'), + gettextCatalog.getString('Deletion successful') + ); + }, function (error) { + toastr.error(error.data.message, gettextCatalog.getString('Deletion failed')); + }); + }, function (reject) { + $scope.handleRejectionDialog(reject); + }); + }; + /* * REFERENTIALS TAB */ @@ -2695,4 +2838,57 @@ $mdDialog.hide($scope.exportData); }; } + + function RiskSourceDialogCtrl($scope, $mdDialog, gettextCatalog, $rootScope, riskSource) { + var currentLanguageCode = gettextCatalog.getCurrentLanguage(); + + $scope.dialogTitle = gettextCatalog.getString(riskSource ? 'Edit risk source' : 'Add a risk source'); + $scope.confirmLabel = gettextCatalog.getString(riskSource ? 'Save' : 'Create'); + $scope.languages = $rootScope.languages; + $scope.riskSource = riskSource || { + labels: {} + }; + + angular.forEach($scope.languages, function (language) { + if ($scope.riskSource.labels[language.code] === undefined) { + $scope.riskSource.labels[language.code] = riskSource ? riskSource.label : ''; + } + }); + + $scope.cancel = function () { + $mdDialog.cancel(); + }; + + $scope.getPrimaryLabel = function () { + var primaryLabel = ($scope.riskSource.labels[currentLanguageCode] || '').trim(); + if (primaryLabel) { + return primaryLabel; + } + + var labels = Object.values($scope.riskSource.labels); + for (var index = 0; index < labels.length; index++) { + var label = (labels[index] || '').trim(); + if (label) { + return label; + } + } + + return ''; + }; + + $scope.save = function () { + var labels = {}; + angular.forEach($scope.languages, function (language) { + var label = ($scope.riskSource.labels[language.code] || '').trim(); + if (label) { + labels[language.code] = label; + } + }); + + $mdDialog.hide({ + label: $scope.getPrimaryLabel(), + labels: labels + }); + }; + } })(); diff --git a/views/create.risk_source.html b/views/create.risk_source.html new file mode 100644 index 0000000..f525281 --- /dev/null +++ b/views/create.risk_source.html @@ -0,0 +1,31 @@ + +
+ +
+

{{ dialogTitle }}

+ + + close + +
+
+ +
+ + + language + + +
+
+ + + + {{ 'Cancel' | translate }} + + + {{ confirmLabel }} + + +
+
diff --git a/views/info_risk.kb_mgmt.html b/views/info_risk.kb_mgmt.html index 77aafb6..4933b69 100644 --- a/views/info_risk.kb_mgmt.html +++ b/views/info_risk.kb_mgmt.html @@ -221,6 +221,70 @@

md-total="{{vulns.items.count}}" md-on-paginate="updateVulns" md-page-select md-label="{{paginationLabels}}"> + +
+

+ Risk Sources + + + {{ 'Add a risk source' | translate }} + + add_to_photos + +

+ +
+ + + + +
+ + + {{ 'Show all' | translate }} + {{ 'Show inactive only' | translate }} + {{ 'Show active only' | translate }} + + + + settings_backup_restore + Reset filter + +
+ + + + + + + + + + + + + + + + + + + + +
ActiveLabelTypeActions
+ + {{ riskSource.isActive ? 'done' : 'clear' }} + + {{ riskSource.label }}{{ (riskSource.isDefault ? 'Default' : 'Custom') | translate }} + edit + delete +
+
+ + +
+