Parcourir la source

Ticket #3885 - Profiles Followings menu: Improve loading and usability.

AntonLV il y a 4 ans
Parent
commit
bf3f601769

+ 19 - 0
inc/js/functions.js

@@ -719,6 +719,25 @@ function bx_menu_toggle(oLink, sMenu, sMenuItem, sSelectorParent) {
     });
 }
 
+function bx_menu_followings_load_more(oLink, sMenu, sContextModule, iStart, iPerPage) {
+    var oLoadingParent = $(oLink).length ? $(oLink).parents('.bx-menu-item:first') : $('body'); 
+
+    bx_loading(oLoadingParent, true);
+
+    $.get(sUrlRoot + 'menu.php', {
+        o: sMenu, 
+        a: 'load_more', 
+        v: sContextModule,
+        start: iStart,
+        per_page: iPerPage
+    }, function(oData) {
+        bx_loading(oLoadingParent, false);
+
+        if(oData && oData.content != undefined)
+            $(oLink).parents('.bx-menu-subitem:first').replaceWith(oData.content);
+    }, 'json');
+}
+
 /**
  * Set ACL level for specified profile
  * @param iProfileId - profile id to set acl level for

+ 3 - 1
modules/boonex/artificer/data/template/system/menu_profile_followings.html

@@ -14,7 +14,9 @@
                     </span>
                 </div>
                 <bx_if:show_subitems>
-                    <div class="bx-menu-item-subitems pt-2">__subitems__</div>
+                    <div class="bx-menu-item-subitems pt-2">
+                        <ul class="bx-menu-item-subitems bx-menu-pf-subitems bx-menu-ver space-y-2">__subitems__</ul>
+                    </div>
                 </bx_if:show_subitems>
             </div>
         </li>

+ 17 - 19
modules/boonex/artificer/data/template/system/menu_profile_followings_subitems.html

@@ -1,19 +1,17 @@
-<ul class="bx-menu-item-subitems bx-menu-pf-subitems bx-menu-ver space-y-2">
-    <bx_repeat:menu_items>
-        <li class="bx-menu-subitem bx-menu-subitem-__name__ __class_add__">
-            <div class="bx-menu-item-cnt bx-stl-mil">
-                <a class="flex items-center pl-2 truncate" href="__link__" onclick="__onclick__"__attrs__>
-                    <span class="bx-menu-item-icon bx-stl-mii group-hover:text-gray-700 dark:group-hover:text-gray-300">
-                        <bx_include_auto:menu_icon.html />
-                    </span>
-                    <span class="bx-menu-item-title bx-stl-mit" sidebar-toggle-item>__title__</span>
-                </a>
-                <bx_if:addon>
-                    <div class="bx-menu-addon bx-stl-mia group-hover:text-gray-800 dark:group-hover:text-gray-100">
-                        <div class="bx-menu-addon-cnt bx-def-label menu">__addon__</div>
-                    </div>
-                </bx_if:addon>
-            </div>
-        </li>
-    </bx_repeat:menu_items>
-</ul>
+<bx_repeat:menu_items>
+    <li class="bx-menu-subitem bx-menu-subitem-__name__ __class_add__">
+        <div class="bx-menu-item-cnt bx-stl-mil">
+            <a class="flex items-center pl-2 truncate" href="__link__" onclick="__onclick__"__attrs__>
+                <span class="bx-menu-item-icon bx-stl-mii group-hover:text-gray-700 dark:group-hover:text-gray-300">
+                    <bx_include_auto:menu_icon.html />
+                </span>
+                <span class="bx-menu-item-title bx-stl-mit" sidebar-toggle-item>__title__</span>
+            </a>
+            <bx_if:addon>
+                <div class="bx-menu-addon bx-stl-mia group-hover:text-gray-800 dark:group-hover:text-gray-100">
+                    <div class="bx-menu-addon-cnt bx-def-label menu">__addon__</div>
+                </div>
+            </bx_if:addon>
+        </div>
+    </li>
+</bx_repeat:menu_items>

+ 3 - 1
template/menu_profile_followings.html

@@ -12,7 +12,9 @@
                     </span>
                 </div>
                 <bx_if:show_subitems>
-                    <div class="bx-menu-item-subitems">__subitems__</div>
+                    <div class="bx-menu-item-subitems">
+                        <ul class="bx-menu-item-subitems bx-menu-pf-subitems bx-menu-ver bx-def-font-middle bx-clearfix">__subitems__</ul>
+                    </div>
                 </bx_if:show_subitems>
             </div>
         </li>

+ 15 - 17
template/menu_profile_followings_subitems.html

@@ -1,17 +1,15 @@
-<ul class="bx-menu-item-subitems bx-menu-pf-subitems bx-menu-ver bx-def-font-middle bx-clearfix">
-    <bx_repeat:menu_items>
-        <li class="bx-menu-subitem bx-menu-subitem-__name__ bx-def-round-corners bx-def-color-bg-hl-hover __class_add__">
-            <div class="bx-menu-item-cnt bx-def-padding-thd-topbottom bx-def-padding-left bx-def-padding-sec-right">
-                <a href="__link__" onclick="__onclick__"__attrs__>
-                    <bx_include_auto:menu_icon.html />
-                    <span class="bx-def-margin-sec-left-auto">__title__</span>
-                </a>
-                <bx_if:addon>
-                    <div class="bx-menu-addon bx-def-padding-sec-left">
-                        <div class="bx-menu-addon-cnt bx-def-label menu">__addon__</div>
-                    </div>
-                </bx_if:addon>
-            </div>
-        </li>
-    </bx_repeat:menu_items>
-</ul>
+<bx_repeat:menu_items>
+    <li class="bx-menu-subitem bx-menu-subitem-__name__ bx-def-round-corners bx-def-color-bg-hl-hover __class_add__">
+        <div class="bx-menu-item-cnt bx-def-padding-thd-topbottom bx-def-padding-left bx-def-padding-sec-right">
+            <a href="__link__" onclick="__onclick__"__attrs__>
+                <bx_include_auto:menu_icon.html />
+                <span class="bx-def-margin-sec-left-auto">__title__</span>
+            </a>
+            <bx_if:addon>
+                <div class="bx-menu-addon bx-def-padding-sec-left">
+                    <div class="bx-menu-addon-cnt bx-def-label menu">__addon__</div>
+                </div>
+            </bx_if:addon>
+        </div>
+    </li>
+</bx_repeat:menu_items>

+ 88 - 21
template/scripts/BxBaseMenuProfileFollowings.php

@@ -13,12 +13,48 @@
  */
 class BxBaseMenuProfileFollowings extends BxTemplMenu
 {
+    protected $_sConnection;
+    protected $_oConnection;
+
+    protected $_iPerPageDefault;
+
     public function __construct ($aObject, $oTemplate)
     {
         parent::__construct ($aObject, $oTemplate);
 
         $this->_bMultilevel = true;
         $this->_bDisplayAddons = true;
+
+        $this->_sConnection = 'sys_profiles_subscriptions';
+        $this->_oConnection = BxDolConnection::getObjectInstance($this->_sConnection);
+
+        $this->_iPerPageDefault = 10;
+    }
+
+    public function performActionLoadMore($sContextModule)
+    {
+        $aResult = [];
+
+        $iStart = (int)bx_get('start');
+        $iPerPage = (int)bx_get('per_page');
+        
+        $iProfile = bx_get_logged_profile_id();
+        $aSubitems = $this->_getMenuSubitems($iProfile, $sContextModule, $iStart, $iPerPage);
+        if(empty($aSubitems) || !is_array($aSubitems))
+            return echoJson($aResult);
+
+        $aTmplVarsSubitems = [];
+        foreach($aSubitems as $aSubitem) {
+            $aSubitem = $this->_getMenuItem($aSubitem);
+            if($aSubitem !== false)
+                $aTmplVarsSubitems[] = $aSubitem;
+        }
+
+        $aResult['content'] = $this->_oTemplate->parseHtmlByName(str_replace('.html', '_subitems.html', $this->getTemplateName()), [
+            'bx_repeat:menu_items' => $aTmplVarsSubitems,
+        ]);
+
+        return echoJson($aResult);
     }
 
     protected function getMenuItemsRaw ()
@@ -28,32 +64,12 @@ class BxBaseMenuProfileFollowings extends BxTemplMenu
             return $aMenuItems;
 
         $iProfile = bx_get_logged_profile_id();
-        $oConnection = BxDolConnection::getObjectInstance('sys_profiles_subscriptions');
 
         foreach($aMenuItems as $iIndex => $aItem) {
-            $aIds = $oConnection->getConnectedContentByType($iProfile, array($aItem['module']));
-
             if(empty($aItem['onclick']))
                 $aMenuItems[$iIndex]['onclick'] = "javascript:bx_menu_toggle(this, '" . $this->_sObject . "', '" . $aItem['name'] . "')";
 
-            $aSubmenu = array();
-            foreach($aIds as $iId) {
-                $oContext = BxDolProfile::getInstance($iId);
-                if(!$oContext)
-                    continue;
-
-                $aSubmenu[] = array(
-                    'id' => 'context-' . $iId, 
-                    'name' => 'context-' . $iId, 
-                    'class' => '', 
-                    'link' => $oContext->getUrl(), 
-                    'onclick' => '', 
-                    'target' => '_self', 
-                    'title' => $oContext->getDisplayName(), 
-                    'icon' => $oContext->getIcon(),
-                    'active' => 1
-                );
-            }
+            $aSubmenu = $this->_getMenuSubitems($iProfile, $aItem['module']);
 
             if(!empty($aSubmenu))
                 $aMenuItems[$iIndex]['subitems'] = $aSubmenu;
@@ -63,6 +79,57 @@ class BxBaseMenuProfileFollowings extends BxTemplMenu
 
         return $aMenuItems;
     }
+    
+    protected function _getMenuSubitems($iProfile, $sContextModule, $iStart = 0, $iPerPage = 0)
+    {
+        if(!$iPerPage)
+            $iPerPage = $this->_iPerPageDefault;
+
+        $aIds = $this->_oConnection->getConnectedContentByType($iProfile, [$sContextModule], false, $iStart, $iPerPage + 1);
+
+        $bNext = false;
+        if(count($aIds) > $iPerPage) {
+            array_pop($aIds);
+            $bNext = true;
+        }        
+
+        $aSubmenu = array();
+        foreach($aIds as $iId) {
+            $oContext = BxDolProfile::getInstance($iId);
+            if(!$oContext)
+                continue;
+
+            $aSubmenu[] = array(
+                'id' => 'context-' . $iId, 
+                'name' => 'context-' . $iId, 
+                'class' => '', 
+                'link' => $oContext->getUrl(), 
+                'onclick' => '', 
+                'target' => '_self', 
+                'title' => $oContext->getDisplayName(), 
+                'icon' => $oContext->getIcon(),
+                'active' => 1
+            );
+        }
+
+        if($bNext) {
+            $sMoreName = 'context-type-' . str_replace('_', '-', $sContextModule) . '-more';
+
+            $aSubmenu[] = array(
+                'id' => $sMoreName, 
+                'name' => $sMoreName, 
+                'class' => '', 
+                'link' => 'javascript:void(0)', 
+                'onclick' => "javascript:bx_menu_followings_load_more(this, '" . $this->_sObject . "', '" . $sContextModule . "', " . ($iStart + $iPerPage) . ", " . $iPerPage . ")", 
+                'target' => '_self', 
+                'title' => _t('_sys_show_more'), 
+                'icon' => 'chevron-down',
+                'active' => 1
+            );
+        }
+
+        return $aSubmenu;
+    }
 
     protected function _getTmplVarsAddon($mixedAddon, $aMenuItem)
     {