Summary

Microsoft.SQLServer.Core.WebDashboards.SummaryInner (View)

Element properties:

TargetSystem.Entity
TypeMicrosoft.SystemCenter.HTMLWidgetType
AccessibilityPublic
VisibleTrue

Source Code:

<View ID="Microsoft.SQLServer.Core.WebDashboards.SummaryInner" Accessibility="Public" Enabled="true" Target="System!System.Entity" TypeID="SystemCenter!Microsoft.SystemCenter.HTMLWidgetType" Visible="true">
<Category>Operations</Category>
<WidgetConfiguration>
<Configuration>
{ "widgetDisplay": { "col": 1, "row": 1, "sizex": 18, "sizey": 9 }, "widgetParameters": { "html": "&lt;html&gt;\n&lt;head&gt;\n&lt;script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js\"&gt;&lt;/script&gt;\n&lt;script src=\"https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.0/jquery-ui.min.js\"&gt;&lt;/script&gt;\n&lt;script name=\"javascript\"&gt;\nwindow.onload = function() {\n\tvar data = [];\n\tvar alertsCache = [];\n\tvar alertsGroupedCache = [];\n\tvar excludeMonitors = ['Performance', 'Availability', 'Configuration', 'Security', 'Entity Health'];\n\tvar selectedInstanceId = '';\n\tvar classIdSelected = '';\n\tvar drilledDown = false;\n \n\tvar requestHeaders = {\n\t\tAccept: 'q=0.8;application/json;q=0.9'\n\t};\n\n\tfunction InitializeCSRFToken() {\n\t\tvar documentcookies = document.cookie.split('; ');\n\t\tvar result = {};\n\t\tfor (var i = 0; i &lt; documentcookies.length; i++) {\n\t\t\tvar cur = documentcookies[i].split('=');\n\t\t\tresult[cur[0]] = cur[1];\n\t\t}\n\t\tif (result[\"SCOM-CSRF-TOKEN\"] &amp;&amp; result[\"SCOM-CSRF-TOKEN\"] != null) {\n\t\t\trequestHeaders[\"SCOM-CSRF-TOKEN\"] = decodeURIComponent(result[\"SCOM-CSRF-TOKEN\"]);\n\t\t}\n\t}\n\n\tInitializeCSRFToken();\n\n\t\n\tfunction getAlertsDataCache(){\n\t\treturn $.ajax({\n\t\t\turl: \"/operationsmanager/data/alert/\",\n\t\t\ttype: \"POST\",\n\t\t\theaders: requestHeaders,\n\t\t\tdata: {\n\t\t\t\t'criteria': \"ResolutionState = '0'\",\n\t\t\t\t'displayColumns': ['severity', 'name', 'age', 'repeatcount', 'monitoringobjectdisplayname', 'classid', 'monitoringobjectid']\n\t\t\t},\n\t\t\terror: function (result, textStatus, errorThrown) {\n\t\t\t\tconsole.log('loading alerts data error: ' + result.responseJSON.errorMessage);\n\t\t\t},\n\t\t\tsuccess: function (result) {\n\t\t\t\tresult.rows.forEach(function(entry){\n\t\t\t\t\talertsCache.push(entry);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\n\tgetAlertsDataCache();\n\n\tfunction processAlerts(dataItem, dataItemIndex)\t{\n\t\tvar alerts = [];\n\n\t\tdataItem.instances.forEach(function(instance, instanceIndex){\n\t\t\tvar instanceAlerts = alertsCache.filter( entry =&gt; entry.monitoringobjectid == instance.id);\n\t\t\talerts = alerts.concat(instanceAlerts);\n\t\t\talertsGroupedCache[instance.id] = instanceAlerts;\n\t\t});\n\t\trenderAlerts(alerts);\n\n\t\tfunction renderAlerts(rows) \n\t\t{\n\t\t\tif(rows.length == 0) \n\t\t\t\treturn;\n\t\t\t//var totalCount = rows.length;\n\t\t\tvar criticalCounter = 0;\n\t\t\tvar informationCounter = 0;\n\t\t\tvar warningCounter = 0;\n\n\t\t\trows.forEach(function(row)\n\t\t\t{\n\t\t\t\t\tswitch(row.severity)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase \"Error\":\n\t\t\t\t\t\t\tcriticalCounter++; break;\n\t\t\t\t\t\tcase \"Information\":\n\t\t\t\t\t\t\tinformationCounter++; break;\n\t\t\t\t\t\tcase \"Warning\":\n\t\t\t\t\t\t\twarningCounter++; break;\n\t\t\t\t\t}\n\t\t\t});\n\n\t\t\trenderChart(criticalCounter, warningCounter, informationCounter);\n\n\t\t\t//console.log(`done renderAlerts: ${dataItem.classId}, count: ${rows.length}`);\n\t\t}\n\t\t// console.log(`done renderAlerts: ${dataItem.classId}, count: ${alerts.length}`);\n\n\t\tfunction renderChart(criticalCounter, warningCounter, informationCounter) \n\t\t{\n\t\t\tif(criticalCounter &gt; 0)\n\t\t\t{\n\t\t\t\tstateCount = criticalCounter;\n\t\t\t\tstateMessage = 'CRITICAL';\n\t\t\t\tcolor = 'critical-alert';\n\t\t\t}\n\t\t\telse if(warningCounter &gt; 0)\n\t\t\t{\n\t\t\t\tstateCount = warningCounter;\n\t\t\t\tstateMessage = 'WARNING';\n\t\t\t\tcolor = 'warning-alert';\n\t\t\t}\n\t\t\telse if(informationCounter &gt; 0)\n\t\t\t{\n\t\t\t\tstateCount = informationCounter;\n\t\t\t\tstateMessage = 'INFORMATION';\n\t\t\t\tcolor = 'ok-group';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tstateCount = 0;\n\t\t\t\tstateMessage = 'NO ALERTS';\n\t\t\t\tcolor = 'no-alert';\n\t\t\t\t// console.log(`done renderChart; no alerts`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t//stateCount = stateCount + ' of ' + totalCount;\n\t\t\t\n\t\t\tvar group = $(`div[classId|='${dataItem.classId}']`);\n\t\t\tvar spans = $(group).find('.alerts span');\n\t\t\tspans.eq(1).text(stateCount);\n\t\t\tspans.eq(2).text(stateMessage);\n\t\t\tvar tile = $(group).find('.alerts');\n\t\t\ttile.removeClass('no-alert');\n\t\t\ttile.addClass(color);\n\n\t\t\t// console.log(`done renderChart; count: ${stateCount}`);\n\t\t}\n\t}\n\n\t\n\tfunction getCachedAlerts(instanceId){\n\t\tvar result = alertsGroupedCache[instanceId];\n\t\t$('.alert').remove(); // clean old records\n\t\tif(result)\n\t\t\tresult.forEach(function(entry){\n\t\t\t\t$('#alerts-table').append('&lt;tr style=\"line-height:20px\" class=\"alert\"&gt;&lt;td&gt;' + entry.name + '&lt;/td&gt;&lt;td&gt;' + entry.age + '&lt;/td&gt;&lt;td&gt;' + entry.repeatcount + '&lt;/td&gt;&lt;/tr&gt;');\n\t\t\t});\n\t\telse\n\t\t\tconsole.log(`getCachedAlerts: alertsGroupedCache doesn't have key ${instanceId}`);\n\t}\n\n\tfunction getChildCachedAlerts(instances){\n\t\tvar alerts = [];\n\t\tif(alertsGroupedCache.includes(instances[0].id))\n\t\t\treturn;\n\t\tinstances.forEach(function(instance, instanceIndex){\n\t\t\tvar instanceAlerts = alertsCache.filter( entry =&gt; entry.monitoringobjectid == instance.id);\n\t\t\talerts = alerts.concat(instanceAlerts);\n\t\t\talertsGroupedCache[instance.id] = instanceAlerts;\n\t\t});\n\t}\n\n\t// not used anymore\n\t// function getAlerts(name, classId){\n\t// \treturn $.ajax({\n\t// \t\turl: \"/operationsmanager/data/alert/\",\n\t// \t\ttype: \"POST\",\n\t// \t\theaders: requestHeaders,\n\t// \t\tdata: {\n\t// \t\t\t'classId': classId,\n\t// \t\t\t'objectIds': null,\n\t// \t\t\t'criteria': \"ResolutionState = '0'\",\n\t// \t\t\t'displayColumns': ['severity', 'name', 'age', 'repeatcount', 'monitoringobjectdisplayname']\n\t// \t\t},\n\t// \t\terror: function (result, textStatus, errorThrown) {\n\t// \t\t\t//alert('error!');\n\t// \t\t},\n\t// \t\tsuccess: function (result) {\n\t// \t\t\tif(name != null){\n\t// \t\t\t\t$('.alert').remove(); // clean old records\n\t// \t\t\t\tresult.rows.forEach(function(entry){\n\t// \t\t\t\t\tif(entry.monitoringobjectdisplayname == name)\n\t// \t\t\t\t\t\t$('#alerts-table').append('&lt;tr style=\"line-height:20px\" class=\"alert\"&gt;&lt;td&gt;' + entry.name + '&lt;/td&gt;&lt;td&gt;' + entry.age + '&lt;/td&gt;&lt;td&gt;' + entry.repeatcount + '&lt;/td&gt;&lt;/tr&gt;');\n\t// \t\t\t\t});\n\t// \t\t\t}\n\t// \t\t}\n\t// \t});\n\t// }\n\t\n\tfunction getMonitors(instance){\n\t\treturn $.ajax({\n\t\t\turl: \"/operationsmanager/data/object/monitors/\",\n\t\t\ttype: \"POST\",\n\t\t\theaders: requestHeaders,\n\t\t\tdata: {\n\t\t\t\t\"id\": instance.id,\n\t\t\t},\n\t\t\terror: function (result, textStatus, errorThrown) {\n\t\t\t\t//alert('error!');\n\t\t\t},\n\t\t\tsuccess: function (result) {\n\t\t\t\tresult.rows.forEach(function(entry){\n\t\t\t\t\tvar clas = 'no-states';\n\t\t\t\t\tvar state = 'NOT MONITORED'\n\t\t\t\t\tif(entry.state.includes('omplete'))\n\t\t\t\t\t{\n\t\t\t\t\t\tclas = 'ok-group';\n\t\t\t\t\t\tstate = 'HEALTHY';\n\t\t\t\t\t}\n\t\t\t\t\telse if(entry.state.includes('ritical'))\n\t\t\t\t\t{\n\t\t\t\t\t\tclas = 'critical-group';\n\t\t\t\t\t\tstate = 'CRITICAL';\n\t\t\t\t\t}\n\t\t\t\t\telse if(entry.state.includes('arning'))\n\t\t\t\t\t{\n\t\t\t\t\t\tclas = 'warning-group';\n\t\t\t\t\t\tstate = 'WARNING';\n\t\t\t\t\t}\n\t\t\t\t\telse if(entry.state.includes('nknown'))\n\t\t\t\t\t{\n\t\t\t\t\t\tclas = 'no-states';\n\t\t\t\t\t\tstate = 'UNKNOWN';\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif(excludeMonitors.includes(entry.displayname))\n\t\t\t\t\t\treturn;\n\t\t\t\t\tvar name = entry.displayname.length &gt; 50\n\t\t\t\t\t\t? entry.displayname.substring(0, 50) + '...'\n\t\t\t\t\t\t: entry.displayname;\n\t\t\t\t\tvar date = new Date(entry.laststatechange);\n\t\t\t\t\tvar seconds = date.getSeconds();\n\t\t\t\t\tvar secondsString = seconds &gt; 9 ? seconds + '' : '0' + seconds;\n\t\t\t\t\tvar displayDate = (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear() + ' ' + date.getHours() + ':' + date.getMinutes() + ':' + secondsString;\n\t\t\t\t\t$('#monitors').append('&lt;div class=\"monitor ' + clas + '\" name=\"' + instance.id + '\"&gt;&lt;span class=\"name\"&gt;' + name + '&lt;/span&gt;&lt;span class=\"state\"&gt;' + state + '&lt;/span&gt;&lt;span class=\"date\"&gt;' + displayDate + '&lt;/span&gt;&lt;/div&gt;');\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n\t\n\tfunction onGroupClick(group) {\n\t\t$('#monitor-group').html(group.html());\n\t\t$('#monitor-group .tile').css('width', 174);\n\t\t$('#monitor-group .group-header').remove();\n\t\tvar classId = group.attr('classId');\n\t\tif(classId == null || classId == ''){\n\t\t\tclassId = classIdSelected;\n\t\t}\n\t\tvar name = group.find('.group-header').text();\n\t\t$('#group-name span').text(' | ' + name);\n\t\t$('.group').hide();\n\t\t$('#group-name, #properties-table, #alerts-table, #alerts-caption, .state-header').show();\n\n\t\tvar instances = [];\n\t\tvar dataItem = data.find(function(item){\n\t\t\treturn item.classId == classId;\n\t\t});\n\t\tif(group.hasClass('group')){\n\t\t\t$('#monitor-group').show();\n\t\t\tclassIdSelected = classId;\n\t\t\tinstances = dataItem.instances;\n\t\t\tdrilledDown = false;\n\t\t\t//getChildInstancesOf(dataItem);\n\t\t}else{\n\t\t\tvar instance = dataItem.instances.find(function(i){\n\t\t\t\treturn i.id == selectedInstanceId;\n\t\t\t});\n\t\t\tinstances = instance.childs;\n\t\t\tdrilledDown = true;\n\t\t\t$('#monitor-group').hide();\n\t\t\tgetChildCachedAlerts(instances);\n\t\t}\n\t\tvar hasCritical = false;\n\t\tvar hasWarning = false;\n\t\tvar hasUnknown = false;\n\t\tvar hasHealthy = false;\n\t\t$('.instance').remove();\n\t\tinstances.forEach(function(instance){\n\t\t\tvar name = instance.displayname !== undefined ? instance.displayname : instance.displayName;\n\t\t\tvar div = '&lt;div class=\"instance\" name=\"' + instance.id + '\"&gt;' + name + '&lt;/div&gt;';\n\t\t\tif (instance.healthstate == 'critical' || ( instance.healthIconUrl !== undefined &amp;&amp; instance.healthIconUrl.includes('Critical')))\n\t\t\t{\n\t\t\t\t$('.critical-instance').after(div);\n\t\t\t\thasCritical = true;\n\t\t\t}\n\t\t\telse if(instance.healthstate == 'warning' || ( instance.healthIconUrl !== undefined &amp;&amp; instance.healthIconUrl.includes('Warning')))\n\t\t\t{\n\t\t\t\t$('.warning-instance').after(div);\n\t\t\t\thasWarning = true;\n\t\t\t}\n\t\t\telse if(instance.healthstate == 'unknown' || ( instance.healthIconUrl !== undefined &amp;&amp; instance.healthIconUrl.includes('Unknown')))\n\t\t\t{\n\t\t\t\t$('.unknown-instance').after(div);\n\t\t\t\thasUnknown = true;\n\t\t\t}\n\t\t\telse if(instance.healthstate == 'healthy' || ( instance.healthIconUrl !== undefined &amp;&amp; instance.healthIconUrl.includes('Healthy')))\n\t\t\t{\n\t\t\t\t$('.ok-instance').after(div);\n\t\t\t\thasHealthy = true;\n\t\t\t}\n\t\t});\n\t\t\n\t\tif(!hasCritical)\n\t\t\t$('.critical-instance').hide();\n\t\tif(!hasWarning)\n\t\t\t$('.warning-instance').hide();\n\t\tif(!hasUnknown)\n\t\t\t$('.unknown-instance').hide();\n\t\tif(!hasHealthy)\n\t\t\t$('.ok-instance').hide();\n\t\t\n\t\t$('.instance').click(function() {\n\t\t\t$('.instance').css('border', '1px solid white');\n\t\t\t$('.instance').css('font-weight', 'normal');\n\t\t\t$(this).css('border', '1px solid LightBlue');\n\t\t\t$(this).css('font-weight', 'bold');\n\t\t\tvar id = $(this).attr('name');\n\t\t\tif(!drilledDown)\n\t\t\t{\n\t\t\t\tselectedInstanceId = id;\n\t\t\t\t//getCachedAlerts(id);\n\t\t\t}\t\t\t\n\t\t\tgetCachedAlerts(id);\n\t\t\t//getAlerts($(this).text(), null);\n\t\t\tvar healthExplorer = $('#group-name a:eq(1)');\n\t\t\thealthExplorer.attr('href', '/MonitoringView/ResultViews/ViewTypeHealthExplorer.aspx?targetId=' + id);\n\t\t\thealthExplorer.show();\n\t\t\t$('#properties-container').empty();\n\t\t\tvar dataItem = data.find(function(item){\n\t\t\t\treturn item.classId == classIdSelected;\n\t\t\t});\n\t\t\tvar instance = dataItem.instances.find(function(i){\n\t\t\t\treturn i.id == selectedInstanceId;\n\t\t\t});\n\t\t\tif(drilledDown)\n\t\t\t\tinstance = instance.childs.find(function(child){\n\t\t\t\t\treturn child.id == id;\n\t\t\t\t});\n\t\t\tinstance.properties.forEach(function(property){\n\t\t\t\tif(property.value != null &amp;&amp; property.value != '')\n\t\t\t\t\t$('#properties-container').append('&lt;b&gt;' + property.name + '&lt;/b&gt;&lt;br&gt;' + property.value + '&lt;br&gt;&lt;br&gt;');\n\t\t\t});\n\n\t\t\t$('.monitor').hide();\n\t\t\t$('.monitor[name=\"' + id + '\"]').show();\n\t\t\t$('#monitors-dispatcher, #monitors').show();\n\t\t});\n\t\t\n\t\t$('.instance:first').trigger('click');\n\t}\n\t\n\t$('#group-name a:first').click(function() {\n\t\tif(drilledDown){\n\t\t\tvar group = $('.group[classId=\"' + classIdSelected + '\"]');\n\t\t\tonGroupClick(group);\n\t\t}else{\n\t\t\t$('.group').show();\n\t\t\t$('#group-name, #properties-table, #alerts-table, #alerts-caption, #monitors-dispatcher, #monitors').hide();\n\t\t\t$('.instance').remove();\n\t\t\t$('.monitor').hide();\n\t\t}\n\t\tdrilledDown = false;\n\t});\n\t\n\tfunction renderState(group) {\n\t\tvar classId = group.attr('classId');\n\t\tvar stateCount = '0';\n\t\tvar stateMessage = 'NO STATES';\n\t\tvar color = 'no-states';\n\n\t\tif(classId != null &amp;&amp; classId)\n\t\treturn $.ajax({\n\t\t\turl: \"/operationsmanager/data/state\",\n\t\t\ttype: \"POST\",\n\t\t\theaders: requestHeaders,\n\t\t\tdata: {\n \"classId\": classId,\n \"objectIds\": [],\n \"criteria\": null,\n \"displayColumns\":[\"displayname\", \"healthstate\"]\n },\n\t\t\terror: function (result, textStatus, errorThrown) {\n\t\t\t\tconsole.log('loading state data error: ' + result.responseJSON.errorMessage);\n\t\t\t\tgroup.removeAttr('classId');\n\t\t\t},\n\t\t\tsuccess: function (result) {\n\t\t\t\tvar totalCount = result.rows.length;\n\t\t\t\tvar criticalCount = 0;\n\t\t\t\tvar warningCount = 0;\n\t\t\t\tvar unknownCount = 0;\n\t\t\t\tvar healthyCount = 0;\n\t\t\t\tresult.rows.forEach(function(row) {\n\t\t\t\t\tif(row.healthstate == 'critical')\n\t\t\t\t\t\tcriticalCount++;\n\t\t\t\t\telse if(row.healthstate == 'warning')\n\t\t\t\t\t\twarningCount++;\n\t\t\t\t\telse if(row.healthstate == 'unknown')\n\t\t\t\t\t\tunknownCount++;\n\t\t\t\t\telse if(row.healthstate == 'healthy')\n\t\t\t\t\t\thealthyCount++;\n\t\t\t\t\t});\n\t\t\t\tif(criticalCount &gt; 0)\n\t\t\t\t{\n\t\t\t\t\tstateCount = criticalCount;\n\t\t\t\t\tstateMessage = 'CRITICAL';\n\t\t\t\t\tcolor = 'critical-group';\n\t\t\t\t}\n\t\t\t\telse if(warningCount &gt; 0)\n\t\t\t\t{\n\t\t\t\t\tstateCount = warningCount;\n\t\t\t\t\tstateMessage = 'WARNING';\n\t\t\t\t\tcolor = 'warning-group';\n\t\t\t\t}\n\t\t\t\telse if(unknownCount &gt; 0)\n\t\t\t\t{\n\t\t\t\t\tstateCount = unknownCount;\n\t\t\t\t\tstateMessage = 'UNKNOWN';\n\t\t\t\t\tcolor = 'unknown-group';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstateCount = healthyCount;\n\t\t\t\t\tstateMessage = 'HEALTHY';\n\t\t\t\t\tcolor = 'ok-group';\n\t\t\t\t}\n\t\t\t\tstateCount = stateCount + ' of ' + totalCount;\n\t\t\t\tvar spans = $(group).find('.state span');\n\t\t\t\tspans.eq(1).text(stateCount);\n\t\t\t\tspans.eq(2).text(stateMessage);\n\t\t\t\tvar tile = $(group).find('.state');\n\t\t\t\ttile.removeClass('no-states');\n\t\t\t\ttile.addClass(color);\n\t\t\t\t\n\t\t\t\tdata.push({'classId': classId, 'instances': result.rows});\n\t\t\t}\n\t\t});\n\t}\n\t\n\tfunction getInstances(dataItem, dataItemIndex){\n\t\tvar queries = [];\n\t\tdataItem.instances.forEach(function(instance, instanceIndex){\n\t\t\tvar query = $.ajax({\n\t\t\t\turl: '/operationsmanager/data/objectInformation/' + instance.id,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: requestHeaders,\n\t\t\t\terror: function (result, textStatus, errorThrown) {\n\t\t\t\t\tconsole.log('get instance error ' + result.responseJSON.errorMessage);\n\t\t\t\t},\n\t\t\t\tsuccess: function (result) {\n\t\t\t\t\tdata[dataItemIndex].instances[instanceIndex].properties = result.monitoringObjectProperties;\n\t\t\t\t\tdata[dataItemIndex].instances[instanceIndex].childs = result.relatedObjects;\n\t\t\t\t\tqueries.push(getMonitors(instance));\n\t\t\t\t}\n\t\t\t});\n\t\t\tqueries.push(query);\n\t\t});\n\t\t\n\t\t$.when.apply(null, queries).done(function(){\n\t\t\t\tprocessAlerts(dataItem, dataItemIndex);\n\t\t\t\tvar group = $(`div[classId|='${dataItem.classId}']`);\n\t\t\t\tif(group.hasClass('no-child'))\n\t\t\t\t\treturn;\n\t\t\t\tdataItem.instances.forEach(function(instance, instanceIndex){\n\t\t\t\t\tinstance.childs.forEach(function(child, childIndex){\n\t\t\t\t\t\t// Ugly check to found if instance or child already was loaded\n\t\t\t\t\t\tvar found = false;\n\t\t\t\t\t\tdata.forEach(function(innerDataItem, innerDataItemIndex){\n\t\t\t\t\t\t\tif(found) return;\n\t\t\t\t\t\t\tinnerDataItem.instances.forEach(function(innerInstance){\n\t\t\t\t\t\t\t\tif(found) return;\n\t\t\t\t\t\t\t\tif(innerInstance.id == child.id &amp;&amp; innerInstance.properties){\n\t\t\t\t\t\t\t\t\tdata[dataItemIndex].instances[instanceIndex].childs[childIndex].properties = innerInstance.properties;\n\t\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tinstance.childs.forEach(function(innerChild){\n\t\t\t\t\t\t\t\t\tif(found) return;\n\t\t\t\t\t\t\t\t\tif(innerChild.id == child.id &amp;&amp; innerChild.properties){\n\t\t\t\t\t\t\t\t\t\tdata[dataItemIndex].instances[instanceIndex].childs[childIndex].properties = innerChild.properties;\n\t\t\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(found) return;\n\t\t\t\t\t\t\n\t\t\t\t\t\t// If not - loading\n\t\t\t\t\t\tvar childQuery = $.ajax({\n\t\t\t\t\t\t\turl: '/operationsmanager/data/objectInformation/' + child.id,\n\t\t\t\t\t\t\ttype: \"GET\",\n\t\t\t\t\t\t\theaders: requestHeaders,\n\t\t\t\t\t\t\terror: function (result, textStatus, errorThrown) {\n\t\t\t\t\t\t\t\tconsole.log('get instance child error ' + result.responseJSON.errorMessage);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsuccess: function (childResult) {\n\t\t\t\t\t\t\t\tdata[dataItemIndex].instances[instanceIndex].childs[childIndex].properties = childResult.monitoringObjectProperties;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tqueries.push(childQuery);\n\t\t\t\t\t\tqueries.push(getMonitors(child));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t});\n\n\t\t// $.when.apply(null, queries).done(\n\t\t// \tprocessAlerts(dataItem, dataItemIndex),\n\t\t// \tgetChildInstances()\n\t\t// );\t\t\n\t\t\n\t\treturn queries;\n\t}\n\t\n\t// ---\n\t// Tried to make loading ChildInstances to be separate and called on groupClick, but it needs some more work: Missing dataItemIndex value.\n\t// See Product Backlog Item 31816: [Web Dashboards] Split child monitors REST requests to be called separately - requests fail in chrome if too many objects monitored\n\t// ---\n\t// function getChildInstancesOf(dataItem){\n\t// \tdataItem.instances.forEach(function(instance, instanceIndex){\n\t// \t\tinstance.childs.forEach(function(child, childIndex){\n\t// \t\t\t// Ugly check to found if instance or child already was loaded\n\t// \t\t\tvar found = false;\n\t// \t\t\tdata.forEach(function(innerDataItem, innerDataItemIndex){\n\t// \t\t\t\tif(found) return;\n\t// \t\t\t\tinnerDataItem.instances.forEach(function(innerInstance){\n\t// \t\t\t\t\tif(found) return;\n\t// \t\t\t\t\tif(innerInstance.id == child.id &amp;&amp; innerInstance.properties){\n\t// \t\t\t\t\t\tdata[dataItemIndex].instances[instanceIndex].childs[childIndex].properties = innerInstance.properties;\n\t// \t\t\t\t\t\tfound = true;\n\t// \t\t\t\t\t\treturn;\n\t// \t\t\t\t\t}\n\t// \t\t\t\t\tinstance.childs.forEach(function(innerChild){\n\t// \t\t\t\t\t\tif(found) return;\n\t// \t\t\t\t\t\tif(innerChild.id == child.id &amp;&amp; innerChild.properties){\n\t// \t\t\t\t\t\t\tdata[dataItemIndex].instances[instanceIndex].childs[childIndex].properties = innerChild.properties;\n\t// \t\t\t\t\t\t\tfound = true;\n\t// \t\t\t\t\t\t\treturn;\n\t// \t\t\t\t\t\t}\n\t// \t\t\t\t\t});\n\t// \t\t\t\t});\n\t// \t\t\t});\n\t// \t\t\tif(found) return;\n\t\t\t\t\n\t// \t\t\t// If not - loading\n\t// \t\t\tvar childQuery = $.ajax({\n\t// \t\t\t\turl: '/operationsmanager/data/objectInformation/' + child.id,\n\t// \t\t\t\ttype: \"GET\",\n\t// \t\t\t\theaders: requestHeaders,\n\t// \t\t\t\terror: function (result, textStatus, errorThrown) {\n\t// \t\t\t\t\tconsole.log('error');\n\t// \t\t\t\t},\n\t// \t\t\t\tsuccess: function (childResult) {\n\t// \t\t\t\t\tdata[dataItemIndex].instances[instanceIndex].childs[childIndex].properties = childResult.monitoringObjectProperties;\n\t// \t\t\t\t}\n\t// \t\t\t});\n\t// \t\t\t//queries.push(childQuery);\n\t// \t\t\t//$.when(childQuery).done(getMonitors(child));\n\t// \t\t\tgetMonitors(child);\n\t// \t\t});\n\t// \t});\n\t// }\n\t\n\n\tvar clickHandlerAttached = false;\n\tfunction getDataItem(dataItem, dataItemIndex){\n\t\tvar q = getInstances(dataItem, dataItemIndex);\n\t\t$.when.apply(null, q).done(function(){\n\t\t\tif(dataItemIndex + 1 &lt; data.length){\n\t\t\t\tgetDataItem(data[dataItemIndex + 1], dataItemIndex + 1);\n\t\t\t}else if(!clickHandlerAttached){\n\t\t\t\tclickHandlerAttached = true;\n\t\t\t\t$('.group, #monitor-group').click(function(e){\n\t\t\t\t\tvar group = $(e.target).parents('.group');\n\t\t\t\t\tonGroupClick(group);\n\t\t\t\t});\n\t\t\t\t$(\"body\").css(\"cursor\", \"default\");\n\t\t\t\t$('#waitBackground').hide();\n\t\t\t}\n\t\t});\n\t}\n\n\t$(\"body\").css(\"cursor\", \"progress\");\n\t$('#waitBackground').show();\n\t$('.widget-body').css('overflow', 'hidden');\n\tvar stateQueries = [];\n\t$('.group').each(function(index) {\n\t\tvar q = renderState($(this));\n\t\tif(q != null &amp;&amp; q)\n\t\t\tstateQueries.push(q);\n\t});\n\n\tfunction waitQueries(index){\n\t\tvar callback = function(){\n\t\t\tif(index &lt; stateQueries.length){\n\t\t\t\twaitQueries(index + 1);\n\t\t\t}else{\n\t\t\t\tgetDataItem(data[0], 0);\n\t\t\t}\n\t\t};\n\t\t$.when(stateQueries[index]).then(\n\t\t\tcallback,\n\t\t\tcallback\n\t\t);\n\t}\n\twaitQueries(0);\n};\n&lt;/script&gt;\n\n&lt;style&gt;\nhtml{ height: 100%; overflow: hidden; font-family: Segoe UI!important; }\nbody{ height: 100%; }\n#canvas\n{\n\tmin-height: 900px;\n\twidth: 100%;\n\tbackground-color: #E3E8FC;\n\tposition: relative;\n}\n.group\n{\n\tposition: relative;\n\tdisplay: inline-block;\n\twidth: 20%;\n\theight: 10%;\n\tmargin: 0px 10px 40px 10px;\n\tpadding: 0;\n\twhite-space: nowrap;\n\tfont-size: 0;\n\tmin-height: 190px;\n\tmin-width: 380px;\n\tcursor: pointer;\n}\n#monitor-group\n{\n\tposition: relative;\n\tdisplay: none;\n\twidth: 20%;\n\theight: 10%;\n\tmargin-bottom: 8px;\n margin-right: 8px;\n\tpadding: 0;\n\twhite-space: nowrap;\n\tfont-size: 0;\n\tmin-height: 170px;\n\tmin-width: 348px;\n\tcursor: pointer;\n\tfloat: left;\n}\n.group-header\n{\n\tdisplay: block;\n\tfont-size: 18px;\n\twidth: 100%;\n}\n.tile\n{\n\tdisplay: block;\n\tposition: relative;\n\tfloat: left;\n\tmargin: 0;\n\twidth: 50%;\n\theight: 100%;\n\tborder: 0;\n\twhite-space: normal;\n\twidth: 190px;\n\tfont-size: 16px;\n\tcolor: white;\n\t-webkit-transition: all 0.3s ease;\n\t-moz-transition: all 0.3s ease;\n\t-o-transition: all 0.3s ease;\n\ttransition: all 0.3s ease;\n}\n.tile span:nth-child(1)\n{\n\tdisplay: block;\n\tmargin-left: 5px;\n\tmargin-top: 3px;\n}\n.tile span:nth-child(2)\n{\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\twidth: 70%;\n\theight: 20%;\n\tmargin: auto;\n\ttext-align: center;\n\tfont-size: 20px;\n}\n.tile span:nth-child(3)\n{\n\tposition: absolute;\n\tbottom: 25%;\n\tleft: 0;\n\tright: 0;\n\twidth: 50%;\n\theight: 20%;\n\tmargin: auto;\n\ttext-align: center;\n\tfont-weight: bold;\n}\n\n\n.ok-group\n{\n\tbackground-color: #4CB04E;\n}\n.warning-group\n{\n\tbackground-color: #F47F16;\n}\n.critical-group\n{\n\tbackground-color: #E53935;\n}\n\n.no-alert\n{\n\tbackground-color: #0288CF;\n}\n.warning-alert, .error-alert\n{\n\tbackground-color: #F47F16;\n}\n.critical-alert\n{\n\tbackground-color: #E53935;\n}\n\n.ok-instance\n{\n\tcolor: #4CB04E;\n}\n.warning-instance\n{\n\tcolor: #F47F16;\n}\n.critical-instance\n{\n\tcolor: #E53935;\n}\n\n.unknown-instance\n{\n\tcolor: #0288CF;\n}\n\n.no-states, .unknown-group\n{\n\tbackground-color: #0288CF;\n}\n.pale\n{\n\topacity: 0.15;\n}\n\n#group-name\n{\n\tmargin-left: 10px;\n\tmargin-bottom: 5px;\n\tdisplay: none;\n}\n#group-name a\n{\n\tcursor: pointer;\n\tcolor: blue;\n}\n\n#properties-table\n{\n\twidth: 685px;\n\tmax-width: 685px;\n\theight: 530px;\n\tbackground-color: white;\n\tmargin-left: 10px;\n\tdisplay: none;\n\ttable-layout:fixed;\n\toverflow-wrap: break-word;\n}\nth\n{\n\tborder-bottom: 1px solid gray;\n\theight: 20px;\n}\n.instance\n{\n\tcursor: pointer;\n\tborder: 1px solid white;\n}\n.state-header\n{\n\tfont-weight: bold;\n}\n#properties-container\n{\n\toverflow-y: scroll;\n\theight: 100%;\n}\n\n#instance-container\n{\n\toverflow-y: scroll;\n\theight: 100%;\n}\n\n#alerts-caption\n{\n\tdisplay: none;\n\tposition: absolute;\n\tleft: 10px;\n\ttop: 560px;\n}\n\n#alerts-table\n{\n\tposition: absolute;\n\tleft: 10px;\n\ttop: 580px;\n\twidth: 685px;\n\tbackground-color: white;\n\tdisplay: none;\n overflow-y: scroll;\n}\n\n#monitors-dispatcher\n{\n\tdisplay: none;\n\tposition: absolute;\n\tleft: 720px;\n\ttop: 23px;\n\theight: 780px;\n\twidth: 948px;\n\toverflow-x: auto;\n}\n\n#monitors\n{\n\tposition: absolute;\n\theight: 100%;\n\twidth: 950px;\n}\n\n.monitor\n{\n\twidth: 150px;\n\theight: 150px;\n\tfloat: left;\n\tmargin-bottom: 8px;\n\tmargin-right: 8px;\n\tdisplay: none;\n\tposition: relative;\n\tcolor: white;\n\tpadding: 10px;\n}\n\n.monitor span.name\n{\n\tposition: absolute;\n\ttop: 60px;\n\ttext-align: center;\n\twidth: 150px;\n\ttransform: translateY(-50%);\n}\n\n.monitor span.state\n{\n\tposition: absolute;\n\ttop: 110px;\n\ttext-align: center;\n\twidth: 150px;\n\tfont-weight: bold;\n\tfont-size: large;\n}\n\n.monitor span.date\n{\n\tposition: absolute;\n\ttop: 150px;\n\ttext-align: center;\n\twidth: 150px;\n\tfont-size: smaller;\n}\n\n#waitBackground\n{\n\tposition: fixed;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 999;\n\tdisplay: none;\n\tbackground-color: black;\n\topacity: 0.5;\n}\n&lt;/style&gt;\n&lt;/head&gt;\n\n&lt;body&gt;\n&lt;div id=\"waitBackground\"&gt;&lt;/div&gt;\n&lt;div id=\"canvas\"&gt;\n\t&lt;div class=\"group\" classId=\"Microsoft.SQLServer.Core.Library!Microsoft.SQLServer.Core.DBEngine\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;SQL Server Instances&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0 of 0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\t\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n\t&lt;div class=\"group\" classId=\"Microsoft.SQLServer.Core.Library!Microsoft.SQLServer.Core.Database\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;SQL Server Databases&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0 of 0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\t\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n\t&lt;div class=\"group\" classId=\"Microsoft.SqlServer.Azure!Microsoft.SqlServer.Azure.Server\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;Azure SQL Database&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\t\n\t&lt;div class=\"group\" classId=\"Microsoft.Azure.ManagedInstance.Discovery!Microsoft.Azure.ManagedInstance.DBEngine\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;Managed Instances&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n\t&lt;div class=\"group\" classId=\"Microsoft.SQLServer.Replication.Core.Library!Microsoft.SQLServer.Replication.Core.DatabaseHealth\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;SQL Server Replication&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n\t&lt;div class=\"group\" classId=\"Microsoft.SQLServer.Core.Library!Microsoft.SQLServer.Core.AvailabilityGroup\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;SQL Server Always On Availability Groups&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0 of 0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n\t&lt;div class=\"group no-child\" classId=\"Microsoft.SQLServer.ReportingServices.Windows.Discovery!Microsoft.SQLServer.ReportingServices.Windows.Instance\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;SQL Server Reporting Services Instances&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n\t&lt;div class=\"group no-child\" classId=\"Microsoft.SQLServer.AnalysisServices.Windows.Discovery!Microsoft.SQLServer.AnalysisServices.Windows.Instance\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;SQL Server Analysis Services Instances&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n\t&lt;div class=\"group\" classId=\"Microsoft.SQLServer.IS.Windows!Microsoft.SQLServer.IS.Windows.LocalInstance\"&gt;\n\t\t&lt;span class=\"group-header\"&gt;SQL Server Integration Services Instances&lt;/span&gt;\n\t\t&lt;div class=\"tile state no-states\"&gt;\n\t\t\t&lt;span&gt;State&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO STATES&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t\t&lt;div class=\"tile alerts no-alert\"&gt;\n\t\t\t&lt;span&gt;Alerts&lt;/span&gt;\n\t\t\t&lt;span&gt;0&lt;/span&gt;\n\t\t\t&lt;span&gt;NO ALERTS&lt;/span&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n\t\n\t&lt;div id=\"group-name\"&gt;&lt;a src=\"#\"&gt;&amp;lt; BACK&lt;/a&gt;&lt;span&gt;&lt;/span&gt; | &lt;a target=\"_blank\" rel=\"noopener noreferrer\" style=\"display: none;\"&gt;Health Explorer&lt;/a&gt;&lt;/div&gt;\n\t&lt;table id=\"properties-table\"&gt;\n\t\t&lt;tr&gt;&lt;th style=\"border-right: 1px solid LightBlue; padding: 0;\"&gt;Filter&lt;/th&gt;&lt;th&gt;Details&lt;/th&gt;&lt;/tr&gt;\n\t\t&lt;tr&gt;\n\t\t\t&lt;td style=\"border-right: 1px solid LightBlue; padding: 0; width: 250px;\" valign=\"top\"&gt;\n\t\t\t&lt;div id=\"instance-container\"&gt;\n\t\t\t\t&lt;div class=\"state-header critical-instance\"&gt;CRITICAL&lt;/div&gt;\n\t\t\t\t&lt;div class=\"state-header warning-instance\"&gt;WARNING&lt;/div&gt;\n\t\t\t\t&lt;div class=\"state-header unknown-instance\"&gt;UNKNOWN&lt;/div&gt;\n\t\t\t\t&lt;div class=\"state-header ok-instance\"&gt;HEALTHY&lt;/div&gt;\n\t\t\t&lt;/td&gt;\n\t\t\t&lt;/div&gt;\n\t\t\t&lt;td style=\"padding: 0; width: 435px;\"&gt;&lt;div id=\"properties-container\"&gt;&lt;/div&gt;&lt;/td&gt;\n\t\t&lt;/tr&gt;\n\t&lt;/table&gt;\n\t&lt;div id=\"alerts-caption\"&gt;Active alerts:&lt;/div&gt;\n\t&lt;table id=\"alerts-table\"&gt;\n\t\t&lt;tr style=\"line-height:20px\"&gt;&lt;th&gt;Name&lt;/th&gt;&lt;th&gt;Age&lt;/th&gt;&lt;th&gt;Repeat count&lt;/th&gt;&lt;/tr&gt;\n\t&lt;/table&gt;\n\t&lt;div id=\"monitors-dispatcher\"&gt;\n\t\t&lt;div id=\"monitors\"&gt;\n\t\t\t&lt;div id=\"monitor-group\"&gt;&lt;/div&gt;\n\t\t&lt;/div&gt;\n\t&lt;/div&gt;\n&lt;/div&gt;\n\n&lt;/body&gt;\n&lt;/html&gt;\n" }, "widgetRefreshInterval": 480 }
</Configuration>
<Type>HtmlCustomWidget</Type>
</WidgetConfiguration>
</View>