// Copyright 2010 - 2017 RhodeCode GmbH and the AppEnlight project authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. angular.module('appenlight.components.reportsBrowserView', []) .component('reportsBrowserView', { templateUrl: 'components/views/reports-browser-view/reports-browser-view.html', controller: reportsBrowserViewController }); reportsBrowserViewController.$inject = ['$location', '$cookies', 'stateHolder', 'typeAheadTagHelper', 'reportsResource']; function reportsBrowserViewController($location, $cookies, stateHolder, typeAheadTagHelper, reportsResource) { var vm = this; vm.$onInit = function () { vm.applications = stateHolder.AeUser.applications_map; stateHolder.section = 'reports'; vm.today = function () { vm.pickerDate = new Date(); }; vm.today(); vm.reportsPage = []; vm.page = 1; vm.itemCount = 0; vm.itemsPerPage = 250; typeAheadTagHelper.tags = []; vm.searchParams = {tags: [], page: 1, type: 'report'}; 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' }, { type: 'resource', text: 'resource:', 'description': 'Restrict resultset to application', example: "resource:ID", tag: 'Application' }, { type: 'priority', text: 'priority:', 'description': 'Show reports with specific priority', example: 'priority:8', tag: 'Priority' }, { type: 'min_occurences', text: 'min_occurences:', 'description': 'Show reports from groups with at least X occurences', example: 'min_occurences:25', tag: 'Occurences' }, { type: 'url_path', text: 'url_path:', 'description': 'Show reports from specific URL paths', example: 'url_path:/foo/bar/baz', tag: 'Url Path' }, { type: 'url_domain', text: 'url_domain:', 'description': 'Show reports from specific domain', example: 'url_domain:domain.com', 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', example: "request_id:883143dc572e4c38aceae92af0ea5ae0", tag: 'Request ID' }, { type: 'server_name', text: 'server_name:', 'description': 'Show reports tagged with this key/value pair', example: 'server_name:hostname', 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)', example: 'start_date:2014-08-15T13:00', tag: 'Start Date' }, { type: 'end_date', text: 'end_date:', 'description': 'Show reports older than this date (press TAB for dropdown)', example: 'start_date:2014-08-15T23:59', tag: 'End Date' } ]; vm.filterTypeAhead = undefined; vm.showDatePicker = false; vm.manualOpen = false; vm.aheadFilter = typeAheadTagHelper.aheadFilter; vm.notRelativeTime = false; if ($cookies.notRelativeTime) { vm.notRelativeTime = JSON.parse($cookies.notRelativeTime); } _.each(_.range(1, 11), function (priority) { vm.filterTypeAheadOptions.push({ type: 'priority', text: 'priority:' + priority.toString(), description: 'Show entries with specific priority', example: 'priority:' + priority, tag: 'Priority' }); }); _.each(['never_reviewed', 'reviewed', 'fixed', 'public'], function (status) { vm.filterTypeAheadOptions.push({ type: 'report_status', text: 'report_status:' + status, 'description': 'Show only reports with this status', example: 'report_status:' + status, tag: 'Status ' + status.toUpperCase() }); }); _.each(stateHolder.AeUser.applications, function (item) { vm.filterTypeAheadOptions.push({ type: 'resource', text: 'resource:' + item.resource_id + ':' + item.resource_name, example: 'resource:' + item.resource_id, 'tag': item.resource_name, 'description': 'Restrict resultset to this application' }); }); // initial load vm.refresh(); } vm.removeSearchTag = function (tag) { $location.search(tag.type, null); vm.refresh(); }; vm.addSearchTag = function (tag) { $location.search(tag.type, tag.value); vm.refresh(); }; vm.changeRelativeTime = function () { $cookies.notRelativeTime = JSON.stringify(vm.notRelativeTime); }; vm.paginationChange = function () { $location.search('page', vm.page); vm.refresh(); }; 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 if (parsed.length > 2 && parsed[0] == 'resource') { tag.type = 'resource'; tag.value = parsed[1]; } // normal tag:value else if (parsed.length > 1) { tag.type = parsed[0]; var tagValue = parsed.slice(1); if (tagValue) { tag.value = tagValue.join(':'); } } else { tag.type = 'error'; tag.value = parsed.join(':'); } // set datepicker hour based on type of field if ('start_date:' == text) { vm.showDatePicker = true; vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format(); } else if ('end_date:' == text) { vm.showDatePicker = true; vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format(); } if (event.keyCode != 13 || !tag.type || !tag.value) { return } vm.showDatePicker = false; // aka we selected one of main options vm.addSearchTag({type: tag.type, value: tag.value}); // clear typeahead vm.filterTypeAhead = undefined; }; vm.pickerDateChanged = function () { if (vm.filterTypeAhead.indexOf('start_date:') == '0') { vm.filterTypeAhead = 'start_date:' + moment(vm.pickerDate).utc().format(); } else if (vm.filterTypeAhead.indexOf('end_date:') == '0') { vm.filterTypeAhead = 'end_date:' + moment(vm.pickerDate).utc().hour(23).minute(59).format(); } vm.showDatePicker = false; }; var reportPresentation = function (report) { report.presentation = {}; if (report.group.public) { report.presentation.className = 'public'; report.presentation.tooltip = 'Public'; } else if (report.group.fixed) { report.presentation.className = 'fixed'; report.presentation.tooltip = 'Fixed'; } else if (report.group.read) { report.presentation.className = 'reviewed'; report.presentation.tooltip = 'Reviewed'; } else { report.presentation.className = 'new'; report.presentation.tooltip = 'New'; } return report; }; vm.fetchReports = function (searchParams) { vm.is_loading = true; reportsResource.query(searchParams, function (data, getResponseHeaders) { var headers = getResponseHeaders(); console.log(headers); vm.is_loading = false; vm.reportsPage = _.map(data, function (item) { return reportPresentation(item); }); vm.itemCount = headers['x-total-count']; vm.itemsPerPage = headers['x-items-per-page']; }, function () { vm.is_loading = false; }); }; vm.filterId = function (log) { vm.searchParams.tags.push({ type: "request_id", value: log.request_id }); vm.refresh(); }; vm.refresh = function () { vm.searchParams = parseSearchToTags($location.search()); vm.page = Number(vm.searchParams.page) || 1; var params = parseTagsToSearch(vm.searchParams); console.log(params); vm.fetchReports(params); }; }