From 3ccfdd003e9769a20d6de853448282b81c2222de Mon Sep 17 00:00:00 2001 From: Mirek Kaspar Date: Tue, 11 Oct 2022 18:38:52 +0200 Subject: [PATCH] feat: dev fail pipeline, overall pipeline fail UI state --- examples/dev/dev-fail.yaml | 5 +++ nativeui/lib/enums.dart | 2 +- nativeui/lib/model/pipeline.dart | 4 ++ nativeui/lib/views/pipeline_page.dart | 55 +++++++++++++++++++-------- 4 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 examples/dev/dev-fail.yaml diff --git a/examples/dev/dev-fail.yaml b/examples/dev/dev-fail.yaml new file mode 100644 index 0000000..29561f0 --- /dev/null +++ b/examples/dev/dev-fail.yaml @@ -0,0 +1,5 @@ +steps: +- title: 10 Second Step + command: node examples/dev/delayed.js 10 +- title: Failing Step + command: exit /b 1 \ No newline at end of file diff --git a/nativeui/lib/enums.dart b/nativeui/lib/enums.dart index 57dff6f..7b5d743 100644 --- a/nativeui/lib/enums.dart +++ b/nativeui/lib/enums.dart @@ -1,3 +1,3 @@ enum StepStatus { initial, progress, success, failure } -enum ExecutionStatus { done, connecting, disconnected, progress } +enum ExecutionStatus { success, connecting, disconnected, progress, failure } diff --git a/nativeui/lib/model/pipeline.dart b/nativeui/lib/model/pipeline.dart index 15db707..a81b11f 100644 --- a/nativeui/lib/model/pipeline.dart +++ b/nativeui/lib/model/pipeline.dart @@ -129,6 +129,10 @@ class Pipeline with ChangeNotifier { } } + if (filteredLines.isEmpty) { + filteredLines.add('Nothing seems to match the filter.'); + } + return filteredLines.join('\n'); } } diff --git a/nativeui/lib/views/pipeline_page.dart b/nativeui/lib/views/pipeline_page.dart index 08adcaf..5202371 100644 --- a/nativeui/lib/views/pipeline_page.dart +++ b/nativeui/lib/views/pipeline_page.dart @@ -61,6 +61,10 @@ class _PipelinePageState extends State with WindowListener { pipeline.title = recapStep['title']; } + if (status == StepStatus.failure) { + pipeline.executionStatus = ExecutionStatus.failure; + } + if (recapStep.containsKey('totalTime')) { step.time = recapStep['totalTime']; } @@ -96,16 +100,17 @@ class _PipelinePageState extends State with WindowListener { if (json.containsKey('step') && json.containsKey('status')) { var index = json['step']; + StepStatus status = pipeline.strToStepStatus(json['status']); + + if (status == StepStatus.failure) { + pipeline.executionStatus = ExecutionStatus.failure; + } if (json.containsKey('totalTime')) { pipeline.updateStatus( - stepIndex: index, - status: pipeline.strToStepStatus(json['status']), - time: json['totalTime']); + stepIndex: index, status: status, time: json['totalTime']); } else { - pipeline.updateStatus( - stepIndex: index, - status: pipeline.strToStepStatus(json['status'])); + pipeline.updateStatus(stepIndex: index, status: status); } } }, @@ -113,9 +118,13 @@ class _PipelinePageState extends State with WindowListener { onDone: () async { await Future.delayed(const Duration(seconds: 1)); - pipeline.executionStatus = pipeline.finished - ? ExecutionStatus.done - : ExecutionStatus.disconnected; + if (pipeline.finished) { + if (pipeline.executionStatus != ExecutionStatus.failure) { + pipeline.executionStatus = ExecutionStatus.success; + } + } else { + pipeline.executionStatus = ExecutionStatus.disconnected; + } }); } @@ -159,15 +168,24 @@ class _PipelinePageState extends State with WindowListener { actions: Row(mainAxisAlignment: MainAxisAlignment.end, children: [ executionStatusNotification(pipeline.executionStatus), IconButton( - icon: Icon(FluentIcons.add_space_before, - color: pipeline.followExecution - ? Colors.blue - : theme.iconTheme.color), + icon: pipeline.followExecution + ? Icon(FluentIcons.pinned_solid, color: Colors.blue) + : Icon(FluentIcons.pinned, color: theme.iconTheme.color), onPressed: () => pipeline.toggleFollowExecution()), IconButton( icon: const Icon(FluentIcons.copy), onPressed: () => FlutterClipboard.copy(pipeline .filteredOuptut(pipeline[pipeline.selectedStep].output))), + if (pipeline.length > 0) + if (pipeline[pipeline.selectedStep].startVars.isNotEmpty) + IconButton( + icon: const Icon(FluentIcons.align_horizontal_left), + onPressed: () {}), + if (pipeline.length > 0) + if (pipeline[pipeline.selectedStep].endVars.isNotEmpty) + IconButton( + icon: const Icon(FluentIcons.align_horizontal_right), + onPressed: () {}), Padding( padding: const EdgeInsetsDirectional.only(end: 10), child: IconButton( @@ -247,7 +265,9 @@ class _PipelinePageState extends State with WindowListener { scrollController: pipeline.scrollC, children: [ SelectableText( - pipeline.filteredOuptut(pipeline[index].output), + pipeline[index].output.isEmpty + ? 'No output (yet).' + : pipeline.filteredOuptut(pipeline[index].output), style: const TextStyle(fontSize: 12)) ], ))), @@ -318,7 +338,7 @@ class _PipelinePageState extends State with WindowListener { Widget executionStatusNotification(ExecutionStatus status) { switch (status) { - case ExecutionStatus.done: + case ExecutionStatus.success: return Padding( padding: const EdgeInsets.only(left: 10, right: 10), child: Icon(FluentIcons.skype_check, color: Colors.teal)); @@ -331,6 +351,11 @@ class _PipelinePageState extends State with WindowListener { style: TextStyle(color: Colors.warningPrimaryColor))); case ExecutionStatus.connecting: return const SizedBox(width: 100, child: Text('Connecting...')); + case ExecutionStatus.failure: + return const Padding( + padding: EdgeInsets.only(left: 10, right: 10), + child: Icon(FluentIcons.error_badge12, + color: Colors.warningPrimaryColor)); } } }