{#-
       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.
-#}
{% set hide_left_bar = True %}
{% extends "allura:templates/user_account_base.html" %}

{% block title %}{{c.user.username}} / Disable account{% endblock %}

{% block header %}Disable account for {{c.user.username}}{% endblock %}

{% block content %}
  {{ super() }}
  <div class='grid-20'>
    <h2>Disable account</h2>
    {% if my_projects %}
    <p>
      Currently you are an admin of the following projects.
      These projects would be orphaned unless they have another admin.
      <ul>
        {% for p in my_projects %}
          <li><a href="{{ p.url() }}">{{ p.name }}</a></li>
        {% endfor %}
      </ul>
    </p>
    {% endif %}
    <p>
    Are you really sure you want to disable your account?
    If so, enter account password below to confirm.
    </p>
    {{ form.display(action='do_disable') }}
  </div>
{% endblock %}
