##// END OF EJS Templates
don't show rss links - atom is the present and the future...
Mads Kiilerich -
r3295:2e618376 beta
parent child Browse files
Show More
@@ -1,344 +1,336 b''
1 <%page args="parent" />
1 <%page args="parent" />
2 <div class="box">
2 <div class="box">
3 <!-- box / title -->
3 <!-- box / title -->
4 <div class="title">
4 <div class="title">
5 <h5>
5 <h5>
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')}
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 </h5>
7 </h5>
8 %if c.rhodecode_user.username != 'default':
8 %if c.rhodecode_user.username != 'default':
9 <ul class="links">
9 <ul class="links">
10 %if h.HasPermissionAny('hg.admin','hg.create.repository')():
10 %if h.HasPermissionAny('hg.admin','hg.create.repository')():
11 <li>
11 <li>
12 %if c.group:
12 %if c.group:
13 %if h.HasReposGroupPermissionAny('group.write', 'group.admin')(c.group.group_name):
13 %if h.HasReposGroupPermissionAny('group.write', 'group.admin')(c.group.group_name):
14 <span>${h.link_to(_('Add repository'),h.url('admin_settings_create_repository',parent_group=c.group.group_id))}</span>
14 <span>${h.link_to(_('Add repository'),h.url('admin_settings_create_repository',parent_group=c.group.group_id))}</span>
15 %endif
15 %endif
16 %else:
16 %else:
17 <span>${h.link_to(_('Add repository'),h.url('admin_settings_create_repository'))}</span>
17 <span>${h.link_to(_('Add repository'),h.url('admin_settings_create_repository'))}</span>
18 %endif
18 %endif
19 </li>
19 </li>
20 %endif
20 %endif
21 %if c.group and h.HasReposGroupPermissionAny('group.admin')(c.group.group_name):
21 %if c.group and h.HasReposGroupPermissionAny('group.admin')(c.group.group_name):
22 <li>
22 <li>
23 <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>
23 <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>
24 </li>
24 </li>
25 %endif
25 %endif
26 </ul>
26 </ul>
27 %endif
27 %endif
28 </div>
28 </div>
29 <!-- end box / title -->
29 <!-- end box / title -->
30 <div class="table">
30 <div class="table">
31 % if c.groups:
31 % if c.groups:
32 <div id='groups_list_wrap' class="yui-skin-sam">
32 <div id='groups_list_wrap' class="yui-skin-sam">
33 <table id="groups_list">
33 <table id="groups_list">
34 <thead>
34 <thead>
35 <tr>
35 <tr>
36 <th class="left"><a href="#">${_('Group name')}</a></th>
36 <th class="left"><a href="#">${_('Group name')}</a></th>
37 <th class="left"><a href="#">${_('Description')}</a></th>
37 <th class="left"><a href="#">${_('Description')}</a></th>
38 ##<th class="left"><a href="#">${_('Number of repositories')}</a></th>
38 ##<th class="left"><a href="#">${_('Number of repositories')}</a></th>
39 </tr>
39 </tr>
40 </thead>
40 </thead>
41
41
42 ## REPO GROUPS
42 ## REPO GROUPS
43 % for gr in c.groups:
43 % for gr in c.groups:
44 <tr>
44 <tr>
45 <td>
45 <td>
46 <div style="white-space: nowrap">
46 <div style="white-space: nowrap">
47 <img class="icon" alt="${_('Repositories group')}" src="${h.url('/images/icons/database_link.png')}"/>
47 <img class="icon" alt="${_('Repositories group')}" src="${h.url('/images/icons/database_link.png')}"/>
48 ${h.link_to(gr.name,url('repos_group_home',group_name=gr.group_name))}
48 ${h.link_to(gr.name,url('repos_group_home',group_name=gr.group_name))}
49 </div>
49 </div>
50 </td>
50 </td>
51 %if c.visual.stylify_metatags:
51 %if c.visual.stylify_metatags:
52 <td>${h.urlify_text(h.desc_stylize(gr.group_description))}</td>
52 <td>${h.urlify_text(h.desc_stylize(gr.group_description))}</td>
53 %else:
53 %else:
54 <td>${gr.group_description}</td>
54 <td>${gr.group_description}</td>
55 %endif
55 %endif
56 ## this is commented out since for multi nested repos can be HEAVY!
56 ## this is commented out since for multi nested repos can be HEAVY!
57 ## in number of executed queries during traversing uncomment at will
57 ## in number of executed queries during traversing uncomment at will
58 ##<td><b>${gr.repositories_recursive_count}</b></td>
58 ##<td><b>${gr.repositories_recursive_count}</b></td>
59 </tr>
59 </tr>
60 % endfor
60 % endfor
61 </table>
61 </table>
62 </div>
62 </div>
63 <div id="group-user-paginator" style="padding: 0px 0px 0px 0px"></div>
63 <div id="group-user-paginator" style="padding: 0px 0px 0px 0px"></div>
64 <div style="height: 20px"></div>
64 <div style="height: 20px"></div>
65 % endif
65 % endif
66 <div id="welcome" style="display:none;text-align:center">
66 <div id="welcome" style="display:none;text-align:center">
67 <h1><a href="${h.url('home')}">${c.rhodecode_name} ${c.rhodecode_version}</a></h1>
67 <h1><a href="${h.url('home')}">${c.rhodecode_name} ${c.rhodecode_version}</a></h1>
68 </div>
68 </div>
69 <%cnt=0%>
69 <%cnt=0%>
70 <%namespace name="dt" file="/data_table/_dt_elements.html"/>
70 <%namespace name="dt" file="/data_table/_dt_elements.html"/>
71 % if c.visual.lightweight_dashboard is False:
71 % if c.visual.lightweight_dashboard is False:
72 ## old full detailed version
72 ## old full detailed version
73 <div id='repos_list_wrap' class="yui-skin-sam">
73 <div id='repos_list_wrap' class="yui-skin-sam">
74 <table id="repos_list">
74 <table id="repos_list">
75 <thead>
75 <thead>
76 <tr>
76 <tr>
77 <th class="left"></th>
77 <th class="left"></th>
78 <th class="left">${_('Name')}</th>
78 <th class="left">${_('Name')}</th>
79 <th class="left">${_('Description')}</th>
79 <th class="left">${_('Description')}</th>
80 <th class="left">${_('Last change')}</th>
80 <th class="left">${_('Last change')}</th>
81 <th class="left">${_('Tip')}</th>
81 <th class="left">${_('Tip')}</th>
82 <th class="left">${_('Owner')}</th>
82 <th class="left">${_('Owner')}</th>
83 <th class="left">${_('RSS')}</th>
84 <th class="left">${_('Atom')}</th>
83 <th class="left">${_('Atom')}</th>
85 </tr>
84 </tr>
86 </thead>
85 </thead>
87 <tbody>
86 <tbody>
88 %for cnt,repo in enumerate(c.repos_list):
87 %for cnt,repo in enumerate(c.repos_list):
89 <tr class="parity${(cnt+1)%2}">
88 <tr class="parity${(cnt+1)%2}">
90 ##QUICK MENU
89 ##QUICK MENU
91 <td class="quick_repo_menu">
90 <td class="quick_repo_menu">
92 ${dt.quick_menu(repo['name'])}
91 ${dt.quick_menu(repo['name'])}
93 </td>
92 </td>
94 ##REPO NAME AND ICONS
93 ##REPO NAME AND ICONS
95 <td class="reponame">
94 <td class="reponame">
96 ${dt.repo_name(repo['name'],repo['dbrepo']['repo_type'],repo['dbrepo']['private'],h.AttributeDict(repo['dbrepo_fork']),pageargs.get('short_repo_names'))}
95 ${dt.repo_name(repo['name'],repo['dbrepo']['repo_type'],repo['dbrepo']['private'],h.AttributeDict(repo['dbrepo_fork']),pageargs.get('short_repo_names'))}
97 </td>
96 </td>
98 ##DESCRIPTION
97 ##DESCRIPTION
99 <td><span class="tooltip" title="${h.tooltip(repo['description'])}">
98 <td><span class="tooltip" title="${h.tooltip(repo['description'])}">
100 %if c.visual.stylify_metatags:
99 %if c.visual.stylify_metatags:
101 ${h.urlify_text(h.desc_stylize(h.truncate(repo['description'],60)))}</span>
100 ${h.urlify_text(h.desc_stylize(h.truncate(repo['description'],60)))}</span>
102 %else:
101 %else:
103 ${h.truncate(repo['description'],60)}</span>
102 ${h.truncate(repo['description'],60)}</span>
104 %endif
103 %endif
105 </td>
104 </td>
106 ##LAST CHANGE DATE
105 ##LAST CHANGE DATE
107 <td>
106 <td>
108 ${dt.last_change(repo['last_change'])}
107 ${dt.last_change(repo['last_change'])}
109 </td>
108 </td>
110 ##LAST REVISION
109 ##LAST REVISION
111 <td>
110 <td>
112 ${dt.revision(repo['name'],repo['rev'],repo['tip'],repo['author'],repo['last_msg'])}
111 ${dt.revision(repo['name'],repo['rev'],repo['tip'],repo['author'],repo['last_msg'])}
113 </td>
112 </td>
114 ##
113 ##
115 <td title="${repo['contact']}">${h.person(repo['contact'])}</td>
114 <td title="${repo['contact']}">${h.person(repo['contact'])}</td>
116 <td>
115 <td>
117 ${dt.rss(repo['name'])}
118 </td>
119 <td>
120 ${dt.atom(repo['name'])}
116 ${dt.atom(repo['name'])}
121 </td>
117 </td>
122 </tr>
118 </tr>
123 %endfor
119 %endfor
124 </tbody>
120 </tbody>
125 </table>
121 </table>
126 </div>
122 </div>
127 % else:
123 % else:
128 ## lightweight version
124 ## lightweight version
129 <div class="yui-skin-sam" id="repos_list_wrap"></div>
125 <div class="yui-skin-sam" id="repos_list_wrap"></div>
130 <div id="user-paginator" style="padding: 0px 0px 0px 0px"></div>
126 <div id="user-paginator" style="padding: 0px 0px 0px 0px"></div>
131 % endif
127 % endif
132 </div>
128 </div>
133 </div>
129 </div>
134 % if c.visual.lightweight_dashboard is False:
130 % if c.visual.lightweight_dashboard is False:
135 <script>
131 <script>
136 YUD.get('repo_count').innerHTML = ${cnt+1 if cnt else 0};
132 YUD.get('repo_count').innerHTML = ${cnt+1 if cnt else 0};
137
133
138 // groups table sorting
134 // groups table sorting
139 var myColumnDefs = [
135 var myColumnDefs = [
140 {key:"name",label:"${_('Group name')}",sortable:true,
136 {key:"name",label:"${_('Group name')}",sortable:true,
141 sortOptions: { sortFunction: groupNameSort }},
137 sortOptions: { sortFunction: groupNameSort }},
142 {key:"desc",label:"${_('Description')}",sortable:true},
138 {key:"desc",label:"${_('Description')}",sortable:true},
143 ];
139 ];
144
140
145 var myDataSource = new YAHOO.util.DataSource(YUD.get("groups_list"));
141 var myDataSource = new YAHOO.util.DataSource(YUD.get("groups_list"));
146
142
147 myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
143 myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
148 myDataSource.responseSchema = {
144 myDataSource.responseSchema = {
149 fields: [
145 fields: [
150 {key:"name"},
146 {key:"name"},
151 {key:"desc"},
147 {key:"desc"},
152 ]
148 ]
153 };
149 };
154
150
155 var myDataTable = new YAHOO.widget.DataTable("groups_list_wrap", myColumnDefs, myDataSource,{
151 var myDataTable = new YAHOO.widget.DataTable("groups_list_wrap", myColumnDefs, myDataSource,{
156 sortedBy:{key:"name",dir:"asc"},
152 sortedBy:{key:"name",dir:"asc"},
157 paginator: new YAHOO.widget.Paginator({
153 paginator: new YAHOO.widget.Paginator({
158 rowsPerPage: 50,
154 rowsPerPage: 50,
159 alwaysVisible: false,
155 alwaysVisible: false,
160 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
156 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
161 pageLinks: 5,
157 pageLinks: 5,
162 containerClass: 'pagination-wh',
158 containerClass: 'pagination-wh',
163 currentPageClass: 'pager_curpage',
159 currentPageClass: 'pager_curpage',
164 pageLinkClass: 'pager_link',
160 pageLinkClass: 'pager_link',
165 nextPageLinkLabel: '&gt;',
161 nextPageLinkLabel: '&gt;',
166 previousPageLinkLabel: '&lt;',
162 previousPageLinkLabel: '&lt;',
167 firstPageLinkLabel: '&lt;&lt;',
163 firstPageLinkLabel: '&lt;&lt;',
168 lastPageLinkLabel: '&gt;&gt;',
164 lastPageLinkLabel: '&gt;&gt;',
169 containers:['group-user-paginator']
165 containers:['group-user-paginator']
170 }),
166 }),
171 MSG_SORTASC:"${_('Click to sort ascending')}",
167 MSG_SORTASC:"${_('Click to sort ascending')}",
172 MSG_SORTDESC:"${_('Click to sort descending')}"
168 MSG_SORTDESC:"${_('Click to sort descending')}"
173 });
169 });
174
170
175 // main table sorting
171 // main table sorting
176 var myColumnDefs = [
172 var myColumnDefs = [
177 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
173 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
178 {key:"name",label:"${_('Name')}",sortable:true,
174 {key:"name",label:"${_('Name')}",sortable:true,
179 sortOptions: { sortFunction: nameSort }},
175 sortOptions: { sortFunction: nameSort }},
180 {key:"desc",label:"${_('Description')}",sortable:true},
176 {key:"desc",label:"${_('Description')}",sortable:true},
181 {key:"last_change",label:"${_('Last Change')}",sortable:true,
177 {key:"last_change",label:"${_('Last Change')}",sortable:true,
182 sortOptions: { sortFunction: ageSort }},
178 sortOptions: { sortFunction: ageSort }},
183 {key:"tip",label:"${_('Tip')}",sortable:true,
179 {key:"tip",label:"${_('Tip')}",sortable:true,
184 sortOptions: { sortFunction: revisionSort }},
180 sortOptions: { sortFunction: revisionSort }},
185 {key:"owner",label:"${_('Owner')}",sortable:true},
181 {key:"owner",label:"${_('Owner')}",sortable:true},
186 {key:"rss",label:"",sortable:false},
187 {key:"atom",label:"",sortable:false},
182 {key:"atom",label:"",sortable:false},
188 ];
183 ];
189
184
190 var myDataSource = new YAHOO.util.DataSource(YUD.get("repos_list"));
185 var myDataSource = new YAHOO.util.DataSource(YUD.get("repos_list"));
191
186
192 myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
187 myDataSource.responseType = YAHOO.util.DataSource.TYPE_HTMLTABLE;
193
188
194 myDataSource.responseSchema = {
189 myDataSource.responseSchema = {
195 fields: [
190 fields: [
196 {key:"menu"},
191 {key:"menu"},
197 //{key:"raw_name"},
192 //{key:"raw_name"},
198 {key:"name"},
193 {key:"name"},
199 {key:"desc"},
194 {key:"desc"},
200 {key:"last_change"},
195 {key:"last_change"},
201 {key:"tip"},
196 {key:"tip"},
202 {key:"owner"},
197 {key:"owner"},
203 {key:"rss"},
204 {key:"atom"},
198 {key:"atom"},
205 ]
199 ]
206 };
200 };
207
201
208 var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,
202 var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,
209 {
203 {
210 sortedBy:{key:"name",dir:"asc"},
204 sortedBy:{key:"name",dir:"asc"},
211 MSG_SORTASC:"${_('Click to sort ascending')}",
205 MSG_SORTASC:"${_('Click to sort ascending')}",
212 MSG_SORTDESC:"${_('Click to sort descending')}",
206 MSG_SORTDESC:"${_('Click to sort descending')}",
213 MSG_EMPTY:"${_('No records found.')}",
207 MSG_EMPTY:"${_('No records found.')}",
214 MSG_ERROR:"${_('Data error.')}",
208 MSG_ERROR:"${_('Data error.')}",
215 MSG_LOADING:"${_('Loading...')}",
209 MSG_LOADING:"${_('Loading...')}",
216 }
210 }
217 );
211 );
218 myDataTable.subscribe('postRenderEvent',function(oArgs) {
212 myDataTable.subscribe('postRenderEvent',function(oArgs) {
219 tooltip_activate();
213 tooltip_activate();
220 quick_repo_menu();
214 quick_repo_menu();
221 var func = function(node){
215 var func = function(node){
222 return node.parentNode.parentNode.parentNode.parentNode;
216 return node.parentNode.parentNode.parentNode.parentNode;
223 }
217 }
224 q_filter('q_filter',YUQ('div.table tr td a.repo_name'),func);
218 q_filter('q_filter',YUQ('div.table tr td a.repo_name'),func);
225 });
219 });
226
220
227 </script>
221 </script>
228 % else:
222 % else:
229 <script>
223 <script>
230 var data = ${c.data|n};
224 var data = ${c.data|n};
231 var myDataSource = new YAHOO.util.DataSource(data);
225 var myDataSource = new YAHOO.util.DataSource(data);
232 myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
226 myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
233
227
234 myDataSource.responseSchema = {
228 myDataSource.responseSchema = {
235 resultsList: "records",
229 resultsList: "records",
236 fields: [
230 fields: [
237 {key:"menu"},
231 {key:"menu"},
238 {key:"raw_name"},
232 {key:"raw_name"},
239 {key:"name"},
233 {key:"name"},
240 {key:"desc"},
234 {key:"desc"},
241 {key:"last_change"},
235 {key:"last_change"},
242 {key:"last_changeset"},
236 {key:"last_changeset"},
243 {key:"owner"},
237 {key:"owner"},
244 {key:"rss"},
245 {key:"atom"},
238 {key:"atom"},
246 ]
239 ]
247 };
240 };
248 myDataSource.doBeforeCallback = function(req,raw,res,cb) {
241 myDataSource.doBeforeCallback = function(req,raw,res,cb) {
249 // This is the filter function
242 // This is the filter function
250 var data = res.results || [],
243 var data = res.results || [],
251 filtered = [],
244 filtered = [],
252 i,l;
245 i,l;
253
246
254 if (req) {
247 if (req) {
255 req = req.toLowerCase();
248 req = req.toLowerCase();
256 for (i = 0; i<data.length; i++) {
249 for (i = 0; i<data.length; i++) {
257 var pos = data[i].raw_name.toLowerCase().indexOf(req)
250 var pos = data[i].raw_name.toLowerCase().indexOf(req)
258 if (pos != -1) {
251 if (pos != -1) {
259 filtered.push(data[i]);
252 filtered.push(data[i]);
260 }
253 }
261 }
254 }
262 res.results = filtered;
255 res.results = filtered;
263 }
256 }
264 YUD.get('repo_count').innerHTML = res.results.length;
257 YUD.get('repo_count').innerHTML = res.results.length;
265 return res;
258 return res;
266 }
259 }
267
260
268 // main table sorting
261 // main table sorting
269 var myColumnDefs = [
262 var myColumnDefs = [
270 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
263 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
271 {key:"name",label:"${_('Name')}",sortable:true,
264 {key:"name",label:"${_('Name')}",sortable:true,
272 sortOptions: { sortFunction: nameSort }},
265 sortOptions: { sortFunction: nameSort }},
273 {key:"desc",label:"${_('Description')}",sortable:true},
266 {key:"desc",label:"${_('Description')}",sortable:true},
274 {key:"last_change",label:"${_('Last Change')}",sortable:true,
267 {key:"last_change",label:"${_('Last Change')}",sortable:true,
275 sortOptions: { sortFunction: ageSort }},
268 sortOptions: { sortFunction: ageSort }},
276 {key:"last_changeset",label:"${_('Tip')}",sortable:true,
269 {key:"last_changeset",label:"${_('Tip')}",sortable:true,
277 sortOptions: { sortFunction: revisionSort }},
270 sortOptions: { sortFunction: revisionSort }},
278 {key:"owner",label:"${_('Owner')}",sortable:true},
271 {key:"owner",label:"${_('Owner')}",sortable:true},
279 {key:"rss",label:"",sortable:false},
280 {key:"atom",label:"",sortable:false},
272 {key:"atom",label:"",sortable:false},
281 ];
273 ];
282
274
283 var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
275 var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
284 sortedBy:{key:"name",dir:"asc"},
276 sortedBy:{key:"name",dir:"asc"},
285 paginator: new YAHOO.widget.Paginator({
277 paginator: new YAHOO.widget.Paginator({
286 rowsPerPage: ${c.visual.lightweight_dashboard_items},
278 rowsPerPage: ${c.visual.lightweight_dashboard_items},
287 alwaysVisible: false,
279 alwaysVisible: false,
288 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
280 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
289 pageLinks: 5,
281 pageLinks: 5,
290 containerClass: 'pagination-wh',
282 containerClass: 'pagination-wh',
291 currentPageClass: 'pager_curpage',
283 currentPageClass: 'pager_curpage',
292 pageLinkClass: 'pager_link',
284 pageLinkClass: 'pager_link',
293 nextPageLinkLabel: '&gt;',
285 nextPageLinkLabel: '&gt;',
294 previousPageLinkLabel: '&lt;',
286 previousPageLinkLabel: '&lt;',
295 firstPageLinkLabel: '&lt;&lt;',
287 firstPageLinkLabel: '&lt;&lt;',
296 lastPageLinkLabel: '&gt;&gt;',
288 lastPageLinkLabel: '&gt;&gt;',
297 containers:['user-paginator']
289 containers:['user-paginator']
298 }),
290 }),
299
291
300 MSG_SORTASC:"${_('Click to sort ascending')}",
292 MSG_SORTASC:"${_('Click to sort ascending')}",
301 MSG_SORTDESC:"${_('Click to sort descending')}",
293 MSG_SORTDESC:"${_('Click to sort descending')}",
302 MSG_EMPTY:"${_('No records found.')}",
294 MSG_EMPTY:"${_('No records found.')}",
303 MSG_ERROR:"${_('Data error.')}",
295 MSG_ERROR:"${_('Data error.')}",
304 MSG_LOADING:"${_('Loading...')}",
296 MSG_LOADING:"${_('Loading...')}",
305 }
297 }
306 );
298 );
307 myDataTable.subscribe('postRenderEvent',function(oArgs) {
299 myDataTable.subscribe('postRenderEvent',function(oArgs) {
308 tooltip_activate();
300 tooltip_activate();
309 quick_repo_menu();
301 quick_repo_menu();
310 });
302 });
311
303
312 var filterTimeout = null;
304 var filterTimeout = null;
313
305
314 updateFilter = function () {
306 updateFilter = function () {
315 // Reset timeout
307 // Reset timeout
316 filterTimeout = null;
308 filterTimeout = null;
317
309
318 // Reset sort
310 // Reset sort
319 var state = myDataTable.getState();
311 var state = myDataTable.getState();
320 state.sortedBy = {key:'name', dir:YAHOO.widget.DataTable.CLASS_ASC};
312 state.sortedBy = {key:'name', dir:YAHOO.widget.DataTable.CLASS_ASC};
321
313
322 // Get filtered data
314 // Get filtered data
323 myDataSource.sendRequest(YUD.get('q_filter').value,{
315 myDataSource.sendRequest(YUD.get('q_filter').value,{
324 success : myDataTable.onDataReturnInitializeTable,
316 success : myDataTable.onDataReturnInitializeTable,
325 failure : myDataTable.onDataReturnInitializeTable,
317 failure : myDataTable.onDataReturnInitializeTable,
326 scope : myDataTable,
318 scope : myDataTable,
327 argument: state
319 argument: state
328 });
320 });
329
321
330 };
322 };
331 YUE.on('q_filter','click',function(){
323 YUE.on('q_filter','click',function(){
332 if(!YUD.hasClass('q_filter', 'loaded')){
324 if(!YUD.hasClass('q_filter', 'loaded')){
333 YUD.get('q_filter').value = '';
325 YUD.get('q_filter').value = '';
334 //TODO: load here full list later to do search within groups
326 //TODO: load here full list later to do search within groups
335 YUD.addClass('q_filter', 'loaded');
327 YUD.addClass('q_filter', 'loaded');
336 }
328 }
337 });
329 });
338
330
339 YUE.on('q_filter','keyup',function (e) {
331 YUE.on('q_filter','keyup',function (e) {
340 clearTimeout(filterTimeout);
332 clearTimeout(filterTimeout);
341 filterTimeout = setTimeout(updateFilter,600);
333 filterTimeout = setTimeout(updateFilter,600);
342 });
334 });
343 </script>
335 </script>
344 % endif
336 % endif
@@ -1,370 +1,367 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <%inherit file="/base/base.html"/>
2 <%inherit file="/base/base.html"/>
3 <%def name="title()">
3 <%def name="title()">
4 ${_('Journal')} - ${c.rhodecode_name}
4 ${_('Journal')} - ${c.rhodecode_name}
5 </%def>
5 </%def>
6 <%def name="breadcrumbs()">
6 <%def name="breadcrumbs()">
7 <h5>
7 <h5>
8 <form id="filter_form">
8 <form id="filter_form">
9 <input class="q_filter_box ${'' if c.search_term else 'initial'}" id="j_filter" size="15" type="text" name="filter" value="${c.search_term or _('quick filter...')}"/>
9 <input class="q_filter_box ${'' if c.search_term else 'initial'}" id="j_filter" size="15" type="text" name="filter" value="${c.search_term or _('quick filter...')}"/>
10 <span class="tooltip" title="${h.tooltip(h.journal_filter_help())}">?</span>
10 <span class="tooltip" title="${h.tooltip(h.journal_filter_help())}">?</span>
11 <input type='submit' value="${_('filter')}" class="ui-btn" style="padding:0px 2px 0px 2px;margin:0px"/>
11 <input type='submit' value="${_('filter')}" class="ui-btn" style="padding:0px 2px 0px 2px;margin:0px"/>
12 ${_('journal')} - ${ungettext('%s entry', '%s entries', c.journal_pager.item_count) % (c.journal_pager.item_count)}
12 ${_('journal')} - ${ungettext('%s entry', '%s entries', c.journal_pager.item_count) % (c.journal_pager.item_count)}
13 </form>
13 </form>
14 ${h.end_form()}
14 ${h.end_form()}
15 </h5>
15 </h5>
16 </%def>
16 </%def>
17 <%def name="page_nav()">
17 <%def name="page_nav()">
18 ${self.menu('journal')}
18 ${self.menu('journal')}
19 </%def>
19 </%def>
20 <%def name="head_extra()">
20 <%def name="head_extra()">
21 <link href="${h.url('journal_atom', api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('ATOM journal feed')}" type="application/atom+xml" />
21 <link href="${h.url('journal_atom', api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('ATOM journal feed')}" type="application/atom+xml" />
22 <link href="${h.url('journal_rss', api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('RSS journal feed')}" type="application/rss+xml" />
22 <link href="${h.url('journal_rss', api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('RSS journal feed')}" type="application/rss+xml" />
23 </%def>
23 </%def>
24 <%def name="main()">
24 <%def name="main()">
25
25
26 <div class="box box-left">
26 <div class="box box-left">
27 <!-- box / title -->
27 <!-- box / title -->
28 <div class="title">
28 <div class="title">
29 ${self.breadcrumbs()}
29 ${self.breadcrumbs()}
30 <ul class="links">
30 <ul class="links">
31 <li>
31 <li>
32 <span><a id="refresh" href="${h.url('journal')}"><img class="icon" title="${_('Refresh')}" alt="${_('Refresh')}" src="${h.url('/images/icons/arrow_refresh.png')}"/></a></span>
32 <span><a id="refresh" href="${h.url('journal')}"><img class="icon" title="${_('Refresh')}" alt="${_('Refresh')}" src="${h.url('/images/icons/arrow_refresh.png')}"/></a></span>
33 </li>
33 </li>
34 <li>
34 <li>
35 <span><a href="${h.url('journal_rss', api_key=c.rhodecode_user.api_key)}"><img class="icon" title="${_('RSS feed')}" alt="${_('RSS feed')}" src="${h.url('/images/icons/rss_16.png')}"/></a></span>
35 <span><a href="${h.url('journal_atom', api_key=c.rhodecode_user.api_key)}"><img class="icon" title="${_('ATOM feed')}" alt="${_('ATOM feed')}" src="${h.url('/images/icons/rss_16.png')}"/></a></span>
36 </li>
37 <li>
38 <span><a href="${h.url('journal_atom', api_key=c.rhodecode_user.api_key)}"><img class="icon" title="${_('ATOM feed')}" alt="${_('ATOM feed')}" src="${h.url('/images/icons/atom.png')}"/></a></span>
39 </li>
36 </li>
40 </ul>
37 </ul>
41 </div>
38 </div>
42 <div id="journal">${c.journal_data}</div>
39 <div id="journal">${c.journal_data}</div>
43 </div>
40 </div>
44 <div class="box box-right">
41 <div class="box box-right">
45 <!-- box / title -->
42 <!-- box / title -->
46
43
47 <div class="title">
44 <div class="title">
48 <h5>
45 <h5>
49 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" value="${_('quick filter...')}" style="display: none"/>
46 <input class="q_filter_box" id="q_filter" size="15" type="text" name="filter" value="${_('quick filter...')}" style="display: none"/>
50 <input class="q_filter_box" id="q_filter_watched" size="15" type="text" name="filter" value="${_('quick filter...')}" style="display: none"/>
47 <input class="q_filter_box" id="q_filter_watched" size="15" type="text" name="filter" value="${_('quick filter...')}" style="display: none"/>
51 </h5>
48 </h5>
52 <ul class="links" style="color:#DADADA">
49 <ul class="links" style="color:#DADADA">
53 <li>
50 <li>
54 <span><a id="show_watched" class="link-white current" href="#watched">${_('Watched')}</a> </span>
51 <span><a id="show_watched" class="link-white current" href="#watched">${_('Watched')}</a> </span>
55 </li>
52 </li>
56 <li>
53 <li>
57 <span><a id="show_my" class="link-white" href="#my">${_('My repos')}</a> </span>
54 <span><a id="show_my" class="link-white" href="#my">${_('My repos')}</a> </span>
58 </li>
55 </li>
59 </ul>
56 </ul>
60 </div>
57 </div>
61
58
62 <!-- end box / title -->
59 <!-- end box / title -->
63 <div id="my_container" style="display:none">
60 <div id="my_container" style="display:none">
64 <div class="table yui-skin-sam" id="repos_list_wrap"></div>
61 <div class="table yui-skin-sam" id="repos_list_wrap"></div>
65 <div id="user-paginator" style="padding: 0px 0px 0px 20px"></div>
62 <div id="user-paginator" style="padding: 0px 0px 0px 20px"></div>
66 </div>
63 </div>
67
64
68 <div id="watched_container">
65 <div id="watched_container">
69 <div class="table yui-skin-sam" id="watched_repos_list_wrap"></div>
66 <div class="table yui-skin-sam" id="watched_repos_list_wrap"></div>
70 <div id="watched-user-paginator" style="padding: 0px 0px 0px 20px"></div>
67 <div id="watched-user-paginator" style="padding: 0px 0px 0px 20px"></div>
71 </div>
68 </div>
72 </div>
69 </div>
73
70
74 <script type="text/javascript">
71 <script type="text/javascript">
75
72
76 YUE.on('j_filter','click',function(){
73 YUE.on('j_filter','click',function(){
77 var jfilter = YUD.get('j_filter');
74 var jfilter = YUD.get('j_filter');
78 if(YUD.hasClass(jfilter, 'initial')){
75 if(YUD.hasClass(jfilter, 'initial')){
79 jfilter.value = '';
76 jfilter.value = '';
80 }
77 }
81 });
78 });
82 var fix_j_filter_width = function(len){
79 var fix_j_filter_width = function(len){
83 YUD.setStyle(YUD.get('j_filter'),'width',Math.max(80, len*6.50)+'px');
80 YUD.setStyle(YUD.get('j_filter'),'width',Math.max(80, len*6.50)+'px');
84 }
81 }
85 YUE.on('j_filter','keyup',function(){
82 YUE.on('j_filter','keyup',function(){
86 fix_j_filter_width(YUD.get('j_filter').value.length);
83 fix_j_filter_width(YUD.get('j_filter').value.length);
87 });
84 });
88 YUE.on('filter_form','submit',function(e){
85 YUE.on('filter_form','submit',function(e){
89 YUE.preventDefault(e)
86 YUE.preventDefault(e)
90 var val = YUD.get('j_filter').value;
87 var val = YUD.get('j_filter').value;
91 window.location = "${url.current(filter='__FILTER__')}".replace('__FILTER__',val);
88 window.location = "${url.current(filter='__FILTER__')}".replace('__FILTER__',val);
92 });
89 });
93 fix_j_filter_width(YUD.get('j_filter').value.length);
90 fix_j_filter_width(YUD.get('j_filter').value.length);
94
91
95 YUE.on('refresh','click',function(e){
92 YUE.on('refresh','click',function(e){
96 ypjax("${h.url.current(filter=c.search_term)}","journal",function(){
93 ypjax("${h.url.current(filter=c.search_term)}","journal",function(){
97 show_more_event();
94 show_more_event();
98 tooltip_activate();
95 tooltip_activate();
99 show_changeset_tooltip();
96 show_changeset_tooltip();
100 });
97 });
101 YUE.preventDefault(e);
98 YUE.preventDefault(e);
102 });
99 });
103
100
104 var show_my = function(e){
101 var show_my = function(e){
105 YUD.setStyle('watched_container','display','none');
102 YUD.setStyle('watched_container','display','none');
106 YUD.setStyle('my_container','display','');
103 YUD.setStyle('my_container','display','');
107 YUD.setStyle('q_filter','display','');
104 YUD.setStyle('q_filter','display','');
108 YUD.setStyle('q_filter_watched','display','none');
105 YUD.setStyle('q_filter_watched','display','none');
109
106
110 YUD.addClass('show_my', 'current');
107 YUD.addClass('show_my', 'current');
111 YUD.removeClass('show_watched','current');
108 YUD.removeClass('show_watched','current');
112
109
113 if(!YUD.hasClass('show_my', 'loaded')){
110 if(!YUD.hasClass('show_my', 'loaded')){
114 table_renderer(${c.data |n});
111 table_renderer(${c.data |n});
115 YUD.addClass('show_my', 'loaded');
112 YUD.addClass('show_my', 'loaded');
116 }
113 }
117 }
114 }
118 YUE.on('show_my','click',function(e){
115 YUE.on('show_my','click',function(e){
119 show_my(e);
116 show_my(e);
120 })
117 })
121 var show_watched = function(e){
118 var show_watched = function(e){
122 YUD.setStyle('my_container','display','none');
119 YUD.setStyle('my_container','display','none');
123 YUD.setStyle('watched_container','display','');
120 YUD.setStyle('watched_container','display','');
124 YUD.setStyle('q_filter_watched','display','');
121 YUD.setStyle('q_filter_watched','display','');
125 YUD.setStyle('q_filter','display','none');
122 YUD.setStyle('q_filter','display','none');
126
123
127 YUD.addClass('show_watched', 'current');
124 YUD.addClass('show_watched', 'current');
128 YUD.removeClass('show_my','current');
125 YUD.removeClass('show_my','current');
129 if(!YUD.hasClass('show_watched', 'loaded')){
126 if(!YUD.hasClass('show_watched', 'loaded')){
130 watched_renderer(${c.watched_data |n});
127 watched_renderer(${c.watched_data |n});
131 YUD.addClass('show_watched', 'loaded');
128 YUD.addClass('show_watched', 'loaded');
132 }
129 }
133
130
134 return
131 return
135 var nodes = YUQ('#watched_container .watched_repo a');
132 var nodes = YUQ('#watched_container .watched_repo a');
136 var target = 'q_filter';
133 var target = 'q_filter';
137 var func = function(node){
134 var func = function(node){
138 return node.parentNode.parentNode;
135 return node.parentNode.parentNode;
139 }
136 }
140 q_filter(target,nodes,func);
137 q_filter(target,nodes,func);
141 }
138 }
142 YUE.on('show_watched','click',function(e){
139 YUE.on('show_watched','click',function(e){
143 show_watched(e);
140 show_watched(e);
144 })
141 })
145 //init watched
142 //init watched
146 show_watched();
143 show_watched();
147
144
148 var tabs = {
145 var tabs = {
149 'watched': show_watched,
146 'watched': show_watched,
150 'my': show_my,
147 'my': show_my,
151 }
148 }
152 var url = location.href.split('#');
149 var url = location.href.split('#');
153 if (url[1]) {
150 if (url[1]) {
154 //We have a hash
151 //We have a hash
155 var tabHash = url[1];
152 var tabHash = url[1];
156 var func = tabs[tabHash]
153 var func = tabs[tabHash]
157 if (func){
154 if (func){
158 func();
155 func();
159 }
156 }
160 }
157 }
161 function watched_renderer(data){
158 function watched_renderer(data){
162 var myDataSource = new YAHOO.util.DataSource(data);
159 var myDataSource = new YAHOO.util.DataSource(data);
163 myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
160 myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
164
161
165 myDataSource.responseSchema = {
162 myDataSource.responseSchema = {
166 resultsList: "records",
163 resultsList: "records",
167 fields: [
164 fields: [
168 {key:"menu"},
165 {key:"menu"},
169 {key:"raw_name"},
166 {key:"raw_name"},
170 {key:"name"},
167 {key:"name"},
171 {key:"last_changeset"},
168 {key:"last_changeset"},
172 {key:"action"},
169 {key:"action"},
173 ]
170 ]
174 };
171 };
175 myDataSource.doBeforeCallback = function(req,raw,res,cb) {
172 myDataSource.doBeforeCallback = function(req,raw,res,cb) {
176 // This is the filter function
173 // This is the filter function
177 var data = res.results || [],
174 var data = res.results || [],
178 filtered = [],
175 filtered = [],
179 i,l;
176 i,l;
180
177
181 if (req) {
178 if (req) {
182 req = req.toLowerCase();
179 req = req.toLowerCase();
183 for (i = 0; i<data.length; i++) {
180 for (i = 0; i<data.length; i++) {
184 var pos = data[i].raw_name.toLowerCase().indexOf(req)
181 var pos = data[i].raw_name.toLowerCase().indexOf(req)
185 if (pos != -1) {
182 if (pos != -1) {
186 filtered.push(data[i]);
183 filtered.push(data[i]);
187 }
184 }
188 }
185 }
189 res.results = filtered;
186 res.results = filtered;
190 }
187 }
191 return res;
188 return res;
192 }
189 }
193 // main table sorting
190 // main table sorting
194 var myColumnDefs = [
191 var myColumnDefs = [
195 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
192 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
196 {key:"name",label:"${_('Name')}",sortable:true,
193 {key:"name",label:"${_('Name')}",sortable:true,
197 sortOptions: { sortFunction: nameSort }},
194 sortOptions: { sortFunction: nameSort }},
198 {key:"last_changeset",label:"${_('Tip')}",sortable:true,
195 {key:"last_changeset",label:"${_('Tip')}",sortable:true,
199 sortOptions: { sortFunction: revisionSort }},
196 sortOptions: { sortFunction: revisionSort }},
200 {key:"action",label:"${_('Action')}",sortable:false},
197 {key:"action",label:"${_('Action')}",sortable:false},
201 ];
198 ];
202
199
203 var myDataTable = new YAHOO.widget.DataTable("watched_repos_list_wrap", myColumnDefs, myDataSource,{
200 var myDataTable = new YAHOO.widget.DataTable("watched_repos_list_wrap", myColumnDefs, myDataSource,{
204 sortedBy:{key:"name",dir:"asc"},
201 sortedBy:{key:"name",dir:"asc"},
205 paginator: new YAHOO.widget.Paginator({
202 paginator: new YAHOO.widget.Paginator({
206 rowsPerPage: 25,
203 rowsPerPage: 25,
207 alwaysVisible: false,
204 alwaysVisible: false,
208 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
205 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
209 pageLinks: 5,
206 pageLinks: 5,
210 containerClass: 'pagination-wh',
207 containerClass: 'pagination-wh',
211 currentPageClass: 'pager_curpage',
208 currentPageClass: 'pager_curpage',
212 pageLinkClass: 'pager_link',
209 pageLinkClass: 'pager_link',
213 nextPageLinkLabel: '&gt;',
210 nextPageLinkLabel: '&gt;',
214 previousPageLinkLabel: '&lt;',
211 previousPageLinkLabel: '&lt;',
215 firstPageLinkLabel: '&lt;&lt;',
212 firstPageLinkLabel: '&lt;&lt;',
216 lastPageLinkLabel: '&gt;&gt;',
213 lastPageLinkLabel: '&gt;&gt;',
217 containers:['watched-user-paginator']
214 containers:['watched-user-paginator']
218 }),
215 }),
219
216
220 MSG_SORTASC:"${_('Click to sort ascending')}",
217 MSG_SORTASC:"${_('Click to sort ascending')}",
221 MSG_SORTDESC:"${_('Click to sort descending')}",
218 MSG_SORTDESC:"${_('Click to sort descending')}",
222 MSG_EMPTY:"${_('No records found.')}",
219 MSG_EMPTY:"${_('No records found.')}",
223 MSG_ERROR:"${_('Data error.')}",
220 MSG_ERROR:"${_('Data error.')}",
224 MSG_LOADING:"${_('Loading...')}",
221 MSG_LOADING:"${_('Loading...')}",
225 }
222 }
226 );
223 );
227 myDataTable.subscribe('postRenderEvent',function(oArgs) {
224 myDataTable.subscribe('postRenderEvent',function(oArgs) {
228 tooltip_activate();
225 tooltip_activate();
229 quick_repo_menu();
226 quick_repo_menu();
230 });
227 });
231
228
232 var filterTimeout = null;
229 var filterTimeout = null;
233
230
234 updateFilter = function () {
231 updateFilter = function () {
235 // Reset timeout
232 // Reset timeout
236 filterTimeout = null;
233 filterTimeout = null;
237
234
238 // Reset sort
235 // Reset sort
239 var state = myDataTable.getState();
236 var state = myDataTable.getState();
240 state.sortedBy = {key:'name', dir:YAHOO.widget.DataTable.CLASS_ASC};
237 state.sortedBy = {key:'name', dir:YAHOO.widget.DataTable.CLASS_ASC};
241
238
242 // Get filtered data
239 // Get filtered data
243 myDataSource.sendRequest(YUD.get('q_filter_watched').value,{
240 myDataSource.sendRequest(YUD.get('q_filter_watched').value,{
244 success : myDataTable.onDataReturnInitializeTable,
241 success : myDataTable.onDataReturnInitializeTable,
245 failure : myDataTable.onDataReturnInitializeTable,
242 failure : myDataTable.onDataReturnInitializeTable,
246 scope : myDataTable,
243 scope : myDataTable,
247 argument: state
244 argument: state
248 });
245 });
249
246
250 };
247 };
251 YUE.on('q_filter_watched','click',function(){
248 YUE.on('q_filter_watched','click',function(){
252 if(!YUD.hasClass('q_filter_watched', 'loaded')){
249 if(!YUD.hasClass('q_filter_watched', 'loaded')){
253 YUD.get('q_filter_watched').value = '';
250 YUD.get('q_filter_watched').value = '';
254 //TODO: load here full list later to do search within groups
251 //TODO: load here full list later to do search within groups
255 YUD.addClass('q_filter_watched', 'loaded');
252 YUD.addClass('q_filter_watched', 'loaded');
256 }
253 }
257 });
254 });
258
255
259 YUE.on('q_filter_watched','keyup',function (e) {
256 YUE.on('q_filter_watched','keyup',function (e) {
260 clearTimeout(filterTimeout);
257 clearTimeout(filterTimeout);
261 filterTimeout = setTimeout(updateFilter,600);
258 filterTimeout = setTimeout(updateFilter,600);
262 });
259 });
263 }
260 }
264
261
265 function table_renderer(data){
262 function table_renderer(data){
266 var myDataSource = new YAHOO.util.DataSource(data);
263 var myDataSource = new YAHOO.util.DataSource(data);
267 myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
264 myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
268
265
269 myDataSource.responseSchema = {
266 myDataSource.responseSchema = {
270 resultsList: "records",
267 resultsList: "records",
271 fields: [
268 fields: [
272 {key:"menu"},
269 {key:"menu"},
273 {key:"raw_name"},
270 {key:"raw_name"},
274 {key:"name"},
271 {key:"name"},
275 {key:"last_changeset"},
272 {key:"last_changeset"},
276 {key:"action"},
273 {key:"action"},
277 ]
274 ]
278 };
275 };
279 myDataSource.doBeforeCallback = function(req,raw,res,cb) {
276 myDataSource.doBeforeCallback = function(req,raw,res,cb) {
280 // This is the filter function
277 // This is the filter function
281 var data = res.results || [],
278 var data = res.results || [],
282 filtered = [],
279 filtered = [],
283 i,l;
280 i,l;
284
281
285 if (req) {
282 if (req) {
286 req = req.toLowerCase();
283 req = req.toLowerCase();
287 for (i = 0; i<data.length; i++) {
284 for (i = 0; i<data.length; i++) {
288 var pos = data[i].raw_name.toLowerCase().indexOf(req)
285 var pos = data[i].raw_name.toLowerCase().indexOf(req)
289 if (pos != -1) {
286 if (pos != -1) {
290 filtered.push(data[i]);
287 filtered.push(data[i]);
291 }
288 }
292 }
289 }
293 res.results = filtered;
290 res.results = filtered;
294 }
291 }
295 return res;
292 return res;
296 }
293 }
297 // main table sorting
294 // main table sorting
298 var myColumnDefs = [
295 var myColumnDefs = [
299 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
296 {key:"menu",label:"",sortable:false,className:"quick_repo_menu hidden"},
300 {key:"name",label:"${_('Name')}",sortable:true,
297 {key:"name",label:"${_('Name')}",sortable:true,
301 sortOptions: { sortFunction: nameSort }},
298 sortOptions: { sortFunction: nameSort }},
302 {key:"last_changeset",label:"${_('Tip')}",sortable:true,
299 {key:"last_changeset",label:"${_('Tip')}",sortable:true,
303 sortOptions: { sortFunction: revisionSort }},
300 sortOptions: { sortFunction: revisionSort }},
304 {key:"action",label:"${_('Action')}",sortable:false},
301 {key:"action",label:"${_('Action')}",sortable:false},
305 ];
302 ];
306
303
307 var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
304 var myDataTable = new YAHOO.widget.DataTable("repos_list_wrap", myColumnDefs, myDataSource,{
308 sortedBy:{key:"name",dir:"asc"},
305 sortedBy:{key:"name",dir:"asc"},
309 paginator: new YAHOO.widget.Paginator({
306 paginator: new YAHOO.widget.Paginator({
310 rowsPerPage: 25,
307 rowsPerPage: 25,
311 alwaysVisible: false,
308 alwaysVisible: false,
312 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
309 template : "{PreviousPageLink} {FirstPageLink} {PageLinks} {LastPageLink} {NextPageLink}",
313 pageLinks: 5,
310 pageLinks: 5,
314 containerClass: 'pagination-wh',
311 containerClass: 'pagination-wh',
315 currentPageClass: 'pager_curpage',
312 currentPageClass: 'pager_curpage',
316 pageLinkClass: 'pager_link',
313 pageLinkClass: 'pager_link',
317 nextPageLinkLabel: '&gt;',
314 nextPageLinkLabel: '&gt;',
318 previousPageLinkLabel: '&lt;',
315 previousPageLinkLabel: '&lt;',
319 firstPageLinkLabel: '&lt;&lt;',
316 firstPageLinkLabel: '&lt;&lt;',
320 lastPageLinkLabel: '&gt;&gt;',
317 lastPageLinkLabel: '&gt;&gt;',
321 containers:['user-paginator']
318 containers:['user-paginator']
322 }),
319 }),
323
320
324 MSG_SORTASC:"${_('Click to sort ascending')}",
321 MSG_SORTASC:"${_('Click to sort ascending')}",
325 MSG_SORTDESC:"${_('Click to sort descending')}",
322 MSG_SORTDESC:"${_('Click to sort descending')}",
326 MSG_EMPTY:"${_('No records found.')}",
323 MSG_EMPTY:"${_('No records found.')}",
327 MSG_ERROR:"${_('Data error.')}",
324 MSG_ERROR:"${_('Data error.')}",
328 MSG_LOADING:"${_('Loading...')}",
325 MSG_LOADING:"${_('Loading...')}",
329 }
326 }
330 );
327 );
331 myDataTable.subscribe('postRenderEvent',function(oArgs) {
328 myDataTable.subscribe('postRenderEvent',function(oArgs) {
332 tooltip_activate();
329 tooltip_activate();
333 quick_repo_menu();
330 quick_repo_menu();
334 });
331 });
335
332
336 var filterTimeout = null;
333 var filterTimeout = null;
337
334
338 updateFilter = function () {
335 updateFilter = function () {
339 // Reset timeout
336 // Reset timeout
340 filterTimeout = null;
337 filterTimeout = null;
341
338
342 // Reset sort
339 // Reset sort
343 var state = myDataTable.getState();
340 var state = myDataTable.getState();
344 state.sortedBy = {key:'name', dir:YAHOO.widget.DataTable.CLASS_ASC};
341 state.sortedBy = {key:'name', dir:YAHOO.widget.DataTable.CLASS_ASC};
345
342
346 // Get filtered data
343 // Get filtered data
347 myDataSource.sendRequest(YUD.get('q_filter').value,{
344 myDataSource.sendRequest(YUD.get('q_filter').value,{
348 success : myDataTable.onDataReturnInitializeTable,
345 success : myDataTable.onDataReturnInitializeTable,
349 failure : myDataTable.onDataReturnInitializeTable,
346 failure : myDataTable.onDataReturnInitializeTable,
350 scope : myDataTable,
347 scope : myDataTable,
351 argument: state
348 argument: state
352 });
349 });
353
350
354 };
351 };
355 YUE.on('q_filter','click',function(){
352 YUE.on('q_filter','click',function(){
356 if(!YUD.hasClass('q_filter', 'loaded')){
353 if(!YUD.hasClass('q_filter', 'loaded')){
357 YUD.get('q_filter').value = '';
354 YUD.get('q_filter').value = '';
358 //TODO: load here full list later to do search within groups
355 //TODO: load here full list later to do search within groups
359 YUD.addClass('q_filter', 'loaded');
356 YUD.addClass('q_filter', 'loaded');
360 }
357 }
361 });
358 });
362
359
363 YUE.on('q_filter','keyup',function (e) {
360 YUE.on('q_filter','keyup',function (e) {
364 clearTimeout(filterTimeout);
361 clearTimeout(filterTimeout);
365 filterTimeout = setTimeout(updateFilter,600);
362 filterTimeout = setTimeout(updateFilter,600);
366 });
363 });
367 }
364 }
368
365
369 </script>
366 </script>
370 </%def>
367 </%def>
@@ -1,35 +1,32 b''
1 ## -*- coding: utf-8 -*-
1 ## -*- coding: utf-8 -*-
2 <%inherit file="/base/base.html"/>
2 <%inherit file="/base/base.html"/>
3 <%def name="title()">
3 <%def name="title()">
4 ${_('Journal')} - ${c.rhodecode_name}
4 ${_('Journal')} - ${c.rhodecode_name}
5 </%def>
5 </%def>
6 <%def name="breadcrumbs()">
6 <%def name="breadcrumbs()">
7 ${c.rhodecode_name}
7 ${c.rhodecode_name}
8 </%def>
8 </%def>
9 <%def name="page_nav()">
9 <%def name="page_nav()">
10 ${self.menu('journal')}
10 ${self.menu('journal')}
11 </%def>
11 </%def>
12 <%def name="head_extra()">
12 <%def name="head_extra()">
13 <link href="${h.url('public_journal_atom')}" rel="alternate" title="${_('ATOM public journal feed')}" type="application/atom+xml" />
13 <link href="${h.url('public_journal_atom')}" rel="alternate" title="${_('ATOM public journal feed')}" type="application/atom+xml" />
14 <link href="${h.url('public_journal_rss')}" rel="alternate" title="${_('RSS public journal feed')}" type="application/rss+xml" />
14 <link href="${h.url('public_journal_rss')}" rel="alternate" title="${_('RSS public journal feed')}" type="application/rss+xml" />
15 </%def>
15 </%def>
16 <%def name="main()">
16 <%def name="main()">
17
17
18 <div class="box">
18 <div class="box">
19 <!-- box / title -->
19 <!-- box / title -->
20 <div class="title">
20 <div class="title">
21 <h5>${_('Public Journal')}</h5>
21 <h5>${_('Public Journal')}</h5>
22 <ul class="links">
22 <ul class="links">
23 <li>
23 <li>
24 <span><a href="${h.url('public_journal_rss')}"><img class="icon" title="${_('RSS feed')}" alt="${_('RSS feed')}" src="${h.url('/images/icons/atom.png')}"/></a></span>
25 </li>
26 <li>
27 <span><a href="${h.url('public_journal_atom')}"><img class="icon" title="${_('ATOM feed')}" alt="${_('ATOM feed')}" src="${h.url('/images/icons/rss_16.png')}"/></a></span>
24 <span><a href="${h.url('public_journal_atom')}"><img class="icon" title="${_('ATOM feed')}" alt="${_('ATOM feed')}" src="${h.url('/images/icons/rss_16.png')}"/></a></span>
28 </li>
25 </li>
29 </ul>
26 </ul>
30 </div>
27 </div>
31
28
32 <div id="journal">${c.journal_data}</div>
29 <div id="journal">${c.journal_data}</div>
33 </div>
30 </div>
34
31
35 </%def>
32 </%def>
@@ -1,727 +1,725 b''
1 <%inherit file="/base/base.html"/>
1 <%inherit file="/base/base.html"/>
2
2
3 <%def name="title()">
3 <%def name="title()">
4 ${_('%s Summary') % c.repo_name} - ${c.rhodecode_name}
4 ${_('%s Summary') % c.repo_name} - ${c.rhodecode_name}
5 </%def>
5 </%def>
6
6
7 <%def name="breadcrumbs_links()">
7 <%def name="breadcrumbs_links()">
8 ${h.link_to(_(u'Home'),h.url('/'))}
8 ${h.link_to(_(u'Home'),h.url('/'))}
9 &raquo;
9 &raquo;
10 ${h.repo_link(c.dbrepo.groups_and_repo)}
10 ${h.repo_link(c.dbrepo.groups_and_repo)}
11 &raquo;
11 &raquo;
12 ${_('summary')}
12 ${_('summary')}
13 </%def>
13 </%def>
14
14
15 <%def name="page_nav()">
15 <%def name="page_nav()">
16 ${self.menu('summary')}
16 ${self.menu('summary')}
17 </%def>
17 </%def>
18
18
19 <%def name="head_extra()">
19 <%def name="head_extra()">
20 <link href="${h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s ATOM feed') % c.repo_name}" type="application/atom+xml" />
20 <link href="${h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s ATOM feed') % c.repo_name}" type="application/atom+xml" />
21 <link href="${h.url('rss_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s RSS feed') % c.repo_name}" type="application/rss+xml" />
21 <link href="${h.url('rss_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key)}" rel="alternate" title="${_('repo %s RSS feed') % c.repo_name}" type="application/rss+xml" />
22 </%def>
22 </%def>
23
23
24 <%def name="main()">
24 <%def name="main()">
25 <%
25 <%
26 summary = lambda n:{False:'summary-short'}.get(n)
26 summary = lambda n:{False:'summary-short'}.get(n)
27 %>
27 %>
28 %if c.show_stats:
28 %if c.show_stats:
29 <div class="box box-left">
29 <div class="box box-left">
30 %else:
30 %else:
31 <div class="box">
31 <div class="box">
32 %endif
32 %endif
33 <!-- box / title -->
33 <!-- box / title -->
34 <div class="title">
34 <div class="title">
35 ${self.breadcrumbs()}
35 ${self.breadcrumbs()}
36 </div>
36 </div>
37 <!-- end box / title -->
37 <!-- end box / title -->
38 <div class="form">
38 <div class="form">
39 <div id="summary" class="fields">
39 <div id="summary" class="fields">
40
40
41 <div class="field">
41 <div class="field">
42 <div class="label-summary">
42 <div class="label-summary">
43 <label>${_('Name')}:</label>
43 <label>${_('Name')}:</label>
44 </div>
44 </div>
45 <div class="input ${summary(c.show_stats)}">
45 <div class="input ${summary(c.show_stats)}">
46 <div style="float:right;padding:5px 0px 0px 5px">
46 <div style="float:right;padding:5px 0px 0px 5px">
47 %if c.rhodecode_user.username != 'default':
47 %if c.rhodecode_user.username != 'default':
48 ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key),class_='rss_icon')}
49 ${h.link_to(_('ATOM'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key),class_='atom_icon')}
48 ${h.link_to(_('ATOM'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name,api_key=c.rhodecode_user.api_key),class_='atom_icon')}
50 %else:
49 %else:
51 ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.dbrepo.repo_name),class_='rss_icon')}
52 ${h.link_to(_('ATOM'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name),class_='atom_icon')}
50 ${h.link_to(_('ATOM'),h.url('atom_feed_home',repo_name=c.dbrepo.repo_name),class_='atom_icon')}
53 %endif
51 %endif
54 </div>
52 </div>
55 %if c.rhodecode_user.username != 'default':
53 %if c.rhodecode_user.username != 'default':
56 %if c.following:
54 %if c.following:
57 <span id="follow_toggle" class="following tooltip" title="${_('Stop following this repository')}"
55 <span id="follow_toggle" class="following tooltip" title="${_('Stop following this repository')}"
58 onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
56 onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
59 </span>
57 </span>
60 %else:
58 %else:
61 <span id="follow_toggle" class="follow tooltip" title="${_('Start following this repository')}"
59 <span id="follow_toggle" class="follow tooltip" title="${_('Start following this repository')}"
62 onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
60 onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
63 </span>
61 </span>
64 %endif
62 %endif
65 <div style="float:right;padding:0px 0px 0px 0px">
63 <div style="float:right;padding:0px 0px 0px 0px">
66 <span class="reposize tooltip" title="${_('Click to show size of repository')}"
64 <span class="reposize tooltip" title="${_('Click to show size of repository')}"
67 onclick="javascript:showRepoSize('repo_size','${c.dbrepo.repo_name}','${str(h.get_token())}')">
65 onclick="javascript:showRepoSize('repo_size','${c.dbrepo.repo_name}','${str(h.get_token())}')">
68 </span>
66 </span>
69 <span id="repo_size"></span>
67 <span id="repo_size"></span>
70 </div>
68 </div>
71 %endif:
69 %endif:
72
70
73 ## locking icon
71 ## locking icon
74 %if c.rhodecode_db_repo.enable_locking:
72 %if c.rhodecode_db_repo.enable_locking:
75 %if c.rhodecode_db_repo.locked[0]:
73 %if c.rhodecode_db_repo.locked[0]:
76 <span class="locking_locked tooltip" title="${_('Repository locked by %s') % h.person_by_id(c.rhodecode_db_repo.locked[0])}"></span>
74 <span class="locking_locked tooltip" title="${_('Repository locked by %s') % h.person_by_id(c.rhodecode_db_repo.locked[0])}"></span>
77 %else:
75 %else:
78 <span class="locking_unlocked tooltip" title="${_('Repository unlocked')}"></span>
76 <span class="locking_unlocked tooltip" title="${_('Repository unlocked')}"></span>
79 %endif
77 %endif
80 %endif
78 %endif
81 ##REPO TYPE
79 ##REPO TYPE
82 %if h.is_hg(c.dbrepo):
80 %if h.is_hg(c.dbrepo):
83 <img style="margin-bottom:2px" class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url('/images/icons/hgicon.png')}"/>
81 <img style="margin-bottom:2px" class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="${h.url('/images/icons/hgicon.png')}"/>
84 %endif
82 %endif
85 %if h.is_git(c.dbrepo):
83 %if h.is_git(c.dbrepo):
86 <img style="margin-bottom:2px" class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url('/images/icons/giticon.png')}"/>
84 <img style="margin-bottom:2px" class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="${h.url('/images/icons/giticon.png')}"/>
87 %endif
85 %endif
88
86
89 ##PUBLIC/PRIVATE
87 ##PUBLIC/PRIVATE
90 %if c.dbrepo.private:
88 %if c.dbrepo.private:
91 <img style="margin-bottom:2px" class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="${h.url('/images/icons/lock.png')}"/>
89 <img style="margin-bottom:2px" class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="${h.url('/images/icons/lock.png')}"/>
92 %else:
90 %else:
93 <img style="margin-bottom:2px" class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="${h.url('/images/icons/lock_open.png')}"/>
91 <img style="margin-bottom:2px" class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="${h.url('/images/icons/lock_open.png')}"/>
94 %endif
92 %endif
95
93
96 ##REPO NAME
94 ##REPO NAME
97 <span class="repo_name" title="${_('Non changable ID %s') % c.dbrepo.repo_id}">${h.repo_link(c.dbrepo.groups_and_repo)}</span>
95 <span class="repo_name" title="${_('Non changable ID %s') % c.dbrepo.repo_id}">${h.repo_link(c.dbrepo.groups_and_repo)}</span>
98
96
99 ##FORK
97 ##FORK
100 %if c.dbrepo.fork:
98 %if c.dbrepo.fork:
101 <div style="margin-top:5px;clear:both"">
99 <div style="margin-top:5px;clear:both"">
102 <a href="${h.url('summary_home',repo_name=c.dbrepo.fork.repo_name)}"><img class="icon" alt="${_('public')}" title="${_('Fork of')} ${c.dbrepo.fork.repo_name}" src="${h.url('/images/icons/arrow_divide.png')}"/>
100 <a href="${h.url('summary_home',repo_name=c.dbrepo.fork.repo_name)}"><img class="icon" alt="${_('public')}" title="${_('Fork of')} ${c.dbrepo.fork.repo_name}" src="${h.url('/images/icons/arrow_divide.png')}"/>
103 ${_('Fork of')} ${c.dbrepo.fork.repo_name}
101 ${_('Fork of')} ${c.dbrepo.fork.repo_name}
104 </a>
102 </a>
105 </div>
103 </div>
106 %endif
104 %endif
107 ##REMOTE
105 ##REMOTE
108 %if c.dbrepo.clone_uri:
106 %if c.dbrepo.clone_uri:
109 <div style="margin-top:5px;clear:both">
107 <div style="margin-top:5px;clear:both">
110 <a href="${h.url(str(h.hide_credentials(c.dbrepo.clone_uri)))}"><img class="icon" alt="${_('remote clone')}" title="${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}" src="${h.url('/images/icons/connect.png')}"/>
108 <a href="${h.url(str(h.hide_credentials(c.dbrepo.clone_uri)))}"><img class="icon" alt="${_('remote clone')}" title="${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}" src="${h.url('/images/icons/connect.png')}"/>
111 ${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}
109 ${_('Clone from')} ${h.hide_credentials(c.dbrepo.clone_uri)}
112 </a>
110 </a>
113 </div>
111 </div>
114 %endif
112 %endif
115 </div>
113 </div>
116 </div>
114 </div>
117
115
118 <div class="field">
116 <div class="field">
119 <div class="label-summary">
117 <div class="label-summary">
120 <label>${_('Description')}:</label>
118 <label>${_('Description')}:</label>
121 </div>
119 </div>
122 %if c.visual.stylify_metatags:
120 %if c.visual.stylify_metatags:
123 <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(h.desc_stylize(c.dbrepo.description))}</div>
121 <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(h.desc_stylize(c.dbrepo.description))}</div>
124 %else:
122 %else:
125 <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(c.dbrepo.description)}</div>
123 <div class="input ${summary(c.show_stats)} desc">${h.urlify_text(c.dbrepo.description)}</div>
126 %endif
124 %endif
127 </div>
125 </div>
128
126
129 <div class="field">
127 <div class="field">
130 <div class="label-summary">
128 <div class="label-summary">
131 <label>${_('Contact')}:</label>
129 <label>${_('Contact')}:</label>
132 </div>
130 </div>
133 <div class="input ${summary(c.show_stats)}">
131 <div class="input ${summary(c.show_stats)}">
134 <div class="gravatar">
132 <div class="gravatar">
135 <img alt="gravatar" src="${h.gravatar_url(c.dbrepo.user.email)}"/>
133 <img alt="gravatar" src="${h.gravatar_url(c.dbrepo.user.email)}"/>
136 </div>
134 </div>
137 ${_('Username')}: ${c.dbrepo.user.username}<br/>
135 ${_('Username')}: ${c.dbrepo.user.username}<br/>
138 ${_('Name')}: ${c.dbrepo.user.name} ${c.dbrepo.user.lastname}<br/>
136 ${_('Name')}: ${c.dbrepo.user.name} ${c.dbrepo.user.lastname}<br/>
139 ${_('Email')}: <a href="mailto:${c.dbrepo.user.email}">${c.dbrepo.user.email}</a>
137 ${_('Email')}: <a href="mailto:${c.dbrepo.user.email}">${c.dbrepo.user.email}</a>
140 </div>
138 </div>
141 </div>
139 </div>
142
140
143 <div class="field">
141 <div class="field">
144 <div class="label-summary">
142 <div class="label-summary">
145 <label>${_('Clone url')}:</label>
143 <label>${_('Clone url')}:</label>
146 </div>
144 </div>
147 <div class="input ${summary(c.show_stats)}">
145 <div class="input ${summary(c.show_stats)}">
148 <input style="width:80%" type="text" id="clone_url" readonly="readonly" value="${c.clone_repo_url}"/>
146 <input style="width:80%" type="text" id="clone_url" readonly="readonly" value="${c.clone_repo_url}"/>
149 <input style="display:none;width:80%" type="text" id="clone_url_id" readonly="readonly" value="${c.clone_repo_url_id}"/>
147 <input style="display:none;width:80%" type="text" id="clone_url_id" readonly="readonly" value="${c.clone_repo_url_id}"/>
150 <div style="display:none" id="clone_by_name" class="ui-btn clone">${_('Show by Name')}</div>
148 <div style="display:none" id="clone_by_name" class="ui-btn clone">${_('Show by Name')}</div>
151 <div id="clone_by_id" class="ui-btn clone">${_('Show by ID')}</div>
149 <div id="clone_by_id" class="ui-btn clone">${_('Show by ID')}</div>
152 </div>
150 </div>
153 </div>
151 </div>
154
152
155 <div class="field">
153 <div class="field">
156 <div class="label-summary">
154 <div class="label-summary">
157 <label>${_('Trending files')}:</label>
155 <label>${_('Trending files')}:</label>
158 </div>
156 </div>
159 <div class="input ${summary(c.show_stats)}">
157 <div class="input ${summary(c.show_stats)}">
160 %if c.show_stats:
158 %if c.show_stats:
161 <div id="lang_stats"></div>
159 <div id="lang_stats"></div>
162 %else:
160 %else:
163 ${_('Statistics are disabled for this repository')}
161 ${_('Statistics are disabled for this repository')}
164 %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
162 %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
165 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
163 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
166 %endif
164 %endif
167 %endif
165 %endif
168 </div>
166 </div>
169 </div>
167 </div>
170
168
171 <div class="field">
169 <div class="field">
172 <div class="label-summary">
170 <div class="label-summary">
173 <label>${_('Download')}:</label>
171 <label>${_('Download')}:</label>
174 </div>
172 </div>
175 <div class="input ${summary(c.show_stats)}">
173 <div class="input ${summary(c.show_stats)}">
176 %if len(c.rhodecode_repo.revisions) == 0:
174 %if len(c.rhodecode_repo.revisions) == 0:
177 ${_('There are no downloads yet')}
175 ${_('There are no downloads yet')}
178 %elif c.enable_downloads is False:
176 %elif c.enable_downloads is False:
179 ${_('Downloads are disabled for this repository')}
177 ${_('Downloads are disabled for this repository')}
180 %if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
178 %if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
181 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
179 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
182 %endif
180 %endif
183 %else:
181 %else:
184 ${h.select('download_options',c.rhodecode_repo.get_changeset().raw_id,c.download_options)}
182 ${h.select('download_options',c.rhodecode_repo.get_changeset().raw_id,c.download_options)}
185 <span id="${'zip_link'}">${h.link_to(_('Download as zip'), h.url('files_archive_home',repo_name=c.dbrepo.repo_name,fname='tip.zip'),class_="archive_icon ui-btn")}</span>
183 <span id="${'zip_link'}">${h.link_to(_('Download as zip'), h.url('files_archive_home',repo_name=c.dbrepo.repo_name,fname='tip.zip'),class_="archive_icon ui-btn")}</span>
186 <span style="vertical-align: bottom">
184 <span style="vertical-align: bottom">
187 <input id="archive_subrepos" type="checkbox" name="subrepos" />
185 <input id="archive_subrepos" type="checkbox" name="subrepos" />
188 <label for="archive_subrepos" class="tooltip" title="${h.tooltip(_('Check this to download archive with subrepos'))}" >${_('with subrepos')}</label>
186 <label for="archive_subrepos" class="tooltip" title="${h.tooltip(_('Check this to download archive with subrepos'))}" >${_('with subrepos')}</label>
189 </span>
187 </span>
190 %endif
188 %endif
191 </div>
189 </div>
192 </div>
190 </div>
193 </div>
191 </div>
194 </div>
192 </div>
195 </div>
193 </div>
196
194
197 %if c.show_stats:
195 %if c.show_stats:
198 <div class="box box-right" style="min-height:455px">
196 <div class="box box-right" style="min-height:455px">
199 <!-- box / title -->
197 <!-- box / title -->
200 <div class="title">
198 <div class="title">
201 <h5>${_('Commit activity by day / author')}</h5>
199 <h5>${_('Commit activity by day / author')}</h5>
202 </div>
200 </div>
203
201
204 <div class="graph">
202 <div class="graph">
205 <div style="padding:0 10px 10px 17px;">
203 <div style="padding:0 10px 10px 17px;">
206 %if c.no_data:
204 %if c.no_data:
207 ${c.no_data_msg}
205 ${c.no_data_msg}
208 %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
206 %if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
209 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
207 ${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name),class_="ui-btn")}
210 %endif
208 %endif
211 %else:
209 %else:
212 ${_('Stats gathered: ')} ${c.stats_percentage}%
210 ${_('Stats gathered: ')} ${c.stats_percentage}%
213 %endif
211 %endif
214 </div>
212 </div>
215 <div id="commit_history" style="width:450px;height:300px;float:left"></div>
213 <div id="commit_history" style="width:450px;height:300px;float:left"></div>
216 <div style="clear: both;height: 10px"></div>
214 <div style="clear: both;height: 10px"></div>
217 <div id="overview" style="width:450px;height:100px;float:left"></div>
215 <div id="overview" style="width:450px;height:100px;float:left"></div>
218
216
219 <div id="legend_data" style="clear:both;margin-top:10px;">
217 <div id="legend_data" style="clear:both;margin-top:10px;">
220 <div id="legend_container"></div>
218 <div id="legend_container"></div>
221 <div id="legend_choices">
219 <div id="legend_choices">
222 <table id="legend_choices_tables" class="noborder" style="font-size:smaller;color:#545454"></table>
220 <table id="legend_choices_tables" class="noborder" style="font-size:smaller;color:#545454"></table>
223 </div>
221 </div>
224 </div>
222 </div>
225 </div>
223 </div>
226 </div>
224 </div>
227 %endif
225 %endif
228
226
229 <div class="box">
227 <div class="box">
230 <div class="title">
228 <div class="title">
231 <div class="breadcrumbs">
229 <div class="breadcrumbs">
232 %if c.repo_changesets:
230 %if c.repo_changesets:
233 ${h.link_to(_('Latest changes'),h.url('changelog_home',repo_name=c.repo_name))}
231 ${h.link_to(_('Latest changes'),h.url('changelog_home',repo_name=c.repo_name))}
234 %else:
232 %else:
235 ${_('Quick start')}
233 ${_('Quick start')}
236 %endif
234 %endif
237 </div>
235 </div>
238 </div>
236 </div>
239 <div class="table">
237 <div class="table">
240 <div id="shortlog_data">
238 <div id="shortlog_data">
241 <%include file='../shortlog/shortlog_data.html'/>
239 <%include file='../shortlog/shortlog_data.html'/>
242 </div>
240 </div>
243 </div>
241 </div>
244 </div>
242 </div>
245
243
246 %if c.readme_data:
244 %if c.readme_data:
247 <div id="readme" class="anchor">
245 <div id="readme" class="anchor">
248 <div class="box" style="background-color: #FAFAFA">
246 <div class="box" style="background-color: #FAFAFA">
249 <div class="title" title="${_("Readme file at revision '%s'" % c.rhodecode_db_repo.landing_rev)}">
247 <div class="title" title="${_("Readme file at revision '%s'" % c.rhodecode_db_repo.landing_rev)}">
250 <div class="breadcrumbs">
248 <div class="breadcrumbs">
251 <a href="${h.url('files_home',repo_name=c.repo_name,revision='tip',f_path=c.readme_file)}">${c.readme_file}</a>
249 <a href="${h.url('files_home',repo_name=c.repo_name,revision='tip',f_path=c.readme_file)}">${c.readme_file}</a>
252 <a class="permalink" href="#readme" title="${_('Permalink to this readme')}">&para;</a>
250 <a class="permalink" href="#readme" title="${_('Permalink to this readme')}">&para;</a>
253 </div>
251 </div>
254 </div>
252 </div>
255 <div class="readme">
253 <div class="readme">
256 <div class="readme_box">
254 <div class="readme_box">
257 ${c.readme_data|n}
255 ${c.readme_data|n}
258 </div>
256 </div>
259 </div>
257 </div>
260 </div>
258 </div>
261 </div>
259 </div>
262 %endif
260 %endif
263
261
264 <script type="text/javascript">
262 <script type="text/javascript">
265 var clone_url = 'clone_url';
263 var clone_url = 'clone_url';
266 YUE.on(clone_url,'click',function(e){
264 YUE.on(clone_url,'click',function(e){
267 if(YUD.hasClass(clone_url,'selected')){
265 if(YUD.hasClass(clone_url,'selected')){
268 return
266 return
269 }
267 }
270 else{
268 else{
271 YUD.addClass(clone_url,'selected');
269 YUD.addClass(clone_url,'selected');
272 YUD.get(clone_url).select();
270 YUD.get(clone_url).select();
273 }
271 }
274 })
272 })
275
273
276 YUE.on('clone_by_name','click',function(e){
274 YUE.on('clone_by_name','click',function(e){
277 // show url by name and hide name button
275 // show url by name and hide name button
278 YUD.setStyle('clone_url','display','');
276 YUD.setStyle('clone_url','display','');
279 YUD.setStyle('clone_by_name','display','none');
277 YUD.setStyle('clone_by_name','display','none');
280
278
281 // hide url by id and show name button
279 // hide url by id and show name button
282 YUD.setStyle('clone_by_id','display','');
280 YUD.setStyle('clone_by_id','display','');
283 YUD.setStyle('clone_url_id','display','none');
281 YUD.setStyle('clone_url_id','display','none');
284
282
285 })
283 })
286 YUE.on('clone_by_id','click',function(e){
284 YUE.on('clone_by_id','click',function(e){
287
285
288 // show url by id and hide id button
286 // show url by id and hide id button
289 YUD.setStyle('clone_by_id','display','none');
287 YUD.setStyle('clone_by_id','display','none');
290 YUD.setStyle('clone_url_id','display','');
288 YUD.setStyle('clone_url_id','display','');
291
289
292 // hide url by name and show id button
290 // hide url by name and show id button
293 YUD.setStyle('clone_by_name','display','');
291 YUD.setStyle('clone_by_name','display','');
294 YUD.setStyle('clone_url','display','none');
292 YUD.setStyle('clone_url','display','none');
295 })
293 })
296
294
297
295
298 var tmpl_links = {};
296 var tmpl_links = {};
299 %for cnt,archive in enumerate(c.rhodecode_repo._get_archives()):
297 %for cnt,archive in enumerate(c.rhodecode_repo._get_archives()):
300 tmpl_links["${archive['type']}"] = '${h.link_to('__NAME__', h.url('files_archive_home',repo_name=c.dbrepo.repo_name, fname='__CS__'+archive['extension'],subrepos='__SUB__'),class_='archive_icon ui-btn')}';
298 tmpl_links["${archive['type']}"] = '${h.link_to('__NAME__', h.url('files_archive_home',repo_name=c.dbrepo.repo_name, fname='__CS__'+archive['extension'],subrepos='__SUB__'),class_='archive_icon ui-btn')}';
301 %endfor
299 %endfor
302
300
303 YUE.on(['download_options','archive_subrepos'],'change',function(e){
301 YUE.on(['download_options','archive_subrepos'],'change',function(e){
304 var sm = YUD.get('download_options');
302 var sm = YUD.get('download_options');
305 var new_cs = sm.options[sm.selectedIndex];
303 var new_cs = sm.options[sm.selectedIndex];
306
304
307 for(k in tmpl_links){
305 for(k in tmpl_links){
308 var s = YUD.get(k+'_link');
306 var s = YUD.get(k+'_link');
309 if(s){
307 if(s){
310 var title_tmpl = "${_('Download %s as %s') % ('__CS_NAME__','__CS_EXT__')}";
308 var title_tmpl = "${_('Download %s as %s') % ('__CS_NAME__','__CS_EXT__')}";
311 title_tmpl= title_tmpl.replace('__CS_NAME__',new_cs.text);
309 title_tmpl= title_tmpl.replace('__CS_NAME__',new_cs.text);
312 title_tmpl = title_tmpl.replace('__CS_EXT__',k);
310 title_tmpl = title_tmpl.replace('__CS_EXT__',k);
313
311
314 var url = tmpl_links[k].replace('__CS__',new_cs.value);
312 var url = tmpl_links[k].replace('__CS__',new_cs.value);
315 var subrepos = YUD.get('archive_subrepos').checked;
313 var subrepos = YUD.get('archive_subrepos').checked;
316 url = url.replace('__SUB__',subrepos);
314 url = url.replace('__SUB__',subrepos);
317 url = url.replace('__NAME__',title_tmpl);
315 url = url.replace('__NAME__',title_tmpl);
318 s.innerHTML = url
316 s.innerHTML = url
319 }
317 }
320 }
318 }
321 });
319 });
322 </script>
320 </script>
323 %if c.show_stats:
321 %if c.show_stats:
324 <script type="text/javascript">
322 <script type="text/javascript">
325 var data = ${c.trending_languages|n};
323 var data = ${c.trending_languages|n};
326 var total = 0;
324 var total = 0;
327 var no_data = true;
325 var no_data = true;
328 var tbl = document.createElement('table');
326 var tbl = document.createElement('table');
329 tbl.setAttribute('class','trending_language_tbl');
327 tbl.setAttribute('class','trending_language_tbl');
330 var cnt = 0;
328 var cnt = 0;
331 for (var i=0;i<data.length;i++){
329 for (var i=0;i<data.length;i++){
332 total+= data[i][1].count;
330 total+= data[i][1].count;
333 }
331 }
334 for (var i=0;i<data.length;i++){
332 for (var i=0;i<data.length;i++){
335 cnt += 1;
333 cnt += 1;
336 no_data = false;
334 no_data = false;
337
335
338 var hide = cnt>2;
336 var hide = cnt>2;
339 var tr = document.createElement('tr');
337 var tr = document.createElement('tr');
340 if (hide){
338 if (hide){
341 tr.setAttribute('style','display:none');
339 tr.setAttribute('style','display:none');
342 tr.setAttribute('class','stats_hidden');
340 tr.setAttribute('class','stats_hidden');
343 }
341 }
344 var k = data[i][0];
342 var k = data[i][0];
345 var obj = data[i][1];
343 var obj = data[i][1];
346 var percentage = Math.round((obj.count/total*100),2);
344 var percentage = Math.round((obj.count/total*100),2);
347
345
348 var td1 = document.createElement('td');
346 var td1 = document.createElement('td');
349 td1.width = 150;
347 td1.width = 150;
350 var trending_language_label = document.createElement('div');
348 var trending_language_label = document.createElement('div');
351 trending_language_label.innerHTML = obj.desc+" ("+k+")";
349 trending_language_label.innerHTML = obj.desc+" ("+k+")";
352 td1.appendChild(trending_language_label);
350 td1.appendChild(trending_language_label);
353
351
354 var td2 = document.createElement('td');
352 var td2 = document.createElement('td');
355 td2.setAttribute('style','padding-right:14px !important');
353 td2.setAttribute('style','padding-right:14px !important');
356 var trending_language = document.createElement('div');
354 var trending_language = document.createElement('div');
357 var nr_files = obj.count+" ${_('files')}";
355 var nr_files = obj.count+" ${_('files')}";
358
356
359 trending_language.title = k+" "+nr_files;
357 trending_language.title = k+" "+nr_files;
360
358
361 if (percentage>22){
359 if (percentage>22){
362 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"% "+nr_files+ "</b>";
360 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"% "+nr_files+ "</b>";
363 }
361 }
364 else{
362 else{
365 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"%</b>";
363 trending_language.innerHTML = "<b style='font-size:0.8em'>"+percentage+"%</b>";
366 }
364 }
367
365
368 trending_language.setAttribute("class", 'trending_language top-right-rounded-corner bottom-right-rounded-corner');
366 trending_language.setAttribute("class", 'trending_language top-right-rounded-corner bottom-right-rounded-corner');
369 trending_language.style.width=percentage+"%";
367 trending_language.style.width=percentage+"%";
370 td2.appendChild(trending_language);
368 td2.appendChild(trending_language);
371
369
372 tr.appendChild(td1);
370 tr.appendChild(td1);
373 tr.appendChild(td2);
371 tr.appendChild(td2);
374 tbl.appendChild(tr);
372 tbl.appendChild(tr);
375 if(cnt == 3){
373 if(cnt == 3){
376 var show_more = document.createElement('tr');
374 var show_more = document.createElement('tr');
377 var td = document.createElement('td');
375 var td = document.createElement('td');
378 lnk = document.createElement('a');
376 lnk = document.createElement('a');
379
377
380 lnk.href='#';
378 lnk.href='#';
381 lnk.innerHTML = "${_('show more')}";
379 lnk.innerHTML = "${_('show more')}";
382 lnk.id='code_stats_show_more';
380 lnk.id='code_stats_show_more';
383 td.appendChild(lnk);
381 td.appendChild(lnk);
384
382
385 show_more.appendChild(td);
383 show_more.appendChild(td);
386 show_more.appendChild(document.createElement('td'));
384 show_more.appendChild(document.createElement('td'));
387 tbl.appendChild(show_more);
385 tbl.appendChild(show_more);
388 }
386 }
389
387
390 }
388 }
391
389
392 YUD.get('lang_stats').appendChild(tbl);
390 YUD.get('lang_stats').appendChild(tbl);
393 YUE.on('code_stats_show_more','click',function(){
391 YUE.on('code_stats_show_more','click',function(){
394 l = YUD.getElementsByClassName('stats_hidden')
392 l = YUD.getElementsByClassName('stats_hidden')
395 for (e in l){
393 for (e in l){
396 YUD.setStyle(l[e],'display','');
394 YUD.setStyle(l[e],'display','');
397 };
395 };
398 YUD.setStyle(YUD.get('code_stats_show_more'),
396 YUD.setStyle(YUD.get('code_stats_show_more'),
399 'display','none');
397 'display','none');
400 });
398 });
401 </script>
399 </script>
402 <script type="text/javascript">
400 <script type="text/javascript">
403 /**
401 /**
404 * Plots summary graph
402 * Plots summary graph
405 *
403 *
406 * @class SummaryPlot
404 * @class SummaryPlot
407 * @param {from} initial from for detailed graph
405 * @param {from} initial from for detailed graph
408 * @param {to} initial to for detailed graph
406 * @param {to} initial to for detailed graph
409 * @param {dataset}
407 * @param {dataset}
410 * @param {overview_dataset}
408 * @param {overview_dataset}
411 */
409 */
412 function SummaryPlot(from,to,dataset,overview_dataset) {
410 function SummaryPlot(from,to,dataset,overview_dataset) {
413 var initial_ranges = {
411 var initial_ranges = {
414 "xaxis":{
412 "xaxis":{
415 "from":from,
413 "from":from,
416 "to":to,
414 "to":to,
417 },
415 },
418 };
416 };
419 var dataset = dataset;
417 var dataset = dataset;
420 var overview_dataset = [overview_dataset];
418 var overview_dataset = [overview_dataset];
421 var choiceContainer = YUD.get("legend_choices");
419 var choiceContainer = YUD.get("legend_choices");
422 var choiceContainerTable = YUD.get("legend_choices_tables");
420 var choiceContainerTable = YUD.get("legend_choices_tables");
423 var plotContainer = YUD.get('commit_history');
421 var plotContainer = YUD.get('commit_history');
424 var overviewContainer = YUD.get('overview');
422 var overviewContainer = YUD.get('overview');
425
423
426 var plot_options = {
424 var plot_options = {
427 bars: {show:true,align:'center',lineWidth:4},
425 bars: {show:true,align:'center',lineWidth:4},
428 legend: {show:true, container:"legend_container"},
426 legend: {show:true, container:"legend_container"},
429 points: {show:true,radius:0,fill:false},
427 points: {show:true,radius:0,fill:false},
430 yaxis: {tickDecimals:0,},
428 yaxis: {tickDecimals:0,},
431 xaxis: {
429 xaxis: {
432 mode: "time",
430 mode: "time",
433 timeformat: "%d/%m",
431 timeformat: "%d/%m",
434 min:from,
432 min:from,
435 max:to,
433 max:to,
436 },
434 },
437 grid: {
435 grid: {
438 hoverable: true,
436 hoverable: true,
439 clickable: true,
437 clickable: true,
440 autoHighlight:true,
438 autoHighlight:true,
441 color: "#999"
439 color: "#999"
442 },
440 },
443 //selection: {mode: "x"}
441 //selection: {mode: "x"}
444 };
442 };
445 var overview_options = {
443 var overview_options = {
446 legend:{show:false},
444 legend:{show:false},
447 bars: {show:true,barWidth: 2,},
445 bars: {show:true,barWidth: 2,},
448 shadowSize: 0,
446 shadowSize: 0,
449 xaxis: {mode: "time", timeformat: "%d/%m/%y",},
447 xaxis: {mode: "time", timeformat: "%d/%m/%y",},
450 yaxis: {ticks: 3, min: 0,tickDecimals:0,},
448 yaxis: {ticks: 3, min: 0,tickDecimals:0,},
451 grid: {color: "#999",},
449 grid: {color: "#999",},
452 selection: {mode: "x"}
450 selection: {mode: "x"}
453 };
451 };
454
452
455 /**
453 /**
456 *get dummy data needed in few places
454 *get dummy data needed in few places
457 */
455 */
458 function getDummyData(label){
456 function getDummyData(label){
459 return {"label":label,
457 return {"label":label,
460 "data":[{"time":0,
458 "data":[{"time":0,
461 "commits":0,
459 "commits":0,
462 "added":0,
460 "added":0,
463 "changed":0,
461 "changed":0,
464 "removed":0,
462 "removed":0,
465 }],
463 }],
466 "schema":["commits"],
464 "schema":["commits"],
467 "color":'#ffffff',
465 "color":'#ffffff',
468 }
466 }
469 }
467 }
470
468
471 /**
469 /**
472 * generate checkboxes accordindly to data
470 * generate checkboxes accordindly to data
473 * @param keys
471 * @param keys
474 * @returns
472 * @returns
475 */
473 */
476 function generateCheckboxes(data) {
474 function generateCheckboxes(data) {
477 //append checkboxes
475 //append checkboxes
478 var i = 0;
476 var i = 0;
479 choiceContainerTable.innerHTML = '';
477 choiceContainerTable.innerHTML = '';
480 for(var pos in data) {
478 for(var pos in data) {
481
479
482 data[pos].color = i;
480 data[pos].color = i;
483 i++;
481 i++;
484 if(data[pos].label != ''){
482 if(data[pos].label != ''){
485 choiceContainerTable.innerHTML +=
483 choiceContainerTable.innerHTML +=
486 '<tr><td><input type="checkbox" id="id_user_{0}" name="{0}" checked="checked" /> \
484 '<tr><td><input type="checkbox" id="id_user_{0}" name="{0}" checked="checked" /> \
487 <label for="id_user_{0}">{0}</label></td></tr>'.format(data[pos].label);
485 <label for="id_user_{0}">{0}</label></td></tr>'.format(data[pos].label);
488 }
486 }
489 }
487 }
490 }
488 }
491
489
492 /**
490 /**
493 * ToolTip show
491 * ToolTip show
494 */
492 */
495 function showTooltip(x, y, contents) {
493 function showTooltip(x, y, contents) {
496 var div=document.getElementById('tooltip');
494 var div=document.getElementById('tooltip');
497 if(!div) {
495 if(!div) {
498 div = document.createElement('div');
496 div = document.createElement('div');
499 div.id="tooltip";
497 div.id="tooltip";
500 div.style.position="absolute";
498 div.style.position="absolute";
501 div.style.border='1px solid #fdd';
499 div.style.border='1px solid #fdd';
502 div.style.padding='2px';
500 div.style.padding='2px';
503 div.style.backgroundColor='#fee';
501 div.style.backgroundColor='#fee';
504 document.body.appendChild(div);
502 document.body.appendChild(div);
505 }
503 }
506 YUD.setStyle(div, 'opacity', 0);
504 YUD.setStyle(div, 'opacity', 0);
507 div.innerHTML = contents;
505 div.innerHTML = contents;
508 div.style.top=(y + 5) + "px";
506 div.style.top=(y + 5) + "px";
509 div.style.left=(x + 5) + "px";
507 div.style.left=(x + 5) + "px";
510
508
511 var anim = new YAHOO.util.Anim(div, {opacity: {to: 0.8}}, 0.2);
509 var anim = new YAHOO.util.Anim(div, {opacity: {to: 0.8}}, 0.2);
512 anim.animate();
510 anim.animate();
513 }
511 }
514
512
515 /**
513 /**
516 * This function will detect if selected period has some changesets
514 * This function will detect if selected period has some changesets
517 for this user if it does this data is then pushed for displaying
515 for this user if it does this data is then pushed for displaying
518 Additionally it will only display users that are selected by the checkbox
516 Additionally it will only display users that are selected by the checkbox
519 */
517 */
520 function getDataAccordingToRanges(ranges) {
518 function getDataAccordingToRanges(ranges) {
521
519
522 var data = [];
520 var data = [];
523 var new_dataset = {};
521 var new_dataset = {};
524 var keys = [];
522 var keys = [];
525 var max_commits = 0;
523 var max_commits = 0;
526 for(var key in dataset){
524 for(var key in dataset){
527
525
528 for(var ds in dataset[key].data){
526 for(var ds in dataset[key].data){
529 commit_data = dataset[key].data[ds];
527 commit_data = dataset[key].data[ds];
530 if (commit_data.time >= ranges.xaxis.from && commit_data.time <= ranges.xaxis.to){
528 if (commit_data.time >= ranges.xaxis.from && commit_data.time <= ranges.xaxis.to){
531
529
532 if(new_dataset[key] === undefined){
530 if(new_dataset[key] === undefined){
533 new_dataset[key] = {data:[],schema:["commits"],label:key};
531 new_dataset[key] = {data:[],schema:["commits"],label:key};
534 }
532 }
535 new_dataset[key].data.push(commit_data);
533 new_dataset[key].data.push(commit_data);
536 }
534 }
537 }
535 }
538 if (new_dataset[key] !== undefined){
536 if (new_dataset[key] !== undefined){
539 data.push(new_dataset[key]);
537 data.push(new_dataset[key]);
540 }
538 }
541 }
539 }
542
540
543 if (data.length > 0){
541 if (data.length > 0){
544 return data;
542 return data;
545 }
543 }
546 else{
544 else{
547 //just return dummy data for graph to plot itself
545 //just return dummy data for graph to plot itself
548 return [getDummyData('')];
546 return [getDummyData('')];
549 }
547 }
550 }
548 }
551
549
552 /**
550 /**
553 * redraw using new checkbox data
551 * redraw using new checkbox data
554 */
552 */
555 function plotchoiced(e,args){
553 function plotchoiced(e,args){
556 var cur_data = args[0];
554 var cur_data = args[0];
557 var cur_ranges = args[1];
555 var cur_ranges = args[1];
558
556
559 var new_data = [];
557 var new_data = [];
560 var inputs = choiceContainer.getElementsByTagName("input");
558 var inputs = choiceContainer.getElementsByTagName("input");
561
559
562 //show only checked labels
560 //show only checked labels
563 for(var i=0; i<inputs.length; i++) {
561 for(var i=0; i<inputs.length; i++) {
564 var checkbox_key = inputs[i].name;
562 var checkbox_key = inputs[i].name;
565
563
566 if(inputs[i].checked){
564 if(inputs[i].checked){
567 for(var d in cur_data){
565 for(var d in cur_data){
568 if(cur_data[d].label == checkbox_key){
566 if(cur_data[d].label == checkbox_key){
569 new_data.push(cur_data[d]);
567 new_data.push(cur_data[d]);
570 }
568 }
571 }
569 }
572 }
570 }
573 else{
571 else{
574 //push dummy data to not hide the label
572 //push dummy data to not hide the label
575 new_data.push(getDummyData(checkbox_key));
573 new_data.push(getDummyData(checkbox_key));
576 }
574 }
577 }
575 }
578
576
579 var new_options = YAHOO.lang.merge(plot_options, {
577 var new_options = YAHOO.lang.merge(plot_options, {
580 xaxis: {
578 xaxis: {
581 min: cur_ranges.xaxis.from,
579 min: cur_ranges.xaxis.from,
582 max: cur_ranges.xaxis.to,
580 max: cur_ranges.xaxis.to,
583 mode:"time",
581 mode:"time",
584 timeformat: "%d/%m",
582 timeformat: "%d/%m",
585 },
583 },
586 });
584 });
587 if (!new_data){
585 if (!new_data){
588 new_data = [[0,1]];
586 new_data = [[0,1]];
589 }
587 }
590 // do the zooming
588 // do the zooming
591 plot = YAHOO.widget.Flot(plotContainer, new_data, new_options);
589 plot = YAHOO.widget.Flot(plotContainer, new_data, new_options);
592
590
593 plot.subscribe("plotselected", plotselected);
591 plot.subscribe("plotselected", plotselected);
594
592
595 //resubscribe plothover
593 //resubscribe plothover
596 plot.subscribe("plothover", plothover);
594 plot.subscribe("plothover", plothover);
597
595
598 // don't fire event on the overview to prevent eternal loop
596 // don't fire event on the overview to prevent eternal loop
599 overview.setSelection(cur_ranges, true);
597 overview.setSelection(cur_ranges, true);
600
598
601 }
599 }
602
600
603 /**
601 /**
604 * plot only selected items from overview
602 * plot only selected items from overview
605 * @param ranges
603 * @param ranges
606 * @returns
604 * @returns
607 */
605 */
608 function plotselected(ranges,cur_data) {
606 function plotselected(ranges,cur_data) {
609 //updates the data for new plot
607 //updates the data for new plot
610 var data = getDataAccordingToRanges(ranges);
608 var data = getDataAccordingToRanges(ranges);
611 generateCheckboxes(data);
609 generateCheckboxes(data);
612
610
613 var new_options = YAHOO.lang.merge(plot_options, {
611 var new_options = YAHOO.lang.merge(plot_options, {
614 xaxis: {
612 xaxis: {
615 min: ranges.xaxis.from,
613 min: ranges.xaxis.from,
616 max: ranges.xaxis.to,
614 max: ranges.xaxis.to,
617 mode:"time",
615 mode:"time",
618 timeformat: "%d/%m",
616 timeformat: "%d/%m",
619 },
617 },
620 });
618 });
621 // do the zooming
619 // do the zooming
622 plot = YAHOO.widget.Flot(plotContainer, data, new_options);
620 plot = YAHOO.widget.Flot(plotContainer, data, new_options);
623
621
624 plot.subscribe("plotselected", plotselected);
622 plot.subscribe("plotselected", plotselected);
625
623
626 //resubscribe plothover
624 //resubscribe plothover
627 plot.subscribe("plothover", plothover);
625 plot.subscribe("plothover", plothover);
628
626
629 // don't fire event on the overview to prevent eternal loop
627 // don't fire event on the overview to prevent eternal loop
630 overview.setSelection(ranges, true);
628 overview.setSelection(ranges, true);
631
629
632 //resubscribe choiced
630 //resubscribe choiced
633 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, ranges]);
631 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, ranges]);
634 }
632 }
635
633
636 var previousPoint = null;
634 var previousPoint = null;
637
635
638 function plothover(o) {
636 function plothover(o) {
639 var pos = o.pos;
637 var pos = o.pos;
640 var item = o.item;
638 var item = o.item;
641
639
642 //YUD.get("x").innerHTML = pos.x.toFixed(2);
640 //YUD.get("x").innerHTML = pos.x.toFixed(2);
643 //YUD.get("y").innerHTML = pos.y.toFixed(2);
641 //YUD.get("y").innerHTML = pos.y.toFixed(2);
644 if (item) {
642 if (item) {
645 if (previousPoint != item.datapoint) {
643 if (previousPoint != item.datapoint) {
646 previousPoint = item.datapoint;
644 previousPoint = item.datapoint;
647
645
648 var tooltip = YUD.get("tooltip");
646 var tooltip = YUD.get("tooltip");
649 if(tooltip) {
647 if(tooltip) {
650 tooltip.parentNode.removeChild(tooltip);
648 tooltip.parentNode.removeChild(tooltip);
651 }
649 }
652 var x = item.datapoint.x.toFixed(2);
650 var x = item.datapoint.x.toFixed(2);
653 var y = item.datapoint.y.toFixed(2);
651 var y = item.datapoint.y.toFixed(2);
654
652
655 if (!item.series.label){
653 if (!item.series.label){
656 item.series.label = 'commits';
654 item.series.label = 'commits';
657 }
655 }
658 var d = new Date(x*1000);
656 var d = new Date(x*1000);
659 var fd = d.toDateString()
657 var fd = d.toDateString()
660 var nr_commits = parseInt(y);
658 var nr_commits = parseInt(y);
661
659
662 var cur_data = dataset[item.series.label].data[item.dataIndex];
660 var cur_data = dataset[item.series.label].data[item.dataIndex];
663 var added = cur_data.added;
661 var added = cur_data.added;
664 var changed = cur_data.changed;
662 var changed = cur_data.changed;
665 var removed = cur_data.removed;
663 var removed = cur_data.removed;
666
664
667 var nr_commits_suffix = " ${_('commits')} ";
665 var nr_commits_suffix = " ${_('commits')} ";
668 var added_suffix = " ${_('files added')} ";
666 var added_suffix = " ${_('files added')} ";
669 var changed_suffix = " ${_('files changed')} ";
667 var changed_suffix = " ${_('files changed')} ";
670 var removed_suffix = " ${_('files removed')} ";
668 var removed_suffix = " ${_('files removed')} ";
671
669
672
670
673 if(nr_commits == 1){nr_commits_suffix = " ${_('commit')} ";}
671 if(nr_commits == 1){nr_commits_suffix = " ${_('commit')} ";}
674 if(added==1){added_suffix=" ${_('file added')} ";}
672 if(added==1){added_suffix=" ${_('file added')} ";}
675 if(changed==1){changed_suffix=" ${_('file changed')} ";}
673 if(changed==1){changed_suffix=" ${_('file changed')} ";}
676 if(removed==1){removed_suffix=" ${_('file removed')} ";}
674 if(removed==1){removed_suffix=" ${_('file removed')} ";}
677
675
678 showTooltip(item.pageX, item.pageY, item.series.label + " on " + fd
676 showTooltip(item.pageX, item.pageY, item.series.label + " on " + fd
679 +'<br/>'+
677 +'<br/>'+
680 nr_commits + nr_commits_suffix+'<br/>'+
678 nr_commits + nr_commits_suffix+'<br/>'+
681 added + added_suffix +'<br/>'+
679 added + added_suffix +'<br/>'+
682 changed + changed_suffix + '<br/>'+
680 changed + changed_suffix + '<br/>'+
683 removed + removed_suffix + '<br/>');
681 removed + removed_suffix + '<br/>');
684 }
682 }
685 }
683 }
686 else {
684 else {
687 var tooltip = YUD.get("tooltip");
685 var tooltip = YUD.get("tooltip");
688
686
689 if(tooltip) {
687 if(tooltip) {
690 tooltip.parentNode.removeChild(tooltip);
688 tooltip.parentNode.removeChild(tooltip);
691 }
689 }
692 previousPoint = null;
690 previousPoint = null;
693 }
691 }
694 }
692 }
695
693
696 /**
694 /**
697 * MAIN EXECUTION
695 * MAIN EXECUTION
698 */
696 */
699
697
700 var data = getDataAccordingToRanges(initial_ranges);
698 var data = getDataAccordingToRanges(initial_ranges);
701 generateCheckboxes(data);
699 generateCheckboxes(data);
702
700
703 //main plot
701 //main plot
704 var plot = YAHOO.widget.Flot(plotContainer,data,plot_options);
702 var plot = YAHOO.widget.Flot(plotContainer,data,plot_options);
705
703
706 //overview
704 //overview
707 var overview = YAHOO.widget.Flot(overviewContainer,
705 var overview = YAHOO.widget.Flot(overviewContainer,
708 overview_dataset, overview_options);
706 overview_dataset, overview_options);
709
707
710 //show initial selection on overview
708 //show initial selection on overview
711 overview.setSelection(initial_ranges);
709 overview.setSelection(initial_ranges);
712
710
713 plot.subscribe("plotselected", plotselected);
711 plot.subscribe("plotselected", plotselected);
714 plot.subscribe("plothover", plothover)
712 plot.subscribe("plothover", plothover)
715
713
716 overview.subscribe("plotselected", function (ranges) {
714 overview.subscribe("plotselected", function (ranges) {
717 plot.setSelection(ranges);
715 plot.setSelection(ranges);
718 });
716 });
719
717
720 // user choices on overview
718 // user choices on overview
721 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, initial_ranges]);
719 YUE.on(choiceContainer.getElementsByTagName("input"), "click", plotchoiced, [data, initial_ranges]);
722 }
720 }
723 SummaryPlot(${c.ts_min},${c.ts_max},${c.commit_data|n},${c.overview_data|n});
721 SummaryPlot(${c.ts_min},${c.ts_max},${c.commit_data|n},${c.overview_data|n});
724 </script>
722 </script>
725 %endif
723 %endif
726
724
727 </%def>
725 </%def>
General Comments 0
You need to be logged in to leave comments. Login now