diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/apis/stats-api.jag b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/apis/stats-api.jag index edca127d..55932fbd 100644 --- a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/apis/stats-api.jag +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/apis/stats-api.jag @@ -35,46 +35,50 @@ var stats = {}; var deviceId; var deviceType; -var server = require('store').server; -var user = server.current(session).um; +var responseProcessor = require('utils').response; +response.contentType = 'application/json'; -log.info(server); -log.info(session); -log.info(user); +var server = require('store').server; +var user = server.current(session); -if (uriMatcher.match("/{context}/apis/stats")) { +if (!user) { + response = responseProcessor.buildErrorResponse(response, 401, "Unauthorized"); +} else { + user = user.um; + if (uriMatcher.match("/{context}/apis/stats")) { - deviceId = request.getParameter("deviceId"); - deviceType = request.getParameter("deviceType"); + deviceId = request.getParameter("deviceId"); + deviceType = request.getParameter("deviceType"); - getDeviceData(deviceType, deviceId); + getDeviceData(deviceType, deviceId); -}else if (uriMatcher.match("/{context}/apis/stats/group")){ - var groupId = request.getParameter("groupId"); + } else if (uriMatcher.match("/{context}/apis/stats/group")) { + var groupId = request.getParameter("groupId"); - //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/device/all - var endPoint = deviceCloudGroupService + "/group/id/" + groupId + "/device/all"; - var data = {"username": user.username}; - var devices = get(endPoint, data, "json"); + //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/device/all + var endPoint = deviceCloudGroupService + "/group/id/" + groupId + "/device/all"; + var data = {"username": user.username}; + var devices = get(endPoint, data, "json").data; - for (var device in devices.data){ - deviceId = devices.data[device].deviceIdentifier; - deviceType = devices.data[device].type; - getDeviceData(deviceType, deviceId); + for (var device in devices) { + deviceId = devices[device].deviceIdentifier; + deviceType = devices[device].type; + getDeviceData(deviceType, deviceId); + } } -} -// returning the result. -if (stats) { - print(stats); + // returning the result. + if (stats) { + print(stats); + } } -function getDeviceData(deviceType, deviceId){ +function getDeviceData(deviceType, deviceId) { //URL: GET https://localhost:9443/devicecloud/group_manager/group/id/{groupId}/device/all var endPoint = deviceCloudDeviceService + "/devices/" + deviceType + "/" + deviceId; var data = {"username": user.username}; var device = get(endPoint, data, "json").data; - if (!device){ + if (!device) { return; } var uname = device.enrolmentInfo.owner; @@ -103,35 +107,47 @@ function getDeviceData(deviceType, deviceId){ } function getFireAlarmData(user, device, from, to) { - if (stats['temperatureData'] == null){ + if (stats['temperatureData'] == null) { stats['temperatureData'] = []; } - if (stats['sonarData'] == null){ + if (stats['sonarData'] == null) { stats['sonarData'] = []; } - if (stats['motionData'] == null){ + if (stats['motionData'] == null) { stats['motionData'] = []; } - if (stats['lightData'] == null){ + if (stats['lightData'] == null) { stats['lightData'] = []; } - stats['temperatureData'].push({"device": device.name, "stats" : getSensorData("DEVICE_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to)}); - stats['sonarData'].push({"device": device.name, "stats" : getSensorData("SONAR_SENSOR_SUMMARY", "sonar", user, device.deviceIdentifier, from, to)}); - stats['motionData'].push({"device": device.name, "stats" : getSensorData("PIR_MOTION_SENSOR_SUMMARY", "motion", user, device.deviceIdentifier, from, to)}); - stats['lightData'].push({"device": device.name, "stats" : getSensorData("LDR_LIGHT_SENSOR_SUMMARY", "light", user, device.deviceIdentifier, from, to)}); + stats['temperatureData'].push({ + "device": device.name, + "stats": getSensorData("DEVICE_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to) + }); + stats['sonarData'].push({ + "device": device.name, + "stats": getSensorData("SONAR_SENSOR_SUMMARY", "sonar", user, device.deviceIdentifier, from, to) + }); + stats['motionData'].push({ + "device": device.name, + "stats": getSensorData("PIR_MOTION_SENSOR_SUMMARY", "motion", user, device.deviceIdentifier, from, to) + }); + stats['lightData'].push({ + "device": device.name, + "stats": getSensorData("LDR_LIGHT_SENSOR_SUMMARY", "light", user, device.deviceIdentifier, from, to) + }); } function getSensebotData(user, device, from, to) { - if (stats['sonarData'] == null){ + if (stats['sonarData'] == null) { stats['sonarData'] = []; } - if (stats['motionData'] == null){ + if (stats['motionData'] == null) { stats['motionData'] = []; } - if (stats['lightData'] == null){ + if (stats['lightData'] == null) { stats['lightData'] = []; } - if (stats['temperatureData'] == null){ + if (stats['temperatureData'] == null) { stats['temperatureData'] = []; } @@ -145,7 +161,7 @@ function getSensebotData(user, device, from, to) { chartData.push({time: i, value: rnd}); i += timeInterval; } - stats['sonarData'].push({"device": device.name, "stats" : chartData}); + stats['sonarData'].push({"device": device.name, "stats": chartData}); chartData = []; var i = parseInt(from); while (i < parseInt(to)) { @@ -153,7 +169,7 @@ function getSensebotData(user, device, from, to) { chartData.push({time: i, value: rnd}); i += timeInterval; } - stats['motionData'].push({"device": device.name, "stats" : chartData}); + stats['motionData'].push({"device": device.name, "stats": chartData}); chartData = []; var i = parseInt(from); while (i < parseInt(to)) { @@ -161,7 +177,7 @@ function getSensebotData(user, device, from, to) { chartData.push({time: i, value: rnd}); i += timeInterval; } - stats['lightData'].push({"device": device.name, "stats" : chartData}); + stats['lightData'].push({"device": device.name, "stats": chartData}); chartData = []; var i = parseInt(from); while (i < parseInt(to)) { @@ -169,7 +185,7 @@ function getSensebotData(user, device, from, to) { chartData.push({time: i, value: rnd}); i += timeInterval; } - stats['temperatureData'].push({"device": device.name, "stats" : chartData}); + stats['temperatureData'].push({"device": device.name, "stats": chartData}); /* //Comment below section to emulate data @@ -182,75 +198,120 @@ function getSensebotData(user, device, from, to) { } function getArduinoData(user, device, from, to) { - if (stats['temperatureData'] == null){ + if (stats['temperatureData'] == null) { stats['temperatureData'] = []; } - stats['temperatureData'].push({"device": device.name, "stats" : getSensorData("DEVICE_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to)}); + stats['temperatureData'].push({ + "device": device.name, + "stats": getSensorData("DEVICE_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to) + }); } function getAndroidSenseData(user, device, from, to) { - if (stats['ramData'] == null){ + if (stats['ramData'] == null) { stats['ramData'] = []; } - if (stats['cpuData'] == null){ + if (stats['cpuData'] == null) { stats['cpuData'] = []; } - if (stats['temperatureData'] == null){ + if (stats['temperatureData'] == null) { stats['temperatureData'] = []; } - if (stats['motionData'] == null){ + if (stats['motionData'] == null) { stats['motionData'] = []; } - stats['ramData'].push({"device": device.name, "stats" : getSensorData("RAM_USAGE_SUMMARY", "motion", user, device.deviceIdentifier, from, to)}); - stats['cpuData'].push({"device": device.name, "stats" : getSensorData("CPU_LOAD_SUMMARY", "light", user, device.deviceIdentifier, from, to)}); - stats['temperatureData'].push({"device": device.name, "stats" : getSensorData("DEVICE_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to)}); - stats['motionData'].push({"device": device.name, "stats" : getSensorData("PIR_MOTION_SENSOR_SUMMARY", "motion", user, device.deviceIdentifier, from, to)}); + stats['ramData'].push({ + "device": device.name, + "stats": getSensorData("RAM_USAGE_SUMMARY", "motion", user, device.deviceIdentifier, from, to) + }); + stats['cpuData'].push({ + "device": device.name, + "stats": getSensorData("CPU_LOAD_SUMMARY", "light", user, device.deviceIdentifier, from, to) + }); + stats['temperatureData'].push({ + "device": device.name, + "stats": getSensorData("DEVICE_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to) + }); + stats['motionData'].push({ + "device": device.name, + "stats": getSensorData("PIR_MOTION_SENSOR_SUMMARY", "motion", user, device.deviceIdentifier, from, to) + }); } function getDigitalDisplayData(user, device, from, to) { - if (stats['ramData'] == null){ + if (stats['ramData'] == null) { stats['ramData'] = []; } - if (stats['cpuData'] == null){ + if (stats['cpuData'] == null) { stats['cpuData'] = []; } - if (stats['cpuTemperatureData'] == null){ + if (stats['cpuTemperatureData'] == null) { stats['cpuTemperatureData'] = []; } - stats['ramData'].push({"device": device.name, "stats" : getSensorData("RAM_USAGE_SUMMARY", "motion", user, device.deviceIdentifier, from, to)}); - stats['cpuData'].push({"device": device.name, "stats" : getSensorData("CPU_LOAD_SUMMARY", "light", user, device.deviceIdentifier, from, to)}); - stats['cpuTemperatureData'].push({"device": device.name, "stats" : getSensorData("DEVICE_CPU_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to)}); + stats['ramData'].push({ + "device": device.name, + "stats": getSensorData("RAM_USAGE_SUMMARY", "motion", user, device.deviceIdentifier, from, to) + }); + stats['cpuData'].push({ + "device": device.name, + "stats": getSensorData("CPU_LOAD_SUMMARY", "light", user, device.deviceIdentifier, from, to) + }); + stats['cpuTemperatureData'].push({ + "device": device.name, + "stats": getSensorData("DEVICE_CPU_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to) + }); } function getAllDeviceData(user, device, from, to) { - if (stats['ramData'] == null){ + if (stats['ramData'] == null) { stats['ramData'] = []; } - if (stats['cpuData'] == null){ + if (stats['cpuData'] == null) { stats['cpuData'] = []; } - if (stats['temperatureData'] == null){ + if (stats['temperatureData'] == null) { stats['temperatureData'] = []; } - if (stats['sonarData'] == null){ + if (stats['sonarData'] == null) { stats['sonarData'] = []; } - if (stats['motionData'] == null){ + if (stats['motionData'] == null) { stats['motionData'] = []; } - if (stats['lightData'] == null){ + if (stats['lightData'] == null) { stats['lightData'] = []; } - if (stats['cpuTemperatureData'] == null){ + if (stats['cpuTemperatureData'] == null) { stats['cpuTemperatureData'] = []; } - stats['ramData'].push({"device": device.name, "stats" : getSensorData("RAM_USAGE_SUMMARY", "motion", user, device.deviceIdentifier, from, to)}); - stats['cpuData'].push({"device": device.name, "stats" : getSensorData("CPU_LOAD_SUMMARY", "light", user, device.deviceIdentifier, from, to)}); - stats['sonarData'].push({"device": device.name, "stats" : getSensorData("SONAR_SENSOR_SUMMARY", "sonar", user, device.deviceIdentifier, from, to)}); - stats['motionData'].push({"device": device.name, "stats" : getSensorData("PIR_MOTION_SENSOR_SUMMARY", "motion", user, device.deviceIdentifier, from, to)}); - stats['lightData'].push({"device": device.name, "stats" : getSensorData("LDR_LIGHT_SENSOR_SUMMARY", "light", user, device.deviceIdentifier, from, to)}); - stats['temperatureData'].push({"device": device.name, "stats" : getSensorData("DEVICE_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to)}); - stats['cpuTemperatureData'].push({"device": device.name, "stats" : getSensorData("DEVICE_CPU_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to)}); + stats['ramData'].push({ + "device": device.name, + "stats": getSensorData("RAM_USAGE_SUMMARY", "motion", user, device.deviceIdentifier, from, to) + }); + stats['cpuData'].push({ + "device": device.name, + "stats": getSensorData("CPU_LOAD_SUMMARY", "light", user, device.deviceIdentifier, from, to) + }); + stats['sonarData'].push({ + "device": device.name, + "stats": getSensorData("SONAR_SENSOR_SUMMARY", "sonar", user, device.deviceIdentifier, from, to) + }); + stats['motionData'].push({ + "device": device.name, + "stats": getSensorData("PIR_MOTION_SENSOR_SUMMARY", "motion", user, device.deviceIdentifier, from, to) + }); + stats['lightData'].push({ + "device": device.name, + "stats": getSensorData("LDR_LIGHT_SENSOR_SUMMARY", "light", user, device.deviceIdentifier, from, to) + }); + stats['temperatureData'].push({ + "device": device.name, + "stats": getSensorData("DEVICE_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to) + }); + stats['cpuTemperatureData'].push({ + "device": device.name, + "stats": getSensorData("DEVICE_CPU_TEMPERATURE_SUMMARY", "TEMPERATURE", user, device.deviceIdentifier, from, to) + }); } diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/app.js b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/app.js index 461600f1..b4c96882 100644 --- a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/app.js +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/app.js @@ -29,18 +29,67 @@ app.server = function(ctx) { url: 'devices', path: 'device_top_assets.jag' }, { - title: 'Store | Device Analytics page', + title: 'Store | Analytics', url: 'analytics', - path: 'device-analytics.jag' + path: 'device-analytics.jag', + secured:true }], apis: [{ url: 'stats', path: 'stats-api.jag', - secured:false + secured:true }] }, configs: { disabledAssets: ['ebook', 'api', 'wsdl', 'servicex','policy','proxy','schema','sequence','uri','wadl','endpoint', 'swagger','restservice','comments','soapservice', 'service', 'license', 'gadget', 'site'] } } +}; + +app.pageHandlers = function (ctx) { + return { + onPageLoad: function () { + if ((ctx.isAnonContext) && (ctx.endpoint.secured)) { + ctx.res.sendRedirect(ctx.appContext + '/login'); + return false; + } + return true; + } + } +}; + +app.apiHandlers = function (ctx) { + return { + onApiLoad: function () { + if ((ctx.isAnonContext) && (ctx.endpoint.secured)) { + ctx.res.status = '401'; + ctx.res.sendRedirect(ctx.appContext + '/login'); + return false; + } + return true; + } + } +}; + +app.renderer = function(ctx) { + var decoratorApi = require('/modules/page-decorators.js').pageDecorators; + return { + pageDecorators: { + navigationBar: function(page) { + return decoratorApi.navigationBar(ctx, page, this); + }, + searchBar: function(page) { + return decoratorApi.searchBar(ctx, page, this); + }, + authenticationDetails: function(page) { + return decoratorApi.authenticationDetails(ctx, page, this); + }, + recentAssetsOfActivatedTypes: function(page) { + return decoratorApi.recentAssetsOfActivatedTypes(ctx, page, this); + }, + popularAssets:function(page){ + return decoratorApi.popularAssets(ctx,page,this); + } + } + } }; \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/pages/device-analytics.jag b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/pages/device-analytics.jag index a268de74..6815be47 100644 --- a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/pages/device-analytics.jag +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/pages/device-analytics.jag @@ -21,13 +21,29 @@ var caramel; require('/modules/store.js').exec(function(ctx) { caramel = require('caramel'); var app = require('rxt').app; - var constants = require('rxt').constants; var server = require('store').server; var user = server.current(ctx.session); var ui = require('rxt').ui; var page = ui.buildPage(ctx.session, ctx.request); var appManager; - page.title ="test"; + var groupId = request.getParameter("groupId"); + var title; + if (groupId){ + title = request.getParameter("name"); + }else{ + var carbon = require('carbon'); + var carbonHttpsServletTransport = carbon.server.address('https'); + var deviceCloudDeviceService = carbonHttpsServletTransport + "/common/device_manager"; + + var deviceId = request.getParameter("deviceId"); + var deviceType = request.getParameter("deviceType"); + var endPoint = deviceCloudDeviceService + "/devices/" + deviceType + "/" + deviceId; + var data = {"username": user.um.username}; + var device = get(endPoint, data, "json").data; + title = device.name; + } + page.title = title + " Analytics"; + page.page_title = "Analytics"; appManager = app.createUserAppManager(session); var output = appManager.render([], page); caramel.render(output); diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/css/custom-desktop.css b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/css/custom-desktop.css new file mode 100644 index 00000000..03f4fa81 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/css/custom-desktop.css @@ -0,0 +1,2294 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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. + */ + +.wr-content { + padding-top: 30px; +} + +.wr-content-alt { + padding-top:30px; +} + +.wr-title { + font-family: 'Open Sans'; + font-weight: 400; + font-size: 26px; +} + +@media (max-width:500px){ + .wr-content { + padding: 0; + } +} + +.wr-asset-type-switcher { + float:left; + height:54px; +} + +a.ctrl-asset-type-switcher { + display:inline-block; + padding:0; + font-size:18px; + color:#fff; + text-decoration: none; + font-weight:100; +} + +a.ctrl-asset-type-switcher:hover { + color:#fff; +} + +.wr-asset-type-switcher span { + float:left; +} + +.wr-asset-type-switcher span.btn-asset { + width:54px; + height:54px; + margin-right:0; + display:inline-block; + text-align: center; + background: #11375B; + line-height: 49px; +} + +.wr-asset-type-switcher span.btn-asset:hover { + background-color: #16436D; +} + +.wr-asset-type-switcher span.btn-text { + padding-top:14px; +} + +a.ast-type-item { + width:77px; + height:77px; + background:#696969; + display:block; + margin:5px; + float:left; + text-align: center; + color:#e4e4e4; + text-decoration: none; +} + +a.ast-type-item:hover { + background:#526A84; + cursor: pointer; +} + +.wr-action-container { + padding-left:0; +} + +.wr-action-btn-bar { + margin-left: -30px; + padding-left: 0px; + padding-top:0; + height: auto; +} + +.wr-action-btn-bar .page-title { + background-color: #14212E; + margin: 0; +} + +.wr-action-btn-bar .page-title .fw-stack { + width: 0; +} + +.page-sub-title { + font-weight: 300; + text-transform: uppercase; + font-size: 24px; + margin: 0; +} + +.page-sub-title-desc { + font-weight: 300; +} + +/* device board */ +.wr-device-board { + background:#fafafa; + padding:10px 0; + font-size:20px; + margin-bottom:10px; +} + +.wr-device-board label { + font-weight:100; +} + +.lbl-device { + font-size:14px; + color:#777; +} + +/* operations panel/board */ +.wr-operations-board { + background:#fafafa; + margin-bottom:10px; +} + +.wr-operations-board:hover { + background:#f0f0f0; +} + + +/* operations */ +.wr-operations { + clear:both; + /*margin-left:17px;*/ + margin-bottom:15px; + border-bottom:1px solid #f0f0f0; +} + +.wr-operations a { + display:inline-block; + float: left; + text-align: center; + font-size:12px; + text-decoration: none; + margin-right:10px; + color:#526A84; + min-width:70px; + background:#fafafa; + padding:2px 4px 6px 4px; + margin-bottom:10px; +} + +.wr-operations a:hover { + background:#e4e4e4; +} + +.wr-operations .fw { + margin:10px; + font-size: 28px; +} + +.wr-operations span { + display:block; +} + +@media (max-width:768px){ + .wr-operations a { padding:0; min-width: inherit; margin-right:5px; } + .wr-operations img { width: 50px; } + .wr-operations span { display:none; } + .wr-operations .fw { font-size: 25px; } +} + +/* assets */ + +.wr-select-all { + clear:both; + margin-bottom:10px; +} + +.wr-btn, a.wr-btn { + font-weight: normal; + font-size: 13px; + color: #fff; + background:#11375B; + padding: 10px 10px; + display: inline-block; + margin-right: 5px; + border: none; + text-decoration: none; +} + +.wr-btn:disabled, a.wr-btn:disabled { + opacity: 0.5; +} + +.wr-btn:hover { + background-color: #16436D; +} + +.wr-btn-grp { + margin-top: 20px; +} + +.ast-container { + clear:both; +} + +.ast-device-desc { + margin: 6px 0; +} + +.ctrl-wr-asset { + position:relative; + width:100%; + min-height:280px; + float:left; + margin: 0.5%; + padding:10px; + background:#fbfbfb; + border-bottom:0px solid #fff; +} + +.ast-btn-group { + margin-top:8px; +} + +@media (min-width: 500px){ + .ctrl-wr-asset { width: 49%; } +} + +@media (min-width: 768px){ + .ctrl-wr-asset { width: 30%; } +} + +@media (min-width: 992px){ + .ctrl-wr-asset { width: 25%; } +} + +@media (min-width:1300px){ + .ctrl-wr-asset { width: 19%; } +} + +@media (min-width:1500px){ + .ctrl-wr-asset { width: 17.5%; } +} + +@media (min-width:1800px){ + .ctrl-wr-asset { width: 15%; } +} + +.ctrl-wr-asset.selected { + background: #E4E4E4; + border-bottom:4px solid #526A84; +} + +.ctrl-wr-asset:hover { + background: #E4E4E4; +} + +.itm-select { + position:absolute; + right:10px; + background:#fafafa; + width:20px; + height:20px; +} + +.itm-ast { + display:block; + cursor: pointer; + padding:0; + margin-bottom:0; + width:100%; + border:0 solid #ff0000; +} + +.itm-ast a { + text-decoration: none; +} + +.itm-ast:hover h3, .itm-ast:hover .ast-auth { + color:#526A84; +} + +.ast-img { + width: 100%; + height: 0; + padding-bottom: 100%; + background: #ffffff; +} + +.ast-img img { + width:100%; + height: auto; +} + +.ast-desc { + /*float:left;*/ + margin-left:0; + overflow:hidden; + position: relative; +} + +.ast-desc-image img { + width: auto; + max-width: 100%; + max-height: 300px; +} + +.ast-desc span:before { + content: ""; + pointer-events: none; + position: absolute; + width: 25px; + height: 100%; + top: 0; + right: 0; + + background: -moz-linear-gradient(left, rgba(251,251,251,0) 0%, rgba(251,251,251,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(251,251,251,0)), color-stop(100%,rgba(251,251,251,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(251,251,251,0) 0%,rgba(251,251,251,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(left, rgba(251,251,251,0) 0%,rgba(251,251,251,1) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(left, rgba(251,251,251,0) 0%,rgba(251,251,251,1) 100%); /* IE10+ */ + background: linear-gradient(to right, rgba(251,251,251,0) 0%,rgba(251,251,251,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00fbfbfb', endColorstr='#fbfbfb',GradientType=1 ); /* IE6-9 */ +} + +.ctrl-wr-asset.selected .ast-desc span:before, .ctrl-wr-asset:hover .ast-desc span:before { + background: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/Pgo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEgMSIgcHJlc2VydmVBc3BlY3RSYXRpbz0ibm9uZSI+CiAgPGxpbmVhckdyYWRpZW50IGlkPSJncmFkLXVjZ2ctZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPgogICAgPHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U0ZTRlNCIgc3RvcC1vcGFjaXR5PSIwIi8+CiAgICA8c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiNlNGU0ZTQiIHN0b3Atb3BhY2l0eT0iMSIvPgogIDwvbGluZWFyR3JhZGllbnQ+CiAgPHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNncmFkLXVjZ2ctZ2VuZXJhdGVkKSIgLz4KPC9zdmc+); + background: -moz-linear-gradient(left, rgba(228,228,228,0) 0%, rgba(228,228,228,1) 100%); /* FF3.6+ */ + background: -webkit-gradient(linear, left top, right top, color-stop(0%,rgba(228,228,228,0)), color-stop(100%,rgba(228,228,228,1))); /* Chrome,Safari4+ */ + background: -webkit-linear-gradient(left, rgba(228,228,228,0) 0%,rgba(228,228,228,1) 100%); /* Chrome10+,Safari5.1+ */ + background: -o-linear-gradient(left, rgba(228,228,228,0) 0%,rgba(228,228,228,1) 100%); /* Opera 11.10+ */ + background: -ms-linear-gradient(left, rgba(228,228,228,0) 0%,rgba(228,228,228,1) 100%); /* IE10+ */ + background: linear-gradient(to right, rgba(228,228,228,0) 0%,rgba(228,228,228,1) 100%); /* W3C */ + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00e4e4e4', endColorstr='#e4e4e4',GradientType=1 ); /* IE6-8 */ +} + +.ast-title { + /*height: 70px;*/ + overflow: hidden; +} + +h3.ast-name { + font-weight:300; + font-size:20px; + color:#555; + margin-bottom:3px; + height: 23px; + overflow: hidden; +} + +.ast-ver { + font-weight:300; + font-size:13px; + white-space: nowrap; + word-break: keep-all; +} + +.ast-auth { + font-weight:300; + font-size:13px; + color:#526A84; + display:block; + margin-bottom:12px; + white-space: nowrap; + word-break: keep-all; +} + +.ast-published { + font-weight:300; + font-size:12px; + display:block; + /* text-align: left; */ + color:#aaa; + white-space: nowrap; + word-break: keep-all; + +} + +.ast-container .lbl-action { + display:none; +} + +/* device list-view styles */ +.ast-container.list-view .itm-select { + position: static; + float: left; +} + +.ast-container.list-view .lbl-action { + display:inline-block; +} + +.ast-container.list-view .ctrl-wr-asset { + width: 100%; + min-height: 50px; + margin: 0; +} + +.ast-container.list-view .itm-ast { + display: block; + width: auto; +} + +.ast-container.list-view .ast-img { + width: 50px; + padding-bottom: 0; + height: auto; + display: inline-block; + float: left; + margin-left:20px; +} + +.ast-container.list-view .ast-desc span:before { + width: 0; +} + +.ast-container.list-view .ast-title { + height: inherit; + float: left; + margin-left: 20px; +} + +.ast-container.list-view .ast-model { + float: right; + margin: 0 20px; + text-align: right; +} + +.ast-container.list-view h3.ast-name, .ast-container.list-view .ast-auth { + margin: 0; +} + +/* tooltip */ +.tooltip { + opacity: 1; + filter: alpha(opacity=100); +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top-color: #333; + border-width: 5px 5px 0; +} + +.tooltip-inner { + color: #fff; + background: #333; + border: solid 1px #333; + border-radius: 0px; +} + +/* filter */ +a.filter-item { + color:#e4e4e4; + text-transform: uppercase; + text-decoration: none; + display:block; + font-size:12px; + padding:3px 0px; + font-weight: 100; + cursor: pointer; +} + +a.filter-item:hover { + text-decoration: none; + color:#fff; +} + + +/* action buttons */ +.btn-col { + padding-left: 0; +} + +a.cu-btn, a.cu-btn-inner { + color:#fff; + text-decoration: none; + font-weight:100; + display: inline-block; + text-transform: uppercase; + height: 53px; + padding: 13px 10px; +} + +a.cu-btn:hover { + background-color: #132D45; +} + +a.cu-btn-inner { + color: #333; + padding: 5px 10px; + height: 35px; +} +a.cu-btn-inner:hover { + background-color:#e4e4e4; +} + +/* filter */ +.wr-filters { + padding:14px; +} + +.wr-filters-right { + padding:22px 14px 22px 0; +} + +@media (max-width:1100px) { + .wr-filters-right { + padding: 0 14px 22px 14px; + } +} + +.wr-secondary-bar { + border-bottom:0 solid #f0f0f0; + padding-right:0; +} + +@media (max-width:500px) { + .wr-secondary-bar { + padding-left:0; + } +} + +.wr-filter-sort a.ico-filter { + display:inline-block; + width:40px; + height:40px; + padding:5px; +} + +.wr-filter-sort a.ico-filter .fw { + width:30px; + height:30px; + line-height: 30px; + text-align: center; + color: #333; + font-size: 15px; +} + +.wr-filter-sort a.ico-filter .fw.fw-list-sort { + font-size: 23px; +} + +@media (max-width:1100px) { + .wr-filters, .wr-filter-sort.pull-right { + float: none !important; + } +} + +.wr-filter-sort a.ico-filter:hover, .wr-filter-sort a.ico-filter.selected { + background:#e4e4e4; +} + +.sort-title, .sort-options { + padding:0 15px; +} + +.sort-title { + color:#e4e4e4; + font-size:11px; + padding-bottom:5px; + padding-top:5px; + margin-bottom:5px; +} + +.sort-options > a { + display:block; + text-decoration: none; + color:#cecece; + text-transform: uppercase; + font-size:12px; + padding:4px 0; + font-weight: 100; +} + +span.ico-sort-asc { + display:inline-block; + padding-right:20px; + width:15px; + height:15px; + padding-top:2px; +} + +span.ico-sort-desc { + display:inline-block; + padding-right:20px; + width:15px; + height:15px; + padding-top:2px; +} + + +/* asset filter window styles */ +.wr-asset-type-switcher .popover.menu { + display:none; + top: 70px; + left: 14px !important; + min-width: 290px; + color: #ffffff; + padding-bottom:0; + z-index: 100000; +} + +.wr-asset-type-switcher .popover.menu .arrow { + left: 27px !important; +} + +.wr-asset-type-switcher .popover.menu .popover-content .title { + font-family: 'Open Sans'; + font-size: 16px; + color:#ffffff; + font-weight: 100; + margin: 0 4px 4px 4px; +} + +.wr-asset-type-switcher ul { + margin: 0; + padding: 0; + list-style: none; +} + +.wr-asset-type-switcher ul:after { + clear: both; + content: " "; + height: 0; + display: block; +} + +.wr-asset-type-switcher ul li, .wr-asset-type-switcher ul a { + display: block; + float: left; + margin: 4px; + padding: 6px 4px; + list-style: none; + width:85px; + height:85px; + text-align: center; + vertical-align: text-bottom; + color:#e4e4e4; + text-decoration: none; +} + +.wr-asset-type-switcher ul a { + cursor: pointer; + width:30px; + height:40px; + margin:30px 0 0 10px; + line-height: 40px; + text-align: center; +} +.wr-asset-type-switcher ul a:hover { + background-color: transparent; + opacity: 0.6; +} + +.wr-asset-type-switcher ul ul { display: none; } + +.wr-asset-type-switcher ul.options { + border-top: 1px solid #333; + margin-top:5px; + padding:5px 0 0 0; +} + +.wr-asset-type-switcher ul li:hover { + background:#526A84; + cursor: pointer; +} + +#advance-filter-options { + background:#444444; + margin: 5px 4px; + padding: 10px; +} + +#advance-filter-options input { + margin:0 5px 0 5px; +} + +#device-filter-options li i.fw { + display: block; + font-size: 26px; + margin: 10px 0; +} + +#device-filter-options li h4 { + margin-bottom: 0; +} + +#device-filter-options li h6 { + margin-bottom: 0; +} + +#device-filter-options li span { + float: none; +} + +#asset-selected .selected { + padding:0 0; +} + +#asset-selected .selected li { + background: #526A84; + color: #ffffff; +} + +#asset-selected .options li { + background:#444; +} + +#asset-select li { + background:#444; +} + +#asset-select li:hover, #asset-selected .options li:hover { + background:#555; +} + +/* login page styles */ + +.wr-login { + padding-top:50px; +} + +/* form styles */ +.wr-validation-summary p { + display: block; + color: #ff2353 !important; + margin-top: 15px; + font-weight: 400 !important; + background: #fff2f2; + padding: 7px 17px; + font-size: 13px !important; + border-left: 3px solid #ff2353; +} + +.wr-input-label { + font-weight:100; + font-size:14px; + color:#555; + margin-bottom:5px; +} + +.wr-input-control { + margin-bottom: 20px; +} + +.wr-input-control input, .wr-input-control textarea { + border: 1px #999 solid; + width: 100%; + height: 100%; + padding: 6px 10px; + z-index: 1; + -webkit-appearance: none; +} + +/* asset filter tags on search field styles */ +.wr-search-tags { + display:block; + float: left; + min-height: 54px; + padding:13px 5px; + max-width: 350px; +} + +/* search field styles */ +.wr-search-tags:empty { + padding:0; +} + +.wr-search-tags span { + color: #ffffff; + background: #11375B; + font-size: 11px; + display: inline-block; + cursor: pointer; + padding: 6px 6px; + margin: 1px; + border-radius: 2px; +} + +.wr-search-tags span i.fw { + display: none; +} + +.wr-search-tags span:hover { + background: #526A84; + color: #ffffff; +} + +/* search */ +.wr-search { + margin-left:0; + border:none; + background:#bbb; + min-height: 54px; + max-width:750px !important; + width: 100%; +} + +@media (max-width:1100px) { + .wr-search-tags:not(:empty) { + float: none; + padding-left:60px; + max-width: 100%; + } + .wr-search { + max-width: 100% !important; + } + .wr-filters.col-sm-7, .wr-filters.col-sm-7.col-md-8 { + width: 100%; + } +} + +.wr-search .input { + background:#bbb; + height: 54px; + border:none; + color:#fff; + font-weight: 100; + line-height: 54px; + padding:0 20px; + overflow: hidden; + font-size:18px; + white-space: nowrap; + word-break: keep-all; + min-width: 200px; +} + +.wr-search .input:focus { + outline: 0; +} + +[contentEditable=true]:empty:not(:focus):before{ + content:attr(data-placeholder) +} + +.btn-search { + display:block; + font-size:21px; + font-weight:500; + color:#fff; + background:#bbb; + padding:10px 12px; + height: 54px; + float: right; +} + +@media (max-width:500px) { + .btn-search { display: none; } +} + +.wr-search:hover .fw { + color:#fff; +} + +.wr-filters div.wr-filter-category { + float:left; +} + +.wr-filters .col-md-1, .col-md-11 { + padding:0; + margin: 0; + height:54px; +} + +::-webkit-input-placeholder { + color: #fff; +} + +:-moz-placeholder { /* Firefox 18- */ + color: #fff; +} + +::-moz-placeholder { /* Firefox 19+ */ + color: #fff; +} + +:-ms-input-placeholder { + color: #fff; +} + +.wr-operations, .wr-operations .operation { + display: none; +} + +a.btn-operations { + font-weight: normal; + font-size: 13px; + color: #fff; + background: #11375B; + padding: 10px 10px; + display: inline-block; + margin-right: 2px; + text-decoration: none; +} + +/* modal pop-up styles */ +.wr-modalpopup { + display: none; +} + +.wr-modalpopup .modalpopup-container { + display: block; + min-height: 100px; + width: 100%; + position: fixed; + background: #11375B; + color: #fff; + z-index: 1000001; + align-content: center; + top: 50%; +} + +.modalpopup-content { + position: relative; + overflow-x: hidden; + overflow-y: auto; + padding: 60px; +} + +.modalpopup-content h3 { + font-weight: 300; +} + +.modalpopup-content h3 .fw-stack { + margin-right: 15px; +} + +.wr-modalpopup .modalpopup-close-btn { + color: #fff; + z-index: 1000002; + cursor: pointer; + position: absolute; + top: 30px; + left: 40px; + padding: 5px 8px; + font-size: 18px; +} + +.wr-modalpopup .modalpopup-close-btn:hover { + +} + +.wr-modalpopup .modalpopup-content .buttons { + margin-top: 30px; +} + +.wr-modalpopup .modalpopup-content .buttons .btn-operations { + background: #fff; + color: #333; + text-transform: uppercase; + font-weight: 500; +} + +.wr-modalpopup .modalpopup-bg { + position: fixed; + z-index: 1000000; + width: 100%; + height: 100%; + background: #000000; + opacity: 0.9; + display: block; +} + +/* notification panel styles */ +.wr-notification-bar, .wr-side-panel { + width: 400px; + background: #262933; + position: absolute; + right: -400px; + padding: 10px; + z-index: 10000; + color: #fff; + transition: right 0.4s ease 0s; + overflow-y: auto; + overflow-x: hidden; +} + +.wr-side-panel { + background: #e4e4e4; + color: #333; + padding: 0; +} + +.wr-notification-bar::-webkit-scrollbar, .wr-side-panel::-webkit-scrollbar { + width: 6px; + background: transparent; + padding: 0 5px; + cursor: all-scroll; +} +.wr-notification-bar::-webkit-scrollbar-thumb { + background: #e4e4e4; +} +.wr-notification-bar::-webkit-scrollbar-thumb:hover { + background: #e4e4e4; +} +.wr-notification-bar::-webkit-scrollbar-thumb:active { + background: #e4e4e4; +} + +.wr-side-panel::-webkit-scrollbar-thumb { + background: #526A84; +} +.wr-side-panel::-webkit-scrollbar-thumb:hover { + background: #526A84; +} +.wr-side-panel::-webkit-scrollbar-thumb:active { + background: #526A84; +} + +.wr-notification-bar.toggled, .wr-side-panel.toggled { + right: 0; +} + +.wr-notification-desc.new .wr-notification-operation { + font-weight: 500; +} + +.wr-notification-desc .fw { + font-size: 12px; +} + +.wr-notification-toggle-btn, .wr-side-panel-toggle-btn { + float: right; +} + +.wr-notification-bubble { + display: inline-block; + background: #fafafa; + color: #555; + padding: 2px 4px; + border-radius: 5px; + min-width: 10px; + font-weight: 500; +} + +a.wr-notification-toggle-btn.selected { + background-color: #262933; +} + +a.wr-side-panel-toggle-btn.selected { + background-color: #11375B; + color: #fff; +} + +.wr-side-panel .panel-title a { + display: block; + padding: 10px; + background: #11375B; + color: #fff; + border-bottom: 1px solid #e4e4e4; +} + +.wr-side-panel .panel-title a:hover { + background: #132D45; +} + +.wr-side-panel .panel { + margin-bottom: 0; +} + +.wr-side-panel .panel-sub-title { + margin: 10px 0; +} + +.wr-side-panel .wr-input-control.switch input[type="checkbox"]:not(:checked) + .helper:after { + background: #fff; +} + +.wr-side-panel .panel-body { + padding: 10px; +} + +.wr-panel-notes textarea { + resize: vertical; +} + +.wr-panel-notes .wr-btn { + margin-right: 5px; +} + +.wr-panel-notes .wr-input-control.checkbox { + margin: 0; +} + +.wr-panel-notes .wr-input-control.checkbox .helper:before { + border-color: #526A84; +} + +.wr-panel-notes .add-btn { + margin-bottom: 15px; + padding-left: 0; +} + +.wr-panel-notes .panel-collapse { + padding: 10px 0 10px 35px; +} + +.wr-panel-note { + margin: 0; +} + +.wr-panel-notes .well { + margin: 5px 0; + padding: 10px; +} + +.wr-panel-note .wr-panel-msg:hover { + cursor: pointer; + background: #f5f5f5; +} + +.wr-panel-notes .wr-panel-desc-icon i { + width: 30px; + height: 30px; + display: inline-block; + background: #333; + color: #fff; + text-align: center; + margin-right: 10px; +} + +.wr-panel-notes .wr-panel-desc-icon img { + width: 30px; + height: auto; +} + +.wr-panel-notes .wr-panel-desc-icon { + float: left; + width: 30px; + height: 30px; + line-height: 30px; + white-space: nowrap; + margin-bottom: 5px; +} + +.wr-panel-msg { + background: #fff; + border-right: 2px solid #526A84; + padding: 8px 35px 8px 10px; + margin-left: 35px; + margin-bottom: 5px; + font-size: 16px; + position: relative; +} + + +.wr-panel-msg .dropdown-menu { + background: #526A84; + color: #fff; + left: -167px; + top: -2px; +} + +.wr-panel-msg .dropdown-menu a { + color: #fff; +} + +.wr-panel-msg .dropdown-menu a:hover, .wr-panel-msg .dropdown-menu a:focus { + background-color: #132D45; + color: #fff; +} + +.wr-panel-msg .msg-options { + position: absolute; + top: 0; + right: 0; + padding: 0; + cursor: pointer; +} + +.wr-panel-msg .msg-options .btn.dropdown-toggle { + padding: 6px; + border: none; + color: #333; + background: transparent; +} + +.wr-panel-msg .msg-options .btn.dropdown-toggle:hover, .wr-panel-msg .msg-options .btn.dropdown-toggle[aria-expanded="true"] { + color: #fff; + background-color: #526A84; +} + +.wr-panel-msg-visibility { + position: absolute; + bottom: 7px; + right: 10px; + font-size: 14px; +} + +.wr-panel-notes .resolve-icon { + display: none; + position: absolute; + bottom: 5px; + right: 15px; + font-size: 14px; +} + +.wr-panel-notes .resolved .resolve-icon { + display: block; +} + +.wr-panel-notes .resolved .wr-panel-msg { + border-right: none; + background: #C7CFD0; +} + +.wr-panel-notes .resolved .wr-panel-sub-note .wr-panel-msg .msg-options { + display: none; +} + +.wr-panel-sub-note .wr-panel-msg { + background: transparent; + margin-bottom: 5px; + padding-top: 0; + border-right: none; +} + +.wr-panel-msg-details { + font-size: 10px; + color: #919191; + margin-top: 10px; +} + +.wr-panel-notes .more-link { + display: inline-block; + margin-bottom: 8px; +} + + +/* filter type switcher */ +#content-filter-types { + position:absolute; + right: -300px !important; + float: right; +} + +.wr-filter-type-switcher .popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + width: 200px; + padding: 1px 1px 8px 1px; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: left; + white-space: normal; + background-color: #232323; + -webkit-background-clip: padding-box; + background-clip: padding-box; + /*border: 0px solid #232323;*/ + border: 0 solid rgba(0,0,0,.2); + border-radius: 0; + -webkit-box-shadow: 0 0 0 rgba(0,0,0,.2); + box-shadow: 0 0 0 rgba(0,0,0,.2); + margin-right: -400px !important; +} + +.wr-filter-type-switcher .popover.bottom>.arrow { + top: -11px; + left: 50%; + margin-left: 130px; + border-top-width: 0; + border-bottom-color: #232323; +} + +.wr-filter-type-switcher .popover>.arrow { + border-width: 11px; +} + +.wr-filter-type-switcher .popover.bottom>.arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #232323; +} + +.wr-filter-type-switcher .popover>.arrow, .popover>.arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} + +.wr-filter-type-switcher { + position: relative; +} + +.wr-filter-type-switcher .popover-content { + padding: 6px 6px; +} + +.wr-filter-type-switcher .arrow { + left:25px !important; +} + +.wr-filter-type-switcher .popover { + left: -148px !important; +} + +/* stats */ +.wr-stats-board-tile { + background: #11375B; + color: #fff; + padding: 10px 15px; + height: 110px; + margin-bottom: 10px; +} + +.wr-stats-board .tiles .row { + margin: 0 -5px; +} + +.wr-stats-board .tiles .col-lg-2, .wr-stats-board .tiles .col-lg-4, .wr-stats-board .tiles .col-lg-8 { + padding: 0 5px; +} + +.wr-stats-board-tile .col-lg-4, .wr-stats-board-tile .col-lg-8, .wr-stats-board .tiles .col-lg-6 { + padding: 0; +} + +.wr-stats-board-tile.lg .tile-stats { + border-left: 1px solid #9bb6f6; + height: 90px; + text-align: left; + font-size: inherit; +} + +.wr-stats-board-tile.lg .tile-stats .col-lg-6 { + padding: 0 15px; +} + +.wr-stats-board-tile.lg .tile-graph { + width:100px; + float:right; + text-align: right; + margin: 0 auto; +} + +.wr-stats-board-tile.lg .tile-graph img { + width:80px; +} + +.tile-bg { + background:#11375B; + color:#fff; +} + +.tile-name { + font-size:16px; + font-weight: 100; + text-transform: uppercase; +} + +.tile-stats { + width:75%; + float:right; + font-size:27px; + font-weight: 400; + text-align: right; +} + +.tile-stats-sm { + font-size:17px; + font-weight: 700; +} + +.tile-stats-free { + font-size:13px; + display:block; + text-align: right; +} + +.tile-stats-free a { + color: #B4C2D0; + text-decoration: none; + display: inline-block; + padding: 3px 5px 1px; +} + +.tile-stats-free a:hover { + color: #fff; +} + +.tile-stats-type { + font-size:12px; + display:block; +} + +.tile-icon { + width:25%; + float:left; + margin-top: 10px; +} + +.tile-icon .fw { + font-size:40px; +} + +.tile-sup-lbl { + display: block; + font-size: 12px; +} + + +.sub-title { + font-weight:100; + font-size: 20px; +} + +.wr-device-board label { + font-weight: 400; +} + +.wr-app-listing > div { + float:left; + margin-right:10px; + margin-bottom:10px; +} + +.wr-app-listing > div > img { + width:60px; +} + +.wr-form { + margin: 30px 0; +} + +.wr-form button { + margin-right: 5px; +} + +.wr-help-tip { + font-size: 14px; + padding: 0 10px; + color: #666; +} + +.wr-form .wr-operation-icon { + font-size: 32px; + margin-right: 10px; + color: #11375B; +} + + +/* enabled/disabled switch styles */ +.wr-input-control.switch { + display: inline-block; + margin-right: 10px; + cursor: pointer; + position: relative; + margin-bottom: 5px; +} +.wr-input-control.switch > input[type=checkbox] { + position: absolute; + opacity: 0; +} +.wr-input-control.switch .helper { + padding-left: 52px; + position: relative; +} + +.wr-input-control.switch .text { + display: none; + margin-left: 5px; + font-weight: 100; +} + +.wr-input-control.switch input[type="checkbox"]:checked + .helper + .text { + display: inline-block; +} + +.wr-input-control.switch .helper:before { + position: absolute; + left: 0; + top: 2px; + display: block; + content: ""; + width: 45px; + height: 16px; + /*outline: 2px #a6a6a6 solid;*/ + border: 1px #fff solid; + cursor: pointer; + /*background: #526A84;*/ + background: #a6a6a6; + /*margin-left: 2px;*/ + z-index: 1; + border-radius: 8px; +} +.wr-input-control.switch input[type="checkbox"] + .helper:after { + position: absolute; + left: 22px; + top: -2px; + display: block; + content: ""; + width: 24px; + height: 24px; + /*outline: 2px #333 solid;*/ + border: 1px #333 solid; + cursor: pointer; + background: #11375B; + z-index: 2; + border-radius: 12px; + /*box-shadow: 0 1px 2px #888888;*/ + + -webkit-transition: left 0.2s ease-in-out; + -moz-transition: left 0.2s ease-in-out; + -o-transition: left 0.2s ease-in-out; + transition: left 0.2s ease-in-out; +} +.wr-input-control.switch input[type="checkbox"]:not(:checked) + .helper:after { + left: 0 !important; + background: #eaeaea; + border: 1px #eaeaea solid; +} + +.wr-input-control.switch input[type="checkbox"]:not(:checked) + .helper:before { + background: #a6a6a6 !important; +} +.wr-input-control.switch input[type="checkbox"]:disabled + .helper:after { + background: #a6a6a6 !important; + outline: 2px #a6a6a6 solid !important; + border: 1px #a6a6a6 solid !important; +} +.wr-input-control.switch input[type="checkbox"]:disabled + .helper:before { + cursor: default !important; + background: #e0e0e0 !important; + outline: 2px #ccc solid !important; +} + +/* radio button style*/ +.wr-input-control.radio { + display: inline-block; + margin-right: 10px; + margin-bottom: 0; + cursor: pointer; + font-weight: 100; +} +.wr-input-control.radio > input[type=radio] { + position: absolute; + opacity: 0; +} +.wr-input-control.radio .helper { + padding-left: 23px; + position: relative; +} +.wr-input-control.radio .helper:before { + position: absolute; + display: block; + height: 20px; + width: 20px; + content: ""; + text-indent: -9999px; + border: 2px #d9d9d9 solid; + z-index: 1; + opacity: 1; + top: 0; + left: 0; + border-radius: 100%; +} +.wr-input-control.radio input[type="radio"]:checked + .helper:after { + position: absolute; + display: block; + content: ""; + color: #1a1a1a; + z-index: 2; + font-size: 16px; + font-weight: bold; + left: 5px; + margin-left: 0; + top: 50%; + margin-top: -5px; + background-color: #1a1a1a; + width: 10px; + height: 10px; + border-radius: 100%; +} +.wr-input-control.radio.light input[type="radio"]:checked + .helper:after { + color: #fff; + background-color: #fff; +} +.wr-input-control.radio input[type="radio"]:disabled + .helper:before { + cursor: default; + background: #e6e6e6; +} +.wr-input-control.radio input[type="radio"]:disabled + .helper:after { + background-color: #8a8a8a; +} +.wr-input-control.radio:hover input:not(:disabled) + .helper:before { + border-color: #919191; +} +.wr-input-control.radio:active input:not(:disabled) + .helper:before { + border-color: #919191; +} + +/* checkbox style */ +.wr-input-control.checkbox { + display: inline-block; + margin: 0 10px 0 0; + cursor: pointer; +} +.wr-input-control.checkbox > input[type=checkbox] { + position: absolute; + opacity: 0; +} +.wr-input-control.checkbox .helper { + padding-left: 23px; + position: relative; +} +.wr-input-control.checkbox .helper:before { + position: absolute; + display: block; + height: 20px; + width: 20px; + content: ""; + text-indent: -9999px; + border: 2px #eaf0f1 solid; + z-index: 1; + opacity: 1; + top: 0; + left: 0; +} +.wr-input-control.checkbox input[type="checkbox"]:checked + .helper:before { + border: 2px #526A84 solid; +} +.wr-input-control.checkbox input[type="checkbox"]:checked + .helper:after { + position: absolute; + display: block; + content: "\e617"; + font-size: 7pt; + height: 16px; + width: 16px; + line-height: 16px; + z-index: 2; + top: 2px; + margin-top: 0; + left: 2px; + margin-left: 0; + text-align: center; + background: #526A84; + color: #fff; + font-family: fontwso2; +} +.wr-input-control.checkbox input[type="checkbox"]:not(:checked) + .helper:after { + display: none; +} +.wr-input-control.checkbox input[type="checkbox"]:disabled + .helper:before { + cursor: default; + background: #e6e6e6; +} +.wr-input-control.checkbox input[type=checkbox]:disabled + .helper:after { + color: #8a8a8a; +} +.wr-input-control.checkbox:hover input:not(:disabled) + .helper:before { + border-color: #526A84; +} +.wr-input-control.checkbox:active input:not(:disabled) + .helper:before { + border-color: #526A84; +} + +/* list group styles */ +.wr-list-group { + margin-top: 30px; +} + +.wr-list-group .list-group-item { + padding: 0; + position: relative; + border: none; + background: #f1f1f1; + margin-bottom: 4px; +} + +.wr-list-group .list-group-item-actions { + float: right; + margin: 0 10px; + padding: 8px 0; +} + +@media (max-width:500px) { + .wr-list-group .list-group-item-actions:before { + clear: both; + content: " "; + height: 10px; + display: block; + } + .wr-list-group .list-group-item-actions { + float: left; + } +} + +.wr-list-group .wr-list-desc { + float: left; + padding: 4px 8px; + min-height: 50px; +} + +.wr-list-group h3.wr-list-name { + margin: 0; + font-weight: 400; + font-size: 20px; + color: #555; +} + +.wr-list-group .wr-list-username { + font-weight: 100; + font-size: 13px; +} + +.wr-list-email, .wr-list-email:hover { + font-weight: 300; + font-size: 13px; + color: #526A84; +} + +.wr-sortable .list-group-item, tbody.wr-sortable td { + cursor: move; +} + +.wr-list-group .list-group-item .wr-sortable-icon, tbody.wr-sortable td .wr-sortable-icon { + opacity: 0.5; + float: left; + font-size: 14px; + margin: 15px; +} + +.wr-list-group .list-group-item .wr-list-icon, tbody.wr-sortable td .fw.wr-list-icon { + float: left; + width: 50px; + height: 50px; + line-height: 42px; + background: #526A84; + color: #fff; + font-size: 28px; + text-align: center; +} + +.wr-list-group .wr-sort-index { + font-size: 18px; + font-weight: 400; + background: #14212E; + color: #fff; + width: 50px; + height: 50px; + margin: 0; + line-height: 50px; + text-align: center; + float: left; +} + +.wr-list-group .wr-desc-list-configs { + height: 50px; + padding: 15px; + background: #14212E; + color: #fff; + text-align: center; +} + +.wr-list-group .wr-desc-list-configs b { + color: #526A84; +} + +.panel-title a .fw-stack { + font-size: 14px; +} + +.panel-title a.collapsed .fw-arrow:before { + content: "\e687"; +} + +.footer a { + text-decoration: none; +} + +.footer .fw { + font-size: 21px; +} + +.wr-hidden-nav { + background: #132D45; + margin-right: -15px; + margin-left: -15px; + display: none; + color: #fff; +} + +.wr-hidden-nav ul { + list-style: none; + margin: 0; + padding-left: 7px; +} + +.wr-hidden-nav ul li { + list-style: none; + display: inline-block; + text-align: center; + margin: 10px 3px; + line-height: 17px; +} + +.wr-hidden-nav ul li a { + color: #fff; + text-decoration: none; + width: 120px; + height: 120px; + padding: 15px; + background: #132D45; + display: block; + overflow: hidden; +} + +.wr-hidden-nav ul li a:hover { + background: #526A84; +} + +.wr-hidden-nav ul li a i { + font-size: 46px; + display: block; + margin-bottom: 10px; +} + +.cu-btn.wr-hidden-nav-toggle-btn:hover { + background: #D56613; + } + +.cu-btn.wr-hidden-nav-toggle-btn, .cu-btn.wr-hidden-nav-toggle-btn.active:hover { + background: #F47415; +} +.cu-btn.wr-hidden-nav-toggle-btn.active, .cu-btn.wr-hidden-nav-toggle-btn.active:hover { + background: #132D45; +} + + +.wr-device-list { + position: relative; +} + +.wr-hidden-operations { + width: 900px; + position: absolute; + top: 0; + bottom: 0; + left: -900px; + z-index: 10000; + -moz-transition: left 0.4s ease; + transition: left 0.4s ease 0s; + overflow-y: hidden; + overflow-x: hidden; +} + +.wr-advance-operations { + height: 100%; + background: #e4e4e4; + border: 1px solid #e4e4e4; +} + +.wr-hidden-operation { + display: none; +} + +.wr-advance-operations .row:first-child { + height: 100%; +} + +.wr-hidden-operations.toggled { + left: 0; +} + +.wr-advance-operations .wr-hidden-operations-nav a { + display: block; + background: #fff; + color: #526A84; + border-bottom: 1px solid #e4e4e4; + padding: 10px; + text-decoration: none; + font-size: 16px; +} + +.wr-advance-operations .wr-hidden-operations-nav a:hover { + background: #f4f4f4; +} + +.wr-advance-operations .wr-hidden-operations-nav a.selected, .wr-hidden-operations .wr-hidden-operations-nav a.selected:hover { + color: #fff; + background: #526A84; +} + +.wr-hidden-operations-icon { + margin-right: 10px; +} + +.wr-hidden-operations-content { + overflow-y: auto; + overflow-x: hidden; + height: 100%; + background: #fff; + border-left: 1px solid #e4e4e4; +} + +.wr-hidden-operations-content::-webkit-scrollbar { + width: 6px; + background: transparent; + padding: 0 5px; + cursor: all-scroll; +} +.wr-hidden-operations-content::-webkit-scrollbar-thumb { + background: #e4e4e4; +} +.wr-hidden-operations-content::-webkit-scrollbar-thumb:hover { + background: #e4e4e4; +} +.wr-hidden-operations-content::-webkit-scrollbar-thumb:active { + background: #e4e4e4; +} + +.wr-hidden-operations-content .panel { + margin-bottom: 0; +} + +.wr-hidden-operations-content .sub-title { + font-size: 16px; +} + +.wr-hidden-operations-content .panel-title { + padding: 5px; + background: #e4e4e4; + border-bottom: 1px solid #fff; + color: #555; +} + +.wr-hidden-operations-content .panel-title a { + padding: 0; +} + +.wr-hidden-operations-content .panel-title .fw-stack.collapsed .fw-down-arrow:before { + content: "\e634"; +} + +.wr-hidden-operations-content .panel-title .wr-input-control.switch { + margin-top: 8px; + margin-right: 0; +} + +.wr-hidden-operations-content .panel-title .wr-input-control.switch input[type="checkbox"]:not(:checked) + .helper:after { + background: #fff; +} + +.wr-hidden-operations-content .panel-title .wr-input-control.switch input[type="checkbox"] + .helper + .text { + display: inline-block; + float: left; + margin-right: 5px; + margin-top: -1px; +} + +.wr-hidden-operations-content .panel-title .wr-input-control.switch input[type="checkbox"] + .helper + .text:after { + content: "Disabled"; +} + +.wr-hidden-operations-content .panel-title .wr-input-control.switch input[type="checkbox"]:checked + .helper + .text:after { + content: "Enabled"; +} + +.wr-hidden-operations-content .panel-title label { + float: right; +} + +.wr-hidden-operations-content .panel-title .fw-stack { + width: 5px; +} + +.wr-hidden-operations-content .panel-title:after { + clear: both; + content: " "; + display: block; + height: 0; +} + +.wr-hidden-operations-content .panel-body { + padding: 5px; +} + +.wr-page-content { + position: relative; + left: 0; + -moz-transition: left 0.4s ease; + transition: left 0.4s ease; +} + +.wr-page-content.toggled { + left: 900px; +} + +a.show-operations-btn { + margin-bottom: 10px; +} + +a.show-operations-btn.selected { + background: #526A84; + color: #fff; +} + +a.show-operations-btn.selected .fw-right-arrow:before { + content: "\e662"; +} + +a.show-operations-btn.selected .btn-text:before { + content: "Hide "; +} + +a.show-operations-btn .btn-text:before { + content: "View All "; +} + +.footer { + left: 0; + -moz-transition: left 0.4s ease; + transition: left 0.4s ease; +} + +.footer.wr-hidden-operations-toggled { + left: 900px; +} + + + +/* resource selectbox specific styles */ +.select2-results .item, .select2-selection .item { + padding: 5px; +} + +.select2-results .item:after, .select2-selection .item:after { + clear: both; + content: " "; + display: block; + height: 0; +} + +.select2-results .item .text, .select2-selection .item .text { + float: left; +} + +.select2-results .item .text .resource-name, .select2-selection .item .text .resource-name { + font-size: 16px; + font-weight: 400; + line-height: normal; + } + +.select2-results .item .text .resource-type, .select2-selection .item .text .resource-type { + font-size: 13px; + line-height: normal; +} + +.select2-results .item .icon, .select2-selection .item .icon { + float: right; + padding-top: 4px; + text-align: center; + width: 40px; +} + +.select2-results .item .icon i, .select2-selection .item .icon i { + font-size: 30px; +} + +.select-resource.select2-selection { + height: 60px !important; + border-color: #E7EAED !important; + background-color: #444 !important; +} + +.select-resource .select2-selection__rendered { + color: #fff !important; + padding-right: 28px !important; +} + +.select-resource .select2-selection__arrow b { + border-width: 8px 7px 0 7px !important; + border-color: #FFF transparent transparent transparent !important; + margin-left: -15px !important; + margin-top: 12px !important; +} + +.select-resource.select2-dropdown { + z-index: 1000; +} + +.disabled-area { + opacity: 0.5; +} + +.disabled-area * { + outline: none; +} + +/* inner page title buttons */ + +.tile-buttons-list h4 { + font-weight: 400; +} + +.tile-buttons { + list-style: none; + margin: 0; + padding-left: 0; +} + +.tile-buttons li { + list-style: none; + display: inline-block; + text-align: center; + line-height: 17px; +} + +.tile-buttons li a { + color: #fff; + text-decoration: none; + width: 100%; + height: 120px; + padding: 20px; + background: #132D45; + display: block; + overflow: hidden; + text-align: center; +} + +.tile-buttons li a.selected,.tile-buttons li a.selected:hover { + background: #132D45; +} + +.tile-buttons li a.disabled,.tile-buttons li a.disabled:hover { + opacity: 0.1; + background: #132D45; + cursor: default; +} + +.tile-buttons li a:hover { + background: #526A84; +} + +.tile-buttons li a i { + font-size: 50px; + display: block; + margin-bottom: 10px; +} + +.wr-associations-list { + margin-top: 10px; +} + +.wr-associations-list .wr-association-icon, +.wr-associations-list .wr-security-status, +.wr-associations-list .wr-asset-desc, +.wr-associations-list .wr-resource-icon, +.wr-associations-list .wr-asset-details { + float: left; +} + +.wr-associations-list .wr-association-operations { + float: right; + margin-right: 10px; + padding-top: 8px; +} + +.wr-associations-list .wr-association { + background: #f1f1f1; + /*padding: 10px;*/ + margin-bottom: 4px; +} + +.wr-associations-list .wr-asset-details { + padding: 5px 10px; +} + +.wr-associations-list .wr-resource-icon { + font-size: 37px; + height: 50px; + line-height: 40px; +} + +.wr-associations-list .wr-asset-desc .resource-name { + font-weight: 500; +} + +.wr-associations-list .wr-security-status { + /*background: #97C543;*/ + background: #989898; + color: #fff; + height: 50px; + line-height: 50px; + padding: 0 10px; + margin-right: 10px; +} + +.wr-associations-list .wr-association-icon { + width: 50px; + height: 50px; + vertical-align: text-top; + line-height: 40px; + text-align: center; + font-size: 25px; + background-color: #444; + color: #fff; +} + +.wr-configurations-table th { + font-weight: 400; + text-transform: uppercase; + padding: 10px 2px; +} + +.wr-configurations-table td { + padding:5px 2px; + vertical-align: text-top; +} + +.panel-collapse { + position: relative; +} + +.loading { + position: relative; +} + +.loading:before { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 100%; + z-index: 10; + background-color: #fff; + opacity: 0.8; +} + +.loading:after { + content: "Background operation is running ..."; + z-index: 11; + background: #fe8; + color: #333; + width: 250px; + opacity: 0.8; + bottom: 25px; + display: block; + padding: 5px 10px; + position: absolute; +} + +a.cu-btn-inner.inverse { + background: #11375B; + color: #fff; +} +a.cu-btn-inner.inverse:hover { + background: #526A84; +} + +.wiz-lbl { + +} \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/css/graph.css b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/css/graph.css index 48defd85..e840175a 100644 --- a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/css/graph.css +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/css/graph.css @@ -26,6 +26,8 @@ white-space: nowrap; margin-left: 3px; bottom: -20px; + height: auto; + border-bottom: none; } /* annotations */ diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/helpers/navigation.js b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/helpers/navigation.js new file mode 100644 index 00000000..a24f6ff8 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/helpers/navigation.js @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. 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. + * + */ + +var resources = function (page, meta) { + return { + js: ['asset-helpers.js','navigation.js','popover.js'], + css: ['navigation.css','custom-desktop.css'] + }; +}; \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/js/graph_util.js b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/js/graph_util.js index d8abd244..387ae562 100644 --- a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/js/graph_util.js +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/js/graph_util.js @@ -95,7 +95,7 @@ var DateRange = convertDate(startDate) + " " + configObject.separator + " " + co $(document).ready(function () { initDate(); - groupId = $("#request-group-id").data("groupid"); + groupId = getQueryParams().groupId; $('#date-range').html(DateRange); $('#date-range').dateRangePicker(configObject) @@ -152,7 +152,7 @@ function getDateTime(from, to) { } function getStats(from, to) { - var requestData = new Object(); + var requestData = {}; var getStatsRequest; if (from) { requestData['from'] = from; @@ -168,8 +168,8 @@ function getStats(from, to) { data: requestData }); } else { - var deviceId = getUrlParameter('deviceId'); - var deviceType = getUrlParameter('deviceType'); + var deviceId = getQueryParams().deviceId; + var deviceType = getQueryParams().deviceType; requestData['deviceId'] = deviceId; requestData['deviceType'] = deviceType; @@ -181,25 +181,14 @@ function getStats(from, to) { }); } getStatsRequest.done(function (stats) { - updateGraphs(JSON.parse(stats)); + updateGraphs(stats); }); getStatsRequest.fail(function (jqXHR, textStatus) { - alert("Request failed: " + textStatus); + alert("Request failed: " + jqXHR.statusText); }); } -function getUrlParameter(paramName) { - var pageURL = window.location.search.substring(1); - var urlVariables = pageURL.split('&'); - for (var i = 0; i < urlVariables.length; i++) { - var parameterName = urlVariables[i].split('='); - if (parameterName[0] == paramName) { - return parameterName[1]; - } - } -} - function updateGraphs(stats) { console.log(stats); @@ -594,4 +583,18 @@ function summerizeBar(data) { } else { return data; } +} + +function getQueryParams() { + var qs = document.location.search.split('+').join(' '); + + var params = {}, + tokens, + re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(qs)) { + params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + } + + return params; } \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/pages/2-column-right.hbs b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/pages/2-column-right.hbs new file mode 100644 index 00000000..e5a21106 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/pages/2-column-right.hbs @@ -0,0 +1,101 @@ + + + + + + {{include title}} + + + + + + + + + + + {{css}} + + + + + + + + + + + +
+
+ {{ include header}} +
+ +
+
+ {{include body}} +
+
+
+ +{{>footer}} + + + + + + + + + + + {{js}} + {{code}} + + + + + \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/partials/analytics.hbs b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/partials/analytics.hbs index 1f2fba30..976bf164 100644 --- a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/partials/analytics.hbs +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/partials/analytics.hbs @@ -1,5 +1,4 @@
-
diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/partials/navigation.hbs b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/partials/navigation.hbs new file mode 100644 index 00000000..a2ce1900 --- /dev/null +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/partials/navigation.hbs @@ -0,0 +1,47 @@ + + + + +
+ +
+ \ No newline at end of file diff --git a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/renderers/pages/device-analytics.js b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/renderers/pages/device-analytics.js index f5c69949..3c6c94d7 100644 --- a/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/renderers/pages/device-analytics.js +++ b/modules/distribution/src/repository/jaggeryapps/store/extensions/app/store-device/themes/store/renderers/pages/device-analytics.js @@ -18,11 +18,15 @@ */ var render = function(theme, data, meta, require) { theme('2-column-right', { - title: 'Store | Device Analytics', + title: data.meta.title, header: [{ partial: 'header', context: data }], + navigation: [{ + partial: 'navigation', + context: data + }], body: [{ partial: 'analytics', context: data