Feature #39806 » 0001-replaces-query-filters-and-option-tables-with-a-flex.patch
| app/views/gantts/show.html.erb | ||
|---|---|---|
| 23 | 23 |
<fieldset id="options" class="collapsible collapsed"> |
| 24 | 24 |
<legend onclick="toggleFieldset(this);" class="icon icon-collapsed"><%= l(:label_options) %></legend> |
| 25 | 25 |
<div style="display: none;"> |
| 26 |
<table> |
|
| 27 |
<tr> |
|
| 28 |
<td> |
|
| 26 |
<div> |
|
| 29 | 27 |
<fieldset> |
| 30 | 28 |
<legend> |
| 31 | 29 |
<%= l(:field_column_names) %> |
| 32 | 30 |
</legend> |
| 31 |
<div id="list-definition"> |
|
| 32 |
<div> |
|
| 33 | 33 |
<label for="draw_selected_columns"> |
| 34 |
<%= check_box 'query', 'draw_selected_columns', :id => 'draw_selected_columns', 'data-enables' => 'span.query-columns select, span.query-columns input' %>
|
|
| 34 |
<%= check_box 'query', 'draw_selected_columns', :id => 'draw_selected_columns', 'data-enables' => '#list-definition .query-columns select, #list-definition .query-columns input' %>
|
|
| 35 | 35 |
<%= l(:label_display) %> |
| 36 | 36 |
</label> |
| 37 |
</div> |
|
| 38 |
<div> |
|
| 37 | 39 |
<%= render_query_columns_selection(@query) %> |
| 40 |
</div> |
|
| 41 |
</div> |
|
| 38 | 42 |
</fieldset> |
| 39 |
</td> |
|
| 40 |
</tr> |
|
| 41 |
<tr> |
|
| 42 |
<td> |
|
| 43 | 43 |
<fieldset> |
| 44 | 44 |
<legend><%= l(:label_related_issues) %></legend> |
| 45 | 45 |
<label for="draw_relations"> |
| ... | ... | |
| 53 | 53 |
<% end %> |
| 54 | 54 |
</label> |
| 55 | 55 |
</fieldset> |
| 56 |
</td> |
|
| 57 |
<td> |
|
| 58 | 56 |
<fieldset> |
| 59 | 57 |
<legend><%= l(:label_gantt_progress_line) %></legend> |
| 60 | 58 |
<label for="draw_progress_line"> |
| ... | ... | |
| 62 | 60 |
<%= l(:label_display) %> |
| 63 | 61 |
</label> |
| 64 | 62 |
</fieldset> |
| 65 |
</td> |
|
| 66 |
</tr> |
|
| 67 |
</table> |
|
| 63 |
</div> |
|
| 68 | 64 |
</div> |
| 69 | 65 |
</fieldset> |
| 70 | 66 |
</div> |
| app/views/queries/_columns.html.erb | ||
|---|---|---|
| 2 | 2 |
<% available_tag_id = "available_#{tag_id}" %>
|
| 3 | 3 |
<% selected_tag_id = "selected_#{tag_id}" %>
|
| 4 | 4 | |
| 5 |
<span class="query-columns"> |
|
| 6 |
<span> |
|
| 5 |
<div class="query-columns"> |
|
| 7 | 6 |
<%= label_tag available_tag_id, l(:description_available_columns) %> |
| 8 | 7 |
<%= select_tag 'available_columns', |
| 9 | 8 |
options_for_select(query_available_inline_columns_options(query)), |
| 10 | 9 |
:id => available_tag_id, |
| 11 | 10 |
:multiple => true, :size => 10, |
| 12 | 11 |
:ondblclick => "moveOptions(this.form.#{available_tag_id}, this.form.#{selected_tag_id});" %>
|
| 13 |
</span>
|
|
| 14 |
<span class="buttons">
|
|
| 12 |
</div>
|
|
| 13 |
<div class="buttons">
|
|
| 15 | 14 |
<input type="button" value="→" class="move-right" |
| 16 | 15 |
onclick="moveOptions(this.form.<%= available_tag_id %>, this.form.<%= selected_tag_id %>);" /> |
| 17 | 16 |
<input type="button" value="←" class="move-left" |
| 18 | 17 |
onclick="moveOptions(this.form.<%= selected_tag_id %>, this.form.<%= available_tag_id %>);" /> |
| 19 |
</span>
|
|
| 20 |
<span>
|
|
| 18 |
</div>
|
|
| 19 |
<div class="query-columns">
|
|
| 21 | 20 |
<%= label_tag selected_tag_id, l(:description_selected_columns) %> |
| 22 | 21 |
<%= select_tag tag_name, |
| 23 | 22 |
options_for_select(query_selected_inline_columns_options(query)), |
| 24 | 23 |
:id => selected_tag_id, |
| 25 | 24 |
:multiple => true, :size => 10, |
| 26 | 25 |
:ondblclick => "moveOptions(this.form.#{selected_tag_id}, this.form.#{available_tag_id});" %>
|
| 27 |
</span>
|
|
| 28 |
<span class="buttons">
|
|
| 26 |
</div>
|
|
| 27 |
<div class="buttons">
|
|
| 29 | 28 |
<input type="button" value="⇈" onclick="moveOptionTop(this.form.<%= selected_tag_id %>);" /> |
| 30 | 29 |
<input type="button" value="↑" onclick="moveOptionUp(this.form.<%= selected_tag_id %>);" /> |
| 31 | 30 |
<input type="button" value="↓" onclick="moveOptionDown(this.form.<%= selected_tag_id %>);" /> |
| 32 | 31 |
<input type="button" value="⇊" onclick="moveOptionBottom(this.form.<%= selected_tag_id %>);" /> |
| 33 |
</span> |
|
| 34 |
</span> |
|
| 32 |
</div> |
|
| 35 | 33 | |
| 36 | 34 |
<%= javascript_tag do %> |
| 37 | 35 |
$(document).ready(function(){
|
| app/views/queries/_filters.html.erb | ||
|---|---|---|
| 14 | 14 |
}); |
| 15 | 15 |
<% end %> |
| 16 | 16 | |
| 17 |
<table id="filters-table">
|
|
| 18 |
</table>
|
|
| 17 |
<div id="filters-table">
|
|
| 18 |
</div>
|
|
| 19 | 19 | |
| 20 | 20 |
<div class="add-filter"> |
| 21 | 21 |
<%= label_tag('add_filter_select', l(:label_filter_add)) %>
|
| app/views/queries/_query_form.html.erb | ||
|---|---|---|
| 17 | 17 |
<div class="hidden"> |
| 18 | 18 |
<% if @query.available_display_types.size > 1 %> |
| 19 | 19 |
<div> |
| 20 |
<span class="field"><label for='display_type'><%= l(:label_display_type) %></label></span>
|
|
| 20 |
<div class="field"><label for='display_type'><%= l(:label_display_type) %></label></div>
|
|
| 21 | 21 |
<%= available_display_types_tags(@query) %> |
| 22 | 22 |
</div> |
| 23 | 23 |
<% end %> |
| 24 |
<table id="list-definition" class="<%= 'hidden' if (@query.display_type != 'list') %>">
|
|
| 24 |
<div id="list-definition" class="<%= 'hidden' if (@query.display_type != 'list') %>">
|
|
| 25 | 25 |
<% if @query.available_columns.any? %> |
| 26 |
<tr>
|
|
| 27 |
<td class="field"><%= l(:field_column_names) %></td>
|
|
| 28 |
<td><%= render_query_columns_selection(@query) %></td>
|
|
| 29 |
</tr>
|
|
| 26 |
<div>
|
|
| 27 |
<div class="field"><%= l(:field_column_names) %></div>
|
|
| 28 |
<%= render_query_columns_selection(@query) %>
|
|
| 29 |
</div>
|
|
| 30 | 30 |
<% end %> |
| 31 | 31 |
<% if @query.groupable_columns.any? %> |
| 32 |
<tr>
|
|
| 33 |
<td class="field"><label for='group_by'><%= l(:field_group_by) %></label></td>
|
|
| 34 |
<td><%= group_by_column_select_tag(@query) %></td>
|
|
| 35 |
</tr>
|
|
| 32 |
<div>
|
|
| 33 |
<div class="field"><label for='group_by'><%= l(:field_group_by) %></label></div>
|
|
| 34 |
<div><%= group_by_column_select_tag(@query) %></div>
|
|
| 35 |
</div>
|
|
| 36 | 36 |
<% end %> |
| 37 | 37 |
<% if @query.available_block_columns.any? %> |
| 38 |
<tr>
|
|
| 39 |
<td class="field"><%= l(:button_show) %></td>
|
|
| 40 |
<td><%= available_block_columns_tags(@query) %></td>
|
|
| 41 |
</tr>
|
|
| 38 |
<div>
|
|
| 39 |
<div class="field"><%= l(:button_show) %></div>
|
|
| 40 |
<div><%= available_block_columns_tags(@query) %></div>
|
|
| 41 |
</div>
|
|
| 42 | 42 |
<% end %> |
| 43 | 43 |
<% if @query.available_totalable_columns.any? %> |
| 44 |
<tr>
|
|
| 45 |
<td><%= l(:label_total_plural) %></td>
|
|
| 46 |
<td><%= available_totalable_columns_tags(@query) %></td>
|
|
| 47 |
</tr>
|
|
| 44 |
<div>
|
|
| 45 |
<div class="field"><%= l(:label_total_plural) %></div>
|
|
| 46 |
<div><%= available_totalable_columns_tags(@query) %></div>
|
|
| 47 |
</div>
|
|
| 48 | 48 |
<% end %> |
| 49 |
</table>
|
|
| 49 |
</div>
|
|
| 50 | 50 |
</div> |
| 51 | 51 |
</fieldset> |
| 52 | 52 |
<% end %> |
| public/javascripts/application.js | ||
|---|---|---|
| 127 | 127 |
$('#add_filter_select').change(function() {
|
| 128 | 128 |
addFilter($(this).val(), '', []); |
| 129 | 129 |
}); |
| 130 |
$('#filters-table td.field input[type=checkbox]').each(function() {
|
|
| 130 |
$('#filters-table .field input[type=checkbox]').each(function() {
|
|
| 131 | 131 |
toggleFilter($(this).val()); |
| 132 | 132 |
}); |
| 133 |
$('#filters-table').on('click', 'td.field input[type=checkbox]', function() {
|
|
| 133 |
$('#filters-table').on('click', '.field input[type=checkbox]', function() {
|
|
| 134 | 134 |
toggleFilter($(this).val()); |
| 135 | 135 |
}); |
| 136 | 136 |
$('#filters-table').on('keypress', 'input[type=text]', function(e) {
|
| ... | ... | |
| 177 | 177 |
var filterValues = filterOptions['values']; |
| 178 | 178 |
var i, select; |
| 179 | 179 | |
| 180 |
var tr = $('<tr class="filter">').attr('id', 'tr_'+fieldId).html(
|
|
| 181 |
'<td class="field"><input checked="checked" id="cb_'+fieldId+'" name="f[]" value="'+field+'" type="checkbox"><label for="cb_'+fieldId+'"> '+filterOptions['name']+'</label></td>' +
|
|
| 182 |
'<td class="operator"><select id="operators_'+fieldId+'" name="op['+field+']"></td>' +
|
|
| 183 |
'<td class="values"></td>'
|
|
| 180 |
var tr = $('<div class="filter">').attr('id', 'tr_'+fieldId).html(
|
|
| 181 |
'<div class="field"><input checked="checked" id="cb_'+fieldId+'" name="f[]" value="'+field+'" type="checkbox"><label for="cb_'+fieldId+'"> '+filterOptions['name']+'</label></div>' +
|
|
| 182 |
'<div class="operator"><select id="operators_'+fieldId+'" name="op['+field+']"></select></div>' +
|
|
| 183 |
'<div class="values"></div>'
|
|
| 184 | 184 |
); |
| 185 | 185 |
filterTable.append(tr); |
| 186 | 186 | |
| 187 |
select = tr.find('td.operator select');
|
|
| 187 |
select = tr.find('.operator select');
|
|
| 188 | 188 |
for (i = 0; i < operators.length; i++) {
|
| 189 | 189 |
var option = $('<option>').val(operators[i]).text(operatorLabels[operators[i]]);
|
| 190 | 190 |
if (operators[i] == operator) { option.prop('selected', true); }
|
| ... | ... | |
| 199 | 199 |
case "list_optional_with_history": |
| 200 | 200 |
case "list_status": |
| 201 | 201 |
case "list_subprojects": |
| 202 |
tr.find('td.values').append(
|
|
| 202 |
tr.find('.values').append(
|
|
| 203 | 203 |
'<span style="display:none;"><select class="value" id="values_'+fieldId+'_1" name="v['+field+'][]"></select>' + |
| 204 | 204 |
' <span class="toggle-multiselect icon-only '+(values.length > 1 ? 'icon-toggle-minus' : 'icon-toggle-plus')+'"> </span></span>' |
| 205 | 205 |
); |
| 206 |
select = tr.find('td.values select');
|
|
| 206 |
select = tr.find('.values select');
|
|
| 207 | 207 |
if (values.length > 1) { select.attr('multiple', true); }
|
| 208 | 208 |
for (i = 0; i < filterValues.length; i++) {
|
| 209 | 209 |
var filterValue = filterValues[i]; |
| ... | ... | |
| 225 | 225 |
break; |
| 226 | 226 |
case "date": |
| 227 | 227 |
case "date_past": |
| 228 |
tr.find('td.values').append(
|
|
| 228 |
tr.find('.values').append(
|
|
| 229 | 229 |
'<span style="display:none;"><input type="date" name="v['+field+'][]" id="values_'+fieldId+'_1" size="10" class="value date_value" /></span>' + |
| 230 | 230 |
' <span style="display:none;"><input type="date" name="v['+field+'][]" id="values_'+fieldId+'_2" size="10" class="value date_value" /></span>' + |
| 231 | 231 |
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="3" class="value" /> '+labelDayPlural+'</span>' |
| ... | ... | |
| 237 | 237 |
case "string": |
| 238 | 238 |
case "text": |
| 239 | 239 |
case "search": |
| 240 |
tr.find('td.values').append(
|
|
| 240 |
tr.find('.values').append(
|
|
| 241 | 241 |
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="30" class="value" /></span>' |
| 242 | 242 |
); |
| 243 | 243 |
$('#values_'+fieldId).val(values[0]);
|
| 244 | 244 |
break; |
| 245 | 245 |
case "relation": |
| 246 |
tr.find('td.values').append(
|
|
| 246 |
tr.find('.values').append(
|
|
| 247 | 247 |
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'" size="6" class="value" /></span>' + |
| 248 | 248 |
'<span style="display:none;"><select class="value" name="v['+field+'][]" id="values_'+fieldId+'_1"></select></span>' |
| 249 | 249 |
); |
| 250 | 250 |
$('#values_'+fieldId).val(values[0]);
|
| 251 |
select = tr.find('td.values select');
|
|
| 251 |
select = tr.find('.values select');
|
|
| 252 | 252 |
for (i = 0; i < filterValues.length; i++) {
|
| 253 | 253 |
var filterValue = filterValues[i]; |
| 254 | 254 |
var option = $('<option>');
|
| ... | ... | |
| 260 | 260 |
case "integer": |
| 261 | 261 |
case "float": |
| 262 | 262 |
case "tree": |
| 263 |
tr.find('td.values').append(
|
|
| 263 |
tr.find('.values').append(
|
|
| 264 | 264 |
'<span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_1" size="14" class="value" /></span>' + |
| 265 | 265 |
' <span style="display:none;"><input type="text" name="v['+field+'][]" id="values_'+fieldId+'_2" size="14" class="value" /></span>' |
| 266 | 266 |
); |
| ... | ... | |
| 283 | 283 | |
| 284 | 284 |
function enableValues(field, indexes) {
|
| 285 | 285 |
var fieldId = field.replace('.', '_');
|
| 286 |
$('#tr_'+fieldId+' td.values .value').each(function(index) {
|
|
| 286 |
$('#tr_'+fieldId+' .values .value').each(function(index) {
|
|
| 287 | 287 |
if ($.inArray(index, indexes) >= 0) {
|
| 288 | 288 |
$(this).removeAttr('disabled');
|
| 289 | 289 |
$(this).parents('span').first().show();
|
| public/stylesheets/application.css | ||
|---|---|---|
| 428 | 428 |
min-width: 1em; |
| 429 | 429 |
} |
| 430 | 430 | |
| 431 |
.query-columns>span {
|
|
| 432 |
display:inline-block; |
|
| 433 |
height:100%; |
|
| 434 |
vertical-align: middle; |
|
| 431 |
/* query form - options */ |
|
| 432 |
#list-definition {
|
|
| 433 |
margin: 0 15px; |
|
| 434 |
width: auto !important; |
|
| 435 |
} |
|
| 436 |
#list-definition > div {
|
|
| 437 |
margin: 6px 0; |
|
| 438 |
display: flex; |
|
| 439 |
flex-wrap: wrap; |
|
| 440 |
align-items: center; |
|
| 441 |
gap: 5px 10px; |
|
| 442 |
} |
|
| 443 |
#list-definition > div .field{
|
|
| 444 |
width: 160px; |
|
| 435 | 445 |
} |
| 436 | 446 |
.query-columns label {
|
| 437 | 447 |
display:block; |
| 438 | 448 |
} |
| 439 |
.query-columns .buttons input[type=button] {
|
|
| 449 |
#list-definition .buttons input[type=button] {
|
|
| 440 | 450 |
width:35px; |
| 441 | 451 |
display:block; |
| 442 | 452 |
} |
| ... | ... | |
| 449 | 459 |
.query-totals .value {font-weight:bold;}
|
| 450 | 460 |
body.controller-timelog .query-totals {margin-top:initial;}
|
| 451 | 461 | |
| 462 |
body.controller-gantts fieldset#options > div > div {
|
|
| 463 |
display: flex; |
|
| 464 |
flex-wrap: wrap; |
|
| 465 |
align-items: flex-start; |
|
| 466 |
gap: 5px 10px; |
|
| 467 |
} |
|
| 468 | ||
| 452 | 469 |
td.center {text-align:center;}
|
| 453 | 470 | |
| 454 | 471 |
#watchers select {width: 95%; display: block;}
|
| ... | ... | |
| 605 | 622 |
fieldset.collapsible>legend { cursor:pointer; padding-left: 18px; background-position: 4px;}
|
| 606 | 623 | |
| 607 | 624 |
fieldset#date-range p { margin: 2px 0 2px 0; }
|
| 608 |
fieldset#filters table { border-collapse: collapse; }
|
|
| 609 |
fieldset#filters table td { padding: 0; vertical-align: middle; }
|
|
| 610 |
fieldset#filters tr.filter { height: 2.1em; }
|
|
| 611 |
fieldset#filters td.field { width:230px; }
|
|
| 612 |
fieldset#filters td.operator { width:130px; }
|
|
| 613 |
fieldset#filters td.operator select {max-width:140px;}
|
|
| 614 |
fieldset#filters td.values { white-space:nowrap; }
|
|
| 615 |
fieldset#filters td.values select {min-width:130px;}
|
|
| 616 | ||
| 617 |
#filters-table {width:60%; float:left;}
|
|
| 625 | ||
| 626 |
#query_form_content > fieldset {
|
|
| 627 |
min-width: 0; |
|
| 628 |
width: 100%; |
|
| 629 |
} |
|
| 630 |
#filters-table {
|
|
| 631 |
float:left; |
|
| 632 |
width: auto; |
|
| 633 |
} |
|
| 634 |
#filters-table .field {
|
|
| 635 |
width: 230px; |
|
| 636 |
} |
|
| 637 |
#filters-table .filter {
|
|
| 638 |
margin: 5px 0 0 0; |
|
| 639 |
display: flex; |
|
| 640 |
flex-wrap: wrap; |
|
| 641 |
gap: 0 10px; |
|
| 642 |
} |
|
| 643 |
#filters-table .filter .operator select {
|
|
| 644 |
width: 120px; |
|
| 645 |
} |
|
| 646 | ||
| 618 | 647 |
.add-filter {width:35%; float:right; text-align: right; vertical-align: top;}
|
| 619 | 648 | |
| 620 | 649 |
#issue_is_private_wrap {float:right; margin-right:1em;}
|
| public/stylesheets/responsive.css | ||
|---|---|---|
| 878 | 878 |
.pagination ul.pages li.next {display:inline-block; width:32%; overflow:hidden;}
|
| 879 | 879 | |
| 880 | 880 |
#login-form {width:100%; margin-top:2em;}
|
| 881 | ||
| 882 |
#filters-table .filter .field, #list-definition > div .field { width: 100%; }
|
|
| 883 |
#filters-table .values { width: auto; max-width: 100%; }
|
|
| 881 | 884 |
} |