#!/usr/bin/env python3 import json with open('/home/mdares/.node-red/flows.json', 'r') as f: flows = json.load(f) # HTML for resume/restart prompt modal resume_prompt_html = ''' ''' # JavaScript for handling resume prompt resume_prompt_js = ''' // Resume/Restart Prompt State scope.resumePrompt = { show: false, id: '', sku: '', cycleCount: 0, goodParts: 0, targetQty: 0, progressPercent: 0, order: null }; scope.resumeWorkOrder = function() { if (!scope.resumePrompt.order) { console.error('No order data for resume'); return; } scope.send({ action: 'resume-work-order', payload: scope.resumePrompt.order }); scope.resumePrompt.show = false; scope.hasActiveOrder = true; }; scope.confirmRestart = function() { if (!confirm('Are you sure you want to restart? All progress (' + scope.resumePrompt.goodParts + ' parts) will be lost!')) { return; } if (!scope.resumePrompt.order) { console.error('No order data for restart'); return; } scope.send({ action: 'restart-work-order', payload: scope.resumePrompt.order }); scope.resumePrompt.show = false; scope.hasActiveOrder = true; }; ''' # Watch handler for resume prompt resume_watch_handler = ''' // Handle resume prompt if (msg.topic === 'resumePrompt' && msg.payload) { scope.resumePrompt.show = true; scope.resumePrompt.id = msg.payload.id || ''; scope.resumePrompt.sku = msg.payload.sku || ''; scope.resumePrompt.cycleCount = msg.payload.cycleCount || 0; scope.resumePrompt.goodParts = msg.payload.goodParts || 0; scope.resumePrompt.targetQty = msg.payload.targetQty || 0; scope.resumePrompt.progressPercent = msg.payload.progressPercent || 0; scope.resumePrompt.order = msg.payload.order || null; return; } ''' # Find Home Template node and update it for node in flows: if node.get('id') == '1821c4842945ecd8' and node.get('name') == 'Home Template': template = node.get('format', '') # Add resume modal HTML before the closing of #oee or before scrap modal if '
\n