var triggerData = null; var triggerID = null; var triggerKind = ''; var TRIG_SEC = { id: 'trigger_action', path: '_trig', isArray: true, interactionStyle: true, itemIDAllowed: false, label: 'Action Block' }; function initTriggerEditor() { editorType = 'triggers'; editorFields = []; loadTriggerList(); if (window.location.hash) loadTriggerItem(window.location.hash.substring(1)); } function loadTriggerList() { loadList(); } function renderTriggerList(filter) { renderList(filter); } function renderList(filter) { var el = $('#listEntries'); var f = (filter || '').toLowerCase(); var t = treeData; function filterIDs(ids) { if (!f) return ids; return ids.filter(function(id) { return String(id).toLowerCase().indexOf(f) >= 0; }); } function renderItems(ids) { var h = ''; (ids || []).forEach(function(id) { h += '
' + esc(id) + '
'; }); return h; } var html = ''; var hasDirs = Object.keys(t.dirs).length > 0; if (t.root.length > 0 || !hasDirs) { if (hasDirs) { var filtered = filterIDs(t.root); if (filtered.length > 0) { var open = !!f || dirOpenState['Root'] === true; html += '
'; html += ''; html += ''; html += 'Root'; html += '' + (f ? filtered.length + '/' + t.root.length : t.root.length) + ''; html += ''; html += '
' + renderItems(filtered) + '
'; html += '
'; } } else { html += renderItems(filterIDs(t.root)); } } if (hasDirs) { Object.keys(t.dirs).sort().forEach(function(dir) { var ids = t.dirs[dir] || []; if (ids.length === 0 && !f) return; var filtered = filterIDs(ids); if (f && filtered.length === 0) return; var open = !!f || dirOpenState[dir] === true; html += '
'; html += ''; html += ''; html += '' + esc(dir) + ''; html += '' + (f ? filtered.length + '/' + ids.length : ids.length) + ''; html += ''; html += '
' + renderItems(filtered) + '
'; html += '
'; }); } el.innerHTML = html || '

No triggers

'; el.querySelectorAll('details.dir-group').forEach(function(d) { d.addEventListener('toggle', function() { var n = d.getAttribute('data-name'); if (n) dirOpenState[n] = d.open; }); }); } function loadTriggerItem(id) { loadTrigger(id); } function loadTrigger(id) { triggerID = id; currentID = id; window.location.hash = id; renderTriggerList(''); API.get('/api/triggers/' + encodeURIComponent(id)).then(function(data) { triggerData = data; triggerKind = data._kind || ''; if (!Array.isArray(triggerData.steps)) triggerData.steps = []; window._editorData = { _trig: [{ lock: !!triggerData.lock, condition: triggerData.condition || null, item_id: '', steps: triggerData.steps }] }; window._interVis = {}; window._ieRenderCurrent = renderCurrent; window._ieRenderOnly = function() { mergeTriggerFromEditor(); renderTriggerEditor(triggerID, triggerData); }; window._ieSyncAll = function(ed) { if (ed) ie_syncAllInteractions(ed, [TRIG_SEC]); }; renderTriggerEditor(id, data); }).catch(function(e) { $('#editorMain').innerHTML = '

Failed to load: ' + esc(e.message) + '

'; }); } function mergeTriggerFromEditor() { var ab = window._editorData._trig[0] || {}; if (ab.lock) triggerData.lock = true; else delete triggerData.lock; if (ab.condition) { var cc = ie_cleanCondition(ab.condition); if (cc) triggerData.condition = cc; else delete triggerData.condition; } else { delete triggerData.condition; } triggerData.steps = ab.steps || []; delete triggerData.item_id; } function renderCurrent() { if (!triggerData || !triggerID) return; var flagTypeEl = document.querySelector('input[name="trigFlagType"]:checked'); if (flagTypeEl) { delete triggerData.on_player_flag; delete triggerData.on_global_flag; if (flagTypeEl.value === 'player') { var n = $('#trigFlagName'); triggerData.on_player_flag = n ? n.value.trim() : ''; } else { var n = $('#trigFlagName'); triggerData.on_global_flag = n ? n.value.trim() : ''; } } window._ieSyncAll(window._editorData); mergeTriggerFromEditor(); renderTriggerEditor(triggerID, triggerData); } function renderTriggerEditor(id, data) { var html = renderRenameableHeader('Trigger', id); var kindLabel = data._kind === 'global' ? 'Global Flag' : (data._kind === 'player' ? 'Player Flag' : ''); if (kindLabel) html += '
' + esc(kindLabel) + ' Trigger
'; html += '
'; html += '
'; html += '
'; var isPlayerFlag = data.on_player_flag !== undefined; var isGlobalFlag = data.on_global_flag !== undefined; if (!isPlayerFlag && !isGlobalFlag) isPlayerFlag = true; var flagName = isPlayerFlag ? (data.on_player_flag || '') : (data.on_global_flag || ''); html += '
'; html += '
'; html += 'Flag Subscription'; html += '
'; html += '
'; html += '
'; html += '
'; html += 'Flag Type'; html += '
'; html += ''; html += ''; html += '
'; html += '
'; html += '
'; html += 'Flag Name'; html += ''; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; html += '
'; html += 'Action Block'; html += '
'; html += '
'; html += ie_renderArraySection({ sec: TRIG_SEC, data: window._editorData, visMap: window._interVis || {}, showField: function() { return 'void(0)'; }, hideField: function() { return 'void(0)'; }, renderField: function() { return ''; }, showRemove: function() { return 'void(0)'; }, onAdd: function() { return 'void(0)'; } }); html += '
'; html += '
'; html += '
'; html += ''; html += '
'; html += ''; html += ''; html += ''; html += '
'; $('#editorMain').innerHTML = html; ced_setupSearchFields(); var segLabels = document.querySelectorAll('.seg-toggle label'); for (var i = 0; i < segLabels.length; i++) { segLabels[i].addEventListener('mousedown', function(e) { var r = this.querySelector('input[type="radio"]'); if (r) r.checked = true; }); } DropView.setupAllInter(); } function saveTrigger() { var flagTypeEl = document.querySelector('input[name="trigFlagType"]:checked'); if (flagTypeEl) { delete triggerData.on_player_flag; delete triggerData.on_global_flag; var n = $('#trigFlagName'); if (flagTypeEl.value === 'player') triggerData.on_player_flag = n ? n.value.trim() : ''; else triggerData.on_global_flag = n ? n.value.trim() : ''; } window._ieSyncAll(window._editorData); mergeTriggerFromEditor(); var out = JSON.parse(JSON.stringify(triggerData)); delete out.id; delete out._path; delete out._raw; delete out._kind; ced_cleanOutput(out); API.put('/api/triggers/' + encodeURIComponent(triggerID), out).then(function(resp) { notify('Trigger ' + triggerID + ' saved', 'success'); updateUndoBar(); if (resp) { if (resp._raw) triggerData._raw = resp._raw; if (resp.kind) triggerKind = resp.kind; } loadTriggerList(); }).catch(function(e) { notify('Save failed: ' + e.message, 'error'); }); } function duplicateTrigger(sourceID) { var src = sourceID || triggerID; if (!src) return; var done = function(data) { var allTriggerIDs = (treeData.root || []).slice(); var dirs = treeData.dirs || {}; Object.keys(dirs).forEach(function(d) { allTriggerIDs = allTriggerIDs.concat(dirs[d] || []); }); var baseID = src + '_copy'; var newID = baseID; var counter = 2; while (allTriggerIDs.indexOf(newID) >= 0) { newID = baseID + '_' + counter; counter++; } var copy = JSON.parse(JSON.stringify(data)); delete copy._raw; delete copy._path; delete copy._kind; copy.id = newID; ced_cleanOutput(copy); API.post('/api/triggers', {id: newID, on_player_flag: '', steps: []}).then(function() { return API.put('/api/triggers/' + encodeURIComponent(newID), copy); }).then(function() { notify('Duplicated as ' + newID, 'success'); updateUndoBar(); loadTriggerList(); loadTrigger(newID); }).catch(function(e) { notify('Duplicate failed: ' + e.message, 'error'); }); }; if (sourceID) { API.get('/api/triggers/' + encodeURIComponent(sourceID)).then(done).catch(function(e) { notify('Duplicate failed: ' + e.message, 'error'); }); } else { var flagTypeEl = document.querySelector('input[name="trigFlagType"]:checked'); if (flagTypeEl) { delete triggerData.on_player_flag; delete triggerData.on_global_flag; var n = $('#trigFlagName'); if (flagTypeEl.value === 'player') triggerData.on_player_flag = n ? n.value.trim() : ''; else triggerData.on_global_flag = n ? n.value.trim() : ''; } window._ieSyncAll(window._editorData); mergeTriggerFromEditor(); done(triggerData); } } function showItemContextMenu(e, id) { var items = [ {label: 'Duplicate', handler: function() { duplicateTrigger(id); }}, {label: 'Delete Trigger', cls: 'danger', handler: function() { deleteTriggerByID(id); }}, ]; openContextMenu(e, items); } function deleteTriggerByID(id) { if (!confirm('Delete trigger "' + id + '"?')) return; API.del('/api/triggers/' + encodeURIComponent(id)).then(function() { notify('Trigger ' + id + ' deleted', 'success'); updateUndoBar(); if (triggerID === id) { triggerID = null; currentID = null; triggerData = null; triggerKind = ''; $('#editorMain').innerHTML = '

Deleted

'; } loadTriggerList(); }).catch(function(e) { notify('Delete failed: ' + e.message, 'error'); }); } function deleteTrigger() { if (!confirm('Delete trigger "' + triggerID + '"?')) return; API.del('/api/triggers/' + encodeURIComponent(triggerID)).then(function() { notify('Trigger ' + triggerID + ' deleted', 'success'); updateUndoBar(); triggerID = null; currentID = null; triggerData = null; triggerKind = ''; $('#editorMain').innerHTML = '

Deleted

'; loadTriggerList(); }).catch(function(e) { notify('Delete failed: ' + e.message, 'error'); }); } function createNew() { var baseID = prompt('Trigger ID (filename without .yaml):'); if (!baseID || !baseID.trim()) return; var id = baseID.trim(); API.post('/api/triggers', {id: id, on_player_flag: '', steps: []}).then(function(resp) { notify('Trigger ' + id + ' created', 'success'); updateUndoBar(); loadTriggerList(); loadTrigger(id); }).catch(function(e) { notify('Create failed: ' + e.message, 'error'); }); }