##// END OF EJS Templates
Merged r3784 from trunk....
Eric Davis -
r3679:14074da8b180
parent child
Show More
@@ -1,89 +1,95
1 1 # redMine - project management software
2 2 # Copyright (C) 2006 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 class MembersController < ApplicationController
19 19 before_filter :find_member, :except => [:new, :autocomplete_for_member]
20 20 before_filter :find_project, :only => [:new, :autocomplete_for_member]
21 21 before_filter :authorize
22 22
23 23 def new
24 24 members = []
25 25 if params[:member] && request.post?
26 26 attrs = params[:member].dup
27 27 if (user_ids = attrs.delete(:user_ids))
28 28 user_ids.each do |user_id|
29 29 members << Member.new(attrs.merge(:user_id => user_id))
30 30 end
31 31 else
32 32 members << Member.new(attrs)
33 33 end
34 34 @project.members << members
35 35 end
36 36 respond_to do |format|
37 37 format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
38 38 format.js {
39 39 render(:update) {|page|
40 40 page.replace_html "tab-content-members", :partial => 'projects/settings/members'
41 page << 'hideOnLoad()'
41 42 members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") }
42 43 }
43 44 }
44 45 end
45 46 end
46 47
47 48 def edit
48 49 if request.post? and @member.update_attributes(params[:member])
49 50 respond_to do |format|
50 51 format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
51 52 format.js {
52 53 render(:update) {|page|
53 54 page.replace_html "tab-content-members", :partial => 'projects/settings/members'
55 page << 'hideOnLoad()'
54 56 page.visual_effect(:highlight, "member-#{@member.id}")
55 57 }
56 58 }
57 59 end
58 60 end
59 61 end
60 62
61 63 def destroy
62 64 if request.post? && @member.deletable?
63 65 @member.destroy
64 66 end
65 67 respond_to do |format|
66 68 format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
67 format.js { render(:update) {|page| page.replace_html "tab-content-members", :partial => 'projects/settings/members'} }
69 format.js { render(:update) {|page|
70 page.replace_html "tab-content-members", :partial => 'projects/settings/members'
71 page << 'hideOnLoad()'
72 }
73 }
68 74 end
69 75 end
70 76
71 77 def autocomplete_for_member
72 78 @principals = Principal.active.like(params[:q]).find(:all, :limit => 100) - @project.principals
73 79 render :layout => false
74 80 end
75 81
76 82 private
77 83 def find_project
78 84 @project = Project.find(params[:id])
79 85 rescue ActiveRecord::RecordNotFound
80 86 render_404
81 87 end
82 88
83 89 def find_member
84 90 @member = Member.find(params[:id])
85 91 @project = @member.project
86 92 rescue ActiveRecord::RecordNotFound
87 93 render_404
88 94 end
89 95 end
@@ -1,209 +1,218
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 function hideOnLoad() {
212 $$('.hol').each(function(el) {
213 el.hide();
214 });
215 }
216
217 Event.observe(window, 'load', hideOnLoad);
218
General Comments 0
You need to be logged in to leave comments. Login now