Private/Show-W365GroupMember.ps1

function Show-W365GroupMember {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$GroupId,

        [string]$GroupName
    )

    begin {
        Import-W365CliWindowsCloudPC
        Connect-CloudPC | Out-Null
    }

    process {
        $escapedGroupId = [uri]::EscapeDataString($GroupId)
        $uri = "https://graph.microsoft.com/v1.0/groups/$escapedGroupId/members?`$select=id,displayName,userPrincipalName,mail,jobTitle"
        $members = @(
            Invoke-GraphPaged -Uri $uri | Sort-Object displayName
        )

        if ($members.Count -eq 0) {
            Write-Warning 'No group members were returned.'
            Write-Host 'Press any key to continue...' -ForegroundColor DarkGray
            [Console]::ReadKey($true) | Out-Null
            return
        }

        $columnHeader = '{0} {1} {2} {3}' -f
            (Format-W365CliText -Text 'Name' -Width 36),
            (Format-W365CliText -Text 'UPN' -Width 38),
            (Format-W365CliText -Text 'Mail' -Width 38),
            (Format-W365CliText -Text 'Job title' -Width 28)

        Select-W365CliObject -InputObject $members -Title "Members of $GroupName" -DisplayProperties @(
            'displayName',
            'userPrincipalName',
            'mail',
            'jobTitle'
        ) -FilterProperties @(
            'displayName',
            'userPrincipalName',
            'mail',
            'jobTitle'
        ) -LabelScript {
            param($Member)

            '{0} {1} {2} {3}' -f
                (Format-W365CliText -Text $Member.displayName -Width 36),
                (Format-W365CliText -Text $Member.userPrincipalName -Width 38),
                (Format-W365CliText -Text $Member.mail -Width 38),
                (Format-W365CliText -Text $Member.jobTitle -Width 28)
        } -DetailScript {
            param($Member)

            @(
                "Name: $($Member.displayName)"
                "UPN: $($Member.userPrincipalName)"
                "Mail: $($Member.mail)"
                "Job title: $($Member.jobTitle)"
                "Object ID: $($Member.id)"
            )
        } -SummaryScript {
            param(
                [object[]]$AllItems,
                [object[]]$VisibleItems,
                [string]$Filter,
                [int]$SelectedIndex
            )

            @(
                "Total: $($AllItems.Count) | Visible: $($VisibleItems.Count) | Selected: $([math]::Min($SelectedIndex + 1, [math]::Max($VisibleItems.Count, 1)))"
                $(if ($Filter) { "Search: $Filter" } else { 'Search: none' })
            )
        } -RefreshScript {
            @(Invoke-GraphPaged -Uri $uri | Sort-Object displayName)
        } -ColumnHeader $columnHeader -PageSize 18 -ViewOnly -Breadcrumb @('W365CLI','Provisioning','Maintenance windows','Group members') | Out-Null
    }

    end { }
}