- Created a new file for ToastPosition type definitions to improve code organization.
- Removed the inline ToastPosition type definition from mount-engine.ts and updated the import accordingly.
- Added a comment in app.config.ts for clarity on toaster settings.
- Added optional properties `expand`, `duration`, and `max` to the Notify interface.
- Updated NotificationSettings class to include validation for new properties.
- Modified the NotificationsService to parse and return the new settings.
- Adjusted the toaster configuration in the app to utilize the new settings.
- Updated GraphQL query to fetch the new notification settings.
Updates the notification sidebar to properly refresh notification counts (badges) when the API connection is restored or when the user manually retries.
Changes:
- Emit `refetched` event from `NotificationsList` when the query successfully returns data.
- Trigger `recalculateOverview` and `refetch` in `Sidebar` when the list is refreshed or when the API status becomes 'online'.
- Fixes an issue where notification badges would remain at 0 after an API outage, even though the notification list had populated correctly.
Problem:
ESLint was flagging auto-imported composables (like `useToast`) as undefined variables in `.vue` files. While TypeScript correctly identified these globals via `auto-imports.d.ts`, the default `no-undef` rule in our Vue ESLint config did not account for them, causing false positive linting errors.
Solution:
- Disable the `no-undef` rule specifically for `.vue` files in `eslint.config.mjs`.
- Rely on TypeScript (via `vue-tsc`) and `auto-imports.d.ts` to handle global variable validation, ensuring type safety without conflicting with the auto-import build process.
- Remove manual imports of `useToast` that were added as a workaround (p sure the path I used didn't even exist in node modules).
This commit addresses several critical stability issues in the notification system spanning the legacy PHP script, the Node.js API, and the Vue frontend.
**Backend / API:**
- **Refactor `notify` script (PHP):** Added `-u` flag to accept a custom filename/ID from the caller. Added filename length sanitization (255 chars) to prevent filesystem errors.
- **Fix ID Mismatch:** The Node API now generates a UUID and passes it to the `notify` script via `-u`. This guarantees that the API, Frontend, and Filesystem all reference the same ID, removing the need for "Risky" notification logic.
- **Fix Counter Bugs:**
- `handleNotificationAdd` no longer ignores duplicate files in the archive.
- `archiveNotification` now checks if a file exists in the archive before moving. If it exists, it simply deletes the unread copy without double-counting.
- `archiveAll` now leverages the robust single-archive logic.
**Frontend (Web):**
- **Fix Infinite Scroll "Drift":**
- Switched `List.vue` to use a **Debounced Refetch** (500ms) for subscription updates instead of manual cache manipulation. This handles rapid-fire events (mass adds) without corruption.
- Increased `pageSize` to `50` to minimize race conditions where new items shift pagination offsets.
- Added **Drift Detection**: If `fetchMore` returns a full page of duplicates (indicating the list has shifted), the component now automatically triggers a full refetch to self-heal.
This change ensures that Nuxt UI notifications respect the display position configured in the legacy webGUI settings.
Backend:
- Added `NotificationSettings` to the GraphQL model.
- Exposed `settings` field on the `Notifications` resolver.
- Implemented `getSettings` in `NotificationsService` to read `notify.position` from the Dynamix store.
Frontend:
- Added `getNotificationSettings` GraphQL query.
- Updated `mount-engine.ts` to fetch settings before mounting.
- Mapped legacy position values (e.g., 'center') to Nuxt UI compatible values (e.g., 'top-center').
> [!Note] This stubs the unraid-ui/src/components/common/toast. Initially created a shim to convert vue-sonnner toasts to nuxtui. However, since there weren't that many, I just did a clean replacement.
- replace router link with window.location.assign
The `UButton` component attempts to inject the Vue Router instance when the `:to` prop is used. In the standalone component environment (where the router is not installed), this caused a "TypeError: inject(...) is undefined" crash when rendering notifications with links.
This change replaces the `:to` prop with a standard `@click` handler that uses `window.location.assign`, ensuring navigation works correctly without requiring the router context.
- modified vite.config.ts to integrate app configuration into UI setup
- updated app.config.ts to include new button, tabs, and slideover variants for better theming
- cleaned up main.css by removing unused styles and ensuring proper imports
- refactored notification components to streamline structure and improve readability
- replaced Heroicons components with UIcon for better integration
- refactored Sidebar.vue to utilize USlideover and UButton for a cleaner UI
- removed unused imports and styles in main.css for better maintainability
NOTES:
- had to change main.css variables for it to work properly. Need to make sure this doesn't ruin other people's code.
- still needs to be further refactored to align with existing ui variables
commit addresses the following two bugs/issues:
1. infinite network requests
2. make error messages more accurate
bug details:
- when scrolled all the way down in the notification pane (when api is down), unraid infinitely sends network requests.
- must be scrolled all the way to the bottom and stay at the bottom of the pane while the api is down
technical details:
- for infinite loop, added try/catch that sets a canLoadMore flag to false when it encounters an error, preventing infinite loop
- errors now look at non-standard locations as well
impact:
- performance benefits
- more graceful ux on failure
fix context menu trigger area and dropdown styles
implement 'move to folder'
implement 'start / stop' bulk & row actions
implement pause / resume
implement column visibility customization
fix(organizer): over-eager addition of untracked containers to root folder
scaffold docker form service
docker container management prototype
use compacted table as sidebar tree
add drag and drop for re-ordering containers & folders
right click to reame & delete folders
add bottom padding to container to make it easier to drag items to bottom in sidebar
click overview row to open details
track active container in query param
refactor: extract composables
refactor: simplify organizer operations
refactor!: rm intermediate tree resolution of organizers
BREAKING CHANGE: ResolvedOrganizerView -> root is replaced by rootId +
flatEntries.
`root` resolved a tree representation of an organizer, but this required
clients to defined and use their own tree operations, thus increasing
client complexity.
Instead, `flatEntries` is more suitable for client operations and only
requires an initial mapping step on the client for efficiency.
fix: rm extra Root layer in table
map containers to their template files
feat: icon support
fix: container state badge
chore: fix formatting
fix: search filtering
fix: context menu
feat: filtering & bulk actions in compact mode
feat: critical notifications
feat: notifyIfUnique service method
tmp: critical notifications system
fix: nuxt ui portal styling
fix: notifications type check
fix api tests
fix: css
Revert "fix: css"
This reverts commit 234c2e2c65.
add docker constants
flatten css scopes
feat: file modification for replacing docker overview table
feat: navigate to container update page
feat: implement manage settings action
fix: column visibility toggle
fix: move update to a badge + popover
feat: save column visibility preferences across visits
fix: add feature flag to containers file mod
fix: circular dependency in docker service
add a flag to opt out of version check in super.shouldApply in file mods
fix: optimistic column toggle update
refactor: optimistic column toggle
feat: container start & stop order
feat: bulk toggle auto-start
fix: add background style reset, apply to button:hover as well
feat: add ENABLE_NEXT_DOCKER_RELEASE=true to staging environment
chore(api): add dev/notifications to gitignore
feat: container update actions
fix: container update logic
feat: bulk container updates
feat: container sizes
fix: container sizes modla overlay
fix: checkbox alignment
fix: revert color in main css
chore: ignore build output in lint & fix
feat: server-side container ip
add docker feature flag to .env.production
fix: container port duplication
feat: multi-value copyable badges
feat: make lanIpPorts a list, not a csv
feat: visit button
feat: include indexed search fields in filter input title
feat: sync userprefs.cfg for rollback compat
feat: port conflicts
refactor: port conflict frontend stuff
feat: update all containers bulk action
feat: docker logs
fix: use container name instead of id in 'view logs' modal
make webgui iframable
feat: re-add compact mode
manage settings > compact view
fix styles
feat: container stats
refactor: docker autostart service
refactor: docker log, event, and port services
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
## Release Notes v4.29.2
* **New Features**
* Added iframe mode support with UI adjustments for embedded deployments
* Introduced modal portal system with dark mode integration
* **Bug Fixes**
* Fixed log line deduplication sync issue in Docker log viewer to
prevent orphaned entries
* **Improvements**
* Enhanced table header rendering for consistent behavior and resizing
* Improved notification subscription handling for better stability
* Optimized log viewer initialization behavior
* Simplified organizer API parameter handling
<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Pujit Mehrotra <pujit@lime-technology.com>
- Replaced BrandLoading with BrandButton in UpdateOs component for
better user interaction.
- Updated test cases to reflect changes in rendering logic, ensuring the
account button is displayed when no reboot is pending.
- Added functionality to navigate to account update when the button is
clicked.
- Introduced WEBGUI_REDIRECT URL for handling update installations in
the store logic.
Fixes#1848
## Background
The `build:dev` script is used for the `unraid:deploy` workflow, and it
implicitly triggered the `predev` script to build the `unraid-ui`
package as needed.
`web` builds depend on `unraid-ui`. In the past, `unraid-ui` was built
during `pnpm install` via a `prepare` step in its `package.json`.
However, this approach doesn't ensure that `web` builds correctly; stale
`unraid-ui` builds could cause false-positives.
So, instead of doing that, we call `predev` from `prebuild`, ensuring
that both local builds and the `unraid:deploy` workflow lazily get the
correct build of `unraid-ui`.
## Summary
Introduces a new Vue-based Docker container management interface
replacing the legacy webgui table.
### Container Management
- Start, stop, pause, resume, and remove containers via GraphQL
mutations
- Bulk actions for managing multiple containers at once
- Container update detection with one-click updates
- Real-time container statistics (CPU, memory, I/O)
### Organization & Navigation
- Folder-based container organization with drag-and-drop support
- Accessible reordering via keyboard controls
- Customizable column visibility with persistent preferences
- Column resizing and reordering
- Filtering and search across container properties
### Auto-start Configuration
- Dedicated autostart view with delay configuration
- Drag-and-drop reordering of start/stop sequences
### Logs & Console
- Integrated log viewer with filtering and download
- Persistent console sessions with shell selection
- Slideover panel for quick access
### Networking
- Port conflict detection and alerts
- Tailscale integration for container networking status
- LAN IP and port information display
### Additional Features
- Orphaned container detection and cleanup
- Template mapping management
- Critical notifications system
- WebUI visit links with Tailscale support
<sub>PR Summary by Claude Opus 4.5</sub>