<commit_before>{#
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
#}

{% extends base_template %}

{% block page_title %}{{ dag.dag_id }} - Airflow{% endblock %}

{% block head_css %}
  {{ super() }}
  <link href="{{ url_for_asset('bootstrap-toggle.min.css') }}" rel="stylesheet" type="text/css">
{% endblock %}

{% block content %}
<div>
    <h3 class="pull-left">
      {% if dag.parent_dag is defined and dag.parent_dag %}
        <span style='color:#AAA;'>SUBDAG: </span> <span> {{ dag.dag_id }}</span>
      {% else %}
        <input id="pause_resume" dag_id="{{ dag.dag_id }}" type="checkbox" {{ "checked" if not dag.is_paused else "" }} data-toggle="toggle" data-size="mini" method="post">
        <span style='color:#AAA;'>DAG: </span> <span> {{ dag.dag_id }}</span>
        <small class="text-muted"> {{ dag.description[0:150] + '...' if dag.description and dag.description|length > 150 else dag.description|default('', true) }} </small>
      {% endif %}
      {% if root %}
        <span style='color:#AAA;'>ROOT: </span> <span> {{ root }}</span>
      {% endif %}
    </h3>
    <h4 class="pull-right">
      <a class="label label-default" href="{{ url_for('DagRunModelView.list') }}?_flt_3_dag_id={{ dag.dag_id }}">
        schedule: {{ dag.schedule_interval }}
      </a>
    </h4>
  </div>
  <div class="clearfix"></div>
  <div>
    {% set base_date_arg = request.args.get('base_date') %}
    {% set num_runs_arg = request.args.get('num_runs') %}
    {% if execution_date is defined %}
         {% set execution_date_arg = execution_date %}
    {% else %}
        {% set execution_date_arg = request.args.get('execution_date') %}
    {% endif %}
    <ul class="nav nav-pills">
      {% if dag.parent_dag is defined and dag.parent_dag %}
          <li class="never_active"><a href="{{ url_for('Airflow.' + dag.default_view, dag_id=dag.parent_dag.dag_id, base_date=base_date_arg, execution_date=execution_date_arg) }}">
              <span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>
              Back to {{ dag.parent_dag.dag_id }}</a>
          </li>
      {% endif %}
      <li><a href="{{ url_for('Airflow.graph', dag_id=dag.dag_id, root=root, num_runs=num_runs_arg, base_date=base_date_arg, execution_date=execution_date_arg) }}">
          <span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
        Graph View</a></li>
      <li><a href="{{ url_for('Airflow.tree', dag_id=dag.dag_id, num_runs=num_runs_arg, root=root, base_date=base_date_arg) }}">
          <span class="glyphicon glyphicon-tree-deciduous" aria-hidden="true"></span>
        Tree View
      </a></li>
      <li><a href="{{ url_for('Airflow.duration', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
          <span class="glyphicon glyphicon-stats" aria-hidden="true"></span>
          Task Duration
      </a></li>
      <li><a href="{{ url_for('Airflow.tries', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
          <span class="glyphicon glyphicon-duplicate" aria-hidden="true"></span>
          Task Tries
      </a></li>
      <li>
        <a href="{{ url_for('Airflow.landing_times', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
          <span class="glyphicon glyphicon-plane" aria-hidden="true"></span>
          Landing Times
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.gantt', dag_id=dag.dag_id, root=root, num_runs=num_runs_arg, base_date=base_date_arg, execution_date=execution_date_arg) }}">
          <span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
          <i class="icon-align-left"></i>
          Gantt
        </a>
      </li>
      <li>
      <a href="{{ url_for('Airflow.dag_details', dag_id=dag.dag_id) }}">
          <span class="glyphicon glyphicon-list" aria-hidden="true"></span>
          Details
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.code', dag_id=dag.dag_id, root=root) }}">
          <span class="glyphicon glyphicon-file" aria-hidden="true"></span>
          Code
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for('Airflow.' + dag.default_view, dag_id=dag.dag_id)) }}">
          <span class="glyphicon glyphicon-play-circle" aria-hidden="true"></span>
          Trigger DAG
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.refresh', dag_id=dag.dag_id) }}" title="Refresh" onclick="postAsForm(this.href); return false">
          <span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>
          Refresh
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id) }}"
          onclick="return confirmDeleteDag(this, '{{ dag.safe_dag_id }}')">
          <span class="glyphicon glyphicon-remove-circle" style="color:red" aria-hidden="true"></span>
          Delete
        </a>
      </li>
    </ul>
  </div>
  <hr>
  <!-- Modal -->
  <div class="modal fade" id="myModal"
        tabindex="-1" role="dialog"
      aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h4 class="modal-title" id="myModalLabel">
            <span id='task_id'></span>
            <button id="btn_filter" type="button" class="btn btn-default" title="Filter on this task and upstream ">
              <span class="glyphicon glyphicon-filter" style="margin-left:0;" aria-hidden="true"></span>
            </button>
              on
            <span id='execution_date'></span>
          </h4>
        </div>
        <div class="modal-body">
          <div id="div_btn_subdag">
            <a id="btn_subdag" type="button" class="btn btn-primary" data-base-url="{{ url_for('Airflow.' + dag.default_view) }}">
                Zoom into Sub DAG
              </a>
              <hr/>
          </div>
          <a id="btn_task" type="button" class="btn btn-primary" data-base-url="{{ url_for('Airflow.task') }}">
            Task Instance Details
          </a>
          <a id="btn_rendered" type="button" class="btn btn-primary" data-base-url="{{ url_for('Airflow.rendered') }}">
            Rendered
          </a>
          <a id="btn_ti" type="button" class="btn btn-primary" data-base-url="{{ url_for('TaskInstanceModelView.list') }}">
            Task Instances
          </a>
          <a id="btn_log" type="button" class="btn btn-primary" data-base-url="{{ url_for('Airflow.log') }}">
            View Log
          </a>
          <hr/>
          <div id="dag_dl_logs">
            <label style="display:inline"> Download Log (by attempts): </label>
            <ul class="nav nav-pills" role="tablist" id="try_index" style="display:inline">
            </ul>
            <hr/>
            <hr/>
          </div>
          <div id="dag_es_logs">
            <label style="display:inline"> View Logs in Elasticsearch (by attempts): </label>
            <ul class="nav nav-pills" role="tablist" id="es_try_index" style="display:inline">
            </ul>
            <hr/>
            <hr/>
          </div>
          <form method="POST">
            <input name="csrf_token" type="hidden" value="{{ csrf_token() }}"/>
            <input name="dag_id" type="hidden">
            <input name="task_id" type="hidden">
            <input name="execution_date" type="hidden">
            <input name="origin" type="hidden" value="{{ request.base_url }}">
            <button id="btn_run" type="button" class="btn btn-primary"
              title="Runs a single task instance"
              data-action="{{ url_for('Airflow.run') }}">
              Run
            </button>
            <span class="btn-group" data-toggle="buttons">
              <label
                class="btn"
                title="Ignores all non-critical dependencies, including task state and task_deps">
                <input type="checkbox" value="true" name="ignore_all_deps" autocomplete="off">
                Ignore All Deps</label>
              <label class="btn"
                title="Ignore previous success/failure">
                <input type="checkbox" value="true" name="ignore_ti_state" autocomplete="off">
                Ignore Task State
              </label>
              <label class="btn"
                title="Disregard the task-specific dependencies, e.g. status of upstream task instances and depends_on_past">
                <input type="checkbox" value="true" name="ignore_task_deps" autocomplete="off">
                Ignore Task Deps
              </label>
            </span>
            <hr/>
            <button id="btn_clear" type="button" class="btn btn-primary"
                title="Clearing deletes the previous state of the task instance, allowing it to get re-triggered by the scheduler or a backfill command"
                data-action="{{ url_for('Airflow.clear') }}"
                >Clear
            </button>
            <span class="btn-group" data-toggle="buttons">
              <label class="btn"
                title="Also include past task instances when clearing this one">
                <input type="checkbox" value="true" name="past" autocomplete="off">
                Past
              </label>
              <label class="btn"
                title="Also include future task instances when clearing this one">
                <input type="checkbox" value="true" name="future" autocomplete="off">
                Future
              </label>
              <label class="btn"
                title="Also include upstream dependencies">
                <input type="checkbox" value="true" name="upstream" autocomplete="off">
                Upstream
              </label>
              <label class="btn active"
                title="Also include downstream dependencies">
                <input type="checkbox" value="true" name="downstream" checked autocomplete="off">
                Downstream
              </label>
              <label class="btn active">
                <input type="checkbox" value="true" name="recursive" checked autocomplete="off">
                 Recursive
              </label>
              <label class="btn"
                title="Only consider failed task instances when clearing this one">
                <input type="checkbox" value="true" name="only_failed" autocomplete="off">
                Failed
              </label>
            </span>
            <hr/>
            <button id="btn_failed" type="button" class="btn btn-primary"
                data-action="{{ url_for('Airflow.failed') }}">
              Mark Failed
            </button>
            <span class="btn-group" data-toggle="buttons">
              <label class="btn">
                <input type="checkbox" value="true" name="failed_past" autocomplete="off">
                Past
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="failed_future" autocomplete="off">
                Future
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="failed_upstream" autocomplete="off">
                Upstream
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="failed_downstream" autocomplete="off">
                Downstream
              </label>
            </span>
            <hr/>
            <button id="btn_success" type="button" class="btn btn-primary"
                data-action="{{ url_for('Airflow.success') }}">
              Mark Success
            </button>
            <span class="btn-group" data-toggle="buttons">
              <label class="btn">
                <input type="checkbox" value="true" name="success_past" autocomplete="off">
                Past
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="success_future" autocomplete="off">
                Future
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="success_upstream" autocomplete="off">
                Upstream
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="success_downstream" autocomplete="off">
                Downstream
              </label>
            </span>
          </form>
          <hr/>
            <span class="btn-group" id="extra_links">
            </span>
        </div>

        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">
            Close
          </button>
        </div>
      </div>
    </div>
  </div>
  <!-- Modal for dag -->
  <div class="modal fade" id="dagModal"
        tabindex="-1" role="dialog"
      aria-labelledby="dagModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h4 class="modal-title" id="dagModalLabel">
            <span id='dag_id'></span>
          </h4>
        </div>
        <div class="modal-body">
          <form method="POST">
            <a id="btn_edit_dagrun" type="button" class="btn btn-primary" href="{{ url_for('DagModelView.edit', pk=dag.dag_id) }}">
              Edit
            </a>
            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
            <input name="dag_id" type="hidden">
            <input name="execution_date" type="hidden">
            <input name="origin" type="hidden" value="{{ request.base_url }}">
            <button id="btn_dagrun_clear" type="button" class="btn btn-primary" data-action="{{ url_for('Airflow.dagrun_clear') }}">
              Clear
            </button>
            <button id="btn_dagrun_failed" type="button" class="btn btn-primary" data-action="{{ url_for('Airflow.dagrun_failed') }}">
              Mark Failed
            </button>
            <button id="btn_dagrun_success" type="button" class="btn btn-primary" data-action="{{ url_for('Airflow.dagrun_success') }}">
              Mark Success
            </button>
          </form>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">
            Close
          </button>
        </div>
      </div>
    </div>
  </div>
{% endblock %}
{% block tail %}
  {{ super() }}
  <script src="{{ url_for_asset('bootstrap-toggle.min.js') }}"></script>
  <script>
function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
  var separator = uri.indexOf('?') !== -1 ? "&" : "?";
  if (uri.match(re)) {
    return uri.replace(re, '$1' + key + "=" + value + '$2');
  }
  else {
    return uri + separator + key + "=" + value;
  }
}

    // Pills highlighting
    $(document).ready(function () {
      $('a[href*="' + this.location.pathname + '"]').parent().addClass('active');
      $('.never_active').removeClass('active');
    });

    var id = '';
    var dag_id = '{{ dag.dag_id }}';
    var dagTZ = '{{ dag.timezone.name }}'; // Being used in datetime-utils.js
    var task_id = '';
    var execution_date = '';
    var subdag_id = '';
    var show_es_logs = false;
    {% if show_external_logs is defined %}
      show_es_logs = '{{ show_external_logs }}' == "True";
    {% endif %}

    var buttons = Array.from(document.querySelectorAll('a[id^="btn_"][data-base-url]')).reduce(function(obj, elm) {
      obj[elm.id.replace('btn_', '')] = elm;
      return obj;
    }, {});

    // Update modal urls on toggle
    document.addEventListener('click', function(event) {
      if (event.target.matches('button[data-toggle="button"]')) {
        updateModalUrls();
      }
    });

    function updateButtonUrl(elm, params) {
      elm.setAttribute('href', elm.dataset.baseUrl + '?' + $.param(params));
    }

    function updateModalUrls() {
      updateButtonUrl(buttons.subdag, {
        dag_id: subdag_id,
        execution_date: execution_date,
      });

      updateButtonUrl(buttons.task, {
        dag_id: dag_id,
        task_id: task_id,
        execution_date: execution_date,
      });

      updateButtonUrl(buttons.rendered, {
        dag_id: dag_id,
        task_id: task_id,
        execution_date: execution_date,
      });

      updateButtonUrl(buttons.ti, {
        flt1_dag_id_equals: dag_id,
        _flt_3_task_id: task_id,
        _oc_TaskInstanceModelView: execution_date,
      });

      updateButtonUrl(buttons.log, {
        dag_id: dag_id,
        task_id: task_id,
        execution_date: execution_date,
      });

    }

    function call_modal(t, d, extra_links, try_numbers, sd) {
      task_id = t;
      loc = String(window.location);
      $("#btn_filter").on("click", function(){
        window.location = updateQueryStringParameter(loc, "root", task_id);
      });
      subdag_id = sd;
      execution_date = d;
      $('#task_id').html(t);
      $('#execution_date').html(d);
      $('#myModal').modal({});
      $("#myModal").css("margin-top","0px");
      $('#extra_links').prev('hr').hide();
      $('#extra_links').empty().hide();
      if (subdag_id === undefined)
          $("#div_btn_subdag").hide();
      else {
          $("#div_btn_subdag").show();
          subdag_id = "{{ dag.dag_id }}." + t;
      }

      $("#dag_dl_logs").hide();
      $("#dag_es_logs").hide();
      if (try_numbers > 0) {
          $("#dag_dl_logs").show();
          if (show_es_logs) {
              $("#dag_es_logs").show();
          }
      }

      updateModalUrls();

      $("#try_index > li").remove();
      $("#es_try_index > li").remove();
      var startIndex = (try_numbers > 2 ? 0 : 1)
      for (var index = startIndex; index <  try_numbers; index++) {
        var url = "{{ url_for('Airflow.get_logs_with_metadata') }}" +
          "?dag_id=" + encodeURIComponent(dag_id) +
          "&task_id=" + encodeURIComponent(task_id) +
          "&execution_date=" + encodeURIComponent(execution_date) +
          "&metadata=null" +
          "&format=file";

        var showLabel = index;
        if (index != 0) {
          url += "&try_number=" + index;
        } else {
          showLabel = 'All';
        }

        $("#try_index").append(`<li role="presentation" style="display:inline">
          <a href="${url}"> ${showLabel} </a>
          </li>`
        );

        if (index == 0 || !show_es_logs) continue;
        var es_url = "{{ url_for('Airflow.elasticsearch') }}" +
          "?dag_id=" + encodeURIComponent(dag_id) +
          "&task_id=" + encodeURIComponent(task_id) +
          "&execution_date=" + encodeURIComponent(execution_date) +
          "&try_number=" + index;
        $("#es_try_index").append(`<li role="presentation" style="display:inline">
          <a href="${es_url}"> ${showLabel} </a>
          </li>`
        );
      }

      if (extra_links && extra_links.length > 0){
        var markupArr = [];
        extra_links.sort();
        $.each(extra_links, function(i, link){
          var url = "{{ url_for('Airflow.extra_links') }}" +
                  "?task_id=" + encodeURIComponent(task_id) +
                  "&dag_id=" + encodeURIComponent(dag_id) +
                  "&execution_date=" + encodeURIComponent(execution_date) +
                  "&link_name=" + encodeURIComponent(link);
          var external_link = $('<a href="#" data-toggle="tooltip" class="btn btn-primary disabled" target="_blank"></a>')
          var link_tooltip = $('<span class="tool-tip" data-toggle="tooltip" style="padding-right: 2px; padding-left: 3px" data-placement="top" ' +
            'title="link not yet available"></span>');
          link_tooltip.append(external_link)
          external_link.text(link);

          $.ajax(
            {url: url,
             cache: false,
             success: function (data, textStatus, jqXHR) {
               external_link.attr('href', data['url']);
               external_link.removeClass('disabled');
               link_tooltip.tooltip('disable');
             },
             error:  function (data) {
               link_tooltip.tooltip('hide').attr('title', data['responseJSON']['error']).tooltip('fixTitle');
             }
           });

          markupArr.push(link_tooltip)
        });

        $('#extra_links').prev('hr').show();
        $('#extra_links').append(markupArr).show();
        $('[data-toggle="tooltip"]').tooltip();
      }

    }

    function call_modal_dag(dag) {
      id = dag && dag.id;
      execution_date = dag && dag.execution_date;
      $('#dag_id').html(dag_id);
      $('#dagModal').modal({});
      $("#dagModal").css("margin-top","0px");
    }

    function confirmTriggerDag(link, dag_id){
      if (confirm("Are you sure you want to run '"+dag_id+"' now?")) {
        postAsForm(link.href, {});
      }
      // Never follow the link
      return false;
    }

    function confirmDeleteDag(link, dag_id){
      if (confirm("Are you sure you want to delete '"+dag_id+"' now?\n\
        This option will delete ALL metadata, DAG runs, etc.\n\
        EXCEPT Log.\n\
        This cannot be undone.")) {
        postAsForm(link.href, {});
      }
      return false;
    }

    $('form button[data-action]').click(function (e) {
      var form = $(this).closest('form').get(0);
      form.dag_id.value = dag_id;
      form.execution_date.value = execution_date;
      form.origin.value = window.location;
      if (form.task_id) {
        form.task_id.value = task_id;
      }
      form.action = $(this).data("action");
      form.submit();
    })

    $("#pause_resume").change(function() {
      var dag_id = $(this).attr('dag_id');
      var $input = $(this);
      var $buttons = $input.parent('.toggle').find('.btn');
      $buttons.removeClass('btn-danger');
      if ($input.prop('checked')) {
        is_paused = 'true'
      } else {
        is_paused = 'false'
      }
      var url = "{{ url_for('Airflow.paused') }}" + '?is_paused=' + is_paused + '&dag_id=' + encodeURIComponent(dag_id);
      $.post(url).fail(function() {
        if (is_paused === 'true') {
          $input.data('bs.toggle').off(true);
        } else {
          $input.data('bs.toggle').on(true);
        }
        $buttons.addClass('btn-danger');
      });
    });

  </script>
{% endblock %}
<commit_msg>UX Fix: Prevent undesired text selection with DAG title selection in Chrome (#8912)<commit_after>{#
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
#}

{% extends base_template %}

{% block page_title %}{{ dag.dag_id }} - Airflow{% endblock %}

{% block head_css %}
  {{ super() }}
  <link href="{{ url_for_asset('bootstrap-toggle.min.css') }}" rel="stylesheet" type="text/css">
{% endblock %}

{% block content %}
  <div>
    <h3 class="pull-left">
      {% if dag.parent_dag is defined and dag.parent_dag %}
        <span style="color:#aaa;">SUBDAG:</span> <span>{{ dag.dag_id }}</span>
      {% else %}
        <input id="pause_resume" dag_id="{{ dag.dag_id }}" type="checkbox" {{ "checked" if not dag.is_paused else "" }} data-toggle="toggle" data-size="mini" method="post">
        <span style="color:#aaa;">DAG:</span> <span>{{ dag.dag_id }}</span>
        <small class="text-muted">{{ dag.description[0:150] + '…' if dag.description and dag.description|length > 150 else dag.description|default('', true) }}</small>
      {% endif %}
      {% if root %}
        <span style="color:#aaa;">ROOT:</span> <span>{{ root }}</span>
      {% endif %}
    </h3>
    <h4 class="pull-right">
      <a class="label label-default" href="{{ url_for('DagRunModelView.list') }}?_flt_3_dag_id={{ dag.dag_id }}" style="user-select: none;-moz-user-select: auto;">
        schedule: {{ dag.schedule_interval }}
      </a>
    </h4>
  </div>
  <div class="clearfix"></div>
  <div>
    {% set base_date_arg = request.args.get('base_date') %}
    {% set num_runs_arg = request.args.get('num_runs') %}
    {% if execution_date is defined %}
      {% set execution_date_arg = execution_date %}
    {% else %}
      {% set execution_date_arg = request.args.get('execution_date') %}
    {% endif %}
    <ul class="nav nav-pills">
      {% if dag.parent_dag is defined and dag.parent_dag %}
          <li class="never_active"><a href="{{ url_for('Airflow.' + dag.default_view, dag_id=dag.parent_dag.dag_id, base_date=base_date_arg, execution_date=execution_date_arg) }}">
              <span class="glyphicon glyphicon-arrow-left" aria-hidden="true"></span>
              Back to {{ dag.parent_dag.dag_id }}</a>
          </li>
      {% endif %}
      <li><a href="{{ url_for('Airflow.graph', dag_id=dag.dag_id, root=root, num_runs=num_runs_arg, base_date=base_date_arg, execution_date=execution_date_arg) }}">
          <span class="glyphicon glyphicon-certificate" aria-hidden="true"></span>
        Graph View</a></li>
      <li><a href="{{ url_for('Airflow.tree', dag_id=dag.dag_id, num_runs=num_runs_arg, root=root, base_date=base_date_arg) }}">
          <span class="glyphicon glyphicon-tree-deciduous" aria-hidden="true"></span>
        Tree View
      </a></li>
      <li><a href="{{ url_for('Airflow.duration', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
          <span class="glyphicon glyphicon-stats" aria-hidden="true"></span>
          Task Duration
      </a></li>
      <li><a href="{{ url_for('Airflow.tries', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
          <span class="glyphicon glyphicon-duplicate" aria-hidden="true"></span>
          Task Tries
      </a></li>
      <li>
        <a href="{{ url_for('Airflow.landing_times', dag_id=dag.dag_id, days=30, root=root, num_runs=num_runs_arg, base_date=base_date_arg) }}">
          <span class="glyphicon glyphicon-plane" aria-hidden="true"></span>
          Landing Times
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.gantt', dag_id=dag.dag_id, root=root, num_runs=num_runs_arg, base_date=base_date_arg, execution_date=execution_date_arg) }}">
          <span class="glyphicon glyphicon-align-left" aria-hidden="true"></span>
          <i class="icon-align-left"></i>
          Gantt
        </a>
      </li>
      <li>
      <a href="{{ url_for('Airflow.dag_details', dag_id=dag.dag_id) }}">
          <span class="glyphicon glyphicon-list" aria-hidden="true"></span>
          Details
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.code', dag_id=dag.dag_id, root=root) }}">
          <span class="glyphicon glyphicon-file" aria-hidden="true"></span>
          Code
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for('Airflow.' + dag.default_view, dag_id=dag.dag_id)) }}">
          <span class="glyphicon glyphicon-play-circle" aria-hidden="true"></span>
          Trigger DAG
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.refresh', dag_id=dag.dag_id) }}" title="Refresh" onclick="postAsForm(this.href); return false">
          <span class="glyphicon glyphicon-refresh" aria-hidden="true"></span>
          Refresh
        </a>
      </li>
      <li>
        <a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id) }}"
          onclick="return confirmDeleteDag(this, '{{ dag.safe_dag_id }}')">
          <span class="glyphicon glyphicon-remove-circle" style="color:red" aria-hidden="true"></span>
          Delete
        </a>
      </li>
    </ul>
  </div>
  <hr>
  <!-- Modal -->
  <div class="modal fade" id="myModal"
        tabindex="-1" role="dialog"
      aria-labelledby="myModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h4 class="modal-title" id="myModalLabel">
            <span id='task_id'></span>
            <button id="btn_filter" type="button" class="btn btn-default" title="Filter on this task and upstream ">
              <span class="glyphicon glyphicon-filter" style="margin-left:0;" aria-hidden="true"></span>
            </button>
              on
            <span id='execution_date'></span>
          </h4>
        </div>
        <div class="modal-body">
          <div id="div_btn_subdag">
            <a id="btn_subdag" type="button" class="btn btn-primary" data-base-url="{{ url_for('Airflow.' + dag.default_view) }}">
                Zoom into Sub DAG
              </a>
              <hr/>
          </div>
          <a id="btn_task" type="button" class="btn btn-primary" data-base-url="{{ url_for('Airflow.task') }}">
            Task Instance Details
          </a>
          <a id="btn_rendered" type="button" class="btn btn-primary" data-base-url="{{ url_for('Airflow.rendered') }}">
            Rendered
          </a>
          <a id="btn_ti" type="button" class="btn btn-primary" data-base-url="{{ url_for('TaskInstanceModelView.list') }}">
            Task Instances
          </a>
          <a id="btn_log" type="button" class="btn btn-primary" data-base-url="{{ url_for('Airflow.log') }}">
            View Log
          </a>
          <hr/>
          <div id="dag_dl_logs">
            <label style="display:inline"> Download Log (by attempts): </label>
            <ul class="nav nav-pills" role="tablist" id="try_index" style="display:inline">
            </ul>
            <hr/>
            <hr/>
          </div>
          <div id="dag_es_logs">
            <label style="display:inline"> View Logs in Elasticsearch (by attempts): </label>
            <ul class="nav nav-pills" role="tablist" id="es_try_index" style="display:inline">
            </ul>
            <hr/>
            <hr/>
          </div>
          <form method="POST">
            <input name="csrf_token" type="hidden" value="{{ csrf_token() }}"/>
            <input name="dag_id" type="hidden">
            <input name="task_id" type="hidden">
            <input name="execution_date" type="hidden">
            <input name="origin" type="hidden" value="{{ request.base_url }}">
            <button id="btn_run" type="button" class="btn btn-primary"
              title="Runs a single task instance"
              data-action="{{ url_for('Airflow.run') }}">
              Run
            </button>
            <span class="btn-group" data-toggle="buttons">
              <label
                class="btn"
                title="Ignores all non-critical dependencies, including task state and task_deps">
                <input type="checkbox" value="true" name="ignore_all_deps" autocomplete="off">
                Ignore All Deps</label>
              <label class="btn"
                title="Ignore previous success/failure">
                <input type="checkbox" value="true" name="ignore_ti_state" autocomplete="off">
                Ignore Task State
              </label>
              <label class="btn"
                title="Disregard the task-specific dependencies, e.g. status of upstream task instances and depends_on_past">
                <input type="checkbox" value="true" name="ignore_task_deps" autocomplete="off">
                Ignore Task Deps
              </label>
            </span>
            <hr/>
            <button id="btn_clear" type="button" class="btn btn-primary"
                title="Clearing deletes the previous state of the task instance, allowing it to get re-triggered by the scheduler or a backfill command"
                data-action="{{ url_for('Airflow.clear') }}"
                >Clear
            </button>
            <span class="btn-group" data-toggle="buttons">
              <label class="btn"
                title="Also include past task instances when clearing this one">
                <input type="checkbox" value="true" name="past" autocomplete="off">
                Past
              </label>
              <label class="btn"
                title="Also include future task instances when clearing this one">
                <input type="checkbox" value="true" name="future" autocomplete="off">
                Future
              </label>
              <label class="btn"
                title="Also include upstream dependencies">
                <input type="checkbox" value="true" name="upstream" autocomplete="off">
                Upstream
              </label>
              <label class="btn active"
                title="Also include downstream dependencies">
                <input type="checkbox" value="true" name="downstream" checked autocomplete="off">
                Downstream
              </label>
              <label class="btn active">
                <input type="checkbox" value="true" name="recursive" checked autocomplete="off">
                 Recursive
              </label>
              <label class="btn"
                title="Only consider failed task instances when clearing this one">
                <input type="checkbox" value="true" name="only_failed" autocomplete="off">
                Failed
              </label>
            </span>
            <hr/>
            <button id="btn_failed" type="button" class="btn btn-primary"
                data-action="{{ url_for('Airflow.failed') }}">
              Mark Failed
            </button>
            <span class="btn-group" data-toggle="buttons">
              <label class="btn">
                <input type="checkbox" value="true" name="failed_past" autocomplete="off">
                Past
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="failed_future" autocomplete="off">
                Future
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="failed_upstream" autocomplete="off">
                Upstream
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="failed_downstream" autocomplete="off">
                Downstream
              </label>
            </span>
            <hr/>
            <button id="btn_success" type="button" class="btn btn-primary"
                data-action="{{ url_for('Airflow.success') }}">
              Mark Success
            </button>
            <span class="btn-group" data-toggle="buttons">
              <label class="btn">
                <input type="checkbox" value="true" name="success_past" autocomplete="off">
                Past
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="success_future" autocomplete="off">
                Future
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="success_upstream" autocomplete="off">
                Upstream
              </label>
              <label class="btn">
                <input type="checkbox" value="true" name="success_downstream" autocomplete="off">
                Downstream
              </label>
            </span>
          </form>
          <hr/>
            <span class="btn-group" id="extra_links">
            </span>
        </div>

        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">
            Close
          </button>
        </div>
      </div>
    </div>
  </div>
  <!-- Modal for dag -->
  <div class="modal fade" id="dagModal"
        tabindex="-1" role="dialog"
      aria-labelledby="dagModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <h4 class="modal-title" id="dagModalLabel">
            <span id='dag_id'></span>
          </h4>
        </div>
        <div class="modal-body">
          <form method="POST">
            <a id="btn_edit_dagrun" type="button" class="btn btn-primary" href="{{ url_for('DagModelView.edit', pk=dag.dag_id) }}">
              Edit
            </a>
            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
            <input name="dag_id" type="hidden">
            <input name="execution_date" type="hidden">
            <input name="origin" type="hidden" value="{{ request.base_url }}">
            <button id="btn_dagrun_clear" type="button" class="btn btn-primary" data-action="{{ url_for('Airflow.dagrun_clear') }}">
              Clear
            </button>
            <button id="btn_dagrun_failed" type="button" class="btn btn-primary" data-action="{{ url_for('Airflow.dagrun_failed') }}">
              Mark Failed
            </button>
            <button id="btn_dagrun_success" type="button" class="btn btn-primary" data-action="{{ url_for('Airflow.dagrun_success') }}">
              Mark Success
            </button>
          </form>
        </div>
        <div class="modal-footer">
          <button type="button" class="btn btn-default" data-dismiss="modal">
            Close
          </button>
        </div>
      </div>
    </div>
  </div>
{% endblock %}
{% block tail %}
  {{ super() }}
  <script src="{{ url_for_asset('bootstrap-toggle.min.js') }}"></script>
  <script>
function updateQueryStringParameter(uri, key, value) {
  var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
  var separator = uri.indexOf('?') !== -1 ? "&" : "?";
  if (uri.match(re)) {
    return uri.replace(re, '$1' + key + "=" + value + '$2');
  }
  else {
    return uri + separator + key + "=" + value;
  }
}

    // Pills highlighting
    $(document).ready(function () {
      $('a[href*="' + this.location.pathname + '"]').parent().addClass('active');
      $('.never_active').removeClass('active');
    });

    var id = '';
    var dag_id = '{{ dag.dag_id }}';
    var dagTZ = '{{ dag.timezone.name }}'; // Being used in datetime-utils.js
    var task_id = '';
    var execution_date = '';
    var subdag_id = '';
    var show_es_logs = false;
    {% if show_external_logs is defined %}
      show_es_logs = '{{ show_external_logs }}' == "True";
    {% endif %}

    var buttons = Array.from(document.querySelectorAll('a[id^="btn_"][data-base-url]')).reduce(function(obj, elm) {
      obj[elm.id.replace('btn_', '')] = elm;
      return obj;
    }, {});

    // Update modal urls on toggle
    document.addEventListener('click', function(event) {
      if (event.target.matches('button[data-toggle="button"]')) {
        updateModalUrls();
      }
    });

    function updateButtonUrl(elm, params) {
      elm.setAttribute('href', elm.dataset.baseUrl + '?' + $.param(params));
    }

    function updateModalUrls() {
      updateButtonUrl(buttons.subdag, {
        dag_id: subdag_id,
        execution_date: execution_date,
      });

      updateButtonUrl(buttons.task, {
        dag_id: dag_id,
        task_id: task_id,
        execution_date: execution_date,
      });

      updateButtonUrl(buttons.rendered, {
        dag_id: dag_id,
        task_id: task_id,
        execution_date: execution_date,
      });

      updateButtonUrl(buttons.ti, {
        flt1_dag_id_equals: dag_id,
        _flt_3_task_id: task_id,
        _oc_TaskInstanceModelView: execution_date,
      });

      updateButtonUrl(buttons.log, {
        dag_id: dag_id,
        task_id: task_id,
        execution_date: execution_date,
      });

    }

    function call_modal(t, d, extra_links, try_numbers, sd) {
      task_id = t;
      loc = String(window.location);
      $("#btn_filter").on("click", function(){
        window.location = updateQueryStringParameter(loc, "root", task_id);
      });
      subdag_id = sd;
      execution_date = d;
      $('#task_id').html(t);
      $('#execution_date').html(d);
      $('#myModal').modal({});
      $("#myModal").css("margin-top","0px");
      $('#extra_links').prev('hr').hide();
      $('#extra_links').empty().hide();
      if (subdag_id === undefined)
          $("#div_btn_subdag").hide();
      else {
          $("#div_btn_subdag").show();
          subdag_id = "{{ dag.dag_id }}." + t;
      }

      $("#dag_dl_logs").hide();
      $("#dag_es_logs").hide();
      if (try_numbers > 0) {
          $("#dag_dl_logs").show();
          if (show_es_logs) {
              $("#dag_es_logs").show();
          }
      }

      updateModalUrls();

      $("#try_index > li").remove();
      $("#es_try_index > li").remove();
      var startIndex = (try_numbers > 2 ? 0 : 1)
      for (var index = startIndex; index <  try_numbers; index++) {
        var url = "{{ url_for('Airflow.get_logs_with_metadata') }}" +
          "?dag_id=" + encodeURIComponent(dag_id) +
          "&task_id=" + encodeURIComponent(task_id) +
          "&execution_date=" + encodeURIComponent(execution_date) +
          "&metadata=null" +
          "&format=file";

        var showLabel = index;
        if (index != 0) {
          url += "&try_number=" + index;
        } else {
          showLabel = 'All';
        }

        $("#try_index").append(`<li role="presentation" style="display:inline">
          <a href="${url}"> ${showLabel} </a>
          </li>`
        );

        if (index == 0 || !show_es_logs) continue;
        var es_url = "{{ url_for('Airflow.elasticsearch') }}" +
          "?dag_id=" + encodeURIComponent(dag_id) +
          "&task_id=" + encodeURIComponent(task_id) +
          "&execution_date=" + encodeURIComponent(execution_date) +
          "&try_number=" + index;
        $("#es_try_index").append(`<li role="presentation" style="display:inline">
          <a href="${es_url}"> ${showLabel} </a>
          </li>`
        );
      }

      if (extra_links && extra_links.length > 0){
        var markupArr = [];
        extra_links.sort();
        $.each(extra_links, function(i, link){
          var url = "{{ url_for('Airflow.extra_links') }}" +
                  "?task_id=" + encodeURIComponent(task_id) +
                  "&dag_id=" + encodeURIComponent(dag_id) +
                  "&execution_date=" + encodeURIComponent(execution_date) +
                  "&link_name=" + encodeURIComponent(link);
          var external_link = $('<a href="#" data-toggle="tooltip" class="btn btn-primary disabled" target="_blank"></a>')
          var link_tooltip = $('<span class="tool-tip" data-toggle="tooltip" style="padding-right: 2px; padding-left: 3px" data-placement="top" ' +
            'title="link not yet available"></span>');
          link_tooltip.append(external_link)
          external_link.text(link);

          $.ajax(
            {url: url,
             cache: false,
             success: function (data, textStatus, jqXHR) {
               external_link.attr('href', data['url']);
               external_link.removeClass('disabled');
               link_tooltip.tooltip('disable');
             },
             error:  function (data) {
               link_tooltip.tooltip('hide').attr('title', data['responseJSON']['error']).tooltip('fixTitle');
             }
           });

          markupArr.push(link_tooltip)
        });

        $('#extra_links').prev('hr').show();
        $('#extra_links').append(markupArr).show();
        $('[data-toggle="tooltip"]').tooltip();
      }

    }

    function call_modal_dag(dag) {
      id = dag && dag.id;
      execution_date = dag && dag.execution_date;
      $('#dag_id').html(dag_id);
      $('#dagModal').modal({});
      $("#dagModal").css("margin-top","0px");
    }

    function confirmTriggerDag(link, dag_id){
      if (confirm("Are you sure you want to run '"+dag_id+"' now?")) {
        postAsForm(link.href, {});
      }
      // Never follow the link
      return false;
    }

    function confirmDeleteDag(link, dag_id){
      if (confirm("Are you sure you want to delete '"+dag_id+"' now?\n\
        This option will delete ALL metadata, DAG runs, etc.\n\
        EXCEPT Log.\n\
        This cannot be undone.")) {
        postAsForm(link.href, {});
      }
      return false;
    }

    $('form button[data-action]').click(function (e) {
      var form = $(this).closest('form').get(0);
      form.dag_id.value = dag_id;
      form.execution_date.value = execution_date;
      form.origin.value = window.location;
      if (form.task_id) {
        form.task_id.value = task_id;
      }
      form.action = $(this).data("action");
      form.submit();
    })

    $("#pause_resume").change(function() {
      var dag_id = $(this).attr('dag_id');
      var $input = $(this);
      var $buttons = $input.parent('.toggle').find('.btn');
      $buttons.removeClass('btn-danger');
      if ($input.prop('checked')) {
        is_paused = 'true'
      } else {
        is_paused = 'false'
      }
      var url = "{{ url_for('Airflow.paused') }}" + '?is_paused=' + is_paused + '&dag_id=' + encodeURIComponent(dag_id);
      $.post(url).fail(function() {
        if (is_paused === 'true') {
          $input.data('bs.toggle').off(true);
        } else {
          $input.data('bs.toggle').on(true);
        }
        $buttons.addClass('btn-danger');
      });
    });

  </script>
{% endblock %}

{'fraction_non_alphanumeric': 0.1630628886163644, 'fraction_numerical': 0.002065448912412057, 'mean_word_length': 2.242639877215013, 'pattern_counts': {'":': 0, '<': 583, '<?xml version=': 0, '>': 593, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3417116', 'n_tokens_mistral': 14288, 'n_tokens_neox': 13829, 'n_words': 2893}