fix(web-app): update dashboard navigation to use the router directly and refresh admin tabs on login changes
This commit is contained in:
@@ -1,5 +1,12 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 2026-03-20 - 1.5.1 - fix(web-app)
|
||||||
|
update dashboard navigation to use the router directly and refresh admin tabs on login changes
|
||||||
|
|
||||||
|
- removes the global router workaround in the dashboard and imports appRouter directly
|
||||||
|
- re-filters resolved view tabs when login state changes so the Admin tab matches system admin access
|
||||||
|
- adds dashboard navigation support for the organizations view
|
||||||
|
|
||||||
## 2026-03-20 - 1.5.0 - feat(opsserver,web)
|
## 2026-03-20 - 1.5.0 - feat(opsserver,web)
|
||||||
replace the Angular UI and REST management layer with a TypedRequest-based ops server and bundled web frontend
|
replace the Angular UI and REST management layer with a TypedRequest-based ops server and bundled web frontend
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@stack.gallery/registry',
|
name: '@stack.gallery/registry',
|
||||||
version: '1.5.0',
|
version: '1.5.1',
|
||||||
description: 'Enterprise-grade multi-protocol package registry'
|
description: 'Enterprise-grade multi-protocol package registry'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,6 @@
|
|||||||
*/
|
*/
|
||||||
export const commitinfo = {
|
export const commitinfo = {
|
||||||
name: '@stack.gallery/registry',
|
name: '@stack.gallery/registry',
|
||||||
version: '1.5.0',
|
version: '1.5.1',
|
||||||
description: 'Enterprise-grade multi-protocol package registry'
|
description: 'Enterprise-grade multi-protocol package registry'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,19 +72,23 @@ export class SgAppShell extends DeesElement {
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
private allResolvedViewTabs: Array<{ name: string; iconName?: string; element: any }> = [];
|
||||||
private resolvedViewTabs: Array<{ name: string; iconName?: string; element: any }> = [];
|
private resolvedViewTabs: Array<{ name: string; iconName?: string; element: any }> = [];
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
document.title = 'Stack.Gallery Registry';
|
document.title = 'Stack.Gallery Registry';
|
||||||
|
|
||||||
// Make appRouter globally accessible for view elements
|
|
||||||
(globalThis as any).__sgAppRouter = appRouter;
|
|
||||||
|
|
||||||
const loginSubscription = appstate.loginStatePart
|
const loginSubscription = appstate.loginStatePart
|
||||||
.select((s) => s)
|
.select((s) => s)
|
||||||
.subscribe((loginState) => {
|
.subscribe((loginState) => {
|
||||||
this.loginState = loginState;
|
this.loginState = loginState;
|
||||||
|
// Re-filter tabs when login state changes
|
||||||
|
if (loginState.isLoggedIn && this.allResolvedViewTabs.length > 0) {
|
||||||
|
this.resolvedViewTabs = loginState.identity?.isSystemAdmin
|
||||||
|
? this.allResolvedViewTabs
|
||||||
|
: this.allResolvedViewTabs.filter((t) => t.name !== 'Admin');
|
||||||
|
}
|
||||||
});
|
});
|
||||||
this.rxSubscriptions.push(loginSubscription);
|
this.rxSubscriptions.push(loginSubscription);
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import * as appstate from '../appstate.js';
|
import * as appstate from '../appstate.js';
|
||||||
import * as shared from './shared/index.js';
|
import * as shared from './shared/index.js';
|
||||||
|
import { appRouter } from '../router.js';
|
||||||
import {
|
import {
|
||||||
css,
|
css,
|
||||||
cssManager,
|
cssManager,
|
||||||
@@ -77,24 +78,15 @@ export class SgViewDashboard extends DeesElement {
|
|||||||
private handleNavigate(e: CustomEvent) {
|
private handleNavigate(e: CustomEvent) {
|
||||||
const { type, id } = e.detail;
|
const { type, id } = e.detail;
|
||||||
if (type === 'org' && id) {
|
if (type === 'org' && id) {
|
||||||
const { appRouter } = await_import_router();
|
|
||||||
appRouter.navigateToEntity('organizations', id);
|
appRouter.navigateToEntity('organizations', id);
|
||||||
} else if (type === 'package' && id) {
|
} else if (type === 'package' && id) {
|
||||||
const { appRouter } = await_import_router();
|
|
||||||
appRouter.navigateToEntity('packages', id);
|
appRouter.navigateToEntity('packages', id);
|
||||||
} else if (type === 'packages') {
|
} else if (type === 'packages') {
|
||||||
const { appRouter } = await_import_router();
|
|
||||||
appRouter.navigateToView('packages');
|
appRouter.navigateToView('packages');
|
||||||
} else if (type === 'tokens') {
|
} else if (type === 'tokens') {
|
||||||
const { appRouter } = await_import_router();
|
|
||||||
appRouter.navigateToView('tokens');
|
appRouter.navigateToView('tokens');
|
||||||
|
} else if (type === 'organizations') {
|
||||||
|
appRouter.navigateToView('organizations');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lazy import to avoid circular dependency
|
|
||||||
function await_import_router() {
|
|
||||||
// Dynamic import not needed here since router is a separate module
|
|
||||||
// We use a workaround by importing at the module level
|
|
||||||
return { appRouter: (globalThis as any).__sgAppRouter };
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user