view kallithea/templates/changeset/diff_block.html @ 6193:dc4cb1d4e084

diff: rework data structure used by diff_block.diff_block (used for changeset diffs) Make it a pure reusable function that also can replace diff_block_simple. Improve code clarity by using Python tuples for tuples. fid and url_fid are just shuffled around - not cleaned up for now.
author Mads Kiilerich <madski@unity3d.com>
date Tue, 06 Sep 2016 00:51:18 +0200
parents 72acb38da217
children 4034992774fa
line wrap: on
line source

## -*- coding: utf-8 -*-

<%def name="diff_block(a_repo_name, a_ref_type, a_ref_name, a_rev,
                       cs_repo_name, cs_ref_name, cs_ref_type, cs_rev,
                       file_diff_data)">
<div class="diff-collapse">
    <span target="${'diff-container-%s' % (id(file_diff_data))}" class="diff-collapse-button">&uarr; ${_('Collapse Diff')} &uarr;</span>
</div>
<div class="diff-container" id="${'diff-container-%s' % (id(file_diff_data))}">
%for id_fid, (url_fid, op, filename, diff, stats) in file_diff_data.iteritems():
    ${diff_block_diffblock(id_fid, url_fid, op, filename, diff,
        a_repo_name, a_rev, a_ref_type, a_ref_name,
        cs_repo_name, cs_rev, cs_ref_type, cs_ref_name)}
%endfor
</div>
</%def>

<%def name="diff_block_simple(files, changes)">
<div class="diff-collapse">
    <span target="${'diff-container-%s' % (id(changes))}" class="diff-collapse-button">&uarr; ${_('Collapse Diff')} &uarr;</span>
</div>
<div class="diff-container" id="${'diff-container-%s' % (id(changes))}">
  %for fid, ch, f, stat in files:
    <%
    op, filename, diff = changes[fid]
    %>
    ${diff_block_diffblock(h.FID('', filename), None, op, filename, diff,
        c.a_repo.repo_name, c.a_rev, c.a_ref_type, c.a_ref_name,
        c.cs_repo.repo_name, c.cs_rev, c.cs_ref_type, c.cs_ref_name)}
  %endfor
</div>
</%def>

<%def name="diff_block_diffblock(id_fid, url_fid, op, filename, diff,
    a_repo_name, a_rev, a_ref_type, a_ref_name,
    cs_repo_name, cs_rev, cs_ref_type, cs_ref_name)"
>
    <div id="${id_fid}_target" style="clear:both;margin-top:25px"></div>
    <div id="${id_fid}" class="diffblock margined comm">
        <div class="code-header">
            <div class="changeset_header">
                <div class="changeset_file">
                    ${h.safe_unicode(filename)} |
                    %if op == 'A':
                      ${_('Added')}
                      <a class="spantag" href="${h.url('files_home', repo_name=cs_repo_name, f_path=filename, revision=cs_rev)}">${h.short_ref(cs_ref_type, cs_ref_name)}</a>
                    %elif op == 'M':
                      <a class="spantag" href="${h.url('files_home', repo_name=a_repo_name, f_path=filename, revision=a_rev)}">${h.short_ref(a_ref_type, a_ref_name)}</a>
                      <i class="icon-right"></i>
                      <a class="spantag" href="${h.url('files_home', repo_name=cs_repo_name, f_path=filename, revision=cs_rev)}">${h.short_ref(cs_ref_type, cs_ref_name)}</a>
                    %elif op == 'D':
                      ${_('Deleted')}
                      <a class="spantag" href="${h.url('files_home', repo_name=a_repo_name, f_path=filename, revision=a_rev)}">${h.short_ref(a_ref_type, a_ref_name)}</a>
                    %elif op == 'R':
                      ${_('Renamed')}
                      <a class="spantag" href="${h.url('files_home', repo_name=a_repo_name, f_path=filename, revision=a_rev)}">${h.short_ref(a_ref_type, a_ref_name)}</a>
                      <i class="icon-right"></i>
                      <a class="spantag" href="${h.url('files_home', repo_name=cs_repo_name, f_path=filename, revision=cs_rev)}">${h.short_ref(cs_ref_type, cs_ref_name)}</a>
                    %else:
                      ${op}???
                    %endif
                </div>
                <div class="diff-actions">
                  <a href="${h.url('files_diff_home',repo_name=cs_repo_name,f_path=h.safe_unicode(filename),diff2=cs_rev,diff1=a_rev,diff='diff',fulldiff=1)}" class="tooltip" title="${_('Show full diff for this file')}">
                      <i class="icon-file-code"></i>
                  </a>
                  <a href="${h.url('files_diff_2way_home',repo_name=cs_repo_name,f_path=h.safe_unicode(filename),diff2=cs_rev,diff1=a_rev,diff='diff',fulldiff=1)}" class="tooltip" title="${_('Show full side-by-side diff for this file')}">
                      <i class="icon-docs"></i>
                  </a>
                  <a href="${h.url('files_diff_home',repo_name=cs_repo_name,f_path=h.safe_unicode(filename),diff2=cs_rev,diff1=a_rev,diff='raw')}" class="tooltip" title="${_('Raw diff')}">
                      <i class="icon-diff"></i>
                  </a>
                  <a href="${h.url('files_diff_home',repo_name=cs_repo_name,f_path=h.safe_unicode(filename),diff2=cs_rev,diff1=a_rev,diff='download')}" class="tooltip" title="${_('Download diff')}">
                      <i class="icon-floppy"></i>
                  </a>
                  ${c.ignorews_url(request.GET, url_fid)}
                  ${c.context_url(request.GET, url_fid)}
                </div>
                <span style="float:right;margin-top:-3px">
                    <label>
                        ${_('Show inline comments')}
                        ${h.checkbox('',checked="checked",class_="show-inline-comments",id_for=url_fid)}
                    </label>
                </span>
            </div>
        </div>
        <div class="code-body full_f_path" data-f_path="${h.safe_unicode(filename)}">
            ${diff|n}
            %if filename.rsplit('.')[-1] in ['png', 'gif', 'jpg', 'bmp']:
              <div class="btn btn-image-diff-show">Show images</div>
              %if op == 'M':
                <div id="${id_fid}_image-diff" class="btn btn-image-diff-swap" style="display:none">Press to swap images</div>
              %endif
              <div style="font-size: 0">
                %if op in 'DM':
                  <img id="${id_fid}_image-diff-img-a" class="img-diff img-diff-swapable" style="display:none"
                      realsrc="${h.url('files_raw_home',repo_name=a_repo_name,revision=a_rev,f_path=filename)}" />
                %endif
                %if op in 'AM':
                  <img id="${id_fid}_image-diff-img-b" class="img-diff img-diff-swapable" style="display:none"
                      realsrc="${h.url('files_raw_home',repo_name=cs_repo_name,revision=cs_rev,f_path=filename)}" />
                %endif
              </div>
            %endif
        </div>
    </div>
</%def>

<%def name="diff_block_js()">
<script type="text/javascript">
$(document).ready(function(){
    $('.btn-image-diff-show').click(function(e){
        $('.btn-image-diff-show').hide();
        $('.btn-image-diff-swap').show();
        $('.img-diff-swapable')
            .each(function(i,e){
                    $(e).prop('src', $(e).attr('realsrc'));
                })
            .show();
        });

    $('.btn-image-diff-swap').mousedown(function(e){
        $('#'+e.currentTarget.id+'-img-a.img-diff-swapable')
          .before($('#'+e.currentTarget.id+'-img-b.img-diff-swapable'));
    });
    var reset = function(e){
        $('#'+e.currentTarget.id+'-img-a.img-diff-swapable')
          .after($('#'+e.currentTarget.id+'-img-b.img-diff-swapable'));
    };
    $('.btn-image-diff-swap').mouseup(reset);
    $('.btn-image-diff-swap').mouseleave(reset);

    $('.diff-collapse-button').click(function(e) {
        var $button = $(e.currentTarget);
        var $target = $('#' + $button.attr('target'));
        if($target.hasClass('hidden')){
            $target.removeClass('hidden');
            $button.html("&uarr; {0} &uarr;".format(_TM['Collapse Diff']));
        }
        else if(!$target.hasClass('hidden')){
            $target.addClass('hidden');
            $button.html("&darr; {0} &darr;".format(_TM['Expand Diff']));
        }
    });
    $('.show-inline-comments').change(function(e){
        var target = e.currentTarget;
        if(target == null){
            target = this;
        }
        var boxid = $(target).attr('id_for');
        if(target.checked){
            $('#{0} .inline-comments'.format(boxid)).show();
        }else{
            $('#{0} .inline-comments'.format(boxid)).hide();
        }
    });
});
</script>
</%def>