feat(studio): clickable install pills + open-in-editor on flow cards (v0.43.0)

When a saved flow is missing modules, each capability pill in the
"Needs:" row is now clickable: tap one and a per-item progress
dialog walks the bare capability name through installModule, then
the flows page refreshes. When more than one capability is missing,
an extra "Install all (N)" button runs the same dialog over the
whole list sequentially so a fresh operator can take an unrunnable
flow and one click later have its dependencies resolved.

Also adds a pencil icon next to Run that hands the YAML path to
the OS via SystemActions.openInOs — the operator's default editor
for .yaml decides what opens. Makes the path next to the flow name
actionable instead of decorative.

The install dialog renders one row per spec with a status icon
(pending circle / spinner / check / error), shows the installed
version on success, and surfaces the full error in a copyable
FaiErrorBox on failure so the operator can paste it back.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
This commit is contained in:
flemming-it 2026-05-09 11:58:24 +02:00
parent 2002486828
commit c389876a2f
9 changed files with 662 additions and 59 deletions

View file

@ -1080,6 +1080,57 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get flowsRunDisabledTooltip => 'Install the missing modules first.';
@override
String flowsInstallAllButton(int n) {
return 'Install all ($n)';
}
@override
String get flowsInstallPillTooltip => 'Click to install';
@override
String get flowsInstallDepsTitle => 'Install dependencies';
@override
String get flowsInstallDepsBody =>
'Walking through the missing modules in order. Existing installs are left alone.';
@override
String get flowsInstallStatusPending => 'Pending';
@override
String get flowsInstallStatusInstalling => 'Installing…';
@override
String flowsInstallStatusDone(String version) {
return 'Installed v$version';
}
@override
String get flowsInstallStatusFailed => 'Failed';
@override
String flowsInstallStatusFailedDetail(String error) {
return '$error';
}
@override
String get flowsInstallDepsAllDone => 'All dependencies installed.';
@override
String flowsInstallDepsAnyFailed(int ok, int failed) {
return '$ok installed, $failed failed.';
}
@override
String get flowsOpenInEditorTooltip =>
'Open the YAML file in your default editor';
@override
String flowsOpenInEditorFailed(String error) {
return 'Could not open file: $error';
}
@override
String get welcomeChecklistAllSetTitle => 'You\'re set up.';