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:
parent
2002486828
commit
c389876a2f
9 changed files with 662 additions and 59 deletions
|
|
@ -408,6 +408,31 @@
|
|||
},
|
||||
"flowsMissingModulesLabel": "Braucht:",
|
||||
"flowsRunDisabledTooltip": "Erst die fehlenden Module installieren.",
|
||||
"flowsInstallAllButton": "Alle installieren ({n})",
|
||||
"@flowsInstallAllButton": { "placeholders": { "n": { "type": "int" } } },
|
||||
"flowsInstallPillTooltip": "Zum Installieren klicken",
|
||||
"flowsInstallDepsTitle": "Abhängigkeiten installieren",
|
||||
"flowsInstallDepsBody": "Die fehlenden Module werden der Reihe nach installiert. Vorhandene Installationen bleiben unberührt.",
|
||||
"flowsInstallStatusPending": "Wartet",
|
||||
"flowsInstallStatusInstalling": "Wird installiert…",
|
||||
"flowsInstallStatusDone": "Installiert v{version}",
|
||||
"@flowsInstallStatusDone": { "placeholders": { "version": { "type": "String" } } },
|
||||
"flowsInstallStatusFailed": "Fehlgeschlagen",
|
||||
"flowsInstallStatusFailedDetail": "{error}",
|
||||
"@flowsInstallStatusFailedDetail": { "placeholders": { "error": { "type": "String" } } },
|
||||
"flowsInstallDepsAllDone": "Alle Abhängigkeiten installiert.",
|
||||
"flowsInstallDepsAnyFailed": "{ok} installiert, {failed} fehlgeschlagen.",
|
||||
"@flowsInstallDepsAnyFailed": {
|
||||
"placeholders": {
|
||||
"ok": { "type": "int" },
|
||||
"failed": { "type": "int" }
|
||||
}
|
||||
},
|
||||
"flowsOpenInEditorTooltip": "YAML-Datei im Standard-Editor öffnen",
|
||||
"flowsOpenInEditorFailed": "Konnte Datei nicht öffnen: {error}",
|
||||
"@flowsOpenInEditorFailed": {
|
||||
"placeholders": { "error": { "type": "String" } }
|
||||
},
|
||||
"welcomeChecklistAllSetTitle": "Du bist eingerichtet.",
|
||||
"welcomeChecklistAllSetBody": "Drei Stränge, an denen du als nächstes ziehen kannst:",
|
||||
"welcomeChecklistNextAuditTitle": "Audit-Log lesen",
|
||||
|
|
|
|||
|
|
@ -409,6 +409,31 @@
|
|||
},
|
||||
"flowsMissingModulesLabel": "Needs:",
|
||||
"flowsRunDisabledTooltip": "Install the missing modules first.",
|
||||
"flowsInstallAllButton": "Install all ({n})",
|
||||
"@flowsInstallAllButton": { "placeholders": { "n": { "type": "int" } } },
|
||||
"flowsInstallPillTooltip": "Click to install",
|
||||
"flowsInstallDepsTitle": "Install dependencies",
|
||||
"flowsInstallDepsBody": "Walking through the missing modules in order. Existing installs are left alone.",
|
||||
"flowsInstallStatusPending": "Pending",
|
||||
"flowsInstallStatusInstalling": "Installing…",
|
||||
"flowsInstallStatusDone": "Installed v{version}",
|
||||
"@flowsInstallStatusDone": { "placeholders": { "version": { "type": "String" } } },
|
||||
"flowsInstallStatusFailed": "Failed",
|
||||
"flowsInstallStatusFailedDetail": "{error}",
|
||||
"@flowsInstallStatusFailedDetail": { "placeholders": { "error": { "type": "String" } } },
|
||||
"flowsInstallDepsAllDone": "All dependencies installed.",
|
||||
"flowsInstallDepsAnyFailed": "{ok} installed, {failed} failed.",
|
||||
"@flowsInstallDepsAnyFailed": {
|
||||
"placeholders": {
|
||||
"ok": { "type": "int" },
|
||||
"failed": { "type": "int" }
|
||||
}
|
||||
},
|
||||
"flowsOpenInEditorTooltip": "Open the YAML file in your default editor",
|
||||
"flowsOpenInEditorFailed": "Could not open file: {error}",
|
||||
"@flowsOpenInEditorFailed": {
|
||||
"placeholders": { "error": { "type": "String" } }
|
||||
},
|
||||
"welcomeChecklistAllSetTitle": "You're set up.",
|
||||
"welcomeChecklistAllSetBody": "Three threads to pull on next:",
|
||||
"welcomeChecklistNextAuditTitle": "Read the audit log",
|
||||
|
|
|
|||
|
|
@ -1892,6 +1892,84 @@ abstract class AppLocalizations {
|
|||
/// **'Install the missing modules first.'**
|
||||
String get flowsRunDisabledTooltip;
|
||||
|
||||
/// No description provided for @flowsInstallAllButton.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Install all ({n})'**
|
||||
String flowsInstallAllButton(int n);
|
||||
|
||||
/// No description provided for @flowsInstallPillTooltip.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Click to install'**
|
||||
String get flowsInstallPillTooltip;
|
||||
|
||||
/// No description provided for @flowsInstallDepsTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Install dependencies'**
|
||||
String get flowsInstallDepsTitle;
|
||||
|
||||
/// No description provided for @flowsInstallDepsBody.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Walking through the missing modules in order. Existing installs are left alone.'**
|
||||
String get flowsInstallDepsBody;
|
||||
|
||||
/// No description provided for @flowsInstallStatusPending.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Pending'**
|
||||
String get flowsInstallStatusPending;
|
||||
|
||||
/// No description provided for @flowsInstallStatusInstalling.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Installing…'**
|
||||
String get flowsInstallStatusInstalling;
|
||||
|
||||
/// No description provided for @flowsInstallStatusDone.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Installed v{version}'**
|
||||
String flowsInstallStatusDone(String version);
|
||||
|
||||
/// No description provided for @flowsInstallStatusFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Failed'**
|
||||
String get flowsInstallStatusFailed;
|
||||
|
||||
/// No description provided for @flowsInstallStatusFailedDetail.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{error}'**
|
||||
String flowsInstallStatusFailedDetail(String error);
|
||||
|
||||
/// No description provided for @flowsInstallDepsAllDone.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'All dependencies installed.'**
|
||||
String get flowsInstallDepsAllDone;
|
||||
|
||||
/// No description provided for @flowsInstallDepsAnyFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'{ok} installed, {failed} failed.'**
|
||||
String flowsInstallDepsAnyFailed(int ok, int failed);
|
||||
|
||||
/// No description provided for @flowsOpenInEditorTooltip.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Open the YAML file in your default editor'**
|
||||
String get flowsOpenInEditorTooltip;
|
||||
|
||||
/// No description provided for @flowsOpenInEditorFailed.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
/// **'Could not open file: {error}'**
|
||||
String flowsOpenInEditorFailed(String error);
|
||||
|
||||
/// No description provided for @welcomeChecklistAllSetTitle.
|
||||
///
|
||||
/// In en, this message translates to:
|
||||
|
|
|
|||
|
|
@ -1067,6 +1067,56 @@ class AppLocalizationsDe extends AppLocalizations {
|
|||
String get flowsRunDisabledTooltip =>
|
||||
'Erst die fehlenden Module installieren.';
|
||||
|
||||
@override
|
||||
String flowsInstallAllButton(int n) {
|
||||
return 'Alle installieren ($n)';
|
||||
}
|
||||
|
||||
@override
|
||||
String get flowsInstallPillTooltip => 'Zum Installieren klicken';
|
||||
|
||||
@override
|
||||
String get flowsInstallDepsTitle => 'Abhängigkeiten installieren';
|
||||
|
||||
@override
|
||||
String get flowsInstallDepsBody =>
|
||||
'Die fehlenden Module werden der Reihe nach installiert. Vorhandene Installationen bleiben unberührt.';
|
||||
|
||||
@override
|
||||
String get flowsInstallStatusPending => 'Wartet';
|
||||
|
||||
@override
|
||||
String get flowsInstallStatusInstalling => 'Wird installiert…';
|
||||
|
||||
@override
|
||||
String flowsInstallStatusDone(String version) {
|
||||
return 'Installiert v$version';
|
||||
}
|
||||
|
||||
@override
|
||||
String get flowsInstallStatusFailed => 'Fehlgeschlagen';
|
||||
|
||||
@override
|
||||
String flowsInstallStatusFailedDetail(String error) {
|
||||
return '$error';
|
||||
}
|
||||
|
||||
@override
|
||||
String get flowsInstallDepsAllDone => 'Alle Abhängigkeiten installiert.';
|
||||
|
||||
@override
|
||||
String flowsInstallDepsAnyFailed(int ok, int failed) {
|
||||
return '$ok installiert, $failed fehlgeschlagen.';
|
||||
}
|
||||
|
||||
@override
|
||||
String get flowsOpenInEditorTooltip => 'YAML-Datei im Standard-Editor öffnen';
|
||||
|
||||
@override
|
||||
String flowsOpenInEditorFailed(String error) {
|
||||
return 'Konnte Datei nicht öffnen: $error';
|
||||
}
|
||||
|
||||
@override
|
||||
String get welcomeChecklistAllSetTitle => 'Du bist eingerichtet.';
|
||||
|
||||
|
|
|
|||
|
|
@ -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.';
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue