comparison pylons_app/templates/settings/repo_settings.html @ 362:558eb7c5028f rhodecode-0.0.0.8.0

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