document.addEventListener('DOMContentLoaded', function () { const createProcessModal = document.getElementById('createProcessModal'); const modalTitle = createProcessModal.querySelector('.modal-title'); const form = createProcessModal.querySelector('#createProcessForm'); const processIdInput = createProcessModal.querySelector('#processId'); const processNameInput = createProcessModal.querySelector('#processName'); const definitionJsonTextarea = createProcessModal.querySelector('#definitionJson'); const eligibilityRulesJsonTextarea = createProcessModal.querySelector('#eligibilityRulesJson'); let definition = {}; function render() { const statusesList = document.getElementById('statuses-list'); const transitionsList = document.getElementById('transitions-list'); const initialStatusSelect = document.getElementById('initialStatus'); const fromStatusSelect = document.getElementById('fromStatusSelect'); const toStatusSelect = document.getElementById('toStatusSelect'); statusesList.innerHTML = ''; transitionsList.innerHTML = ''; initialStatusSelect.innerHTML = ''; fromStatusSelect.innerHTML = ''; toStatusSelect.innerHTML = ''; if (definition.nodes) { for (const nodeId in definition.nodes) { const node = definition.nodes[nodeId]; const statusItem = document.createElement('div'); statusItem.textContent = node.name; statusesList.appendChild(statusItem); const option = document.createElement('option'); option.value = node.id; option.textContent = node.name; initialStatusSelect.appendChild(option.cloneNode(true)); fromStatusSelect.appendChild(option.cloneNode(true)); toStatusSelect.appendChild(option.cloneNode(true)); } } if (definition.start_node_id) { initialStatusSelect.value = definition.start_node_id; } if (definition.transitions) { definition.transitions.forEach(transition => { const transitionItem = document.createElement('div'); const fromNode = definition.nodes[transition.from] ? definition.nodes[transition.from].name : 'N/A'; const toNode = definition.nodes[transition.to] ? definition.nodes[transition.to].name : 'N/A'; let actions = ''; if(transition.actions) { actions = ' - Actions: ' + JSON.stringify(transition.actions); } transitionItem.textContent = `${transition.name}: ${fromNode} => ${toNode}${actions}`; transitionsList.appendChild(transitionItem); }); } if (definition.eligibility_rules) { eligibilityRulesJsonTextarea.value = JSON.stringify(definition.eligibility_rules, null, 2); } } document.getElementById('addStatusBtn').addEventListener('click', function () { const newStatusInput = document.getElementById('newStatusInput'); const newStatusName = newStatusInput.value.trim(); if (newStatusName) { const newNodeId = (Object.keys(definition.nodes || {}).length + 1).toString(); if (!definition.nodes) { definition.nodes = {}; } definition.nodes[newNodeId] = { id: newNodeId, name: newStatusName }; newStatusInput.value = ''; render(); } }); document.getElementById('addTransitionBtn').addEventListener('click', function () { const fromStatus = document.getElementById('fromStatusSelect').value; const toStatus = document.getElementById('toStatusSelect').value; const transitionActionJson = document.getElementById('transitionActionJson').value; if (fromStatus && toStatus) { if (!definition.transitions) { definition.transitions = []; } const newTransition = { name: `Transition ${definition.transitions.length + 1}`, from: fromStatus, to: toStatus, }; if(transitionActionJson) { try { newTransition.actions = JSON.parse(transitionActionJson); } catch(e) { alert('Invalid JSON in transition actions'); return; } } definition.transitions.push(newTransition); document.getElementById('transitionActionJson').value = ''; render(); } }); form.addEventListener('submit', function (event) { definition.start_node_id = document.getElementById('initialStatus').value; try { const eligibilityRules = eligibilityRulesJsonTextarea.value; if(eligibilityRules) { definition.eligibility_rules = JSON.parse(eligibilityRules); } else { delete definition.eligibility_rules; } } catch(e) { alert('Invalid JSON in eligibility rules'); event.preventDefault(); return; } definitionJsonTextarea.value = JSON.stringify(definition, null, 2); }); createProcessModal.addEventListener('show.bs.modal', function (event) { const button = event.relatedTarget; const isEdit = button.classList.contains('edit-process-btn'); if (isEdit) { const processId = button.dataset.processId; const processName = button.dataset.processName; const subjectScope = button.dataset.subjectScope || 'person'; const processDefinition = button.dataset.processDefinition; modalTitle.textContent = 'Edit Process'; processIdInput.value = processId; processNameInput.value = processName; if(document.getElementById('subjectScope')) document.getElementById('subjectScope').value = subjectScope; try { definition = JSON.parse(processDefinition || '{}'); } catch(e) { definition = {}; } } else { modalTitle.textContent = 'Create Process'; processIdInput.value = ''; processNameInput.value = ''; definition = {}; } eligibilityRulesJsonTextarea.value = ''; render(); }); });