view kallithea/templates/compare/compare_diff.html @ 8253:f4e158ed49b1

js: cleanup to use nested named functions instead of vars with anonymous functions
author Mads Kiilerich <mads@kiilerich.com>
date Thu, 09 Jan 2020 23:40:42 +0100
parents fb9550946c26
children d6efaa91e967
line wrap: on
line source

## -*- coding: utf-8 -*-
<%inherit file="/base/base.html"/>

<%block name="title">
    %if c.compare_home:
        ${_('%s Compare') % c.repo_name}
    %else:
        ${_('%s Compare') % c.repo_name} - ${'%s@%s' % (c.a_repo.repo_name, c.a_ref_name)} &gt; ${'%s@%s' % (c.cs_repo.repo_name, c.cs_ref_name)}
    %endif
</%block>

<%def name="breadcrumbs_links()">
  ${_('Compare Revisions')}
</%def>

<%block name="header_menu">
    ${self.menu('repositories')}
</%block>

<%def name="main()">
${self.repo_context_bar('changelog')}
<div class="panel panel-primary">
    <div class="panel-heading clearfix">
        ${self.breadcrumbs()}
    </div>
    <div class="panel-body">
      <div class="panel panel-default">
        <div id="body" class="panel-heading">
            <div class="compare-revision-selector">
                ## divs are "inline-block" and cannot have whitespace between them.
                <span>
                    ${h.hidden('compare_org')}
                </span><span>
                    <i class="icon-right"></i>
                </span><span>
                    ${h.hidden('compare_other')}
                </span><span>
                    %if not c.compare_home:
                        <a class="btn btn-default btn-sm" href="${c.swap_url}"><i class="icon-arrows-cw"></i>${_('Swap')}</a>
                    %endif
                    <button type="button" id="compare_revs" class="btn btn-default btn-sm"><i class="icon-git-compare"></i>${_('Compare Revisions')}</button>
                </span>
            </div>
        </div>

    %if c.compare_home:
        <div id="changeset_compare_view_content" class="panel-body">
         <h4 class="text-muted">${_('Compare revisions, branches, bookmarks, or tags.')}</h4>
        </div>
    %else:
        <div id="changeset_compare_view_content" class="panel-body">
                ##CS
                <h5>${ungettext('Showing %s commit','Showing %s commits', len(c.cs_ranges)) % len(c.cs_ranges)}</h5>
                <%include file="compare_cs.html" />

                ## FILES
                <h5>
                % if c.limited_diff:
                    ${ungettext('%s file changed', '%s files changed', len(c.file_diff_data)) % len(c.file_diff_data)}:
                % else:
                    ${ungettext('%s file changed with %s insertions and %s deletions','%s files changed with %s insertions and %s deletions', len(c.file_diff_data)) % (len(c.file_diff_data),c.lines_added,c.lines_deleted)}:
                %endif

                ${c.ignorews_url(request.GET)}
                ${c.context_url(request.GET)}
                </h5>
                <div class="cs_files">
                  %if not c.file_diff_data:
                     <span class="text-muted">${_('No files')}</span>
                  %endif
                  %for fid, url_fid, op, a_path, path, diff, stats in c.file_diff_data:
                    <div class="cs_${op} clearfix">
                      <span class="node">
                          <i class="icon-diff-${op}"></i>
                          ${h.link_to(path, '#%s' % fid)}
                      </span>
                      <div class="changes">${h.fancy_file_stats(stats)}</div>
                    </div>
                  %endfor
                  %if c.limited_diff:
                    <h5>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}">${_('Show full diff anyway')}</a></h5>
                  %endif
                </div>
        </div>
      </div>
    %endif

    %if not c.compare_home:
        ## diff block
        <%namespace name="diff_block" file="/changeset/diff_block.html"/>
        ${diff_block.diff_block_js()}
        ${diff_block.diff_block(c.a_repo.repo_name, c.a_ref_type, c.a_ref_name, c.a_rev,
                                c.cs_repo.repo_name, c.cs_ref_type, c.cs_ref_name, c.cs_rev, c.file_diff_data)}
        % if c.limited_diff:
          <h4>${_('Changeset was too big and was cut off...')} <a href="${h.url.current(fulldiff=1, **request.GET.mixed())}">${_('Show full diff')}</a></h4>
        % endif
    %endif
    </div>

</div>
    <script>'use strict';

   $(document).ready(function(){
    var cache = {};

    function make_revision_dropdown(css_selector, repo_name, ref_name, cache_key) {
      $(css_selector).select2({
        placeholder: '{0}@{1}'.format(repo_name, ref_name || ${h.jshtml(_('Select changeset'))}),
        formatSelection: function(obj){
            return '{0}@{1}'.format(repo_name, obj.text).html_escape();
        },
        dropdownAutoWidth: true,
        maxResults: 50,
        query: function(query){
          var key = cache_key;
          var cached = cache[key] ;
          if(cached) {
            var data = {results: []};
            var queryLower = query.term.toLowerCase();
            //filter results
            $.each(cached.results, function(){
                var section = this.text;
                var children = [];
                $.each(this.children, function(){
                    if(children.length < 50 ?
                       ((queryLower.length == 0) || (this.text.toLowerCase().indexOf(queryLower) >= 0)) :
                       ((queryLower.length != 0) && (this.text.toLowerCase().indexOf(queryLower) == 0))) {
                        children.push(this);
                    }
                });
                children = branchSort(children, undefined, query)
                data.results.push({'text': section, 'children': children});
            });
            //push the typed in changeset
            data.results.push({'text':_TM['Specify changeset'],
                               'children': [{'id': query.term, 'text': query.term, 'type': 'rev'}]});
            query.callback(data);
          }else{
              $.ajax({
                url: pyroutes.url('repo_refs_data', {'repo_name': repo_name}),
                data: {},
                dataType: 'json',
                type: 'GET',
                success: function(data) {
                  cache[key] = data;
                  query.callback(data);
                }
              });
          }
        }
    });
    }

    make_revision_dropdown("#compare_org",   ${h.js(c.a_repo.repo_name)},  ${h.js(c.a_ref_name)},  'cache');
    make_revision_dropdown("#compare_other", ${h.js(c.cs_repo.repo_name)}, ${h.js(c.cs_ref_name)}, 'cache2');

    function values_changed() {
        var values = $('#compare_org').select2('data') && $('#compare_other').select2('data');
        if (values) {
             $('#compare_revs').removeClass("disabled");
             // TODO: the swap button ... if any
        } else {
             $('#compare_revs').addClass("disabled");
             // TODO: the swap button ... if any
        }
    }
    values_changed();
    $('#compare_org').change(values_changed);
    $('#compare_other').change(values_changed);
    $('#compare_revs').on('click', function(e){
        var org = $('#compare_org').select2('data');
        var other = $('#compare_other').select2('data');
        if (!org || !other) {
            return;
        }

        var compare_url = ${h.js(h.url('compare_url',repo_name=c.repo_name,org_ref_type='__other_ref_type__',org_ref_name='__org__',other_ref_type='__org_ref_type__',other_ref_name='__other__', other_repo=c.cs_repo.repo_name))};
        var u = compare_url.replace('__other_ref_type__',org.type)
                           .replace('__org__',org.text)
                           .replace('__org_ref_type__',other.type)
                           .replace('__other__',other.text);
        window.location = u;
    });
   });
    </script>
</%def>