@@ -1,37 +1,45 | |||||
1 | <h2><%=l(:label_permissions_report)%></h2> |
|
1 | <h2><%=l(:label_permissions_report)%></h2> | |
2 |
|
2 | |||
3 | <% form_tag({:action => 'report'}, :id => 'permissions_form') do %> |
|
3 | <% form_tag({:action => 'report'}, :id => 'permissions_form') do %> | |
4 | <%= hidden_field_tag 'permissions[0]', '' %> |
|
4 | <%= hidden_field_tag 'permissions[0]', '', :id => nil %> | |
5 | <table class="list"> |
|
5 | <table class="list"> | |
6 | <thead> |
|
6 | <thead> | |
7 | <tr> |
|
7 | <tr> | |
8 | <th><%=l(:label_permissions)%></th> |
|
8 | <th><%=l(:label_permissions)%></th> | |
9 | <% @roles.each do |role| %> |
|
9 | <% @roles.each do |role| %> | |
10 | <th><%= content_tag(role.builtin? ? 'em' : 'span', h(role.name)) %></th> |
|
10 | <th> | |
|
11 | <%= content_tag(role.builtin? ? 'em' : 'span', h(role.name)) %> | |||
|
12 | <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('input.role-#{role.id}')", | |||
|
13 | :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> | |||
|
14 | </th> | |||
11 | <% end %> |
|
15 | <% end %> | |
12 | </tr> |
|
16 | </tr> | |
13 | </thead> |
|
17 | </thead> | |
14 | <tbody> |
|
18 | <tbody> | |
15 | <% perms_by_module = @permissions.group_by {|p| p.project_module.to_s} %> |
|
19 | <% perms_by_module = @permissions.group_by {|p| p.project_module.to_s} %> | |
16 | <% perms_by_module.keys.sort.each do |mod| %> |
|
20 | <% perms_by_module.keys.sort.each do |mod| %> | |
17 | <% unless mod.blank? %> |
|
21 | <% unless mod.blank? %> | |
18 | <tr><%= content_tag('th', mod.humanize, :colspan => (@roles.size + 1), :align => 'left') %></tr> |
|
22 | <tr><%= content_tag('th', mod.humanize, :colspan => (@roles.size + 1), :align => 'left') %></tr> | |
19 | <% end %> |
|
23 | <% end %> | |
20 | <% perms_by_module[mod].each do |permission| %> |
|
24 | <% perms_by_module[mod].each do |permission| %> | |
21 | <tr class="<%= cycle('odd', 'even') %>"> |
|
25 | <tr class="<%= cycle('odd', 'even') %> permission-<%= permission.name %>"> | |
22 | <td><%= permission.name.to_s.humanize %></td> |
|
26 | <td> | |
|
27 | <%= link_to_function(image_tag('toggle_check.png'), "toggleCheckboxesBySelector('.permission-#{permission.name} input')", | |||
|
28 | :title => "#{l(:button_check_all)}/#{l(:button_uncheck_all)}") %> | |||
|
29 | <%= permission.name.to_s.humanize %> | |||
|
30 | </td> | |||
23 | <% @roles.each do |role| %> |
|
31 | <% @roles.each do |role| %> | |
24 | <td align="center"> |
|
32 | <td align="center"> | |
25 | <% if role.setable_permissions.include? permission %> |
|
33 | <% if role.setable_permissions.include? permission %> | |
26 | <%= check_box_tag "permissions[#{role.id}][]", permission.name, (role.permissions.include? permission.name) %> |
|
34 | <%= check_box_tag "permissions[#{role.id}][]", permission.name, (role.permissions.include? permission.name), :id => nil, :class => "role-#{role.id}" %> | |
27 | <% end %> |
|
35 | <% end %> | |
28 | </td> |
|
36 | </td> | |
29 | <% end %> |
|
37 | <% end %> | |
30 | </tr> |
|
38 | </tr> | |
31 | <% end %> |
|
39 | <% end %> | |
32 | <% end %> |
|
40 | <% end %> | |
33 | </tbody> |
|
41 | </tbody> | |
34 | </table> |
|
42 | </table> | |
35 | <p><%= check_all_links 'permissions_form' %></p> |
|
43 | <p><%= check_all_links 'permissions_form' %></p> | |
36 | <p><%= submit_tag l(:button_save) %></p> |
|
44 | <p><%= submit_tag l(:button_save) %></p> | |
37 | <% end %> |
|
45 | <% end %> |
@@ -1,137 +1,144 | |||||
1 | /* redMine - project management software |
|
1 | /* redMine - project management software | |
2 | Copyright (C) 2006-2008 Jean-Philippe Lang */ |
|
2 | Copyright (C) 2006-2008 Jean-Philippe Lang */ | |
3 |
|
3 | |||
4 | function checkAll (id, checked) { |
|
4 | function checkAll (id, checked) { | |
5 | var els = Element.descendants(id); |
|
5 | var els = Element.descendants(id); | |
6 | for (var i = 0; i < els.length; i++) { |
|
6 | for (var i = 0; i < els.length; i++) { | |
7 | if (els[i].disabled==false) { |
|
7 | if (els[i].disabled==false) { | |
8 | els[i].checked = checked; |
|
8 | els[i].checked = checked; | |
9 | } |
|
9 | } | |
10 | } |
|
10 | } | |
11 | } |
|
11 | } | |
12 |
|
12 | |||
|
13 | function toggleCheckboxesBySelector(selector) { | |||
|
14 | boxes = $$(selector); | |||
|
15 | var all_checked = true; | |||
|
16 | for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } } | |||
|
17 | for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; } | |||
|
18 | } | |||
|
19 | ||||
13 | function showAndScrollTo(id, focus) { |
|
20 | function showAndScrollTo(id, focus) { | |
14 | Element.show(id); |
|
21 | Element.show(id); | |
15 | if (focus!=null) { Form.Element.focus(focus); } |
|
22 | if (focus!=null) { Form.Element.focus(focus); } | |
16 | Element.scrollTo(id); |
|
23 | Element.scrollTo(id); | |
17 | } |
|
24 | } | |
18 |
|
25 | |||
19 | var fileFieldCount = 1; |
|
26 | var fileFieldCount = 1; | |
20 |
|
27 | |||
21 | function addFileField() { |
|
28 | function addFileField() { | |
22 | if (fileFieldCount >= 10) return false |
|
29 | if (fileFieldCount >= 10) return false | |
23 | fileFieldCount++; |
|
30 | fileFieldCount++; | |
24 | var f = document.createElement("input"); |
|
31 | var f = document.createElement("input"); | |
25 | f.type = "file"; |
|
32 | f.type = "file"; | |
26 | f.name = "attachments[" + fileFieldCount + "][file]"; |
|
33 | f.name = "attachments[" + fileFieldCount + "][file]"; | |
27 | f.size = 30; |
|
34 | f.size = 30; | |
28 | var d = document.createElement("input"); |
|
35 | var d = document.createElement("input"); | |
29 | d.type = "text"; |
|
36 | d.type = "text"; | |
30 | d.name = "attachments[" + fileFieldCount + "][description]"; |
|
37 | d.name = "attachments[" + fileFieldCount + "][description]"; | |
31 | d.size = 60; |
|
38 | d.size = 60; | |
32 |
|
39 | |||
33 | p = document.getElementById("attachments_fields"); |
|
40 | p = document.getElementById("attachments_fields"); | |
34 | p.appendChild(document.createElement("br")); |
|
41 | p.appendChild(document.createElement("br")); | |
35 | p.appendChild(f); |
|
42 | p.appendChild(f); | |
36 | p.appendChild(d); |
|
43 | p.appendChild(d); | |
37 | } |
|
44 | } | |
38 |
|
45 | |||
39 | function showTab(name) { |
|
46 | function showTab(name) { | |
40 | var f = $$('div#content .tab-content'); |
|
47 | var f = $$('div#content .tab-content'); | |
41 | for(var i=0; i<f.length; i++){ |
|
48 | for(var i=0; i<f.length; i++){ | |
42 | Element.hide(f[i]); |
|
49 | Element.hide(f[i]); | |
43 | } |
|
50 | } | |
44 | var f = $$('div.tabs a'); |
|
51 | var f = $$('div.tabs a'); | |
45 | for(var i=0; i<f.length; i++){ |
|
52 | for(var i=0; i<f.length; i++){ | |
46 | Element.removeClassName(f[i], "selected"); |
|
53 | Element.removeClassName(f[i], "selected"); | |
47 | } |
|
54 | } | |
48 | Element.show('tab-content-' + name); |
|
55 | Element.show('tab-content-' + name); | |
49 | Element.addClassName('tab-' + name, "selected"); |
|
56 | Element.addClassName('tab-' + name, "selected"); | |
50 | return false; |
|
57 | return false; | |
51 | } |
|
58 | } | |
52 |
|
59 | |||
53 | function setPredecessorFieldsVisibility() { |
|
60 | function setPredecessorFieldsVisibility() { | |
54 | relationType = $('relation_relation_type'); |
|
61 | relationType = $('relation_relation_type'); | |
55 | if (relationType && relationType.value == "precedes") { |
|
62 | if (relationType && relationType.value == "precedes") { | |
56 | Element.show('predecessor_fields'); |
|
63 | Element.show('predecessor_fields'); | |
57 | } else { |
|
64 | } else { | |
58 | Element.hide('predecessor_fields'); |
|
65 | Element.hide('predecessor_fields'); | |
59 | } |
|
66 | } | |
60 | } |
|
67 | } | |
61 |
|
68 | |||
62 | function promptToRemote(text, param, url) { |
|
69 | function promptToRemote(text, param, url) { | |
63 | value = prompt(text + ':'); |
|
70 | value = prompt(text + ':'); | |
64 | if (value) { |
|
71 | if (value) { | |
65 | new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true}); |
|
72 | new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true}); | |
66 | return false; |
|
73 | return false; | |
67 | } |
|
74 | } | |
68 | } |
|
75 | } | |
69 |
|
76 | |||
70 | function collapseScmEntry(id) { |
|
77 | function collapseScmEntry(id) { | |
71 | var els = document.getElementsByClassName(id, 'browser'); |
|
78 | var els = document.getElementsByClassName(id, 'browser'); | |
72 | for (var i = 0; i < els.length; i++) { |
|
79 | for (var i = 0; i < els.length; i++) { | |
73 | if (els[i].hasClassName('open')) { |
|
80 | if (els[i].hasClassName('open')) { | |
74 | collapseScmEntry(els[i].id); |
|
81 | collapseScmEntry(els[i].id); | |
75 | } |
|
82 | } | |
76 | Element.hide(els[i]); |
|
83 | Element.hide(els[i]); | |
77 | } |
|
84 | } | |
78 | $(id).removeClassName('open'); |
|
85 | $(id).removeClassName('open'); | |
79 | } |
|
86 | } | |
80 |
|
87 | |||
81 | function expandScmEntry(id) { |
|
88 | function expandScmEntry(id) { | |
82 | var els = document.getElementsByClassName(id, 'browser'); |
|
89 | var els = document.getElementsByClassName(id, 'browser'); | |
83 | for (var i = 0; i < els.length; i++) { |
|
90 | for (var i = 0; i < els.length; i++) { | |
84 | Element.show(els[i]); |
|
91 | Element.show(els[i]); | |
85 | if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) { |
|
92 | if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) { | |
86 | expandScmEntry(els[i].id); |
|
93 | expandScmEntry(els[i].id); | |
87 | } |
|
94 | } | |
88 | } |
|
95 | } | |
89 | $(id).addClassName('open'); |
|
96 | $(id).addClassName('open'); | |
90 | } |
|
97 | } | |
91 |
|
98 | |||
92 | function scmEntryClick(id) { |
|
99 | function scmEntryClick(id) { | |
93 | el = $(id); |
|
100 | el = $(id); | |
94 | if (el.hasClassName('open')) { |
|
101 | if (el.hasClassName('open')) { | |
95 | collapseScmEntry(id); |
|
102 | collapseScmEntry(id); | |
96 | el.addClassName('collapsed'); |
|
103 | el.addClassName('collapsed'); | |
97 | return false; |
|
104 | return false; | |
98 | } else if (el.hasClassName('loaded')) { |
|
105 | } else if (el.hasClassName('loaded')) { | |
99 | expandScmEntry(id); |
|
106 | expandScmEntry(id); | |
100 | el.removeClassName('collapsed'); |
|
107 | el.removeClassName('collapsed'); | |
101 | return false; |
|
108 | return false; | |
102 | } |
|
109 | } | |
103 | if (el.hasClassName('loading')) { |
|
110 | if (el.hasClassName('loading')) { | |
104 | return false; |
|
111 | return false; | |
105 | } |
|
112 | } | |
106 | el.addClassName('loading'); |
|
113 | el.addClassName('loading'); | |
107 | return true; |
|
114 | return true; | |
108 | } |
|
115 | } | |
109 |
|
116 | |||
110 | function scmEntryLoaded(id) { |
|
117 | function scmEntryLoaded(id) { | |
111 | Element.addClassName(id, 'open'); |
|
118 | Element.addClassName(id, 'open'); | |
112 | Element.addClassName(id, 'loaded'); |
|
119 | Element.addClassName(id, 'loaded'); | |
113 | Element.removeClassName(id, 'loading'); |
|
120 | Element.removeClassName(id, 'loading'); | |
114 | } |
|
121 | } | |
115 |
|
122 | |||
116 | function randomKey(size) { |
|
123 | function randomKey(size) { | |
117 | var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); |
|
124 | var chars = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'); | |
118 | var key = ''; |
|
125 | var key = ''; | |
119 | for (i = 0; i < size; i++) { |
|
126 | for (i = 0; i < size; i++) { | |
120 | key += chars[Math.floor(Math.random() * chars.length)]; |
|
127 | key += chars[Math.floor(Math.random() * chars.length)]; | |
121 | } |
|
128 | } | |
122 | return key; |
|
129 | return key; | |
123 | } |
|
130 | } | |
124 |
|
131 | |||
125 | /* shows and hides ajax indicator */ |
|
132 | /* shows and hides ajax indicator */ | |
126 | Ajax.Responders.register({ |
|
133 | Ajax.Responders.register({ | |
127 | onCreate: function(){ |
|
134 | onCreate: function(){ | |
128 | if ($('ajax-indicator') && Ajax.activeRequestCount > 0) { |
|
135 | if ($('ajax-indicator') && Ajax.activeRequestCount > 0) { | |
129 | Element.show('ajax-indicator'); |
|
136 | Element.show('ajax-indicator'); | |
130 | } |
|
137 | } | |
131 | }, |
|
138 | }, | |
132 | onComplete: function(){ |
|
139 | onComplete: function(){ | |
133 | if ($('ajax-indicator') && Ajax.activeRequestCount == 0) { |
|
140 | if ($('ajax-indicator') && Ajax.activeRequestCount == 0) { | |
134 | Element.hide('ajax-indicator'); |
|
141 | Element.hide('ajax-indicator'); | |
135 | } |
|
142 | } | |
136 | } |
|
143 | } | |
137 | }); |
|
144 | }); |
General Comments 0
You need to be logged in to leave comments.
Login now