Parcourir la source

Merge branch 'unacms:master' into master

Andrey Yasko il y a 2 mois
Parent
commit
58efc275b5

+ 1 - 0
modules/boonex/massmailer/classes/BxMassMailerConfig.php

@@ -33,6 +33,7 @@ class BxMassMailerConfig extends BxBaseModTextConfig
             'FIELD_FROM_NAME' => 'from_name',
             'FIELD_REPLY_TO' => 'reply_to',
             'FIELD_BODY' => 'body',
+            'FIELD_BODY_INFO' => 'body_info',
             'FIELD_EMAIL_LIST' => 'email_list',
             'FIELD_SEGMENTS' => 'segments',
             'FIELD_ADDED' => 'added',

+ 19 - 13
modules/boonex/massmailer/classes/BxMassMailerFormEntry.php

@@ -82,19 +82,25 @@ class BxMassMailerFormEntry extends BxBaseModTextFormEntry
         if($this->_bCreative && isset($this->aInputs[$CNF['FIELD_BODY']])) {
             $sContent = !empty($aCampaignInfo['body']) ? $aCampaignInfo['body'] : '';
 
-            $this->aInputs[$CNF['FIELD_BODY']] = array_merge($this->aInputs[$CNF['FIELD_BODY']], [
-                'type' => 'custom',
-                'content' => $this->_oModule->_oTemplate->parseHtmlByName('campaign_body.html', [
-                    'name' => $this->aInputs[$CNF['FIELD_BODY']]['name'],
-                    'html_id' => $this->_oModule->_oConfig->getHtmlIds('campaign_body'),
-                    'content_html' => $sContent,
-                    'content_data' => json_encode([
-                        'pages' => [
-                            ['component' => $sContent]
-                        ]
-                    ])
-                ]),
-            ]);
+            if(!$this->_bIsApi)
+                $this->aInputs[$CNF['FIELD_BODY']] = array_merge($this->aInputs[$CNF['FIELD_BODY']], [
+                    'type' => 'custom',
+                    'content' => $this->_oModule->_oTemplate->parseHtmlByName('campaign_body.html', [
+                        'name' => $this->aInputs[$CNF['FIELD_BODY']]['name'],
+                        'html_id' => $this->_oModule->_oConfig->getHtmlIds('campaign_body'),
+                        'content_html' => $sContent,
+                        'content_data' => json_encode([
+                            'pages' => [
+                                ['component' => $sContent]
+                            ]
+                        ])
+                    ]),
+                ]);
+            else
+                $this->aInputs[$CNF['FIELD_BODY_INFO']] = array_merge($this->aInputs[$CNF['FIELD_BODY_INFO']], [
+                    'type' => 'value',
+                    'value' => $this->_oModule->serviceAttributes()
+                ]);
         }
 
         parent::initChecker ($aValues, $aSpecificValues);

+ 25 - 4
modules/boonex/massmailer/classes/BxMassMailerFormsEntryHelper.php

@@ -23,21 +23,42 @@ class BxMassMailerFormsEntryHelper extends BxBaseModTextFormsEntryHelper
     {
         $CNF = &$this->_oModule->_oConfig->CNF;
         $CNF['TABLE_ENTRIES'] = $CNF['TABLE_CAMPAIGNS'];
-        return parent::editDataForm($iContentId, $CNF['OBJECT_FORM_ENTRY_DISPLAY_EDIT'], $sCheckFunction = false, $bErrorMsg = true);
+        return parent::editDataForm($iContentId, $CNF['OBJECT_FORM_ENTRY_DISPLAY_EDIT'], $sCheckFunction, $bErrorMsg);
     }
-    
+
     public function onDataEditAfter($iContentId, $aContentInfo, $aTrackTextFieldsChanges, $oProfile, $oForm)
     {
+        if($this->_bIsApi)
+            return '';
+
         $CNF = &$this->_oModule->_oConfig->CNF;
         $this->_redirectAndExit('page.php?i=' . $CNF['URI_MANAGE_CAMPAIGNS']);
-        return parent::onDataEditAfter($iContentId, $aContentInfo, $aTrackTextFieldsChanges, $oProfile, $oForm);
     }
-    
+
     public function onDataAddAfter($iAccountId, $iContentId)
     {
+        if($this->_bIsApi)
+            return '';
+
         $CNF = &$this->_oModule->_oConfig->CNF;
         $this->_redirectAndExit('page.php?i=' . $CNF['URI_MANAGE_CAMPAIGNS']);
     }
+
+    public function redirectAfterAdd($aContentInfo, $sUrl = '')
+    {
+        if($this->_bIsApi)
+            return [];
+        
+        return parent::redirectAfterAdd($aContentInfo, $sUrl);
+    }
+
+    protected function redirectAfterEdit($aContentInfo, $sUrl = '')
+    {
+        if($this->_bIsApi)
+            return [];
+
+        return parent::redirectAfterEdit($aContentInfo, $sUrl);
+    }
 }
 
 /** @} */

+ 102 - 43
modules/boonex/massmailer/classes/BxMassMailerGridCampaigns.php

@@ -23,6 +23,28 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
         $this->_sDefaultSortingOrder = 'DESC';
     }
     
+    public function getFormBlockTitleAPI($sAction, $iId = 0)
+    {
+        $sResult = '';
+
+        switch($sAction) {
+            case 'send_test':
+                $sResult = _t('_bx_massmailer_campaign_form_send_test_title');
+                break;
+            
+            case 'send_all':
+                $sResult = _t('_bx_massmailer_campaign_form_send_all_title');
+                break;
+        }
+
+        return $sResult;
+    }
+
+    public function getFormCallBackUrlAPI($sAction, $iId = 0)
+    {
+         return '/api.php?r=system/perfom_action_api/TemplServiceGrid/&params[]=&o=' . $this->_sObject . '&a=' . $sAction . '&context_pid=' . $this->_iContextPid . '&id=' . $iId;
+    }
+    
     public function performActionDelete()
     {
         $aIds = bx_get('ids');
@@ -31,7 +53,7 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
         }
         parent::performActionDelete();
     }
-    
+
     public function performActionSendTest()
     {
         $sAction = 'send_test';
@@ -39,21 +61,23 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
         $iId = $aIds[0];
         $oForm = BxDolForm::getObjectInstance('bx_massmailer', 'bx_massmailer_campaign_send_test');
         if (!$oForm)
-            return '';
+            return $this->_getActionResult([]);
+
         $oForm->setId('bx_massmailer_campaign_send_test');
-        $oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . 'grid.php?' . bx_encode_url_params($_GET, array('_r'));
+        $oForm->setAction(BX_DOL_URL_ROOT . 'grid.php?' . bx_encode_url_params($_GET, array('_r')));
         $aContentInfo = array('email' => BxDolProfile::getInstance()->getAccountObject()->getEmail());
         $oForm->initChecker($aContentInfo, array());
         if($oForm->isSubmittedAndValid()) {
             $mixedResult = $this->_oModule->sendTest($oForm->aInputs['email']['value'], $iId);
             if($mixedResult !== false)
-                $aRes = array('grid' => $this->getCode(false), 'blink' => $mixedResult);
+                return $this->_bIsApi ? [] : echoJson(['grid' => $this->getCode(false), 'blink' => $mixedResult]);
             else
-                $aRes = array('msg' => _t('_bx_massmailer_txt_send_test_error'));
-            echoJson($aRes);
+                return ($sMsg = _t('_bx_massmailer_txt_send_test_error')) && $this->_bIsApi ? [bx_api_get_msg($sMsg)] : echoJson(['msg' => $sMsg]);
         }
         else {
-            
+            if($this->_bIsApi)
+                return $this->getFormBlockAPI($oForm, $sAction, $iTrackId);
+
             $sContent = BxTemplFunctions::getInstance()->popupBox('bx_massmailer_campaign_send_test', _t('_bx_massmailer_campaign_form_send_test_title'), $this->_oModule->_oTemplate->parseHtmlByName('manage_item.html', array(
                 'form_id' => $oForm->id,
                 'form' => $oForm->getCode(true),
@@ -63,7 +87,7 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
             echoJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false))));
         }
     }
-    
+
     public function performActionSendAll()
     {
         $sAction = 'send_all';
@@ -71,20 +95,23 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
         $iId = $aIds[0];
         $oForm = BxDolForm::getObjectInstance('bx_massmailer', 'bx_massmailer_campaign_send_all');
         if (!$oForm)
-            return '';
+            return $this->_getActionResult([]);
+
         $oForm->setId('bx_massmailer_campaign_send_all');
-        $oForm->aFormAttrs['action'] = BX_DOL_URL_ROOT . 'grid.php?' . bx_encode_url_params($_GET, array('_r'));
+        $oForm->setAction(BX_DOL_URL_ROOT . 'grid.php?' . bx_encode_url_params($_GET, array('_r')));
         $oForm->initChecker(array(), array());
         $oForm->aInputs['campaign_info']['value'] = _t($oForm->aInputs['campaign_info']['value'], $this->_oModule->getEmailCountInSegment($iId));
         if($oForm->isSubmittedAndValid()) {
             $mixedResult = $this->_oModule->sendAll($iId);
             if($mixedResult !== false)
-                $aRes = array('grid' => $this->getCode(false), 'blink' => $mixedResult);
+                return $this->_bIsApi ? [] : echoJson(['grid' => $this->getCode(false), 'blink' => $mixedResult]);
             else
-                $aRes = array('msg' => $mixedResult);
-            echoJson($aRes);
+                return $this->_bIsApi ? [bx_api_get_msg($mixedResult)] : echoJson(['msg' => $mixedResult]);
         }
         else {
+            if($this->_bIsApi)
+                return $this->getFormBlockAPI($oForm, $sAction, $iTrackId);
+
             $sContent = BxTemplFunctions::getInstance()->popupBox('bx_massmailer_campaign_send_all', _t('_bx_massmailer_campaign_form_send_all_title'), $this->_oModule->_oTemplate->parseHtmlByName('manage_item.html', array(
                 'form_id' => $oForm->id,
                 'form' => $oForm->getCode(true),
@@ -94,24 +121,26 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
             echoJson(array('popup' => array('html' => $sContent, 'options' => array('closeOnOuterClick' => false))));
         }
     }
-    
+
     public function performActionCopy()
     {
         $aIds = bx_get('ids');
         $iId = $aIds[0];
         $mixedResult = $this->_oModule->_oDb->copyCampaign($iId);
         if($mixedResult !== false)
-            $aRes = array('grid' => $this->getCode(false), 'blink' => $mixedResult);
+            return $this->_bIsApi ? [] : echoJson(['grid' => $this->getCode(false), 'blink' => $mixedResult]);
         else
-            $aRes = array('msg' => $mixedResult);
-        echoJson($aRes);
+            return $this->_bIsApi ? [bx_api_get_msg($mixedResult)] : echoJson(['msg' => $mixedResult]);
     }
-    
+
     protected function _getCellAdded($mixedValue, $sKey, $aField, $aRow)
     {
+        if($this->_bIsApi)
+            return ['type' => 'time', 'data' => $mixedValue];
+        
         return parent::_getCellDefault(bx_time_js($mixedValue), $sKey, $aField, $aRow);
     }
-    
+
     protected function _getCellSegments($mixedValue, $sKey, $aField, $aRow)
     {
         return parent::_getCellDefault($this->_oModule->getSegments($mixedValue), $sKey, $aField, $aRow);
@@ -119,45 +148,60 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
 
     protected function _getCellDateSent($mixedValue, $sKey, $aField, $aRow)
     {
-        $sValue = bx_time_js($mixedValue);
-        if ($mixedValue == '0')
-            $sValue = _t('_bx_massmailer_txt_never_sent');
-        return parent::_getCellDefault($sValue, $sKey, $aField, $aRow);
+        if($this->_bIsApi)
+            return ['type' => 'time', 'data' => $mixedValue];
+
+        return parent::_getCellDefault($mixedValue != '0' ? bx_time_js($mixedValue) : _t('_bx_massmailer_txt_never_sent'), $sKey, $aField, $aRow);
     }
-    
+
     protected function _getCellIsOnePerAccount($mixedValue, $sKey, $aField, $aRow)
     {
-        $sValue = _t('_bx_massmailer_grid_column_title_adm_is_one_per_account_no');
-        if ($mixedValue == '1')
-            $sValue = _t('_bx_massmailer_grid_column_title_adm_is_one_per_account_yes');
-        return parent::_getCellDefault($sValue, $sKey, $aField, $aRow);
+        return parent::_getCellDefault(_t('_bx_massmailer_grid_column_title_adm_is_one_per_account_' . ($mixedValue == '1' ? 'yes' : 'no')), $sKey, $aField, $aRow);
     }
-    
+
     protected function _getActionCopy($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     {
         if(isset($aRow["date_sent"]) && $aRow["date_sent"] == '0')
-            return '';
+            return $this->_bIsApi ? [] : '';
+
+        if($this->_bIsApi)
+            return array_merge($a, [
+                'name' => $sKey, 
+                'type' => 'callback', 
+                'on_callback' => 'refresh'
+            ]);
+
         return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
     }
-    
+
     protected function _getActionSendTest($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     {
         if(isset($aRow["date_sent"]) && $aRow["date_sent"] != '0')
-            return '';
+            return $this->_bIsApi ? [] : '';
+
         return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
     }
-    
+
     protected function _getActionSendAll($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     {
         if(isset($aRow["date_sent"]) && $aRow["date_sent"] != '0')
-            return '';
+            return $this->_bIsApi ? [] : '';
+
         return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
     }
-    
+
     protected function _getActionAdd ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     {
         $CNF = &$this->_oModule->_oConfig->CNF;
+
         $sUrl = bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_ADD_CAMPAIGN']));
+        if($this->_bIsApi)
+            return array_merge($a, [
+                'name' => $sKey, 
+                'type' => 'modal', 
+                'on_callback' => 'refresh',
+                'link' => bx_api_get_relative_url($sUrl)
+            ]);
 
         unset($a['attr']['bx_grid_action_independent']);
         $a['attr'] = array_merge($a['attr'], array(
@@ -166,15 +210,22 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
 
         return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
     }
-    
+
     protected function _getActionEdit ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     {
         if(isset($aRow["date_sent"]) && $aRow["date_sent"] != '0')
-            return '';
+            return $this->_bIsApi ? [] : '';
 
         $CNF = &$this->_oModule->_oConfig->CNF;
 
         $sUrl = bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_EDIT_CAMPAIGN'] . '&id=' . $aRow[$CNF['FIELD_ID']]));
+        if($this->_bIsApi)
+            return array_merge($a, [
+                'name' => $sKey, 
+                'type' => 'modal', 
+                'on_callback' => 'refresh',
+                'link' => bx_api_get_relative_url($sUrl)
+            ]);
 
         $a['attr'] = array_merge($a['attr'], array(
             "onclick" => "window.open('" . $sUrl . "','_self');"
@@ -182,15 +233,22 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
 
         return $this->_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
     }
-    
+
     protected function _getActionView ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     {
         if(isset($aRow["date_sent"]) && $aRow["date_sent"] == '0')
-            return '';
-        
+            return $this->_bIsApi ? [] : '';
+
         $CNF = &$this->_oModule->_oConfig->CNF;
-        
+
         $sUrl = bx_absolute_url(BxDolPermalinks::getInstance()->permalink('page.php?i=' . $CNF['URI_VIEW_CAMPAIGN'] . '&id=' . $aRow[$CNF['FIELD_ID']]));
+        if($this->_bIsApi)
+            return array_merge($a, [
+                'name' => $sKey, 
+                'type' => 'callback', 
+                'on_callback' => 'redirect', 
+                'redirect_url' => bx_api_get_relative_url($sUrl)
+            ]);
 
         unset($a['attr']['bx_grid_action_independent']);
         $a['attr'] = array_merge($a['attr'], array(
@@ -199,7 +257,7 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
 
         return parent::_getActionDefault ($sType, $sKey, $a, $isSmall, $isDisabled, $aRow);
     }
-    
+
     protected function _getCellAuthor($mixedValue, $sKey, $aField, $aRow)
     {
         $oProfile = BxDolProfile::getInstance($aRow['author']);
@@ -207,11 +265,12 @@ class BxMassMailerGridCampaigns extends BxTemplGrid
             $oProfile = BxDolProfileUndefined::getInstance();
         return parent::_getCellDefault($oProfile->getDisplayName(), $sKey, $aField, $aRow);
     }
-    
+
     protected function _isVisibleGrid ($a)
     {
         if (isAdmin() || !isset($a['visible_for_levels']))
             return true;
+
         return $this->_oModule->checkAllowed() === CHECK_ACTION_RESULT_ALLOWED ? true : false;
     }
 }

+ 2 - 1
modules/boonex/massmailer/classes/BxMassMailerModule.php

@@ -225,7 +225,7 @@ class BxMassMailerModule extends BxBaseModGeneralModule
 
     public function serviceGetSafeServices()
     {
-        return array ();
+        return parent::serviceGetSafeServices();
     }
 
     /**
@@ -427,6 +427,7 @@ class BxMassMailerModule extends BxBaseModGeneralModule
                 $aAttributesParts[$aModule['name']] = array($aModule['title'], $aTmp2);
             }
         }
+
         return $this->_oTemplate->getAttributes($aAttributesParts);
     }
     

+ 2 - 1
modules/boonex/massmailer/install/langs/en.xml

@@ -54,7 +54,7 @@
   <string name="_bx_massmailer_grid_action_title_adm_edit"><![CDATA[Edit]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_copy"><![CDATA[Copy]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_delete"><![CDATA[Delete]]></string>
-  <string name="_bx_massmailer_grid_action_title_adm_view"><![CDATA[Report]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_view"><![CDATA[View]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_send_test"><![CDATA[Send test]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_send_all"><![CDATA[Send All]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_add"><![CDATA[Add new campaign]]></string>
@@ -105,6 +105,7 @@
   <string name="_bx_massmailer_form_campaign_input_reply_to_err"><![CDATA[Email is not valid]]></string>
   <string name="_bx_massmailer_form_campaign_input_from_name_info_value"><![CDATA[The message will be sent to {0} profiles.]]></string>
   <string name="_bx_massmailer_form_campaign_input_sys_campaign_info"><![CDATA[Campaign info]]></string>
+  <string name="_bx_massmailer_form_campaign_input_campaign_info"><![CDATA[Info]]></string>
   <string name="_bx_massmailer_form_campaign_input_sys_receive_news"><![CDATA[Receive Newsletterso]]></string>
   <string name="_bx_massmailer_form_campaign_input_receive_news"><![CDATA[Receive Newsletters]]></string>
   <string name="_bx_massmailer_form_campaign_input_sys_code"><![CDATA[Code]]></string>

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

@@ -102,7 +102,7 @@ INSERT INTO `sys_form_inputs` (`object`, `module`, `name`, `value`, `values`, `c
 (@sName, @sName, 'is_one_per_account', '1', '', 1, 'switcher', '_bx_massmailer_form_campaign_input_sys_is_one_per_account', '_bx_massmailer_form_campaign_input_is_one_per_account', '', 0, 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
 (@sName, @sName, 'is_track_links', '1', '', 1, 'switcher', '_bx_massmailer_form_campaign_input_sys_is_track_links', '_bx_massmailer_form_campaign_input_is_track_links', '', 0, 0, 0, 0, '', '', '', '', '', '', 'Int', '', 1, 0),
 (@sName, @sName, 'email', '', '', 0, 'text', '_bx_massmailer_form_campaign_input_sys_test_email', '_bx_massmailer_form_campaign_input_email', '', 1, 0, 0, 2, '', '', '', 'Email', '', '_sys_form_account_input_email_error', 'XssHtml', '', 1, 0),
-(@sName, @sName, 'campaign_info', '_bx_massmailer_form_campaign_input_from_name_info_value', '', 0, 'value', '_bx_massmailer_form_campaign_input_sys_campaign_info', '', '', 0, 0, 0, 2, '', '', '', '', '', '', 'XssHtml', '', 1, 0),
+(@sName, @sName, 'campaign_info', '_bx_massmailer_form_campaign_input_from_name_info_value', '', 0, 'value', '_bx_massmailer_form_campaign_input_sys_campaign_info', '_bx_massmailer_form_campaign_input_campaign_info', '', 0, 0, 0, 2, '', '', '', '', '', '', 'XssHtml', '', 1, 0),
 (@sName, @sName, 'cancel', '_bx_massmailer_form_entry_input_cancel', '', 0, 'button', '_bx_dev_bp_btn_sys_block_cancel', '', '', 0, 0, 0, 0, 'a:2:{s:7:"onclick";s:45:"$(''.bx-popup-applied:visible'').dolPopupHide()";s:5:"class";s:22:"bx-def-margin-sec-left";}', '', '', 'Avail', '', '', '', '', 0, 0),
 (@sName, @sName, 'controls', '', 'do_send,cancel', 0, 'input_set', '', '', '', 0, 0, 0, 0, '', '', '', '', '', '', '', '', 0, 0);
 

+ 2 - 1
modules/boonex/russian/data/langs/bx_massmailer/ru.xml

@@ -54,7 +54,7 @@
   <string name="_bx_massmailer_grid_action_title_adm_edit"><![CDATA[Редактировать]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_copy"><![CDATA[Копировать]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_delete"><![CDATA[Удалить]]></string>
-  <string name="_bx_massmailer_grid_action_title_adm_view"><![CDATA[Отчет]]></string>
+  <string name="_bx_massmailer_grid_action_title_adm_view"><![CDATA[Смотреть]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_send_test"><![CDATA[Отправить тест]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_send_all"><![CDATA[Отправить всем]]></string>
   <string name="_bx_massmailer_grid_action_title_adm_add"><![CDATA[Добавить новую кампанию]]></string>
@@ -105,6 +105,7 @@
   <string name="_bx_massmailer_form_campaign_input_reply_to_err"><![CDATA[Rmail имеет неправильный формат]]></string>
   <string name="_bx_massmailer_form_campaign_input_from_name_info_value"><![CDATA[Письмо будет отправлено {0} адресатам.]]></string>
   <string name="_bx_massmailer_form_campaign_input_sys_campaign_info"><![CDATA[Информация о кампании]]></string>
+  <string name="_bx_massmailer_form_campaign_input_campaign_info"><![CDATA[Информация]]></string>
   <string name="_bx_massmailer_form_campaign_input_sys_receive_news"><![CDATA[Получать письма]]></string>
   <string name="_bx_massmailer_form_campaign_input_receive_news"><![CDATA[Получать письма]]></string>
   <string name="_bx_massmailer_form_campaign_input_sys_code"><![CDATA[Код]]></string>

+ 3 - 0
modules/boonex/russian/data/langs/bx_tasks/ru.xml

@@ -334,6 +334,9 @@
     <string name="_bx_tasks_menu_title_view_entry"><![CDATA[Задание - Действия]]></string>
     <string name="_bx_tasks_menu_title_submenu"><![CDATA[Задания - Подменю]]></string>
     <string name="_bx_tasks_menu_set_title_submenu"><![CDATA[Задания - Подменю]]></string>
+    <string name="_bx_tasks_menu_item_title_system_submenu_use"><![CDATA[Подменю: Использование]]></string>
+    <string name="_bx_tasks_menu_item_title_system_submenu_browse"><![CDATA[Подменю: Просмотр задач в контекстах]]></string>
+    <string name="_bx_tasks_menu_item_title_system_submenu_manage"><![CDATA[Подменю: Управление задачами]]></string>
     <string name="_bx_tasks_menu_item_title_system_create_entry"><![CDATA[Задание]]></string>
     <string name="_bx_tasks_menu_item_title_create_entry"><![CDATA[Задание]]></string>
     <string name="_bx_tasks_menu_item_title_system_edit_entry"><![CDATA[Редактировать]]></string>

+ 1 - 0
modules/boonex/tasks/classes/BxTasksConfig.php

@@ -178,6 +178,7 @@ class BxTasksConfig extends BxBaseModTextConfig
             'OBJECT_MENU_ACTIONS_VIEW_ENTRY' => 'bx_tasks_view', // actions menu on view entry page
             'OBJECT_MENU_ACTIONS_VIEW_ENTRY_ALL' => 'bx_tasks_view_actions', // all actions menu on view entry page
             'OBJECT_MENU_ACTIONS_MY_ENTRIES' => 'bx_tasks_my', // actions menu on my entries page
+            'OBJECT_MENU_SUBMENU' => 'bx_tasks_submenu', // main module submenu
             'OBJECT_MENU_SUBMENU_VIEW_ENTRY' => 'bx_tasks_view_submenu', // view entry submenu
             'OBJECT_MENU_SUBMENU_VIEW_ENTRY_MAIN_SELECTION' => 'tasks-home', // first item in view entry submenu from main module submenu
             'OBJECT_MENU_SNIPPET_META' => 'bx_tasks_snippet_meta', // menu for snippet meta info

+ 94 - 0
modules/boonex/tasks/classes/BxTasksMenuSubmenu.php

@@ -0,0 +1,94 @@
+<?php defined('BX_DOL') or die('hack attempt');
+/**
+ * Copyright (c) UNA, Inc - https://una.io
+ * MIT License - https://opensource.org/licenses/MIT 
+ * @defgroup    Tasks Tasks
+ * @ingroup     UnaModules
+ *
+ * @{
+ */
+
+class BxTasksMenuSubmenu extends BxTemplMenuCustom
+{
+    protected $_sModule;
+    protected $_oModule;
+
+    protected $_iProfileId;
+
+    public function __construct($aObject, $oTemplate = false)
+    {
+        $this->_sModule = 'bx_tasks';
+    	$this->_oModule = BxDolModule::getInstance($this->_sModule);
+
+        parent::__construct($aObject, $oTemplate);
+
+        $this->_iProfileId = bx_get_logged_profile_id();
+    }
+
+    public function getCodeAPI ()
+    {
+        $aResult = parent::getCodeAPI();
+        
+        $aItems = [];
+        foreach($aResult['items'] as $aItem)
+            if(($aData = $aItem['data']['items'] ?? false) && is_array($aData))
+                $aItems = array_merge($aItems, $aData);
+
+        if($aItems)
+            $aResult['items'] = $aItems;
+
+        return $aResult;
+    }
+
+    protected function _getMenuItemUse ($aItem)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $oMenu = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_USE_TOOLS_SUBMENU']);
+        if(!$this->_bIsApi || !$oMenu)
+            return false;
+
+        return [
+            'id' => $aItem['id'],
+            'name' => $aItem['name'],
+            'display_type' => 'menu',
+            'data' => $oMenu->getCodeAPI()
+        ];
+    }
+
+    protected function _getMenuItemBrowse ($aItem)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $oMenu = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_BROWSE']);
+        if(!$this->_bIsApi || !$oMenu)
+            return false;
+
+        $oMenu->setProfileId($this->_iProfileId);
+
+        return [
+            'id' => $aItem['id'],
+            'name' => $aItem['name'],
+            'display_type' => 'menu',
+            'data' => $oMenu->getCodeAPI()
+        ];
+    }
+
+    protected function _getMenuItemManage ($aItem)
+    {
+        $CNF = &$this->_oModule->_oConfig->CNF;
+
+        $oMenu = BxDolMenu::getObjectInstance($CNF['OBJECT_MENU_MANAGE_TOOLS_SUBMENU']);
+        if(!$this->_bIsApi || !$oMenu)
+            return false;
+
+        return [
+            'id' => $aItem['id'],
+            'name' => $aItem['name'],
+            'display_type' => 'menu',
+            'data' => $oMenu->getCodeAPI()
+        ];
+    }
+}
+
+/** @} */

+ 1 - 1
modules/boonex/tasks/classes/BxTasksMenuViewActions.php

@@ -84,7 +84,7 @@ class BxTasksMenuViewActions extends BxBaseModTextMenuViewActions
                 ]
             ]);
 
-        return $aResult;
+        return true;
     }
 }
 

+ 14 - 2
modules/boonex/tasks/classes/BxTasksModule.php

@@ -1034,8 +1034,20 @@ class BxTasksModule extends BxBaseModTextModule implements iBxDolCalendarService
         
         $CNF = &$this->_oConfig->CNF;
 
+        $bAllowEdit = $this->isAllowEdit($iContentId);
+
+        if($this->_bIsApi) {
+            $aResult = parent::serviceEntityTextBlock($iContentId);
+            if($bAllowEdit) {
+                $aResult['0']['data']['editable'] = true;
+                $aResult['0']['data']['params']['request_url'] = $this->_aModule['name'] . '/set_property/&params[]=' . $iContentId  . '&params[]=';
+            }
+
+            return $aResult;
+        }
+
         $sResult = '';
-        if(!$this->isAllowEdit($iContentId))
+        if(!$bAllowEdit)
             $sResult = parent::serviceEntityTextBlock($iContentId);
         else 
             $sResult = $this->serviceEntityEdit($iContentId, $CNF['OBJECT_FORM_ENTRY_DISPLAY_EDIT_BODY']);
@@ -1709,7 +1721,7 @@ class BxTasksModule extends BxBaseModTextModule implements iBxDolCalendarService
         $this->logActivity($iContentId, ['key' => '_bx_tasks_txt_msg_edit_state', 'markers' => ['value' => $this->_oConfig->getStateTitle($iState)]]);
 
         $iCompleted = (int)$this->_oConfig->isCompleted($iState);
-        if($iCompleted != (int)$this->_oConfig->isCompleted($aContentInfo[$CNF['FIELD_STATE']]))
+        if($iCompleted != (int)$this->_oConfig->isCompleted($aContentInfo[$CNF['FIELD_STATE']]) || $iCompleted != (int)$aContentInfo[$CNF['FIELD_COMPLETED']])
             $this->complete($iContentId, $iCompleted);
     }
 

+ 7 - 4
modules/boonex/tasks/install/langs/en.xml

@@ -336,6 +336,9 @@
     <string name="_bx_tasks_menu_title_view_entry"><![CDATA[Task Actions]]></string>
     <string name="_bx_tasks_menu_title_submenu"><![CDATA[Tasks Submenu]]></string>
     <string name="_bx_tasks_menu_set_title_submenu"><![CDATA[Tasks Submenu]]></string>
+    <string name="_bx_tasks_menu_item_title_system_submenu_use"><![CDATA[Submenu: Usage]]></string>
+    <string name="_bx_tasks_menu_item_title_system_submenu_browse"><![CDATA[Submenu: Browse tasks in contexts]]></string>
+    <string name="_bx_tasks_menu_item_title_system_submenu_manage"><![CDATA[Submenu: Manage tasks]]></string>
     <string name="_bx_tasks_menu_item_title_system_create_entry"><![CDATA[Task]]></string>
     <string name="_bx_tasks_menu_item_title_create_entry"><![CDATA[Task]]></string>
     <string name="_bx_tasks_menu_item_title_system_edit_entry"><![CDATA[Edit]]></string>
@@ -402,10 +405,10 @@
     <string name="_bx_tasks_menu_title_manage_tools_submenu"><![CDATA[Manage Tools Submenu]]></string>
     <string name="_bx_tasks_menu_title_public_manage_tools_submenu"><![CDATA[Manage]]></string>
     <string name="_bx_tasks_menu_set_title_manage_tools_submenu"><![CDATA[Manage Tools Submenu]]></string>
-    <string name="_bx_tasks_menu_item_title_mt_submenu_entries_common"><![CDATA[My Tasks]]></string>
-    <string name="_bx_tasks_menu_item_title_mt_submenu_entries_administration"><![CDATA[All Tasks]]></string>
-    <string name="_bx_tasks_menu_item_title_mt_submenu_time_common"><![CDATA[My Time]]></string>
-    <string name="_bx_tasks_menu_item_title_mt_submenu_time_administration"><![CDATA[All Time]]></string>
+    <string name="_bx_tasks_menu_item_title_mt_submenu_entries_common"><![CDATA[Manage my tasks]]></string>
+    <string name="_bx_tasks_menu_item_title_mt_submenu_entries_administration"><![CDATA[Tasks administration]]></string>
+    <string name="_bx_tasks_menu_item_title_mt_submenu_time_common"><![CDATA[Manage my time]]></string>
+    <string name="_bx_tasks_menu_item_title_mt_submenu_time_administration"><![CDATA[Time administration]]></string>
     <string name="_bx_tasks_menu_title_browse"><![CDATA[Browse Tasks]]></string>
     <string name="_bx_tasks_menu_set_title_browse"><![CDATA[Browse Tasks]]></string>
 

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

@@ -13,7 +13,7 @@ DELETE FROM `sys_pages_blocks` WHERE `module` = 'bx_tasks' OR `object` IN('bx_ta
 -- MENU
 DELETE FROM `sys_objects_menu` WHERE `module` = 'bx_tasks';
 DELETE FROM `sys_menu_sets` WHERE `module` = 'bx_tasks';
-DELETE FROM `sys_menu_items` WHERE `module` = 'bx_tasks' OR `set_name` IN('bx_tasks_create_task_attachments', 'bx_tasks_view', 'bx_tasks_view_actions', 'bx_tasks_view_submenu', 'bx_tasks_view_context_submenu', 'bx_tasks_use_tools_submenu', 'bx_tasks_manage_tools_submenu', 'bx_tasks_menu_manage_tools', 'bx_tasks_browse');
+DELETE FROM `sys_menu_items` WHERE `module` = 'bx_tasks' OR `set_name` IN('bx_tasks_create_task_attachments', 'bx_tasks_view', 'bx_tasks_view_actions', 'bx_tasks_submenu', 'bx_tasks_view_submenu', 'bx_tasks_view_context_submenu', 'bx_tasks_use_tools_submenu', 'bx_tasks_manage_tools_submenu', 'bx_tasks_menu_manage_tools', 'bx_tasks_browse');
 
 -- PRIVACY 
 DELETE FROM `sys_objects_privacy` WHERE `object` = 'bx_tasks_allow_view_to';

+ 0 - 8
modules/boonex/tasks/install/sql/enable-app.sql

@@ -16,7 +16,6 @@ UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_view_entry
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_view_entry' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_sys_entry_comments' AND `title`='_bx_tasks_page_block_title_entry_comments';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_context' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_sys_menu_in_context' AND `title`='_bx_tasks_page_block_title_menu_in_context';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_context' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_sys_entries_in_context' AND `title`='_bx_tasks_page_block_title_entries_in_context';
-UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_home' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_menu_browse' AND `title`='_bx_tasks_page_block_title_menu_browse';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_home' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_sys_home_entries' AND `title`='_bx_tasks_page_block_title_home_entries';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_context_time' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_sys_menu_in_context' AND `title`='_bx_tasks_page_block_title_menu_in_context';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_context_time' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_sys_entries_time_in_context' AND `title`='_bx_tasks_page_block_title_entries_time_in_context';
@@ -28,12 +27,7 @@ UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_manage' AN
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_administration' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_manage_administration' AND `title`='_bx_tasks_page_block_title_manage';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_time_manage' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_time_manage' AND `title`='_bx_tasks_page_block_title_time_manage';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_time_administration' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_time_manage_administration' AND `title`='_bx_tasks_page_block_title_time_manage';
-UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_timers' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_menu_browse' AND `title`='_bx_tasks_page_block_title_menu_browse';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_timers' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_timers' AND `title`='_bx_tasks_page_block_title_timers';
-UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_manage' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_menu_browse' AND `title`='_bx_tasks_page_block_title_menu_browse';
-UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_administration' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_menu_browse' AND `title`='_bx_tasks_page_block_title_menu_browse';
-UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_time_manage' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_menu_browse' AND `title`='_bx_tasks_page_block_title_menu_browse';
-UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_time_administration' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_system_menu_browse' AND `title`='_bx_tasks_page_block_title_menu_browse';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_context_pre_values' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_sys_menu_in_context' AND `title`='_bx_tasks_page_block_title_menu_in_context';
 UPDATE `sys_pages_blocks` SET `active_api`=1 WHERE `object`='bx_tasks_context_settings' AND `module`='bx_tasks' AND `title_system`='_bx_tasks_page_block_title_sys_menu_in_context' AND `title`='_bx_tasks_page_block_title_menu_in_context';
 
@@ -51,8 +45,6 @@ UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view' AND
 UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view_actions' AND `module`='bx_tasks' AND `name`='edit-task';
 UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view_actions' AND `module`='bx_tasks' AND `name`='edit-task-state';
 UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view_actions' AND `module`='bx_tasks' AND `name`='delete-task';
-UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view_actions' AND `module`='bx_tasks' AND `name`='set-completed';
-UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view_actions' AND `module`='bx_tasks' AND `name`='set-uncompleted';
 UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view_actions' AND `module`='bx_tasks' AND `name`='reaction';
 UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view_actions' AND `module`='bx_tasks' AND `name`='report';
 UPDATE `sys_menu_items` SET `active_api`=1 WHERE `set_name`='bx_tasks_view_context_submenu' AND `module`='bx_tasks' AND `name`='tasks-context';

+ 12 - 0
modules/boonex/tasks/install/sql/enable.sql

@@ -237,6 +237,18 @@ INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `titl
 ('bx_tasks_view_actions', 'bx_tasks', 'more-auto', '_sys_menu_item_title_system_va_more_auto', '_sys_menu_item_title_va_more_auto', 'javascript:void(0)', '', '', 'ellipsis-v', '', '', 0, 2147483647, '', 1, 0, 9999);
 
 
+-- MENU: module sub-menu
+INSERT INTO `sys_objects_menu`(`object`, `title`, `set_name`, `module`, `template_id`, `deletable`, `active`, `override_class_name`, `override_class_file`) VALUES 
+('bx_tasks_submenu', '_bx_tasks_menu_title_submenu', 'bx_tasks_submenu', 'bx_tasks', 8, 0, 1, 'BxTasksMenuSubmenu', 'modules/boonex/tasks/classes/BxTasksMenuSubmenu.php');
+
+INSERT INTO `sys_menu_sets`(`set_name`, `module`, `title`, `deletable`) VALUES 
+('bx_tasks_submenu', 'bx_tasks', '_bx_tasks_menu_set_title_submenu', 0);
+
+INSERT INTO `sys_menu_items`(`set_name`, `module`, `name`, `title_system`, `title`, `link`, `onclick`, `target`, `icon`, `submenu_object`, `visible_for_levels`, `active`, `active_api`, `copyable`, `order`) VALUES 
+('bx_tasks_submenu', 'bx_tasks', 'use', '_bx_tasks_menu_item_title_system_submenu_use', '', '', '', '', '', 'bx_tasks_use_tools_submenu', 2147483646, 0, 1, 0, 1),
+('bx_tasks_submenu', 'bx_tasks', 'browse', '_bx_tasks_menu_item_title_system_submenu_browse', '', '', '', '', '', 'bx_tasks_browse', 2147483646, 0, 1, 0, 2),
+('bx_tasks_submenu', 'bx_tasks', 'manage', '_bx_tasks_menu_item_title_system_submenu_manage', '', '', '', '', '', 'bx_tasks_manage_tools_submenu', 2147483646, 0, 1, 0, 3);
+
 -- 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 
 ('bx_tasks_view_submenu', '_bx_tasks_menu_title_view_entry_submenu', 'bx_tasks_view_submenu', 'bx_tasks', 8, 0, 1, 'BxTasksMenuView', 'modules/boonex/tasks/classes/BxTasksMenuView.php');

+ 1 - 2
modules/boonex/tasks/template/menu_browse.html

@@ -3,15 +3,14 @@
         <div class="bx-tasks-mb-use">
             __menu_use__
         </div>
-        <div class="bx-tasks-mb-div bx-def-hr my-4"></div>
         <bx_if:show_menu_browse>
+            <div class="bx-tasks-mb-div bx-def-hr my-4"></div>
             <div class="bx-tasks-mb-browse">
                 __menu_browse__
             </div>
         </bx_if:show_menu_browse>
         <bx_if:show_menu_manage>
             <div class="bx-tasks-mb-div bx-def-hr my-4"></div>
-            <div class="bx-tasks-mb-manage-title mb-4 font-bold"><bx_text:_bx_tasks_menu_title_public_manage_tools_submenu /></div>
             <div class="bx-tasks-mb-manage">
                 __menu_manage__
             </div>

+ 2 - 2
package.json

@@ -27,14 +27,14 @@
     "flatpickr": "^4.6.13",
     "flickity": "^3.0.0",
     "fullcalendar": "^6.1.21",
-    "grapesjs": "^0.23.4",
+    "grapesjs": "^0.23.5",
     "grapesjs-blocks-basic": "^1.0.2",
     "grapesjs-preset-newsletter": "^1.0.2",
     "grapesjs-preset-webpage": "^1.0.3",
     "grapesjs-style-bg": "^2.0.2",
     "headroom.js": "^0.12.0",
     "highlight.js": "github:highlightjs/highlight.js",
-    "hls.js": "^1.6.17",
+    "hls.js": "^1.7.0",
     "htmx-ext-head-support": "^2.0.5",
     "htmx-ext-preload": "^2.1.2",
     "htmx.org": "^2.0.10",

+ 5 - 0
template/scripts/BxBaseFormView.php

@@ -429,6 +429,11 @@ class BxBaseFormView extends BxDolForm
 
             $bType = isset($aInput['type']);
 
+            if ($bType && 'select' == $aInput['type']) {
+                if(($sK1 = 'value') && empty($aInput[$sK1]) && ($aValues = $aInput['values'] ?? false) && is_array($aValues))
+                    $aInput[$sK1] = reset($aValues)['key'] ?? key($aValues);
+            }
+
             if ($bType && 'files' == $aInput['type']) {
                 $oStorage = BxDolStorage::getObjectInstance($aInput['storage_object']);
                 $aInput['ext_allow'] = $oStorage->getObjectData()['ext_allow'];

+ 10 - 10
yarn.lock

@@ -1644,10 +1644,10 @@ grapesjs-style-gradient@^3.0.1:
   dependencies:
     grapick "^0.1.13"
 
-grapesjs@^0.23.4:
-  version "0.23.4"
-  resolved "https://registry.yarnpkg.com/grapesjs/-/grapesjs-0.23.4.tgz#cea8831b3d373001a4aafa13ccdaef41072786f6"
-  integrity sha512-fe3+ZRU1YsR8cFqdjl0TFlNywgBPjlQjDLevyavP8UmT9dfVla5JnfQrFc66gzMBdN1ftNPA23YRdTQJRFTKQA==
+grapesjs@^0.23.5:
+  version "0.23.5"
+  resolved "https://registry.yarnpkg.com/grapesjs/-/grapesjs-0.23.5.tgz#6b5015429af57943e38a603dcca1b5d17d215d61"
+  integrity sha512-66E5x5ZWJUGMQkL/BfFK6oyuFdXAMpsG15+6atiTPbB/Wf4ChZ4I62R+rgUHr1DDAvrM/LxdPwmqOwdDsrplhw==
   dependencies:
     "@types/backbone" "1.4.15"
     backbone "1.4.1"
@@ -1713,13 +1713,13 @@ headroom.js@^0.12.0:
 
 "highlight.js@github:highlightjs/highlight.js":
   version "11.12.0"
-  uid "27fc2be62282fcce3889866abb61f171e53800f0"
-  resolved "https://codeload.github.com/highlightjs/highlight.js/tar.gz/27fc2be62282fcce3889866abb61f171e53800f0"
+  uid "5a811f0714d1385e2f32d061ca803c5057c4901c"
+  resolved "https://codeload.github.com/highlightjs/highlight.js/tar.gz/5a811f0714d1385e2f32d061ca803c5057c4901c"
 
-hls.js@^1.6.17:
-  version "1.6.17"
-  resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.6.17.tgz#0c96c04e620a52970b036361af17b81e3e0be1f3"
-  integrity sha512-NUplVGVuc1hSPwdB/9/cbRkUmLrYi75/hqiXKdA+l300pJNxDu96R7jRb2imDzWJqIUF4I5ThmAdp9GvOCXsuQ==
+hls.js@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-1.7.0.tgz#43506ae3f3ebc3ed3d5c5f92370be3522688af48"
+  integrity sha512-NnQpT6Z//+2IB2qovSUbKbrlXY1MOpi0JynZ9L2NNOuTJiNCyMSQj9k2laEj1v7CxU/Hb8oTWR98eT3mVpPQVQ==
 
 hosted-git-info@^10.1.0, hosted-git-info@^10.1.1:
   version "10.1.1"