Merge branch 'dev'
This commit is contained in:
commit
63c2c2cc23
2
Gemfile
2
Gemfile
|
@ -21,6 +21,8 @@ gem "git"
|
||||||
gem "acts_as_list"
|
gem "acts_as_list"
|
||||||
gem 'rdiscount'
|
gem 'rdiscount'
|
||||||
|
|
||||||
|
gem 'acts-as-taggable-on', '~>2.1.0'
|
||||||
|
|
||||||
group :assets do
|
group :assets do
|
||||||
gem 'sass-rails', " ~> 3.1.0"
|
gem 'sass-rails', " ~> 3.1.0"
|
||||||
gem 'coffee-rails', "~> 3.1.0"
|
gem 'coffee-rails', "~> 3.1.0"
|
||||||
|
|
|
@ -54,6 +54,8 @@ GEM
|
||||||
activesupport (= 3.1.0)
|
activesupport (= 3.1.0)
|
||||||
activesupport (3.1.0)
|
activesupport (3.1.0)
|
||||||
multi_json (~> 1.0)
|
multi_json (~> 1.0)
|
||||||
|
acts-as-taggable-on (2.1.1)
|
||||||
|
rails
|
||||||
acts_as_list (0.1.4)
|
acts_as_list (0.1.4)
|
||||||
addressable (2.2.6)
|
addressable (2.2.6)
|
||||||
ansi (1.3.0)
|
ansi (1.3.0)
|
||||||
|
@ -246,6 +248,7 @@ PLATFORMS
|
||||||
ruby
|
ruby
|
||||||
|
|
||||||
DEPENDENCIES
|
DEPENDENCIES
|
||||||
|
acts-as-taggable-on (~> 2.1.0)
|
||||||
acts_as_list
|
acts_as_list
|
||||||
annotate!
|
annotate!
|
||||||
autotest
|
autotest
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 4.1 KiB |
BIN
app/assets/images/chosen-sprite.png
Normal file
BIN
app/assets/images/chosen-sprite.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 396 B |
|
@ -8,6 +8,7 @@
|
||||||
//= require jquery-ui
|
//= require jquery-ui
|
||||||
//= require jquery_ujs
|
//= require jquery_ujs
|
||||||
//= require jquery.ui.selectmenu
|
//= require jquery.ui.selectmenu
|
||||||
|
//= require jquery.tagify
|
||||||
//= require jquery.cookie
|
//= require jquery.cookie
|
||||||
//= require_tree .
|
//= require_tree .
|
||||||
|
|
||||||
|
@ -20,6 +21,6 @@ $(function(){
|
||||||
$('select#tag').selectmenu({style:'popup', width:200});
|
$('select#tag').selectmenu({style:'popup', width:200});
|
||||||
});
|
});
|
||||||
|
|
||||||
function updatePage(){
|
function updatePage(data){
|
||||||
$.ajax({type: "GET", url: location.href, dataType: "script"});
|
$.ajax({type: "GET", url: location.href, data: data, dataType: "script"});
|
||||||
}
|
}
|
||||||
|
|
901
app/assets/javascripts/chosen.jquery.js
Normal file
901
app/assets/javascripts/chosen.jquery.js
Normal file
|
@ -0,0 +1,901 @@
|
||||||
|
// Chosen, a Select Box Enhancer for jQuery and Protoype
|
||||||
|
// by Patrick Filler for Harvest, http://getharvest.com
|
||||||
|
//
|
||||||
|
// Version 0.9.5
|
||||||
|
// Full source at https://github.com/harvesthq/chosen
|
||||||
|
// Copyright (c) 2011 Harvest http://getharvest.com
|
||||||
|
|
||||||
|
// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
|
||||||
|
// This file is generated by `cake build`, do not edit it by hand.
|
||||||
|
(function() {
|
||||||
|
var SelectParser;
|
||||||
|
SelectParser = (function() {
|
||||||
|
function SelectParser() {
|
||||||
|
this.options_index = 0;
|
||||||
|
this.parsed = [];
|
||||||
|
}
|
||||||
|
SelectParser.prototype.add_node = function(child) {
|
||||||
|
if (child.nodeName === "OPTGROUP") {
|
||||||
|
return this.add_group(child);
|
||||||
|
} else {
|
||||||
|
return this.add_option(child);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
SelectParser.prototype.add_group = function(group) {
|
||||||
|
var group_position, option, _i, _len, _ref, _results;
|
||||||
|
group_position = this.parsed.length;
|
||||||
|
this.parsed.push({
|
||||||
|
array_index: group_position,
|
||||||
|
group: true,
|
||||||
|
label: group.label,
|
||||||
|
children: 0,
|
||||||
|
disabled: group.disabled
|
||||||
|
});
|
||||||
|
_ref = group.childNodes;
|
||||||
|
_results = [];
|
||||||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
option = _ref[_i];
|
||||||
|
_results.push(this.add_option(option, group_position, group.disabled));
|
||||||
|
}
|
||||||
|
return _results;
|
||||||
|
};
|
||||||
|
SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
|
||||||
|
if (option.nodeName === "OPTION") {
|
||||||
|
if (option.text !== "") {
|
||||||
|
if (group_position != null) {
|
||||||
|
this.parsed[group_position].children += 1;
|
||||||
|
}
|
||||||
|
this.parsed.push({
|
||||||
|
array_index: this.parsed.length,
|
||||||
|
options_index: this.options_index,
|
||||||
|
value: option.value,
|
||||||
|
text: option.text,
|
||||||
|
html: option.innerHTML,
|
||||||
|
selected: option.selected,
|
||||||
|
disabled: group_disabled === true ? group_disabled : option.disabled,
|
||||||
|
group_array_index: group_position,
|
||||||
|
classes: option.className,
|
||||||
|
style: option.style.cssText
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.parsed.push({
|
||||||
|
array_index: this.parsed.length,
|
||||||
|
options_index: this.options_index,
|
||||||
|
empty: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return this.options_index += 1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
return SelectParser;
|
||||||
|
})();
|
||||||
|
SelectParser.select_to_array = function(select) {
|
||||||
|
var child, parser, _i, _len, _ref;
|
||||||
|
parser = new SelectParser();
|
||||||
|
_ref = select.childNodes;
|
||||||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
child = _ref[_i];
|
||||||
|
parser.add_node(child);
|
||||||
|
}
|
||||||
|
return parser.parsed;
|
||||||
|
};
|
||||||
|
this.SelectParser = SelectParser;
|
||||||
|
}).call(this);
|
||||||
|
(function() {
|
||||||
|
/*
|
||||||
|
Chosen source: generate output using 'cake build'
|
||||||
|
Copyright (c) 2011 by Harvest
|
||||||
|
*/
|
||||||
|
var AbstractChosen, root;
|
||||||
|
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
||||||
|
root = this;
|
||||||
|
AbstractChosen = (function() {
|
||||||
|
function AbstractChosen(form_field, options) {
|
||||||
|
this.form_field = form_field;
|
||||||
|
this.options = options != null ? options : {};
|
||||||
|
this.set_default_values();
|
||||||
|
this.is_multiple = this.form_field.multiple;
|
||||||
|
this.default_text_default = this.is_multiple ? "Select Some Options" : "Select an Option";
|
||||||
|
this.setup();
|
||||||
|
this.set_up_html();
|
||||||
|
this.register_observers();
|
||||||
|
this.finish_setup();
|
||||||
|
}
|
||||||
|
AbstractChosen.prototype.set_default_values = function() {
|
||||||
|
this.click_test_action = __bind(function(evt) {
|
||||||
|
return this.test_active_click(evt);
|
||||||
|
}, this);
|
||||||
|
this.activate_action = __bind(function(evt) {
|
||||||
|
return this.activate_field(evt);
|
||||||
|
}, this);
|
||||||
|
this.active_field = false;
|
||||||
|
this.mouse_on_container = false;
|
||||||
|
this.results_showing = false;
|
||||||
|
this.result_highlighted = null;
|
||||||
|
this.result_single_selected = null;
|
||||||
|
this.allow_single_deselect = (this.options.allow_single_deselect != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false;
|
||||||
|
this.disable_search_threshold = this.options.disable_search_threshold || 0;
|
||||||
|
this.choices = 0;
|
||||||
|
return this.results_none_found = this.options.no_results_text || "No results match";
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.mouse_enter = function() {
|
||||||
|
return this.mouse_on_container = true;
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.mouse_leave = function() {
|
||||||
|
return this.mouse_on_container = false;
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.input_focus = function(evt) {
|
||||||
|
if (!this.active_field) {
|
||||||
|
return setTimeout((__bind(function() {
|
||||||
|
return this.container_mousedown();
|
||||||
|
}, this)), 50);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.input_blur = function(evt) {
|
||||||
|
if (!this.mouse_on_container) {
|
||||||
|
this.active_field = false;
|
||||||
|
return setTimeout((__bind(function() {
|
||||||
|
return this.blur_test();
|
||||||
|
}, this)), 100);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.result_add_option = function(option) {
|
||||||
|
var classes, style;
|
||||||
|
if (!option.disabled) {
|
||||||
|
option.dom_id = this.container_id + "_o_" + option.array_index;
|
||||||
|
classes = option.selected && this.is_multiple ? [] : ["active-result"];
|
||||||
|
if (option.selected) {
|
||||||
|
classes.push("result-selected");
|
||||||
|
}
|
||||||
|
if (option.group_array_index != null) {
|
||||||
|
classes.push("group-option");
|
||||||
|
}
|
||||||
|
if (option.classes !== "") {
|
||||||
|
classes.push(option.classes);
|
||||||
|
}
|
||||||
|
style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
|
||||||
|
return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.results_update_field = function() {
|
||||||
|
this.result_clear_highlight();
|
||||||
|
this.result_single_selected = null;
|
||||||
|
return this.results_build();
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.results_toggle = function() {
|
||||||
|
if (this.results_showing) {
|
||||||
|
return this.results_hide();
|
||||||
|
} else {
|
||||||
|
return this.results_show();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.results_search = function(evt) {
|
||||||
|
if (this.results_showing) {
|
||||||
|
return this.winnow_results();
|
||||||
|
} else {
|
||||||
|
return this.results_show();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.keyup_checker = function(evt) {
|
||||||
|
var stroke, _ref;
|
||||||
|
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
|
||||||
|
this.search_field_scale();
|
||||||
|
switch (stroke) {
|
||||||
|
case 8:
|
||||||
|
if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
|
||||||
|
return this.keydown_backstroke();
|
||||||
|
} else if (!this.pending_backstroke) {
|
||||||
|
this.result_clear_highlight();
|
||||||
|
return this.results_search();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
evt.preventDefault();
|
||||||
|
if (this.results_showing) {
|
||||||
|
return this.result_select(evt);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 27:
|
||||||
|
if (this.results_showing) {
|
||||||
|
return this.results_hide();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
case 38:
|
||||||
|
case 40:
|
||||||
|
case 16:
|
||||||
|
case 91:
|
||||||
|
case 17:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return this.results_search();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.generate_field_id = function() {
|
||||||
|
var new_id;
|
||||||
|
new_id = this.generate_random_id();
|
||||||
|
this.form_field.id = new_id;
|
||||||
|
return new_id;
|
||||||
|
};
|
||||||
|
AbstractChosen.prototype.generate_random_char = function() {
|
||||||
|
var chars, newchar, rand;
|
||||||
|
chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
|
||||||
|
rand = Math.floor(Math.random() * chars.length);
|
||||||
|
return newchar = chars.substring(rand, rand + 1);
|
||||||
|
};
|
||||||
|
return AbstractChosen;
|
||||||
|
})();
|
||||||
|
root.AbstractChosen = AbstractChosen;
|
||||||
|
}).call(this);
|
||||||
|
(function() {
|
||||||
|
/*
|
||||||
|
Chosen source: generate output using 'cake build'
|
||||||
|
Copyright (c) 2011 by Harvest
|
||||||
|
*/
|
||||||
|
var $, Chosen, get_side_border_padding, root;
|
||||||
|
var __hasProp = Object.prototype.hasOwnProperty, __extends = function(child, parent) {
|
||||||
|
for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }
|
||||||
|
function ctor() { this.constructor = child; }
|
||||||
|
ctor.prototype = parent.prototype;
|
||||||
|
child.prototype = new ctor;
|
||||||
|
child.__super__ = parent.prototype;
|
||||||
|
return child;
|
||||||
|
}, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
|
||||||
|
root = this;
|
||||||
|
$ = jQuery;
|
||||||
|
$.fn.extend({
|
||||||
|
chosen: function(options) {
|
||||||
|
if ($.browser.msie && ($.browser.version === "6.0" || $.browser.version === "7.0")) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
return $(this).each(function(input_field) {
|
||||||
|
if (!($(this)).hasClass("chzn-done")) {
|
||||||
|
return new Chosen(this, options);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Chosen = (function() {
|
||||||
|
__extends(Chosen, AbstractChosen);
|
||||||
|
function Chosen() {
|
||||||
|
Chosen.__super__.constructor.apply(this, arguments);
|
||||||
|
}
|
||||||
|
Chosen.prototype.setup = function() {
|
||||||
|
this.form_field_jq = $(this.form_field);
|
||||||
|
return this.is_rtl = this.form_field_jq.hasClass("chzn-rtl");
|
||||||
|
};
|
||||||
|
Chosen.prototype.finish_setup = function() {
|
||||||
|
return this.form_field_jq.addClass("chzn-done");
|
||||||
|
};
|
||||||
|
Chosen.prototype.set_up_html = function() {
|
||||||
|
var container_div, dd_top, dd_width, sf_width;
|
||||||
|
this.container_id = this.form_field.id.length ? this.form_field.id.replace(/(:|\.)/g, '_') : this.generate_field_id();
|
||||||
|
this.container_id += "_chzn";
|
||||||
|
this.f_width = this.form_field_jq.outerWidth();
|
||||||
|
this.default_text = this.form_field_jq.data('placeholder') ? this.form_field_jq.data('placeholder') : this.default_text_default;
|
||||||
|
container_div = $("<div />", {
|
||||||
|
id: this.container_id,
|
||||||
|
"class": "chzn-container" + (this.is_rtl ? ' chzn-rtl' : ''),
|
||||||
|
style: 'width: ' + this.f_width + 'px;'
|
||||||
|
});
|
||||||
|
if (this.is_multiple) {
|
||||||
|
container_div.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
|
||||||
|
} else {
|
||||||
|
container_div.html('<a href="javascript:void(0)" class="chzn-single"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
|
||||||
|
}
|
||||||
|
this.form_field_jq.hide().after(container_div);
|
||||||
|
this.container = $('#' + this.container_id);
|
||||||
|
this.container.addClass("chzn-container-" + (this.is_multiple ? "multi" : "single"));
|
||||||
|
this.dropdown = this.container.find('div.chzn-drop').first();
|
||||||
|
dd_top = this.container.height();
|
||||||
|
dd_width = this.f_width - get_side_border_padding(this.dropdown);
|
||||||
|
this.dropdown.css({
|
||||||
|
"width": dd_width + "px",
|
||||||
|
"top": dd_top + "px"
|
||||||
|
});
|
||||||
|
this.search_field = this.container.find('input').first();
|
||||||
|
this.search_results = this.container.find('ul.chzn-results').first();
|
||||||
|
this.search_field_scale();
|
||||||
|
this.search_no_results = this.container.find('li.no-results').first();
|
||||||
|
if (this.is_multiple) {
|
||||||
|
this.search_choices = this.container.find('ul.chzn-choices').first();
|
||||||
|
this.search_container = this.container.find('li.search-field').first();
|
||||||
|
} else {
|
||||||
|
this.search_container = this.container.find('div.chzn-search').first();
|
||||||
|
this.selected_item = this.container.find('.chzn-single').first();
|
||||||
|
sf_width = dd_width - get_side_border_padding(this.search_container) - get_side_border_padding(this.search_field);
|
||||||
|
this.search_field.css({
|
||||||
|
"width": sf_width + "px"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this.results_build();
|
||||||
|
this.set_tab_index();
|
||||||
|
return this.form_field_jq.trigger("liszt:ready", {
|
||||||
|
chosen: this
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Chosen.prototype.register_observers = function() {
|
||||||
|
this.container.mousedown(__bind(function(evt) {
|
||||||
|
return this.container_mousedown(evt);
|
||||||
|
}, this));
|
||||||
|
this.container.mouseup(__bind(function(evt) {
|
||||||
|
return this.container_mouseup(evt);
|
||||||
|
}, this));
|
||||||
|
this.container.mouseenter(__bind(function(evt) {
|
||||||
|
return this.mouse_enter(evt);
|
||||||
|
}, this));
|
||||||
|
this.container.mouseleave(__bind(function(evt) {
|
||||||
|
return this.mouse_leave(evt);
|
||||||
|
}, this));
|
||||||
|
this.search_results.mouseup(__bind(function(evt) {
|
||||||
|
return this.search_results_mouseup(evt);
|
||||||
|
}, this));
|
||||||
|
this.search_results.mouseover(__bind(function(evt) {
|
||||||
|
return this.search_results_mouseover(evt);
|
||||||
|
}, this));
|
||||||
|
this.search_results.mouseout(__bind(function(evt) {
|
||||||
|
return this.search_results_mouseout(evt);
|
||||||
|
}, this));
|
||||||
|
this.form_field_jq.bind("liszt:updated", __bind(function(evt) {
|
||||||
|
return this.results_update_field(evt);
|
||||||
|
}, this));
|
||||||
|
this.search_field.blur(__bind(function(evt) {
|
||||||
|
return this.input_blur(evt);
|
||||||
|
}, this));
|
||||||
|
this.search_field.keyup(__bind(function(evt) {
|
||||||
|
return this.keyup_checker(evt);
|
||||||
|
}, this));
|
||||||
|
this.search_field.keydown(__bind(function(evt) {
|
||||||
|
return this.keydown_checker(evt);
|
||||||
|
}, this));
|
||||||
|
if (this.is_multiple) {
|
||||||
|
this.search_choices.click(__bind(function(evt) {
|
||||||
|
return this.choices_click(evt);
|
||||||
|
}, this));
|
||||||
|
return this.search_field.focus(__bind(function(evt) {
|
||||||
|
return this.input_focus(evt);
|
||||||
|
}, this));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.search_field_disabled = function() {
|
||||||
|
this.is_disabled = this.form_field_jq[0].disabled;
|
||||||
|
if (this.is_disabled) {
|
||||||
|
this.container.addClass('chzn-disabled');
|
||||||
|
this.search_field[0].disabled = true;
|
||||||
|
if (!this.is_multiple) {
|
||||||
|
this.selected_item.unbind("focus", this.activate_action);
|
||||||
|
}
|
||||||
|
return this.close_field();
|
||||||
|
} else {
|
||||||
|
this.container.removeClass('chzn-disabled');
|
||||||
|
this.search_field[0].disabled = false;
|
||||||
|
if (!this.is_multiple) {
|
||||||
|
return this.selected_item.bind("focus", this.activate_action);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.container_mousedown = function(evt) {
|
||||||
|
var target_closelink;
|
||||||
|
if (!this.is_disabled) {
|
||||||
|
target_closelink = evt != null ? ($(evt.target)).hasClass("search-choice-close") : false;
|
||||||
|
if (evt && evt.type === "mousedown") {
|
||||||
|
evt.stopPropagation();
|
||||||
|
}
|
||||||
|
if (!this.pending_destroy_click && !target_closelink) {
|
||||||
|
if (!this.active_field) {
|
||||||
|
if (this.is_multiple) {
|
||||||
|
this.search_field.val("");
|
||||||
|
}
|
||||||
|
$(document).click(this.click_test_action);
|
||||||
|
this.results_show();
|
||||||
|
} else if (!this.is_multiple && evt && ($(evt.target) === this.selected_item || $(evt.target).parents("a.chzn-single").length)) {
|
||||||
|
evt.preventDefault();
|
||||||
|
this.results_toggle();
|
||||||
|
}
|
||||||
|
return this.activate_field();
|
||||||
|
} else {
|
||||||
|
return this.pending_destroy_click = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.container_mouseup = function(evt) {
|
||||||
|
if (evt.target.nodeName === "ABBR") {
|
||||||
|
return this.results_reset(evt);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.blur_test = function(evt) {
|
||||||
|
if (!this.active_field && this.container.hasClass("chzn-container-active")) {
|
||||||
|
return this.close_field();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.close_field = function() {
|
||||||
|
$(document).unbind("click", this.click_test_action);
|
||||||
|
if (!this.is_multiple) {
|
||||||
|
this.selected_item.attr("tabindex", this.search_field.attr("tabindex"));
|
||||||
|
this.search_field.attr("tabindex", -1);
|
||||||
|
}
|
||||||
|
this.active_field = false;
|
||||||
|
this.results_hide();
|
||||||
|
this.container.removeClass("chzn-container-active");
|
||||||
|
this.winnow_results_clear();
|
||||||
|
this.clear_backstroke();
|
||||||
|
this.show_search_field_default();
|
||||||
|
return this.search_field_scale();
|
||||||
|
};
|
||||||
|
Chosen.prototype.activate_field = function() {
|
||||||
|
if (!this.is_multiple && !this.active_field) {
|
||||||
|
this.search_field.attr("tabindex", this.selected_item.attr("tabindex"));
|
||||||
|
this.selected_item.attr("tabindex", -1);
|
||||||
|
}
|
||||||
|
this.container.addClass("chzn-container-active");
|
||||||
|
this.active_field = true;
|
||||||
|
this.search_field.val(this.search_field.val());
|
||||||
|
return this.search_field.focus();
|
||||||
|
};
|
||||||
|
Chosen.prototype.test_active_click = function(evt) {
|
||||||
|
if ($(evt.target).parents('#' + this.container_id).length) {
|
||||||
|
return this.active_field = true;
|
||||||
|
} else {
|
||||||
|
return this.close_field();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.results_build = function() {
|
||||||
|
var content, data, startTime, _i, _len, _ref;
|
||||||
|
startTime = new Date();
|
||||||
|
this.parsing = true;
|
||||||
|
this.results_data = root.SelectParser.select_to_array(this.form_field);
|
||||||
|
if (this.is_multiple && this.choices > 0) {
|
||||||
|
this.search_choices.find("li.search-choice").remove();
|
||||||
|
this.choices = 0;
|
||||||
|
} else if (!this.is_multiple) {
|
||||||
|
this.selected_item.find("span").text(this.default_text);
|
||||||
|
if (this.form_field.options.length <= this.disable_search_threshold) {
|
||||||
|
this.container.addClass("chzn-container-single-nosearch");
|
||||||
|
} else {
|
||||||
|
this.container.removeClass("chzn-container-single-nosearch");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
content = '';
|
||||||
|
_ref = this.results_data;
|
||||||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
data = _ref[_i];
|
||||||
|
if (data.group) {
|
||||||
|
content += this.result_add_group(data);
|
||||||
|
} else if (!data.empty) {
|
||||||
|
content += this.result_add_option(data);
|
||||||
|
if (data.selected && this.is_multiple) {
|
||||||
|
this.choice_build(data);
|
||||||
|
} else if (data.selected && !this.is_multiple) {
|
||||||
|
this.selected_item.find("span").text(data.text);
|
||||||
|
if (this.allow_single_deselect) {
|
||||||
|
this.single_deselect_control_build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.search_field_disabled();
|
||||||
|
this.show_search_field_default();
|
||||||
|
this.search_field_scale();
|
||||||
|
this.search_results.html(content);
|
||||||
|
return this.parsing = false;
|
||||||
|
};
|
||||||
|
Chosen.prototype.result_add_group = function(group) {
|
||||||
|
if (!group.disabled) {
|
||||||
|
group.dom_id = this.container_id + "_g_" + group.array_index;
|
||||||
|
return '<li id="' + group.dom_id + '" class="group-result">' + $("<div />").text(group.label).html() + '</li>';
|
||||||
|
} else {
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.result_do_highlight = function(el) {
|
||||||
|
var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
|
||||||
|
if (el.length) {
|
||||||
|
this.result_clear_highlight();
|
||||||
|
this.result_highlight = el;
|
||||||
|
this.result_highlight.addClass("highlighted");
|
||||||
|
maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
|
||||||
|
visible_top = this.search_results.scrollTop();
|
||||||
|
visible_bottom = maxHeight + visible_top;
|
||||||
|
high_top = this.result_highlight.position().top + this.search_results.scrollTop();
|
||||||
|
high_bottom = high_top + this.result_highlight.outerHeight();
|
||||||
|
if (high_bottom >= visible_bottom) {
|
||||||
|
return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
|
||||||
|
} else if (high_top < visible_top) {
|
||||||
|
return this.search_results.scrollTop(high_top);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.result_clear_highlight = function() {
|
||||||
|
if (this.result_highlight) {
|
||||||
|
this.result_highlight.removeClass("highlighted");
|
||||||
|
}
|
||||||
|
return this.result_highlight = null;
|
||||||
|
};
|
||||||
|
Chosen.prototype.results_show = function() {
|
||||||
|
var dd_top;
|
||||||
|
if (!this.is_multiple) {
|
||||||
|
this.selected_item.addClass("chzn-single-with-drop");
|
||||||
|
if (this.result_single_selected) {
|
||||||
|
this.result_do_highlight(this.result_single_selected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
dd_top = this.is_multiple ? this.container.height() : this.container.height() - 1;
|
||||||
|
this.dropdown.css({
|
||||||
|
"top": dd_top + "px",
|
||||||
|
"left": 0
|
||||||
|
});
|
||||||
|
this.results_showing = true;
|
||||||
|
this.search_field.focus();
|
||||||
|
this.search_field.val(this.search_field.val());
|
||||||
|
return this.winnow_results();
|
||||||
|
};
|
||||||
|
Chosen.prototype.results_hide = function() {
|
||||||
|
if (!this.is_multiple) {
|
||||||
|
this.selected_item.removeClass("chzn-single-with-drop");
|
||||||
|
}
|
||||||
|
this.result_clear_highlight();
|
||||||
|
this.dropdown.css({
|
||||||
|
"left": "-9000px"
|
||||||
|
});
|
||||||
|
return this.results_showing = false;
|
||||||
|
};
|
||||||
|
Chosen.prototype.set_tab_index = function(el) {
|
||||||
|
var ti;
|
||||||
|
if (this.form_field_jq.attr("tabindex")) {
|
||||||
|
ti = this.form_field_jq.attr("tabindex");
|
||||||
|
this.form_field_jq.attr("tabindex", -1);
|
||||||
|
if (this.is_multiple) {
|
||||||
|
return this.search_field.attr("tabindex", ti);
|
||||||
|
} else {
|
||||||
|
this.selected_item.attr("tabindex", ti);
|
||||||
|
return this.search_field.attr("tabindex", -1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.show_search_field_default = function() {
|
||||||
|
if (this.is_multiple && this.choices < 1 && !this.active_field) {
|
||||||
|
this.search_field.val(this.default_text);
|
||||||
|
return this.search_field.addClass("default");
|
||||||
|
} else {
|
||||||
|
this.search_field.val("");
|
||||||
|
return this.search_field.removeClass("default");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.search_results_mouseup = function(evt) {
|
||||||
|
var target;
|
||||||
|
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
|
||||||
|
if (target.length) {
|
||||||
|
this.result_highlight = target;
|
||||||
|
return this.result_select(evt);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.search_results_mouseover = function(evt) {
|
||||||
|
var target;
|
||||||
|
target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
|
||||||
|
if (target) {
|
||||||
|
return this.result_do_highlight(target);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.search_results_mouseout = function(evt) {
|
||||||
|
if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
|
||||||
|
return this.result_clear_highlight();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.choices_click = function(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
if (this.active_field && !($(evt.target).hasClass("search-choice" || $(evt.target).parents('.search-choice').first)) && !this.results_showing) {
|
||||||
|
return this.results_show();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.choice_build = function(item) {
|
||||||
|
var choice_id, link;
|
||||||
|
choice_id = this.container_id + "_c_" + item.array_index;
|
||||||
|
this.choices += 1;
|
||||||
|
this.search_container.before('<li class="search-choice" id="' + choice_id + '"><span>' + item.html + '</span><a href="javascript:void(0)" class="search-choice-close" rel="' + item.array_index + '"></a></li>');
|
||||||
|
link = $('#' + choice_id).find("a").first();
|
||||||
|
return link.click(__bind(function(evt) {
|
||||||
|
return this.choice_destroy_link_click(evt);
|
||||||
|
}, this));
|
||||||
|
};
|
||||||
|
Chosen.prototype.choice_destroy_link_click = function(evt) {
|
||||||
|
evt.preventDefault();
|
||||||
|
if (!this.is_disabled) {
|
||||||
|
this.pending_destroy_click = true;
|
||||||
|
return this.choice_destroy($(evt.target));
|
||||||
|
} else {
|
||||||
|
return evt.stopPropagation;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.choice_destroy = function(link) {
|
||||||
|
this.choices -= 1;
|
||||||
|
this.show_search_field_default();
|
||||||
|
if (this.is_multiple && this.choices > 0 && this.search_field.val().length < 1) {
|
||||||
|
this.results_hide();
|
||||||
|
}
|
||||||
|
this.result_deselect(link.attr("rel"));
|
||||||
|
return link.parents('li').first().remove();
|
||||||
|
};
|
||||||
|
Chosen.prototype.results_reset = function(evt) {
|
||||||
|
this.form_field.options[0].selected = true;
|
||||||
|
this.selected_item.find("span").text(this.default_text);
|
||||||
|
this.show_search_field_default();
|
||||||
|
$(evt.target).remove();
|
||||||
|
this.form_field_jq.trigger("change");
|
||||||
|
if (this.active_field) {
|
||||||
|
return this.results_hide();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.result_select = function(evt) {
|
||||||
|
var high, high_id, item, position;
|
||||||
|
if (this.result_highlight) {
|
||||||
|
high = this.result_highlight;
|
||||||
|
high_id = high.attr("id");
|
||||||
|
this.result_clear_highlight();
|
||||||
|
if (this.is_multiple) {
|
||||||
|
this.result_deactivate(high);
|
||||||
|
} else {
|
||||||
|
this.search_results.find(".result-selected").removeClass("result-selected");
|
||||||
|
this.result_single_selected = high;
|
||||||
|
}
|
||||||
|
high.addClass("result-selected");
|
||||||
|
position = high_id.substr(high_id.lastIndexOf("_") + 1);
|
||||||
|
item = this.results_data[position];
|
||||||
|
item.selected = true;
|
||||||
|
this.form_field.options[item.options_index].selected = true;
|
||||||
|
if (this.is_multiple) {
|
||||||
|
this.choice_build(item);
|
||||||
|
} else {
|
||||||
|
this.selected_item.find("span").first().text(item.text);
|
||||||
|
if (this.allow_single_deselect) {
|
||||||
|
this.single_deselect_control_build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(evt.metaKey && this.is_multiple)) {
|
||||||
|
this.results_hide();
|
||||||
|
}
|
||||||
|
this.search_field.val("");
|
||||||
|
this.form_field_jq.trigger("change");
|
||||||
|
return this.search_field_scale();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.result_activate = function(el) {
|
||||||
|
return el.addClass("active-result");
|
||||||
|
};
|
||||||
|
Chosen.prototype.result_deactivate = function(el) {
|
||||||
|
return el.removeClass("active-result");
|
||||||
|
};
|
||||||
|
Chosen.prototype.result_deselect = function(pos) {
|
||||||
|
var result, result_data;
|
||||||
|
result_data = this.results_data[pos];
|
||||||
|
result_data.selected = false;
|
||||||
|
this.form_field.options[result_data.options_index].selected = false;
|
||||||
|
result = $("#" + this.container_id + "_o_" + pos);
|
||||||
|
result.removeClass("result-selected").addClass("active-result").show();
|
||||||
|
this.result_clear_highlight();
|
||||||
|
this.winnow_results();
|
||||||
|
this.form_field_jq.trigger("change");
|
||||||
|
return this.search_field_scale();
|
||||||
|
};
|
||||||
|
Chosen.prototype.single_deselect_control_build = function() {
|
||||||
|
if (this.allow_single_deselect && this.selected_item.find("abbr").length < 1) {
|
||||||
|
return this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.winnow_results = function() {
|
||||||
|
var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
|
||||||
|
startTime = new Date();
|
||||||
|
this.no_results_clear();
|
||||||
|
results = 0;
|
||||||
|
searchText = this.search_field.val() === this.default_text ? "" : $('<div/>').text($.trim(this.search_field.val())).html();
|
||||||
|
regex = new RegExp('^' + searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
|
||||||
|
zregex = new RegExp(searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), 'i');
|
||||||
|
_ref = this.results_data;
|
||||||
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
||||||
|
option = _ref[_i];
|
||||||
|
if (!option.disabled && !option.empty) {
|
||||||
|
if (option.group) {
|
||||||
|
$('#' + option.dom_id).hide();
|
||||||
|
} else if (!(this.is_multiple && option.selected)) {
|
||||||
|
found = false;
|
||||||
|
result_id = option.dom_id;
|
||||||
|
if (regex.test(option.html)) {
|
||||||
|
found = true;
|
||||||
|
results += 1;
|
||||||
|
} else if (option.html.indexOf(" ") >= 0 || option.html.indexOf("[") === 0) {
|
||||||
|
parts = option.html.replace(/\[|\]/g, "").split(" ");
|
||||||
|
if (parts.length) {
|
||||||
|
for (_j = 0, _len2 = parts.length; _j < _len2; _j++) {
|
||||||
|
part = parts[_j];
|
||||||
|
if (regex.test(part)) {
|
||||||
|
found = true;
|
||||||
|
results += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
if (searchText.length) {
|
||||||
|
startpos = option.html.search(zregex);
|
||||||
|
text = option.html.substr(0, startpos + searchText.length) + '</em>' + option.html.substr(startpos + searchText.length);
|
||||||
|
text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
|
||||||
|
} else {
|
||||||
|
text = option.html;
|
||||||
|
}
|
||||||
|
if ($("#" + result_id).html !== text) {
|
||||||
|
$("#" + result_id).html(text);
|
||||||
|
}
|
||||||
|
this.result_activate($("#" + result_id));
|
||||||
|
if (option.group_array_index != null) {
|
||||||
|
$("#" + this.results_data[option.group_array_index].dom_id).show();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this.result_highlight && result_id === this.result_highlight.attr('id')) {
|
||||||
|
this.result_clear_highlight();
|
||||||
|
}
|
||||||
|
this.result_deactivate($("#" + result_id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (results < 1 && searchText.length) {
|
||||||
|
return this.no_results(searchText);
|
||||||
|
} else {
|
||||||
|
return this.winnow_results_set_highlight();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.winnow_results_clear = function() {
|
||||||
|
var li, lis, _i, _len, _results;
|
||||||
|
this.search_field.val("");
|
||||||
|
lis = this.search_results.find("li");
|
||||||
|
_results = [];
|
||||||
|
for (_i = 0, _len = lis.length; _i < _len; _i++) {
|
||||||
|
li = lis[_i];
|
||||||
|
li = $(li);
|
||||||
|
_results.push(li.hasClass("group-result") ? li.show() : !this.is_multiple || !li.hasClass("result-selected") ? this.result_activate(li) : void 0);
|
||||||
|
}
|
||||||
|
return _results;
|
||||||
|
};
|
||||||
|
Chosen.prototype.winnow_results_set_highlight = function() {
|
||||||
|
var do_high, selected_results;
|
||||||
|
if (!this.result_highlight) {
|
||||||
|
selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
|
||||||
|
do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
|
||||||
|
if (do_high != null) {
|
||||||
|
return this.result_do_highlight(do_high);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.no_results = function(terms) {
|
||||||
|
var no_results_html;
|
||||||
|
no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
|
||||||
|
no_results_html.find("span").first().html(terms);
|
||||||
|
return this.search_results.append(no_results_html);
|
||||||
|
};
|
||||||
|
Chosen.prototype.no_results_clear = function() {
|
||||||
|
return this.search_results.find(".no-results").remove();
|
||||||
|
};
|
||||||
|
Chosen.prototype.keydown_arrow = function() {
|
||||||
|
var first_active, next_sib;
|
||||||
|
if (!this.result_highlight) {
|
||||||
|
first_active = this.search_results.find("li.active-result").first();
|
||||||
|
if (first_active) {
|
||||||
|
this.result_do_highlight($(first_active));
|
||||||
|
}
|
||||||
|
} else if (this.results_showing) {
|
||||||
|
next_sib = this.result_highlight.nextAll("li.active-result").first();
|
||||||
|
if (next_sib) {
|
||||||
|
this.result_do_highlight(next_sib);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!this.results_showing) {
|
||||||
|
return this.results_show();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.keyup_arrow = function() {
|
||||||
|
var prev_sibs;
|
||||||
|
if (!this.results_showing && !this.is_multiple) {
|
||||||
|
return this.results_show();
|
||||||
|
} else if (this.result_highlight) {
|
||||||
|
prev_sibs = this.result_highlight.prevAll("li.active-result");
|
||||||
|
if (prev_sibs.length) {
|
||||||
|
return this.result_do_highlight(prev_sibs.first());
|
||||||
|
} else {
|
||||||
|
if (this.choices > 0) {
|
||||||
|
this.results_hide();
|
||||||
|
}
|
||||||
|
return this.result_clear_highlight();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.keydown_backstroke = function() {
|
||||||
|
if (this.pending_backstroke) {
|
||||||
|
this.choice_destroy(this.pending_backstroke.find("a").first());
|
||||||
|
return this.clear_backstroke();
|
||||||
|
} else {
|
||||||
|
this.pending_backstroke = this.search_container.siblings("li.search-choice").last();
|
||||||
|
return this.pending_backstroke.addClass("search-choice-focus");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.clear_backstroke = function() {
|
||||||
|
if (this.pending_backstroke) {
|
||||||
|
this.pending_backstroke.removeClass("search-choice-focus");
|
||||||
|
}
|
||||||
|
return this.pending_backstroke = null;
|
||||||
|
};
|
||||||
|
Chosen.prototype.keydown_checker = function(evt) {
|
||||||
|
var stroke, _ref;
|
||||||
|
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
|
||||||
|
this.search_field_scale();
|
||||||
|
if (stroke !== 8 && this.pending_backstroke) {
|
||||||
|
this.clear_backstroke();
|
||||||
|
}
|
||||||
|
switch (stroke) {
|
||||||
|
case 8:
|
||||||
|
this.backstroke_length = this.search_field.val().length;
|
||||||
|
break;
|
||||||
|
case 9:
|
||||||
|
if (this.results_showing && !this.is_multiple) {
|
||||||
|
this.result_select(evt);
|
||||||
|
}
|
||||||
|
this.mouse_on_container = false;
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
evt.preventDefault();
|
||||||
|
break;
|
||||||
|
case 38:
|
||||||
|
evt.preventDefault();
|
||||||
|
this.keyup_arrow();
|
||||||
|
break;
|
||||||
|
case 40:
|
||||||
|
this.keydown_arrow();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.search_field_scale = function() {
|
||||||
|
var dd_top, div, h, style, style_block, styles, w, _i, _len;
|
||||||
|
if (this.is_multiple) {
|
||||||
|
h = 0;
|
||||||
|
w = 0;
|
||||||
|
style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
|
||||||
|
styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
|
||||||
|
for (_i = 0, _len = styles.length; _i < _len; _i++) {
|
||||||
|
style = styles[_i];
|
||||||
|
style_block += style + ":" + this.search_field.css(style) + ";";
|
||||||
|
}
|
||||||
|
div = $('<div />', {
|
||||||
|
'style': style_block
|
||||||
|
});
|
||||||
|
div.text(this.search_field.val());
|
||||||
|
$('body').append(div);
|
||||||
|
w = div.width() + 25;
|
||||||
|
div.remove();
|
||||||
|
if (w > this.f_width - 10) {
|
||||||
|
w = this.f_width - 10;
|
||||||
|
}
|
||||||
|
this.search_field.css({
|
||||||
|
'width': w + 'px'
|
||||||
|
});
|
||||||
|
dd_top = this.container.height();
|
||||||
|
return this.dropdown.css({
|
||||||
|
"top": dd_top + "px"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Chosen.prototype.generate_random_id = function() {
|
||||||
|
var string;
|
||||||
|
string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char();
|
||||||
|
while ($("#" + string).length > 0) {
|
||||||
|
string += this.generate_random_char();
|
||||||
|
}
|
||||||
|
return string;
|
||||||
|
};
|
||||||
|
return Chosen;
|
||||||
|
})();
|
||||||
|
get_side_border_padding = function(elmt) {
|
||||||
|
var side_border_padding;
|
||||||
|
return side_border_padding = elmt.outerWidth() - elmt.width();
|
||||||
|
};
|
||||||
|
root.get_side_border_padding = get_side_border_padding;
|
||||||
|
}).call(this);
|
|
@ -7,3 +7,51 @@ $(document).ready(function(){
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var CommitsList = {
|
||||||
|
|
||||||
|
ref:null,
|
||||||
|
limit:0,
|
||||||
|
offset:0,
|
||||||
|
|
||||||
|
init:
|
||||||
|
function(ref, limit) {
|
||||||
|
this.ref=ref;
|
||||||
|
this.limit=limit;
|
||||||
|
this.offset=limit;
|
||||||
|
this.initLoadMore();
|
||||||
|
$('.loading').show();
|
||||||
|
},
|
||||||
|
|
||||||
|
getOld:
|
||||||
|
function() {
|
||||||
|
$('.loading').show();
|
||||||
|
$.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: location.href,
|
||||||
|
data: "limit=" + this.limit + "&offset=" + this.offset + "&ref=" + this.ref,
|
||||||
|
complete: function(){ $('.loading').hide()},
|
||||||
|
dataType: "script"});
|
||||||
|
},
|
||||||
|
|
||||||
|
append:
|
||||||
|
function(count, html) {
|
||||||
|
$("#commits_list").append(html);
|
||||||
|
if(count > 0) {
|
||||||
|
this.offset += count;
|
||||||
|
this.initLoadMore();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
initLoadMore:
|
||||||
|
function() {
|
||||||
|
$(window).bind('scroll', function(){
|
||||||
|
if($(window).scrollTop() == $(document).height() - $(window).height()){
|
||||||
|
$(window).unbind('scroll');
|
||||||
|
CommitsList.getOld();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
87
app/assets/javascripts/note.js
Normal file
87
app/assets/javascripts/note.js
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
var NoteList = {
|
||||||
|
|
||||||
|
first_id: 0,
|
||||||
|
last_id: 0,
|
||||||
|
resource_name: null,
|
||||||
|
|
||||||
|
init:
|
||||||
|
function(resource_name, first_id, last_id) {
|
||||||
|
this.resource_name = resource_name;
|
||||||
|
this.first_id = first_id;
|
||||||
|
this.last_id = last_id;
|
||||||
|
this.initRefresh();
|
||||||
|
this.initLoadMore();
|
||||||
|
},
|
||||||
|
|
||||||
|
getOld:
|
||||||
|
function() {
|
||||||
|
$('.loading').show();
|
||||||
|
$.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: location.href,
|
||||||
|
data: "first_id=" + this.first_id,
|
||||||
|
complete: function(){ $('.loading').hide()},
|
||||||
|
dataType: "script"});
|
||||||
|
},
|
||||||
|
|
||||||
|
append:
|
||||||
|
function(id, html) {
|
||||||
|
this.first_id = id;
|
||||||
|
$("#notes-list").append(html);
|
||||||
|
this.initLoadMore();
|
||||||
|
},
|
||||||
|
|
||||||
|
replace:
|
||||||
|
function(fid, lid, html) {
|
||||||
|
this.first_id = fid;
|
||||||
|
this.last_id = lid;
|
||||||
|
$("#notes-list").html(html);
|
||||||
|
this.initLoadMore();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
prepend:
|
||||||
|
function(id, html) {
|
||||||
|
this.last_id = id;
|
||||||
|
$("#notes-list").prepend(html);
|
||||||
|
},
|
||||||
|
|
||||||
|
getNew:
|
||||||
|
function() {
|
||||||
|
// refersh notes list
|
||||||
|
$.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: location.href,
|
||||||
|
data: "last_id=" + this.last_id,
|
||||||
|
dataType: "script"});
|
||||||
|
},
|
||||||
|
|
||||||
|
refresh:
|
||||||
|
function() {
|
||||||
|
// refersh notes list
|
||||||
|
$.ajax({
|
||||||
|
type: "GET",
|
||||||
|
url: location.href,
|
||||||
|
data: "first_id=" + this.first_id + "&last_id=" + this.last_id,
|
||||||
|
dataType: "script"});
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
initRefresh:
|
||||||
|
function() {
|
||||||
|
// init timer
|
||||||
|
var intNew = setInterval("NoteList.getNew()", 15000);
|
||||||
|
var intRefresh = setInterval("NoteList.refresh()", 90000);
|
||||||
|
},
|
||||||
|
|
||||||
|
initLoadMore:
|
||||||
|
function() {
|
||||||
|
$(window).bind('scroll', function(){
|
||||||
|
if($(window).scrollTop() == $(document).height() - $(window).height()){
|
||||||
|
$(window).unbind('scroll');
|
||||||
|
NoteList.getOld();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,6 +4,7 @@
|
||||||
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
* the top of the compiled file, but it's generally better to create a new file per style scope.
|
||||||
*= require jquery-ui/jquery-ui
|
*= require jquery-ui/jquery-ui
|
||||||
*= require jquery-ui/jquery.ui.selectmenu
|
*= require jquery-ui/jquery.ui.selectmenu
|
||||||
|
*= require jquery-ui/jquery.tagify
|
||||||
*= require_self
|
*= require_self
|
||||||
*= require_tree .
|
*= require_tree .
|
||||||
*/
|
*/
|
||||||
|
|
367
app/assets/stylesheets/chosen.css
Normal file
367
app/assets/stylesheets/chosen.css
Normal file
|
@ -0,0 +1,367 @@
|
||||||
|
/* @group Base */
|
||||||
|
.chzn-container {
|
||||||
|
font-size: 13px;
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
zoom: 1;
|
||||||
|
*display: inline;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-drop {
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
border-top: 0;
|
||||||
|
position: absolute;
|
||||||
|
top: 29px;
|
||||||
|
left: 0;
|
||||||
|
-webkit-box-shadow: 0 4px 5px rgba(0,0,0,.15);
|
||||||
|
-moz-box-shadow : 0 4px 5px rgba(0,0,0,.15);
|
||||||
|
-o-box-shadow : 0 4px 5px rgba(0,0,0,.15);
|
||||||
|
box-shadow : 0 4px 5px rgba(0,0,0,.15);
|
||||||
|
z-index: 999;
|
||||||
|
}
|
||||||
|
/* @end */
|
||||||
|
|
||||||
|
/* @group Single Chosen */
|
||||||
|
.chzn-container-single .chzn-single {
|
||||||
|
background-color: #fff;
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%);
|
||||||
|
background-image: -o-linear-gradient(top, #eeeeee 0%,#ffffff 50%);
|
||||||
|
background-image: -ms-linear-gradient(top, #eeeeee 0%,#ffffff 50%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#eeeeee', endColorstr='#ffffff',GradientType=0 );
|
||||||
|
background-image: linear-gradient(top, #eeeeee 0%,#ffffff 50%);
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
-moz-border-radius : 4px;
|
||||||
|
border-radius : 4px;
|
||||||
|
-moz-background-clip : padding;
|
||||||
|
-webkit-background-clip: padding-box;
|
||||||
|
background-clip : padding-box;
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
position: relative;
|
||||||
|
height: 26px;
|
||||||
|
line-height: 26px;
|
||||||
|
padding: 0 0 0 8px;
|
||||||
|
color: #444;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.chzn-container-single .chzn-single span {
|
||||||
|
margin-right: 26px;
|
||||||
|
display: block;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
-o-text-overflow: ellipsis;
|
||||||
|
-ms-text-overflow: ellipsis;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
}
|
||||||
|
.chzn-container-single .chzn-single abbr {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
right: 26px;
|
||||||
|
top: 8px;
|
||||||
|
width: 12px;
|
||||||
|
height: 13px;
|
||||||
|
font-size: 1px;
|
||||||
|
background: url(chosen-sprite.png) right top no-repeat;
|
||||||
|
}
|
||||||
|
.chzn-container-single .chzn-single abbr:hover {
|
||||||
|
background-position: right -11px;
|
||||||
|
}
|
||||||
|
.chzn-container-single .chzn-single div {
|
||||||
|
-webkit-border-radius: 0 4px 4px 0;
|
||||||
|
-moz-border-radius : 0 4px 4px 0;
|
||||||
|
border-radius : 0 4px 4px 0;
|
||||||
|
-moz-background-clip : padding;
|
||||||
|
-webkit-background-clip: padding-box;
|
||||||
|
background-clip : padding-box;
|
||||||
|
background: #ccc;
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
|
||||||
|
background-image: -o-linear-gradient(bottom, #ccc 0%, #eee 60%);
|
||||||
|
background-image: -ms-linear-gradient(top, #cccccc 0%,#eeeeee 60%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cccccc', endColorstr='#eeeeee',GradientType=0 );
|
||||||
|
background-image: linear-gradient(top, #cccccc 0%,#eeeeee 60%);
|
||||||
|
border-left: 1px solid #aaa;
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 0;
|
||||||
|
display: block;
|
||||||
|
height: 100%;
|
||||||
|
width: 18px;
|
||||||
|
}
|
||||||
|
.chzn-container-single .chzn-single div b {
|
||||||
|
background: url('chosen-sprite.png') no-repeat 0 1px;
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
.chzn-container-single .chzn-search {
|
||||||
|
padding: 3px 4px;
|
||||||
|
position: relative;
|
||||||
|
margin: 0;
|
||||||
|
white-space: nowrap;
|
||||||
|
z-index: 1010;
|
||||||
|
}
|
||||||
|
.chzn-container-single .chzn-search input {
|
||||||
|
background: #fff url('chosen-sprite.png') no-repeat 100% -22px;
|
||||||
|
background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
|
||||||
|
background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||||
|
background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||||
|
background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
|
||||||
|
background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||||
|
background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||||
|
margin: 1px 0;
|
||||||
|
padding: 4px 20px 4px 5px;
|
||||||
|
outline: 0;
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
.chzn-container-single .chzn-drop {
|
||||||
|
-webkit-border-radius: 0 0 4px 4px;
|
||||||
|
-moz-border-radius : 0 0 4px 4px;
|
||||||
|
border-radius : 0 0 4px 4px;
|
||||||
|
-moz-background-clip : padding;
|
||||||
|
-webkit-background-clip: padding-box;
|
||||||
|
background-clip : padding-box;
|
||||||
|
}
|
||||||
|
/* @end */
|
||||||
|
|
||||||
|
.chzn-container-single-nosearch .chzn-search input {
|
||||||
|
position: absolute;
|
||||||
|
left: -9000px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @group Multi Chosen */
|
||||||
|
.chzn-container-multi .chzn-choices {
|
||||||
|
background-color: #fff;
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||||
|
background-image: -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
|
||||||
|
background-image: -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
|
||||||
|
background-image: linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
cursor: text;
|
||||||
|
overflow: hidden;
|
||||||
|
height: auto !important;
|
||||||
|
height: 1%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices li {
|
||||||
|
float: left;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-field {
|
||||||
|
white-space: nowrap;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-field input {
|
||||||
|
color: #666;
|
||||||
|
background: transparent !important;
|
||||||
|
border: 0 !important;
|
||||||
|
padding: 5px;
|
||||||
|
margin: 1px 0;
|
||||||
|
outline: 0;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
-moz-box-shadow : none;
|
||||||
|
-o-box-shadow : none;
|
||||||
|
box-shadow : none;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-field .default {
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-choice {
|
||||||
|
-webkit-border-radius: 3px;
|
||||||
|
-moz-border-radius : 3px;
|
||||||
|
border-radius : 3px;
|
||||||
|
-moz-background-clip : padding;
|
||||||
|
-webkit-background-clip: padding-box;
|
||||||
|
background-clip : padding-box;
|
||||||
|
background-color: #e4e4e4;
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #e4e4e4), color-stop(0.7, #eeeeee));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, #e4e4e4 0%, #eeeeee 70%);
|
||||||
|
background-image: -o-linear-gradient(bottom, #e4e4e4 0%, #eeeeee 70%);
|
||||||
|
background-image: -ms-linear-gradient(top, #e4e4e4 0%,#eeeeee 70%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e4e4e4', endColorstr='#eeeeee',GradientType=0 );
|
||||||
|
background-image: linear-gradient(top, #e4e4e4 0%,#eeeeee 70%);
|
||||||
|
color: #333;
|
||||||
|
border: 1px solid #b4b4b4;
|
||||||
|
line-height: 13px;
|
||||||
|
padding: 3px 19px 3px 6px;
|
||||||
|
margin: 3px 0 3px 5px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-choice span {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-choice-focus {
|
||||||
|
background: #d4d4d4;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
right: 3px;
|
||||||
|
top: 4px;
|
||||||
|
width: 12px;
|
||||||
|
height: 13px;
|
||||||
|
font-size: 1px;
|
||||||
|
background: url(chosen-sprite.png) right top no-repeat;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
|
||||||
|
background-position: right -11px;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
|
||||||
|
background-position: right -11px;
|
||||||
|
}
|
||||||
|
/* @end */
|
||||||
|
|
||||||
|
/* @group Results */
|
||||||
|
.chzn-container .chzn-results {
|
||||||
|
margin: 0 4px 4px 0;
|
||||||
|
max-height: 190px;
|
||||||
|
padding: 0 0 0 4px;
|
||||||
|
position: relative;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-results {
|
||||||
|
margin: -1px 0 0;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-results li {
|
||||||
|
display: none;
|
||||||
|
line-height: 80%;
|
||||||
|
padding: 7px 7px 8px;
|
||||||
|
margin: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-results .active-result {
|
||||||
|
cursor: pointer;
|
||||||
|
display: list-item;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-results .highlighted {
|
||||||
|
background: #3875d7;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-results li em {
|
||||||
|
background: #feffde;
|
||||||
|
font-style: normal;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-results .highlighted em {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-results .no-results {
|
||||||
|
background: #f4f4f4;
|
||||||
|
display: list-item;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-results .group-result {
|
||||||
|
cursor: default;
|
||||||
|
color: #999;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.chzn-container .chzn-results .group-option {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
.chzn-container-multi .chzn-drop .result-selected {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
/* @end */
|
||||||
|
|
||||||
|
/* @group Active */
|
||||||
|
.chzn-container-active .chzn-single {
|
||||||
|
-webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
|
||||||
|
-moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
|
||||||
|
-o-box-shadow : 0 0 5px rgba(0,0,0,.3);
|
||||||
|
box-shadow : 0 0 5px rgba(0,0,0,.3);
|
||||||
|
border: 1px solid #5897fb;
|
||||||
|
}
|
||||||
|
.chzn-container-active .chzn-single-with-drop {
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
-webkit-box-shadow: 0 1px 0 #fff inset;
|
||||||
|
-moz-box-shadow : 0 1px 0 #fff inset;
|
||||||
|
-o-box-shadow : 0 1px 0 #fff inset;
|
||||||
|
box-shadow : 0 1px 0 #fff inset;
|
||||||
|
background-color: #eee;
|
||||||
|
background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, white), color-stop(0.5, #eeeeee));
|
||||||
|
background-image: -webkit-linear-gradient(center bottom, white 0%, #eeeeee 50%);
|
||||||
|
background-image: -moz-linear-gradient(center bottom, white 0%, #eeeeee 50%);
|
||||||
|
background-image: -o-linear-gradient(bottom, white 0%, #eeeeee 50%);
|
||||||
|
background-image: -ms-linear-gradient(top, #ffffff 0%,#eeeeee 50%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#eeeeee',GradientType=0 );
|
||||||
|
background-image: linear-gradient(top, #ffffff 0%,#eeeeee 50%);
|
||||||
|
-webkit-border-bottom-left-radius : 0;
|
||||||
|
-webkit-border-bottom-right-radius: 0;
|
||||||
|
-moz-border-radius-bottomleft : 0;
|
||||||
|
-moz-border-radius-bottomright: 0;
|
||||||
|
border-bottom-left-radius : 0;
|
||||||
|
border-bottom-right-radius: 0;
|
||||||
|
}
|
||||||
|
.chzn-container-active .chzn-single-with-drop div {
|
||||||
|
background: transparent;
|
||||||
|
border-left: none;
|
||||||
|
}
|
||||||
|
.chzn-container-active .chzn-single-with-drop div b {
|
||||||
|
background-position: -18px 1px;
|
||||||
|
}
|
||||||
|
.chzn-container-active .chzn-choices {
|
||||||
|
-webkit-box-shadow: 0 0 5px rgba(0,0,0,.3);
|
||||||
|
-moz-box-shadow : 0 0 5px rgba(0,0,0,.3);
|
||||||
|
-o-box-shadow : 0 0 5px rgba(0,0,0,.3);
|
||||||
|
box-shadow : 0 0 5px rgba(0,0,0,.3);
|
||||||
|
border: 1px solid #5897fb;
|
||||||
|
}
|
||||||
|
.chzn-container-active .chzn-choices .search-field input {
|
||||||
|
color: #111 !important;
|
||||||
|
}
|
||||||
|
/* @end */
|
||||||
|
|
||||||
|
/* @group Disabled Support */
|
||||||
|
.chzn-disabled {
|
||||||
|
cursor: default;
|
||||||
|
opacity:0.5 !important;
|
||||||
|
}
|
||||||
|
.chzn-disabled .chzn-single {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.chzn-disabled .chzn-choices .search-choice .search-choice-close {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @group Right to Left */
|
||||||
|
.chzn-rtl { direction:rtl;text-align: right; }
|
||||||
|
.chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; }
|
||||||
|
.chzn-rtl .chzn-single span { margin-left: 26px; margin-right: 0; }
|
||||||
|
.chzn-rtl .chzn-single div {
|
||||||
|
left: 0; right: auto;
|
||||||
|
border-left: none; border-right: 1px solid #aaaaaa;
|
||||||
|
-webkit-border-radius: 4px 0 0 4px;
|
||||||
|
-moz-border-radius : 4px 0 0 4px;
|
||||||
|
border-radius : 4px 0 0 4px;
|
||||||
|
}
|
||||||
|
.chzn-rtl .chzn-choices li { float: right; }
|
||||||
|
.chzn-rtl .chzn-choices .search-choice { padding: 3px 6px 3px 19px; margin: 3px 5px 3px 0; }
|
||||||
|
.chzn-rtl .chzn-choices .search-choice .search-choice-close { left: 5px; right: auto; background-position: right top;}
|
||||||
|
.chzn-rtl.chzn-container-single .chzn-results { margin-left: 4px; margin-right: 0; padding-left: 0; padding-right: 4px; }
|
||||||
|
.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; }
|
||||||
|
.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
|
||||||
|
.chzn-rtl .chzn-search input {
|
||||||
|
background: url('chosen-sprite.png') no-repeat -38px -22px, #ffffff;
|
||||||
|
background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
|
||||||
|
background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||||
|
background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
|
||||||
|
background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
|
||||||
|
background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||||
|
background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
|
||||||
|
padding: 4px 5px 4px 20px;
|
||||||
|
}
|
||||||
|
/* @end */
|
|
@ -52,7 +52,8 @@
|
||||||
background: #eee;
|
background: #eee;
|
||||||
}
|
}
|
||||||
.diff_file_content {
|
.diff_file_content {
|
||||||
overflow-x: scroll;
|
overflow:auto;
|
||||||
|
overflow-y:hidden;
|
||||||
background:#fff;
|
background:#fff;
|
||||||
color:#333;
|
color:#333;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
|
@ -162,10 +163,6 @@ table.round-borders {
|
||||||
padding:20px;
|
padding:20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
//body {
|
|
||||||
//background: #eaeaea;
|
|
||||||
//}
|
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: #111;
|
color: #111;
|
||||||
}
|
}
|
||||||
|
@ -174,9 +171,9 @@ a {
|
||||||
.old_line, .new_line {
|
.old_line, .new_line {
|
||||||
background:#ECECEC;
|
background:#ECECEC;
|
||||||
color:#777;
|
color:#777;
|
||||||
width:15px;
|
width:30px;
|
||||||
float:left;
|
float:left;
|
||||||
padding: 0px 10px;
|
padding: 0px 5px;
|
||||||
border-right: 1px solid #ccc;
|
border-right: 1px solid #ccc;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -231,43 +228,15 @@ input.ssh_project_url {
|
||||||
text-align:center;
|
text-align:center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.day-commits-table li.commit {
|
|
||||||
cursor:pointer;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
@include hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
#FFF6BF
|
|
||||||
#FFD324
|
|
||||||
*/
|
|
||||||
#tree-slider tr.tree-item {
|
|
||||||
cursor:pointer;
|
|
||||||
|
|
||||||
&:hover {
|
|
||||||
@include hover-color;
|
|
||||||
td {
|
|
||||||
@include hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#projects-list .project {
|
#projects-list .project {
|
||||||
height:50px;
|
height:50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#tree-slider .tree-item,
|
||||||
#projects-list .project,
|
#projects-list .project,
|
||||||
#snippets-table .snippet,
|
#snippets-table .snippet,
|
||||||
#issues-table .issue{
|
#issues-table .issue{
|
||||||
cursor:pointer;
|
cursor:pointer;
|
||||||
|
|
||||||
&:hover {
|
|
||||||
@include hover-color;
|
|
||||||
td {
|
|
||||||
@include hover-color;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.clear {
|
.clear {
|
||||||
|
@ -421,31 +390,6 @@ input.ssh_project_url {
|
||||||
list-style:none;
|
list-style:none;
|
||||||
margin:0px;
|
margin:0px;
|
||||||
padding:0px;
|
padding:0px;
|
||||||
|
|
||||||
li {
|
|
||||||
display:list-item;
|
|
||||||
padding:8px;
|
|
||||||
margin:0px;
|
|
||||||
background: #F7FBFC;
|
|
||||||
border-top: 1px solid #E2EAEE;
|
|
||||||
|
|
||||||
&:first-child {
|
|
||||||
border-top: none;
|
|
||||||
}
|
|
||||||
&:nth-child(2n+1) {
|
|
||||||
background: white;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin-bottom: 4px;
|
|
||||||
font-size: 13px;
|
|
||||||
color:#111;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cite {
|
|
||||||
&.ago {
|
|
||||||
color:#666;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.notes_count {
|
.notes_count {
|
||||||
|
@ -460,14 +404,6 @@ input.ssh_project_url {
|
||||||
right: 6px;
|
right: 6px;
|
||||||
top: 6px;
|
top: 6px;
|
||||||
}
|
}
|
||||||
.note_author {
|
|
||||||
float:left;
|
|
||||||
width:60px;
|
|
||||||
}
|
|
||||||
.note_content {
|
|
||||||
float:left;
|
|
||||||
width:650px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.issue_notes {
|
.issue_notes {
|
||||||
.note_content {
|
.note_content {
|
||||||
|
@ -556,8 +492,7 @@ input.ssh_project_url {
|
||||||
|
|
||||||
}
|
}
|
||||||
.commit,
|
.commit,
|
||||||
.message,
|
.message{
|
||||||
#notes-list{
|
|
||||||
.author {
|
.author {
|
||||||
background: #eaeaea;
|
background: #eaeaea;
|
||||||
color: #333;
|
color: #333;
|
||||||
|
@ -574,7 +509,7 @@ input.ssh_project_url {
|
||||||
font-size:14px;
|
font-size:14px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.wall_page {
|
#new_note {
|
||||||
#note_note {
|
#note_note {
|
||||||
height:25px;
|
height:25px;
|
||||||
}
|
}
|
||||||
|
@ -596,6 +531,7 @@ input.ssh_project_url {
|
||||||
@include round-borders-all(4px);
|
@include round-borders-all(4px);
|
||||||
padding:2px 4px;
|
padding:2px 4px;
|
||||||
border:none;
|
border:none;
|
||||||
|
text-shadow:none;
|
||||||
|
|
||||||
&.high {
|
&.high {
|
||||||
background: #D12F19;
|
background: #D12F19;
|
||||||
|
@ -706,3 +642,44 @@ table.highlighttable pre{
|
||||||
line-height:16px !important;
|
line-height:16px !important;
|
||||||
font-size:12px !important;
|
font-size:12px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.project-refs-form {
|
||||||
|
span {
|
||||||
|
background: none !important;
|
||||||
|
position:static !important;
|
||||||
|
width:auto !important;
|
||||||
|
height: auto !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-refs-select {
|
||||||
|
width:200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.issues_filter {
|
||||||
|
margin-top:10px;
|
||||||
|
.left {
|
||||||
|
margin-right:15px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.cgray { color:gray; }
|
||||||
|
.cred { color:#D12F19; }
|
||||||
|
.cgreen { color:#44aa22; }
|
||||||
|
|
||||||
|
body.project-page table .commit {
|
||||||
|
a.tree-commit-link {
|
||||||
|
color:gray;
|
||||||
|
&:hover {
|
||||||
|
text-decoration:underline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body.project-page #notes-list .note {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
|
||||||
|
body.project-page #notes-list .note {padding: 10px; border-bottom: 1px solid #eee; overflow: hidden; display: block;}
|
||||||
|
body.project-page #notes-list .note img{float: left; margin-right: 10px;}
|
||||||
|
body.project-page #notes-list .note span.note-title{display: block;}
|
||||||
|
body.project-page #notes-list .note span.note-title{margin-bottom: 10px}
|
||||||
|
body.project-page #notes-list .note span.note-author{color: #999; font-weight: normal; font-style: italic;}
|
||||||
|
body.project-page #notes-list .note span.note-author strong{font-weight: bold; font-style: normal;}
|
||||||
|
|
|
@ -292,7 +292,7 @@ body.login-page{background-color: #f1f1f1; padding-top: 10%}
|
||||||
|
|
||||||
/* General */
|
/* General */
|
||||||
#container{background-color: white; overflow: hidden;}
|
#container{background-color: white; overflow: hidden;}
|
||||||
/*#container{margin: auto; width: 980px; border: 1px solid rgba(0,0,0,.22); border-top: 0; box-shadow: 0 0 0px 4px rgba(0,0,0,.04)}*/
|
body.collapsed #container{margin: auto; width: 980px; border: 1px solid rgba(0,0,0,.22); border-top: 0; box-shadow: 0 0 0px 4px rgba(0,0,0,.04)}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -323,6 +323,7 @@ header nav{border-radius: 4px; box-shadow: 0 1px 2px black; width: 294px; margin
|
||||||
background-image: -moz-linear-gradient(#595d63 6.6%, #31363e);
|
background-image: -moz-linear-gradient(#595d63 6.6%, #31363e);
|
||||||
background-image: -o-linear-gradient(#595d63 6.6%, #31363e);
|
background-image: -o-linear-gradient(#595d63 6.6%, #31363e);
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
|
height:30px
|
||||||
}
|
}
|
||||||
header nav a{padding: 8px 12px 8px 34px; display: inline-block; color: #D6DADF; border-right: 1px solid #31363E; position: relative; box-shadow: 1px 0 0 rgba(255,255,255,.1); margin: 0}
|
header nav a{padding: 8px 12px 8px 34px; display: inline-block; color: #D6DADF; border-right: 1px solid #31363E; position: relative; box-shadow: 1px 0 0 rgba(255,255,255,.1); margin: 0}
|
||||||
header nav a span{width: 20px; height: 20px; display: inline-block; background: red; position: absolute; left: 8px; top: 6px;}
|
header nav a span{width: 20px; height: 20px; display: inline-block; background: red; position: absolute; left: 8px; top: 6px;}
|
||||||
|
|
30
app/assets/stylesheets/tags.css.css
Normal file
30
app/assets/stylesheets/tags.css.css
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
.tags-list {
|
||||||
|
padding : 0px 10px 10px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.tags-list a {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 8px 11px 8px 11px;
|
||||||
|
margin: 1px 5px 0px 0px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #72bbdf;
|
||||||
|
background-color: #72bbdf;
|
||||||
|
color: #0f326d;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.small-tags a{
|
||||||
|
font-size: 9px;
|
||||||
|
|
||||||
|
display: inline-block;
|
||||||
|
padding: 2px 3px 1px 3px;
|
||||||
|
margin: 0px 3px 0px 0px;
|
||||||
|
border-radius: 2px;
|
||||||
|
background-color: #72bbdf;
|
||||||
|
color: #FFF;
|
||||||
|
text-shadow: none;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
|
@ -1,5 +1,7 @@
|
||||||
class ApplicationController < ActionController::Base
|
class ApplicationController < ActionController::Base
|
||||||
before_filter :authenticate_user!
|
before_filter :authenticate_user!
|
||||||
|
before_filter :view_style
|
||||||
|
|
||||||
protect_from_forgery
|
protect_from_forgery
|
||||||
|
|
||||||
helper_method :abilities, :can?
|
helper_method :abilities, :can?
|
||||||
|
@ -57,20 +59,14 @@ class ApplicationController < ActionController::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_refs
|
def load_refs
|
||||||
@branch = unless params[:branch].blank?
|
unless params[:ref].blank?
|
||||||
params[:branch]
|
@ref = params[:ref]
|
||||||
else
|
else
|
||||||
nil
|
@branch = params[:branch].blank? ? nil : params[:branch]
|
||||||
end
|
@tag = params[:tag].blank? ? nil : params[:tag]
|
||||||
|
|
||||||
@tag = unless params[:tag].blank?
|
|
||||||
params[:tag]
|
|
||||||
else
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
@ref = @branch || @tag || "master"
|
@ref = @branch || @tag || "master"
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def render_404
|
def render_404
|
||||||
render :file => File.join(Rails.root, "public", "404"), :layout => false, :status => "404"
|
render :file => File.join(Rails.root, "public", "404"), :layout => false, :status => "404"
|
||||||
|
@ -79,4 +75,30 @@ class ApplicationController < ActionController::Base
|
||||||
def require_non_empty_project
|
def require_non_empty_project
|
||||||
redirect_to @project unless @project.repo_exists?
|
redirect_to @project unless @project.repo_exists?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def view_style
|
||||||
|
if params[:view_style] == "collapsed"
|
||||||
|
cookies[:view_style] = "collapsed"
|
||||||
|
elsif params[:view_style] == "fluid"
|
||||||
|
cookies[:view_style] = ""
|
||||||
|
end
|
||||||
|
|
||||||
|
@view_mode = if cookies[:view_style] == "collapsed"
|
||||||
|
:fixed
|
||||||
|
else
|
||||||
|
:fluid
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def respond_with_notes
|
||||||
|
if params[:last_id] && params[:first_id]
|
||||||
|
@notes = @notes.where("id >= ?", params[:first_id])
|
||||||
|
elsif params[:last_id]
|
||||||
|
@notes = @notes.where("id > ?", params[:last_id])
|
||||||
|
elsif params[:first_id]
|
||||||
|
@notes = @notes.where("id < ?", params[:first_id])
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,11 +13,12 @@ class CommitsController < ApplicationController
|
||||||
load_refs # load @branch, @tag & @ref
|
load_refs # load @branch, @tag & @ref
|
||||||
|
|
||||||
@repo = project.repo
|
@repo = project.repo
|
||||||
|
limit, offset = (params[:limit] || 20), (params[:offset] || 0)
|
||||||
|
|
||||||
if params[:path]
|
if params[:path]
|
||||||
@commits = @repo.log(@ref, params[:path], :max_count => params[:limit] || 100, :skip => params[:offset] || 0)
|
@commits = @repo.log(@ref, params[:path], :max_count => limit, :skip => offset)
|
||||||
else
|
else
|
||||||
@commits = @repo.commits(@ref, params[:limit] || 100, params[:offset] || 0)
|
@commits = @repo.commits(@ref, limit, offset)
|
||||||
end
|
end
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
|
@ -28,12 +29,12 @@ class CommitsController < ApplicationController
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@commit = project.repo.commits(params[:id]).first
|
@commit = project.repo.commits(params[:id]).first
|
||||||
@notes = project.notes.where(:noteable_id => @commit.id, :noteable_type => "Commit")
|
@notes = project.notes.where(:noteable_id => @commit.id, :noteable_type => "Commit").order("created_at DESC").limit(20)
|
||||||
@note = @project.notes.new(:noteable_id => @commit.id, :noteable_type => "Commit")
|
@note = @project.notes.new(:noteable_id => @commit.id, :noteable_type => "Commit")
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html # show.html.erb
|
format.html
|
||||||
format.js
|
format.js { respond_with_notes }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -35,8 +35,13 @@ class IssuesController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
@notes = @issue.notes.order("created_at ASC")
|
@notes = @issue.notes.order("created_at DESC").limit(20)
|
||||||
@note = @project.notes.new(:noteable => @issue)
|
@note = @project.notes.new(:noteable => @issue)
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html
|
||||||
|
format.js { respond_with_notes }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
|
|
|
@ -10,7 +10,9 @@ class ProjectsController < ApplicationController
|
||||||
before_filter :require_non_empty_project, :only => [:blob, :tree]
|
before_filter :require_non_empty_project, :only => [:blob, :tree]
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@projects = current_user.projects.all
|
source = current_user.projects
|
||||||
|
source = source.tagged_with(params[:tag]) unless params[:tag].blank?
|
||||||
|
@projects = source.all
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
@ -86,12 +88,11 @@ class ProjectsController < ApplicationController
|
||||||
def wall
|
def wall
|
||||||
@note = Note.new
|
@note = Note.new
|
||||||
@notes = @project.common_notes.order("created_at DESC")
|
@notes = @project.common_notes.order("created_at DESC")
|
||||||
|
@notes = @notes.fresh.limit(20)
|
||||||
|
|
||||||
@notes = case params[:view]
|
respond_to do |format|
|
||||||
when "week" then @notes.since((Date.today - 7.days).at_beginning_of_day)
|
format.html
|
||||||
when "all" then @notes.all
|
format.js { respond_with_notes }
|
||||||
when "day" then @notes.since(Date.today.at_beginning_of_day)
|
|
||||||
else @notes.fresh.limit(10)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
11
app/controllers/tags_controller.rb
Normal file
11
app/controllers/tags_controller.rb
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
class TagsController < ApplicationController
|
||||||
|
def index
|
||||||
|
@tags = Project.tag_counts.order('count DESC')
|
||||||
|
@tags = @tags.where('name like ?', "%#{params[:term]}%") unless params[:term].blank?
|
||||||
|
|
||||||
|
respond_to do |format|
|
||||||
|
format.html
|
||||||
|
format.json { render json: @tags.limit(8).map {|t| t.name}}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -4,6 +4,18 @@ module ApplicationHelper
|
||||||
"http://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email)}?s=40&d=identicon"
|
"http://www.gravatar.com/avatar/#{Digest::MD5.hexdigest(user_email)}?s=40&d=identicon"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def fixed_mode?
|
||||||
|
@view_mode == :fixed
|
||||||
|
end
|
||||||
|
|
||||||
|
def body_class(default_class = nil)
|
||||||
|
main = content_for(:body_class).blank? ?
|
||||||
|
default_class :
|
||||||
|
content_for(:body_class)
|
||||||
|
|
||||||
|
[main, cookies[:view_style]].join(" ")
|
||||||
|
end
|
||||||
|
|
||||||
def commit_name(project, commit)
|
def commit_name(project, commit)
|
||||||
if project.commit.id == commit.id
|
if project.commit.id == commit.id
|
||||||
"master"
|
"master"
|
||||||
|
@ -32,6 +44,15 @@ module ApplicationHelper
|
||||||
"Never"
|
"Never"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def grouped_options_refs
|
||||||
|
options = [
|
||||||
|
["Branch", @repo.heads.map(&:name) ],
|
||||||
|
[ "Tag", @project.tags ]
|
||||||
|
]
|
||||||
|
|
||||||
|
grouped_options_for_select(options, @ref)
|
||||||
|
end
|
||||||
|
|
||||||
def markdown(text)
|
def markdown(text)
|
||||||
RDiscount.new(text, :autolink, :no_pseudo_protocols, :safelink, :smart, :filter_html).to_html.html_safe
|
RDiscount.new(text, :autolink, :no_pseudo_protocols, :safelink, :smart, :filter_html).to_html.html_safe
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,7 @@ class Key < ActiveRecord::Base
|
||||||
validates :key,
|
validates :key,
|
||||||
:presence => true,
|
:presence => true,
|
||||||
:uniqueness => true,
|
:uniqueness => true,
|
||||||
:length => { :within => 0..1024 }
|
:length => { :within => 0..1600 }
|
||||||
|
|
||||||
before_save :set_identifier
|
before_save :set_identifier
|
||||||
after_save :update_gitosis
|
after_save :update_gitosis
|
||||||
|
|
|
@ -9,6 +9,8 @@ class Project < ActiveRecord::Base
|
||||||
has_many :notes, :dependent => :destroy
|
has_many :notes, :dependent => :destroy
|
||||||
has_many :snippets, :dependent => :destroy
|
has_many :snippets, :dependent => :destroy
|
||||||
|
|
||||||
|
acts_as_taggable
|
||||||
|
|
||||||
validates :name,
|
validates :name,
|
||||||
:uniqueness => true,
|
:uniqueness => true,
|
||||||
:presence => true,
|
:presence => true,
|
||||||
|
@ -48,6 +50,11 @@ class Project < ActiveRecord::Base
|
||||||
code
|
code
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def team_member_by_name_or_email(email = nil, name = nil)
|
||||||
|
user = users.where("email like ? or name like ?", email, name).first
|
||||||
|
users_projects.find_by_user_id(user.id) if user
|
||||||
|
end
|
||||||
|
|
||||||
def common_notes
|
def common_notes
|
||||||
notes.where(:noteable_type => ["", nil])
|
notes.where(:noteable_type => ["", nil])
|
||||||
end
|
end
|
||||||
|
|
|
@ -17,9 +17,8 @@
|
||||||
= image_tag "no_avatar.png", :class => "left", :width => 40, :style => "padding-right:5px;"
|
= image_tag "no_avatar.png", :class => "left", :width => 40, :style => "padding-right:5px;"
|
||||||
%span.commit-title
|
%span.commit-title
|
||||||
%strong
|
%strong
|
||||||
= truncate(commit.safe_message, :length => 60)
|
= truncate(commit.safe_message, :length => fixed_mode? ? 60 : 120)
|
||||||
%span.commit-author
|
%span.commit-author
|
||||||
%strong= commit.author_name
|
%strong= commit.author_name
|
||||||
= time_ago_in_words(commit.committed_date)
|
= time_ago_in_words(commit.committed_date)
|
||||||
ago
|
ago
|
||||||
= more_commits_link if @commits.size > 99
|
|
||||||
|
|
|
@ -1,33 +1,28 @@
|
||||||
- content_for(:body_class, "project-page commits-page")
|
- content_for(:body_class, "project-page commits-page")
|
||||||
|
|
||||||
.left
|
|
||||||
= form_tag project_commits_path(@project), :method => :get do
|
|
||||||
= select_tag "branch", options_for_select(@repo.heads.map(&:name), @branch), :onchange => "this.form.submit();", :class => "", :prompt => "Branches"
|
|
||||||
.left
|
|
||||||
= form_tag project_commits_path(@project), :method => :get do
|
|
||||||
= select_tag "tag", options_for_select(@project.tags, @tag), :onchange => "this.form.submit();", :class => "", :prompt => "Tags"
|
|
||||||
.clear
|
|
||||||
|
|
||||||
%br
|
|
||||||
|
|
||||||
|
|
||||||
-#%a.right.button{:href => "#"} Download
|
-#%a.right.button{:href => "#"} Download
|
||||||
-#-if can? current_user, :admin_project, @project
|
-#-if can? current_user, :admin_project, @project
|
||||||
%a.right.button.blue{:href => "#"} EDIT
|
%a.right.button.blue{:href => "#"} EDIT
|
||||||
%h2.icon
|
%h2.icon
|
||||||
%span
|
%span
|
||||||
%a.project-name{:href => "#"}
|
|
||||||
%i.arrow>
|
|
||||||
Project
|
|
||||||
|
|
||||||
%d
|
%d
|
||||||
%a{:href => "#"}
|
= link_to project_commits_path(@project) do
|
||||||
= @ref
|
= @project.name
|
||||||
- if params[:path]
|
- if params[:path]
|
||||||
|
\/
|
||||||
%d
|
|
||||||
%a{:href => "#"}= params[:path].split("/").join(" / ")
|
%a{:href => "#"}= params[:path].split("/").join(" / ")
|
||||||
|
|
||||||
|
.right= render :partial => "projects/refs", :locals => { :destination => project_commits_path(@project) }
|
||||||
|
|
||||||
%div{:id => dom_id(@project)}
|
%div{:id => dom_id(@project)}
|
||||||
= render "commits"
|
#commits_list= render "commits"
|
||||||
|
.clear
|
||||||
|
.loading{ :style => "display:none;"}
|
||||||
|
%center= image_tag "ajax-loader.gif"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
:javascript
|
||||||
|
$(function(){
|
||||||
|
CommitsList.init("#{@ref}", 20);
|
||||||
|
});
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
$("#more-commits-link").remove();
|
|
||||||
$('#<%= dom_id(@project)%>').append('<%= escape_javascript(render("commits")) %>');
|
|
3
app/views/commits/index.js.haml
Normal file
3
app/views/commits/index.js.haml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
:plain
|
||||||
|
CommitsList.append(#{@commits.count}, "#{escape_javascript(render(:partial => 'commits/commits'))}");
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
%h3
|
%h3
|
||||||
= "[ #{@commit.committer} ] #{truncate(@commit.safe_message)}"
|
= "[ #{@commit.author_name} ] #{truncate(@commit.safe_message, :length => 70)}"
|
||||||
-#= link_to 'Back', project_commits_path(@project), :class => "button"
|
-#= link_to 'Back', project_commits_path(@project), :class => "button"
|
||||||
%table.round-borders
|
%table.round-borders
|
||||||
%tr
|
%tr
|
||||||
|
@ -8,12 +8,9 @@
|
||||||
%tr
|
%tr
|
||||||
%td Author
|
%td Author
|
||||||
%td= @commit.author_name
|
%td= @commit.author_name
|
||||||
%tr
|
|
||||||
%td Commiter
|
|
||||||
%td= @commit.committer
|
|
||||||
%tr
|
%tr
|
||||||
%td Commited Date
|
%td Commited Date
|
||||||
%td= @commit.committed_date
|
%td= @commit.committed_date.stamp("21 Aug 2011, 11:15pm")
|
||||||
%tr
|
%tr
|
||||||
%td Message
|
%td Message
|
||||||
%td
|
%td
|
||||||
|
@ -24,18 +21,7 @@
|
||||||
%td= link_to 'Browse Code', tree_project_path(@project, :commit_id => @commit.id)
|
%td= link_to 'Browse Code', tree_project_path(@project, :commit_id => @commit.id)
|
||||||
.clear
|
.clear
|
||||||
|
|
||||||
#tabs
|
%br
|
||||||
%ul
|
|
||||||
%li
|
|
||||||
%a{ :href => "#tabs-1" } Diff
|
|
||||||
%li
|
|
||||||
%a{ :href => "#tabs-2" } Comments
|
|
||||||
%span{ :class => "notes_count" }= @notes.count
|
|
||||||
%hr
|
|
||||||
#tabs-1
|
|
||||||
= render "commits/diff"
|
|
||||||
#tabs-2
|
|
||||||
= render "notes/notes"
|
|
||||||
|
|
||||||
:javascript
|
= render "commits/diff"
|
||||||
$(function() { $( "#tabs" ).tabs(); });
|
= render "notes/notes"
|
||||||
|
|
|
@ -1,8 +1 @@
|
||||||
-#:plain
|
= render "notes/load"
|
||||||
$("#side-commit-preview").remove();
|
|
||||||
var side = $("<div id='side-commit-preview'></div>");
|
|
||||||
side.html("#{escape_javascript(render "commits/show")}");
|
|
||||||
$("##{dom_id(@project)}").parent().append(side);
|
|
||||||
$("##{dom_id(@project)}").addClass("span-14");
|
|
||||||
:plain
|
|
||||||
$("#notes-list").html("#{escape_javascript(render(:partial => 'notes/notes_list'))}");
|
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
%th ID
|
%th ID
|
||||||
%th Title
|
%th Title
|
||||||
%th Closed?
|
%th Closed?
|
||||||
%th
|
|
||||||
|
|
||||||
- @issues.critical.each do |issue|
|
- @issues.critical.each do |issue|
|
||||||
= render(:partial => 'show', :locals => {:issue => issue})
|
= render(:partial => 'show', :locals => {:issue => issue})
|
||||||
|
|
|
@ -4,15 +4,24 @@
|
||||||
= image_tag "move.png" , :class => [:handle, :left]
|
= image_tag "move.png" , :class => [:handle, :left]
|
||||||
%td
|
%td
|
||||||
= image_tag gravatar_icon(issue.assignee.email), :class => "left", :width => 40, :style => "padding:0 5px;"
|
= image_tag gravatar_icon(issue.assignee.email), :class => "left", :width => 40, :style => "padding:0 5px;"
|
||||||
= truncate issue.assignee.name, :lenght => 20
|
= issue.assignee.name
|
||||||
%td ##{issue.id}
|
%td ##{issue.id}
|
||||||
%td
|
%td
|
||||||
= truncate(html_escape(issue.title), :length => 60)
|
= truncate(html_escape(issue.title), :length => 200)
|
||||||
|
%br
|
||||||
%br
|
%br
|
||||||
- if issue.critical
|
- if issue.critical
|
||||||
%span.tag.high critical
|
%span.tag.high critical
|
||||||
- if issue.today?
|
- if issue.today?
|
||||||
%span.tag.today today
|
%span.tag.today today
|
||||||
|
|
||||||
|
.right
|
||||||
|
- if can?(current_user, :admin_issue, @project) || issue.author == current_user
|
||||||
|
= link_to 'Edit', edit_project_issue_path(@project, issue), :class => "cgray", :remote => true
|
||||||
|
- if can?(current_user, :admin_issue, @project) || issue.author == current_user
|
||||||
|
|
||||||
|
= link_to 'Destroy', [@project, issue], :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "cred delete-issue negative", :id => "destroy_issue_#{issue.id}"
|
||||||
|
|
||||||
-#- if issue.author == current_user
|
-#- if issue.author == current_user
|
||||||
-#%span.tag.yours yours
|
-#%span.tag.yours yours
|
||||||
-#- if issue.notes.count > 0
|
-#- if issue.notes.count > 0
|
||||||
|
@ -26,8 +35,3 @@
|
||||||
= hidden_field_tag :status_only, true
|
= hidden_field_tag :status_only, true
|
||||||
- else
|
- else
|
||||||
= check_box_tag "closed", 1, issue.closed, :disabled => true
|
= check_box_tag "closed", 1, issue.closed, :disabled => true
|
||||||
%td
|
|
||||||
- if can?(current_user, :admin_issue, @project) || issue.author == current_user
|
|
||||||
= link_to 'Edit', edit_project_issue_path(@project, issue), :class => "lbutton positive", :remote => true
|
|
||||||
- if can?(current_user, :admin_issue, @project) || issue.author == current_user
|
|
||||||
= link_to 'Destroy', [@project, issue], :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "lbutton delete-issue negative", :id => "destroy_issue_#{issue.id}"
|
|
||||||
|
|
|
@ -7,18 +7,18 @@
|
||||||
= hidden_field_tag :project_id, @project.id, { :id => 'project_id' }
|
= hidden_field_tag :project_id, @project.id, { :id => 'project_id' }
|
||||||
= search_field_tag :issue_search, nil, { :placeholder => 'Search', :class => 'issue_search' }
|
= search_field_tag :issue_search, nil, { :placeholder => 'Search', :class => 'issue_search' }
|
||||||
|
|
||||||
.right
|
.right.issues_filter
|
||||||
= form_tag project_issues_path(@project), :method => :get do
|
= form_tag project_issues_path(@project), :method => :get do
|
||||||
.span-2
|
.left
|
||||||
= radio_button_tag :f, 0, (params[:f] || "0") == "0", :onclick => "this.form.submit()", :id => "open_issues", :class => "status"
|
= radio_button_tag :f, 0, (params[:f] || "0") == "0", :onclick => "this.form.submit()", :id => "open_issues", :class => "status"
|
||||||
= label_tag "open_issues","Open"
|
= label_tag "open_issues","Open"
|
||||||
.span-2
|
.left
|
||||||
= radio_button_tag :f, 2, params[:f] == "2", :onclick => "this.form.submit()", :id => "closed_issues", :class => "status"
|
= radio_button_tag :f, 2, params[:f] == "2", :onclick => "this.form.submit()", :id => "closed_issues", :class => "status"
|
||||||
= label_tag "closed_issues","Closed"
|
= label_tag "closed_issues","Closed"
|
||||||
.span-2
|
.left
|
||||||
= radio_button_tag :f, 3, params[:f] == "3", :onclick => "this.form.submit()", :id => "my_issues", :class => "status"
|
= radio_button_tag :f, 3, params[:f] == "3", :onclick => "this.form.submit()", :id => "my_issues", :class => "status"
|
||||||
= label_tag "my_issues","To Me"
|
= label_tag "my_issues","To Me"
|
||||||
.span-2
|
.left
|
||||||
= radio_button_tag :f, 1, params[:f] == "1", :onclick => "this.form.submit()", :id => "all_issues", :class => "status"
|
= radio_button_tag :f, 1, params[:f] == "1", :onclick => "this.form.submit()", :id => "all_issues", :class => "status"
|
||||||
= label_tag "all_issues","All"
|
= label_tag "all_issues","All"
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,17 @@
|
||||||
%h2
|
%h2
|
||||||
= "Issue ##{@issue.id} - #{html_escape(@issue.title)}"
|
%strong
|
||||||
|
Issue
|
||||||
|
= "##{@issue.id}"
|
||||||
|
–
|
||||||
|
= html_escape(@issue.title)
|
||||||
.left.width-65p
|
.left.width-65p
|
||||||
-#= simple_format html_escape(@issue.content)
|
|
||||||
.issue_notes= render "notes/notes"
|
.issue_notes= render "notes/notes"
|
||||||
|
|
||||||
|
.loading{ :style => "display:none;"}
|
||||||
|
%center= image_tag "ajax-loader.gif"
|
||||||
.right.width-30p
|
.right.width-30p
|
||||||
.span-8
|
.span-8
|
||||||
- if @issue.closed
|
|
||||||
%center.success Closed
|
|
||||||
- else
|
|
||||||
%center.error Open
|
|
||||||
%table.round-borders
|
%table.round-borders
|
||||||
%tr
|
|
||||||
%td Title:
|
|
||||||
%td
|
|
||||||
= truncate html_escape(@issue.title)
|
|
||||||
%tr
|
|
||||||
%td Project
|
|
||||||
%td
|
|
||||||
%strong= @issue.project.name
|
|
||||||
%tr
|
%tr
|
||||||
%td Author:
|
%td Author:
|
||||||
%td
|
%td
|
||||||
|
@ -41,7 +35,7 @@
|
||||||
%tr
|
%tr
|
||||||
%td Closed?
|
%td Closed?
|
||||||
%td
|
%td
|
||||||
- if can? current_user, :write_issue, @project
|
- if can? current_user, :write_issue, @issue
|
||||||
= form_for([@project, @issue]) do |f|
|
= form_for([@project, @issue]) do |f|
|
||||||
= f.check_box :closed, :onclick => "$(this).parent().submit();"
|
= f.check_box :closed, :onclick => "$(this).parent().submit();"
|
||||||
= hidden_field_tag :status_only, true
|
= hidden_field_tag :status_only, true
|
||||||
|
@ -49,9 +43,9 @@
|
||||||
= check_box_tag "closed", 1, @issue.closed, :disabled => true
|
= check_box_tag "closed", 1, @issue.closed, :disabled => true
|
||||||
|
|
||||||
|
|
||||||
- if can?(current_user, :admin_issue, @issue)
|
- if can?(current_user, :write_issue, @issue)
|
||||||
.clear
|
.clear
|
||||||
|
%br
|
||||||
= link_to 'Edit', edit_project_issue_path(@project, @issue), :class => "lbutton positive", :remote => true
|
= link_to 'Edit', edit_project_issue_path(@project, @issue), :class => "lbutton positive", :remote => true
|
||||||
.right= link_to 'Destroy', [@project, @issue], :confirm => 'Are you sure?', :method => :delete, :class => "lbutton delete-issue negative", :id => "destroy_issue_#{@issue.id}"
|
.right= link_to 'Destroy', [@project, @issue], :confirm => 'Are you sure?', :method => :delete, :class => "lbutton delete-issue negative", :id => "destroy_issue_#{@issue.id}"
|
||||||
.clear
|
.clear
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
:plain
|
= render "notes/load"
|
||||||
$("#notes-list").html("#{escape_javascript(render(:partial => 'notes/notes_list'))}");
|
|
||||||
|
|
|
@ -1,16 +1,26 @@
|
||||||
<!-- Page Header -->
|
<!-- Page Header -->
|
||||||
<header>
|
<header>
|
||||||
<h1 class="logo">
|
<h1 class="logo">
|
||||||
<a href="/">GITLAB</a></h1>
|
<a href="/">GITLAB</a>
|
||||||
<div class="login-top">
|
</h1>
|
||||||
|
<div class="account-box">
|
||||||
<%= link_to profile_path, :class => "pic" do %>
|
<%= link_to profile_path, :class => "pic" do %>
|
||||||
<%= image_tag gravatar_icon(current_user.email) %>
|
<%= image_tag gravatar_icon(current_user.email) %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
|
||||||
|
<a href="#" class="arrow-up"></a>
|
||||||
|
|
||||||
|
<div class="account-links">
|
||||||
<%= link_to profile_path, :class => "username" do %>
|
<%= link_to profile_path, :class => "username" do %>
|
||||||
<%= current_user.name %>
|
<%#= current_user.name %>
|
||||||
|
Your profile
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<%= link_to "Fluid layout", url_for( :view_style => 'fluid' ) if cookies[:view_style] == "collapsed"%>
|
||||||
|
<%= link_to "Fixed layout", url_for( :view_style => 'collapsed' ) unless cookies[:view_style] == "collapsed"%>
|
||||||
<%= link_to 'Logout', destroy_user_session_path, :class => "logout", :method => :delete %>
|
<%= link_to 'Logout', destroy_user_session_path, :class => "logout", :method => :delete %>
|
||||||
</div>
|
</div>
|
||||||
|
</div><!-- .account-box -->
|
||||||
|
|
||||||
<div class="search">
|
<div class="search">
|
||||||
<%= text_field_tag "search", nil, :placeholder => "Search", :class => "search-input" %>
|
<%= text_field_tag "search", nil, :placeholder => "Search", :class => "search-input" %>
|
||||||
</div>
|
</div>
|
||||||
|
@ -26,23 +36,10 @@
|
||||||
<span></span>Admin
|
<span></span>Admin
|
||||||
<% end %>
|
<% end %>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
</header>
|
</header>
|
||||||
<!-- eo Page Header -->
|
<!-- eo Page Header -->
|
||||||
|
|
||||||
<div id="header-panel" style="display:none">
|
|
||||||
<div class="container">
|
|
||||||
<div class="span-24">
|
|
||||||
<div class="span-10">
|
|
||||||
<span class="search-holder">
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div class="right">
|
|
||||||
<%= link_to truncate(@project.name, :length => 20), project_path(@project), :class => "current button" if @project && !@project.new_record? %>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<% if current_user %>
|
<% if current_user %>
|
||||||
<%= javascript_tag do %>
|
<%= javascript_tag do %>
|
||||||
$(function() {
|
$(function() {
|
||||||
|
|
|
@ -6,11 +6,10 @@
|
||||||
= stylesheet_link_tag "application"
|
= stylesheet_link_tag "application"
|
||||||
= javascript_include_tag "application"
|
= javascript_include_tag "application"
|
||||||
= csrf_meta_tags
|
= csrf_meta_tags
|
||||||
%link{:href => "/assets/favicon.png", :rel => "icon", :type => "image/png"}/
|
|
||||||
= javascript_tag do
|
= javascript_tag do
|
||||||
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
||||||
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
||||||
%body{ :class => content_for?(:body_class) ? yield(:body_class) : 'project-page', :id => yield(:boyd_id)}
|
%body{ :class => body_class('project-page'), :id => yield(:boyd_id)}
|
||||||
#container
|
#container
|
||||||
= render :partial => "layouts/flash"
|
= render :partial => "layouts/flash"
|
||||||
= render :partial => "layouts/head_panel"
|
= render :partial => "layouts/head_panel"
|
||||||
|
|
|
@ -2,22 +2,16 @@
|
||||||
%html
|
%html
|
||||||
%head
|
%head
|
||||||
%title
|
%title
|
||||||
GitLab #{" - #{@project.name}" if @project && !@project.new_record?}
|
GitLab
|
||||||
-#= stylesheet_link_tag 'blueprint/screen', :media => "screen, projection"
|
|
||||||
-#= stylesheet_link_tag 'blueprint/print', :media => "print"
|
|
||||||
-#= stylesheet_link_tag 'blueprint/plugins/buttons/screen', :media => "screen, projection"
|
|
||||||
-#= stylesheet_link_tag 'blueprint/plugins/link-icons/screen', :media => "screen, projection"
|
|
||||||
= stylesheet_link_tag "application"
|
= stylesheet_link_tag "application"
|
||||||
= javascript_include_tag "application"
|
= javascript_include_tag "application"
|
||||||
= csrf_meta_tags
|
= csrf_meta_tags
|
||||||
%link{:href => "/assets/favicon.png", :rel => "icon", :type => "image/png"}/
|
|
||||||
= javascript_tag do
|
= javascript_tag do
|
||||||
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
||||||
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
||||||
%body{ :class => yield(:body_class), :id => yield(:boyd_id)}
|
%body{ :class => body_class, :id => yield(:boyd_id)}
|
||||||
#container
|
#container
|
||||||
= render :partial => "layouts/flash"
|
= render :partial => "layouts/flash"
|
||||||
= render :partial => "layouts/head_panel"
|
= render :partial => "layouts/head_panel"
|
||||||
%div{ :id => "main", :role => "main", :class => "container_4" }
|
|
||||||
= render :partial => "layouts/page_title"
|
= render :partial => "layouts/page_title"
|
||||||
= yield
|
= yield
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
= stylesheet_link_tag "application"
|
= stylesheet_link_tag "application"
|
||||||
= javascript_include_tag "application"
|
= javascript_include_tag "application"
|
||||||
= csrf_meta_tags
|
= csrf_meta_tags
|
||||||
%link{:href => "/assets/favicon.png", :rel => "icon", :type => "image/png"}/
|
|
||||||
= javascript_tag do
|
= javascript_tag do
|
||||||
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
||||||
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
||||||
|
|
|
@ -6,11 +6,10 @@
|
||||||
= stylesheet_link_tag "application"
|
= stylesheet_link_tag "application"
|
||||||
= javascript_include_tag "application"
|
= javascript_include_tag "application"
|
||||||
= csrf_meta_tags
|
= csrf_meta_tags
|
||||||
%link{:href => "/assets/favicon.png", :rel => "icon", :type => "image/png"}/
|
|
||||||
= javascript_tag do
|
= javascript_tag do
|
||||||
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
||||||
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
||||||
%body{ :class => content_for?(:body_class) ? yield(:body_class) : 'project-page', :id => yield(:boyd_id)}
|
%body{ :class => body_class('project-page'), :id => yield(:boyd_id)}
|
||||||
#container
|
#container
|
||||||
= render :partial => "layouts/flash"
|
= render :partial => "layouts/flash"
|
||||||
= render :partial => "layouts/head_panel"
|
= render :partial => "layouts/head_panel"
|
||||||
|
|
|
@ -6,18 +6,17 @@
|
||||||
= stylesheet_link_tag "application"
|
= stylesheet_link_tag "application"
|
||||||
= javascript_include_tag "application"
|
= javascript_include_tag "application"
|
||||||
= csrf_meta_tags
|
= csrf_meta_tags
|
||||||
%link{:href => "/assets/favicon.png", :rel => "icon", :type => "image/png"}/
|
|
||||||
= javascript_tag do
|
= javascript_tag do
|
||||||
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
REQ_URI = "#{request.env["REQUEST_URI"]}";
|
||||||
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
REQ_REFFER = "#{request.env["HTTP_REFERER"]}";
|
||||||
%body{ :class => content_for?(:body_class) ? yield(:body_class) : 'project-page', :id => yield(:boyd_id)}
|
%body{ :class => body_class('project-page'), :id => yield(:boyd_id)}
|
||||||
#container
|
#container
|
||||||
= render :partial => "layouts/flash"
|
= render :partial => "layouts/flash"
|
||||||
= render :partial => "layouts/head_panel"
|
= render :partial => "layouts/head_panel"
|
||||||
.project-container
|
.project-container
|
||||||
.project-sidebar
|
.project-sidebar
|
||||||
.fixed
|
.fixed
|
||||||
%input.git-url.text{:id => "", :name => "", :readonly => "", :type => "text", :value => @project.url_to_repo}
|
%input.git-url.text{:id => "", :name => "", :readonly => "", :type => "text", :value => @project.url_to_repo, :class => "one_click_select"}
|
||||||
%aside
|
%aside
|
||||||
= link_to "History", project_path(@project), :class => current_page?(:controller => "projects", :action => "show", :id => @project) ? "current" : nil
|
= link_to "History", project_path(@project), :class => current_page?(:controller => "projects", :action => "show", :id => @project) ? "current" : nil
|
||||||
= link_to "Tree", tree_project_path(@project), :class => current_page?(:controller => "projects", :action => "tree", :id => @project) ? "current" : nil
|
= link_to "Tree", tree_project_path(@project), :class => current_page?(:controller => "projects", :action => "tree", :id => @project) ? "current" : nil
|
||||||
|
|
17
app/views/notes/_load.js.haml
Normal file
17
app/views/notes/_load.js.haml
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
- unless @notes.blank?
|
||||||
|
|
||||||
|
- if params[:last_id] && params[:first_id]
|
||||||
|
:plain
|
||||||
|
NoteList.replace(#{@notes.last.id}, #{@notes.first.id}, "#{escape_javascript(render(:partial => 'notes/notes_list'))}");
|
||||||
|
|
||||||
|
|
||||||
|
- elsif params[:last_id]
|
||||||
|
:plain
|
||||||
|
NoteList.prepend(#{@notes.first.id}, "#{escape_javascript(render(:partial => 'notes/notes_list'))}");
|
||||||
|
|
||||||
|
- elsif params[:first_id]
|
||||||
|
:plain
|
||||||
|
NoteList.append(#{@notes.last.id}, "#{escape_javascript(render(:partial => 'notes/notes_list'))}");
|
||||||
|
|
||||||
|
- else
|
||||||
|
:plain
|
|
@ -1,12 +1,8 @@
|
||||||
- if controller.action_name == "wall"
|
- if can? current_user, :write_note, @project
|
||||||
%ul#notes-list= render "notes/notes_list"
|
|
||||||
|
|
||||||
- else
|
|
||||||
%ul#notes-list= render "notes/notes_list"
|
|
||||||
%br
|
|
||||||
%br
|
|
||||||
- if can? current_user, :write_note, @project
|
|
||||||
= render "notes/form"
|
= render "notes/form"
|
||||||
|
.clear
|
||||||
|
%hr
|
||||||
|
%ul#notes-list= render "notes/notes_list"
|
||||||
|
|
||||||
:javascript
|
:javascript
|
||||||
$('.delete-note').live('ajax:success', function() {
|
$('.delete-note').live('ajax:success', function() {
|
||||||
|
@ -20,8 +16,11 @@
|
||||||
$("#submit_note").removeAttr("disabled");
|
$("#submit_note").removeAttr("disabled");
|
||||||
})
|
})
|
||||||
|
|
||||||
- if ["issues", "projects"].include?(controller.controller_name)
|
|
||||||
:javascript
|
|
||||||
$(function(){
|
$(function(){
|
||||||
var int =self.setInterval("updatePage()", 20000);
|
$("#note_note").live("click", function(){
|
||||||
|
$(this).css("height", "100px");
|
||||||
|
$('.attach_holder').show();
|
||||||
|
});
|
||||||
|
|
||||||
|
NoteList.init("wall", #{@notes.last.try(:id) || 0}, #{@notes.first.try(:id) || 0});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
%li{:id => dom_id(note)}
|
%li{:id => dom_id(note), :class => "note"}
|
||||||
%div.note_author
|
|
||||||
= image_tag gravatar_icon(note.author.email), :class => "left", :width => 40, :style => "padding-right:5px;"
|
= image_tag gravatar_icon(note.author.email), :class => "left", :width => 40, :style => "padding-right:5px;"
|
||||||
%div.note_content.left
|
%div.note-author
|
||||||
= markdown(note.note)
|
%strong= note.author_name
|
||||||
- if note.attachment.url
|
%cite.cgray
|
||||||
Attachment:
|
|
||||||
= link_to note.attachment_identifier, note.attachment.url, :target => "_blank"
|
|
||||||
%br
|
|
||||||
%span.author= note.author.name
|
|
||||||
%cite.ago
|
|
||||||
= time_ago_in_words(note.updated_at)
|
= time_ago_in_words(note.updated_at)
|
||||||
ago
|
ago
|
||||||
%br
|
|
||||||
- if(note.author_id == current_user.id) || can?(current_user, :admin_note, @project)
|
- if(note.author_id == current_user.id) || can?(current_user, :admin_note, @project)
|
||||||
= link_to 'Remove', [@project, note], :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "lbutton delete-note right negative"
|
= link_to "Remove", [@project, note], :confirm => 'Are you sure?', :method => :delete, :remote => true, :class => "cred delete-note right"
|
||||||
|
|
||||||
|
%div.note-title
|
||||||
|
= markdown(note.note)
|
||||||
|
- if note.attachment.url
|
||||||
|
.right
|
||||||
|
%span.file
|
||||||
|
= link_to note.attachment_identifier, note.attachment.url, :target => "_blank"
|
||||||
.clear
|
.clear
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
- if @note.valid?
|
- if @note.valid?
|
||||||
:plain
|
:plain
|
||||||
$("#new_note .errors").remove();
|
$("#new_note .errors").remove();
|
||||||
updatePage();
|
|
||||||
$('#note_note').val("");
|
$('#note_note').val("");
|
||||||
|
NoteList.prepend(#{@note.id}, "#{escape_javascript(render :partial => "notes/show", :locals => {:note => @note})}");
|
||||||
- else
|
- else
|
||||||
:plain
|
:plain
|
||||||
$("#new_note").replaceWith("#{escape_javascript(render('form'))}");
|
$("#new_note").replaceWith("#{escape_javascript(render('form'))}");
|
||||||
|
|
|
@ -25,6 +25,11 @@
|
||||||
.left= f.label :code
|
.left= f.label :code
|
||||||
%cite.right http://yourserver/
|
%cite.right http://yourserver/
|
||||||
%td= f.text_field :code, :placeholder => "example"
|
%td= f.text_field :code, :placeholder => "example"
|
||||||
|
|
||||||
|
%tr
|
||||||
|
%td= f.label :tag_list
|
||||||
|
%td= f.text_area :tag_list, :placeholder => "project tags", :style => "height:50px", :id => :tag_field
|
||||||
|
|
||||||
.field
|
.field
|
||||||
= f.label :description
|
= f.label :description
|
||||||
%br/
|
%br/
|
||||||
|
@ -41,8 +46,25 @@
|
||||||
%h3.prepend-top Creating project & repository. Please wait for few minutes
|
%h3.prepend-top Creating project & repository. Please wait for few minutes
|
||||||
- else
|
- else
|
||||||
%h3.prepend-top Updating project & repository. Please wait for few minutes
|
%h3.prepend-top Updating project & repository. Please wait for few minutes
|
||||||
|
|
||||||
:javascript
|
:javascript
|
||||||
$('.new_project, .edit_project').bind('ajax:before', function() {
|
$('.new_project, .edit_project').bind('ajax:before', function() {
|
||||||
$(this).find(".form_content").hide();
|
$(this).find(".form_content").hide();
|
||||||
$('.ajax_loader').show();
|
$('.ajax_loader').show();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
:javascript
|
||||||
|
$(function(){
|
||||||
|
var tag_field = $('#tag_field').tagify();
|
||||||
|
|
||||||
|
tag_field.tagify('inputField').autocomplete({
|
||||||
|
source: '/tags.json'
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
$('form').submit( function() {
|
||||||
|
var tag_field = $('#tag_field')
|
||||||
|
tag_field.val( tag_field.tagify('serialize') );
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
|
|
@ -10,7 +10,12 @@
|
||||||
|
|
||||||
- @projects.each do |project|
|
- @projects.each do |project|
|
||||||
%tr{ :class => "project", :url => project_path(project) }
|
%tr{ :class => "project", :url => project_path(project) }
|
||||||
%td= project.name
|
%td
|
||||||
|
= project.name
|
||||||
|
.small-tags
|
||||||
|
- project.tag_list.each do |tag|
|
||||||
|
= link_to tag, "/tags/#{tag}"
|
||||||
|
|
||||||
%td= truncate project.url_to_repo
|
%td= truncate project.url_to_repo
|
||||||
%td= project.code
|
%td= project.code
|
||||||
%td= check_box_tag "read", 1, project.readers.include?(current_user), :disabled => :disabled
|
%td= check_box_tag "read", 1, project.readers.include?(current_user), :disabled => :disabled
|
||||||
|
|
8
app/views/projects/_refs.html.haml
Normal file
8
app/views/projects/_refs.html.haml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
= form_tag destination, :method => :get, :class => "project-refs-form" do
|
||||||
|
= select_tag "ref", grouped_options_refs, :onchange => "this.form.submit();", :class => "project-refs-select"
|
||||||
|
|
||||||
|
|
||||||
|
:javascript
|
||||||
|
$(function(){
|
||||||
|
$('.project-refs-select').chosen();
|
||||||
|
})
|
|
@ -12,6 +12,11 @@
|
||||||
%span Last Activity:
|
%span Last Activity:
|
||||||
- last_note = project.notes.last
|
- last_note = project.notes.last
|
||||||
= last_note ? last_note.created_at.stamp("24 Aug, 2011") : "Never"
|
= last_note ? last_note.created_at.stamp("24 Aug, 2011") : "Never"
|
||||||
|
|
||||||
|
%p.small-tags
|
||||||
|
- project.tag_list.each do |tag|
|
||||||
|
= link_to tag, "/tags/#{tag}"
|
||||||
|
|
||||||
.buttons
|
.buttons
|
||||||
%a.browse-code.button.yellow{:href => tree_project_path(project)} Browse code
|
%a.browse-code.button.yellow{:href => tree_project_path(project)} Browse code
|
||||||
%a.commits.button.green{:href => project_commits_path(project)} Commits
|
%a.commits.button.green{:href => project_commits_path(project)} Commits
|
||||||
|
|
|
@ -1,12 +1,3 @@
|
||||||
.left
|
|
||||||
= form_tag tree_project_path(@project), :method => :get do
|
|
||||||
= select_tag "branch", options_for_select(@repo.heads.map(&:name), @branch), :onchange => "this.form.submit();", :class => "", :prompt => "Branches"
|
|
||||||
.left
|
|
||||||
= form_tag tree_project_path(@project), :method => :get do
|
|
||||||
= select_tag "tag", options_for_select(@project.tags, @tag), :onchange => "this.form.submit();", :class => "", :prompt => "Tags"
|
|
||||||
.clear
|
|
||||||
|
|
||||||
%br
|
|
||||||
|
|
||||||
-#%a.right.button{:href => "#"} Download
|
-#%a.right.button{:href => "#"} Download
|
||||||
-#-if can? current_user, :admin_project, @project
|
-#-if can? current_user, :admin_project, @project
|
||||||
|
@ -14,14 +5,9 @@
|
||||||
#tree-breadcrumbs
|
#tree-breadcrumbs
|
||||||
%h2.icon
|
%h2.icon
|
||||||
%span
|
%span
|
||||||
= link_to tree_project_path(@project, :path => nil, :commit_id => @commit.try(:id)), :remote => true, :class => 'project-name' do
|
|
||||||
%i.arrow>
|
|
||||||
= @project.name
|
|
||||||
|
|
||||||
%d
|
%d
|
||||||
%a{:href => "#"}
|
= link_to tree_project_path(@project, :path => nil, :commit_id => @commit.try(:id)), :remote => true do
|
||||||
= @ref
|
= @project.name
|
||||||
|
|
||||||
- if params[:path]
|
- if params[:path]
|
||||||
- part_path = ""
|
- part_path = ""
|
||||||
- params[:path].split("\/").each do |part|
|
- params[:path].split("\/").each do |part|
|
||||||
|
@ -30,7 +16,8 @@
|
||||||
- part_path = part
|
- part_path = part
|
||||||
\/
|
\/
|
||||||
= link_to truncate(part, :length => 40), tree_file_project_path(@project, :path => part_path, :commit_id => @commit.try(:id), :branch => @branch, :tag => @tag), :remote => :true
|
= link_to truncate(part, :length => 40), tree_file_project_path(@project, :path => part_path, :commit_id => @commit.try(:id), :branch => @branch, :tag => @tag), :remote => :true
|
||||||
|
|
||||||
|
.right= render :partial => "projects/refs", :locals => { :destination => tree_project_path(@project) }
|
||||||
.clear
|
.clear
|
||||||
|
|
||||||
#tree-content-holder
|
#tree-content-holder
|
||||||
|
|
|
@ -11,5 +11,8 @@
|
||||||
%td
|
%td
|
||||||
= time_ago_in_words(content_commit.committed_date)
|
= time_ago_in_words(content_commit.committed_date)
|
||||||
ago
|
ago
|
||||||
%td
|
%td.commit
|
||||||
= link_to truncate(content_commit.safe_message, :length => 40), project_commit_path(@project, content_commit)
|
= link_to truncate(content_commit.safe_message, :length => fixed_mode? ? 40 : 80), project_commit_path(@project, content_commit), :class => "tree-commit-link"
|
||||||
|
- tm = @project.team_member_by_name_or_email(content_commit.author_email, content_commit.author_name)
|
||||||
|
- if tm
|
||||||
|
= link_to "[#{tm.user_name}]", project_team_member_path(@project, tm)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
- content_for(:body_class, "projects-page")
|
- content_for(:body_class, "projects-page")
|
||||||
- content_for(:page_title) do
|
- content_for(:page_title) do
|
||||||
|
.container_4
|
||||||
.grid_4
|
.grid_4
|
||||||
- if current_user.can_create_project?
|
- if current_user.can_create_project?
|
||||||
%a.grey-button.right{:href => new_project_path} Create new project
|
%a.grey-button.right{:href => new_project_path} Create new project
|
||||||
|
@ -7,12 +8,13 @@
|
||||||
%span
|
%span
|
||||||
Projects
|
Projects
|
||||||
|
|
||||||
- unless @projects.empty?
|
%div.clear
|
||||||
|
- unless @projects.empty?
|
||||||
%div{:class => "tile", :style => view_mode_style("tile")}
|
%div{:class => "tile", :style => view_mode_style("tile")}
|
||||||
= render "tile"
|
= render "tile"
|
||||||
%div{:class => "list", :style => view_mode_style("list")}
|
%div{:class => "list", :style => view_mode_style("list")}
|
||||||
= render "list"
|
= render "list"
|
||||||
- else
|
- else
|
||||||
%center.prepend-top
|
%center.prepend-top
|
||||||
%h2
|
%h2
|
||||||
%cite Nothing here
|
%cite Nothing here
|
||||||
|
|
|
@ -1,29 +1,6 @@
|
||||||
%div.wall_page
|
%div.wall_page
|
||||||
- if can? current_user, :write_note, @project
|
= render "notes/notes"
|
||||||
= render "notes/form"
|
|
||||||
.right
|
.loading{ :style => "display:none;"}
|
||||||
= form_tag wall_project_path(@project), :method => :get do
|
%center= image_tag "ajax-loader.gif"
|
||||||
.span-2
|
|
||||||
= radio_button_tag :view, "recent", (params[:view] || "recent") == "recent", :onclick => "this.form.submit()", :id => "recent_view"
|
|
||||||
= label_tag "recent_view","Recent"
|
|
||||||
.span-2
|
|
||||||
= radio_button_tag :view, "day", params[:view] == "day", :onclick => "this.form.submit()", :id => "day_view"
|
|
||||||
= label_tag "day_view","Today"
|
|
||||||
.span-2
|
|
||||||
= radio_button_tag :view, "week", params[:view] == "week", :onclick => "this.form.submit()", :id => "week_view"
|
|
||||||
= label_tag "week_view","Week"
|
|
||||||
.span-2
|
|
||||||
= radio_button_tag :view, "all", params[:view] == "all", :onclick => "this.form.submit()", :id => "all_view"
|
|
||||||
= label_tag "all_view","All"
|
|
||||||
.clear
|
|
||||||
%br
|
|
||||||
%hr
|
|
||||||
= render "notes/notes"
|
|
||||||
|
|
||||||
:javascript
|
|
||||||
$(function(){
|
|
||||||
$("#note_note").live("click", function(){
|
|
||||||
$(this).css("height", "100px");
|
|
||||||
$('.attach_holder').show();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
:plain
|
= render "notes/load"
|
||||||
$("#notes-list").html("#{escape_javascript(render(:partial => 'notes/notes_list'))}");
|
|
||||||
|
|
11
app/views/tags/index.html.haml
Normal file
11
app/views/tags/index.html.haml
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
- content_for(:body_class, "projects-page")
|
||||||
|
- content_for(:page_title) do
|
||||||
|
.grid_4
|
||||||
|
%h2
|
||||||
|
Tags
|
||||||
|
|
||||||
|
|
||||||
|
.tags-list
|
||||||
|
- @tags.all.each do |tag|
|
||||||
|
= link_to "#{tag.name}(#{tag.count})", "/tags/#{tag.name}"
|
||||||
|
|
|
@ -1,4 +1,9 @@
|
||||||
Gitlab::Application.routes.draw do
|
Gitlab::Application.routes.draw do
|
||||||
|
|
||||||
|
get 'tags'=> 'tags#index'
|
||||||
|
get 'tags/:tag' => 'projects#index'
|
||||||
|
|
||||||
|
|
||||||
namespace :admin do
|
namespace :admin do
|
||||||
resources :users
|
resources :users
|
||||||
resources :projects
|
resources :projects
|
||||||
|
@ -20,6 +25,7 @@ Gitlab::Application.routes.draw do
|
||||||
|
|
||||||
resources :projects, :only => [:new, :create, :index]
|
resources :projects, :only => [:new, :create, :index]
|
||||||
resources :keys
|
resources :keys
|
||||||
|
|
||||||
devise_for :users
|
devise_for :users
|
||||||
|
|
||||||
resources :projects, :except => [:new, :create, :index], :path => "/" do
|
resources :projects, :except => [:new, :create, :index], :path => "/" do
|
||||||
|
|
28
db/migrate/20111101222453_acts_as_taggable_on_migration.rb
Normal file
28
db/migrate/20111101222453_acts_as_taggable_on_migration.rb
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
class ActsAsTaggableOnMigration < ActiveRecord::Migration
|
||||||
|
def self.up
|
||||||
|
create_table :tags do |t|
|
||||||
|
t.string :name
|
||||||
|
end
|
||||||
|
|
||||||
|
create_table :taggings do |t|
|
||||||
|
t.references :tag
|
||||||
|
|
||||||
|
# You should make sure that the column created is
|
||||||
|
# long enough to store the required class names.
|
||||||
|
t.references :taggable, :polymorphic => true
|
||||||
|
t.references :tagger, :polymorphic => true
|
||||||
|
|
||||||
|
t.string :context
|
||||||
|
|
||||||
|
t.datetime :created_at
|
||||||
|
end
|
||||||
|
|
||||||
|
add_index :taggings, :tag_id
|
||||||
|
add_index :taggings, [:taggable_id, :taggable_type, :context]
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.down
|
||||||
|
drop_table :taggings
|
||||||
|
drop_table :tags
|
||||||
|
end
|
||||||
|
end
|
19
db/schema.rb
19
db/schema.rb
|
@ -11,7 +11,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended to check this file into your version control system.
|
# It's strongly recommended to check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(:version => 20111027152724) do
|
ActiveRecord::Schema.define(:version => 20111101222453) do
|
||||||
|
|
||||||
create_table "issues", :force => true do |t|
|
create_table "issues", :force => true do |t|
|
||||||
t.string "title"
|
t.string "title"
|
||||||
|
@ -68,6 +68,23 @@ ActiveRecord::Schema.define(:version => 20111027152724) do
|
||||||
t.datetime "expires_at"
|
t.datetime "expires_at"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_table "taggings", :force => true do |t|
|
||||||
|
t.integer "tag_id"
|
||||||
|
t.integer "taggable_id"
|
||||||
|
t.string "taggable_type"
|
||||||
|
t.integer "tagger_id"
|
||||||
|
t.string "tagger_type"
|
||||||
|
t.string "context"
|
||||||
|
t.datetime "created_at"
|
||||||
|
end
|
||||||
|
|
||||||
|
add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
|
||||||
|
add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"
|
||||||
|
|
||||||
|
create_table "tags", :force => true do |t|
|
||||||
|
t.string "name"
|
||||||
|
end
|
||||||
|
|
||||||
create_table "users", :force => true do |t|
|
create_table "users", :force => true do |t|
|
||||||
t.string "email", :default => "", :null => false
|
t.string "email", :default => "", :null => false
|
||||||
t.string "encrypted_password", :limit => 128, :default => "", :null => false
|
t.string "encrypted_password", :limit => 128, :default => "", :null => false
|
||||||
|
|
|
@ -12,7 +12,6 @@ describe "Issues" do
|
||||||
describe "add new note", :js => true do
|
describe "add new note", :js => true do
|
||||||
before do
|
before do
|
||||||
visit project_commit_path(project, commit)
|
visit project_commit_path(project, commit)
|
||||||
click_link "Comments" # notes tab
|
|
||||||
fill_in "note_note", :with => "I commented this commit"
|
fill_in "note_note", :with => "I commented this commit"
|
||||||
click_button "Add note"
|
click_button "Add note"
|
||||||
end
|
end
|
||||||
|
|
31
spec/requests/tags_spec.rb
Normal file
31
spec/requests/tags_spec.rb
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
require 'spec_helper'
|
||||||
|
|
||||||
|
describe "Tags" do
|
||||||
|
before { login_as :user }
|
||||||
|
|
||||||
|
# describe "GET 'tags/index'" do
|
||||||
|
# it "should be successful" do
|
||||||
|
# get 'tags/index'
|
||||||
|
# response.should be_success
|
||||||
|
# end
|
||||||
|
# end
|
||||||
|
|
||||||
|
|
||||||
|
describe "GET '/tags.json'" do
|
||||||
|
before do
|
||||||
|
@project = Factory :project
|
||||||
|
@project.add_access(@user, :read)
|
||||||
|
@project.tag_list = 'demo1'
|
||||||
|
@project.save
|
||||||
|
visit '/tags.json'
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
it "should contains tags" do
|
||||||
|
page.should have_content('demo1')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
end
|
143
vendor/assets/javascripts/jquery.tagify.js
vendored
Normal file
143
vendor/assets/javascripts/jquery.tagify.js
vendored
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
/* Author: Alicia Liu */
|
||||||
|
|
||||||
|
(function ($) {
|
||||||
|
|
||||||
|
$.widget("ui.tagify", {
|
||||||
|
options: {
|
||||||
|
delimiters: [13, 188], // what user can type to complete a tag in char codes: [enter], [comma]
|
||||||
|
outputDelimiter: ',', // delimiter for tags in original input field
|
||||||
|
cssClass: 'tagify-container', // CSS class to style the tagify div and tags, see stylesheet
|
||||||
|
addTagPrompt: 'add tags' // placeholder text
|
||||||
|
},
|
||||||
|
|
||||||
|
_create: function() {
|
||||||
|
var self = this,
|
||||||
|
el = self.element,
|
||||||
|
opts = self.options;
|
||||||
|
|
||||||
|
this.tags = [];
|
||||||
|
|
||||||
|
// hide text field and replace with a div that contains it's own input field for entering tags
|
||||||
|
this.tagInput = $("<input type='text'>")
|
||||||
|
.attr( 'placeholder', opts.addTagPrompt )
|
||||||
|
.keypress( function(e) {
|
||||||
|
var $this = $(this),
|
||||||
|
pressed = e.which;
|
||||||
|
|
||||||
|
for ( i in opts.delimiters ) {
|
||||||
|
|
||||||
|
if (pressed == opts.delimiters[i]) {
|
||||||
|
self.add( $this.val() );
|
||||||
|
e.preventDefault();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// for some reason, in Safari, backspace is only recognized on keyup
|
||||||
|
.keyup( function(e) {
|
||||||
|
var $this = $(this),
|
||||||
|
pressed = e.which;
|
||||||
|
|
||||||
|
// if backspace is hit with no input, remove the last tag
|
||||||
|
if (pressed == 8) { // backspace
|
||||||
|
if ( $this.val() == "" ) {
|
||||||
|
self.remove();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.tagDiv = $("<div></div>")
|
||||||
|
.addClass( opts.cssClass )
|
||||||
|
.click( function() {
|
||||||
|
$(this).children('input').focus();
|
||||||
|
})
|
||||||
|
.append( this.tagInput )
|
||||||
|
.insertAfter( el.hide() );
|
||||||
|
|
||||||
|
// if the field isn't empty, parse the field for tags, and prepopulate existing tags
|
||||||
|
var initVal = $.trim( el.val() );
|
||||||
|
|
||||||
|
if ( initVal ) {
|
||||||
|
var initTags = initVal.split( opts.outputDelimiter );
|
||||||
|
$.each( initTags, function(i, tag) {
|
||||||
|
self.add( tag );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_setOption: function( key, value ) {
|
||||||
|
options.key = value;
|
||||||
|
},
|
||||||
|
|
||||||
|
// add a tag, public function
|
||||||
|
add: function(text) {
|
||||||
|
var self = this;
|
||||||
|
text = text || self.tagInput.val();
|
||||||
|
if (text) {
|
||||||
|
var tagIndex = self.tags.length;
|
||||||
|
|
||||||
|
var removeButton = $("<a href='#'>x</a>")
|
||||||
|
.click( function() {
|
||||||
|
self.remove( tagIndex );
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
var newTag = $("<span></span>")
|
||||||
|
.text( text )
|
||||||
|
.append( removeButton );
|
||||||
|
|
||||||
|
self.tagInput.before( newTag );
|
||||||
|
self.tags.push( text );
|
||||||
|
self.tagInput.val('');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// remove a tag by index, public function
|
||||||
|
// if index is blank, remove the last tag
|
||||||
|
remove: function( tagIndex ) {
|
||||||
|
var self = this;
|
||||||
|
if ( tagIndex == null || tagIndex === (self.tags.length - 1) ) {
|
||||||
|
this.tagDiv.children("span").last().remove();
|
||||||
|
self.tags.pop();
|
||||||
|
}
|
||||||
|
if ( typeof(tagIndex) == 'number' ) {
|
||||||
|
// otherwise just hide this tag, and we don't mess up the index
|
||||||
|
this.tagDiv.children( "span:eq(" + tagIndex + ")" ).hide();
|
||||||
|
// we rely on the serialize function to remove null values
|
||||||
|
delete( self.tags[tagIndex] );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// serialize the tags with the given delimiter, and write it back into the tagified field
|
||||||
|
serialize: function() {
|
||||||
|
var self = this;
|
||||||
|
var delim = self.options.outputDelimiter;
|
||||||
|
var tagsStr = self.tags.join( delim );
|
||||||
|
|
||||||
|
// our tags might have deleted entries, remove them here
|
||||||
|
var dupes = new RegExp(delim + delim + '+', 'g'); // regex: /,,+/g
|
||||||
|
var ends = new RegExp('^' + delim + '|' + delim + '$', 'g'); // regex: /^,|,$/g
|
||||||
|
var outputStr = tagsStr.replace( dupes, delim ).replace(ends, '');
|
||||||
|
|
||||||
|
self.element.val(outputStr);
|
||||||
|
return outputStr;
|
||||||
|
},
|
||||||
|
|
||||||
|
inputField: function() {
|
||||||
|
return this.tagInput;
|
||||||
|
},
|
||||||
|
|
||||||
|
containerDiv: function() {
|
||||||
|
return this.tagDiv;
|
||||||
|
},
|
||||||
|
|
||||||
|
// remove the div, and show original input
|
||||||
|
destroy: function() {
|
||||||
|
$.Widget.prototype.destroy.apply(this);
|
||||||
|
this.tagDiv.remove();
|
||||||
|
this.element.show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
})(jQuery);
|
34
vendor/assets/stylesheets/jquery-ui/jquery.tagify.css
vendored
Normal file
34
vendor/assets/stylesheets/jquery-ui/jquery.tagify.css
vendored
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/* Tagify styles
|
||||||
|
Author: Alicia Liu test
|
||||||
|
*/
|
||||||
|
|
||||||
|
.tagify-container {
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagify-container > span {
|
||||||
|
display: inline-block;
|
||||||
|
padding: 8px 11px 8px 11px;
|
||||||
|
margin: 1px 5px 0px 0px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border: 1px solid #d0e1ff;
|
||||||
|
background-color: #d0e1ff;
|
||||||
|
color: #0f326d;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagify-container > span > a {
|
||||||
|
padding-left: 5px !important;
|
||||||
|
color: #83a5e1;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagify-container > input {
|
||||||
|
border: 0 none;
|
||||||
|
width: 100px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tagify-container > input:focus {
|
||||||
|
outline: none;
|
||||||
|
}
|
Loading…
Reference in a new issue