Various fixes

This commit is contained in:
Wedge 2016-06-16 15:11:08 +03:00
parent 6157338a46
commit 0395b5cb8f
29 changed files with 182 additions and 1411 deletions

View File

@ -1,9 +0,0 @@
RosaABF.controller('PlatformsController', ['$scope', 'PlatformsService', function($scope, PlatformsService) {
$scope.platforms = null;
$scope.requesting = true;
PlatformsService.getPlatforms().then(function(platforms) {
$scope.requesting = false;
$scope.platforms = platforms;
});
}]);

View File

@ -1,25 +0,0 @@
RosaABF.controller('ProjectInfoController', ['$scope', 'ProjectInfoService', 'ProjectSelectService',
function($scope, ProjectInfoService, ProjectSelectService) {
$scope.widget_title = "";
$scope.$watch(function() {
return ProjectSelectService.load_project_info;
}, function() {
var project = ProjectSelectService.load_project_info;
if(project) {
$scope.requesting = true;
ProjectSelectService.disable_pi = true;
ProjectInfoService.getProjectInfo(project).then(function(res) {
$scope.project = project;
$scope.project_info = res;
$scope.requesting = false;
$scope.widget_title = " | " + project;
ProjectSelectService.disable_pi = false;
});
}
else {
$scope.project_info = null;
$scope.project = "";
$scope.widget_title = "";
}
});
}]);

View File

@ -1,7 +1,6 @@
RosaABF.controller('ProjectsController', ['$scope', 'ProjectsService', 'ProjectSelectService', RosaABF.controller('ProjectsController', ['$scope', 'ProjectsService',
function($scope, ProjectsService, ProjectSelectService) { function($scope, ProjectsService) {
$scope.projects = null; $scope.projects = null;
$scope.ProjectSelectService = ProjectSelectService;
$scope.search = ""; $scope.search = "";
var promiseResolve = function(projects) { var promiseResolve = function(projects) {
@ -15,10 +14,6 @@ function($scope, ProjectsService, ProjectSelectService) {
ProjectsService.getProjects(search).then(promiseResolve); ProjectsService.getProjects(search).then(promiseResolve);
} }
$scope.selectProject = function(project) {
ProjectSelectService.project = project;
}
$scope.requesting = true; $scope.requesting = true;
ProjectsService.getProjects().then(promiseResolve); ProjectsService.getProjects().then(promiseResolve);
}]); }]);

View File

@ -23,7 +23,6 @@ RosaABF.controller 'RepositoryProjectsController',
owner_name: $scope.owner_name owner_name: $scope.owner_name
project_name: $scope.project_name project_name: $scope.project_name
page: $scope.page page: $scope.page
sSortDir_0: 'asc'
format: 'json' format: 'json'
path = Routes.projects_list_platform_repository_path $scope.platform_id, $scope.repository_id path = Routes.projects_list_platform_repository_path $scope.platform_id, $scope.repository_id

View File

@ -1,11 +0,0 @@
angular.module("RosaABF").factory('PlatformsService', ["$http", function($http) {
var PlatformsService = {};
PlatformsService.getPlatforms = function() {
return $http.get(Routes.platforms_path({ format: 'json' })).then(function(res) {
return res.data.platforms;
});
}
return PlatformsService;
}]);

View File

@ -1,11 +0,0 @@
angular.module("RosaABF").factory('ProjectInfoService', ["$http", function($http) {
var ProjectInfoService = {};
ProjectInfoService.getProjectInfo = function(name_with_owner) {
return $http.get(Routes.project_info_path(name_with_owner, { format: 'json' })).then(function(res) {
return res.data.project_info;
});
}
return ProjectInfoService;
}]);

View File

@ -1,10 +0,0 @@
angular.module("RosaABF").factory('ProjectSelectService', function() {
return {
project: "",
disable_bl: false,
disable_pi: false,
disable: function() {
return this.disable_bl || this.disable_pi;
}
};
});

View File

@ -1,500 +0,0 @@
/*!
* bootstrap-typeahead.js v0.0.3 (http://www.upbootstrap.com)
* Copyright 2012-2014 Twitter Inc.
* Licensed under MIT (https://github.com/biggora/bootstrap-ajax-typeahead/blob/master/LICENSE)
* See Demo: http://plugins.upbootstrap.com/bootstrap-ajax-typeahead
* Updated: 2014-02-09 02:4:38
*
* Modifications by Paul Warelis and Alexey Gordeyev
*/
!function($) {
"use strict"; // jshint ;_;
/* TYPEAHEAD PUBLIC CLASS DEFINITION
* ================================= */
var Typeahead = function(element, options) {
//deal with scrollBar
var defaultOptions=$.fn.typeahead.defaults;
if(options.scrollBar){
options.items=100;
options.menu='<ul class="typeahead dropdown-menu" style="max-height:220px;overflow:auto;"></ul>';
}
var that = this;
that.$element = $(element);
that.options = $.extend({}, $.fn.typeahead.defaults, options);
that.$menu = $(that.options.menu).insertAfter(that.$element);
// Method overrides
that.eventSupported = that.options.eventSupported || that.eventSupported;
that.grepper = that.options.grepper || that.grepper;
that.highlighter = that.options.highlighter || that.highlighter;
that.lookup = that.options.lookup || that.lookup;
that.matcher = that.options.matcher || that.matcher;
that.render = that.options.render || that.render;
that.onSelect = that.options.onSelect || null;
that.sorter = that.options.sorter || that.sorter;
that.source = that.options.source || that.source;
that.displayField = that.options.displayField || that.displayField;
that.valueField = that.options.valueField || that.valueField;
if (that.options.ajax) {
var ajax = that.options.ajax;
if (typeof ajax === 'string') {
that.ajax = $.extend({}, $.fn.typeahead.defaults.ajax, {
url: ajax
});
} else {
if (typeof ajax.displayField === 'string') {
that.displayField = that.options.displayField = ajax.displayField;
}
if (typeof ajax.valueField === 'string') {
that.valueField = that.options.valueField = ajax.valueField;
}
that.ajax = $.extend({}, $.fn.typeahead.defaults.ajax, ajax);
}
if (!that.ajax.url) {
that.ajax = null;
}
that.query = "";
} else {
that.source = that.options.source;
that.ajax = null;
}
that.shown = false;
that.listen();
};
Typeahead.prototype = {
constructor: Typeahead,
//=============================================================================================================
// Utils
// Check if an event is supported by the browser eg. 'keypress'
// * This was included to handle the "exhaustive deprecation" of jQuery.browser in jQuery 1.8
//=============================================================================================================
eventSupported: function(eventName) {
var isSupported = (eventName in this.$element);
if (!isSupported) {
this.$element.setAttribute(eventName, 'return;');
isSupported = typeof this.$element[eventName] === 'function';
}
return isSupported;
},
select: function() {
var $selectedItem = this.$menu.find('.active');
var value = $selectedItem.attr('data-value');
var text = this.$menu.find('.active a').text();
if (this.options.onSelect) {
this.options.onSelect({
value: value,
text: text
});
}
this.$element
.val(this.updater(text))
.change();
return this.hide();
},
updater: function(item) {
return item;
},
show: function() {
var pos = $.extend({}, this.$element.position(), {
height: this.$element[0].offsetHeight
});
this.$menu.css({
top: pos.top + pos.height,
left: pos.left
});
this.$menu.show();
this.shown = true;
return this;
},
hide: function() {
this.$menu.hide();
this.shown = false;
return this;
},
ajaxLookup: function() {
var query = $.trim(this.$element.val());
if (query === this.query) {
return this;
}
// Query changed
this.query = query;
// Cancel last timer if set
if (this.ajax.timerId) {
clearTimeout(this.ajax.timerId);
this.ajax.timerId = null;
}
if (!query || query.length < this.ajax.triggerLength) {
// cancel the ajax callback if in progress
if (this.ajax.xhr) {
this.ajax.xhr.abort();
this.ajax.xhr = null;
this.ajaxToggleLoadClass(false);
}
return this.shown ? this.hide() : this;
}
function execute() {
this.ajaxToggleLoadClass(true);
// Cancel last call if already in progress
if (this.ajax.xhr)
this.ajax.xhr.abort();
var params = this.ajax.preDispatch ? this.ajax.preDispatch(query) : {
query: query
};
this.ajax.xhr = $.ajax({
url: this.ajax.url,
data: params,
success: $.proxy(this.ajaxSource, this),
type: this.ajax.method || 'get',
dataType: 'json'
});
this.ajax.timerId = null;
}
// Query is good to send, set a timer
this.ajax.timerId = setTimeout($.proxy(execute, this), this.ajax.timeout);
return this;
},
ajaxSource: function(data) {
this.ajaxToggleLoadClass(false);
var that = this, items;
if (!that.ajax.xhr)
return;
if (that.ajax.preProcess) {
data = that.ajax.preProcess(data);
}
// Save for selection retreival
that.ajax.data = data;
// Manipulate objects
items = that.grepper(that.ajax.data) || [];
if (!items.length) {
return that.shown ? that.hide() : that;
}
that.ajax.xhr = null;
return that.render(items.slice(0, that.options.items)).show();
},
ajaxToggleLoadClass: function(enable) {
if (!this.ajax.loadingClass)
return;
this.$element.toggleClass(this.ajax.loadingClass, enable);
},
lookup: function(event) {
var that = this, items;
if (that.ajax) {
that.ajaxer();
}
else {
that.query = that.$element.val();
if (!that.query) {
return that.shown ? that.hide() : that;
}
items = that.grepper(that.source);
if (!items || !items.length) {
return that.shown ? that.hide() : that;
}
return that.render(items.slice(0, that.options.items)).show();
}
},
matcher: function(item) {
return ~item.toLowerCase().indexOf(this.query.toLowerCase());
},
sorter: function(items) {
if (!this.options.ajax) {
var beginswith = [],
caseSensitive = [],
caseInsensitive = [],
item;
while (item = items.shift()) {
if (!item.toLowerCase().indexOf(this.query.toLowerCase()))
beginswith.push(item);
else if (~item.indexOf(this.query))
caseSensitive.push(item);
else
caseInsensitive.push(item);
}
return beginswith.concat(caseSensitive, caseInsensitive);
} else {
return items;
}
},
highlighter: function(item) {
var query = this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&');
return item.replace(new RegExp('(' + query + ')', 'ig'), function($1, match) {
return '<strong>' + match + '</strong>';
});
},
render: function(items) {
var that = this, display, isString = typeof that.options.displayField === 'string';
items = $(items).map(function(i, item) {
if (typeof item === 'object') {
display = isString ? item[that.options.displayField] : that.options.displayField(item);
i = $(that.options.item).attr('data-value', item[that.options.valueField]);
} else {
display = item;
i = $(that.options.item).attr('data-value', item);
}
i.find('a').html(that.highlighter(display));
return i[0];
});
items.first().addClass('active');
this.$menu.html(items);
return this;
},
//------------------------------------------------------------------
// Filters relevent results
//
grepper: function(data) {
var that = this, items, display, isString = typeof that.options.displayField === 'string';
if (isString && data && data.length) {
if (data[0].hasOwnProperty(that.options.displayField)) {
items = $.grep(data, function(item) {
display = isString ? item[that.options.displayField] : that.options.displayField(item);
return that.matcher(display);
});
} else if (typeof data[0] === 'string') {
items = $.grep(data, function(item) {
return that.matcher(item);
});
} else {
return null;
}
} else {
return null;
}
return this.sorter(items);
},
next: function(event) {
var active = this.$menu.find('.active').removeClass('active'),
next = active.next();
if (!next.length) {
next = $(this.$menu.find('li')[0]);
}
if(this.options.scrollBar){
var index=this.$menu.children("li").index(next);
if(index%8==0){
this.$menu.scrollTop(index*26);
}
}
next.addClass('active');
},
prev: function(event) {
var active = this.$menu.find('.active').removeClass('active'),
prev = active.prev();
if (!prev.length) {
prev = this.$menu.find('li').last();
}
if(this.options.scrollBar){
var $li=this.$menu.children("li");
var total=$li.length-1;
var index=$li.index(prev);
if((total-index)%8==0){
this.$menu.scrollTop((index-7)*26);
}
}
prev.addClass('active');
},
listen: function() {
this.$element
.on('focus', $.proxy(this.focus, this))
.on('blur', $.proxy(this.blur, this))
.on('keypress', $.proxy(this.keypress, this))
.on('keyup', $.proxy(this.keyup, this));
if (this.eventSupported('keydown')) {
this.$element.on('keydown', $.proxy(this.keydown, this))
}
this.$menu
.on('click', $.proxy(this.click, this))
.on('mouseenter', 'li', $.proxy(this.mouseenter, this))
.on('mouseleave', 'li', $.proxy(this.mouseleave, this))
},
move: function(e) {
if (!this.shown)
return
switch (e.keyCode) {
case 9: // tab
case 13: // enter
case 27: // escape
e.preventDefault();
break
case 38: // up arrow
e.preventDefault()
this.prev()
break
case 40: // down arrow
e.preventDefault()
this.next()
break
}
e.stopPropagation();
},
keydown: function(e) {
this.suppressKeyPressRepeat = ~$.inArray(e.keyCode, [40, 38, 9, 13, 27])
this.move(e)
},
keypress: function(e) {
if (this.suppressKeyPressRepeat)
return
this.move(e)
},
keyup: function(e) {
switch (e.keyCode) {
case 40: // down arrow
case 38: // up arrow
case 16: // shift
case 17: // ctrl
case 18: // alt
break
case 9: // tab
case 13: // enter
if (!this.shown)
return
this.select()
break
case 27: // escape
if (!this.shown)
return
this.hide()
break
default:
if (this.ajax)
this.ajaxLookup()
else
this.lookup()
}
e.stopPropagation()
e.preventDefault()
},
focus: function(e) {
this.focused = true
},
blur: function(e) {
this.focused = false
if (!this.mousedover && this.shown)
this.hide()
},
click: function(e) {
e.stopPropagation()
e.preventDefault()
this.select()
this.$element.focus()
},
mouseenter: function(e) {
this.mousedover = true
this.$menu.find('.active').removeClass('active')
$(e.currentTarget).addClass('active')
},
mouseleave: function(e) {
this.mousedover = false
if (!this.focused && this.shown)
this.hide()
}
};
/* TYPEAHEAD PLUGIN DEFINITION
* =========================== */
$.fn.typeahead = function(option) {
return this.each(function() {
var $this = $(this),
data = $this.data('typeahead'),
options = typeof option === 'object' && option;
if (!data)
$this.data('typeahead', (data = new Typeahead(this, options)));
if (typeof option === 'string')
data[option]();
});
};
$.fn.typeahead.defaults = {
source: [],
items: 8,
menu: '<ul class="typeahead dropdown-menu"></ul>',
item: '<li><a href="#"></a></li>',
displayField: 'name',
scrollBar:false,
valueField: 'id',
onSelect: function() {
},
ajax: {
url: null,
timeout: 300,
method: 'get',
triggerLength: 1,
loadingClass: null,
preDispatch: null,
preProcess: null
}
};
$.fn.typeahead.Constructor = Typeahead;
/* TYPEAHEAD DATA-API
* ================== */
$(function() {
$('body').on('focus.typeahead.data-api', '[data-provide="typeahead"]', function(e) {
var $this = $(this);
if ($this.data('typeahead'))
return;
e.preventDefault();
$this.typeahead($this.data());
});
});
}(window.jQuery);

View File

@ -1,18 +0,0 @@
_.each $('input.typeahead'), (item) ->
item = $(item)
triggerLength = 1
if item.data('id')
onSelect = (i) ->
$(item.data('id')).val i.value
if item.attr('id') is 'to_project'
onSelect = (data) ->
pullUpdateToProject(data)
triggerLength = 3
item.typeahead
ajax:
url: item.data('ajax')
triggerLength: triggerLength
onSelect: onSelect

View File

@ -1,106 +0,0 @@
/*
* Placeholder plugin for jQuery
* ---
* Copyright 2010, Daniel Stocks (http://webcloud.se)
* Released under the MIT, BSD, and GPL Licenses.
*/
(function($) {
function Placeholder(input) {
this.input = input;
if (input.attr('type') == 'password') {
this.handlePassword();
}
// Prevent placeholder values from submitting
$(input[0].form).submit(function() {
if (input.hasClass('placeholder') && input[0].value == input.attr('placeholder')) {
input[0].value = '';
}
});
}
Placeholder.prototype = {
show : function(loading) {
// FF and IE saves values when you refresh the page. If the user refreshes the page with
// the placeholders showing they will be the default values and the input fields won't be empty.
if (this.input[0].value === '' || (loading && this.valueIsPlaceholder())) {
if (this.isPassword) {
try {
this.input[0].setAttribute('type', 'text');
} catch (e) {
this.input.before(this.fakePassword.show()).hide();
}
}
this.input.addClass('placeholder');
this.input[0].value = this.input.attr('placeholder');
}
},
hide : function() {
if (this.valueIsPlaceholder() && this.input.hasClass('placeholder')) {
this.input.removeClass('placeholder');
this.input[0].value = '';
if (this.isPassword) {
try {
this.input[0].setAttribute('type', 'password');
} catch (e) { }
// Restore focus for Opera and IE
this.input.show();
this.input[0].focus();
}
}
},
valueIsPlaceholder : function() {
return this.input[0].value == this.input.attr('placeholder');
},
handlePassword: function() {
var input = this.input;
input.attr('realType', 'password');
this.isPassword = true;
// IE < 9 doesn't allow changing the type of password inputs
if ($.browser.msie && input[0].outerHTML) {
var fakeHTML = $(input[0].outerHTML.replace(/type=(['"])?password\1/gi, 'type=$1text$1'));
this.fakePassword = fakeHTML.val(input.attr('placeholder')).addClass('placeholder').focus(function() {
input.trigger('focus');
$(this).hide();
});
$(input[0].form).submit(function() {
fakeHTML.remove();
input.show()
});
}
}
};
var NATIVE_SUPPORT = !!("placeholder" in document.createElement( "input" ));
$.fn.placeholder = function() {
return NATIVE_SUPPORT ? this : this.each(function() {
var input = $(this);
var placeholder = new Placeholder(input);
placeholder.show(true);
input.focus(function() {
placeholder.hide();
});
input.blur(function() {
placeholder.show(false);
});
// On page refresh, IE doesn't re-populate user input
// until the window.onload event is fired.
if ($.browser.msie) {
$(window).load(function() {
if(input.val()) {
input.removeClass("placeholder");
}
placeholder.show(true);
});
// What's even worse, the text cursor disappears
// when tabbing between text inputs, here's a fix
input.focus(function() {
if(this.value == "") {
var range = this.createTextRange();
range.collapse(true);
range.moveStart('character', 0);
range.select();
}
});
}
});
}
})(jQuery);

View File

@ -1,5 +1,4 @@
class Platforms::MassBuildsController < Platforms::BaseController class Platforms::MassBuildsController < Platforms::BaseController
include DatatableHelper
before_action :authenticate_user! before_action :authenticate_user!
skip_before_action :authenticate_user!, only: [:index, :get_list] if APP_CONFIG['anonymous_access'] skip_before_action :authenticate_user!, only: [:index, :get_list] if APP_CONFIG['anonymous_access']

View File

@ -6,16 +6,12 @@ class Platforms::PlatformsController < Platforms::BaseController
def index def index
authorize :platform authorize :platform
respond_to do |format| @platforms = PlatformPolicy::Scope.new(current_user, Platform).related.select(:name, :distrib_type)
format.html {}
format.json {
@platforms = PlatformPolicy::Scope.new(current_user, Platform).related
}
end
end end
def show def show
@repositories = @platform.repositories
@repositories = Repository.custom_sort(@repositories).paginate(page: current_page)
end end
def new def new
@ -161,9 +157,9 @@ class Platforms::PlatformsController < Platforms::BaseController
subject_params(Platform) subject_params(Platform)
end end
# Private: before_action hook which loads Platform.
def load_platform def load_platform
authorize @platform = Platform.find_cached(params[:id]), :show? if params[:id] return unless params[:id]
authorize @platform = Platform.find_cached(params[:id]), :show?
end end
end end

View File

@ -1,7 +1,5 @@
class Platforms::RepositoriesController < Platforms::BaseController class Platforms::RepositoriesController < Platforms::BaseController
include DatatableHelper
include FileStoreHelper include FileStoreHelper
include RepositoriesHelper
include PaginateHelper include PaginateHelper
before_action :authenticate_user! before_action :authenticate_user!
@ -11,11 +9,6 @@ class Platforms::RepositoriesController < Platforms::BaseController
before_action :set_members, only: [:edit, :update] before_action :set_members, only: [:edit, :update]
before_action -> { @repository = @platform.repositories.find(params[:id]) if params[:id] } before_action -> { @repository = @platform.repositories.find(params[:id]) if params[:id] }
def index
@repositories = @platform.repositories
@repositories = Repository.custom_sort(@repositories).paginate(page: current_page)
end
def show def show
params[:per_page] = 30 params[:per_page] = 30
end end
@ -128,7 +121,7 @@ class Platforms::RepositoriesController < Platforms::BaseController
# @total_projects = @projects.count # @total_projects = @projects.count
@projects = @projects.by_owner(params[:owner_name]). @projects = @projects.by_owner(params[:owner_name]).
search(params[:project_name]).order("projects.name #{sort_dir}") search(params[:project_name]).order("projects.name asc")
@total_items = @projects.count @total_items = @projects.count
@projects = @projects.paginate(paginate_params) @projects = @projects.paginate(paginate_params)

View File

@ -1,5 +1,4 @@
class Projects::ProjectsController < Projects::BaseController class Projects::ProjectsController < Projects::BaseController
include DatatableHelper
include ProjectsHelper include ProjectsHelper
before_action :authenticate_user! before_action :authenticate_user!
@ -20,35 +19,6 @@ class Projects::ProjectsController < Projects::BaseController
end end
end end
def project_info
authorize @project
respond_to do |format|
format.json {
@github_basic_info = @project.github_data
@commits = []
@project.github_branches.each do |branch|
last_commit_info = @project.github_last_commit(branch.name)[0]
if last_commit_info
last_commit = {
branch: branch.name,
url: last_commit_info['html_url'],
sha: last_commit_info['sha'],
message: last_commit_info['commit']['message']
}
if last_commit_info['committer']
last_commit[:committer_login] = last_commit_info['committer']['login']
last_commit[:committer_url] = last_commit_info['committer']['html_url']
else
last_commit[:committer_login] = last_commit_info['commit']['author']['name']
last_commit[:committer_url] = ''
end
@commits << last_commit
end
end
}
end
end
def dashboard def dashboard
authorize :project authorize :project
end end

View File

@ -1,14 +0,0 @@
module DatatableHelper
def page
(params[:iDisplayStart].to_i/(params[:iDisplayLength].present? ? params[:iDisplayLength] : 25).to_i).to_i + 1
end
def per_page
params[:iDisplayLength].present? ? params[:iDisplayLength] : 25
end
def sort_dir
params[:sSortDir_0] == 'asc' ? 'asc' : 'desc'
end
end

View File

@ -1,3 +0,0 @@
module RepositoriesHelper
end

View File

@ -1,8 +1,4 @@
- set_meta_tags title: t('layout.contact.page_header') - set_meta_tags title: t('layout.contact.page_header')
- set_meta_tags og: { title: t('layout.contact.page_header'),
description: t('layout.contact.subheader') }
- set_meta_tags twitter: { title: t('layout.contact.page_header'),
description: t('layout.contact.subheader') }
.row .row
.col-md-10.col-md-offset-1 .col-md-10.col-md-offset-1

View File

@ -1,10 +0,0 @@
- content_for :sidebar do
.tos_sidebar
%h3= link_to t("layout.tos.begin"), '#'
%ul
%li= link_to " I. #{t("layout.tos.account_terms")}", '#Account_Terms'
%li= link_to " II. #{t("layout.tos.cancellation_and_termination")}", '#Cancellation_and_Termination'
%li= link_to "III. #{t("layout.tos.service_modifications")}", '#Service_Modifications'
%li= link_to " IV. #{t("layout.tos.copyright_and_ownership")}", '#Copyright_and_Ownership'
%li= link_to " V. #{t("layout.tos.general_conditions")}", '#General_Conditions'

View File

@ -1,203 +0,0 @@
- set_meta_tags og: { title: 'Terms of Service',
description: t('tour.meta_description') }
- set_meta_tags twitter: { title: 'Terms of Service',
description: t('tour.meta_description') }
- render 'tos_sidebar'
.tos
%a{name: '#'}
%h1 Terms of Service
%p
By using the ABF web site ("Service"), you are agreeing to be bound by the
following terms and conditions ("Terms of Service"). IF YOU ARE ENTERING INTO THIS AGREEMENT ON BEHALF OF A COMPANY
OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE AUTHORITY TO BIND SUCH
ENTITY, ITS AFFILIATES AND ALL USERS WHO ACCESS OUR SERVICES THROUGH YOUR
ACCOUNT TO THESE TERMS AND CONDITIONS, IN WHICH CASE THE TERMS "YOU" OR "YOUR"
SHALL REFER TO SUCH ENTITY, ITS AFFILIATES AND USERS ASSOCIATED WITH IT. IF
YOU DO NOT HAVE SUCH AUTHORITY, OR IF YOU DO NOT AGREE WITH THESE TERMS AND
CONDITIONS, YOU MUST NOT ACCEPT THIS AGREEMENT AND MAY NOT USE THE SERVICES.
%p
Openmandriva reserves the right to update and change the Terms of Service from time
to time without notice. Any new features that augment or enhance the current
Service, including the release of new tools and resources, shall be subject
to the Terms of Service. Continued use of the Service after any such changes
shall constitute your consent to such changes. You can review the most current
version of the Terms of Service at any time at: #{ link_to tos_url }
%p
Violation of any of the terms below will result in the termination of your
Account. While Openmandriva prohibits such conduct and Content on the Service, you
understand and agree that Openmandriva cannot be responsible for the Content posted
on the Service and you nonetheless may be exposed to such materials. You agree
to use the Service at your own risk.
%a{name: 'Account_Terms'}
%h2 I. Account Terms
%ol
%li
You must be 13 years or older to use this Service.
%li
You must be a human. Accounts registered by “bots” or other automated
methods are not permitted.
%li
To register in ABF, you should provide your legal full name and a valid email address.
It is also possible to register using Google, Facebook or Github account.
%li
You are responsible for maintaining the security of your account and password.
Openmandriva cannot and will not be liable for any loss or damage from your
failure to comply with this security obligation.
%li
You are responsible for all Content posted and activity that occurs under your
account (even when Content is posted by others who have accounts under
your account).
%li
One person or legal entity may not maintain more than one free account.
%li
You may not use the Service for any illegal or unauthorized purpose. You must
not, in the use of the Service, violate any laws in your jurisdiction
(includingbut not limited to copyright or trademark laws).
%a{name: 'Cancellation_and_Termination'}
%h2 II. Cancellation and Termination
%ol
%li
To cancel your account, we need an email request sent from the same address as
the one you are registered with. An email request to cancel your account is necessary.
%li
All the content from your personal platform repositories will be immediately deleted
from the Service upon cancellation. This information cannot be recovered once your
account is canceled. Any content committed by you to repositories of other platforms
will remain in place until owners of that platforms cancel their accounts.
%li
Openmandriva has the right to suspend or terminate your account and refuse any and all current
or future use of the Service, or any other Openmandriva service, for one of the following reasons:
%ul
%li
your bandwidth or server CPU usage significantly exceeds the average bandwidth or
server CPU usage (as determined ABF administrators) of other Openmandriva customers.
%li
content uploaded by you to Openmandriva servers violates the laws of one of the countries where
the storage servers reside. Currently these countries include Russian Federation,
Switzerland and Germany. This list can be extended or changed in future;
if this is the case, we will notify ABF users in our blog in advance.
%li
you violate one of the statements from this Terms of Service.
If any of these events happens, Openmandriva representatives will temporary block your account,
remove forbidden content and contact you to discuss possible ways to resolve the problematic
situation. Once the solution is found, your account will be unblocked.
%a{name: 'Service_Modifications'}
%h2 III. Modifications to the Service and Conditions
%ol
%li
Openmandriva reserves the right at any time and from time to time to modify or discontinue,
temporarily or permanently, the Service (or any part thereof) with or without notice.
%li
Conditions of all Services are subject to change upon 30 days notice from us.
Such notice may be provided at any time by posting the changes to the Service Site
(#{ link_to root_url[0..-2], root_url })
%li
Openmandriva shall not be liable to you or to any third party for any modification, suspension
or discontinuance of the Service.
%a{name: 'Copyright_and_Ownership'}
%h2 IV. Copyright and Content Ownership
%ol
%li
We claim no intellectual property rights over the material you provide to the
Service. Your profile and materials uploaded remain yours. However, by setting
your pages to be viewed publicly, you agree to allow others to view your Content.
By setting your repositories to be viewed publicly, you agree to allow others
to view and fork your repositories.
%li
Openmandriva does not pre-screen Content, but Openmandriva and its designee have the right
(but not the obligation) in their sole discretion to refuse or remove any
Content that is available via the Service.
%li
You shall defend Openmandriva against any claim, demand, suit or proceeding made or
brought against Openmandriva by a third party alleging that Your Content,
or Your use of the Service in violation of this Agreement, infringes or
misappropriates the intellectual property rights of a third party or violates
applicable law, and shall indemnify Openmandriva for any damages finally awarded against,
and for reasonable attorneys fees incurred by, Openmandriva in connection with any such
claim, demand, suit or proceeding; provided, that Openmandriva (a) promptly gives You
written notice of the claim, demand, suit or proceeding; (b) gives You sole
control of the defense and settlement of the claim, demand, suit or proceeding
(provided that You may not settle any claim, demand, suit or proceeding unless
the settlement unconditionally releases Openmandriva of all liability); and (c) provides
to You all reasonable assistance, at Your expense.
%li
The look and feel of the Service is copyright &copy;
= Date.today.year
Openmandriva Association. All rights reserved.
You may not duplicate, copy, or reuse any portion of the HTML/CSS, Javascript, or
visual design elements or concepts without express written permission from Openmandriva.
%a{name: 'General_Conditions'}
%h2 V. General Conditions
%ol
%li
Your use of the Service is at your sole risk. The service is provided on an “as is”
and “as available” basis.
%li
Technical support is only garanteed for paying account holders and is only available
via email. Support is available in English and Russian.
%li
You understand that Openmandriva uses third party vendors and hosting partners to provide
the necessary hardware, software, networking, storage, and related technology
required to run the Service.
%li
We may, but have no obligation to, remove Content and Accounts containing Content
that we determine in our sole discretion are unlawful, offensive, threatening,
libelous, defamatory, pornographic, obscene or otherwise objectionable or violates
any partys intellectual property or these Terms of Service.
%li
Verbal, physical, written or other abuse (including threats of abuse or retribution)
of any Openmandriva customer, employee, member, or officer will result in immediate account
termination.
%li
You understand that the technical processing and transmission of the Service,
including your Content, may be transfered unencrypted and involve (a) transmissions
over various networks; and (b) changes to conform and adapt to technical requirements
of connecting networks or devices.
%li
You must not upload, post, host, or transmit unsolicited email, SMSs, or “spam” messages.
%li
You must not transmit any worms or viruses or any code of a destructive nature.
%li
Openmandriva does not warrant that (i) the service will meet your specific requirements,
(ii) the service will be uninterrupted, timely, secure, or error-free, (iii) the
results that may be obtained from the use of the service will be accurate or
reliable, (iv) the quality of any products, services, information, or other material
purchased or obtained by you through the service will meet your expectations, and
(v) any errors in the Service will be corrected.
%li
You expressly understand and agree that Openmandriva shall not be liable for any direct,
indirect, incidental, special, consequential or exemplary damages, including but
not limited to, damages for loss of profits, goodwill, use, data or other
intangible losses (even if Openmandriva has been advised of the possibility of such damages),
resulting from: (i) the use or the inability to use the service; (ii) the cost of
procurement of substitute goods and services resulting from any goods, data,
information or services purchased or obtained or messages received or transactions
entered into through or from the service; (iii) unauthorized access to or alteration
of your transmissions or data; (iv) statements or conduct of any third party on the
service; (v) or any other matter relating to the service.
%li
The failure of Openmandriva to exercise or enforce any right or provision of the Terms of
Service shall not constitute a waiver of such right or provision. The Terms of
Service constitutes the entire agreement between you and Openmandriva and govern your use of
the Service, superseding any prior agreements between you and Openmandriva (including, but
not limited to, any prior versions of the Terms of Service). You agree that these
Terms of Service and Your use of the Service are governed under European law.
%p
Questions about the Terms of Service should be sent to #{ mail_to 'abf@openmandriva.org' }

View File

@ -10,10 +10,8 @@
/ Collect the nav links, forms, and other content for toggling / Collect the nav links, forms, and other content for toggling
ul.nav.navbar-nav.left-border ul.nav.navbar-nav.left-border
li class=('active' if act == :show && contr == :platforms) li class=('active' if act == :show && contr == :platforms || contr == :repositories)
= link_to t("layout.platforms.about"), platform_path(@platform) = link_to t("layout.platforms.about"), platform_path(@platform)
li class=('active' if contr == :repositories)
= link_to t("layout.repositories.list_header"), platform_repositories_path(@platform)
li class=('active' if contr == :contents) li class=('active' if contr == :contents)
= link_to t('layout.platforms.contents'), platform_contents_path(@platform) = link_to t('layout.platforms.contents'), platform_contents_path(@platform)
- if policy(@platform).show? - if policy(@platform).show?

View File

@ -1,5 +1,5 @@
- set_meta_tags title: t('layout.platforms.list_header') - set_meta_tags title: t('layout.platforms.list_header')
.row.top-space ng-controller='PlatformsController' .row.top-space
.col-md-6.col-md-offset-3 .col-md-6.col-md-offset-3
rd-widget rd-widget
rd-widget-header title=(t('layout.platforms.list_header')) rd-widget-header title=(t('layout.platforms.list_header'))
@ -13,9 +13,10 @@
th= t 'activerecord.attributes.platform.name' th= t 'activerecord.attributes.platform.name'
th= t 'activerecord.attributes.platform.distrib_type' th= t 'activerecord.attributes.platform.distrib_type'
tbody tbody
tr ng-repeat='item in platforms' - @platforms.each do |platform|
tr
td td
a ng-href="{{item.link}}" a href=platform_path(platform.name)
| {{item.name}} = platform.name
td td
| {{item.distrib_type}} = platform.distrib_type

View File

@ -43,7 +43,18 @@
b= t('layout.platforms.distrib_type') b= t('layout.platforms.distrib_type')
td= @platform.distrib_type td= @platform.distrib_type
.col-md-6
rd-widget
rd-widget-header title=t('layout.repositories.list_header')
-if policy(@platform.repositories.build).create?
a.btn.btn-primary.pull-right href=new_platform_repository_path(@platform)
= t("layout.repositories.new")
rd-widget-body class="no-padding"
= render 'platforms/repositories/list', object: @repositories
= will_paginate @repositories
- if @platform.platform_type == 'personal' and @platform.visibility == 'open' - if @platform.platform_type == 'personal' and @platform.visibility == 'open'
.row
.col-md-6 ng-controller='PlatformSysReposController' ng-init="init(#{@platform.id})" .col-md-6 ng-controller='PlatformSysReposController' ng-init="init(#{@platform.id})"
rd-widget rd-widget
rd-widget-header title=t('layout.platforms.sys_repos_header') rd-widget-header title=t('layout.platforms.sys_repos_header')

View File

@ -1,8 +1,4 @@
- set_meta_tags title: t('.title') - set_meta_tags title: t('.title')
- set_meta_tags og: { title: t('.title'), description: t('tour.meta_description') }
- set_meta_tags twitter: { title: t('.title'), description: t('tour.meta_description') }
/ == render 'projects/build_lists/submenu'
.row.top-space .row.top-space
.col-md-10.col-md-offset-1 .col-md-10.col-md-offset-1

View File

@ -1,14 +0,0 @@
- title = title_object(@platform)
- set_meta_tags title: [title, t('layout.repositories.list_header')]
= render 'submenu' if params[:platform_id]
.row
.col-md-6.col-md-offset-3
rd-widget
rd-widget-header title=t('layout.repositories.list_header')
-if policy(@platform.repositories.build).create?
a.btn.btn-primary.pull-right href=new_platform_repository_path(@platform)
= t("layout.repositories.new")
rd-widget-body class="no-padding"
= render 'list', object: @repositories
= will_paginate @repositories

View File

@ -1,7 +0,0 @@
json.project_info do |proj|
proj.(@github_basic_info, :html_url, :description)
proj.commits @commits do |commit|
proj.(commit, :branch, :url, :sha, :message, :committer_login, :committer_url)
end
end

View File

@ -69,6 +69,6 @@
ng-disabled = 'loading' ng-disabled = 'loading'
class = 'form-control typeahead' ] class = 'form-control typeahead' ]
a href='#' ng-click='update()' a ng-click='update()'
b b
= t('.refresh') = t('.refresh')

View File

@ -1,193 +1,72 @@
---
en: en:
will_paginate:
previous_label: Previous
next_label: Next
page_gap: ...
datatables:
previous_label: Prev.
next_label: Next
first_label: « First
last_label: Last »
empty_label: No data accessible
info_label: Records displayed from _START_ to _END_ total _TOTAL_
info_empty_label: Records displayed from 0 to 0 total 0
filtered_label: (filtered from _MAX_)
layout:
logged_in_as: You logged as
logout: Logout
user_list: User list
edit: Edit
show: View
hide: Hide
cancel: Cancel
create: Create
update: Update
delete: Erase
delete_selected: Remove selected
save: Save
saving: Saving
clone: Clone
search_by_name: Filter by name
are_you_sure: "Sure?"
login: Login
or: or
yes_: Yes
no_: No
true_: True
false_: False
publish: Publish
publish_again: Publish again
publish_again_warning: Secondary publication will be able to break relationships in the repository. Be careful!
publish_into_testing: '[testing] Publish'
reject_publish: Reject
add: Add
upload: Upload
not_access: Access denied!
owner: Owner
confirm: Sure?
back: Back
processing: working ...
invalid_content_type: incorrect type
atom_link_tag_title: Private feed for %{nickname} | %{app_name}
preview: Preview
link: Link
noscript_message: You need javascript to properly use this site
settings:
label: Settings
notifier: Notifier setting
notifiers:
edit_header: Notifier setting
notice_header: You can receive notifies from other collaborators about changes into code of your projects. Notifies will be sent to your email %{email}.
change_email_link: Change email address
code_header: Code
tracker_header: Tracker
build_list_header: Build List
devise:
shared_links:
sign_in: Sign in
sign_up: Sign up
forgot_password: Forgot your password?
confirm_again: Do not receive the confirmation link?
unlock: Do not receive unlock instructions?
sign_in_through: Sign in by %{provider}
weekdays:
Monday: Monday
Tuesday: Tuesday
Wednesday: Wednesday
Thursday: Thursday
Friday: Friday
Saturday: Saturday
Sunday: Sunday
time:
ago: ago
sessions:
sign_in_header: Sign in
sign_up_with: or sign in with
collaborators:
back_to_proj: Back to project
edit: Edit list
add: Add/Remove
list: List
edit_roles: Edit roles
roles_header: Roles to
add_role: Add/Remove a role
input_username: Enter an username
input_groupname: Enter a groupname
members: Members
roles: Roles
role_names:
reader: Reader
writer: Writer
admin: Admin
git:
repositories:
empty: "Repository is empty. You need to wait some time if you have forked project or imported package"
source: Source
commits: Commits
commit_diff_too_big: Sorry, diff too big!
tags: Tags
branches: Branches
project_versions: Versions
flash:
settings:
saved: Settings saved success
save_error: Setting update error
subscribe:
saved: Subscription on notifications for this task is created
saved_error: Subscription create error
destroyed: Subscription on notifications for this task is cleaned
commit:
saved: Subscription on notifications for this commit is created
destroyed: Subscription on notifications for this commit is cleaned
exception_message: Access violation to this page!
500_message: Error 500. Something went wrong. We've been notified about this issue and we'll take a look at it shortly.
404_message: Error 404. Resource not found!
collaborators:
successfully_added: Member %{uname} successfully added
error_in_adding: Error adding member
successfully_removed: Member %{uname} successfully removed
error_in_removing: Error removing %{uname} member
successfully_updated: Member %{uname} role has been updated
error_in_updating: Error updating role
successfully_changed: Members list successfully changed
error_in_changing: Members list changing error
member_already_added: Member %s already added
group_already_added: Group already added
wrong_user: "User with nickname '%{uname}' not found!"
blob:
successfully_updated: "File '%{name}' successfully updated"
updating_error: "Error updating file '%{name}'"
attributes:
password: Password
password_confirmation: Confirmation
remember_me: Remember
name: Name
parent_platform_id: Parent platform
activerecord: activerecord:
errors:
models:
project:
attributes:
base:
can_have_less_or_equal: You cannot have more than %{count} projects.
models: models:
product_build_list: Product build list product_build_list: Product build list
datatables:
attributes: empty_label: No data accessible
arch: filtered_label: "(filtered from _MAX_)"
name: Name info_empty_label: Records displayed from 0 to 0 total 0
created_at: Created info_label: Records displayed from _START_ to _END_ total _TOTAL_
updated_at: Updated next_label: Next
previous_label: " Prev."
into: into
from: from
by: by
diff: Diff diff: Diff
flash:
collaborators:
wrong_user: User with nickname '%{uname}' not found!
exception_message: Access violation to this page!
settings:
save_error: Setting update error
saved: Settings saved success
layout:
add: Add
atom_link_tag_title: Private feed for %{nickname} | %{app_name}
cancel: Cancel
clone: Clone
collaborators:
members: Members
role_names:
admin: Admin
reader: Reader
writer: Writer
roles: Roles
confirm: Sure?
create: Create
delete: Erase
devise:
shared_links:
confirm_again: Do not receive the confirmation link?
forgot_password: Forgot your password?
sign_in: Sign in
sign_up: Sign up
unlock: Do not receive unlock instructions?
edit: Edit
false_: false
git:
repositories:
branches: Branches
tags: Tags
logout: Logout
no_: false
noscript_message: You need javascript to properly use this site
or: or
processing: working ...
publish: Publish
publish_again: Publish again
publish_again_warning: Secondary publication will be able to break relationships
in the repository. Be careful!
publish_into_testing: "[testing] Publish"
reject_publish: Reject
save: Save
settings:
label: Settings
notifiers:
build_list_header: Build List
change_email_link: Change email address
notice_header: You can receive notifies from other collaborators about changes
into code of your projects. Notifies will be sent to your email %{email}.
show: View
true_: true
none: None
number_rows: Number rows number_rows: Number rows
reset: Reset reset: Reset
_on: 'On'
until: Until
none: None
close: Close
new_feature: '(new!)'

View File

@ -1,193 +1,73 @@
---
ru: ru:
will_paginate: activerecord:
previous_label: Предыдущая models:
next_label: Следующая product_build_list: "Сборочный лист продукта"
page_gap: ...
datatables: datatables:
previous_label: Предыдущая empty_label: "Нет доступных данных"
next_label: Следующая filtered_label: "(отфильтровано из _MAX_)"
first_label: « Первая info_empty_label: "Показаны записи с 0 по 0 из 0"
last_label: Последняя » info_label: "Показаны записи с _START_ по _END_ из _TOTAL_"
empty_label: Нет доступных данных next_label: "Следующая "
info_label: Показаны записи с _START_ по _END_ из _TOTAL_ previous_label: " Предыдущая"
info_empty_label: Показаны записи с 0 по 0 из 0 diff: "Изменения"
filtered_label: (отфильтровано из _MAX_) flash:
collaborators:
layout: wrong_user: "Пользователь с ником '%{uname}' не найден."
logged_in_as: Вы вошли как exception_message: "У Вас нет доступа к этой странице!"
logout: Выйти
user_list: Список пользователей
edit: Редактировать
show: Просмотр
hide: Скрыть
cancel: Отмена
create: Создать
update: Обновить
delete: Удалить
delete_selected: Удалить выбранное
save: Сохранить
saving: Сохранение...
clone: Клонировать
search_by_name: Фильтр по имени
are_you_sure: "Вы уверены?"
login: Войти
or: или
yes_: Да
no_: Нет
true_: Да
false_: Нет
publish: Опубликовать
publish_again: Опубликовать снова
publish_again_warning: Повторная публикация может привести к нарушению зависимостей в репозитории. Будьте осторожны!
publish_into_testing: '[testing] Опубликовать'
reject_publish: Отклонить
add: Добавить
upload: Загрузить
not_access: Нет доступа!
owner: Владелец
confirm: Уверены?
back: Назад
processing: Обрабатывается...
invalid_content_type: имеет неверный тип
atom_link_tag_title: Приватная лента для %{nickname} | %{app_name}
preview: Предосмотр
link: Ссылка
noscript_message: Включите javascript для корректной работы сайта
settings: settings:
label: 'Настройки' save_error: "При обновлении настроек произошла ошибка"
notifier: Настройки оповещений saved: "Настройки успешно сохранены"
notifiers: layout:
edit_header: Настройки оповещений add: "Добавить"
notice_header: Вы можете получать уведомления об изменениях, которые вносят другие участники, в код ваших программ. Уведомления будут высылаться на указанный вами адрес электронной почты %{email}. atom_link_tag_title: "Приватная лента для %{nickname} | %{app_name}"
change_email_link: Изменить адрес электронной почты cancel: "Отмена"
code_header: Код clone: "Клонировать"
tracker_header: Трекер задач collaborators:
build_list_header: Сборочные задания members: "Участники"
role_names:
admin: "Админ"
reader: "Читатель"
writer: "Писатель"
roles: "Роли"
confirm: "Уверены?"
create: "Создать"
delete: "Удалить"
devise: devise:
shared_links: shared_links:
sign_in: Войти confirm_again: "Не получили инструкции по подтверждению?"
sign_up: Регистрация forgot_password: "Забыли пароль?"
forgot_password: Забыли пароль? sign_in: "Войти"
confirm_again: Не получили инструкции по подтверждению? sign_up: "Регистрация"
unlock: Не получили инструкции по разблокировке? unlock: "Не получили инструкции по разблокировке?"
sign_in_through: Войти через %{provider} edit: "Редактировать"
false_: "Нет"
weekdays:
Monday: Понедельник
Tuesday: Вторник
Wednesday: Среда
Thursday: Четверг
Friday: Пятница
Saturday: Субота
Sunday: Воскресенье
time:
ago: назад
sessions:
sign_in_header: Вход в систему
sign_up_with: или войти с помощью
collaborators:
back_to_proj: Вернуться к проекту
edit: Редактировать список
add: Добавить/Удалить
list: Список
edit_roles: Редактировать роли
roles_header: Роли для
add_role: Добавить/Удалить роль
input_username: Введите псевдоним пользователя
input_groupname: Введите псевдоним группы
members: Участники
roles: Роли
role_names:
reader: Читатель
writer: Писатель
admin: Админ
git: git:
repositories: repositories:
empty: "Репозиторий пуст. Если вы клонировали(Fork) проект или импортировали пакет, данные скоро появятся" branches: "Ветки"
source: Source tags: "Теги"
commits: Коммиты logout: "Выйти"
commit_diff_too_big: Извините, изменений слишком много! no_: "Нет"
tags: Теги noscript_message: "Включите javascript для корректной работы сайта"
branches: Ветки or: "или"
project_versions: Версии processing: "Обрабатывается..."
publish: "Опубликовать"
flash: publish_again: "Опубликовать снова"
publish_again_warning: "Повторная публикация может привести к нарушению зависимостей
в репозитории. Будьте осторожны!"
publish_into_testing: "[testing] Опубликовать"
reject_publish: "Отклонить"
save: "Сохранить"
settings: settings:
saved: Настройки успешно сохранены label: "Настройки"
save_error: При обновлении настроек произошла ошибка notifiers:
build_list_header: "Сборочные задания"
subscribe: change_email_link: "Изменить адрес электронной почты"
saved: Вы подписаны на оповещения для этой задачи notice_header: "Вы можете получать уведомления об изменениях, которые вносят
saved_error: При создании подписки произошла ошибка другие участники, в код ваших программ. Уведомления будут высылаться на
destroyed: Подписка на оповещения для этой задачи убрана указанный вами адрес электронной почты %{email}."
commit: show: "Просмотр"
saved: Вы подписаны на оповещения для этого коммита true_: "Да"
destroyed: Подписка на оповещения для этого коммита убрана none: "Нет"
number_rows: "Количество строк"
exception_message: У Вас нет доступа к этой странице! reset: "Сброс"
500_message: Ошибка 500. Что-то пошло не так. Мы уже в курсе данной проблемы и постараемся поскорее ее решить.
404_message: Ошибка 404. Страница не найдена!
collaborators:
successfully_added: Участник %{uname} успешно добавлен
error_in_adding: Ошибка при добавлении участника
successfully_removed: Участник %{uname} успешно удален
error_in_removing: Ошибка при удалении участника %{uname}
successfully_updated: Участнику %{uname} изменена роль
error_in_updating: Ошибка при изменении роли
successfully_changed: Список участников успешно изменен
error_in_changing: Ошибка изменения списка участников
member_already_added: Участник %s уже добавлен
group_already_added: Группа уже добавлена
wrong_user: "Пользователь с ником '%{uname}' не найден."
blob:
successfully_updated: "Файл '%{name}' успешно обновлен"
updating_error: "Ошибка обновления файла '%{name}'"
attributes:
password: Пароль
password_confirmation: Подтверждение
remember_me: Запомнить
name: Название
parent_platform_id: Родительская платформа
activerecord:
errors:
models:
project:
attributes:
base:
can_have_less_or_equal: Нельзя иметь больше, чем %{count} проектов.
models:
product_build_list: Сборочный лист продукта
attributes:
arch:
name: Название
created_at: Создана
updated_at: Обновлена
into: в
from: из
by: от
diff: Изменения
number_rows: Количество строк
reset: Сброс
_on: с
until: по
none: Нет
close: Закрыть
new_feature: '(новинка!)'

View File

@ -168,7 +168,7 @@ Rails.application.routes.draw do
end end
end end
resources :repositories do resources :repositories, only: [:create, :new, :show, :edit] do
member do member do
get :manage_projects get :manage_projects
put :add_project put :add_project
@ -274,7 +274,6 @@ Rails.application.routes.draw do
end end
# Resource # Resource
get '/project_info.:format' => 'projects#project_info', as: :project_info, format: /json/
get '/autocomplete_maintainers' => 'projects#autocomplete_maintainers', as: :autocomplete_maintainers get '/autocomplete_maintainers' => 'projects#autocomplete_maintainers', as: :autocomplete_maintainers
get '/modify' => 'projects#edit', as: :edit_project get '/modify' => 'projects#edit', as: :edit_project
patch '/' => 'projects#update', as: :project patch '/' => 'projects#update', as: :project