feat(studio): operator-mode pass — Store + audit detail + channel switcher (v0.10.0)
Turns Studio from read-only dashboard into operator console. Pieces: * **New Store page** (sidebar destination #3): browses the hub's bundled store-index with query + category + status filters. Each card has an Install button that prompts for the `.fai` bundle source (URL or local path), ships it to HubAdmin.InstallModule, shows success / error in a progress dialog, refreshes the list. * **Audit drill-down**: every event row is now tappable; opens a modal with all LoggedEvent fields including the new `detail` JSON pretty-printed in a code block. KRITIS forensic story: every audit row → full structured detail in two clicks. * **Approvals payload preview**: shipped already; now pretty-prints JSON when the preview parses as such, plus a clearer `PAYLOAD PREVIEW` label. Reviewer identity defaults to `$USER@studio` instead of the hard-coded `studio-mvp` so the audit trail records who acted. * **Channel switcher in Settings dialog**: the dialog now pulls HubAdmin.ChannelStatus and renders one row per channel (local / dev / beta / production) with port, running indicator, active marker. A "Connect" button on a running channel sets Studio's endpoint to that channel's port and reconnects in one click. Cmd+1..6 keyboard shortcuts updated for the six destinations. Widget test asserts every destination renders. Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
parent
18db6ff164
commit
060c8003d5
9 changed files with 990 additions and 12 deletions
|
|
@ -15,6 +15,7 @@ import 'pages/audit.dart';
|
|||
import 'pages/doctor.dart';
|
||||
import 'pages/flows.dart';
|
||||
import 'pages/modules.dart';
|
||||
import 'pages/store.dart';
|
||||
import 'theme/theme.dart';
|
||||
import 'theme/tokens.dart';
|
||||
import 'widgets/widgets.dart';
|
||||
|
|
@ -22,7 +23,7 @@ import 'widgets/widgets.dart';
|
|||
/// Studio's own build version. Bump on every UI commit so the
|
||||
/// running app self-identifies — visible in the sidebar header
|
||||
/// and quick-glance proof that you're seeing the current build.
|
||||
const String kStudioVersion = '0.9.0';
|
||||
const String kStudioVersion = '0.10.0';
|
||||
|
||||
Future<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
|
@ -124,6 +125,12 @@ class _StudioShellState extends State<StudioShell> {
|
|||
selectedIcon: Icons.extension,
|
||||
page: ModulesPage(),
|
||||
),
|
||||
_NavPage(
|
||||
label: 'Store',
|
||||
icon: Icons.storefront_outlined,
|
||||
selectedIcon: Icons.storefront,
|
||||
page: StorePage(),
|
||||
),
|
||||
_NavPage(
|
||||
label: 'Flows',
|
||||
icon: Icons.account_tree_outlined,
|
||||
|
|
@ -171,7 +178,7 @@ class _StudioShellState extends State<StudioShell> {
|
|||
final theme = Theme.of(context);
|
||||
return Shortcuts(
|
||||
shortcuts: <ShortcutActivator, Intent>{
|
||||
// Cmd+1..5 jumps to the matching destination. Numbered
|
||||
// Cmd+1..6 jumps to the matching destination. Numbered
|
||||
// 1-based to match the visual order in the sidebar.
|
||||
for (var i = 0; i < _pages.length; i++)
|
||||
SingleActivator(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue