Explorar o código

Ticket #4711 - Automations: Assistants.

AntonLV %!s(int64=2) %!d(string=hai) anos
pai
achega
bab98dbc9b

+ 10 - 0
inc/classes/BxDolAI.php

@@ -205,6 +205,16 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
                     $mixedResult .= "\n ]";
                 }
                 break;
+
+            case 'assistants':
+                $aAssistants = $this->_oDb->getAssistantsBy(['sample' => 'ids', 'ids' => $mixedParams]);
+                if(!empty($aAssistants) && is_array($aAssistants)) {
+                    $mixedResult = "\n Assistants list = [";
+                    foreach($aAssistants as $aAssistant)
+                        $mixedResult .= "\n {'" . $aAssistant['name'] . "', 'AssistantDescription' => '" . $aAssistant['description'] . "'}";
+                    $mixedResult .= "\n ]";
+                }
+                break;
         }
 
         return $mixedResult;

+ 17 - 4
inc/classes/BxDolAIQuery.php

@@ -193,8 +193,8 @@ class BxDolAIQuery extends BxDolDb
                     'id' => $aParams['id']
                 ];
 
-                $sSelectClause = "`tap`.`id`, `tap`.`provider_id`";
-                $sJoinClause = "INNER JOIN `sys_agents_automators_providers` AS `tap` ON `taa`.`id`=`tap`.`automator_id`";
+                $sSelectClause = "`taap`.`id`, `taap`.`provider_id`";
+                $sJoinClause = "INNER JOIN `sys_agents_automators_providers` AS `taap` ON `taa`.`id`=`taap`.`automator_id`";
                 $sWhereClause = " AND `taa`.`id`=:id";
                 break;
             
@@ -206,8 +206,21 @@ class BxDolAIQuery extends BxDolDb
                     'id' => $aParams['id']
                 ];
 
-                $sSelectClause = "`tah`.`id`, `tah`.`helper_id`";
-                $sJoinClause = "INNER JOIN `sys_agents_automators_helpers` AS `tah` ON `taa`.`id`=`tah`.`automator_id`";
+                $sSelectClause = "`taah`.`id`, `taah`.`helper_id`";
+                $sJoinClause = "INNER JOIN `sys_agents_automators_helpers` AS `taah` ON `taa`.`id`=`taah`.`automator_id`";
+                $sWhereClause = " AND `taa`.`id`=:id";
+                break;
+            
+            case 'assistants_by_id_pairs':
+                $aMethod['name'] = 'getPairs';
+                $aMethod['params'][1] = 'id';
+                $aMethod['params'][2] = 'assistant_id';
+                $aMethod['params'][3] = [
+                    'id' => $aParams['id']
+                ];
+
+                $sSelectClause = "`taaa`.`id`, `taaa`.`assistant_id`";
+                $sJoinClause = "INNER JOIN `sys_agents_automators_assistants` AS `taaa` ON `taa`.`id`=`taaa`.`automator_id`";
                 $sWhereClause = " AND `taa`.`id`=:id";
                 break;
         }

+ 2 - 0
modules/boonex/english/data/langs/system/en.xml

@@ -2174,6 +2174,8 @@
     <string name="_sys_agents_automators_field_providers_add"><![CDATA[Add]]></string>
     <string name="_sys_agents_automators_field_helpers"><![CDATA[Helpers]]></string>
     <string name="_sys_agents_automators_field_helpers_add"><![CDATA[Add]]></string>
+    <string name="_sys_agents_automators_field_assistants"><![CDATA[Assistants]]></string>
+    <string name="_sys_agents_automators_field_assistants_add"><![CDATA[Add]]></string>
     <string name="_sys_agents_automators_field_message"><![CDATA[Prompt]]></string>
     <string name="_sys_agents_automators_field_message_err"><![CDATA[Prompt is essential. Please type something here.]]></string>
     <string name="_sys_agents_automators_field_status_auto"><![CDATA[Auto]]></string>

+ 2 - 0
modules/boonex/russian/data/langs/system/ru.xml

@@ -2150,6 +2150,8 @@
         <string name="_sys_agents_automators_field_providers_add"><![CDATA[Добавить]]></string>
         <string name="_sys_agents_automators_field_helpers"><![CDATA[Помощники]]></string>
         <string name="_sys_agents_automators_field_helpers_add"><![CDATA[Добавить]]></string>
+        <string name="_sys_agents_automators_field_assistants"><![CDATA[Ассистенты]]></string>
+        <string name="_sys_agents_automators_field_assistants_add"><![CDATA[Добавить]]></string>
         <string name="_sys_agents_automators_field_message"><![CDATA[Инструкции]]></string>
         <string name="_sys_agents_automators_field_message_err"><![CDATA[Инструкции имеют важное значение. Пожалуйста, напишите что-нибудь здесь.]]></string>
         <string name="_sys_agents_automators_field_status_auto"><![CDATA[Авто]]></string>

+ 14 - 0
studio/js/agents.js

@@ -108,6 +108,20 @@ BxDolStudioPageAgents.prototype.helperDelete = function(oButton) {
     $(oButton).parents('.bx-form-input-helper:first').remove();
 };
 
+BxDolStudioPageAgents.prototype.assistantAdd = function(oButton, sName) {
+    var oButton = $(oButton);
+
+    var oSubentry = oButton.parents('#bx-form-element-' + sName).find('.bx-form-input-assistant:first').clone();
+    oSubentry.find("select").val('');
+    oSubentry.find("input[type = 'hidden']").remove();
+
+    oButton.parents('.bx-form-input-assistant-add:first').before(oSubentry);
+};
+
+BxDolStudioPageAgents.prototype.assistantDelete = function(oButton) {
+    $(oButton).parents('.bx-form-input-assistant:first').remove();
+};
+
 BxDolStudioPageAgents.prototype._getDefaultData = function() {
     var oDate = new Date();
     return jQuery.extend({}, this._oRequestParams, {_t:oDate.getTime()});

+ 11 - 0
studio/template/agents_automator_form_assistants.html

@@ -0,0 +1,11 @@
+<div class="bx-form-input-assistants">
+    <bx_repeat:assistants>
+        <div class="bx-form-input-assistant bx-def-padding-thd-topbottom">
+            <div class="bx-form-input-assistant-cell bx-fi-ac-txt">__input_select__</div>
+            <div class="bx-form-input-assistant-cell bx-fi-ac-btn bx-def-padding-sec-left">
+                <a class="bx-btn" href="javascript:void(0)" onclick="javascript:__js_object__.assistantDelete(this)"><bx_image_auto:times /></a>
+            </div>
+        </div>
+    </bx_repeat:assistants>
+    <div class="bx-form-input-assistant-add">__btn_add__</div>
+</div>

+ 25 - 0
studio/template/css/agents.css

@@ -65,4 +65,29 @@
 .bx-form-input-helper-add .bx-form-input-button {
     display: inline-block;
     float: none;
+}
+
+/*-- Automators form: Assistants --*/
+.bx-form-input-assistant {
+    display: -webkit-flex;
+    display: flex;
+    -webkit-align-items: center;
+    align-items: center;
+}
+.bx-form-input-assistant-cell.bx-fi-ac-txt {
+    -webkit-flex: 1 1 auto;
+    -ms-flex: 1 1 auto;
+    flex: 1 1 auto;
+}
+.bx-form-input-assistant-cell.bx-fi-ac-btn {
+    -webkit-flex: 0 0 auto;
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
+}
+.bx-form-input-assistant-add {
+    text-align: right;
+}
+.bx-form-input-assistant-add .bx-form-input-button {
+    display: inline-block;
+    float: none;
 }

+ 120 - 6
studio/template/scripts/BxBaseStudioAgentsAutomators.php

@@ -62,7 +62,11 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
             $iModel = $oForm->getCleanValue('model_id');
             $sType = $oForm->getCleanValue('type');
             $aProviders = $oForm->getCleanValue('providers');
+            $bProviders = !empty($aProviders) && is_array($aProviders);
             $aHelpers = $oForm->getCleanValue('helpers');
+            $bHelpers = !empty($aHelpers) && is_array($aHelpers);
+            $aAssistants = $oForm->getCleanValue('assistants');
+            $bAssistants = !empty($aAssistants) && is_array($aAssistants);
             $sMessage = $oForm->getCleanValue('message');
             $bMessage = !empty($sMessage);
             $sMessageAdd = '';
@@ -71,10 +75,12 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
             $oAIModel = $oAI->getModelObject($iModel);
 
             $sInstructions = $oAI->getAutomatorInstruction('profile', $iProfileId);
-            if(!empty($aProviders) && is_array($aProviders))
+            if($bProviders)
                 $sInstructions .= $oAI->getAutomatorInstruction('providers', $aProviders);
-            if(!empty($aHelpers) && is_array($aHelpers))
+            if($bHelpers)
                 $sInstructions .= $oAI->getAutomatorInstruction('helpers', $aHelpers);
+            if($bAssistants)
+                $sInstructions .= $oAI->getAutomatorInstruction('assistants', $aAssistants);
 
             $bIsValid = true;
             $aResponseInit = [];
@@ -123,22 +129,27 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
 
             if($bIsValid) {
                 if(($iId = $oForm->insert($aValsToAdd)) !== false) {
-                    $aProviders = $oForm->getCleanValue('providers');
-                    if(!empty($aProviders) && is_array($aProviders))
+                    if($bProviders)
                         foreach($aProviders as $iProviderId)
                             $this->_oDb->insertAutomatorProvider([
                                 'automator_id' => $iId, 
                                 'provider_id' => $iProviderId
                             ]);
 
-                    $aHelpers = $oForm->getCleanValue('helpers');
-                    if(!empty($aHelpers) && is_array($aHelpers))
+                    if($bHelpers)
                         foreach($aHelpers as $iHelperId)
                             $this->_oDb->insertAutomatorHelper([
                                 'automator_id' => $iId, 
                                 'helper_id' => $iHelperId
                             ]);
 
+                    if($bAssistants)
+                        foreach($aAssistants as $iAssistantId)
+                            $this->_oDb->insertAutomatorAssistant([
+                                'automator_id' => $iId, 
+                                'assistant_id' => $iAssistantId
+                            ]);
+
                     if(($oCmts = BxDolCmts::getObjectInstance($this->_sCmts, $iId)) !== null) {
                         if($bMessage) {
                             $iProfileId = bx_get_logged_profile_id();
@@ -272,6 +283,35 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
                     ]);
             }
 
+            /**
+             * Process Assistants
+             */
+            $aAssistantsIds = $oForm->getCleanValue('assistants_ids');
+            $bAssistantsIds = !empty($aAssistantsIds) && is_array($aAssistantsIds);
+            $aAssistantsValues = $oForm->getCleanValue('assistants');
+            $bAssistantsValues = !empty($aAssistantsValues) && is_array($aAssistantsValues);
+
+            //--- Assistants: Remove deleted
+            if(!empty($aAutomator['assistants']) && is_array($aAutomator['assistants']))
+                $this->_oDb->deleteAutomatorAssistantsById(array_diff(array_keys($aAutomator['assistants']), $bAssistantsIds ? $aAssistantsIds : []));
+
+            //--- Assistants: Update existed
+            if($bAssistantsIds)
+                foreach($aAssistantsIds as $iIndex => $iAhId)
+                    $this->_oDb->updateAutomatorAssistant(['assistant_id' => (int)$aAssistantsValues[$iIndex]], ['id' => (int)$iAhId]);
+
+            //--- Assistants: Add new
+            $iAssistantsIds = $bAssistantsIds ? count($aAssistantsIds) : 0;
+            $iAssistantsValues = $bAssistantsValues ? count($aAssistantsValues) : 0;
+            if($iAssistantsValues > $iAssistantsIds) {
+                $aAssistantsValues = array_slice($aAssistantsValues, $iAssistantsIds);
+                foreach($aAssistantsValues as $iAssistantsValue)
+                    $this->_oDb->insertAutomatorAssistant([
+                        'automator_id' => $iId,
+                        'helper_id' => (int)$iAssistantsValue,
+                    ]);
+            }
+
             $iProfileId = $oForm->getCleanValue('profile_id');
             if(empty($iProfileId)) {
                 $iProfileId = (int)getParam('sys_agents_profile');
@@ -297,6 +337,10 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
                     if(!empty($aHelpers) && is_array($aHelpers))
                         $sInstructions .= $oAI->getAutomatorInstruction('helpers', array_values($aHelpers));
 
+                    $aAssistants = $this->_oDb->getAutomatorsBy(['sample' => 'assistants_by_id_pairs', 'id' => $iId]);
+                    if(!empty($aAssistants) && is_array($aAssistants))
+                        $sInstructions .= $oAI->getAutomatorInstruction('assistants', array_values($aAssistants));
+
                     $oCmts->addAuto([
                         'cmt_author_id' => $iProfileId,
                         'cmt_parent_id' => 0,
@@ -566,6 +610,12 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
                     'caption' => _t('_sys_agents_automators_field_helpers'),
                     'value' => '',
                 ],
+                'assistants' => [
+                    'type' => 'custom',
+                    'name' => 'assistants',
+                    'caption' => _t('_sys_agents_automators_field_assistants'),
+                    'value' => '',
+                ],
                 'message' => [
                     'type' => 'textarea',
                     'name' => 'message',
@@ -723,6 +773,70 @@ class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
             ]);
         }
 
+        if(isset($aForm['inputs']['assistants'])) {
+            $oForm = new BxTemplFormView([]);
+
+            $sAssistants = 'assistants';
+            $aAssistants = array_map(function($sTitle) {
+                return _t($sTitle);
+            }, ['' => '_sys_please_select'] + $this->_oDb->getAssistantsBy(['sample' => 'all_pairs', 'active' => 1]));
+
+            $aTmplVarsAssistants = [];
+            if(!empty($aAutomator[$sAssistants]) && is_array($aAutomator[$sAssistants])) {
+                foreach($aAutomator[$sAssistants] as $iAhId => $iAssistantId) {
+                    $aInputSelect = [
+                        'type' => 'select',
+                        'name' => $sAssistants . '[]',
+                        'values' => $aAssistants,
+                        'value' => (int)$iAssistantId,
+                        'attrs' => [
+                            'class' => 'bx-def-margin-sec-top-auto'
+                        ]
+                    ];
+                    $sInput = $oForm->genInput($aInputSelect);
+
+                    $aInputHidden = [
+                        'type' => 'hidden',
+                        'name' => $sAssistants . '_ids[]',
+                        'value' => (int)$iAhId,
+                    ];
+                    $sInput .= $oForm->genInput($aInputHidden);
+
+                    $aTmplVarsAssistants[] = ['js_object' => $sJsObject, 'input_select' => $sInput];
+                }
+            }
+            else  {
+                $aInputSelect = [
+                    'type' => 'select',
+                    'name' => $sAssistants . '[]',
+                    'values' => $aAssistants,
+                    'value' => '',
+                    'attrs' => [
+                        'class' => 'bx-def-margin-sec-top-auto'
+                    ]
+                ];
+
+                $aTmplVarsAssistants = [
+                    ['js_object' => $sJsObject, 'input_select' => $oForm->genInput($aInputSelect)],
+                ];
+            }
+        
+            $aInputButton = [
+                'type' => 'button',
+                'name' => $sAssistants . '_add',
+                'value' => _t('_sys_agents_automators_field_assistants_add'),
+                'attrs' => [
+                    'class' => 'bx-def-margin-sec-top',
+                    'onclick' => $sJsObject . ".assistantAdd(this, '" . $sAssistants . "');"
+                ]
+            ];
+
+            $aForm['inputs'][$sAssistants]['content'] = $this->_oTemplate->parseHtmlByName('agents_automator_form_assistants.html', [
+                'bx_repeat:assistants' => $aTmplVarsAssistants,
+                'btn_add' => $oForm->genInputButton($aInputButton)
+            ]);
+        }
+
         return $aForm;
     }