|
314 | 314 | return flow.exceptions_count ?? flow.exception_count ?? 0; |
315 | 315 | }, |
316 | 316 |
|
| 317 | + hasTerminalRuns(type) { |
| 318 | + const b = type && type.status_breakdown ? type.status_breakdown : {}; |
| 319 | + return (b.completed || 0) + (b.failed || 0) + (b.cancelled || 0) + (b.terminated || 0) > 0; |
| 320 | + }, |
| 321 | +
|
317 | 322 | operatorMetric(section, key) { |
318 | 323 | const metrics = this.stats.operator_metrics || {}; |
319 | 324 | const group = metrics[section] || {}; |
|
614 | 619 | </td> |
615 | 620 | <td class="text-right">{{ type.total_runs.toLocaleString() }}</td> |
616 | 621 | <td class="text-right"> |
617 | | - <span :class="'badge badge-' + (type.pass_rate >= 95 ? 'success' : type.pass_rate >= 80 ? 'warning' : 'danger')"> |
| 622 | + <span v-if="hasTerminalRuns(type)" |
| 623 | + :class="'badge badge-' + (type.pass_rate >= 95 ? 'success' : type.pass_rate >= 80 ? 'warning' : 'danger')"> |
618 | 624 | {{ type.pass_rate }}% |
619 | 625 | </span> |
| 626 | + <span v-else class="text-muted small" title="No terminal runs yet this week"> |
| 627 | + — |
| 628 | + </span> |
620 | 629 | </td> |
621 | 630 | <td class="text-right text-muted small"> |
622 | | - {{ type.median_duration_ms ? formatDuration(type.median_duration_ms) : '-' }} |
| 631 | + <template v-if="type.median_duration_ms"> |
| 632 | + {{ formatDuration(type.median_duration_ms) }} |
| 633 | + </template> |
| 634 | + <span v-else title="No completed runs yet this week"> |
| 635 | + — |
| 636 | + </span> |
623 | 637 | </td> |
624 | 638 | <td class="text-right"> |
625 | | - <span v-if="type.error_count > 0" class="text-danger">{{ type.error_count }}</span> |
626 | | - <span v-else class="text-muted">-</span> |
| 639 | + <span v-if="type.error_count > 0" class="text-danger">{{ type.error_count.toLocaleString() }}</span> |
| 640 | + <span v-else class="text-muted" title="No failed, cancelled, or terminated runs">0</span> |
627 | 641 | </td> |
628 | 642 | </tr> |
629 | 643 | </tbody> |
|
736 | 750 | <small class="text-uppercase">Max Wait Time</small> |
737 | 751 |
|
738 | 752 | <h4 class="mt-4 mb-0"> |
739 | | - {{ stats.max_wait_time_workflow ? waitAge(stats.max_wait_time_workflow) : '-' }} |
| 753 | + {{ stats.max_wait_time_workflow ? waitAge(stats.max_wait_time_workflow) : '—' }} |
740 | 754 | </h4> |
741 | 755 |
|
742 | 756 | <small class="mt-1" v-if="stats.max_wait_time_workflow"> |
743 | 757 | (<router-link :title="stats.max_wait_time_workflow.class" :to="{ name: routeName(stats.max_wait_time_workflow), params: { flowId: stats.max_wait_time_workflow.id }}">{{ flowBaseName(stats.max_wait_time_workflow.class) }}</router-link>) |
744 | 758 | </small> |
| 759 | + <small v-else class="mt-1 text-muted d-block">No running waits</small> |
745 | 760 | </div> |
746 | 761 | </div> |
747 | 762 |
|
|
750 | 765 | <small class="text-uppercase">Max Duration</small> |
751 | 766 |
|
752 | 767 | <h4 class="mt-4 mb-0"> |
753 | | - {{ stats.max_duration_workflow ? flowDuration(stats.max_duration_workflow) : '-' }} |
| 768 | + {{ stats.max_duration_workflow ? flowDuration(stats.max_duration_workflow) : '—' }} |
754 | 769 | </h4> |
755 | 770 |
|
756 | 771 | <small class="mt-1" v-if="stats.max_duration_workflow"> |
757 | 772 | (<router-link :title="stats.max_duration_workflow.class" :to="{ name: routeName(stats.max_duration_workflow), params: { flowId: stats.max_duration_workflow.id }}">{{ flowBaseName(stats.max_duration_workflow.class) }}</router-link>) |
758 | 773 | </small> |
| 774 | + <small v-else class="mt-1 text-muted d-block">No completed runs yet</small> |
759 | 775 | </div> |
760 | 776 | </div> |
761 | 777 |
|
762 | 778 | <div class="w-25"> |
763 | 779 | <div class="p-4 mb-0"> |
764 | | - <small class="text-uppercase">Max Exceptions</small> |
| 780 | + <small class="text-uppercase">Most Exceptions On One Run</small> |
765 | 781 |
|
766 | 782 | <h4 class="mt-4 mb-0"> |
767 | 783 | {{ stats.max_exceptions_workflow ? exceptionCount(stats.max_exceptions_workflow).toLocaleString() : 0 }} |
|
770 | 786 | <small class="mt-1" v-if="stats.max_exceptions_workflow"> |
771 | 787 | (<router-link :title="stats.max_exceptions_workflow.class" :to="{ name: routeName(stats.max_exceptions_workflow), params: { flowId: stats.max_exceptions_workflow.id }}">{{ flowBaseName(stats.max_exceptions_workflow.class) }}</router-link>) |
772 | 788 | </small> |
| 789 | + <small v-else class="mt-1 text-muted d-block">No runs with exceptions</small> |
773 | 790 | </div> |
774 | 791 | </div> |
775 | 792 | </div> |
|
0 commit comments