in dashboard/lib/widgets/task_overlay.dart [217:316]
Widget build(BuildContext context) {
final QualifiedTask qualifiedTask = QualifiedTask.fromTask(task);
final DateTime now = Now.of(context);
final DateTime createTime = DateTime.fromMillisecondsSinceEpoch(task.createTimestamp.toInt());
final DateTime startTime = DateTime.fromMillisecondsSinceEpoch(task.startTimestamp.toInt());
final DateTime endTime = DateTime.fromMillisecondsSinceEpoch(task.endTimestamp.toInt());
final Duration queueDuration =
task.startTimestamp == 0 ? now.difference(createTime) : startTime.difference(createTime);
final Duration runDuration = task.endTimestamp == 0 ? now.difference(startTime) : endTime.difference(startTime);
/// There are 2 possible states for queue time:
/// 1. Task is waiting to be scheduled (in queue)
/// 2. Task has been scheduled (out of queue)
final String queueText = (task.status != TaskBox.statusNew)
? 'Queue time: ${queueDuration.inSeconds} seconds'
: 'Queueing for ${queueDuration.inSeconds} seconds';
/// There are 3 possible states for the runtime:
/// 1. Task has not run yet (new)
/// 2. Task is running (in progress)
/// 3. Task ran (other status)
final String runText = (task.status == TaskBox.statusInProgress)
? 'Running for ${runDuration.inMinutes} minutes'
: (task.status != TaskBox.statusNew)
? 'Run time: ${runDuration.inMinutes} minutes'
: '';
final String summaryText = <String>[
'Attempts: ${task.attempts}',
if (runText.isNotEmpty) runText,
queueText,
if (task.isFlaky) 'Flaky: ${task.isFlaky}',
].join('\n');
return Card(
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
child: IntrinsicWidth(
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
mainAxisSize: MainAxisSize.min,
children: <Widget>[
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Tooltip(
message: task.status,
child: Padding(
padding: const EdgeInsets.only(left: 8.0, top: 10.0, right: 12.0),
child: statusIcon[task.status],
),
),
Expanded(
child: ListBody(
children: <Widget>[
SelectableText(
task.name,
style: Theme.of(context).textTheme.bodyText1,
),
Text(
summaryText,
style: Theme.of(context).textTheme.bodyText2,
),
if (QualifiedTask.fromTask(task).isLuci) LuciTaskAttemptSummary(task: task),
],
),
),
],
),
),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: ProgressButton(
child: const Text('VIEW LOGS'),
onPressed: () => launch(logUrl(task, commit: commit)),
),
),
if (qualifiedTask.isLuci)
Padding(
padding: const EdgeInsets.only(left: 8.0),
child: ProgressButton(
child: const Text('RERUN'),
onPressed: _rerunTask,
),
),
],
),
],
),
),
),
);
}