Merge remote branch 'upstream/master'

This commit is contained in:
Alec Leamas 2010-10-24 14:21:52 +02:00
commit 1a0fcd1500
12 changed files with 240 additions and 16 deletions

View file

@ -12,7 +12,7 @@
= render "shared/aspect_friends" = render "shared/aspect_friends"
.span-15.last .span-15.last
= render "shared/publisher", :type => :album, :aspect => @aspect.id = render "shared/publisher", :type => :album, :aspect => @aspect
%div %div
- for album in @albums - for album in @albums

View file

@ -16,12 +16,15 @@
= stylesheet_link_tag "application", "ui" = stylesheet_link_tag "application", "ui"
= stylesheet_link_tag "/../javascripts/fancybox/jquery.fancybox-1.3.1" = stylesheet_link_tag "/../javascripts/fancybox/jquery.fancybox-1.3.1"
= stylesheet_link_tag "fileuploader" = stylesheet_link_tag "fileuploader"
= stylesheet_link_tag "tipsy"
- if current_user - if current_user
%link{:rel => "alternate", :href => "#{current_user.public_url}", :type => "application/atom+xml", :title => "Public Diaspora Feed for #{current_user.real_name}"} %link{:rel => "alternate", :href => "#{current_user.public_url}", :type => "application/atom+xml", :title => "Public Diaspora Feed for #{current_user.real_name}"}
/= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" /= javascript_include_tag "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"
= javascript_include_tag 'jquery-1.4.2.min', 'rails' = javascript_include_tag 'jquery-1.4.2.min', 'rails'
= javascript_include_tag 'jquery.infieldlabel', 'jquery.cycle/jquery.cycle.min.js' = javascript_include_tag 'jquery.infieldlabel', 'jquery.cycle/jquery.cycle.min.js'
= javascript_include_tag 'jquery.tipsy'
= javascript_include_tag 'fancybox/jquery.fancybox-1.3.1.pack' = javascript_include_tag 'fancybox/jquery.fancybox-1.3.1.pack'
= javascript_include_tag 'fileuploader' = javascript_include_tag 'fileuploader'

View file

@ -4,7 +4,7 @@
%li.message{:data=>{:guid=>post.id}} %li.message{:data=>{:guid=>post.id}}
= person_image_tag(post.person) = person_image_link(post.person)
.content .content
.from .from

View file

@ -4,18 +4,24 @@
#left_pane #left_pane
%h2= @aspect - if @aspect == :all
%h2= "Everyone"
- else
%h2= @aspect
.friend_pictures .friend_pictures
= owner_image_link = owner_image_link
- for friend in @friends - for friend in @friends
= person_image_link(friend) = person_image_link(friend)
- if @logged_in && (@aspect == :public) - if @logged_in && (@aspect == :public)
%h3 Facebook Friends %h3 Facebook Friends
- @fb_friends = MiniFB.get(@access_token, 'me', :type => "friends") - @fb_friends = MiniFB.get(@access_token, 'me', :type => "friends")
- @fb_friends[:data].each do |friend| - @fb_friends[:data].each do |friend|
= image_tag( "http://graph.facebook.com/#{friend[:id]}/picture" ) = image_tag( "http://graph.facebook.com/#{friend[:id]}/picture" )
-unless (@aspect == :all) -unless (@aspect == :all)
= link_to (image_tag('add_friend_button.png', :height => "50px", :width => "50px")), "#add_request_pane", :id => 'add_request_button' = link_to (image_tag('add_friend_button.png', :title => "add to #{@aspect}")), "#add_request_pane", :id => 'add_request_button'
.fancybox_content .fancybox_content
#add_request_pane #add_request_pane

View file

@ -10,7 +10,7 @@
%li{:class => ("selected" if current_aspect?(aspect))} %li{:class => ("selected" if current_aspect?(aspect))}
= link_for_aspect aspect = link_for_aspect aspect
%li %li
= link_to '+', '#add_aspect_pane', :class => "add_aspect_button" = link_to '+', '#add_aspect_pane', :class => "add_aspect_button", :title => "add a new aspect"
%ul{ :style => "position:absolute;right:0;bottom:0.01em;"} %ul{ :style => "position:absolute;right:0;bottom:0.01em;"}
%li{ :style => "margin-right:0;", :class => ("selected" if @aspect == :manage)} %li{ :style => "margin-right:0;", :class => ("selected" if @aspect == :manage)}

View file

@ -53,7 +53,7 @@
= album.label :name = album.label :name
= album.text_field :name = album.text_field :name
= album.hidden_field :to, :value => aspect = album.hidden_field :to, :value => (aspect == :all ? aspect : aspect.id)
.options_and_submit .options_and_submit
= album.submit "Create", :class => 'button' = album.submit "Create", :class => 'button'

BIN
public/images/tipsy.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 B

View file

@ -0,0 +1,202 @@
// tipsy, facebook style tooltips for jquery
// version 1.0.0a
// (c) 2008-2010 jason frame [jason@onehackoranother.com]
// released under the MIT license
(function($) {
function Tipsy(element, options) {
this.$element = $(element);
this.options = options;
this.enabled = true;
this.fixTitle();
}
Tipsy.prototype = {
show: function() {
var title = this.getTitle();
if (title && this.enabled) {
var $tip = this.tip();
$tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);
$tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
$tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).appendTo(document.body);
var pos = $.extend({}, this.$element.offset(), {
width: this.$element[0].offsetWidth,
height: this.$element[0].offsetHeight
});
var actualWidth = $tip[0].offsetWidth, actualHeight = $tip[0].offsetHeight;
var gravity = (typeof this.options.gravity == 'function')
? this.options.gravity.call(this.$element[0])
: this.options.gravity;
var tp;
switch (gravity.charAt(0)) {
case 'n':
tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
break;
case 's':
tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
break;
case 'e':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
break;
case 'w':
tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
break;
}
if (gravity.length == 2) {
if (gravity.charAt(1) == 'w') {
tp.left = pos.left + pos.width / 2 - 15;
} else {
tp.left = pos.left + pos.width / 2 - actualWidth + 15;
}
}
$tip.css(tp).addClass('tipsy-' + gravity);
if (this.options.fade) {
$tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});
} else {
$tip.css({visibility: 'visible', opacity: this.options.opacity});
}
}
},
hide: function() {
if (this.options.fade) {
this.tip().stop().fadeOut(function() { $(this).remove(); });
} else {
this.tip().remove();
}
},
fixTitle: function() {
var $e = this.$element;
if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {
$e.attr('original-title', $e.attr('title') || '').removeAttr('title');
}
},
getTitle: function() {
var title, $e = this.$element, o = this.options;
this.fixTitle();
var title, o = this.options;
if (typeof o.title == 'string') {
title = $e.attr(o.title == 'title' ? 'original-title' : o.title);
} else if (typeof o.title == 'function') {
title = o.title.call($e[0]);
}
title = ('' + title).replace(/(^\s*|\s*$)/, "");
return title || o.fallback;
},
tip: function() {
if (!this.$tip) {
this.$tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
}
return this.$tip;
},
validate: function() {
if (!this.$element[0].parentNode) {
this.hide();
this.$element = null;
this.options = null;
}
},
enable: function() { this.enabled = true; },
disable: function() { this.enabled = false; },
toggleEnabled: function() { this.enabled = !this.enabled; }
};
$.fn.tipsy = function(options) {
if (options === true) {
return this.data('tipsy');
} else if (typeof options == 'string') {
var tipsy = this.data('tipsy');
if (tipsy) tipsy[options]();
return this;
}
options = $.extend({}, $.fn.tipsy.defaults, options);
function get(ele) {
var tipsy = $.data(ele, 'tipsy');
if (!tipsy) {
tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));
$.data(ele, 'tipsy', tipsy);
}
return tipsy;
}
function enter() {
var tipsy = get(this);
tipsy.hoverState = 'in';
if (options.delayIn == 0) {
tipsy.show();
} else {
tipsy.fixTitle();
setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);
}
};
function leave() {
var tipsy = get(this);
tipsy.hoverState = 'out';
if (options.delayOut == 0) {
tipsy.hide();
} else {
setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);
}
};
if (!options.live) this.each(function() { get(this); });
if (options.trigger != 'manual') {
var binder = options.live ? 'live' : 'bind',
eventIn = options.trigger == 'hover' ? 'mouseenter' : 'focus',
eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';
this[binder](eventIn, enter)[binder](eventOut, leave);
}
return this;
};
$.fn.tipsy.defaults = {
delayIn: 0,
delayOut: 0,
fade: false,
fallback: '',
gravity: 'n',
html: false,
live: false,
offset: 0,
opacity: 0.8,
title: 'title',
trigger: 'hover'
};
// Overwrite this method to provide options on a per-element basis.
// For example, you could store the gravity in a 'tipsy-gravity' attribute:
// return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });
// (remember - do not modify 'options' in place!)
$.fn.tipsy.elementOptions = function(ele, options) {
return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;
};
$.fn.tipsy.autoNS = function() {
return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';
};
$.fn.tipsy.autoWE = function() {
return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';
};
})(jQuery);

View file

@ -68,6 +68,9 @@ $(document).ready(function(){
}; };
}); });
$("img", "#left_pane").tipsy({live:true});
$(".add_aspect_button", "#aspect_nav").tipsy({gravity:'w'});
});//end document ready });//end document ready
@ -136,3 +139,4 @@ $(".comment_box").live('blur', function(evt){
$this.attr("rows", 1); $this.attr("rows", 1);
} }
}); });

View file

@ -824,10 +824,6 @@ h1.big_text
#aspect_nav #aspect_nav
:color #000 :color #000
:margin
:top 0
:bottom 1px
:font :font
:family 'Arial', 'Helvetica', sans-serif :family 'Arial', 'Helvetica', sans-serif
@ -856,7 +852,7 @@ h1.big_text
:line :line
:height 22px :height 22px
:padding 3px 10px :padding 4px 10px
:color #CCC :color #CCC
&:hover &:hover

View file

@ -0,0 +1,12 @@
.tipsy { padding: 5px; font-size: 10px; position: absolute; z-index: 100000; }
.tipsy-inner { padding: 5px 8px 4px 8px; background-color: black; color: white; max-width: 200px; text-align: center; }
.tipsy-inner { border-radius: 3px; -moz-border-radius:3px; -webkit-border-radius:3px; }
.tipsy-arrow { position: absolute; background: url('../images/tipsy.gif') no-repeat top left; width: 9px; height: 5px; }
.tipsy-n .tipsy-arrow { top: 0; left: 50%; margin-left: -4px; }
.tipsy-nw .tipsy-arrow { top: 0; left: 10px; }
.tipsy-ne .tipsy-arrow { top: 0; right: 10px; }
.tipsy-s .tipsy-arrow { bottom: 0; left: 50%; margin-left: -4px; background-position: bottom left; }
.tipsy-sw .tipsy-arrow { bottom: 0; left: 10px; background-position: bottom left; }
.tipsy-se .tipsy-arrow { bottom: 0; right: 10px; background-position: bottom left; }
.tipsy-e .tipsy-arrow { top: 50%; margin-top: -4px; right: 0; width: 5px; height: 9px; background-position: top right; }
.tipsy-w .tipsy-arrow { top: 50%; margin-top: -4px; left: 0; width: 5px; height: 9px; }

View file

@ -15,13 +15,14 @@ describe Diaspora::Parser do
describe "parsing compliant XML object" do describe "parsing compliant XML object" do
it 'should be able to correctly handle comments with person in db' do it 'should be able to correctly handle comments with person in db' do
post = user.post :status_message, :message => "hello", :to => aspect.id post = user.post :status_message, :message => "hello", :to => aspect.id
comment = Factory.build(:comment, :post => post, :person => @person, :text => "Freedom!") comment = Factory.build(:comment, :post => post, :person => person, :text => "Freedom!")
comment.delete
xml = comment.to_diaspora_xml xml = comment.to_diaspora_xml
comment = Diaspora::Parser.from_xml(xml) comment_from_xml = Diaspora::Parser.from_xml(xml)
comment.text.should == "Freedom!" comment_from_xml.text.should == "Freedom!"
comment.person.should == @person comment_from_xml.person.should == person
comment.post.should == post comment_from_xml.post.should == post
end end
it 'should be able to correctly handle person on a comment with person not in db' do it 'should be able to correctly handle person on a comment with person not in db' do