Files
crm.clientright.ru/modules/Settings/Workflow2/views/resources/Config.js
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

428 lines
18 KiB
JavaScript

var isReadonly = false;
jQuery('#workflowObjectsContainer').on('block:dragstop', function(event, ele, ui) {
ElementSelection.savePositionsAfterDragging();
});
jQuery('#workflowObjectsContainer').on('block:dblclick', function(event, taskId) {
window.open("index.php?module=Workflow2&parent=Settings&view=TaskConfig&taskid=" + taskId, "Config", "width=1154,height=750").focus();
});
jQuery('#workflowObjectsContainer').on('object:dblclick', function(event, module, taskId) {
jQuery.post("index.php?module=Workflow2&action=RecordList&parent=Settings" , { module_name:module, objectID: taskId }, function(response) {
FlexUtils('Workflow2').showModalBox(response).then(function() {
jQuery('#modalSubmitButton').on('click', function() {
app.hideModalWindow();
saveObjectRecord(jQuery('#workflowObjectId').val());
jQuery( this ).dialog( "close" );
return false;
});
});
return;
});
});
var wfMousePos = {x:0, y:0};
jQuery(function() {
jQuery('#workflowDesignContainer').mousemove(function(e) {
wfMousePos.x = e.pageX;
wfMousePos.y = e.pageY;
});
});
function initDragBlock(ele) {
ElementSelection.initEvent('.contentsDiv', '.wfBlock');
jsPlumbInstance.draggable(jsPlumb.getSelector(ele), {
start:function(params) {
jQuery('span.blockDescription', params.el).hide();
jQuery('img.settingsIcon', params.el).hide();
ElementSelection.startDragging('#workflowDesignContainer', params.el, params.e);
//jsPlumbInstance.setSuspendDrawing(true);
},
drag:function(params) {
ElementSelection.doDragging('#workflowDesignContainer', params.pos[0], params.pos[1]);
if(params.pos[1] > currentWorkSpaceHeight - 150) {
jQuery('#mainWfContainer').css('height', (currentWorkSpaceHeight + 100) + 'px');
currentWorkSpaceHeight = currentWorkSpaceHeight + 100;
}
if(params.pos[0] > currentWorkSpaceWidth - 200) {
jQuery('#mainWfContainer').css('width', (currentWorkSpaceWidth + 250) + 'px');
currentWorkSpaceWidth = currentWorkSpaceWidth + 100;
}
},
stop:onDragStopBlock
});
}
jQuery('#workflowObjectsContainer').on('designer:init', function() {
if(jQuery(".wfBlock").length > 0) {
initDragBlock('.wfBlock');
}
jsPlumbInstance.bind("click", function(c, origEvent) {
jsPlumbInstance.deleteConnection(c);
});
// jsPlumb.bind("connectionDetached", function(c, origEvent) {
// console.log('detach');
// });
/*
jsPlumb.bind("connectionDetached", function(c, origEvent) {
// console.log('del');
var parameters = c.connection.getParameters();
// console.log(c, parameters);
var params = {
module: 'Workflow2',
action: 'ConnectionDel',
parent: 'Settings',
workflow: workflow_id,
destination:c.targetId + '__input',
source:parameters["out"]
};
RedooAjax('Workflow2').post('index.php', params);
//AppConnector.request(params);
});
*/
jsPlumbInstance.bind("connection", function(params) {
console.log('newCOnnection');
if(jsPlumbInit === true) return;
var parameters = params.connection.getParameters();
var params = {
module: 'Workflow2',
action: 'ConnectionAdd',
parent: 'Settings',
workflow: workflow_id,
destination:parameters["in"],
source:parameters["out"]
};
RedooAjax('Workflow2').post('index.php', params);
//AppConnector.request(params);
});
jsPlumbInstance.bind("connectionDetached", function(params) {
var parameters = params.connection.getParameters();
var params = {
module: 'Workflow2',
action: 'ConnectionDel',
parent: 'Settings',
workflow: workflow_id,
destination:parameters["in"],
source:parameters["out"]
};
RedooAjax('Workflow2').post('index.php', params);
//AppConnector.request(params);
});
jQuery(".workflowDesignerObject_text").bind("dblclick", editTextObject);
jQuery(".workflowDesignerObject_text").bind("contextmenu", removeObject);
});
jsPlumb.bind("ready", function() {
jQuery(".colorLayer.colored").each(function(index, value) {
var ele = jQuery(value);
var color = ele.data("color").substr(1);
if(color != '' && color != 'FFFFFF' && lastColors.indexOf(color) == -1) {
lastColors.push(color);
}
if(lastColors.length == 6) {
return false;
}
});
jQuery.contextMenu({
selector: '.context-wfBlock',
callback: function(key, options) {
switch(key) {
case "config":
onDblClickBlock({target:{id:options.$trigger.get(0).id}});
break;
case "selectall":
var type = jQuery(options.$trigger.get(0)).data('type');
ElementSelection.clearSelection();
jQuery('.wfBlock[data-type="' + type + '"]').each(function(index, ele) {
ElementSelection.select(ele, true);
});
break;
case "duplicate":
jQuery.each(ElementSelection.getSelectedBlocks(), function(index, ele) {
if(jQuery(ele).data('type') != 'start') {
addBlock(0, 0, jQuery(ele).attr('id').replace("block__", ""));
}
});
break;
case 'export':
var blockIds = [];
jQuery.each(ElementSelection.getSelectedBlocks(), function(index, ele) {
if(jQuery(ele).data('type') != 'start') {
blockIds.push(jQuery(ele).attr('id').replace("block__", ""));
}
});
jQuery.post('index.php', {module:'Workflow2',parent:'Settings','view':'BlockTextExportPopup', workflow_id:workflow_id, block_ids:blockIds}, function(response) {
FlexUtils('Workflow2').showModalBox(response);
});
break;
case 'import':
var position = wfMousePos;
var elePosition = jQuery('#workflowDesignContainer').offset();
position.y -= elePosition.top;
position.x -= elePosition.left;
jQuery.getScript('modules/Workflow2/views/resources/js/jquery.form.min.js');
jQuery.post('index.php', {module:'Workflow2',parent:'Settings','view':'BlockTextImportPopup', workflow_id:workflow_id, position:wfMousePos}, function(response) {
FlexUtils('Workflow2').showModalBox(response).then(function() {
jQuery('#blockImportPopupForm').on('submit', function(e) {
e.preventDefault();
e.stopPropagation();
var options = {
success:function(response) {
if(typeof response.success != 'undefined' && response.success == false) {
alert('Error: ' + response.error.code);
return;
}
jQuery.each(response.blocks, function(index, blockData) {
var html = blockData.html;
jQuery("#WFTaskContainer").append(html);
jQuery("#block__" + blockData.blockID).fadeIn("fast");
jQuery('.WorkflowTypeContainer[data-type="'+blockData.type+'"]').effect('transfer', { to: jQuery("#block__" + blockData.blockID), className: "ui-effects-transfer" });
initBlockEvents(blockData.blockID, blockData.outputPoints, blockData.personPoints);
});
jQuery.each(response.connections, function(index, connection) {
connectEndpoints('block__' + connection.source_id + "__" + connection.source_key,'block__' + connection.destination_id + "__" + connection.destination_key);
});
app.hideModalWindow();
},
'dataType':'json'
};
jQuery('#blockImportPopupForm').ajaxSubmit(options);
});
});
});
break;
case "copy":
var blockIds = [];
jQuery.each(ElementSelection.getSelectedBlocks(), function(index, ele) {
if(jQuery(ele).data('type') != 'start') {
blockIds.push(jQuery(ele).attr('id').replace("block__", ""));
}
});
copyBlocks(blockIds);
break;
case 'paste':
pasteBlocks();
break;
case "removecolor":
jQuery.each(ElementSelection.getSelectedBlocks(), function(index, ele) {
setColorLayer(jQuery(ele).attr('id'), "FFFFFF");
});
break;
case "color":
currentColorPicker = [options.$trigger.get(0).id];
var position = options.$menu.position();
jQuery("#colorPickerElement").css({"position":"absolute", "left": "300px", "top":"200px"}).unbind("change").unbind("removepicker").bind("change", function() {
setColorLayer(currentColorPicker[0], this.value);
}).bind("removepicker", function() {
if(this.value != 'FFFFFF' && lastColors.indexOf(this.value) == -1) {
if(lastColors.length >= 6) {
lastColors.shift();
}
lastColors.push(this.value);
}
});
var myPicker = new jscolor.color(document.getElementById('colorPickerElement'), {pickerClosable:true, showlast:lastColors});
myPicker.fromString(jQuery("#" + options.$trigger.get(0).id + " .colorLayer").data("color").substr(1)) // now you can access API via 'myPicker' variable
myPicker.drawPicker2(position.left, position.top);
currentColorPicker[1] = myPicker;
break;
case "delete":
if(confirm("Realy delete selected blocks?") == false)
return;
jQuery.each(ElementSelection.getSelectedBlocks(), function(index, ele) {
removeBlock(jQuery(ele).attr('id'));
});
break;
}
},
items: {
"config": {name: "Config", icon: "edit"},
"sep1A": "---------",
"selectall": {name: app.vtranslate('select all of this type'), icon: "select"},
"sep1A2": "---------",
"duplicate": {name: app.vtranslate('LBL_DUPLICATE_BLOCK'), icon: "copy"},
"copy": {name: app.vtranslate('LBL_COPY_BLOCK'), icon: "copy"},
"paste": {name: app.vtranslate('LBL_PASTE_BLOCK'), icon: "paste", disabled:function() { return copyHash === null }},
"export": {name: app.vtranslate('Export Blocks by Text')},
"import": {name: app.vtranslate('Import Blocks by Text')},
"sep1": "---------",
"color": {name: app.vtranslate('LBL_CHANGE_BLOCKCOLOR'), icon: "color"},
"removecolor": {name: app.vtranslate('LBL_REMOVE_BLOCKCOLOR'), icon: "colorremove"},
"sep2": "---------",
"delete": {name: app.vtranslate('LBL_DELETE_BLOCK'), icon: "delete"}
}
});
});
function removePerson(person_id) {
jQuery.post("index.php" , {module:'Workflow2', parent:'Settings', action:'PersonRemove', block_id:person_id, workflow_id:workflow_id });
jsPlumb.removeAllEndpoints(person_id);
jQuery("#" + person_id).remove();
}
function removeBlock(block_id) {
if(jQuery('#' + block_id).data('type') == 'start') return;
var params = {
module: 'Workflow2',
action: 'BlockDel',
parent: 'Settings',
workflow: workflow_id,
blockid: block_id
};
RedooAjax('Workflow2').post('index.php', params);
//AppConnector.request(params);
jsPlumbInstance.removeAllEndpoints(block_id);
jQuery("#" + block_id).fadeOut("fast", function() {
jQuery(this).remove();
});
}
function pasteBlocks() {
var position = wfMousePos;
var elePosition = jQuery('#workflowDesignContainer').offset();
position.y -= elePosition.top;
position.x -= elePosition.left;
jQuery.post('index.php', { module:'Workflow2', 'parent' : 'Settings', 'action':'BlockPaste', workflow:workflow_id, 'hash': copyHash, position:wfMousePos}, function(response) {
jQuery.each(response.blocks, function(index, blockData) {
var html = blockData.html;
jQuery("#WFTaskContainer").append(html);
jQuery("#block__" + blockData.blockID).fadeIn("fast");
jQuery('.WorkflowTypeContainer[data-type="'+blockData.type+'"]').effect('transfer', { to: jQuery("#block__" + blockData.blockID), className: "ui-effects-transfer" });
initBlockEvents(blockData.blockID, blockData.outputPoints, blockData.personPoints);
});
jQuery.each(response.connections, function(index, connection) {
connectEndpoints('block__' + connection.source_id + "__" + connection.source_key,'block__' + connection.destination_id + "__" + connection.destination_key);
});
}, 'json');
}
function copyBlocks(blockIds) {
jQuery.post('index.php', { module:'Workflow2', 'action':'BlockCopy', 'parent':'Settings', workflow:workflow_id, blockids:blockIds }, function(response) {
copyHash = response;
});
}
function addRecord(module_name) {
jQuery.post("index.php", { module:'Workflow2', parent:'Settings', action:'PersonAdd',workflow:workflow_id, module_name:module_name }, function(response) {
var element_id = response.element_id;
var topPos = response.topPos;
var leftPos = response.leftPos;
var html = '<div class="wfBlock wfPerson" id="' + element_id + '" style="top:' + topPos + 'px;left:' + leftPos + 'px;">Not connected<img src="modules/Workflow2/icons/cross-button.png" class="removePersonIcon" onclick="removePerson(\'' + element_id + '\');"></div>';
jQuery("#workflowDesignContainer").append(html);
endpoints[element_id + "__person"] = jsPlumb.addEndpoint(element_id, { anchor:bottomAnchor, maxConnections:maxConnections }, jQuery.extend(getInput('modules/Workflow2/icons/peopleOutput.png', "person", true, false, true), {parameters:{ out:element_id + '__person' }}));
jsPlumb.setDraggable("#" + element_id, true);
jQuery("#" + element_id).bind( "dblclick", onDblClickBlock);
jQuery("#" + element_id).bind( "dragstop", onDragStopBlock);
}, 'json');
}
function addObject(type) {
var html = false;
type = type.toLowerCase();
workflowDesignerObjectCounter = Number(workflowDesignerObjectCounter) + 1;
jQuery.post("index.php", {module:'Workflow2', parent:'Settings', action:'ObjectAdd',type:type, workflow: workflow_id}, function(response) {
html = response["content"];
id = response["id"];
// console.log(html);
if(html !== false) {
jQuery("#workflowObjectsContainer").append(html);
initTextDrag("#" + id);
jQuery("#" + id).bind("dblclick", editTextObject);
jQuery("#" + id).bind("contextmenu", removeObject);
}
}, "json");
}
function removeObject(event) {
var currentCKEditorObjectId = this.id.substr(this.id.indexOf("_") + 1);
jQuery.post("index.php", {module:'Workflow2', parent:'Settings', action:'ObjectRemove', id: currentCKEditorObjectId});
jQuery(this).fadeOut("fast")
return false;
}
function editTextObject(id) {
var currentCKEditorObjectId = this.id.substr(this.id.indexOf("_") + 1);
jQuery( "#workflowDesignerObject_" + currentCKEditorObjectId).draggable("destroy");
jQuery("#workflowDesignerObject_" + currentCKEditorObjectId).attr("contenteditable", "true");
var editor = CKEDITOR.inline( document.getElementById( 'workflowDesignerObject_' + currentCKEditorObjectId) , {startupFocus :true});
editor.on("blur", function() {
editor.destroy();
jQuery("#workflowDesignerObject_" + currentCKEditorObjectId).removeAttr("contenteditable");
initTextDrag("#workflowDesignerObject_" + currentCKEditorObjectId);
jQuery.post("index.php", { module:'Workflow2', parent:'Settings', action:'ObjectSetText', id: currentCKEditorObjectId, text: jQuery("#workflowDesignerObject_" + currentCKEditorObjectId).html()});
});
}
function initTextDrag(objectSelector) {
jQuery(objectSelector).draggable({
stop: function(event, ui) {
var currentCKEditorObjectId = this.id.substr(this.id.indexOf("_") + 1);
jQuery.post("index.php", { module:'Workflow2', parent:'Settings', action:'ObjectSetPos', id: currentCKEditorObjectId, y: ui.position.top, x: ui.position.left });
}
});
}
function saveObjectRecord(objectID) {
var selected = jQuery('#recordSelector').val();
jQuery.post("index.php", {module:'Workflow2', parent:'Settings', action:'ObjectRecordConnection', objectID:objectID, recordID: selected}, function(response) {
jQuery('#person__' + objectID + " span").html(jQuery('#person__' + objectID + " span").html().replace(jQuery('#person__' + objectID + " span").text(), response));
});
}
initTextDrag(".workflowDesignerObject_text");