Просмотр исходного кода

Ticket #3787 - Menus: Save collapsed state selected by user.

AntonLV 4 лет назад
Родитель
Сommit
621dcfbaca

+ 72 - 10
inc/classes/BxDolMenu.php

@@ -94,6 +94,8 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
     protected $_aMarkers = array();
     protected $_bMultilevel = false;
 
+    protected $_sSessionKeyCollapsed;
+
     /**
      * Constructor
      * @param $aObject array of menu options
@@ -112,16 +114,19 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
 
         $this->_bMultilevel = !empty($this->_aObject['set_name']) && $this->_oQuery->isSetMultilevel($this->_aObject['set_name']);
 
-        if (isLogged()) {
-            $oProfile = BxDolProfile::getInstance();
-            if ($oProfile) {
-                $this->addMarkers(array(
-                    'member_id' => $oProfile->id(),
-                    'member_display_name' => $oProfile->getDisplayName(),
-                    'member_url' => $oProfile->getUrl(),
-                	'content_id' => $oProfile->getContentId()
-                ));
-            }
+        $this->_sSessionKeyCollapsed = 'bx_menu_collapsed_';
+
+        $this->addMarkers([
+            'object' => $this->_sObject
+        ]);
+
+        if(isLogged() && ($oProfile = BxDolProfile::getInstance()) !== false) {
+            $this->addMarkers([
+                'member_id' => $oProfile->id(),
+                'member_display_name' => $oProfile->getDisplayName(),
+                'member_url' => $oProfile->getUrl(),
+                'content_id' => $oProfile->getContentId()
+            ]);
         }
     }
 
@@ -314,6 +319,63 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
         unset($this->_aMarkers[$s]);
     }
 
+    public function performActionSetCollapsed($mixedValue)
+    {
+        $this->_setCollapsed($this->_sObject, (int)$mixedValue);
+    }
+
+    public function performActionSetCollapsedSubmenu($sMenuItem, $mixedValue)
+    {
+        $this->_setCollapsed($this->_sObject . '_' . $sMenuItem, (int)$mixedValue);
+    }
+
+    public function getUserChoiceCollapsed($sObject = '')
+    {
+        $iProfile = bx_get_logged_profile_id();
+        if(!$iProfile)
+            return false;
+
+        if(!$sObject)
+            $sObject = $this->_sObject;
+
+        $sSessionKey = $this->_sSessionKeyCollapsed . $iProfile;
+        $aCollapsed = BxDolSession::getInstance()->getValue($sSessionKey);
+        if(!isset($aCollapsed[$sObject]))
+            return false;
+
+        return (int)$aCollapsed[$sObject];
+    }
+
+    public function getUserChoiceCollapsedSubmenu($mixedItem, $sObject = '')
+    {
+        if(!$sObject)
+            $sObject = $this->_sObject;
+
+        if(is_array($mixedItem) && isset($mixedItem['name']))
+            $sObject .= '_' . $mixedItem['name'];
+        else if(is_string($mixedItem))
+            $sObject .= '_' . $mixedItem;
+
+        return $this->getUserChoiceCollapsed($sObject);
+    }
+
+    protected function _setCollapsed($sName, $mixedValue)
+    {
+        $iProfile = bx_get_logged_profile_id();
+        if(!$iProfile)
+            return;
+
+        $oSession = BxDolSession::getInstance();
+        $sSessionKey = $this->_sSessionKeyCollapsed . $iProfile;
+
+        $aCollapsed = $oSession->getValue($sSessionKey);
+        if(!is_array($aCollapsed))
+            $aCollapsed = [];
+
+        $aCollapsed[$sName] = $mixedValue;
+        $oSession->setValue($sSessionKey, $aCollapsed);
+    }
+
     /**
      * Check if menu items is selected.
      * @param $a menu item array

+ 26 - 2
inc/js/functions.js

@@ -688,11 +688,35 @@ function bx_menu_show_live_update(oData) {
 	}
 }
 
-function bx_menu_show_more_less(oLink, sSelectorParent) {
+function bx_menu_show_more_less(oLink, sMenu, sSelectorParent) {
     if(!sSelectorParent)
         sSelectorParent = 'ul';
 
-    $(oLink).parents(sSelectorParent + ':first').find('.bx-mi-aux, .bx-psmi-show-more, .bx-psmi-show-less').toggle('bx-mi-hidden');
+    var sClass = 'bx-mi-hidden';
+    $(oLink).parents(sSelectorParent + ':first').find('.bx-mi-aux, .bx-psmi-show-more, .bx-psmi-show-less').toggleClass(sClass);
+
+    $.get(sUrlRoot + 'menu.php', {
+        o: sMenu, 
+        a: 'set_collapsed', 
+        v: $(oLink).parents(sSelectorParent + ':first').find('.bx-mi-aux').hasClass(sClass) ? 1 : 0
+    });
+}
+
+function bx_menu_toggle(oLink, sMenu, sMenuItem, sSelectorParent) {
+    if(!sSelectorParent)
+        sSelectorParent = 'li';
+
+    var sClass = 'bx-mi-collapsed';
+    var oParent = $(oLink).parents(sSelectorParent + ':first');
+
+    oParent.toggleClass(sClass);
+
+    $.get(sUrlRoot + 'menu.php', {
+        o: sMenu, 
+        a: 'set_collapsed_submenu',
+        i: sMenuItem,
+        v: oParent.hasClass(sClass) ? 1 : 0
+    });
 }
 
 /**

+ 12 - 0
menu.php

@@ -21,6 +21,18 @@ $oMenu = BxDolMenu::getObjectInstance($sObject);
 if (!$oMenu)
     exit;
 
+$sAction = 'performAction' . bx_gen_method_name(bx_process_input(bx_get('a')));
+if (method_exists($oMenu, $sAction)) {
+    $aParams = [];
+    if(($mixedValue = bx_get('i')) !== false)
+        $aParams[] = bx_process_input(bx_get('i')); //--- item name
+    if(($mixedValue = bx_get('v')) !== false)
+        $aParams[] = bx_process_input(bx_get('v')); //--- some value
+
+    call_user_func_array([$oMenu, $sAction], $aParams);
+    exit;
+}
+
 header('Content-type: text/html; charset=utf-8');
 echo $oMenu->getCode ();
 

+ 3 - 3
modules/boonex/artificer/data/template/bx_timeline/css/view.css

@@ -22,13 +22,13 @@ import url(../../../../../timeline/template/css/view.css);
 .bx-tl-menu-feeds.bx-menu-ver li .bx-menu-hide {
     display: inline;
 }
-.bx-tl-menu-feeds.bx-menu-ver li.bx-menu-item-collapsed .bx-menu-show {
+.bx-tl-menu-feeds.bx-menu-ver li.bx-mi-collapsed .bx-menu-show {
     display: inline;
 }
-.bx-tl-menu-feeds.bx-menu-ver li.bx-menu-item-collapsed .bx-menu-hide {
+.bx-tl-menu-feeds.bx-menu-ver li.bx-mi-collapsed .bx-menu-hide {
     display: none;
 }
-.bx-tl-menu-feeds.bx-menu-ver li.bx-menu-item-collapsed .bx-menu-item-subitems {
+.bx-tl-menu-feeds.bx-menu-ver li.bx-mi-collapsed .bx-menu-item-subitems {
     display: none;
 }
 

+ 3 - 3
modules/boonex/artificer/data/template/bx_timeline/menu_feeds.html

@@ -2,13 +2,13 @@
     <bx_repeat:menu_items>
         <li class="bx-menu-item bx-menu-item-__name__ __class_add__ text-sm font-medium">
             <div class="bx-menu-item-cnt">
-                <div class="bx-menu-item-link flex items-center justify-between p-2 text-gray-600 dark:text-gray-300 hover:bg-gray-200 dark:hover:text-gray-100 dark:hover:bg-gray-700 hover:text-gray-900 rounded-md">
+                <div class="bx-menu-item-link bx-stl-mil group">
                     <a class="flex items-center w-full truncate" href="__link__" onclick="__onclick__"__attrs__>
                         <bx_include_auto:menu_icon.html />
-                        <span class="bx-menu-item-title ml-2 truncate">__title__</span>
+                        <span class="bx-menu-item-title bx-stl-mit">__title__</span>
                     </a>
                     <bx_if:addon>
-                        <div class="bx-menu-addon pl-2">
+                        <div class="bx-menu-addon bx-stl-mia flex-none 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>

+ 3 - 3
modules/boonex/artificer/data/template/system/css/menu.css

@@ -177,13 +177,13 @@ div.bx-popup-menu-main.sys-add-content ul {
 .bx-menu-ver.bx-menu-object-sys_profile_followings li .bx-menu-hide {
     display: inline;
 }
-.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-menu-item-collapsed .bx-menu-show {
+.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-mi-collapsed .bx-menu-show {
     display: inline;
 }
-.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-menu-item-collapsed .bx-menu-hide {
+.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-mi-collapsed .bx-menu-hide {
     display: none;
 }
-.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-menu-item-collapsed .bx-menu-item-subitems {
+.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-mi-collapsed .bx-menu-item-subitems {
     display: none;
 }
 

+ 2 - 7
modules/boonex/artificer/data/template/system/menu_profile_followings.html

@@ -10,7 +10,7 @@
                         <span class="bx-menu-item-title bx-stl-mit" sidebar-toggle-item>__title__</span>
                     </a>
                     <span class="bx-menu-collapse pl-2" sidebar-toggle-item>
-                        <a href="javascript:void(0)" onclick="javascript:bx_toggle_pf(this)">
+                        <a href="javascript:void(0)" onclick="javascript:bx_menu_toggle(this, '__object__', '__name__')">
                             <i class="sys-icon chevron-up bx-menu-hide"></i>
                             <i class="sys-icon chevron-down bx-menu-show"></i>
                         </a>
@@ -22,9 +22,4 @@
             </div>
         </li>
     </bx_repeat:menu_items>
-</ul>
-<script language="javascript">
-    function bx_toggle_pf(oLink) {
-        $(oLink).parents('li:first').toggleClass('bx-menu-item-collapsed');
-    }
-</script>
+</ul>

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

@@ -2,7 +2,7 @@
     <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 truncate" href="__link__" onclick="__onclick__"__attrs__>
+                <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>

+ 3 - 2
modules/boonex/timeline/classes/BxTimelineTemplate.php

@@ -124,10 +124,11 @@ class BxTimelineTemplate extends BxBaseModNotificationsTemplate
 
     public function getJsCodeView($aParams = array(), $bWrap = true, $bDynamic = false)
     {
-        $aParams = array_merge(array(
+        $aParams = array_merge([
+            'sObjNameMenuFeeds' => $this->_oConfig->getObject('menu_feeds'),
             'bInfScroll' => $this->_oConfig->isInfiniteScroll(),
             'iInfScrollAutoPreloads' => $this->_oConfig->getAutoPreloads(),
-        ), $aParams);
+        ], $aParams);
 
         return parent::getJsCode('view', $aParams, $bWrap, $bDynamic);
     }

+ 2 - 1
modules/boonex/timeline/js/view.js

@@ -14,6 +14,7 @@ function BxTimelineView(oOptions) {
     this._sActionsUri = oOptions.sActionUri;
     this._sActionsUrl = oOptions.sActionUrl;
     this._sObjName = oOptions.sObjName == undefined ? 'oTimelineView' : oOptions.sObjName;
+    this._sObjNameMenuFeeds = oOptions.sObjNameMenuFeeds == undefined ? 'bx_timeline_menu_feeds' : oOptions.sObjNameMenuFeeds;
     this._sName = oOptions.sName == undefined ? '' : oOptions.sName;
     this._sView = oOptions.sView == undefined ? 'timeline' : oOptions.sView;
     this._sType = oOptions.sType == undefined ? 'public' : oOptions.sType;
@@ -448,7 +449,7 @@ BxTimelineView.prototype.changeFeedFilters = function(oLink, oRequestParams)
 
 BxTimelineView.prototype.toggleMenuItemFeeds = function(oSource)
 {
-    $(oSource).parents('li:first').toggleClass('bx-menu-item-collapsed');
+    bx_menu_toggle(oSource, this._sObjNameMenuFeeds);
 };
 
 BxTimelineView.prototype.onFilterByModuleChange = function(oSource)

+ 3 - 3
modules/boonex/timeline/template/css/view.css

@@ -50,13 +50,13 @@
 .bx-tl-menu-feeds.bx-menu-ver li .bx-menu-hide {
     display: inline;
 }
-.bx-tl-menu-feeds.bx-menu-ver li.bx-menu-item-collapsed .bx-menu-show {
+.bx-tl-menu-feeds.bx-menu-ver li.bx-mi-collapsed .bx-menu-show {
     display: inline;
 }
-.bx-tl-menu-feeds.bx-menu-ver li.bx-menu-item-collapsed .bx-menu-hide {
+.bx-tl-menu-feeds.bx-menu-ver li.bx-mi-collapsed .bx-menu-hide {
     display: none;
 }
-.bx-tl-menu-feeds.bx-menu-ver li.bx-menu-item-collapsed .bx-menu-item-subitems {
+.bx-tl-menu-feeds.bx-menu-ver li.bx-mi-collapsed .bx-menu-item-subitems {
     display: none;
 }
 .bx-tl-menu-feeds.bx-menu-ver li .bx-menu-subitem .bx-menu-item-cnt {

+ 3 - 3
template/css/menu.css

@@ -959,13 +959,13 @@ ul.bx-menu-btns-icon-hor li:last-child .bx-btn {
 .bx-menu-ver.bx-menu-object-sys_profile_followings li .bx-menu-hide {
     display: inline;
 }
-.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-menu-item-collapsed .bx-menu-show {
+.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-mi-collapsed .bx-menu-show {
     display: inline;
 }
-.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-menu-item-collapsed .bx-menu-hide {
+.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-mi-collapsed .bx-menu-hide {
     display: none;
 }
-.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-menu-item-collapsed .bx-menu-item-subitems {
+.bx-menu-ver.bx-menu-object-sys_profile_followings li.bx-mi-collapsed .bx-menu-item-subitems {
     display: none;
 }
 

+ 2 - 7
template/menu_profile_followings.html

@@ -8,7 +8,7 @@
                         <span class="bx-def-margin-sec-left-auto">__title__</span>
                     </a>
                     <span class="bx-menu-collapse bx-def-padding-sec-left">
-                        <a href="javascript:void(0)" onclick="bx_toggle_pf(this)">
+                        <a href="javascript:void(0)" onclick="javascript:bx_menu_toggle(this, '__object__', '__name__')">
                             <i class="sys-icon chevron-up bx-menu-hide"></i>
                             <i class="sys-icon chevron-down bx-menu-show"></i>
                         </a>
@@ -20,9 +20,4 @@
             </div>
         </li>
     </bx_repeat:menu_items>
-</ul>
-<script language="javascript">
-    function bx_toggle_pf(oLink) {
-        $(oLink).parents('li:first').toggleClass('bx-menu-item-collapsed');
-    }
-</script>
+</ul>

+ 8 - 6
template/scripts/BxBaseMenu.php

@@ -156,6 +156,8 @@ class BxBaseMenu extends BxDolMenu
         if (!$this->_isVisible($a))
             return false;
 
+        $a['object'] = $this->_sObject;
+
         $a['title'] = _t($a['title']);
         $a['bx_if:title'] = array(
             'condition' => !empty($a['title']),
@@ -185,9 +187,6 @@ class BxBaseMenu extends BxDolMenu
         list ($sIcon, $sIconUrl, $sIconA, $sIconHtml) = $this->_getMenuIcon($a);
 
         $a['class_add'] = $this->_isSelected($a) ? 'bx-menu-tab-active' : '';
-
-        
-        
         $a['class_add'] .= $this->_getVisibilityClass($a);
 
         $a['link'] = isset($a['link']) ? $this->_oPermalinks->permalink($a['link']) : 'javascript:void(0);';
@@ -207,7 +206,7 @@ class BxBaseMenu extends BxDolMenu
             'condition' => (bool)$sIcon,
             'content' => array('icon' => $sIcon),
         );
-		$a['bx_if:icon-html'] = array (
+        $a['bx_if:icon-html'] = array (
             'condition' => (bool)$sIconHtml,
             'content' => array('icon' => $sIconHtml),
         );
@@ -232,8 +231,11 @@ class BxBaseMenu extends BxDolMenu
         $aTmplVarsSubitems = array('subitems' => '');
         $bTmplVarsSubitems = $this->_bMultilevel && !empty($a['subitems']);
         if($bTmplVarsSubitems) {
-            if(isset($a['collapsed']) && $a['collapsed'])
-                $a['class_add'] .= ' bx-menu-item-collapsed';
+            $sClassCollpsed = 'bx-mi-collapsed';
+            if(($iCollapsed = $this->getUserChoiceCollapsedSubmenu($a)) !== false)
+                $a['class_add'] .= $iCollapsed ? ' ' . $sClassCollpsed : '';
+            else if(isset($a['collapsed']) && $a['collapsed'])
+                $a['class_add'] .= ' ' . $sClassCollpsed;
 
             $aSubitems = array();
             foreach($a['subitems'] as $aSubitem) {

+ 1 - 1
template/scripts/BxBaseMenuProfileFollowings.php

@@ -34,7 +34,7 @@ class BxBaseMenuProfileFollowings extends BxTemplMenu
             $aIds = $oConnection->getConnectedContentByType($iProfile, array($aItem['module']));
 
             if(empty($aItem['onclick']))
-                $aMenuItems[$iIndex]['onclick'] = 'bx_toggle_pf(this)';
+                $aMenuItems[$iIndex]['onclick'] = "javascript:bx_menu_toggle(this, '" . $this->_sObject . "', '" . $aItem['name'] . "')";
 
             $aSubmenu = array();
             foreach($aIds as $iId) {

+ 7 - 4
template/scripts/BxBaseMenuProfileStats.php

@@ -29,16 +29,19 @@ class BxBaseMenuProfileStats extends BxTemplMenuAccountNotifications
         if(empty($aItems) || !is_array($aItems))
             return $aItems;
 
+        $mixedCollpsed = $this->getUserChoiceCollapsed();
+        $bCollpsed = $mixedCollpsed === false || $mixedCollpsed == 1;
+
         $iMaxNum = count($aItems);
         if($this->_iMenuItemsMin > $iMaxNum)
             $this->_iMenuItemsMin = $iMaxNum;
 
         for($i = $this->_iMenuItemsMin; $i < $iMaxNum; $i++)
-            $aItems[$i]['class_add'] .= ' bx-mi-aux bx-mi-hidden';
+            $aItems[$i]['class_add'] .= ' bx-mi-aux' . ($bCollpsed ? ' bx-mi-hidden' : '');
 
         $aShowMoreLinks = [
-            'more' => ['title' => '_sys_show_more', 'icon' => 'chevron-down', 'class' => ''],
-            'less' => ['title' => '_sys_show_less', 'icon' => 'chevron-up', 'class' => 'bx-mi-hidden']
+            'more' => ['title' => '_sys_show_more', 'icon' => 'chevron-down', 'class' => $bCollpsed ? '' : 'bx-mi-hidden'],
+            'less' => ['title' => '_sys_show_less', 'icon' => 'chevron-up', 'class' => !$bCollpsed ? '' : 'bx-mi-hidden']
         ];
 
         foreach($aShowMoreLinks as $sLink => $aLink)
@@ -47,7 +50,7 @@ class BxBaseMenuProfileStats extends BxTemplMenuAccountNotifications
                 'name' => 'show-' . $sLink,
                 'title' => _t($aLink['title']),
                 'link' => 'javascript:void(0)',
-                'onclick' => 'bx_menu_show_more_less(this, \'.bx-menu-profile-stats\')',
+                'onclick' => 'bx_menu_show_more_less(this, \'' . $this->_sObject . '\', \'.bx-menu-profile-stats\')',
                 'attrs' => '',
                 'bx_if:image' => [
                     'condition' => false,