diff --git a/.gitignore b/.gitignore index f98b0074d..7f6472601 100644 --- a/.gitignore +++ b/.gitignore @@ -20,4 +20,7 @@ crash.log config/newrelic.yml config/deploy/*.rb config/deploy.rb -*.swo +.swo +.swn +.ruby-gemset +.ruby-version \ No newline at end of file diff --git a/app/assets/images/bg_blue.png b/app/assets/images/bg_blue.png new file mode 100644 index 000000000..ecfede360 Binary files /dev/null and b/app/assets/images/bg_blue.png differ diff --git a/app/assets/images/profile-hover.png b/app/assets/images/profile-hover.png new file mode 100644 index 000000000..09427d06b Binary files /dev/null and b/app/assets/images/profile-hover.png differ diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 1672028d3..9946b1663 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -100,4 +100,33 @@ $(document).ready(function() { updateTime(); setInterval( updateTime, 15000 ); + + window.updatePagination = function(link) { + var page = parseInt($('.pagination .current').text()); + if (link.hasClass('next_page')) { + page += 1; + } else { + if (link.hasClass('previous_page')) { + page -= 1; + } else { + page = link.text(); + } + } + $('.pagination .current').html(page); + }; + + window.isSearchUser = null; + window.search_items = function(path, fdata, dom) { + if (window.isSearchUser != null) { window.isSearchUser.abort(); } + window.isSearchUser = $.ajax({ + type: 'GET', + url: path, + data: fdata, + success: function(data) { + dom.html(data); + updateTime(); + } + }); + return false; + } }); diff --git a/app/assets/javascripts/extra/profile.js b/app/assets/javascripts/extra/profile.js new file mode 100644 index 000000000..668632151 --- /dev/null +++ b/app/assets/javascripts/extra/profile.js @@ -0,0 +1,43 @@ +$(document).ready(function() { + var profile_table = $('.profile-table'); + var profile_path = $('#profile_path').text(); + var profile_vis_buttons = $('.profile-content .span12.sub-menu nav a'); + var profile_search_field = $('.profile-content .search #query_projects'); + + var load_profile_projects = function (page_number) { + var visibility = $('.profile-content .span12.sub-menu nav a.active').hasClass('public-projects') ? 'open' : 'hidden'; + var search = profile_search_field.val(); + page = page_number || $('.pagination .current').text(); + $.ajax({ + type: 'GET', + url: profile_path, + data: {visibility: visibility, search: search, page: page}, + success: function(data){ + profile_table.html(data); + updateTime(); + }, + error: function(data){ + alert('error') // TODO remove + } + }); + return false; + } + + profile_vis_buttons.live('click', function () { + profile_vis_buttons.toggleClass('active'); + return load_profile_projects(); + }); + + $(document).on('click','.profile-table .pagination a', function(){ + updatePagination($(this)); + return load_profile_projects(); + }); + + $('#query_projects').on('keyup', function() { + var visibility = $('.profile-content .span12.sub-menu nav a.active').hasClass('public-projects') ? 'open' : 'hidden'; + var search = profile_search_field.val(); + data = {visibility: visibility, search: search}; + return search_items(profile_path, data, profile_table); + }); +}); + diff --git a/app/assets/javascripts/extra/tracker.js b/app/assets/javascripts/extra/tracker.js index 94fe055d7..072e1fcdf 100644 --- a/app/assets/javascripts/extra/tracker.js +++ b/app/assets/javascripts/extra/tracker.js @@ -18,18 +18,7 @@ $(document).ready(function() { }); $("#table1.issues-table .pagination a").live('click', function() { - var a = $(this); - var page = parseInt($('.pagination .current').text()); - if (a.hasClass('next_page')) { - page += 1; - } else { - if (a.hasClass('previous_page')) { - page -= 1; - } else { - page = a.text(); - } - } - $('.pagination .current').html(page); + updatePagination($(this)); return send_index_tracker_request('GET'); }); @@ -116,18 +105,11 @@ $(document).ready(function() { return false; }; - var isSearchUser = null; $('#search_user').on('keyup', function() { - if (isSearchUser != null) { isSearchUser.abort(); } - isSearchUser = $.ajax({ - type: 'GET', - url: $('#search_user_path').attr('path'), - data: $(this).serialize(), - success: function(data){ - $('#manage_issue_users_list').html(data); - } - }); - return false; + path = $('#search_user_path').attr('path'); + data = $(this).serialize(); + dom = $('#manage_issue_users_list'); + return search_items(path, data, dom); }); $('.users-search-popup .header .icon-remove-circle').live('click', function() { diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss index c908583cb..f54b1889b 100644 --- a/app/assets/stylesheets/application.scss +++ b/app/assets/stylesheets/application.scss @@ -4,3 +4,4 @@ @import "design/common"; @import "design/custom"; @import "design/build_lists_monitoring"; +@import "design/profile"; diff --git a/app/assets/stylesheets/design/custom.scss b/app/assets/stylesheets/design/custom.scss index b583bf3be..37ee3d4ee 100644 --- a/app/assets/stylesheets/design/custom.scss +++ b/app/assets/stylesheets/design/custom.scss @@ -1918,7 +1918,7 @@ table#myTable thead tr.search th form.button_to div input { } article .activity .top { - + .created { margin-left: 50px; span, a { @@ -1941,7 +1941,7 @@ article .activity .top { margin: 10px -7px; border-left: none; border-right: none; - } + } } #assigned-container { @@ -2058,7 +2058,7 @@ a.button.reject_publish, a.button.create_container { border-left: 12px solid #dcecfa; float: left; } - } + } } @@ -2105,37 +2105,3 @@ table tbody { cursor: default; } } - -.row { - .span3.profile { - .avatar { - float: left; - width: 81px; - height: 81px; - } - .base_info { - float: left; - width: 134px; - h3 { - margin: 0 0 0 10px; - } - p { - height: 35px; - margin-left: 10px; - } - a { - margin: 16px 0 0 10px; - } - } - p.first { - margin-top: 10px; - } - p.info { - max-width: 220px; - } - } -} - -hr.profile_line { - margin-top: 20px; -} \ No newline at end of file diff --git a/app/assets/stylesheets/design/profile.scss b/app/assets/stylesheets/design/profile.scss new file mode 100644 index 000000000..c38277c3d --- /dev/null +++ b/app/assets/stylesheets/design/profile.scss @@ -0,0 +1,145 @@ +.row { + .span3.profile { + .avatar { + float: left; + width: 81px; + height: 81px; + } + .base_info { + float: left; + width: 134px; + h3 { + margin: 0 0 0 10px; + } + p { + height: 35px; + margin-left: 10px; + } + a { + margin: 16px 0 0 10px; + } + } + p.first { + margin-top: 10px; + } + p.info { + max-width: 220px; + } + } +} +hr.profile_line { + margin: 20px 0; + width: 865px; +} +.profile-content { + border: 3px solid #D4D4D4; + .search { + border: 2px solid #D4D4D4; + float: left; + margin: 15px 10px; + width: 837px; + .pic { + background: url("/assets/search-button.png") repeat scroll 0 0 transparent; + float: left; + height: 22px; + width: 24px; + } + .field { + float: left; + margin: -1px 0 0; + width: 750px; + input { + background: none repeat scroll 0 0 transparent; + border: medium none; + font-family: Arial; + font-size: 12px; + height: 18px; + padding: 2px 0 0; + width: 700px; + } + input.gray { + color: #CFCFCF; + } + input.black { + color: #333333; + } + } + } + table { + border: none; + border-collapse:collapse; + margin: 0 9px 10px 9px; + width: 844px; + th { + padding-left: 10px; + width: 411px; + .project-link { + margin-top: 5px; + float: left; + } + } + tr.odd { + } + tr.even { + background: #EDEDED; + } + .row-fluid { + max-height: 16px; + .span3 { + font-size: 10px; + font-weight: normal; + max-height: 16px; + min-height: 16px; + } + .span3.datetime_moment { + margin-right: 15px; + color: gray; + } + } + } + .span12.content { + background: url(/assets/bg_blue.png); + height: 30px; + margin-bottom: 0px; + nav { + ul { + list-style: none; + padding-left: 0; + margin: 4px 0 0 5px; + li { + text-decoration: none; + padding: 0 10px 6px 0; + a { + color: white; + font-weight: bold; + font-size: 14px; + padding: 0 10px 9px 10px; + } + a.active { + background: image-url("profile-hover.png") repeat-x scroll 0 100% transparent; + } + } + } + } + } + .span12.sub-menu { + height: 30px; + background: #EDEDED; + margin: 0; + box-shadow: none; + padding-left: 0px; + nav { + ul { + list-style: none; + padding: 0; + margin: 6px 0 0 5px; + a { + padding: 0 10px 9px 10px; + } + a.active { + background: image-url("profile-hover.png") repeat-x scroll 0 100% transparent; + } + } + } + } +} diff --git a/app/controllers/groups/profile_controller.rb b/app/controllers/groups/profile_controller.rb index b6fb5000b..6f7146f6d 100644 --- a/app/controllers/groups/profile_controller.rb +++ b/app/controllers/groups/profile_controller.rb @@ -10,8 +10,19 @@ class Groups::ProfileController < Groups::BaseController end def show + @path, page = group_path, params[:page].to_i @projects = @group.projects.opened.search(params[:search]).recent - .paginate(:page => params[:page], :per_page => 25) + if request.xhr? + if params[:visibility] != 'hidden' + @projects = @projects.opened + @hidden = true + else + @projects = @projects.by_visibilities('hidden').accessible_by(current_ability, :read) + end + render :partial => 'shared/profile_projects', :layout => nil, :locals => {:projects => paginate_projects(page)} + else + @projects = paginate_projects(page) + end end def new @@ -53,4 +64,10 @@ class Groups::ProfileController < Groups::BaseController Relation.by_actor(current_user).by_target(@group).destroy_all redirect_to groups_path end + + protected + + def paginate_projects(page) + @projects.paginate(:page => (page>0 ? page : nil), :per_page => 24) + end end diff --git a/app/controllers/platforms/products_controller.rb b/app/controllers/platforms/products_controller.rb index 1bf862f5e..9f22988d4 100644 --- a/app/controllers/platforms/products_controller.rb +++ b/app/controllers/platforms/products_controller.rb @@ -54,7 +54,7 @@ class Platforms::ProductsController < Platforms::BaseController def autocomplete_project items = Project.accessible_by(current_ability, :membered) .search(params[:term]).limit(20) - items.select! {|e| e.repo.branches.count > 0} + #items.select! {|e| e.repo.branches.count > 0} render :json => items.map{ |p| { :id => p.id, diff --git a/app/controllers/users/profile_controller.rb b/app/controllers/users/profile_controller.rb index 80a1599df..e1a695568 100644 --- a/app/controllers/users/profile_controller.rb +++ b/app/controllers/users/profile_controller.rb @@ -3,7 +3,24 @@ class Users::ProfileController < Users::BaseController skip_before_filter :authenticate_user!, :only => :show if APP_CONFIG['anonymous_access'] def show - @projects = @user.projects.opened.search(params[:search]).recent - .paginate(:page => params[:page], :per_page => 25) + @path, page = user_path, params[:page].to_i + @projects = @user.projects.search(params[:search]).recent + if request.xhr? + if params[:visibility] != 'hidden' + @projects = @projects.opened + @hidden = true + else + @projects = @projects.by_visibilities('hidden').accessible_by(current_ability, :read) + end + render :partial => 'shared/profile_projects', :layout => nil, :locals => {:projects => paginate_projects(page)} + else + @projects = paginate_projects(page) + end + end + + protected + + def paginate_projects(page) + @projects.paginate(:page => (page>0 ? page : nil), :per_page => 24) end end diff --git a/app/helpers/commit_helper.rb b/app/helpers/commit_helper.rb index 5110b2e9c..9fb195721 100644 --- a/app/helpers/commit_helper.rb +++ b/app/helpers/commit_helper.rb @@ -1,6 +1,5 @@ # -*- encoding : utf-8 -*- module CommitHelper - def render_commit_stats(stats) res = ["