From e914eff4358b82780e5cbec987c71860878be1a6 Mon Sep 17 00:00:00 2001 From: Ryan Lerch Date: Dec 24 2015 09:22:01 +0000 Subject: major changes to the front pages --- diff --git a/pagure/api/project.py b/pagure/api/project.py index 60f9719..7492781 100644 --- a/pagure/api/project.py +++ b/pagure/api/project.py @@ -141,6 +141,7 @@ def api_projects(): tags = flask.request.values.getlist('tags') username = flask.request.values.get('username', None) fork = flask.request.values.get('fork', None) + pattern = flask.request.values.get('pattern', None) if str(fork).lower() in ['1', 'true']: fork = True @@ -148,7 +149,7 @@ def api_projects(): fork = False projects = pagure.lib.search_projects( - SESSION, username=username, fork=fork, tags=tags) + SESSION, username=username, fork=fork, tags=tags, pattern=pattern) if not projects: raise pagure.exceptions.APIError( diff --git a/pagure/static/jquery.dotdotdot.min.js b/pagure/static/jquery.dotdotdot.min.js new file mode 100644 index 0000000..95bce3a --- /dev/null +++ b/pagure/static/jquery.dotdotdot.min.js @@ -0,0 +1,13 @@ +/* + * jQuery dotdotdot 1.7.4 + * + * Copyright (c) Fred Heusschen + * www.frebsite.nl + * + * Plugin website: + * dotdotdot.frebsite.nl + * + * Licensed under the MIT license. + * http://en.wikipedia.org/wiki/MIT_License + */ +!function(t,e){function n(t,e,n){var r=t.children(),o=!1;t.empty();for(var i=0,d=r.length;d>i;i++){var l=r.eq(i);if(t.append(l),n&&t.append(n),a(t,e)){l.remove(),o=!0;break}n&&n.detach()}return o}function r(e,n,i,d,l){var s=!1,c="a, table, thead, tbody, tfoot, tr, col, colgroup, object, embed, param, ol, ul, dl, blockquote, select, optgroup, option, textarea, script, style",u="script, .dotdotdot-keep";return e.contents().detach().each(function(){var h=this,f=t(h);if("undefined"==typeof h)return!0;if(f.is(u))e.append(f);else{if(s)return!0;e.append(f),!l||f.is(d.after)||f.find(d.after).length||e[e.is(c)?"after":"append"](l),a(i,d)&&(s=3==h.nodeType?o(f,n,i,d,l):r(f,n,i,d,l),s||(f.detach(),s=!0)),s||l&&l.detach()}}),n.addClass("is-truncated"),s}function o(e,n,r,o,d){var c=e[0];if(!c)return!1;var h=s(c),f=-1!==h.indexOf(" ")?" ":" ",p="letter"==o.wrap?"":f,g=h.split(p),v=-1,w=-1,b=0,y=g.length-1;for(o.fallbackToLetter&&0==b&&0==y&&(p="",g=h.split(p),y=g.length-1);y>=b&&(0!=b||0!=y);){var m=Math.floor((b+y)/2);if(m==w)break;w=m,l(c,g.slice(0,w+1).join(p)+o.ellipsis),r.children().each(function(){t(this).toggle().toggle()}),a(r,o)?(y=w,o.fallbackToLetter&&0==b&&0==y&&(p="",g=g[0].split(p),v=-1,w=-1,b=0,y=g.length-1)):(v=w,b=w)}if(-1==v||1==g.length&&0==g[0].length){var x=e.parent();e.detach();var T=d&&d.closest(x).length?d.length:0;x.contents().length>T?c=u(x.contents().eq(-1-T),n):(c=u(x,n,!0),T||x.detach()),c&&(h=i(s(c),o),l(c,h),T&&d&&t(c).parent().append(d))}else h=i(g.slice(0,v+1).join(p),o),l(c,h);return!0}function a(t,e){return t.innerHeight()>e.maxHeight}function i(e,n){for(;t.inArray(e.slice(-1),n.lastCharacter.remove)>-1;)e=e.slice(0,-1);return t.inArray(e.slice(-1),n.lastCharacter.noEllipsis)<0&&(e+=n.ellipsis),e}function d(t){return{width:t.innerWidth(),height:t.innerHeight()}}function l(t,e){t.innerText?t.innerText=e:t.nodeValue?t.nodeValue=e:t.textContent&&(t.textContent=e)}function s(t){return t.innerText?t.innerText:t.nodeValue?t.nodeValue:t.textContent?t.textContent:""}function c(t){do t=t.previousSibling;while(t&&1!==t.nodeType&&3!==t.nodeType);return t}function u(e,n,r){var o,a=e&&e[0];if(a){if(!r){if(3===a.nodeType)return a;if(t.trim(e.text()))return u(e.contents().last(),n)}for(o=c(a);!o;){if(e=e.parent(),e.is(n)||!e.length)return!1;o=c(e[0])}if(o)return u(t(o),n)}return!1}function h(e,n){return e?"string"==typeof e?(e=t(e,n),e.length?e:!1):e.jquery?e:!1:!1}function f(t){for(var e=t.innerHeight(),n=["paddingTop","paddingBottom"],r=0,o=n.length;o>r;r++){var a=parseInt(t.css(n[r]),10);isNaN(a)&&(a=0),e-=a}return e}if(!t.fn.dotdotdot){t.fn.dotdotdot=function(e){if(0==this.length)return t.fn.dotdotdot.debug('No element found for "'+this.selector+'".'),this;if(this.length>1)return this.each(function(){t(this).dotdotdot(e)});var o=this;o.data("dotdotdot")&&o.trigger("destroy.dot"),o.data("dotdotdot-style",o.attr("style")||""),o.css("word-wrap","break-word"),"nowrap"===o.css("white-space")&&o.css("white-space","normal"),o.bind_events=function(){return o.bind("update.dot",function(e,d){switch(o.removeClass("is-truncated"),e.preventDefault(),e.stopPropagation(),typeof l.height){case"number":l.maxHeight=l.height;break;case"function":l.maxHeight=l.height.call(o[0]);break;default:l.maxHeight=f(o)}l.maxHeight+=l.tolerance,"undefined"!=typeof d&&(("string"==typeof d||"nodeType"in d&&1===d.nodeType)&&(d=t("
").append(d).contents()),d instanceof t&&(i=d)),g=o.wrapInner('
').children(),g.contents().detach().end().append(i.clone(!0)).find("br").replaceWith("
").end().css({height:"auto",width:"auto",border:"none",padding:0,margin:0});var c=!1,u=!1;return s.afterElement&&(c=s.afterElement.clone(!0),c.show(),s.afterElement.detach()),a(g,l)&&(u="children"==l.wrap?n(g,l,c):r(g,o,g,l,c)),g.replaceWith(g.contents()),g=null,t.isFunction(l.callback)&&l.callback.call(o[0],u,i),s.isTruncated=u,u}).bind("isTruncated.dot",function(t,e){return t.preventDefault(),t.stopPropagation(),"function"==typeof e&&e.call(o[0],s.isTruncated),s.isTruncated}).bind("originalContent.dot",function(t,e){return t.preventDefault(),t.stopPropagation(),"function"==typeof e&&e.call(o[0],i),i}).bind("destroy.dot",function(t){t.preventDefault(),t.stopPropagation(),o.unwatch().unbind_events().contents().detach().end().append(i).attr("style",o.data("dotdotdot-style")||"").data("dotdotdot",!1)}),o},o.unbind_events=function(){return o.unbind(".dot"),o},o.watch=function(){if(o.unwatch(),"window"==l.watch){var e=t(window),n=e.width(),r=e.height();e.bind("resize.dot"+s.dotId,function(){n==e.width()&&r==e.height()&&l.windowResizeFix||(n=e.width(),r=e.height(),u&&clearInterval(u),u=setTimeout(function(){o.trigger("update.dot")},100))})}else c=d(o),u=setInterval(function(){if(o.is(":visible")){var t=d(o);(c.width!=t.width||c.height!=t.height)&&(o.trigger("update.dot"),c=t)}},500);return o},o.unwatch=function(){return t(window).unbind("resize.dot"+s.dotId),u&&clearInterval(u),o};var i=o.contents(),l=t.extend(!0,{},t.fn.dotdotdot.defaults,e),s={},c={},u=null,g=null;return l.lastCharacter.remove instanceof Array||(l.lastCharacter.remove=t.fn.dotdotdot.defaultArrays.lastCharacter.remove),l.lastCharacter.noEllipsis instanceof Array||(l.lastCharacter.noEllipsis=t.fn.dotdotdot.defaultArrays.lastCharacter.noEllipsis),s.afterElement=h(l.after,o),s.isTruncated=!1,s.dotId=p++,o.data("dotdotdot",!0).bind_events().trigger("update.dot"),l.watch&&o.watch(),o},t.fn.dotdotdot.defaults={ellipsis:"... ",wrap:"word",fallbackToLetter:!0,lastCharacter:{},tolerance:0,callback:null,after:null,height:null,watch:!1,windowResizeFix:!0},t.fn.dotdotdot.defaultArrays={lastCharacter:{remove:[" "," ",",",";",".","!","?"],noEllipsis:[]}},t.fn.dotdotdot.debug=function(){};var p=1,g=t.fn.html;t.fn.html=function(n){return n!=e&&!t.isFunction(n)&&this.data("dotdotdot")?this.trigger("update",[n]):g.apply(this,arguments)};var v=t.fn.text;t.fn.text=function(n){return n!=e&&!t.isFunction(n)&&this.data("dotdotdot")?(n=t("
").text(n).html(),this.trigger("update",[n])):v.apply(this,arguments)}}}(jQuery); \ No newline at end of file diff --git a/pagure/static/koji.css b/pagure/static/koji.css index 0daea60..21682bb 100644 --- a/pagure/static/koji.css +++ b/pagure/static/koji.css @@ -189,8 +189,42 @@ min-height:800px; right:6px!important; } -@media (min-width:768px) { +.ellipsis { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + text-overflow: ellipsis; + text-overflow: ellipsis; +} + +.repo_desc +{ + height:2.5em; + line-height:1; + padding-left:65px; +} + +.repo_name +{ + padding-top:4px; + padding-left:65px; +} + +.project_wrapper +{ +border:1px solid #ddd; +position:relative; +} +.project_metadata +{ + + bottom:0; + background:#eee; + width:100%; + margin-top:2px; +} +/*@media (min-width:768px) { .container { max-width:55pc } -} +}*/ diff --git a/pagure/templates/_browseheader.html b/pagure/templates/_browseheader.html new file mode 100644 index 0000000..573e20e --- /dev/null +++ b/pagure/templates/_browseheader.html @@ -0,0 +1,27 @@ +{% macro browse_header(select) -%} +
+
+
+ + + + +
+
+
+ +{%- endmacro %} diff --git a/pagure/templates/_render_repo.html b/pagure/templates/_render_repo.html index 8f5dae2..6466f10 100644 --- a/pagure/templates/_render_repo.html +++ b/pagure/templates/_render_repo.html @@ -1,36 +1,32 @@ {% macro render_row(items) -%} {% for repo in items %} - {% if loop.index == 1 %} -
-
- {% endif %} {% if repo.is_fork %} {% set url = url_for('view_repo', username=repo.user.username, repo=repo.name) %} {% else %} {% set url = url_for('view_repo', repo=repo.name) %} {% endif %} - - {% elif loop.index is divisibleby(3) or loop.last %} -
+ +
{{ repo.name }}
+
+
+ {% if repo.description %}{{ repo.description }}{%else%}no description{% endif %} +
+
-
-
- {% endif %} +
{% else %} -

No project found

+

No projects found

{% endfor %} {%- endmacro %} @@ -41,7 +37,7 @@ {% if page > 1%} - + < Previous {% else %} @@ -51,7 +47,7 @@ {{ page }} / {{ total }} {% if page < total %} - + Next > {% else %} @@ -66,9 +62,7 @@ {% macro render_repos( list, total, pagetitle, page, title, count, id, username=None, hide=True) %} - +{% endmacro %} + +{% macro render_user_repos( + list, total, pagetitle, page, title, count, id, username=None, hide=True) %} +
+
+ {{ title }} {{ count }} +
+ {% if total and total > 1 %} + {{ pagination_link(pagetitle, page, total) }} + {% endif %} +
+ + {% for repo in list %} + {% if repo.is_fork %} + {% set url = url_for('view_repo', username=repo.user.username, repo=repo.name) %} + {% else %} + {% set url = url_for('view_repo', repo=repo.name) %} + {% endif %} + +
{{ repo.name }}
+
+ {% else %} +

No projects found

+ {% endfor %} + +
+ {% if total and total > 1 %} + {{ pagination_link(pagetitle, page, total) }} + {% endif %} +
{% endmacro %} diff --git a/pagure/templates/index.html b/pagure/templates/index.html index 2d93796..3c97cc6 100644 --- a/pagure/templates/index.html +++ b/pagure/templates/index.html @@ -5,16 +5,25 @@ {% block header %} - + + + {% endblock %} -{% from "_render_repo.html" import render_repos %} -{% from "_render_repo.html" import repos_switch %} +{% from "_render_repo.html" import render_repos, render_user_repos%} +{% from "_browseheader.html" import browse_header %} + +{% if (not username) or (request.path == '/browse/projects') or (request.path == '/browse/projects/') %} + {% set indexcontext = 'browse' %} +{% else %} + {% set indexcontext = 'userpage' %} +{% endif %} {% block content %} -
- {% if username %} +
+
+ {% if indexcontext == 'userpage' %}

{{ username | avatar(36) | safe }} {{ username }} {% if g.fas_user and g.fas_user.username == username %} @@ -24,22 +33,83 @@ {% endif %}

- {{ repos_switch() }} - {{ render_repos( - user_repos, total_page_repos, 'repopage', repopage, - 'My Projects', user_repos_length, 'myrepos', username) }} - {{ render_repos( - user_forks, total_page_forks, 'forkpage', forkpage, - 'My Forks', user_forks_length, 'myforks', username) }} + {% else %} + {{browse_header(select=select)}} {% endif %} + +
+
+
+ {% if indexcontext == 'userpage' %} +
+
+ {{ render_user_repos( + user_repos, total_page_repos, 'repopage', repopage, + 'My Projects', user_repos_length, 'myrepos', username) }} +
+
+ {{ render_user_repos( + user_forks, total_page_forks, 'forkpage', forkpage, + 'My Forks', user_forks_length, 'myforks', username) }} +
+
+ {% else %} {{ render_repos( repos, total_page, 'page', page, 'All Projects', repos_length, 'repos', username) }} + {% endif %}
+ {% endblock %} {% block jscripts %} {{ super() }} + + + + {% if username %} {% endif %} + {% endblock %} diff --git a/pagure/templates/issue.html b/pagure/templates/issue.html index 5880a58..e2ee0fb 100644 --- a/pagure/templates/issue.html +++ b/pagure/templates/issue.html @@ -203,7 +203,7 @@ src="{{ url_for('static', filename='upload.js') }}"> - + {% endblock %} {% if config['FEDMENU_URL'] %} diff --git a/pagure/templates/user_list.html b/pagure/templates/user_list.html index 4b7738f..310c612 100644 --- a/pagure/templates/user_list.html +++ b/pagure/templates/user_list.html @@ -1,16 +1,20 @@ {% extends "master.html" %} {% block title %}Users{% endblock %} {% set tag = "users" %} +{% from "_browseheader.html" import browse_header %} +{% block header %} + +{% endblock %} {% block content %} - -

Users

- -{% if config.get('PAGURE_AUTH') == 'local' %} -Create User -{% endif %} - +
+
+ {{browse_header(select=select)}} +
+
+
{% if total_page and total_page > 1 %} @@ -51,5 +55,43 @@ {% endfor %} + + +{% endblock %} +{% block jscripts %} + {{ super() }} + + {% endblock %} diff --git a/pagure/ui/app.py b/pagure/ui/app.py index ce62902..12735c3 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -27,6 +27,8 @@ from pagure import (APP, SESSION, cla_required, # pylint: disable=E1101 +@APP.route('/browse/projects', endpoint='browse_projects') +@APP.route('/browse/projects/', endpoint='browse_projects') @APP.route('/') def index(): """ Front page of the application. @@ -113,6 +115,7 @@ def index(): total_page=total_page, page=page, username=username, + select="projects", repopage=repopage, forkpage=forkpage, user_repos=user_repos, diff --git a/pagure/ui/filters.py b/pagure/ui/filters.py index 465949a..f448845 100644 --- a/pagure/ui/filters.py +++ b/pagure/ui/filters.py @@ -13,6 +13,7 @@ import textwrap import arrow import flask +import md5 from pygments import highlight from pygments.lexers.text import DiffLexer @@ -217,12 +218,12 @@ def text_wraps(text, size=10): @APP.template_filter('avatar') -def avatar(packager, size=64): +def avatar(packager, size=64, default="retro"): """ Template filter sorting the given branches, Fedora first then EPEL, then whatever is left. """ output = '' % ( - pagure.lib.avatar_url(packager, size) + pagure.lib.avatar_url(packager, size, default) ) return output @@ -349,3 +350,11 @@ def int_to_rgb(percent): except ValueError: pass return output + +@APP.template_filter('return_md5') +def return_md5(text): + """ Template filter to return an MD5 for a string + """ + m = md5.new() + m.update(text) + return pagure.lib.clean_input(m.hexdigest())