]> gitweb.fluxo.info Git - lorea/elgg.git/commitdiff
Added functions to support moving and adding widgets
authorcash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
Thu, 18 Nov 2010 23:01:39 +0000 (23:01 +0000)
committercash <cash@36083f99-b078-4883-b0ff-0f9b5a30f544>
Thu, 18 Nov 2010 23:01:39 +0000 (23:01 +0000)
git-svn-id: http://code.elgg.org/elgg/trunk@7340 36083f99-b078-4883-b0ff-0f9b5a30f544

actions/widgets/add.php
engine/lib/widgets.php
js/lib/ui.widgets.js

index c57e3596a0fe142a1299fbb6a43c25886d206177..78f73e26768abb6b1a09a05017a3039ae5f6ebc3 100644 (file)
@@ -13,21 +13,21 @@ $column = get_input('column', 1);
 
 $guid = false;
 if (!empty($user_guid)) {
-       if ($user = get_entity($user_guid)) {
-               if ($user->canEdit()) {
-                       $guid = add_widget($user->getGUID(), $handler, $context, 0, $column);
-               }
-       }
-}
+       $user = get_entity($user_guid);
+       if ($user && $user->canEdit()) {
+               $guid = elgg_add_widget($user->getGUID(), $handler);
+               if ($guid) {
+                       $widget = get_entity($guid);
+                       elgg_prepend_widget($widget, $context, $column);
 
-if ($guid) {
-       system_message(elgg_echo('widgets:add:success'));
+                       // send widget html for insertion
+                       echo elgg_view_entity($widget);
 
-       // send widget html for insertion
-       $widget = get_entity($guid);
-       echo elgg_view_entity($widget);
-} else {
-       register_error(elgg_echo('widgets:add:failure'));
+                       system_message(elgg_echo('widgets:add:success'));
+                       forward(REFERER);
+               }
+       }
 }
 
+register_error(elgg_echo('widgets:add:failure'));
 forward(REFERER);
\ No newline at end of file
index 5d6a7fcc1999961035be659941ac3cb20d8ec077..724e098a7d7b9af0e53f6a6f4d0e403e6a328f11 100644 (file)
@@ -150,8 +150,8 @@ function get_widgets($user_guid, $context, $column) {
  *
  * @param int    $user_guid The owner user GUID
  * @param string $context   The context (profile, dashboard, etc)
- *
  * @return array|false An array of widget ElggObjects, or false
+ * @since 1.8.0
  */
 function elgg_get_widgets($user_guid, $context) {
        $options = array(
@@ -175,18 +175,124 @@ function elgg_get_widgets($user_guid, $context) {
        }
 
        foreach ($sorted_widgets as $col => $widgets) {
-               ksort($sorted_widgets[$col]);
+               krsort($sorted_widgets[$col]);
        }
 
        return $sorted_widgets;
 }
 
 /**
- * @deprecated 1.8
+ * Add a new widget instance
+ *
+ * @param int    $entity_guid GUID of entity that owns this widget
+ * @param string $handler     The handler for this widget
+ * @param int    $access_id   If not specified, it is set to the default access level
+ * @return int|false Widget GUID or false on failure
+ * @since 1.8
  */
-function display_widget(ElggObject $widget) {
-       elgg_deprecated_notice("display_widget() was been deprecated. Use elgg_view_entity().", 1.8);
-       return elgg_view_entity($widget);
+function elgg_add_widget($owner_guid, $handler, $access_id = null) {
+       if (empty($owner_guid) || empty($handler) || !widget_type_exists($handler)) {
+               return false;
+       }
+
+       $owner = get_entity($owner_guid);
+       if (!$owner) {
+               return false;
+       }
+
+       $widget = new ElggWidget;
+       $widget->owner_guid = $owner_guid;
+       $widget->container_guid = $owner_guid; // @todo - will this work for group widgets
+       if (isset($access_id)) {
+               $widget->access_id = $access_id;
+       } else {
+               $widget->access_id = get_default_access();
+       }
+
+       if (!$widget->save()) {
+               return false;
+       }
+
+       // private settings cannot be set until ElggWidget saved
+       $widget->handler = $handler;
+
+       return $widget->getGUID();
+}
+
+/**
+ * Prepend a widget to a column
+ *
+ * @param ElggWidget $widget  The widget object
+ * @param string     $context The widget context
+ * @param int        $column  The column index (default is 1)
+ * @return none
+ * @since 1.8.0
+ */
+function elgg_prepend_widget($widget, $context, $column = 1) {
+       $options = array(
+               'type' => 'object',
+               'subtype' => 'widget',
+               'private_setting_name_value_pairs' => array(
+                       array('name' => 'context', 'value' => $context),
+                       array('name' => 'column', 'value' => $column)
+               )
+       );
+       $widgets = elgg_get_entities_from_private_settings($options);
+       $max_order = -10;
+       foreach ($widgets as $column_widget) {
+               if ($column_widget->order > $max_order) {
+                       $max_order = $column_widget->order;
+               }
+       }
+
+       $widget->order = $max_order + 10;
+       $widget->context = $context;
+       $widget->column = $column;
+}
+
+/**
+ * Move a widget to a new location in a layout
+ *
+ * @param ElggWidget $widget The widget to move
+ * @param int        $column The widget column
+ * @param int        $rank   Zero-based rank from the bottom of the column
+ * @return none
+ * @since 1.8.0
+ */
+function elgg_move_widget($widget, $column, $rank) {
+       $options = array(
+               'type' => 'object',
+               'subtype' => 'widget',
+               'private_setting_name_value_pairs' => array(
+                       array('name' => 'context', 'value' => $widget->context),
+                       array('name' => 'column', 'value' => $column)
+               )
+       );
+       $widgets = elgg_get_entities_from_private_settings($options);
+       if (!$widgets) {
+               $widget->column = $column;
+               $widget->order = 0;
+               return;
+       }
+
+       usort($widgets, create_function('$a,$b','return $a->order > $b->order;'));
+
+       if ($rank == 0) {
+               // bottom of the column
+               $widget->order = $widgets[0]->order - 10;
+       } elseif ($rank == count($widgets)) {
+               // top of the column
+               $widget->order = end($widgets)->order + 10;
+       } else {
+               // reorder widgets that are above
+               $widget->order = $widgets[$rank]->order;
+               for ($index = $rank; $index < count($widgets); $index++) {
+                       if ($widgets[$index]->guid != $widget->guid) {
+                               $widgets[$index]-> order += 10;
+                       }
+               }
+       }
+       $widget->column = $column;
 }
 
 /**
@@ -529,6 +635,14 @@ function elgg_can_edit_widgets($user_guid = 0) {
        return $return;
 }
 
+/**
+ * @deprecated 1.8
+ */
+function display_widget(ElggObject $widget) {
+       elgg_deprecated_notice("display_widget() was been deprecated. Use elgg_view_entity().", 1.8);
+       return elgg_view_entity($widget);
+}
+
 /**
  * Regsiter entity of object, widget as ElggWidget objects
  *
index b1e7b2a9938dead79a67c74e5840a065056cb9d5..507a1a1a86535c5a747b2a4b35e694e1cb036d6e 100644 (file)
@@ -1,7 +1,7 @@
 elgg.provide('elgg.ui.widgets');\r
 \r
 elgg.ui.widgets.init = function() {\r
-       $(".widget_column" ).sortable({\r
+       $(".widget_column").sortable({\r
                items:                'div.widget',\r
                connectWith:          '.widget_column',\r
                handle:               'div.drag_handle',\r
@@ -27,11 +27,23 @@ elgg.ui.widgets.init = function() {
                });\r
                event.preventDefault();\r
        });\r
+\r
+       elgg.ui.widgets.equalHeight(".widget_column");\r
 };\r
 \r
 // insert a widget into the layout\r
 elgg.ui.widgets.insert = function(html) {\r
-       $('.widget_first_col').prepend(html);\r
+       $('.widget_col_1').prepend(html);\r
+}\r
+\r
+elgg.ui.widgets.equalHeight = function(selector) {\r
+       var maxHeight = 0;\r
+       $(selector).each(function() {\r
+               if ($(this).height() > maxHeight) {\r
+                       maxHeight = $(this).height();\r
+               }\r
+       })\r
+       $(selector).css('min-height', maxHeight);\r
 }\r
 \r
 //List active widgets for each page column\r
@@ -85,7 +97,7 @@ elgg.ui.widgets.toggleContent = function(e) {
 \r
                // set cookie for widget panel open-state\r
                thisWidgetName = $(this.parentNode.parentNode.parentNode).attr('id');\r
-               elgg.session.cookie(thisWidgetName, 'expanded', {expires: 365 });\r
+               elgg.session.cookie(thisWidgetName, 'expanded', {expires: 365});\r
 \r
        } else {\r
                targetContent.slideUp(400);\r
@@ -96,7 +108,7 @@ elgg.ui.widgets.toggleContent = function(e) {
 \r
                // set cookie for widget panel closed-state\r
                thisWidgetName = $(this.parentNode.parentNode.parentNode).attr('id');\r
-               elgg.session.cookie(thisWidgetName, 'collapsed', { expires: 365 });\r
+               elgg.session.cookie(thisWidgetName, 'collapsed', {expires: 365});\r
        }\r
        return false;\r
 };\r