Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

Alexander před 4 roky
rodič
revize
e2da355ea9
100 změnil soubory, kde provedl 651 přidání a 913 odebrání
  1. 2 0
      inc/classes/BxDolCmts.php
  2. 19 15
      inc/classes/BxDolConnectionQuery.php
  3. 1 1
      inc/classes/BxDolDb.php
  4. 3 1
      inc/classes/BxDolInformer.php
  5. 7 1
      inc/classes/BxDolMetatags.php
  6. 26 4
      inc/classes/BxDolTemplate.php
  7. 33 0
      inc/js/editor.quill.js
  8. 11 2
      install/sql/system.sql
  9. 1 1
      modules/base/general/classes/BxBaseModGeneralModule.php
  10. 7 8
      modules/base/groups/classes/BxBaseModGroupsAlertsResponse.php
  11. 5 0
      modules/base/groups/classes/BxBaseModGroupsConfig.php
  12. 2 3
      modules/base/groups/classes/BxBaseModGroupsMenuSnippetMeta.php
  13. 12 8
      modules/base/groups/classes/BxBaseModGroupsModule.php
  14. 14 2
      modules/base/profile/classes/BxBaseModProfileTemplate.php
  15. 3 3
      modules/base/profile/template/cover_block.html
  16. 16 1
      modules/base/profile/template/css/main.css
  17. 1 0
      modules/base/text/classes/BxBaseModTextConfig.php
  18. 7 1
      modules/base/text/classes/BxBaseModTextFormEntry.php
  19. 2 0
      modules/base/text/js/links.js
  20. 13 2
      modules/boonex/artificer/classes/BxArtificerConfig.php
  21. 11 0
      modules/boonex/artificer/classes/BxArtificerModule.php
  22. 3 0
      modules/boonex/artificer/classes/BxArtificerTemplate.php
  23. 1 1
      modules/boonex/artificer/data/template/bx_forum/unit_gallery.html
  24. 0 17
      modules/boonex/artificer/data/template/bx_messenger/conference_call.html
  25. 0 23
      modules/boonex/artificer/data/template/bx_messenger/css/admin.css
  26. 0 27
      modules/boonex/artificer/data/template/bx_messenger/css/messenger.css
  27. 0 16
      modules/boonex/artificer/data/template/bx_messenger/css/semantic-messenger.css
  28. 0 14
      modules/boonex/artificer/data/template/bx_messenger/css/video-conference.css
  29. 0 16
      modules/boonex/artificer/data/template/bx_messenger/emoji-picker.html
  30. 0 6
      modules/boonex/artificer/data/template/bx_messenger/header_wrapper.html
  31. 0 34
      modules/boonex/artificer/data/template/bx_messenger/history.html
  32. 0 48
      modules/boonex/artificer/data/template/bx_messenger/jots.html
  33. 0 38
      modules/boonex/artificer/data/template/bx_messenger/lots_briefs.html
  34. 0 29
      modules/boonex/artificer/data/template/bx_messenger/lots_list.html
  35. 0 10
      modules/boonex/artificer/data/template/bx_messenger/menu_messenger_talk_header_hor.html
  36. 0 12
      modules/boonex/artificer/data/template/bx_messenger/popup-menu-item.html
  37. 0 15
      modules/boonex/artificer/data/template/bx_messenger/repost.html
  38. 0 9
      modules/boonex/artificer/data/template/bx_messenger/talk.html
  39. 0 27
      modules/boonex/artificer/data/template/bx_messenger/talk_edit_participants_list.html
  40. 0 8
      modules/boonex/artificer/data/template/bx_messenger/talk_header.html
  41. 0 60
      modules/boonex/artificer/data/template/bx_messenger/text_area.html
  42. 0 1
      modules/boonex/artificer/data/template/bx_messenger/thumb_icon.html
  43. 0 1
      modules/boonex/artificer/data/template/bx_messenger/thumb_letter.html
  44. 0 15
      modules/boonex/artificer/data/template/bx_messenger/vc_message.html
  45. 0 3
      modules/boonex/artificer/data/template/bx_messenger/viewed.html
  46. 1 1
      modules/boonex/artificer/data/template/bx_notifications/menu_preview.html
  47. 4 4
      modules/boonex/artificer/data/template/bx_timeline/item_outline.html
  48. 5 5
      modules/boonex/artificer/data/template/bx_timeline/item_timeline.html
  49. 0 6
      modules/boonex/artificer/data/template/mod_groups/cover.html
  50. 0 6
      modules/boonex/artificer/data/template/mod_profile/cover.html
  51. 1 7
      modules/boonex/artificer/data/template/mod_profile/cover_block.html
  52. 3 3
      modules/boonex/artificer/data/template/mod_profile/css/main.css
  53. 0 12
      modules/boonex/artificer/data/template/system/auth.html
  54. 0 17
      modules/boonex/artificer/data/template/system/author.html
  55. 0 5
      modules/boonex/artificer/data/template/system/author_desc.html
  56. 0 13
      modules/boonex/artificer/data/template/system/css/auth.css
  57. 0 3
      modules/boonex/artificer/data/template/system/css/common.css
  58. 0 17
      modules/boonex/artificer/data/template/system/css/informer.css
  59. 1 1
      modules/boonex/artificer/data/template/system/css/menu.css
  60. 0 1
      modules/boonex/artificer/data/template/system/images/cover-profile-dark.svg
  61. 0 1
      modules/boonex/artificer/data/template/system/images/cover-profile.svg
  62. 0 20
      modules/boonex/artificer/data/template/system/informer.html
  63. 3 12
      modules/boonex/artificer/data/template/system/menu_account_popup.html
  64. 0 13
      modules/boonex/artificer/data/template/system/profile_avatar_switcher.html
  65. 9 9
      modules/boonex/artificer/data/template/system/pt_application.html
  66. 2 2
      modules/boonex/artificer/data/template/system/scripts/BxTemplCmtsMenuUnitMeta.php
  67. 8 0
      modules/boonex/artificer/data/template/system/scripts/BxTemplFunctions.php
  68. 1 1
      modules/boonex/artificer/data/template/system/scripts/BxTemplMenuAccountNotifications.php
  69. 40 38
      modules/boonex/artificer/data/template/system/sidebar_account.html
  70. 5 1
      modules/boonex/artificer/install/langs/en.xml
  71. 2 1
      modules/boonex/artificer/install/sql/install.sql
  72. 12 12
      modules/boonex/artificer/js/sidebar.js
  73. 65 32
      modules/boonex/artificer/js/utils.js
  74. 1 0
      modules/boonex/azure_b2c_con/classes/BxAzrB2CConfig.php
  75. 39 3
      modules/boonex/azure_b2c_con/classes/BxAzrB2CModule.php
  76. 3 0
      modules/boonex/azure_b2c_con/install/langs/en.xml
  77. 3 2
      modules/boonex/azure_b2c_con/install/sql/enable.sql
  78. 2 2
      modules/boonex/credits/classes/BxCreditsModule.php
  79. 1 0
      modules/boonex/credits/install/langs/en.xml
  80. 1 5
      modules/boonex/decorous/data/template/system/css/auth.css
  81. 23 20
      modules/boonex/decorous/data/template/system/css/menu.less
  82. 4 14
      modules/boonex/decorous/data/template/system/menu_account_popup.html
  83. 15 14
      modules/boonex/editor/js/editor.js
  84. 3 0
      modules/boonex/editor/template/css/main.css
  85. 10 3
      modules/boonex/english/data/langs/system/en.xml
  86. 9 4
      modules/boonex/events/classes/BxEventsFormEntry.php
  87. 93 5
      modules/boonex/events/classes/BxEventsModule.php
  88. 5 1
      modules/boonex/events/install/langs/en.xml
  89. 1 6
      modules/boonex/forum/classes/BxForumGrid.php
  90. 14 8
      modules/boonex/forum/install/langs/en.xml
  91. 22 48
      modules/boonex/forum/install/sql/enable.sql
  92. 11 11
      modules/boonex/forum/template/css/unaca.css
  93. 1 1
      modules/boonex/forum/template/unit_gallery.html
  94. 9 18
      modules/boonex/lucid/data/template/system/css/menu.less
  95. 4 14
      modules/boonex/lucid/data/template/system/menu_account_popup.html
  96. 2 0
      modules/boonex/market/install/langs/en.xml
  97. 1 1
      modules/boonex/market/install/sql/enable.sql
  98. 4 4
      modules/boonex/massmailer/classes/BxMassMailerDb.php
  99. 2 0
      modules/boonex/massmailer/classes/BxMassMailerGridCampaigns.php
  100. 6 3
      modules/boonex/massmailer/classes/BxMassMailerModule.php

+ 2 - 0
inc/classes/BxDolCmts.php

@@ -1871,6 +1871,8 @@ class BxDolCmts extends BxDolFactory implements iBxDolReplaceable, iBxDolContent
         $iCmtUniqId = $this->getCommentUniqId($iCmtId);
 
         return array(
+            'source' => 'sys_cmts_' . $iCmtUniqId,
+
             'object_system' => $this->_sSystem, 
             'object_id' => $iObjId, 
             'object_author_id' => $iObjAthrId,

+ 19 - 15
inc/classes/BxDolConnectionQuery.php

@@ -45,29 +45,31 @@ class BxDolConnectionQuery extends BxDolDb
             $sWhereJoin2 .= $this->prepareAsString(" AND `c2`.`mutual` = ?", $isMutual);
         }
 
-        $sJoin = $this->_aObject['profile_content'] ? "INNER JOIN `sys_profiles` AS `p1` ON (`p1`.`id` = `c`.`content` AND `p1`.`status` = 'active') INNER JOIN `sys_profiles` AS `p2` ON (`p2`.`id` = `c2`.`content` AND `p2`.`status` = 'active')" : '';
+        $sJoin = "";
+        if($this->_aObject['profile_content'])
+            $sJoin = " INNER JOIN `sys_profiles` AS `cp1` ON (`cp1`.`id` = `c`.`content` AND `cp1`.`status` = 'active') INNER JOIN `sys_profiles` AS `cp2` ON (`cp2`.`id` = `c2`.`content` AND `cp2`.`status` = 'active')";
 
-        return array(
-            'join' => "
-                INNER JOIN `{$this->_sTable}` AS `c` ON (`c`.`content` = `$sContentTable`.`$sContentField` $sWhereJoin1)
-                INNER JOIN `{$this->_sTable}` AS `c2` ON (`c2`.`content` = `c`.`content` $sWhereJoin2)" . $sJoin,
-        );
+        return [
+            'join' => "INNER JOIN `{$this->_sTable}` AS `c` ON (`c`.`content` = `$sContentTable`.`$sContentField` $sWhereJoin1) INNER JOIN `{$this->_sTable}` AS `c2` ON (`c2`.`content` = `c`.`content` $sWhereJoin2)" . $sJoin,
+        ];
     }
 
     public function getConnectedContentSQLParts ($sContentTable, $sContentField, $iInitiator, $isMutual = false)
     {
         $aResult = $this->getConnectedContentSQLPartsExt($sContentTable, $sContentField, $iInitiator, $isMutual);
 
-        $aFields = array();
+        $aFields = [];
         foreach($aResult['fields'] as $sFieldAlias => $aField)
             $aFields[$sFieldAlias] = "`" . $aField['table_alias'] . "`.`" . $aField['name'] . "`";
 
-        $sJoin = $this->_aObject['profile_content'] ? "INNER JOIN `sys_profiles` ON (`sys_profiles`.`id` = `{$aResult['join']['table_alias']}`.`content` AND `sys_profiles`.`status` = 'active')" : '';
+        $sJoin = "";
+        if($this->_aObject['profile_content']) 
+            $sJoin = " INNER JOIN `sys_profiles` AS `cp` ON (`cp`.`id` = `{$aResult['join']['table_alias']}`.`content` AND `cp`.`status` = 'active')";
 
-        return array(
+        return [
             'fields' => $aFields,
-            'join' => $aResult['join']['type'] . " JOIN `" . $aResult['join']['table'] . "` AS `" . $aResult['join']['table_alias'] . "` ON (" . $aResult['join']['condition'] . ") " . $sJoin,
-        );
+            'join' => $aResult['join']['type'] . " JOIN `" . $aResult['join']['table'] . "` AS `" . $aResult['join']['table_alias'] . "` ON (" . $aResult['join']['condition'] . ")" . $sJoin,
+        ];
     }
 
     public function getConnectedContentSQLPartsExt ($sContentTable, $sContentField, $iInitiator, $isMutual = false)
@@ -104,11 +106,13 @@ class BxDolConnectionQuery extends BxDolDb
     {
         $aResult = $this->getConnectedInitiatorsSQLPartsExt($sInitiatorTable, $sInitiatorField, $iContent, $isMutual);
 
-        $sJoin = $this->_aObject['profile_initiator'] ? "INNER JOIN `sys_profiles` ON (`sys_profiles`.`id` = `{$aResult['join']['table_alias']}`.`initiator` AND `sys_profiles`.`status` = 'active')" : '';
+        $sJoin = '';
+        if($this->_aObject['profile_initiator'])
+            $sJoin = " INNER JOIN `sys_profiles` AS `cp` ON (`cp`.`id` = `{$aResult['join']['table_alias']}`.`initiator` AND `cp`.`status` = 'active')";
 
-        return array(
-            'join' => $aResult['join']['type'] . " JOIN `" . $aResult['join']['table'] . "` AS `" . $aResult['join']['table_alias'] . "` ON (" . $aResult['join']['condition'] . ") " . $sJoin,
-        );
+        return [
+            'join' => $aResult['join']['type'] . " JOIN `" . $aResult['join']['table'] . "` AS `" . $aResult['join']['table_alias'] . "` ON (" . $aResult['join']['condition'] . ")" . $sJoin,
+        ];
     }
 
     public function getConnectedInitiatorsSQLPartsExt ($sInitiatorTable, $sInitiatorField, $iContent, $isMutual = false)

+ 1 - 1
inc/classes/BxDolDb.php

@@ -1262,7 +1262,7 @@ class BxDolDb extends BxDolFactory implements iBxDolSingleton
         $sOutput = '';
         
         if(!empty($aError['query']))
-            $sOutput .= '<p><b>Query:</b><br />' . $aError['query'] . '</p>';
+            $sOutput .= '<p><b>Query:</b><br />' . bx_process_output($aError['query']) . '</p>';
 
         if(!empty($aError['message']))
             $sOutput .= '<p><b>Mysql error:</b><br />' . $aError['message'] . '</p>';

+ 3 - 1
inc/classes/BxDolInformer.php

@@ -29,7 +29,7 @@ define('BX_INFORMER_ERROR', 3);
  */
 class BxDolInformer extends BxDolFactory implements iBxDolSingleton
 {
-	protected $_bEnabled = true;
+    protected $_bEnabled = true;
     protected $_aMessages = array();
 
     /**
@@ -41,6 +41,8 @@ class BxDolInformer extends BxDolFactory implements iBxDolSingleton
             trigger_error ('Multiple instances are not allowed for the BxDolInformer class.', E_USER_ERROR);
 
         parent::__construct();
+
+        $this->_addPermanentMessages();
     }
 
     /**

+ 7 - 1
inc/classes/BxDolMetatags.php

@@ -311,7 +311,13 @@ class BxDolMetatags extends BxDolFactory implements iBxDolFactoryObject
      */
     public function keywordsAdd($iId, $s) 
     {
-        return $this->_metaAdd($iId, ' ' . strip_tags(str_replace(array('<br>', '<br />', '<hr>', '<hr />', '</p>'), "\n", $s)), '/[\pCc\pZ\p{Ps}\p{Pe}\p{Pi}\p{Pf}]\#(\pL[\pL\pN_]+)/u', 'keywordsDelete', 'keywordsAdd', 'keywordsGet', (int)getParam('sys_metatags_hashtags_max'), 'keyword');
+        //--- Remove <a> tags WITH their content first.
+        $s = preg_replace("/<a\b[^>]*>(.*?)<\/a>/si", '', $s);
+
+        //--- Strip the other HTML tags.
+        $s = strip_tags(str_replace(array('<br>', '<br />', '<hr>', '<hr />', '</p>'), "\n", $s));
+
+        return $this->_metaAdd($iId, ' ' . $s, '/[\pCc\pZ\p{Ps}\p{Pe}\p{Pi}\p{Pf}]\#(\pL[\pL\pN_]+)/u', 'keywordsDelete', 'keywordsAdd', 'keywordsGet', (int)getParam('sys_metatags_hashtags_max'), 'keyword');
     }
 
     /**

+ 26 - 4
inc/classes/BxDolTemplate.php

@@ -2883,6 +2883,11 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
             ));
         }
         catch(Exception $oException) {
+            bx_log('sys_template', "Error in _parseContent method. Cannot parse template insertion (<bx_include... />).\n" . 
+                "  Error ({$oException->getCode()}): {$oException->getMessage()}\n" . 
+                (!empty($_COOKIE['memberID']) ? "  Account ID: {$_COOKIE['memberID']}\n" : "")
+            );
+
             return '';
         }
 
@@ -2899,9 +2904,19 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
         $sContent = preg_replace($aKeys, $aValues, $sContent);
 
         //--- Parse System Keys ---//
-        $sContent = preg_replace_callback("'" . $aKeyWrappers['left'] . "([a-zA-Z0-9_-]+)" . $aKeyWrappers['right'] . "'", function($aMatches) use($oTemplate, $mixedKeyWrapperHtml) {
-        	return $oTemplate->parseSystemKey($aMatches[1], $mixedKeyWrapperHtml);
-        }, $sContent);
+        try {
+            $sContent = preg_replace_callback("'" . $aKeyWrappers['left'] . "([a-zA-Z0-9_-]+)" . $aKeyWrappers['right'] . "'", function($aMatches) use($oTemplate, $mixedKeyWrapperHtml) {
+                return $oTemplate->parseSystemKey($aMatches[1], $mixedKeyWrapperHtml);
+            }, $sContent);
+        }
+        catch(Exception $oException) {
+            bx_log('sys_template', "Error in _parseContent method. Cannot parse System Keys.\n" . 
+                "  Error ({$oException->getCode()}): {$oException->getMessage()}\n" . 
+                (!empty($_COOKIE['memberID']) ? "  Account ID: {$_COOKIE['memberID']}\n" : "")
+            );
+
+            return '';
+        }
 
         return $sContent;
     }
@@ -2992,7 +3007,7 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
                 $sContent = preg_replace_callback($sPattern, function($aMatches) use($oTemplate, $aVarValues, $mixedKeyWrapperHtml, $sCheckIn) {
                     $mixedResult = $oTemplate->getCached($aMatches[1], $aVarValues, $mixedKeyWrapperHtml, $sCheckIn, false);
                     if($mixedResult === false)
-                        throw new Exception('Unable to create cache file.');
+                        throw new Exception("Unable to create cache file ({$aMatches[1]}).", 1);
 
                     return $mixedResult;
                 }, $sContent);
@@ -3000,6 +3015,12 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
             $sContent = $this->_parseContentKeys($sContent);
         }
         catch(Exception $oException) {
+            if(($iCode = $oException->getCode()) != 1)
+                bx_log('sys_template', "Error in _compileContent method. Cannot parse template insertion (<bx_include... />).\n" . 
+                    "  Error ({$iCode}): {$oException->getMessage()}\n" . 
+                    (!empty($_COOKIE['memberID']) ? "  Account ID: {$_COOKIE['memberID']}\n" : "")
+                );
+
             return false;
         }
 
@@ -3016,6 +3037,7 @@ class BxDolTemplate extends BxDolFactory implements iBxDolSingleton
 
         //--- Parse Predefined Keys ---//
         $sContent = preg_replace($aKeys, $aValues, $sContent);
+
         //--- Parse System Keys ---//
         $sContent = preg_replace( "'" . $aKeyWrappers['left'] . "([a-zA-Z0-9_-]+)" . $aKeyWrappers['right'] . "'", "<?php echo \$this->parseSystemKey('\\1', \$mixedKeyWrapperHtml);?>", $sContent);
 

+ 33 - 0
inc/js/editor.quill.js

@@ -18,6 +18,12 @@ function bx_editor_init(oEditor, oParams){
     oParams.toolbar = {
         container: bEmptyToolbar ? [] : oParams.toolbar,
             handlers: {
+            'show-html': function() {
+                 bx_alert('<textarea class="bx-def-font-inputs bx-form-input-textarea bx-form-input-html-quill-code" id="' + oParams.name + '_code">' + oEditor.container.firstChild.innerHTML + '</textarea>',function() {
+                     //console.log($('#'+oParams.name+'_code').val());
+                     oEditor.container.firstChild.innerHTML = $('#'+oParams.name+'_code').val();
+                 });
+            },  
             'embed': function(value) {
                 var range = oEditor.getSelection();
                 bx_prompt(_t('_sys_txt_quill_tooltip_embed_popup_header'), '', function(oPopup){
@@ -192,10 +198,37 @@ function bx_editor_init(oEditor, oParams){
             'formats/embed-link': EmbedCode
         });
         
+        var AlignStyle = Quill.import('attributors/style/align');
+        Quill.register(AlignStyle, true);
+        
+        var DirectionStyle = Quill.import('attributors/style/direction');
+        Quill.register(DirectionStyle, true);
+        
+        const Parchment = Quill.import("parchment");
+        const pixelLevels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
+        const TAB_MULTIPLIER = 30
+
+        class IndentAttributor extends Parchment.Attributor.Style {
+            add(node, value) {
+                return super.add(node, `${+value * TAB_MULTIPLIER}px`)
+            }
+            value(node) {
+                return parseFloat(super.value(node)) / TAB_MULTIPLIER || undefined // Don't return NaN
+            }
+        }
+
+        const IndentStyle = new IndentAttributor("indent", "margin-left", {
+            scope: Parchment.Scope.BLOCK,
+            whitelist: pixelLevels.map(value => `${value * TAB_MULTIPLIER}px`),
+        })
+
+        Quill.register({"formats/indent": IndentStyle}, true);
+        
         bQuillRegistred = true; 
         
         var icons = Quill.import('ui/icons');
         icons['embed'] = '<svg class="fr-svg" focusable="false" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="ql-fill" d="M20.73889,15.45929a3.4768,3.4768,0,0,0-5.45965-.28662L9.5661,12.50861a3.49811,3.49811,0,0,0-.00873-1.01331l5.72174-2.66809a3.55783,3.55783,0,1,0-.84527-1.81262L8.70966,9.6839a3.50851,3.50851,0,1,0,.0111,4.63727l5.7132,2.66412a3.49763,3.49763,0,1,0,6.30493-1.526ZM18.00745,5.01056A1.49993,1.49993,0,1,1,16.39551,6.3894,1.49994,1.49994,0,0,1,18.00745,5.01056ZM5.99237,13.49536a1.49989,1.49989,0,1,1,1.61194-1.37878A1.49982,1.49982,0,0,1,5.99237,13.49536Zm11.78211,5.494a1.49993,1.49993,0,1,1,1.61193-1.37885A1.49987,1.49987,0,0,1,17.77448,18.98932Z"></path></svg>';
+        icons['show-html'] = '<svg class="fr-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><path class="ql-fill" d="M162.1 257.8c-7.812-7.812-20.47-7.812-28.28 0l-48 48c-7.812 7.812-7.812 20.5 0 28.31l48 48C137.8 386.1 142.9 388 148 388s10.23-1.938 14.14-5.844c7.812-7.812 7.812-20.5 0-28.31L128.3 320l33.86-33.84C169.1 278.3 169.1 265.7 162.1 257.8zM365.3 93.38l-74.63-74.64C278.6 6.742 262.3 0 245.4 0H64C28.65 0 0 28.65 0 64l.0065 384c0 35.34 28.65 64 64 64H320c35.2 0 64-28.8 64-64V138.6C384 121.7 377.3 105.4 365.3 93.38zM336 448c0 8.836-7.164 16-16 16H64.02c-8.838 0-16-7.164-16-16L48 64.13c0-8.836 7.164-16 16-16h160L224 128c0 17.67 14.33 32 32 32h79.1V448zM221.9 257.8c-7.812 7.812-7.812 20.5 0 28.31L255.7 320l-33.86 33.84c-7.812 7.812-7.812 20.5 0 28.31C225.8 386.1 230.9 388 236 388s10.23-1.938 14.14-5.844l48-48c7.812-7.812 7.812-20.5 0-28.31l-48-48C242.3 250 229.7 250 221.9 257.8z"/></svg>';
     }
 
     var oConfig = {              

+ 11 - 2
install/sql/system.sql

@@ -332,7 +332,7 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 (@iCategoryId, 'sys_quill_toolbar_mini', '_adm_stg_cpt_option_sys_quill_toolbar_mini', '[\'bold\',\'italic\',\'underline\',\'clean\',{\'list\':\'ordered\'}, {\'list\':\'bullet\'},{ \'align\':\'\'},{\'align\':\'center\'},{\'align\':\'right\'},\'blockquote\',\'link\',\'image\',\'embed\']', 'digit', '', '', '', '', 70),
 (@iCategoryId, 'sys_quill_toolbar_standard', '_adm_stg_cpt_option_sys_quill_toolbar_standard', '[\'bold\',\'italic\',\'underline\',\'clean\',{ \'header\': [1, 2, 3, 4, 5, 6, false] },{\'list\':\'ordered\'}, {\'list\':\'bullet\'},{\'indent\': \'-1\'},{\'indent\': \'+1\'},{ \'align\':\'\'},{\'align\':\'center\'},{\'align\':\'right\'},{\'align\':\'justify\'},\'blockquote\',\'link\',\'image\',\'embed\',\'emoji\']', 'digit', '', '', '', '', 73),
 (@iCategoryId, 'sys_quill_toolbar_full', '_adm_stg_cpt_option_sys_quill_toolbar_full', '[{ \'header\': [1, 2, 3, 4, 5, 6, false] },\'bold\',\'italic\',\'underline\',\'clean\'],
-  [{ \'align\': [] },{\'list\':\'ordered\'}, {\'list\':\'bullet\'},{\'indent\': \'-1\'},{\'indent\': \'+1\'},\'blockquote\',{ \'color\': [] }, { \'background\': [] },{ \'direction\': \'rtl\' },\'link\',\'image\',\'embed\',\'code-block\',\'emoji\']', 'digit', '', '', '', '', 76),
+  [{ \'align\': [] },{\'list\':\'ordered\'}, {\'list\':\'bullet\'},{\'indent\': \'-1\'},{\'indent\': \'+1\'},\'blockquote\',{ \'color\': [] }, { \'background\': [] },{ \'direction\': \'rtl\' },\'link\',\'image\',\'embed\',\'code-block\',\'emoji\',\'show-html\']', 'digit', '', '', '', '', 76),
 
 (@iCategoryId, 'sys_search_keyword_min_len', '_adm_stg_cpt_option_sys_search_keyword_min_len', '1', 'digit', '', '', '', '', 80),
 
@@ -529,6 +529,7 @@ INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `ex
 
 (@iCategoryId, 'sys_metatags_hashtags_max', '_adm_stg_cpt_option_sys_metatags_hashtags_max', '9', 'digit', '', '', '', 30),
 (@iCategoryId, 'sys_metatags_mentions_max', '_adm_stg_cpt_option_sys_metatags_mentions_max', '9', 'digit', '', '', '', 31),
+(@iCategoryId, 'sys_attach_links_max', '_adm_stg_cpt_option_sys_attach_links_max', '0', 'digit', '', '', '', 35),
 
 (@iCategoryId, 'sys_profile_bot', '_adm_stg_cpt_option_sys_profile_bot', '', 'select', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:23:"get_options_profile_bot";s:5:"class";s:13:"TemplServices";}', '', '', 40),
 
@@ -4410,7 +4411,7 @@ INSERT INTO `sys_objects_menu` (`object`, `title`, `set_name`, `module`, `templa
 ('sys_cmts_item_actions', '_sys_menu_title_cmts_item_actions', 'sys_cmts_item_actions', 'system', 15, 0, 1, 'BxTemplCmtsMenuActions', ''),
 ('sys_cmts_item_counters', '_sys_menu_title_cmts_item_counters', 'sys_cmts_item_counters', 'system', 15, 0, 1, 'BxTemplCmtsMenuActions', ''),
 ('sys_cmts_item_meta', '_sys_menu_title_cmts_item_meta', 'sys_cmts_item_meta', 'system', 15, 0, 1, 'BxTemplCmtsMenuUnitMeta', ''),
-('sys_account_popup', '_sys_menu_title_account_popup', '', 'system', 12, 0, 1, 'BxTemplMenuAccountPopup', ''),
+('sys_account_popup', '_sys_menu_title_account_popup', 'sys_account_popup', 'system', 12, 0, 1, 'BxTemplMenuAccountPopup', ''),
 ('sys_account_notifications', '_sys_menu_title_account_notifications', 'sys_account_notifications', 'system', 19, 0, 1, 'BxTemplMenuAccountNotifications', ''),
 ('sys_profile_stats', '_sys_menu_title_profile_stats', 'sys_profile_stats', 'system', 21, 0, 1, 'BxTemplMenuProfileStats', ''),
 ('sys_tags_cloud', '_sys_menu_title_tags_cloud', '', 'system', 21, 0, 1, 'BxBaseMenuTagsCloud', ''),
@@ -4449,6 +4450,7 @@ INSERT INTO `sys_menu_sets` (`set_name`, `module`, `title`, `deletable`) VALUES
 ('sys_footer', 'system', '_sys_menu_set_title_footer', 0),
 ('sys_toolbar_site', 'system', '_sys_menu_set_title_toolbar_site', 0),
 ('sys_toolbar_member', 'system', '_sys_menu_set_title_toolbar_member', 0),
+('sys_account_popup', 'system', '_sys_menu_set_title_account_popup', 0),
 ('sys_account_notifications', 'system', '_sys_menu_set_title_account_notifications', 0),
 ('sys_add_content_links', 'system', '_sys_menu_set_title_add_content', 0),
 ('sys_dashboard_content_manage', 'system', '_sys_menu_set_title_dashboard_content_manage', 0),
@@ -4552,6 +4554,13 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('sys_toolbar_member', 'system', 'account', '_sys_menu_item_title_system_account_menu', '_sys_menu_item_title_account_menu', 'javascript:void(0);', 'bx_menu_slide_inline(''#bx-sliding-menu-account'', this, ''site'');', '', 'user',  'a:3:{s:6:"module";s:6:"system";s:6:"method";s:21:"profile_notifications";s:5:"class";s:20:"TemplServiceProfiles";}', 'sys_account_popup', 1, 2147483646, 0, 1, 0, 1),
 ('sys_toolbar_member', 'system', 'login', '_sys_menu_item_title_system_login', '', 'page.php?i=login', '', '', 'user',  '', '', 0, 1, 0, 1, 0, 2);
 
+-- account popup menu
+INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
+('sys_account_popup', 'system', 'profile-active', '_sys_menu_item_title_system_ap_profile_active', '', '', '', '', '', '', '', 2147483646, 1, 1, 1),
+('sys_account_popup', 'system', 'profile-notifications', '_sys_menu_item_title_system_ap_profile_notifications', '', '', '', '', '', '', '', 2147483646, 1, 1, 2),
+('sys_account_popup', 'system', 'profile-switcher', '_sys_menu_item_title_system_ap_profile_switcher', '', '', '', '', '', '', '', 2147483646, 1, 1, 3),
+('sys_account_popup', 'system', 'profile-create', '_sys_menu_item_title_system_ap_profile_create', '', '', '', '', '', '', '', 2147483646, 1, 1, 4);
+
 -- notifications menu in account popup
 INSERT INTO `sys_menu_items` (`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `addon`, `submenu_object`, `visible_for_levels`, `active`, `copyable`, `order`) VALUES
 ('sys_account_notifications', 'system', 'dashboard', '_sys_menu_item_title_system_dashboard', '_sys_menu_item_title_dashboard', 'page.php?i=dashboard', '', '', 'tachometer-alt', '', '', 2147483646, 1, 1, 1),

+ 1 - 1
modules/base/general/classes/BxBaseModGeneralModule.php

@@ -2508,7 +2508,7 @@ class BxBaseModGeneralModule extends BxDolModule
         $CNF = &$this->_oConfig->CNF;
         $sError = '_sys_txt_access_denied';
 
-        if(!$this->_oConfig->isAutoApproveEnabled())
+        if($this->_oConfig->isAutoApproveEnabled())
             return _t($sError);
 
         if($aDataEntry[$CNF['FIELD_STATUS_ADMIN']] != BX_BASE_MOD_GENERAL_STATUS_PENDING)

+ 7 - 8
modules/base/groups/classes/BxBaseModGroupsAlertsResponse.php

@@ -15,16 +15,12 @@ class BxBaseModGroupsAlertsResponse extends BxBaseModProfileAlertsResponse
      * Use Internal Notifications.
      */
     protected $_bUseIn;
-    
+
     public function __construct()
     {
         parent::__construct();
 
-        $CNF = &$this->_oModule->_oConfig->CNF;
-
-        $this->_bUseIn = true;
-        if(isset($CNF['PARAM_USE_IN']))
-            $this->_bUseIn = getParam($CNF['PARAM_USE_IN']) == 'on';
+        $this->_bUseIn = $this->_oModule->_oConfig->isInternalNotifications();
     }
 
     public function response($oAlert)
@@ -81,7 +77,7 @@ class BxBaseModGroupsAlertsResponse extends BxBaseModProfileAlertsResponse
             if(!($oConnection = BxDolConnection::getObjectInstance($CNF['OBJECT_CONNECTIONS'])))
                 return;
 
-            if(!$oConnection->isConnected($iInviter, $oAlert->iSender))
+            if($iInviter != $oAlert->iSender && !$oConnection->isConnected($iInviter, $oAlert->iSender))
                 return;
 
             if($this->_oModule->_oDb->isInviteByInvited($iInvited, $oAlert->iSender))
@@ -89,7 +85,10 @@ class BxBaseModGroupsAlertsResponse extends BxBaseModProfileAlertsResponse
 
             $sKey = BxDolKey::getInstance()->getNewKey(false, $CNF["INVITES_KEYS_LIFETIME"]);
             $this->_oModule->_oDb->insertInvite($sKey, $oAlert->iSender, $iInviter, $iInvited);
-            $sEntryUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'] . '&id=' . $oAlert->iObject . "&key=" . $sKey);
+            $sEntryUrl = BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_ENTRY'], [
+                'id' => $oAlert->iObject,
+                'key' => $sKey
+            ]);
         }
 
         sendMailTemplate($this->_oModule->_oConfig->CNF['EMAIL_INVITATION'], 0, $iInvited, array(

+ 5 - 0
modules/base/groups/classes/BxBaseModGroupsConfig.php

@@ -71,6 +71,11 @@ class BxBaseModGroupsConfig extends BxBaseModProfileConfig
         return isset($this->CNF['PARAM_PAID_JOIN_ENABLED']) && $this->CNF['PARAM_PAID_JOIN_ENABLED'] === true;
     }
 
+    public function isInternalNotifications()
+    {
+        return !isset($this->CNF['PARAM_USE_IN']) || getParam($this->CNF['PARAM_USE_IN']) == 'on';
+    }
+
     public function getPriceName($sName)
     {
         return uriGenerate($sName, $this->CNF['TABLE_PRICES'], $this->CNF['FIELD_PRICE_NAME'], ['lowercase' => false]);

+ 2 - 3
modules/base/groups/classes/BxBaseModGroupsMenuSnippetMeta.php

@@ -42,9 +42,8 @@ class BxBaseModGroupsMenuSnippetMeta extends BxBaseModProfileMenuSnippetMeta
             return false;
 
         return [
-            $this->getUnitMetaItemButtonSmall(_t('_bx_groups_menu_item_title_pay_and_join'), [
-                'href' => BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php', [
-                    'i' => $CNF['URI_JOIN_ENTRY'], 
+            $this->getUnitMetaItemButton(_t('_bx_groups_menu_item_title_pay_and_join'), [
+                'href' => BX_DOL_URL_ROOT . BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_JOIN_ENTRY'], [
                     'profile_id' => $this->_oContentProfile->id()
                 ])
             ]),

+ 12 - 8
modules/base/groups/classes/BxBaseModGroupsModule.php

@@ -498,20 +498,24 @@ class BxBaseModGroupsModule extends BxBaseModProfileModule
 
     public function serviceFansTable ()
     {
-        $oGrid = BxDolGrid::getObjectInstance($this->_oConfig->CNF['OBJECT_GRID_CONNECTIONS']);
-        if (!$oGrid)
+        $CNF = &$this->_oConfig->CNF;
+
+        $oGrid = BxDolGrid::getObjectInstance($CNF['OBJECT_GRID_CONNECTIONS']);
+        if(!$oGrid)
             return false;
 
         return $oGrid->getCode();
     }
     
-	public function serviceInvitesTable ()
+    public function serviceInvitesTable ()
     {
-		if (!isset($this->_oConfig->CNF['OBJECT_GRID_INVITES']))
-			return false;
-		
-        $oGrid = BxDolGrid::getObjectInstance($this->_oConfig->CNF['OBJECT_GRID_INVITES']);
-        if (!$oGrid)
+        $CNF = &$this->_oConfig->CNF;
+
+        if(!isset($CNF['OBJECT_GRID_INVITES']))
+            return false;
+
+        $oGrid = BxDolGrid::getObjectInstance($CNF['OBJECT_GRID_INVITES']);
+        if(!$oGrid)
             return false;
 
         return $oGrid->getCode();

+ 14 - 2
modules/base/profile/classes/BxBaseModProfileTemplate.php

@@ -284,14 +284,20 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
         $sShowData = isset($aParams['show_data']) ? $aParams['show_data'] : '';
         $bShowCover = !isset($aParams['show_cover']) || $aParams['show_cover'] === true;
         $bShowAvatar = !isset($aParams['show_avatar']) || $aParams['show_avatar'] === true;
+        $bShowClickable = !isset($aParams['show_clickable']) || $aParams['show_clickable'] === true; //--- Is available for UseAsBlock appearance only.
         $sAddCode = "";
 
         $bUseAsAuthor = isset($aParams['use_as_author']) && $aParams['use_as_author'] === true;
         $bUseAsBlock = $bUseAsAuthor || (isset($aParams['use_as_block']) && $aParams['use_as_block'] === true);
 
-        if(!$bUseAsAuthor)
+        if($bUseAsAuthor)
+            $sClass .= ' bx-base-author';
+        else
             BxDolTemplate::getInstance()->addInjection('injection_main_class', 'text', 'bx-base-profile-view');
 
+        if($bUseAsBlock && $bShowClickable)
+            $sClass .= ' bx-clickable';
+
         $bProfileViewAllowed = $oModule->checkAllowedView($aData) === CHECK_ACTION_RESULT_ALLOWED;
 
         if($oModule->checkAllowedViewProfileImage($aData) !== CHECK_ACTION_RESULT_ALLOWED)
@@ -471,7 +477,7 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
 
         $aTmplVars = [
             'module' => $this->_oConfig->getName(),
-            'class' => $sClass,
+            'class' => trim($sClass),
             'id' => $aData[$CNF['FIELD_ID']],
             'content_url' => $sUrl,
             'title' => $sTitle,
@@ -506,6 +512,12 @@ class BxBaseModProfileTemplate extends BxBaseModGeneralTemplate
 
         if($bUseAsBlock)
             $aTmplVars = array_merge($aTmplVars, [
+                'bx_if:show_clickable' => [
+                    'condition' => $bShowClickable,
+                    'content' => [
+                        'content_url' => $sUrl
+                    ]
+                ],
                 'bx_if:show_cover' => [
                     'condition' => $bTmplVarsShowCover,
                     'content' => $aTmplVarsShowCover

+ 3 - 3
modules/base/profile/template/cover_block.html

@@ -1,6 +1,6 @@
 <div class="bx-base-profile-cover-block-wrapper">
     <div class="bx-base-pofile-cover-wrapper __class__ bx-def-centered bx-def-box-sizing">
-        <div class="bx-base-pofile-cover bx-def-cover-color-bg bx-def-box-sizing">
+        <div class="bx-base-pofile-cover bx-def-cover-color-bg bx-def-box-sizing"<bx_if:show_clickable> onclick="bx_click_area('__content_url__', event)"</bx_if:show_clickable>>
             <bx_if:show_cover>
                 <div class="bx-base-pofile-cover-image __add_class__">
                     <a class="bx-base-pofile-cover-image bx-def-box-sizing" href="__cover_href__" onclick="$('#__cover_popup_id__').dolPopupImage('__cover_url__', this)">
@@ -14,8 +14,8 @@
                     <bx_if:show_avatar>
                         <div class="bx-base-pofile-cover-thumb __add_class__">
                             <a class="bx-base-pofile-cover-thumb" href="__picture_href__" onclick="$('#__picture_popup_id__').dolPopupImage('__picture_url__', $(this).parent()); event.stopPropagation();">
-                                <img class="bx-base-pofile-unit-thumb bx-def-ava-big bx-def-ava-big-size __img_class__" src="__ava_url__" <bx_if:show_ava_letter> style="display:none" </bx_if:show_ava_letter> />
-                                <p class="bx-base-pofile-unit-thumb bx-def-ava-big bx-def-ava-big-size bx-def-border" style="background-color:rgba(__color__);<bx_if:show_ava_image>display:none</bx_if:show_ava_image>" >__letter__</p>
+                                <img class="bx-base-pofile-unit-thumb bx-def-ava-big bx-def-ava-big-size rounded-full ring-4 mx-auto ring-white dark:ring-gray-900 __img_class__" src="__ava_url__" <bx_if:show_ava_letter> style="display:none" </bx_if:show_ava_letter> />
+                                <p class="bx-base-pofile-unit-thumb bx-def-ava-big bx-def-ava-big-size flex items-center justify-center box-border m-0 rounded-full ring-4 mx-auto ring-white dark:ring-gray-900 text-white font-bold text-5xl __img_class__-placeholder" style="background-color:rgba(__color__);<bx_if:show_ava_image>display:none</bx_if:show_ava_image>" >__letter__</p>
                             </a>
                             <bx_if:show_online>
                                 <div class="bx-base-pofile-unit-online"></div>

+ 16 - 1
modules/base/profile/template/css/main.css

@@ -212,6 +212,9 @@ p.bx-base-pofile-unit-thumb.bx-def-ava-size {
     height: auto;
     margin: 1rem 0 0 0;
 }
+.bx-base-pofile-cover-wrapper.bx-clickable .bx-base-pofile-cover {
+    cursor: pointer;
+}
 
 .bx-media-phone .bx-base-pofile-cover-wrapper {
     padding-left: 0;
@@ -364,13 +367,25 @@ a.bx-base-pofile-cover-thumb p.bx-base-pofile-unit-thumb.bx-def-ava-big-size {
     text-align: left;
 }
 
-.bx-base-profile-cover-meta {}
+.bx-base-profile-cover-meta .bx-menu-custom.bx-menu-custom-hor {
+    -webkit-align-items: center;
+    align-items: center;
+    -webkit-flex-wrap: wrap;
+    flex-wrap: wrap;
+}
+.bx-base-profile-cover-meta .bx-menu-custom.bx-menu-custom-hor li {
+    margin-right: 1.25rem;
+}
 .bx-base-profile-cover-meta .bx-menu-custom.bx-menu-custom-hor li:last-child {
     margin-right: 0;
 }
 .bx-base-profile-cover-meta .bx-menu-custom.bx-menu-custom-hor li .sys-meta-div {
     display: none;
 }
+.bx-base-profile-cover-meta .bx-menu-custom.bx-menu-custom-hor li .sys-meta-item {
+    margin-right: 0;
+}
+
 
 .bx-base-pofile-cover-actions {
     position: relative;

+ 1 - 0
modules/base/text/classes/BxBaseModTextConfig.php

@@ -59,6 +59,7 @@ class BxBaseModTextConfig extends BxBaseModGeneralConfig
             'PARAM_POLL_ANONYMOUS_VOTING' => true,
             'PARAM_MULTICAT_ENABLED' => false,
             'PARAM_LINKS_ENABLED' => false,
+            'PARAM_LINKS_LIMIT' => 'sys_attach_links_max',
 
             // objects
             'OBJECT_VOTES_POLL_ANSWERS' => $this->_sName . '_poll_answers',

+ 7 - 1
modules/base/text/classes/BxBaseModTextFormEntry.php

@@ -49,7 +49,13 @@ class BxBaseModTextFormEntry extends BxBaseModGeneralFormEntry
             $sInclude .= $this->_oModule->_oTemplate->addCss(array('links.css'), $bDynamicMode);
             $sInclude .= $this->_oModule->_oTemplate->addJs(array('modules/base/text/js/|links.js', 'links.js'), $bDynamicMode);
 
-            $sResult .= ($bDynamicMode ? $sInclude : '') . $this->_oModule->_oTemplate->getJsCode('links', ['sFormId' => $this->getId(), 'iContentId' => (int)$this->_iContentId,]);
+            $sResult .= ($bDynamicMode ? $sInclude : '') . $this->_oModule->_oTemplate->getJsCode('links', [
+                'sFormId' => $this->getId(), 
+                'iContentId' => (int)$this->_iContentId,
+                'iLimitAttachLinks' => (int)getParam($CNF['PARAM_LINKS_LIMIT']),
+                'sLimitAttachLinksErr' => bx_js_string(_t('_sys_txt_err_attach_links')),
+                'oAttachedLinks' => []
+            ]);
         }  
 
     	return $sResult;

+ 2 - 0
modules/base/text/js/links.js

@@ -17,6 +17,8 @@ function BxBaseModTextLinks(oOptions) {
     this._sFormId = oOptions.sFormId == undefined ? 0 : oOptions.sFormId;
     this._sEditorId = oOptions.sEditorId == undefined ? '' : oOptions.sEditorId;
     this._aHtmlIds = oOptions.aHtmlIds == undefined ? {} : oOptions.aHtmlIds;
+    this._iLimitAttachLinks = oOptions.iLimitAttachLinks == undefined ? 0 : oOptions.iLimitAttachLinks;
+    this._sLimitAttachLinksErr = oOptions.sLimitAttachLinksErr == undefined ? '' : oOptions.sLimitAttachLinksErr;
     this._oAttachedLinks = oOptions.oAttachedLinks == undefined ? {} : oOptions.oAttachedLinks;
     
     this._sPregTag = "(<([^>]+bx-tag[^>]+)>)";

+ 13 - 2
modules/boonex/artificer/classes/BxArtificerConfig.php

@@ -23,6 +23,14 @@ class BxArtificerConfig extends BxBaseModTemplateConfig
     {
         parent::__construct($aModule);
 
+        $this->_aJsClasses = array_merge($this->_aJsClasses, array(
+            'utils' => 'BxArtificerUtils'
+        ));
+
+        $this->_aJsObjects = array_merge($this->_aJsObjects, array(
+            'utils' => 'oBxArtificerUtils'
+        ));
+
         $this->_iLogoHeight = 40;
         $this->_iMarkHeight = 40;
 
@@ -44,8 +52,11 @@ class BxArtificerConfig extends BxBaseModTemplateConfig
         $this->_aThumbSizeByTemplate = [
             'unit_with_cover.html' => 'h-24 w-24' //--- 'ava' size
         ];
-        
-        
+    }
+
+    public function getColorScheme()
+    {
+        return getParam('bx_artificer_color_scheme');
     }
 
     public function getLogoParams()

+ 11 - 0
modules/boonex/artificer/classes/BxArtificerModule.php

@@ -42,6 +42,17 @@ class BxArtificerModule extends BxBaseModTemplateModule
         return $this->_oTemplate->getIncludeCssJs($sType);
     }
 
+    public function serviceGetOptionsColorScheme()
+    {
+        $aOptions = ['auto', 'light_only', 'dark_only'];
+
+        $aResult = [];
+        foreach($aOptions as $sOption)
+            $aResult[$sOption] = _t('_bx_artificer_stg_cpt_option_color_scheme_' . $sOption);
+
+        return $aResult;
+    }
+
     public function serviceGetSplashMarker($sName)
     {
         $sResult = '';

+ 3 - 0
modules/boonex/artificer/classes/BxArtificerTemplate.php

@@ -33,6 +33,9 @@ class BxArtificerTemplate extends BxBaseModGeneralTemplate
                 $this->addJs([
                     'utils.js'
                 ]);
+                $sResult .= $this->_oModule->_oTemplate->getJsCode('utils', [
+                    'sColorScheme' => $this->_oConfig->getColorScheme()
+                ]);
 
                 $sCss = trim(getParam($this->_oConfig->getName() . '_styles_custom'));
                 if(!empty($sCss))

+ 1 - 1
modules/boonex/artificer/data/template/bx_forum/unit_gallery.html

@@ -19,7 +19,7 @@
             </bx_if:no_thumb>
            
             <bx_if:meta>
-                <div class="bx-base-general-unit-meta flex grow-0 px-2">
+                <div class="bx-base-general-unit-meta flex grow-0 px-3">
                     <div class="inline-flex flex-wrap text-xs font-medium">
                         __meta__
                     </div>

+ 0 - 17
modules/boonex/artificer/data/template/bx_messenger/conference_call.html

@@ -1,17 +0,0 @@
-<div class="bx-messenger-conference-call" data-conferance="__id__">
-    <div class="bx-messenger-conference-call-title bx-def-font-h3">__title__</div>
-    <div class="bx-messenger-conference-call-thumb">
-        <img class="bx-def-round-corners rounded-full" src="__thumb__" />
-    </div>
-    <div class="bx-messenger-conference-call-buttons bx-def-font-large">
-       <a href="javascript:void(0);" onclick="oMessenger.onHangUp(this, __id__);">
-            <i class="sys-icon sys-colored phone-slash col-red1 bx-def-label"></i>
-       </a>
-        <a href="javascript:void(0);" onclick="oMessenger.getCall(this, __id__, '__room__', true);">
-            <i class="sys-icon sys-colored phone col-green1 bx-def-label"></i>
-        </a>
-        <a href="javascript:void(0);" onclick="oMessenger.getCall(this, __id__, '__room__');">
-            <i class="sys-icon sys-colored video col-gray bx-def-label"></i>
-        </a>
-    </div>
-</div>

+ 0 - 23
modules/boonex/artificer/data/template/bx_messenger/css/admin.css

@@ -1,23 +0,0 @@
-@import url(../../../../../messenger/template/css/admin.css);
-
-#bx-content-main .bx-messenger-block.jots
-{
-	border-radius: inherit;
-	border-bottom: 0;
-	border-right: 0;
-	border-top: 0;
-}
-
-#bx-page-messenger .bx-layout-cell {
-	margin: 0;
-	padding: 0;
-}
-
-#bx-page-messenger .bx-page-block-container {
-	margin: 0;
-	padding: 0;
-}
-
-.bx-messenger-jots-snip-title {
-	padding-bottom: 0;
-}

+ 0 - 27
modules/boonex/artificer/data/template/bx_messenger/css/messenger.css

@@ -1,27 +0,0 @@
-@import url(../../../../../messenger/template/css/messenger.css);
-
-.bx-messenger-preview-lot div {
-	margin-top: 0;
-}
-
-.bx-messenger-jots-snip-info span.bubble {
-	position: relative;
-	border-radius: 1rem;
-	line-height: 1rem;
-	min-width: auto;
-	width: 1rem;
-	height: 1rem;
-	text-align: center;
-}
-
-.bx-messenger-history-arrow #unread-jots-counter {
-	padding:0;
-}
-
-#bx-messenger-add-users .ui.search.category.focus .ui.input {
-	line-height: inherit !important;
-}
-
-.bx-messenger-jots-snip-title div.status {
-	line-height: .825rem;
-}

+ 0 - 16
modules/boonex/artificer/data/template/bx_messenger/css/semantic-messenger.css

@@ -1,16 +0,0 @@
-@import url(../../../../../messenger/template/css/semantic-messenger.css);
-
-.ui.search > .results {
-	background: inherit;
-	border: inherit;
-	box-shadow: inherit;
-}
-
-.ui.category.search > .results .category > .name {
-	border: inherit;
-	background-color: inherit;
-}
-
-.ui.category.search > .results .category .results {
-	border: inherit;
-}

+ 0 - 14
modules/boonex/artificer/data/template/bx_messenger/css/video-conference.css

@@ -1,14 +0,0 @@
-@import url(../../../../../messenger/template/css/video-conference.css);
-
-.bx-messenger-jots-message-vc-participants img{
-	width: 1rem !important;
-	height: 1rem !important;
-}
-
-button.bx-messenger-jots-message-vc-join-button {
-	max-height: 1.25rem;
-}
-
-div.bx-messenger-conference-call .bx-messenger-conference-call-buttons i{
-	line-height: 1.5rem;
-}

+ 0 - 16
modules/boonex/artificer/data/template/bx_messenger/emoji-picker.html

@@ -1,16 +0,0 @@
-<div id="emoji-picker" class="bx-messenger-jot-emoji bx-popup bx-popup-color-bg bx-popup-border relative ring-1 ring-gray-200 dark:ring-gray-700 bg-white dark:bg-gray-800 rounded-md shadow">
-    <emoji-picker props-json='{
-                                "title":"__title__",
-                                "autoFocus":true,
-                                "set":"__set__",
-                                "native":__native__,
-                                "func":"__function__",
-                                "i18n":"__localization__",
-                                "perLine":8,
-                                "sheetSize":32,
-                                "showPreview":__preview__,
-                                "showSkinTones":__preview__,
-                                "defaultSkin":1
-                               }'>
-    </emoji-picker>
-</div>

+ 0 - 6
modules/boonex/artificer/data/template/bx_messenger/header_wrapper.html

@@ -1,6 +0,0 @@
-<div class="bx-db-header px-3 md:px-4 py-2 md:py-3">
-    <div class="bx-db-title lg:text-xl font-semibold text-gray-800 dark:text-gray-100 align-middle bx-messenger-users-edit">
-        __header__
-    </div>
-    <div class="bx-db-menu max-w-full flex items-stretch"></div>
-</div>

+ 0 - 34
modules/boonex/artificer/data/template/bx_messenger/history.html

@@ -1,34 +0,0 @@
-<div class="bx-messenger-table-wrapper-rows history">
-				<div class="bx-messenger-conversation-block-wrapper pushable">
-					<div class="ui right vertical sidebar very wide bx-def-color-bg-block files">
-						<div class="ui feed segment"></div>
-					</div>
-					<div class="pusher">
-						<div id="date-time-navigator" class="bx-messenger-date-time-navigator">
-							<div class="bx-messenger-date-time-value">
-								<span class="bx-def-label"></span>
-							</div>
-						</div>
-						<div class="bx-messenger-conversation-block">
-							__content__
-						</div>
-						<div id="bx-messenger-info-area">
-							<div class="bx-messenger-conversations-typing font-light bx-def-font-small text-xs">
-								<span></span><bx_text:_bx_messenger_typing_message />
-							</div>
-							<div class="bx-messenger-info-area-connecting font-light bx-def-font-small text-xs">
-								<bx_text:_bx_messenger_reconnecting_message /><span></span>
-							</div>
-							<div class="bx-messenger-info-area-connect-failed font-light bx-def-font-small text-xs">
-								<bx_text:_bx_messenger_reconnecting_failed />
-							</div>
-						</div>
-				  </div>
-				</div>
-			<div class="bx-messenger-area-scroll bx-def-border bx-def-color-bg-box-active " onclick="oMessenger.onScrollDown();">
-				<span class="bx-messenger-history-arrow text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100 rounded-full bg-gray-200 dark:bg-gray-700">
-					<span id="unread-jots-counter" class="bx-menu-item-addon bx-def-unit-alert bg-col-red2" style="display:__new_msg_active__">__unread_count__</span>
-					<i class="sys-icon chevron-down"></i>
-				</span>
-			</div>
-</div>

+ 0 - 48
modules/boonex/artificer/data/template/bx_messenger/jots.html

@@ -1,48 +0,0 @@
-<bx_repeat:jots>
-	<div class="bx-messenger-jots<bx_if:blink-jot> bx-messenger-blink-jot</bx_if:blink-jot>" data-id="__id__" __display__ data-new="__new__" data-my="__my__">
-		<div class="bx-messenger-jots-avatars bx-def-padding">
-			<a href="__url__" target="_blank">
-				<bx_if:avatars>
-					<img class="bx-def-thumb bx-def-thumb-size rounded-full flex items-center justify-center" title="__title__" src="__thumb__" />
-				</bx_if:avatars>
-				<bx_if:letters>
-					<p class="bx-def-thumb text-white bx-def-thumb-size rounded-full bx-base-pofile-unit-thumb bx-def-ava bx-def-box-sizing flex items-center justify-center" style="background-color:rgba(__color__)">__letter__</p>
-				</bx_if:letters>
-			</a>
-		</div>
-		<div class="bx-messenger-jots-info text-base">
-			<div class="bx-messenger-jots-title flex items-center justify-center">
-				<div class="title font-semibold text-sm" title="__title__">
-					__title__
-				</div>
-				<div class="time font-light bx-def-font-grayed text-xs">__time__</div>
-				<div class="view">__views__</div>
-				<bx_if:jot_menu>
-					<div class="bx-messenger-jots-actions-list">
-						<i class="bx-def-label sys-icon ellipsis-v rounded-full"></i>
-							__jot_menu__
-					</div>
-				</bx_if:jot_menu>
-			</div>
-			__reply__
-			<div class="bx-messenger-jots-message text-sm font-middle" __display_message__>__message____edit_icon__</div>
-			__attachment__
-			<bx_if:show_reactions_area>
-				<div class="bx-messenger-jot-reactions">
-					<bx_if:reactions>
-						__reactions__
-						<bx_if:reactions_menu>
-							<div class="bx-messenger-reactions-menu" style="display:__display__">
-								<span class="bx-messenger-reactions-menu-opened">
-									<a href="javascript:void(0);" title="<bx_text:_bx_messenger_reaction_jot />" onclick="oMessenger.onAddReaction(this, true);" class="reactions bx-def-label">
-										<i class="sys-icon smile-wink"></i>
-									</a>
-								</span>
-							</div>
-						</bx_if:reactions_menu>
-					</bx_if:reactions>
-				</div>
-			</bx_if:show_reactions_area>
-		</div>
-	</div>
-</bx_repeat:jots>

+ 0 - 38
modules/boonex/artificer/data/template/bx_messenger/lots_briefs.html

@@ -1,38 +0,0 @@
-<div class="bx-messenger-jots-snip" onclick="oMessenger.loadTalk(__id__);" data-lot="__id__">
-		<div class="bx-messenger-jots-snip-avatars bx-messenger-padding-lots-lefttopbottom">
-			<div class="bx-messenger-jots-snip-avatars-list bx-def-thumb bx-def-thumb-size rounded-full" >
-				<bx_repeat:avatars>
-					<bx_if:avatars>
-						<div>
-							<img title="__title__" src="__thumb__" class="bx-def-thumb-size flex items-center justify-center" />
-						</div>
-					</bx_if:avatars>
-					<bx_if:letters>
-						<div>
-							<p class="bx-def-thumb-size text-white bx-base-pofile-unit-thumb bx-def-ava bx-def-box-sizing flex items-center justify-center" style="background-color:rgba(__color__)">__letter__</p>
-						</div>
-					</bx_if:letters>
-				</bx_repeat:avatars>
-			</div>
-			__status__
-		</div>
-		<div class="bx-messenger-jots-snip-info bx-messenger-padding-lots-topbottom __class__ font-medium">
-			<div class="bx-messenger-jots-snip-title">
-				<div class="info"></div>
-				__number__
-				<div class="title text-sm font-semibold __title_class__">
-					__title__
-				</div>
-				<bx_if:show_time>
-					<div class="time font-light text-xs bx-def-font-grayed">__time__</div>
-				</bx_if:show_time>
-			</div>
-			<div class="bx-messenger-preview-lot __message_class__ bx-def-font-grayed">
-				<div>
-					<span>__sender_username__</span>
-					<span calss="text-sm">__message__</span>
-				</div>
-				<span class="bubble __bubble_class__ text-xs font-light bg-gray-200 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600">__count__</span>
-			</div>
-		</div>
-</div>

+ 0 - 29
modules/boonex/artificer/data/template/bx_messenger/lots_list.html

@@ -1,29 +0,0 @@
-<div class="bx-messenger-block bx-messenger-block-lots bx-def-color-bg-block ring-1 ring-gray-200 dark:ring-gray-800 bg-gray-50 dark:bg-gray-900 shadow-sm divide-y divide-gray-200 dark:divide-gray-800">
-	<div id="bx-messenger-block-head" class="bx-db-header px-3 md:px-4 py-2 md:py-3">
-	<div class="bx-db-title leading-6 font-semibold text-gray-800 dark:text-gray-100 align-middle">
-		<input 
-				class="bx-def-font-inputs"
-				id="items" 
-				title="__search_for_title__" 
-				onkeyup="oMessenger.searchByItems(this.value);" 
-				name="items" 
-				type="text" 
-				placeholder="<bx_text:_bx_messenger_title_search />">
-	</div>
-	<div class="bx-db-menu flex justify-end">
-			<a href="javascript:void(0);" onclick="oMessenger.showStarred(this);" title="__star_title__" class="px-1 flex justify-center items-center text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100">
-				<i class="sys-icon star"></i>
-			</a>
-			<bx_if:create>
-				<a href="javascript:void(0);" onclick="oMessenger.createLot();" title="__create_lot_title__" class="flex justify-center items-center text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100">
-					<i class="sys-icon edit"></i>
-				</a>
-			</bx_if:create>
-		</div>
-	</div>
-   <div class="bx-db-content bx-clearfix">
-		<div class="bx-messenger-items-list bx-def-border-block">
-				__items__
-		</div>	
-	</div>
-</div>

+ 0 - 10
modules/boonex/artificer/data/template/bx_messenger/menu_messenger_talk_header_hor.html

@@ -1,10 +0,0 @@
-<ul class="bx-menu-btns-icon-hor bx-messenger-block-menu-align-right bx-menu-object-__object__ bx-clearfix flex justify-end">
-    <bx_repeat:menu_items>
-        <li class="bx-menu-item bx-menu-item-more-auto __name__ __class_add__ pl-2 flex justify-center items-center text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100">
-            <a class="__name__ bx-def-margin-left" href="__link__" onclick="__onclick__" title="__title_attr__"__attrs__ data-value="__value__">
-                <bx_if:image><img style="background-image:url(__icon_url__)" src="<bx_icon_url:spacer.gif />" /></bx_if:image>
-                <bx_if:icon><i class="sys-icon __icon__"></i></bx_if:icon>
-            </a>
-        </li>
-    </bx_repeat:menu_items>
-</ul>

+ 0 - 12
modules/boonex/artificer/data/template/bx_messenger/popup-menu-item.html

@@ -1,12 +0,0 @@
-<ul class="bx-menu-custom bx-menu-custom-ver bx-menu-object-jot relative ring-1 ring-gray-200 dark:ring-gray-700 bg-white dark:bg-gray-800 rounded-md shadow">
-  <bx_repeat:menu>
-	  <li class="bx-menu-item bx-menu-item-item-stick lex justify-between items-center px-1 text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100 rounded-full text-base font-medium">
-		  <a class="flex flex-1 items-center py-2" href="javascript:void(0)" title="__title__" onclick="__click__">
-			  <div class="bx-menu-floating-blocks-icon flex items-center justify-center h-5 w-5">
-				  <i class="sys-icon __icon__ pr-1"></i>
-			  </div>
-			  <div class="bx-def-margin-sec-left-auto bx-def-unit h-5 flex items-center">__title__</div>
-		  </a>
-	  </li>
-  </bx_repeat:menu>
-</ul>

+ 0 - 15
modules/boonex/artificer/data/template/bx_messenger/repost.html

@@ -1,15 +0,0 @@
-<div class="bx-messenger-attachment-area bx-messenger-attachment">
-	<div class="bx-messenger-attachment-header max-w-full flex items-center">
-		<span class="bx-messenger-attachment-author-icon flex items-center pr-2">
-			<img class="bx-def-icon bx-def-icon-size rounded-full" title="__username__" src="__icon__" />
-		</span>
-		<span class="bx-messenger-attachment-author-username text-sm font-semibold">
-			__username__
-		</span>
-	</div>
-	<div class="bx-messenger-attachment-author-message">__message__</div>
-	<div class="bx-messenger-attachment-footer text-xs">
-		<span class="type">__message_type__</span>
-		<span class="date">__date__</span>
-	</div>
-</div>

+ 0 - 9
modules/boonex/artificer/data/template/bx_messenger/talk.html

@@ -1,9 +0,0 @@
-<div class="bx-messenger-block jots bx-db-container bx-def-color-bg-block bx-def-image-bg-block bx-shadow-block bx-def-border-block	max-w-full ring-1 ring-gray-200 dark:ring-gray-800 bg-gray-50 dark:bg-gray-900 shadow-sm divide-y divide-gray-200 dark:divide-gray-800">
-	__header__
-	<div class="bx-messenger-main-block bx-def-border-block">
-		<div class="bx-messenger-table-wrapper">
-			__history__
-			__text_area__
-		</div>
-	</div>
-</div>

+ 0 - 27
modules/boonex/artificer/data/template/bx_messenger/talk_edit_participants_list.html

@@ -1,27 +0,0 @@
-<div class="bx-messenger-right-column bx-form-input-autotoken bx-def-font-middle" id="bx-messenger-add-users">
-    <bx_repeat:participants_list>
-        <b class="bx-def-color-bg-hl bx-def-round-corners bx-def-font-middle">
-            <bx_if:avatars>
-                <img class="bx-def-thumb bx-def-thumb-size bx-def-margin-sec-right rounded-full flex items-center justify-center" src="__thumb__">
-            </bx_if:avatars>
-            <bx_if:letters>
-                 <p class="bx-def-thumb bx-def-thumb-size bx-base-pofile-unit-thumb bx-def-ava bx-def-box-sizing rounded-full flex items-center justify-center" style="background-color:rgba(__color__)">__letter__</p>
-            </bx_if:letters>
-            <span>__name__</span>
-            <input type="hidden" name="users[]" value="__id__">
-        </b>
-    </bx_repeat:participants_list>
-    <!-- Semantic begin -->
-    <div class="ui search dark:ring-gray-700 bg-white dark:bg-gray-800" style="float:left;">
-        <div class="ui input font-middle text-base border border-gray-300 dark:border-gray-700 pr-2 pl-2">
-            <input class="prompt bx-def-font-inputs text-gray-800 dark:text-gray-100 align-middle" type="text" placeholder="<bx_text:_bx_messenger_name_place_holder />" id="bx-messenger-add-users-input" autocomplete="off" autocapitalize="off" autocorrect="off">
-            <bx_if:edit_mode>
-                <a href="javascript:void(0);" onclick="oMessenger.onSaveParticipantsList(__lot__);" title="<bx_text:_bx_messenger_save_part_list />" class="text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100">
-                    <i class="sys-icon check-circle bx-def-font-large"></i>
-                </a>
-            </bx_if:edit_mode>
-        </div>
-        <div class="text-sm font-middle bx-popup bx-popup-color-bg bx-popup-border relative ring-1 ring-gray-200 rounded-md shadow results"></div>
-    </div>
-    <!-- Semantic end -->
-</div>

+ 0 - 8
modules/boonex/artificer/data/template/bx_messenger/talk_header.html

@@ -1,8 +0,0 @@
-<div class="bx-db-header px-3 md:px-4 py-2 md:py-3">
-    <div class="bx-db-title lg:text-xl font-semibold text-gray-800 dark:text-gray-100 align-middle">
-        __title__
-    </div>
-    <div class="bx-db-menu flex justify-end">
-        __buttons__
-    </div>
-</div>

+ 0 - 60
modules/boonex/artificer/data/template/bx_messenger/text_area.html

@@ -1,60 +0,0 @@
-<div class="bx-messenger-table-wrapper-rows text-area bx-def-hr">
-        <div class="bx-messenger-post-box bx-def-border-block">
-            <div class="bx-messenger-reply-area">
-                <span class="bx-messenger-reply-area-message text-sm bx-def-border-left" onclick="oMessenger.jumpToParentMessage();"></span>
-                <a href="javascript:void(0);" onclick="oMessenger.onCleanReplayArea();" class="font-medium">
-                    <i class="sys-icon times"></i>
-                </a>
-            </div>
-            <bx_if:text>
-				<div class="bx-messenger-post-box-set">
-                    <div class="bx-messenger-post-box-send-area">
-                        <div id="bx-messenger-message-box" class="bx-form-input-text bx-messenger-text-box font-middle w-full"></div>
-                    </div>
-                </div>
-            </bx_if:text>
-            <div class="bx-messenger-attachment-group">
-                <div class="bx-messenger-send-area-attachments"></div>
-            </div>
-            <div class="bx-messenger-post-box-send-actions">
-                <div class="bx-messenger-post-box-send-actions-items">
-                    <ul class="mt-4 mb-4">
-                        <bx_if:smiles>
-                            <li class="text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100">
-                                <a class="smiles" title="<bx_text:_bx_messenger_post_emoji />">
-                                    <i class="sys-icon smile"></i>
-                                </a>
-                            </li>
-                        </bx_if:smiles>
-                        <bx_if:recording>
-                            <li class="video text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100">
-                                <a title="<bx_text:_bx_messenger_send_recorded_video />" onclick="oMessenger.getVideoRecording();">
-                                    <i class="sys-icon file-video"></i>
-                                </a>
-                            </li>
-                        </bx_if:recording>
-                        <bx_if:files>
-                            <li class="text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100">
-                                <a title="<bx_text:_bx_messenger_post_attache_files />" class="attachefile">
-                                    <i class="sys-icon paperclip"></i>
-                                </a>
-                            </li>
-                        </bx_if:files>
-                        <bx_if:giphy>
-                            <li class="text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100">
-                                <a title="<bx_text:_bx_messenger_giphy_gifs_button />" id="bx-messenger-send-area-giphy">
-                                    <i class="sys-icon file-image"></i>
-                                </a>
-                            </li>
-                        </bx_if:giphy>
-                    </ul>
-                    <div class="bx-messenger-post-box-send-button">
-                        <a id="send-button" title="<bx_text:_bx_messenger_post_button_title />">
-                            <i class="sys-icon arrow-circle-up text-gray-500 dark:text-gray-300 hover:text-gray-800 dark:hover:text-gray-100"></i>
-                        </a>
-                    </div>
-                </div>
-            </div>
-        </div>
-        __giphy__
-</div>

+ 0 - 1
modules/boonex/artificer/data/template/bx_messenger/thumb_icon.html

@@ -1 +0,0 @@
-<img class="bx-def-thumb rounded-full bx-def-thumb-size text-white text-center bx-def-margin-sec-right flex items-center justify-center" src="{icon}" />

+ 0 - 1
modules/boonex/artificer/data/template/bx_messenger/thumb_letter.html

@@ -1 +0,0 @@
-<p class="bx-def-thumb bx-def-thumb-size rounded-full text-white text-center bx-base-pofile-unit-thumb bx-def-ava bx-def-box-sizing  flex items-center justify-center" style="background-color:rgba({color})">{letter}</p>

+ 0 - 15
modules/boonex/artificer/data/template/bx_messenger/vc_message.html

@@ -1,15 +0,0 @@
-<div class="bx-messenger-jots-message-vc">
-	<span class="text-xs">
-		__info__
-	</span>
-	<bx_if:part>
-		<span class="bx-messenger-jots-message-vc-participants">__participants__</span>
-	</bx_if:part>
-	<span>
-		<bx_if:join>
-			<button class="bx-btn bx-btn-small bx-messenger-jots-message-vc-join-button" onclick="oMessenger.onStartVideoCall(this, __id__, '__room__');">
-				<bx_text:_bx_messenger_jitsi_vc_join />
-			</button>
-		</bx_if:join>
-	</span>
-</div>

+ 0 - 3
modules/boonex/artificer/data/template/bx_messenger/viewed.html

@@ -1,3 +0,0 @@
-<bx_repeat:viewed>
-    <img data-viewer-id="__id__" title='__name__' class="bx-def-icon-size bx-def-icon rounded-xl" src="__icon__" />
-</bx_repeat:viewed>

+ 1 - 1
modules/boonex/artificer/data/template/bx_notifications/menu_preview.html

@@ -1,4 +1,4 @@
 <div class="bx-ntfs-preview bx-popup-width">
     <div class="bx-db-title pb-2"><bx_text:_bx_ntfs_menu_item_title_notifications /></div>
-    <div class="relative max-h-96 overflow-y-auto -mx-2 px-2 pt-2">__content__</div>
+    <div class="relative max-h-128 overflow-y-auto -mx-2 px-2 pt-2">__content__</div>
 </div>

+ 4 - 4
modules/boonex/artificer/data/template/bx_timeline/item_outline.html

@@ -11,17 +11,17 @@
                         </div>
                     </bx_repeat:notes>
                 </div>
-                <div class="__style_prefix__-in-divider  bx-def-hr mt-3 md:mt-4 lg:mt-4"></div>
+                <div class="__style_prefix__-in-divider  bx-def-hr mt-3 md:mt-4"></div>
             </bx_if:show_note>
             <div class="__style_prefix__-item-owner flex items-center px-3 md:px-4 mt-3 md:mt-4 __class_owner__"> 
                 <div class="__style_prefix__-owner-avatar flex-shrink-0">__item_owner_unit__</div>
                 <div class="__style_prefix__-owner-info ml-3">
-                    <div class="__style_prefix__-owner-name flex flex-wrap">
+                    <div class="__style_prefix__-owner-name flex flex-wrap items-center">
                         <a href="__item_owner_url__" class="__style_prefix__-owner-name bx-def-font-author mr-1 hover:text-gray-900 dark:hover:text-white whitespace-nowrap" title="__item_owner_title__">__item_owner_name__</a>
                         <bx_if:show_owner_actions>
                             <span class="__style_prefix__-owner-actions bx-def-font-meta">
                                 <bx_repeat:owner_actions>
-                                    <span class="__style_prefix__-oa-div mr-1">&#183;</span><a class="__style_prefix__-owner-action" href="__href__" onclick="__onclick__" title="__title__"><i class="sys-icon __icon__"></i></a>
+                                    <span class="__style_prefix__-oa-div mr-1">&#183;</span><a class="__style_prefix__-owner-action hover:underline" href="__href__" onclick="__onclick__" title="__title__"><i class="sys-icon __icon__"></i></a>
                                 </bx_repeat:owner_actions>
                             </span>
                         </bx_if:show_owner_actions>
@@ -37,7 +37,7 @@
                                 <bx_if:show_timeline_owner>
                                     <span class="mr-1"><bx_text:_bx_timeline_txt_to /></span> 
                                     <span class="__style_prefix__-timeline-owner-name mr-1">
-                                        <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>
+                                        <bx_repeat:owners><span class="__style_prefix__-ton-div">, </span><a href="__owner_url__" class="__style_prefix__-ton-item text-blue-600 dark:text-blue-500 font-semibold hover:underline">__owner_username__</a></bx_repeat:owners>
                                     </span> 
                                 </bx_if:show_timeline_owner>
                             </div>

+ 5 - 5
modules/boonex/artificer/data/template/bx_timeline/item_timeline.html

@@ -10,17 +10,17 @@
                     </div>
                 </bx_repeat:notes>
             </div>
-            <div class="__style_prefix__-in-divider bx-def-hr mt-3 md:mt-4 lg:mt-4"></div>
+            <div class="__style_prefix__-in-divider bx-def-hr mt-3 md:mt-4"></div>
         </bx_if:show_note>
         <div class="__style_prefix__-item-owner flex items-center px-3 md:px-4 mt-3 md:mt-4 __class_owner__"> 
             <div class="__style_prefix__-owner-avatar flex-shrink-0">__item_owner_unit__</div>
             <div class="__style_prefix__-owner-info ml-3">
-                <div class="__style_prefix__-owner-name flex flex-wrap">
-                    <a href="__item_owner_url__" class="__style_prefix__-owner-name bx-def-font-author mr-1 hover:text-gray-900 dark:hover:text-white whitespace-nowrap" title="__item_owner_title__">__item_owner_name__</a> 
+                <div class="__style_prefix__-owner-name flex flex-wrap items-center">
+                    <a href="__item_owner_url__" class="__style_prefix__-owner-name bx-def-font-author flex items-center mr-1 hover:text-gray-900 dark:hover:text-white whitespace-nowrap" title="__item_owner_title__">__item_owner_name__</a> 
                     <bx_if:show_owner_actions>
                         <span class="__style_prefix__-owner-actions bx-def-font-meta">
                             <bx_repeat:owner_actions>
-                                <span class="__style_prefix__-oa-div mr-1">&#183;</span><a class="__style_prefix__-owner-action" href="__href__" onclick="__onclick__">__content__</a>
+                                <span class="__style_prefix__-oa-div mr-1">&#183;</span><a class="__style_prefix__-owner-action hover:underline" href="__href__" onclick="__onclick__">__content__</a>
                             </bx_repeat:owner_actions>
                         </span>
                     </bx_if:show_owner_actions>
@@ -36,7 +36,7 @@
                             <bx_if:show_timeline_owner>
                                 <span class="mr-1"><bx_text:_bx_timeline_txt_to /></span> 
                                 <span class="__style_prefix__-timeline-owner-name mr-1">
-                                    <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>
+                                    <bx_repeat:owners><span class="__style_prefix__-ton-div">, </span><a href="__owner_url__" class="__style_prefix__-ton-item text-blue-600 dark:text-blue-500 font-semibold hover:underline">__owner_username__</a></bx_repeat:owners>
                                 </span> 
                             </bx_if:show_timeline_owner>
                         </div>

+ 0 - 6
modules/boonex/artificer/data/template/mod_groups/cover.html

@@ -1,11 +1,5 @@
 <div class="bx-menu-toolbar-padding pt-16">
     <div class="bx-base-pofile-cover-wrapper __class__ relative">
-        <div class="bx-base-pofile-cover-bg absolute top-0 left-0 w-full h-full dark:hidden">
-            <img src="<bx_image_url:cover-profile.svg />" class="object-cover h-full w-full" />
-        </div>
-        <div class="bx-base-pofile-cover-bg absolute top-0 left-0 w-full h-full hidden dark:block">
-            <img src="<bx_image_url:cover-profile-dark.svg />" class="object-cover h-full w-full" />
-        </div>
         <div class="bx-base-pofile-cover relative">
             <div class="bx-base-pofile-cover-image-wrp relative xl:px-4 overflow-hidden">
                 <div class="bx-base-pofile-cover-image bx-def-page-width relative mx-auto opacity-100 xl:rounded-b-lg <bx_if:show_cover_placeholder>bx-bpci-holder h-32 lg:h-32 bg-gradient-to-b from-green-400 to-green-500</bx_if:show_cover_placeholder><bx_if:show_cover>h-64 lg:h-80</bx_if:show_cover> __add_class__">

+ 0 - 6
modules/boonex/artificer/data/template/mod_profile/cover.html

@@ -1,11 +1,5 @@
 <div class="bx-menu-toolbar-padding pt-16">
     <div class="bx-base-pofile-cover-wrapper __class__ relative">
-        <div class="bx-base-pofile-cover-bg absolute top-0 left-0 w-full h-full dark:hidden">
-            <img src="<bx_image_url:cover-profile.svg />" class="object-cover h-full w-full" />
-        </div>
-        <div class="bx-base-pofile-cover-bg absolute top-0 left-0 w-full h-full hidden dark:block">
-            <img src="<bx_image_url:cover-profile-dark.svg />" class="object-cover h-full w-full" />
-        </div>
         <div class="bx-base-pofile-cover relative">
             <div class="bx-base-pofile-cover-image-wrp relative xl:px-4 overflow-hidden">
                 <div class="bx-base-pofile-cover-image bx-def-page-width relative mx-auto opacity-100 xl:rounded-b-lg <bx_if:show_cover_placeholder>bx-bpci-holder h-32 lg:h-32 bg-gradient-to-b from-blue-400 to-blue-500</bx_if:show_cover_placeholder><bx_if:show_cover>h-64 lg:h-80</bx_if:show_cover> __add_class__">

+ 1 - 7
modules/boonex/artificer/data/template/mod_profile/cover_block.html

@@ -1,12 +1,6 @@
 <div class="bx-base-profile-cover-block-wrapper">
     <div class="bx-base-pofile-cover-wrapper __class__ relative bg-gradient-to-b from-gray-100 to-white dark:from-black dark:to-gray-900 rounded-md">
-        <div class="bx-base-pofile-cover-bg absolute top-0 left-0 w-full h-full dark:hidden rounded-md overflow-hidden">
-            <img src="<bx_image_url:cover-profile.svg />" class="object-cover h-full w-full" />
-        </div>
-        <div class="bx-base-pofile-cover-bg absolute top-0 left-0 w-full h-full hidden dark:block rounded-md overflow-hidden">
-            <img src="<bx_image_url:cover-profile-dark.svg />" class="object-cover h-full w-full" />
-        </div>
-        <div class="bx-base-pofile-cover relative">
+        <div class="bx-base-pofile-cover relative"<bx_if:show_clickable> onclick="bx_click_area('__content_url__', event)"</bx_if:show_clickable>>
             <bx_if:show_cover>
                 <div class="bx-base-pofile-cover-image-wrp relative overflow-hidden">
                     <div class="bx-base-pofile-cover-image relative h-64 lg:h-40 max-w-7xl mx-auto opacity-100 bg-gradient-to-b from-blue-400 to-blue-500 rounded-t-md __add_class__">

+ 3 - 3
modules/boonex/artificer/data/template/mod_profile/css/main.css

@@ -156,15 +156,15 @@ p.bx-base-pofile-unit-thumb.bx-def-ava-big-size {
 
 
 /*--- Entry: Profile Cover ---*/
-.bx-base-pofile-cover-wrapper.bx-no-cover .bx-base-pofile-cover-bg  {
-    height: 50%;
-}
 .bx-base-pofile-cover-wrapper.bx-no-cover .bx-base-pofile-cover-info {
     padding-top: 1rem;
 }
 .bx-base-pofile-cover-wrapper.bx-no-cover .bx-base-pofile-ci-cnt {
     margin-top: 0;
 }
+.bx-base-pofile-cover-wrapper.bx-clickable .bx-base-pofile-cover {
+    cursor: pointer;
+}
 .bx-base-profile-cover-meta .bx-menu-custom.bx-menu-custom-hor {
     -webkit-align-items: center;
     align-items: center;

+ 0 - 12
modules/boonex/artificer/data/template/system/auth.html

@@ -1,12 +0,0 @@
-<div class="sys-auth-block __class_container__ grid gap-2 mb-4">
-    <bx_repeat:buttons>
-        <div class="sys-auth __class__ flex">
-            <a class="group inline-flex items-center justify-start w-full px-4 py-2 border border-gray-300 dark:border-gray-700 shadow-sm hover:shadow-md text-sm font-medium rounded-md text-gray-700 dark:text-gray-300 dark:hover:text-white hover:text-gray-800 bg-white dark:bg-gray-800 dark:hover:bg-gray-700 hover:bg-gray-50" href="__href__" <bx_if:show_onclick> onclick="__onclick__"</bx_if:show_onclick> title="__title_alt__">
-                <bx_if:show_icon>
-                    <span class="sys-auth-icon flex items-center justify-center h-5 w-5"><i class="sys-icon __icon__ sys-colored"></i></span>
-                </bx_if:show_icon>
-                <bx_if:show_title><span class="sys-auth-text ml-2 truncate">__title__</span></bx_if:show_title>
-            </a>
-        </div>
-    </bx_repeat:buttons>
-</div>

+ 0 - 17
modules/boonex/artificer/data/template/system/author.html

@@ -1,17 +0,0 @@
-<div class="sys-author-info flex justify-between items-center flex-wrap">
-    <div class="sys-author bx-def-unit absolute flex items-center">
-        <div class="bx-def-unit-img">__author_unit__</div>
-        <div class="bx-def-unit-info ml-4">
-            <div class="bx-def-unit-info-cnt bx-def-box-sizing">
-                <div class="bx-def-unit-line bx-def-font-author"><a class="bx-def-unit-info-title" href="__author_url__" title="__author_title_attr__">__author_title__</a></div>
-                <div class="bx-def-unit-line bx-def-font-meta">__author_desc__</div>
-            </div>
-        </div>
-    </div>
-    <div class="sys-author-profile py-1">__author_profile_desc__</div>
-</div>
-<bx_if:addon>
-    <div class="bx-def-margin-sec-top">
-        __content__
-    </div>
-</bx_if:addon>

+ 0 - 5
modules/boonex/artificer/data/template/system/author_desc.html

@@ -1,5 +0,0 @@
-<bx_repeat:items>
-    <span class="bx-def-ui-div bx-def-font-grayed">&nbsp;&#183;&nbsp;</span>
-    <bx_if:text><span class="bx-def-font-meta">__content__</span></bx_if:text>
-    <bx_if:link><a class="bx-def-font-meta bx-def-a-colored" href="__link__">__content__</a></bx_if:link>
-</bx_repeat:items>

+ 0 - 13
modules/boonex/artificer/data/template/system/css/auth.css

@@ -1,13 +0,0 @@
-/*--
-import url(../../../../../../../template/css/auth.css);
---*/
-
-.sys-auth.sys-auth-compact a {
-    -webkit-justify-content: center;
-    justify-content: center;
-}
-
-.sys-auth.sys-auth-compact .bx-btn {
-    margin-left: 0;
-    margin-right: 0;
-}

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

@@ -24,9 +24,6 @@ import url(../../../../../../../template/css/common.css);
 .bx-main.bx-pt-application .bx-menu-toolbar-padding {
     padding-top: 0;
 }
-.bx-main.bx-pt-application .bx-main-content .bx-main-column .bx-def-page-width {
-    width: 100%;
-}
 .bx-main.bx-pt-application .bx-main-column.narrow.bx-mc-narrowed .bx-mc-cnt {
     padding: 0;
 }

+ 0 - 17
modules/boonex/artificer/data/template/system/css/informer.css

@@ -1,17 +0,0 @@
-/*--
-import url(../../../../../../../template/css/informer.css);
---*/
-
-.bx-informer-icon {
-    display: none;
-    vertical-align: top;
-}
-.bx-informer-msg-info .bx-informer-icon-info {
-    display: inline-block;
-}
-.bx-informer-msg-alert .bx-informer-icon-alert {
-    display: inline-block;
-}
-.bx-informer-msg-error .bx-informer-icon-error {
-    display: inline-block;
-}

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

@@ -119,7 +119,7 @@ li.bx-mi-hidden {
     position: relative;
     padding: 0 0.25rem;
 }
-#bx-sliding-menu-account .bx-menu-account-popup-profile-switcher-link {
+#bx-sliding-menu-account .bx-menu-account-popup-profile-create {
     display: -webkit-flex;
     display: flex;
     -webkit-justify-content: center;

+ 0 - 1
modules/boonex/artificer/data/template/system/images/cover-profile-dark.svg

@@ -1 +0,0 @@
-            <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 1600 900'><rect fill='#111827' width='1600' height='900'/><defs><linearGradient id='g' gradientUnits='objectBoundingBox' x1='0' y1='1' x2='0' y2='0' gradientTransform='rotate(0,0.5,0.5)'><stop  offset='0' stop-color='#111827'/><stop  offset='1' stop-color='#374151'/></linearGradient><path fill='url(#g)' id='s' d='M-1-1v962.99c0 0 83-21.32 133.95 3.07c30.49 14.6 62.26 29.49 94.53 31.22c48.12 2.58 83.83-43.35 134.28-28.36c48.31 14.35 77.41 38.45 127.71 21.62c57.71-19.31 79.67-28.82 134.22-0.47c45.19 23.49 69.44-20.07 112.8-22.78c24.62-1.54 47.65 20.86 71.51 27.14c30.32 7.98 45.34-2.78 73.3-17.86c47.93-25.86 73.7 10.17 120.63 17.73c47.42 7.63 89.49-29.52 138.45-19.47c57.07 11.71 92.9 22.9 150.33 5.31c55.2-16.91 84.9-2.33 138.27 10.43c42.48 10.16 70.72-5.45 110.92-22.69c49.74-21.33 87.42-12.78 135.85 6.42c57.47 22.78 91.63 0.27 148.01-7.13c48.48-6.37 92.85 25.53 140.83 28.72c50.26 3.35 98.07-36.73 147.67-26.18c52.04 11.06 75.93 26.45 127.95 6.28c51.71-20.05 70.96 13.72 118.82 22.69c54.92 10.29 89.44-43.34 145.6-13.92c47.61 24.94 59.53-1.14 103.25-17.59c49-18.44 96.2 32.64 145.07 32c47.46-0.62 88.49-46.72 137.13-33.07c46.15 12.95 70.4 36.99 119.16 20.85c31.56-10.45 62.88-42.89 93.1-22.96C3157 999 3199 981.74 3199 981.74V-1H-1z'/></defs><g  stroke='#000000' stroke-width='0' stroke-opacity='1'><use href='#s' x='-11' y='0'/><use href='#s' x='-850' y='-150'/><use href='#s' x='-1200' y='-300'/><use href='#s' x='-144' y='-450'/><use href='#s' x='-1599' y='-600'/><use href='#s' x='-760' y='-750'/><use href='#s' x='-1336' y='-900'/></g></svg>          

+ 0 - 1
modules/boonex/artificer/data/template/system/images/cover-profile.svg

@@ -1 +0,0 @@
-              <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 1600 900'><rect fill='#ffffff' width='1600' height='900'/><defs><linearGradient id='g' gradientUnits='objectBoundingBox' x1='0' y1='1' x2='0' y2='0'><stop  offset='0' stop-color='#ffffff'/><stop  offset='1' stop-color='#D1D5DB'/></linearGradient><path fill='url(#g)' id='s' d='M-1-1v962.99c0 0 83-21.32 133.95 3.07c30.49 14.6 62.26 29.49 94.53 31.22c48.12 2.58 83.83-43.35 134.28-28.36c48.31 14.35 77.41 38.45 127.71 21.62c57.71-19.31 79.67-28.82 134.22-0.47c45.19 23.49 69.44-20.07 112.8-22.78c24.62-1.54 47.65 20.86 71.51 27.14c30.32 7.98 45.34-2.78 73.3-17.86c47.93-25.86 73.7 10.17 120.63 17.73c47.42 7.63 89.49-29.52 138.45-19.47c57.07 11.71 92.9 22.9 150.33 5.31c55.2-16.91 84.9-2.33 138.27 10.43c42.48 10.16 70.72-5.45 110.92-22.69c49.74-21.33 87.42-12.78 135.85 6.42c57.47 22.78 91.63 0.27 148.01-7.13c48.48-6.37 92.85 25.53 140.83 28.72c50.26 3.35 98.07-36.73 147.67-26.18c52.04 11.06 75.93 26.45 127.95 6.28c51.71-20.05 70.96 13.72 118.82 22.69c54.92 10.29 89.44-43.34 145.6-13.92c47.61 24.94 59.53-1.14 103.25-17.59c49-18.44 96.2 32.64 145.07 32c47.46-0.62 88.49-46.72 137.13-33.07c46.15 12.95 70.4 36.99 119.16 20.85c31.56-10.45 62.88-42.89 93.1-22.96C3157 999 3199 981.74 3199 981.74V-1H-1z'/></defs><g  stroke='#E5E7EB' stroke-width='0' stroke-opacity='1'><use href='#s' x='-11' y='0'/><use href='#s' x='-850' y='-150'/><use href='#s' x='-1200' y='-300'/><use href='#s' x='-144' y='-450'/><use href='#s' x='-1599' y='-600'/><use href='#s' x='-760' y='-750'/><use href='#s' x='-1336' y='-900'/></g></svg>

+ 0 - 20
modules/boonex/artificer/data/template/system/informer.html

@@ -1,20 +0,0 @@
-<div class="bx-def-page-width mx-auto px-4 pt-4 box-border">
-    <div id="bx-informer">
-        <bx_repeat:messages>
-            <div id="__id__" class="bx-informer-msg __class__ flex items-center mt-4 first:mt-0 p-4 rounded-md">
-                <div class="flex-none w-5 h-5">
-                    <svg class="bx-informer-icon bx-informer-icon-info text-blue-400 h-5 w-5" x-description="Heroicon name: solid/information-circle" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
-                        <path fill-rule="evenodd" d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z" clip-rule="evenodd"></path>
-                    </svg>
-                    <svg class="bx-informer-icon bx-informer-icon-alert h-5 w-5 text-yellow-400" x-description="Heroicon name: solid/exclamation" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
-                        <path fill-rule="evenodd" d="M8.257 3.099c.765-1.36 2.722-1.36 3.486 0l5.58 9.92c.75 1.334-.213 2.98-1.742 2.98H4.42c-1.53 0-2.493-1.646-1.743-2.98l5.58-9.92zM11 13a1 1 0 11-2 0 1 1 0 012 0zm-1-8a1 1 0 00-1 1v3a1 1 0 002 0V6a1 1 0 00-1-1z" clip-rule="evenodd"></path>
-                    </svg>
-                    <svg class="bx-informer-icon bx-informer-icon-error h-5 w-5 text-red-400" x-description="Heroicon name: solid/x-circle" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
-                        <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd"></path>
-                    </svg>
-                </div>
-                <div class="ml-3 text-sm">__msg__</div>
-            </div>
-        </bx_repeat:messages>
-    </div>
-</div>

+ 3 - 12
modules/boonex/artificer/data/template/system/menu_account_popup.html

@@ -3,19 +3,10 @@
         <div class="bx-popup bx-popup-trans bx-popup-border bx-popup-color-bg">
             <div class="bx-popup-content relative">
                 <div class="bx-menu-account-popup bx-menu-object-__object__ pt-4">
-                    <div class="bx-menu-account-popup-profile bx-clearfix px-4">__active_profile__</div>
-                    <hr class="bx-def-hr" />
-                    <div class="bx-menu-account-popup-menu my-2">__menu_notifications__</div>
+                    <bx_repeat:menu_items>
+                        <div class="bx-menu-account-popup-__name__">__item__</div>
+                    </bx_repeat:menu_items>
                 </div>
-                <div class="bx-menu-account-popup-profile-switcher box-border">__profile_switcher__</div>
-                <bx_if:multiple_profiles_mode>
-                    <hr class="bx-def-hr" />
-                    <div class="bx-menu-account-popup-profile-switcher-link p-4">
-                        <a class="bx-btn w-full" href="__url_switch_profile__">
-                            <i class="sys-icon plus"></i><span class="pl-2"><bx_text:_sys_txt_my_profiles /></span>
-                        </a>
-                    </div>
-                </bx_if:multiple_profiles_mode>
             </div>
         </div>
     </div>

+ 0 - 13
modules/boonex/artificer/data/template/system/profile_avatar_switcher.html

@@ -1,13 +0,0 @@
-<div class="bx-profile-avatar-switcher">
-    <div class="bx-pas-cnt">
-        <div class="bx-pas-list">__profile_switcher__</div>
-        <bx_if:multiple_profiles_mode>
-            <hr class="bx-def-hr" />
-            <div class="bx-pas-list-link p-4">
-                <a class="bx-btn w-full justify-center" href="__url_switch_profile__">
-                    <i class="sys-icon plus"></i><span class="pl-2"><bx_text:_sys_txt_my_profiles /></span>
-                </a>
-            </div>
-        </bx_if:multiple_profiles_mode>
-    </div>
-</div>

+ 9 - 9
modules/boonex/artificer/data/template/system/pt_application.html

@@ -7,10 +7,10 @@
             <div class="flex items-center justify-between">
                 <div class="flex flex-1 items-center justify-start">
                     <!-- Sidebar Toggler -->
-                    <button id="toggleSidebar" aria-expanded="true" aria-controls="sidebar" class="hidden p-2 mr-6 text-gray-600 rounded cursor-pointer lg:inline hover:text-gray-900 hover:bg-gray-100 dark:text-gray-400 dark:hover:text-white dark:hover:bg-gray-700">
+                    <button id="toggleSidebar" aria-expanded="true" aria-controls="sidebar" class="hidden p-2 mr-6 text-gray-600 rounded cursor-pointer xl:inline hover:text-gray-900 hover:bg-gray-100 dark:text-gray-400 dark:hover:text-white dark:hover:bg-gray-700">
                       <svg class="w-6 h-6" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h6a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clip-rule="evenodd"></path></svg>
                     </button>
-                    <button id="toggleSidebarMobile" aria-expanded="true" aria-controls="sidebar" class="p-2 mr-2 text-gray-600 rounded cursor-pointer lg:hidden hover:text-gray-900 hover:bg-gray-100 focus:bg-gray-100 dark:focus:bg-gray-700 focus:ring-2 focus:ring-gray-100 dark:focus:ring-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">
+                    <button id="toggleSidebarMobile" aria-expanded="true" aria-controls="sidebar" class="p-2 mr-2 text-gray-600 rounded cursor-pointer xl:hidden hover:text-gray-900 hover:bg-gray-100 focus:bg-gray-100 dark:focus:bg-gray-700 focus:ring-2 focus:ring-gray-100 dark:focus:ring-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white">
                       <svg id="toggleSidebarMobileHamburger" class="w-6 h-6" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h6a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clip-rule="evenodd"></path></svg>
                       <svg id="toggleSidebarMobileClose" class="hidden w-6 h-6" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path></svg>
                     </button>
@@ -22,17 +22,17 @@
                             <bx_injection:injection_logo_after />
                         </div>
                         <!-- Menu -->
-                        <div class="bx-toolbar-item bx-ti-menu flex-2 hidden lg:block w-64 ml-4">
+                        <div class="bx-toolbar-item bx-ti-menu flex-2 hidden xl:block w-64 ml-4">
                             <div id="bx-menu-toolbar-1-container" class="bx-toolbar-item bx-ti-menu w-full">
                                 <bx_menu:sys_application />
                             </div>
                         </div>
                         <!-- Search -->
                         <div class="bx-toolbar-item bx-ti-search flex flex-1 items-center justify-end">
-                            <div class="bx-ti-search-box flex items-start md:min-w-88 mr-2 bg-white dark:bg-gray-800 rounded-md shadow-lg lg:shadow-none hidden lg:block">
+                            <div class="bx-ti-search-box flex items-start md:min-w-88 mr-2 bg-white dark:bg-gray-800 rounded-md shadow-lg xl:shadow-none hidden xl:block">
                                 <div class="relative w-full">__sys_site_search__</div>
                             </div>
-                            <div class="bx-ti-search-button group relative inline-flex lg:hidden items-center mx-2 text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 text-base font-medium leading-6 border border-transparent hover:border-gray-200/50 active:border-gray-300 dark:hover:border-gray-700/50 dark:active:border-gray-700 bg-gray-100 dark:bg-gray-700/50 active:bg-gray-300 dark:active:bg-black/50 hover:bg-gray-200/50 dark:hover:bg-gray-700/50 rounded-full">
+                            <div class="bx-ti-search-button group relative inline-flex xl:hidden items-center mx-2 text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 text-base font-medium leading-6 border border-transparent hover:border-gray-200/50 active:border-gray-300 dark:hover:border-gray-700/50 dark:active:border-gray-700 bg-gray-100 dark:bg-gray-700/50 active:bg-gray-300 dark:active:bg-black/50 hover:bg-gray-200/50 dark:hover:bg-gray-700/50 rounded-full">
                                 <a href="javascript:void(0)" onclick="javascript:bx_site_search_show(this)">
                                     <span class="relative flex items-center justify-center h-8 w-8 md:h-10 md:w-10">
                                         <bx_image_auto:search />
@@ -53,14 +53,14 @@
 
     <div class="bx-main-content flex pt-16 overflow-hidden">
         <!-- BEG: Sidebar -->
-        <aside id="sidebar" class="bx-main-column narrow fixed top-0 left-0 z-20 flex flex-col flex-shrink-0 hidden w-64 h-full pt-16 duration-75 lg:flex transition-width" aria-label="Sidebar">
+        <aside id="sidebar" class="bx-main-column narrow fixed top-0 left-0 z-20 hidden xl:flex flex-col flex-shrink-0 w-64 h-full pt-16 duration-75 transition-width" aria-label="Sidebar">
             <div class="bx-mc-border relative flex flex-col flex-1 min-h-0 pt-0 bg-white border-r border-gray-200 dark:bg-gray-800 dark:border-gray-700">
                 <div class="flex flex-col flex-1 py-2 overflow-y-auto">
                     <div class="bx-mc-cnt flex-1 px-4 space-y-1 bg-white divide-y divide-gray-200 dark:bg-gray-800 dark:divide-gray-700">
                         <bx_menu:sys_site_panel />
                     </div>
                 </div>
-                <div class="absolute bottom-0 left-0 justify-center hidden w-full p-4 space-x-4 lg:flex" sidebar-bottom-menu>
+                <div class="absolute bottom-0 left-0 justify-center hidden w-full p-4 space-x-4 xl:flex" sidebar-bottom-menu>
                     <!-- Some button based menu may be here -->
                 </div>
             </div>
@@ -69,7 +69,7 @@
         <!-- END: Sidebar -->    
 
         <!-- BEG: Main Content -->
-        <div id="main-content" class="bx-main-column wide relative w-full h-full overflow-y-auto lg:ml-64">
+        <div id="main-content" class="bx-main-column wide relative w-full h-full overflow-y-auto xl:ml-64">
             <main>
                 <bx_injection:injection_between_cover_logo />
                 __cover__
@@ -86,7 +86,7 @@
                     </div>
                 </div>
                 <bx_injection:injection_between_content_menu />
-                <div id="bx-content-wrapper">
+                <div id="bx-content-wrapper" class="bx-def-page-width mx-auto">
                     __informer__
                     <div class="bx-page-wrapper mx-auto px-3 md:px-4 lg:px-6 box-border">
                         <div id="bx-content-container" class="bx-content-container">

+ 2 - 2
modules/boonex/artificer/data/template/system/scripts/BxTemplCmtsMenuUnitMeta.php

@@ -25,12 +25,12 @@ class BxTemplCmtsMenuUnitMeta extends BxBaseCmtsMenuUnitMeta
         if(!empty($sAuthorLink))
             $sResult = $this->getUnitMetaItemLink($sAuthorName, array(
                 'href' => $sAuthorLink,
-                'class' => $this->_sStylePrefix . '-username whitespace-nowrap hover:underline text-gray-700 dark:text-gray-200 hover:text-gray-900 dark:hover:text-white font-semibold',
+                'class' => $this->_sStylePrefix . '-username bx-def-font-author whitespace-nowrap hover:underline',
                 'title' => bx_html_attribute($sAuthorName),
             )). $sAuthorBadges;
         else
             $sResult = $this->getUnitMetaItemText($sAuthorName, array(
-                'class' => $this->_sStylePrefix . '-username whitespace-nowrap text-gray-700 dark:text-gray-200 font-semibold'
+                'class' => $this->_sStylePrefix . '-username bx-def-font-author whitespace-nowrap'
             )). $sAuthorBadges;
 
         return $sResult;

+ 8 - 0
modules/boonex/artificer/data/template/system/scripts/BxTemplFunctions.php

@@ -11,9 +11,13 @@ bx_import('BxDolDesigns');
 
 class BxTemplFunctions extends BxBaseFunctions
 {
+    protected $_sModule;
+
     public function __construct($oTemplate = null)
     {
         parent::__construct($oTemplate);
+
+        $this->_sModule = 'bx_artificer';
     }
 
     function getMainLogo($aParams = array())
@@ -200,6 +204,10 @@ class BxTemplFunctions extends BxBaseFunctions
             $sSwitcher = $aSwitcher['content'];
 
         return $this->_oTemplate->parsePageByName('sidebar_account.html', [
+            'bx_if:color_scheme_switcher' => [
+                'condition' => BxDolModule::getInstance($this->_sModule)->_oConfig->getColorScheme() == 'auto',
+                'content' => []
+            ],
             'active_profile' => $oProfile->getUnit(),
             'menu_notifications' => BxDolMenu::getObjectInstance('sys_account_notifications')->getCode(),
             'profile_switcher' => $sSwitcher,

+ 1 - 1
modules/boonex/artificer/data/template/system/scripts/BxTemplMenuAccountNotifications.php

@@ -27,7 +27,7 @@ class BxTemplMenuAccountNotifications extends BxBaseMenuAccountNotifications
         switch ($a['name']) {
             case 'add-content':
                 if(isset($a['onclick']))
-                    $a['onclick'] = str_replace(['bx_menu_slide_inline', 'bx-menu-toolbar-item-add-content'], ['bx_artificer_add_content_panel', 'bx-menu-toolbar-item-account'], $a['onclick']);
+                    $a['onclick'] = str_replace(['bx_menu_slide_inline', 'bx-menu-toolbar-item-add-content'], ['oBxArtificerUtils.getAddContentMenu', 'bx-menu-toolbar-item-account'], $a['onclick']);
                 break;
         }
 

+ 40 - 38
modules/boonex/artificer/data/template/system/sidebar_account.html

@@ -11,45 +11,47 @@
             </button>
         </div>
         <div class="bx-sb-profile flex-shrink-0 px-4 pb-4 flex justify-between items-center">__active_profile__
-            <div class="bx-sb-theme-switcher">
-                <a class="hover:no-underline" href="javascript:" onclick="bx_artificer_get_color_scheme_menu()"><i class="sys-icon desktop"></i></a>
+            <bx_if:color_scheme_switcher>
+                <div class="bx-sb-theme-switcher">
+                    <a class="hover:no-underline" href="javascript:" onclick="oBxArtificerUtils.getColorSchemeMenu()"><i class="sys-icon desktop"></i></a>
+                </div>
+            </bx_if:color_scheme_switcher>
+            <div id="bx-sb-theme-switcher-menu" class="bx-popup-wrapper bx-popup-responsive bx-popup-trans-wrapper box-border"  style="display: none">
+                <div class="bx-popup-gap mx-4 my-px">
+                    <div class="bx-popup bx-popup-trans bx-popup-border bx-popup-color-bg">
+                        <div class="bx-popup-content overflow-hidden">
+                            <div class="bx-menu-item-more-popup w-full md:w-56 box-border">		
+                                <ul class="bx-menu-custom bx-menu-custom-ver bx-menu-submenu-more-auto bx-clearfix">
+                                    <li class="bx-menu-item bx-menu-item-albums-home  rounded-md bx-def-color-bg-hl-hover" >
+                                        <a href="javascript:" onclick="oBxArtificerUtils.setColorScheme(1)" class="bx-stl-mil group">
+                                            <div class="bx-menu-item-icon bx-menu-floating-blocks-icon bx-stl-mii group-hover:text-gray-700 dark:group-hover:text-gray-300">
+                                                <i class="sys-icon sun"></i>
+                                            </div>
+                                            <div class="bx-menu-item-title bx-menu-floating-blocks-title bx-stl-mit whitespace-nowrap"><bx_text:_bx_artificer_txt_color_scheme_light /></div>
+                                        </a>
+                                    </li>
+                                    <li class="bx-menu-item bx-menu-item-groups-home  rounded-md bx-def-color-bg-hl-hover">
+                                        <a href="javascript:" onclick="oBxArtificerUtils.setColorScheme(2)" onclick="" class="bx-stl-mil group">
+                                            <div class="bx-menu-item-icon bx-menu-floating-blocks-icon bx-stl-mii group-hover:text-gray-700 dark:group-hover:text-gray-300">
+                                                <i class="sys-icon moon"></i>
+                                            </div>
+                                            <div class="bx-menu-item-title bx-menu-floating-blocks-title bx-stl-mit whitespace-nowrap"><bx_text:_bx_artificer_txt_color_scheme_dark /></div>
+                                        </a>
+                                    </li>
+                                    <li class="bx-menu-item bx-menu-item-files-home  rounded-md bx-def-color-bg-hl-hover" >
+                                        <a href="javascript:" onclick="oBxArtificerUtils.setColorScheme(0)" onclick="" class="bx-stl-mil group">
+                                            <div class="bx-menu-item-icon bx-menu-floating-blocks-icon bx-stl-mii group-hover:text-gray-700 dark:group-hover:text-gray-300">
+                                                <i class="sys-icon desktop"></i>
+                                            </div>
+                                            <div class="bx-menu-item-title bx-menu-floating-blocks-title bx-stl-mit whitespace-nowrap"><bx_text:_bx_artificer_txt_color_scheme_system /></div>
+                                        </a>
+                                    </li>
+                                </ul>
+                            </div>
+                        </div>
+                    </div>
+                </div>
             </div>
-			<div id="bx-sb-theme-switcher-menu" class="bx-popup-wrapper bx-popup-responsive bx-popup-trans-wrapper box-border"  style="display: none">
-				<div class="bx-popup-gap mx-4 my-px">
-        			<div class="bx-popup bx-popup-trans bx-popup-border bx-popup-color-bg">
-            			<div class="bx-popup-content overflow-hidden">
-							<div class="bx-menu-item-more-popup w-full md:w-56 box-border">		
-								<ul class="bx-menu-custom bx-menu-custom-ver bx-menu-submenu-more-auto bx-clearfix">
-									<li class="bx-menu-item bx-menu-item-albums-home  rounded-md bx-def-color-bg-hl-hover" >
-										<a href="javascript:" onclick="bx_artificer_set_color_scheme(1)" class="bx-stl-mil group">
-											<div class="bx-menu-item-icon bx-menu-floating-blocks-icon bx-stl-mii group-hover:text-gray-700 dark:group-hover:text-gray-300">
-												<i class="sys-icon sun"></i>
-											</div>
-											<div class="bx-menu-item-title bx-menu-floating-blocks-title bx-stl-mit whitespace-nowrap"><bx_text:_bx_artificer_txt_color_scheme_light /></div>
-										</a>
-									</li>
-									<li class="bx-menu-item bx-menu-item-groups-home  rounded-md bx-def-color-bg-hl-hover">
-										<a href="javascript:" onclick="bx_artificer_set_color_scheme(2)" onclick="" class="bx-stl-mil group">
-											<div class="bx-menu-item-icon bx-menu-floating-blocks-icon bx-stl-mii group-hover:text-gray-700 dark:group-hover:text-gray-300">
-												<i class="sys-icon moon"></i>
-											</div>
-											<div class="bx-menu-item-title bx-menu-floating-blocks-title bx-stl-mit whitespace-nowrap"><bx_text:_bx_artificer_txt_color_scheme_dark /></div>
-										</a>
-									</li>
-									<li class="bx-menu-item bx-menu-item-files-home  rounded-md bx-def-color-bg-hl-hover" >
-										<a href="javascript:" onclick="bx_artificer_set_color_scheme(0)" onclick="" class="bx-stl-mil group">
-											<div class="bx-menu-item-icon bx-menu-floating-blocks-icon bx-stl-mii group-hover:text-gray-700 dark:group-hover:text-gray-300">
-												<i class="sys-icon desktop"></i>
-											</div>
-											<div class="bx-menu-item-title bx-menu-floating-blocks-title bx-stl-mit whitespace-nowrap"><bx_text:_bx_artificer_txt_color_scheme_system /></div>
-										</a>
-									</li>
-								</ul>
-							</div>
-						</div>
-					</div>
-				</div>
-			</div>
         </div>
         <hr class="bx-def-hr" />
         <div class="bx-sb-menu flex-1 my-2">__menu_notifications__</div>

+ 5 - 1
modules/boonex/artificer/install/langs/en.xml

@@ -9,11 +9,15 @@
     <string name="_bx_artificer_stg_cpt_option_switcher_name"><![CDATA[Name in Template Switcher]]></string>	
     <string name="_bx_artificer_stg_cpt_option_page_width"><![CDATA[Page Width]]></string>
     <string name="_bx_artificer_stg_cpt_option_header_stretched"><![CDATA[Stretched Header]]></string>
+    <string name="_bx_artificer_stg_cpt_option_color_scheme"><![CDATA[Color Scheme]]></string>
+    <string name="_bx_artificer_stg_cpt_option_color_scheme_auto"><![CDATA[Auto with switcher]]></string>
+    <string name="_bx_artificer_stg_cpt_option_color_scheme_light_only"><![CDATA[Light mode only]]></string>
+    <string name="_bx_artificer_stg_cpt_option_color_scheme_dark_only"><![CDATA[Dark mode only]]></string>
 
     <string name="_bx_artificer_stg_cpt_category_styles_custom"><![CDATA[Custom Styles]]></string>
     <string name="_bx_artificer_stg_cpt_option_styles_custom"><![CDATA[Custom Styles]]></string>
     <string name="_bx_artificer_stg_cpt_option_images_custom"><![CDATA[Custom Images]]></string>
-    <string name="_bx_artificer_stg_cpt_option_images_custom_inf"><![CDATA[Each line represents an image. Line format: <b>name</b> => <b>value</b> => <b>type</b> => <b>class</b><br />Where <b>type</b> and/or <b>class</b> may be omitted. Available types are <b>ic</b> - icon (Font Awesome), <b>im</b> - image (file name or URL), <b>sc</b> - source code (SVG).]]></string>
+    <string name="_bx_artificer_stg_cpt_option_images_custom_inf"><![CDATA[Each line represents an image. Line format: <b>name</b> => <b>value</b> => <b>type</b> => <b>class</b><br />Where <b>type</b> and/or <b>class</b> may be omitted. Available types are <b>ic</b> - icon (Font Awesome), <b>im</b> - image (file name or URL), <b>sc</b> - source code (SVG).<br />Don't forget to clear template cache (if it's enabled) to see the changes.]]></string>
 
     <!-- Pages -->
     <string name="_bx_artificer_page_block_title_splash"><![CDATA[Splash]]></string>

+ 2 - 1
modules/boonex/artificer/install/sql/install.sql

@@ -14,7 +14,8 @@ SET @iCategoryId = LAST_INSERT_ID();
 INSERT INTO `sys_options`(`category_id`, `name`, `caption`, `value`, `type`, `extra`, `check`, `check_error`, `order`) VALUES
 (@iCategoryId, CONCAT(@sName, '_switcher_title'), '_bx_artificer_stg_cpt_option_switcher_name', 'Artificer', 'digit', '', '', '', 1), 
 (@iCategoryId, CONCAT(@sName, '_page_width'), '_bx_artificer_stg_cpt_option_page_width', '1280', 'digit', '', '', '', 2),
-(@iCategoryId, CONCAT(@sName, '_header_stretched'), '_bx_artificer_stg_cpt_option_header_stretched', '', 'checkbox', '', '', '', 3);
+(@iCategoryId, CONCAT(@sName, '_header_stretched'), '_bx_artificer_stg_cpt_option_header_stretched', '', 'checkbox', '', '', '', 3),
+(@iCategoryId, CONCAT(@sName, '_color_scheme'), '_bx_artificer_stg_cpt_option_color_scheme', 'auto', 'select', 'a:2:{s:6:"module";s:12:"bx_artificer";s:6:"method";s:24:"get_options_color_scheme";}', '', '', 4);
 
 -- SETTINGS: Artificer template Custom Styles
 INSERT INTO `sys_options_categories`(`type_id`, `name`, `caption`, `order`) VALUES 

+ 12 - 12
modules/boonex/artificer/js/sidebar.js

@@ -8,14 +8,14 @@ const toggleSidebar = (sidebarEl, expand, setExpanded = false) => {
     if (expand) {
         sidebarEl.classList.remove('bx-mc-narrowed');
         sidebarEl.classList.add('bx-mc-expanded');
-        sidebarEl.classList.add('lg:w-64');
-        sidebarEl.classList.remove('lg:w-16');
-        mainContentEl.classList.add('lg:ml-64');
-        mainContentEl.classList.remove('lg:ml-16');
+        sidebarEl.classList.add('xl:w-64');
+        sidebarEl.classList.remove('xl:w-16');
+        mainContentEl.classList.add('xl:ml-64');
+        mainContentEl.classList.remove('xl:ml-16');
 
         document.querySelectorAll('#' + sidebarEl.getAttribute('id') + ' [sidebar-toggle-item]').forEach(sidebarToggleEl => {
-            sidebarToggleEl.classList.remove('lg:hidden');
-            sidebarToggleEl.classList.remove('lg:absolute');
+            sidebarToggleEl.classList.remove('xl:hidden');
+            sidebarToggleEl.classList.remove('xl:absolute');
             sidebarToggleEl.classList.remove('bx-mpi-toggle-hidden');
         });
 
@@ -34,13 +34,13 @@ const toggleSidebar = (sidebarEl, expand, setExpanded = false) => {
     else {
         sidebarEl.classList.add('bx-mc-narrowed');
         sidebarEl.classList.remove('bx-mc-expanded');
-        sidebarEl.classList.remove('lg:w-64');
-        sidebarEl.classList.add('lg:w-16');
-        mainContentEl.classList.remove('lg:ml-64');
-        mainContentEl.classList.add('lg:ml-16');
+        sidebarEl.classList.remove('xl:w-64');
+        sidebarEl.classList.add('xl:w-16');
+        mainContentEl.classList.remove('xl:ml-64');
+        mainContentEl.classList.add('xl:ml-16');
         document.querySelectorAll('#' + sidebarEl.getAttribute('id') + ' [sidebar-toggle-item]').forEach(sidebarToggleEl => {
-            sidebarToggleEl.classList.add('lg:hidden');
-            sidebarToggleEl.classList.add('lg:absolute');
+            sidebarToggleEl.classList.add('xl:hidden');
+            sidebarToggleEl.classList.add('xl:absolute');
             sidebarToggleEl.classList.add('bx-mpi-toggle-hidden');
         });
 

+ 65 - 32
modules/boonex/artificer/js/utils.js

@@ -1,47 +1,82 @@
-//for custom JS
-$(document).ready(function() {
-    bx_artificer_set_color_scheme_icon();
-});
+function BxArtificerUtils(oOptions)
+{
+    this._sActionUri = oOptions.sActionUri;
+    this._sActionUrl = oOptions.sActionUrl;
+    this._sObject = oOptions.sObject;
+    this._aHtmlIds = undefined == oOptions.aHtmlIds ? {} : oOptions.aHtmlIds;  
+    this._sColorScheme = undefined == oOptions.sColorScheme ? 'auto' : oOptions.sColorScheme;
 
-function bx_artificer_set_color_scheme_html(){
-    if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) 
-        $('html').addClass('dark')
-    else
-        $('html').removeClass('dark')
+    this.init();
 }
 
-function bx_artificer_set_color_scheme_icon(){
-    if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
-        $('.bx-sb-theme-switcher .sys-icon').addClass('moon').removeClass('sun');
-    }
+BxArtificerUtils.prototype.init = function()
+{
+    var $this = this;
 
-    if (localStorage.theme === 'sun' || (!('theme' in localStorage) && !window.matchMedia('(prefers-color-scheme: dark)').matches)) {
-        $('.bx-sb-theme-switcher .sys-icon').addClass('sun').removeClass('moon');
-    }
-}
+    switch(this._sColorScheme) {
+        case 'auto':
+            window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
+                $this.setColorSchemeIcon();
+                $this.setColorSchemeHtml();
+            });
+            break;
+
+        case 'light_only':
+            this.setColorScheme(1);
+            break;
 
-window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
-    bx_artificer_set_color_scheme_icon();
-    bx_artificer_set_color_scheme_html();
-});
+        case 'dark_only':
+            this.setColorScheme(2);
+            break;
+    }    
 
-function bx_artificer_set_color_scheme(m){
-    switch (m) {
+    this.setColorSchemeHtml();
+
+    $(document).ready(function() {
+        $this.setColorSchemeIcon();
+    });
+};
+
+BxArtificerUtils.prototype.setColorScheme = function(iCode)
+{
+    switch(iCode) {
       case 0:
         localStorage.removeItem('theme');
         break;
+
       case 1:
         localStorage.theme = 'sun'
         break;
+
       case 2:
         localStorage.theme = 'dark'
         break;
     }
-    bx_artificer_set_color_scheme_icon();
-    bx_artificer_set_color_scheme_html();
-}
 
-function bx_artificer_get_color_scheme_menu(){
+    this.setColorSchemeIcon();
+    this.setColorSchemeHtml();
+};
+
+BxArtificerUtils.prototype.setColorSchemeHtml = function()
+{
+    if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) 
+        $('html').addClass('dark')
+    else
+        $('html').removeClass('dark')
+};
+
+BxArtificerUtils.prototype.setColorSchemeIcon = function() 
+{
+    if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        $('.bx-sb-theme-switcher .sys-icon').addClass('moon').removeClass('sun');
+    }
+
+    if (localStorage.theme === 'sun' || (!('theme' in localStorage) && !window.matchMedia('(prefers-color-scheme: dark)').matches)) {
+        $('.bx-sb-theme-switcher .sys-icon').addClass('sun').removeClass('moon');
+    }
+};
+
+BxArtificerUtils.prototype.getColorSchemeMenu = function() {
     $('#bx-sb-theme-switcher-menu').dolPopup({
         pointer: {
             el: $('.bx-sb-theme-switcher')
@@ -49,9 +84,9 @@ function bx_artificer_get_color_scheme_menu(){
         moveToDocRoot: true,
         cssClass: 'bx-popup-menu'
     });
-}
+};
 
-function bx_artificer_add_content_panel(sMenu, e, sPosition) {
+BxArtificerUtils.prototype.getAddContentMenu = function(sMenu, e, sPosition) {
     $('.bx-popup-applied:visible').dolPopupHide();
 
     var sSidebar = 'account';
@@ -59,6 +94,4 @@ function bx_artificer_add_content_panel(sMenu, e, sPosition) {
         bx_sidebar_toggle(sSidebar);
 
     bx_menu_popup_inline(sMenu, e, {});
-}
-
-bx_artificer_set_color_scheme_html();
+};

+ 1 - 0
modules/boonex/azure_b2c_con/classes/BxAzrB2CConfig.php

@@ -45,6 +45,7 @@ class BxAzrB2CConfig extends BxBaseModConnectConfig
         $this -> sProfilesModule = getParam('bx_azrb2c_module');
         $this -> isAlwaysConfirmEmail = (bool)getParam('bx_azrb2c_confirm_email'); 
         $this -> isAlwaysAutoApprove = (bool)getParam('bx_azrb2c_approve');
+        $this -> bSendPasswordGenerated = false;
 
         $this -> sPageStart = BX_DOL_URL_ROOT . $this -> getBaseUri() . 'start';
         $this -> sPageHandle = BX_DOL_URL_ROOT . $this -> getBaseUri() . 'handle';

+ 39 - 3
modules/boonex/azure_b2c_con/classes/BxAzrB2CModule.php

@@ -19,6 +19,7 @@ use Alancting\Microsoft\JWT\AzureAd\AzureAdIdTokenJWT;
 /**
  * This Azude AD connect code was created with instructions from:
  * https://docs.microsoft.com/en-us/azure/active-directory/develop/msal-b2c-overview#supported-app-types-and-scenarios
+ * 
  * https://www.sipponen.com/archives/4024
  * And official docs:
  * https://docs.microsoft.com/en-us/azure/active-directory-b2c/add-web-api-application?tabs=app-reg-ga
@@ -28,6 +29,8 @@ use Alancting\Microsoft\JWT\AzureAd\AzureAdIdTokenJWT;
  * https://docs.microsoft.com/en-us/azure/active-directory/manage-apps/configure-user-consent?tabs=azure-portal
  * https://docs.microsoft.com/en-us/azure/active-directory-b2c/openid-connect
  * https://docs.microsoft.com/en-us/azure/active-directory-b2c/tokens-overview
+ *
+ * https://docs.microsoft.com/en-us/azure/active-directory-b2c/microsoft-graph-get-started?tabs=app-reg-ga
  */
 class BxAzrB2CModule extends BxBaseModConnectModule
 {
@@ -70,7 +73,7 @@ class BxAzrB2CModule extends BxBaseModConnectModule
 
             $sBaseUrl = "https://" . $this->_oConfig->sDomain . "/" . $this->_oConfig->sTenant . "/" . $this->_oConfig->sPolicy;//B2C_1_login_una";
             $sUrl = bx_append_url_params($sBaseUrl . "/oauth2/v2.0/authorize", [
-                // 'state' => $this->_genToken(), // This at least semi-random string is likely good enough as state identifier
+                //'state' => $this->_genToken(), // This at least semi-random string is likely good enough as state identifier
                 'scope' => $this->_oConfig->sScope, 
                 'response_type' => 'code',
                 'response_mode' => 'query',
@@ -121,7 +124,6 @@ class BxAzrB2CModule extends BxBaseModConnectModule
 
         $sIdToken = $aAuthData['id_token'];
 
-
         // parse token to get the data
         // 
         // to make library to with B2C correctly please comment out the following lines in 
@@ -145,11 +147,45 @@ class BxAzrB2CModule extends BxBaseModConnectModule
             'id' => $oIdTokenJWT->get('oid'),
             'name' => $oIdTokenJWT->get('given_name'),
             'last_name' => $oIdTokenJWT->get('family_name'),
-            'email' => reset($oIdTokenJWT->get('emails')),
+            'email' => @reset($oIdTokenJWT->get('emails')),
         ];
 
         $aRemoteProfileInfo = $aUserData;
 
+
+        if (getParam('bx_azrb2c_group')) {
+            // get access token to call MS Graph API
+            $s = bx_file_get_contents("https://login.microsoftonline.com/" . $this->_oConfig->sTenantID . "/oauth2/v2.0/token", [
+                'grant_type'    => 'client_credentials',//'authorization_code',
+                'client_id'     => $this->_oConfig->sClientID,
+                'scope'         => "https://graph.microsoft.com/.default",
+                'client_secret' => $this->_oConfig->sSecret,
+            ], 'post', array ('Content-Type: application/x-www-form-urlencoded'));
+            $aAuthData2 = $this->_decodeResponseAndHandleError($s);
+
+            // call MS Graph API
+            $bMemberOfGroup = false;
+            if (isset($aAuthData2['access_token'])) {
+                $sBaseUrl = "https://graph.microsoft.com/v1.0/users/" . $oIdTokenJWT->get('oid') . "/memberOf";
+                $s = bx_file_get_contents($sBaseUrl, [], 'GET', array ('Authorization: Bearer ' . $aAuthData2['access_token']));
+                $aUserGroups = $this->_decodeResponseAndHandleError($s);
+                if (isset($aUserGroups['value'])) {
+                    foreach ($aUserGroups['value'] as $r) {
+                        if (getParam('bx_azrb2c_group') == $r['displayName']) {
+                            $bMemberOfGroup = true;
+                            break;
+                        }
+                    }
+                }
+            }
+
+            if (!$bMemberOfGroup) {
+                $this->_oTemplate->getPage(_t('_Error'), MsgBox(_t("_bx_azrb2c_error_not_member_of_group")));
+                exit;
+            }
+        }
+
+
         if ($aRemoteProfileInfo) {
 
             // check if user logged in before

+ 3 - 0
modules/boonex/azure_b2c_con/install/langs/en.xml

@@ -17,6 +17,7 @@
         
         </p>]]></string>
 	<string name="_bx_azrb2c_profile_error_api_keys"><![CDATA[Please configure the module in admin panel (can't define Client ID & Secret)]]></string>
+	<string name="_bx_azrb2c_error_not_member_of_group"><![CDATA[Sorry, you aren't allowed to join]]></string>
 	<string name="_bx_azrb2c_auth_title"><![CDATA[Login with Azure AD B2C]]></string>
 
     <string name="_bx_azrb2c_adm_stg_cpt_type"><![CDATA[Azure AD B2C Connect]]></string>
@@ -26,6 +27,7 @@
     <string name="_bx_azrb2c_option_tenant_id"><![CDATA[Directory (Tenant) ID]]></string>
     <string name="_bx_azrb2c_option_client_id"><![CDATA[Application (Client) ID]]></string>
     <string name="_bx_azrb2c_option_secret"><![CDATA[Client Secret Value]]></string>
+    <string name="_bx_azrb2c_option_group"><![CDATA[Allow to join/login only for members of this group]]></string>
 
 	<string name="_bx_azrb2c_et_password_generated"><![CDATA[Azure AD B2C connect temporary password]]></string>
 	<string name="_bx_azrb2c_et_password_generated_subject"><![CDATA[Temporary password]]></string>
@@ -34,3 +36,4 @@
 <p>Change it after logging-in.</p>
 {email_footer}]]></string>
 </resources>
+

+ 3 - 2
modules/boonex/azure_b2c_con/install/sql/enable.sql

@@ -40,9 +40,10 @@ INSERT INTO `sys_options` (`name`, `value`, `category_id`, `caption`, `type`, `c
 ('bx_azrb2c_secret', '', @iCategId, '_bx_azrb2c_option_secret', 'digit', '', '', 24, ''),
 ('bx_azrb2c_redirect_page', 'index', @iCategId, '_sys_connect_option_redirect', 'select', '', '', 40, 'join,settings,dashboard,index'),
 ('bx_azrb2c_module', 'bx_persons', @iCategId, '_sys_connect_option_module', 'select', '', '', 50, 'a:2:{s:6:"module";s:9:"bx_azrb2c";s:6:"method";s:20:"get_profiles_modules";}'),
-('bx_azrb2c_privacy', '3', @iCategId, '_sys_connect_option_privacy', 'select', '', '', 54, 'a:2:{s:6:"module";s:12:"bx_azrb2c";s:6:"method";s:18:"get_privacy_groups";}'),
+('bx_azrb2c_privacy', '3', @iCategId, '_sys_connect_option_privacy', 'select', '', '', 54, 'a:2:{s:6:"module";s:9:"bx_azrb2c";s:6:"method";s:18:"get_privacy_groups";}'),
 ('bx_azrb2c_confirm_email', 'on', @iCategId, '_sys_connect_option_confirm_email', 'checkbox', '', '', 70, ''),
-('bx_azrb2c_approve', '', @iCategId, '_sys_connect_option_approve', 'checkbox', '', '', 80, '');
+('bx_azrb2c_approve', '', @iCategId, '_sys_connect_option_approve', 'checkbox', '', '', 80, ''),
+('bx_azrb2c_group', '', @iCategId, 'bx_azrb2c_option_group', 'digit', '', '', 90, '');
 
 -- Pages
 

+ 2 - 2
modules/boonex/credits/classes/BxCreditsModule.php

@@ -828,8 +828,8 @@ class BxCreditsModule extends BxBaseModGeneralModule
         if($fAmount > $fAmountAvail)
             return ['code' => 1, 'msg' => '_bx_credits_err_low_balance'];
 
-        $oProfile = BxDolProfile::getInstance($iProfileId);
-        if(!$oProfile)
+        $oProfile = null;
+        if(!$iProfileId || !($oProfile = BxDolProfile::getInstance($iProfileId)))
             return ['code' => 2, 'msg' => '_bx_credits_err_profile_not_found'];
 
         $sOrder = $this->_oConfig->getOrder();

+ 1 - 0
modules/boonex/credits/install/langs/en.xml

@@ -55,6 +55,7 @@
     <string name="_bx_credits_form_credit_input_result"><![CDATA[Result]]></string>
     <string name="_bx_credits_form_credit_input_sys_amount"><![CDATA[Amount]]></string>
     <string name="_bx_credits_form_credit_input_amount"><![CDATA[Amount]]></string>
+    <string name="_bx_credits_form_credit_input_amount_err"><![CDATA[This field is essential. Please fill it in.]]></string>
     <string name="_bx_credits_form_credit_input_sys_message"><![CDATA[Message]]></string>
     <string name="_bx_credits_form_credit_input_message"><![CDATA[Message]]></string>
     <string name="_bx_credits_form_credit_input_message_inf_g"><![CDATA[]]></string>

+ 1 - 5
modules/boonex/decorous/data/template/system/css/auth.css

@@ -1,5 +1 @@
-@import url(../../../../../../../template/css/auth.css);
-
-.sys-auth .bx-btn {
-    border: none !important;
-}
+@import url(../../../../../../../template/css/auth.css);

+ 23 - 20
modules/boonex/decorous/data/template/system/css/menu.less

@@ -50,6 +50,12 @@
         background-size: 60% 60%;
     }
 
+    /*--- Sliding Menu ---*/
+    .bx-sliding-menu, .bx-sliding-menu-main {
+        left: auto !important;
+        right: 0 !important;
+        max-width: 31.25rem;
+    }
 
     /*--- Account Popup ---*/	
     #bx-sliding-menu-account.bx-sliding-menu-main.bx-sliding-menu-fullheight {
@@ -58,34 +64,31 @@
 
 
     /*--- Account Popup Submenu & Add Content Menu ---*/
-    .bx-menu-account-popup-profile,
-    .bx-menu-account-popup-menu {
+    .bx-menu-account-popup-profile-active,
+    .bx-menu-account-popup-profile-notifications {
         text-align: left;
     }
-    .bx-menu-account-popup-menu ul.bx-menu-floating-blocks-wide,
+    .bx-menu-account-popup-profile-notifications ul.bx-menu-floating-blocks-wide,
     .bx-menu-object-sys_account_notifications li,
     .bx-menu-object-sys_add_content li {
         display: block;
         width: 100%;
         height: auto;
     }
-    .bx-menu-object-sys_account_notifications li A,
-    .bx-menu-object-sys_add_content li A {
-        padding: 0.25rem 0.5rem;
-        line-height: 2rem;
-        height: 2rem;
-    }
-    .bx-menu-object-sys_account_notifications li .bx-menu-floating-blocks-icon,
-    .bx-menu-object-sys_account_notifications li .bx-menu-floating-blocks-title,
-    .bx-menu-object-sys_add_content li .bx-menu-floating-blocks-icon,
-    .bx-menu-object-sys_add_content li .bx-menu-floating-blocks-title {
-        display: inline-block;
-        vertical-align: middle;
-    }
     .bx-menu-object-sys_account_notifications li a,
-    .bx-menu-object-sys_account_notifications li .bx-menu-floating-blocks-title,
-    .bx-menu-object-sys_add_content li .bx-menu-floating-blocks-title {
-        line-height: 1.875rem;
+    .bx-menu-object-sys_add_content li a {
+        display: -webkit-flex;
+        display: flex;
+        -webkit-flex-flow: row nowrap;
+        flex-flow: row nowrap;
+        -webkit-align-items: center;
+        align-items: center;
+        -webkit-justify-content: flex-start;
+        justify-content: flex-start;
+
+        height: 2rem;        
+        padding: 0 0.5rem;
+        line-height: 2rem;
     }
     .bx-menu-object-sys_account_notifications li .bx-menu-floating-blocks-title,
     .bx-menu-object-sys_add_content li .bx-menu-floating-blocks-title {
@@ -115,6 +118,7 @@
         background-repeat: none;
         background-size: 60% 60%;
     }
+    .bx-menu-object-sys_account_notifications li .bx-def-unit-alert,
     .bx-menu-object-sys_account_notifications li .bx-def-unit-alert-middle {
         top: 4px;
         right: 4px;
@@ -332,7 +336,6 @@
 :where(.bx-media-tablet, .bx-media-desktop) .@{bx-root-class-name}{ 
     /*--- Account Popup ---*/
     #bx-sliding-menu-account.bx-sliding-menu-main {
-        width: auto !important;
         border-radius: 4px;
     }
 

+ 4 - 14
modules/boonex/decorous/data/template/system/menu_account_popup.html

@@ -1,20 +1,10 @@
-<div id="bx-sliding-menu-account" class="bx-sliding-menu-main bx-def-z-index-nav bx-def-color-bg-block bx-def-border-bottom bx-def-box-sizing bx-search-site" style="display:none; opacity:1;">
+<div id="bx-sliding-menu-account" class="bx-sliding-menu-main bx-sliding-menu-fullheight bx-def-z-index-nav bx-def-color-bg-block bx-def-border-bottom bx-def-box-sizing bx-search-site" style="display:none; opacity:1;">
     <div class="bx-sliding-menu-main-cnt">
         <a class="bx-sliding-menu-close bx-def-margin-sec-top bx-def-margin-right bx-def-font-h2" href="javascript:void(0);" onclick="bx_menu_slide_inline('#bx-sliding-menu-account')"><i class="sys-icon times"></i></a>
-
         <div class="bx-menu-account-popup bx-menu-object-__object__">
-            <div class="bx-menu-account-popup-profile bx-def-padding-sec-bottom bx-clearfix">__active_profile__</div>
-            <hr class="bx-def-hr" />
-            <div class="bx-menu-account-popup-menu">__menu_notifications__</div>     
+            <bx_repeat:menu_items>
+                <div class="bx-menu-account-popup-__name__">__item__</div>
+            </bx_repeat:menu_items>
         </div>
-        <div class="bx-menu-account-popup-profile-switcher bx-def-box-sizing">__profile_switcher__</div>
-        <bx_if:multiple_profiles_mode>
-            <hr class="bx-def-hr" />
-            <div class="bx-menu-account-popup-profile-switcher-link bx-def-padding">
-                <a class="bx-btn" href="__url_switch_profile__">
-                    <i class="sys-icon plus"></i><span class="bx-def-padding-sec-left"><bx_text:_sys_txt_my_profiles /></span>
-                </a>
-            </div>
-        </bx_if:multiple_profiles_mode>
     </div>
 </div>

+ 15 - 14
modules/boonex/editor/js/editor.js

@@ -94,15 +94,21 @@ function bx_ex_editor_init(oEditor, oParams)
         inlineToolbar: oParams.toolbar_inline.concat(['mention']),
         tools: oTools,
         onReady: () => {
-            if ($(oParams.selector).val() != '')
-                oEditor.blocks.renderFromHTML($(oParams.selector).val());
+            if ($(oParams.selector).val() != ''){
+               
+                const doc = new DOMParser().parseFromString($(oParams.selector).val(), "text/html");
+                var a = doc.getElementsByClassName('bx-embed-link');
+                Array.prototype.forEach.call(a, function(i) {
+                    i.innerHTML = i.getAttribute('source');
+                });
+                
+                oEditor.blocks.renderFromHTML(doc.documentElement.getElementsByTagName('body')[0].innerHTML);
+            }
         },
         onChange:() =>{
-            
             oEditor.save().then((savedData) =>{
                 const edjsParser = edjsHTML({embedblock: bx_ex_editor_custom_parser_embedblock});
                 oData = edjsParser.parse(savedData);
-                console.log(oData);
                 var s ='';
                 oData.forEach(function(item){
                     s += item;
@@ -121,7 +127,7 @@ function bx_ex_editor_init(oEditor, oParams)
             {
                 selectTemplate: function(item) {
                     if (this.range.isContentEditable(this.current.element)) {
-                        return ('<a class="bx-menthion-link" dchar="@" data-profile-id="' + item.original.value + '" href="' + item.original.url + '">@' + item.original.label + '</a>');
+                        return ('<a class="bx-mention-link" dchar="@" data-profile-id="' + item.original.value + '" href="' + item.original.url + '">@' + item.original.label + '</a>');
                     }
                     return "@" + item.original.value;
                 },
@@ -137,7 +143,7 @@ function bx_ex_editor_init(oEditor, oParams)
                 trigger: "#",
                 selectTemplate: function(item) {
                     if (this.range.isContentEditable(this.current.element)) {
-                        return ('<a class="bx-menthion-link" dchar="#" data-profile-id="' + item.original.value + '" href="' + item.original.url + '">#' + item.original.label + '</a>');
+                        return ('<a class="bx-mention-link" dchar="#" data-profile-id="' + item.original.value + '" href="' + item.original.url + '">#' + item.original.label + '</a>');
                     }
                     return "#" + item.original.value;
                 },
@@ -160,15 +166,13 @@ function bx_ex_editor_init(oEditor, oParams)
 function bx_ex_editor_custom_parser_embedblock(block)
 {
     if (block.data && block.data.source)
-        return '<div class="bx-embed-link" source="' + block.data.source + '">' + block.data.source + '</div>';
+        return '<div class="bx-embed-link" source="' + block.data.source + '"></div>';
 }
 
 var oLink ='';
 
 class BxEmbedBlock {
     constructor({ data, block }){
-         console.log('--!constructor');
-          console.log(data);
         this.blockAPI = block
 
         this.nodes = {
@@ -190,7 +194,6 @@ class BxEmbedBlock {
 
      render() {
         this.wrapper = document.createElement('p');
-       
         if (this.data && this.data.source){
             this._createEmbed(this.data.source);
             return this.wrapper;
@@ -206,9 +209,9 @@ class BxEmbedBlock {
         var oObj = document.createElement('div');
         oObj.setAttribute('source', sLink)
         oObj.className = 'bx-embed-link';
-        oObj.innerHTML = sLink;
         this.wrapper.removeChild(this.wrapper.querySelector('input'));
         this.wrapper.appendChild(oObj);
+        this.blockAPI.dispatchChange();
     }
     
      _createInput(){
@@ -225,7 +228,6 @@ class BxEmbedBlock {
    
     save(blockContent){
         const div = blockContent.querySelector('div');
-        console.log(div);
         if (div){
             return {
                 source: div.getAttribute('source')
@@ -240,7 +242,6 @@ class BxEmbedBlock {
     }
     
     onPaste(event) {
-        console.log(8);
         if (event.detail.data.attributes.source){
             var sSource = event.detail.data.attributes.source.nodeValue;
             this._createEmbed(sSource);
@@ -263,7 +264,7 @@ class BxEmbedBlock {
 class BxMention {
 
     static get CSS() {
-        return 'bx-menthion-link';
+        return 'bx-mention-link';
     };
 
     constructor({api}) {

+ 3 - 0
modules/boonex/editor/template/css/main.css

@@ -83,4 +83,7 @@
 }
 .dark .cdx-settings-button:hover {
     background-color: rgb(75 85 99);
+}
+.bx-form-input-html-editor{
+    height: auto !important;
 }

+ 10 - 3
modules/boonex/english/data/langs/system/en.xml

@@ -1681,6 +1681,7 @@
     <string name="_adm_stg_cpt_option_sys_quill_toolbar_full"><![CDATA[Quill buttons for full editor]]></string>
     <string name="_adm_stg_cpt_option_sys_metatags_hashtags_max"><![CDATA[Max number of hashtags per post]]></string>
     <string name="_adm_stg_cpt_option_sys_metatags_mentions_max"><![CDATA[Max number of mentions per post]]></string>
+    <string name="_adm_stg_cpt_option_sys_attach_links_max"><![CDATA[Max number of attached links per post (0 - no limit)]]></string>
     <string name="_adm_stg_cpt_option_sys_hide_post_to_context_for_privacy"><![CDATA[Hide post to context for modules in Privacy field]]></string>
     <string name="_adm_stg_cpt_option_sys_search_keyword_min_len"><![CDATA[Keyword min length in site search]]></string>
     <string name="_adm_stg_cpt_option_sys_profile_bot"><![CDATA[System bot profile]]></string>
@@ -2901,7 +2902,11 @@ If it is not enabled then please consider implement this optimization, since it
     <string name="_sys_menu_item_title_account_dashboard_reports"><![CDATA[Reports]]></string>
     <string name="_sys_menu_item_title_system_account_dashboard_audit"><![CDATA[Audit]]></string>
     <string name="_sys_menu_item_title_account_dashboard_audit"><![CDATA[Audit]]></string>
-  
+
+    <string name="_sys_menu_item_title_system_ap_profile_active"><![CDATA[Active Profile]]></string>
+    <string name="_sys_menu_item_title_system_ap_profile_notifications"><![CDATA[Notifications Menu]]></string>
+    <string name="_sys_menu_item_title_system_ap_profile_switcher"><![CDATA[Profile Switcher]]></string>
+    <string name="_sys_menu_item_title_system_ap_profile_create"><![CDATA[Create Profile]]></string>
     <string name="_sys_menu_item_title_system_account_settings"><![CDATA[Settings]]></string>
     <string name="_sys_menu_item_title_system_account_settings_delete"><![CDATA[Delete]]></string>
     <string name="_sys_menu_item_title_system_account_settings_email"><![CDATA[Email]]></string>
@@ -3002,7 +3007,8 @@ If it is not enabled then please consider implement this optimization, since it
     <string name="_sys_menu_set_title_account_dashboard"><![CDATA[Account Dashboard]]></string>
     <string name="_sys_menu_set_title_account_dashboard_manage_tools"><![CDATA[Account Dashboard Manage Tools]]></string>
     <string name="_sys_menu_set_title_account_settings"><![CDATA[Account Settings]]></string>
-    <string name="_sys_menu_set_title_account_notifications"><![CDATA[Notifications]]></string>
+    <string name="_sys_menu_set_title_account_popup"><![CDATA[Account Popup]]></string>
+    <string name="_sys_menu_set_title_account_notifications"><![CDATA[Account Notifications]]></string>
     <string name="_sys_menu_set_title_add_content"><![CDATA[Add Content]]></string>
     <string name="_sys_menu_set_title_dashboard_content_manage"><![CDATA[Content Manage]]></string>
     <string name="_sys_menu_set_title_dashboard_reports_manage"><![CDATA[Reports Manage]]></string>
@@ -3059,7 +3065,7 @@ If it is not enabled then please consider implement this optimization, since it
     <string name="_sys_menu_template_title_profile_stats"><![CDATA[Profile Stats Menu]]></string>
     <string name="_sys_menu_title_account_dashboard"><![CDATA[Account Dashboard Menu]]></string>
     <string name="_sys_menu_title_account_dashboard_manage_tools"><![CDATA[Account Dashboard Manage Tools Menu]]></string>
-    <string name="_sys_menu_title_account_notifications"><![CDATA[Notifications Items]]></string>
+    <string name="_sys_menu_title_account_notifications"><![CDATA[Account Notifications]]></string>
     <string name="_sys_menu_title_account_popup"><![CDATA[Account Popup]]></string>
     <string name="_sys_menu_title_account_settings"><![CDATA[Account Settings Menu]]></string>
     <string name="_sys_menu_title_add_content"><![CDATA[Add Content Menu]]></string>
@@ -3538,6 +3544,7 @@ If it is not enabled then please consider implement this optimization, since it
     <string name="_sys_txt_confirm_phone_set_phone_desc_phone_confirmation"><![CDATA[Please enter verification code from the SMS.]]></string>
 
     <string name="_sys_txt_create_post_placeholder"><![CDATA[Write here, {0}...]]></string>
+    <string name="_sys_txt_err_attach_links"><![CDATA[The maximum allowed number of attached links has been reached.]]></string>
 
     <string name="_sys_txt_current_picture"><![CDATA[Current Picture]]></string>
     <string name="_sys_txt_data_successfully_submitted"><![CDATA[Done]]></string>

+ 9 - 4
modules/boonex/events/classes/BxEventsFormEntry.php

@@ -15,7 +15,7 @@
 class BxEventsFormEntry extends BxBaseModGroupsFormEntry
 {
     protected static $_isCssJsEventsAdded = false;
-    
+
     protected $_iContentId = 0;
 
     public function __construct($aInfo, $oTemplate = false)
@@ -23,6 +23,8 @@ class BxEventsFormEntry extends BxBaseModGroupsFormEntry
         $this->MODULE = 'bx_events';
         parent::__construct($aInfo, $oTemplate);
 
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
         if (isset($this->aInputs['reoccurring'])) {
             $this->aInputs['reoccurring']['ghost_template'] = array (
                 
@@ -107,9 +109,12 @@ class BxEventsFormEntry extends BxBaseModGroupsFormEntry
             );
         }
 
-        if (isset($this->aInputs['timezone']) && !$this->aParams['view_mode']) {
-            $this->aInputs['timezone']['values'] = array_combine(timezone_identifiers_list(), timezone_identifiers_list());
-        }        
+        if (isset($this->aInputs[$CNF['FIELD_TIMEZONE']]) && !$this->aParams['view_mode']) {
+            $this->aInputs[$CNF['FIELD_TIMEZONE']]['values'] = array_combine(timezone_identifiers_list(), timezone_identifiers_list());
+        }
+
+        if(isset($this->aInputs[$CNF['FIELD_REMINDER']]) && !$this->_oModule->_oConfig->isInternalNotifications())
+            unset($this->aInputs[$CNF['FIELD_REMINDER']]);
     }
 
     function getCode($bDynamicMode = false)

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

@@ -303,18 +303,106 @@ class BxEventsModule extends BxBaseModGroupsModule implements iBxDolCalendarServ
      */
     public function serviceProcessReminders()
     {
+        $CNF = &$this->_oConfig->CNF;
+
         $iNow = time();
+        $bUseIn = $this->_oConfig->isInternalNotifications();
+        $sModule = $this->getName();
 
         // get all events for today and tomorrow, since the max reminder is 24 hours
         $aEntries = $this->_oDb->getEntriesByDate('@' . time(), '@' . (time() + 3600 * getParam('bx_events_reminder_interval')));
 
-        foreach ($aEntries as $a) {
-            if (!$a['reminder'])
+        foreach($aEntries as $aEntry) {
+            $aReminders = $bUseIn ? [$aEntry['reminder']] : [24, 1];
+            if(!$aReminders)
                 continue;
-            $iTimestamp = $a['start_utc'] - (3600 * $a['reminder']);
-            if ($iNow > ($iTimestamp - 3600) && $iNow < $iTimestamp)
-                $this->sendReminders($a);
+
+            $oEventProfile = BxDolProfile::getInstanceByContentAndType($aEntry[$CNF['FIELD_ID']], $sModule);
+            if(!$oEventProfile)
+                continue;
+
+            $iEventProfileId = $oEventProfile->id();
+            foreach($aReminders as $iReminder) {
+                $iTimestamp = $aEntry['start_utc'] - (3600 * $iReminder);
+                if($iNow <= ($iTimestamp - 3600) || $iNow >= $iTimestamp)
+                    continue;
+
+                if($bUseIn)
+                    $this->sendReminders($aEntry);
+
+                bx_alert($sModule, 'reminder', $aEntry[$CNF['FIELD_ID']], $iEventProfileId, array(
+                    'object_author_id' => $iEventProfileId,
+                    'reminder' => $iReminder
+                ));
+            }
+        }
+    }
+
+    public function serviceGetNotificationsData()
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        $aResults = parent::serviceGetNotificationsData();
+        
+        $sModule = $this->_aModule['name'];
+        $aSettingsTypes = ['follow_context'];
+
+        $aResults['handlers'] = array_merge($aResults['handlers'], [
+            ['group' => $sModule . '_reminder', 'type' => 'insert', 'alert_unit' => $sModule, 'alert_action' => 'reminder', 'module_name' => $sModule, 'module_method' => 'get_notifications_reminder', 'module_class' => 'Module', 'module_event_privacy' => $CNF['OBJECT_PRIVACY_VIEW_NOTIFICATION_EVENT']],
+        ]);
+
+        $aResults['settings'] = array_merge($aResults['settings'], [
+            ['group' => 'reminder', 'unit' => $sModule, 'action' => 'reminder', 'types' => $aSettingsTypes],
+        ]);
+
+        $aResults['alerts'] = array_merge($aResults['alerts'], [
+            ['unit' => $sModule, 'action' => 'reminder'],
+        ]);
+
+        return $aResults;
+    }
+
+    public function serviceGetNotificationsInsertData($oAlert, $aHandler, $aDataItems)
+    {
+        if($oAlert->sAction != 'reminder' || empty($aDataItems) || !is_array($aDataItems) || empty($oAlert->aExtras['reminder']))
+            return $aDataItems;
+
+        foreach($aDataItems as $iIndex => $aDataItem) {
+            $aContent = [];
+            if(!empty($aDataItem['content']))
+                $aContent = unserialize($aDataItem['content']);
+
+            $aContent['reminder'] = (int)$oAlert->aExtras['reminder'];
+
+            $aDataItems[$iIndex]['content'] = serialize($aContent);
         }
+
+        return $aDataItems;
+    }
+
+    public function serviceGetNotificationsReminder($aEvent)
+    {
+        $CNF = &$this->_oConfig->CNF;
+
+        if(!isset($aEvent['content']['reminder']))
+            return [];
+
+        $iContentId = (int)$aEvent['object_id'];
+        $oEventProfile = BxDolProfile::getInstanceByContentAndType((int)$iContentId, $this->getName());
+        if(!$oEventProfile)
+            return [];
+
+        $aContentInfo = $this->_oDb->getContentInfoById($iContentId);
+        if(empty($aContentInfo) || !is_array($aContentInfo))
+            return [];
+
+        return [
+            'entry_sample' => $CNF['T']['txt_sample_single'],
+            'entry_url' => str_replace(BX_DOL_URL_ROOT, '{bx_url_root}', $oEventProfile->getUrl()),
+            'entry_caption' => $oEventProfile->getDisplayName(),
+            'entry_author' => $oEventProfile->id(),
+            'lang_key' => '_bx_events_txt_ntfs_reminder_' . $aEvent['content']['reminder']
+        ];
     }
 
     /**

+ 5 - 1
modules/boonex/events/install/langs/en.xml

@@ -76,7 +76,7 @@
     <string name="_bx_events_form_profile_input_timezone"><![CDATA[Timezone]]></string>
     <string name="_bx_events_form_profile_input_sys_time"><![CDATA[Time]]></string>
     <string name="_bx_events_form_profile_input_time"><![CDATA[Time]]></string>
-    <string name="_bx_events_form_profile_input_sys_reminder"><![CDATA[Reminder]]></string>
+    <string name="_bx_events_form_profile_input_sys_reminder"><![CDATA[Reminder (part of Internal Notifications)]]></string>
     <string name="_bx_events_form_profile_input_reminder"><![CDATA[Reminder]]></string>
 
     <string name="_bx_events_form_input_repeat_year"><![CDATA[Repeat year]]></string>
@@ -442,8 +442,12 @@
     <string name="_bx_events_txt_ntfs_fan_added"><![CDATA[Event <b class="bx-ntfs-content-profile">{owner_name}</b> has got a member <b class="bx-ntfs-content-entry">{subentry_sample}</b>]]></string>
     <string name="_bx_events_alert_action_join_invitation_notif"><![CDATA[join invitation]]></string>
     <string name="_bx_events_alert_action_join_request"><![CDATA[join request]]></string>
+    <string name="_bx_events_alert_action_reminder"><![CDATA[reminder]]></string>
+    <string name="_bx_events_alert_action_reminder_follow_context"><![CDATA[New reminders]]></string>
     <string name="_bx_events_txt_ntfs_join_invitation"><![CDATA[<b class="bx-ntfs-content-profile">{owner_name}</b> event's representative invites <b class="bx-ntfs-content-entry">{subentry_sample}</b> to join event]]></string>
     <string name="_bx_events_txt_ntfs_join_request"><![CDATA[Event <b class="bx-ntfs-content-profile">{owner_name}</b> has a join request from <b class="bx-ntfs-content-entry">{subentry_sample}</b>]]></string>
+    <string name="_bx_events_txt_ntfs_reminder_1"><![CDATA[Event <b class="bx-ntfs-content-profile">{owner_name}</b> starts in an hour]]></string>
+    <string name="_bx_events_txt_ntfs_reminder_24"><![CDATA[Event <b class="bx-ntfs-content-profile">{owner_name}</b> starts in 24 hours]]></string>
     <string name="_bx_events_txt_ntfs_timeline_post_common"><![CDATA[New post <b class="bx-ntfs-content-entry">{subentry_sample}</b> in <b class="bx-ntfs-content-profile">{owner_name}</b> event timeline]]></string>
 
     <string name="_bx_events_privacy_group_closed"><![CDATA[Closed]]></string>

+ 1 - 6
modules/boonex/forum/classes/BxForumGrid.php

@@ -83,10 +83,9 @@ class BxForumGrid extends BxTemplGrid
         
         $this->_sFilter3Name = 'filter3';
         $this->_aFilter3Values = array(
-            BX_FORUM_FILTER_ORDER_RECENT => _t('_bx_forum_grid_filter_order_recent'),
+            BX_FORUM_FILTER_ORDER_RECENT => _t('_bx_forum_grid_filter_order_updated'),
             BX_FORUM_FILTER_ORDER_NEW => _t('_bx_forum_grid_filter_order_new'),
             BX_FORUM_FILTER_ORDER_TOP => _t('_bx_forum_grid_filter_order_top'),
-            BX_FORUM_FILTER_ORDER_UPDATED => _t('_bx_forum_grid_filter_order_updated'),
             BX_FORUM_FILTER_ORDER_POPULAR => _t('_bx_forum_grid_filter_order_popular'),
             BX_FORUM_FILTER_ORDER_FEATURED => _t('_bx_forum_grid_filter_order_featured'),
             BX_FORUM_FILTER_ORDER_FAVORITE => _t('_bx_forum_grid_filter_order_favorite'),
@@ -138,10 +137,6 @@ class BxForumGrid extends BxTemplGrid
                     $sField = 'featured';
                     break;
 
-                case 'updated':
-                    $sField = 'changed';
-                    break;
-
                 case 'latest':
                     $sField = 'lr_timestamp';
                     break;

+ 14 - 8
modules/boonex/forum/install/langs/en.xml

@@ -143,6 +143,8 @@
     <string name="_bx_forum_page_block_title_featured_entries"><![CDATA[Featured Discussions]]></string>
     <string name="_bx_forum_page_block_title_featured_entries_view_showcase"><![CDATA[Featured Discussions]]></string>
     <string name="_bx_forum_page_block_title_sys_featured_entries_view_showcase"><![CDATA[Featured Discussions (Showcase view)]]></string>
+    <string name="_bx_forum_page_block_title_featured_entries_view_gallery"><![CDATA[Featured Discussions (Gallery view)]]></string>
+    <string name="_bx_forum_page_block_title_featured_entries_view_extended"><![CDATA[Featured Discussions (Grid view)]]></string>
     
     <string name="_bx_forum_page_title_sys_entries_new"><![CDATA[New Discussions]]></string>
     <string name="_bx_forum_page_title_entries_new"><![CDATA[New Discussions]]></string>
@@ -153,18 +155,22 @@
     <string name="_bx_forum_page_title_sys_entries_updated"><![CDATA[Updated Discussions]]></string>
     <string name="_bx_forum_page_title_entries_updated"><![CDATA[Updated Discussions]]></string>
     <string name="_bx_forum_page_block_title_new_entries"><![CDATA[New Discussions]]></string>
-    <string name="_bx_forum_page_block_title_new_entries_view_extended"><![CDATA[New Discussions (Extended View)]]></string>
-    <string name="_bx_forum_page_block_title_new_entries_view_full"><![CDATA[New Discussions (Full View)]]></string>
+    <string name="_bx_forum_page_block_title_new_entries_view_extended"><![CDATA[New Discussions (Grid View)]]></string>
+    <string name="_bx_forum_page_block_title_new_entries_view_gallery"><![CDATA[New Discussions (Gallery View)]]></string>
+    <string name="_bx_forum_page_block_title_new_entries_view_showcase"><![CDATA[New Discussions (Showcase View)]]></string>
     <string name="_bx_forum_page_block_title_latest_entries"><![CDATA[Discussions With Recent Posts]]></string>
     <string name="_bx_forum_page_block_title_home"><![CDATA[Discussions List]]></string>
-    <string name="_bx_forum_page_block_title_latest_entries_view_extended"><![CDATA[Discussions With Recent Posts (Extended View)]]></string>
-    <string name="_bx_forum_page_block_title_latest_entries_view_full"><![CDATA[Discussions With Recent Posts (Full View)]]></string>
+    <string name="_bx_forum_page_block_title_latest_entries_view_extended"><![CDATA[Discussions With Recent Posts (Grid View)]]></string>
+    <string name="_bx_forum_page_block_title_latest_entries_view_gallery"><![CDATA[Discussions With Recent Posts (Gallery View)]]></string>
+    <string name="_bx_forum_page_block_title_latest_entries_view_showcase"><![CDATA[Discussions With Recent Posts (Showcase View)]]></string>
     <string name="_bx_forum_page_block_title_top_entries"><![CDATA[Top Discussions]]></string>
-    <string name="_bx_forum_page_block_title_top_entries_view_extended"><![CDATA[Top Discussions (Extended View)]]></string>
-    <string name="_bx_forum_page_block_title_top_entries_view_full"><![CDATA[Top Discussions (Full View)]]></string>
+    <string name="_bx_forum_page_block_title_top_entries_view_extended"><![CDATA[Top Discussions (Grid View)]]></string>
+    <string name="_bx_forum_page_block_title_top_entries_view_gallery"><![CDATA[Top Discussions (Gallery View)]]></string>
+    <string name="_bx_forum_page_block_title_top_entries_view_showcase"><![CDATA[Top Discussions (Showcase View)]]></string>
     <string name="_bx_forum_page_block_title_popular_entries"><![CDATA[Popular Discussions]]></string>
-    <string name="_bx_forum_page_block_title_popular_entries_view_extended"><![CDATA[Popular Discussions (Extended View)]]></string>
-    <string name="_bx_forum_page_block_title_popular_entries_view_full"><![CDATA[Popular Discussions (Full View)]]></string>
+    <string name="_bx_forum_page_block_title_popular_entries_view_extended"><![CDATA[Popular Discussions (Grid View)]]></string>
+    <string name="_bx_forum_page_block_title_popular_entries_view_showcase"><![CDATA[Popular Discussions (Showcase View)]]></string>
+    <string name="_bx_forum_page_block_title_popular_entries_view_gallery"><![CDATA[Popular Discussions (Gallery View)]]></string>
     <string name="_bx_forum_page_block_title_updated_entries"><![CDATA[Updated Discussions]]></string>
     <string name="_bx_forum_page_block_title_sys_favorites_entries"><![CDATA[Favorite List]]></string>
     <string name="_bx_forum_page_block_title_favorites_entries"><![CDATA["{title}" List]]></string>

+ 22 - 48
modules/boonex/forum/install/sql/enable.sql

@@ -67,42 +67,6 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_forum_view_entry', 2, @sName, '', '_bx_forum_page_block_title_entry_reports', 11, 2147483647, 'service', 'a:2:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:14:\"entity_reports\";}', 0, 0, 1, 6);
 
 
-
--- PAGE: new entries
-INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
-('bx_forum_new', '_bx_forum_page_title_sys_entries_new', '_bx_forum_page_title_entries_new', @sName, 5, 2147483647, 1, 'discussions-new', 'page.php?i=discussions-new', '', '', '', 0, 1, 0, 'BxForumPageBrowse', 'modules/boonex/forum/classes/BxForumPageBrowse.php');
-
-INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
-('bx_forum_new', 1, @sName, '_bx_forum_page_block_title_new_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:10:"browse_new";s:6:"params";a:1:{i:0;s:5:"table";}}', 0, 1, 1);
-
--- PAGE: top entries
-INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
-('bx_forum_top', '_bx_forum_page_title_sys_entries_top', '_bx_forum_page_title_entries_top', @sName, 5, 2147483647, 1, 'discussions-top', 'page.php?i=discussions-top', '', '', '', 0, 1, 0, 'BxForumPageBrowse', 'modules/boonex/forum/classes/BxForumPageBrowse.php');
-
-INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
-('bx_forum_top', 1, @sName, '_bx_forum_page_block_title_top_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:10:"browse_top";s:6:"params";a:1:{i:0;s:5:"table";}}', 0, 1, 1);
-
--- PAGE: popular entries
-INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
-('bx_forum_popular', '_bx_forum_page_title_sys_entries_popular', '_bx_forum_page_title_entries_popular', @sName, 5, 2147483647, 1, 'discussions-popular', 'page.php?i=discussions-popular', '', '', '', 0, 1, 0, 'BxForumPageBrowse', 'modules/boonex/forum/classes/BxForumPageBrowse.php');
-
-INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
-('bx_forum_popular', 1, @sName, '_bx_forum_page_block_title_popular_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:14:"browse_popular";s:6:"params";a:1:{i:0;s:5:"table";}}', 0, 1, 1);
-
--- PAGE: recently updated entries
-INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
-('bx_forum_updated', '_bx_forum_page_title_sys_entries_updated', '_bx_forum_page_title_entries_updated', @sName, 5, 2147483647, 1, 'discussions-updated', 'page.php?i=discussions-updated', '', '', '', 0, 1, 0, 'BxForumPageBrowse', 'modules/boonex/forum/classes/BxForumPageBrowse.php');
-
-INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
-('bx_forum_updated', 1, @sName, '_bx_forum_page_block_title_updated_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:14:"browse_updated";s:6:"params";a:1:{i:0;s:5:"table";}}', 0, 1, 1);
-
--- PAGE: recently updated entries
-INSERT INTO `sys_objects_page`(`object`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `uri`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 
-('bx_forum_partaken', '_bx_forum_page_title_sys_entries_partaken', '_bx_forum_page_title_entries_partaken', @sName, 5, 2147483647, 1, 'discussions-partaken', 'page.php?i=discussions-partaken', '', '', '', 0, 1, 0, 'BxForumPageBrowse', 'modules/boonex/forum/classes/BxForumPageBrowse.php');
-
-INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
-('bx_forum_partaken', 1, @sName, '_bx_forum_page_block_title_partaken_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:15:"browse_partaken";s:6:"params";a:1:{i:0;s:5:"table";}}', 0, 1, 1);
-
 -- PAGE: categories
 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_forum_categories', 'discussions-categories', '_bx_forum_page_title_sys_entries_categories', '_bx_forum_page_title_entries_categories', @sName, 5, 2147483647, 1, 'page.php?i=discussions-categories', '', '', '', 0, 1, 0, 'BxForumPageBrowse', 'modules/boonex/forum/classes/BxForumPageBrowse.php');
@@ -167,8 +131,6 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_forum_home', 2, @sName, '', '_bx_forum_page_block_title_popular_keywords', 11, 0, NULL, '', 0, '', 2147483647, 'service', 'a:4:{s:6:\"module\";s:6:\"system\";s:6:\"method\";s:14:\"keywords_cloud\";s:6:\"params\";a:3:{i:0;s:8:\"bx_forum\";i:1;s:8:\"bx_forum\";i:2;a:1:{s:9:\"menu_view\";b:1;}}s:5:\"class\";s:20:\"TemplServiceMetatags\";}', NULL, 0, 1, 1, 3),
 ('bx_forum_home', 2, @sName, '_bx_forum_page_block_title_popular_entries_view_extended', '_bx_forum_page_block_title_popular_entries', 11, 0, NULL, '', 0, '', 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:14:\"browse_popular\";s:6:\"params\";a:1:{i:0;s:8:\"extended\";}}', NULL, 0, 1, 1, 3);
 
-
-
 -- PAGE: module search
 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_forum_search', 'discussions-search', '_bx_forum_page_title_sys_entries_search', '_bx_forum_page_title_entries_search', @sName, 5, 2147483647, 1, 'page.php?i=discussions-search', '', '', '', 0, 1, 0, 'BxForumPageBrowse', 'modules/boonex/forum/classes/BxForumPageBrowse.php');
@@ -205,17 +167,29 @@ SET @iPBCellProfile = 2;
 INSERT INTO `sys_pages_blocks` (`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES
 ('trigger_page_profile_view_entry', @iPBCellProfile, @sName, '_bx_forum_page_block_title_sys_my_entries', '_bx_forum_page_block_title_my_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:13:"browse_author";s:6:"params";a:2:{i:0;s:12:"{profile_id}";i:1;a:1:{s:13:"empty_message";b:0;}}}', 0, 0, 0);
 
+
 -- PAGE: service blocks
-SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = '' AND `cell_id` = 0 ORDER BY `order` DESC LIMIT 1);
-INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
-('', 0, @sName, '_bx_forum_page_block_title_latest_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:13:"browse_latest";s:6:"params";a:3:{i:0;s:7:"gallery";i:1;b:1;i:2;b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
-('', 0, @sName, '_bx_forum_page_block_title_latest_entries_view_full', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:13:"browse_latest";s:6:"params";a:1:{i:0;s:4:"full";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 2),
-('', 0, @sName, '_bx_forum_page_block_title_new_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:10:"browse_new";s:6:"params";a:3:{i:0;s:7:"gallery";i:1;b:1;i:2;b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 3),
-('', 0, @sName, '_bx_forum_page_block_title_new_entries_view_full', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:10:"browse_new";s:6:"params";a:1:{i:0;s:4:"full";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 4),
-('', 0, @sName, '_bx_forum_page_block_title_top_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:10:"browse_top";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 5),
-('', 0, @sName, '_bx_forum_page_block_title_top_entries_view_full', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:10:"browse_top";s:6:"params";a:1:{i:0;s:4:"full";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 6),
-('', 0, @sName, '_bx_forum_page_block_title_popular_entries_view_extended', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:14:"browse_popular";s:6:"params";a:1:{i:0;s:8:"extended";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 7),
-('', 0, @sName, '_bx_forum_page_block_title_popular_entries_view_full', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:14:"browse_popular";s:6:"params";a:1:{i:0;s:4:"full";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 8);
+ SET @iBlockOrder = (SELECT `order` FROM `sys_pages_blocks` WHERE `object` = '' AND `cell_id` = 0 ORDER BY `order` DESC LIMIT 1);
+INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `title`, `designbox_id`, `visible_for_levels`, `type`, `content`, `deletable`, `copyable`, `order`) VALUES 
+('', 0, @sName, '_bx_forum_page_block_title_popular_entries_view_extended', '_bx_forum_page_block_title_popular_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:14:\"browse_popular\";s:6:\"params\";a:1:{i:0;s:8:\"extended\";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_popular_entries_view_showcase', '_bx_forum_page_block_title_popular_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:14:\"browse_popular\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_popular_entries_view_gallery', '_bx_forum_page_block_title_popular_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:14:\"browse_popular\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:7:\"gallery\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+
+('', 0, @sName, '_bx_forum_page_block_title_featured_entries_view_extended', '_bx_forum_page_block_title_featured_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:15:\"browse_featured\";s:6:\"params\";a:1:{i:0;s:8:\"extended\";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_featured_entries_view_gallery', '_bx_forum_page_block_title_featured_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:15:\"browse_featured\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:7:\"gallery\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+
+('', 0, @sName, '_bx_forum_page_block_title_latest_entries_view_extended', '_bx_forum_page_block_title_latest_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:13:\"browse_latest\";s:6:\"params\";a:1:{i:0;s:8:\"extended\";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_latest_entries_view_showcase', '_bx_forum_page_block_title_latest_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:13:\"browse_latest\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_latest_entries_view_gallery', '_bx_forum_page_block_title_latest_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:13:\"browse_latest\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:7:\"gallery\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+
+('', 0, @sName, '_bx_forum_page_block_title_new_entries_view_extended', '_bx_forum_page_block_title_new_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:10:\"browse_new\";s:6:\"params\";a:1:{i:0;s:8:\"extended\";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_new_entries_view_showcase', '_bx_forum_page_block_title_new_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:10:\"browse_new\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_new_entries_view_gallery', '_bx_forum_page_block_title_new_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:10:\"browse_new\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:7:\"gallery\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+
+('', 0, @sName, '_bx_forum_page_block_title_top_entries_view_extended', '_bx_forum_page_block_title_top_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:10:\"browse_top\";s:6:\"params\";a:1:{i:0;s:8:\"extended\";}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_top_entries_view_showcase', '_bx_forum_page_block_title_top_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:10:\"browse_top\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:8:\"showcase\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1),
+('', 0, @sName, '_bx_forum_page_block_title_top_entries_view_gallery', '_bx_forum_page_block_title_top_entries', 11, 2147483647, 'service', 'a:3:{s:6:\"module\";s:8:\"bx_forum\";s:6:\"method\";s:10:\"browse_top\";s:6:\"params\";a:3:{s:9:\"unit_view\";s:7:\"gallery\";s:13:\"empty_message\";b:0;s:13:\"ajax_paginate\";b:0;}}', 0, 1, IFNULL(@iBlockOrder, 0) + 1);
+
 
 
 -- MENU: add to site menu

+ 11 - 11
modules/boonex/forum/template/css/unaca.css

@@ -27,6 +27,7 @@
 .unaca-c {
   justify-content: center;
   transition: 0.3s all;
+    
   z-index: 1;
 }
       
@@ -47,8 +48,10 @@
 }
 
 .unaca-s {
-  overflow: hidden;
-    width: 100%;
+    overflow: hidden;
+    width: calc(100% + 1rem);
+    margin-left: -0.5rem;
+    margin-right: -0.5rem;
 }
 
 .unaca-t {
@@ -57,6 +60,8 @@
     white-space: nowrap;
     -webkit-overflow-scrolling: touch;
     overflow: visible !important;
+    scroll-behavior: smooth;
+    scroll-snap-type: x var(--tw-scroll-snap-strictness);
 }
 
 .unaca-t > div {
@@ -64,6 +69,7 @@
     vertical-align: top !important;
     white-space: normal !important;
     width: 25% !important;
+    scroll-snap-align: center;
 }
 .bx-layout-column-wide .unaca-t > div {
      width: 33.3% !important;
@@ -79,16 +85,13 @@
 
 .unaca-t .bx-base-text-unit-showcase {
     margin: 0;
-    padding: 0.25rem;
+    padding: 0.5rem;
 }
 
 .bx-media-phone .unaca-cc {
     display: none;
 }
-.bx-media-phone .unaca-s {
-    margin-left: 0;
-    margin-right: 0;
-}
+
 .bx-media-phone .unaca-t {
     overflow-x: auto !important;
     width: auto;
@@ -100,10 +103,7 @@
 .bx-media-tablet .unaca-cc {
     display: none;
 }
-.bx-media-tablet .unaca-s {
-    margin-left: 0;
-    margin-right: 0;
-}
+
 .bx-media-tablet .unaca-t {
     overflow-x: auto !important;
     width: auto;

+ 1 - 1
modules/boonex/forum/template/unit_gallery.html

@@ -19,7 +19,7 @@
                 __badges__
             </div>
             <bx_if:meta>
-                <div class="bx-base-general-unit-meta flex grow-0 px-2">
+                <div class="bx-base-general-unit-meta flex grow-0 px-3">
                     <div class="inline-flex flex-wrap text-xs font-medium">
                         __meta__
                     </div>

+ 9 - 18
modules/boonex/lucid/data/template/system/css/menu.less

@@ -270,11 +270,6 @@
         margin-top: 0px;
         vertical-align: middle;
     }
-    #bx-menu-toolbar-1-container .bx-menu-toolbar li .sys-icon,
-    #bx-menu-toolbar-2-container .bx-menu-toolbar li .sys-icon {
-        width: auto;
-        height: auto;
-    }
 
     #bx-menu-toolbar-2-container .bx-menu-toolbar .bx-menu-toolbar-item a .bx-def-thumb-size {
         width: 2rem;
@@ -296,9 +291,10 @@
 
 
     /*--- Sliding Menu ---*/
-    .bx-sliding-menu, .bx-sliding-menu-main {
+    .bx-sliding-menu, 
+    .bx-sliding-menu-main {
         left: auto !important;
-        right: 0 !important;
+        right: 0;
         max-width: 31.25rem;
     }
 
@@ -319,11 +315,11 @@
 
 
     /*--- Account Popup Submenu & Add Content Menu ---*/
-    .bx-menu-account-popup-profile,
-    .bx-menu-account-popup-menu {
+    .bx-menu-account-popup-profile-active,
+    .bx-menu-account-popup-profile-notifications {
         text-align: left;
     }
-    .bx-menu-account-popup-menu ul.bx-menu-floating-blocks-wide,
+    .bx-menu-account-popup-profile-notifications ul.bx-menu-floating-blocks-wide,
     .bx-menu-object-sys_account_notifications li,
     .bx-menu-object-sys_add_content li {
         display: block;
@@ -614,15 +610,10 @@
         display: none;
     }
 
-    #bx-sliding-menu-account.bx-sliding-menu-main {
-        left: auto !important;
-        right: 0px !important;
-        width: auto !important;
-    }
+    #bx-sliding-menu-account.bx-sliding-menu-main,
     #bx-sliding-menu-sys_add_content.bx-sliding-menu-main {
-        left: auto !important;
-        right: 0px !important;
-        width: auto !important;
+        width: auto;
+        max-width: none;
     }
 }
 

+ 4 - 14
modules/boonex/lucid/data/template/system/menu_account_popup.html

@@ -1,20 +1,10 @@
 <div id="bx-sliding-menu-account" class="bx-sliding-menu-main bx-sliding-menu-fullheight bx-def-z-index-nav bx-def-color-bg-block bx-def-border-bottom bx-def-box-sizing bx-search-site" style="display:none; opacity:1;">
     <div class="bx-sliding-menu-main-cnt">
         <a class="bx-sliding-menu-close bx-def-margin-sec-top bx-def-margin-right bx-def-font-h2" href="javascript:void(0);" onclick="bx_menu_slide_inline('#bx-sliding-menu-account')"><i class="sys-icon times"></i></a>
-
         <div class="bx-menu-account-popup bx-menu-object-__object__">
-            <div class="bx-menu-account-popup-profile bx-def-padding-sec-bottom bx-def-font-h3 bx-clearfix">__active_profile__</div>
-            <hr class="bx-def-hr" />
-            <div class="bx-menu-account-popup-menu">__menu_notifications__</div>     
+            <bx_repeat:menu_items>
+                <div class="bx-menu-account-popup-__name__">__item__</div>
+            </bx_repeat:menu_items>
         </div>
-        <div class="bx-menu-account-popup-profile-switcher bx-def-box-sizing">__profile_switcher__</div>
-        <bx_if:multiple_profiles_mode>
-           <hr class="bx-def-hr" />
-           <div class="bx-menu-account-popup-profile-switcher-link bx-def-padding">
-               <a class="bx-btn" href="__url_switch_profile__">
-                   <i class="sys-icon plus"></i><span class="bx-def-padding-sec-left"><bx_text:_sys_txt_my_profiles /></span>
-               </a>
-           </div>
-        </bx_if:multiple_profiles_mode>
     </div>
-</div>
+</div>

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

@@ -297,6 +297,8 @@
     <string name="_bx_market_menu_item_title_entries_top"><![CDATA[Top]]></string>
     <string name="_bx_market_menu_item_title_system_entries_updated"><![CDATA[Updated Products]]></string>
     <string name="_bx_market_menu_item_title_entries_updated"><![CDATA[Updated]]></string>
+    <string name="_bx_market_menu_item_title_system_more_auto"><![CDATA[More]]></string>
+    <string name="_bx_market_menu_item_title_more_auto"><![CDATA[More]]></string>
     <string name="_bx_market_menu_title_view_entry_submenu"><![CDATA[View Product Submenu]]></string>
     <string name="_bx_market_menu_set_title_view_entry_submenu"><![CDATA[View Product Submenu]]></string>
     <string name="_bx_market_menu_item_title_system_view_entry_submenu_entry"><![CDATA[Overview]]></string>

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

@@ -375,7 +375,7 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_market_submenu', 'bx_market', 'products-categories', '_bx_market_menu_item_title_system_entries_categories', '_bx_market_menu_item_title_entries_categories', 'page.php?i=products-categories', '', '', '', '', 2147483647, 1, 1, 7),
 ('bx_market_submenu', 'bx_market', 'products-search', '_bx_market_menu_item_title_system_entries_search', '_bx_market_menu_item_title_entries_search', 'page.php?i=products-search', '', '', '', '', 2147483647, 1, 1, 8),
 ('bx_market_submenu', 'bx_market', 'products-manage', '_bx_market_menu_item_title_system_entries_manage', '_bx_market_menu_item_title_entries_manage', 'page.php?i=products-manage', '', '', '', '', 2147483646, 1, 1, 9),
-('bx_market_submenu', 'bx_market', 'more-auto', '_sys_menu_item_title_system_more_auto', '_sys_menu_item_title_more_auto', 'javascript:void(0)', '', '', '', '', 2147483647, 1, 0, 9999);
+('bx_market_submenu', 'bx_market', 'more-auto', '_bx_market_menu_item_title_system_more_auto', '_bx_market_menu_item_title_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', 2147483647, 1, 0, 9999);
 
 -- MENU: sub-menu for view entry
 INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 

+ 4 - 4
modules/boonex/massmailer/classes/BxMassMailerDb.php

@@ -250,10 +250,10 @@ class BxMassMailerDb extends BxBaseModGeneralDb
         $aTmp = $this->getColumn("SELECT `" . $CNF['FIELD_ID'] . "` FROM `" . $CNF['TABLE_CAMPAIGNS'] . "` WHERE `" . $CNF['FIELD_DATE_SENT'] . "` < :time_from AND `" . $CNF['FIELD_DATE_SENT'] . "` > 0", $aBindings);
         if (count($aTmp) > 0){
             $sIdList = $this->implode_escape($aTmp);
-            $this->query("DELETE FROM `" . $CNF['TABLE_LETTERS'] . "` WHERE `" . $CNF['FIELD_CAMPAIGN_ID'] . "` IN (" . $sIdList . ")", $aBindings);
-            $this->query("DELETE FROM `" . $CNF['TABLE_LINKS'] . "` WHERE `" . $CNF['FIELD_CAMPAIGN_ID'] . "` IN (" . $sIdList . ")", $aBindings);
-            $this->query("DELETE FROM `" . $CNF['TABLE_UNSUBSCRIBE'] . "` WHERE `" . $CNF['FIELD_CAMPAIGN_ID'] . "` IN (" . $sIdList . ")", $aBindings);
-            $this->query("DELETE FROM `" . $CNF['TABLE_CAMPAIGNS'] . "` WHERE `" . $CNF['FIELD_ID'] . "` IN (" . $sIdList . ")", $aBindings);
+            $this->query("DELETE FROM `" . $CNF['TABLE_LETTERS'] . "` WHERE `" . $CNF['FIELD_CAMPAIGN_ID'] . "` IN (" . $sIdList . ")", []);
+            $this->query("DELETE FROM `" . $CNF['TABLE_LINKS'] . "` WHERE `" . $CNF['FIELD_CAMPAIGN_ID'] . "` IN (" . $sIdList . ")", []);
+            $this->query("DELETE FROM `" . $CNF['TABLE_UNSUBSCRIBE'] . "` WHERE `" . $CNF['FIELD_CAMPAIGN_ID'] . "` IN (" . $sIdList . ")", []);
+            $this->query("DELETE FROM `" . $CNF['TABLE_CAMPAIGNS'] . "` WHERE `" . $CNF['FIELD_ID'] . "` IN (" . $sIdList . ")", []);
         }
     }
 }

+ 2 - 0
modules/boonex/massmailer/classes/BxMassMailerGridCampaigns.php

@@ -16,6 +16,8 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
         $this->MODULE = 'bx_massmailer';
         $this->_oModule = BxDolModule::getInstance($this->MODULE);
         parent::__construct ($aOptions, $oTemplate);
+        
+        $this->_sDefaultSortingOrder = 'DESC';
     }
     
     public function performActionDelete()

+ 6 - 3
modules/boonex/massmailer/classes/BxMassMailerModule.php

@@ -496,18 +496,21 @@ class BxMassMailerModule extends BxBaseModGeneralModule
         if (!$aTemplate)
             return false;
         
+        $GLOBALS['bx_profiler_disable'] = true;
+        unset($GLOBALS['bx_profiler']);
+
         $this->_oDb->deleteCampaignData($iCampaignId);
         $aAccounts = $this->getEmailsBySegment($aCampaign['segments'], $aCampaign['is_one_per_account']);
         foreach ($aAccounts as $aAccountInfo){
             $this->sendLetter($aAccountInfo['email'], $iCampaignId, $aCustomHeaders, $aAccountInfo['account_id'], $aTemplate, true);
             $this->_oDb->addEmailToSentListForCampaign($iCampaignId, $aAccountInfo['email']);
-            unset($GLOBALS['bxDolClasses']['BxDolAccount_' . $aAccountInfo['account_id']]);
-            if (1 == rand(1,100)) {
+
+            if (1 == rand(1, 300)) {
                 BxDolDb::getInstance()->cleanMemoryAll();
                 unset($GLOBALS['bxDolClasses']);
             }
         }
-              
+
         $this->_oDb->sendCampaign($iCampaignId);
         return true;
     }

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů