| 2026-06-02 |
Show warning in assign modal for the last root area
...
Instead of hiding the assign UI, keep the button/menu item visible.
When the user opens the assign modal for the last root area, show a
GnAlert warning inside the modal explaining that it cannot be assigned.
The Assign button is hidden in this state; only Cancel (and Unassign if
applicable) remain. Backend guard in assignToArea stays as a fail-safe.
Eugene Sukhodolskiy
committed
12 hours ago
|
Add unassign action to area, device and script detail pages
...
- useAreaAssign composable: add submitUnassignCore and loading/error states.
- DeviceDetailPage: add 'Unassign from area' button inside assign modal and
in the actions dropdown when device has an area_id.
- ScriptDetailPage: same for scripts (non-scope) with area_id.
- AreaDetailPage: add 'Unassign from parent' in assign modal and dropdown
when area has a parent_id > 0.
Eugene Sukhodolskiy
committed
12 hours ago
|
Prevent assigning the last root area as a child
...
- Store: assignToArea now rejects with an error if the target area is the
last remaining root (parent_id <= 0), preventing zero-root trees.
- UI: AreaDetailPage hides the 'Assign to area' / 'Change parent area'
button and action-menu item when the current area is the last root,
and shows an explanatory empty-state message instead.
- Tests: add coverage for both the rejection and the allowed case.
Eugene Sukhodolskiy
committed
12 hours ago
|
Show per-channel device states in DeviceTable and load states on AreaDetailPage
Eugene Sukhodolskiy
committed
13 hours ago
|
Fix area assignment button on detail pages
...
- Rename submitAssign -> submitAssignCore in useAreaAssign composable
to avoid name collision with local page handlers.
- Rename local page handlers -> handleAssignSubmit on Area, Device,
and Script detail pages so event bindings call the wrapper correctly.
- Fix AppEmptyState.vue to forward #action slot into GnEmptyState's
#actions slot so the Assign button renders for unassigned items.
Eugene Sukhodolskiy
committed
13 hours ago
|
Improve AppErrorState with statusCode, type, and copyable details (Phase 4)
...
- Add error prop to AppErrorState accepting normalized client error object
- Show type, statusCode, and errorAlias as inline badges
- Add GnCopyButton to copy JSON-serialized error details to clipboard
- displayMessage falls back to error.message when message prop is omitted
- Update all call sites to pass full error object instead of only .message
- Add tests for error badges, copy button visibility, and clipboard content
Eugene Sukhodolskiy
committed
14 hours ago
|
Add toast notifications for mutations (Phase 3)
...
- Wrap RouterView in GnToastProvider in App.vue
- Replace inline rebootError alert in DeviceDetailPage with toast
- Replace inline resultAlert in ScriptDetailPage and ScriptsActionsPage with toast
- Add success toasts after successful edit, assign, remove, rename, create, setup
- Keep inline GnAlert inside modals for form-level errors
Eugene Sukhodolskiy
committed
14 hours ago
|
Fix critical error handling gaps in page mutations
...
- AreaDetailPage: submitRemove now checks result.ok before redirecting;
replace GnConfirmDialog with GnModal to display remove errors inline.
- DeviceDetailPage: submitRemove now checks result.ok before redirecting;
replace GnConfirmDialog with GnModal. reboot() now awaits and shows
error via inline GnAlert instead of silently failing.
- ScriptDetailPage: toggleState now checks result.ok and shows success/
danger resultAlert feedback instead of ignoring API errors.
All 126 Vitest tests pass.
Eugene Sukhodolskiy
committed
15 hours ago
|
Add AreaFavoriteButton component and replace star icons with bookmarks
...
- Create reusable AreaFavoriteButton component (btn-icon, bookmark-simple/fill)
- Replace inline bookmark buttons in AreaTreeNode and AreaFavoritesPage
- Use bookmark icons (ph-bookmark-simple, ph-fill) across favorites feature
- Add @phosphor-icons/web/fill import in main.js
- Update AreaTreeNode test to target new component
- Replace ph-star with ph-bookmarks in AppShell navigation
- Adjust active favorite color from danger to warning
- Remove obsolete .area-favorite-remove styles
Eugene Sukhodolskiy
committed
15 hours ago
|
Replace star icons with bookmark icons for favorites feature
Eugene Sukhodolskiy
committed
15 hours ago
|
Pack detail-page header actions into GnDropdown component
Eugene Sukhodolskiy
committed
15 hours ago
|
| 2026-06-01 |
Vue client: extract ScriptTable component and unify script tables
...
- Add reusable ScriptTable component with alias link, scope link, area badge, state badge, enable/disable actions
- ScriptTable auto-detects row.type for routing and toggling (mixed lists support)
- Replace script table in AreaDetailPage with ScriptTable (no area/actions columns)
- Replace script table in ScriptsRegularPage with ScriptTable
- Update mock handlers for area scripts to include type/area_id/scope
- 126 tests passing, build green
Eugene Sukhodolskiy
committed
1 day ago
|
Vue client: extract DeviceTable component and use in AreaDetail
...
- Add reusable DeviceTable component (device cell, connect badge, state, reboot)
- Refactor DevicesListPage to use DeviceTable
- Replace simple device table in AreaDetailPage with full DeviceTable
- 126 tests passing, build green
Eugene Sukhodolskiy
committed
1 day ago
|
Vue client: unify area assignment mechanic for areas
...
- Extend AreaAssignSection with and ]2;]1; props for reuse
- Add to areasStore with reactive splice update
- Rewrite AreaDetailPage with shared useAreaAssign, AreaBadgeLink, AreaAssignSection
- Filter area options to exclude self-reference and descendants
- Add areasStore test for assignToArea
- 126 tests passing, build green
Eugene Sukhodolskiy
committed
1 day ago
|
Add script detail pages with scope grouping
...
- Add ScriptDetailPage for actions, regular, and scopes
- Add scope field to script API response (from backend)
- Replace scope raw-PHP endpoint with client-side filtering via scope field
- Show action and regular scripts grouped by scope on scope detail page
- Remove inline switch from action cards (moved to detail page)
- Add router-links from list pages to detail pages
- Update MSW mocks with scope field for all script types
Eugene Sukhodolskiy
committed
1 day ago
|