Various fixes
This commit is contained in:
parent
6157338a46
commit
0395b5cb8f
|
@ -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;
|
||||
});
|
||||
}]);
|
|
@ -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 = "";
|
||||
}
|
||||
});
|
||||
}]);
|
|
@ -1,7 +1,6 @@
|
|||
RosaABF.controller('ProjectsController', ['$scope', 'ProjectsService', 'ProjectSelectService',
|
||||
function($scope, ProjectsService, ProjectSelectService) {
|
||||
RosaABF.controller('ProjectsController', ['$scope', 'ProjectsService',
|
||||
function($scope, ProjectsService) {
|
||||
$scope.projects = null;
|
||||
$scope.ProjectSelectService = ProjectSelectService;
|
||||
$scope.search = "";
|
||||
|
||||
var promiseResolve = function(projects) {
|
||||
|
@ -15,10 +14,6 @@ function($scope, ProjectsService, ProjectSelectService) {
|
|||
ProjectsService.getProjects(search).then(promiseResolve);
|
||||
}
|
||||
|
||||
$scope.selectProject = function(project) {
|
||||
ProjectSelectService.project = project;
|
||||
}
|
||||
|
||||
$scope.requesting = true;
|
||||
ProjectsService.getProjects().then(promiseResolve);
|
||||
}]);
|
|
@ -23,7 +23,6 @@ RosaABF.controller 'RepositoryProjectsController',
|
|||
owner_name: $scope.owner_name
|
||||
project_name: $scope.project_name
|
||||
page: $scope.page
|
||||
sSortDir_0: 'asc'
|
||||
format: 'json'
|
||||
|
||||
path = Routes.projects_list_platform_repository_path $scope.platform_id, $scope.repository_id
|
||||
|
|
|
@ -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;
|
||||
}]);
|
|
@ -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;
|
||||
}]);
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
});
|
|
@ -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);
|
|
@ -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
|
|
@ -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);
|
|
@ -1,5 +1,4 @@
|
|||
class Platforms::MassBuildsController < Platforms::BaseController
|
||||
include DatatableHelper
|
||||
|
||||
before_action :authenticate_user!
|
||||
skip_before_action :authenticate_user!, only: [:index, :get_list] if APP_CONFIG['anonymous_access']
|
||||
|
|
|
@ -6,16 +6,12 @@ class Platforms::PlatformsController < Platforms::BaseController
|
|||
|
||||
def index
|
||||
authorize :platform
|
||||
respond_to do |format|
|
||||
format.html {}
|
||||
|
||||
format.json {
|
||||
@platforms = PlatformPolicy::Scope.new(current_user, Platform).related
|
||||
}
|
||||
end
|
||||
@platforms = PlatformPolicy::Scope.new(current_user, Platform).related.select(:name, :distrib_type)
|
||||
end
|
||||
|
||||
def show
|
||||
@repositories = @platform.repositories
|
||||
@repositories = Repository.custom_sort(@repositories).paginate(page: current_page)
|
||||
end
|
||||
|
||||
def new
|
||||
|
@ -161,9 +157,9 @@ class Platforms::PlatformsController < Platforms::BaseController
|
|||
subject_params(Platform)
|
||||
end
|
||||
|
||||
# Private: before_action hook which loads 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
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
class Platforms::RepositoriesController < Platforms::BaseController
|
||||
include DatatableHelper
|
||||
include FileStoreHelper
|
||||
include RepositoriesHelper
|
||||
include PaginateHelper
|
||||
|
||||
before_action :authenticate_user!
|
||||
|
@ -11,11 +9,6 @@ class Platforms::RepositoriesController < Platforms::BaseController
|
|||
before_action :set_members, only: [:edit, :update]
|
||||
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
|
||||
params[:per_page] = 30
|
||||
end
|
||||
|
@ -128,7 +121,7 @@ class Platforms::RepositoriesController < Platforms::BaseController
|
|||
|
||||
# @total_projects = @projects.count
|
||||
@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
|
||||
@projects = @projects.paginate(paginate_params)
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
class Projects::ProjectsController < Projects::BaseController
|
||||
include DatatableHelper
|
||||
include ProjectsHelper
|
||||
|
||||
before_action :authenticate_user!
|
||||
|
@ -20,35 +19,6 @@ class Projects::ProjectsController < Projects::BaseController
|
|||
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
|
||||
authorize :project
|
||||
end
|
||||
|
|
|
@ -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
|
|
@ -1,3 +0,0 @@
|
|||
module RepositoriesHelper
|
||||
|
||||
end
|
|
@ -1,8 +1,4 @@
|
|||
- 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
|
||||
.col-md-10.col-md-offset-1
|
||||
|
|
|
@ -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'
|
|
@ -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 attorney’s 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 ©
|
||||
= 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 party’s 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' }
|
||||
|
|
@ -10,10 +10,8 @@
|
|||
/ Collect the nav links, forms, and other content for toggling
|
||||
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)
|
||||
li class=('active' if contr == :repositories)
|
||||
= link_to t("layout.repositories.list_header"), platform_repositories_path(@platform)
|
||||
li class=('active' if contr == :contents)
|
||||
= link_to t('layout.platforms.contents'), platform_contents_path(@platform)
|
||||
- if policy(@platform).show?
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
- 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
|
||||
rd-widget
|
||||
rd-widget-header title=(t('layout.platforms.list_header'))
|
||||
|
@ -13,9 +13,10 @@
|
|||
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}}
|
||||
- @platforms.each do |platform|
|
||||
tr
|
||||
td
|
||||
a href=platform_path(platform.name)
|
||||
= platform.name
|
||||
td
|
||||
= platform.distrib_type
|
|
@ -43,26 +43,37 @@
|
|||
b= t('layout.platforms.distrib_type')
|
||||
td= @platform.distrib_type
|
||||
|
||||
- if @platform.platform_type == 'personal' and @platform.visibility == 'open'
|
||||
.col-md-6 ng-controller='PlatformSysReposController' ng-init="init(#{@platform.id})"
|
||||
rd-widget
|
||||
rd-widget-header title=t('layout.platforms.sys_repos_header')
|
||||
rd-widget-body
|
||||
.row
|
||||
.col-md-4
|
||||
b= t('layout.platforms.target_platform')
|
||||
.col-md-8
|
||||
select ng-model='platform' ng-change='updateCommand()'
|
||||
option ng-repeat='platform in platforms' ng-value='platform'
|
||||
| {{ platform }}
|
||||
.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
|
||||
|
||||
.row
|
||||
.col-md-4
|
||||
b= t('layout.platforms.target_architecture')
|
||||
.col-md-8
|
||||
select ng-model='arch' ng-change='updateCommand()'
|
||||
option ng-repeat='arch in arches' ng-value='arch'
|
||||
| {{ arch }}
|
||||
.row
|
||||
br
|
||||
textarea.form-control readonly='readonly' ng-model='command' rows=3 ng-click='selectAll($event)'
|
||||
- if @platform.platform_type == 'personal' and @platform.visibility == 'open'
|
||||
.row
|
||||
.col-md-6 ng-controller='PlatformSysReposController' ng-init="init(#{@platform.id})"
|
||||
rd-widget
|
||||
rd-widget-header title=t('layout.platforms.sys_repos_header')
|
||||
rd-widget-body
|
||||
.row
|
||||
.col-md-4
|
||||
b= t('layout.platforms.target_platform')
|
||||
.col-md-8
|
||||
select ng-model='platform' ng-change='updateCommand()'
|
||||
option ng-repeat='platform in platforms' ng-value='platform'
|
||||
| {{ platform }}
|
||||
|
||||
.row
|
||||
.col-md-4
|
||||
b= t('layout.platforms.target_architecture')
|
||||
.col-md-8
|
||||
select ng-model='arch' ng-change='updateCommand()'
|
||||
option ng-repeat='arch in arches' ng-value='arch'
|
||||
| {{ arch }}
|
||||
.row
|
||||
br
|
||||
textarea.form-control readonly='readonly' ng-model='command' rows=3 ng-click='selectAll($event)'
|
||||
|
|
|
@ -1,8 +1,4 @@
|
|||
- 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
|
||||
.col-md-10.col-md-offset-1
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -69,6 +69,6 @@
|
|||
ng-disabled = 'loading'
|
||||
class = 'form-control typeahead' ]
|
||||
|
||||
a href='#' ng-click='update()'
|
||||
a ng-click='update()'
|
||||
b
|
||||
= t('.refresh')
|
||||
|
|
|
@ -1,193 +1,72 @@
|
|||
---
|
||||
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:
|
||||
|
||||
errors:
|
||||
models:
|
||||
project:
|
||||
attributes:
|
||||
base:
|
||||
can_have_less_or_equal: You cannot have more than %{count} projects.
|
||||
|
||||
models:
|
||||
product_build_list: Product build list
|
||||
|
||||
attributes:
|
||||
arch:
|
||||
name: Name
|
||||
created_at: Created
|
||||
updated_at: Updated
|
||||
|
||||
into: into
|
||||
from: from
|
||||
by: by
|
||||
datatables:
|
||||
empty_label: No data accessible
|
||||
filtered_label: "(filtered from _MAX_)"
|
||||
info_empty_label: Records displayed from 0 to 0 total 0
|
||||
info_label: Records displayed from _START_ to _END_ total _TOTAL_
|
||||
next_label: Next ›
|
||||
previous_label: "‹ Prev."
|
||||
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
|
||||
reset: Reset
|
||||
_on: 'On'
|
||||
until: Until
|
||||
none: None
|
||||
close: Close
|
||||
|
||||
new_feature: '(new!)'
|
||||
|
|
|
@ -1,193 +1,73 @@
|
|||
---
|
||||
ru:
|
||||
will_paginate:
|
||||
previous_label: ‹ Предыдущая
|
||||
next_label: Следующая ›
|
||||
page_gap: ...
|
||||
|
||||
activerecord:
|
||||
models:
|
||||
product_build_list: "Сборочный лист продукта"
|
||||
datatables:
|
||||
previous_label: ‹ Предыдущая
|
||||
next_label: Следующая ›
|
||||
first_label: « Первая
|
||||
last_label: Последняя »
|
||||
empty_label: Нет доступных данных
|
||||
info_label: Показаны записи с _START_ по _END_ из _TOTAL_
|
||||
info_empty_label: Показаны записи с 0 по 0 из 0
|
||||
filtered_label: (отфильтровано из _MAX_)
|
||||
|
||||
layout:
|
||||
logged_in_as: Вы вошли как
|
||||
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 для корректной работы сайта
|
||||
|
||||
empty_label: "Нет доступных данных"
|
||||
filtered_label: "(отфильтровано из _MAX_)"
|
||||
info_empty_label: "Показаны записи с 0 по 0 из 0"
|
||||
info_label: "Показаны записи с _START_ по _END_ из _TOTAL_"
|
||||
next_label: "Следующая ›"
|
||||
previous_label: "‹ Предыдущая"
|
||||
diff: "Изменения"
|
||||
flash:
|
||||
collaborators:
|
||||
wrong_user: "Пользователь с ником '%{uname}' не найден."
|
||||
exception_message: "У Вас нет доступа к этой странице!"
|
||||
settings:
|
||||
label: 'Настройки'
|
||||
notifier: Настройки оповещений
|
||||
notifiers:
|
||||
edit_header: Настройки оповещений
|
||||
notice_header: Вы можете получать уведомления об изменениях, которые вносят другие участники, в код ваших программ. Уведомления будут высылаться на указанный вами адрес электронной почты %{email}.
|
||||
change_email_link: Изменить адрес электронной почты
|
||||
code_header: Код
|
||||
tracker_header: Трекер задач
|
||||
build_list_header: Сборочные задания
|
||||
|
||||
save_error: "При обновлении настроек произошла ошибка"
|
||||
saved: "Настройки успешно сохранены"
|
||||
layout:
|
||||
add: "Добавить"
|
||||
atom_link_tag_title: "Приватная лента для %{nickname} | %{app_name}"
|
||||
cancel: "Отмена"
|
||||
clone: "Клонировать"
|
||||
collaborators:
|
||||
members: "Участники"
|
||||
role_names:
|
||||
admin: "Админ"
|
||||
reader: "Читатель"
|
||||
writer: "Писатель"
|
||||
roles: "Роли"
|
||||
confirm: "Уверены?"
|
||||
create: "Создать"
|
||||
delete: "Удалить"
|
||||
devise:
|
||||
shared_links:
|
||||
sign_in: Войти
|
||||
sign_up: Регистрация
|
||||
forgot_password: Забыли пароль?
|
||||
confirm_again: Не получили инструкции по подтверждению?
|
||||
unlock: Не получили инструкции по разблокировке?
|
||||
sign_in_through: Войти через %{provider}
|
||||
|
||||
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: Админ
|
||||
|
||||
confirm_again: "Не получили инструкции по подтверждению?"
|
||||
forgot_password: "Забыли пароль?"
|
||||
sign_in: "Войти"
|
||||
sign_up: "Регистрация"
|
||||
unlock: "Не получили инструкции по разблокировке?"
|
||||
edit: "Редактировать"
|
||||
false_: "Нет"
|
||||
git:
|
||||
repositories:
|
||||
empty: "Репозиторий пуст. Если вы клонировали(Fork) проект или импортировали пакет, данные скоро появятся"
|
||||
source: Source
|
||||
commits: Коммиты
|
||||
commit_diff_too_big: Извините, изменений слишком много!
|
||||
tags: Теги
|
||||
branches: Ветки
|
||||
project_versions: Версии
|
||||
|
||||
flash:
|
||||
branches: "Ветки"
|
||||
tags: "Теги"
|
||||
logout: "Выйти"
|
||||
no_: "Нет"
|
||||
noscript_message: "Включите javascript для корректной работы сайта"
|
||||
or: "или"
|
||||
processing: "Обрабатывается..."
|
||||
publish: "Опубликовать"
|
||||
publish_again: "Опубликовать снова"
|
||||
publish_again_warning: "Повторная публикация может привести к нарушению зависимостей
|
||||
в репозитории. Будьте осторожны!"
|
||||
publish_into_testing: "[testing] Опубликовать"
|
||||
reject_publish: "Отклонить"
|
||||
save: "Сохранить"
|
||||
settings:
|
||||
saved: Настройки успешно сохранены
|
||||
save_error: При обновлении настроек произошла ошибка
|
||||
|
||||
subscribe:
|
||||
saved: Вы подписаны на оповещения для этой задачи
|
||||
saved_error: При создании подписки произошла ошибка
|
||||
destroyed: Подписка на оповещения для этой задачи убрана
|
||||
commit:
|
||||
saved: Вы подписаны на оповещения для этого коммита
|
||||
destroyed: Подписка на оповещения для этого коммита убрана
|
||||
|
||||
exception_message: У Вас нет доступа к этой странице!
|
||||
|
||||
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: '(новинка!)'
|
||||
label: "Настройки"
|
||||
notifiers:
|
||||
build_list_header: "Сборочные задания"
|
||||
change_email_link: "Изменить адрес электронной почты"
|
||||
notice_header: "Вы можете получать уведомления об изменениях, которые вносят
|
||||
другие участники, в код ваших программ. Уведомления будут высылаться на
|
||||
указанный вами адрес электронной почты %{email}."
|
||||
show: "Просмотр"
|
||||
true_: "Да"
|
||||
none: "Нет"
|
||||
number_rows: "Количество строк"
|
||||
reset: "Сброс"
|
||||
|
|
|
@ -168,7 +168,7 @@ Rails.application.routes.draw do
|
|||
end
|
||||
end
|
||||
|
||||
resources :repositories do
|
||||
resources :repositories, only: [:create, :new, :show, :edit] do
|
||||
member do
|
||||
get :manage_projects
|
||||
put :add_project
|
||||
|
@ -274,7 +274,6 @@ Rails.application.routes.draw do
|
|||
end
|
||||
|
||||
# Resource
|
||||
get '/project_info.:format' => 'projects#project_info', as: :project_info, format: /json/
|
||||
get '/autocomplete_maintainers' => 'projects#autocomplete_maintainers', as: :autocomplete_maintainers
|
||||
get '/modify' => 'projects#edit', as: :edit_project
|
||||
patch '/' => 'projects#update', as: :project
|
||||
|
|
Loading…
Reference in New Issue