diff options
| -rw-r--r-- | actions/likes/add.php | 6 | ||||
| -rw-r--r-- | actions/likes/delete.php | 2 | ||||
| -rw-r--r-- | engine/lib/elgglib.php | 9 | ||||
| -rw-r--r-- | js/lib/ui.js | 139 | ||||
| -rw-r--r-- | languages/en.php | 4 | ||||
| -rw-r--r-- | views/default/annotation/likes.php | 76 | ||||
| -rw-r--r-- | views/default/core/likes/display.php | 61 | ||||
| -rw-r--r-- | views/default/core/river/controls.php | 24 | ||||
| -rw-r--r-- | views/default/css/screen.php | 21 | ||||
| -rw-r--r-- | views/default/forms/likes/edit.php | 57 | ||||
| -rw-r--r-- | views/default/js/elgg.php | 173 | 
11 files changed, 186 insertions, 386 deletions
| diff --git a/actions/likes/add.php b/actions/likes/add.php index 3de1ebc51..9abe0b60e 100644 --- a/actions/likes/add.php +++ b/actions/likes/add.php @@ -20,6 +20,12 @@ if (!$entity) {  	forward(REFERER);  } +// cannot like your own stuff +if (get_loggedin_userid() == $entity->getOwnerGUID()) { +	register_error(elgg_echo("likes:no_self_like")); +	forward(REFERER); +} +  $user = get_loggedin_user();  $annotation = create_annotation($entity->guid,  								'likes', diff --git a/actions/likes/delete.php b/actions/likes/delete.php index 45984b581..7ccf2de37 100644 --- a/actions/likes/delete.php +++ b/actions/likes/delete.php @@ -20,7 +20,7 @@ if ($likes = get_annotation($annotation_id)) {  	if ($likes->canEdit()) {  		$likes->delete();  		system_message(elgg_echo("likes:deleted")); -		forward($entity->getURL()); +		forward(REFERER);  	}  } else { diff --git a/engine/lib/elgglib.php b/engine/lib/elgglib.php index 8d2b8ed91..bc0b1b5af 100644 --- a/engine/lib/elgglib.php +++ b/engine/lib/elgglib.php @@ -333,7 +333,7 @@ function elgg_get_external_file($type, $location) {   * @return string|false The HTML for the likes, or false on failure   *   * @since 1.8 - * @see @elgg_view forms/likes/edit + * @see @elgg_view core/likes/display   */  function elgg_view_likes($entity) {  	if (!($entity instanceof ElggEntity)) { @@ -342,12 +342,7 @@ function elgg_view_likes($entity) {  	$params = array('entity' => $entity); -	if ($likes = elgg_trigger_plugin_hook('likes', $entity->getType(), $params, false)) { -		return $likes; -	} else { -		$likes = elgg_view('forms/likes/edit', $params); -		return $likes; -	} +	return elgg_view('core/likes/display', $params);  }  /** diff --git a/js/lib/ui.js b/js/lib/ui.js index 02d49794d..a1d852e5a 100644 --- a/js/lib/ui.js +++ b/js/lib/ui.js @@ -8,22 +8,11 @@ elgg.ui.init = function () {  	$('.elgg-toggle').live('click', elgg.ui.toggle);
 -	$('.elgg-menu-parent').live('click', elgg.ui.menuToggle);
 +	$('.elgg-menu-parent').live('click', elgg.ui.toggleMenu);
 +	$('.elgg-like-toggle').live('click', elgg.ui.toggleLikes);
  	$('a.collapsibleboxlink').click(elgg.ui.toggleCollapsibleBox);
 -
 -	// set-up hover class for dragged widgets
 -	var cols = [
 -		"#rightcolumn_widgets",
 -		"#middlecolumn_widgets",
 -		"#leftcolumn_widgets"
 -	].join(',');
 -	
 -	$(cols).droppable({
 -		accept: ".draggable_widget",
 -		hoverClass: 'droppable-hover'
 -	});
  };
  /**
 @@ -48,7 +37,7 @@ elgg.ui.toggle = function(event) {   * @param {Object} event
   * @return void
   */
 -elgg.ui.menuToggle = function(event) {
 +elgg.ui.toggleMenu = function(event) {
  	$(this).siblings().slideToggle('medium');
  	$(this).toggleClass('elgg-menu-closed elgg-menu-opened');
  	event.preventDefault();
 @@ -60,103 +49,31 @@ elgg.ui.toggleCollapsibleBox = function () {  	return false;
  };
 -//define some helper jquery plugins
 -(function($) {
 -	
 -	// ELGG TOOLBAR MENU
 -	$.fn.elgg_topbardropdownmenu = function(options) {
 -		var defaults = {
 -			speed: 350
 -		};
 -		
 -		options = $.extend(defaults, options || {});
 -	
 -		this.each(function() {
 -		
 -			var root = this, zIndex = 5000;
 -		
 -			function getSubnav(ele) {
 -				if (ele.nodeName.toLowerCase() === 'li') {
 -					var subnav = $('> ul', ele);
 -					return subnav.length ? subnav[0] : null;
 -				} else {
 -					return ele;
 -				}
 -			}
 -		
 -			function getActuator(ele) {
 -				if (ele.nodeName.toLowerCase() === 'ul') {
 -					return $(ele).parents('li')[0];
 -				} else {
 -					return ele;
 -				}
 -			}
 -		
 -			function hide() {
 -				var subnav = getSubnav(this);
 -				if (!subnav) {
 -					return;
 -				}
 -			
 -				$.data(subnav, 'cancelHide', false);
 -				setTimeout(function() {
 -					if (!$.data(subnav, 'cancelHide')) {
 -						$(subnav).slideUp(100);
 -					}
 -				}, 250);
 -			}
 -		
 -			function show() {
 -				var subnav = getSubnav(this), li;
 -				
 -				if (!subnav) {
 -					return;
 -				}
 -				
 -				$.data(subnav, 'cancelHide', true);
 -				
 -				$(subnav).css({zIndex: zIndex}).slideDown(options.speed);
 -				zIndex++;
 -				
 -				if (this.nodeName.toLowerCase() === 'ul') {
 -					li = getActuator(this);
 -					$(li).addClass('hover');
 -					$('> a', li).addClass('hover');
 -				}
 -			}
 -		
 -			$('ul, li', this).hover(show, hide);
 -			$('li', this).hover(
 -				function () { 
 -					$(this).addClass('hover');
 -					$('> a', this).addClass('hover');
 -				},
 -				function () { 
 -					$(this).removeClass('hover');
 -					$('> a', this).removeClass('hover');
 -				}
 -			);
 -		
 +/**
 + * Toggles the likes list
 + *
 + * @param {Object} event
 + * @return void
 + */
 +elgg.ui.toggleLikes = function(event) {
 +	var $list = $(this).next(".elgg-likes-list");
 +	var position = $(this).position();
 +	var startTop = position.top;
 +	var stopTop = position.top - $list.height();
 +	if ($list.css('display') == 'none') {
 +		$('.elgg-likes-list').fadeOut();
 +
 +		$list.css('top', startTop);
 +		$list.css('left', position.left - $list.width());
 +		$list.animate({opacity: "toggle", top: stopTop}, 500);
 +
 +		$list.click(function(event) {
 +			$list.fadeOut();
  		});
 -	};
 -	
 -	//Make delimited list
 -	$.fn.makeDelimitedList = function(elementAttribute) {
 -	
 -		var delimitedListArray = [], 
 -			listDelimiter = "::";
 -	
 -		// Loop over each element in the stack and add the elementAttribute to the array
 -		this.each(function(e) {
 -				var listElement = $(this);
 -				// Add the attribute value to our values array
 -				delimitedListArray[delimitedListArray.length] = listElement.attr(elementAttribute);
 -			}
 -		);
 -	
 -		// Return value list by joining the array
 -		return delimitedListArray.join(listDelimiter);
 -	};
 -})(jQuery);
 +	} else {
 +		$list.animate({opacity: "toggle", top: startTop}, 500);
 +	}
 +	event.preventDefault();
 +}
  elgg.register_event_handler('init', 'system', elgg.ui.init);
\ No newline at end of file diff --git a/languages/en.php b/languages/en.php index 639439ee1..2f946a945 100644 --- a/languages/en.php +++ b/languages/en.php @@ -966,7 +966,9 @@ If you requested this click on the link below, otherwise ignore this email.   **/  	'likes:this' => 'liked this',  	'likes:deleted' => 'Your like has been removed', -	'likes:remove' => 'See who else liked this', +	'likes:see' => 'See who else liked this', +	'likes:remove' => 'Unlike this', +	'likes:no_self_like' => 'You cannot like your own content',  	'likes:notdeleted' => 'There was a problem removing your like',  	'likes:likes' => 'You now like this item',  	'likes:failure' => 'There was a problem liking this item', diff --git a/views/default/annotation/likes.php b/views/default/annotation/likes.php index 3fdf2349b..20965f456 100644 --- a/views/default/annotation/likes.php +++ b/views/default/annotation/likes.php @@ -1,40 +1,48 @@  <?php  /** - * Elgg show the user who liked the object + * Elgg show the users who liked the object + * + * @uses $vars['annotation']   */ -$owner = get_user($vars['annotation']->owner_guid); +if (!isset($vars['annotation'])) { +	return true; +} -?> -<div class="elgg-likes-user clearfix"> -	<div class="entity-listing-icon"> -		<?php -			echo elgg_view("profile/icon", array( -					'entity' => $owner, -					'size' => 'tiny' -					)); -		?> -	</div> -	 -	<div class="entity-listing-info"> -		<?php -		// if the user looking at the like listing can edit, show the delete link -		if ($vars['annotation']->canEdit()) { -		?> -			<div class="entity-metadata"><span class="delete-button"> -				<?php echo elgg_view("output/confirmlink",array( -						'href' => "action/likes/delete?annotation_id=" . $vars['annotation']->id, -						'text' => elgg_echo('remove'), +$like = $vars['annotation']; + +$user = $like->getOwnerEntity(); +if (!$user) { +	return true; +} + +$user_icon = elgg_view("profile/icon", array('entity' => $user, 'size' => 'tiny')); +$user_link = elgg_view('output/url', array( +	'href' => $user->getURL(), +	'text' => $user->name, +)); + +$likes_string = elgg_echo('likes:this'); + +$friendlytime = elgg_view_friendly_time($like->time_created); + +if ($like->canEdit()) { +	$delete_button = elgg_view("output/confirmlink",array( +						'href' => "action/likes/delete?annotation_id={$like->id}", +						'text' => elgg_echo('delete'),  						'confirm' => elgg_echo('deleteconfirm') -						)); -				?> -			</span></div> -		<?php -			} //end of can edit if statement -		?> -		<p class="elgg-likes-owner"> -			<a href="<?php echo $owner->getURL(); ?>"><?php echo $owner->name; ?></a> <?php echo elgg_echo('likes:this') .  -			" <span class=\"entity-subtext\">" . elgg_view_friendly_time($vars['annotation']->time_created) . "</span>"; ?> -		</p> -	</div> -</div>
\ No newline at end of file +					)); +	$delete_button = "<span class=\"delete-button\">$delete_button</span>"; +} + +$body = <<<HTML +<p class="mbn"> +	$delete_button +	$user_link $likes_string +	<span class="elgg-list-subtitle"> +		$friendlytime +	</span> +</p> +HTML; + +echo elgg_view_image_block($user_icon, $body); diff --git a/views/default/core/likes/display.php b/views/default/core/likes/display.php new file mode 100644 index 000000000..bd0a8fa95 --- /dev/null +++ b/views/default/core/likes/display.php @@ -0,0 +1,61 @@ +<?php +/** + * Elgg likes display  + * + * @package Elgg + * + * @uses $vars['entity'] + */ + +if (!isset($vars['entity'])) { +	return true; +} + +$guid = $vars['entity']->getGUID(); + +// check to see if the user has already liked this +if (!elgg_annotation_exists($guid, 'likes')) { +	$url = elgg_get_site_url() . "action/likes/add?guid={$guid}"; +	$params = array( +		'href' => $url, +		'text' => '<span class="elgg-icon elgg-icon-likes"></span>', +		'title' => elgg_echo('likes:likethis'), +		'is_action' => true, +		'encode_text' => false, +	); +	$likes_button = elgg_view('output/url', $params); +} else { +	$likes = get_annotations($guid, '', '', 'likes', '', get_loggedin_userid()); +	$url = elgg_get_site_url() . "action/likes/delete?annotation_id={$likes[0]->id}"; +	$params = array( +		'href' => $url, +		'text' => "<span class=\"elgg-icon elgg-icon-liked\"></span>", +		'title' => elgg_echo('likes:remove'), +		'is_action' => true, +		'encode_text' => false, +	); +	$likes_button = elgg_view('output/url', $params); +} + +$list = ''; +$num_of_likes = elgg_count_likes($vars['entity']); +if ($num_of_likes) { +	// display the number of likes +	if ($num_of_likes == 1) { +		$likes_string = elgg_echo('likes:userlikedthis'); +	} else { +		$likes_string = elgg_echo('likes:userslikedthis'); +	} +	$params = array( +		'text' => "$num_of_likes $likes_string", +		'title' => elgg_echo('likes:see'), +		'class' => 'elgg-like-toggle', +	); +	$list = elgg_view('output/url', $params); +	$list .= "<div class='elgg-likes-list hidden clearfix'>"; +	$list .= list_annotations($guid, 'likes', 99); +	$list .= "</div>"; +} + +echo $likes_button; +echo $list; diff --git a/views/default/core/river/controls.php b/views/default/core/river/controls.php index e239a2adb..66fbc5059 100644 --- a/views/default/core/river/controls.php +++ b/views/default/core/river/controls.php @@ -9,7 +9,7 @@  $object = $vars['item']->getObjectEntity();  if (isloggedin()) { -	// comments and non-objects cannot be commented on +	// comments and non-objects cannot be commented on or liked  	if ($object->getType() == 'object' && $vars['item']->annotation_id == 0) {  		$params = array(  			'href' => '#', @@ -18,6 +18,26 @@ if (isloggedin()) {  			'internalid' => "elgg-toggler-{$object->getGUID()}",  		);  		echo elgg_view('output/url', $params); -		//echo elgg_view('forms/likes/link', array('entity' => $object)); +		 +		// like this +		if (!elgg_annotation_exists($object->getGUID(), 'likes')) { +			$url = "action/likes/add?guid={$object->getGUID()}"; +			$params = array( +				'href' => $url, +				'text' => elgg_echo('likes:likethis'), +				'is_action' => true, +			); +			echo elgg_view('output/url', $params); +		} else { +			$likes = get_annotations($guid, '', '', 'likes', '', get_loggedin_userid()); +			$url = elgg_get_site_url() . "action/likes/delete?annotation_id={$likes[0]->id}"; +			$params = array( +				'href' => $url, +				'text' => elgg_echo('likes:remove'), +				'is_action' => true, +			); +			echo elgg_view('output/url', $params); +		}  	} +  }
\ No newline at end of file diff --git a/views/default/css/screen.php b/views/default/css/screen.php index 3eb7e93a0..bae0404f7 100644 --- a/views/default/css/screen.php +++ b/views/default/css/screen.php @@ -760,6 +760,27 @@ a.elgg-widget-edit-button:hover, a.elgg-widget-delete-button:hover {  /* ***************************************  	LIKES  *************************************** */ +.elgg-likes-list { +	background-color: white; +	border:1px solid #cccccc; +	width: 345px; +	height: auto; +	position: absolute; +	text-align: left; +	z-index: 9999; +	-webkit-border-radius: 6px; +	-moz-border-radius: 6px; +	-webkit-box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.5); +	-moz-box-shadow: 4px 4px 4px rgba(0, 0, 0, 0.5); +} +.elgg-river-item > .elgg-alt a { +	font-size: 90%; +	float: right; +	clear: both; +} + + +  .likes-list-holder {  	position: relative;  	float:right; diff --git a/views/default/forms/likes/edit.php b/views/default/forms/likes/edit.php deleted file mode 100644 index 93c4ce983..000000000 --- a/views/default/forms/likes/edit.php +++ /dev/null @@ -1,57 +0,0 @@ -<?php -/** - * Elgg likes add form - * - * @package Elgg - * - * @uses $vars['entity'] - */ - -if (isset($vars['entity']) && isloggedin()) { -	$guid = $vars['entity']->getGUID(); -	$url = elgg_get_site_url() . "action/likes/add?guid={$guid}"; -	 -	//check to see if the user has already liked -	if (!elgg_annotation_exists($guid, 'likes') ) { -		$params = array( -			'href' => $url, -			'text' => '<span class="elgg-icon elgg-icon-likes"></span>', -			'title' => elgg_echo('likes:likethis'), -			'is_action' => true, -		); -		echo elgg_view('output/url', $params); -		$likes_classname = 'elgg-icon-likes'; -		$likes_titletag = ""; -	} else { -		$likes_classname = 'elgg-icon-liked'; -		$likes_titletag = elgg_echo('likes:remove'); -	} -	 -	//display the number of likes -	$numoflikes = elgg_count_likes($vars['entity']); -	if ($numoflikes != 0) { -		if ($numoflikes == 1) { -			$user_string = elgg_echo('likes:userlikedthis'); -		} else { -			$user_string = elgg_echo('likes:userslikedthis'); -		} - -		$params = array( -			'href' => $url, -			'text' => "<span class=\"elgg-icon $likes_classname\"></span>" . elgg_count_likes($vars['entity']) . " " . $user_string, -			'title' => $likes_titletag, -			'is_action' => true, -		); -		echo elgg_view('output/url', $params); - -		//show the users who liked the object -		echo "<div class='likes-list hidden clearfix'>"; -		echo list_annotations($vars['entity']->getGUID(), 'likes', 99); -		echo "</div>";	 -	} -} - - - - - diff --git a/views/default/js/elgg.php b/views/default/js/elgg.php index 3e7b30a99..f7f1e942c 100644 --- a/views/default/js/elgg.php +++ b/views/default/js/elgg.php @@ -65,86 +65,6 @@ $(function() {  $(document).ready(function () { -	// COLLAPSABLE WIDGETS (on Dashboard? & Profile pages) -	// toggle widget box contents -	$('a.toggle_box_contents').bind('click', toggleContent); - -	// WIDGET GALLERY EDIT PANEL -	// Sortable widgets -	var els = ['#leftcolumn_widgets', '#middlecolumn_widgets', '#rightcolumn_widgets', '#widget_picker_gallery' ]; -	var $els = $(els.toString()); - -	$els.sortable({ -		items: '.draggable_widget', -		handle: '.drag-handle', -		forcePlaceholderSize: true, -		placeholder: 'ui-state-highlight', -		cursor: 'move', -		revert: true, -		opacity: 0.9, -		appendTo: 'body', -		connectWith: els, -		start:function(e,ui) { - -		}, -		stop: function(e,ui) { -			// refresh list before updating hidden fields with new widget order -			$(this).sortable( "refresh" ); - -			var widgetNamesLeft = outputWidgetList('#leftcolumn_widgets'); -			var widgetNamesMiddle = outputWidgetList('#middlecolumn_widgets'); -			var widgetNamesRight = outputWidgetList('#rightcolumn_widgets'); - -			document.getElementById('debugField1').value = widgetNamesLeft; -			document.getElementById('debugField2').value = widgetNamesMiddle; -			document.getElementById('debugField3').value = widgetNamesRight; -		} -	}); - -	// bind more info buttons - called when new widgets are created -	widget_moreinfo(); - -	// set-up hover class for dragged widgets -	$("#rightcolumn_widgets").droppable({ -		accept: ".draggable_widget", -		hoverClass: 'droppable-hover' -	}); -	$("#middlecolumn_widgets").droppable({ -		accept: ".draggable_widget", -		hoverClass: 'droppable-hover' -	}); -	$("#leftcolumn_widgets").droppable({ -		accept: ".draggable_widget", -		hoverClass: 'droppable-hover' -	}); - -	// user likes -	$(".likes-list-button").click(function(event) { -		if ($(this).next(".likes-list").css('display') == 'none') {	// show list -			// hide any other currently viewable likes lists -			$('.likes-list').fadeOut(); - -			var topPosition = - $(this).next(".likes-list").height(); -			topPosition10 = topPosition + 10 + "px"; -			topPosition = topPosition - 5 + "px"; -			$('.likes-list').css('top',topPosition10); -			$('.likes-list').css('left', -$('.likes-list').width()+110); -			$(this).next(".likes-list").animate({opacity: "toggle", top: topPosition}, 500); - -			// set up cancel for a click outside the likes list -			$(document).click(function(event) { -					var target = $(event.target); -					if (target.parents(".likes-list-holder").length == 0) { -						$(".likes-list").fadeOut(); -					} -			}); - -		} else { // hide list -			var topPosition = - $(this).next(".likes-list").height() + 5; -			$(this).next(".likes-list").animate({opacity: "toggle", top: topPosition}, 500); -		} -	}); -  	elgg_system_message();  }); /* end document ready function */ @@ -170,99 +90,6 @@ function elgg_slide_toggle(activateLink, parentElement, toggleElement) {  	return false;  } -// List active widgets for each page column -function outputWidgetList(forElement) { -	return( $("input[name='handler'], input[name='guid']", forElement ).makeDelimitedList("value") ); -} - -// Make delimited list -jQuery.fn.makeDelimitedList = function(elementAttribute) { - -	var delimitedListArray = new Array(); -	var listDelimiter = "::"; - -	// Loop over each element in the stack and add the elementAttribute to the array -	this.each(function(e) { -			var listElement = $(this); -			// Add the attribute value to our values array -			delimitedListArray[delimitedListArray.length] = listElement.attr(elementAttribute); -		} -	); - -	// Return value list by joining the array -	return(delimitedListArray.join(listDelimiter)); -} - - -// Read each widgets collapsed/expanded state from cookie and apply -function widget_state(forWidget) { - -	var thisWidgetState = $.cookie(forWidget); - -	if (thisWidgetState == 'collapsed') { -		forWidget = "#" + forWidget; -		$(forWidget).find("div.collapsable_box_content").hide(); -		$(forWidget).find("a.toggle_box_contents").html('+'); -		$(forWidget).find("a.toggle_box_edit_panel").fadeOut('medium'); -	}; -} - - -// Toggle widgets contents and save to a cookie -var toggleContent = function(e) { -var targetContent = $('div.collapsable_box_content', this.parentNode.parentNode); -	if (targetContent.css('display') == 'none') { -		targetContent.slideDown(400); -		$(this).html('-'); -		$(this.parentNode).children(".toggle_box_edit_panel").fadeIn('medium'); - -		// set cookie for widget panel open-state -		var thisWidgetName = $(this.parentNode.parentNode.parentNode).attr('id'); -		$.cookie(thisWidgetName, 'expanded', { expires: 365 }); - -	} else { -		targetContent.slideUp(400); -		$(this).html('+'); -		$(this.parentNode).children(".toggle_box_edit_panel").fadeOut('medium'); -		// make sure edit pane is closed -		$(this.parentNode.parentNode).children(".collapsable_box_editpanel").hide(); - -		// set cookie for widget panel closed-state -		var thisWidgetName = $(this.parentNode.parentNode.parentNode).attr('id'); -		$.cookie(thisWidgetName, 'collapsed', { expires: 365 }); -	} -	return false; -}; - -// More info tooltip in widget gallery edit panel -function widget_moreinfo() { - -	$("img.more_info").hover(function(e) { -	var widgetdescription = $("input[name='description']", this.parentNode.parentNode.parentNode ).attr('value'); -	$("body").append("<p id='widget_moreinfo'><b>"+ widgetdescription +" </b></p>"); - -		if (e.pageX < 900) { -			$("#widget_moreinfo") -				.css("top",(e.pageY + 10) + "px") -				.css("left",(e.pageX + 10) + "px") -				.fadeIn("medium"); -		} -		else { -			$("#widget_moreinfo") -				.css("top",(e.pageY + 10) + "px") -				.css("left",(e.pageX - 210) + "px") -				.fadeIn("medium"); -		} -	}, -	function() { -		$("#widget_moreinfo").remove(); -	}); - -	$("img.more_info").mousemove(function(e) { -		// action on mousemove -	}); -}; -  // ELGG DROP DOWN MENU  $.fn.elgg_dropdownmenu = function(options) { | 
