review/web_templates/review.html @ 83f2e11a22be webui

Display skipped comments on the last hunk in the web UI.
author Steve Losh <steve@stevelosh.com>
date Sat, 06 Feb 2010 06:51:10 -0500
parents 91bd7fd0bd98
children 8a546e4e071e
$def with (rd, rcset)

$ ctx = rd.target[rcset.node]
<h2>Changeset ${ ctx.rev() }: ${ ctx.description() }</h2>

$ review_level_comments = filter(lambda c: not c.filename, rcset.comments)
$for comment in review_level_comments:
    <div class="comment">
        <div class="avatar"><img height="52" width="52" src="http://www.gravatar.com/avatar/${ md5(email(comment.author)).hexdigest() }?s=52"/></div>
        <div>
            <div class="author"><a href="mailto:${ email(comment.author) }">${ templatefilters.person(comment.author) }</a> said:</div>
            <div class="message">${ comment.message }</div>
        </div>
    </div>

<div id="comment-review">
    <p class="comment-activate"><a href="">Add a comment on this changeset</a></p>
    <form id="comment-review-form" method="post" action="">
        <div class="field">
            <label for="body">Add a comment on this changeset:</label>
            <textarea cols="60" rows="6" name="body"></textarea>
        </div>
         <div class="buttons">
            <input type="submit" class="button" value="Submit" />
         </div>
    </form>
</div>

<h2>Files</h2>

$for filename, diff in rcset.diffs().iteritems():
    <div class="file-review">
        <div class="filename-header">
            <a class="fold-file" href="">&nbsp;&nbsp;&nbsp;&darr;</a>
            <h3>${ filename }</h3>
        </div>
        
        <div class="file-review-contents">
            $ file_level_comments = filter(lambda c: c.filename == filename and not c.lines, rcset.comments)
            $for comment in file_level_comments:
                <div class="comment">
                    <div class="avatar">
                        <img height="52" width="52" src="http://www.gravatar.com/avatar/${ md5(email(comment.author)).hexdigest() }?s=52"/>
                    </div>
                    <div>
                        <div class="author"><a href="mailto:${ email(comment.author) }">${ templatefilters.person(comment.author) }</a> said:</div>
                        <div class="message">${ comment.message }</div>
                    </div>
                </div>
                
            
            <div id="comment-file">
                <p class="comment-activate"><a href="">Add a comment on this file</a></p>
                <form id="comment-file-form" method="post" action="">
                    <div class="field">
                        <label for="body">Add a comment on this file:</label>
                        <textarea cols="60" rows="6" name="body"></textarea>
                    </div>
                    <div class="buttons">
                        <input type="submit" class="button" value="Submit" />
                    </div>
                    <input type="hidden" name="filename" value="${ filename }" />
                </form>
            </div>
            
            <div class="diff">
                <table>
                    $ max_line = diff['max']
                    $ content = diff['content']
                    $ line_level_comments = filter(lambda c: c.filename == filename and c.lines, rcset.comments)
                    $ previous_n = -1
                    $for n, line in content:
                        $if n - 1 > previous_n:
                            $ skipped_count = n - previous_n
                            $if previous_n == -1:
                                $ skipped_count -= 1
                            <tr class="skipped">
                                <td><code>&hellip; skipped ${ skipped_count } lines &hellip;</code></td>
                            </tr>
                        $ skipped_comments = filter(lambda c: max(c.lines) in range(previous_n + 1, n), line_level_comments)
                        $for comment in skipped_comments:
                            <tr><td class="comment">
                                <div class="avatar"><img height="52" width="52" src="http://www.gravatar.com/avatar/${ md5(email(comment.author)).hexdigest() }?s=52"/></div>
                                <div>
                                    <div class="author"><a href="mailto:${ email(comment.author) }">${ templatefilters.person(comment.author) }</a> said (on a skipped line):</div>
                                    <div class="message">${ comment.message }</div>
                                </div>
                            </td></tr>
                        $ kind = 'rem' if line[0] == '-' else 'add' if line[0] == '+' else 'con'
                        <tr class="${ kind }">
                            <td class="diff-line"><code>${ line[1:] or ' ' }</code></td>
                        </tr>
                        $ line_comments = filter(lambda c: max(c.lines) == n, line_level_comments)
                        $for comment in line_comments:
                            <tr><td class="comment">
                                <div class="avatar"><img height="52" width="52" src="http://www.gravatar.com/avatar/${ md5(email(comment.author)).hexdigest() }?s=52"/></div>
                                <div>
                                    <div class="author"><a href="mailto:${ email(comment.author) }">${ templatefilters.person(comment.author) }</a> said:</div>
                                    <div class="message">${ comment.message }</div>
                                </div>
                            </td></tr>
                        <tr class="comment-line">
                            <td>
                                <form id="comment-line-form" method="post" action="">
                                    <div class="field">
                                        <label for="body">Add a comment on this line:</label>
                                        <textarea cols="60" rows="6" name="body"></textarea>
                                    </div>
                                    <div class="buttons">
                                        <input type="submit" class="button" value="Submit" />
                                    </div>
                                    <input type="hidden" name="filename" value="${ filename }" />
                                    <input type="hidden" name="lines" value="${ n }" />
                                </form>
                            </td>
                        </tr>
                        $ previous_n = n
                    $if previous_n < max_line:
                        $ skipped_count = max_line - previous_n
                        <tr class="skipped">
                            <td><code>&hellip; skipped ${ skipped_count } lines &hellip;</code></td>
                        </tr>
                        $ skipped_comments = filter(lambda c: max(c.lines) in range(previous_n + 1, max_line), line_level_comments)
                        $for comment in skipped_comments:
                            <tr><td class="comment">
                                <div class="avatar"><img height="52" width="52" src="http://www.gravatar.com/avatar/${ md5(email(comment.author)).hexdigest() }?s=52"/></div>
                                <div>
                                    <div class="author"><a href="mailto:${ email(comment.author) }">${ templatefilters.person(comment.author) }</a> said (on a skipped line):</div>
                                    <div class="message">${ comment.message }</div>
                                </div>
                            </td></tr>
                </table>
            </div>
        </div>
    </div>