diff --git a/options/locale/locale_en-US.json b/options/locale/locale_en-US.json
index 1ba431c5eae..ec564d3e262 100644
--- a/options/locale/locale_en-US.json
+++ b/options/locale/locale_en-US.json
@@ -2725,6 +2725,7 @@
"graphs.code_frequency.what": "code frequency",
"graphs.contributors.what": "contributions",
"graphs.recent_commits.what": "recent commits",
+ "graphs.chart_zoom_hint": "drag: zoom, shift+drag: pan, double click: reset zoom",
"org.org_name_holder": "Organization Name",
"org.org_full_name_holder": "Organization Full Name",
"org.org_name_helper": "Organization names should be short and memorable.",
@@ -3797,6 +3798,16 @@
"actions.runs.latest_attempt": "Latest attempt",
"actions.runs.triggered_via": "Triggered via %s",
"actions.runs.total_duration": "Total duration:",
+ "actions.runs.workflow_dependencies": "Workflow Dependencies",
+ "actions.runs.graph_jobs_count_1": "%d job",
+ "actions.runs.graph_jobs_count_n": "%d jobs",
+ "actions.runs.graph_dependencies_count_1": "%d dependency",
+ "actions.runs.graph_dependencies_count_n": "%d dependencies",
+ "actions.runs.graph_success_rate": "%s success",
+ "actions.runs.graph_zoom_in": "Zoom in (Ctrl/Cmd + scroll on graph)",
+ "actions.runs.graph_zoom_max": "Already at 100% zoom",
+ "actions.runs.graph_zoom_out": "Zoom out (Ctrl/Cmd + scroll on graph)",
+ "actions.runs.graph_reset_view": "Reset view",
"actions.workflow.disable": "Disable Workflow",
"actions.workflow.disable_success": "Workflow '%s' disabled successfully.",
"actions.workflow.enable": "Enable Workflow",
diff --git a/templates/projects/view.tmpl b/templates/projects/view.tmpl
index 30056e211f1..8f4f1d60fda 100644
--- a/templates/projects/view.tmpl
+++ b/templates/projects/view.tmpl
@@ -134,16 +134,16 @@
{{if $canWriteProject}}
-
+
diff --git a/templates/repo/contributors.tmpl b/templates/repo/contributors.tmpl
index 882d8b205cf..2f7ddb8098c 100644
--- a/templates/repo/contributors.tmpl
+++ b/templates/repo/contributors.tmpl
@@ -10,6 +10,7 @@
data-locale-loading-title-failed="{{ctx.Locale.Tr "graphs.component_loading_failed" (ctx.Locale.Tr "graphs.contributors.what")}}"
data-locale-loading-info="{{ctx.Locale.Tr "graphs.component_loading_info"}}"
data-locale-component-failed-to-load="{{ctx.Locale.Tr "graphs.component_failed_to_load"}}"
+ data-locale-chart-zoom-hint="{{ctx.Locale.Tr "graphs.chart_zoom_hint"}}"
>
{{end}}
diff --git a/web_src/js/components/ActionRunSummaryView.vue b/web_src/js/components/ActionRunSummaryView.vue
index afbc0a13bf1..6402c2465b7 100644
--- a/web_src/js/components/ActionRunSummaryView.vue
+++ b/web_src/js/components/ActionRunSummaryView.vue
@@ -59,6 +59,7 @@ onBeforeUnmount(() => {
:jobs="run.jobs"
:run-link="run.link"
:workflow-id="run.workflowID"
+ :locale="locale"
/>
diff --git a/web_src/js/components/RepoContributors.vue b/web_src/js/components/RepoContributors.vue
index 3fd34081e04..d4d5190c6e6 100644
--- a/web_src/js/components/RepoContributors.vue
+++ b/web_src/js/components/RepoContributors.vue
@@ -270,7 +270,7 @@ export default defineComponent({
plugins: {
title: {
display: type === 'main',
- text: 'drag: zoom, shift+drag: pan, double click: reset zoom',
+ text: this.locale.chartZoomHint,
position: 'top',
align: 'center',
},
diff --git a/web_src/js/components/WorkflowGraph.vue b/web_src/js/components/WorkflowGraph.vue
index 3cca254dda2..c01226f2a91 100644
--- a/web_src/js/components/WorkflowGraph.vue
+++ b/web_src/js/components/WorkflowGraph.vue
@@ -4,6 +4,7 @@ import {SvgIcon} from '../svg.ts';
import ActionStatusIcon from './ActionStatusIcon.vue';
import {localUserSettings} from '../modules/user-settings.ts';
import {isPlainClick} from '../utils/dom.ts';
+import {trN} from '../modules/i18n.ts';
import {debounce} from 'throttle-debounce';
import type {ActionsJob, ActionsStatus} from '../modules/gitea-actions.ts';
import type {ActionRunViewStore} from './ActionRunView.ts';
@@ -43,6 +44,7 @@ const props = defineProps<{
jobs: ActionsJob[];
runLink: string;
workflowId: string;
+ locale: Record;
}>()
const settingKeyStates = 'actions-graph-states';
@@ -344,6 +346,12 @@ const graphMetrics = computed(() => {
};
})
+const graphStats = computed(() => [
+ trN(props.jobs.length, props.locale.graphJobsCount1, props.locale.graphJobsCountN),
+ trN(edges.value.length, props.locale.graphDependenciesCount1, props.locale.graphDependenciesCountN),
+ props.locale.graphSuccessRate.replace('%s', graphMetrics.value.successRate),
+].join(' • '))
+
const nodeHeight = 52;
const verticalSpacing = 90;
const margin = 40;
@@ -543,27 +551,22 @@ function onNodeClick(job: JobNode, event: MouseEvent) {