### Apache Airflow version

2.1.3 (latest released)

### Operating System

macOS Big Sur 11.3.1

### Versions of Apache Airflow Providers

n/a

### Deployment

Astronomer

### Deployment details

default Astronomer deployment with some test DAGs

### What happened

In the UI for DAGRuns there are checkboxes that allow multiple DAGRuns to be selected.

![image](https://user-images.githubusercontent.com/89415310/133841290-94cda771-9bb3-4677-8530-8c2861525719.png)

Within the Actions menu on this same view, there is a Delete option which allows multiple DAGRuns to be deleted at the same time.

![image](https://user-images.githubusercontent.com/89415310/133841362-3c7fc81d-a823-4f41-8b1d-64be425810ce.png)

Task instance view on the UI does not offer the same option, even though Task Instances can be individually deleted with the trash can button.

![image](https://user-images.githubusercontent.com/89415310/133841442-3fee0930-a6bb-4035-b172-1d10b85f3bf6.png)


### What you expected to happen

I expect that the Task Instances can also be bulk deleted, in the same way that DAGRuns can be.

### How to reproduce

Open up Task Instance and DAGRun views from the Browse tab and compare the options in the Actions dropdown menus.

### Anything else

_No response_

### Are you willing to submit PR?

- [X] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

airflow/www/views.py
dag = dag.partial_subset(task_ids_or_regex=root, include_downstream=False, include_upstream=True)
        num_runs = request.args.get('num_runs', type=int)
        if num_runs is None:
            num_runs = conf.getint('webserver', 'default_dag_run_display_number')
        try:
            base_date = timezone.parse(request.args["base_date"])
        except (KeyError, ValueError):
            base_date = dag.get_latest_execution_date() or timezone.utcnow()
        with create_session() as session:
            dag_runs = (
                session.query(DagRun)
                .filter(DagRun.dag_id == dag.dag_id, DagRun.execution_date <= base_date)
                .order_by(DagRun.execution_date.desc())
                .limit(num_runs)
                .all()
            )
            dag_runs = {dr.execution_date: alchemy_to_dict(dr) for dr in dag_runs}
            tree_data = self._get_tree_data(dag_runs, dag, base_date, session=session)
        
        return htmlsafe_json_dumps(tree_data, separators=(',', ':'))
    @expose('/robots.txt')
    @action_logging
    def robots(self):
        """
        Returns a robots.txt file for blocking certain search engine crawlers. This mitigates some
        of the risk associated with exposing Airflow to the public internet, however it does not
        address the real security risks associated with such a deployment.
        """
        return send_from_directory(current_app.static_folder, 'robots.txt')
class ConfigurationView(AirflowBaseView):