├── .gitignore ├── Examples ├── ACESystemsReport-SystemsReport.mht ├── Report-AzureVMChartJS.ps1 ├── Report-AzureVMsExamples_Part1.ps1 ├── Report-AzureVMsExamples_Part1WithComments.ps1 ├── Report-AzureVMsExamples_Part2.ps1 ├── Report-AzureVMsExamples_Part2WithComments.ps1 ├── Report-AzureVMsExamples_Part3.ps1 ├── Report-AzureVMsExamples_Part3WithComments.ps1 ├── Report-AzureVMsExamples_Part4.ps1 ├── Report-AzureVMsExamples_Part4WithComments.ps1 ├── Report-AzureVMsExamples_Part5.ps1 ├── Report-AzureVMsExamples_Part5WithComments.ps1 └── ReportLogo.psd ├── ReportHTML ├── Alternate.jpg ├── Blank.jpg ├── Chart.js ├── ColorScheme1.rcs ├── ColorScheme2.rcs ├── ColorScheme3.rcs ├── ColorScheme4.rcs ├── Corporate.jpg ├── Help-ReportHTML.html ├── HideSection.js ├── PowerShell.jpg ├── ReportHTML.psd1 ├── ReportHTML.psm1 ├── ReportHTMLHelp.psm1 ├── Sample.jpg ├── Sortable.js ├── Tabs.js ├── default.css ├── jquery-1.12.4.js ├── jquery.dataTables.min.css ├── jquery.dataTables.min.js └── sample.css └── Working └── run-ReportAzureResourceGroupBilling.ps1 /.gitignore: -------------------------------------------------------------------------------- 1 | Dump/Help-ReportHTML.html 2 | Dump/reload.ps1 3 | Dump/test.ps1 4 | Dump/Doco.ps1 5 | Dump/remove.ps1 6 | ReportHTML.zip 7 | ReportHTML/ReportClass.psm1 8 | ReportHTML/DataReport.ps1 -------------------------------------------------------------------------------- /Examples/ACESystemsReport-SystemsReport.mht: -------------------------------------------------------------------------------- 1 | MIME-Version: 1.0 2 | Content-Type: multipart/related; boundary="PART"; type="text/html" 3 | 4 | --PART 5 | Content-Type: text/html; charset=us-ascii 6 | Content-Transfer-Encoding: 7bit 7 | 8 | 9 | 10 | 11 | 12 | ACE Systems Report 13 | 141 | 142 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 |
165 | 166 |
167 |
ACE Systems Report
168 |
169 |
Generated at level
170 |
Report created on Sep 1, 2016 11:30 AM
171 |
172 |
173 |
174 | System Report For - WIN81-3RLAEDHY (Show) 175 |
176 | 353 |
354 |
355 |
356 | 357 |
358 | 359 | 360 | 361 | 362 | 363 | --PART 364 | Content-Type: image/gif 365 | Content-ID: 366 | Content-Transfer-Encoding: base64 367 | Content-Disposition: inline; filename="MainLogo.gif" 368 | 369 | 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 370 | 371 | --PART 372 | Content-Type: image/gif 373 | Content-ID: 374 | Content-Transfer-Encoding: base64 375 | Content-Disposition: inline; filename="clientlogo.gif" 376 | 377 | 378 | 379 | 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 380 | 381 | --PART-- 382 | -------------------------------------------------------------------------------- /Examples/Report-AzureVMChartJS.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMChartJS.ps1 -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part1.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMsExamples_Part1.ps1 -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part1WithComments.ps1: -------------------------------------------------------------------------------- 1 | param ( 2 | $ReportOutputPath 3 | ) 4 | 5 | Import-Module ReportHtml 6 | Get-Command -Module ReportHtml 7 | 8 | $ReportName = "Azure VMs Report" 9 | 10 | if (!$ReportOutputPath) 11 | { 12 | $ReportOutputPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent 13 | } 14 | 15 | # see if we already have a session. If we don't don't re-authN 16 | if (!$AzureRMAccount.Context.Tenant) { 17 | $AzureRMAccount = Add-AzureRmAccount 18 | } 19 | 20 | # Get arrary of VMs from ARM 21 | $RMVMs = get-azurermvm 22 | 23 | $RMVMArray = @() ; $TotalVMs = $RMVMs.Count; $i =1 24 | 25 | # Loop through VMs 26 | foreach ($vm in $RMVMs) 27 | { 28 | # Tracking progress 29 | Write-Progress -PercentComplete ($i / $TotalVMs * 100) -Activity "Building VM array" -CurrentOperation ($vm.Name + " in resource group " + $vm.ResourceGroupName) 30 | 31 | # Get VM Status (for Power State) 32 | $vmStatus = Get-AzurermVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Status 33 | 34 | # Generate Array 35 | $RMVMArray += New-Object PSObject -Property @{` 36 | 37 | # Collect Properties 38 | ResourceGroup = $vm.ResourceGroupName 39 | Name = $vm.Name; 40 | PowerState = (get-culture).TextInfo.ToTitleCase(($vmStatus.statuses)[1].code.split("/")[1]); 41 | Location = $vm.Location; 42 | Tags = $vm.Tags 43 | Size = $vm.HardwareProfile.VmSize; 44 | ImageSKU = $vm.StorageProfile.ImageReference.Sku; 45 | OSType = $vm.StorageProfile.OsDisk.OsType; 46 | OSDiskSizeGB = $vm.StorageProfile.OsDisk.DiskSizeGB; 47 | DataDiskCount = $vm.StorageProfile.DataDisks.Count; 48 | DataDisks = $vm.StorageProfile.DataDisks; 49 | } 50 | $I++ 51 | } 52 | 53 | Function Test-Report 54 | { 55 | param ($TestName) 56 | $rptFile = join-path $ReportOutputPath ($ReportName.replace(" ","") + "-$TestName" + ".mht") 57 | $rpt | Set-Content -Path $rptFile -Force 58 | Invoke-Item $rptFile 59 | sleep 1 60 | } 61 | 62 | ####### Example 1 ####### 63 | # Create an empty array for HTML strings 64 | $rpt = @() 65 | 66 | # note from here on we always append to the $rpt array variable. 67 | # First, let's add the HTML header information including report title 68 | $rpt += Get-HtmlOpen -TitleText $ReportName 69 | 70 | # This content open function add a section header 71 | $rpt += Get-HtmlContentOpen -HeaderText "Virtual Machines" 72 | 73 | # This creates an HTML table of whatever array you pass into the function 74 | $rpt += Get-HtmlContentTable $RMVMArray 75 | 76 | # This content close function closes the section 77 | $rpt += Get-HtmlContentClose 78 | 79 | # This HTML close adds HTML footer 80 | $rpt += Get-HtmlClose 81 | 82 | # Now let's test what we have 83 | Test-Report -TestName Example1 84 | 85 | 86 | ####### Example 2 ######## 87 | $rpt = @() 88 | $rpt += Get-HtmlOpen -TitleText $ReportName 89 | $rpt += Get-HtmlContentOpen -HeaderText "Virtual Machines" 90 | 91 | # here we are going to filter the recordset, reorder the columns and group the results by location. 92 | # The value you group by must be first in the select statement 93 | $rpt += Get-HtmlContentTable ($RMVMArray | select Location, ResourceGroup, Name, Size,PowerState,DataDiskCount, ImageSKU ) -GroupBy Location 94 | $rpt += Get-HtmlContentClose 95 | $rpt += Get-HtmlClose 96 | 97 | Test-Report -TestName Example2 98 | 99 | ####### Example 3 ######## 100 | $rpt = @() 101 | $rpt += Get-HtmlOpen -TitleText $ReportName 102 | 103 | # adding the summary section 104 | $rpt += Get-HtmlContentOpen -HeaderText "Summary Information" 105 | $rpt += Get-HtmlContenttext -Heading "Total VMs" -Detail ( $RMVMArray.Count) 106 | $rpt += Get-HtmlContenttext -Heading "VM Power State" -Detail ("Running " + ($RMVMArray | ? {$_.PowerState -eq 'Running'} | measure ).count + " / Deallocated " + ($RMVMArray | ? {$_.PowerState -eq 'Deallocated'} | measure ).count) 107 | $rpt += Get-HtmlContenttext -Heading "Total Data Disks" -Detail $RMVMArray.datadisks.count 108 | $rpt += Get-HtmlContentClose 109 | 110 | # adding the VM size section. Note the -IsHidden switch 111 | $rpt += Get-HtmlContentOpen -HeaderText "VM Size Summary" -IsHidden 112 | $rpt += Get-HtmlContenttable ($RMVMArray | group size | select Name, Count | sort count -Descending ) -Fixed 113 | $rpt += Get-HtmlContentClose 114 | 115 | # Note I have also added the -IsHidden Switch here 116 | $rpt += Get-HtmlContentOpen -HeaderText "Virtual Machines" -IsHidden 117 | $rpt += Get-HtmlContentTable ($RMVMArray | select Location, ResourceGroup, Name, Size,PowerState, DataDiskCount, ImageSKU ) -GroupBy Location 118 | $rpt += Get-HtmlContentClose 119 | $rpt += Get-HtmlClose 120 | 121 | Test-Report -TestName Example3 122 | 123 | ####### Example 4 ######## 124 | $rpt = @() 125 | $rpt += Get-HtmlOpen -TitleText $ReportName 126 | $rpt += Get-HtmlContentOpen -HeaderText "Summary Information" 127 | $rpt += Get-HtmlContenttext -Heading "Total VMs" -Detail ( $RMVMArray.Count) 128 | $rpt += Get-HtmlContenttext -Heading "VM Power State" -Detail ("Running " + ($RMVMArray | ? {$_.PowerState -eq 'Running'} | measure ).count + " / Deallocated " + ($RMVMArray | ? {$_.PowerState -eq 'Deallocated'} | measure ).count) 129 | $rpt += Get-HtmlContenttext -Heading "Total Data Disks" -Detail $RMVMArray.datadisks.count 130 | $rpt += Get-HtmlContentClose 131 | $rpt += Get-HtmlContentOpen -HeaderText "VM Size Summary" -IsHidden 132 | $rpt += Get-HtmlContenttable ($RMVMArray | group size | select Name, Count | sort count -Descending ) -Fixed 133 | $rpt += Get-HtmlContentClose 134 | 135 | # We are introducing -BackgroundShade 2 so that we can clearly see the sections. 136 | # This helps with larger reports and many when there are many levels to the sections 137 | $rpt += Get-HtmlContentOpen -HeaderText "Virtual Machines by location" -IsHidden 138 | 139 | # adding the foreach loop for the group recordset. 140 | foreach ($Group in ($RMVMArray | select Location, ResourceGroup, Name, Size,PowerState, DataDiskCount, ImageSKU | group location ) ) { 141 | 142 | #for every group that exists for a location we will create an HTML section. I have also specified the -BackgroupShade to 1 143 | $rpt += Get-HtmlContentOpen -HeaderText ("Virtual Machines for location '" + $group.Name +"'") -IsHidden -BackgroundShade 1 144 | 145 | # Each recordset may have different data in the columns and therefore create different width in the table columns. 146 | # We would like it to look the same. We can use the -Fixed switch to produce evenly space columns for the table 147 | $rpt += Get-HtmlContentTable ($Group.Group | select ResourceGroup, Name, Size,PowerState, DataDiskCount, ImageSKU ) -Fixed 148 | $rpt += Get-HtmlContentClose 149 | } 150 | $rpt += Get-HtmlContentClose 151 | $rpt += Get-HtmlClose 152 | 153 | Test-Report -TestName Example4 154 | 155 | ####### Example 5 ######## 156 | $rpt = @() 157 | $rpt += Get-HtmlOpen -TitleText ($ReportName + "Example 5") 158 | $rpt += Get-HtmlContentOpen -HeaderText "Summary Information" -BackgroundShade 1 159 | $rpt += Get-HtmlContenttext -Heading "Total VMs" -Detail ( $RMVMArray.Count) 160 | $rpt += Get-HtmlContenttext -Heading "VM Power State" -Detail ("Running " + ($RMVMArray | ? {$_.PowerState -eq 'Running'} | measure ).count + " / Deallocated " + ($RMVMArray | ? {$_.PowerState -eq 'Deallocated'} | measure ).count) 161 | $rpt += Get-HtmlContenttext -Heading "Total Data Disks" -Detail $RMVMArray.datadisks.count 162 | $rpt += Get-HtmlContentClose 163 | $rpt += Get-HtmlContentOpen -HeaderText "VM Size Summary" -IsHidden -BackgroundShade 1 164 | $rpt += Get-HtmlContenttable ($RMVMArray | group size | select Name, Count | sort count -Descending ) -Fixed 165 | $rpt += Get-HtmlContentClose 166 | $rpt += Get-HtmlContentOpen -HeaderText "Virtual Machines by location" -BackgroundShade 3 167 | foreach ($Group in ($RMVMArray | select Location, ResourceGroup, Name, Size,PowerState, DataDiskCount, ImageSKU | group location ) ) { 168 | 169 | # Here we are creating a group to use for the IF condition, so we can create sections for VMs by powerstate, Running or Deallocated 170 | $PowerState = $Group.Group | group PowerState 171 | $rpt += Get-HtmlContentOpen -HeaderText ("Virtual Machines for location '" + $group.Name +"' - " + $Group.Group.Count + " VMs") -IsHidden -BackgroundShade 2 172 | 173 | # If there are VMs in the running group, continue and create a section for them 174 | if (($PowerState | ? {$_.name -eq 'running'})) 175 | { 176 | $rpt += Get-HtmlContentOpen -HeaderText ("Running Virtual Machines") -BackgroundShade 1 177 | $rpt += Get-HtmlContentTable ($Group.Group | where {$_.PowerState -eq "Running"} | select ResourceGroup, Name, Size, DataDiskCount, ImageSKU ) -Fixed 178 | $rpt += Get-HtmlContentClose 179 | } 180 | 181 | # If there are VMs in the running group, continue and create a section for them 182 | if (($PowerState | ? {$_.name -eq 'Deallocated'})) 183 | { 184 | $rpt += Get-HtmlContentOpen -HeaderText ("Deallocated") -BackgroundShade 1 -IsHidden 185 | $rpt += Get-HtmlContentTable ($Group.Group | where {$_.PowerState -eq "Deallocated"} | select ResourceGroup, Name, Size, DataDiskCount, ImageSKU)-Fixed 186 | $rpt += Get-HtmlContentClose 187 | } 188 | $rpt += Get-HtmlContentClose 189 | } 190 | $rpt += Get-HtmlContentClose 191 | $rpt += Get-HtmlClose 192 | 193 | Test-Report -TestName Example5 194 | 195 | Invoke-Item $ReportOutputPath -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part2.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMsExamples_Part2.ps1 -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part2WithComments.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMsExamples_Part2WithComments.ps1 -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part3.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMsExamples_Part3.ps1 -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part3WithComments.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMsExamples_Part3WithComments.ps1 -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part4.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMsExamples_Part4.ps1 -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part4WithComments.ps1: -------------------------------------------------------------------------------- 1 | param ( 2 | $ReportOutputPath 3 | ) 4 | 5 | Import-Module ReportHtml 6 | Get-Command -Module ReportHtml 7 | 8 | if (!$ReportOutputPath) 9 | { 10 | $ReportOutputPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent 11 | } 12 | $ReportName = "Azure VMs" 13 | 14 | # see if we already have a session. If we don't don't re-authN 15 | if (!$AzureRMAccount.Context.Tenant) { 16 | $AzureRMAccount = Add-AzureRmAccount 17 | } 18 | 19 | # Get arrary of VMs from ARM 20 | $RMVMs = get-azurermvm 21 | 22 | $RMVMArray = @() ; $TotalVMs = $RMVMs.Count; $i =1 23 | # Loop through VMs 24 | foreach ($vm in $RMVMs) 25 | { 26 | # Tracking progress 27 | Write-Progress -PercentComplete ($i / $TotalVMs * 100) -Activity "Building VM array" -CurrentOperation ($vm.Name + " in resource group " + $vm.ResourceGroupName) 28 | 29 | # Get VM Status (for Power State) 30 | $vmStatus = Get-AzurermVM -Name $vm.Name -ResourceGroupName $vm.ResourceGroupName -Status 31 | 32 | # Generate Array 33 | $RMVMArray += New-Object PSObject -Property @{` 34 | 35 | # Collect Properties 36 | ResourceGroup = $vm.ResourceGroupName 37 | ID = $VM.id 38 | Name = $vm.Name; 39 | PowerState = (get-culture).TextInfo.ToTitleCase(($vmStatus.statuses)[1].code.split("/")[1]); 40 | Location = $vm.Location; 41 | Tags = $vm.Tags 42 | Size = $vm.HardwareProfile.VmSize; 43 | ImageSKU = $vm.StorageProfile.ImageReference.Sku; 44 | OSType = $vm.StorageProfile.OsDisk.OsType; 45 | OSDiskSizeGB = $vm.StorageProfile.OsDisk.DiskSizeGB; 46 | DataDiskCount = $vm.StorageProfile.DataDisks.Count; 47 | DataDisks = $vm.StorageProfile.DataDisks; 48 | } 49 | $i++ 50 | } 51 | 52 | Function Test-Report 53 | { 54 | param ( 55 | $TestName 56 | ) 57 | $rptFile = join-path $ReportOutputPath ($ReportName.replace(" ","") + "-$TestName" + ".mht") 58 | $rpt | Set-Content -Path $rptFile -Force 59 | Invoke-Item $rptFile 60 | sleep 1 61 | } 62 | 63 | ####### Example 12 ######## 64 | # The two logo files are stored in the report path 65 | $MainLogoFile = join-path $ReportOutputPath "ACELogo.jpg" 66 | $ClientLogoFile = join-path $ReportOutputPath "YourLogo.jpg" 67 | 68 | $rpt = @() 69 | $rpt += Get-HtmlOpen -TitleText ($ReportName + " Example 12") 70 | $rpt += Get-HtmlContentOpen -HeaderText "Size Summary" 71 | $rpt += Get-HtmlContentTable ($RMVMArray | group Size | select name, count | sort count -Descending) 72 | $rpt += Get-HtmlContentClose 73 | 74 | # In this case we are going to swap the logos around using ClientLogoFile and MainLogoFile parameters and switching the files used 75 | $rpt += Get-HtmlClose -ClientLogoFile $MainLogoFile -MainLogoFile $ClientLogoFile 76 | Test-Report -TestName Example12 77 | 78 | ####### Example 13 ######## 79 | $rpt = @() 80 | $rpt += Get-HtmlOpen -TitleText ($ReportName + " Example 13") 81 | $rpt += Get-HtmlContentOpen -HeaderText "Size Summary" 82 | $rpt += Get-HtmlContentTable ($RMVMArray | group Size | select name, count | sort count -Descending) 83 | $rpt += Get-HtmlContentClose 84 | 85 | # We have been using Get-HTMLClose up until now which has a default of ClientLogo1 86 | # In this case we can specify ClientLogo5 87 | $rpt += Get-HtmlClose -ClientLogoType ClientLogo5 88 | 89 | Test-Report -TestName Example13 90 | 91 | Invoke-Item $ReportOutputPath 92 | -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part5.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMsExamples_Part5.ps1 -------------------------------------------------------------------------------- /Examples/Report-AzureVMsExamples_Part5WithComments.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/Report-AzureVMsExamples_Part5WithComments.ps1 -------------------------------------------------------------------------------- /Examples/ReportLogo.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Examples/ReportLogo.psd -------------------------------------------------------------------------------- /ReportHTML/Alternate.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/Alternate.jpg -------------------------------------------------------------------------------- /ReportHTML/Blank.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/Blank.jpg -------------------------------------------------------------------------------- /ReportHTML/ColorScheme1.rcs: -------------------------------------------------------------------------------- 1 | Colour;Background;Hover;Border 2 | rgba(232, 247, 238, 0.7);rgba(232, 247, 238, 0.8);rgba(232, 247, 238, 0.5);rgba(232, 247, 238, 1) 3 | rgba(190, 168, 167, 0.7);rgba(190, 168, 167, 0.8);rgba(190, 168, 167, 0.5);rgba(190, 168, 167, 1) 4 | rgba(102, 63, 70, 0.7);rgba(102, 63, 70, 0.8);rgba(102, 63, 70, 0.5);rgba(102, 63, 70, 1) 5 | rgba(60, 54, 42, 0.7);rgba(60, 54, 42, 0.8);rgba(60, 54, 42, 0.5);rgba(60, 54, 42, 1) 6 | rgba(201, 214, 234, 0.7);rgba(201, 214, 234, 0.8);rgba(201, 214, 234, 0.5);rgba(201, 214, 234, 1) 7 | rgba(201, 153, 190, 0.7);rgba(201, 153, 190, 0.8);rgba(201, 153, 190, 0.5);rgba(201, 153, 190, 1) 8 | rgba(54, 12, 54, 0.7);rgba(54, 12, 54, 0.8);rgba(54, 12, 54, 0.5);rgba(54, 12, 54, 1) 9 | rgba(138, 54, 78, 0.7);rgba(138, 54, 78, 0.8);rgba(138, 54, 78, 0.5);rgba(138, 54, 78, 1) 10 | rgba(45, 106, 69, 0.7);rgba(45, 106, 69, 0.8);rgba(45, 106, 69, 0.5);rgba(45, 106, 69, 1) 11 | rgba(56, 78, 119, 0.7);rgba(56, 78, 119, 0.8);rgba(56, 78, 119, 0.5);rgba(56, 78, 119, 1) 12 | rgba(0, 40, 96, 0.7);rgba(0, 40, 96, 0.8);rgba(0, 40, 96, 0.5);rgba(0, 40, 96, 1) 13 | rgba(42, 157, 143, 0.7);rgba(42, 157, 143, 0.8);rgba(42, 157, 143, 0.5);rgba(42, 157, 143, 1) 14 | rgba(89, 41, 65, 0.7);rgba(89, 41, 65, 0.8);rgba(89, 41, 65, 0.5);rgba(89, 41, 65, 1) 15 | rgba(89, 165, 216, 0.7);rgba(89, 165, 216, 0.8);rgba(89, 165, 216, 0.5);rgba(89, 165, 216, 1) 16 | rgba(132, 210, 246, 0.7);rgba(132, 210, 246, 0.8);rgba(132, 210, 246, 0.5);rgba(132, 210, 246, 1) -------------------------------------------------------------------------------- /ReportHTML/ColorScheme2.rcs: -------------------------------------------------------------------------------- 1 | Colour;Background;Hover;Border 2 | rgba(161, 103, 74, 0.8);rgba(161, 103, 74, 0.5);rgba(161, 103, 74, 0.7);rgba(161, 103, 74, 1); 3 | rgba(166, 58, 80, 0.8);rgba(166, 58, 80, 0.5);rgba(166, 58, 80, 0.7);rgba(166, 58, 80, 1); 4 | rgba(186, 110, 110, 0.8);rgba(186, 110, 110, 0.5);rgba(186, 110, 110, 0.7);rgba(186, 110, 110, 1); 5 | rgba(171, 155, 150, 0.8);rgba(171, 155, 150, 0.5);rgba(171, 155, 150, 0.7);rgba(171, 155, 150, 1); 6 | rgba(240, 231, 216, 0.8);rgba(240, 231, 216, 0.5);rgba(240, 231, 216, 0.7);rgba(240, 231, 216, 1); 7 | rgba(77, 112, 113, 0.8);rgba(77, 112, 113, 0.5);rgba(77, 112, 113, 0.7);rgba(77, 112, 113, 1); 8 | rgba(143, 157, 134, 0.8);rgba(143, 157, 134, 0.5);rgba(143, 157, 134, 0.7);rgba(143, 157, 134, 1); 9 | rgba(188, 151, 123, 0.8);rgba(188, 151, 123, 0.5);rgba(188, 151, 123, 0.7);rgba(188, 151, 123, 1); 10 | rgba(49, 93, 79, 0.8);rgba(49, 93, 79, 0.5);rgba(49, 93, 79, 0.7);rgba(49, 93, 79, 1); 11 | rgba(12, 35, 25, 0.8);rgba(12, 35, 25, 0.5);rgba(12, 35, 25, 0.7);rgba(12, 35, 25, 1); -------------------------------------------------------------------------------- /ReportHTML/ColorScheme3.rcs: -------------------------------------------------------------------------------- 1 | Colour;Background;Hover;Border 2 | rgba(13, 117, 119, 0.7);rgba(13, 117, 119, 0.5);rgba(13, 117, 119, 0.8);rgba(13, 117, 119, 1); 3 | rgba(23, 150, 130, 0.7);rgba(23, 150, 130, 0.5);rgba(23, 150, 130, 0.8);rgba(23, 150, 130, 1); 4 | rgba(58, 152, 142, 0.7);rgba(58, 152, 142, 0.5);rgba(58, 152, 142, 0.8);rgba(58, 152, 142, 1); 5 | rgba(128, 189, 189, 0.7);rgba(128, 189, 189, 0.5);rgba(128, 189, 189, 0.8);rgba(128, 189, 189, 1); 6 | rgba(216, 216, 216, 0.7);rgba(216, 216, 216, 0.5);rgba(216, 216, 216, 0.8);rgba(216, 216, 216, 1); 7 | rgba(242, 215, 238, 0.7);rgba(242, 215, 238, 0.5);rgba(242, 215, 238, 0.8);rgba(242, 215, 238, 1); 8 | rgba(211, 188, 192, 0.7);rgba(211, 188, 192, 0.5);rgba(211, 188, 192, 0.8);rgba(211, 188, 192, 1); 9 | rgba(165, 102, 139, 0.7);rgba(165, 102, 139, 0.5);rgba(165, 102, 139, 0.8);rgba(165, 102, 139, 1); 10 | rgba(105, 48, 109, 0.7);rgba(105, 48, 109, 0.5);rgba(105, 48, 109, 0.8);rgba(105, 48, 109, 1); 11 | rgba(14, 16, 61, 0.7);rgba(14, 16, 61, 0.5);rgba(14, 16, 61, 0.8);rgba(14, 16, 61, 1); 12 | rgba(187, 190, 100, 0.7);rgba(187, 190, 100, 0.5);rgba(187, 190, 100, 0.8);rgba(187, 190, 100, 1); 13 | rgba(142, 85, 114, 0.7);rgba(142, 85, 114, 0.5);rgba(142, 85, 114, 0.8);rgba(142, 85, 114, 1); 14 | rgba(242, 247, 242, 0.7);rgba(242, 247, 242, 0.5);rgba(242, 247, 242, 0.8);rgba(242, 247, 242, 1); 15 | rgba(188, 170, 153, 0.7);rgba(188, 170, 153, 0.5);rgba(188, 170, 153, 0.8);rgba(188, 170, 153, 1); 16 | rgba(68, 56, 80, 0.7);rgba(68, 56, 80, 0.5);rgba(68, 56, 80, 0.8);rgba(68, 56, 80, 1); -------------------------------------------------------------------------------- /ReportHTML/ColorScheme4.rcs: -------------------------------------------------------------------------------- 1 | Colour;Background;Hover;Border 2 | rgba(215, 38, 56, 0.7);rgba(215, 38, 56, 0.5);rgba(215, 38, 56, 0.8);rgba(215, 38, 56, 1); 3 | rgba(40, 40, 40, 0.7);rgba(40, 40, 40, 0.5);rgba(40, 40, 40, 0.8);rgba(40, 40, 40, 1); 4 | rgba(234, 203, 0, 0.7);rgba(234, 203, 0, 0.5);rgba(234, 203, 0, 0.8);rgba(234, 203, 0, 1); 5 | rgba(63, 136, 197, 0.7);rgba(63, 136, 197, 0.5);rgba(63, 136, 197, 0.8);rgba(63, 136, 197, 1); 6 | rgba(244, 157, 55, 0.7);rgba(244, 157, 55, 0.5);rgba(244, 157, 55, 0.8);rgba(244, 157, 55, 1); 7 | rgba(78, 63, 97, 0.7);rgba(78, 63, 97, 0.5);rgba(78, 63, 97, 0.8);rgba(78, 63, 97, 1); 8 | rgba(138, 100, 167, 0.7);rgba(138, 100, 167, 0.5);rgba(138, 100, 167, 0.8);rgba(138, 100, 167, 1); 9 | rgba(0, 176, 211, 0.7);rgba(0, 176, 211, 0.5);rgba(0, 176, 211, 0.8);rgba(0, 176, 211, 1); 10 | rgba(240, 236, 171, 0.7);rgba(240, 236, 171, 0.5);rgba(240, 236, 171, 0.8);rgba(240, 236, 171, 1); 11 | rgba(255, 255, 255, 0.7);rgba(255, 255, 255, 0.5);rgba(255, 255, 255, 0.8);rgba(255, 255, 255, 1); 12 | rgba(126, 110, 96, 0.7);rgba(126, 110, 96, 0.5);rgba(126, 110, 96, 1);rgba(126, 110, 96, 1); 13 | rgba(212, 116, 125, 0.7);rgba(212, 116, 125, 0.5);rgba(212, 116, 125, 0.8);rgba(212, 116, 125, 1); 14 | rgba(237, 148, 87, 0.7);rgba(237, 148, 87, 0.5);rgba(237, 148, 87, 0.8);rgba(237, 148, 87, 1); 15 | rgba(249, 213, 162, 0.7);rgba(249, 213, 162, 0.5);rgba(249, 213, 162, 0.8);rgba(249, 213, 162, 1); 16 | rgba(234, 239, 247, 0.7);rgba(234, 239, 247, 0.5);rgba(234, 239, 247, 0.8);rgba(234, 239, 247, 1); 17 | -------------------------------------------------------------------------------- /ReportHTML/Corporate.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/Corporate.jpg -------------------------------------------------------------------------------- /ReportHTML/Help-ReportHTML.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/Help-ReportHTML.html -------------------------------------------------------------------------------- /ReportHTML/HideSection.js: -------------------------------------------------------------------------------- 1 | function show(obj) { 2 | document.getElementById(obj).style.display='block'; 3 | document.getElementById("hide_" + obj).style.display=''; 4 | document.getElementById("show_" + obj).style.display='none'; 5 | } 6 | function hide(obj) { 7 | document.getElementById(obj).style.display='none'; 8 | document.getElementById("hide_" + obj).style.display='none'; 9 | document.getElementById("show_" + obj).style.display=''; 10 | } -------------------------------------------------------------------------------- /ReportHTML/PowerShell.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/PowerShell.jpg -------------------------------------------------------------------------------- /ReportHTML/ReportHTML.psd1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/ReportHTML.psd1 -------------------------------------------------------------------------------- /ReportHTML/ReportHTML.psm1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/ReportHTML.psm1 -------------------------------------------------------------------------------- /ReportHTML/ReportHTMLHelp.psm1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/ReportHTMLHelp.psm1 -------------------------------------------------------------------------------- /ReportHTML/Sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/Sample.jpg -------------------------------------------------------------------------------- /ReportHTML/Sortable.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/ReportHTML/Sortable.js -------------------------------------------------------------------------------- /ReportHTML/Tabs.js: -------------------------------------------------------------------------------- 1 | function openTab(evt, tabName) { 2 | // Declare all variables 3 | var i, tabcontent, tablinks; 4 | 5 | // Get all elements with class="tabcontent" and hide them 6 | tabcontent = document.getElementsByClassName("tabcontent"); 7 | for (i = 0; i < tabcontent.length; i++) { 8 | tabcontent[i].style.display = "none"; 9 | } 10 | 11 | // Get all elements with class="tablinks" and remove the class "active" 12 | tablinks = document.getElementsByClassName("tablinks"); 13 | for (i = 0; i < tablinks.length; i++) { 14 | tablinks[i].className = tablinks[i].className.replace(" active", ""); 15 | } 16 | 17 | // Show the current tab, and add an "active" class to the link that opened the tab 18 | document.getElementById(tabName).style.display = "block"; 19 | evt.currentTarget.className += " active"; 20 | } 21 | -------------------------------------------------------------------------------- /ReportHTML/default.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /ReportHTML/jquery.dataTables.min.css: -------------------------------------------------------------------------------- 1 | table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#ffffff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#acbad4}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f6f6f6}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#aab7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#fafafa}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad5}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#fafafa}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fcfcfc}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fefefe}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ececec}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#efefef}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a5b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent;border-radius:2px}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #979797;background-color:white;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead>table,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} 2 | -------------------------------------------------------------------------------- /ReportHTML/sample.css: -------------------------------------------------------------------------------- 1 | 768 | -------------------------------------------------------------------------------- /Working/run-ReportAzureResourceGroupBilling.ps1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/azurefieldnotes/ReportHTML/c22355b9a12dff247f8b7729f88d86dc7eb9a0eb/Working/run-ReportAzureResourceGroupBilling.ps1 --------------------------------------------------------------------------------