New-UDDynamic syncing, page refresh and browser tabs questions?

Hello,

I created a page to allow department managers to add or remove users from AD groups they manage.

This one is not completely finished but the main one works.

On the other hand, I encounter two concerns:

  • two consecutive sync-udelements do not have the same value for $SelectedGroup (see line 248 of the code => fixed by placing the second Sync-UDElement in the element synchronized by the first Sync-UDElement)
  • if I choose an AD group and refresh the page, $DynamicDetails and $DynamicTabs always display the values ​​before refresh. Likewise, if I open multiple browser tabs on this page.
    $SelectedGroup keeps the value it had before refreshing the page and a new browser tab takes the value of $SelectedGroup from the tab used previously.

Isn’t the behavior supposed to be like below?

  • $SelectedGroup not having a session or cache scope should not find its old value after refreshing the page or on a new browser tab
  • two consecutive Sync-UDElement should have the same value for $SelectedGroup since this value is not changed in any of the synchronized elements

Did I miss or not understand something ?
Thanks for your help

Here is my code :

New-UDDashboard -Title 'Tableau de bord' -Content {

    if ($SelectedGroup) {
        Show-UDToast -Message "[START] `$SelectedGroup = $($SelectedGroup.Name)" -Duration 10000 #dev
    }

    if (!$Cache:AssignableUsers) {
        $Cache:AssignableUsers = Get-ADUser -Filter "Enabled -eq `$true -and Surname -like '*' -and GivenName -like '*'" -Properties Surname, GivenName, Company, Department, Title, Mail, SamAccountName, UserPrincipalName | 
        Select-Object Surname, GivenName, Company, Department, Title, Mail, SamAccountName, UserPrincipalName  
    }

    $CurrentADUser = Get-ADUser -Filter "UserPrincipalName -eq '$User'"
    [Microsoft.ActiveDirectory.Management.ADGroup[]]$ManagedGroups = @()

    $ManagedGroups = Get-ADGroup -Filter { ManagedBy -eq $CurrentADUser.SamAccountName } -Properties Description, Info | Sort-Object Name

    $CurrentGroups = Get-ADUser -Identity $CurrentADUser.SamAccountName -Properties MemberOf | Select-Object -ExpandProperty MemberOf
    $CurrentGroups | ForEach-Object {
        $isGroupManager = Get-ADGroup -Filter { ManagedBy -eq $_ } -Properties Description, Info | Sort-Object Name
        if ($isGroupManager) {
            $ManagedGroups += $isGroupManager
        }
    }

    $UNCPathRegex = '(\\\\([a-z|A-Z|0-9|-|_|\s]{2,15}){1}(\.[a-z|A-Z|0-9|-|_|\s]{1,64}){0,3}){1}(\\[^\\|\/|\:|\*|\?|"|\<|\>|\|]{1,64}){1,}(\\){0,}'

    $DynamicDetails = { 
        New-UDDynamic -Id 'DynamicDetails' -Content {
            if ($SelectedGroup) { 
                Show-UDToast -Message "[DynamicDetails] `$SelectedGroup = $($SelectedGroup.Name)" -Duration 10000 #dev
                New-UDGrid -Item -Children {                     
                    if ($SelectedGroup.Info) {
                        New-UDList -Content {                                            
                            if ($SelectedGroup.Info -match $UNCPathRegex) {
                                New-UDListItem -Label 'Dossier' -Icon (New-UDIcon -Icon Folder -Size 2x) -SubTitle $SelectedGroup.Info
                            } else {
                                New-UDListItem -Label 'Permission' -Icon (New-UDIcon -Icon UserTie -Size 2x) -SubTitle $SelectedGroup.Info
                            }
                        }
                    } else {
                        New-UDList -Content {
                            New-UDListItem -Label 'Dossier ou permission' -Icon (New-UDIcon -Icon Question -Size 2x) -SubTitle 'non renseigné'
                        }
                    }
                }
                New-UDGrid -Item -Children {
                    New-UDList -Content {
                        if ($SelectedGroup.Description) { 
                            New-UDListItem -Label 'Description' -Icon (New-UDIcon -Icon InfoCircle -Size 2x) -SubTitle $SelectedGroup.Description 
                        } else {
                            New-UDListItem -Label 'Description' -Icon (New-UDIcon -Icon InfoCircle -Size 2x) -SubTitle 'non renseigné' 
                        }                        
                    }
                }
            }
        } -LoadingComponent {
            New-UDElement -Tag 'BR'
            New-UDProgress
        }
    }

    $ColumnsTableList = @(
        New-UDTableColumn -Title 'Nom' -Property 'Surname' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType text -DefaultSortColumn -ShowSort
        New-UDTableColumn -Title 'Prénom' -Property 'GivenName' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType text
        New-UDTableColumn -Title 'Société' -Property 'Company' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType select
        New-UDTableColumn -Title 'Service' -Property 'Department' -IncludeInExport -IncludeInSearch
        New-UDTableColumn -Title 'Poste' -Property 'Title' -IncludeInExport -IncludeInSearch
        New-UDTableColumn -Title 'Mail' -Property 'Mail' -IncludeInExport -IncludeInSearch
        New-UDTableColumn -Title ' ' -Property 'SamAccountName' -Render {
            New-UDTooltip -TooltipContent { 'Retirer l''utilisateur du groupe' } -Content {
                New-UDButton -Icon (New-UDIcon -Icon UserMinus -Color 'Red') -Variant 'text' -OnClick {
                    try {
                        Remove-ADGroupMember -Identity $SelectedGroup.SamAccountName -Members $EventData.SamAccountName -Confirm:$false -ErrorAction Stop
                    } catch {
                        Show-UDToast -Title 'ERREUR!' -Message "$($EventData.Surname) $($EventData.GivenName) n'a pas pu être retiré du groupe $($SelectedGroup.Name)" -Duration 10000
                    }
                }
            }
        }
    )

    $ColumnsTableAdd = @(
        New-UDTableColumn -Title 'Nom' -Property 'Surname' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType text -DefaultSortColumn -ShowSort
        New-UDTableColumn -Title 'Prénom' -Property 'GivenName' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType text
        New-UDTableColumn -Title 'Société' -Property 'Company' -IncludeInExport -IncludeInSearch -ShowFilter -FilterType select
        New-UDTableColumn -Title 'Service' -Property 'Department' -IncludeInExport -IncludeInSearch
        New-UDTableColumn -Title 'Poste' -Property 'Title' -IncludeInExport -IncludeInSearch
        New-UDTableColumn -Title 'Mail' -Property 'Mail' -IncludeInExport -IncludeInSearch
        New-UDTableColumn -Title ' ' -Property 'SamAccountName' -Render {
            New-UDTooltip -TooltipContent { 'Ajouter l''utilisateur du groupe' } -Content {
                New-UDButton -Icon (New-UDIcon -Icon UserPlus -Color 'Green') -Variant 'text' -OnClick {
                    try {
                        Add-ADGroupMember -Identity $SelectedGroup.SamAccountName -Members $EventData.SamAccountName -ErrorAction Stop
                        Sync-UDElement -Id 'DynamicTabs'
                    } catch {
                        Show-UDToast -Title 'ERREUR!' -Message "$($EventData.Surname) $($EventData.GivenName) n'a pas pu être ajouté au groupe $($SelectedGroup.Name)" -Duration 10000
                    }
                }
            }
        }
    )

    $DynamicTabs = {
        New-UDDynamic -Id 'DynamicTabs' -Content {
            New-UDGrid -Item -Children {
                if ($SelectedGroup) {
                    Show-UDToast -Message "[DynamicTabs] `$SelectedGroup = $($SelectedGroup.Name)" -Duration 10000 #dev
                    New-UDTabs -Id 'Tabs' -Tabs {
                        New-UDTab -Text 'Liste des utilisateurs' -Content { 
                            $GroupMembers = Get-ADGroupMember -Identity $SelectedGroup.DistinguishedName
        
                            if ($GroupMembers.Count -eq 0) {
                                New-UDAlert -Severity info -Text 'Aucun utilisateur n''est membre de ce groupe.'
                            } else {
                                $Users = @()
                                $GroupMembers | ForEach-Object {
                                    $Users += Get-ADUser -Identity $_.SamAccountName -Properties Company, Department, Title, Mail
                                }
                                New-UDTable -Id 'TableListMembers' -Data $Users -Columns $ColumnsTableList  -Dense -DefaultSortDirection ascending -ShowSort -DisableMultiSelect -DisableSortRemove -PageSize 10 -ShowPagination -ShowExport
                            }
                        }

                        New-UDTab -Text 'Ajouter' -Content {
                            $TableAddMembersProps = @{
                                Id                   = 'TableAddMembers' 
                                Columns              = $ColumnsTableAdd
                                DefaultSortDirection = 'ascending' 
                                Dense                = $true
                                DisableMultiSelect   = $true 
                                DisableSortRemove    = $true 
                                PageSize             = 10 
                                ShowPagination       = $true 
                                ShowSort             = $true                 
                            }
                            New-UDTable @TableAddMembersProps -LoadData {
                                $TableData = ConvertFrom-Json $Body

                                $PageSize = $TableData.PageSize
                                $Offset = $TableData.Page * $PageSize
                                $NextRow = $Offset + $PageSize - 1

                                $OrderBy = $TableData.orderBy.field
                                if ($OrderBy -eq $null) {
                                    $OrderBy = 'Surname'
                                }

                                $Descending = $false
                                if ($TableData.OrderDirection -eq 'desc') {
                                    $Descending = $true
                                }

                                $WhereArray = @()
                                if ($TableData.Filters) {
                                    foreach ($filter in $TableData.Filters) {
                                        $WhereArray += "`$_.$($filter.id) -like '$($filter.value)*'"
                                    }
                                }
                                $WhereString = $WhereArray -Join ' -and ' 
                                $WhereBlock = [scriptblock]::Create($WhereString)

                                if ($WhereArray.Count) {
                                    $Data = $Cache:AssignableUsers | Where-Object $WhereBlock | Sort-Object $OrderBy -Descending:$Descending
                                } else {
                                    $Data = $Cache:AssignableUsers | Sort-Object $OrderBy -Descending:$Descending
                                }

                                $TotalCount = $Data.Count

                                $Data = $Data[$Offset..$NextRow] | 
                                ForEach-Object {
                                    @{
                                        Surname        = $_.Surname
                                        GivenName      = $_.GivenName
                                        Company        = $_.Company
                                        Department     = $_.Department
                                        Title          = $_.Title
                                        Mail           = $_.Mail
                                        SamAccountName = $_.SamAccountName
                                    }
                                }

                                $Data | Out-UDTableData -TotalCount $TotalCount -Page $TableData.Page -Properties $TableData.Properties
                            }
                        }
                    }
                } else { 
                    New-UDAlert -Severity info -Text 'Aucun groupe sélectionné.'
                } 
            }
            Sync-UDElement -Id 'DynamicDetails' #Used to correct BUG 1 at line 248
        } -LoadingComponent {
            New-UDElement -Tag 'BR'
            New-UDProgress
        }
    }

    New-UDCard -Title 'Gérer mes groupes d''utilisateurs' -Content {
        New-UDGrid -Container -Children {
            New-UDGrid -Item -Children {
                
                if ($ManagedGroups.Count -eq 0) {
                    New-UDTypography -Text 'Vous n''avez la gestion d''aucun groupe.'
                    New-UDHtml -Markup 'BR'
                    New-UDTypography -Text ''
                } else {
                    New-UDTooltip -TooltipContent { 'Sélectionnez le groupe que vous souhaitez gérer' } -Content {
                        New-UDSelect -Id 'SelectManagedGroup' -Label 'Groupe' -DefaultValue 'null' -Option { 
                            New-UDSelectOption -Name 'Sélectionnez un groupe' -Value 'null'
                            $ManagedGroups | ForEach-Object {
                                New-UDSelectOption -Name $_.Name -Value $_.DistinguishedName
                            }
                        } -OnChange { 
                            if ($EventData -eq 'null') {
                                # Aucun groupe séléctionné
                                $SelectedGroup = $null
                            } else { 
                                $SelectedGroup = $ManagedGroups | Where-Object { $_.DistinguishedName -eq $EventData }
                            }
                            
                            Sync-UDElement -Id 'DynamicTabs'
                            #Sync-UDElement -Id 'DynamicDetails' #BUG 1 two consecutive sync-udelements do not have the same value for $SelectedGroup
                        }
                    }
                }
            }

            New-UDGrid -Item -Children {            
                New-UDGrid -Container -Children $DynamicDetails   
            } 
        }

        New-UDGrid -Container -Children $DynamicTabs
    }
}
Product: PowerShell Universal
Version: 2.6.2

My bad!

After modifying my environment so that it is no longer persistent, the concerns of variables still accessible after refreshing the browser or between the tabs are resolved.

However, I still have a problem using New-UDDynamic : https://forums.ironmansoftware.com/t/new-uddynamic-argmentlist-not-working/6444