ソースを参照

Merge branch 'master' of https://github.com/unaio/una

AlexeyUna 8 年 前
親
コミット
fbef4395c4
100 ファイル変更、2920 行追加、96 行削除
  1. 16 1
      inc/classes/BxDolMenu.php
  2. 28 0
      inc/classes/BxDolModuleProxy.php
  3. 5 0
      inc/classes/BxDolModuleTemplate.php
  4. 1 2
      inc/js/classes/BxDolCmts.js
  5. 2 1
      install/sql/system.sql
  6. 2 15
      modules/base/general/classes/BxBaseModGeneralMenuView.php
  7. 32 0
      modules/base/general/classes/BxBaseModGeneralMenuViewActions.php
  8. 32 8
      modules/base/general/classes/BxBaseModGeneralModule.php
  9. 30 1
      modules/base/groups/classes/BxBaseModGroupsModule.php
  10. 9 7
      modules/base/profile/classes/BxBaseModProfileModule.php
  11. 9 6
      modules/base/profile/classes/BxBaseModProfileTemplate.php
  12. 9 2
      modules/base/profile/template/css/main.css
  13. 32 3
      modules/boonex/albums/classes/BxAlbumsModule.php
  14. 1 1
      modules/boonex/albums/install/sql/install.sql
  15. 6 6
      modules/boonex/analytics/classes/BxAnalyticsDb.php
  16. 14 13
      modules/boonex/analytics/classes/BxAnalyticsModule.php
  17. 1 1
      modules/boonex/analytics/install/sql/enable.sql
  18. 55 0
      modules/boonex/anon_follow/classes/BxAnonFollowAlertsResponse.php
  19. 30 0
      modules/boonex/anon_follow/classes/BxAnonFollowConfig.php
  20. 41 0
      modules/boonex/anon_follow/classes/BxAnonFollowDb.php
  21. 72 0
      modules/boonex/anon_follow/classes/BxAnonFollowGridSubscribedMe.php
  22. 164 0
      modules/boonex/anon_follow/classes/BxAnonFollowModule.php
  23. 20 0
      modules/boonex/anon_follow/classes/BxAnonFollowTemplate.php
  24. 78 0
      modules/boonex/anon_follow/install/config.php
  25. 20 0
      modules/boonex/anon_follow/install/installer.php
  26. 14 0
      modules/boonex/anon_follow/install/langs/en.xml
  27. 27 0
      modules/boonex/anon_follow/install/sql/disable.sql
  28. 53 0
      modules/boonex/anon_follow/install/sql/enable.sql
  29. 24 0
      modules/boonex/anon_follow/install/sql/install.sql
  30. 8 0
      modules/boonex/anon_follow/install/sql/uninstall.sql
  31. 60 0
      modules/boonex/anon_follow/js/main.js
  32. 16 0
      modules/boonex/anon_follow/request.php
  33. 2 0
      modules/boonex/anon_follow/template/connections_list.html
  34. 1 0
      modules/boonex/anon_follow/template/follow_button.html
  35. 18 0
      modules/boonex/anon_follow/template/images/icons/std-icon.svg
  36. 3 2
      modules/boonex/channels/classes/BxCnlConfig.php
  37. 27 11
      modules/boonex/channels/classes/BxCnlModule.php
  38. 1 0
      modules/boonex/channels/install/config.php
  39. 0 2
      modules/boonex/channels/install/langs/en.xml
  40. 1 1
      modules/boonex/channels/install/sql/disable.sql
  41. 3 8
      modules/boonex/channels/install/sql/enable.sql
  42. 2 0
      modules/boonex/events/classes/BxEventsConfig.php
  43. 5 2
      modules/boonex/events/classes/BxEventsModule.php
  44. 3 2
      modules/boonex/events/install/config.php
  45. 2 0
      modules/boonex/groups/classes/BxGroupsConfig.php
  46. 2 1
      modules/boonex/groups/install/config.php
  47. 26 0
      modules/boonex/lucid/classes/BxLucidConfig.php
  48. 25 0
      modules/boonex/lucid/classes/BxLucidDb.php
  49. 22 0
      modules/boonex/lucid/classes/BxLucidModule.php
  50. 77 0
      modules/boonex/lucid/classes/BxLucidStudioPage.php
  51. 24 0
      modules/boonex/lucid/classes/BxLucidTemplate.php
  52. 65 0
      modules/boonex/lucid/data/template/bx_channels/css/main.css
  53. 21 0
      modules/boonex/lucid/data/template/bx_channels/unit.html
  54. 1 0
      modules/boonex/lucid/data/template/bx_channels/unit_with_cover_showcase.html
  55. 65 0
      modules/boonex/lucid/data/template/bx_events/css/main.css
  56. 21 0
      modules/boonex/lucid/data/template/bx_events/unit.html
  57. 1 0
      modules/boonex/lucid/data/template/bx_events/unit_with_cover_showcase.html
  58. 5 0
      modules/boonex/lucid/data/template/bx_forum/css/main.css
  59. 65 0
      modules/boonex/lucid/data/template/bx_groups/css/main.css
  60. 21 0
      modules/boonex/lucid/data/template/bx_groups/unit.html
  61. 1 0
      modules/boonex/lucid/data/template/bx_groups/unit_with_cover_showcase.html
  62. 11 0
      modules/boonex/lucid/data/template/bx_notifications/css/view.css
  63. 58 0
      modules/boonex/lucid/data/template/bx_persons/css/main.css
  64. 21 0
      modules/boonex/lucid/data/template/bx_persons/unit_with_cover.html
  65. 1 0
      modules/boonex/lucid/data/template/bx_persons/unit_with_cover_showcase.html
  66. 6 0
      modules/boonex/lucid/data/template/bx_posts/css/main.css
  67. 14 0
      modules/boonex/lucid/data/template/bx_posts/unit.html
  68. 65 0
      modules/boonex/lucid/data/template/bx_spaces/css/main.css
  69. 21 0
      modules/boonex/lucid/data/template/bx_spaces/unit.html
  70. 1 0
      modules/boonex/lucid/data/template/bx_spaces/unit_with_cover_showcase.html
  71. 5 0
      modules/boonex/lucid/data/template/bx_timeline/comments.html
  72. 76 0
      modules/boonex/lucid/data/template/bx_timeline/css/post.css
  73. 236 0
      modules/boonex/lucid/data/template/bx_timeline/css/view-media-desktop.css
  74. 24 0
      modules/boonex/lucid/data/template/bx_timeline/css/view-media-tablet.css
  75. 276 0
      modules/boonex/lucid/data/template/bx_timeline/css/view.css
  76. 58 0
      modules/boonex/lucid/data/template/bx_timeline/item_outline.html
  77. 68 0
      modules/boonex/lucid/data/template/bx_timeline/item_timeline.html
  78. 45 0
      modules/boonex/lucid/data/template/bx_timeline/type_post.html
  79. 8 0
      modules/boonex/lucid/data/template/bx_timeline/type_repost.html
  80. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioBuilderPage.php
  81. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioBuilderPageUploaderHTML5.php
  82. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioBuilderPageUploaderSimple.php
  83. 20 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioConfig.php
  84. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDashboard.php
  85. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDesign.php
  86. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDesignServices.php
  87. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDesigner.php
  88. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDesigns.php
  89. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormView.php
  90. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioForms.php
  91. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsDisplays.php
  92. 124 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsField.php
  93. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsFields.php
  94. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsForms.php
  95. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsPreLists.php
  96. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsPreValues.php
  97. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsSearchFields.php
  98. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsSearchForms.php
  99. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFunctions.php
  100. 19 0
      modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioGrid.php

+ 16 - 1
inc/classes/BxDolMenu.php

@@ -241,6 +241,15 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
         $this->_bDynamicMode = $bDynamicMode;
     }
 
+    /**
+     * Get an arrey of replacable markers.
+     * @return an array with markers
+     */
+    public function getMarkers()
+    {
+        return $this->_aMarkers;
+    }
+    
     /**
      * Add replace markers.
      * @param $a array of markers as key => value
@@ -282,7 +291,13 @@ class BxDolMenu extends BxDolFactory implements iBxDolFactoryObject, iBxDolRepla
      */
     protected function _isVisible ($a)
     {
-        return BxDolAcl::getInstance()->isMemberLevelInSet($a['visible_for_levels']);
+        if (!BxDolAcl::getInstance()->isMemberLevelInSet($a['visible_for_levels']))
+            return false;
+
+        if (!empty($a['visibility_custom']))
+            return BxDolService::callSerialized($a['visibility_custom'], $this->_aMarkers);
+        
+        return true;
     }
 
     /**

+ 28 - 0
inc/classes/BxDolModuleProxy.php

@@ -52,6 +52,11 @@ class BxDolModuleProxy
         }
     }
 
+    public function isMethodExists($s)
+    {
+        return method_exists($this->_oProxifiedObject, $s);
+    }
+
     /**
      * Dirty fix for pass by reference to BxTimelineTemplate::getData
      */
@@ -59,6 +64,7 @@ class BxDolModuleProxy
     {
         return $this->_oProxifiedObject->getData($aEvent, $aBrowseParams);
     }
+
     /**
      * Dirty fix for pass by reference to BxNtfsTemplate::getPost
      */
@@ -66,6 +72,28 @@ class BxDolModuleProxy
     {
         return $this->_oProxifiedObject->getPost($aEvent, $aBrowseParams);
     }
+    /**
+     * Dirty fix for pass by reference to BxNtfsTemplate::getNotificationEmail
+     */
+    public function getNotificationEmail(&$aEvent)
+    {
+        return $this->_oProxifiedObject->getNotificationEmail($aEvent);
+    }
+    /**
+     * Dirty fix for pass by reference to BxNtfsTemplate::getNotificationPush
+     */
+    public function getNotificationPush(&$aEvent)
+    {
+        return $this->_oProxifiedObject->getNotificationPush($aEvent);
+    }
+
+    /**
+     * Dirty fix for pass by reference to BxMessengerTemplate::getTalkBlock
+     */    
+    public function getTalkBlock($iProfileId, $iLotId = BX_IM_EMPTY, $iJotId = BX_IM_EMPTY, $iType = BX_IM_TYPE_PUBLIC, $bShowMessanger = false, &$sReturnTitle = '')
+    {
+        return $this->_oProxifiedObject->getTalkBlock($iProfileId, $iLotId, $iJotId, $iType, $bShowMessanger, $sReturnTitle);
+    }
 }
 
 /** @} */

+ 5 - 0
inc/classes/BxDolModuleTemplate.php

@@ -155,6 +155,11 @@ class BxDolModuleTemplate extends BxDolTemplate
     public function addCssJs()
     {
     }
+
+    public function isMethodExists($s)
+    {
+        return method_exists($this->_oProxifiedObject, $s);
+    }    
 }
 
 /** @} */

+ 1 - 2
inc/js/classes/BxDolCmts.js

@@ -369,8 +369,7 @@ BxDolCmts.prototype.toggleReply = function(e, iCmtParentId)
                 break;
         }
 
-        var sFormId = oForm.find('form').attr('id');
-        $this.cmtInitFormPost(sFormId);
+        $this.cmtInitFormPost(oForm.find('form'));
 
         $(sParentId).children('.cmt-reply').bx_anim('toggle', $this._sAnimationEffect, $this._iAnimationSpeed, fOnShow);
     });

+ 2 - 1
install/sql/system.sql

@@ -3430,7 +3430,7 @@ INSERT INTO `sys_menu_templates` (`id`, `template`, `title`, `visible`) VALUES
 (5, 'menu_toolbar.html', '_sys_menu_template_title_toolbar', 0),
 (6, 'menu_vertical.html', '_sys_menu_template_title_ver', 1),
 (7, 'menu_floating_blocks.html', '_sys_menu_template_title_floating_blocks', 1),
-(8, 'menu_main_submenu.html', '_sys_menu_template_title_main_submenu', 0),
+(8, 'menu_main_submenu.html', '_sys_menu_template_title_main_submenu', 8),
 (9, 'menu_buttons_hor.html', '_sys_menu_template_title_buttons_hor', 1),
 (10, 'menu_inline.html', '_sys_menu_template_title_inline', 1),
 (11, 'menu_interactive_vertical.html', '_sys_menu_template_title_interactive_vertical', 1),
@@ -3534,6 +3534,7 @@ CREATE TABLE IF NOT EXISTS `sys_menu_items` (
   `submenu_object` varchar(64) NOT NULL,
   `submenu_popup` tinyint(4) NOT NULL DEFAULT '0',
   `visible_for_levels` int(11) NOT NULL DEFAULT '2147483647',
+  `visibility_custom` text NOT NULL,
   `hidden_on` varchar(255) NOT NULL DEFAULT '',
   `active` tinyint(4) NOT NULL DEFAULT '1',
   `copyable` tinyint(4) NOT NULL DEFAULT '1',

+ 2 - 15
modules/base/general/classes/BxBaseModGeneralMenuView.php

@@ -35,22 +35,9 @@ class BxBaseModGeneralMenuView extends BxTemplMenu
      */
     protected function _isVisible ($a)
     {
-        // default visible settings
-        if (!BxDolAcl::getInstance()->isMemberLevelInSet($a['visible_for_levels']))
+        if(!parent::_isVisible($a))
             return false;
-
-        $CNF = $this->_oModule->_oConfig->CNF;
-
-        // get custom function name to check menu item visibility
-        $sFuncCheckAccess = false;
-        if (isset($CNF['MENU_ITEM_TO_METHOD'][$this->_sObject][$a['name']]))
-            $sFuncCheckAccess = $CNF['MENU_ITEM_TO_METHOD'][$this->_sObject][$a['name']];
-
-        // check custom visibility settings defined in module config class
-        if ($sFuncCheckAccess && CHECK_ACTION_RESULT_ALLOWED !== call_user_func_array(array($this->_oModule, $sFuncCheckAccess), isset($this->_aContentInfo) ? array(&$this->_aContentInfo) : array()))
-            return false;
-
-        return true;
+        return $this->_oModule->isMenuItemVisible($this->_sObject, $a, $this->_aContentInfo);
     }
 
     protected function _getMenuItemsCombined ()

+ 32 - 0
modules/base/general/classes/BxBaseModGeneralMenuViewActions.php

@@ -44,6 +44,15 @@ class BxBaseModGeneralMenuViewActions extends BxTemplMenuCustom
         $this->_bShowTitle = false;
     }
 
+    public function addMarkers ($a)
+    {
+        $bResult = parent::addMarkers($a);
+        if($bResult && !empty($this->_oMenuSocialSharing))
+            $this->_oMenuSocialSharing->addMarkers($a);
+
+        return $bResult;
+    }
+
     public function setContentId($iContentId)
     {
         $this->_iContentId = (int)$iContentId;
@@ -53,6 +62,19 @@ class BxBaseModGeneralMenuViewActions extends BxTemplMenuCustom
             $this->addMarkers(array('content_id' => (int)$this->_iContentId));
     }
 
+    /**
+     * Check if menu items is visible with extended checking linked to "allow*" method of particular module
+     * Associated "allow*" method with particular menu item is stored in module config in MENU_ITEM_TO_METHOD array.
+     * @param $a menu item array
+     * @return boolean
+     */
+    protected function _isVisible ($a)
+    {
+        if(!parent::_isVisible($a))
+            return false;
+        return $this->_oModule->isMenuItemVisible($this->_sObject, $a, $this->_aContentInfo);
+    }
+
     protected function _getMenuItemDefault ($aItem)
     {
         $aItem['class_wrp'] = 'bx-base-general-entity-action' . (!empty($aItem['class_wrp']) ? ' ' . $aItem['class_wrp'] : '');
@@ -281,7 +303,12 @@ class BxBaseModGeneralMenuViewActions extends BxTemplMenuCustom
                 return '';
 
             $this->_oMenuActions = BxDolMenu::getObjectInstance($sObjectMenu);
+            if(!$this->_oMenuActions)
+                return '';
+
             $this->_oMenuActions->setContentId($this->_iContentId);
+
+            $this->addMarkers($this->_oMenuActions->getMarkers());
         }
 
         $aItem = $this->_oMenuActions->getMenuItem($aItem['name']);
@@ -314,7 +341,12 @@ class BxBaseModGeneralMenuViewActions extends BxTemplMenuCustom
                 return '';
 
             $this->_oMenuActionsMore = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_MORE']);
+            if(!$this->_oMenuActionsMore)
+                return '';
+
             $this->_oMenuActionsMore->setContentId($this->_iContentId);
+            
+            $this->addMarkers($this->_oMenuActionsMore->getMarkers());
         }
 
         $aItem = $this->_oMenuActionsMore->getMenuItem($aItem['name']);

+ 32 - 8
modules/base/general/classes/BxBaseModGeneralModule.php

@@ -565,7 +565,7 @@ class BxBaseModGeneralModule extends BxDolModule
 
         if(!empty($mixedContent)) {
             if(!is_array($mixedContent))
-               $mixedContent = array((int)$mixedContent, array());
+                $mixedContent = array((int)$mixedContent, (method_exists($this->_oDb, 'getContentInfoById')) ? $this->_oDb->getContentInfoById((int)$mixedContent) : array());
         }
         else {
             $mixedContent = $this->_getContent();
@@ -603,12 +603,10 @@ class BxBaseModGeneralModule extends BxDolModule
         $aMarkers = array(
             'id' => $iContentId,
             'module' => $this->_oConfig->getName(),
+            'title' => !empty($sEntryTitle) ? $sEntryTitle : '',
+            'url' => !empty($sEntryUrl) ? $sEntryUrl : '',
+            'img_url' => ''
         );
-        if(!empty($sEntryTitle))
-            $aMarkers['title'] = $sEntryTitle;
-
-        if(!empty($sEntryUrl))
-            $aMarkers['url'] = $sEntryUrl;
 
         if(!empty($iEntryThumb)) {
             if(!empty($sObjectTranscoder))
@@ -905,14 +903,14 @@ class BxBaseModGeneralModule extends BxDolModule
     {
         $aContentInfo = $this->_oDb->getContentInfoById($aEvent['object_id']);
         if(empty($aContentInfo) || !is_array($aContentInfo))
-            return '';
+            return false;
 
         $CNF = &$this->_oConfig->CNF;
 
         $iUserId = $this->getUserId();
         $iAuthorId = $aContentInfo[$CNF['FIELD_AUTHOR']];
         if($iAuthorId < 0 && abs($iAuthorId) != $iUserId)
-            return '';
+            return false;
 
         //--- Views
         $oViews = isset($CNF['OBJECT_VIEWS']) ? BxDolView::getObjectInstance($CNF['OBJECT_VIEWS'], $aEvent['object_id']) : null;
@@ -1307,6 +1305,32 @@ class BxBaseModGeneralModule extends BxDolModule
         );
     }
 
+    public function isMenuItemVisible($sObject, &$aItem, &$aContentInfo)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        // default visible settings
+        if(!BxDolAcl::getInstance()->isMemberLevelInSet($aItem['visible_for_levels']))
+            return false;
+
+        if (!empty($aItem['visibility_custom'])) {
+            $oMenu = BxDolMenu::getObjectInstance($sObject);
+            if ($oMenu && !BxDolService::callSerialized($aItem['visibility_custom'], $this->_aMarkers))
+                return false;
+        }
+        
+        // get custom function name to check menu item visibility
+        $sFuncCheckAccess = false;
+        if(isset($CNF['MENU_ITEM_TO_METHOD'][$sObject][$aItem['name']]))
+            $sFuncCheckAccess = $CNF['MENU_ITEM_TO_METHOD'][$sObject][$aItem['name']];
+
+        // check custom visibility settings defined in module config class
+        if($sFuncCheckAccess && CHECK_ACTION_RESULT_ALLOWED !== call_user_func_array(array($this, $sFuncCheckAccess), isset($aContentInfo) ? array(&$aContentInfo) : array()))
+            return false;
+
+        return true;
+    }
+
     public function _isModerator ($isPerformAction = false)
     {
         return CHECK_ACTION_RESULT_ALLOWED === $this->checkAllowedEditAnyEntry ($isPerformAction);

+ 30 - 1
modules/base/groups/classes/BxBaseModGroupsModule.php

@@ -118,6 +118,33 @@ class BxBaseModGroupsModule extends BxBaseModProfileModule
         return $this->_oDb->updateAuthorById($iContentId, $aAdmins ? array_pop($aAdmins) : 0);
     }
 
+    /**
+     * Entry actions and social sharing block
+     */
+    public function serviceEntityAllActions ($mixedContent = false, $aParams = array())
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(!empty($mixedContent)) {
+            if(!is_array($mixedContent))
+                $mixedContent = array((int)$mixedContent, (method_exists($this->_oDb, 'getContentInfoById')) ? $this->_oDb->getContentInfoById((int)$mixedContent) : array());
+        }
+        else {
+            $mixedContent = $this->_getContent();
+            if($mixedContent === false)
+                return false;
+        }
+
+        list($iContentId, $aContentInfo) = $mixedContent;
+
+        if(!empty($CNF['FIELD_PICTURE']) && !empty($aContentInfo[$CNF['FIELD_PICTURE']]))
+            $aParams = array_merge(array(
+                'entry_thumb' => (int)$aContentInfo[$CNF['FIELD_PICTURE']]
+            ), $aParams); 
+
+        return parent::serviceEntityAllActions ($mixedContent, $aParams);
+    }
+    
     /**
      * Reset group's author when author profile is deleted
      * @param $iProfileId profile id 
@@ -463,12 +490,14 @@ class BxBaseModGroupsModule extends BxBaseModProfileModule
     public function serviceGetTimelinePost($aEvent, $aBrowseParams = array())
     {
         $a = parent::serviceGetTimelinePost($aEvent, $aBrowseParams);
+        if($a === false)
+            return false;
 
         $oGroupProfile = BxDolProfile::getInstanceByContentAndType($aEvent['object_id'], $this->getName());
 
         $a['content']['url'] = $oGroupProfile->getUrl();
         $a['content']['title'] = $oGroupProfile->getDisplayName();
-        
+
         return $a;
     }
 

+ 9 - 7
modules/base/profile/classes/BxBaseModProfileModule.php

@@ -180,6 +180,8 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
 
         if ($CNF['TRIGGER_MENU_PROFILE_VIEW_SUBMENU'] == $sMenuTriggerName)
             return $CNF['OBJECT_MENU_SUBMENU_VIEW_ENTRY'];
+        elseif ($CNF['TRIGGER_MENU_PROFILE_SNIPPET_META'] == $sMenuTriggerName)
+            return $CNF['OBJECT_MENU_SNIPPET_META'];
         else if ($CNF['TRIGGER_MENU_PROFILE_VIEW_ACTIONS'] == $sMenuTriggerName) {
             if(empty($CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL']))
                 return $CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY'];
@@ -1139,15 +1141,15 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
 
         $aFileInfo = BxDolStorage::getObjectInstance($CNF[$aBuildParams['stg']])->getFile((int)$aEvent['object_id']);
         if(empty($aFileInfo) || !is_array($aFileInfo))
-            return '';
+            return false;
             
         $aEventContent = unserialize($aEvent['content']);
         if(!is_array($aEventContent) || empty($aEventContent['content']))
-            return '';
+            return false;
 
         $aContentInfo = $this->_oDb->getContentInfoById($aEventContent['content']);
         if(empty($aContentInfo) || !is_array($aContentInfo))
-            return '';
+            return false;
 
         list($sUserName) = $this->getUserInfo($aContentInfo['profile_id']);
 
@@ -1163,15 +1165,15 @@ class BxBaseModProfileModule extends BxBaseModGeneralModule implements iBxDolCon
         return array(
             'owner_id' => $aContentInfo['profile_id'],
             'icon' => !empty($CNF['ICON']) ? $CNF['ICON'] : '',
-        	'sample' => $sSample,
-        	'sample_wo_article' => $CNF['T'][$aBuildParams['txt_ss']],
-    	    'sample_action' => isset($CNF['T'][$aBuildParams['txt_sa']]) ? $CNF['T'][$aBuildParams['txt_sa']] : '',
+            'sample' => $sSample,
+            'sample_wo_article' => $CNF['T'][$aBuildParams['txt_ss']],
+            'sample_action' => isset($CNF['T'][$aBuildParams['txt_sa']]) ? $CNF['T'][$aBuildParams['txt_sa']] : '',
             'url' => BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'] . '&id=' . $aContentInfo[$CNF['FIELD_ID']]),
             'content' => $this->_getContentForTimelineProfileImage($aEvent, $aBrowseParams, $aBuildParams, $aContentInfo, $aFileInfo), //a string to display or array to parse default template before displaying.
             'date' => $aContentInfo[$CNF['FIELD_ADDED']],
             'views' => '',
             'votes' => '',
-        	'scores' => '',
+            'scores' => '',
             'reports' => '',
             'comments' => '',
             'title' => $sTitle, //may be empty.

+ 9 - 6
modules/base/profile/classes/BxBaseModProfileTemplate.php

@@ -233,11 +233,14 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
             )), true, true);
         }
 
-        $sMenu = $CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY'];
-        if(!empty($CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL']))
-            $sMenu = $CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL'];
-
-        $oMenu = BxTemplMenu::getObjectInstance($sMenu);
+        $sActionsMenu = '';
+        if(empty($CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL'])) {
+            $oMenu = BxTemplMenu::getObjectInstance($CNF['OBJECT_MENU_ACTIONS_VIEW_ENTRY']);
+            if($oMenu)
+                $sActionsMenu = $oMenu->getCode();
+        }
+        else 
+            $sActionsMenu = $this->getModule()->serviceEntityAllActions();
 
         // generate html
         $aVars = array (
@@ -246,7 +249,7 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
             'title' => $sTitle,
             //'menu' => BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_SUBMENU_VIEW_ENTRY_COVER'])->getCode(), // TODO: check if menu is used somewhere
 
-            'action_menu' => $oMenu ? $oMenu->getCode() : '',
+            'action_menu' => $sActionsMenu,
 
         	'bx_if:show_ava_image' => array(
                 'condition' => $bUrlAvatar,

+ 9 - 2
modules/base/profile/template/css/main.css

@@ -237,16 +237,23 @@ a.bx-base-pofile-cover-image:hover,
     display: flex;
     -webkit-align-items: center;
     align-items: center;
-    -webkit-justify-content: flex-end;
-    justify-content: flex-end;
 
     height: 4rem;
     max-width: 50%;
 }
 
+.bx-base-pofile-cover-actions div.bx-base-general-entity-actions {
+    position: relative;
+    width: 100%;
+}
+
 .bx-base-pofile-cover-actions ul.bx-menu-hor.bx-menu-more-auto {
+    display: -webkit-flex;
+    display: flex;
     -webkit-flex-wrap: nowrap;
     flex-wrap: nowrap;
+    -webkit-justify-content: flex-end;
+    justify-content: flex-end;
 }
 
 .bx-base-pofile-cover-actions .bx-menu-hor li.bx-menu-item {

+ 32 - 3
modules/boonex/albums/classes/BxAlbumsModule.php

@@ -23,6 +23,35 @@ class BxAlbumsModule extends BxBaseModTextModule
         parent::__construct($aModule);
     }
 
+    /**
+     * Entry actions and social sharing block
+     */
+    public function serviceEntityAllActions ($mixedContent = false, $aParams = array())
+    {
+        if(!empty($mixedContent)) {
+            if(!is_array($mixedContent))
+               $mixedContent = array((int)$mixedContent, array());
+        }
+        else {
+            $mixedContent = $this->_getContent();
+            if($mixedContent === false)
+                return false;
+        }
+        
+        list($iContentId, $aContentInfo) = $mixedContent;
+
+        $aMedias = $this->_oDb->getMediaListByContentId($iContentId);
+        if(!empty($aMedias) && is_array($aMedias)) {
+            $aMedia = array_shift($aMedias);
+            if(!empty($aMedia['file_id']))
+                $aParams = array_merge(array(
+                    'entry_thumb' => $aMedia['file_id']
+                ), $aParams);
+        }
+
+        return parent::serviceEntityAllActions(array($iContentId, $aContentInfo), $aParams);
+    }
+    
     /**
      * Display form for adding media to the album.
      * @param $iContentId album content id where media will be added, if it's not provided then it's determined from 'id' GET variable
@@ -288,16 +317,16 @@ class BxAlbumsModule extends BxBaseModTextModule
     public function serviceGetTimelineMedia($aEvent, $aBrowseParams = array())
     {
         if(empty($aEvent['content']))
-            return '';
+            return false;
 
         $aEvent['content'] = unserialize($aEvent['content']);
         if(empty($aEvent['content']['medias_added']) || !is_array($aEvent['content']['medias_added']))
-            return '';
+            return false;
 
         $iContentId = (int)$aEvent['object_id'];
         $aContentInfo = $this->_oDb->getContentInfoById($iContentId);
         if(empty($aContentInfo) || !is_array($aContentInfo))
-            return '';
+            return false;
 
         $CNF = &$this->_oConfig->CNF;
         

+ 1 - 1
modules/boonex/albums/install/sql/install.sql

@@ -108,7 +108,7 @@ CREATE TABLE IF NOT EXISTS `bx_albums_cmts_media` (
   `cmt_parent_id` int(11) NOT NULL DEFAULT '0',
   `cmt_vparent_id` int(11) NOT NULL DEFAULT '0',
   `cmt_object_id` int(11) NOT NULL DEFAULT '0',
-  `cmt_author_id` int(10) unsigned NOT NULL DEFAULT '0',
+  `cmt_author_id` int(11) NOT NULL DEFAULT '0',
   `cmt_level` int(11) NOT NULL DEFAULT '0',
   `cmt_text` text NOT NULL,
   `cmt_mood` tinyint(4) NOT NULL DEFAULT '0',

+ 6 - 6
modules/boonex/analytics/classes/BxAnalyticsDb.php

@@ -20,7 +20,7 @@ class BxAnalyticsDb extends BxBaseModGeneralDb
             'datefrom' => $iDateFrom,
             'dateto' => $iDateTo
         );
-        $sQuery = "SELECT DATE(FROM_UNIXTIME(`" . $sColumnAdded . "`))  AS `period`, YEAR(FROM_UNIXTIME(`" . $sColumnAdded . "`))  AS `year`,  COUNT(*) AS `count` FROM " . $sTableName . " WHERE `" . $sColumnAdded . "` >= :datefrom AND `" . $sColumnAdded . "` <= :dateto   GROUP BY `period`, `year` ORDER BY `year`, `period` ASC";
+        $sQuery = "SELECT DATE(FROM_UNIXTIME(`" . $sColumnAdded . "`)) AS `period`, YEAR(FROM_UNIXTIME(`" . $sColumnAdded . "`)) AS `year`, COUNT(*) AS `count` FROM " . $sTableName . " WHERE `" . $sColumnAdded . "` >= :datefrom AND `" . $sColumnAdded . "` <= :dateto GROUP BY `period`, `year` ORDER BY `year`, `period` ASC";
         return $this->getAll($sQuery, $aBindings);
     }
           
@@ -29,7 +29,7 @@ class BxAnalyticsDb extends BxBaseModGeneralDb
         $aBindings = array(
             'datefrom' => $iDateFrom
         );
-        $sQuery = "SELECT  COUNT(*) AS `count` FROM " . $sTableName . " WHERE `" . $sColumnAdded . "` < :datefrom ";
+        $sQuery = "SELECT COUNT(*) AS `count` FROM " . $sTableName . " WHERE `" . $sColumnAdded . "` < :datefrom ";
         return $this->getOne($sQuery, $aBindings);
     }
           
@@ -39,7 +39,7 @@ class BxAnalyticsDb extends BxBaseModGeneralDb
             'datefrom' => $iDateFrom,
             'dateto' => $iDateTo
         );
-        $sQuery = "SELECT `object_id`,'" . $sModuleName . "' AS `module`, COUNT(*) AS `value` FROM `" . $sTableName . "` WHERE `date` >= :datefrom  AND `date` <= :dateto GROUP BY `object_id` ORDER BY  COUNT(*) DESC LIMIT 0, " . intval(getParam('bx_analytics_items_count'));
+        $sQuery = "SELECT `object_id`,'" . $sModuleName . "' AS `module`, COUNT(*) AS `value` FROM `" . $sTableName . "` WHERE `date` >= :datefrom AND `date` <= :dateto GROUP BY `object_id` ORDER BY COUNT(*) DESC LIMIT 0, " . intval(getParam('bx_analytics_items_count'));
         return $this->getAll($sQuery, $aBindings);
     }
           
@@ -50,7 +50,7 @@ class BxAnalyticsDb extends BxBaseModGeneralDb
             'dateto' => $iDateTo
         );
         $sQuery = "SELECT `sys_profiles`.`content_id` AS `object_id`, `sys_profiles`.`type` , COUNT(`sys_profiles_conn_subscriptions`.`id`) AS `value` FROM `sys_profiles_conn_subscriptions`
-INNER JOIN `sys_profiles`  ON `sys_profiles`.`id` = `sys_profiles_conn_subscriptions`.`content` WHERE sys_profiles.type='" . $sModuleName . "' AND  `sys_profiles_conn_subscriptions`.`added` >= :datefrom AND  `sys_profiles_conn_subscriptions`.`added` <= :dateto GROUP BY `sys_profiles`.`content_id`, `sys_profiles`.`type` ORDER BY COUNT(`sys_profiles_conn_subscriptions`.`id`) DESC LIMIT 0," . intval(getParam('bx_analytics_items_count'));
+INNER JOIN `sys_profiles` ON `sys_profiles`.`id` = `sys_profiles_conn_subscriptions`.`content` WHERE sys_profiles.type='" . $sModuleName . "' AND `sys_profiles_conn_subscriptions`.`added` >= :datefrom AND `sys_profiles_conn_subscriptions`.`added` <= :dateto GROUP BY `sys_profiles`.`content_id`, `sys_profiles`.`type` ORDER BY COUNT(`sys_profiles_conn_subscriptions`.`id`) DESC LIMIT 0," . intval(getParam('bx_analytics_items_count'));
         return $this->getAll($sQuery, $aBindings);
     }
           
@@ -60,8 +60,8 @@ INNER JOIN `sys_profiles`  ON `sys_profiles`.`id` = `sys_profiles_conn_subscript
             'datefrom' => $iDateFrom,
             'dateto' => $iDateTo
         );
-        $sQuery = "SELECT `sys_profiles`.`content_id`  AS `object_id`, `sys_profiles`.`type`, '" . $sContentModuleName . "' , COUNT(`" . $sTableName . "`.`id`) AS `value` FROM `" . $sTableName . "`
-INNER JOIN `sys_profiles`  ON `sys_profiles`.`id` = `" . $sTableName . "`.`" . $sColumnAuthor . "` WHERE sys_profiles.type='" . $sModuleName . "' AND  `" . $sTableName . "`.`" . $sColumnAdded . "` >= :datefrom AND `" . $sTableName . "`.`" . $sColumnAdded . "` <= :dateto GROUP BY `sys_profiles`.`content_id`, `sys_profiles`.`type` ORDER BY COUNT(`" . $sTableName . "`.`id`) DESC LIMIT 0," . intval(getParam('bx_analytics_items_count'));
+        $sQuery = "SELECT `sys_profiles`.`content_id` AS `object_id`, `sys_profiles`.`type`, '" . $sContentModuleName . "' , COUNT(`" . $sTableName . "`.`id`) AS `value` FROM `" . $sTableName . "`
+INNER JOIN `sys_profiles` ON `sys_profiles`.`id` = `" . $sTableName . "`.`" . $sColumnAuthor . "` WHERE sys_profiles.type='" . $sModuleName . "' AND `" . $sTableName . "`.`" . $sColumnAdded . "` >= :datefrom AND `" . $sTableName . "`.`" . $sColumnAdded . "` <= :dateto GROUP BY `sys_profiles`.`content_id`, `sys_profiles`.`type` ORDER BY COUNT(`" . $sTableName . "`.`id`) DESC LIMIT 0," . intval(getParam('bx_analytics_items_count'));
         return $this->getAll($sQuery, $aBindings);
     }
 }

+ 14 - 13
modules/boonex/analytics/classes/BxAnalyticsModule.php

@@ -136,7 +136,7 @@ class BxAnalyticsModule extends BxDolModule
         header('Content-Type: application/json');
               
         $iDateFrom = strtotime($sDateFrom);
-        $iDateTo = strtotime($sDateTo);
+        $iDateTo = strtotime($sDateTo) + 86400;
         $sType = "bar";
         $bIsTimeX = false;
         $iMinValueY = 0;
@@ -187,12 +187,13 @@ class BxAnalyticsModule extends BxDolModule
                     for ($i = $iDateFrom; $i < $iDateTo ; $i = $i + 86400 ){
                         $sX = date('Y-m-d', $i);
                         if (!array_key_exists($sX, $aTmpDates)){
-                        array_push($aValues['values'][0]['data'], array('x' => $sX, 'y' => $sReportName == BX_ANALYTICS_CONTENT_TOTAL ? $iValuePrev : 0));
+                            array_push($aValues['values'][0]['data'], array('x' => $sX, 'y' => $sReportName == BX_ANALYTICS_CONTENT_TOTAL ? $iValuePrev : 0));
                         }
                         else{
-                            array_push($aValues['values'][0]['data'], array('x' => $sX, 'y' => $sReportName == BX_ANALYTICS_CONTENT_TOTAL ? $iValuePrev : $aTmpDates[$sX]));
+                            array_push($aValues['values'][0]['data'], array('x' => $sX, 'y' => $sReportName == BX_ANALYTICS_CONTENT_TOTAL ? ($iValuePrev + $aTmpDates[$sX]) : $aTmpDates[$sX]));
                             $iValuePrev += $aTmpDates[$sX];
                         }
+                        array_push($aValues['labels'], $sX);
                         if ($sReportName == BX_ANALYTICS_CONTENT_TOTAL){
                             if ($iValuePrev > $iMaxValueY)
                                 $iMaxValueY = $iValuePrev;
@@ -200,7 +201,7 @@ class BxAnalyticsModule extends BxDolModule
                         else{
                             if (array_key_exists($sX, $aTmpDates) && $aTmpDates[$sX] > $iMaxValueY)
                                 $iMaxValueY = $aTmpDates[$sX];
-                        }
+                        } 
                     }
                 }
                 break;
@@ -273,7 +274,7 @@ class BxAnalyticsModule extends BxDolModule
                  ),
                 'display' => true,
                 'distribution' => 'linear',
-                'ticks' =>  array(
+                'ticks' => array(
                     'display' => true, 
                     'autoSkip' => true, 
                 )
@@ -281,19 +282,19 @@ class BxAnalyticsModule extends BxDolModule
         }
         else{
             $aDataForChartXAxes = array(
-                'ticks' =>  array(
+                'ticks' => array(
                     'autoSkip' => false
                 ),
                 'display' => true
             );
         }
        
-        $aDataForChartDatasets = array();    
+        $aDataForChartDatasets = array();
         for($i = 0; $i < count($aValues['values']); $i++){
             $aDataForChartDatasets[] = array(
                 'label' => $aValues['values'][$i]['legend'],
                 'fill' => false,
-                'backgroundColor' =>  $this->aColors[$i],
+                'backgroundColor' => $this->aColors[$i],
                 'borderColor' => $this->aColors[$i],
                 'borderWidth' => 1,
                 'data' => $aValues['values'][$i]['data']
@@ -301,8 +302,8 @@ class BxAnalyticsModule extends BxDolModule
         }
             
         $aDataForChart = array(
-            'type' =>  $sType,
-            'data' =>  array(
+            'type' => $sType,
+            'data' => array(
                 'labels' => $aValues['labels'], 
                 'datasets' => $aDataForChartDatasets
             ),
@@ -312,9 +313,9 @@ class BxAnalyticsModule extends BxDolModule
                     'display' => count($aValues['values']) == 1 ? false :true
                 ),
                 'scales' => array(
-                    'yAxes' =>  array(
+                    'yAxes' => array(
                         array(
-                            'ticks' =>  array(
+                            'ticks' => array(
                                 'max' => $iMaxValueY, 
                                 'min' => $iMinValueY, 
                                 'stepSize' => $this->getStep($iMinValueY, $iMaxValueY), 
@@ -322,7 +323,7 @@ class BxAnalyticsModule extends BxDolModule
                             )
                         )
                     ),
-                    'xAxes' =>  array($aDataForChartXAxes)
+                    'xAxes' => array($aDataForChartXAxes)
                 )
             ),
             'links' => $aValues['links'],

+ 1 - 1
modules/boonex/analytics/install/sql/enable.sql

@@ -26,4 +26,4 @@ INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `
 -- MENU: account dashboard
 SET @iMoAccountDashboard = (SELECT IFNULL(MAX(`order`), 0) FROM `sys_menu_items` WHERE `set_name`='sys_account_dashboard' LIMIT 1);
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `editable`, `order`) VALUES
-('sys_account_dashboard', 'bx_analytics', 'dashboard-analytics', '_bx_analytics_item_title_system_analytics', '_bx_analytics_item_title_analytics', 'page.php?i=analytics', '', '', 'certificate col-red', '', '', 2147483646, 1, 0, 1, @iMoAccountDashboard + 1);
+('sys_account_dashboard', @sName, 'dashboard-analytics', '_bx_analytics_item_title_system_analytics', '_bx_analytics_item_title_analytics', 'page.php?i=analytics', '', '', 'certificate col-red', '', '', 192, 1, 0, 1, @iMoAccountDashboard + 1);

+ 55 - 0
modules/boonex/anon_follow/classes/BxAnonFollowAlertsResponse.php

@@ -0,0 +1,55 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxAnonFollowAlertsResponse extends BxDolAlertsResponse
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+    
+    public function response($oAlert)
+    {
+        if ($oAlert->sUnit == 'sys_profiles_subscriptions'){
+            if ($oAlert->sAction == 'connection_added'){
+                if (isset($oAlert->aExtras['initiator']) && isset($oAlert->aExtras['content']) && bx_get('anon') == '1'){
+                    $oModule = BxDolModule::getInstance('bx_anon_follow');
+                    $oModule->_oDb->addFollower($oAlert->aExtras['initiator'], $oAlert->aExtras['content']);
+                }
+            }
+            
+            if ($oAlert->sAction == 'connection_removed'){
+                if (isset($oAlert->aExtras['initiator']) && isset($oAlert->aExtras['content'])){
+                    $oModule = BxDolModule::getInstance('bx_anon_follow');
+                    $oModule->_oDb->removeFollower($oAlert->aExtras['initiator'], $oAlert->aExtras['content']);
+                }
+            }
+        }
+        
+        if ($oAlert->sAction == 'menu_custom_item'){
+            if($oAlert->aExtras['item']['module'] == 'bx_anon_follow' && $oAlert->aExtras['item']['name'] == 'anon-follow'){
+                $oModule = BxDolModule::getInstance('bx_anon_follow');
+                $oAlert->aExtras['res'] = '';
+                $bIsSubscribed = $oModule->checkIsSubscribed($oAlert->aExtras['content_data']['profile_id']);
+                if ($bIsSubscribed){
+                    $oAlert->aExtras['res'] = '';
+                    return;
+                }
+                $oAlert->aExtras['res'] = $oModule->_oTemplate->parseHtmlByName('follow_button.html', array(
+                    'profile_id' => $oAlert->aExtras['content_data']['profile_id'],
+                    'title' => _t('_bx_anon_follow_txt_button')
+                ));
+            }
+        }
+    }
+}
+
+/** @} */

+ 30 - 0
modules/boonex/anon_follow/classes/BxAnonFollowConfig.php

@@ -0,0 +1,30 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxAnonFollowConfig extends BxDolModuleConfig
+{
+    public function __construct($aModule)
+    {
+        parent::__construct($aModule);
+        $this->CNF = array (
+           // database tables
+           'TABLE_ENTRIES' => $aModule['db_prefix'] . 'subscriptions',
+           
+            // database fields
+           'FIELD_ID' => 'id',
+           'FIELD_INITIATOR' => 'initiator',
+           'FIELD_CONTENT' => 'content',
+           'FIELD_ADDED' => 'added',
+       );
+    }
+}
+
+/** @} */

+ 41 - 0
modules/boonex/anon_follow/classes/BxAnonFollowDb.php

@@ -0,0 +1,41 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxAnonFollowDb extends BxBaseModGeneralDb
+{
+    function __construct(&$oConfig)
+    {
+        parent::__construct($oConfig);
+    }
+    
+    public function addFollower($iInitiator, $iContent)
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $aBindings = array(
+            'initiator' => $iInitiator,
+            'content' => $iContent,
+            'added' => time()
+        );
+        $this->query("INSERT INTO `" . $CNF['TABLE_ENTRIES'] . "` (`" . $CNF['FIELD_INITIATOR'] . "`, `" . $CNF['FIELD_CONTENT'] . "`, `" . $CNF['FIELD_ADDED'] . "`) values (:initiator, :content, :added)", $aBindings);
+    }
+    
+    public function removeFollower($iInitiator, $iContent)
+    {
+        $CNF = &$this->_oConfig->CNF;
+        $aBindings = array(
+            'initiator' => $iInitiator,
+            'content' => $iContent
+        );
+        $this->query("DELETE FROM `" . $CNF['TABLE_ENTRIES'] . "` WHERE `" . $CNF['FIELD_INITIATOR'] . "` = :initiator AND `" . $CNF['FIELD_CONTENT'] . "`= :content", $aBindings);
+    }
+}
+
+/** @} */

+ 72 - 0
modules/boonex/anon_follow/classes/BxAnonFollowGridSubscribedMe.php

@@ -0,0 +1,72 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxAnonFollowGridSubscribedMe extends BxDolGridSubscribedMe
+{
+    protected $MODULE;
+    protected $_oModule;
+    
+    public function __construct ($aOptions, $oTemplate = false)
+    {
+        $this->MODULE = 'bx_anon_follow';
+        $this->_oModule = BxDolModule::getInstance($this->MODULE);
+        parent::__construct ($aOptions, $oTemplate);
+        $CNF = $this->_oModule->_oConfig->CNF;
+        
+        $this->addMarkers(array(
+            'join_connections2' => 'INNER JOIN `' . $CNF['TABLE_ENTRIES'] . '` AS `c2` ON `c`.`' . $CNF['FIELD_INITIATOR'] . '` = `c2`.`' . $CNF['FIELD_INITIATOR'] . '` AND `c`.`' . $CNF['FIELD_CONTENT'] . '` = `c2`.`' . $CNF['FIELD_CONTENT'] . '` '
+        ));
+    }
+    
+    protected function _getCellName($mixedValue, $sKey, $aField, $aRow)
+    {
+        $mixedValue = strip_tags(htmlspecialchars_decode($mixedValue));
+        $aTitle = array();
+        $oProfile = BxDolProfile::getInstance($aRow['id']);
+        $aProfile = $oProfile->getInfo();
+        $oModule = BxDolModule::getInstance($aProfile['type']);
+        $aFields = $oModule->serviceGetSearchableFieldsExtended();
+        $aProfileData = $oModule->serviceGetContentInfoById($aProfile['content_id']);
+        $sShowFields = $aProfile['type'] == 'bx_persons' ? getParam('bx_anon_follow_persons_fields') : getParam('bx_anon_follow_orgs_fields');
+        $aShowFields = explode(',', $sShowFields);
+        $sTitle = '';
+        foreach($aShowFields as $aField){
+            $sValue = "";
+            if (isset($aProfileData[$aField]))
+            {
+                if (isset($aFields[$aField]) && $aFields[$aField]['type'] == 'select' && substr_count($aFields[$aField]['values'], '#!')){
+                    $aValuesList = BxDolForm::getDataItems(str_replace('#!', '', 'mylist'));
+                    if (isset($aValuesList[$aProfileData[$aField]])){
+                        $sValue = $aValuesList[$aProfileData[$aField]];
+                    }
+                }
+                else{
+                    $sValue = $aProfileData[$aField];
+                }
+            }
+            if (trim($sValue) != '')
+                $aTitle[] = $sValue;
+        }
+        $sTitle = implode(getParam('bx_anon_follow_fields_separator'), $aTitle);
+        if ($sTitle == '')
+        {
+            $sTitle = _t('_bx_anon_follow_txt_grid_title_default');
+        }
+        return parent::_getCellDefault($sTitle, $sKey, $aField, $aRow);
+    }
+    
+    protected function _getCellActions($mixedValue, $sKey, $aField, $aRow)
+    {
+        return parent::_getCellDefault('', $sKey, $aField, $aRow);
+    }
+}
+
+/** @} */

+ 164 - 0
modules/boonex/anon_follow/classes/BxAnonFollowModule.php

@@ -0,0 +1,164 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxAnonFollowModule extends BxDolModule
+{
+    public function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+    }
+    
+    /**
+     * SERVICE METHODS
+     */
+    
+    /**
+     * @page service Service Calls
+     * @section bx_anon_follow Mass mailer
+     * @subsection bx_anon_follow-page_blocks Page Blocks
+     * @subsubsection bx_anon_follow-get_profile_fields get_profile_fields
+     * 
+     * @code bx_srv('bx_anon_follow', 'get_profile_fields', [...]); @endcode
+     * 
+     * Get array with module filelds
+     *
+     * @param $aParams an array with search params.
+     * @return array with module filelds
+     * 
+     * @see BxAnonFollowModule::GetProfileFields
+     */
+    /** 
+     * @ref bx_anon_follow-get_profile_fields "get_profile_fields"
+     */
+    public function serviceGetProfileFields($sModule)
+    {
+        $aResult = array();
+        $oModule = BxDolModule::getInstance($sModule);
+        $aFields = $oModule->serviceGetSearchableFieldsExtended();
+        foreach($aFields as $sKey => $aField){
+            if ($aField['type'] == 'text' || $aField['type'] == 'select')
+            $aResult[$sKey] = _t($aField['caption']);
+        }
+        return $aResult;
+    }
+    
+    /**
+     * @page service Service Calls
+     * @section bx_anon_follow Mass mailer
+     * @subsection bx_anon_follow-page_blocks Page Blocks
+     * @subsubsection bx_anon_follow-check_is_subscribed check_is_subscribed
+     * 
+     * @code bx_srv('bx_anon_follow', 'check_is_subscribed', [...]); @endcode
+     * 
+     * Get subscribed connection for specified profile
+     *
+     * @param $aParams an array with search params.
+     * @return boolean connection for specified profile
+     * 
+     * @see BxAnonFollowModule::CheckIsSubscribed
+     */
+    /** 
+     * @ref bx_anon_follow-check_is_subscribed "check_is_subscribed"
+     */
+    public function serviceCheckIsSubscribed ($iProfileId)
+    {
+        if(isset($iProfileId)){
+            return !$this->checkIsSubscribed($iProfileId);
+        }
+        return false;
+    }
+    
+    /**
+     * @page service Service Calls
+     * @section bx_anon_follow Mass mailer
+     * @subsection bx_anon_follow-page_blocks Page Blocks
+     * @subsubsection bx_anon_follow-subscribed_me_table subscribed_me_table
+     * 
+     * @code bx_srv('bx_anon_follow', 'subscribed_me_table', [...]); @endcode
+     * 
+     * Get grid with subscribers list
+     *
+     * @param $aParams an array with search params.
+     * @return HTML string with block content to display on the site. All necessary CSS and JS files are automatically added to the HEAD section of the site HTML.
+     * 
+     * @see BxAnonFollowModule::SubscribedMeTable
+     */
+    /** 
+     * @ref bx_anon_follow-subscribed_me_table "subscribed_me_table"
+     */
+    public function serviceSubscribedMeTable ($iProfileId = 0)
+    {
+        if(!$iProfileId && bx_get('profile_id') !== false)
+            $iProfileId = bx_process_input(bx_get('profile_id'), BX_DATA_INT);
+
+        $aProfile = BxDolProfile::getInstance($iProfileId)->getInfo();
+        if(empty($aProfile) || !is_array($aProfile))
+            return false;
+
+        $CNF = &BxDolModule::getInstance($aProfile['type'])->_oConfig->CNF;
+        if(getParam($CNF['PARAM_PUBLIC_SBSD']) != 'on' && $aProfile['id'] != bx_get_logged_profile_id())
+            return false;
+
+        $oGrid = BxDolGrid::getObjectInstance('bx_anon_follow_subscribed_me');
+
+        if(!$oGrid)
+            return false;
+
+        $oGrid->setProfileId($iProfileId);
+        $sContent = $oGrid->getCode();
+        if(empty($sContent))
+            return false;
+
+        return $this->_oTemplate->parseHtmlByName('connections_list.html', array(
+            'name' => 'subscribers',
+            'content' => $sContent
+        ));
+    }
+    
+    /**
+     * @page service Service Calls
+     * @section bx_anon_follow Mass mailer
+     * @subsection bx_anon_follow-page_blocks Page Blocks
+     * @subsubsection bx_anon_follow-include_js include_js
+     * 
+     * @code bx_srv('bx_anon_follow', 'include_js', [...]); @endcode
+     * 
+     * Add js to injection in head
+     *
+     * @param $aParams an array with search params.
+     * @return void
+     * 
+     * @see BxAnonFollowModule::serviceIncludeJs
+     */
+    /** 
+     * @ref bx_anon_follow-include_js "include_js"
+     */
+    public function serviceIncludeJs ()
+    {
+        $this->_oTemplate->addJs(array('main.js'));
+        return ;
+    }
+    
+    public function checkIsSubscribed($iProfileId)
+    {
+        $bRv = false;
+        $oConnection = BxDolConnection::getObjectInstance('sys_profiles_subscriptions');
+        if(!$oConnection){
+            $bRv = false;
+        }
+        if($oConnection->isConnected(bx_get_logged_profile_id(), $iProfileId)){
+            $bRv = true;
+        }
+        return $bRv;
+    }
+}
+
+/** @} */

+ 20 - 0
modules/boonex/anon_follow/classes/BxAnonFollowTemplate.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxAnonFollowTemplate extends BxDolModuleTemplate
+{
+    function __construct(&$oConfig, &$oDb)
+    {
+        parent::__construct($oConfig, $oDb);
+    }
+}
+
+/** @} */

+ 78 - 0
modules/boonex/anon_follow/install/config.php

@@ -0,0 +1,78 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+$aConfig = array(
+    /**
+     * Main Section.
+     */
+    'type' => BX_DOL_MODULE_TYPE_MODULE,
+    'name' => 'bx_anon_follow',
+    'title' => 'Anonymous Follow',
+    'note' => 'This module add ability to follow anonymousy',
+    'version' => '9.0.0',
+    'vendor' => 'BoonEx',
+    'help_url' => 'http://feed.boonex.com/?section={module_name}',
+
+    'compatible_with' => array(
+        '9.0.x'
+    ),
+
+    /**
+     * 'home_dir' and 'home_uri' - should be unique. Don't use spaces in 'home_uri' and the other special chars.
+     */
+    'home_dir' => 'boonex/anon_follow/',
+    'home_uri' => 'anon_follow',
+
+    'db_prefix' => 'bx_anon_follow_',
+    'class_prefix' => 'BxAnonFollow',
+
+    /**
+     * Category for language keys.
+     */
+    'language_category' => 'Anonymous Follow',
+
+    
+    /**
+      * Menu triggers.
+      */
+    'menu_triggers' => array(
+        'trigger_profile_view_actions',
+        'trigger_profile_snippet_meta',
+    ),
+    
+    /**
+     * Installation/Uninstallation Section.
+     */
+    'install' => array(
+        'check_dependencies' => 1,
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    ),
+    'uninstall' => array (
+        'execute_sql' => 1,
+        'update_languages' => 1,
+    ),
+    'enable' => array(
+        'check_dependencies' => 1,
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'enable_success' => array(
+        'process_menu_triggers' => 1,
+        'clear_db_cache' => 1,
+    ),
+    'disable' => array(
+        'execute_sql' => 1,
+        'clear_db_cache' => 1,
+    ),
+);
+
+/** @} */

+ 20 - 0
modules/boonex/anon_follow/install/installer.php

@@ -0,0 +1,20 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxAnonFollowInstaller extends BxDolStudioInstaller
+{
+    function __construct($aConfig)
+    {
+        parent::__construct($aConfig);
+    }
+}
+
+/** @} */

+ 14 - 0
modules/boonex/anon_follow/install/langs/en.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources name="en" flag="gb" title="English">
+	<string name="_bx_anon_follow"><![CDATA[Anonymous Follow]]></string>
+  <string name="_bx_anon_follow_page_block_title_sys_anon_follow"><![CDATA[Followers]]></string>
+  <string name="_bx_anon_follow_page_block_title_anon_follow"><![CDATA[Followers]]></string>
+  <string name="_bx_anon_follow_menu_item_title_system_follow"><![CDATA[Follow anonymously]]></string>
+  <string name="_bx_anon_follow_menu_item_title_follow"><![CDATA[Follow anonymously]]></string>
+  <string name="_bx_anon_follow_persons_fields"><![CDATA[Persons filelds]]></string>
+  <string name="_bx_anon_follow_orgs_fields"><![CDATA[Organisations filelds]]></string>
+  <string name="_bx_anon_follow_fields_separator"><![CDATA[Filelds separator]]></string>
+  
+  <string name="_bx_anon_follow_txt_button"><![CDATA[Follow anonimus]]></string>
+  <string name="_bx_anon_follow_txt_grid_title_default"><![CDATA[Follow anonimus]]></string>
+</resources>

+ 27 - 0
modules/boonex/anon_follow/install/sql/disable.sql

@@ -0,0 +1,27 @@
+SET @sName = 'bx_anon_follow';
+
+-- SETTINGS
+SET @iTypeId = (SELECT `ID` FROM `sys_options_types` WHERE `name` = @sName LIMIT 1);
+SET @iCategId = (SELECT `ID` FROM `sys_options_categories` WHERE `type_id` = @iTypeId LIMIT 1);
+DELETE FROM `sys_options` WHERE `category_id` = @iCategId;
+DELETE FROM `sys_options_categories` WHERE `type_id` = @iTypeId;
+DELETE FROM `sys_options_types` WHERE `id` = @iTypeId;
+
+-- PAGES
+DELETE FROM `sys_pages_blocks` WHERE `module` = @sName;
+
+-- MENUS
+DELETE FROM `sys_menu_items` WHERE `module` = @sName;
+
+-- GRIDS
+DELETE FROM `sys_objects_grid` WHERE `object` IN ('bx_anon_follow_subscribed_me');
+DELETE FROM `sys_grid_fields` WHERE `object` IN ('bx_anon_follow_subscribed_me');
+DELETE FROM `sys_grid_actions` WHERE `object` IN ('bx_anon_follow_subscribed_me');
+
+-- INJECTION
+DELETE FROM `sys_injections` WHERE `name`= @sName;
+
+-- ALERTS
+SET @iHandler := (SELECT `id` FROM `sys_alerts_handlers` WHERE `name` = @sName LIMIT 1);
+DELETE FROM `sys_alerts` WHERE `handler_id` = @iHandler;
+DELETE FROM `sys_alerts_handlers` WHERE `id` = @iHandler;

+ 53 - 0
modules/boonex/anon_follow/install/sql/enable.sql

@@ -0,0 +1,53 @@
+SET @sName = 'bx_anon_follow';
+
+-- SETTINGS
+SET @iTypeOrder = (SELECT IFNULL(MAX(`order`), 0) + 1 FROM `sys_options_types` WHERE `group` = 'modules');
+
+INSERT INTO `sys_options_types` (`group`, `name`, `caption`, `icon`, `order`) 
+VALUES('modules', @sName, '_bx_anon_follow', 'bx_anon_follow@modules/boonex/anon_follow/|std-icon.svg', IF(ISNULL(@iTypeOrder), 1, @iTypeOrder + 1));
+
+SET @iTypeId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options_categories` (`type_id`, `name`, `caption`, `hidden`, `order`) VALUES(@iTypeId,  'bx_anon_follow', '_bx_anon_follow', 0, 2);
+SET @iCategoryId = LAST_INSERT_ID();
+
+INSERT INTO `sys_options` (`category_id`, `name`, `caption`, `value`, `type`, `extra`, `check`, `check_params`, `check_error`, `order`) VALUES
+(@iCategoryId, 'bx_anon_follow_persons_fields', '_bx_anon_follow_persons_fields', '', 'list', 'a:3:{s:6:"module";s:14:"bx_anon_follow";s:6:"method";s:18:"get_profile_fields";s:6:"params";a:1:{i:0;s:10:"bx_persons";}}', '', '', '', 0),
+(@iCategoryId, 'bx_anon_follow_orgs_fields', '_bx_anon_follow_orgs_fields', '', 'list', 'a:3:{s:6:"module";s:14:"bx_anon_follow";s:6:"method";s:18:"get_profile_fields";s:6:"params";a:1:{i:0;s:16:"bx_organizations";}}', '', '', '', 1),
+(@iCategoryId, 'bx_anon_follow_fields_separator', '_bx_anon_follow_fields_separator', ', ', 'digit', '', '', '', '', 2);
+
+-- PAGES
+INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `active`, `order`) VALUES
+('', 2, @sName, '_bx_anon_follow_page_block_title_sys_anon_follow', '_bx_anon_follow_page_block_title_anon_follow', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:14:"bx_anon_follow";s:6:"method";s:19:"subscribed_me_table";}', 0, 1, 1, 0);
+
+-- MENU: add menu item to profiles modules actions menu (trigger* menu sets are processed separately upon modules enable/disable)
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visibility_custom`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
+('trigger_profile_view_actions', @sName, 'anon-follow', '_bx_anon_follow_menu_item_title_system_follow', '_bx_anon_follow_menu_item_title_follow', 'javascript:void(0)', 'bx_conn_action_anon(this, \'sys_profiles_subscriptions\', \'add\', \'{profile_id}\')', '', 'user-secret', '', 'a:3:{s:6:"module";s:14:"bx_anon_follow";s:6:"method";s:19:"check_is_subscribed";s:6:"params";a:1:{i:0;s:12:"{profile_id}";}}', 2147483646, 1, 0, 0),
+('trigger_profile_snippet_meta', @sName, 'anon-follow', '_bx_anon_follow_menu_item_title_system_follow', '_bx_anon_follow_menu_item_title_follow', 'javascript:void(0)', 'bx_conn_action_anon(this, \'sys_profiles_subscriptions\', \'add\', \'{profile_id}\')', '', 'user-secret', '', '', 2147483646, 1, 0, 0);
+
+-- GRID: connections
+INSERT INTO `sys_objects_grid` (`object`, `source_type`, `source`, `table`, `field_id`, `field_order`, `field_active`, `paginate_url`, `paginate_per_page`, `paginate_simple`, `paginate_get_start`, `paginate_get_per_page`, `filter_fields`, `filter_fields_translatable`, `filter_mode`, `sorting_fields`, `sorting_fields_translatable`, `visible_for_levels`, `override_class_name`, `override_class_file`) VALUES
+('bx_anon_follow_subscribed_me', 'Sql', 'SELECT `p`.`id`, `c`.`added` FROM `sys_profiles` AS `p` INNER JOIN `sys_accounts` AS `a` ON (`a`.`id` = `p`.`account_id`) {join_connections} {join_connections2}', 'sys_profiles', 'id', 'c`.`added', '', '', 10, NULL, 'start', '', 'name,email', '', 'auto', '', '', 2147483647, 'BxAnonFollowGridSubscribedMe', 'modules/boonex/anon_follow/classes/BxAnonFollowGridSubscribedMe.php');
+
+INSERT INTO `sys_grid_fields` (`object`, `name`, `title`, `width`, `params`, `order`) VALUES
+('bx_anon_follow_subscribed_me', 'name', '_sys_name', '70%', '', 1),
+('bx_anon_follow_subscribed_me', 'actions', '', '30%', '', 2);
+
+INSERT INTO `sys_grid_actions` (`object`, `type`, `name`, `title`, `icon`, `confirm`, `order`) VALUES
+('bx_anon_follow_subscribed_me', 'single', 'subscribe', '_sys_subscribe', 'check', 0, 1);
+
+-- ALERTS
+INSERT INTO `sys_alerts_handlers` (`name`, `class`, `file`, `service_call`) VALUES 
+(@sName, 'BxAnonFollowAlertsResponse', 'modules/boonex/anon_follow/classes/BxAnonFollowAlertsResponse.php', '');
+SET @iHandler := LAST_INSERT_ID();
+
+INSERT INTO `sys_alerts` (`unit`, `action`, `handler_id`) VALUES
+('sys_profiles_subscriptions', 'connection_added', @iHandler),
+('sys_profiles_subscriptions', 'connection_removed', @iHandler),
+('bx_persons', 'menu_custom_item', @iHandler),
+('bx_organizations', 'menu_custom_item', @iHandler);
+
+-- INJECTION
+INSERT INTO `sys_injections`(`name`, `page_index`, `key`, `type`, `data`, `replace`, `active`) VALUES
+(@sName, 0, 'injection_header', 'service', 'a:2:{s:6:"module";s:14:"bx_anon_follow";s:6:"method";s:10:"include_js";}', '0', '1');
+

+ 24 - 0
modules/boonex/anon_follow/install/sql/install.sql

@@ -0,0 +1,24 @@
+-- TABLES
+CREATE TABLE `bx_anon_follow_subscriptions` (
+  `id` int(11) NOT NULL AUTO_INCREMENT,
+  `initiator` int(11) NOT NULL,
+  `content` int(11) NOT NULL,
+  `added` int(10) UNSIGNED NOT NULL,
+  PRIMARY KEY (`id`),
+  INDEX `content` (`content`),
+  UNIQUE INDEX `initiator` (`initiator`, `content`)
+);
+
+-- STUDIO WIDGET
+INSERT INTO `sys_std_pages`(`index`, `name`, `header`, `caption`, `icon`) VALUES
+(3, 'bx_anon_follow', '_bx_anon_follow', '_bx_anon_follow', 'bx_anon_follow@modules/boonex/anon_follow/|std-icon.svg');
+SET @iPageId = LAST_INSERT_ID();
+
+SET @iParentPageId = (SELECT `id` FROM `sys_std_pages` WHERE `name` = 'home');
+SET @iParentPageOrder = (SELECT MAX(`order`) FROM `sys_std_pages_widgets` WHERE `page_id` = @iParentPageId);
+INSERT INTO `sys_std_widgets` (`page_id`, `module`, `url`, `click`, `icon`, `caption`, `cnt_notices`, `cnt_actions`) VALUES
+(@iPageId, 'bx_anon_follow', '{url_studio}module.php?name=bx_anon_follow', '', 'bx_anon_follow@modules/boonex/anon_follow/|std-icon.svg', '_bx_anon_follow', '', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:11:"get_actions";s:6:"params";a:0:{}s:5:"class";s:18:"TemplStudioModules";}');
+
+INSERT INTO `sys_std_pages_widgets` (`page_id`, `widget_id`, `order`) VALUES
+(@iParentPageId, LAST_INSERT_ID(), IF(ISNULL(@iParentPageOrder), 1, @iParentPageOrder + 1));
+

+ 8 - 0
modules/boonex/anon_follow/install/sql/uninstall.sql

@@ -0,0 +1,8 @@
+-- TABLES
+DROP TABLE IF EXISTS `bx_anon_follow_subscriptions`;
+
+-- STUDIO WIDGET
+DELETE FROM `tp`, `tw`, `tpw`
+USING `sys_std_pages` AS `tp`, `sys_std_widgets` AS `tw`, `sys_std_pages_widgets` AS `tpw`
+WHERE `tp`.`id` = `tw`.`page_id` AND `tw`.`id` = `tpw`.`widget_id` AND `tp`.`name` = 'bx_anon_follow';
+

+ 60 - 0
modules/boonex/anon_follow/js/main.js

@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+/**
+ * Perform connections AJAX request. 
+ * In case of error - it shows js alert with error message.
+ * In case of success - the page is reloaded.
+ * 
+ * @param sObj - connections object
+ * @param sAction - 'add', 'remove' or 'reject'
+ * @param iContentId - content id, initiator is always current logged in user
+ * @param bConfirm - show confirmation dialog
+ */
+function bx_conn_action_anon(e, sObj, sAction, iContentId, bConfirm, fOnComplete) {
+    var fPerform = function() {
+		var aParams = {
+		    obj: sObj,
+		    act: sAction,
+		    id: iContentId,
+			anon: 1,
+		};
+		var fCallback = function (data) {
+		    bx_loading_btn(e, 0);
+		    if ('object' != typeof(data))
+		        return;
+		    if (data.err) {
+		        bx_alert(data.msg);
+		    } else {
+		        if ('function' == typeof(fOnComplete))
+		            fOnComplete(data, e);
+		        else if (!loadDynamicBlockAuto(e))
+		            location.reload();
+		        else
+		            $('#bx-popup-ajax-wrapper-bx_persons_view_actions_more').remove();
+		    }
+		};
+		
+		bx_loading_btn(e, 1);
+		
+		$.ajax({
+		    dataType: 'json',
+		    url: sUrlRoot + 'conn.php',
+		    data: aParams,
+		    type: 'POST',
+		    success: fCallback
+		});
+    };
+
+    if (typeof(bConfirm) != 'undefined' && bConfirm)
+    	bx_confirm(_t('_Are_you_sure'), fPerform);
+    else
+    	fPerform();
+}

+ 16 - 0
modules/boonex/anon_follow/request.php

@@ -0,0 +1,16 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    AnonymousFollow Anonymous Follow
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+check_logged();
+
+BxDolRequest::processAsAction($GLOBALS['aModule'], $GLOBALS['aRequest']);
+
+/** @} */

+ 2 - 0
modules/boonex/anon_follow/template/connections_list.html

@@ -0,0 +1,2 @@
+<a class="bx-anchor-invisible" name="__name__"></a>
+__content__

+ 1 - 0
modules/boonex/anon_follow/template/follow_button.html

@@ -0,0 +1 @@
+<a class='bx-btn bx-btn-small' onclick="bx_conn_action_anon(this, 'sys_profiles_subscriptions', 'add', '__profile_id__')">__title__</a>

ファイルの差分が大きいため隠しています
+ 18 - 0
modules/boonex/anon_follow/template/images/icons/std-icon.svg


+ 3 - 2
modules/boonex/channels/classes/BxCnlConfig.php

@@ -98,8 +98,8 @@ class BxCnlConfig extends BxBaseModProfileConfig
             'OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL' => 'bx_channels_view_actions_all', // all actions menu on view entry page
             'OBJECT_MENU_ACTIONS_MY_ENTRIES' => 'bx_channels_my', // actions menu on profile entries page
             'OBJECT_MENU_SUBMENU' => 'bx_channels_submenu', // main module submenu
-            'OBJECT_MENU_SUBMENU_VIEW_ENTRY' => 'bx_channels_view_submenu',  // view entry submenu
-            'OBJECT_MENU_SUBMENU_VIEW_ENTRY_COVER' => 'bx_channels_view_submenu_cover',  // view entry submenu displayed in cover
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY' => '',  // view entry submenu
+            'OBJECT_MENU_SUBMENU_VIEW_ENTRY_COVER' => '',  // view entry submenu displayed in cover
             'OBJECT_MENU_SUBMENU_VIEW_ENTRY_MAIN_SELECTION' => 'channels-home', // first item in view entry submenu from main module submenu
             'OBJECT_MENU_SNIPPET_META' => 'bx_channels_snippet_meta', // menu for snippet meta info
             'OBJECT_MENU_MANAGE_TOOLS' => 'bx_channels_menu_manage_tools', //manage menu in content administration tools
@@ -113,6 +113,7 @@ class BxCnlConfig extends BxBaseModProfileConfig
       
 
             'TRIGGER_MENU_PROFILE_VIEW_SUBMENU' => 'trigger_group_view_submenu',
+            'TRIGGER_MENU_PROFILE_SNIPPET_META' => 'trigger_group_snippet_meta',
             'TRIGGER_MENU_PROFILE_VIEW_ACTIONS' => 'trigger_group_view_actions',
             'TRIGGER_PAGE_VIEW_ENTRY' => 'trigger_page_group_view_entry',
 

+ 27 - 11
modules/boonex/channels/classes/BxCnlModule.php

@@ -25,8 +25,24 @@ class BxCnlModule extends BxBaseModGroupsModule
         return parent::_checkAllowedSubscribeAdd ($aDataEntry, $isPerformAction);
     }
     
+    /**
+     * Process Hash Tag
+     * 
+     * @param string $sHashtag - hashtag to be processed.
+     * @param string $sModuleName - module name.
+     * @param integer $iContentId - ID of the content which has the hashtag.
+     * @param integer $iAuthorId - action's author id.
+     */
     function processHashtag($sHashtag, $sModuleName, $iContentId, $iAuthorId)
     {
+        /*
+         * Note! For now metatag object name is used here as module name, because usually it's equal to module's name. This should be changed in Ticket #1596
+         * For now if module cannot be created then a channel for such tag shouldn't be created too.
+         */
+        $oModule = BxDolModule::getInstance($sModuleName);
+        if(empty($oModule))
+            return;
+
         $mixedCnlId = $this->_oDb->getChannelIdByName($sHashtag);
         if (empty($mixedCnlId)){
             $CNF = &$this->_oConfig->CNF;
@@ -127,21 +143,21 @@ class BxCnlModule extends BxBaseModGroupsModule
     public function serviceGetTimelinePostHashtag($aEvent, $aBrowseParams = array())
     {
         if(empty($aEvent) || !is_array($aEvent))
-            return '';
-        
+            return false;
+
         $aContentEvent = $this->_oDb->getContentById($aEvent['object_id']);
         if(empty($aContentEvent) || !is_array($aContentEvent))
-            return '';
+            return false;
 
         $oModule = BxDolModule::getInstance($aContentEvent['module_name']);
-        if ($oModule){
-             $aTmp = $oModule->serviceGetTimelinePost(array('object_id' => $aContentEvent['content_id']));
-             if ($aContentEvent['module_name'] == 'bx_timeline')
-                $aTmp['owner_id'] =  $aEvent['owner_id'];
-             return $aTmp;
-        }
-        
-        return '';
+        if(empty($oModule))
+            return false;
+
+        $aTimelinePost = $oModule->serviceGetTimelinePost(array('object_id' => $aContentEvent['content_id']));
+        if($aContentEvent['module_name'] == 'bx_timeline')
+            $aTimelinePost['owner_id'] = $aEvent['owner_id'];
+
+        return $aTimelinePost;
     }
     
     /**

+ 1 - 0
modules/boonex/channels/install/config.php

@@ -54,6 +54,7 @@ $aConfig = array(
     'menu_triggers' => array(
         'trigger_profile_view_submenu',
         'trigger_group_view_submenu',
+        'trigger_group_snippet_meta',
         'trigger_group_view_actions',
     ),
 

+ 0 - 2
modules/boonex/channels/install/langs/en.xml

@@ -126,8 +126,6 @@
 	<string name="_bx_channels_menu_set_title_view_profile_actions_more"><![CDATA[Channel More Actions]]></string>
 	<string name="_bx_channels_menu_title_view_profile_actions_more"><![CDATA[Channel More Actions]]></string>
 	<string name="_bx_channels_menu_set_title_view_profile_submenu"><![CDATA[View Channel Submenu]]></string>
-	<string name="_bx_channels_menu_title_view_profile_submenu"><![CDATA[View Channel Submenu]]></string>
-	<string name="_bx_channels_menu_title_view_profile_submenu_cover"><![CDATA[Channel Cover Submenu]]></string>
 	<string name="_bx_channels_menu_title_entries_my"><![CDATA[Profile Channels Action Menu]]></string>
 	<string name="_bx_channels_menu_set_title_entries_my"><![CDATA[Profile Channels Menu]]></string>
 	<string name="_bx_channels_menu_set_title_manage_tools"><![CDATA[Manage Tools Submenu]]></string>

+ 1 - 1
modules/boonex/channels/install/sql/disable.sql

@@ -13,7 +13,7 @@ DELETE FROM `sys_pages_blocks` WHERE `module` = 'bx_channels' OR `object` IN('bx
 -- MENU
 DELETE FROM `sys_objects_menu` WHERE `module` = 'bx_channels';
 DELETE FROM `sys_menu_sets` WHERE `module` = 'bx_channels';
-DELETE FROM `sys_menu_items` WHERE `module` = 'bx_channels' OR `set_name` IN('bx_channels_view_submenu', 'bx_channels_submenu', 'bx_channels_view_actions', 'bx_channels_view_actions_more', 'bx_channels_view_actions_all', 'bx_channels_my', 'bx_channels_snippet_meta', 'bx_channels_menu_manage_tools');
+DELETE FROM `sys_menu_items` WHERE `module` = 'bx_channels' OR `set_name` IN('bx_channels_submenu', 'bx_channels_view_actions', 'bx_channels_view_actions_more', 'bx_channels_view_actions_all', 'bx_channels_my', 'bx_channels_snippet_meta', 'bx_channels_menu_manage_tools');
 
 -- ACL
 DELETE `sys_acl_actions`, `sys_acl_matrix` FROM `sys_acl_actions`, `sys_acl_matrix` WHERE `sys_acl_matrix`.`IDAction` = `sys_acl_actions`.`ID` AND `sys_acl_actions`.`Module` = 'bx_channels';

+ 3 - 8
modules/boonex/channels/install/sql/enable.sql

@@ -25,10 +25,10 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `e
 -- PAGE: create profile
 
 INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
-('bx_channels_create_profile', 'create-channel-profile', '_bx_channels_page_title_sys_create_profile', '_bx_channels_page_title_create_profile', 'bx_channels', 5, 2147483647, 1, 'page.php?i=create-channel-profile', '', '', '', 0, 1, 0, '', '');
+('bx_channels_create_profile', 'create-channel-profile', '_bx_channels_page_title_sys_create_profile', '_bx_channels_page_title_create_profile', 'bx_channels', 5, 128, 1, 'page.php?i=create-channel-profile', '', '', '', 0, 1, 0, '', '');
 
 INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
-('bx_channels_create_profile', 1, 'bx_channels', '_bx_channels_page_block_title_create_profile', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:11:\"bx_channels\";s:6:\"method\";s:13:\"entity_create\";}', 0, 1, 1);
+('bx_channels_create_profile', 1, 'bx_channels', '_bx_channels_page_block_title_create_profile', 11, 128, 'service', 'a:2:{s:6:\"module\";s:11:\"bx_channels\";s:6:\"method\";s:13:\"entity_create\";}', 0, 1, 1);
 
 -- PAGE: view profile
 
@@ -153,7 +153,7 @@ INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `tit
 
 SET @iAddMenuOrder = (SELECT `order` FROM `sys_menu_items` WHERE `set_name` = 'sys_add_content_links' AND `active` = 1 ORDER BY `order` DESC LIMIT 1);
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES 
-('sys_add_content_links', 'bx_channels', 'create-channel-profile', '_bx_channels_menu_item_title_system_create_profile', '_bx_channels_menu_item_title_create_profile', 'page.php?i=create-channel-profile', '', '', 'hashtag col-red2', '', 2147483647, 1, 1, IFNULL(@iAddMenuOrder, 0) + 1);
+('sys_add_content_links', 'bx_channels', 'create-channel-profile', '_bx_channels_menu_item_title_system_create_profile', '_bx_channels_menu_item_title_create_profile', 'page.php?i=create-channel-profile', '', '', 'hashtag col-red2', '', 128, 1, 1, IFNULL(@iAddMenuOrder, 0) + 1);
 
 
 -- MENU: view actions
@@ -222,7 +222,6 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_channels_my', 'bx_channels', 'create-channel-profile', '_bx_channels_menu_item_title_system_create_profile', '_bx_channels_menu_item_title_create_profile', 'page.php?i=create-channel-profile', '', '', 'plus', '', 2147483647, 1, 0, 0);
 
 -- MENU: module sub-menu
-
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
 ('bx_channels_submenu', '_bx_channels_menu_title_submenu', 'bx_channels_submenu', 'bx_channels', 8, 0, 1, '', '');
 
@@ -234,10 +233,6 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_channels_submenu', 'bx_channels', 'channels-top', '_bx_channels_menu_item_title_system_entries_top', '_bx_channels_menu_item_title_entries_top', 'page.php?i=channels-top', '', '', '', '', 2147483647, 1, 1, 2),
 ('bx_channels_submenu', 'bx_channels', 'channels-search', '_bx_channels_menu_item_title_system_entries_search', '_bx_channels_menu_item_title_entries_search', 'page.php?i=channels-search', '', '', '', '', 2147483647, 1, 1, 3),
 ('bx_channels_submenu', 'bx_channels', 'channels-my', '_bx_channels_menu_item_title_system_entries_my', '_bx_channels_menu_item_title_entries_my', 'page.php?i=channels-my', '', '', '', '', 2147483646, 1, 1, 4);
--- MENU: view submenu
-
-INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
-('bx_channels_view_submenu_cover', '_bx_channels_menu_title_view_profile_submenu_cover', 'bx_channels_view_submenu', 'bx_channels', 7, 0, 1, 'BxCnlMenuView', 'modules/boonex/channels/classes/BxCnlMenuView.php');
 
 -- MENU: custom menu for snippet meta info
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 

+ 2 - 0
modules/boonex/events/classes/BxEventsConfig.php

@@ -135,6 +135,7 @@ class BxEventsConfig extends BxBaseModProfileConfig
             'EMAIL_REMINDER' => 'bx_events_reminder',
 
             'TRIGGER_MENU_PROFILE_VIEW_SUBMENU' => 'trigger_group_view_submenu',
+            'TRIGGER_MENU_PROFILE_SNIPPET_META' => 'trigger_group_snippet_meta',
             'TRIGGER_MENU_PROFILE_VIEW_ACTIONS' => 'trigger_group_view_actions',
         	'TRIGGER_PAGE_VIEW_ENTRY' => 'trigger_page_group_view_entry',
 
@@ -142,6 +143,7 @@ class BxEventsConfig extends BxBaseModProfileConfig
             'MENU_ITEM_TO_METHOD' => array (
                 'bx_events_view_actions' => $aMenuItems2Methods,
                 'bx_events_view_actions_more' => $aMenuItems2Methods,
+                'bx_events_view_actions_all' => $aMenuItems2Methods,
             ),
 
             // informer messages

+ 5 - 2
modules/boonex/events/classes/BxEventsModule.php

@@ -141,12 +141,15 @@ class BxEventsModule extends BxBaseModGroupsModule
     public function serviceGetTimelinePost($aEvent, $aBrowseParams = array())
     {
         $a = parent::serviceGetTimelinePost($aEvent, $aBrowseParams);
+        if($a === false)
+            return false;
 
-        if (!($aContentInfo = $this->_oDb->getContentInfoById($aEvent['object_id'])))
+        $aContentInfo = $this->_oDb->getContentInfoById($aEvent['object_id']);
+        if(empty($aContentInfo) || !is_array($aContentInfo))
             return $a;
 
         $CNF = $this->_oConfig->CNF;
-        
+
         $oDateStart = date_create('@' . $aContentInfo['date_start'], new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
         $oDateEnd = date_create('@' . ($aContentInfo['date_start'] > $aContentInfo['repeat_stop'] ? $aContentInfo['date_start'] : $aContentInfo['repeat_stop']), new DateTimeZone($aContentInfo['timezone'] ? $aContentInfo['timezone'] : 'UTC'));
 

+ 3 - 2
modules/boonex/events/install/config.php

@@ -52,8 +52,9 @@ $aConfig = array(
      * Menu triggers.
      */
     'menu_triggers' => array(
-    	'trigger_profile_view_submenu',
-    	'trigger_group_view_submenu',
+        'trigger_profile_view_submenu',
+        'trigger_group_view_submenu',
+        'trigger_group_snippet_meta',
         'trigger_group_view_actions',
     ),
 

+ 2 - 0
modules/boonex/groups/classes/BxGroupsConfig.php

@@ -132,6 +132,7 @@ class BxGroupsConfig extends BxBaseModProfileConfig
             'EMAIL_JOIN_REJECT' => 'bx_groups_join_reject',
 
             'TRIGGER_MENU_PROFILE_VIEW_SUBMENU' => 'trigger_group_view_submenu',
+            'TRIGGER_MENU_PROFILE_SNIPPET_META' => 'trigger_group_snippet_meta',
             'TRIGGER_MENU_PROFILE_VIEW_ACTIONS' => 'trigger_group_view_actions',
         	'TRIGGER_PAGE_VIEW_ENTRY' => 'trigger_page_group_view_entry',
 
@@ -139,6 +140,7 @@ class BxGroupsConfig extends BxBaseModProfileConfig
             'MENU_ITEM_TO_METHOD' => array (
                 'bx_groups_view_actions' => $aMenuItems2Methods,
                 'bx_groups_view_actions_more' => $aMenuItems2Methods,
+                'bx_groups_view_actions_all' => $aMenuItems2Methods,
             ),
 
             // informer messages

+ 2 - 1
modules/boonex/groups/install/config.php

@@ -53,7 +53,8 @@ $aConfig = array(
      */
     'menu_triggers' => array(
     	'trigger_profile_view_submenu',
-    	'trigger_group_view_submenu',
+        'trigger_group_view_submenu',
+        'trigger_group_snippet_meta',
         'trigger_group_view_actions',
     ),
 

+ 26 - 0
modules/boonex/lucid/classes/BxLucidConfig.php

@@ -0,0 +1,26 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Lucid Lucid template
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+bx_import('BxBaseModTemplateConfig');
+
+class BxLucidConfig extends BxBaseModTemplateConfig
+{
+    function __construct($aModule)
+    {
+        parent::__construct($aModule);
+
+        $this->_aPrefixes = array(
+        	'option' => 'bx_lucid_'
+        );
+    }
+}
+
+/** @} */

+ 25 - 0
modules/boonex/lucid/classes/BxLucidDb.php

@@ -0,0 +1,25 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Lucid Lucid template
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+bx_import('BxBaseModGeneralDb');
+
+/*
+ * Module database queries
+ */
+class BxLucidDb extends BxBaseModGeneralDb
+{
+    function __construct(&$oConfig)
+    {
+        parent::__construct($oConfig);
+    }
+}
+
+/** @} */

+ 22 - 0
modules/boonex/lucid/classes/BxLucidModule.php

@@ -0,0 +1,22 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Lucid Lucid template
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+bx_import ('BxBaseModTemplateModule');
+
+class BxLucidModule extends BxBaseModTemplateModule
+{
+    function __construct(&$aModule)
+    {
+        parent::__construct($aModule);
+    }
+}
+
+/** @} */

+ 77 - 0
modules/boonex/lucid/classes/BxLucidStudioPage.php

@@ -0,0 +1,77 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Lucid Lucid template
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+define('BX_LUCID_STUDIO_TEMPL_TYPE_STYLES', 'styles');
+
+class BxLucidStudioPage extends BxTemplStudioDesign
+{
+    function __construct($sModule = "", $sPage = "")
+    {
+    	$this->MODULE = 'bx_lucid';
+        parent::__construct($sModule, $sPage);
+
+        $this->aMenuItems[BX_LUCID_STUDIO_TEMPL_TYPE_STYLES] = array('caption' => '_bx_lucid_lmi_cpt_styles', 'icon' => 'paint-brush');
+        unset($this->aMenuItems[BX_DOL_STUDIO_TEMPL_TYPE_LOGO]);
+    }
+
+    protected function getSettings($mixedCategory = '', $sMix = '')
+    {
+    	return parent::getSettings('bx_lucid_system', $sMix);
+    }
+
+	protected function getStyles($sMix = '')
+    {
+    	$oTemplate = BxDolStudioTemplate::getInstance();
+
+    	$sPrefix = $this->MODULE;
+    	$aCategories = array(
+    		$sPrefix . '_styles_general',
+			$sPrefix . '_styles_header',
+			$sPrefix . '_styles_footer',
+			$sPrefix . '_styles_body',
+			$sPrefix . '_styles_cover',
+			$sPrefix . '_styles_block',
+			$sPrefix . '_styles_card',
+			$sPrefix . '_styles_popup',
+			$sPrefix . '_styles_menu_main',
+			$sPrefix . '_styles_menu_account',
+			$sPrefix . '_styles_menu_add',
+			$sPrefix . '_styles_menu_page',
+			$sPrefix . '_styles_menu_slide',
+			$sPrefix . '_styles_form',
+			$sPrefix . '_styles_large_button',
+			$sPrefix . '_styles_large_button_primary',
+			$sPrefix . '_styles_button',
+			$sPrefix . '_styles_button_primary',
+			$sPrefix . '_styles_small_button',
+			$sPrefix . '_styles_small_button_primary',
+			$sPrefix . '_styles_font',
+			$sPrefix . '_styles_custom',
+			$sPrefix . '_viewport_tablet',
+			$sPrefix . '_viewport_mobile'
+		);
+    	$oPage = new BxTemplStudioSettings($this->sTemplate, $aCategories, $sMix);
+    	$oPage->enableReadOnly(true);
+    	$oPage->enableMixes(true);
+
+    	$oTemplate->addJs(array('codemirror/codemirror.min.js'));
+        $oTemplate->addCss(BX_DIRECTORY_PATH_PLUGINS_PUBLIC . 'codemirror/|codemirror.css');
+
+        return BxDolStudioTemplate::getInstance()->parseHtmlByName('design.html', array(
+            'content' => $oPage->getPageCode(),
+        	'js_content' => $this->getPageJsCode(array(
+				"sCodeMirror" => "textarea[name='" . $sPrefix . "_styles_custom']"
+			))
+        ));
+    }
+}
+
+/** @} */

+ 24 - 0
modules/boonex/lucid/classes/BxLucidTemplate.php

@@ -0,0 +1,24 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    Lucid Lucid template
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+bx_import('BxBaseModGeneralTemplate');
+
+class BxLucidTemplate extends BxBaseModGeneralTemplate
+{
+    function __construct(&$oConfig, &$oDb)
+    {
+        $this->MODULE = 'bx_lucid';
+
+        parent::__construct($oConfig, $oDb);
+    }
+}
+
+/** @} */

+ 65 - 0
modules/boonex/lucid/data/template/bx_channels/css/main.css

@@ -0,0 +1,65 @@
+@import url(../../../../../spaces/template/css/main.css);
+
+
+/*--- Unit ---*/
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover a.bx-base-pofile-unit-cover {
+	text-align: left;
+}
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover div.bx-def-unit-img {
+	display: inline-block;
+	vertical-align: middle;
+	width: 5.25rem;
+	height: 5.25rem;
+	margin-left: 1rem;
+}
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb,
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-def-unit-img img {
+	display: block;	
+	width: 5rem;
+	height: 5rem;
+	border: 0.125rem solid rgba(255,255,255,1);
+	border-radius: 0.5rem;
+	background-clip: border-box;
+	overflow: hidden;
+}
+
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb {
+	line-height: 4.7rem;
+	text-align: center;
+}
+
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-def-unit-img img {
+	background-color: #ffffff;
+}
+
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-base-pofile-unit-title {
+	text-align: left;
+}
+
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-base-pofile-unit-title a {
+	font-weight: 800;
+	font-size: 1.25rem;
+	color: rgba(29, 75, 96, 1.0);
+}
+
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom {
+	display: -webkit-flex;
+   	display: flex;
+   	-webkit-align-items: center;
+   	align-items: center;
+	-webkit-justify-content: left;
+	justify-content: left;
+}
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li {
+	-webkit-flex: 0 1 auto; 
+	-ms-flex:  0 1 auto; 
+	flex:  0 1 auto;
+}
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li.bx-menu-item-stretcher {
+	-webkit-flex-grow: 3;
+	flex-grow: 3;
+}
+
+.bx-base-pofile-unit-with-cover.bx-channels-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li .bx-base-profile-unit-meta-item {
+	line-height: normal;
+}

+ 21 - 0
modules/boonex/lucid/data/template/bx_channels/unit.html

@@ -0,0 +1,21 @@
+<div class="__class__ bx-channels-unit-with-cover bx-def-padding-sec bx-def-box-sizing">
+    <div class="bx-base-pofile-unit-cnt bx-def-box bx-def-border bx-def-round-corners bx-def-color-bg-box">
+	    <a class="bx-base-pofile-unit-cover" style="background-image:url(__cover_url__);" href="__content_url__" onclick="__content_click__">
+	    	<div class="bx-def-unit-img bx-def-thumb-size">
+	            <bx_if:show_avatar_image>
+	                <img class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size" src="__avatar_url__" />
+	            </bx_if:show_avatar_image>
+	            <bx_if:show_thumb_letter>
+	                <p class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size bx-def-box-sizing" style="background-color:rgba(__color__)">__letter__</p>
+	            </bx_if:show_thumb_letter>
+	            <bx_if:show_online>
+					<div class="bx-base-pofile-unit-online"></div>
+				</bx_if:show_online>
+			</div>
+	    </a>
+	    <div class="bx-base-pofile-unit-title bx-def-box-sizing bx-def-padding"><a href="__content_url__" onclick="__content_click__">__title__</a></div>
+	    <div class="bx-base-pofile-unit-info">
+            <bx_if:meta><div class="bx-base-general-unit-meta bx-def-box-sizing bx-def-padding-rightbottomleft">__meta__</div></bx_if:meta>
+	    </div>
+    </div>
+</div>

+ 1 - 0
modules/boonex/lucid/data/template/bx_channels/unit_with_cover_showcase.html

@@ -0,0 +1 @@
+<bx_include_auto:unit.html />

+ 65 - 0
modules/boonex/lucid/data/template/bx_events/css/main.css

@@ -0,0 +1,65 @@
+@import url(../../../../../events/template/css/main.css);
+
+
+/*--- Unit ---*/
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover a.bx-base-pofile-unit-cover {
+	text-align: right;
+}
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover div.bx-def-unit-img {
+	display: inline-block;
+	vertical-align: middle;
+	width: 5.25rem;
+	height: 5.25rem;
+	margin-right: 1rem;
+}
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb,
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-def-unit-img img {
+	display: block;	
+	width: 5rem;
+	height: 5rem;
+	border: 0.125rem solid rgba(255,255,255,1);
+	border-radius: 0.5rem;
+	background-clip: border-box;
+	overflow: hidden;
+}
+
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb {
+	line-height: 4.7rem;
+	text-align: center;
+}
+
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-def-unit-img img {
+	background-color: #ffffff;
+}
+
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-base-pofile-unit-title {
+	text-align: left;
+}
+
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-base-pofile-unit-title a {
+	font-weight: 800;
+	font-size: 1.25rem;
+	color: rgba(29, 75, 96, 1.0);
+}
+
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom {
+	display: -webkit-flex;
+   	display: flex;
+   	-webkit-align-items: center;
+   	align-items: center;
+	-webkit-justify-content: left;
+	justify-content: left;
+}
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li {
+	-webkit-flex: 0 1 auto; 
+	-ms-flex:  0 1 auto; 
+	flex:  0 1 auto;
+}
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li.bx-menu-item-stretcher {
+	-webkit-flex-grow: 3;
+	flex-grow: 3;
+}
+
+.bx-base-pofile-unit-with-cover.bx-events-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li .bx-base-profile-unit-meta-item {
+	line-height: normal;
+}

+ 21 - 0
modules/boonex/lucid/data/template/bx_events/unit.html

@@ -0,0 +1,21 @@
+<div class="__class__ bx-events-unit-with-cover bx-def-padding-sec bx-def-box-sizing">
+    <div class="bx-base-pofile-unit-cnt bx-def-box bx-def-border bx-def-round-corners bx-def-color-bg-box">
+	    <a class="bx-base-pofile-unit-cover" style="background-image:url(__cover_url__);" href="__content_url__" onclick="__content_click__">
+	    	<div class="bx-def-unit-img bx-def-thumb-size">
+	            <bx_if:show_avatar_image>
+	                <img class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size" src="__avatar_url__" />
+	            </bx_if:show_avatar_image>
+	            <bx_if:show_thumb_letter>
+	                <p class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size bx-def-box-sizing" style="background-color:rgba(__color__)">__letter__</p>
+	            </bx_if:show_thumb_letter>
+	            <bx_if:show_online>
+					<div class="bx-base-pofile-unit-online"></div>
+				</bx_if:show_online>
+			</div>
+	    </a>
+	    <div class="bx-base-pofile-unit-title bx-def-box-sizing bx-def-padding"><a href="__content_url__" onclick="__content_click__">__title__</a></div>
+	    <div class="bx-base-pofile-unit-info">
+            <bx_if:meta><div class="bx-base-general-unit-meta bx-def-box-sizing bx-def-padding-rightbottomleft">__meta__</div></bx_if:meta>
+	    </div>
+    </div>
+</div>

+ 1 - 0
modules/boonex/lucid/data/template/bx_events/unit_with_cover_showcase.html

@@ -0,0 +1 @@
+<bx_include_auto:unit.html />

+ 5 - 0
modules/boonex/lucid/data/template/bx_forum/css/main.css

@@ -0,0 +1,5 @@
+@import url(../../../../../forum/template/css/main.css);
+
+.cmt.bx-def-box .cmt-info > .bx-def-hr {
+    display: none;
+}

+ 65 - 0
modules/boonex/lucid/data/template/bx_groups/css/main.css

@@ -0,0 +1,65 @@
+@import url(../../../../../groups/template/css/main.css);
+
+
+/*--- Unit ---*/
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover a.bx-base-pofile-unit-cover {
+	text-align: left;
+}
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover div.bx-def-unit-img {
+	display: inline-block;
+	vertical-align: middle;
+	width: 5.25rem;
+	height: 5.25rem;
+	margin-left: 1rem;
+}
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb,
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-def-unit-img img {
+	display: block;	
+	width: 5rem;
+	height: 5rem;
+	border: 0.125rem solid rgba(255,255,255,1);
+	border-radius: 0.5rem;
+	background-clip: border-box;
+	overflow: hidden;
+}
+
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb {
+	line-height: 4.7rem;
+	text-align: center;
+}
+
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-def-unit-img img {
+	background-color: #ffffff;
+}
+
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-base-pofile-unit-title {
+	text-align: left;
+}
+
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-base-pofile-unit-title a {
+	font-weight: 800;
+	font-size: 1.25rem;
+	color: rgba(29, 75, 96, 1.0);
+}
+
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom {
+	display: -webkit-flex;
+   	display: flex;
+   	-webkit-align-items: center;
+   	align-items: center;
+	-webkit-justify-content: left;
+	justify-content: left;
+}
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li {
+	-webkit-flex: 0 1 auto; 
+	-ms-flex:  0 1 auto; 
+	flex:  0 1 auto;
+}
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li.bx-menu-item-stretcher {
+	-webkit-flex-grow: 3;
+	flex-grow: 3;
+}
+
+.bx-base-pofile-unit-with-cover.bx-groups-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li .bx-base-profile-unit-meta-item {
+	line-height: normal;
+}

+ 21 - 0
modules/boonex/lucid/data/template/bx_groups/unit.html

@@ -0,0 +1,21 @@
+<div class="__class__ bx-groups-unit-with-cover bx-def-padding-sec bx-def-box-sizing">
+    <div class="bx-base-pofile-unit-cnt bx-def-box bx-def-border bx-def-round-corners bx-def-color-bg-box">
+	    <a class="bx-base-pofile-unit-cover" style="background-image:url(__cover_url__);" href="__content_url__" onclick="__content_click__">
+	    	<div class="bx-def-unit-img bx-def-thumb-size">
+	            <bx_if:show_avatar_image>
+	                <img class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size" src="__avatar_url__" />
+	            </bx_if:show_avatar_image>
+	            <bx_if:show_thumb_letter>
+	                <p class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size bx-def-box-sizing" style="background-color:rgba(__color__)">__letter__</p>
+	            </bx_if:show_thumb_letter>
+	            <bx_if:show_online>
+					<div class="bx-base-pofile-unit-online"></div>
+				</bx_if:show_online>
+			</div>
+	    </a>
+	    <div class="bx-base-pofile-unit-title bx-def-box-sizing bx-def-padding"><a href="__content_url__" onclick="__content_click__">__title__</a></div>
+	    <div class="bx-base-pofile-unit-info">
+            <bx_if:meta><div class="bx-base-general-unit-meta bx-def-box-sizing bx-def-padding-rightbottomleft">__meta__</div></bx_if:meta>
+	    </div>
+    </div>
+</div>

+ 1 - 0
modules/boonex/lucid/data/template/bx_groups/unit_with_cover_showcase.html

@@ -0,0 +1 @@
+<bx_include_auto:unit.html />

+ 11 - 0
modules/boonex/lucid/data/template/bx_notifications/css/view.css

@@ -0,0 +1,11 @@
+@import url(../../../../../notifications/template/css/view.css);
+
+
+/*--- Preview Popup Style ---*/
+.bx-menu-object-bx_notifications_preview .bx-menu-item-event {
+	margin-top: 0.5rem;
+	border-radius: 0.5rem;
+}
+.bx-menu-object-bx_notifications_preview .bx-menu-item-event:first-child {
+	margin-top: 0;
+}

+ 58 - 0
modules/boonex/lucid/data/template/bx_persons/css/main.css

@@ -0,0 +1,58 @@
+@import url(../../../../../persons/template/css/main.css);
+
+
+/*--- Unit ---*/
+
+.bx-base-pofile-unit-with-cover div.bx-def-unit-img {
+	display: inline-block;
+	vertical-align: middle;
+	width: 5.25rem;
+	height: 5.25rem;
+}
+.bx-base-pofile-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb,
+.bx-base-pofile-unit-with-cover .bx-def-unit-img img {
+	display: block;	
+	width: 5rem;
+	height: 5rem;
+	border: 0.125rem solid rgba(255,255,255,1);
+	border-radius: 3rem;
+	background-clip: border-box;
+	overflow: hidden;
+}
+
+.bx-base-pofile-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb {
+	line-height: 5rem;
+	text-align: center;
+}
+
+.bx-base-pofile-unit-with-cover .bx-def-unit-img img {
+	background-color: #ffffff;
+}
+
+.bx-base-pofile-unit-with-cover .bx-base-pofile-unit-title a {
+	font-weight: 800;
+	font-size: 1.25rem;
+	color: rgba(29, 75, 96, 1.0);
+}
+
+.bx-base-pofile-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom {
+	display: -webkit-flex;
+   	display: flex;
+   	-webkit-align-items: center;
+   	align-items: center;
+	-webkit-justify-content: left;
+	justify-content: left;
+}
+.bx-base-pofile-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li {
+	-webkit-flex: 0 1 auto; 
+	-ms-flex:  0 1 auto; 
+	flex:  0 1 auto;
+}
+.bx-base-pofile-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li.bx-menu-item-stretcher {
+	-webkit-flex-grow: 3;
+	flex-grow: 3;
+}
+
+.bx-base-pofile-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li .bx-base-profile-unit-meta-item {
+	line-height: normal;
+}

+ 21 - 0
modules/boonex/lucid/data/template/bx_persons/unit_with_cover.html

@@ -0,0 +1,21 @@
+<div class="__class__ bx-def-padding-sec bx-def-box-sizing">
+    <div class="bx-base-pofile-unit-cnt bx-def-box bx-def-border bx-def-round-corners bx-def-color-bg-box">
+	    <a class="bx-base-pofile-unit-cover" style="background-image:url(__cover_url__);" href="__content_url__" onclick="__content_click__">
+	    	<div class="bx-def-unit-img bx-def-thumb-size">
+	            <bx_if:show_avatar_image>
+	                <img class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size bx-def-border" src="__avatar_url__" />
+	            </bx_if:show_avatar_image>
+	            <bx_if:show_thumb_letter>
+	                <p class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size bx-def-border bx-def-box-sizing" style="background-color:rgba(__color__)">__letter__</p>
+	            </bx_if:show_thumb_letter>
+	            <bx_if:show_online>
+					<div class="bx-base-pofile-unit-online"></div>
+				</bx_if:show_online>
+			</div>
+	    </a>
+	    <div class="bx-base-pofile-unit-title bx-def-box-sizing bx-def-padding"><a href="__content_url__" onclick="__content_click__">__title__</a></div>
+	    <div class="bx-base-pofile-unit-info">
+            <bx_if:meta><div class="bx-base-general-unit-meta bx-def-box-sizing bx-def-padding-rightbottomleft">__meta__</div></bx_if:meta>
+	    </div>
+    </div>
+</div>

+ 1 - 0
modules/boonex/lucid/data/template/bx_persons/unit_with_cover_showcase.html

@@ -0,0 +1 @@
+<bx_include_auto:unit_with_cover.html />

+ 6 - 0
modules/boonex/lucid/data/template/bx_posts/css/main.css

@@ -0,0 +1,6 @@
+@import url(../../../../../posts/template/css/main.css);
+
+.bx-def-box.bx-def-round-corners img.bx-base-text-unit-cover.bx-def-round-corners {
+	border-bottom-left-radius: 0;
+	border-bottom-right-radius: 0;
+}

+ 14 - 0
modules/boonex/lucid/data/template/bx_posts/unit.html

@@ -0,0 +1,14 @@
+<div class="bx-base-text-unit bx-base-text-unit-ext bx-def-box bx-def-round-corners bx-def-color-bg-box bx-def-margin-bottom">
+	<bx_if:thumb>
+		<div class="bx-base-text-unit-cover">
+			<img class="bx-base-text-unit-cover bx-def-round-corners" alt="__title__" src="__thumb_url__" />
+		</div>
+	</bx_if:thumb>
+	<div class="bx-base-text-unit-text bx-def-padding bx-def-box-sizing">
+	    <h2 class="bx-base-text-unit-title"><a href="__content_url__">__title__</a></h2>
+	    <div class="bx-base-text-unit-summary bx-def-margin-sec-top bx-clearfix">__summary__</div> 
+	    <div class="bx-base-text-unit-info bx-def-margin-sec-top bx-def-font-small">
+            <bx_if:meta><div class="bx-base-general-unit-meta">__meta__</div></bx_if:meta>
+        </div>
+	</div>
+</div>

+ 65 - 0
modules/boonex/lucid/data/template/bx_spaces/css/main.css

@@ -0,0 +1,65 @@
+@import url(../../../../../spaces/template/css/main.css);
+
+
+/*--- Unit ---*/
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover a.bx-base-pofile-unit-cover {
+	text-align: left;
+}
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover div.bx-def-unit-img {
+	display: inline-block;
+	vertical-align: middle;
+	width: 5.25rem;
+	height: 5.25rem;
+	margin-left: 1rem;
+}
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb,
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-def-unit-img img {
+	display: block;	
+	width: 5rem;
+	height: 5rem;
+	border: 0.125rem solid rgba(255,255,255,1);
+	border-radius: 0.5rem;
+	background-clip: border-box;
+	overflow: hidden;
+}
+
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-def-unit-img p.bx-base-pofile-unit-thumb {
+	line-height: 4.7rem;
+	text-align: center;
+}
+
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-def-unit-img img {
+	background-color: #ffffff;
+}
+
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-base-pofile-unit-title {
+	text-align: left;
+}
+
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-base-pofile-unit-title a {
+	font-weight: 800;
+	font-size: 1.25rem;
+	color: rgba(29, 75, 96, 1.0);
+}
+
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom {
+	display: -webkit-flex;
+   	display: flex;
+   	-webkit-align-items: center;
+   	align-items: center;
+	-webkit-justify-content: left;
+	justify-content: left;
+}
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li {
+	-webkit-flex: 0 1 auto; 
+	-ms-flex:  0 1 auto; 
+	flex:  0 1 auto;
+}
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li.bx-menu-item-stretcher {
+	-webkit-flex-grow: 3;
+	flex-grow: 3;
+}
+
+.bx-base-pofile-unit-with-cover.bx-spaces-unit-with-cover .bx-base-general-unit-meta ul.bx-menu-custom li .bx-base-profile-unit-meta-item {
+	line-height: normal;
+}

+ 21 - 0
modules/boonex/lucid/data/template/bx_spaces/unit.html

@@ -0,0 +1,21 @@
+<div class="__class__ bx-spaces-unit-with-cover bx-def-padding-sec bx-def-box-sizing">
+    <div class="bx-base-pofile-unit-cnt bx-def-box bx-def-border bx-def-round-corners bx-def-color-bg-box">
+	    <a class="bx-base-pofile-unit-cover" style="background-image:url(__cover_url__);" href="__content_url__" onclick="__content_click__">
+	    	<div class="bx-def-unit-img bx-def-thumb-size">
+	            <bx_if:show_avatar_image>
+	                <img class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size" src="__avatar_url__" />
+	            </bx_if:show_avatar_image>
+	            <bx_if:show_thumb_letter>
+	                <p class="bx-base-pofile-unit-thumb bx-def-thumb bx-def-thumb-size bx-def-box-sizing" style="background-color:rgba(__color__)">__letter__</p>
+	            </bx_if:show_thumb_letter>
+	            <bx_if:show_online>
+					<div class="bx-base-pofile-unit-online"></div>
+				</bx_if:show_online>
+			</div>
+	    </a>
+	    <div class="bx-base-pofile-unit-title bx-def-box-sizing bx-def-padding"><a href="__content_url__" onclick="__content_click__">__title__</a></div>
+	    <div class="bx-base-pofile-unit-info">
+            <bx_if:meta><div class="bx-base-general-unit-meta bx-def-box-sizing bx-def-padding-rightbottomleft">__meta__</div></bx_if:meta>
+	    </div>
+    </div>
+</div>

+ 1 - 0
modules/boonex/lucid/data/template/bx_spaces/unit_with_cover_showcase.html

@@ -0,0 +1 @@
+<bx_include_auto:unit.html />

+ 5 - 0
modules/boonex/lucid/data/template/bx_timeline/comments.html

@@ -0,0 +1,5 @@
+<div id="bx-timeline-comments-__id__" class="__style_prefix__-item-comments-wrp">
+	<div class="__style_prefix__-item-comments bx-def-margin-top">
+		<div class="__style_prefix__-comments-cnt">__content__</div>
+	</div>
+</div>

+ 76 - 0
modules/boonex/lucid/data/template/bx_timeline/css/post.css

@@ -0,0 +1,76 @@
+@import url(../../../../../timeline/template/css/post.css);
+
+/*--- Post Form ---*/
+.bx-tl-post-submenu {
+	border-bottom-color: #e6f0fa;
+}
+
+.bx-tl-post-submenu-cnt {
+	display: -webkit-flex;
+  display: flex;
+}
+
+.bx-tl-post-submenu-item {
+	-webkit-flex: 0 1 33.3%; 
+	-ms-flex:  0 1 33.3%; 
+	flex:  0 1 33.3%;
+
+	border-left: 1px solid #e6f0fa;
+}
+
+.bx-tl-post-submenu-item:first-child {
+	border-left-width: 0px;
+}
+
+.bx-tl-post-submenu-item > div {
+	display: inline-block;
+	vertical-align: middle;
+}
+
+.bx-tl-post-submenu-item > div.bx-def-border-bottom {
+    border-color: #68b4e1;
+}
+
+.bx-tl-post-submenu-item .bx-tl-psi-icon,
+.bx-tl-post-submenu-item .bx-tl-psi-icon img {
+	width: 1.5rem;
+	height: 1.5rem;
+}
+.bx-tl-post-submenu-item .bx-tl-psi-icon img {
+	color: #002e74;
+}
+
+.bx-tl-post-submenu-item .sys-icon {
+	vertical-align: middle;
+	font-size: 1.5rem;
+}
+
+.bx-tl-post .bx-form-value .bx-form-input-wrapper-textarea {
+	overflow: hidden;
+}
+
+div#bx-timeline-post div#bx-form-element-attachments {
+	position: relative;
+	top: 0;
+	left: 0;
+	right: auto;
+}
+div#bx-timeline-post div#bx-form-element-attachments ul.bx-menu-btns-hor {
+	text-align: left;
+}
+
+/*+++ Froala +++*/
+.bx-tl-post .bx-form-element-wrapper .bx-form-input-wrapper-textarea .fr-toolbar.fr-top,
+.bx-tl-post .bx-form-element-wrapper .bx-form-input-wrapper-textarea .fr-box.fr-basic.fr-top .fr-wrapper {
+    border-width: 0px;
+    box-shadow: none;
+}
+
+/*--- Phone ---*/
+
+/*--- Post Form ---*/
+.bx-media-phone .bx-tl-post-submenu .bx-tl-post-submenu-item > div {
+    display: block;
+    text-align: center;
+}
+

+ 236 - 0
modules/boonex/lucid/data/template/bx_timeline/css/view-media-desktop.css

@@ -0,0 +1,236 @@
+
+/*--- View Block Style ---*/
+.bx-media-desktop .bx-tl-grid-sizer {
+    width: 33.3%;
+}
+.bx-media-desktop .bx-layout-column-wide .bx-tl-grid-sizer,
+.bx-media-desktop .bx-layout-column-half .bx-tl-grid-sizer {
+   width: 50%;
+}
+.bx-media-desktop .bx-layout-column-thin .bx-tl-grid-sizer {
+   width: 100%;
+}
+
+
+.bx-media-desktop .bx-tl-grid-item-sizer {
+   width: 33.3%;
+}
+.bx-media-desktop .bx-tl-grid-item-sizer.bx-tl-gis-pnd,
+.bx-media-desktop .bx-tl-grid-item-sizer.bx-tl-gis-pnd-pmd {
+    width: 66.6%;
+}
+.bx-media-desktop .bx-layout-column-wide .bx-tl-grid-item-sizer,
+.bx-media-desktop .bx-layout-column-half .bx-tl-grid-item-sizer {
+    width: 50%;
+}
+.bx-media-desktop .bx-layout-column-wide .bx-tl-grid-item-sizer.bx-tl-gis-pnd,
+.bx-media-desktop .bx-layout-column-wide .bx-tl-grid-item-sizer.bx-tl-gis-pnd-pmd,
+.bx-media-desktop .bx-layout-column-half .bx-tl-grid-item-sizer.bx-tl-gis-pnd,
+.bx-media-desktop .bx-layout-column-half .bx-tl-grid-item-sizer.bx-tl-gis-pnd-pmd {
+    width: 100%;
+}
+
+.bx-media-desktop .bx-layout-column-thin .bx-tl-item-grid-sizer {
+    width: 100%;
+}
+
+/*--- Animation ---*/
+.bx-media-desktop.cssanimations div.bx-tl-view-timeline .bx-tl-item-type.is-hidden {
+    visibility: hidden;
+}
+.bx-media-desktop.cssanimations div.bx-tl-view-timeline .bx-tl-item-type.bounce-in {
+    visibility: visible;
+    -webkit-animation: cd-bounce-1 0.6s;
+    -moz-animation: cd-bounce-1 0.6s;
+    animation: cd-bounce-1 0.6s;
+}
+.bx-media-desktop.cssanimations div.bx-tl-view-timeline .bx-tl-item-cnt.is-hidden {
+    visibility: hidden;
+}
+.bx-media-desktop.cssanimations div.bx-tl-view-timeline .bx-tl-item-cnt.bounce-in {
+    visibility: visible;
+    -webkit-animation: cd-bounce-2 0.6s;
+    -moz-animation: cd-bounce-2 0.6s;
+    animation: cd-bounce-2 0.6s;
+}
+/* inverse bounce effect on even content blocks */
+.bx-media-desktop.cssanimations .bx-layout-column-fullwidth div.bx-tl-view-timeline .bx-tl-item:nth-child(even) .bx-tl-item-cnt.bounce-in {
+    -webkit-animation: cd-bounce-2-inverse 0.6s;
+    -moz-animation: cd-bounce-2-inverse 0.6s;
+    animation: cd-bounce-2-inverse 0.6s;
+}
+
+
+/*--- Animation ---*/
+@-webkit-keyframes cd-bounce-1 {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale(0.5);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale(1.2);
+  }
+
+  100% {
+    -webkit-transform: scale(1);
+  }
+}
+@-moz-keyframes cd-bounce-1 {
+  0% {
+    opacity: 0;
+    -moz-transform: scale(0.5);
+  }
+
+  60% {
+    opacity: 1;
+    -moz-transform: scale(1.2);
+  }
+
+  100% {
+    -moz-transform: scale(1);
+  }
+}
+@keyframes cd-bounce-1 {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale(0.5);
+    -moz-transform: scale(0.5);
+    -ms-transform: scale(0.5);
+    -o-transform: scale(0.5);
+    transform: scale(0.5);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: scale(1.2);
+    -moz-transform: scale(1.2);
+    -ms-transform: scale(1.2);
+    -o-transform: scale(1.2);
+    transform: scale(1.2);
+  }
+
+  100% {
+    -webkit-transform: scale(1);
+    -moz-transform: scale(1);
+    -ms-transform: scale(1);
+    -o-transform: scale(1);
+    transform: scale(1);
+  }
+}
+
+@-webkit-keyframes cd-bounce-2 {
+  0% {
+    opacity: 0;
+    -webkit-transform: translateX(-100px);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translateX(20px);
+  }
+
+  100% {
+    -webkit-transform: translateX(0);
+  }
+}
+@-moz-keyframes cd-bounce-2 {
+  0% {
+    opacity: 0;
+    -moz-transform: translateX(-100px);
+  }
+
+  60% {
+    opacity: 1;
+    -moz-transform: translateX(20px);
+  }
+
+  100% {
+    -moz-transform: translateX(0);
+  }
+}
+@keyframes cd-bounce-2 {
+  0% {
+    opacity: 0;
+    -webkit-transform: translateX(-100px);
+    -moz-transform: translateX(-100px);
+    -ms-transform: translateX(-100px);
+    -o-transform: translateX(-100px);
+    transform: translateX(-100px);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translateX(20px);
+    -moz-transform: translateX(20px);
+    -ms-transform: translateX(20px);
+    -o-transform: translateX(20px);
+    transform: translateX(20px);
+  }
+
+  100% {
+    -webkit-transform: translateX(0);
+    -moz-transform: translateX(0);
+    -ms-transform: translateX(0);
+    -o-transform: translateX(0);
+    transform: translateX(0);
+  }
+}
+@-webkit-keyframes cd-bounce-2-inverse {
+  0% {
+    opacity: 0;
+    -webkit-transform: translateX(100px);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translateX(-20px);
+  }
+
+  100% {
+    -webkit-transform: translateX(0);
+  }
+}
+@-moz-keyframes cd-bounce-2-inverse {
+  0% {
+    opacity: 0;
+    -moz-transform: translateX(100px);
+  }
+
+  60% {
+    opacity: 1;
+    -moz-transform: translateX(-20px);
+  }
+
+  100% {
+    -moz-transform: translateX(0);
+  }
+}
+@keyframes cd-bounce-2-inverse {
+  0% {
+    opacity: 0;
+    -webkit-transform: translateX(100px);
+    -moz-transform: translateX(100px);
+    -ms-transform: translateX(100px);
+    -o-transform: translateX(100px);
+    transform: translateX(100px);
+  }
+
+  60% {
+    opacity: 1;
+    -webkit-transform: translateX(-20px);
+    -moz-transform: translateX(-20px);
+    -ms-transform: translateX(-20px);
+    -o-transform: translateX(-20px);
+    transform: translateX(-20px);
+  }
+
+  100% {
+    -webkit-transform: translateX(0);
+    -moz-transform: translateX(0);
+    -ms-transform: translateX(0);
+    -o-transform: translateX(0);
+    transform: translateX(0);
+  }
+}

+ 24 - 0
modules/boonex/lucid/data/template/bx_timeline/css/view-media-tablet.css

@@ -0,0 +1,24 @@
+
+/*--- View Block Style ---*/
+.bx-media-tablet .bx-tl-grid-sizer {
+    width: 50%;
+}
+.bx-media-tablet .bx-layout-column-half .bx-tl-grid-sizer, 
+.bx-media-tablet .bx-layout-column-thin .bx-tl-grid-sizer {
+    width: 100%;
+}
+
+.bx-media-tablet .bx-tl-grid-item-sizer { 
+    width: 50%;
+}
+
+.bx-media-tablet .bx-tl-grid-item-sizer.bx-tl-gis-pnd,
+.bx-media-tablet .bx-tl-grid-item-sizer.bx-tl-gis-pnd-pmd { 
+    width: 100%;
+}
+
+.bx-media-tablet .bx-layout-column-half .bx-tl-grid-item-sizer, 
+.bx-media-tablet .bx-layout-column-thin .bx-tl-grid-item-sizer {
+    width: 100%;
+}
+

+ 276 - 0
modules/boonex/lucid/data/template/bx_timeline/css/view.css

@@ -0,0 +1,276 @@
+@import url(../../../../../timeline/template/css/view.css);
+
+.bx-tl-grid-sizer {
+	width: 100%;
+}
+	
+.bx-tl-grid-item-sizer {
+    width: 100%;
+}
+
+div.bx-tl-view-timeline div.bx-tl-items:before {
+    top: 1px;
+}
+div.bx-tl-view-timeline div.bx-tl-item-type {
+    display: none;
+}
+
+div.bx-tl-view div.bx-tl-item .bx-tl-item-cnt {
+    overflow: visible;
+}
+
+div.bx-tl-view div.bx-tl-item div.bx-tl-owner-name {
+    line-height: 1rem;
+}
+div.bx-tl-view div.bx-tl-item div.bx-tl-owner-name > * {
+    vertical-align: middle;
+}
+div.bx-tl-view div.bx-tl-item div.bx-tl-owner-name .bx-tl-hot img {
+	display: inline-block;
+	vertical-align: sub;
+}
+	
+div.bx-tl-view div.bx-tl-item-text div.bx-tl-title {
+	font-size: 1.375rem;
+    font-weight: 900;
+}
+
+div.bx-tl-view div.bx-tl-item-text div.bx-tl-content p {
+	margin-top: 0.5rem;
+	margin-bottom: 0.5rem;
+}
+
+div.bx-tl-view div.bx-tl-item-images {
+	text-align: center;
+}
+div.bx-tl-view div.bx-tl-item-images div.bx-tl-item-image img {
+    position: relative;
+    display: block;
+    max-width: 100%;
+
+    margin-left: auto;
+    margin-right: auto;
+}
+div.bx-tl-view div.bx-tl-item div.bx-tl-item-owner div.bx-tl-owner-info {
+    position: relative;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+	-webkit-justify-content: space-between;
+    justify-content: space-between;
+
+    margin-right: 0;
+}
+div.bx-tl-view div.bx-tl-item div.bx-tl-owner-name a.bx-tl-owner-name, 
+div.bx-tl-view div.bx-tl-item div.bx-tl-owner-name .bx-tl-timeline-owner-name a.bx-tl-ton-item {
+    font-size: 1rem;
+    font-weight: bold;
+}
+div.bx-tl-view div.bx-tl-item div.bx-tl-owner-actions {
+    position: relative;
+    line-height: normal;
+}
+
+/*+++ Pinned +++*/
+/*
+.bx-tl-view div.bx-tl-item.bx-tl-pinned div.bx-tl-item-text div.bx-tl-title a,
+.bx-tl-view div.bx-tl-item.bx-tl-pinned div.bx-tl-item-text div.bx-tl-content *,
+.bx-tl-view div.bx-tl-item.bx-tl-pinned div.bx-tl-item-date a,	
+.bx-tl-view div.bx-tl-item.bx-tl-pinned div.bx-tl-item-date span.bx-def-font-small,
+.bx-tl-view div.bx-tl-item.bx-tl-pinned div.bx-tl-item-owner a {
+    color: #ffffff;
+}
+.bx-tl-view div.bx-tl-item.bx-tl-pinned .bx-def-box.bx-def-color-bg-block,
+.bx-tl-view div.bx-tl-item.bx-tl-pinned .bx-def-box.bx-def-color-bg-box:not(.cmt-box) {
+    background: -moz-linear-gradient(top, rgba(107,192,215,1) 0%, rgba(0,147,205,1) 100%);
+    background: -webkit-linear-gradient(top, rgba(107,192,215,1) 0%,rgba(0,147,205,1) 100%);
+    background: linear-gradient(to bottom, rgba(107,192,215,1) 0%, rgba(0,147,205,1) 100%);
+}
+*/
+
+/*+++ Item Note +++*/
+.bx-tl-in-divider {
+	border-color: rgba(238, 241, 244, 1.0);
+}
+	
+/*+++ Item Author +++*/
+.bx-tl-item-owner {
+	padding-left: 1rem;
+	padding-right: 1rem;
+}
+.bx-tl-item-owner-cnt {
+	position: relative;
+}
+.bx-tl-item-owner .bx-def-thumb-size {
+    width: 2.25rem;
+    height: 2.25rem;
+}
+.bx-tl-item-owner div.bx-def-unit-img p.bx-base-pofile-unit-thumb {
+    line-height: 2.25rem;
+    font-size: 1.65rem;
+}
+.bx-tl-item-owner .bx-def-thumb-size-min-height {
+	min-height: 2.25rem;
+}
+.bx-tl-item-owner .bx-def-thumb-size-left-indent {
+	margin-left: 2.875rem;	
+}
+
+/*+++ Item Context +++*/
+.bx-tl-item-context {
+	position: relative;
+	display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+    -webkit-justify-content: space-between;
+    justify-content: space-between;
+
+    border-color: rgba(238, 241, 244, 1.0);
+}
+.bx-tl-item-context-owner {
+	position: relative;
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+
+	height: 2rem;
+    line-height: 2rem;
+
+    border-radius: 2rem;
+    overflow: hidden;
+}
+.bx-tl-item-context-owner .bx-tl-ico-icon {
+	border: 1px solid transparent;
+}
+.bx-tl-item-context-owner .bx-tl-ico-icon .bx-def-thumb-size {
+	width: 1.875rem;
+	height: 1.875rem;
+	line-height: 1.875rem;
+}
+.bx-tl-item-context-owner .bx-tl-ico-icon .bx-base-pofile-unit-wo-info p.bx-base-pofile-unit-thumb, 
+.bx-tl-item-context-owner .bx-tl-ico-icon .bx-base-pofile-unit-wo-info p.bx-base-pofile-unit-ava {
+    display: block;
+    margin: 0px;
+    border-width: 0;
+    border-radius: 2rem;
+    line-height: 1.875rem;
+    font-size: 1.5rem;
+    font-weight: 800;
+}
+.bx-tl-item-context-owner .bx-tl-ico-icon,
+.bx-tl-item-context-owner .bx-tl-ico-info {
+    background-color: rgba(246, 249, 252, 1.0);
+}
+
+
+/*+++ Item Images +++*/
+div.bx-tl-view.bx-tl-view-timeline div.bx-tl-item-image,
+div.bx-tl-view.bx-tl-view-search div.bx-tl-item-image,
+div.bx-tl-view.bx-tl-view-item div.bx-tl-item-image {
+	display: block;
+    margin-right: 0;
+}
+
+/*+++ Activity and Comments +++*/
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity,
+.bx-tl-view div.bx-tl-item div.bx-tl-item-comments-holder .bx-tl-item-comments-wrp {
+	padding: 0.5rem 1rem;
+	border-top: 1px solid rgba(238, 241, 244, 1.0);
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-comments-holder .bx-tl-item-comments {
+	margin-top: 0.5rem;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-comments-holder .cmt-reply {
+    margin-bottom: 0;
+    padding-bottom: 1.25rem;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: flex-start;
+    align-items: flex-start;
+    -webkit-justify-content: space-between;
+    justify-content: space-between;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor::before, 
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor::after { 
+    content: none;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li {
+    display: block;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li > span {
+	display: inline-block;
+    vertical-align: top;
+	margin-top: 0;
+    margin-right: 0;
+	margin-bottom: 0;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li > span:not(.item-share) span.bx-menu-custom-item-title {
+	display: none;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li > span.item-share span.bx-menu-custom-item-title {
+	font-size: 1.25rem;
+	color: rgba(0,147,205,1);
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li .bx-vote-likes .bx-vote-element-holder,
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li .bx-vote-likes .bx-vote-counter-holder {
+	line-height: inherit;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li a {
+    font-size: 1.25rem;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li .sys-icon,
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li a .sys-icon {
+    vertical-align: baseline;
+    font-size: 1.5rem;
+    color: rgba(0,147,205,1);
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li .bx-vote-disabled .sys-icon,
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li a.bx-vote-disabled .sys-icon,
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li .bx-score-disabled .sys-icon,
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li a.bx-score-disabled .sys-icon{
+    color: #ddd;
+}
+.bx-tl-view div.bx-tl-item div.bx-tl-item-activity .bx-menu-hor li a img {
+	display: inline-block;
+    vertical-align: sub;
+
+    width: 1.625rem;
+    height: 1.625rem;
+    box-sizing: border-box;
+    background-size: contain;
+    background-clip: content-box;
+    border: 1px solid transparent;
+}
+
+/*--- Item Content Style ---*/
+div.bx-tl-item-text div.bx-tl-content {
+    max-height: 250px;
+}
+div.bx-tl-item-date {
+	color: #E0E8EB;
+}
+div.bx-tl-item-date span.bx-def-font-small {
+    color: #50585D;
+}
+div.bx-tl-item-date .bx-tl-timeline-owner-name a.bx-tl-ton-item {
+    color: #0093CD;
+}
+div.bx-tl-item-date a.bx-tl-date {
+	font-size: 0.75rem;
+	color: #50585D;
+}
+div.bx-tl-item-date .bx-tl-hot img {
+	display: inline-block;
+    vertical-align: text-top;
+}
+
+/*--- Outline view: Card ---*/
+.bx-tl-view.bx-tl-view-item div.bx-tl-item .bx-tl-item-cnt,
+.bx-tl-view.bx-tl-view-outline div.bx-tl-item .bx-tl-item-cnt {
+    padding-bottom: 0;
+}

+ 58 - 0
modules/boonex/lucid/data/template/bx_timeline/item_outline.html

@@ -0,0 +1,58 @@
+<div id="__html_id__" class="__style_prefix__-item __class__">
+	<div class="__style_prefix__-item-ind bx-def-padding-sec">
+	    <div class="__style_prefix__-item-cnt bx-def-box bx-def-round-corners __class_content__">
+	    	<div class="__style_prefix__-item-owner bx-def-padding-top bx-def-padding-sec-bottom">
+                    <div class="__style_prefix__-item-owner-cnt"> 
+	                <div class="__style_prefix__-owner-avatar bx-def-thumb-size">__item_owner_unit__</div>
+	                <div class="__style_prefix__-owner-info bx-def-thumb-size-min-height bx-def-thumb-size-left-indent">
+	                    <!-- NOTE: Spaces after and between elements in 'owner-name' DIV are needed for better line folding -->
+	                    <div class="__style_prefix__-owner-name bx-def-font-middle bx-def-font-grayed">
+	                        <a href="__item_owner_url__" class="__style_prefix__-owner-name" title="__item_owner_title__">__item_owner_name__</a> 
+	                        <bx_if:show_timeline_owner>
+                                    <i class="sys-icon caret-right"></i>
+                                    <span class="__style_prefix__-timeline-owner-name">
+                                        <bx_repeat:owners><span class="__style_prefix__-ton-div">, </span><a href="__owner_url__" class="__style_prefix__-ton-item">__owner_username__</a></bx_repeat:owners>
+                                    </span>
+                                </bx_if:show_timeline_owner><br /> 
+	                        <bx_if:show_menu_item_meta>
+                                    <span class="__style_prefix__-item-meta bx-def-font-small">__meta__</span>
+                                </bx_if:show_menu_item_meta>
+                                <bx_if:show_pinned>
+                                    <span class="__style_prefix__-pinned bx-def-margin-thd-left">
+                                        <i class="sys-icon thumbtack bx-def-margin-thd-left" title="<bx_text_attribute:_bx_timeline_txt_pinned />"></i>
+                                    </span>
+                                </bx_if:show_pinned>
+                                <bx_if:show_sticked>
+                                    <span class="__style_prefix__-sticked bx-def-margin-thd-left">
+                                        <i class="sys-icon thumbtack bx-def-margin-thd-left" title="<bx_text_attribute:_bx_timeline_txt_sticked />"></i>
+                                    </span>
+                                </bx_if:show_sticked>
+                                <bx_if:show_hot>
+                                    <span class="__style_prefix__-hot bx-def-margin-thd-left">
+                                        <i class="sys-icon fire bx-def-margin-thd-left" title="<bx_text_attribute:_bx_timeline_txt_hot />"></i>
+                                    </span>
+                                </bx_if:show_hot> 
+	                    </div>
+	                    <bx_if:show_owner_actions>
+                                <div class="__style_prefix__-owner-actions  bx-def-margin-left-auto">
+                                    <bx_repeat:owner_actions>
+                                        <a class="bx-btn bx-btn-small" href="__href__" onclick="__onclick__" title="__title__">__content__</a>
+                                    </bx_repeat:owner_actions>
+                                </div>
+                            </bx_if:show_owner_actions>
+	                </div>
+                    </div>
+                </div>
+	    	<div class="__style_prefix__-item-content bx-clearfix">__content__</div>
+                <bx_if:show_location>
+                    <div class="__style_prefix__-item-location bx-def-margin-sec-top bx-def-font-grayed bx-clearfix">__location__</div>
+                </bx_if:show_location>
+                <div class="__style_prefix__-item-footer">
+                    <bx_if:show_menu_item_actions>
+                        <div class="__style_prefix__-item-activity bx-def-margin-sec-top bx-clearfix">__menu_item_actions__</div>
+                    </bx_if:show_menu_item_actions>
+                    <div class="__style_prefix__-item-comments-holder">__comments__</div>
+                </div>
+            </div>
+	</div>
+</div>

+ 68 - 0
modules/boonex/lucid/data/template/bx_timeline/item_timeline.html

@@ -0,0 +1,68 @@
+<div id="__html_id__" class="__style_prefix__-item __class__ bx-def-thumb-size-min-height bx-def-padding-bottom bx-clearfix">
+    <a name="timeline-event-__id__"></a>
+    <div class="__style_prefix__-item-type bx-def-media-phone-hide">
+	    <div class="__style_prefix__-item-circle">
+			<i class="sys-icon __item_icon__"></i>
+        </div>
+    </div>
+    <div class="__style_prefix__-item-cnt bx-def-box bx-def-round-corners __class_content__">
+        <bx_if:show_note>
+            <div class="__style_prefix__-item-note">
+                <div class="__style_prefix__-in-text bx-def-padding-sec-topbottom bx-def-padding-leftright bx-def-font-grayed<bx_if:show_note_color> col-__item_note_color__</bx_if:show_note_color>">__item_note__</div>
+                <div class="__style_prefix__-in-divider bx-def-hr"></div>
+            </div>
+        </bx_if:show_note>
+        <div class="__style_prefix__-item-owner bx-def-padding-top bx-def-padding-sec-bottom __class_owner__"> 
+            <div class="__style_prefix__-item-owner-cnt">
+                <div class="__style_prefix__-owner-avatar bx-def-thumb-size">__item_owner_unit__</div>
+                <div class="__style_prefix__-owner-info bx-def-thumb-size-min-height bx-def-thumb-size-left-indent">
+                    <!-- NOTE: Spaces after and between elements in 'owner-name' DIV are needed for better line folding -->
+                    <div class="__style_prefix__-owner-name bx-def-font-middle bx-def-font-grayed">
+                        <a href="__item_owner_url__" class="__style_prefix__-owner-name" title="__item_owner_title__">__item_owner_name__</a> 
+                        <bx_if:show_timeline_owner>
+                            <i class="sys-icon caret-right"></i>
+                            <span class="__style_prefix__-timeline-owner-name">
+                                <bx_repeat:owners><span class="__style_prefix__-ton-div">, </span><a href="__owner_url__" class="__style_prefix__-ton-item">__owner_username__</a></bx_repeat:owners>
+                            </span>
+                        </bx_if:show_timeline_owner><br /> 
+                        <bx_if:show_menu_item_meta>
+                            <span class="__style_prefix__-item-meta bx-def-font-small">__meta__</span>
+                        </bx_if:show_menu_item_meta>
+                        <bx_if:show_pinned>
+                            <span class="__style_prefix__-pinned bx-def-margin-thd-left">
+                                <i class="sys-icon thumbtack bx-def-margin-thd-left" title="<bx_text_attribute:_bx_timeline_txt_pinned />"></i>
+                            </span>
+                        </bx_if:show_pinned>
+                        <bx_if:show_sticked>
+                            <span class="__style_prefix__-sticked bx-def-margin-thd-left">
+                                <i class="sys-icon thumbtack bx-def-margin-thd-left" title="<bx_text_attribute:_bx_timeline_txt_sticked />"></i>
+                            </span>
+                        </bx_if:show_sticked>
+                        <bx_if:show_hot>
+                            <span class="__style_prefix__-hot bx-def-margin-thd-left">
+                                <i class="sys-icon fire bx-def-margin-thd-left" title="<bx_text_attribute:_bx_timeline_txt_hot />"></i>
+                            </span>
+                        </bx_if:show_hot>
+                    </div>
+                    <bx_if:show_owner_actions>
+                        <div class="__style_prefix__-owner-actions bx-def-margin-left-auto">
+                            <bx_repeat:owner_actions>
+                                <a class="bx-btn bx-btn-small" href="__href__" onclick="__onclick__">__content__</a>
+                            </bx_repeat:owner_actions>
+                        </div>
+                    </bx_if:show_owner_actions>
+                </div>
+            </div>
+        </div>
+        <div class="__style_prefix__-item-content bx-clearfix">__content__</div>
+        <bx_if:show_location>
+            <div class="__style_prefix__-item-location bx-def-margin-leftright bx-def-margin-sec-top bx-def-font-grayed bx-clearfix">__location__</div>
+        </bx_if:show_location>
+        <div class="__style_prefix__-item-footer">
+            <bx_if:show_menu_item_actions>
+                <div class="__style_prefix__-item-activity bx-def-border-top bx-def-margin-sec-top bx-clearfix">__menu_item_actions__</div>
+            </bx_if:show_menu_item_actions>
+            <div class="__style_prefix__-item-comments-holder">__comments__</div>
+        </div>
+    </div>
+</div>

+ 45 - 0
modules/boonex/lucid/data/template/bx_timeline/type_post.html

@@ -0,0 +1,45 @@
+<bx_if:show_images>
+    <div class="__style_prefix__-item-images bx-def-margin-top-auto">
+        <bx_repeat:images>
+            <div class="__style_prefix__-item-image">__image__</div>
+        </bx_repeat:images>
+    </div>
+</bx_if:show_images>
+<bx_if:show_videos>
+    <div class="__style_prefix__-item-videos bx-def-margin-top-auto">
+        <bx_repeat:videos>
+            <div class="__style_prefix__-item-video bx-def-margin-top-auto">__video__</div>
+        </bx_repeat:videos>
+    </div>
+</bx_if:show_videos>
+<div class="__style_prefix__-item-text bx-def-margin-leftright bx-def-margin-sec-top-auto">
+	<bx_if:show_title>
+		<div class="__style_prefix__-title bx-def-margin-thd-top-auto bx-def-font-h3">__title__</div>
+	</bx_if:show_title>
+	<bx_if:show_content>
+		<div class="__style_prefix__-content bx-def-margin-thd-top-auto">__item_content__</div>
+	</bx_if:show_content>
+	<bx_if:show_content_raw>__item_content_raw__</bx_if:show_content_raw>
+</div>
+<bx_if:show_links>
+	<div class="__style_prefix__-item-links bx-def-margin-leftright bx-def-margin-top-auto">
+		<bx_repeat:links>
+	   		<div class="__style_prefix__-item-link bx-def-margin-top-auto bx-def-padding-sec bx-def-border">
+				<bx_if:show_embed_outer>
+				    <div class="__style_prefix__-il-embed">__embed__</div>
+				</bx_if:show_embed_outer>
+                <bx_if:show_embed_inner>
+		   			<bx_if:show_thumbnail>
+		   				<div class="__style_prefix__-il-thumbnail">
+		   					<img src="__thumbnail__" />
+		   				</div>
+		   			</bx_if:show_thumbnail>
+		   			<div class="__style_prefix__-il-title">__link__</div>
+		   			<bx_if:show_text>
+		   				<div class="__style_prefix__-il-text bx-def-font-small bx-def-font-grayed">__text__</div>
+		   			</bx_if:show_text>
+                </bx_if:show_embed_inner>
+	   		</div>
+	   	</bx_repeat:links>
+	</div>
+</bx_if:show_links>

+ 8 - 0
modules/boonex/lucid/data/template/bx_timeline/type_repost.html

@@ -0,0 +1,8 @@
+<bx_if:show_title>
+	<div class="__style_prefix__-title bx-def-margin-leftright bx-def-margin-sec-bottom">__title__</div>
+</bx_if:show_title>
+<bx_if:show_content>
+	<div class="__style_prefix__-content __style_prefix__-reposted bx-def-margin-sec-bottom">
+	__content__
+	</div>
+</bx_if:show_content>

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioBuilderPage.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioBuilderPage extends BxBaseStudioBuilderPage
+{
+    function __construct($sType = '', $sPage = '')
+    {
+        parent::__construct($sType, $sPage);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioBuilderPageUploaderHTML5.php

@@ -0,0 +1,19 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+
+class BxTemplStudioBuilderPageUploaderHTML5 extends BxBaseStudioBuilderPageUploaderHTML5
+{
+    function __construct ($aObject, $sStorageObject, $sUniqId, $oTemplate)
+    {
+        parent::__construct($aObject, $sStorageObject, $sUniqId, $oTemplate);
+    }
+}
+
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioBuilderPageUploaderSimple.php

@@ -0,0 +1,19 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+
+class BxTemplStudioBuilderPageUploaderSimple extends BxBaseStudioBuilderPageUploaderSimple
+{
+    function __construct ($aObject, $sStorageObject, $sUniqId, $oTemplate)
+    {
+        parent::__construct($aObject, $sStorageObject, $sUniqId, $oTemplate);
+    }
+}
+
+/** @} */

+ 20 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioConfig.php

@@ -0,0 +1,20 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioConfig extends BxBaseStudioConfig
+{
+    function __construct()
+    {
+        parent::__construct();
+    }
+}
+
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDashboard.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioDashboard extends BxBaseStudioDashboard
+{
+    function __construct()
+    {
+        parent::__construct();
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDesign.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioDesign extends BxBaseStudioDesign
+{
+    function __construct($sTemplate = "", $sPage = "")
+    {
+        parent::__construct($sTemplate, $sPage);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDesignServices.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioDesignServices extends BxBaseStudioDesignServices
+{
+    public function __construct()
+    {
+        parent::__construct();
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDesigner.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioDesigner extends BxBaseStudioDesigner
+{
+    function __construct($sPage = '')
+    {
+        parent::__construct($sPage);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioDesigns.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioDesigns extends BxBaseStudioDesigns
+{
+    function __construct()
+    {
+        parent::__construct();
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormView.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormView extends BxBaseStudioFormView
+{
+    function __construct($aInfo, $oTemplate = false)
+    {
+        parent::__construct($aInfo, $oTemplate);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioForms.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioForms extends BxBaseStudioForms
+{
+    function __construct($sPage = '')
+    {
+        parent::__construct($sPage);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsDisplays.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsDisplays extends BxBaseStudioFormsDisplays
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

+ 124 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsField.php

@@ -0,0 +1,124 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsField extends BxBaseStudioFormsField
+{
+}
+
+class BxTemplStudioFormsFieldBlockHeader extends BxBaseStudioFormsFieldBlockHeader
+{
+}
+
+class BxTemplStudioFormsFieldValue extends BxBaseStudioFormsFieldValue
+{
+}
+
+class BxTemplStudioFormsFieldText extends BxBaseStudioFormsFieldText
+{
+}
+
+class BxTemplStudioFormsFieldPassword extends BxBaseStudioFormsFieldPassword
+{
+}
+
+class BxTemplStudioFormsFieldTextarea extends BxBaseStudioFormsFieldTextarea
+{
+}
+
+class BxTemplStudioFormsFieldNumber extends BxBaseStudioFormsFieldNumber
+{
+}
+
+class BxTemplStudioFormsFieldDatepicker extends BxBaseStudioFormsFieldDatepicker
+{
+}
+
+class BxTemplStudioFormsFieldDatetime extends BxBaseStudioFormsFieldDatetime
+{
+}
+
+class BxTemplStudioFormsFieldCheckbox extends BxBaseStudioFormsFieldCheckbox
+{
+}
+
+class BxTemplStudioFormsFieldSwitcher extends BxBaseStudioFormsFieldSwitcher
+{
+}
+
+class BxTemplStudioFormsFieldFile extends BxBaseStudioFormsFieldFile
+{
+}
+
+class BxTemplStudioFormsFieldFiles extends BxBaseStudioFormsFieldFiles
+{
+}
+
+class BxTemplStudioFormsFieldSlider extends BxBaseStudioFormsFieldSlider
+{
+}
+
+class BxTemplStudioFormsFieldDoublerange extends BxBaseStudioFormsFieldDoublerange
+{
+}
+
+class BxTemplStudioFormsFieldHidden extends BxBaseStudioFormsFieldHidden
+{
+}
+
+class BxTemplStudioFormsFieldButton extends BxBaseStudioFormsFieldButton
+{
+}
+
+class BxTemplStudioFormsFieldReset extends BxBaseStudioFormsFieldReset
+{
+}
+
+class BxTemplStudioFormsFieldSubmit extends BxBaseStudioFormsFieldSubmit
+{
+}
+
+class BxTemplStudioFormsFieldImage extends BxBaseStudioFormsFieldImage
+{
+}
+
+class BxTemplStudioFormsFieldSelect extends BxBaseStudioFormsFieldSelect
+{
+}
+
+class BxTemplStudioFormsFieldSelectMultiple extends BxBaseStudioFormsFieldSelectMultiple
+{
+}
+
+class BxTemplStudioFormsFieldCheckboxSet extends BxBaseStudioFormsFieldCheckboxSet
+{
+}
+
+class BxTemplStudioFormsFieldRadioSet extends BxBaseStudioFormsFieldRadioSet
+{
+}
+
+class BxTemplStudioFormsFieldCustom extends BxBaseStudioFormsFieldCustom
+{
+}
+
+class BxTemplStudioFormsFieldInputSet extends BxBaseStudioFormsFieldInputSet
+{
+}
+
+class BxTemplStudioFormsFieldCaptcha extends BxBaseStudioFormsFieldCaptcha
+{
+}
+
+class BxTemplStudioFormsFieldLocation extends BxBaseStudioFormsFieldLocation
+{
+}
+
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsFields.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsFields extends BxBaseStudioFormsFields
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsForms.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsForms extends BxBaseStudioFormsForms
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsPreLists.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsPreLists extends BxBaseStudioFormsPreLists
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsPreValues.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsPreValues extends BxBaseStudioFormsPreValues
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsSearchFields.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsSearchFields extends BxBaseStudioFormsSearchFields
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFormsSearchForms.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFormsSearchForms extends BxBaseStudioFormsSearchForms
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioFunctions.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioFunctions extends BxBaseStudioFunctions
+{
+    function __construct()
+    {
+        parent::__construct();
+    }
+}
+/** @} */

+ 19 - 0
modules/boonex/lucid/data/template/studio/scripts/BxTemplStudioGrid.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT
+ *
+ * @defgroup    UnaStudioView UNA Studio Representation classes
+ * @ingroup     UnaStudio
+ * @{
+ */
+defined('BX_DOL') or die('hack attempt');
+
+class BxTemplStudioGrid extends BxBaseStudioGrid
+{
+    function __construct($aOptions, $oTemplate = false)
+    {
+        parent::__construct($aOptions, $oTemplate);
+    }
+}
+/** @} */

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません