diff --git a/backend/src/appenlight/static/js/appenlight.js b/backend/src/appenlight/static/js/appenlight.js index 6619726..6588260 100644 --- a/backend/src/appenlight/static/js/appenlight.js +++ b/backend/src/appenlight/static/js/appenlight.js @@ -5369,35 +5369,6 @@ function kickstartAE() { ); - $templateCache.put('templates/directives/rule_read_only.html', - "
\n" + - "\n" + - " \n" + - " {{rule_ctrlr.readOnlyPossibleFields[rule_ctrlr.rule.field]}}\n" + - " \n" + - "\n" + - " \n" + - " is {{rule_ctrlr.ruleDefinitions.allOps[rule_ctrlr.rule.op]}} {{rule_ctrlr.rule.value}}\n" + - " \n" + - "\n" + - " \n" + - "

Subrules

\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" + - " \n" + - " \n" + - " \n" + - "
\n" + - "
\n" + - "
\n" + - "\n" + - "
\n" + - "
\n" - ); - - $templateCache.put('templates/directives/rule.html', "
\n" + "\n" + @@ -5447,6 +5418,35 @@ function kickstartAE() { ); + $templateCache.put('templates/directives/rule_read_only.html', + "
\n" + + "\n" + + " \n" + + " {{rule_ctrlr.readOnlyPossibleFields[rule_ctrlr.rule.field]}}\n" + + " \n" + + "\n" + + " \n" + + " is {{rule_ctrlr.ruleDefinitions.allOps[rule_ctrlr.rule.op]}} {{rule_ctrlr.rule.value}}\n" + + " \n" + + "\n" + + " \n" + + "

Subrules

\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + + " \n" + + " \n" + + " \n" + + "
\n" + + "
\n" + + "
\n" + + "\n" + + "
\n" + + "
\n" + ); + + $templateCache.put('templates/directives/search_type_ahead.html', "\n" + " {{match.model.tag}}\n" + @@ -5791,7 +5791,7 @@ function kickstartAE() { ); - $templateCache.put('templates/reports/list_slow.html', + $templateCache.put('templates/reports/list.html', "\n" + "\n" + "
\n" + @@ -5806,11 +5806,9 @@ function kickstartAE() { " \n" + "

\n" + "\n" + - "

\n" + - "\n" + "

\n" + "
\n" + - " \n" + "
\n" + "\n" + - "\n" + "
\n" + " \n" + "\n" + " \n" + - " \n" + + " \n" + " \n" + " \n" + - " \n" + - " \n" + - " \n" + - " \n" + + " \n" + + " title=\"Tick to see UTC time instead relative\">\n" + + " \n" + " \n" + " \n" + " \n" + @@ -5859,26 +5855,24 @@ function kickstartAE() { " {{report.group.occurences|numberToThousands}}\n" + " \n" + " \n" + - " \n" + - " \n" + - " \n" + - " \n" + - " \n" + + " \n" + " \n" + "\n" + " \n" + "
Slow Request ReportsReports
#Avg. durationApplicationWhen #\n" + + " ApplicationWhen \n" + - " LocationError
{{report.group.average_duration.toFixed(3)}}s\n" + + " \n" + "
{{report.resource_name}}
\n" + " @{{report.tags.server_name}}
\n" + + " \n" + " \n" + " \n" + " {{report.group.last_timestamp.replace('T', ' ').slice(0,16)}}\n" + " \n" + - " {{ report.tags.view_name || report.url_path}} {{report.error || 'Unknown Exception'}}
\n" + + " {{ report.tags.view_name || report.url_path}}
\n" + - "\n" + "
\n" + "\n" + + "\n" + "
\n" + " \n" + "\n" + "
\n" + @@ -5905,9 +5899,11 @@ function kickstartAE() { " \n" + "

\n" + "\n" + + "

\n" + + "\n" + " \n" + "

\n" + - " \n" + "
\n" + "\n" + + "\n" + "
\n" + " \n" + "\n" + " \n" + - " \n" + + " \n" + " \n" + " \n" + - " \n" + - " \n" + - " \n" + + " \n" + + " \n" + + " title=\"Tick to see UTC time instead relative\">\n" + + " \n" + " \n" + " \n" + " \n" + @@ -5954,23 +5952,25 @@ function kickstartAE() { " {{report.group.occurences|numberToThousands}}\n" + " \n" + " \n" + - " \n" + + " \n" + - " \n" + - " \n" + + " \n" + + " \n" + " \n" + "\n" + " \n" + "
ReportsSlow Request Reports
#ApplicationWhen #\n" + + " Avg. durationApplicationWhen \n" + - " ErrorLocation
\n" + + " {{report.group.average_duration.toFixed(3)}}s\n" + "
{{report.resource_name}}
\n" + " @{{report.tags.server_name}}
\n" + + " \n" + " \n" + " \n" + " {{report.group.last_timestamp.replace('T', ' ').slice(0,16)}}\n" + " {{report.error || 'Unknown Exception'}}
\n" + - " {{ report.tags.view_name || report.url_path}}
\n" + + " {{ report.tags.view_name || report.url_path}}
\n" + - "
\n" + "\n" + + "
\n" + "\n" + "
\n" + " \n" + "\n" + "
\n" + + "
\n" + " 2\">\n" + " Go back\n" + " Yes\n" + " \n" + "\n" + + "
\n" + "
\n" + "\n" + "
\n" + @@ -6512,6 +6514,11 @@ function kickstartAE() { ); + $templateCache.put('templates/user/alert_channels.html', + "" + ); + + $templateCache.put('templates/user/alert_channels_email.html', "\n" + "\n" + @@ -6613,11 +6620,6 @@ function kickstartAE() { ); - $templateCache.put('templates/user/alert_channels.html', - "" - ); - - $templateCache.put('templates/user/auth_tokens.html', "\n" + "\n" + @@ -6768,6 +6770,11 @@ function kickstartAE() { ); + $templateCache.put('templates/user/profile.html', + "" + ); + + $templateCache.put('templates/user/profile_edit.html', "\n" + "\n" + @@ -6969,11 +6976,6 @@ function kickstartAE() { "
\n" ); - - $templateCache.put('templates/user/profile.html', - "" - ); - }]); ;// # Copyright (C) 2010-2016 RhodeCode GmbH @@ -9619,20 +9621,17 @@ function AssignReportCtrl($uibModalInstance, reportGroupPropertyResource, report // # services, and proprietary license terms, please see // # https://rhodecode.com/licenses/ -'use strict'; - -/* Controllers */ - angular.module('appenlight.controllers') - .controller('ReportsListSlowController', ReportsListSlowController); + .controller('ReportsListController', ReportsListController); -ReportsListSlowController.$inject = ['$scope', '$location', '$cookies', - 'stateHolder', 'typeAheadTagHelper', 'slowReportsResource', 'AeUser'] +ReportsListController.$inject = ['$scope', '$location', '$cookies', + 'stateHolder', 'typeAheadTagHelper', 'reportsResource', 'AeUser']; -function ReportsListSlowController($scope, $location, $cookies, stateHolder, typeAheadTagHelper, slowReportsResource, AeUser) { +function ReportsListController($scope, $location, $cookies, stateHolder, + typeAheadTagHelper, reportsResource, AeUser) { var vm = this; vm.applications = AeUser.applications_map; - stateHolder.section = 'slow_reports'; + stateHolder.section = 'reports'; vm.today = function () { vm.pickerDate = new Date(); }; @@ -9641,23 +9640,30 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ vm.itemCount = 0; vm.itemsPerPage = 250; typeAheadTagHelper.tags = []; - vm.searchParams = {tags: [], page: 1, type: 'slow_report'}; + vm.searchParams = {tags: [], page: 1, type: 'report'}; vm.searchParams = parseSearchToTags($location.search()); vm.is_loading = false; vm.filterTypeAheadOptions = [ { + type: 'error', + text: 'error:', + 'description': 'Full-text search in your reports', + example: 'error:text-im-looking-for', + tag: 'Error' + }, + { type: 'view_name', text: 'view_name:', 'description': 'Query reports occured in specific views', - tag: 'View Name', - example: "view_name:module.foo" + example: "view_name:module.foo", + tag: 'View Name' }, { type: 'resource', text: 'resource:', 'description': 'Restrict resultset to application', - tag: 'Application', - example: "resource:ID" + example: "resource:ID", + tag: 'Application' }, { type: 'priority', @@ -9671,14 +9677,7 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ text: 'min_occurences:', 'description': 'Show reports from groups with at least X occurences', example: 'min_occurences:25', - tag: 'Min. occurences' - }, - { - type: 'min_duration', - text: 'min_duration:', - 'description': 'Show reports from groups with average duration >= Xs', - example: 'min_duration:4.5', - tag: 'Min. duration' + tag: 'Occurences' }, { type: 'url_path', @@ -9695,13 +9694,6 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ tag: 'Domain' }, { - type: 'request_id', - text: 'request_id:', - 'description': 'Show reports with specific request id', - example: "request_id:883143dc572e4c38aceae92af0ea5ae0", - tag: 'Request ID' - }, - { type: 'report_status', text: 'report_status:', 'description': 'Show reports from groups with specific status', @@ -9709,6 +9701,13 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ tag: 'Status' }, { + type: 'request_id', + text: 'request_id:', + 'description': 'Show reports with specific request id', + example: "request_id:883143dc572e4c38aceae92af0ea5ae0", + tag: 'Request ID' + }, + { type: 'server_name', text: 'server_name:', 'description': 'Show reports tagged with this key/value pair', @@ -9716,6 +9715,27 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ tag: 'Tag' }, { + type: 'http_status', + text: 'http_status:', + 'description': 'Show reports with specific HTTP status code', + example: "http_status:", + tag: 'HTTP Status' + }, + { + type: 'http_status', + text: 'http_status:500', + 'description': 'Show reports with specific HTTP status code', + example: "http_status:500", + tag: 'HTTP Status' + }, + { + type: 'http_status', + text: 'http_status:404', + 'description': 'Include 404 reports in your search', + example: "http_status:404", + tag: 'HTTP Status' + }, + { type: 'start_date', text: 'start_date:', 'description': 'Show reports newer than this date (press TAB for dropdown)', @@ -9733,6 +9753,7 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ vm.filterTypeAhead = undefined; vm.showDatePicker = false; + vm.manualOpen = false; vm.aheadFilter = typeAheadTagHelper.aheadFilter; vm.removeSearchTag = function (tag) { $location.search(tag.type, null); @@ -9740,16 +9761,14 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ vm.addSearchTag = function (tag) { $location.search(tag.type, tag.value); }; - vm.manualOpen = false; vm.notRelativeTime = false; if ($cookies.notRelativeTime) { vm.notRelativeTime = JSON.parse($cookies.notRelativeTime); } - vm.changeRelativeTime = function () { $cookies.notRelativeTime = JSON.stringify(vm.notRelativeTime); - }; + } _.each(_.range(1, 11), function (priority) { vm.filterTypeAheadOptions.push({ @@ -9779,15 +9798,19 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ }); }); + vm.paginationChange = function(){ + $location.search('page', vm.searchParams.page); + }; + vm.typeAheadTag = function (event) { var text = vm.filterTypeAhead; if (_.isObject(vm.filterTypeAhead)) { text = vm.filterTypeAhead.text; } - ; if (!vm.filterTypeAhead) { return } + var parsed = text.split(':'); var tag = {'type': null, 'value': null}; // app tags have : twice @@ -9803,6 +9826,10 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ tag.value = tagValue.join(':'); } } + else { + tag.type = 'error'; + tag.value = parsed.join(':'); + } // set datepicker hour based on type of field if ('start_date:' == text) { @@ -9824,10 +9851,6 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ vm.filterTypeAhead = undefined; } - vm.paginationChange = function(){ - $location.search('page', vm.searchParams.page); - } - vm.pickerDateChanged = function(){ if (vm.filterTypeAhead.indexOf('start_date:') == '0') { vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format(); @@ -9836,7 +9859,7 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format(); } vm.showDatePicker = false; - } + }; var reportPresentation = function (report) { report.presentation = {}; @@ -9857,11 +9880,11 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ report.presentation.tooltip = 'New'; } return report; - } + }; vm.fetchReports = function (searchParams) { vm.is_loading = true; - slowReportsResource.query(searchParams, function (data, getResponseHeaders) { + reportsResource.query(searchParams, function (data, getResponseHeaders) { var headers = getResponseHeaders(); vm.is_loading = false; @@ -9873,15 +9896,15 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ }, function () { vm.is_loading = false; }); - } + }; vm.filterId = function (log) { vm.searchParams.tags.push({ type: "request_id", value: log.request_id }); - } - //initial load + }; + // initial load var params = parseTagsToSearch(vm.searchParams); vm.fetchReports(params); @@ -9894,6 +9917,7 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ vm.fetchReports(params); } + }); @@ -9918,17 +9942,20 @@ function ReportsListSlowController($scope, $location, $cookies, stateHolder, typ // # services, and proprietary license terms, please see // # https://rhodecode.com/licenses/ +'use strict'; + +/* Controllers */ + angular.module('appenlight.controllers') - .controller('ReportsListController', ReportsListController); + .controller('ReportsListSlowController', ReportsListSlowController); -ReportsListController.$inject = ['$scope', '$location', '$cookies', - 'stateHolder', 'typeAheadTagHelper', 'reportsResource', 'AeUser']; +ReportsListSlowController.$inject = ['$scope', '$location', '$cookies', + 'stateHolder', 'typeAheadTagHelper', 'slowReportsResource', 'AeUser'] -function ReportsListController($scope, $location, $cookies, stateHolder, - typeAheadTagHelper, reportsResource, AeUser) { +function ReportsListSlowController($scope, $location, $cookies, stateHolder, typeAheadTagHelper, slowReportsResource, AeUser) { var vm = this; vm.applications = AeUser.applications_map; - stateHolder.section = 'reports'; + stateHolder.section = 'slow_reports'; vm.today = function () { vm.pickerDate = new Date(); }; @@ -9937,30 +9964,23 @@ function ReportsListController($scope, $location, $cookies, stateHolder, vm.itemCount = 0; vm.itemsPerPage = 250; typeAheadTagHelper.tags = []; - vm.searchParams = {tags: [], page: 1, type: 'report'}; + vm.searchParams = {tags: [], page: 1, type: 'slow_report'}; vm.searchParams = parseSearchToTags($location.search()); vm.is_loading = false; vm.filterTypeAheadOptions = [ { - type: 'error', - text: 'error:', - 'description': 'Full-text search in your reports', - example: 'error:text-im-looking-for', - tag: 'Error' - }, - { type: 'view_name', text: 'view_name:', 'description': 'Query reports occured in specific views', - example: "view_name:module.foo", - tag: 'View Name' + tag: 'View Name', + example: "view_name:module.foo" }, { type: 'resource', text: 'resource:', 'description': 'Restrict resultset to application', - example: "resource:ID", - tag: 'Application' + tag: 'Application', + example: "resource:ID" }, { type: 'priority', @@ -9974,7 +9994,14 @@ function ReportsListController($scope, $location, $cookies, stateHolder, text: 'min_occurences:', 'description': 'Show reports from groups with at least X occurences', example: 'min_occurences:25', - tag: 'Occurences' + tag: 'Min. occurences' + }, + { + type: 'min_duration', + text: 'min_duration:', + 'description': 'Show reports from groups with average duration >= Xs', + example: 'min_duration:4.5', + tag: 'Min. duration' }, { type: 'url_path', @@ -9991,13 +10018,6 @@ function ReportsListController($scope, $location, $cookies, stateHolder, tag: 'Domain' }, { - type: 'report_status', - text: 'report_status:', - 'description': 'Show reports from groups with specific status', - example: 'report_status:never_reviewed', - tag: 'Status' - }, - { type: 'request_id', text: 'request_id:', 'description': 'Show reports with specific request id', @@ -10005,6 +10025,13 @@ function ReportsListController($scope, $location, $cookies, stateHolder, tag: 'Request ID' }, { + type: 'report_status', + text: 'report_status:', + 'description': 'Show reports from groups with specific status', + example: 'report_status:never_reviewed', + tag: 'Status' + }, + { type: 'server_name', text: 'server_name:', 'description': 'Show reports tagged with this key/value pair', @@ -10012,27 +10039,6 @@ function ReportsListController($scope, $location, $cookies, stateHolder, tag: 'Tag' }, { - type: 'http_status', - text: 'http_status:', - 'description': 'Show reports with specific HTTP status code', - example: "http_status:", - tag: 'HTTP Status' - }, - { - type: 'http_status', - text: 'http_status:500', - 'description': 'Show reports with specific HTTP status code', - example: "http_status:500", - tag: 'HTTP Status' - }, - { - type: 'http_status', - text: 'http_status:404', - 'description': 'Include 404 reports in your search', - example: "http_status:404", - tag: 'HTTP Status' - }, - { type: 'start_date', text: 'start_date:', 'description': 'Show reports newer than this date (press TAB for dropdown)', @@ -10050,7 +10056,6 @@ function ReportsListController($scope, $location, $cookies, stateHolder, vm.filterTypeAhead = undefined; vm.showDatePicker = false; - vm.manualOpen = false; vm.aheadFilter = typeAheadTagHelper.aheadFilter; vm.removeSearchTag = function (tag) { $location.search(tag.type, null); @@ -10058,14 +10063,16 @@ function ReportsListController($scope, $location, $cookies, stateHolder, vm.addSearchTag = function (tag) { $location.search(tag.type, tag.value); }; + vm.manualOpen = false; vm.notRelativeTime = false; if ($cookies.notRelativeTime) { vm.notRelativeTime = JSON.parse($cookies.notRelativeTime); } + vm.changeRelativeTime = function () { $cookies.notRelativeTime = JSON.stringify(vm.notRelativeTime); - } + }; _.each(_.range(1, 11), function (priority) { vm.filterTypeAheadOptions.push({ @@ -10095,19 +10102,15 @@ function ReportsListController($scope, $location, $cookies, stateHolder, }); }); - vm.paginationChange = function(){ - $location.search('page', vm.searchParams.page); - }; - vm.typeAheadTag = function (event) { var text = vm.filterTypeAhead; if (_.isObject(vm.filterTypeAhead)) { text = vm.filterTypeAhead.text; } + ; if (!vm.filterTypeAhead) { return } - var parsed = text.split(':'); var tag = {'type': null, 'value': null}; // app tags have : twice @@ -10123,10 +10126,6 @@ function ReportsListController($scope, $location, $cookies, stateHolder, tag.value = tagValue.join(':'); } } - else { - tag.type = 'error'; - tag.value = parsed.join(':'); - } // set datepicker hour based on type of field if ('start_date:' == text) { @@ -10148,6 +10147,10 @@ function ReportsListController($scope, $location, $cookies, stateHolder, vm.filterTypeAhead = undefined; } + vm.paginationChange = function(){ + $location.search('page', vm.searchParams.page); + } + vm.pickerDateChanged = function(){ if (vm.filterTypeAhead.indexOf('start_date:') == '0') { vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format(); @@ -10156,7 +10159,7 @@ function ReportsListController($scope, $location, $cookies, stateHolder, vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format(); } vm.showDatePicker = false; - }; + } var reportPresentation = function (report) { report.presentation = {}; @@ -10177,11 +10180,11 @@ function ReportsListController($scope, $location, $cookies, stateHolder, report.presentation.tooltip = 'New'; } return report; - }; + } vm.fetchReports = function (searchParams) { vm.is_loading = true; - reportsResource.query(searchParams, function (data, getResponseHeaders) { + slowReportsResource.query(searchParams, function (data, getResponseHeaders) { var headers = getResponseHeaders(); vm.is_loading = false; @@ -10193,15 +10196,15 @@ function ReportsListController($scope, $location, $cookies, stateHolder, }, function () { vm.is_loading = false; }); - }; + } vm.filterId = function (log) { vm.searchParams.tags.push({ type: "request_id", value: log.request_id }); - }; - // initial load + } + //initial load var params = parseTagsToSearch(vm.searchParams); vm.fetchReports(params); @@ -10214,7 +10217,6 @@ function ReportsListController($scope, $location, $cookies, stateHolder, vm.fetchReports(params); } - }); @@ -11838,50 +11840,6 @@ angular.module('appenlight.directives.reportAlertAction', []).directive('reportA // # services, and proprietary license terms, please see // # https://rhodecode.com/licenses/ -angular.module('appenlight.directives.ruleReadOnly', []).directive('ruleReadOnly', ['userSelfPropertyResource', function (userSelfPropertyResource) { - return { - scope: {}, - bindToController:{ - parentObj: '=', - rule: '=', - ruleDefinitions: '=', - parentRule: "=", - config: "=" - }, - restrict: 'E', - templateUrl: 'templates/directives/rule_read_only.html', - controller:RuleController, - controllerAs:'rule_ctrlr' - } - function RuleController(){ - var vm = this; - vm.readOnlyPossibleFields = {}; - var labelPairs = _.pairs(vm.parentObj.config); - _.each(labelPairs, function (entry) { - vm.readOnlyPossibleFields[entry[0]] = entry[1].human_label; - }); - } -}]); - -;// # Copyright (C) 2010-2016 RhodeCode GmbH -// # -// # This program is free software: you can redistribute it and/or modify -// # it under the terms of the GNU Affero General Public License, version 3 -// # (only), as published by the Free Software Foundation. -// # -// # This program is distributed in the hope that it will be useful, -// # but WITHOUT ANY WARRANTY; without even the implied warranty of -// # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// # GNU General Public License for more details. -// # -// # You should have received a copy of the GNU Affero General Public License -// # along with this program. If not, see . -// # -// # This program is dual-licensed. If you wish to learn more about the -// # App Enlight Enterprise Edition, including its added features, Support -// # services, and proprietary license terms, please see -// # https://rhodecode.com/licenses/ - angular.module('appenlight.directives.rule', []).directive('rule', function () { return { scope: {}, @@ -11968,6 +11926,50 @@ angular.module('appenlight.directives.rule', []).directive('rule', function () { // # services, and proprietary license terms, please see // # https://rhodecode.com/licenses/ +angular.module('appenlight.directives.ruleReadOnly', []).directive('ruleReadOnly', ['userSelfPropertyResource', function (userSelfPropertyResource) { + return { + scope: {}, + bindToController:{ + parentObj: '=', + rule: '=', + ruleDefinitions: '=', + parentRule: "=", + config: "=" + }, + restrict: 'E', + templateUrl: 'templates/directives/rule_read_only.html', + controller:RuleController, + controllerAs:'rule_ctrlr' + } + function RuleController(){ + var vm = this; + vm.readOnlyPossibleFields = {}; + var labelPairs = _.pairs(vm.parentObj.config); + _.each(labelPairs, function (entry) { + vm.readOnlyPossibleFields[entry[0]] = entry[1].human_label; + }); + } +}]); + +;// # Copyright (C) 2010-2016 RhodeCode GmbH +// # +// # This program is free software: you can redistribute it and/or modify +// # it under the terms of the GNU Affero General Public License, version 3 +// # (only), as published by the Free Software Foundation. +// # +// # This program is distributed in the hope that it will be useful, +// # but WITHOUT ANY WARRANTY; without even the implied warranty of +// # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// # GNU General Public License for more details. +// # +// # You should have received a copy of the GNU Affero General Public License +// # along with this program. If not, see . +// # +// # This program is dual-licensed. If you wish to learn more about the +// # App Enlight Enterprise Edition, including its added features, Support +// # services, and proprietary license terms, please see +// # https://rhodecode.com/licenses/ + angular.module('appenlight.directives.smallReportGroupList',[]). directive('smallReportGroupList', [function () { return { diff --git a/frontend/src/templates/reports/view.html b/frontend/src/templates/reports/view.html index 52c4e5c..070ef69 100644 --- a/frontend/src/templates/reports/view.html +++ b/frontend/src/templates/reports/view.html @@ -95,6 +95,7 @@