Private/Sidebar.ps1

function Get-PodeWebSidebarOrderedArray {
    param(
        [Parameter(Mandatory = $true)]
        [array]
        $Items,

        [Parameter(Mandatory = $true)]
        [ValidateSet('Ascending', 'Descending', 'Creation')]
        [string]
        $Order
    )

    if (($Order -ieq 'creation') -or ($null -eq $Items) -or ($Items.Length -eq 0)) {
        return $Items
    }

    [array]::Sort($Items)

    if ($Order -ieq 'descending') {
        [array]::Reverse($Items)
    }

    return $Items
}

function Get-PodeWebSidebarParentGroupNames {
    param(
        [Parameter(Mandatory = $true)]
        [hashtable[]]
        $Groups
    )

    # get only parent groups
    $groupNames = @(foreach ($grp in $Groups) {
            if ([string]::IsNullOrEmpty($grp.Parent)) {
                $grp.Name
            }
        })

    if ($groupNames.Length -eq 0) {
        return @()
    }

    # order the groups
    $groupNames = Get-PodeWebSidebarOrderedGroupNames -Names $groupNames

    # preserve empty group at start
    if ($groupNames -contains '') {
        $groupNames = @('') + @(foreach ($name in $groupNames) {
                if ($name -ne '') {
                    $name
                }
            })
    }

    # return the group names
    return $groupNames
}

function Get-PodeWebSidebarOrderedGroupNames {
    param(
        [Parameter()]
        [string[]]
        $Names
    )

    if ($Names.Length -eq 0) {
        return @()
    }

    $groupOrder = Get-PodeWebState -Name 'group-order'
    $groupNames = Get-PodeWebSidebarOrderedArray -Items $Names -Order $groupOrder
    return $groupNames
}