| // 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.dashboard = function() { | |
| /** | |
| * Retrieve chart data | |
| */ | |
| var getData = function() { | |
| // Populate data | |
| $dashboard.find('[data-item]').hide(); | |
| cloudStack.sections.dashboard[dashboardType].dataProvider({ | |
| response: { | |
| success: function(args) { | |
| var $browser = $dashboard.closest('#browser .container'); | |
| var data = args.data; | |
| // Iterate over data; populate corresponding DOM elements | |
| $.each(data, function(key, value) { | |
| var $elem = $dashboard.find('[data-item=' + key + ']'); | |
| // This assumes an array of data | |
| if ($elem.is('ul')) { | |
| $elem.show(); | |
| var $liTmpl = $elem.find('li').remove(); | |
| $(value).each(function() { | |
| var item = this; | |
| var $li = $liTmpl.clone().appendTo($elem).hide(); | |
| if ($li.is('.zone-stats li')) { | |
| $li.click(function() { | |
| $browser.cloudBrowser('addPanel', { | |
| title: _l('label.zone.details'), | |
| parent: $dashboard.closest('.panel'), | |
| maximizeIfSelected: true, | |
| complete: function($newPanel) { | |
| $newPanel.detailView($.extend(true, {}, | |
| cloudStack.sections.dashboard.admin.zoneDetailView, | |
| { | |
| $browser: $browser, | |
| context: $.extend(true, {}, cloudStack.context, { | |
| physicalResources: [{ id: item.zoneID }] | |
| }) | |
| } | |
| )); | |
| } | |
| }); | |
| }); | |
| } | |
| $.each(item, function(arrayKey, arrayValue) { | |
| if (!arrayValue) arrayValue = ''; | |
| var $arrayElem = $li.find('[data-list-item=' + arrayKey + ']'); | |
| $arrayElem.each(function() { | |
| var $arrayElem = $(this); | |
| if ($arrayElem.hasClass('pie-chart')) { | |
| // Generate pie chart | |
| // -- values above 80 have a red color | |
| setTimeout(function() { | |
| pieChart($arrayElem, [ | |
| { data: [[1, 100 - arrayValue]], color: '#54697e' }, | |
| { data: [[1, arrayValue]], color: arrayValue < 80 ? 'orange' : 'red' } | |
| ]); | |
| }); | |
| } else { | |
| if ($li.attr('concat-value')) { | |
| var val = $(_l(arrayValue).toString().split(', ')).map(function() { | |
| var val = _s(this.toString()); | |
| var concatValue = parseInt($li.attr('concat-value')); | |
| return val.length >= concatValue ? | |
| val.substring(0, concatValue).concat('...') : val; | |
| }).toArray().join('<br />'); | |
| $arrayElem.html(val); | |
| } else { | |
| $arrayElem.html(_s(_l(arrayValue))); | |
| } | |
| $arrayElem.attr('title', _l(arrayValue).toString().replace('<br/>', ', ')); | |
| } | |
| }); | |
| }); | |
| $li.attr({ title: _s(_l(item.description)) }); | |
| $li.fadeIn(); | |
| }); | |
| } else { | |
| $elem.each(function() { | |
| var $item = $(this); | |
| if ($item.hasClass('chart-line')) { | |
| $item.show().animate({ width: value + '%' }); | |
| } else { | |
| $item.hide().html(_s(value)).fadeIn(); | |
| } | |
| }); | |
| } | |
| }); | |
| } | |
| } | |
| }); | |
| }; | |
| /** | |
| * Render circular pie chart, without labels | |
| */ | |
| var pieChart = function($container, data) { | |
| $container.css({ width: 70, height: 66 }); | |
| $.plot($container, data, { | |
| width: 100, | |
| height: 100, | |
| series: { | |
| pie: { | |
| innerRadius: 0.7, | |
| show: true, | |
| label: { | |
| show: false | |
| } | |
| } | |
| }, | |
| legend: { | |
| show: false | |
| } | |
| }); | |
| }; | |
| // Determine if user or admin dashboard should be shown | |
| var dashboardType = cloudStack.sections.dashboard.adminCheck({ | |
| context: cloudStack.context | |
| }) ? 'admin' : 'user'; | |
| // Get dashboard layout | |
| var $dashboard = $('#template').find('div.dashboard.' + dashboardType).clone(); | |
| // Update text | |
| $dashboard.find('.button.view-all').html(_l('label.view.all')); | |
| $dashboard.find('.dashboard-container.sub.alerts.first .top .title span').html(_l('label.general.alerts')); | |
| $dashboard.find('.dashboard-container.sub.alerts.last .top .title span').html(_l('label.host.alerts')); | |
| $dashboard.find('.dashboard-container.head .top .title span').html(_l('label.system.capacity')); | |
| // View all action | |
| $dashboard.find('.view-all').click(function() { | |
| var $browser = $('#browser .container'); | |
| if ($(this).hasClass('network')) $('#navigation li.network').click(); | |
| else { | |
| $browser.cloudBrowser('addPanel', { | |
| title: $dashboard.hasClass('admin') ? 'Alerts' : 'Events', | |
| maximizeIfSelected: true, | |
| complete: function($newPanel) { | |
| $newPanel.listView({ | |
| $browser: $browser, | |
| context: cloudStack.context, | |
| listView: $dashboard.hasClass('admin') ? | |
| cloudStack.sections.events.sections.alerts.listView : | |
| cloudStack.sections.events.sections.events.listView // Users cannot see events | |
| }); | |
| } | |
| }); | |
| }; | |
| }); | |
| //Fetch Latest action | |
| $dashboard.find('.fetch-latest').click(function() { | |
| window.fetchLatestflag = 1; | |
| var $browser = $('#browser .container'); | |
| if ($(this).hasClass('fetch-latest')) $('#navigation li.dashboard').click(); | |
| }); | |
| getData(); | |
| return $dashboard; | |
| }; | |
| }(jQuery, cloudStack)); |