{#-
       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 g.theme.master %}

{% block title %}{{c.project.name}} / {{c.app.config.options.mount_label}}: {{post.title}}{% endblock %}

{% block header %}{{post.title}}{% endblock %}

{% block actions %}
  {% if h.has_access(post, 'write')() %}
    {{ g.icons['edit'].render(href='edit') }}
  {% endif %}
  {{ g.icons['history'].render(href='history') }}
  {% if c.user and c.user != c.user.anonymous() %}
    {{c.subscribe_form.display(value=subscribed, action='subscribe', style='icon')}}
  {% endif %}
  {{ g.icons['feed'].render(href='feed.rss', title='RSS', rel='nofollow') }}
{% endblock %}

{% block content %}
    {{c.form.display(value=post, base_post=base_post)}}
    <div class="grid-19">
        {{c.attachment_list.display(attachments=post.attachments, edit_mode=h.has_access(post, 'edit')())}}
    </div>
    {% if post.discussion_thread and c.app.show_discussion %}
    <div style="margin-top: 10px">
      {{c.thread.display(value=post.discussion_thread,page=page,limit=limit,count=count)}}
    </div>
    {% endif %}
{% endblock %}
