core/modules/monkeyhtml/private/Card/Get-HtmlContainerCard.ps1

# Monkey365 - the PowerShell Cloud Security Tool for Azure and Microsoft 365 (copyright 2022) by Juan Garrido
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Function Get-HtmlContainerCard{
    <#
        .SYNOPSIS
 
        .DESCRIPTION
 
        .INPUTS
 
        .OUTPUTS
 
        .EXAMPLE
 
        .NOTES
            Author : Juan Garrido
            Twitter : @tr1ana
            File Name : Get-HtmlContainerCard
            Version : 1.0
 
        .LINK
            https://github.com/silverhack/monkey365
    #>

    [CmdletBinding()]
    [OutputType([System.Collections.Generic.List[System.Xml.XmlElement]])]
    Param (
        [Parameter(Mandatory = $true, HelpMessage = 'Matched items')]
        [Object]$InputObject,

        [parameter(Mandatory= $false, HelpMessage= "Template")]
        [System.Xml.XmlDocument]$Template
    )
    Begin{
        #Set array
        $allObjects = [System.Collections.Generic.List[System.Xml.XmlElement]]::new()
        #Set template
        If($PSBoundParameters.ContainsKey('Template') -and $PSBoundParameters['Template']){
            $TemplateObject = $PSBoundParameters['Template']
        }
        ElseIf($null -ne (Get-Variable -Name Template -Scope Script -ErrorAction Ignore)){
            $TemplateObject = $script:Template
        }
        Else{
            [xml]$TemplateObject = "<html></html>"
        }
    }
    Process{
        #Get items
        $Resources = $InputObject | Group-Object -Property serviceType -ErrorAction Ignore
        Foreach($Resource in $Resources){
            If (-NOT [String]::IsNullOrEmpty($Resource.Name)){
                #Set array
                $bodyObjects = [System.Collections.Generic.List[System.Xml.XmlElement]]::new()
                Write-Verbose ($Script:messages.AppendElementMessageInfo -f "a new HTML row", $Resource.Name )
                #Create a new row object
                $DivElement = @{
                    Name = 'div';
                    ClassName = 'row d-none';
                    Id = $Resource.Name.ToLower().Replace(' ','-');
                    Template = $TemplateObject;
                }
                #Create element
                $row = New-HtmlTag @DivElement
                #Create a new col
                $DivElement = @{
                    Name = 'div';
                    ClassName = 'col-md-12';
                    Template = $TemplateObject;
                }
                #Create element
                $col = New-HtmlTag @DivElement
                #Get search filter
                $searchFilter = New-HtmlCardFilter -Template $TemplateObject
                [void]$bodyObjects.Add($searchFilter);
                #Get all findings
                #Div properties
                $divProperties = @{
                    Name = 'div';
                    ClassName = 'monkey-card-data';
                    Id = ("{0}-findings" -f $Resource.Name.ToLower().Replace(' ',''))
                    Template = $TemplateObject;
                }
                #Create element
                $divContent = New-HtmlTag @divProperties
                #Get findings
                $allFindings = $Resource.Group | New-FindingCard -Template $TemplateObject
                #Append all findings
                Foreach($finding in @($allFindings)){
                    [void]$divContent.AppendChild($finding);
                }
                #Add to array
                [void]$bodyObjects.Add($divContent);
                #Get Img
                $svg = $Resource.Name | Get-SvgIcon
                #Create a new container card
                $p = @{
                    CardTitle = $Resource.Name;
                    Img = $svg;
                    AppendObject = $bodyObjects;
                }
                $containerCard = New-HtmlContainerCard @p
                If($containerCard){
                    #Change title-header
                    $h = $containerCard.SelectSingleNode('//h4[@class="title-header"]')
                    [void]$h.SetAttribute('class',"resource-name")
                    #Add container card to col
                    [void]$col.AppendChild($containerCard);
                    #Add col to main row
                    [void]$row.AppendChild($col);
                    #Close div tags
                    $divs = $row.SelectNodes("//div")
                    $divs | ForEach-Object {
                        If($_.IsEmpty){
                            [void]$_.AppendChild($TemplateObject.CreateWhitespace(""))
                        }
                    }
                    #Add to array
                    [void]$allObjects.Add($row);
                }
                <#
                #Set h4 element
                $HElement = @{
                    Name = 'h4';
                    ClassName = 'resource-name';
                    Text = $Resource.Name;
                    InnerText = $true;
                    Template = $row;
                }
                #Create element
                $H4Tag = New-HtmlTag @HElement
                #Get SVG icon
                $svg = $Resource.Name | Get-SvgIcon -LocalPath C:\monkey365_dev\newhtml
                $img_attributes = @{
                    src = $svg;
                    alt = $Resource.Name;
                }
                $img_element = @{
                    Name = 'img';
                    Attributes = $img_attributes;
                    Empty = $true;
                    Template = $row;
                }
                $img = New-HtmlTag @img_element
                #Get header
                $header = $row.SelectSingleNode('//div[@class="monkey-header"]')
                If($null -ne $header){
                    #Add header and h4
                    [void]$header.AppendChild($img);
                    [void]$header.AppendChild($H4Tag);
                }
                #Get Card body
                $body = $row.SelectSingleNode('//div[@class="card-body"]')
                #Get search filter
                $searchFilter = New-HtmlCardFilter -Template $row
                #append child
                [void]$body.AppendChild($searchFilter);
                #Create div object
                #Div properties
                $divProperties = @{
                    Name = 'div';
                    ClassName = 'monkey-card-data';
                    Id = ("{0}-findings" -f $Resource.Name.ToLower().Replace(' ',''))
                    Template = $row;
                }
                #Create element
                $divContent = New-HtmlTag @divProperties
                #Get findings
                $allFindings = $Resource.Group | New-FindingCard -Template $row
                #Append all findings
                Foreach($finding in @($allFindings)){
                    [void]$divContent.AppendChild($finding);
                }
                #append child
                [void]$body.AppendChild($divContent);
                #Import node
                $row = $TemplateObject.ImportNode($row.DocumentElement,$true);
                #Close div tags
                $divs = $row.SelectNodes("//div")
                $divs | ForEach-Object {
                    If($_.IsEmpty){
                        [void]$_.AppendChild($TemplateObject.CreateWhitespace(""))
                    }
                }
                #>

                #Add to array
                [void]$allObjects.Add($row);
            }
        }
        return $allObjects
    }
    End{
    }
}