Commits

jdre...@13f79535-47bb-0310-9956-ffa450edef68  committed 122dbc2

Updated styling of comment history, towards #471.
Changed styling of attachment download icon to use background-image instead of an img inserted on the page.
Removed outdated screenshot.png because it doesn't appear to be used.

  • Participants
  • Parent commits a71345c

Comments (0)

Files changed (9)

File bloodhound_theme/bhtheme/htdocs/bloodhound.css

  font-weight: normal;
 }
 
-.activityfeed img {
- display: none;
-}
-
-.activityfeed dt {
- font-weight: normal;
-}
-
-.activityfeed dd {
- color: grey;
-}
-
-.activityfeed * tt {
- word-wrap: break-word;
- word-break: break-all;
+.activityfeed {
+  background-image: url("/main/chrome/theme/img/change_history_arrow_line.png");
+  background-repeat: repeat-y;
+  background-position: 20px 0px;
 }
 
 #mobile-activity {
  margin-top: 10px;
 }
 
-.comment {
- margin-bottom: 10px;
- padding-left: 10px;
-}
-
 .comment-meta {
  overflow: hidden;
 }
 
 
 #changelog div.comment-box{
- border: 2px solid #999999;
- border-radius: 8px 8px 8px 8px;
+ border: 1px solid #ccc;
+ border-radius: 6px;
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05) inset;
- padding: 2px 4px 2px 4px;
+ padding: 13px;
  margin: 10px 0px 10px 10px;
+ background-color: rgb(253, 252, 250);
  min-height: 20px;
+
+#changelog div.comment-box h4 {
+  margin-top: 0px;
 }
+
+#changelog ul {
+  list-style-image: url('../common/collapsed.png');
+  padding: 0px 0px 0px 11px;
+}
+
 .ticket form#prefs input[type="radio"]{
  display: none;
 }

File bloodhound_theme/bhtheme/htdocs/img/change_history_arrow_line.png

Added
New image

File bloodhound_theme/bhtheme/htdocs/img/screenshot.png

Removed
Old image

File bloodhound_theme/bhtheme/templates/bh_dir_entries.html

       <td class="size">
         <span title="${_('%(size)s bytes', size=entry.content_length)}">${pretty_size(entry.content_length)}</span>
         <a py:if="entry.raw_href" href="$entry.raw_href" class="${'trac-ziplink' if isdir else 'trac-rawlink'}"                       
-           title="${_('Download as Zip archive') if isdir else _('Download')}">&#8203;<i class="icon-download-alt"></i></a>
+           title="${_('Download as Zip archive') if isdir else _('Download')}">&#8203;</a>
       </td>
       <td class="rev">
         <a title="View Revision Log" href="${href.log(reponame, entry.path, rev=rev)}">${display_rev(entry.created_rev)}</a>

File bloodhound_theme/bhtheme/templates/bh_list_of_attachments.html

     <i class="icon-file"></i>
     <i18n:msg params="file, size, author, date">
       <a href="${url_of(attachment.resource)}" title="View attachment">${attachment.filename
-        }</a><a href="${url_of(attachment.resource, format='raw')}" class="trac-rawlink" title="Download"><i class="icon-download-alt"></i></a>
+        }</a><a href="${url_of(attachment.resource, format='raw')}" class="trac-rawlink" title="Download"></a>
        (<span title="${_('%(size)s bytes', size=attachment.size)}">${pretty_size(attachment.size)}</span>) -
       added by <em>${authorinfo(attachment.author)}</em> ${pretty_dateinfo(attachment.date)}.
     </i18n:msg>

File bloodhound_theme/bhtheme/templates/bh_repository_index.html

             </em>
           </td>
           <td class="size">
-            <a py:if="raw_href" class="trac-ziplink" href="$raw_href" title="Download as Zip archive">&#8203;<i class="icon-download-alt"></i></a>
+            <a py:if="raw_href" class="trac-ziplink" href="$raw_href" title="Download as Zip archive">&#8203;</a>
           </td>
           <td class="rev">
             <py:if test="change and not err">

File bloodhound_theme/bhtheme/templates/bh_ticket.html

         </div>
         </div>
         
-        <div py:if="ticket.exists" class="$cols_activity">
-          <div>
-            <form id="prefs" method="get" action="${href.prefs()}">
-              <div id="trac-comments-order" style="display: inline" class="pull-right">
-                <input type="radio" id="trac-comments-newest" name="trac-comments-order" value="newest" />
-                <label for="trac-comments-newest">
-                  <span>Newest first</span>
+        <div py:if="ticket.exists" class="$cols_activity activityfeed">
+          <form id="prefs" method="get" action="${href.prefs()}">
+            <div id="trac-comments-order" style="display: inline" class="pull-right">
+              <input type="radio" id="trac-comments-newest" name="trac-comments-order" value="newest" />
+              <label for="trac-comments-newest">
+                <span>Newest first</span>
+              </label>
+              <input type="radio" id="trac-comments-oldest" name="trac-comments-order" value="oldest" checked="checked" />
+              <label for="trac-comments-oldest">
+                <span>Oldest first</span>
+              </label>
+              <span id="trac-threaded-toggle" style="display: none">
+                <input type="radio" id="trac-comments-threaded" name="trac-comments-order" value="threaded" />
+                <label for="trac-comments-threaded">
+                  <span>Threaded</span>
                 </label>
-                <input type="radio" id="trac-comments-oldest" name="trac-comments-order" value="oldest" checked="checked" />
-                <label for="trac-comments-oldest">
-                  <span>Oldest first</span>
-                </label>
-                <span id="trac-threaded-toggle" style="display: none">
-                  <input type="radio" id="trac-comments-threaded" name="trac-comments-order" value="threaded" />
-                  <label for="trac-comments-threaded">
-                    <span>Threaded</span>
+              </span>
+            </div>
+            <div style="display: none">
+              <input id="trac-comments-only-toggle" type="checkbox" />
+              <label for="trac-comments-only-toggle">
+                <span class="label">Comments only</span>
+              </label>
+            </div>
+          </form>
+          
+          <div class="row">
+            <div class="$cols_activity">
+            <form py:if="has_property_editor" method="post" id="propertyform"
+                    action="${href.ticket(ticket.id) + '#trac-add-comment' if ticket.exists
+                              else href.newticket() + '#ticket'}">
+              <div py:if="ticket.exists and can_append">
+                <!--! Add comment -->
+                <div id="trac-add-comment" class="field">
+                  <div class="trac-nav">
+                    <a href="#content" title="View ticket fields and description">View</a> &uarr;
+                  </div>
+                  <div id="trac-edit-warning" class="warning system-message alert"
+                        style="${'display: none' if start_time == ticket['changetime'] else None}"
+                        i18n:msg="">
+                    <span class="label label-warning">Warning</span>
+                    This ticket has been modified since you started editing. You should review the
+                    <em class="trac-new">other modifications</em> which have been appended above,
+                    and any <em class="trac-conflict">conflicts</em> shown in the preview below.
+                    You can nevertheless proceed and submit your changes if you wish so.
+                  </div>
+                  <!--! Comment field -->
+                  <fieldset class="iefix">
+                    <textarea id="comment" name="comment" class="trac-resizable $cols_activity" rows="5">${comment}</textarea>
+                    <py:if test="ticket.exists">
+                      <input type="submit" class="btn pull-right" name="submit" value="${_('Submit')}" />
+                    </py:if>
+                    <label for="comment" class="help-block" i18n:msg="">
+                      <span class="label label-info">Tip</span>
+                      You may use
+                      <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a>
+                      here.
+                    </label>
+                  </fieldset>
+                </div>
+              </div>
+  
+              <div>
+                <h2 py:if="ticket.exists" class="foldable">Modify Ticket</h2>
+                <div id="modify" class="well">
+                  <!--! Properties -->
+                  <fieldset id="properties" py:if="can_modify or can_edit or can_create"
+                            py:with="fields = [f for f in fields if not f.skip and f.name != 'product']">
+                    <legend py:choose="">
+                      <py:when test="ticket.exists">Change Properties</py:when>
+                      <py:otherwise>Properties</py:otherwise>
+                    </legend>
+  
+                    <table id="modifyproperties">
+                      <tr py:if="can_modify or can_create">
+                        <td colspan="2">
+                          <label for="field-product-name">Product:</label>
+                           <input type="text" disabled="disabled" class="${'span2' if ticket.exists else 'span7'}"
+                            id="field-product-name" name="field_product_name"
+                            value="$req.perm.env.product.name ($req.perm.env.product.prefix)" />
+                          <input type="hidden" id="field-product" name="field_product" value="$req.perm.env.product.prefix" />
+                        </td>
+                      </tr>
+
+                      <tr py:if="can_modify or can_create">
+                        <td colspan="2">
+                          <label for="field-summary">Summary:</label>
+                          <input class="${'span4' if ticket.exists else 'span7'}" type="text" id="field-summary" name="field_summary" value="$ticket.summary" />
+                        </td>
+                      </tr>
+  
+                      <tr py:if="only_for_admin">
+                        <td colspan="2">
+                          <label for="field-reporter">Reporter:</label>
+                          <input class="${'span2' if ticket.exists else 'span7'}" type="text" id="field-reporter" name="field_reporter" value="${ticket.reporter}" />
+                        </td>
+                      </tr>
+  
+                      <tr py:if="can_edit or can_create">
+                        <td colspan="2">
+                          <label for="field-description">Description:</label>
+                          <fieldset class="iefix">
+                            <textarea id="field-description" name="field_description"
+                                      class="span7 wikitext trac-resizable" rows="10">${ticket.description}</textarea>
+                            <label for="field-description" id="field-description-help" class="help-block pull-right" i18n:msg="">
+                              <span class="label label-info">Tip</span>
+                              You may use
+                              <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a> here.
+                            </label>
+                          </fieldset>
+                        </td>
+                      </tr>
+  
+                      <tr py:for="row in group(fields, 2, lambda f: f.type != 'textarea')"
+                          py:if="can_modify or can_create">
+                        <py:for each="idx, field in enumerate(row)"
+                                py:with="value = ticket.get_value_or_default(field.name)">
+                          <td>
+                            <label for="field-${field.name}" py:if="field" id="${'editor-' + field.name}"
+                                    i18n:msg="field">${field.edit_label or field.label or field.name}:</label>
+                            <py:choose test="field.type" py:if="field">
+                              <select py:when="'select'" id="field-${field.name}" name="field_${field.name}"
+                                  class="${'span2' if ticket.exists else 'span3'}">
+                                <option py:if="field.optional"></option>
+                                <option py:for="option in field.options"
+                                        selected="${value == option or None}"
+                                        value="$option" py:content="option"></option>
+                                <optgroup py:for="optgroup in field.optgroups"
+                                          py:if="optgroup.options"
+                                          label="${optgroup.label}">
+                                  <option py:for="option in optgroup.options"
+                                          selected="${value == option or None}"
+                                          value="$option" py:content="option"></option>
+                                </optgroup>
+                              </select>
+                              <textarea py:when="'textarea'" id="field-${field.name}" name="field_${field.name}"
+                                        cols="${field.width}" rows="${field.height}"
+                                        class="${'wikitext ' if field.format == 'wiki' else None}trac-resizable">${value}</textarea>
+                              <span py:when="'checkbox'">
+                                <input type="checkbox" id="field-${field.name}" name="field_${field.name}"
+                                        checked="${value == '1' or None}" value="1" />
+                                <input type="hidden" name="field_checkbox_${field.name}" value="1" />
+                              </span>
+                              <label py:when="'radio'" class="checkbox inline"
+                                      py:for="idx, option in enumerate(field.options)">
+                                <input type="radio" name="field_${field.name}" value="${option}"
+                                        checked="${value == option or None}" />
+                                ${option}
+                              </label>
+                              <py:otherwise><!--! Text input fields -->
+                                <py:choose>
+                                  <span py:when="field.cc_entry"><!--! Special case for Cc: field -->
+                                    <em>${field.cc_entry}</em>
+                                    <input type="checkbox" id="field-cc" name="cc_update"
+                                      title="This checkbox allows you to add or remove yourself from the CC list."
+                                      checked="${field.cc_update}" />
+                                  </span>
+                                  <!--! Cc: when TICKET_EDIT_CC is allowed -->
+                                  <span py:when="field.name == 'cc'">
+                                    <input type="text" id="field-${field.name}"
+                                      title="Space or comma delimited email addresses and usernames are accepted."
+                                      name="field_${field.name}" value="${value}" />
+                                  </span>
+                                  <!--! All the other text input fields -->
+                                  <input py:otherwise="" type="text" id="field-${field.name}"
+                                    name="field_${field.name}" value="${value}" />
+                                </py:choose>
+                              </py:otherwise>
+                            </py:choose>
+                          </td>
+                        </py:for>
+                      </tr>
+                    </table>
+                  </fieldset>
+  
+                  <!--! Workflow support -->
+                  <py:if test="ticket.exists"> <!--! do not display the actions for New tickets -->
+                    <py:choose>
+                      <fieldset py:when="can_append or can_modify" id="action">
+                        <legend>Action</legend>
+                        <xi:include href="bh_ticket_actions.html" />
+                      </fieldset>
+                      <py:otherwise>
+                        <py:for each="key, label, controls, hints in action_controls">
+                          <input py:if="key == action" type="hidden" name="action" value="$action" />
+                        </py:for>
+                      </py:otherwise>
+                    </py:choose>
+                  </py:if>
+                </div>
+              </div>
+  
+              <div class="$colspan">
+                <!--! Preview of ticket changes -->
+                <div py:if="ticket.exists and can_append" id="ticketchange" class="ticketdraft"
+                      style="${'display: none' if not (change_preview.fields or change_preview.comment)
+                                                  or cnum_edit is not None else None}">
+                  <xi:include href="bh_ticket_change.html" py:with="change = change_preview; preview = True"/>
+                </div>
+              </div>
+  
+              <div class="$colspan">
+                <!--! Author or Reporter -->
+                <div py:if="authname == 'anonymous'" class="field">
+                  <fieldset py:choose="">
+                    <legend py:when="ticket.exists">Author</legend>
+                    <legend py:otherwise="">Reporter</legend>
+                    <table>
+                      <tr>
+                        <th>
+                          <label for="author">Your email or username:</label><br />
+                        </th>
+                        <td>
+                          <input type="text" id="author" name="author" size="40" value="$author_id" />
+                          <br />
+                        </td>
+                      </tr>
+                    </table>
+                    <p py:if="author_id == 'anonymous'" class="hint">
+                      <i18n:msg>E-mail address and user name can be saved in the <a href="${href.prefs()}">Preferences</a>.</i18n:msg>
+                    </p>
+                  </fieldset>
+                </div>
+  
+                <!--! Attachment on creation checkbox -->
+                <p py:if="not ticket.exists and 'ATTACHMENT_CREATE' in perm(ticket.resource.child('attachment'))">
+                  <label>
+                    <input type="checkbox" name="attachment" checked="${'attachment' in req.args or None}" />
+                    I have files to attach to this ticket
                   </label>
-                </span>
-              </div>
-              <div style="display: none">
-                <input id="trac-comments-only-toggle" type="checkbox" />
-                <label for="trac-comments-only-toggle">
-                  <span class="label">Comments only</span>
-                </label>
+                </p>
+  
+                <div py:if="ticket.exists" class="trac-nav">
+                  <a href="#attachments" title="Go to the list of attachments">Attachments</a> &uarr;
+                </div>
+                <div class="buttons">
+                  <py:if test="ticket.exists">
+                    <input type="hidden" name="start_time" value="${to_utimestamp(start_time)}" />
+                    <input type="hidden" name="view_time" value="${to_utimestamp(ticket['changetime'])}" />
+                    <input type="hidden" name="replyto" value="${replyto}" />
+                  </py:if>
+                  <py:if test="not ticket.exists">
+                    <input type="submit" class="btn" name="preview" value="${_('Preview')}" accesskey="r" />&nbsp;
+                    <input type="submit" class="btn" name="submit" value="${_('Submit') if ticket.exists else _('Create ticket')}" />
+                  </py:if>
+                </div>
               </div>
             </form>
-            
-            <div class="row">
-              <div class="$cols_activity">
-              <form py:if="has_property_editor" method="post" id="propertyform"
-                      action="${href.ticket(ticket.id) + '#trac-add-comment' if ticket.exists
-                                else href.newticket() + '#ticket'}">
-                <div py:if="ticket.exists and can_append">
-                  <!--! Add comment -->
-                  <div id="trac-add-comment" class="field">
-                    <div class="trac-nav">
-                      <a href="#content" title="View ticket fields and description">View</a> &uarr;
-                    </div>
-                    <div id="trac-edit-warning" class="warning system-message alert"
-                          style="${'display: none' if start_time == ticket['changetime'] else None}"
-                          i18n:msg="">
-                      <span class="label label-warning">Warning</span>
-                      This ticket has been modified since you started editing. You should review the
-                      <em class="trac-new">other modifications</em> which have been appended above,
-                      and any <em class="trac-conflict">conflicts</em> shown in the preview below.
-                      You can nevertheless proceed and submit your changes if you wish so.
-                    </div>
-                    <!--! Comment field -->
-                    <fieldset class="iefix">
-                      <textarea id="comment" name="comment" class="trac-resizable $cols_activity" rows="5">${comment}</textarea>
-                      <py:if test="ticket.exists">
-                        <input type="submit" class="btn pull-right" name="submit" value="${_('Submit')}" />
-                      </py:if>
-                      <label for="comment" class="help-block" i18n:msg="">
-                        <span class="label label-info">Tip</span>
-                        You may use
-                        <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a>
-                        here.
-                      </label>
-                    </fieldset>
-                  </div>
-                </div>
-    
-                <div>
-                  <h2 py:if="ticket.exists" class="foldable">Modify Ticket</h2>
-                  <div id="modify" class="well">
-                    <!--! Properties -->
-                    <fieldset id="properties" py:if="can_modify or can_edit or can_create"
-                              py:with="fields = [f for f in fields if not f.skip and f.name != 'product']">
-                      <legend py:choose="">
-                        <py:when test="ticket.exists">Change Properties</py:when>
-                        <py:otherwise>Properties</py:otherwise>
-                      </legend>
-    
-                      <table id="modifyproperties">
-                        <tr py:if="can_modify or can_create">
-                          <td colspan="2">
-                            <label for="field-product-name">Product:</label>
-                             <input type="text" disabled="disabled" class="${'span2' if ticket.exists else 'span7'}"
-                              id="field-product-name" name="field_product_name"
-                              value="$req.perm.env.product.name ($req.perm.env.product.prefix)" />
-                            <input type="hidden" id="field-product" name="field_product" value="$req.perm.env.product.prefix" />
-                          </td>
-                        </tr>
-
-                        <tr py:if="can_modify or can_create">
-                          <td colspan="2">
-                            <label for="field-summary">Summary:</label>
-                            <input class="${'span4' if ticket.exists else 'span7'}" type="text" id="field-summary" name="field_summary" value="$ticket.summary" />
-                          </td>
-                        </tr>
-    
-                        <tr py:if="only_for_admin">
-                          <td colspan="2">
-                            <label for="field-reporter">Reporter:</label>
-                            <input class="${'span2' if ticket.exists else 'span7'}" type="text" id="field-reporter" name="field_reporter" value="${ticket.reporter}" />
-                          </td>
-                        </tr>
-    
-                        <tr py:if="can_edit or can_create">
-                          <td colspan="2">
-                            <label for="field-description">Description:</label>
-                            <fieldset class="iefix">
-                              <textarea id="field-description" name="field_description"
-                                        class="span7 wikitext trac-resizable" rows="10">${ticket.description}</textarea>
-                              <label for="field-description" id="field-description-help" class="help-block pull-right" i18n:msg="">
-                                <span class="label label-info">Tip</span>
-                                You may use
-                                <a tabindex="42" href="${href.wiki('WikiFormatting')}">WikiFormatting</a> here.
-                              </label>
-                            </fieldset>
-                          </td>
-                        </tr>
-    
-                        <tr py:for="row in group(fields, 2, lambda f: f.type != 'textarea')"
-                            py:if="can_modify or can_create">
-                          <py:for each="idx, field in enumerate(row)"
-                                  py:with="value = ticket.get_value_or_default(field.name)">
-                            <td>
-                              <label for="field-${field.name}" py:if="field" id="${'editor-' + field.name}"
-                                      i18n:msg="field">${field.edit_label or field.label or field.name}:</label>
-                              <py:choose test="field.type" py:if="field">
-                                <select py:when="'select'" id="field-${field.name}" name="field_${field.name}"
-                                    class="${'span2' if ticket.exists else 'span3'}">
-                                  <option py:if="field.optional"></option>
-                                  <option py:for="option in field.options"
-                                          selected="${value == option or None}"
-                                          value="$option" py:content="option"></option>
-                                  <optgroup py:for="optgroup in field.optgroups"
-                                            py:if="optgroup.options"
-                                            label="${optgroup.label}">
-                                    <option py:for="option in optgroup.options"
-                                            selected="${value == option or None}"
-                                            value="$option" py:content="option"></option>
-                                  </optgroup>
-                                </select>
-                                <textarea py:when="'textarea'" id="field-${field.name}" name="field_${field.name}"
-                                          cols="${field.width}" rows="${field.height}"
-                                          class="${'wikitext ' if field.format == 'wiki' else None}trac-resizable">${value}</textarea>
-                                <span py:when="'checkbox'">
-                                  <input type="checkbox" id="field-${field.name}" name="field_${field.name}"
-                                          checked="${value == '1' or None}" value="1" />
-                                  <input type="hidden" name="field_checkbox_${field.name}" value="1" />
-                                </span>
-                                <label py:when="'radio'" class="checkbox inline"
-                                        py:for="idx, option in enumerate(field.options)">
-                                  <input type="radio" name="field_${field.name}" value="${option}"
-                                          checked="${value == option or None}" />
-                                  ${option}
-                                </label>
-                                <py:otherwise><!--! Text input fields -->
-                                  <py:choose>
-                                    <span py:when="field.cc_entry"><!--! Special case for Cc: field -->
-                                      <em>${field.cc_entry}</em>
-                                      <input type="checkbox" id="field-cc" name="cc_update"
-                                        title="This checkbox allows you to add or remove yourself from the CC list."
-                                        checked="${field.cc_update}" />
-                                    </span>
-                                    <!--! Cc: when TICKET_EDIT_CC is allowed -->
-                                    <span py:when="field.name == 'cc'">
-                                      <input type="text" id="field-${field.name}"
-                                        title="Space or comma delimited email addresses and usernames are accepted."
-                                        name="field_${field.name}" value="${value}" />
-                                    </span>
-                                    <!--! All the other text input fields -->
-                                    <input py:otherwise="" type="text" id="field-${field.name}"
-                                      name="field_${field.name}" value="${value}" />
-                                  </py:choose>
-                                </py:otherwise>
-                              </py:choose>
-                            </td>
-                          </py:for>
-                        </tr>
-                      </table>
-                    </fieldset>
-    
-                    <!--! Workflow support -->
-                    <py:if test="ticket.exists"> <!--! do not display the actions for New tickets -->
-                      <py:choose>
-                        <fieldset py:when="can_append or can_modify" id="action">
-                          <legend>Action</legend>
-                          <xi:include href="bh_ticket_actions.html" />
-                        </fieldset>
-                        <py:otherwise>
-                          <py:for each="key, label, controls, hints in action_controls">
-                            <input py:if="key == action" type="hidden" name="action" value="$action" />
-                          </py:for>
-                        </py:otherwise>
-                      </py:choose>
-                    </py:if>
-                  </div>
-                </div>
-    
-                <div class="$colspan">
-                  <!--! Preview of ticket changes -->
-                  <div py:if="ticket.exists and can_append" id="ticketchange" class="ticketdraft"
-                        style="${'display: none' if not (change_preview.fields or change_preview.comment)
-                                                    or cnum_edit is not None else None}">
-                    <xi:include href="bh_ticket_change.html" py:with="change = change_preview; preview = True"/>
-                  </div>
-                </div>
-    
-                <div class="$colspan">
-                  <!--! Author or Reporter -->
-                  <div py:if="authname == 'anonymous'" class="field">
-                    <fieldset py:choose="">
-                      <legend py:when="ticket.exists">Author</legend>
-                      <legend py:otherwise="">Reporter</legend>
-                      <table>
-                        <tr>
-                          <th>
-                            <label for="author">Your email or username:</label><br />
-                          </th>
-                          <td>
-                            <input type="text" id="author" name="author" size="40" value="$author_id" />
-                            <br />
-                          </td>
-                        </tr>
-                      </table>
-                      <p py:if="author_id == 'anonymous'" class="hint">
-                        <i18n:msg>E-mail address and user name can be saved in the <a href="${href.prefs()}">Preferences</a>.</i18n:msg>
-                      </p>
-                    </fieldset>
-                  </div>
-    
-                  <!--! Attachment on creation checkbox -->
-                  <p py:if="not ticket.exists and 'ATTACHMENT_CREATE' in perm(ticket.resource.child('attachment'))">
-                    <label>
-                      <input type="checkbox" name="attachment" checked="${'attachment' in req.args or None}" />
-                      I have files to attach to this ticket
-                    </label>
-                  </p>
-    
-                  <div py:if="ticket.exists" class="trac-nav">
-                    <a href="#attachments" title="Go to the list of attachments">Attachments</a> &uarr;
-                  </div>
-                  <div class="buttons">
-                    <py:if test="ticket.exists">
-                      <input type="hidden" name="start_time" value="${to_utimestamp(start_time)}" />
-                      <input type="hidden" name="view_time" value="${to_utimestamp(ticket['changetime'])}" />
-                      <input type="hidden" name="replyto" value="${replyto}" />
-                    </py:if>
-                    <py:if test="not ticket.exists">
-                      <input type="submit" class="btn" name="preview" value="${_('Preview')}" accesskey="r" />&nbsp;
-                      <input type="submit" class="btn" name="submit" value="${_('Submit') if ticket.exists else _('Create ticket')}" />
-                    </py:if>
-                  </div>
-                </div>
-              </form>
+            </div>
+            </div>
+          <div id="changelog">
+            <!--! add comment + modify ticket -->
+            <py:for each="change in changes">
+              <div class="change${' trac-new' if change.date > start_time and 'attachment' not in change.fields else None}"
+                    id="${'trac-change-%d-%d' % (change.cnum, to_utimestamp(change.date)) if 'cnum' in change else None}">
+                <xi:include href="bh_ticket_change.html"/>
               </div>
-              </div>
-            <div id="changelog">
-              <!--! add comment + modify ticket -->
-              
-              <py:for each="change in changes">
-                <div class="change${' trac-new' if change.date > start_time and 'attachment' not in change.fields else None}"
-                      id="${'trac-change-%d-%d' % (change.cnum, to_utimestamp(change.date)) if 'cnum' in change else None}">
-                  <xi:include href="bh_ticket_change.html"/>
-                </div>
-              </py:for>
-            </div>
+            </py:for>
           </div>
-        </div>
-
+      </div>
       </div>
     </div>
 

File bloodhound_theme/bhtheme/templates/bh_ticket_change.html

   <div class="visible-desktop-hover" py:if="change.comment">
     <div py:if="cnum" class="comment-box" id="${'comment:' + str(cnum) if cnum else ''}">
       <div>
-        <h4 class="change">
+        <h4 class="change" style="display: inline-block;">        
+          ${authorinfo(change.author)}
+          <span py:if="preview or show_editor" class="trac-loading"/>
+        </h4>
         <div class="pull-right">
           <span py:if="'cnum' in change" id="comment:$cnum" class="cnum">${commentref('comment:', cnum)}</span>
         </div>
             </div>
           </form>
         </div>
-        
-          ${authorinfo(change.author)}
-          <span py:if="preview or show_editor" class="trac-loading"/>
-        </h4>
         <form py:if="show_editor" id="trac-comment-editor" method="post"
               action="${href.ticket(ticket.id) + '#comment:%d' % cnum}">
           <div>
     </h4>
   </div >
   </py:if>
-  <ul py:if="change.fields" class="changes ">
+  <ul py:if="change.fields" class="changes">
     <li py:for="field_name, field in sorted(change.fields.iteritems(), key=lambda item: item[1].label.lower())"
         class="trac-field-${field_name}${'trac-conflict' if preview and field_name in conflicts else None} visible-desktop-hover">
       <strong class="trac-field-${field_name}">${field.label}</strong>

File trac/trac/wiki/formatter.py

         local_url = self.env.project_url or \
                     (self.req or self.env).abs_href.base
         if not url.startswith(local_url):
-            return tag.a(tag.span(u'\u200b', class_="icon"), text,
+            return tag.a(text, tag.span(u'\u200b', class_="icon"),
                          class_="ext-link", href=url, title=title or None)
         else:
             return tag.a(text, href=url, title=title or None)