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() { API.get('/api/triggers').then(function(data) { allIDs = (data || []).map(function(e) { return e.id || e; }); window._triggerEntries = data || []; renderTriggerList(''); }).catch(function(e) { notify('Failed to load list: ' + e.message, 'error'); }); } function renderTriggerList(filter) { var el = $('#listEntries'); var f = (filter || '').toLowerCase(); var entries = window._triggerEntries || []; var html = ''; entries.forEach(function(entry) { var id = entry.id || entry; if (f && id.toLowerCase().indexOf(f) === -1) return; var badge = entry.kind === 'player' ? ' [Player]' : (entry.kind === 'global' ? ' [Global]' : ''); var badgeClass = entry.kind === 'player' ? 'dc-item' : (entry.kind === 'global' ? 'dc-item' : ''); html += '
'; html += '' + esc(id) + ''; html += '' + esc(badge) + ''; html += '
'; }); el.innerHTML = html || '

No triggers

'; } 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 += '
'; $('#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; }); } } 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 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'); }); }