{#
 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 %}
{% from 'appbuilder/dag_docs.html' import dag_docs %}

{% block page_title %}{{ dag.dag_id }} - {{ appbuilder.app_name }}{% endblock %}

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

{% set dag_is_paused = dag.get_is_paused() %}
{% 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 %}

{% block head_meta %}
  {{ super() }}
  <meta name="dag_id" content="{{ dag.dag_id }}">
  <meta name="dag_timezone" content="{{ dag.timezone.name }}">
  <!-- Urls -->
  <meta name="logs_with_metadata_url" content="{{ url_for('Airflow.get_logs_with_metadata') }}">
  <meta name="external_log_url" content="{{ url_for('Airflow.redirect_to_external_log') }}">
  <meta name="extra_links_url" content="{{ url_for('Airflow.extra_links') }}">
  <meta name="paused_url" content="{{ url_for('Airflow.paused') }}">
  <meta name="dagrun_clear_url" content="{{ url_for('Airflow.dagrun_clear') }}">
  <meta name="dagrun_failed_url" content="{{ url_for('Airflow.dagrun_failed') }}">
  <meta name="dagrun_success_url" content="{{ url_for('Airflow.dagrun_success') }}">
  <meta name="dagrun_queued_url" content="{{ url_for('Airflow.dagrun_queued') }}">
  <meta name="clear_url" content="{{ url_for('Airflow.clear') }}">
  <meta name="failed_url" content="{{ url_for('Airflow.failed') }}">
  <meta name="success_url" content="{{ url_for('Airflow.success') }}">
  <meta name="confirm_url" content="{{ url_for('Airflow.confirm') }}">
  <meta name="grid_data_url" content="{{ url_for('Airflow.grid_data') }}">
  <meta name="run_url" content="{{ url_for('Airflow.run') }}">
  <meta name="grid_url" content="{{ url_for('Airflow.grid', dag_id=dag.dag_id) }}">
  <meta name="grid_url_no_root" content="{{ url_for('Airflow.grid', dag_id=dag.dag_id, num_runs=num_runs_arg, base_date=base_date_arg) }}">
  <meta name="dag_details_url" content="{{ url_for('Airflow.dag_details', dag_id=dag.dag_id) }}">
  <meta name="graph_url" content="{{ url_for('Airflow.graph', dag_id=dag.dag_id, root=root) }}">
  <meta name="dagrun_details_url" content="{{ url_for('Airflow.dagrun_details', redirect_url=request.base_url, dag_id=dag.dag_id) }}">
  <meta name="task_url" content="{{ url_for('Airflow.task', dag_id=dag.dag_id) }}">
  <meta name="log_url" content="{{ url_for('Airflow.log', dag_id=dag.dag_id) }}">
  <meta name="xcom_url" content="{{ url_for('Airflow.xcom', dag_id=dag.dag_id) }}">
  <meta name="rendered_templates_url" content="{{ url_for('Airflow.rendered_templates', dag_id=dag.dag_id) }}">
  <meta name="rendered_k8s_url" content="{{ url_for('Airflow.rendered_k8s', dag_id=dag.dag_id) }}">
  <meta name="task_instances_list_url" content="{{ url_for('TaskInstanceModelView.list') }}">
  <meta name="tasks_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_task_endpoint_get_tasks', dag_id=dag.dag_id) }}">
  <meta name="mapped_instances_api" content="{{ url_for('/api/v1.airflow_api_connexion_endpoints_task_instance_endpoint_get_mapped_task_instances', dag_id=dag.dag_id, dag_run_id='_DAG_RUN_ID_', task_id='_TASK_ID_') }}">
  <!-- End Urls -->
  <meta name="is_paused" content="{{ dag_is_paused }}">
  <meta name="csrf_token" content="{{ csrf_token() }}">
  <meta name="k8s_or_k8scelery_executor" content="{{ k8s_or_k8scelery_executor }}">
  {% if dag_model is defined and dag_model.next_dagrun_create_after is defined and dag_model.next_dagrun_create_after is not none %}
    <meta name="next_dagrun_create_after" content="{{ dag_model.next_dagrun_create_after }}">
    <meta name="next_dagrun_data_interval_start" content="{{ dag_model.next_dagrun_data_interval_start }}">
    <meta name="next_dagrun_data_interval_end" content="{{ dag_model.next_dagrun_data_interval_end }}">
  {% endif %}
  {% if show_external_log_redirect is defined %}
    <meta name="show_external_log_redirect" content="{{ show_external_log_redirect }}">
  {% endif %}
  {% if external_log_name is defined %}
  <meta name="external_log_name" content="{{ external_log_name }}">
  {% endif %}
  <meta name="can_edit" content="{{ dag.can_edit }}">
{% endblock %}

{% block content %}
  {% if dag.parent_dag is defined and dag.parent_dag %}
    <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) }}" title="Go to parent DAG">
      <span class="material-icons" aria-hidden="true">keyboard_arrow_up</span>
      DAG: {{ dag.parent_dag.dag_id }}</a>
  {% endif %}

  <div>
    <h3 class="pull-left">
      {% if dag.parent_dag is defined and dag.parent_dag %}
        <span class="text-muted">SUBDAG:</span> {{ dag.dag_id }}
      {% else %}
        {% set can_edit = appbuilder.sm.can_edit_dag(dag.dag_id) %}
        {% if appbuilder.sm.can_edit_dag(dag.dag_id) %}
          {% set switch_tooltip = 'Pause/Unpause DAG' %}
        {% else %}
          {% set switch_tooltip = 'DAG is Paused' if dag_is_paused else 'DAG is Active' %}
        {% endif %}
        <label class="switch-label{{' disabled' if not can_edit else ''  }} js-tooltip" title="{{ switch_tooltip }}">
          <input class="switch-input" id="pause_resume" data-dag-id="{{ dag.dag_id }}"
                 type="checkbox"{{ " checked" if not dag_is_paused else "" }}
                 {{ " disabled" if not can_edit else "" }}>
          <span class="switch" aria-hidden="true"></span>
        </label>
        <span class="text-muted">DAG:</span> {{ dag.dag_id }}
        <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 class="text-muted">ROOT:</span> {{ root }}
      {% endif %}
    </h3>
    <h4 class="pull-right" style="user-select: none;-moz-user-select: auto;">
      {% if state_token is defined and state_token %}
        {{ state_token }}
      {% endif %}
      <a class="label label-default" href="{{ url_for('DagRunModelView.list') }}?_flt_3_dag_id={{ dag.dag_id }}">
        Schedule: {{ dag.schedule_interval }}
      </a>
      {% if dag_model is defined and dag_model and dag_model.timetable_description %}
          <span class="material-icons text-muted js-tooltip" aria-hidden="true" data-original-title="Schedule: {{ dag_model.timetable_description|string }}">info</span>
      {% endif %}
      {% if dag_model is defined and dag_model.next_dagrun is defined %}
        <p class="label label-default js-tooltip" style="margin-left: 5px" id="next-run" data-html="true" data-placement="bottom">
          Next Run: <time datetime="{{ dag_model.next_dagrun }}">{{ dag_model.next_dagrun }}</time>
        </p>
      {% endif %}
    </h4>
  </div>
  <div class="clearfix"></div>
  <br>
  <div>
    <div class="row">
      <div class="col-md-10">
        <ul class="nav nav-pills">
          <li><a href="{{ url_for('Airflow.grid', dag_id=dag.dag_id, num_runs=num_runs_arg, root=root, base_date=base_date_arg) }}">
            <span class="material-icons" aria-hidden="true">grid_on</span>
            Grid
          </a></li>
          <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="material-icons" aria-hidden="true">account_tree</span>
            Graph</a></li>
          <li><a href="{{ url_for('Airflow.calendar', dag_id=dag.dag_id) }}">
            <span class="material-icons" aria-hidden="true">event</span>
            Calendar
          </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="material-icons" aria-hidden="true">hourglass_bottom</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="material-icons" aria-hidden="true">repeat</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="material-icons" aria-hidden="true">flight_land</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="material-icons" aria-hidden="true">vertical_distribute</span>
            Gantt</a></li>
          <li><a href="{{ url_for('Airflow.dag_details', dag_id=dag.dag_id) }}">
            <span class="material-icons" aria-hidden="true">details</span>
            Details</a></li>
          <li><a href="{{ url_for('Airflow.code', dag_id=dag.dag_id, root=root) }}">
            <span class="material-icons" aria-hidden="true">code</span>
            Code</a></li>
          <li><a href="{{ url_for('Airflow.audit_log', dag_id=dag.dag_id, root=root) }}">
            <span class="material-icons" aria-hidden="true">plagiarism</span>
            Audit Log</a></li>
        </ul>
      </div>
      <div class="col-md-2">
        <div class="btn-group pull-right">
          <div class="dropdown">
            <a aria-label="Trigger DAG" class="btn btn-default btn-icon-only{{ ' disabled' if not dag.can_trigger }} trigger-dropdown-btn" data-toggle="dropdown">
              <span class="material-icons" aria-hidden="true">play_arrow</span>
            </a>
            <ul class="dropdown-menu trigger-dropdown-menu">
              <li>
                <form method="POST" action="{{ url_for('Airflow.trigger') }}">
                  <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
                  <input type="hidden" name="dag_id" value="{{ dag.dag_id }}">
                  <input type="hidden" name="unpause" value="True">
                  <input type="hidden" name="origin" value="{{ url_for(request.endpoint, dag_id=dag.dag_id) }}">
                  <button type="submit" class="dropdown-form-btn">Trigger DAG</button>
                </form>
              </li>
              <li><a href="{{ url_for('Airflow.trigger', dag_id=dag.dag_id, origin=url_for(request.endpoint, dag_id=dag.dag_id)) }}">Trigger DAG w/ config</a></li>
            </ul>
          </div>
          <a href="{{ url_for('Airflow.delete', dag_id=dag.dag_id, redirect_url=url_for(request.endpoint, dag_id=dag.dag_id)) }}" title="Delete&nbsp;DAG" class="btn btn-default btn-icon-only{{ ' disabled' if not dag.can_delete }}"
            onclick="return confirmDeleteDag(this, '{{ dag.safe_dag_id }}')" aria-label="Delete DAG">
            <span class="material-icons text-danger" aria-hidden="true">delete_outline</span>
          </a>
        </div>
      </div>
    </div>
  </div>
  {{ dag_docs(doc_md) }}
  <!-- Modal for Task Instance -->
  <div class="modal fade" id="taskInstanceModal" tabindex="-1" role="dialog" aria-labelledby="taskInstanceModalLabel" aria-hidden="true">
    <div class="modal-dialog">
      <div class="modal-content">
        <div class="modal-header">
          <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
          <h4 class="modal-title" id="taskInstanceModalLabel">
            <span class="text-muted">Task Instance:</span> <span id="task_id"></span>
            <br><span class="text-muted">at:</span> <span id="execution_date"></span>
            <span id="modal_map_index"><br><span class="text-muted">Map Index:</span>
              <span class="value"></span>
              <div class="dropdown" id="mapped_dropdown">
                <button class="btn btn-sm dropdown-toggle" type="button" data-toggle="dropdown">
                  <span id="dropdown-label" title="Select Mapped Instance"></span>
                  <span class="caret"></span>
                </button>
                <ul class="dropdown-menu menu-scroll"></ul>
              </div>
            </span>
          </h4>
        </div>
        <div class="modal-body">
          <div id="div_btn_subdag">
            <a id="btn_subdag" class="btn btn-primary" data-base-url="{{ url_for('Airflow.' + dag.default_view, dag_id=dag.dag_id) }}">
              Zoom into Sub DAG
            </a>
            <hr>
          </div>
          <a id="btn_task" class="btn btn-sm" data-base-url="{{ url_for('Airflow.task') }}">
            Instance Details
          </a>
          <a id="btn_rendered" class="btn btn-sm" data-base-url="{{ url_for('Airflow.rendered_templates') }}">
            Rendered
          </a>
          {% if k8s_or_k8scelery_executor %}
            <a id="btn_rendered_k8s" class="btn btn-sm" data-base-url="{{ url_for('Airflow.rendered_k8s') }}">
              K8s Pod Spec
            </a>
          {% endif %}
          <a id="btn_log" class="btn btn-sm" data-base-url="{{ url_for('Airflow.log') }}">
            Log
          </a>
          <a id="btn_xcom" class="btn btn-sm" data-base-url="{{ url_for('Airflow.xcom') }}">
            XCom
          </a>
          <a id="btn_mapped" style="display: none;" class="btn btn-sm" data-base-url="{{ url_for('TaskInstanceModelView.list') }}">
            List Instances, current run
          </a>
          <a id="btn_ti" class="btn btn-sm" data-base-url="{{ url_for('TaskInstanceModelView.list') }}">
            List Instances, all runs
          </a>
          <button id="btn_filter" type="button" class="btn btn-sm" title="Filter on this task and upstream">
            Filter Upstream
          </button>
          <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>
          </div>
          {% if external_log_name is defined %}
            <div id="dag_redir_logs">
              <label style="display:inline"> View Logs in {{ external_log_name }} (by attempts):</label>
              <ul class="nav nav-pills" role="tablist" id="redir_log_try_index" style="display:inline">
              </ul>
              <hr>
              <hr>
            </div>
          {% endif %}
          <h4 id="task_actions">Task Actions</h4>
          <form method="POST" data-action="{{ url_for('Airflow.run') }}" id="run_action">
            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
            <input type="hidden" name="dag_id" value="{{ dag.dag_id }}">
            <input type="hidden" name="task_id">
            <input type="hidden" name="dag_run_id">
            <input type="hidden" name="map_index">
            <input type="hidden" name="origin" value="{{ request.base_url }}">
            <div class="row">
              <span class="btn-group col-xs-12 col-sm-9 task-instance-modal-column" data-toggle="buttons">
                <label
                  class="btn btn-default"
                  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 btn-default"
                  title="Ignore previous success/failure">
                  <input type="checkbox" value="true" name="ignore_ti_state" autocomplete="off">
                  Ignore Task State
                </label>
                <label class="btn btn-default"
                  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>
              <span class="col-xs-12 col-sm-3 task-instance-modal-column">
                <button type="submit" id="btn_run" class="btn btn-primary btn-block" title="Runs a single task instance">
                  Run
                </button>
              </span>
            </div>
            <hr style="margin-bottom: 8px;">
          </form>
          <form method="POST" data-action="{{ url_for('Airflow.clear') }}" id="clear_action">
            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
            <input type="hidden" name="dag_id" value="{{ dag.dag_id }}">
            <input type="hidden" name="task_id">
            <input type="hidden" name="execution_date">
            <input type="hidden" name="map_index">
            <input type="hidden" name="origin" value="{{ request.base_url }}">
            <div class="row">
              <span class="btn-group col-xs-12 col-sm-9 task-instance-modal-column" data-toggle="buttons">
                <label class="btn btn-default btn-sm" title="Also include past task instances when clearing this one">
                  <input type="checkbox" value="true" name="past" autocomplete="off">
                  Past
                </label>
                <label class="btn btn-default btn-sm" title="Also include future task instances when clearing this one">
                  <input type="checkbox" value="true" name="future" autocomplete="off">
                  Future
                </label>
                <label class="btn btn-default btn-sm" title="Also include upstream dependencies">
                  <input type="checkbox" value="true" name="upstream" autocomplete="off">
                  Upstream
                </label>
                <label class="btn btn-default btn-sm active" title="Also include downstream dependencies">
                  <input type="checkbox" value="true" name="downstream" checked autocomplete="off">
                  Downstream
                </label>
                <label class="btn btn-default btn-sm active">
                  <input type="checkbox" value="true" name="recursive" checked autocomplete="off">
                  Recursive
                </label>
                <label class="btn btn-default btn-sm" title="Only consider failed task instances when clearing this one">
                  <input type="checkbox" value="true" name="only_failed" autocomplete="off">
                  Failed
                </label>
              </span>
              <span class="col-xs-12 col-sm-3 task-instance-modal-column">
                <button type="submit" id="btn_clear" class="btn btn-primary btn-block"
                    title="Clearing deletes the previous state of the task instance, allowing it to get re-triggered by the scheduler or a backfill command">
                  Clear
                </button>
              </span>
            </div>
            <hr style="margin-bottom: 8px;">
          </form>
          <form method="GET" data-action="{{ url_for('Airflow.confirm') }}" id="failed_action">
            <input type="hidden" name="dag_id" value="{{ dag.dag_id }}">
            <input type="hidden" name="task_id">
            <input type="hidden" name="dag_run_id">
            <input type="hidden" name="map_index">
            <input type="hidden" name="origin" value="{{ request.base_url }}">
            <input type="hidden" name="state" value="failed">
            <div class="row">
              <span class="btn-group col-xs-12 col-sm-9 task-instance-modal-column" data-toggle="buttons">
                <label class="btn btn-default">
                  <input type="checkbox" value="true" name="past" autocomplete="off">
                  Past
                </label>
                <label class="btn btn-default">
                  <input type="checkbox" value="true" name="future" autocomplete="off">
                  Future
                </label>
                <label class="btn btn-default">
                  <input type="checkbox" value="true" name="upstream" autocomplete="off">
                  Upstream
                </label>
                <label class="btn btn-default">
                  <input type="checkbox" value="true" name="downstream" autocomplete="off">
                  Downstream
                </label>
              </span>
              <span class="col-xs-12 col-sm-3 task-instance-modal-column">
                <button type="submit" id="btn_failed" class="btn btn-primary btn-block">
                  Mark Failed
                </button>
              </span>
            </div>
            <hr style="margin-bottom: 8px;">
          </form>
          <form method="GET" data-action="{{ url_for('Airflow.confirm') }}" id="success_action">
            <input type="hidden" name="dag_id" value="{{ dag.dag_id }}">
            <input type="hidden" name="task_id">
            <input type="hidden" name="dag_run_id">
            <input type="hidden" name="map_index">
            <input type="hidden" name="origin" value="{{ request.base_url }}">
            <input type="hidden" name="state" value="success">
            <div class="row">
              <span class="btn-group col-xs-12 col-sm-9 task-instance-modal-column" data-toggle="buttons">
                <label class="btn btn-default">
                  <input type="checkbox" value="true" name="past" autocomplete="off">
                  Past
                </label>
                <label class="btn btn-default">
                  <input type="checkbox" value="true" name="future" autocomplete="off">
                  Future
                </label>
                <label class="btn btn-default">
                  <input type="checkbox" value="true" name="upstream" autocomplete="off">
                  Upstream
                </label>
                <label class="btn btn-default">
                  <input type="checkbox" value="true" name="downstream" autocomplete="off">
                  Downstream
                </label>
              </span>
              <span class="col-xs-12 col-sm-3 task-instance-modal-column">
                <button type="submit" id="btn_success" class="btn btn-primary btn-block">
                  Mark Success
                </button>
              </span>
            </div>
          </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>
{% endblock %}
{% block tail %}
  {{ super() }}
  <script src="{{ url_for_asset('dag.js') }}"></script>
  <script>
    // Tests rely on confirmDeleteDag to be in the html
    function confirmDeleteDag(link, id) {
      if (confirm(`Are you sure you want to delete '${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;
    }
  </script>
{% endblock %}
