<!--
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 "userpage.html" %}

{% block content %}

<h1>Instructions Home</h1>

<div class="instructions" >
  <a href="{% url 'op_tasks:exp_instruct' %}">
    <h3>
      {% if not user.userprofile.exp_inst_complete %}
        <div class="task-current">
          <span class="glyphicon glyphicon-unchecked"></span>
          Experiment Information and Instructions
        </div>
      {% elif user.userprofile.exp_inst_complete %}
        <span class="glyphicon glyphicon-check"></span>
        Experiment Information and Instructions
      {% endif %}
    </h3>
  </a>
</div>

<div class="instructions" >
  <a href="{% url 'op_tasks:portal_instruct' %}">
    <h3>
      {% if not user.userprofile.portal_inst_complete %}
        <div class="task-current">
          <span class="glyphicon glyphicon-unchecked"></span>
          Portal Guide
        </div>
      {% elif user.userprofile.portal_inst_complete %}
        <span class="glyphicon glyphicon-check"></span>
        Portal Guide
      {% endif %}
    </h3>
  </a>
</div>

<!-- <div class="instructions" >
  <a href="{% url 'op_tasks:product_instruct' %}">
    <h3>
      {% if not user.userprofile.task_inst_complete %}
        <div class="task-current">
          <span class="glyphicon glyphicon-unchecked"></span>
          {{product.name}} Information and Instructions
        </div>
      {% elif user.userprofile.task_inst_complete %}
        <span class="glyphicon glyphicon-check"></span>
        {{product.name}} Information and Instructions
      {% endif %}
    </h3>
  </a>
</div> -->

{% if user.userprofile.exp_inst_complete and user.userprofile.portal_inst_complete %}
<hr>
<h4>Thank you for completing the instructions.</h4>
<h4>These links will remain active if you need to review the instructions again in the future.</h4>  
<h4>Please return to your <a href="{% url 'op_tasks:task_list' %}">task list</a> to complete all tasks</h4>
{% endif %}
{% endblock %}