Refactoring Properties component
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
function bindWorkflowDesigner(elementId) {
|
||||
bindWorkflowDesignerToolbox(elementId)
|
||||
bindWorkflowDesignerSplitter(elementId)
|
||||
bindWorkflowProperties(elementId)
|
||||
}
|
||||
|
||||
function bindWorkflowDesignerToolbox(elementId) {
|
||||
@@ -612,3 +613,153 @@ function bindWorkflowDesignerSplitter(elementId) {
|
||||
}
|
||||
}
|
||||
|
||||
function bindWorkflowProperties(elementId) {
|
||||
let isDragging = false;
|
||||
let isResizing = false;
|
||||
let startX = 0;
|
||||
let startWidths = {};
|
||||
let resizeType = '';
|
||||
|
||||
console.debug("Binding Properties component for "+ elementId)
|
||||
properties_component = document.getElementById(`p_${elementId}`);
|
||||
if (properties_component == null) {
|
||||
console.error(`'Component ' p_${elementId}' is not found !' `)
|
||||
return
|
||||
}
|
||||
const totalWidth = properties_component.getBoundingClientRect().width
|
||||
console.debug("totalWidth", totalWidth)
|
||||
|
||||
const minPropertiesWidth = Math.floor(totalWidth * 0.2); // 20% minimum
|
||||
|
||||
const inputSection = document.getElementById(`pi_${elementId}`);
|
||||
const propertiesSection = document.getElementById(`pp_${elementId}`);
|
||||
const outputSection = document.getElementById(`po_${elementId}`);
|
||||
const dragHandle = document.getElementById(`ppt_${elementId}`);
|
||||
const leftHandle = document.getElementById(`ppl_${elementId}`);
|
||||
const rightHandle = document.getElementById(`ppr_${elementId}`);
|
||||
|
||||
// Drag and drop for moving properties section
|
||||
dragHandle.addEventListener('mousedown', (e) => {
|
||||
isDragging = true;
|
||||
startX = e.clientX;
|
||||
startWidths = {
|
||||
input: parseInt(inputSection.style.width),
|
||||
properties: parseInt(propertiesSection.style.width),
|
||||
output: parseInt(outputSection.style.width)
|
||||
};
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
// Left resize handle
|
||||
leftHandle.addEventListener('mousedown', (e) => {
|
||||
isResizing = true;
|
||||
resizeType = 'left';
|
||||
startX = e.clientX;
|
||||
startWidths = {
|
||||
input: parseInt(inputSection.style.width),
|
||||
properties: parseInt(propertiesSection.style.width),
|
||||
output: parseInt(outputSection.style.width)
|
||||
};
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
// Right resize handle
|
||||
rightHandle.addEventListener('mousedown', (e) => {
|
||||
isResizing = true;
|
||||
resizeType = 'right';
|
||||
startX = e.clientX;
|
||||
startWidths = {
|
||||
input: parseInt(inputSection.style.width),
|
||||
properties: parseInt(propertiesSection.style.width),
|
||||
output: parseInt(outputSection.style.width)
|
||||
};
|
||||
e.preventDefault();
|
||||
});
|
||||
|
||||
// Mouse move
|
||||
document.addEventListener('mousemove', (e) => {
|
||||
if (isDragging) {
|
||||
const deltaX = e.clientX - startX;
|
||||
let newInputWidth = startWidths.input + deltaX;
|
||||
let newOutputWidth = startWidths.output - deltaX;
|
||||
|
||||
// Constraints
|
||||
if (newInputWidth < 0) {
|
||||
newInputWidth = 0;
|
||||
newOutputWidth = totalWidth - startWidths.properties;
|
||||
}
|
||||
if (newOutputWidth < 0) {
|
||||
newOutputWidth = 0;
|
||||
newInputWidth = totalWidth - startWidths.properties;
|
||||
}
|
||||
|
||||
inputSection.style.width = newInputWidth + 'px';
|
||||
outputSection.style.width = newOutputWidth + 'px';
|
||||
}
|
||||
|
||||
if (isResizing) {
|
||||
const deltaX = e.clientX - startX;
|
||||
let newInputWidth = startWidths.input;
|
||||
let newPropertiesWidth = startWidths.properties;
|
||||
let newOutputWidth = startWidths.output;
|
||||
|
||||
if (resizeType === 'left') {
|
||||
newInputWidth = startWidths.input + deltaX;
|
||||
newPropertiesWidth = startWidths.properties - deltaX;
|
||||
|
||||
if (newInputWidth < 0) {
|
||||
newInputWidth = 0;
|
||||
newPropertiesWidth = startWidths.input + startWidths.properties;
|
||||
}
|
||||
if (newPropertiesWidth < minPropertiesWidth) {
|
||||
newPropertiesWidth = minPropertiesWidth;
|
||||
newInputWidth = totalWidth - minPropertiesWidth - startWidths.output;
|
||||
}
|
||||
} else if (resizeType === 'right') {
|
||||
newPropertiesWidth = startWidths.properties + deltaX;
|
||||
newOutputWidth = startWidths.output - deltaX;
|
||||
|
||||
if (newOutputWidth < 0) {
|
||||
newOutputWidth = 0;
|
||||
newPropertiesWidth = startWidths.properties + startWidths.output;
|
||||
}
|
||||
if (newPropertiesWidth < minPropertiesWidth) {
|
||||
newPropertiesWidth = minPropertiesWidth;
|
||||
newOutputWidth = totalWidth - startWidths.input - minPropertiesWidth;
|
||||
}
|
||||
}
|
||||
|
||||
inputSection.style.width = newInputWidth + 'px';
|
||||
propertiesSection.style.width = newPropertiesWidth + 'px';
|
||||
outputSection.style.width = newOutputWidth + 'px';
|
||||
}
|
||||
});
|
||||
|
||||
// Mouse up
|
||||
document.addEventListener('mouseup', () => {
|
||||
if (isDragging || isResizing) {
|
||||
// Send HTMX request with new dimensions
|
||||
const currentWidths = {
|
||||
input_width: parseInt(inputSection.style.width),
|
||||
properties_width: parseInt(propertiesSection.style.width),
|
||||
output_width: parseInt(outputSection.style.width)
|
||||
};
|
||||
|
||||
try {
|
||||
htmx.ajax('POST', '/workflows/update-properties-layout', {
|
||||
target: `#${elementId}`,
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
swap: "outerHTML",
|
||||
values: { _id: elementId, ...currentWidths }
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('HTMX request failed:', error);
|
||||
throw error;
|
||||
}
|
||||
|
||||
isDragging = false;
|
||||
isResizing = false;
|
||||
resizeType = '';
|
||||
}
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user