diff --git a/app/views/roles/permissions.html.erb b/app/views/roles/permissions.html.erb index 9cd71b499..a1ddac9a8 100644 --- a/app/views/roles/permissions.html.erb +++ b/app/views/roles/permissions.html.erb @@ -27,61 +27,80 @@ <% @roles.each do |role| %> <%= hidden_field_tag "permissions[#{role.id}][]", '', :id => nil %> <% end %> -
- - - - + +<%= stylesheet_link_tag 'divgrid' %> +<%= javascript_include_tag 'divgrid' %> + +
+ +
+
 
+
+ +
+
+
 
+
<% @roles.each do |role| %> -
+
+
+ <%= link_to_function('', + "toggleCheckboxesBySelector('input.role-#{role.id}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%= content_tag(role.builtin? ? 'em' : 'span', role.name) %> +
+
<% end %> - - - -<% perms_by_module = @permissions.group_by {|p| p.project_module.to_s} %> -<% perms_by_module.keys.sort.each do |mod| %> - <% unless mod.blank? %> - - - <% @roles.each do |role| %> - - <% end %> - + + +
+ <% perms_by_module = @permissions.group_by {|p| p.project_module.to_s} %> + <% even = true %> + <% perms_by_module.keys.sort.each do |mod| %> +
"> + <%= l_or_humanize(mod, :prefix => 'project_module_') %> +
+ <% even = !even %> + <% perms_by_module[mod].each do |permission| %> +
"> + <% even = !even %> + <%= link_to_function('', + "toggleCheckboxesBySelector('input.permission-#{permission.name}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%= l_or_humanize(permission.name, :prefix => 'permission_') %> +
+ <% end %> <% end %> - <% perms_by_module[mod].each do |permission| %> - <% humanized_perm_name = l_or_humanize(permission.name, :prefix => 'permission_') %> -
- - <% @roles.each do |role| %> - <% if role.setable_permissions.include? permission %> - - <% else %> - + + +
+
+ <% @roles.each do |role| %> +
+ <% even = true %> + <% perms_by_module.keys.sort.each do |mod| %> +
<%= (even)? " g_e":" g_o" %>">
+ <% even = !even %> + <% perms_by_module[mod].each do |permission| %> +
" title="<%= "#{l_or_humanize(permission.name, :prefix => 'permission_')} - #{role.name}" %>"> + <% even = !even %> + <% if role.setable_permissions.include? permission %> + <%= check_box_tag "permissions[#{role.id}][]", permission.name, (role.permissions.include? permission.name), :id => nil, :class => "role-#{role.id} permission-#{permission.name}" %> + <% else %> +   + <% end %> +
<% end %> <% end %> -
+ <% end %> -<% end %> - -
<%=l(:label_permissions)%> - <%= link_to_function('', - "toggleCheckboxesBySelector('input.role-#{role.id}')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", - :class => 'icon-only icon-checked') %> - <%= content_tag(role.builtin? ? 'em' : 'span', role.name) %> -
-   - <%= l_or_humanize(mod, :prefix => 'project_module_') %> - <%= role.name %>
- <%= link_to_function('', - "toggleCheckboxesBySelector('.permission-#{permission.name} input')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", - :class => 'icon-only icon-checked') %> - <%= humanized_perm_name %> - "> - <%= check_box_tag "permissions[#{role.id}][]", permission.name, (role.permissions.include? permission.name), :id => nil, :class => "role-#{role.id}" %> -
+
+ + +

<%= check_all_links 'permissions_form' %>

<%= submit_tag l(:button_save) %>

<% end %> diff --git a/app/views/trackers/fields.html.erb b/app/views/trackers/fields.html.erb index 4a27ef2e4..4cb2b55fa 100644 --- a/app/views/trackers/fields.html.erb +++ b/app/views/trackers/fields.html.erb @@ -2,71 +2,93 @@ <% if @trackers.any? %> <%= form_tag fields_trackers_path do %> -
- - - - + <%= stylesheet_link_tag 'divgrid' %> + <%= javascript_include_tag 'divgrid' %> + +
+ +
+
 
+
+ +
+
+
 
+
<% @trackers.each do |tracker| %> -
+
+
+ <%= link_to_function('', "toggleCheckboxesBySelector('input.tracker-#{tracker.id}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%= tracker.name %> +
+
<% end %> - - - - - - - <% Tracker::CORE_FIELDS.each do |field| %> - - <% field_name = l("field_#{field}".sub(/_id$/, '')) %> - - <% @trackers.each do |tracker| %> - - <% end %> - - <% end %> - <% if @custom_fields.any? %> - - - - <% @custom_fields.each do |field| %> - - - <% @trackers.each do |tracker| %> - + <% end %> - + <% end %> + <% end %> - <% end %> - -
- <%= link_to_function('', "toggleCheckboxesBySelector('input.tracker-#{tracker.id}')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", - :class => 'icon-only icon-checked') %> - <%= tracker.name %> -
-   + + +
+
 
+ <% even = false %> +
"> + <% even = !even %> <%= l(:field_core_fields) %> -
- <%= link_to_function('', "toggleCheckboxesBySelector('input.core-field-#{field}')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", - :class => 'icon-only icon-checked') %> - <%= field_name %> - "> - <%= check_box_tag "trackers[#{tracker.id}][core_fields][]", field, tracker.core_fields.include?(field), - :class => "tracker-#{tracker.id} core-field-#{field}", :id => nil %> -
-   - <%= l(:label_custom_field_plural) %> -
- <%= link_to_function('', "toggleCheckboxesBySelector('input.custom-field-#{field.id}')", + + <% Tracker::CORE_FIELDS.each do |field| %> +
"> + <% even = !even %> + <%= link_to_function('', "toggleCheckboxesBySelector('input.core-field-#{field}')", :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", :class => 'icon-only icon-checked') %> - <%= field.name %> -
"> + <%= l("field_#{field}".sub(/_id$/, '')) %> + + <% end %> + <% if @custom_fields.any? %> +
"> + <% even = !even %> + <%= l(:label_custom_field_plural) %> +
+ <% @custom_fields.each do |field| %> +
"> + <% even = !even %> + <%= link_to_function('', "toggleCheckboxesBySelector('input.custom-field-#{field.id}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%= field.name %> +
+ <% end %> + <% end %> + + +
+
+ <% @trackers.each do |tracker| %> +
+
 
+ <% even = false %> +
<%= (even)? " g_e":" g_o" %>">
+ <% even = !even %> + <% Tracker::CORE_FIELDS.each do |field| %> +
" title="<%= "#{l("field_#{field}".sub(/_id$/, ''))} - #{tracker}" %>"> + <% even = !even %> + <%= check_box_tag "trackers[#{tracker.id}][core_fields][]", field, tracker.core_fields.include?(field), + :class => "tracker-#{tracker.id} core-field-#{field}", :id => nil %> +
+ <% end %> + <% if @custom_fields.any? %> +
<%= (even)? " g_e":" g_o" %>">
+ <% even = !even %> + <% @custom_fields.each do |field| %> +
" title="<%= "#{field.name} - #{tracker}" %>"> + <% even = !even %> <%= check_box_tag "trackers[#{tracker.id}][custom_field_ids][]", field.id, tracker.custom_fields.include?(field), :class => "tracker-#{tracker.id} custom-field-#{field.id}", :id => nil %> -
+

<%= submit_tag l(:button_save) %>

<% @trackers.each do |tracker| %> @@ -74,6 +96,9 @@ <%= hidden_field_tag "trackers[#{tracker.id}][custom_field_ids][]", '' %> <% end %> <% end %> + + + <% else %>

<%= l(:label_no_data) %>

<% end %> diff --git a/app/views/workflows/_form.html.erb b/app/views/workflows/_form.html.erb index 32639753c..2a05a3f12 100644 --- a/app/views/workflows/_form.html.erb +++ b/app/views/workflows/_form.html.erb @@ -1,50 +1,62 @@ - - - - - - - - - <% for new_status in @statuses %> - - <% end %> - - <% transition_counts = workflows.each_with_object(Hash.new(0)) {|w,memo| memo[[w.old_status, w.new_status]] += 1} %> - + +
+
+ <%= link_to_function('', + "toggleCheckboxesBySelector('#workflow_#{name} input[type=checkbox]:not(:disabled)')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%=l(:label_current_status)%> +
+
+ +
+
+
 
+
+ <% for new_status in @statuses %> +
+
+ <%= link_to_function('', + "toggleCheckboxesBySelector('#workflow_#{name} input[type=checkbox]:not(:disabled).new-status-#{new_status.id}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%= new_status.name %> +
+
+ <% end %> +
+ +
+
 
+ <% even = false %> <% for old_status in [nil] + @statuses %> - <% next if old_status.nil? && name != 'always' %> -
- - <% for new_status in @statuses -%> - <% checked = (old_status == new_status) || (transition_counts[[old_status, new_status]] > 0) %> - - <% end -%> - + <% end %> - -
- <%= link_to_function('', "toggleCheckboxesBySelector('table.transitions-#{name} input[type=checkbox]:not(:disabled)')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", - :class => 'icon-only icon-checked') %> - <%=l(:label_current_status)%> - <%=l(:label_new_statuses_allowed)%>
- <%= link_to_function('', "toggleCheckboxesBySelector('table.transitions-#{name} input[type=checkbox]:not(:disabled).new-status-#{new_status.id}')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", - :class => 'icon-only icon-checked') %> - <%= new_status.name %> -
- <%= link_to_function('', "toggleCheckboxesBySelector('table.transitions-#{name} input[type=checkbox]:not(:disabled).old-status-#{old_status.try(:id) || 0}')", - :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", - :class => 'icon-only icon-checked') %> - <% if old_status %> - <% old_status_name = old_status.name %> - <%= old_status_name %> - <% else %> - <% old_status_name = l(:label_issue_new) %> - <%= content_tag('em', old_status_name) %> + <% next if old_status.nil? && name != 'always' %> +
"> + <% even = !even %> + <%= link_to_function('', + "toggleCheckboxesBySelector('#workflow_#{name} input[type=checkbox]:not(:disabled).old-status-#{old_status.try(:id) || 0}')", + :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}", + :class => 'icon-only icon-checked') %> + <%= old_status ? old_status.name : content_tag('em', l(:label_issue_new)) %> +
+ <% end %> + + +
+
+ <% for new_status in @statuses %> +
+
 
+ <% even = false %> + <% for old_status in [nil] + @statuses %> + <% next if old_status.nil? && name != 'always' %> + <% checked = (old_status == new_status) || workflows.detect {|w| w.old_status == old_status && w.new_status == new_status} %> +
" title="<%= old_status ? old_status.name : content_tag('em', l(:label_issue_new)) %> → <%= new_status.name %>"> + <% even = !even %> + <%= transition_tag transition_counts[[old_status, new_status]], old_status, new_status, name %> +
<% end %> -
- <%= transition_tag transition_counts[[old_status, new_status]], old_status, new_status, name %> -
+ diff --git a/app/views/workflows/edit.html.erb b/app/views/workflows/edit.html.erb index c247097a4..845d01c19 100644 --- a/app/views/workflows/edit.html.erb +++ b/app/views/workflows/edit.html.erb @@ -32,28 +32,41 @@ <% end %> <% if @trackers && @roles && @statuses.any? %> + <%= stylesheet_link_tag 'divgrid' %> + <%= javascript_include_tag 'divgrid' %> + <%= form_tag({}, :id => 'workflow_form' ) do %> <%= @trackers.map {|tracker| hidden_field_tag 'tracker_id[]', tracker.id, :id => nil}.join.html_safe %> <%= @roles.map {|role| hidden_field_tag 'role_id[]', role.id, :id => nil}.join.html_safe %> <%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only], :id => nil %>
- <%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %> +
+ <%= render :partial => 'form', :locals => {:name => 'always', :workflows => @workflows['always']} %> +
-
- <%= l(:label_additional_workflow_transitions_for_author) %> -
- <%= render :partial => 'form', :locals => {:name => 'author', :workflows => @workflows['author']} %> -
+ + <%= javascript_tag "hideFieldset($('#author_workflows'))" unless @workflows['author'].present? %> -
- <%= l(:label_additional_workflow_transitions_for_assignee) %> -
- <%= render :partial => 'form', :locals => {:name => 'assignee', :workflows => @workflows['assignee']} %> -
+ + <%= javascript_tag "hideFieldset($('#assignee_workflows'))" unless @workflows['assignee'].present? %> + + + +
<%= submit_tag l(:button_save) %> <% end %> diff --git a/app/views/workflows/index.html.erb b/app/views/workflows/index.html.erb index 66785a40c..02653b347 100644 --- a/app/views/workflows/index.html.erb +++ b/app/views/workflows/index.html.erb @@ -1,35 +1,61 @@ <%= title [l(:label_workflow), workflows_edit_path], l(:field_summary) %> <% if @roles.empty? || @trackers.empty? %> -

<%= l(:label_no_data) %>

+

<%= l(:label_no_data) %>

<% else %> -
- - - - - <% @roles.each do |role| %> - - <% end %> - - - -<% @trackers.each do |tracker| -%> - - - <% @roles.each do |role| -%> - <% count = @workflow_counts[[tracker.id, role.id]] || 0 %> - - <% end -%> - -<% end -%> - -
- <%= content_tag(role.builtin? ? 'em' : 'span', role.name) %> -
<%= tracker.name %> - <%= link_to((count > 0 ? count : content_tag(:span, nil, :class => 'icon-only icon-not-ok')), - {:action => 'edit', :role_id => role, :tracker_id => tracker}, - :title => l(:button_edit)) %> -
-
+ <%= stylesheet_link_tag 'divgrid' %> + <%= javascript_include_tag 'divgrid' %> + +
+ +
+
 
+
+ +
+
+
 
+
+ <% @roles.each do |role| %> +
+
+ <%= role.name %> +
+
+ <% end %> +
+ +
+
 
+ <% even = false %> + <% @trackers.each do |tracker| %> +
"> + <% even = !even %> + <%= tracker.name %> +
+ <% end %> +
+ +
+
+ <% @roles.each do |role| %> +
+
 
+ <% even = false %> + <% @trackers.each do |tracker| %> + <% count = @workflow_counts[[tracker.id, role.id]] || 0 %> +
" title="<%= "#{tracker} - #{role}" %>"> + <% even = !even %> + <%= link_to((count > 0 ? count : content_tag(:span, nil, :class => 'icon-only icon-not-ok')), + {:action => 'edit', :role_id => role, :tracker_id => tracker}, + :title => l(:button_edit)) %> +
+ <% end %> +
+ <% end %> +
+
+ + + <% end %> diff --git a/app/views/workflows/permissions.html.erb b/app/views/workflows/permissions.html.erb index 28a671052..01e3afed0 100644 --- a/app/views/workflows/permissions.html.erb +++ b/app/views/workflows/permissions.html.erb @@ -15,12 +15,12 @@

<%= submit_tag l(:button_edit), :name => nil %> @@ -30,70 +30,127 @@ <% end %> <% if @trackers && @roles && @statuses.any? %> + <%= stylesheet_link_tag 'divgrid' %> + <%= javascript_include_tag 'divgrid' %> + <%= form_tag({}, :id => 'workflow_form' ) do %> <%= @trackers.map {|tracker| hidden_field_tag 'tracker_id[]', tracker.id, :id => nil}.join.html_safe %> <%= @roles.map {|role| hidden_field_tag 'role_id[]', role.id, :id => nil}.join.html_safe %> <%= hidden_field_tag 'used_statuses_only', params[:used_statuses_only], :id => nil %>

- - - - - - - - - <% for status in @statuses %> - - <% end %> - - - - - - - <% @fields.each do |field, name| %> - - - <% for status in @statuses -%> - - <% end -%> - - <% end %> + + +
+ +
+
 
+
+ +
+
+
 
+
+ <% for status in @statuses %> +
+
+ <%= status.name %> +
+
+ <% end %> +
+ +
+
 
+ <% even = false %> + <% @fields.each do |field, name| %> +
"> + <% even = !even %> + <%= name %> <%= content_tag('span', '*', :class => 'required') if field_required?(field) %> +
+ <% end %> +
+ +
+
+ <% for status in @statuses %> +
+
 
+ <% even = false %> + <% @fields.each do |field, name| %> +
<%= @permissions[status.id][field].try(:join, ' ') %>" title="<%= name %> (<%= status.name %>)"> +
+ <% even = !even %> + <%= field_permission_tag(@permissions, status, field, @roles) %> + <% unless status == @statuses.last %>»<% end %> +
+
+ <% end %> +
+ <% end %> +
+
+ <% if @custom_fields.any? %> - - - - <% @custom_fields.each do |field| %> - - - <% for status in @statuses -%> - - <% end -%> - - <% end %> - <% end %> - -
- <%=l(:label_issue_status)%>
- <%= status.name %> -
-   +
+ <%= l(:field_core_fields) %> -
- <%= name %> <%= content_tag('span', '*', :class => 'required') if field_required?(field) %> - - <%= field_permission_tag(@permissions, status, field, @roles) %> - <% unless status == @statuses.last %>»<% end %> -
-   +
+ <%= l(:label_custom_field_plural) %> -
- <%= field.name %> <%= content_tag('span', '*', :class => 'required') if field_required?(field) %> - - <%= field_permission_tag(@permissions, status, field, @roles) %> - <% unless status == @statuses.last %>»<% end %> -
+ + +
+ +
+
 
+
+ +
+
+
 
+
+ <% for status in @statuses %> +
+
+ <%= status.name %> +
+
+ <% end %> +
+ +
+
 
+ <% even = false %> + <% @custom_fields.each do |field| %> +
"> + <% even = !even %> + <%= field.name %> <%= content_tag('span', '*', :class => 'required') if field_required?(field) %> +
+ <% end %> +
+ +
+
+ <% for status in @statuses %> +
+
 
+ <% even = false %> + <% @custom_fields.each do |field| %> +
<%= @permissions[status.id][field.id.to_s].try(:join, ' ') %>" title="<%= field.name %> (<%= status.name %>)"> +
+ <% even = !even %> + <%= field_permission_tag(@permissions, status, field, @roles) %> + <% unless status == @statuses.last %>»<% end %> +
+
+ <% end %> +
+ <% end %> +
+
+ <% end -%> + +
<%= submit_tag l(:button_save) %> <% end %> @@ -102,8 +159,23 @@ <%= javascript_tag do %> $("a.repeat-value").click(function(e){ e.preventDefault(); - var td = $(this).closest('td'); - var selected = td.find("select").find(":selected").val(); - td.nextAll('td').find("select").val(selected); + var div = $(this).closest('div.g_c'); + var selected = div.find("select").find(":selected").val(); + var index = div.index() + 1; + div.parent().nextAll('div').find(":nth-child(" + index + ") select").val(selected); +}); + +$("a[data-expands]").click(function(e){ + e.preventDefault(); + var target = $($(this).attr("data-expands")); + if (target.attr("multiple")) { + $(this).find('span').switchClass('icon-toggle-minus', 'icon-toggle-plus'); + target.attr("multiple", false); + target.find("option[value=all]").show(); + } else { + $(this).find('span').switchClass('icon-toggle-plus', 'icon-toggle-minus'); + target.attr("multiple", true); + target.find("option[value=all]").attr("selected", false).hide(); + } }); <% end %> diff --git a/public/javascripts/divgrid.js b/public/javascripts/divgrid.js new file mode 100644 index 000000000..2f817bdcd --- /dev/null +++ b/public/javascripts/divgrid.js @@ -0,0 +1,56 @@ +/* Simple Grid Scripts tables with fixed First Row and Line */ + +// scrolls first line and row with body +// div is this +// row is id of row Ex: g_fr +// line is id of line Ex: g_fl +function g_scroll(div, line, row) { + document.getElementById(line).style.left = - div.scrollLeft + 'px'; + document.getElementById(row).style.top = - div.scrollTop + 'px'; +} + +// adjusts width of rows +// bli is the block div +// fri is the first row div +// fli is the first line div +// bdi is the body div +function g_adjust(bli, fri, fli, bdi) { + var frw = document.getElementById(fri).offsetWidth; + var frw2 = document.getElementById(bli).offsetWidth; + if ( frw2 > frw ) { + frw = frw2 + "px" + } else { + frw = frw + "px"; + } + + document.getElementById(fri).style.width = frw; + document.getElementById(bli).style.width = frw; + + var fl = document.getElementById(fli); + fl.children[0].style.width = frw; + + var bd = document.getElementById(bdi); + bd.children[0].style.width = frw; + + for (var i = 1; i < fl.children.length; i++) { + s1 = fl.children[i].offsetWidth; + s2 = bd.children[i].offsetWidth; + if (s1 > s2) { + bd.children[i].style.width = s1 + "px" + } else { + fl.children[i].style.width = s2 + "px" + } + } +} + +// Toggle visibility of table +function toggleDivToFieldset(divId, fsClass) { + if (~fsClass.indexOf("collapsed")) { + document.getElementById(divId).style.visibility='hidden'; + document.getElementById(divId).style.position='fixed'; + } else { + document.getElementById(divId).style.visibility=''; + document.getElementById(divId).style.position='relative'; + document.getElementById(divId).children[1].style.left='0px'; + } +} diff --git a/public/stylesheets/divgrid.css b/public/stylesheets/divgrid.css new file mode 100644 index 000000000..63d590800 --- /dev/null +++ b/public/stylesheets/divgrid.css @@ -0,0 +1,38 @@ +/* Simple Grid Styles for tables with fixed First Row and Line */ + +/* Cell */ +.g_c { height: 1.5em; + padding: 6px; + font-size: 12px; + border-width: 0px 1px 1px 0px; + border-style: solid; + border-color: #CCC; + text-align: center; } + +/* First Line */ +.g_h { background-color: #EEE; + text-align: center; } + +/* First Row */ +.g_v { text-align: left; } + +/* Image in Cell */ +.g_i { height: 16px; + width: 16px; + margin: 0 auto; } + +/* Separation Lines */ +.g_s { font-weight: bold; + border-right: 0px; } + +/* Marked Cell */ +.g_m { background-color: #BFB; } + +/* Even Cell */ +.g_e { background-color: #F6F7F8; } + +/* Odd Cell */ +.g_o { background-color: #FFFFFF; } + +/* Inline Block Fix */ +.ibf { font-size: 0; }