Compare commits

..

3 commits

Author SHA1 Message Date
flemming-it
dfc24d3c58 fix(l10n): plain approvals hint, real plurals, de-jargoned chain pill
Some checks failed
Security / Security check (push) Failing after 1s
- approvals inbox hint explains human approval in plain words
  instead of citing system.approval@^0
- doctor summary counts use ICU plurals (1 module / n modules)
- audit chain pill says 'Integrity chain verified' instead of 'v1'

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
flemming-it
79e08c8d17 test(shots): seed demo flows so the flows page proves module logic both ways
hello.yaml needs debug.echo (not installed on the fixture hub) and
must carry the missing-module note; genehmigung-demo.yaml only uses
the hub builtin system.approval and must show a plain play button.

Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
flemming-it
dd0737b8b1 chore: complete the flow editor 0.24.0 pin (lockfile)
Signed-off-by: flemming-it <stefan.a.flemming@googlemail.com>
2026-07-18 00:00:17 +02:00
7 changed files with 93 additions and 21 deletions

View file

@ -187,6 +187,42 @@ void main() {
]); ]);
} }
// Seed two demo flows so the Flows page shows the real list
// instead of its empty state (and proves the missing-module
// logic both ways): hello needs debug.echo not installed on
// the fixture hub, so it must carry the "1 module missing"
// note; the approval flow only uses the hub builtin
// system.approval and must show a plain play button.
final flowsDir = Directory(
'${Platform.environment['HOME']}/.chain/data/flows',
)..createSync(recursive: true);
File('${flowsDir.path}/hello.yaml').writeAsStringSync(
'# F∆I sample flow\n'
'inputs:\n'
' name:\n'
' type: string\n'
'steps:\n'
' - id: echo\n'
' use: debug.echo@^0\n'
' with:\n'
' text: "Hello, {{ inputs.name }}!"\n'
'outputs:\n'
' greeting: "{{ steps.echo.text }}"\n',
);
File('${flowsDir.path}/genehmigung-demo.yaml').writeAsStringSync(
'# F∆I sample flow\n'
'inputs:\n'
' antrag:\n'
' type: string\n'
'steps:\n'
' - id: freigabe\n'
' use: system.approval@^0\n'
' with:\n'
' show: "{{ inputs.antrag }}"\n'
'outputs:\n'
' entscheidung: "{{ steps.freigabe.decision }}"\n',
);
// Hermetic prefs: never read or write the operator's real ones. // Hermetic prefs: never read or write the operator's real ones.
SharedPreferences.setMockInitialValues({}); SharedPreferences.setMockInitialValues({});

View file

@ -1067,7 +1067,7 @@
"approvalsTabPending": "Offen", "approvalsTabPending": "Offen",
"approvalsTabHistory": "Verlauf", "approvalsTabHistory": "Verlauf",
"approvalsInboxZero": "Posteingang leer", "approvalsInboxZero": "Posteingang leer",
"approvalsInboxHint": "Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.", "approvalsInboxHint": "Alles erledigt. Wenn ein Flow eine menschliche Freigabe verlangt, erscheint die Anfrage automatisch hier.",
"approvalsReloadTooltip": "Aktualisieren", "approvalsReloadTooltip": "Aktualisieren",
"approvalsPillPending": "offen", "approvalsPillPending": "offen",
"approvalsPillApproved": "freigegeben", "approvalsPillApproved": "freigegeben",
@ -1149,7 +1149,7 @@
"doctorSummaryApprovals": "Freigaben", "doctorSummaryApprovals": "Freigaben",
"doctorSummaryAudit": "Protokoll", "doctorSummaryAudit": "Protokoll",
"doctorSummaryServices": "Dienste", "doctorSummaryServices": "Dienste",
"doctorSummaryCapabilities": "{n} Fähigkeiten", "doctorSummaryCapabilities": "{n, plural, =1{1 Fähigkeit} other{{n} Fähigkeiten}}",
"@doctorSummaryCapabilities": { "@doctorSummaryCapabilities": {
"placeholders": { "placeholders": {
"n": { "n": {
@ -1170,7 +1170,7 @@
} }
}, },
"doctorSummaryDeclared": "deklariert", "doctorSummaryDeclared": "deklariert",
"doctorModulesPanelSummary": "{n} Module · {m} Fähigkeiten", "doctorModulesPanelSummary": "{n, plural, =1{1 Modul} other{{n} Module}} · {m, plural, =1{1 Fähigkeit} other{{m} Fähigkeiten}}",
"@doctorModulesPanelSummary": { "@doctorModulesPanelSummary": {
"placeholders": { "placeholders": {
"n": { "n": {
@ -1225,7 +1225,7 @@
} }
} }
}, },
"doctorChainPillOk": "Integritätskette v1", "doctorChainPillOk": "Integritätskette geprüft",
"doctorChainPillTamper": "MANIPULIERT", "doctorChainPillTamper": "MANIPULIERT",
"doctorVerifyNow": "Jetzt prüfen", "doctorVerifyNow": "Jetzt prüfen",
"doctorRestart": "Neustart", "doctorRestart": "Neustart",

View file

@ -1085,7 +1085,7 @@
"approvalsTabPending": "Pending", "approvalsTabPending": "Pending",
"approvalsTabHistory": "History", "approvalsTabHistory": "History",
"approvalsInboxZero": "Inbox zero", "approvalsInboxZero": "Inbox zero",
"approvalsInboxHint": "All caught up. New `system.approval@^0` steps land here automatically.", "approvalsInboxHint": "All caught up. When a flow asks for a human approval, the request appears here automatically.",
"approvalsReloadTooltip": "Reload", "approvalsReloadTooltip": "Reload",
"approvalsPillPending": "pending", "approvalsPillPending": "pending",
"approvalsPillApproved": "approved", "approvalsPillApproved": "approved",
@ -1173,7 +1173,7 @@
"doctorSummaryApprovals": "Approvals", "doctorSummaryApprovals": "Approvals",
"doctorSummaryAudit": "Audit", "doctorSummaryAudit": "Audit",
"doctorSummaryServices": "Services", "doctorSummaryServices": "Services",
"doctorSummaryCapabilities": "{n} capabilities", "doctorSummaryCapabilities": "{n, plural, =1{1 capability} other{{n} capabilities}}",
"@doctorSummaryCapabilities": { "@doctorSummaryCapabilities": {
"placeholders": { "placeholders": {
"n": { "n": {
@ -1194,7 +1194,7 @@
} }
}, },
"doctorSummaryDeclared": "declared", "doctorSummaryDeclared": "declared",
"doctorModulesPanelSummary": "{n} modules · {m} capabilities", "doctorModulesPanelSummary": "{n, plural, =1{1 module} other{{n} modules}} · {m, plural, =1{1 capability} other{{m} capabilities}}",
"@doctorModulesPanelSummary": { "@doctorModulesPanelSummary": {
"placeholders": { "placeholders": {
"n": { "n": {
@ -1249,7 +1249,7 @@
} }
} }
}, },
"doctorChainPillOk": "Integrity chain v1", "doctorChainPillOk": "Integrity chain verified",
"doctorChainPillTamper": "TAMPER", "doctorChainPillTamper": "TAMPER",
"doctorVerifyNow": "Verify now", "doctorVerifyNow": "Verify now",
"doctorRestart": "Restart", "doctorRestart": "Restart",

View file

@ -3359,7 +3359,7 @@ abstract class AppLocalizations {
/// No description provided for @approvalsInboxHint. /// No description provided for @approvalsInboxHint.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'All caught up. New `system.approval@^0` steps land here automatically.'** /// **'All caught up. When a flow asks for a human approval, the request appears here automatically.'**
String get approvalsInboxHint; String get approvalsInboxHint;
/// No description provided for @approvalsReloadTooltip. /// No description provided for @approvalsReloadTooltip.
@ -3563,7 +3563,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorSummaryCapabilities. /// No description provided for @doctorSummaryCapabilities.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'{n} capabilities'** /// **'{n, plural, =1{1 capability} other{{n} capabilities}}'**
String doctorSummaryCapabilities(int n); String doctorSummaryCapabilities(int n);
/// No description provided for @doctorSummaryPending. /// No description provided for @doctorSummaryPending.
@ -3587,7 +3587,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorModulesPanelSummary. /// No description provided for @doctorModulesPanelSummary.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'{n} modules · {m} capabilities'** /// **'{n, plural, =1{1 module} other{{n} modules}} · {m, plural, =1{1 capability} other{{m} capabilities}}'**
String doctorModulesPanelSummary(int n, int m); String doctorModulesPanelSummary(int n, int m);
/// No description provided for @doctorApprovalsNone. /// No description provided for @doctorApprovalsNone.
@ -3695,7 +3695,7 @@ abstract class AppLocalizations {
/// No description provided for @doctorChainPillOk. /// No description provided for @doctorChainPillOk.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Integrity chain v1'** /// **'Integrity chain verified'**
String get doctorChainPillOk; String get doctorChainPillOk;
/// No description provided for @doctorChainPillTamper. /// No description provided for @doctorChainPillTamper.

View file

@ -1941,7 +1941,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get approvalsInboxHint => String get approvalsInboxHint =>
'Alles erledigt. Neue `system.approval@^0`-Schritte landen automatisch hier.'; 'Alles erledigt. Wenn ein Flow eine menschliche Freigabe verlangt, erscheint die Anfrage automatisch hier.';
@override @override
String get approvalsReloadTooltip => 'Aktualisieren'; String get approvalsReloadTooltip => 'Aktualisieren';
@ -2063,7 +2063,13 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String doctorSummaryCapabilities(int n) { String doctorSummaryCapabilities(int n) {
return '$n Fähigkeiten'; String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n Fähigkeiten',
one: '1 Fähigkeit',
);
return '$_temp0';
} }
@override @override
@ -2079,7 +2085,19 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String doctorModulesPanelSummary(int n, int m) { String doctorModulesPanelSummary(int n, int m) {
return '$n Module · $m Fähigkeiten'; String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n Module',
one: '1 Modul',
);
String _temp1 = intl.Intl.pluralLogic(
m,
locale: localeName,
other: '$m Fähigkeiten',
one: '1 Fähigkeit',
);
return '$_temp0 · $_temp1';
} }
@override @override
@ -2153,7 +2171,7 @@ class AppLocalizationsDe extends AppLocalizations {
} }
@override @override
String get doctorChainPillOk => 'Integritätskette v1'; String get doctorChainPillOk => 'Integritätskette geprüft';
@override @override
String get doctorChainPillTamper => 'MANIPULIERT'; String get doctorChainPillTamper => 'MANIPULIERT';

View file

@ -1950,7 +1950,7 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get approvalsInboxHint => String get approvalsInboxHint =>
'All caught up. New `system.approval@^0` steps land here automatically.'; 'All caught up. When a flow asks for a human approval, the request appears here automatically.';
@override @override
String get approvalsReloadTooltip => 'Reload'; String get approvalsReloadTooltip => 'Reload';
@ -2070,7 +2070,13 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String doctorSummaryCapabilities(int n) { String doctorSummaryCapabilities(int n) {
return '$n capabilities'; String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n capabilities',
one: '1 capability',
);
return '$_temp0';
} }
@override @override
@ -2086,7 +2092,19 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String doctorModulesPanelSummary(int n, int m) { String doctorModulesPanelSummary(int n, int m) {
return '$n modules · $m capabilities'; String _temp0 = intl.Intl.pluralLogic(
n,
locale: localeName,
other: '$n modules',
one: '1 module',
);
String _temp1 = intl.Intl.pluralLogic(
m,
locale: localeName,
other: '$m capabilities',
one: '1 capability',
);
return '$_temp0 · $_temp1';
} }
@override @override
@ -2160,7 +2178,7 @@ class AppLocalizationsEn extends AppLocalizations {
} }
@override @override
String get doctorChainPillOk => 'Integrity chain v1'; String get doctorChainPillOk => 'Integrity chain verified';
@override @override
String get doctorChainPillTamper => 'TAMPER'; String get doctorChainPillTamper => 'TAMPER';

View file

@ -46,7 +46,7 @@ packages:
path: "../fai_chain_studio_flow_editor" path: "../fai_chain_studio_flow_editor"
relative: true relative: true
source: path source: path
version: "0.23.0" version: "0.24.0"
characters: characters:
dependency: transitive dependency: transitive
description: description: