| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you 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. |
| (function($, cloudStack) { |
| |
| cloudStack.uiCustom.metricsView = function(args) { |
| return function(ctxArgs) { |
| |
| var metricsListView = cloudStack.sections.metrics.listView; |
| var metricsLabel = _l('label.metrics'); |
| var context = {}; |
| if (ctxArgs && ctxArgs.hasOwnProperty('context')) { |
| context = ctxArgs.context; |
| } |
| |
| if (args.resource == 'zones') { |
| metricsLabel = _l('label.zones') + ' ' + metricsLabel; |
| metricsListView = cloudStack.sections.metrics.zones.listView; |
| |
| } else if (args.resource == 'clusters') { |
| metricsLabel = _l('label.clusters') + ' ' + metricsLabel; |
| metricsListView = cloudStack.sections.metrics.clusters.listView; |
| |
| } else if (args.resource == 'hosts') { |
| metricsLabel = _l('label.hosts') + ' ' + metricsLabel; |
| metricsListView = cloudStack.sections.metrics.hosts.listView; |
| |
| if (context && !context.filterBy) { |
| if (context.hasOwnProperty('clusters') && context.clusters[0]) { |
| context.filterBy = 'clusterid'; |
| context.id = context.clusters[0].id; |
| } |
| if (context.hasOwnProperty('instances') && context.instances[0]) { |
| context.filterBy = 'virtualmachineid'; |
| context.id = context.instances[0].id; |
| } |
| } |
| } else if (args.resource == 'storagepool') { |
| metricsLabel = _l('label.primary.storage') + ' ' + metricsLabel; |
| metricsListView = cloudStack.sections.metrics.storagepool.listView; |
| |
| } else if (args.resource == 'vms') { |
| metricsLabel = _l('label.instances') + ' ' + metricsLabel; |
| metricsListView = cloudStack.sections.metrics.instances.listView; |
| metricsListView.advSearchFields = cloudStack.sections.instances.listView.advSearchFields; |
| |
| if (context && !context.filterBy) { |
| if (context.hasOwnProperty('hosts') && context.hosts[0]) { |
| context.filterBy = 'hostid'; |
| context.id = context.hosts[0].id; |
| } |
| } |
| } else if (args.resource == 'volumes') { |
| metricsLabel = _l('label.volumes') + ' ' + metricsLabel; |
| metricsListView = cloudStack.sections.metrics.volumes.listView; |
| metricsListView.advSearchFields = cloudStack.sections.storage.sections.volumes.listView.advSearchFields; |
| metricsListView.groupableColumns = false; |
| |
| if (context && !context.filterBy) { |
| if (context.hasOwnProperty('instances') && context.instances[0]) { |
| context.filterBy = 'virtualmachineid'; |
| context.id = context.instances[0].id; |
| } |
| if (context.hasOwnProperty('primarystorages') && context.primarystorages[0]) { |
| context.filterBy = 'storageid'; |
| context.id = context.primarystorages[0].id; |
| } |
| } |
| } |
| |
| if (context.metricsFilterData) { |
| delete context.metricsFilterData; |
| } |
| |
| if (context.filterBy) { |
| context.metricsFilterData = { |
| key: context.filterBy, |
| value: context.id |
| }; |
| } |
| |
| // list view refresh button |
| metricsListView.actions = { |
| refreshMetrics: { |
| label: 'label.refresh', |
| isHeader: true, |
| addRow: true, |
| action: { |
| custom: function (args) { |
| return function() { |
| }; |
| } |
| } |
| } |
| }; |
| |
| metricsListView.hideSearchBar = false; |
| metricsListView.needsRefresh = true; |
| metricsListView.noSplit = true; |
| metricsListView.horizontalOverflow = true; |
| metricsListView.groupableColumns = true; |
| |
| if (args.resource != 'vms' && args.resource != 'volumes' && args.resource != 'zones') { |
| metricsListView.advSearchFields = { |
| name: { |
| label: 'label.name' |
| }, |
| zoneid: { |
| label: 'label.zone', |
| select: function(args) { |
| $.ajax({ |
| url: createURL('listZones'), |
| data: { |
| listAll: true |
| }, |
| success: function(json) { |
| var zones = json.listzonesresponse.zone ? json.listzonesresponse.zone : []; |
| |
| args.response.success({ |
| data: $.map(zones, function(zone) { |
| return { |
| id: zone.id, |
| description: zone.name |
| }; |
| }) |
| }); |
| } |
| }); |
| } |
| } |
| }; |
| } |
| |
| var $browser = $('#browser .container'); |
| return $browser.cloudBrowser('addPanel', { |
| title: metricsLabel, |
| maximizeIfSelected: true, |
| complete: function($newPanel) { |
| $newPanel.listView({ |
| $browser: $browser, |
| context: context, |
| listView: metricsListView |
| }); |
| // Make metrics tables horizontally scrollable |
| $newPanel.find('.list-view').css({'overflow-x': 'visible'}); |
| // Refresh metrics when refresh button is clicked |
| $newPanel.find('.refreshMetrics').click(function() { |
| var sortedTh = $newPanel.find('table thead tr:last th.sorted'); |
| var thIndex = sortedTh.index(); |
| var thClassName = null; |
| var wasSorted = false; |
| var sortClassName = 'asc'; |
| if (sortedTh && sortedTh.hasClass('sorted')) { |
| wasSorted = true; |
| var classes = sortedTh.attr('class').split(/\s+/); |
| thClassName = classes[0]; |
| if (classes.indexOf('desc') > -1) { |
| sortClassName = 'desc'; |
| } |
| } |
| $browser.cloudBrowser('removeLastPanel', {}); |
| var refreshedPanel = cloudStack.uiCustom.metricsView(args)(ctxArgs); |
| if (wasSorted && thClassName) { |
| refreshedPanel.find('th.' + thClassName).filter(function() { |
| return $(this).index() == thIndex; |
| }).addClass('sorted').addClass(sortClassName); |
| } |
| }); |
| |
| var browseBy = metricsListView.browseBy; |
| if (browseBy) { |
| $newPanel.bind('click', function(event) { |
| event.stopPropagation(); |
| var $target = $(event.target); |
| var id = $target.closest('tr').data('list-view-item-id'); |
| var jsonObj = $target.closest('tr').data('jsonObj'); |
| if (browseBy.filterKey && jsonObj) { |
| if (jsonObj.hasOwnProperty(browseBy.filterKey)) { |
| id = jsonObj[browseBy.filterKey]; |
| } else { |
| return; // return if provided key is missing |
| } |
| } |
| if (id && ($target.hasClass('first') || $target.parent().hasClass('first')) && ($target.is('td') || $target.parent().is('td'))) { |
| context.id = id; |
| context.filterBy = browseBy.filterBy; |
| ctxArgs.context = context; |
| cloudStack.uiCustom.metricsView({resource: browseBy.resource})(ctxArgs); |
| } |
| }); |
| } |
| } |
| }); |
| }; |
| }; |
| })(jQuery, cloudStack); |