comparison pylons_app/templates/settings/repo_settings.html @ 320:05b212954275

Implemented owner settings, as separete posibility to edit repositry by non administrative owner of repository
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 30 Jun 2010 15:35:10 +0200
parents
children 558eb7c5028f
comparison
equal deleted inserted replaced
319:c12f4d19c950 320:05b212954275
1 ## -*- coding: utf-8 -*-
2 <%inherit file="/base/base.html"/>
3
4 <%def name="title()">
5 ${_('Repository settings')}
6 </%def>
7 <%def name="breadcrumbs()">
8 ${h.link_to(u'Home',h.url('/'))}
9 /
10 ${h.link_to(c.repo_name,h.url('shortlog_home',repo_name=c.repo_name))}
11 /
12 ${_('settings')}
13 </%def>
14 <%def name="page_nav()">
15 ${self.menu('settings')}
16 </%def>
17 <%def name="main()">
18 <h2 class="no-link no-border">${_('Settings')}</h2>
19 <div>
20 ${h.form(url('repo_settings_update', repo_name=c.repo_info.repo_name),method='put')}
21 <table>
22 <tr>
23 <td>${_('Name')}</td>
24 <td>${h.text('repo_name',size="28")}</td>
25 <td>${self.get_form_error('repo_name')}</td>
26 </tr>
27 <tr>
28 <td>${_('Description')}</td>
29 <td>${h.textarea('description',cols=32,rows=5)}</td>
30 <td>${self.get_form_error('description')}</td>
31 </tr>
32 <tr>
33 <td>${_('Private')}</td>
34 <td>${h.checkbox('private',value="True")}</td>
35 <td>${self.get_form_error('private')}</td>
36 </tr>
37 <tr>
38 <td>${_('Permissions')}</td>
39 <td>
40 <table>
41 <tr>
42 <td>${_('none')}</td>
43 <td>${_('read')}</td>
44 <td>${_('write')}</td>
45 <td>${_('admin')}</td>
46 <td>${_('user')}</td>
47 </tr>
48
49 %for r2p in c.repo_info.repo2perm:
50 %if r2p.user.username =='default' and c.repo_info.private:
51 <tr>
52 <td colspan="4">
53 <span style="font-size: 0.8em">${_('disabled for private repository')}</span></td>
54 <td>${r2p.user.username}</td>
55 </tr>
56 %else:
57 <tr id=${id(r2p.user.username)}>
58 <td>${h.radio('perm_%s' % r2p.user.username,'repository.none')}</td>
59 <td>${h.radio('perm_%s' % r2p.user.username,'repository.read')}</td>
60 <td>${h.radio('perm_%s' % r2p.user.username,'repository.write')}</td>
61 <td>${h.radio('perm_%s' % r2p.user.username,'repository.admin')}</td>
62 <td>${r2p.user.username}</td>
63 <td>
64 %if r2p.user.username !='default':
65 <span class="delete_icon action_button" onclick="ajaxAction(${r2p.user.user_id},${id(r2p.user.username)})">
66 <script type="text/javascript">
67 function ajaxAction(user_id,field_id){
68 var sUrl = "${h.url('delete_repo_user',repo_name=c.repo_name)}";
69 var callback = { success:function(o){
70 YAHOO.util.Dom.get(String(field_id)).innerHTML = '<td colspan="6"></td>';
71 }};
72 var postData = '_method=delete&user_id='+user_id;
73 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
74 };
75 </script>
76 </span>
77 %endif
78 </td>
79 </tr>
80 %endif
81 %endfor
82 <%
83 if not hasattr(c,'form_errors'):
84 d = 'display:none;'
85 else:
86 d=''
87 %>
88
89 <tr id="add_perm_input" style="${d}">
90 <td>${h.radio('perm_new_user','repository.none')}</td>
91 <td>${h.radio('perm_new_user','repository.read')}</td>
92 <td>${h.radio('perm_new_user','repository.write')}</td>
93 <td>${h.radio('perm_new_user','repository.admin')}</td>
94 <td class='ac'>
95 <div id="perm_ac">
96 ${h.text('perm_new_user_name',class_='yui-ac-input')}
97 <div id="perm_container"></div>
98 </div>
99 </td>
100 <td>${self.get_form_error('perm_new_user_name')}</td>
101 </tr>
102 <tr>
103 <td colspan="4">
104 <span id="add_perm" class="add_icon" style="cursor: pointer;">
105 ${_('Add another user')}
106 </span>
107 </td>
108 </tr>
109 </table>
110 </td>
111
112 </tr>
113 <tr>
114 <td></td>
115 <td>${h.submit('update','update')}</td>
116 </tr>
117
118 </table>
119 ${h.end_form()}
120 <script type="text/javascript">
121 YAHOO.util.Event.onDOMReady(function(){
122 var D = YAHOO.util.Dom;
123 YAHOO.util.Event.addListener('add_perm','click',function(){
124 D.setStyle('add_perm_input','display','');
125 D.setStyle('add_perm','opacity','0.6');
126 D.setStyle('add_perm','cursor','default');
127 });
128 });
129 </script>
130 <script type="text/javascript">
131 YAHOO.example.FnMultipleFields = function(){
132 var myContacts = ${c.users_array|n}
133
134 // Define a custom search function for the DataSource
135 var matchNames = function(sQuery) {
136 // Case insensitive matching
137 var query = sQuery.toLowerCase(),
138 contact,
139 i=0,
140 l=myContacts.length,
141 matches = [];
142
143 // Match against each name of each contact
144 for(; i<l; i++) {
145 contact = myContacts[i];
146 if((contact.fname.toLowerCase().indexOf(query) > -1) ||
147 (contact.lname.toLowerCase().indexOf(query) > -1) ||
148 (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
149 matches[matches.length] = contact;
150 }
151 }
152
153 return matches;
154 };
155
156 // Use a FunctionDataSource
157 var oDS = new YAHOO.util.FunctionDataSource(matchNames);
158 oDS.responseSchema = {
159 fields: ["id", "fname", "lname", "nname"]
160 }
161
162 // Instantiate AutoComplete for perms
163 var oAC_perms = new YAHOO.widget.AutoComplete("perm_new_user_name", "perm_container", oDS);
164 oAC_perms.useShadow = false;
165 oAC_perms.resultTypeList = false;
166
167 // Instantiate AutoComplete for owner
168 var oAC_owner = new YAHOO.widget.AutoComplete("user", "owner_container", oDS);
169 oAC_owner.useShadow = false;
170 oAC_owner.resultTypeList = false;
171
172
173 // Custom formatter to highlight the matching letters
174 var custom_formatter = function(oResultData, sQuery, sResultMatch) {
175 var query = sQuery.toLowerCase(),
176 fname = oResultData.fname,
177 lname = oResultData.lname,
178 nname = oResultData.nname || "", // Guard against null value
179 query = sQuery.toLowerCase(),
180 fnameMatchIndex = fname.toLowerCase().indexOf(query),
181 lnameMatchIndex = lname.toLowerCase().indexOf(query),
182 nnameMatchIndex = nname.toLowerCase().indexOf(query),
183 displayfname, displaylname, displaynname;
184
185 if(fnameMatchIndex > -1) {
186 displayfname = highlightMatch(fname, query, fnameMatchIndex);
187 }
188 else {
189 displayfname = fname;
190 }
191
192 if(lnameMatchIndex > -1) {
193 displaylname = highlightMatch(lname, query, lnameMatchIndex);
194 }
195 else {
196 displaylname = lname;
197 }
198
199 if(nnameMatchIndex > -1) {
200 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
201 }
202 else {
203 displaynname = nname ? "(" + nname + ")" : "";
204 }
205
206 return displayfname + " " + displaylname + " " + displaynname;
207
208 };
209 oAC_perms.formatResult = custom_formatter;
210 oAC_owner.formatResult = custom_formatter;
211
212 // Helper function for the formatter
213 var highlightMatch = function(full, snippet, matchindex) {
214 return full.substring(0, matchindex) +
215 "<span class='match'>" +
216 full.substr(matchindex, snippet.length) +
217 "</span>" +
218 full.substring(matchindex + snippet.length);
219 };
220
221 var myHandler = function(sType, aArgs) {
222 var myAC = aArgs[0]; // reference back to the AC instance
223 var elLI = aArgs[1]; // reference to the selected LI element
224 var oData = aArgs[2]; // object literal of selected item's result data
225 myAC.getInputEl().value = oData.nname;
226 };
227
228 oAC_perms.itemSelectEvent.subscribe(myHandler);
229 oAC_owner.itemSelectEvent.subscribe(myHandler);
230
231 return {
232 oDS: oDS,
233 oAC_perms: oAC_perms,
234 oAC_owner: oAC_owner,
235 };
236 }();
237
238 </script>
239 </div>
240 </%def>