##// END OF EJS Templates
Fixed: changing user/roles of project member not possible without javascript (#4852)...
Jean-Philippe Lang -
r3369:f7bd0801f6dc
parent child
Show More
@@ -1,82 +1,82
1 1 <%= error_messages_for 'member' %>
2 2 <% roles = Role.find_all_givable
3 3 members = @project.member_principals.find(:all, :include => [:roles, :principal]).sort %>
4 4
5 5 <div class="splitcontentleft">
6 6 <% if members.any? %>
7 7 <table class="list members">
8 8 <thead>
9 9 <th><%= l(:label_user) %> / <%= l(:label_group) %></th>
10 10 <th><%= l(:label_role_plural) %></th>
11 11 <th style="width:15%"></th>
12 12 <%= call_hook(:view_projects_settings_members_table_header, :project => @project) %>
13 13 </thead>
14 14 <tbody>
15 15 <% members.each do |member| %>
16 16 <% next if member.new_record? %>
17 17 <tr id="member-<%= member.id %>" class="<%= cycle 'odd', 'even' %> member">
18 18 <td class="<%= member.principal.class.name.downcase %>"><%= link_to_user member.principal %></td>
19 19 <td class="roles">
20 20 <span id="member-<%= member.id %>-roles"><%=h member.roles.sort.collect(&:to_s).join(', ') %></span>
21 21 <% if authorize_for('members', 'edit') %>
22 22 <% remote_form_for(:member, member, :url => {:controller => 'members', :action => 'edit', :id => member},
23 23 :method => :post,
24 :html => { :id => "member-#{member.id}-roles-form", :style => 'display:none;' }) do |f| %>
24 :html => { :id => "member-#{member.id}-roles-form", :class => 'hol' }) do |f| %>
25 25 <p><% roles.each do |role| %>
26 26 <label><%= check_box_tag 'member[role_ids][]', role.id, member.roles.include?(role),
27 27 :disabled => member.member_roles.detect {|mr| mr.role_id == role.id && !mr.inherited_from.nil?} %> <%=h role %></label><br />
28 28 <% end %></p>
29 29 <%= hidden_field_tag 'member[role_ids][]', '' %>
30 30 <p><%= submit_tag l(:button_change), :class => "small" %>
31 31 <%= link_to_function l(:button_cancel), "$('member-#{member.id}-roles').show(); $('member-#{member.id}-roles-form').hide(); return false;" %></p>
32 32 <% end %>
33 33 <% end %>
34 34 </td>
35 35 <td class="buttons">
36 36 <%= link_to_function l(:button_edit), "$('member-#{member.id}-roles').hide(); $('member-#{member.id}-roles-form').show(); return false;", :class => 'icon icon-edit' %>
37 37 <%= link_to_remote(l(:button_delete), { :url => {:controller => 'members', :action => 'destroy', :id => member},
38 38 :method => :post,
39 39 :confirm => (!User.current.admin? && member.include?(User.current) ? l(:text_own_membership_delete_confirmation) : nil)
40 40 }, :title => l(:button_delete),
41 41 :class => 'icon icon-del') if member.deletable? %>
42 42 </td>
43 43 <%= call_hook(:view_projects_settings_members_table_row, { :project => @project, :member => member}) %>
44 44 </tr>
45 45 </tbody>
46 46 <% end; reset_cycle %>
47 47 </table>
48 48 <% else %>
49 49 <p class="nodata"><%= l(:label_no_data) %></p>
50 50 <% end %>
51 51 </div>
52 52
53 53
54 54 <% principals = Principal.active.find(:all, :limit => 100, :order => 'type, login, lastname ASC') - @project.principals %>
55 55
56 56 <div class="splitcontentright">
57 57 <% if roles.any? && principals.any? %>
58 58 <% remote_form_for(:member, @member, :url => {:controller => 'members', :action => 'new', :id => @project}, :method => :post) do |f| %>
59 59 <fieldset><legend><%=l(:label_member_new)%></legend>
60 60
61 61 <p><%= text_field_tag 'principal_search', nil, :size => "40" %></p>
62 62 <%= observe_field(:principal_search,
63 63 :frequency => 0.5,
64 64 :update => :principals,
65 65 :url => { :controller => 'members', :action => 'autocomplete_for_member', :id => @project },
66 66 :with => 'q')
67 67 %>
68 68
69 69 <div id="principals">
70 70 <%= principals_check_box_tags 'member[user_ids][]', principals %>
71 71 </div>
72 72
73 73 <p><%= l(:label_role_plural) %>:
74 74 <% roles.each do |role| %>
75 75 <label><%= check_box_tag 'member[role_ids][]', role.id %> <%=h role %></label>
76 76 <% end %></p>
77 77
78 78 <p><%= submit_tag l(:button_add) %></p>
79 79 </fieldset>
80 80 <% end %>
81 81 <% end %>
82 82 </div>
@@ -1,209 +1,215
1 1 /* redMine - project management software
2 2 Copyright (C) 2006-2008 Jean-Philippe Lang */
3 3
4 4 function checkAll (id, checked) {
5 5 var els = Element.descendants(id);
6 6 for (var i = 0; i < els.length; i++) {
7 7 if (els[i].disabled==false) {
8 8 els[i].checked = checked;
9 9 }
10 10 }
11 11 }
12 12
13 13 function toggleCheckboxesBySelector(selector) {
14 14 boxes = $$(selector);
15 15 var all_checked = true;
16 16 for (i = 0; i < boxes.length; i++) { if (boxes[i].checked == false) { all_checked = false; } }
17 17 for (i = 0; i < boxes.length; i++) { boxes[i].checked = !all_checked; }
18 18 }
19 19
20 20 function showAndScrollTo(id, focus) {
21 21 Element.show(id);
22 22 if (focus!=null) { Form.Element.focus(focus); }
23 23 Element.scrollTo(id);
24 24 }
25 25
26 26 function toggleRowGroup(el) {
27 27 var tr = Element.up(el, 'tr');
28 28 var n = Element.next(tr);
29 29 tr.toggleClassName('open');
30 30 while (n != undefined && !n.hasClassName('group')) {
31 31 Element.toggle(n);
32 32 n = Element.next(n);
33 33 }
34 34 }
35 35
36 36 function toggleFieldset(el) {
37 37 var fieldset = Element.up(el, 'fieldset');
38 38 fieldset.toggleClassName('collapsed');
39 39 Effect.toggle(fieldset.down('div'), 'slide', {duration:0.2});
40 40 }
41 41
42 42 var fileFieldCount = 1;
43 43
44 44 function addFileField() {
45 45 if (fileFieldCount >= 10) return false
46 46 fileFieldCount++;
47 47 var f = document.createElement("input");
48 48 f.type = "file";
49 49 f.name = "attachments[" + fileFieldCount + "][file]";
50 50 f.size = 30;
51 51 var d = document.createElement("input");
52 52 d.type = "text";
53 53 d.name = "attachments[" + fileFieldCount + "][description]";
54 54 d.size = 60;
55 55
56 56 p = document.getElementById("attachments_fields");
57 57 p.appendChild(document.createElement("br"));
58 58 p.appendChild(f);
59 59 p.appendChild(d);
60 60 }
61 61
62 62 function showTab(name) {
63 63 var f = $$('div#content .tab-content');
64 64 for(var i=0; i<f.length; i++){
65 65 Element.hide(f[i]);
66 66 }
67 67 var f = $$('div.tabs a');
68 68 for(var i=0; i<f.length; i++){
69 69 Element.removeClassName(f[i], "selected");
70 70 }
71 71 Element.show('tab-content-' + name);
72 72 Element.addClassName('tab-' + name, "selected");
73 73 return false;
74 74 }
75 75
76 76 function moveTabRight(el) {
77 77 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
78 78 var tabsWidth = 0;
79 79 var i;
80 80 for (i=0; i<lis.length; i++) {
81 81 if (lis[i].visible()) {
82 82 tabsWidth += lis[i].getWidth() + 6;
83 83 }
84 84 }
85 85 if (tabsWidth < Element.up(el, 'div.tabs').getWidth() - 60) {
86 86 return;
87 87 }
88 88 i=0;
89 89 while (i<lis.length && !lis[i].visible()) {
90 90 i++;
91 91 }
92 92 lis[i].hide();
93 93 }
94 94
95 95 function moveTabLeft(el) {
96 96 var lis = Element.up(el, 'div.tabs').down('ul').childElements();
97 97 var i = 0;
98 98 while (i<lis.length && !lis[i].visible()) {
99 99 i++;
100 100 }
101 101 if (i>0) {
102 102 lis[i-1].show();
103 103 }
104 104 }
105 105
106 106 function displayTabsButtons() {
107 107 var lis;
108 108 var tabsWidth = 0;
109 109 var i;
110 110 $$('div.tabs').each(function(el) {
111 111 lis = el.down('ul').childElements();
112 112 for (i=0; i<lis.length; i++) {
113 113 if (lis[i].visible()) {
114 114 tabsWidth += lis[i].getWidth() + 6;
115 115 }
116 116 }
117 117 if ((tabsWidth < el.getWidth() - 60) && (lis[0].visible())) {
118 118 el.down('div.tabs-buttons').hide();
119 119 } else {
120 120 el.down('div.tabs-buttons').show();
121 121 }
122 122 });
123 123 }
124 124
125 125 function setPredecessorFieldsVisibility() {
126 126 relationType = $('relation_relation_type');
127 127 if (relationType && (relationType.value == "precedes" || relationType.value == "follows")) {
128 128 Element.show('predecessor_fields');
129 129 } else {
130 130 Element.hide('predecessor_fields');
131 131 }
132 132 }
133 133
134 134 function promptToRemote(text, param, url) {
135 135 value = prompt(text + ':');
136 136 if (value) {
137 137 new Ajax.Request(url + '?' + param + '=' + encodeURIComponent(value), {asynchronous:true, evalScripts:true});
138 138 return false;
139 139 }
140 140 }
141 141
142 142 function collapseScmEntry(id) {
143 143 var els = document.getElementsByClassName(id, 'browser');
144 144 for (var i = 0; i < els.length; i++) {
145 145 if (els[i].hasClassName('open')) {
146 146 collapseScmEntry(els[i].id);
147 147 }
148 148 Element.hide(els[i]);
149 149 }
150 150 $(id).removeClassName('open');
151 151 }
152 152
153 153 function expandScmEntry(id) {
154 154 var els = document.getElementsByClassName(id, 'browser');
155 155 for (var i = 0; i < els.length; i++) {
156 156 Element.show(els[i]);
157 157 if (els[i].hasClassName('loaded') && !els[i].hasClassName('collapsed')) {
158 158 expandScmEntry(els[i].id);
159 159 }
160 160 }
161 161 $(id).addClassName('open');
162 162 }
163 163
164 164 function scmEntryClick(id) {
165 165 el = $(id);
166 166 if (el.hasClassName('open')) {
167 167 collapseScmEntry(id);
168 168 el.addClassName('collapsed');
169 169 return false;
170 170 } else if (el.hasClassName('loaded')) {
171 171 expandScmEntry(id);
172 172 el.removeClassName('collapsed');
173 173 return false;
174 174 }
175 175 if (el.hasClassName('loading')) {
176 176 return false;
177 177 }
178 178 el.addClassName('loading');
179 179 return true;
180 180 }
181 181
182 182 function scmEntryLoaded(id) {
183 183 Element.addClassName(id, 'open');
184 184 Element.addClassName(id, 'loaded');
185 185 Element.removeClassName(id, 'loading');
186 186 }
187 187
188 188 function randomKey(size) {
189 189 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');
190 190 var key = '';
191 191 for (i = 0; i < size; i++) {
192 192 key += chars[Math.floor(Math.random() * chars.length)];
193 193 }
194 194 return key;
195 195 }
196 196
197 197 /* shows and hides ajax indicator */
198 198 Ajax.Responders.register({
199 199 onCreate: function(){
200 200 if ($('ajax-indicator') && Ajax.activeRequestCount > 0) {
201 201 Element.show('ajax-indicator');
202 202 }
203 203 },
204 204 onComplete: function(){
205 205 if ($('ajax-indicator') && Ajax.activeRequestCount == 0) {
206 206 Element.hide('ajax-indicator');
207 207 }
208 208 }
209 209 });
210
211 Event.observe(window, 'load', function() {
212 $$('.hol').each(function(el) {
213 el.hide();
214 });
215 });
General Comments 0
You need to be logged in to leave comments. Login now