Dioxus Bootstrap migration #29

Merged
mahmoud merged 91 commits from development_mahmoud into development 2026-03-16 02:06:46 +00:00
Owner
No description provided.
feat: implement new dashboard with client-side routing
All checks were successful
Test / test (push) Successful in 2m4s
d99972e8d3
- Migrate to hash-based client-side routing
- Introduce dedicated JavaScript modules for UI logic
- Replace static asset routing with consolidated `/static` route
- Update frontend to Bootstrap 5 and Bootstrap Icons
- Remove `base_path` and add version to `IndexTemplate`
refactor: refactor UI and API for single node compute server
All checks were successful
Test / test (push) Successful in 2m2s
ca0da9b166
- Transition from multi-node explorer to single node view
- Remove node list and filter UI
- Display current node status and owned slices
- Update VM management to operate on current node
- Introduce VM statistics and node registration
feat: Implement live VM log and status tracking
All checks were successful
Test / test (push) Successful in 1m39s
9ec74bff06
- Introduce live-tailing log panel for VM operations
- Poll VM logs and state in real-time
- Track VM operations (deploy, start, stop, restart, delete)
- Enhance `showModal` with large dialog option
- Integrate live panel into VM action workflows
feat: migrate UI to Dioxus WASM frontend with Axum backend
Some checks failed
Test / test (push) Failing after 2m16s
febf48e006
- Rewrite frontend from Askama/JS to Dioxus/WASM
- Introduce Dioxus components for nodes and VMs management
- Refactor native Axum server to serve WASM assets
- Remove old Askama templates and static JS/CSS assets
- Update dependencies to support Dioxus and WASM ecosystem
feat: Upgrade Dioxus to 0.7 and enhance UI
Some checks failed
Test / test (push) Failing after 1m38s
021ab9ccb5
- Upgrade Dioxus framework to version 0.7.
- Implement thread-safe RPC ID generation.
- Add collapsible sidebar and auto-prompt secret dialog.
- Disable slice deploy button when secret is empty.
- Refactor VM deletion dialog and loading states.
feat: integrate Dioxus UI build and asset discovery
Some checks failed
Test / test (push) Failing after 1m40s
7b602a6cbd
- Add `default_dist_dir` for UI asset path lookup
- Introduce `build-ui` target for Dioxus WASM UI
- Update `start` and `run-ui` to depend on `build-ui`
- Add Dioxus CLI instructions to README
- Update `hero_cloud_ui` description in documentation
refactor: Streamline build and run experience
Some checks failed
Test / test (push) Failing after 1m37s
ac6cbc68c9
- Rearchitect `hero_cloud_ui` into modular Dioxus WASM components
- Simplify Makefile targets to `install`, `build`, `start`, `stop`
- Remove verbose individual service and proxy Makefile targets
- Update documentation for new build and run commands
- Add Dioxus CLI and WASM target installation to `make install`
build: Add Makefile targets for test, lint, and format
Some checks failed
Test / test (push) Failing after 1m34s
28b9674c14
- Add `test` target to run unit tests
- Add `lint` target to run clippy linter
- Add `fmt` target to format code
chore: add main div element to body
Some checks failed
Test / test (push) Failing after 1m58s
c950712c93
build: enhance startup output and refine data types
Some checks failed
Test / test (push) Failing after 1m35s
e3cc6f0b14
- Add UI access instructions to service startup
- Refine memory field types in structs from `u64` to `u32`
- Add `#[serde(default)]` to `name` fields for default deserialization
feat: add home page and overhaul nodes management UI
Some checks failed
Test / test (push) Failing after 1m40s
488993cae4
- Introduce new HomePage with system status and quick links
- Redesign NodesPage for local and network node management
- Add node registration dialog with system specs and activity log
- Implement API for node registration and explorer node queries
- Update service stop to delete service and handle errors internally
feat: add explorer RPC proxy and client
Some checks failed
Test / test (push) Failing after 1m36s
7259a76a76
- Introduce `explorer` socket path argument
- Add `explorer_socket` to application state
- Implement `/explorer/rpc` route and proxy
- Prefix explorer methods with 'explorer.'
- Add client-side `explorer_rpc` for web UI
feat: implement node unregistration & VM lifecycle
Some checks failed
Test / test (push) Failing after 1m57s
c270b9f0db
- Add `node_unregister` API function
- Integrate node unregistration UI with confirmation dialog
- Introduce `DeployOnSliceModal` for VM creation
- Add VM stop and delete actions to `SliceCard`
- Refine node refresh logic and error handling
feat: add real-time node metrics and two-phase VM deploy modal
Some checks failed
Test / test (push) Failing after 1m35s
5a70fa3426
- Introduce `NodeStats` fetching and 5s polling.
- Display CPU, memory, disk usage, load, uptime, running VMs.
- Refactor VM deploy modal to form and real-time log phases.
- Implement `beforeunload` guard during VM deployment.
- Remove icons from QuickAction components.
refactor: internalize secret retrieval for VM API calls
Some checks failed
Test / test (push) Failing after 1m36s
e26a598829
- Remove `secret` parameter from VM API functions
- Fetch secret internally within `api` functions
- Update UI components to use parameterless API
- Add consecutive error limit for VM deploy polling
- Handle immediate terminal states after VM deploy
fix: improve VM deployment state polling
Some checks failed
Test / test (push) Failing after 1m35s
643f4c04af
- Add a 2-minute timeout for VM provisioning
- Track progress during polling to differentiate 'stopped' states
- Treat initial 'stopped' as non-terminal for background provisioning
- Consolidate 'running' state check for immediate completion
- Update log messages for VM states
chore: Add console logging for VM operations
Some checks failed
Test / test (push) Failing after 1m37s
559688f9ad
- Log `sid` and `secret` length in `get_vm`
- Log `secret` length and `slice_sid` in `deploy_vm`
chore: log machine/slice secrets
Some checks failed
Test / test (push) Failing after 1m37s
109c8b59d1
refactor: Conditionally scrub VM secrets in API responses
Some checks failed
Test / test (push) Failing after 1m40s
142e90a688
- Wrap VM operations in `with_secret` context
- Scrub VM secrets only for external CRUD calls
- Retain secrets for internal service validation
(delete_vm -> bool).
refactor: Remove unnecessary console logging
Some checks failed
Test / test (push) Failing after 1m36s
6ccd685dd2
- Remove debug logs from get_vm and deploy_vm
- Update node_unregister documentation
- Add VM deletion before slice deletion in node_unregister
feat: Add operation timeout and improved error handling
Some checks failed
Test / test (push) Failing after 1m39s
59f5b27dc4
- Add polling timeout mechanism
- Show specific error for "no hypervisor"
- Show specific error for "not found"
- Avoid repeated error messages on polls
fix: Make delete button always available
Some checks failed
Test / test (push) Failing after 2m1s
6f6df4086a
- Remove condition disabling delete button
- Allow deleting stuck VMs
fix: Allow deletion of VMs without hypervisor
Some checks failed
Test / test (push) Failing after 1m37s
5ca92a77c5
- Allow deletion of VMs in non-stopped states if no hypervisor is present
- Log when deleting VMs without a hypervisor
fix: Handle successful "stopped" VM state
Some checks failed
Test / test (push) Failing after 2m42s
132e1db525
- Treat "stopped" state as success if hypervisor_id is present
- Log VM deployed successfully with Mycelium IP if available
- Set deploy phase to Done on successful provisioning
fix: Preserve secret during VM deployment
Some checks failed
Test / test (push) Failing after 1m39s
bcc8f48d4a
- Clone secret for background task use
- Set VM state to Provisioning initially
- Use with_secret to prevent secret scrubbing
- Update VM state and save after creation
refactor: Improve VM deployment logging and deletion handling
Some checks failed
Test / test (push) Failing after 2s
0f39811fe2
- Remove VM deployment timeout logic
- Add periodic VM state updates to logs
- Update delete VM toast and reload VM list
refactor: Rename hero_cloud to hero_compute
Some checks failed
Test / test (push) Failing after 1s
b13c10ebc6
Rename all crates, binaries, socket paths, data paths,
env vars, and documentation from hero_cloud to hero_compute.
chore: Update Cargo.lock and regenerated files for CI
Some checks failed
Test / test (push) Failing after 2s
bd3344c042
fix: Clear stale cargo git cache in CI before building
Some checks failed
Test / test (push) Failing after 1m37s
2ae9a8c097
The builder container image caches git refs that may point to
rebased/force-pushed commits in hero_rpc, causing resolution failures.
fix: Apply cargo fmt formatting fixes for CI
Some checks failed
Test / test (push) Failing after 1m18s
5ebd6ebdcf
- Replace cpu_count with slice_count in deploy_vm; auto-allocate free slices
- Add deploy_lock to prevent concurrent slice double-booking
- Add deployment_log store with structured job tracking across all VM operations
- Forward secret parameter through all explorer proxied VM methods
- Add get_deployment_logs and list_deployments RPC endpoints
- Add Admin page with node health, VM table, deployment log viewer, and live activity terminal
fix: Additional cargo fmt fixes for server.rs and api_explorer.rs
Some checks failed
Test / test (push) Failing after 1m21s
3c784b0472
fix: Resolve clippy warnings for collapsible_if and new_without_default
All checks were successful
Test / test (push) Successful in 1m43s
ac2bd9319b
refactor: replace Dioxus WASM UI with server-rendered Askama + Bootstrap dashboard
All checks were successful
Test / test (push) Successful in 1m41s
bbda872577
- Remove Dioxus frontend and all WASM-related dependencies/tooling
  - Add Askama HTML templates with Bootstrap 5 and Unpoly for navigation
  - Embed static assets via rust-embed instead of serving from dist/
  - Simplify Makefile by removing dx build step and wasm32 target
  - Update binary names from hero_cloud_* to hero_compute_* in Makefile
refactor: Rename hero_cloud to hero_compute
All checks were successful
Test / test (push) Successful in 1m19s
2ddd92abe7
- Rename environment variables from HERO_CLOUD_* to HERO_COMPUTE_*
- Update comments and documentation related to the renaming
- Adjust generated artifact paths to reflect the new naming
feat: Introduce scripts for service management
All checks were successful
Test / test (push) Successful in 1m19s
3776bd1b0f
- Add `start.sh` script
- Add `stop.sh` script
- Add `status.sh` script
- Update Makefile for new scripts
fix: Handle query strings and forget old zinit services
All checks were successful
Test / test (push) Successful in 1m42s
5772964732
- Strip query strings from static file paths
- Add Cache-Control header for static files
- Forget old zinit services to handle renames
- Stop and forget old hero_cloud_* services
fix: Use zinit remove instead of zinit forget in scripts
All checks were successful
Test / test (push) Successful in 1m42s
b3ee112a1f
fix: Add build.rs to rebuild UI when static assets change
All checks were successful
Test / test (push) Successful in 1m19s
cd3b3cfaf1
Without this, cargo's incremental compilation doesn't detect
changes to the static/ or templates/ directories, causing
rust-embed to serve stale (or empty) assets.
fix: Use axum 0.7 route syntax (:path) instead of 0.8 ({path})
All checks were successful
Test / test (push) Successful in 1m44s
eb891e5c00
The workspace uses axum 0.7.9 for the UI crate, which uses
:path for path parameters. The {path} syntax is axum 0.8 only
and was treated as a literal string, causing all /css/*, /js/*,
and /fonts/* routes to return 404.
fix: Move page scripts to {% block scripts %} so they load after app.js
All checks were successful
Test / test (push) Successful in 1m22s
80d403234c
Inline <script> tags inside {% block content %} ran before app.js was
loaded, causing ReferenceError for rpc(), escapeHtml(), loadOpenRpcSpec()
etc. Moving all page-specific JS to {% block scripts %} ensures it
executes after the base template's script includes.
feat: Add expandable deployment logs to VM tables
All checks were successful
Test / test (push) Successful in 1m21s
45ea73e545
- VMs page: each VM row has a chevron that expands an inline log
  panel showing deployment progress from get_deployment_logs RPC
- Auto-expand log panel for VMs in provisioning/error/starting state
- Admin page: deployment history rows are now expandable with
  color-coded log lines and a preview of the last line
- Failed deployments auto-expand on page load
- Added vmStateHint() for human-readable state descriptions
- Shared renderVmRow() function used by both VMs and Admin pages
- Log lines color-coded: ERROR=red, success=green, info=default
fix: Walk individual files in build.rs for reliable rebuild detection
All checks were successful
Test / test (push) Successful in 1m41s
98127343f9
rerun-if-changed on a directory only detects add/remove, not content
changes to files within it. Walking each file individually ensures
cargo rebuilds when app.js, dashboard.css, or templates are modified.
feat: Persist VM logs to disk instead of in-memory store
Some checks failed
Test / test (push) Failing after 1m20s
610b74632e
VM operation logs (deploy, start, stop, restart) are now stored
directly on the Vm record in the OSIS sled database via new
`logs: [str]` and `log_status?: str` fields.

This replaces the in-memory DeploymentLogStore which was lost on
every server restart. Logs now survive restarts and accumulate
the full history of operations on each VM.

- Add `logs` and `log_status` fields to Vm rootobject in schema
- Replace all log_store.lock() calls with vm_log() helpers that
  write directly to the persisted VM record
- get_deployment_logs reads from vm.logs (always available)
- list_deployments scans all VMs with non-empty logs
- Remove deployment_log.rs (in-memory store no longer needed)
- Remove SharedLogStore from ComputeServiceHandler
fix: Always show delete button on VMs regardless of state
Some checks failed
Test / test (push) Failing after 1m21s
7dfc0d5ac7
fix: Use with_secret in vm_log to prevent CRUD hooks from scrubbing data
Some checks failed
Test / test (push) Failing after 1m22s
32c93bd68c
vm_log() calls domain.vm_get() which triggers vm_trigger_get_post,
scrubbing the secret field. When vm_log() then writes back via
vm_set(), the secret was being destroyed, and subsequent reads
would return empty logs because the VM record was corrupted.

Wrap all vm_get() calls in vm_log/vm_log_start with with_secret("")
(internal access) to bypass the CRUD hooks. Also fix
get_deployment_logs and list_deployments to use with_secret so
they return the full VM data including logs.
fix: Protect all internal vm_get calls with INTERNAL_SECRET context
Some checks failed
Test / test (push) Failing after 1m20s
b1c1a4b3de
Every domain.vm_get() without a secret context triggers
vm_trigger_get_post which scrubs vm.secret=None. When the result
is written back via vm_set(), the secret is destroyed and logs
can be lost due to race conditions with corrupted VM records.

Added INTERNAL_SECRET sentinel ("__internal__") that bypasses the
scrub hook. All internal vm_get calls (background tasks, monitors,
vm_log helpers, job_id saves, reconciliation) now use
with_secret(INTERNAL_SECRET, || ...) to preserve all VM fields.
fix: Remove duplicate if/else branches flagged by clippy
Some checks failed
Test / test (push) Has been cancelled
d2386511a1
feat: Add service discovery manifest endpoint
Some checks failed
Test / test (push) Failing after 1m18s
a21d908394
- Add /.well-known/heroservice.json endpoint
- Expose service manifest information (protocol, name, version, etc.)
- Update HTML template to dynamically set theme on load
fix: Remove nonexistent hero-bootstrap-bridge.css reference
Some checks failed
Test / test (push) Failing after 1m14s
b91671ba7d
fix: Poll deployment logs faster and always show final state
Some checks failed
Test / test (push) Failing after 1m27s
83b629dd69
- Poll every 500ms instead of 2s so intermediate log lines are visible
  even when deployment completes quickly
- First poll fires after 300ms instead of waiting 2s
- Use setTimeout chain instead of setInterval for more responsive polling
- Always render log lines before checking completion status
- Auto-scroll log containers to bottom on each update
- Refresh VM list after deployment completes
chore: Remove legacy hero_cloud service stopping
Some checks failed
Test / test (push) Failing after 1m18s
cfd359e71b
- Remove stopping of old hero_cloud zinit services
- Remove removal of old hero_cloud zinit services
fix: Add timeout to zinit job monitor and fix log status defaults
Some checks failed
Test / test (push) Failing after 1m18s
f1a867013c
Three bugs fixed:

1. ZINIT MONITOR INFINITE LOOP: If zinit.job_status() always fails
   (due to zinit SDK deserialization bugs), the monitor looped forever,
   keeping VMs stuck in "provisioning" permanently. Now gives up after
   15 consecutive failures (~30s) and marks VM as error with a clear
   log message explaining what happened.

2. FALSE "COMPLETED" STATUS: get_deployment_logs defaulted log_status
   to "completed" when None, even for VMs still in provisioning. This
   caused the UI to show "Deployment completed" toast while the VM was
   still stuck. Now infers status from VM state: provisioning/starting
   → "running", error → "failed", stopped/running → "completed".

3. MONITOR WRITES LOGS: Each failed poll attempt now writes a log line
   to the VM record ("Waiting for zinit job N...") so the user can see
   the monitor is trying and what errors it encounters.
fix: Stop annoying log polling loop and add vm_log tracing
Some checks failed
Test / test (push) Failing after 1m19s
70fb9c0a77
UI changes:
- Stop polling when VM has no logs AND status is not "running"
- Show "Waiting for log output..." instead of flashing "Loading/No logs"
- Poll slower (2s) when no lines yet, faster (500ms) when lines exist
- Max 60 empty polls before giving up (2 minutes)
- Track poll count per VM to prevent infinite loops

Server changes:
- Add tracing::info/error to vm_log and vm_log_start so we can see
  in zinit logs whether log writes succeed or fail
- This will help diagnose why logs might be empty
fix: Capture vm_sid AFTER vm_set assigns the SID, not before
Some checks failed
Test / test (push) Failing after 1m18s
e415d9a94a
ROOT CAUSE: vm_new() creates a VM with an empty/default SID.
The real SID is assigned during vm_set() (first save). But
vm_sid was captured via vm.sid.to_string() BEFORE vm_set(),
so it was always "0000" (the default). All vm_log calls used
this wrong SID → "object not found: 0000" → no logs written.

Confirmed by running server with RUST_LOG=debug:
  vm_log_start: vm_get failed for 0000: object not found: 0000

FIX: Move `let vm_sid = vm.sid.to_string()` to AFTER each
vm_set() call so it captures the real assigned SID.
fix: Stop log panel flashing and avoid full page reloads
Some checks failed
Test / test (push) Failing after 1m19s
3fdf538c79
- Don't show "Loading..." if panel already has content
- Stop polling when log panel is collapsed
- Cancel pending polls before starting new ones
- VM actions (start/stop/delete) refresh the VM list inline
  instead of location.reload() which caused the flash
- Track poll timers per VM to prevent duplicate polling
fix: Update VM state in-place instead of rebuilding table
Some checks failed
Test / test (push) Failing after 1m18s
db0ee3c78b
vmAction (start/stop) was calling loadVms() which rebuilds the
entire table via innerHTML, destroying expanded log panels and
causing visible flash. Now polls just the affected VM's state
and updates only its badge cell in-place. Log panels and timers
are preserved.
fix: Fall back to bridge IP when mycelium_ip is not available
Some checks failed
Test / test (push) Failing after 1m19s
806cbd91d7
The chvm network_state has mycelium_ip (IPv6 from mycelium daemon)
and ip_address (bridge IP like 192.168.200.2/24). When mycelium is
not running inside the VM, mycelium_ip is None but the bridge IP
is always available.

- ChvmDriver::mycelium_ip() now falls back to ip_address (stripped
  of CIDR /24 suffix) when mycelium_ip is None
- Reconciliation on startup now fetches IP for running VMs that
  don't have one set yet
fix: Update action buttons and IP when VM state changes
Some checks failed
Test / test (push) Failing after 1m18s
5dfecf207c
pollVmState now updates all 3 dynamic cells in the VM row:
- State badge + hint text
- IP address (shows new IP after start)
- Action buttons (Start/Stop swap based on current state)

Previously only the badge was updated, so Stop button stayed
visible after VM stopped, requiring a page refresh.
fix: Replace browser confirm() with Bootstrap modal dialog
Some checks failed
Test / test (push) Failing after 1m20s
d2a253d44a
Added reusable showConfirm(title, message, actionLabel, class, fn)
that shows a proper Bootstrap modal instead of the native browser
confirm() alert. Delete VM now uses a styled modal with a red
Delete button matching the rest of the UI.
feat: Show loading spinners during VM actions
Some checks failed
Test / test (push) Failing after 1m19s
1e6a118504
- Start/Stop: action buttons replaced with spinner + label
  ("starting...", "stopping...") while RPC is in flight
- Delete: spinner shown after confirm dialog, buttons restored on error
- Deploy modal: spinner shown while submitting deploy request
- All spinners use Bootstrap spinner-border-sm for consistency
fix: Apply cargo fmt and sync linter changes
All checks were successful
Test / test (push) Successful in 1m23s
338f062370
fix: Only return real mycelium IPv6 address, not bridge IP
All checks were successful
Test / test (push) Successful in 1m22s
2221d226fc
fix: Show VM IP address correctly — mycelium IPv6 or bridge IPv4
All checks were successful
Test / test (push) Successful in 1m21s
6182db7bfe
mycelium_ip() returns the real mycelium IPv6 address if available,
otherwise falls back to the bridge IPv4 (e.g. 192.168.200.2).
The VM is always reachable at one of these from the host.

Renamed column from "Mycelium IP" to "IP Address" since not all
VMs will have mycelium running inside them.
feat: Redesign Node Health section with metric cards
All checks were successful
Test / test (push) Successful in 1m21s
061b0e7da0
Replaced the flat stat-row layout with individual cards per metric:
- Each card has an icon, large bold value, and contextual details
- CPU, RAM, Disk show progress bars with color coding:
  green (<60%), yellow (60-80%), red (>80%)
- RAM and Disk show used/total detail text below the bar
- Load shows 1/5/15 minute averages as detail text
- Uptime and VMs as standalone values
- Cards have subtle border highlight on hover
- Auto-refresh every 30 seconds
fix: Make health cards equal height with min-height
Some checks failed
Test / test (push) Has been cancelled
59f227c6cf
feat: Redesign dashboard and add health metrics
All checks were successful
Test / test (push) Successful in 1m29s
237b852cca
- Update page title from Home to Dashboard
- Replace old stats section with node overview card
- Add CPU, Memory, Disk, Slices, VMs, and Uptime metrics
- Display a list of recent VMs with basic actions
- Show recent deployment activity
- Add a setup section for unregistered nodes
- Implement periodic updates for stats
feat: Refresh health stats every 5s for real-time feel
All checks were successful
Test / test (push) Successful in 1m22s
d9ec1cc7cc
feat: Add dashboard animations and new UI elements
All checks were successful
Test / test (push) Successful in 1m18s
8136160b77
- Add fade-in animations for dashboard cards
- Implement animated counters for resource usage
- Add CPU sparkline history display
- Introduce slice map visualization
- Enhance activity feed with slide-in animations
feat: Add loading spinners and action buttons to home page VM table
All checks were successful
Test / test (push) Successful in 1m22s
79b7a68170
- Home page VM rows now have data-sid attribute and vm-row class
  so setVmRowLoading and pollVmState can find them
- Added delete button to home page VM rows
- findVmRow() helper searches by data-sid or onclick pattern,
  works across all pages (Home, VMs, Admin)
- Start/Stop/Delete on home page now shows spinner feedback
  and updates state in-place without page reload
feat: improve dashboard stats and VM rendering
All checks were successful
Test / test (push) Successful in 1m22s
2f1489762c
- Add CPU load descriptive label and value
- Increase CPU sparkline history max
- Refactor VM row rendering logic
- Auto-expand logs for provisioning/error VMs
- Decrease stats refresh interval
feat: Comprehensive activity feed tracking all user actions
All checks were successful
Test / test (push) Successful in 1m22s
a8c043455b
Recent Activity card now shows real-time entries for:
- VM start/stop with status (initiated/success/failed)
- VM deploy with name and slice count
- VM delete with confirmation
- Node registration with hostname and slice count
- API Explorer RPC calls with method name and result
- Server connect/disconnect events (on state change only)
- Secret updates

Activity is seeded on page load with persisted deployment
history from list_deployments, then augmented in real-time
as the user takes actions. Max 50 entries, newest first,
with relative timestamps (now, 5s ago, 2m ago, etc).
feat: Secret migration flow with two-step confirmation modal
All checks were successful
Test / test (push) Successful in 1m22s
314dbd3c37
Backend:
- Added MigrateSecretResult type to schema (migrated_count, failed_count)
- Added migrate_secret(old_secret, new_secret) RPC method
- Implementation reads all VMs with INTERNAL_SECRET context,
  filters by old_secret match, updates each VM's secret field
- Returns count of migrated/failed VMs
- Validates: new_secret not empty, old != new, returns NotFound
  if no VMs match (never reveals "wrong secret")

Frontend:
- Two-step secret modal replacing the simple single-field form
- Step 1 (Set mode): single field for first-time secret setup
- Step 1 (Change mode): current/new/confirm password fields
  with client-side validation (match, different, non-empty)
- On Update: calls list_vms to check for owned VMs
- Step 2 (if VMs exist): shows VM list with state badges,
  offers three choices:
  - [Migrate VMs + Update]: calls migrate_secret RPC, updates
    all VMs to new secret, then updates localStorage
  - [Update Secret Only]: just updates localStorage, warns that
    previous VMs become inaccessible
  - [Cancel]: go back
- Loading spinners on buttons during RPC calls
- Error messages shown inline in the modal
- Activity feed logging for all secret operations
feat: Add eye icon toggle to show/hide secret fields
All checks were successful
Test / test (push) Successful in 1m23s
a38beeb95b
feat: Improve slice map status display
All checks were successful
Test / test (push) Successful in 1m21s
5801aeee84
- Add counts for reserved and degraded slices
- Display VM SID in tooltip for reserved slices
- Show RAM and disk info for free slices
- Update legend to include all slice statuses
feat: Add copy button to VM deployment log panels
All checks were successful
Test / test (push) Successful in 1m23s
6140af6ba9
fix: Check navigator.clipboard exists before calling writeText
Some checks failed
Test / test (push) Has been cancelled
52b5431437
feat: Enhance slice map display and data
All checks were successful
Test / test (push) Successful in 2m37s
078ec5336d
- Add utilization bar for slice status
- Implement hover popovers for slice details
- Display RAM and disk capacity summary
- Improve slice cell styling and sizing
- Update legend to use dots and better formatting
feat: Update node management UI and functionality
All checks were successful
Test / test (push) Successful in 1m22s
f04bae701c
- Restructure the node management page layout
- Add a dedicated section for node registration status
- Implement detailed hardware metrics display (RAM, Disk, Slices)
- Enhance slice map visualization with utilization bars and legends
- Display VMs running on the node in a table format
- Introduce live statistics for CPU, RAM, Disk, Load, VMs, and Uptime
- Refactor JavaScript functions for better organization and reusability
- Add recurring calls for live stats and slice map updates
feat: Update admin dashboard UI and logic
Some checks failed
Test / test (push) Has been cancelled
b5395a6176
- Add node identity bar and sparkline for CPU
- Refactor health metrics layout and add sparkline
- Implement slice map visualization
- Organize VMs and deployments side-by-side
- Enhance JavaScript for admin page functionality
feat: Redesign sidebar as proper offcanvas navigation
All checks were successful
Test / test (push) Successful in 1m21s
91c9bb4605
- Sidebar uses Bootstrap offcanvas-lg: slides in on mobile (hamburger
  menu button), always visible on desktop (>= 992px)
- Fixed width 220px with sticky positioning on desktop
- Active page highlighted with left border accent in primary color
- Navigation links have icons + labels with hover/active states
- Server status indicator shown in sidebar footer
- Mobile: hamburger button in navbar triggers offcanvas, close button
  in offcanvas header to dismiss
- Removed old card-based sidebar layout
- Main content takes remaining width with flex-grow
style: Apply flexbox to sidebar offcanvas body
All checks were successful
Test / test (push) Successful in 1m22s
001b608610
- Set sidebar offcanvas body to flex column
- Ensure sidebar offcanvas body height is 100%
refactor: Clean up dashboard.js — DRY, const/let, shared helpers
Some checks failed
Test / test (push) Has been cancelled
78acc7aad0
- 956 → 714 lines (242 lines removed, 25% reduction)
- Deduplicated rpc()/explorerRpc() into shared _rpcPost() base
- Deduplicated generateSecret()/generateSecretChange() via randomSecret()
- Deduplicated server status DOM updates via setServerStatus() helper
- Extracted vmActionButtons() shared by renderVmRow + pollVmState
- Extracted renderLogLines() shared by fetchVmLogs + pollDeploymentLogs
- Added VM_STATES and TRANSITIONAL_STATES constants
- Replaced all var with const/let
- Added "use strict"
- Zero duplicate function definitions
- Zero console.log statements
- Zero var declarations
chore: Update z-index in slice-popover
All checks were successful
Test / test (push) Successful in 1m22s
51fbe94316
- Increase z-index from 10 to 1080
feat: Improve slice popover positioning
All checks were successful
Test / test (push) Successful in 1m25s
f9ecee4906
- Change slice-popover to use fixed positioning
- Implement event listeners for mouseover and mouseout
- Adjust popover positioning to stay within viewport
refactor: Improve popover positioning logic
All checks were successful
Test / test (push) Successful in 1m20s
fbc269a80f
- Measure popover off-screen before positioning
- Adjust popover to be snug above cell (4px gap)
- Re-clamp popover position to viewport edges
style: Update slice popover positioning and display
All checks were successful
Test / test (push) Successful in 1m22s
Test / test (pull_request) Successful in 1m31s
bfc889cca7
- Change popover positioning from `fixed` to `absolute`
- Adjust popover CSS for centering and display on hover
- Remove JavaScript for popover positioning
fix: Prevent slice popovers from being clipped by card overflow
All checks were successful
Test / test (push) Successful in 1m29s
Test / test (pull_request) Successful in 1m42s
6efe1f11ba
- Added slice-map-card class that sets overflow:visible on the card
  and card-body, overriding Bootstrap's default overflow:hidden
- Changed popover anchor from center (left:50% translateX(-50%))
  to left-aligned (left:0) so edge cells don't extend past container
- Arrow repositioned to left:10px to match new anchor
- Increased z-index on hover cells (20) and popovers (30) to layer
  above the sidebar
merge: Resolve conflicts with development — keep popover overflow fixes
All checks were successful
Test / test (push) Successful in 1m21s
Test / test (pull_request) Successful in 1m37s
6acd57d056
mahmoud merged commit fcb2767ba1 into development 2026-03-16 02:06:46 +00:00
mahmoud referenced this pull request from a commit 2026-03-16 02:06:47 +00:00
Owner

a-ma-zing.

a-ma-zing.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lhumina_code/hero_compute!29
No description provided.