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

{% block title %}{{c.project.name}} Activity{% endblock %}

{% block header %}
    Activity for
    {% if c.project.is_user_project %}
        {{c.project.user_project_of.display_name}}
    {% else %}
        {{c.project.name}}
    {% endif %}
{% endblock %}

{% block actions %}
    {% if c.user and c.user != c.user.anonymous() and followee != c.user %}
        {{c.follow_toggle.display(following=following)}}
    {% endif %}
{% endblock %}

{% macro activity_obj(o) %}
  <a href="{{o.activity_url}}">{{o.activity_name}}</a>
{% endmacro %}

{% macro icon(o, size, className) -%}
  {% if o.activity_extras.get('icon_url') %}
    <img src="{{ o.activity_extras.get('icon_url') }}"
         alt="{{ o.activity_name }}"
         title="{{ o.activity_name }}"
         class="emboss{% if size %} x{{size}}{% endif %}{% if className %} {{className}}{% endif %}">
  {% else %}
    <b data-icon="{{g.icons['user'].char}}" class="ico emboss {{g.icons['user'].css}}{% if size %} x{{size}}{% endif %}{% if className %} {{className}}{% endif %}"></b>
  {% endif %}
{%- endmacro %}

{% block content %}
<div class="activity">
  {% if not timeline %}
    No activity to display.
  {% else %}
    <ul class="timeline">
        {% for a in timeline %}
        <li>
          <time datetime="{{a.published|datetimeformat}}" title="{{a.published|datetimeformat}}">{{h.ago(a.published, show_date_after=None)}}</time>
          <h1>{{activity_obj(a.actor)}} {{a.verb}} {{activity_obj(a.obj)}} {% if a.target.activity_name %}on {{activity_obj(a.target)}}{% endif %}</h1>
          {% if a.obj.activity_extras.get('summary') %}
          <p>
            {{ icon(a.actor, 16, 'avatar') }}
            {{ a.obj.activity_extras.get('summary') }}
          </p>
          {% endif %}
        </li>
        {% endfor %}
    </ul>
  {% endif %}
</div>
{% endblock %}
