##// END OF EJS Templates
added "add group" shortcuts for admins, and group admins
marcink -
r3369:667630c9 beta
parent child Browse files
Show More
@@ -1,334 +1,340 b''
1 1 <%page args="parent" />
2 2 <div class="box">
3 3 <!-- box / title -->
4 4 <div class="title">
5 5 <h5>
6 6 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" value="${_('quick filter...')}"/> ${parent.breadcrumbs()} <span id="repo_count">0</span> ${_('repositories')}
7 7 </h5>
8 8 %if c.rhodecode_user.username != 'default':
9 9 <ul class="links">
10 10 %if h.HasPermissionAny('hg.admin','hg.create.repository')() or h.HasReposGroupPermissionAny('group.write', 'group.admin')(c.group.group_name if c.group else None):
11 11 <li>
12 12 %if c.group:
13 13 <span>${h.link_to(_('Add repository'),h.url('admin_settings_create_repository',parent_group=c.group.group_id))}</span>
14 %if h.HasPermissionAny('hg.admin')() or h.HasReposGroupPermissionAny('group.admin')(c.group.group_name):
15 <span>${h.link_to(_(u'Add group'),h.url('new_repos_group', parent_group=c.group.group_id))}</span>
16 %endif
14 17 %else:
15 18 <span>${h.link_to(_('Add repository'),h.url('admin_settings_create_repository'))}</span>
19 %if h.HasPermissionAny('hg.admin')():
20 <span>${h.link_to(_(u'Add group'),h.url('new_repos_group'))}</span>
21 %endif
16 22 %endif
17 23 </li>
18 24 %endif
19 25 %if c.group and h.HasReposGroupPermissionAny('group.admin')(c.group.group_name):
20 26 <li>
21 27 <span>${h.link_to(_('Edit group'),h.url('edit_repos_group',group_name=c.group.group_name), title=_('You have admin right to this group, and can edit it'))}</span>
22 28 </li>
23 29 %endif
24 30 </ul>
25 31 %endif
26 32 </div>
27 33 <!-- end box / title -->
28 34 <div class="table">
29 35 % if c.groups:
30 36 <div id='groups_list_wrap' class="yui-skin-sam">
31 37 <table id="groups_list">
32 38 <thead>
33 39 <tr>
34 40 <th class="left"><a href="#">${_('Group name')}</a></th>
35 41 <th class="left"><a href="#">${_('Description')}</a></th>
36 42 ##<th class="left"><a href="#">${_('Number of repositories')}</a></th>
37 43 </tr>
38 44 </thead>
39 45
40 46 ## REPO GROUPS
41 47 % for gr in c.groups:
42 48 <tr>
43 49 <td>
44 50 <div style="white-space: nowrap">
45 51 <img class="icon" alt="${_('Repositories group')}" src="${h.url('/images/icons/database_link.png')}"/>
46 52 ${h.link_to(gr.name,url('repos_group_home',group_name=gr.group_name))}
47 53 </div>
48 54 </td>
49 55 %if c.visual.stylify_metatags:
50 56 <td>${h.urlify_text(h.desc_stylize(gr.group_description))}</td>
51 57 %else:
52 58 <td>${gr.group_description}</td>
53 59 %endif
54 60 ## this is commented out since for multi nested repos can be HEAVY!
55 61 ## in number of executed queries during traversing uncomment at will
56 62 ##<td><b>${gr.repositories_recursive_count}</b></td>
57 63 </tr>
58 64 % endfor
59 65 </table>
60 66 </div>
61 67 <div id="group-user-paginator" style="padding: 0px 0px 0px 0px"></div>
62 68 <div style="height: 20px"></div>
63 69 % endif
64 70 <div id="welcome" style="display:none;text-align:center">
65 71 <h1><a href="${h.url('home')}">${c.rhodecode_name} ${c.rhodecode_version}</a></h1>
66 72 </div>
67 73 <%cnt=0%>
68 74 <%namespace name="dt" file="/data_table/_dt_elements.html"/>
69 75 % if c.visual.lightweight_dashboard is False:
70 76 ## old full detailed version
71 77 <div id='repos_list_wrap' class="yui-skin-sam">
72 78 <table id="repos_list">
73 79 <thead>
74 80 <tr>
75 81 <th class="left"></th>
76 82 <th class="left">${_('Name')}</th>
77 83 <th class="left">${_('Description')}</th>
78 84 <th class="left">${_('Last change')}</th>
79 85 <th class="left">${_('Tip')}</th>
80 86 <th class="left">${_('Owner')}</th>
81 87 <th class="left">${_('Atom')}</th>
82 88 </tr>
83 89 </thead>
84 90 <tbody>
85 91 %for cnt,repo in enumerate(c.repos_list):
86 92 <tr class="parity${(cnt+1)%2}">
87 93 ##QUICK MENU
88 94 <td class="quick_repo_menu">
89 95 ${dt.quick_menu(repo['name'])}
90 96 </td>
91 97 ##REPO NAME AND ICONS
92 98 <td class="reponame">
93 99 ${dt.repo_name(repo['name'],repo['dbrepo']['repo_type'],repo['dbrepo']['private'],h.AttributeDict(repo['dbrepo_fork']),pageargs.get('short_repo_names'))}
94 100 </td>
95 101 ##DESCRIPTION
96 102 <td><span class="tooltip" title="${h.tooltip(repo['description'])}">
97 103 %if c.visual.stylify_metatags:
98 104 ${h.urlify_text(h.desc_stylize(h.truncate(repo['description'],60)))}</span>
99 105 %else:
100 106 ${h.truncate(repo['description'],60)}</span>
101 107 %endif
102 108 </td>
103 109 ##LAST CHANGE DATE
104 110 <td>
105 111 ${dt.last_change(repo['last_change'])}
106 112 </td>
107 113 ##LAST REVISION
108 114 <td>
109 115 ${dt.revision(repo['name'],repo['rev'],repo['tip'],repo['author'],repo['last_msg'])}
110 116 </td>
111 117 ##
112 118 <td title="${repo['contact']}">${h.person(repo['contact'])}</td>
113 119 <td>
114 120 ${dt.atom(repo['name'])}
115 121 </td>
116 122 </tr>
117 123 %endfor
118 124 </tbody>
119 125 </table>
120 126 </div>
121 127 % else:
122 128 ## lightweight version
123 129 <div class="yui-skin-sam" id="repos_list_wrap"></div>
124 130 <div id="user-paginator" style="padding: 0px 0px 0px 0px"></div>
125 131 % endif
126 132 </div>
127 133 </div>
128 134 % if c.visual.lightweight_dashboard is False:
129 135 <script>
130 136 YUD.get('repo_count').innerHTML = ${cnt+1 if cnt else 0};
131 137
132 138 // groups table sorting
133 139 var myColumnDefs = [
134 140 {key:"name",label:"${_('Group name')}",sortable:true,
135 141 sortOptions: { sortFunction: groupNameSort }},
136 142 {key:"desc",label:"${_('Description')}",sortable:true},
137 143 ];
138 144
139 145 var myDataSource = new YAHOO.util.DataSource(YUD.get("groups_list"));
140 146
141 147 myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
142 148 myDataSource.responseSchema = {
143 149 fields: [
144 150 {key:"name"},
145 151 {key:"desc"},
146 152 ]
147 153 };
148 154
149 155 var myDataTable = new YAHOO.widget.DataTable("groups_list_wrap", myColumnDefs, myDataSource,{
150 156 sortedBy:{key:"name",dir:"asc"},
151 157 paginator: new YAHOO.widget.Paginator({
152 158 rowsPerPage: 50,
153 159 alwaysVisible: false,
154 160 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
155 161 pageLinks: 5,
156 162 containerClass: 'pagination-wh',
157 163 currentPageClass: 'pager_curpage',
158 164 pageLinkClass: 'pager_link',
159 165 nextPageLinkLabel: '&gt;',
160 166 previousPageLinkLabel: '&lt;',
161 167 firstPageLinkLabel: '&lt;&lt;',
162 168 lastPageLinkLabel: '&gt;&gt;',
163 169 containers:['group-user-paginator']
164 170 }),
165 171 MSG_SORTASC:"${_('Click to sort ascending')}",
166 172 MSG_SORTDESC:"${_('Click to sort descending')}"
167 173 });
168 174
169 175 // main table sorting
170 176 var myColumnDefs = [
171 177 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
172 178 {key:"name",label:"${_('Name')}",sortable:true,
173 179 sortOptions: { sortFunction: nameSort }},
174 180 {key:"desc",label:"${_('Description')}",sortable:true},
175 181 {key:"last_change",label:"${_('Last Change')}",sortable:true,
176 182 sortOptions: { sortFunction: ageSort }},
177 183 {key:"tip",label:"${_('Tip')}",sortable:true,
178 184 sortOptions: { sortFunction: revisionSort }},
179 185 {key:"owner",label:"${_('Owner')}",sortable:true},
180 186 {key:"atom",label:"",sortable:false},
181 187 ];
182 188
183 189 var myDataSource = new YAHOO.util.DataSource(YUD.get("repos_list"));
184 190
185 191 myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
186 192
187 193 myDataSource.responseSchema = {
188 194 fields: [
189 195 {key:"menu"},
190 196 //{key:"raw_name"},
191 197 {key:"name"},
192 198 {key:"desc"},
193 199 {key:"last_change"},
194 200 {key:"tip"},
195 201 {key:"owner"},
196 202 {key:"atom"},
197 203 ]
198 204 };
199 205
200 206 var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,
201 207 {
202 208 sortedBy:{key:"name",dir:"asc"},
203 209 MSG_SORTASC:"${_('Click to sort ascending')}",
204 210 MSG_SORTDESC:"${_('Click to sort descending')}",
205 211 MSG_EMPTY:"${_('No records found.')}",
206 212 MSG_ERROR:"${_('Data error.')}",
207 213 MSG_LOADING:"${_('Loading...')}",
208 214 }
209 215 );
210 216 myDataTable.subscribe('postRenderEvent',function(oArgs) {
211 217 tooltip_activate();
212 218 quick_repo_menu();
213 219 var func = function(node){
214 220 return node.parentNode.parentNode.parentNode.parentNode;
215 221 }
216 222 q_filter('q_filter',YUQ('div.table tr td a.repo_name'),func);
217 223 });
218 224
219 225 </script>
220 226 % else:
221 227 <script>
222 228 var data = ${c.data|n};
223 229 var myDataSource = new YAHOO.util.DataSource(data);
224 230 myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
225 231
226 232 myDataSource.responseSchema = {
227 233 resultsList: "records",
228 234 fields: [
229 235 {key:"menu"},
230 236 {key:"raw_name"},
231 237 {key:"name"},
232 238 {key:"desc"},
233 239 {key:"last_change"},
234 240 {key:"last_changeset"},
235 241 {key:"owner"},
236 242 {key:"atom"},
237 243 ]
238 244 };
239 245 myDataSource.doBeforeCallback = function(req,raw,res,cb) {
240 246 // This is the filter function
241 247 var data = res.results || [],
242 248 filtered = [],
243 249 i,l;
244 250
245 251 if (req) {
246 252 req = req.toLowerCase();
247 253 for (i = 0; i<data.length; i++) {
248 254 var pos = data[i].raw_name.toLowerCase().indexOf(req)
249 255 if (pos != -1) {
250 256 filtered.push(data[i]);
251 257 }
252 258 }
253 259 res.results = filtered;
254 260 }
255 261 YUD.get('repo_count').innerHTML = res.results.length;
256 262 return res;
257 263 }
258 264
259 265 // main table sorting
260 266 var myColumnDefs = [
261 267 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
262 268 {key:"name",label:"${_('Name')}",sortable:true,
263 269 sortOptions: { sortFunction: nameSort }},
264 270 {key:"desc",label:"${_('Description')}",sortable:true},
265 271 {key:"last_change",label:"${_('Last Change')}",sortable:true,
266 272 sortOptions: { sortFunction: ageSort }},
267 273 {key:"last_changeset",label:"${_('Tip')}",sortable:true,
268 274 sortOptions: { sortFunction: revisionSort }},
269 275 {key:"owner",label:"${_('Owner')}",sortable:true},
270 276 {key:"atom",label:"",sortable:false},
271 277 ];
272 278
273 279 var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
274 280 sortedBy:{key:"name",dir:"asc"},
275 281 paginator: new YAHOO.widget.Paginator({
276 282 rowsPerPage: ${c.visual.lightweight_dashboard_items},
277 283 alwaysVisible: false,
278 284 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
279 285 pageLinks: 5,
280 286 containerClass: 'pagination-wh',
281 287 currentPageClass: 'pager_curpage',
282 288 pageLinkClass: 'pager_link',
283 289 nextPageLinkLabel: '&gt;',
284 290 previousPageLinkLabel: '&lt;',
285 291 firstPageLinkLabel: '&lt;&lt;',
286 292 lastPageLinkLabel: '&gt;&gt;',
287 293 containers:['user-paginator']
288 294 }),
289 295
290 296 MSG_SORTASC:"${_('Click to sort ascending')}",
291 297 MSG_SORTDESC:"${_('Click to sort descending')}",
292 298 MSG_EMPTY:"${_('No records found.')}",
293 299 MSG_ERROR:"${_('Data error.')}",
294 300 MSG_LOADING:"${_('Loading...')}",
295 301 }
296 302 );
297 303 myDataTable.subscribe('postRenderEvent',function(oArgs) {
298 304 tooltip_activate();
299 305 quick_repo_menu();
300 306 });
301 307
302 308 var filterTimeout = null;
303 309
304 310 updateFilter = function () {
305 311 // Reset timeout
306 312 filterTimeout = null;
307 313
308 314 // Reset sort
309 315 var state = myDataTable.getState();
310 316 state.sortedBy = {key:'name', dir:YAHOO.widget.DataTable.CLASS_ASC};
311 317
312 318 // Get filtered data
313 319 myDataSource.sendRequest(YUD.get('q_filter').value,{
314 320 success : myDataTable.onDataReturnInitializeTable,
315 321 failure : myDataTable.onDataReturnInitializeTable,
316 322 scope : myDataTable,
317 323 argument: state
318 324 });
319 325
320 326 };
321 327 YUE.on('q_filter','click',function(){
322 328 if(!YUD.hasClass('q_filter', 'loaded')){
323 329 YUD.get('q_filter').value = '';
324 330 //TODO: load here full list later to do search within groups
325 331 YUD.addClass('q_filter', 'loaded');
326 332 }
327 333 });
328 334
329 335 YUE.on('q_filter','keyup',function (e) {
330 336 clearTimeout(filterTimeout);
331 337 filterTimeout = setTimeout(updateFilter,600);
332 338 });
333 339 </script>
334 340 % endif
General Comments 0
You need to be logged in to leave comments. Login now