Buttons not registered correctly with endpoint

HI i have been doing some tests with UD and i have tried to test the following code

Get-UDDashboard | Stop-UDDashboard
 
$Services = New-UDEndpoint -Id test -Url "/Services" -Endpoint {
   
              
    $Cache:Services = (Get-Service -ComputerName "app001" -Name "MpsSvc") | Select-Object Name, Status | Sort-Object Name | ForEach-Object { 
                    
                    
        $FontColor = 'Green'

        if ($_.Status -ne 'Running') {
                        
            $FontColor = 'Red'
        }
                    
                                  
        [PSCustomObject]@{
            Name = $_.Name
            Status = New-UDElement -Tag 'div' -Attributes @{ style = @{ color = $FontColor } } -Content { $_.Status.ToString() }
            Select = if ($_.Status -eq 'Stopped') {

                
                    New-UDButton -BackgroundColor "Red" -Text "Start" -OnClick {
                        Get-Service -ComputerName "app001" -Name $_.Name | Start-Service
                       
                        Invoke-RestMethod http://localhost:1000/api/services
                        
                        Show-UDToast -Message "Service Started!" -MessageColor Green -Title $_.Name -Position topCenter -Duration 2500
                    }
                

            }
            else {

                if ($_.Status -eq 'Running') {

                    
                        New-UDButton -BackgroundColor "#26a69a" -Text "Stop" -Icon stop_circle -OnClick {

                            Get-Service -ComputerName "app001" -Name $_.Name | Stop-Service
                            
                            Invoke-RestMethod http://localhost:1000/api/services

                            Show-UDToast -Message "Service Stopped!" -MessageColor Red -Title $_.Name -Position topCenter -Duration 2500
                        
                        }
                    
                }
            }
        }
    }
                    
                                    
      
    
}


$HomePage = New-UDPage -Name "Home" -Icon home -Content {

    

    New-UDCard -Title "Welcome to Tasks Manager Dashboard! You can begin by clicking hamburger menu icon above"

    New-UdRow {
        New-UdColumn -Size 6 -Content {
            New-UdRow {
                New-UdColumn -Size 12 -Content {
                    New-UdTable -Title "Server Information" -Headers @(" ", " ") -Endpoint {
                        @{
                            'Computer Name'         = $env:COMPUTERNAME
                            'Operating System'      = (Get-CimInstance -ClassName Win32_OperatingSystem).Caption
                            'Total Disk Space (C:)' = (Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='C:'").Size / 1GB | ForEach-Object { "$([Math]::Round($_, 2)) GBs " }
                            'Free Disk Space (C:)'  = (Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DeviceID='C:'").FreeSpace / 1GB | ForEach-Object { "$([Math]::Round($_, 2)) GBs " }
                        }.GetEnumerator() | Out-UDTableData -Property @("Name", "Value")
                    }
                }
            }
            New-UdRow {
                New-UdColumn -Size 3 -Content {
                    New-UdChart -Title "Memory by Process" -Type Doughnut -RefreshInterval 5 -Endpoint {
                        Get-Process | ForEach-Object { [PSCustomObject]@{ Name = $_.Name; WorkingSet = [Math]::Round($_.WorkingSet / 1MB, 2) } } | Out-UDChartData -DataProperty "WorkingSet" -LabelProperty Name
                    } -Options @{
                        legend = @{
                            display = $false
                        }
                    }
                }
                New-UdColumn -Size 3 -Content {
                    New-UdChart -Title "CPU by Process" -Type Doughnut -RefreshInterval 5 -Endpoint {
                        Get-Process | ForEach-Object { [PSCustomObject]@{ Name = $_.Name; CPU = $_.CPU } } | Out-UDChartData -DataProperty "CPU" -LabelProperty Name
                    } -Options @{
                        legend = @{
                            display = $false
                        }
                    }
                }
                New-UdColumn -Size 3 -Content {
                    New-UdChart -Title "Handle by Process" -Type Doughnut -RefreshInterval 5 -Endpoint {
                        Get-Process | Out-UDChartData -DataProperty "HandleCount" -LabelProperty Name
                    } -Options @{
                        legend = @{
                            display = $false
                        }
                    }
                }
                New-UdColumn -Size 3 -Content {
                    New-UdChart -Title "Threads by Process" -Type Doughnut -RefreshInterval 5 -Endpoint {
                        Get-Process | ForEach-Object { [PSCustomObject]@{ Name = $_.Name; Threads = $_.Threads.Count } } | Out-UDChartData -DataProperty "Threads" -LabelProperty Name
                    } -Options @{
                        legend = @{
                            display = $false
                        }
                    }
                }
            }
            New-UdRow {
                New-UdColumn -Size 12 -Content {
                    New-UdChart -Title "Disk Space by Drive" -Type Bar -AutoRefresh -Endpoint {
                        Get-CimInstance -ClassName Win32_LogicalDisk | ForEach-Object {
                            [PSCustomObject]@{ DeviceId = $_.DeviceID;
                                Size                    = [Math]::Round($_.Size / 1GB, 2);
                                FreeSpace               = [Math]::Round($_.FreeSpace / 1GB, 2); 
                            } } | Out-UDChartData -LabelProperty "DeviceID" -Dataset @(
                            New-UdChartDataset -DataProperty "Size" -Label "Size" -BackgroundColor "#80962F23" -HoverBackgroundColor "#80962F23"
                            New-UdChartDataset -DataProperty "FreeSpace" -Label "Free Space" -BackgroundColor "#8014558C" -HoverBackgroundColor "#8014558C"
                        )
                } -Options @{
                    scales = @{
                        yAxes = @(@{
                                min = 0
                            })
                    }
                }
            }
        }
    }
    New-UdColumn -Size 6 -Content {
        New-UdRow {
            New-UdColumn -Size 6 -Content {
                New-UdMonitor -Title "CPU (% processor time)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80FF6B63' -ChartBorderColor '#FFFF6B63'  -Endpoint {
                    try {
                        Get-Counter '\Processor(_Total)\% Processor Time' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
                    }
                    catch {
                        0 | Out-UDMonitorData
                    }
                }
            }
            New-UdColumn -Size 6 -Content {
                New-UdMonitor -Title "SQL CPU (% processor time)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80FF6B63' -ChartBorderColor '#FFFF6B63'  -Endpoint {
                    try {
                        Get-Counter '\Processor(_Total)\% Processor Time' -ComputerName lmsdbstg06 -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
                    }
                    catch {
                        0 | Out-UDMonitorData
                    }
                }
            }
            New-UdColumn -Size 6 -Content {
                New-UdMonitor -Title "Memory (% in use)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#8028E842' -ChartBorderColor '#FF28E842'  -Endpoint {
                    try {
                        Get-Counter '\memory\% committed bytes in use' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
                    }
                    catch {
                        0 | Out-UDMonitorData
                    }
                }
            }
            New-UdColumn -Size 6 -Content {
                New-UdMonitor -Title "SQL Memory (% in use)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#8028E842' -ChartBorderColor '#FF28E842'  -Endpoint {
                    try {
                        Get-Counter '\memory\% committed bytes in use' -ComputerName lmsdbstg06 -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
                    }
                    catch {
                        0 | Out-UDMonitorData
                    }
                }
            }
        }
        New-UdRow {
            New-UdColumn -Size 6 -Content {
                New-UdMonitor -Title "Network (IO Read Bytes/sec)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80E8611D' -ChartBorderColor '#FFE8611D'  -Endpoint {
                    try {
                        Get-Counter '\Process(_Total)\IO Read Bytes/sec' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
                    }
                    catch {
                        0 | Out-UDMonitorData
                    }
                }
            }
            New-UdColumn -Size 6 -Content {
                New-UdMonitor -Title "SQL Network (IO Read Bytes/sec)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80E8611D' -ChartBorderColor '#FFE8611D'  -Endpoint {
                    try {
                        Get-Counter '\Process(_Total)\IO Read Bytes/sec' -ComputerName lmsdbstg06 -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
                    }
                    catch {
                        0 | Out-UDMonitorData
                    }
                }
            }
            New-UdColumn -Size 6 -Content {
                New-UdMonitor -Title "Disk (% disk time)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80E8611D' -ChartBorderColor '#FFE8611D'  -Endpoint {
                    try {
                        Get-Counter '\physicaldisk(_total)\% disk time' -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
                    }
                    catch {
                        0 | Out-UDMonitorData
                    }
                }
            }
            New-UdColumn -Size 6 -Content {
                New-UdMonitor -Title "SQL Disk (% disk time)" -Type Line -DataPointHistory 20 -RefreshInterval 5 -ChartBackgroundColor '#80E8611D' -ChartBorderColor '#FFE8611D'  -Endpoint {
                    try {
                        Get-Counter '\physicaldisk(_total)\% disk time' -ComputerName lmsdbstg06 -ErrorAction SilentlyContinue | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue | Out-UDMonitorData
                    }
                    catch {
                        0 | Out-UDMonitorData
                    }
                }
            }
        }
        New-UdRow {
            New-UdColumn -Size 12 {
                New-UdGrid -Title "Processes" -Headers @("Name", "ID", "Working Set", "CPU") -Properties @("Name", "Id", "WorkingSet", "CPU") -AutoRefresh -RefreshInterval 60 -Endpoint {
                    Get-Process | Select-Object Name, ID, WorkingSet, CPU | Out-UDGridData
                 }
              }
           }
        }
     }
  }


$Page1 = New-UDPage -Name "Services" -Icon server -Content { 

    

    New-UDElement -Id "Services" -Tag div4 -EndPoint {
    
        New-UDGrid -Id "Grid" -Title "Services" -Headers @("Name", "Status", "Select") -Properties @("Name", "Status", "Select") -Endpoint {
        
            $Cache:Services | Out-UDGridData
               
        }
                                 
    }  
                        
    New-UDButton -BackgroundColor "#26a69a" -Text "Refresh" -OnClick {
        Start-Sleep -Seconds 2
        Sync-UDElement -Id "Grid" -Broadcast 
        Start-Sleep -Seconds 2      
    } 
} 
           
Start-UDDashboard -Endpoint @($Services) -Content {  
    New-UDDashboard -Pages @($HomePage, $Page1) -Title "SM" -Color '#FF050F7F'
    
} -Port 1000 -Name SM -AutoReload

and below is the results when trying to do Invoke-RestMethod http://localhost:1000/api/services

felt like a bug but it worked when i gave the button an ID but wont work right when u have multiple objects because they cannot share same id.

i have tried giving the button a different id for different object and when i refresh the grid the status changed after onclick but the button remains the same unless i refresh the whole page F5 then the button changed to match the next status

image

after F5

image

Seems kind of like a bug. Have to considered not caching the button and just caching the data about the services and then making the button within the UDGrid endpoint? What you’re doing seems like it should work but I just wonder if there’s some weirdness happening because you’re creating the buttons in the REST API. I honestly haven’t tried that before.

ill give that a try and see how the performance goes.

yep that works adam , finally i can improve UD performance using the technique and invoke-udevent

thank you so much for the support.

1 Like

The solution works locally but not stable when using invoke-udevent in button click, after the forth click ud becomes unresponsive.