Edgewall Software

Ticket #7026: query_column_reorder2_6737.2.diff

File query_column_reorder2_6737.2.diff, 6.2 KB (added by ebray <hyugaricdeau@…>, 10 months ago)

Simplified patch without modifying url query strings.

  • trac/ticket/query.py

     
    4141                            INavigationContributor, Chrome 
    4242from trac.wiki.api import IWikiSyntaxProvider, parse_args 
    4343from trac.wiki.macros import WikiMacroBase # TODO: should be moved in .api 
    44 from trac.config import Option  
     44from trac.config import Option 
    4545 
    4646class QuerySyntaxError(Exception): 
    4747    """Exception raised when a ticket query cannot be parsed from a string.""" 
     
    9494        for filter_ in filters: 
    9595            filter_ = filter_.split('=') 
    9696            if len(filter_) != 2: 
    97                 raise QuerySyntaxError('Query filter requires field and '  
     97                raise QuerySyntaxError('Query filter requires field and ' 
    9898                                       'constraints separated by a "="') 
    9999            field,values = filter_ 
    100100            if not field: 
     
    254254        # shorter in the common case where we just want the default columns. 
    255255        if cols == self.get_default_columns(): 
    256256            cols = None 
     257                                for idx, col in enumerate(cols))) 
    257258        return href.query(report=id, 
    258259                          order=order, desc=desc and 1 or None, 
    259260                          group=self.group or None, 
     
    637638                      rows, 
    638639                      req.args.get('limit')) 
    639640 
     641        if cols: 
     642            for idx, col in enumerate(cols): 
     643                if 'up_' + col in req.args: 
     644                    query.cols[idx] = cols[idx-1] 
     645                    query.cols[idx-1] = col 
     646                    req.redirect(query.get_href(req.href)) 
     647                elif 'down_' + col in req.args: 
     648                    query.cols[idx] = cols[idx+1] 
     649                    query.cols[idx+1] = col 
     650                    req.redirect(query.get_href(req.href)) 
     651 
    640652        if 'update' in req.args: 
    641653            # Reset session vars 
    642654            for var in ('query_constraints', 'query_time', 'query_tickets'): 
     
    779791        data.setdefault('description', None) 
    780792        data['title'] = title 
    781793 
    782         data['all_columns'] = query.get_all_columns() 
     794        all_columns = query.get_all_columns() 
     795        all_columns.sort(key=lambda x: (not x in query.cols, 
     796                                        x in query.cols and  
     797                                        query_cols.index(x))) 
    783798        # Don't allow the user to remove the id column         
    784         data['all_columns'].remove('id') 
     799        all_columns.remove('id') 
     800        data['all_columns'] = all_columns 
    785801        data['all_textareas'] = query.get_all_textareas() 
    786802 
    787803        add_stylesheet(req, 'common/css/report.css') 
  • trac/ticket/templates/query.html

     
    136136        <fieldset id="columns"> 
    137137          <legend>Columns</legend> 
    138138          <div> 
    139             <py:for each="column in all_columns"> 
    140               <label> 
    141                 <input type="checkbox" name="col" value="$column" 
    142                        checked="${any([(value == column) for value in col]) 
    143                                   and 'checked' or None}" /> 
    144                 ${labels.get(column, column or 'none')} 
    145               </label> 
    146             </py:for> 
     139            <table> 
     140              <tbody> 
     141                <tr py:for="idx, column in enumerate(all_columns)"> 
     142                  <td> 
     143                    <input type="checkbox" name="col" value="$column" 
     144                           checked="${any([(value == column) for value in col]) 
     145                                      and 'selected' or None}" /> 
     146                  </td> 
     147                  <td>${labels.get(column, column or 'none')}</td> 
     148                  <td> 
     149                    <input type="submit" name="up_${column}" value="Up" 
     150                           disabled="${not idx or None}" />&nbsp; 
     151                    <input type="submit" name="down_${column}" value="Down" 
     152                           disabled="${idx == len(all_columns)-1 or None}" /> 
     153                  </td> 
     154                </tr> 
     155              </tbody> 
     156            </table> 
    147157          </div> 
    148158        </fieldset> 
    149159 
  • trac/htdocs/js/query.js

     
    273273      } 
    274274      select.selectedIndex = 0; 
    275275    } 
     276 
     277    $("input[@name^='up_']").click(function() { 
     278      var row = $(this).parents('tr'); 
     279      if (row.prev().length) { 
     280        var prev = row.prev(); 
     281        if (!row.next().length) { 
     282          prev.find("input[@name^='down_']").attr("disabled", true); 
     283        } 
     284        prev.find("input[@name^='up_']").attr("disabled", false); 
     285        row.insertBefore(row.prev()); 
     286        if (!row.prev().length) { 
     287          $(this).attr("disabled", true); 
     288        } 
     289        row.find("input[@name^='down_']").attr("disabled", false); 
     290      } 
     291      return false; 
     292    }); 
     293    $("input[@name^='down_']").click(function() { 
     294      var row = $(this).parents('tr'); 
     295      if (row.next().length) { 
     296        var next = row.next(); 
     297        if (!row.prev().length) { 
     298          next.find("input[@name^='up_']").attr("disabled", true); 
     299        } 
     300        next.find("input[@name^='down_']").attr("disabled", false); 
     301        row.insertAfter(row.next()); 
     302        if (!row.next().length) { 
     303          $(this).attr("disabled", true); 
     304        } 
     305        row.find("input[@name^='up_']").attr("disabled", false); 
     306      } 
     307      return false; 
     308    }); 
    276309  } 
    277  
    278 })(jQuery); 
    279  No newline at end of file 
     310})(jQuery); 
  • trac/htdocs/css/report.css

     
    4141#filters td.filter label { padding-right: 1em } 
    4242#filters td.actions { text-align: right; white-space: nowrap } 
    4343 
     44#columns div { 
     45 height: 15em; 
     46 overflow: -moz-scrollbars-vertical; 
     47 overflow-x: hidden; 
     48 overflow-y: scroll; 
     49} 
     50 
    4451#columns div label {  
    4552 display: block; 
    4653 float: left;