[#369] not worked new build list page; platforms index page; small paginate refactoring

This commit is contained in:
Alexander Machehin 2014-06-24 15:03:08 +06:00
parent a4bd95235f
commit bee3629593
16 changed files with 303 additions and 43 deletions

View File

@ -1,6 +1,9 @@
RosaABF.controller('NewBuildListController', ['$scope', '$http', '$timeout', function($scope, $http, $timeout) { RosaABF.controller('NewBuildListController', ['$scope', '$http', '$timeout', '$window',
function($scope, $http, $timeout, $window) {
$scope.save_to_repository_id = null; $scope.save_to_repository_id = null;
$scope.extra_repositories = {};
$scope.extra_build_lists = {};
var save_to_repository = $('#build_list_save_to_repository_id'); var save_to_repository = $('#build_list_save_to_repository_id');
var all_repositories = $('.all_platforms input'); var all_repositories = $('.all_platforms input');
@ -107,4 +110,23 @@ RosaABF.controller('NewBuildListController', ['$scope', '$http', '$timeout', fun
bl_version_sel[0].innerHTML = bl_version_sel[0].innerHTML; bl_version_sel[0].innerHTML = bl_version_sel[0].innerHTML;
} }
} }
$scope.get_extra_repositories = function(val) {
return $http.get('http://maps.googleapis.com/maps/api/geocode/json', {
params: {
address: val,
sensor: false
}
}).then(function(res){
var addresses = [];
angular.forEach(res.data.results, function(item){
addresses.push(item.formatted_address);
});
return addresses;
});
}
$scope.select_extra_repositories = function(item, model, label) {
}
}]); }]);

View File

@ -0,0 +1,25 @@
RosaABF.controller('PlatformsCtrl', ['$scope', '$http', '$timeout', function($scope, $http, $timeout) {
$scope.total_items = null;
$scope.page = null;
$scope.platforms = null;
$scope.init = function(total_items, page) {
$scope.total_items = total_items;
$scope.page = page;
};
$scope.getPlatforms = function() {
$http.get(Routes.platforms_path({format: 'json', page: $scope.page})).then(function(res) {
$scope.page = res.data.page;
$scope.total_items = parseInt(res.data.platforms_count, 10);
$scope.platforms = res.data.platforms;
});
};
$scope.goToPage = function(page) {
$scope.page = page;
$scope.getPlatforms();
};
$scope.getPlatforms();
}]);

View File

@ -0,0 +1,161 @@
RosaABF.controller('BuildListsController', ['$scope', '$http', '$location', '$timeout', function($scope, $http, $location, $timeout) {
$scope.params = null;
$scope.first_run = true;
$scope.server_status = null;
$scope.build_lists = [];
$scope.isRequest = false; // Disable 'Search' button
$scope.pages = [];
$scope.opened = {};
$scope.map_priorities = {
<%=BuildList::WAITING_FOR_RESPONSE%>: 13,
<%=BuildList::BUILD_PENDING%>: 12,
<%=BuildList::RERUN_TESTS%>: 11,
<%=BuildList::BUILD_CANCELING%>: 10,
<%=BuildList::BUILD_CANCELED%>: 9,
<%=BuildList::BUILD_STARTED%>: 8,
<%=BuildList::RERUNNING_TESTS%>: 7,
<%=BuildList::BUILD_PUBLISH%>: 6,
<%=BuildList::BUILD_PUBLISHED%>: 5,
<%=BuildList::BUILD_ERROR%>: 4,
<%=BuildList::SUCCESS%>: 3,
<%=BuildList::TESTS_FAILED%>: 2,
<%=BuildList::FAILED_PUBLISH%>: 1,
<%=BuildList::REJECTED_PUBLISH%>: 0
};
// Fixes: redirect to page after form submit
$("#monitoring_filter").on('submit', function(){ return false; });
$scope.getBuildLists = function() {
// Disable 'Search' button
$scope.isRequest = true;
$http.get(Routes.build_lists_path({format: 'json'}), {params: $location.search()}).success(function(results) {
// Render Server status
$scope.server_status = results.server_status;
// TMP fields
var dictionary = results.dictionary;
var build_lists = [];
var groups = {};
var to_open = [];
// Grouping of build_lists
_.each(results.build_lists, function(r){
var bl = new BuildList(r, dictionary);
var key = bl.project_id + '-';
key += bl.group_id ? bl.group_id : (bl.commit_hash + '-' + bl.user_id);
if (groups[key]) {
groups[key].addRelated(bl);
} else {
groups[key] = bl;
build_lists.push(bl);
if ( bl.id in $scope.opened ) { to_open.push(bl); }
}
});
// Adds all build_lists into the table (group by group)
$scope.build_lists = [];
$scope.opened = {};
_.each(build_lists, function(bl){
if (bl.related.length > 1) {
var sorted_build_lists = _.sortBy(bl.related, function(b) { return $scope.map_priorities[b.status]; });
bl.clearRelated();
var first_in_group = sorted_build_lists[0];
first_in_group.clearRelated();
_.each(sorted_build_lists, function(b){
if (b != first_in_group) { first_in_group.addRelated(b); }
$scope.build_lists.push(b);
});
} else {
$scope.build_lists.push(bl);
}
});
// Shows groups which have been opened before
_.each(to_open, function(bl){ $scope.showRelated(bl, true); });
// Render pagination
$scope.pages = results.pages;
// Enable 'Search' button
$scope.isRequest = false;
}).error(function(data, status, headers, config) {
// Enable 'Search' button
$scope.isRequest = false;
});;
}
$scope.showRelated = function(build_list, disable_effect) {
build_list.relatedHidden = false;
_.each(build_list.related, function(bl){
bl.show = true;
$scope.opened[bl.id] = true;
// Waits for render of build_lists
if (!disable_effect)
$timeout(function() {
$('#build-list-' + bl.id + ' td:visible').effect('highlight', {}, 1000);
}, 100);
});
}
$scope.hideRelated = function(build_list) {
build_list.relatedHidden = true;
_.each(build_list.related, function(bl){
bl.show = false;
delete $scope.opened[bl.id];
});
build_list.show = true;
}
$scope.cancelRefresh = null;
$scope.refresh = function(force) {
if ($('#autoreload').is(':checked') || force) {
var params = {};
_.each($("#monitoring_filter").serializeArray(), function(a){
if (a.value) { params[a.name] = a.value; }
});
$location.search(params);
$scope.first_run = false;
$scope.getBuildLists();
}
if (!force)
$scope.cancelRefresh = $timeout($scope.refresh, 60000);
}
$scope.$on('$locationChangeSuccess', function(event) {
$scope.updateParams();
if (!$scope.first_run) { $scope.getBuildLists(); }
});
$scope.updateParams = function() {
var params = $location.search();
$scope.params = {
page: params.page || 1,
per_page: params.per_page || 25,
filter: {
ownership: params['filter[ownership]'] || 'owned',
status: params['filter[status]'],
platform_id: params['filter[platform_id]'],
arch_id: params['filter[arch_id]'],
mass_build_id: params['filter[mass_build_id]'],
updated_at_start: params['filter[updated_at_start]'],
updated_at_end: params['filter[updated_at_end]'],
project_name: params['filter[project_name]'],
id: params['filter[id]']
}
}
}
$scope.goToPage = function(number) {
$location.search('page', number);
$scope.getBuildLists();
}
$scope.updateParams();
// Waits for render of filters
$timeout($scope.refresh, 100);
}]);

View File

@ -36,10 +36,9 @@ function addDataToAutocompleteForm(form, path, label, name, value) {
var tr = '<tr>' + var tr = '<tr>' +
'<td>' + '<td>' +
'<a href="' + path + '">' + label + '</a>' + '<a href="' + path + '">' + label + '</a>' +
'</td>' + '<div class="actions pull-right">' +
'<td class="actions">' +
'<input name="' + name + '" type="hidden" value="' + value + '">' + '<input name="' + name + '" type="hidden" value="' + value + '">' +
'<span class="delete"> </span>' + '<span class="fa fa-times fa-lg delete text-danger"> </span>' +
'</td>' + '</td>' +
'</tr>'; '</tr>';
form.find('table tbody').append($(tr)); form.find('table tbody').append($(tr));

View File

@ -3,6 +3,9 @@
//= require jquery-ui //= require jquery-ui
//= require js-routes //= require js-routes
//= require autocomplete-rails
//= require extra/autocomplete-form
// Loads all Bootstrap javascripts // Loads all Bootstrap javascripts
//= require bootstrap //= require bootstrap

View File

@ -1,12 +1,19 @@
class Platforms::PlatformsController < Platforms::BaseController class Platforms::PlatformsController < Platforms::BaseController
include FileStoreHelper include FileStoreHelper
layout 'bootstrap', only: [:index]
before_filter :authenticate_user! before_filter :authenticate_user!
skip_before_filter :authenticate_user!, only: [:advisories, :members, :show] if APP_CONFIG['anonymous_access'] skip_before_filter :authenticate_user!, only: [:advisories, :members, :show] if APP_CONFIG['anonymous_access']
load_and_authorize_resource load_and_authorize_resource
def index def index
@platforms = @platforms.accessible_by(current_ability, :related).order(:name).paginate(page: params[:page], per_page: 20) @platforms = @platforms.accessible_by(current_ability, :related)
@platforms_count = @platforms.count
@platforms = @platforms.paginate(page: current_page, per_page: Platform.per_page)
respond_to do |format|
format.html {}
format.json {}
end
end end
def show def show

View File

@ -19,4 +19,13 @@ module PaginateHelper
will_paginate *[collection_or_options, options].compact will_paginate *[collection_or_options, options].compact
end end
def paginate(options)
return nil if options.blank?
render 'shared/paginate',
total_items: options[:total_items],
page: options[:page],
per_page: options[:per_page],
ng_show: options[:ng_show],
select_page: options[:select_page]
end
end end

View File

@ -12,6 +12,7 @@ class Platform < ActiveRecord::Base
VISIBILITIES = %w(open hidden) VISIBILITIES = %w(open hidden)
NAME_PATTERN = /[\w\-\.]+/ NAME_PATTERN = /[\w\-\.]+/
HUMAN_STATUSES = HUMAN_STATUSES.clone.freeze HUMAN_STATUSES = HUMAN_STATUSES.clone.freeze
self.per_page = 20
belongs_to :parent, class_name: 'Platform', foreign_key: 'parent_platform_id' belongs_to :parent, class_name: 'Platform', foreign_key: 'parent_platform_id'
belongs_to :owner, polymorphic: true belongs_to :owner, polymorphic: true

View File

@ -45,14 +45,8 @@
%a{ 'ng-href' => '{{issue.assignee.link}}', %a{ 'ng-href' => '{{issue.assignee.link}}',
'title' => "#{t('layout.issues.assigned_to')} {{issue.assignee.fullname}}" } 'title' => "#{t('layout.issues.assigned_to')} {{issue.assignee.fullname}}" }
%img{ 'ng-src' => '{{issue.assignee.image}}' } %img{ 'ng-src' => '{{issue.assignee.image}}' }
= paginate( total_items: "#{kind}_tab.pagination.total_items",
%pagination.pagination-sm{ 'boundary-links' => 'true', page: "#{kind}_tab.pagination.page",
'total-items' => "#{kind}_tab.pagination.total_items", per_page: Issue.per_page,
'page' => "#{kind}_tab.pagination.page", ng_show: "#{kind}_tab.pagination.total_items > #{Issue.per_page}",
'previous-text' => "", 'next-text' => "", select_page: "selectPage('#{kind}', page)" )
'first-text' => "«", "last-text" => "»",
'items-per-page' => Issue.per_page,
'max-size' => 5,
'rotate' => 'false',
'ng-show' => "#{kind}_tab.pagination.total_items > #{Issue.per_page}",
'on-select-page' => "selectPage('#{kind}', page)" }

View File

@ -4,7 +4,7 @@ end
json.feed do json.feed do
json.array!(@activity_feeds) do |item| json.array!(@activity_feeds) do |item|
#json.cache! item, expires_in: 10.minutes do json.cache! item, expires_in: 10.minutes do
json.date item.created_at json.date item.created_at
json.kind item.kind json.kind item.kind
user = get_user_from_activity_item(item) user = get_user_from_activity_item(item)
@ -20,6 +20,6 @@ json.feed do
json.project_name_with_owner project_name_with_owner json.project_name_with_owner project_name_with_owner
json.partial! item.partial, item: item, project_name_with_owner: project_name_with_owner json.partial! item.partial, item: item, project_name_with_owner: project_name_with_owner
json.id item.id json.id item.id
#end end
end end
end end

View File

@ -1,10 +1,10 @@
%table#myTable.tablesorter.platforms{cellspacing: "0", cellpadding: "0"} %table.table.table-striped
%thead %thead
%tr %tr
%th.th1= t("activerecord.attributes.platform.name") %th= t 'activerecord.attributes.platform.name'
%th.th2= t("activerecord.attributes.platform.distrib_type") %th= t 'activerecord.attributes.platform.distrib_type'
%tbody %tbody
- @platforms.each do |platform| - @platforms.each do |platform|
%tr{class: cycle("odd", "even")} %tr
%td= link_to platform_printed_name(platform), platform_path(platform) %td= link_to platform_printed_name(platform), platform_path(platform)
%td= platform.distrib_type %td= platform.distrib_type

View File

@ -1,4 +1,23 @@
-set_meta_tags title: t('layout.platforms.list_header') -set_meta_tags title: t('layout.platforms.list_header')
= link_to t("layout.platforms.new"), new_platform_path, class: 'button' if can? :create, Platform .row{ 'ng-controller' => 'PlatformsCtrl', 'ng-cloak' => true,
= render 'list', object: @platforms 'ng-init' => "init(#{@platforms_count}, #{params[:page]})" }
= will_paginate @platforms .col-md-6.col-md-offset-3
= link_to t('layout.platforms.new'), new_platform_path, class: 'btn btn-primary' if can? :create, Platform
=# render 'list', object: @platforms
%table.table.table-striped.offset20
%thead
%tr
%th= t 'activerecord.attributes.platform.name'
%th= t 'activerecord.attributes.platform.distrib_type'
%tbody
%tr{ 'ng-repeat' => 'item in platforms' }
%td
%a{ 'ng-href' => "{{item.link}}" }
{{item.name}}
%td {{item.distrib_type}}
= paginate( total_items: 'total_items',
page: 'page',
per_page: Platform.per_page,
ng_show: "total_items > #{Platform.per_page}",
select_page: "goToPage(page)" )

View File

@ -0,0 +1,12 @@
json.platforms do
json.array!(@platforms) do |item|
json.cache! item, expires_in: 10.minutes do
json.name platform_printed_name(item)
json.link platform_path(item)
json.distrib_type item.distrib_type
end
end
end
json.page params[:page]
json.platforms_count @platforms_count

View File

@ -70,16 +70,10 @@
/ updated_at / updated_at
%td{'am-time-ago' => 'bl.updated_at', title: "{{bl.updated_at | amDateFormat:'ddd, LLL'}}"} %td{'am-time-ago' => 'bl.updated_at', title: "{{bl.updated_at | amDateFormat:'ddd, LLL'}}"}
%pagination{ 'boundary-links' => 'true', = paginate( total_items: 'build_lists_count',
'total-items' => 'build_lists_count', page: 'page',
'page' => 'page', per_page: 'params.per_page',
'previous-text' => "", 'next-text' => "", ng_show: "build_lists_count > params.per_page",
'first-text' => "«", "last-text" => "»", select_page: "goToPage(page)" )
'items-per-page' => "params.per_page",
'max-size' => 5,
'rotate' => 'false',
'ng-show' => "build_lists_count > params.per_page",
'on-select-page' => "goToPage(page)" }
= render @project ? 'projects/base/submenu' : 'projects/build_lists/submenu' = render @project ? 'projects/base/submenu' : 'projects/build_lists/submenu'

View File

@ -14,7 +14,7 @@
.modal-dialog .modal-dialog
.modal-content .modal-content
.modal-header .modal-header
%button{ type: 'button', class: 'close', 'data-dismiss' => 'modal', 'aria-hidden' => 'true' } &times; %button.close{ type: 'button', 'data-dismiss' => 'modal', 'aria-hidden' => 'true' } &times;
%h4.modal-title= t "activerecord.attributes.build_list.#{field}" %h4.modal-title= t "activerecord.attributes.build_list.#{field}"
.modal-body= render "shared/autocomplete_docs/#{field}" .modal-body= render "shared/autocomplete_docs/#{field}"
.modal-footer .modal-footer
@ -24,6 +24,11 @@
%h3 %h3
= t "activerecord.attributes.build_list.#{field}" = t "activerecord.attributes.build_list.#{field}"
%i.fa.fa-question-circle{ 'data-toggle' => 'modal', 'data-target' => "##{field}_dialog" } %i.fa.fa-question-circle{ 'data-toggle' => 'modal', 'data-target' => "##{field}_dialog" }
%input.form-control{ type: 'text', 'ng-model' => "async_#{field}_selected", placeholder: placeholder,
'typeahead' => "extra for extra in get_#{field}($viewValue)", 'typeahead-loading' => "loading_#{field}",
'typeahead-on-select' => "select_#{field}($item, $model, $label)" }
%i.glyphicon.glyphicon-refresh{ 'ng-show' => "loading_#{field}" }
.row .row
= hidden_field_tag field, nil, id: "#{field}_field" = hidden_field_tag field, nil, id: "#{field}_field"
= hidden_field_tag field, nil, id: "#{field}_field_path" = hidden_field_tag field, nil, id: "#{field}_field_path"
@ -46,14 +51,13 @@
= link_to "#{extra.id} (#{extra.project.name} - #{extra.arch.name})", extra = link_to "#{extra.id} (#{extra.project.name} - #{extra.arch.name})", extra
- else - else
= link_to "#{extra.platform.name}/#{extra.name}", [extra.platform, extra] = link_to "#{extra.platform.name}/#{extra.name}", [extra.platform, extra]
- field = extra.is_a?(BuildList) ? 'extra_build_lists' : 'extra_repositories'
= hidden_field_tag field_name, extra.id
.actions.pull-right .actions.pull-right
= hidden_field_tag field_name, extra.id
%span.fa.fa-times.fa-lg.delete.text-danger %span.fa.fa-times.fa-lg.delete.text-danger
.default-values .default-values
- field_class.where(id: default_values).each do |extra| - field_class.where(id: default_values).each do |extra|
.hidden{:label => "#{extra.platform.name}/#{extra.name}", .hidden{ label: "#{extra.platform.name}/#{extra.name}",
:path => url_for([extra.platform, extra]), path: url_for([extra.platform, extra]),
:name => field_name, value: extra.id} name: field_name, value: extra.id }

View File

@ -0,0 +1,10 @@
%pagination{ 'boundary-links' => 'true',
'total-items' => total_items,
'page' => page,
'previous-text' => "", 'next-text' => "",
'first-text' => "«", "last-text" => "»",
'items-per-page' => per_page,
'max-size' => 5,
'rotate' => 'false',
'ng-show' => ng_show,
'on-select-page' => select_page }