feat: add collapsible server grouping with drag-and-drop and dashboard group filter - #102
feat: add collapsible server grouping with drag-and-drop and dashboard group filter#102itzzjustmateo wants to merge 36 commits into
Conversation
Updated the security policy to clarify reporting procedures and disclosure process.
…d 3-column header layout - Add server_groups table and server group_id foreign key (one group per server) - Create ServerGroup CRUD API (create, update, delete, add/remove servers, reorder groups) - Add group filter and sort to dashboard server list - Add group view mode with collapsible sections and drag-and-drop - Add group dropdown filter in header - Restructure header into 3-column layout (left actions | centered search | right actions) - Add HeaderContext left/center/right slot support (backward-compatible) - Improve ErrorBoundary styling to match 404 page - Fix CreateGroupModal crash (was using FormikFieldWrapper outside Formik context) - Swap MinIO for Garage in docker-compose.develop.yml - Remove p:user:make from devSetup.sh (use UI wizard instead) Note: untested with actual servers running — cannot verify end-to-end locally.
|
I gotta fix a filter issue, if I filter to only see 1 group, nothing happens, but tmrw |
|
task for tmrw |
|
currently testing with real servers locally |
- Add groups enabled toggle to Admin > Advanced Settings - Add config key pterodactyl.client_features.groups.enabled (default: true) - Add validation rule for the new setting - Register DB override key in SettingsServiceProvider - Return groups_enabled flag from filterOptions API - Conditionally show/hide group UI (tab, dropdown, mode) based on setting - Add backend guards on all ServerGroupController endpoints - Fix icon import: MoreVertical -> EllipsisVertical
- Use SWR global mutate to revalidate server list after group operations - Drag-and-drop now instantly moves server between groups in the UI - Delete group now instantly ungroups servers in the UI - Fix node daemon token encryption (root cause of 500 errors)
- More spacing between groups (space-y-6) - Drag-and-drop to ungrouped section with visual drop indicator - Groups always visible (empty groups show placeholder text) - Ungrouped section always visible (dashed border drop zone) - Collapsed chevron indicator on folder icon - Cleaner header with uppercase tracking-wider labels - Subtle hover states on group cards - Accent glow shadow on drag-over - Better empty state with icon container - Server count badges on group and ungrouped headers
- Lifted Pagination to wrap all views (groups, list, grid) once - GroupDropdown now uses gravity-ui Folder icon (matches other header dropdowns) - Removed redundant per-view Pagination wrappers
- Replaced all #ffffff border/background references with cream-500/cream-400 tokens - Increased vertical spacing between all sections (space-y-6 → space-y-8) - Added mt-2 gap between grouped cards and ungrouped drop zone - Renamed dialog label uses cream-400/50 instead of white
|
gonna improve the UI tmrw |
|
No rush, just wondering if there's any updates on this? |
|
oh yeah! it's kinda done, I forgot to continue haha |
…iew/topbar Replace the undefined accent drop-highlights with cream/mocha tokens, add a custom cream-styled floating drag preview via setDragImage, and extract a reusable DraggableServer component to match codebase conventions. Make the group view and dashboard topbar resilient at all screen sizes.
…e group modals - Collapse the entity/group/sort filter dropdowns into a 'Filters' hamburger menu (FiltersMenu) below lg so the navbar no longer overlaps at half-width; revert the overflow-x-auto fallback in AppHeader. - Remove the colored glow on drag targets, replacing it with a cream ring + tint; dim the source row while dragging. - Increase spacing between groups and the ungrouped zone. - Rebuild rename/delete modals using Dialog.Icon + Dialog.Footer: rename gets an info icon, Enter-to-save, and a disabled-until-changed Save button; delete gets a danger icon and states how many servers will become ungrouped with a destructive Delete button.
- Lazy-load every route-level page container (DashboardContainer, ServerConsoleContainer, account/server screens) so each is its own on-demand chunk. - Fix the rolldown codeSplitting grouping: under pnpm all deps collapsed into one 3.4 MB .pnpm chunk. The name function now extracts the real package name for npm, pnpm, and scoped packages (e.g. @hugeicons/core-free-icons). - Resolves the 'chunks larger than 500 kB' build warning; largest chunk is now ~287 kB (@xterm/xterm).
- Bump intra-group server list spacing from space-y-1.5 to space-y-3. - Bump spacing between groups from space-y-8/sm:space-y-12 to space-y-12/sm:space-y-16.
|
Almost done, fixing some bugs and improving it abit =D |
…o aweful, while testing the grouping feature
|
Fixing the last bug =D |
…ips when groups disabled
41e663a to
f719d4c
Compare
…tra for vanilla Wings (daemon=wings)
…uttons show not-allowed cursor
|
Can be reviewed and merged =D If there are any issues, just tell me |
|
What's about it? @naterfute |
|
The logo I think |
|
ooh that, yeah I somehow broke it again, and could not fix it.. uhm.. |
How dare you break my beloved centred logo 😭 |
I am so sorry bro 😭🙏 I already tried everything fixing it, how did you fix it? |


Summary
This PR adds server grouping to the Hydrodactyl client dashboard, letting users organize their servers into collapsible, user-owned groups and manage them with drag-and-drop. It sits on top of
BlueprintFramework/hydrodactyland changes the following:Server Groups (data + API)
server_groupstable and agroup_idforeign key on theserverstable (requiresphp artisan migrate).ServerGroupController: create, rename, delete, and reorder.Dashboard UX
Dev environment
docker-compose.develop.yml: Garage replaces MinIO for S3-compatible storage.nodes.daemon_typenow defaults towings).Notes
Related Issues
#101
IMPORTANT
If this PR is merged and deployed to production, existing Hydrodactyl installations must run:
This adds the
server_groupstable and thegroup_idcolumn used for server grouping.