Actualizado plugin Redmine Questions 1.0.0 light
8
plugins/redmine_questions/assets/images/answered.svg
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="35" height="35" viewBox="0, 0, 35, 35">
|
||||
<g id="answered">
|
||||
<path d="M17.5,0 C27.165,0 35,7.835 35,17.5 C35,27.165 27.165,35 17.5,35 C7.835,35 0,27.165 0,17.5 C0,7.835 7.835,0 17.5,0 z M17.5,2 C8.94,2 2,8.94 2,17.5 C2,26.06 8.94,33 17.5,33 C26.06,33 33,26.06 33,17.5 C33,8.94 26.06,2 17.5,2 z" fill="#5DBA7D"/>
|
||||
<path d="M10.135,15.26 L6.628,19.186 L14.979,26.648 L29.232,13.863 L25.775,9.894 L14.979,19.651 z" fill="#5EBA7D"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 703 B |
|
@ -0,0 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="35" height="35" viewBox="0, 0, 35, 35">
|
||||
<g id="answered">
|
||||
<path d="M-0.077,10.673 L-0.077,23.495 L13.026,35 L35.077,15.186 L35.077,3.042 L13.026,22.856 z" fill="#5EBA7D"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 446 B |
BIN
plugins/redmine_questions/assets/images/book_open.png
Normal file
After Width: | Height: | Size: 622 B |
15
plugins/redmine_questions/assets/images/downvote.svg
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="35" height="35" viewBox="0, 0, 35, 35">
|
||||
<defs>
|
||||
<clipPath id="Clip_1">
|
||||
<path d="M35,-1 L-1,-1 L-1,35 L35,35 z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="Layer_1">
|
||||
<g clip-path="url(#Clip_1)" id="Layer_1">
|
||||
<path d="M5.126,29.874 C-1.709,23.04 -1.709,11.96 5.126,5.126 C11.96,-1.709 23.04,-1.709 29.874,5.126 C36.709,11.96 36.709,23.04 29.874,29.874 C23.04,36.709 11.96,36.709 5.126,29.874" fill="#F2F2F2"/>
|
||||
<path d="M10.033,13 L17.5,24.4 L24.967,13 z M10.033,13.2" fill="#AAAAAA"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 780 B |
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 35 18" width="35pt" height="18pt" xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata> Produced by OmniGraffle 6.5.3 <dc:date>2016-07-07 08:57:24 +0000</dc:date></metadata><defs/><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><path d="M .21475331 .19262309 L 35 .19262309 L 17.607377 17.585246 Z" fill="#9a9a9a"/></g></g></svg>
|
After Width: | Height: | Size: 681 B |
BIN
plugins/redmine_questions/assets/images/upvote.graffle
Normal file
15
plugins/redmine_questions/assets/images/upvote.svg
Normal file
|
@ -0,0 +1,15 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="35" height="35" viewBox="0, 0, 35, 35">
|
||||
<defs>
|
||||
<clipPath id="Clip_1">
|
||||
<path d="M0,36 L36,36 L36,0 L0,0 z"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g id="Layer_1">
|
||||
<g clip-path="url(#Clip_1)" id="Layer_1">
|
||||
<path d="M29.874,5.126 C36.709,11.96 36.709,23.04 29.874,29.874 C23.04,36.709 11.96,36.709 5.126,29.874 C-1.709,23.04 -1.709,11.96 5.126,5.126 C11.96,-1.709 23.04,-1.709 29.874,5.126" fill="#F2F2F2"/>
|
||||
<path d="M24.967,22 L17.5,10.6 L10.033,22 z M24.967,21.8" fill="#AAAAAA"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 776 B |
3
plugins/redmine_questions/assets/images/upvote_arrow.svg
Normal file
|
@ -0,0 +1,3 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="0 0 35 18" width="35pt" height="18pt" xmlns:dc="http://purl.org/dc/elements/1.1/"><metadata> Produced by OmniGraffle 6.5.3 <dc:date>2016-07-07 08:55:07 +0000</dc:date></metadata><defs/><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><path d="M 34.785247 17.992623 L 71054274e-22 17.992623 L 17.392623 .6 Z" fill="#9a9a9a"/></g></g></svg>
|
After Width: | Height: | Size: 684 B |
26
plugins/redmine_questions/assets/images/voting.svg
Normal file
|
@ -0,0 +1,26 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0" y="0" width="140" height="105" viewBox="0, 0, 140, 105">
|
||||
<g id="answered">
|
||||
<path d="M17.5,0 C27.165,0 35,7.835 35,17.5 C35,27.165 27.165,35 17.5,35 C7.835,35 0,27.165 0,17.5 C0,7.835 7.835,0 17.5,0 z M17.5,2 C8.94,2 2,8.94 2,17.5 C2,26.06 8.94,33 17.5,33 C26.06,33 33,26.06 33,17.5 C33,8.94 26.06,2 17.5,2 z" fill="#5DBA7D"/>
|
||||
<path d="M10.135,15.26 L6.628,19.186 L14.979,26.648 L29.232,13.863 L25.775,9.894 L14.979,19.651 z" fill="#5EBA7D"/>
|
||||
<path d="M7.947,84.081 L3.454,89.11 L14.15,98.667 L32.405,82.292 L27.978,77.208 L14.15,89.705 z" fill="#5EBA7D"/>
|
||||
<path d="M52.5,79.594 C57.108,79.594 60.844,83.329 60.844,87.937 C60.844,92.546 57.108,96.281 52.5,96.281 C47.892,96.281 44.156,92.546 44.156,87.937 C44.156,83.329 47.892,79.594 52.5,79.594 z M52.5,81.094 C48.72,81.094 45.656,84.158 45.656,87.937 C45.656,91.717 48.72,94.781 52.5,94.781 C56.28,94.781 59.344,91.717 59.344,87.937 C59.344,84.158 56.28,81.094 52.5,81.094 z" fill="#5DBA7D"/>
|
||||
<path d="M48.989,86.869 L47.316,88.741 L51.298,92.299 L58.094,86.204 L56.446,84.311 L51.298,88.963 z" fill="#5EBA7D"/>
|
||||
<g>
|
||||
<path d="M99.874,5.126 C106.709,11.96 106.709,23.04 99.874,29.874 C93.04,36.709 81.96,36.709 75.126,29.874 C68.291,23.04 68.291,11.96 75.126,5.126 C81.96,-1.709 93.04,-1.709 99.874,5.126" fill="#EFEFEF"/>
|
||||
<path d="M94.967,21.625 L87.5,10.225 L80.033,21.625 z M94.967,21.425" fill="#9A9A9A"/>
|
||||
</g>
|
||||
<path d="M99.874,40.126 C106.709,46.96 106.709,58.04 99.874,64.874 C93.04,71.709 81.96,71.709 75.126,64.874 C68.291,58.04 68.291,46.96 75.126,40.126 C81.96,33.291 93.04,33.291 99.874,40.126" fill="#D6F5E6"/>
|
||||
<path d="M94.967,56.625 L87.5,45.225 L80.033,56.625 z M94.967,56.425" fill="#9A9A9A"/>
|
||||
<g>
|
||||
<path d="M40.126,29.874 C33.291,23.04 33.291,11.96 40.126,5.126 C46.96,-1.709 58.04,-1.709 64.874,5.126 C71.709,11.96 71.709,23.04 64.874,29.874 C58.04,36.709 46.96,36.709 40.126,29.874" fill="#EFEFEF"/>
|
||||
<path d="M45.033,13.375 L52.5,24.775 L59.967,13.375 z M45.033,13.575" fill="#9A9A9A"/>
|
||||
</g>
|
||||
<path d="M40.126,64.874 C33.291,58.04 33.291,46.96 40.126,40.126 C46.96,33.291 58.04,33.291 64.874,40.126 C71.709,46.96 71.709,58.04 64.874,64.874 C58.04,71.709 46.96,71.709 40.126,64.874" fill="#F9DEDE"/>
|
||||
<path d="M45.033,48.375 L52.5,59.775 L59.967,48.375 z M45.033,48.575" fill="#9A9A9A"/>
|
||||
<path d="M4.75,45.839 L4.75,56.07 L14.255,65.25 L30.25,49.44 L30.25,39.75 L14.255,55.56 z" fill="#5EBA7D"/>
|
||||
<path d="M108,60 L137,60 L122.5,45 z" fill="#AAAAAA"/>
|
||||
<path d="M137,10.771 L108,10.771 L122.5,25.771 z" fill="#AAAAAA"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
|
@ -0,0 +1,235 @@
|
|||
/*
|
||||
* Very simple jQuery Color Picker
|
||||
* https://github.com/tkrotoff/jquery-simplecolorpicker
|
||||
*
|
||||
* Copyright (C) 2012-2013 Tanguy Krotoff <tkrotoff@gmail.com>
|
||||
*
|
||||
* Licensed under the MIT license
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
var SimpleColorPicker = function(select, options) {
|
||||
this.init('simplecolorpicker', select, options);
|
||||
};
|
||||
|
||||
/**
|
||||
* SimpleColorPicker class.
|
||||
*/
|
||||
SimpleColorPicker.prototype = {
|
||||
constructor: SimpleColorPicker,
|
||||
|
||||
init: function(type, select, options) {
|
||||
var self = this;
|
||||
|
||||
self.type = type;
|
||||
|
||||
self.$select = $(select);
|
||||
self.$select.hide();
|
||||
|
||||
self.options = $.extend({}, $.fn.simplecolorpicker.defaults, options);
|
||||
|
||||
self.$colorList = null;
|
||||
|
||||
if (self.options.picker === true) {
|
||||
var selectText = self.$select.find('> option:selected').text();
|
||||
self.$icon = $('<span class="simplecolorpicker button"'
|
||||
+ ' title="' + selectText + '"'
|
||||
+ ' style="background-color: ' + self.$select.val() + ';"'
|
||||
+ ' role="button" tabindex="0">'
|
||||
+ '</span>').insertAfter(self.$select);
|
||||
self.$icon.on('click.' + self.type, $.proxy(self.showPicker, self));
|
||||
|
||||
self.$picker = $('<span class="simplecolorpicker picker ' + self.options.theme + '"></span>').appendTo(document.body);
|
||||
self.$colorList = self.$picker;
|
||||
|
||||
// Hide picker when clicking outside
|
||||
$(document).on('mousedown.' + self.type, $.proxy(self.hidePicker, self));
|
||||
self.$picker.on('mousedown.' + self.type, $.proxy(self.mousedown, self));
|
||||
} else {
|
||||
self.$inline = $('<span class="simplecolorpicker inline ' + self.options.theme + '"></span>').insertAfter(self.$select);
|
||||
self.$colorList = self.$inline;
|
||||
}
|
||||
|
||||
// Build the list of colors
|
||||
// <span class="color selected" title="Green" style="background-color: #7bd148;" role="button"></span>
|
||||
self.$select.find('> option').each(function() {
|
||||
var $option = $(this);
|
||||
var color = $option.val();
|
||||
|
||||
var isSelected = $option.is(':selected');
|
||||
var isDisabled = $option.is(':disabled');
|
||||
|
||||
var selected = '';
|
||||
if (isSelected === true) {
|
||||
selected = ' data-selected';
|
||||
}
|
||||
|
||||
var disabled = '';
|
||||
if (isDisabled === true) {
|
||||
disabled = ' data-disabled';
|
||||
}
|
||||
|
||||
var title = '';
|
||||
if (isDisabled === false) {
|
||||
title = ' title="' + $option.text() + '"';
|
||||
}
|
||||
|
||||
var role = '';
|
||||
if (isDisabled === false) {
|
||||
role = ' role="button" tabindex="0"';
|
||||
}
|
||||
|
||||
var $colorSpan = $('<span class="color"'
|
||||
+ title
|
||||
+ ' style="background-color: ' + color + ';"'
|
||||
+ ' data-color="' + color + '"'
|
||||
+ selected
|
||||
+ disabled
|
||||
+ role + '>'
|
||||
+ '</span>');
|
||||
|
||||
self.$colorList.append($colorSpan);
|
||||
$colorSpan.on('click.' + self.type, $.proxy(self.colorSpanClicked, self));
|
||||
|
||||
var $next = $option.next();
|
||||
if ($next.is('optgroup') === true) {
|
||||
// Vertical break, like hr
|
||||
self.$colorList.append('<span class="vr"></span>');
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Changes the selected color.
|
||||
*
|
||||
* @param color the hexadecimal color to select, ex: '#fbd75b'
|
||||
*/
|
||||
selectColor: function(color) {
|
||||
var self = this;
|
||||
|
||||
var $colorSpan = self.$colorList.find('> span.color').filter(function() {
|
||||
return $(this).data('color').toLowerCase() === color.toLowerCase();
|
||||
});
|
||||
|
||||
if ($colorSpan.length > 0) {
|
||||
self.selectColorSpan($colorSpan);
|
||||
} else {
|
||||
console.error("The given color '" + color + "' could not be found");
|
||||
}
|
||||
},
|
||||
|
||||
showPicker: function() {
|
||||
var pos = this.$icon.offset();
|
||||
this.$picker.css({
|
||||
// Remove some pixels to align the picker icon with the icons inside the dropdown
|
||||
left: pos.left - 1,
|
||||
top: pos.top - 4//+ this.$icon.outerHeight()
|
||||
});
|
||||
|
||||
this.$picker.show(this.options.pickerDelay);
|
||||
},
|
||||
|
||||
hidePicker: function() {
|
||||
this.$picker.hide(this.options.pickerDelay);
|
||||
},
|
||||
|
||||
/**
|
||||
* Selects the given span inside $colorList.
|
||||
*
|
||||
* The given span becomes the selected one.
|
||||
* It also changes the HTML select value, this will emit the 'change' event.
|
||||
*/
|
||||
selectColorSpan: function($colorSpan) {
|
||||
var color = $colorSpan.data('color');
|
||||
var title = $colorSpan.prop('title');
|
||||
|
||||
// Mark this span as the selected one
|
||||
$colorSpan.siblings().removeAttr('data-selected');
|
||||
$colorSpan.attr('data-selected', '');
|
||||
|
||||
if (this.options.picker === true) {
|
||||
this.$icon.css('background-color', color);
|
||||
this.$icon.prop('title', title);
|
||||
this.hidePicker();
|
||||
}
|
||||
|
||||
// Change HTML select value
|
||||
this.$select.val(color);
|
||||
},
|
||||
|
||||
/**
|
||||
* The user clicked on a color inside $colorList.
|
||||
*/
|
||||
colorSpanClicked: function(e) {
|
||||
// When a color is clicked, make it the new selected one (unless disabled)
|
||||
if ($(e.target).is('[data-disabled]') === false) {
|
||||
this.selectColorSpan($(e.target));
|
||||
this.$select.trigger('change');
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Prevents the mousedown event from "eating" the click event.
|
||||
*/
|
||||
mousedown: function(e) {
|
||||
e.stopPropagation();
|
||||
e.preventDefault();
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this.options.picker === true) {
|
||||
this.$icon.off('.' + this.type);
|
||||
this.$icon.remove();
|
||||
$(document).off('.' + this.type);
|
||||
}
|
||||
|
||||
this.$colorList.off('.' + this.type);
|
||||
this.$colorList.remove();
|
||||
|
||||
this.$select.removeData(this.type);
|
||||
this.$select.show();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Plugin definition.
|
||||
* How to use: $('#id').simplecolorpicker()
|
||||
*/
|
||||
$.fn.simplecolorpicker = function(option) {
|
||||
var args = $.makeArray(arguments);
|
||||
args.shift();
|
||||
|
||||
// For HTML element passed to the plugin
|
||||
return this.each(function() {
|
||||
var $this = $(this),
|
||||
data = $this.data('simplecolorpicker'),
|
||||
options = typeof option === 'object' && option;
|
||||
if (data === undefined) {
|
||||
$this.data('simplecolorpicker', (data = new SimpleColorPicker(this, options)));
|
||||
}
|
||||
if (typeof option === 'string') {
|
||||
data[option].apply(data, args);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Default options.
|
||||
*/
|
||||
$.fn.simplecolorpicker.defaults = {
|
||||
// No theme by default
|
||||
theme: '',
|
||||
|
||||
// Show the picker or make it inline
|
||||
picker: false,
|
||||
|
||||
// Animation delay in milliseconds
|
||||
pickerDelay: 0
|
||||
};
|
||||
|
||||
})(jQuery);
|
|
@ -1,392 +0,0 @@
|
|||
/*
|
||||
* jQuery UI Tag-it!
|
||||
*
|
||||
* @version v2.0 (06/2011)
|
||||
*
|
||||
* Copyright 2011, Levy Carneiro Jr.
|
||||
* Released under the MIT license.
|
||||
* http://aehlke.github.com/tag-it/LICENSE
|
||||
*
|
||||
* Homepage:
|
||||
* http://aehlke.github.com/tag-it/
|
||||
*
|
||||
* Authors:
|
||||
* Levy Carneiro Jr.
|
||||
* Martin Rehfeld
|
||||
* Tobias Schmidt
|
||||
* Skylar Challand
|
||||
* Alex Ehlke
|
||||
*
|
||||
* Maintainer:
|
||||
* Alex Ehlke - Twitter: @aehlke
|
||||
*
|
||||
* Dependencies:
|
||||
* jQuery v1.4+
|
||||
* jQuery UI v1.8+
|
||||
*/
|
||||
(function($) {
|
||||
|
||||
$.widget('ui.tagit', {
|
||||
options: {
|
||||
itemName : 'item',
|
||||
fieldName : 'tags',
|
||||
availableTags : [],
|
||||
tagSource : null,
|
||||
removeConfirmation: false,
|
||||
caseSensitive : true,
|
||||
placeholderText : null,
|
||||
|
||||
// When enabled, quotes are not neccesary
|
||||
// for inputting multi-word tags.
|
||||
allowSpaces: false,
|
||||
|
||||
// Whether to animate tag removals or not.
|
||||
animate: true,
|
||||
|
||||
// The below options are for using a single field instead of several
|
||||
// for our form values.
|
||||
//
|
||||
// When enabled, will use a single hidden field for the form,
|
||||
// rather than one per tag. It will delimit tags in the field
|
||||
// with singleFieldDelimiter.
|
||||
//
|
||||
// The easiest way to use singleField is to just instantiate tag-it
|
||||
// on an INPUT element, in which case singleField is automatically
|
||||
// set to true, and singleFieldNode is set to that element. This
|
||||
// way, you don't need to fiddle with these options.
|
||||
singleField: false,
|
||||
|
||||
singleFieldDelimiter: ',',
|
||||
|
||||
// Set this to an input DOM node to use an existing form field.
|
||||
// Any text in it will be erased on init. But it will be
|
||||
// populated with the text of tags as they are created,
|
||||
// delimited by singleFieldDelimiter.
|
||||
//
|
||||
// If this is not set, we create an input node for it,
|
||||
// with the name given in settings.fieldName,
|
||||
// ignoring settings.itemName.
|
||||
singleFieldNode: null,
|
||||
|
||||
// Optionally set a tabindex attribute on the input that gets
|
||||
// created for tag-it.
|
||||
tabIndex: null,
|
||||
|
||||
|
||||
// Event callbacks.
|
||||
onTagAdded : null,
|
||||
onTagRemoved: null,
|
||||
onTagClicked: null
|
||||
},
|
||||
|
||||
|
||||
_create: function() {
|
||||
// for handling static scoping inside callbacks
|
||||
var that = this;
|
||||
|
||||
// There are 2 kinds of DOM nodes this widget can be instantiated on:
|
||||
// 1. UL, OL, or some element containing either of these.
|
||||
// 2. INPUT, in which case 'singleField' is overridden to true,
|
||||
// a UL is created and the INPUT is hidden.
|
||||
if (this.element.is('input')) {
|
||||
this.tagList = $('<ul></ul>').insertAfter(this.element);
|
||||
this.options.singleField = true;
|
||||
this.options.singleFieldNode = this.element;
|
||||
this.element.css('display', 'none');
|
||||
} else {
|
||||
this.tagList = this.element.find('ul, ol').andSelf().last();
|
||||
}
|
||||
|
||||
this._tagInput = $('<input type="text" />').addClass('ui-widget-content');
|
||||
if (this.options.tabIndex) {
|
||||
this._tagInput.attr('tabindex', this.options.tabIndex);
|
||||
}
|
||||
if (this.options.placeholderText) {
|
||||
this._tagInput.attr('placeholder', this.options.placeholderText);
|
||||
}
|
||||
|
||||
this.options.tagSource = this.options.tagSource || function(search, showChoices) {
|
||||
var filter = search.term.toLowerCase();
|
||||
var choices = $.grep(this.options.availableTags, function(element) {
|
||||
// Only match autocomplete options that begin with the search term.
|
||||
// (Case insensitive.)
|
||||
return (element.toLowerCase().indexOf(filter) === 0);
|
||||
});
|
||||
showChoices(this._subtractArray(choices, this.assignedTags()));
|
||||
};
|
||||
|
||||
// Bind tagSource callback functions to this context.
|
||||
if ($.isFunction(this.options.tagSource)) {
|
||||
this.options.tagSource = $.proxy(this.options.tagSource, this);
|
||||
}
|
||||
|
||||
this.tagList
|
||||
.addClass('tagit')
|
||||
.addClass('ui-widget ui-widget-content ui-corner-all')
|
||||
// Create the input field.
|
||||
.append($('<li class="tagit-new"></li>').append(this._tagInput))
|
||||
.click(function(e) {
|
||||
var target = $(e.target);
|
||||
if (target.hasClass('tagit-label')) {
|
||||
that._trigger('onTagClicked', e, target.closest('.tagit-choice'));
|
||||
} else {
|
||||
// Sets the focus() to the input field, if the user
|
||||
// clicks anywhere inside the UL. This is needed
|
||||
// because the input field needs to be of a small size.
|
||||
that._tagInput.focus();
|
||||
}
|
||||
});
|
||||
|
||||
// Add existing tags from the list, if any.
|
||||
this.tagList.children('li').each(function() {
|
||||
if (!$(this).hasClass('tagit-new')) {
|
||||
that.createTag($(this).html(), $(this).attr('class'));
|
||||
$(this).remove();
|
||||
}
|
||||
});
|
||||
|
||||
// Single field support.
|
||||
if (this.options.singleField) {
|
||||
if (this.options.singleFieldNode) {
|
||||
// Add existing tags from the input field.
|
||||
var node = $(this.options.singleFieldNode);
|
||||
var tags = node.val().split(this.options.singleFieldDelimiter);
|
||||
node.val('');
|
||||
$.each(tags, function(index, tag) {
|
||||
that.createTag(tag);
|
||||
});
|
||||
} else {
|
||||
// Create our single field input after our list.
|
||||
this.options.singleFieldNode = this.tagList.after('<input type="hidden" style="display:none;" value="" name="' + this.options.fieldName + '" />');
|
||||
}
|
||||
}
|
||||
|
||||
// Events.
|
||||
this._tagInput
|
||||
.keydown(function(event) {
|
||||
// Backspace is not detected within a keypress, so it must use keydown.
|
||||
if (event.which == $.ui.keyCode.BACKSPACE && that._tagInput.val() === '') {
|
||||
var tag = that._lastTag();
|
||||
if (!that.options.removeConfirmation || tag.hasClass('remove')) {
|
||||
// When backspace is pressed, the last tag is deleted.
|
||||
that.removeTag(tag);
|
||||
} else if (that.options.removeConfirmation) {
|
||||
tag.addClass('remove ui-state-highlight');
|
||||
}
|
||||
} else if (that.options.removeConfirmation) {
|
||||
that._lastTag().removeClass('remove ui-state-highlight');
|
||||
}
|
||||
|
||||
// Comma/Space/Enter are all valid delimiters for new tags,
|
||||
// except when there is an open quote or if setting allowSpaces = true.
|
||||
// Tab will also create a tag, unless the tag input is empty, in which case it isn't caught.
|
||||
if (
|
||||
// event.which == $.ui.keyCode.COMMA ||
|
||||
event.which == $.ui.keyCode.ENTER ||
|
||||
(
|
||||
event.which == $.ui.keyCode.TAB &&
|
||||
that._tagInput.val() !== ''
|
||||
) ||
|
||||
(
|
||||
event.which == $.ui.keyCode.SPACE &&
|
||||
that.options.allowSpaces !== true &&
|
||||
(
|
||||
$.trim(that._tagInput.val()).replace( /^s*/, '' ).charAt(0) != '"' ||
|
||||
(
|
||||
$.trim(that._tagInput.val()).charAt(0) == '"' &&
|
||||
$.trim(that._tagInput.val()).charAt($.trim(that._tagInput.val()).length - 1) == '"' &&
|
||||
$.trim(that._tagInput.val()).length - 1 !== 0
|
||||
)
|
||||
)
|
||||
)
|
||||
) {
|
||||
event.preventDefault();
|
||||
that.createTag(that._cleanedInput());
|
||||
|
||||
// The autocomplete doesn't close automatically when TAB is pressed.
|
||||
// So let's ensure that it closes.
|
||||
that._tagInput.autocomplete('close');
|
||||
}
|
||||
}).blur(function(e){
|
||||
// Create a tag when the element loses focus (unless it's empty).
|
||||
that.createTag(that._cleanedInput());
|
||||
});
|
||||
|
||||
|
||||
// Autocomplete.
|
||||
if (this.options.availableTags || this.options.tagSource) {
|
||||
this._tagInput.autocomplete({
|
||||
source: this.options.tagSource,
|
||||
select: function(event, ui) {
|
||||
// Delete the last tag if we autocomplete something despite the input being empty
|
||||
// This happens because the input's blur event causes the tag to be created when
|
||||
// the user clicks an autocomplete item.
|
||||
// The only artifact of this is that while the user holds down the mouse button
|
||||
// on the selected autocomplete item, a tag is shown with the pre-autocompleted text,
|
||||
// and is changed to the autocompleted text upon mouseup.
|
||||
if (that._tagInput.val() === '') {
|
||||
that.removeTag(that._lastTag(), false);
|
||||
}
|
||||
that.createTag(ui.item.value);
|
||||
// Preventing the tag input to be updated with the chosen value.
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
_cleanedInput: function() {
|
||||
// Returns the contents of the tag input, cleaned and ready to be passed to createTag
|
||||
return $.trim(this._tagInput.val().replace(/^"(.*)"$/, '$1'));
|
||||
},
|
||||
|
||||
_lastTag: function() {
|
||||
return this.tagList.children('.tagit-choice:last');
|
||||
},
|
||||
|
||||
assignedTags: function() {
|
||||
// Returns an array of tag string values
|
||||
var that = this;
|
||||
var tags = [];
|
||||
if (this.options.singleField) {
|
||||
tags = $(this.options.singleFieldNode).val().split(this.options.singleFieldDelimiter);
|
||||
if (tags[0] === '') {
|
||||
tags = [];
|
||||
}
|
||||
} else {
|
||||
this.tagList.children('.tagit-choice').each(function() {
|
||||
tags.push(that.tagLabel(this));
|
||||
});
|
||||
}
|
||||
return tags;
|
||||
},
|
||||
|
||||
_updateSingleTagsField: function(tags) {
|
||||
// Takes a list of tag string values, updates this.options.singleFieldNode.val to the tags delimited by this.options.singleFieldDelimiter
|
||||
$(this.options.singleFieldNode).val(tags.join(this.options.singleFieldDelimiter));
|
||||
},
|
||||
|
||||
_subtractArray: function(a1, a2) {
|
||||
var result = [];
|
||||
for (var i = 0; i < a1.length; i++) {
|
||||
if ($.inArray(a1[i], a2) == -1) {
|
||||
result.push(a1[i]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
},
|
||||
|
||||
tagLabel: function(tag) {
|
||||
// Returns the tag's string label.
|
||||
if (this.options.singleField) {
|
||||
return $(tag).children('.tagit-label').text();
|
||||
} else {
|
||||
return $(tag).children('input').val();
|
||||
}
|
||||
},
|
||||
|
||||
_isNew: function(value) {
|
||||
var that = this;
|
||||
var isNew = true;
|
||||
this.tagList.children('.tagit-choice').each(function(i) {
|
||||
if (that._formatStr(value) == that._formatStr(that.tagLabel(this))) {
|
||||
isNew = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
return isNew;
|
||||
},
|
||||
|
||||
_formatStr: function(str) {
|
||||
if (this.options.caseSensitive) {
|
||||
return str;
|
||||
}
|
||||
return $.trim(str.toLowerCase());
|
||||
},
|
||||
|
||||
createTag: function(value, additionalClass) {
|
||||
var that = this;
|
||||
// Automatically trims the value of leading and trailing whitespace.
|
||||
value = $.trim(value);
|
||||
|
||||
if (!this._isNew(value) || value === '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
var label = $(this.options.onTagClicked ? '<a class="tagit-label"></a>' : '<span class="tagit-label"></span>').text(value);
|
||||
|
||||
// Create tag.
|
||||
var tag = $('<li></li>')
|
||||
.addClass('tagit-choice ui-widget-content ui-state-default ui-corner-all')
|
||||
.addClass(additionalClass)
|
||||
.append(label);
|
||||
|
||||
// Button for removing the tag.
|
||||
var removeTagIcon = $('<span></span>')
|
||||
.addClass('ui-icon ui-icon-close');
|
||||
var removeTag = $('<a><span class="text-icon">\xd7</span></a>') // \xd7 is an X
|
||||
.addClass('tagit-close')
|
||||
.append(removeTagIcon)
|
||||
.click(function(e) {
|
||||
// Removes a tag when the little 'x' is clicked.
|
||||
that.removeTag(tag);
|
||||
});
|
||||
tag.append(removeTag);
|
||||
|
||||
// Unless options.singleField is set, each tag has a hidden input field inline.
|
||||
if (this.options.singleField) {
|
||||
var tags = this.assignedTags();
|
||||
tags.push(value);
|
||||
this._updateSingleTagsField(tags);
|
||||
} else {
|
||||
var escapedValue = label.html();
|
||||
tag.append('<input type="hidden" style="display:none;" value="' + escapedValue + '" name="' + this.options.itemName + '[' + this.options.fieldName + '][]" />');
|
||||
}
|
||||
|
||||
this._trigger('onTagAdded', null, tag);
|
||||
|
||||
// Cleaning the input.
|
||||
this._tagInput.val('');
|
||||
|
||||
// insert tag
|
||||
this._tagInput.parent().before(tag);
|
||||
},
|
||||
|
||||
removeTag: function(tag, animate) {
|
||||
animate = animate || this.options.animate;
|
||||
|
||||
tag = $(tag);
|
||||
|
||||
this._trigger('onTagRemoved', null, tag);
|
||||
|
||||
if (this.options.singleField) {
|
||||
var tags = this.assignedTags();
|
||||
var removedTagLabel = this.tagLabel(tag);
|
||||
tags = $.grep(tags, function(el){
|
||||
return el != removedTagLabel;
|
||||
});
|
||||
this._updateSingleTagsField(tags);
|
||||
}
|
||||
// Animate the removal.
|
||||
if (animate) {
|
||||
tag.fadeOut('fast').hide('blind', {direction: 'horizontal'}, 'fast', function(){
|
||||
tag.remove();
|
||||
}).dequeue();
|
||||
} else {
|
||||
tag.remove();
|
||||
}
|
||||
},
|
||||
|
||||
removeAll: function() {
|
||||
// Removes all tags.
|
||||
var that = this;
|
||||
this.tagList.children('.tagit-choice').each(function(index, tag) {
|
||||
that.removeTag(tag, false);
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
/*
|
||||
* Very simple jQuery Color Picker
|
||||
* https://github.com/tkrotoff/jquery-simplecolorpicker
|
||||
*
|
||||
* Copyright (C) 2012-2013 Tanguy Krotoff <tkrotoff@gmail.com>
|
||||
*
|
||||
* Licensed under the MIT license
|
||||
*/
|
||||
|
||||
/**
|
||||
* Inspired by Bootstrap Twitter.
|
||||
* See https://github.com/twbs/bootstrap/blob/master/less/navbar.less
|
||||
* See https://github.com/twbs/bootstrap/blob/master/less/dropdowns.less
|
||||
*/
|
||||
|
||||
.simplecolorpicker.picker {
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
z-index: 1051; /* Above Bootstrap modal (@zindex-modal = 1050) */
|
||||
display: none;
|
||||
float: left;
|
||||
|
||||
min-width: 160px;
|
||||
max-width: 283px; /* @popover-max-width = 276px + 7 */
|
||||
|
||||
padding: 5px 0 0 5px;
|
||||
margin: 2px 0 0;
|
||||
list-style: none;
|
||||
background-color: #fff; /* @dropdown-bg */
|
||||
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
|
||||
.simplecolorpicker.inline {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.simplecolorpicker span {
|
||||
margin: 0 5px 5px 0;
|
||||
}
|
||||
|
||||
.simplecolorpicker.button,
|
||||
.simplecolorpicker span.color {
|
||||
display: inline-block;
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.simplecolorpicker.button {
|
||||
border: 1px solid #DDD;
|
||||
}
|
||||
|
||||
.simplecolorpicker.button:after,
|
||||
.simplecolorpicker span.color:after {
|
||||
content: '\00a0\00a0\00a0\00a0'; /* Spaces */
|
||||
}
|
||||
|
||||
.simplecolorpicker span.color[data-disabled]:hover {
|
||||
cursor: not-allowed;
|
||||
border: 1px solid transparent;
|
||||
}
|
||||
|
||||
.simplecolorpicker span.color:hover,
|
||||
.simplecolorpicker span.color[data-selected],
|
||||
.simplecolorpicker span.color[data-selected]:hover {
|
||||
border: 1px solid #222; /* @gray-dark */
|
||||
}
|
||||
.simplecolorpicker span.color[data-selected]:after {
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
/* Vertical separator, replaces optgroup. */
|
||||
.simplecolorpicker span.vr {
|
||||
border-left: 1px solid #222; /* @gray-dark */
|
||||
}
|
||||
|
||||
.simplecolorpicker span.color[data-selected]:after {
|
||||
/*font-family: 'FontAwesome';*/
|
||||
-webkit-font-smoothing: antialiased;
|
||||
|
||||
content: '\2714'; /* Ok/check mark */
|
||||
|
||||
margin-right: 2px;
|
||||
margin-left: 2px;
|
||||
}
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
ul.tagit {
|
||||
padding: 1px 5px;
|
||||
overflow: auto;
|
||||
margin-left: inherit; /* usually we don't want the regular ul margins. */
|
||||
margin-right: inherit;
|
||||
}
|
||||
ul.tagit li {
|
||||
display: block;
|
||||
float: left;
|
||||
margin: 2px 5px 2px 0;
|
||||
}
|
||||
ul.tagit li.tagit-choice {
|
||||
padding: .2em 18px .2em .5em;
|
||||
position: relative;
|
||||
line-height: inherit;
|
||||
}
|
||||
ul.tagit li.tagit-new {
|
||||
padding: .25em 4px .25em 0;
|
||||
}
|
||||
|
||||
ul.tagit li.tagit-choice a.tagit-label {
|
||||
cursor: pointer;
|
||||
text-decoration: none;
|
||||
}
|
||||
ul.tagit li.tagit-choice .tagit-close {
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
right: .1em;
|
||||
top: 50%;
|
||||
margin-top: -8px;
|
||||
}
|
||||
|
||||
/* used for some custom themes that don't need image icons */
|
||||
ul.tagit li.tagit-choice .tagit-close .text-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
ul.tagit li.tagit-choice input {
|
||||
display: block;
|
||||
float: left;
|
||||
margin: 2px 5px 2px 0;
|
||||
}
|
||||
ul.tagit input[type="text"] {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
|
||||
border: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: inherit;
|
||||
background-color: inherit;
|
||||
outline: none;
|
||||
}
|
|
@ -1,239 +0,0 @@
|
|||
#forum_list div.list-item {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#forum_list div.list-item .last-author {
|
||||
font-size: 80%;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
#forum_list div.list-item .last-author a {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
#forum_list > ul > li {
|
||||
float: left;
|
||||
width: 44%;
|
||||
padding: 0;
|
||||
margin: 15px 3% 0 0;
|
||||
}
|
||||
|
||||
#forum_list div.project-forums {
|
||||
border-bottom: 1px solid #CCC;
|
||||
padding-top: 20px;
|
||||
clear: left;
|
||||
}
|
||||
|
||||
#forum_list > ul {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
#forum_list > ul > li.even {
|
||||
margin-right: 0;
|
||||
width: 46%;
|
||||
}
|
||||
|
||||
#forum_list > ul > li.odd {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
#forum_list > ul > li.odd, #forum_list > ul > li.even {
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
.topic {
|
||||
padding: 10px 0 20px;
|
||||
}
|
||||
|
||||
div.topic p {
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
div.topic h3.subject {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
div.topic ul.meta {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
div.topic ul.meta li {
|
||||
display: block;
|
||||
float: left;
|
||||
font-size: 11px;
|
||||
color: #999;
|
||||
margin-right: 8px;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
#topics_list div.title-bar h4 {
|
||||
padding: 15px 0;
|
||||
border-bottom: 1px dotted #bbb;
|
||||
}
|
||||
|
||||
input.questions-search {
|
||||
background: url(/images/magnifier.png) no-repeat 6px 50%;
|
||||
border: 1px solid #D7D7D7;
|
||||
background-color: white;
|
||||
padding-left: 30px;
|
||||
border-radius: 3px;
|
||||
height: 1.5em;
|
||||
width: 94%;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
input.questions-search.ajax-loading {
|
||||
background-image: url(/images/loading.gif);
|
||||
}
|
||||
|
||||
div.message.reply {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
div.message.reply div.avatar {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
div.message.reply div.reply-details.use-avatar {
|
||||
padding-left: 50px;
|
||||
}
|
||||
|
||||
div.message.reply .author{
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
div.message.reply .wiki > p:first-child {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
div.message.reply .contextual .icon.vote {
|
||||
position: relative;
|
||||
bottom: 5px;
|
||||
}
|
||||
|
||||
div.message.details img.gravatar {
|
||||
float: left;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
div.message.details p.author {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
div.message.details .wiki {
|
||||
margin-top: 15px;
|
||||
padding-top: 10px;
|
||||
border-top: 1px dotted #BBB;
|
||||
}
|
||||
|
||||
/* Question meta */
|
||||
|
||||
#sidebar ul.question-meta, #sidebar ul.related-topics {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
#sidebar ul.question-meta li {
|
||||
margin-bottom: 10px;
|
||||
padding-left: 20px;
|
||||
padding-top: 2px;
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
|
||||
#sidebar ul.related-topics li {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
/* Tags cloud */
|
||||
|
||||
#sidebar ul.questions-tags {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
#sidebar ul.questions-tags li {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#sidebar ul.questions-tags span.count {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* TAGS
|
||||
/**********************************************************************/
|
||||
.message-tags-edit ul.tagit li.tagit-choice:hover, ul.tagit li.tagit-choice.remove {
|
||||
background-color: #E5E5E5;
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.message-tags-edit ul.tagit {
|
||||
border: 1px solid #D7D7D7;
|
||||
-moz-border-radius: 0px;
|
||||
-webkit-border-radius: 0px;
|
||||
-khtml-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
background: white;
|
||||
padding: 0px;
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
.message-tags-edit ul.tagit li.tagit-choice {
|
||||
font-weight: normal;
|
||||
-moz-border-radius: 0px;
|
||||
-webkit-border-radius: 0px;
|
||||
border-radius: 0px;
|
||||
font-size: 11px;
|
||||
color: inherit;
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
background-color: #F7F7F7;
|
||||
margin: 1px;
|
||||
}
|
||||
|
||||
.message-tags-edit ul.tagit li.tagit-choice {
|
||||
font-weight: normal;
|
||||
font-size: 11px;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
.message-tags-edit ul.tagit li.tagit-choice a.tagit-close {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.message-tags-edit ul.tagit li.tagit-choice .tagit-close .text-icon {
|
||||
display: inline;
|
||||
line-height: 16px;
|
||||
}
|
||||
|
||||
.message-tags-edit ul.tagit li.tagit-choice .ui-icon {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.message-tags-edit ul.tagit li.tagit-new {
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
.message-tags-edit ul.tagit li.tagit-new input {
|
||||
font-size: 11px;
|
||||
background: white;
|
||||
margin-bottom: 2px;
|
||||
margin-left: 2px;
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
/* ICONS
|
||||
/**********************************************************************/
|
||||
|
||||
.icon-vote { background-image: url(../images/thumb_up.png); }
|
||||
.icon-unvote { background-image: url(../images/unvote.png); }
|
||||
.icon-view { background-image: url(../images/eye.png); }
|
||||
.icon-calendar { background-image: url(/images/calendar.png); }
|
||||
.icon-tag { background-image: url(../images/tag_blue.png); }
|
|
@ -0,0 +1,402 @@
|
|||
/**********************************************************************/
|
||||
/* SECTION list
|
||||
/**********************************************************************/
|
||||
|
||||
.section-list {margin-top: 10px}
|
||||
.section-list .section-tile {
|
||||
text-align: center;
|
||||
display: inline-block;
|
||||
width: 29%;
|
||||
border: 1px solid #e0e0e0;
|
||||
margin: 0 .8% 20px;
|
||||
padding: 1.5em 1em;
|
||||
cursor: pointer;
|
||||
-webkit-transition: background .15s;
|
||||
-moz-transition: background .15s;
|
||||
-o-transition: background .15s;
|
||||
transition: background .15s;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.section-list .section-tile:hover {
|
||||
text-decoration: none;
|
||||
background: #f8f8f8
|
||||
}
|
||||
.section-list .section-tile .description {
|
||||
color: #999;
|
||||
}
|
||||
/**********************************************************************/
|
||||
/* QUESTION index
|
||||
/**********************************************************************/
|
||||
|
||||
.questions h2.section-title {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.questions .filters {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.questions-filters {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.questions-filters > ul > li {
|
||||
list-style-type: none;
|
||||
float: left;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.questions-filters > ul > li:not(:last-child):after {
|
||||
content: " |"
|
||||
}
|
||||
|
||||
.questions-filters > ul > li a.selected {
|
||||
color: #888;
|
||||
}
|
||||
|
||||
#forum_list div.list-item {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
#forum_list div.list-item .last-author {
|
||||
font-size: 80%;
|
||||
color: gray;
|
||||
}
|
||||
|
||||
#forum_list div.list-item .last-author a {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
#forum_list > ul > li {
|
||||
float: left;
|
||||
width: 44%;
|
||||
padding: 0;
|
||||
margin: 15px 3% 0 0;
|
||||
}
|
||||
|
||||
#forum_list div.project-forums {
|
||||
border-bottom: 1px solid #CCC;
|
||||
padding-top: 20px;
|
||||
clear: left;
|
||||
}
|
||||
|
||||
#forum_list > ul {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
#forum_list > ul > li.even {
|
||||
margin-right: 0;
|
||||
width: 46%;
|
||||
}
|
||||
|
||||
#forum_list > ul > li.odd {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
#forum_list > ul > li.odd, #forum_list > ul > li.even {
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
.topic {
|
||||
padding: 20px 0 20px;
|
||||
}
|
||||
|
||||
.comment_container .topic{
|
||||
padding: 5px 0 5px;
|
||||
}
|
||||
|
||||
div.topic p {
|
||||
margin: 5px 0;
|
||||
}
|
||||
|
||||
div.topic h3.subject {
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
div.topic ul.meta {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
div.topic ul.meta li {
|
||||
display: block;
|
||||
float: left;
|
||||
font-size: 11px;
|
||||
color: #999;
|
||||
margin-right: 8px;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
div.topic ul.meta li a {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
#topics_container.votable .topic-vote {float: left; width: 60px; text-align: center;}
|
||||
#topics_container.votable .topic-content {padding-left: 60px;}
|
||||
#topics_container.votable .topic-vote .vote-score {display: block; font-size: 24px;}
|
||||
#topics_container.votable .topic-vote .vote-score {display: block; font-size: 24px;}
|
||||
#topics_container.votable .topic-vote label {color: #999; line-height: 1; font-size: 12px; margin-bottom: 3px; display: block;}
|
||||
#topics_container.votable .topic-vote .status-answered {
|
||||
height: 30px;
|
||||
width: 35px;
|
||||
background-position: -35px -75px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
#topics_list div.title-bar h4 {
|
||||
padding: 15px 0;
|
||||
border-bottom: 1px dotted #bbb;
|
||||
}
|
||||
|
||||
input.questions-search {
|
||||
background: url(/images/magnifier.png) no-repeat 6px 50%;
|
||||
border: 1px solid #D7D7D7;
|
||||
background-color: white;
|
||||
padding-left: 30px !important;
|
||||
border-radius: 3px;
|
||||
height: 1.5em;
|
||||
width: 94%;
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
input.questions-search.ajax-loading {
|
||||
background-image: url(/images/loading.gif);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* QUESTION show
|
||||
/**********************************************************************/
|
||||
|
||||
h1.question-title {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
div.question.answer {
|
||||
margin-bottom: 20px;
|
||||
padding-top: 10px;
|
||||
border-top: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.question a[disabled] {
|
||||
color: #aaa;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
div.question img.gravatar {
|
||||
float: left;
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
div.question p.author {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
.question-status-tag {
|
||||
font-family: Verdana, sans-serif;
|
||||
background-color: #759FCF;
|
||||
border: 1px solid rgba(0, 0, 0, 0.2);
|
||||
border-radius: 3px;
|
||||
padding: 2px 4px;
|
||||
font-size: 10px;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
color: white;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
/* Question vote*/
|
||||
|
||||
div.question {display: table; width: 100%;}
|
||||
div.question.votable .vote {display: table-cell; padding: 0px 12px;}
|
||||
div.question.votable .question-container {display: table-cell;vertical-align: top;}
|
||||
div.question.votable .question-container .contextual {margin-top: 0px;}
|
||||
|
||||
.question .vote a.disabled {pointer-events: none;opacity: 0.5}
|
||||
.question .vote {font-size: 24px; width: 35px;}
|
||||
|
||||
.question .vote .vote-up,
|
||||
.question .vote .vote-down,
|
||||
.question .vote .vote-count,
|
||||
.question .vote .accepted {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
margin-bottom: 2px;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.question .vote .vote-up,
|
||||
.question .vote .vote-down,
|
||||
.question .vote .accepted,
|
||||
#topics_container.votable .topic-vote .status-answered {
|
||||
background-image: url(../images/voting.svg);
|
||||
background-size: initial;
|
||||
background-repeat: no-repeat;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.question .vote .accepted {cursor: default; background-position: 0px -69px;}
|
||||
.question .vote .vote-up {background-position: -70px 0px;}
|
||||
.question .vote .vote-down {background-position: -35px 0px;}
|
||||
.question .vote .vote-count {height: 32px;}
|
||||
/*.question .vote .vote-up:hover {background-position: -70px -35px;}
|
||||
.question .vote .vote-down:hover {background-position: -35px -35px;}
|
||||
*/
|
||||
.question div.attachments {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
/* Question meta */
|
||||
|
||||
#sidebar ul.question-meta, #sidebar ul.related-topics {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
#sidebar ul.question-meta li {
|
||||
margin-bottom: 10px;
|
||||
padding-left: 20px;
|
||||
padding-top: 2px;
|
||||
padding-bottom: 3px;
|
||||
}
|
||||
|
||||
#sidebar ul.related-topics li {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
/* Tags cloud */
|
||||
|
||||
#sidebar ul.questions-tags {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
#sidebar ul.questions-tags li {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
#sidebar ul.questions-tags span.count {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
/**********************************************************************/
|
||||
/* SOLUTION show
|
||||
/**********************************************************************/
|
||||
.question.solution > h2 {
|
||||
margin-bottom: 0px;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.question.solution .liking {
|
||||
padding: 10px 0px;
|
||||
border-top: 1px solid #ddd;
|
||||
border-bottom: 1px solid #ddd;
|
||||
margin: 10px 0px
|
||||
}
|
||||
|
||||
.question.solution .liking > a {
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
|
||||
.question.solution .liking .author {
|
||||
float: right;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* COMMENTS
|
||||
/**********************************************************************/
|
||||
|
||||
.comments_container {
|
||||
background-color: #f5f5f5;
|
||||
font-size: 0.9em;
|
||||
margin: 10px 0px 0px 10px;
|
||||
}
|
||||
|
||||
.question-comments .comment .contextual {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.question-comments .comment:hover .contextual {
|
||||
display: inline-block;
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
.question-comments .comment .contextual:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
|
||||
.question-comments .comment {
|
||||
padding: 10px;
|
||||
border-bottom: 1px dashed #ccc;
|
||||
}
|
||||
|
||||
.question-comments .comment:last-child {
|
||||
border-bottom: 0px;
|
||||
}
|
||||
|
||||
.question-comments .comment .author {
|
||||
margin-bottom: 3px;
|
||||
}
|
||||
|
||||
.question-comments .comment .wiki-content {
|
||||
color: #707070;
|
||||
display: inline-block;
|
||||
}
|
||||
.comments_container .comment .wiki-content p {
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
.question-comments .comment .wiki-content p:first-child {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
.add-comment-link {
|
||||
font-size: 0.9em;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.add_comments {padding: 10px 10px 10px;}
|
||||
.add_comments:not(:first-child) {border-top: 1px dashed #ccc;}
|
||||
|
||||
.add_comments textarea {
|
||||
width: 98%;
|
||||
}
|
||||
|
||||
/* Answers*/
|
||||
|
||||
#answers {
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.accepted_answer{
|
||||
float: right;
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* ICONS
|
||||
/**********************************************************************/
|
||||
|
||||
.icon-vote { background-image: url(../images/thumb_up.png); }
|
||||
.icon-unvote { background-image: url(../images/unvote.png); }
|
||||
.icon-downvote { background-image: url(../images/thumb_down.png); }
|
||||
.icon-view { background-image: url(../images/eye.png); }
|
||||
.icon-calendar { background-image: url(/images/calendar.png); }
|
||||
.icon-tag { background-image: url(../images/tag_blue.png); }
|
||||
.icon-question { background-image: url(../../../images/help.png); }
|
||||
.icon-solution { background-image: url(../images/book_open.png); }
|