diff --git a/airflow/www/templates/airflow/task_instance.html b/airflow/www/templates/airflow/task_instance.html
index f7faff3a538cb..9c5953ae28e8b 100644
--- a/airflow/www/templates/airflow/task_instance.html
+++ b/airflow/www/templates/airflow/task_instance.html
@@ -39,6 +39,9 @@
{{ url_for(endpoint, dag_id=dag.dag_id, task_id=task_id, execution_date=execution_date) }}
{%- endif -%}
{% endmacro -%}
+
+ grid_on
+ Grid
details
Task Instance Details
diff --git a/airflow/www/views.py b/airflow/www/views.py
index 9907d6d628af1..306926c163ae0 100644
--- a/airflow/www/views.py
+++ b/airflow/www/views.py
@@ -1395,6 +1395,7 @@ def rendered_templates(self, session):
show_trigger_form_if_no_params=conf.getboolean(
"webserver", "show_trigger_form_if_no_params"
),
+ dag_run_id=dag_run.run_id if dag_run else "",
html_dict=html_dict,
dag=dag,
task_id=task_id,
@@ -1460,6 +1461,7 @@ def rendered_templates(self, session):
"airflow/ti_code.html",
show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"),
html_dict=html_dict,
+ dag_run_id=dag_run.run_id if dag_run else "",
dag=dag,
task_id=task_id,
task_display_name=task.task_display_name,
@@ -1524,6 +1526,7 @@ def rendered_k8s(self, *, session: Session = NEW_SESSION):
return self.render_template(
"airflow/ti_code.html",
show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"),
+ dag_run_id=dag_run.run_id if dag_run else "",
html_dict={"k8s": content},
dag=dag,
task_id=task_id,
@@ -1650,6 +1653,7 @@ def log(self, session: Session = NEW_SESSION):
show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"),
logs=logs,
dag=dag_model,
+ dag_run_id=ti.run_id if ti else "",
title="Log by attempts",
dag_id=dag_id,
task_id=task_id,
@@ -1806,6 +1810,7 @@ def include_task_attrs(attr_name):
show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"),
task_attrs=task_attrs,
ti_attrs=ti_attrs,
+ dag_run_id=ti.run_id if ti else "",
failed_dep_reasons=failed_dep_reasons or no_failed_deps_result,
task_id=task_id,
execution_date=execution_date,
@@ -1858,6 +1863,7 @@ def xcom(self, session: Session = NEW_SESSION):
show_trigger_form_if_no_params=conf.getboolean("webserver", "show_trigger_form_if_no_params"),
attributes=attributes,
task_id=task_id,
+ dag_run_id=ti.run_id if ti else "",
task_display_name=ti.task_display_name,
execution_date=execution_date,
map_index=map_index,
diff --git a/tests/www/views/test_views_tasks.py b/tests/www/views/test_views_tasks.py
index d3001d1236234..2b893c40f671d 100644
--- a/tests/www/views/test_views_tasks.py
+++ b/tests/www/views/test_views_tasks.py
@@ -159,22 +159,42 @@ def client_ti_without_dag_edit(app):
],
id="delete-dag-button-normal",
),
+ pytest.param(
+ f"task?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}",
+ ["Grid"],
+ id="task-grid-button",
+ ),
pytest.param(
f"task?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}",
["Task Instance Details"],
id="task",
),
+ pytest.param(
+ f"log?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}",
+ ["Grid"],
+ id="log-grid-button",
+ ),
pytest.param(
f"xcom?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}",
["XCom"],
id="xcom",
),
+ pytest.param(
+ f"xcom?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}",
+ ["Grid"],
+ id="xcom-grid-button",
+ ),
pytest.param("xcom/list", ["List XComs"], id="xcom-list"),
pytest.param(
f"rendered-templates?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}",
["Rendered Template"],
id="rendered-templates",
),
+ pytest.param(
+ f"rendered-templates?task_id=runme_0&dag_id=example_bash_operator&execution_date={DEFAULT_VAL}",
+ ["Grid"],
+ id="rendered-templates-grid-button",
+ ),
pytest.param(
"object/graph_data?dag_id=example_bash_operator",
["runme_1"],