[{"data":1,"prerenderedAt":15117},["ShallowReactive",2],{"blog-\u002Fblog\u002F2026\u002F07\u002Fdigital-work-instruction":3,"featureCatalog":14188,"changelog-titles":14582,"blog-all-for-related":15116},{"id":4,"title":5,"authors":6,"body":8,"cta":14165,"date":14169,"description":14170,"extension":14171,"features":14172,"image":14173,"lastUpdated":14172,"meta":14174,"navigation":5404,"path":14179,"release":14172,"seo":14180,"sitemap":14181,"stem":14182,"subtitle":14183,"tags":14184,"tldr":14186,"video":14172,"__hash__":14187},"blog\u002Fblog\u002F2026\u002F07\u002Fdigital-work-instruction.md","Building Digital Work Instructions Dashboard for the Shop Floor",[7],"sumit-shinde",{"type":9,"value":10,"toc":14143},"minimark",[11,15,18,28,36,39,49,58,63,66,129,139,143,146,171,174,177,199,203,206,214,4789,4796,4800,4821,4914,4923,4926,4930,4933,4940,4961,4970,4973,4976,4998,5013,5017,5020,5044,5050,5146,5160,5192,5206,5218,5222,5231,5249,5619,5625,5634,5638,5641,5652,5658,5714,5717,5793,5797,5800,5805,5841,5845,5873,6112,6150,6163,6172,6176,6179,6201,6445,6496,6506,6510,6513,6528,7038,7043,7059,9206,9226,9235,9245,9254,9275,9284,9288,9291,9311,9315,9326,9337,9358,9369,12626,12635,12642,13038,13046,13065,13068,13072,13079,13112,13307,13341,13344,13348,13354,13363,13439,13448,13457,13466,13864,13899,13908,13911,13915,13921,13958,14098,14108,14111,14114,14118,14128,14140],[12,13,14],"p",{},"Operators need to know what to build, how to build it, and what to do when something breaks. Digital work instructions put that on a screen, guided steps, a checklist, buttons to finish or flag a defect, and retire the paper binder.",[12,16,17],{},"But shared stations raise a question paper never had: who's using it? Without a way to tell operators apart, the work order, the current step, and the record of what happened all blur together. Authentication draws the line, the operator's identity becomes the thread the app hangs on.",[12,19,20,25],{},[21,22],"img",{"alt":23,"src":24},"Digital work instructions dashboard showing operator work orders, production status","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fdigital-work-instruction-dashboard.png",[26,27,23],"em",{},[12,29,30,34],{},[21,31],{"alt":32,"src":33},"Operator interface displaying guided work instructions with step completion and defect reporting options","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fdigital-work-instruction-2.png",[26,35,32],{},[12,37,38],{},"In this article, we'll build a digital work instructions app in FlowFuse: an operator interface with work orders, step-by-step assembly guidance, defect reporting, and traceability via authentication.",[40,41,42],"blockquote",{},[12,43,44,48],{},[45,46,47],"strong",{},"Note:"," This demo is deliberately configured with a preset demo user so anyone can try it, even without being on the team where it's deployed. The version you build following this article uses FlowFuse User Authentication, which limits dashboard access to members of the same team.",[12,50,51,52,57],{},"You can interact with the live demo here: ",[53,54,56],"a",{"href":55},"https:\u002F\u002Fexpensive-pied-flycatcher-5052.flowfuse.cloud\u002Fdashboard\u002Fhome","Try the Digital Work Instruction Dashboard Demo",".",[59,60,62],"h2",{"id":61},"what-youll-need","What You'll Need",[12,64,65],{},"Before you start building, get these ready:",[67,68,69,83,89,123],"ul",{},[70,71,72,75,76,82],"li",{},[45,73,74],{},"A FlowFuse account."," ",[53,77,81],{"href":78,"rel":79},"https:\u002F\u002Fapp.flowfuse.com\u002Faccount\u002Fcreate",[80],"nofollow","Sign up"," for FlowFuse Cloud, or use a self-hosted instance.",[70,84,85,88],{},[45,86,87],{},"A FlowFuse instance up and running."," If you don't have one yet, create a new instance from your FlowFuse Platform.",[70,90,91,94,95,99,100,103,104,103,107,103,110,103,113,103,116,103,119,122],{},[45,92,93],{},"FlowFuse Dashboard installed."," This tutorial uses ",[96,97,98],"code",{},"@flowfuse\u002Fnode-red-dashboard"," nodes (",[96,101,102],{},"ui-template",", ",[96,105,106],{},"ui-table",[96,108,109],{},"ui-form",[96,111,112],{},"ui-button",[96,114,115],{},"ui-control",[96,117,118],{},"ui-event",[96,120,121],{},"ui-text",") to build the operator interface. Install it from the Palette Manager if it isn't already in your instance.",[70,124,125,128],{},[45,126,127],{},"The FlowFuse Dashboard user addon."," This is what attaches the logged-in user to every dashboard message. We'll install it in the first section.",[40,130,131],{},[12,132,133,134,138],{},"Note: The Multi-User addon is available to Teams and Enterprise Self-Hosted customers. If you're on a different tier, ",[53,135,137],{"href":136},"\u002Fcontact-us\u002F","contact us"," for the configuration to get started.",[59,140,142],{"id":141},"how-the-application-works","How the Application Works",[12,144,145],{},"Before we build anything, let's walk through what the app does and how the pieces fit together. There are three pages, and one idea holding them together.",[147,148,149,159,165],"ol",{},[70,150,151,154,155,158],{},[45,152,153],{},"Home."," After logging in, the application uses the operator's username to retrieve only the work orders assigned to them from the ERP or MES. It displays their station, production summary, the highest-priority work order, and the remaining queue. Selecting ",[45,156,157],{},"Start Work Order"," opens the instructions.",[70,160,161,164],{},[45,162,163],{},"Instructions."," Operators follow step-by-step instructions with images, checklists, and target cycle times. They can progress through each step, complete the operation, or report an issue at any time.",[70,166,167,170],{},[45,168,169],{},"Report Issue."," Operators can quickly log defects by selecting the issue type, severity, affected part, and description, with the issue automatically linked to the current work order.",[12,172,173],{},"The logged-in username acts as the application's lookup key. It retrieves the operator's assigned work orders and stores their active work order and current step, allowing them to resume exactly where they left off, even on shared production stations.",[12,175,176],{},"There are two different questions the app has to answer, and it's worth keeping them separate from the start:",[67,178,179,189],{},[70,180,181,184,185,188],{},[45,182,183],{},"\"Where is this operator's data stored?\""," — under a persistent global key named after their username, e.g. ",[96,186,187],{},"global.get('operator1', 'persistent')",". This is a durable, shared store, and it's meant to be: it's what lets progress survive reloads and reconnects.",[70,190,191,194,195,198],{},[45,192,193],{},"\"Who is acting right now, in this message?\""," — this must be read fresh from the message that triggered the flow (",[96,196,197],{},"msg._client.user","), not from a single shared \"current user\" variable. A shared variable has only one value at a time; the moment a second operator's browser connects, it overwrites the first operator's identity for the whole running flow. We'll come back to this the moment it becomes relevant, but it's the one rule that makes every \"per operator\" claim in this tutorial actually true when two people are logged in at once.",[59,200,202],{"id":201},"importing-the-simulated-flow","Importing the Simulated Flow",[12,204,205],{},"Instead of connecting to a real ERP or MES, we'll use a simple simulated backend that serves sample work orders through an HTTP API.",[147,207,208],{},[70,209,210,211,57],{},"Import the following flow into FlowFuse and click ",[45,212,213],{},"Deploy",[215,216,218],"render-flow",{":height":217},"300",[219,220,225],"pre",{"className":221,"code":222,"language":223,"meta":224,"style":224},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[{\"id\":\"83cd1b1c4cc8e310\",\"type\":\"group\",\"z\":\"3012f9c2796b5b41\",\"style\":{\"stroke\":\"#b2b3bd\",\"stroke-opacity\":\"1\",\"fill\":\"#f2f3fb\",\"fill-opacity\":\"0.5\",\"label\":true,\"label-position\":\"nw\",\"color\":\"#32333b\"},\"nodes\":[\"5a2c1cb7932accb9\",\"f2334a5d527a684a\",\"f65db363fdde0eba\",\"cdda81f6a2701b7c\",\"8554ad9dfdb36f54\",\"6dd109a105da5dd5\",\"439862e5c86675cd\",\"9d853fad37785bec\",\"3506d88cd094d44c\",\"wo_stats_http_in\",\"wo_stats_func\",\"wo_stats_response\",\"6d1644eabb9a5bf5\",\"62760b81dea503c2\"],\"x\":44,\"y\":59,\"w\":652,\"h\":482},{\"id\":\"5a2c1cb7932accb9\",\"type\":\"http in\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"GET Work Orders\",\"url\":\"\u002Fworkorders\",\"method\":\"get\",\"upload\":false,\"skipBodyParsing\":false,\"swaggerDoc\":\"\",\"x\":160,\"y\":300,\"wires\":[[\"f2334a5d527a684a\"]]},{\"id\":\"f2334a5d527a684a\",\"type\":\"function\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"Generate Work Orders\",\"func\":\"const stationId = msg.req.query.stationId;\\nconst username = msg.req.query.username;\\n\\nconst workOrders = global.get(\\\"workOrders\\\", \\\"persistent\\\") || [];\\n\\nconst result = workOrders.filter(w =>\\n    w.stationId === stationId &&\\n    w.assignedTo === username &&\\n    w.status !== \\\"defect\\\" &&\\n    w.status !== \\\"completed\\\"\\n);\\n\\nmsg.payload = result;\\n\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":420,\"y\":300,\"wires\":[[\"f65db363fdde0eba\"]]},{\"id\":\"f65db363fdde0eba\",\"type\":\"http response\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"\",\"statusCode\":\"\",\"headers\":{\"Content-Type\":\"application\u002Fjson\"},\"x\":610,\"y\":300,\"wires\":[]},{\"id\":\"cdda81f6a2701b7c\",\"type\":\"http in\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"POST Mark Defect\",\"url\":\"\u002Fworkorders\u002Fdefect\",\"method\":\"post\",\"upload\":false,\"skipBodyParsing\":false,\"swaggerDoc\":\"\",\"x\":160,\"y\":400,\"wires\":[[\"8554ad9dfdb36f54\"]]},{\"id\":\"8554ad9dfdb36f54\",\"type\":\"function\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"Mark Defect\",\"func\":\"const { workOrderId, issueType, severity, affectedPart, description } = msg.payload || {};\\n\\nif (!workOrderId || !issueType || !severity || !affectedPart) {\\n    msg.statusCode = 400;\\n    msg.payload = { error: 'workOrderId, issueType, severity, and affectedPart are required' };\\n    return msg;\\n}\\n\\nconst workOrders = global.get('workOrders', 'persistent') || [];\\nconst idx = workOrders.findIndex(w => w.workOrderId === workOrderId);\\n\\nif (idx === -1) {\\n    msg.statusCode = 404;\\n    msg.payload = { error: 'Work order not found' };\\n    return msg;\\n}\\n\\nworkOrders[idx].status = 'defect';\\nworkOrders[idx].defect = {\\n    issueType,\\n    severity,\\n    affectedPart,\\n    description: description || null,\\n    reportedAt: new Date().toISOString()\\n};\\n\\nglobal.set('workOrders', workOrders, 'persistent');\\n\\nmsg.statusCode = 200;\\nmsg.payload = { success: true, workOrder: workOrders[idx] };\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":390,\"y\":400,\"wires\":[[\"6dd109a105da5dd5\"]]},{\"id\":\"6dd109a105da5dd5\",\"type\":\"http response\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"\",\"statusCode\":\"\",\"headers\":{\"Content-Type\":\"application\u002Fjson\"},\"x\":610,\"y\":400,\"wires\":[]},{\"id\":\"439862e5c86675cd\",\"type\":\"http in\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"POST Complete Order\",\"url\":\"\u002Fworkorders\u002Fcomplete\",\"method\":\"post\",\"upload\":false,\"skipBodyParsing\":false,\"swaggerDoc\":\"\",\"x\":170,\"y\":500,\"wires\":[[\"9d853fad37785bec\"]]},{\"id\":\"9d853fad37785bec\",\"type\":\"function\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"Complete Work Order\",\"func\":\"const { workOrderId } = msg.payload || {};\\n\\nif (!workOrderId) {\\n    msg.statusCode = 400;\\n    msg.payload = { error: 'workOrderId is required' };\\n    return msg;\\n}\\n\\nconst workOrders = global.get('workOrders', 'persistent') || [];\\nconst idx = workOrders.findIndex(w => w.workOrderId === workOrderId);\\n\\nif (idx === -1) {\\n    msg.statusCode = 404;\\n    msg.payload = { error: 'Work order not found' };\\n    return msg;\\n}\\n\\nworkOrders[idx].status = 'completed';\\nworkOrders[idx].completedAt = new Date().toISOString();\\n\\nglobal.set('workOrders', workOrders, 'persistent');\\n\\nmsg.statusCode = 200;\\nmsg.payload = { success: true, workOrder: workOrders[idx] };\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":410,\"y\":500,\"wires\":[[\"3506d88cd094d44c\"]]},{\"id\":\"3506d88cd094d44c\",\"type\":\"http response\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"\",\"statusCode\":\"\",\"headers\":{\"Content-Type\":\"application\u002Fjson\"},\"x\":620,\"y\":500,\"wires\":[]},{\"id\":\"wo_stats_http_in\",\"type\":\"http in\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"GET Work Order Stats\",\"url\":\"\u002Fworkorders\u002Fstats\",\"method\":\"get\",\"upload\":false,\"skipBodyParsing\":false,\"swaggerDoc\":\"\",\"x\":180,\"y\":220,\"wires\":[[\"wo_stats_func\"]]},{\"id\":\"wo_stats_func\",\"type\":\"function\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"Compute Stats\",\"func\":\"const workOrders = global.get('workOrders', 'persistent') || [];\\nnode.warn(msg.req.query);\\nconst stationId = msg.req.query.stationId;\\nconst username = msg.req.query.username;\\n\\n\u002F\u002F Filter only by station\\nconst stationWorkOrders = stationId\\n    ? workOrders.filter(w => w.stationId === stationId)\\n    : workOrders;\\n\\nconst total = stationWorkOrders.length;\\nconst completed = stationWorkOrders.filter(w => w.status === \\\"completed\\\").length;\\nconst defected = stationWorkOrders.filter(w => w.status === \\\"defect\\\").length;\\n\\n\u002F\u002F Filter by user within the station\\nconst assignedToMe = username\\n    ? stationWorkOrders.filter(w => w.assignedTo === username).length\\n    : 0;\\n\\nmsg.statusCode = 200;\\nmsg.payload = {\\n    total,\\n    completed,\\n    defected,\\n    assignedToMe\\n};\\n\\nreturn msg;\",\"outputs\":1,\"timeout\":\"\",\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":400,\"y\":220,\"wires\":[[\"wo_stats_response\"]]},{\"id\":\"wo_stats_response\",\"type\":\"http response\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"\",\"statusCode\":\"\",\"headers\":{\"Content-Type\":\"application\u002Fjson\"},\"x\":610,\"y\":220,\"wires\":[]},{\"id\":\"6d1644eabb9a5bf5\",\"type\":\"function\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"name\":\"Generate Mock Work Orders\",\"func\":\"const user = global.get(\\\"user\\\", \\\"persistent\\\");\\nconst currentUser = user?.username || \\\"operator1\\\";\\n\\n\u002F\u002F Pool of 5 operators (logged-in user + 4 others)\\nconst operators = [\\n    currentUser,\\n    \\\"operator2\\\",\\n    \\\"operator3\\\",\\n    \\\"operator4\\\",\\n    \\\"operator5\\\"\\n];\\n\\nconst vehicles = [\\n    {\\n        model: \\\"Sedan X\\\",\\n        variants: [\\\"Standard\\\", \\\"Premium\\\", \\\"Sport\\\"],\\n        colors: [\\\"White\\\", \\\"Black\\\", \\\"Red\\\"]\\n    },\\n    {\\n        model: \\\"SUV Y\\\",\\n        variants: [\\\"Base\\\", \\\"Premium\\\", \\\"Sport\\\"],\\n        colors: [\\\"Grey\\\", \\\"White\\\", \\\"Black\\\"]\\n    },\\n    {\\n        model: \\\"Truck Z\\\",\\n        variants: [\\\"Standard\\\", \\\"Heavy Duty\\\"],\\n        colors: [\\\"Blue\\\", \\\"Green\\\", \\\"White\\\"]\\n    },\\n    {\\n        model: \\\"Hatchback W\\\",\\n        variants: [\\\"Base\\\", \\\"Sport\\\"],\\n        colors: [\\\"Silver\\\", \\\"Yellow\\\", \\\"Red\\\"]\\n    }\\n];\\n\\nconst operations = [\\n    {\\n        operationId: \\\"OP_WHEEL_FL\\\",\\n        name: \\\"Install Front Left Wheel\\\",\\n        instructionSetId: \\\"INS001\\\",\\n        estimatedCycleTime: 45\\n    },\\n    {\\n        operationId: \\\"OP_WHEEL_FR\\\",\\n        name: \\\"Install Front Right Wheel\\\",\\n        instructionSetId: \\\"INS002\\\",\\n        estimatedCycleTime: 45\\n    }\\n];\\n\\nconst priorities = [\\\"Critical\\\", \\\"High\\\", \\\"Normal\\\", \\\"Low\\\"];\\nconst statuses = [\\\"Ready\\\", \\\"Waiting\\\", \\\"Queued\\\"];\\n\\nfunction random(arr) {\\n    return arr[Math.floor(Math.random() * arr.length)];\\n}\\n\\n\u002F\u002F Read existing work orders\\nconst existingWorkOrders = global.get(\\\"workOrders\\\", \\\"persistent\\\") || [];\\n\\n\u002F\u002F Start IDs after the existing ones\\nlet nextId = 10245 + existingWorkOrders.length;\\n\\n\u002F\u002F Generate 20 new work orders\\nfor (let i = 0; i \u003C 20; i++) {\\n    const vehicle = random(vehicles);\\n    const operation = random(operations);\\n\\n    existingWorkOrders.push({\\n        workOrderId: `WO-${nextId++}`,\\n        stationId: \\\"ST12\\\",\\n        status: random(statuses),\\n        priority: random(priorities),\\n        assignedTo: random(operators),\\n        vehicle: {\\n            vin: `MH01AB${1234567890 + existingWorkOrders.length}`,\\n            model: vehicle.model,\\n            variant: random(vehicle.variants),\\n            color: random(vehicle.colors)\\n        },\\n        operation: {\\n            operationId: operation.operationId,\\n            name: operation.name,\\n            estimatedCycleTime: operation.estimatedCycleTime,\\n            instructionSetId: operation.instructionSetId\\n        }\\n    });\\n}\\n\\n\u002F\u002F Save updated list\\nglobal.set(\\\"workOrders\\\", existingWorkOrders, \\\"persistent\\\");\\n\\nmsg.payload = existingWorkOrders;\\nreturn msg;\",\"outputs\":1,\"timeout\":0,\"noerr\":0,\"initialize\":\"\",\"finalize\":\"\",\"libs\":[],\"x\":440,\"y\":100,\"wires\":[[]]},{\"id\":\"62760b81dea503c2\",\"type\":\"ui-event\",\"z\":\"3012f9c2796b5b41\",\"g\":\"83cd1b1c4cc8e310\",\"ui\":\"37b66bc5b4d6d3d3\",\"name\":\"\",\"x\":160,\"y\":100,\"wires\":[[\"6d1644eabb9a5bf5\"]]},{\"id\":\"37b66bc5b4d6d3d3\",\"type\":\"ui-base\",\"name\":\"My Dashboard\",\"path\":\"\u002Fdashboard\",\"appIcon\":\"\",\"includeClientData\":true,\"acceptsClientConfig\":[\"ui-notification\",\"ui-control\",\"ui-template\",\"ui-form\",\"ui-table\",\"ui-text-input\",\"ui-number-input\",\"ui-file-input\",\"ui-button\",\"ui-button-group\",\"ui-dropdown\",\"ui-radio-group\",\"ui-slider\",\"ui-text\",\"ui-switch\",\"ui-chart\",\"ui-audio\",\"ui-markdown\",\"ui-progress\",\"ui-gauge\"],\"showPathInSidebar\":false,\"headerContent\":\"page\",\"navigationStyle\":\"default\",\"titleBarStyle\":\"default\",\"showReconnectNotification\":true,\"notificationDisplayTime\":1,\"showDisconnectNotification\":true,\"allowInstall\":false},{\"id\":\"4b583d9b76bf5cf2\",\"type\":\"global-config\",\"env\":[],\"modules\":{\"@flowfuse\u002Fnode-red-dashboard\":\"1.30.2\"}}]\n","json","",[96,226,227],{"__ignoreMap":224},[228,229,232,236,239,243,245,248,250,254,256,259,261,264,266,268,270,273,275,277,279,282,284,286,288,291,293,295,297,300,302,305,307,311,313,315,317,320,322,324,326,329,331,333,335,338,340,342,344,347,349,351,353,356,358,360,362,365,367,369,371,374,376,378,380,383,385,388,390,393,395,397,399,402,404,406,408,411,413,415,417,420,422,425,427,430,432,435,437,440,442,444,446,449,451,453,455,458,460,462,464,467,469,471,473,476,478,480,482,485,487,489,491,494,496,498,500,503,505,507,509,512,514,516,518,521,523,525,527,530,532,534,536,539,541,543,545,548,550,552,554,557,559,562,564,567,569,571,575,577,579,582,584,586,589,591,593,596,598,600,603,605,607,610,612,614,617,620,622,624,626,628,630,632,634,636,638,640,642,644,646,649,651,653,655,657,659,661,663,665,667,669,671,674,676,678,680,682,684,686,688,691,693,695,697,700,702,704,706,709,711,713,715,718,720,722,724,727,729,731,733,736,738,740,742,745,747,750,752,755,757,759,761,764,766,768,771,773,775,777,779,781,784,786,788,790,792,794,796,798,800,803,805,808,810,812,814,817,819,821,823,825,827,829,831,833,835,837,839,841,843,846,848,850,852,854,856,858,860,862,864,866,868,870,872,874,876,878,880,882,884,886,888,890,892,895,897,899,901,904,906,908,910,913,917,920,923,926,929,932,934,936,938,941,943,946,948,951,953,956,958,961,963,966,968,971,973,976,978,980,982,985,988,991,993,996,998,1001,1003,1005,1007,1010,1012,1014,1016,1018,1020,1023,1025,1027,1029,1031,1033,1036,1038,1040,1043,1045,1047,1050,1052,1054,1056,1058,1060,1063,1065,1067,1069,1071,1073,1076,1078,1081,1083,1085,1087,1089,1092,1094,1096,1098,1100,1102,1104,1106,1108,1110,1112,1114,1116,1118,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1151,1153,1155,1157,1159,1161,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1204,1206,1208,1210,1212,1214,1217,1219,1221,1223,1226,1228,1230,1232,1235,1237,1239,1241,1243,1245,1247,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1341,1343,1345,1347,1350,1352,1354,1356,1358,1360,1362,1364,1367,1369,1371,1373,1375,1377,1379,1381,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416,1418,1420,1422,1424,1426,1428,1430,1432,1434,1436,1439,1441,1443,1445,1447,1449,1451,1453,1455,1457,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511,1513,1515,1517,1519,1521,1523,1525,1527,1529,1531,1534,1536,1538,1540,1542,1544,1546,1548,1551,1553,1556,1558,1561,1563,1566,1568,1571,1573,1576,1578,1581,1583,1586,1588,1591,1593,1596,1598,1601,1603,1605,1607,1609,1611,1614,1616,1619,1621,1624,1626,1629,1631,1634,1636,1639,1641,1644,1646,1649,1651,1654,1656,1659,1661,1664,1666,1668,1670,1672,1674,1676,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704,1706,1708,1710,1712,1714,1716,1718,1720,1722,1724,1726,1728,1730,1732,1734,1736,1738,1740,1742,1744,1746,1748,1751,1753,1755,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1805,1807,1809,1811,1813,1815,1817,1819,1821,1823,1825,1827,1829,1831,1833,1835,1837,1839,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865,1867,1869,1871,1873,1875,1877,1879,1881,1883,1885,1887,1889,1891,1893,1895,1897,1899,1901,1903,1905,1907,1909,1911,1913,1915,1917,1919,1921,1923,1925,1927,1929,1931,1933,1935,1937,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1999,2002,2004,2006,2008,2010,2012,2014,2016,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061,2063,2065,2067,2069,2071,2073,2075,2078,2080,2082,2084,2086,2088,2091,2093,2095,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119,2121,2123,2125,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2147,2149,2151,2153,2155,2157,2159,2161,2163,2165,2167,2169,2171,2173,2175,2177,2179,2181,2183,2186,2188,2190,2192,2194,2196,2198,2200,2203,2205,2208,2210,2212,2214,2217,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237,2239,2241,2243,2245,2247,2249,2251,2253,2255,2258,2260,2263,2265,2267,2269,2271,2273,2275,2277,2279,2281,2283,2285,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,2327,2329,2331,2333,2335,2337,2339,2341,2343,2345,2347,2349,2351,2353,2355,2357,2359,2362,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,2386,2388,2390,2392,2394,2396,2398,2400,2402,2404,2406,2408,2410,2412,2414,2416,2418,2420,2422,2424,2426,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450,2452,2454,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498,2500,2502,2504,2506,2508,2510,2512,2515,2517,2519,2521,2523,2525,2527,2529,2531,2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565,2567,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605,2607,2609,2611,2614,2616,2618,2620,2622,2624,2626,2628,2631,2633,2635,2637,2639,2641,2643,2645,2647,2649,2651,2653,2655,2657,2659,2661,2663,2665,2667,2669,2671,2673,2675,2677,2679,2681,2683,2685,2687,2690,2692,2694,2696,2698,2700,2703,2705,2707,2709,2711,2713,2715,2717,2719,2721,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779,2781,2783,2785,2787,2789,2791,2793,2795,2798,2800,2802,2804,2806,2808,2810,2812,2814,2816,2819,2821,2823,2825,2827,2829,2832,2834,2837,2839,2842,2844,2847,2849,2852,2854,2857,2859,2861,2863,2866,2868,2871,2873,2875,2877,2879,2881,2884,2886,2889,2891,2894,2896,2899,2901,2903,2905,2908,2910,2913,2915,2918,2920,2923,2925,2928,2930,2932,2934,2936,2938,2940,2942,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976,2978,2980,2982,2984,2986,2988,2990,2992,2994,2996,2998,3000,3002,3004,3006,3008,3010,3012,3014,3016,3018,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048,3050,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3084,3086,3088,3090,3092,3094,3096,3098,3100,3102,3104,3106,3108,3110,3112,3114,3116,3118,3120,3122,3124,3126,3128,3130,3132,3134,3136,3138,3140,3142,3144,3146,3148,3150,3152,3154,3156,3158,3160,3162,3164,3166,3168,3170,3172,3174,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,3258,3260,3262,3264,3266,3269,3271,3273,3275,3277,3279,3281,3283,3286,3288,3291,3293,3295,3297,3299,3301,3303,3305,3308,3310,3313,3315,3318,3320,3323,3325,3328,3330,3333,3335,3338,3341,3343,3345,3347,3349,3352,3354,3356,3358,3360,3363,3365,3367,3369,3371,3374,3376,3379,3381,3384,3386,3389,3391,3394,3396,3399,3401,3403,3405,3408,3410,3413,3415,3417,3419,3422,3424,3426,3428,3431,3433,3435,3437,3440,3442,3445,3447,3449,3451,3454,3456,3458,3460,3463,3465,3468,3470,3473,3475,3477,3479,3481,3483,3486,3488,3490,3492,3494,3496,3499,3501,3503,3505,3507,3509,3511,3513,3515,3517,3519,3521,3523,3525,3528,3530,3532,3534,3536,3538,3540,3542,3544,3546,3548,3550,3552,3554,3556,3558,3560,3562,3565,3567,3569,3571,3573,3575,3577,3579,3581,3583,3586,3588,3590,3592,3594,3596,3599,3601,3603,3605,3608,3610,3612,3614,3616,3618,3620,3622,3624,3626,3628,3630,3632,3634,3637,3639,3641,3643,3645,3647,3649,3651,3653,3655,3657,3659,3661,3663,3665,3667,3670,3672,3674,3676,3679,3681,3683,3685,3687,3689,3691,3693,3696,3698,3700,3702,3705,3707,3709,3711,3714,3716,3719,3721,3723,3725,3728,3730,3733,3735,3737,3739,3742,3744,3747,3749,3751,3753,3756,3758,3760,3762,3764,3766,3768,3770,3773,3775,3777,3779,3781,3783,3786,3788,3790,3792,3794,3796,3799,3801,3803,3805,3807,3809,3811,3813,3815,3817,3820,3822,3825,3827,3829,3831,3834,3836,3838,3840,3843,3845,3847,3849,3852,3854,3856,3858,3861,3863,3866,3868,3870,3872,3875,3877,3879,3881,3884,3886,3888,3890,3893,3895,3898,3900,3902,3904,3907,3909,3912,3914,3916,3918,3920,3922,3924,3926,3928,3930,3933,3935,3938,3940,3943,3945,3948,3950,3953,3955,3958,3960,3963,3965,3968,3970,3973,3975,3978,3980,3982,3984,3987,3989,3992,3994,3997,3999,4002,4004,4007,4009,4012,4014,4017,4019,4022,4024,4027,4029,4032,4034,4037,4039,4042,4044,4047,4049,4052,4054,4057,4059,4062,4064,4066,4068,4071,4073,4076,4078,4080,4082,4085,4087,4089,4091,4093,4095,4098,4100,4102,4104,4106,4108,4110,4112,4114,4116,4118,4120,4122,4124,4126,4128,4130,4132,4134,4136,4138,4140,4142,4144,4146,4148,4150,4152,4154,4156,4158,4160,4162,4164,4166,4168,4170,4172,4174,4176,4178,4180,4182,4185,4187,4189,4191,4193,4195,4198,4200,4202,4204,4206,4209,4211,4213,4215,4217,4219,4221,4223,4225,4227,4229,4231,4233,4235,4237,4239,4241,4243,4245,4247,4249,4251,4253,4255,4257,4259,4261,4263,4265,4267,4269,4271,4273,4275,4278,4280,4282,4284,4287,4289,4291,4293,4295,4297,4299,4301,4303,4305,4307,4309,4311,4313,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333,4335,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355,4357,4359,4361,4363,4365,4367,4369,4372,4374,4376,4378,4380,4382,4384,4386,4389,4391,4393,4395,4398,4400,4402,4404,4407,4409,4411,4413,4416,4418,4420,4422,4424,4426,4429,4431,4433,4435,4438,4440,4442,4444,4447,4449,4451,4453,4455,4457,4459,4461,4463,4465,4467,4469,4471,4473,4475,4477,4479,4481,4483,4485,4488,4490,4492,4494,4497,4499,4501,4503,4506,4508,4510,4512,4514,4516,4518,4520,4523,4525,4527,4529,4532,4534,4536,4538,4541,4543,4545,4547,4550,4552,4554,4556,4558,4560,4562,4564,4567,4569,4571,4573,4576,4578,4580,4582,4585,4587,4589,4591,4594,4596,4598,4600,4603,4605,4607,4609,4612,4614,4616,4618,4621,4623,4625,4627,4630,4632,4634,4636,4639,4641,4643,4645,4648,4650,4652,4654,4657,4659,4661,4663,4666,4668,4670,4672,4674,4676,4678,4680,4683,4685,4687,4689,4692,4694,4696,4698,4700,4702,4705,4707,4709,4711,4714,4716,4719,4721,4723,4725,4727,4729,4732,4734,4736,4738,4740,4742,4744,4746,4749,4751,4753,4755,4758,4760,4762,4764,4767,4769,4771,4773,4775,4777,4779,4781,4784,4786],"span",{"class":230,"line":231},"line",1,[228,233,235],{"class":234},"sMK4o","[{",[228,237,238],{"class":234},"\"",[228,240,242],{"class":241},"spNyl","id",[228,244,238],{"class":234},[228,246,247],{"class":234},":",[228,249,238],{"class":234},[228,251,253],{"class":252},"sfazB","83cd1b1c4cc8e310",[228,255,238],{"class":234},[228,257,258],{"class":234},",",[228,260,238],{"class":234},[228,262,263],{"class":241},"type",[228,265,238],{"class":234},[228,267,247],{"class":234},[228,269,238],{"class":234},[228,271,272],{"class":252},"group",[228,274,238],{"class":234},[228,276,258],{"class":234},[228,278,238],{"class":234},[228,280,281],{"class":241},"z",[228,283,238],{"class":234},[228,285,247],{"class":234},[228,287,238],{"class":234},[228,289,290],{"class":252},"3012f9c2796b5b41",[228,292,238],{"class":234},[228,294,258],{"class":234},[228,296,238],{"class":234},[228,298,299],{"class":241},"style",[228,301,238],{"class":234},[228,303,304],{"class":234},":{",[228,306,238],{"class":234},[228,308,310],{"class":309},"sBMFI","stroke",[228,312,238],{"class":234},[228,314,247],{"class":234},[228,316,238],{"class":234},[228,318,319],{"class":252},"#b2b3bd",[228,321,238],{"class":234},[228,323,258],{"class":234},[228,325,238],{"class":234},[228,327,328],{"class":309},"stroke-opacity",[228,330,238],{"class":234},[228,332,247],{"class":234},[228,334,238],{"class":234},[228,336,337],{"class":252},"1",[228,339,238],{"class":234},[228,341,258],{"class":234},[228,343,238],{"class":234},[228,345,346],{"class":309},"fill",[228,348,238],{"class":234},[228,350,247],{"class":234},[228,352,238],{"class":234},[228,354,355],{"class":252},"#f2f3fb",[228,357,238],{"class":234},[228,359,258],{"class":234},[228,361,238],{"class":234},[228,363,364],{"class":309},"fill-opacity",[228,366,238],{"class":234},[228,368,247],{"class":234},[228,370,238],{"class":234},[228,372,373],{"class":252},"0.5",[228,375,238],{"class":234},[228,377,258],{"class":234},[228,379,238],{"class":234},[228,381,382],{"class":309},"label",[228,384,238],{"class":234},[228,386,387],{"class":234},":true,",[228,389,238],{"class":234},[228,391,392],{"class":309},"label-position",[228,394,238],{"class":234},[228,396,247],{"class":234},[228,398,238],{"class":234},[228,400,401],{"class":252},"nw",[228,403,238],{"class":234},[228,405,258],{"class":234},[228,407,238],{"class":234},[228,409,410],{"class":309},"color",[228,412,238],{"class":234},[228,414,247],{"class":234},[228,416,238],{"class":234},[228,418,419],{"class":252},"#32333b",[228,421,238],{"class":234},[228,423,424],{"class":234},"},",[228,426,238],{"class":234},[228,428,429],{"class":241},"nodes",[228,431,238],{"class":234},[228,433,434],{"class":234},":[",[228,436,238],{"class":234},[228,438,439],{"class":252},"5a2c1cb7932accb9",[228,441,238],{"class":234},[228,443,258],{"class":234},[228,445,238],{"class":234},[228,447,448],{"class":252},"f2334a5d527a684a",[228,450,238],{"class":234},[228,452,258],{"class":234},[228,454,238],{"class":234},[228,456,457],{"class":252},"f65db363fdde0eba",[228,459,238],{"class":234},[228,461,258],{"class":234},[228,463,238],{"class":234},[228,465,466],{"class":252},"cdda81f6a2701b7c",[228,468,238],{"class":234},[228,470,258],{"class":234},[228,472,238],{"class":234},[228,474,475],{"class":252},"8554ad9dfdb36f54",[228,477,238],{"class":234},[228,479,258],{"class":234},[228,481,238],{"class":234},[228,483,484],{"class":252},"6dd109a105da5dd5",[228,486,238],{"class":234},[228,488,258],{"class":234},[228,490,238],{"class":234},[228,492,493],{"class":252},"439862e5c86675cd",[228,495,238],{"class":234},[228,497,258],{"class":234},[228,499,238],{"class":234},[228,501,502],{"class":252},"9d853fad37785bec",[228,504,238],{"class":234},[228,506,258],{"class":234},[228,508,238],{"class":234},[228,510,511],{"class":252},"3506d88cd094d44c",[228,513,238],{"class":234},[228,515,258],{"class":234},[228,517,238],{"class":234},[228,519,520],{"class":252},"wo_stats_http_in",[228,522,238],{"class":234},[228,524,258],{"class":234},[228,526,238],{"class":234},[228,528,529],{"class":252},"wo_stats_func",[228,531,238],{"class":234},[228,533,258],{"class":234},[228,535,238],{"class":234},[228,537,538],{"class":252},"wo_stats_response",[228,540,238],{"class":234},[228,542,258],{"class":234},[228,544,238],{"class":234},[228,546,547],{"class":252},"6d1644eabb9a5bf5",[228,549,238],{"class":234},[228,551,258],{"class":234},[228,553,238],{"class":234},[228,555,556],{"class":252},"62760b81dea503c2",[228,558,238],{"class":234},[228,560,561],{"class":234},"],",[228,563,238],{"class":234},[228,565,566],{"class":241},"x",[228,568,238],{"class":234},[228,570,247],{"class":234},[228,572,574],{"class":573},"sbssI","44",[228,576,258],{"class":234},[228,578,238],{"class":234},[228,580,581],{"class":241},"y",[228,583,238],{"class":234},[228,585,247],{"class":234},[228,587,588],{"class":573},"59",[228,590,258],{"class":234},[228,592,238],{"class":234},[228,594,595],{"class":241},"w",[228,597,238],{"class":234},[228,599,247],{"class":234},[228,601,602],{"class":573},"652",[228,604,258],{"class":234},[228,606,238],{"class":234},[228,608,609],{"class":241},"h",[228,611,238],{"class":234},[228,613,247],{"class":234},[228,615,616],{"class":573},"482",[228,618,619],{"class":234},"},{",[228,621,238],{"class":234},[228,623,242],{"class":241},[228,625,238],{"class":234},[228,627,247],{"class":234},[228,629,238],{"class":234},[228,631,439],{"class":252},[228,633,238],{"class":234},[228,635,258],{"class":234},[228,637,238],{"class":234},[228,639,263],{"class":241},[228,641,238],{"class":234},[228,643,247],{"class":234},[228,645,238],{"class":234},[228,647,648],{"class":252},"http in",[228,650,238],{"class":234},[228,652,258],{"class":234},[228,654,238],{"class":234},[228,656,281],{"class":241},[228,658,238],{"class":234},[228,660,247],{"class":234},[228,662,238],{"class":234},[228,664,290],{"class":252},[228,666,238],{"class":234},[228,668,258],{"class":234},[228,670,238],{"class":234},[228,672,673],{"class":241},"g",[228,675,238],{"class":234},[228,677,247],{"class":234},[228,679,238],{"class":234},[228,681,253],{"class":252},[228,683,238],{"class":234},[228,685,258],{"class":234},[228,687,238],{"class":234},[228,689,690],{"class":241},"name",[228,692,238],{"class":234},[228,694,247],{"class":234},[228,696,238],{"class":234},[228,698,699],{"class":252},"GET Work Orders",[228,701,238],{"class":234},[228,703,258],{"class":234},[228,705,238],{"class":234},[228,707,708],{"class":241},"url",[228,710,238],{"class":234},[228,712,247],{"class":234},[228,714,238],{"class":234},[228,716,717],{"class":252},"\u002Fworkorders",[228,719,238],{"class":234},[228,721,258],{"class":234},[228,723,238],{"class":234},[228,725,726],{"class":241},"method",[228,728,238],{"class":234},[228,730,247],{"class":234},[228,732,238],{"class":234},[228,734,735],{"class":252},"get",[228,737,238],{"class":234},[228,739,258],{"class":234},[228,741,238],{"class":234},[228,743,744],{"class":241},"upload",[228,746,238],{"class":234},[228,748,749],{"class":234},":false,",[228,751,238],{"class":234},[228,753,754],{"class":241},"skipBodyParsing",[228,756,238],{"class":234},[228,758,749],{"class":234},[228,760,238],{"class":234},[228,762,763],{"class":241},"swaggerDoc",[228,765,238],{"class":234},[228,767,247],{"class":234},[228,769,770],{"class":234},"\"\"",[228,772,258],{"class":234},[228,774,238],{"class":234},[228,776,566],{"class":241},[228,778,238],{"class":234},[228,780,247],{"class":234},[228,782,783],{"class":573},"160",[228,785,258],{"class":234},[228,787,238],{"class":234},[228,789,581],{"class":241},[228,791,238],{"class":234},[228,793,247],{"class":234},[228,795,217],{"class":573},[228,797,258],{"class":234},[228,799,238],{"class":234},[228,801,802],{"class":241},"wires",[228,804,238],{"class":234},[228,806,807],{"class":234},":[[",[228,809,238],{"class":234},[228,811,448],{"class":252},[228,813,238],{"class":234},[228,815,816],{"class":234},"]]},{",[228,818,238],{"class":234},[228,820,242],{"class":241},[228,822,238],{"class":234},[228,824,247],{"class":234},[228,826,238],{"class":234},[228,828,448],{"class":252},[228,830,238],{"class":234},[228,832,258],{"class":234},[228,834,238],{"class":234},[228,836,263],{"class":241},[228,838,238],{"class":234},[228,840,247],{"class":234},[228,842,238],{"class":234},[228,844,845],{"class":252},"function",[228,847,238],{"class":234},[228,849,258],{"class":234},[228,851,238],{"class":234},[228,853,281],{"class":241},[228,855,238],{"class":234},[228,857,247],{"class":234},[228,859,238],{"class":234},[228,861,290],{"class":252},[228,863,238],{"class":234},[228,865,258],{"class":234},[228,867,238],{"class":234},[228,869,673],{"class":241},[228,871,238],{"class":234},[228,873,247],{"class":234},[228,875,238],{"class":234},[228,877,253],{"class":252},[228,879,238],{"class":234},[228,881,258],{"class":234},[228,883,238],{"class":234},[228,885,690],{"class":241},[228,887,238],{"class":234},[228,889,247],{"class":234},[228,891,238],{"class":234},[228,893,894],{"class":252},"Generate Work Orders",[228,896,238],{"class":234},[228,898,258],{"class":234},[228,900,238],{"class":234},[228,902,903],{"class":241},"func",[228,905,238],{"class":234},[228,907,247],{"class":234},[228,909,238],{"class":234},[228,911,912],{"class":252},"const stationId = msg.req.query.stationId;",[228,914,916],{"class":915},"sTEyZ","\\n",[228,918,919],{"class":252},"const username = msg.req.query.username;",[228,921,922],{"class":915},"\\n\\n",[228,924,925],{"class":252},"const workOrders = global.get(",[228,927,928],{"class":915},"\\\"",[228,930,931],{"class":252},"workOrders",[228,933,928],{"class":915},[228,935,103],{"class":252},[228,937,928],{"class":915},[228,939,940],{"class":252},"persistent",[228,942,928],{"class":915},[228,944,945],{"class":252},") || [];",[228,947,922],{"class":915},[228,949,950],{"class":252},"const result = workOrders.filter(w =>",[228,952,916],{"class":915},[228,954,955],{"class":252},"    w.stationId === stationId &&",[228,957,916],{"class":915},[228,959,960],{"class":252},"    w.assignedTo === username &&",[228,962,916],{"class":915},[228,964,965],{"class":252},"    w.status !== ",[228,967,928],{"class":915},[228,969,970],{"class":252},"defect",[228,972,928],{"class":915},[228,974,975],{"class":252}," &&",[228,977,916],{"class":915},[228,979,965],{"class":252},[228,981,928],{"class":915},[228,983,984],{"class":252},"completed",[228,986,987],{"class":915},"\\\"\\n",[228,989,990],{"class":252},");",[228,992,922],{"class":915},[228,994,995],{"class":252},"msg.payload = result;",[228,997,922],{"class":915},[228,999,1000],{"class":252},"return msg;",[228,1002,238],{"class":234},[228,1004,258],{"class":234},[228,1006,238],{"class":234},[228,1008,1009],{"class":241},"outputs",[228,1011,238],{"class":234},[228,1013,247],{"class":234},[228,1015,337],{"class":573},[228,1017,258],{"class":234},[228,1019,238],{"class":234},[228,1021,1022],{"class":241},"timeout",[228,1024,238],{"class":234},[228,1026,247],{"class":234},[228,1028,770],{"class":234},[228,1030,258],{"class":234},[228,1032,238],{"class":234},[228,1034,1035],{"class":241},"noerr",[228,1037,238],{"class":234},[228,1039,247],{"class":234},[228,1041,1042],{"class":573},"0",[228,1044,258],{"class":234},[228,1046,238],{"class":234},[228,1048,1049],{"class":241},"initialize",[228,1051,238],{"class":234},[228,1053,247],{"class":234},[228,1055,770],{"class":234},[228,1057,258],{"class":234},[228,1059,238],{"class":234},[228,1061,1062],{"class":241},"finalize",[228,1064,238],{"class":234},[228,1066,247],{"class":234},[228,1068,770],{"class":234},[228,1070,258],{"class":234},[228,1072,238],{"class":234},[228,1074,1075],{"class":241},"libs",[228,1077,238],{"class":234},[228,1079,1080],{"class":234},":[],",[228,1082,238],{"class":234},[228,1084,566],{"class":241},[228,1086,238],{"class":234},[228,1088,247],{"class":234},[228,1090,1091],{"class":573},"420",[228,1093,258],{"class":234},[228,1095,238],{"class":234},[228,1097,581],{"class":241},[228,1099,238],{"class":234},[228,1101,247],{"class":234},[228,1103,217],{"class":573},[228,1105,258],{"class":234},[228,1107,238],{"class":234},[228,1109,802],{"class":241},[228,1111,238],{"class":234},[228,1113,807],{"class":234},[228,1115,238],{"class":234},[228,1117,457],{"class":252},[228,1119,238],{"class":234},[228,1121,816],{"class":234},[228,1123,238],{"class":234},[228,1125,242],{"class":241},[228,1127,238],{"class":234},[228,1129,247],{"class":234},[228,1131,238],{"class":234},[228,1133,457],{"class":252},[228,1135,238],{"class":234},[228,1137,258],{"class":234},[228,1139,238],{"class":234},[228,1141,263],{"class":241},[228,1143,238],{"class":234},[228,1145,247],{"class":234},[228,1147,238],{"class":234},[228,1149,1150],{"class":252},"http response",[228,1152,238],{"class":234},[228,1154,258],{"class":234},[228,1156,238],{"class":234},[228,1158,281],{"class":241},[228,1160,238],{"class":234},[228,1162,247],{"class":234},[228,1164,238],{"class":234},[228,1166,290],{"class":252},[228,1168,238],{"class":234},[228,1170,258],{"class":234},[228,1172,238],{"class":234},[228,1174,673],{"class":241},[228,1176,238],{"class":234},[228,1178,247],{"class":234},[228,1180,238],{"class":234},[228,1182,253],{"class":252},[228,1184,238],{"class":234},[228,1186,258],{"class":234},[228,1188,238],{"class":234},[228,1190,690],{"class":241},[228,1192,238],{"class":234},[228,1194,247],{"class":234},[228,1196,770],{"class":234},[228,1198,258],{"class":234},[228,1200,238],{"class":234},[228,1202,1203],{"class":241},"statusCode",[228,1205,238],{"class":234},[228,1207,247],{"class":234},[228,1209,770],{"class":234},[228,1211,258],{"class":234},[228,1213,238],{"class":234},[228,1215,1216],{"class":241},"headers",[228,1218,238],{"class":234},[228,1220,304],{"class":234},[228,1222,238],{"class":234},[228,1224,1225],{"class":309},"Content-Type",[228,1227,238],{"class":234},[228,1229,247],{"class":234},[228,1231,238],{"class":234},[228,1233,1234],{"class":252},"application\u002Fjson",[228,1236,238],{"class":234},[228,1238,424],{"class":234},[228,1240,238],{"class":234},[228,1242,566],{"class":241},[228,1244,238],{"class":234},[228,1246,247],{"class":234},[228,1248,1249],{"class":573},"610",[228,1251,258],{"class":234},[228,1253,238],{"class":234},[228,1255,581],{"class":241},[228,1257,238],{"class":234},[228,1259,247],{"class":234},[228,1261,217],{"class":573},[228,1263,258],{"class":234},[228,1265,238],{"class":234},[228,1267,802],{"class":241},[228,1269,238],{"class":234},[228,1271,1272],{"class":234},":[]},{",[228,1274,238],{"class":234},[228,1276,242],{"class":241},[228,1278,238],{"class":234},[228,1280,247],{"class":234},[228,1282,238],{"class":234},[228,1284,466],{"class":252},[228,1286,238],{"class":234},[228,1288,258],{"class":234},[228,1290,238],{"class":234},[228,1292,263],{"class":241},[228,1294,238],{"class":234},[228,1296,247],{"class":234},[228,1298,238],{"class":234},[228,1300,648],{"class":252},[228,1302,238],{"class":234},[228,1304,258],{"class":234},[228,1306,238],{"class":234},[228,1308,281],{"class":241},[228,1310,238],{"class":234},[228,1312,247],{"class":234},[228,1314,238],{"class":234},[228,1316,290],{"class":252},[228,1318,238],{"class":234},[228,1320,258],{"class":234},[228,1322,238],{"class":234},[228,1324,673],{"class":241},[228,1326,238],{"class":234},[228,1328,247],{"class":234},[228,1330,238],{"class":234},[228,1332,253],{"class":252},[228,1334,238],{"class":234},[228,1336,258],{"class":234},[228,1338,238],{"class":234},[228,1340,690],{"class":241},[228,1342,238],{"class":234},[228,1344,247],{"class":234},[228,1346,238],{"class":234},[228,1348,1349],{"class":252},"POST Mark Defect",[228,1351,238],{"class":234},[228,1353,258],{"class":234},[228,1355,238],{"class":234},[228,1357,708],{"class":241},[228,1359,238],{"class":234},[228,1361,247],{"class":234},[228,1363,238],{"class":234},[228,1365,1366],{"class":252},"\u002Fworkorders\u002Fdefect",[228,1368,238],{"class":234},[228,1370,258],{"class":234},[228,1372,238],{"class":234},[228,1374,726],{"class":241},[228,1376,238],{"class":234},[228,1378,247],{"class":234},[228,1380,238],{"class":234},[228,1382,1383],{"class":252},"post",[228,1385,238],{"class":234},[228,1387,258],{"class":234},[228,1389,238],{"class":234},[228,1391,744],{"class":241},[228,1393,238],{"class":234},[228,1395,749],{"class":234},[228,1397,238],{"class":234},[228,1399,754],{"class":241},[228,1401,238],{"class":234},[228,1403,749],{"class":234},[228,1405,238],{"class":234},[228,1407,763],{"class":241},[228,1409,238],{"class":234},[228,1411,247],{"class":234},[228,1413,770],{"class":234},[228,1415,258],{"class":234},[228,1417,238],{"class":234},[228,1419,566],{"class":241},[228,1421,238],{"class":234},[228,1423,247],{"class":234},[228,1425,783],{"class":573},[228,1427,258],{"class":234},[228,1429,238],{"class":234},[228,1431,581],{"class":241},[228,1433,238],{"class":234},[228,1435,247],{"class":234},[228,1437,1438],{"class":573},"400",[228,1440,258],{"class":234},[228,1442,238],{"class":234},[228,1444,802],{"class":241},[228,1446,238],{"class":234},[228,1448,807],{"class":234},[228,1450,238],{"class":234},[228,1452,475],{"class":252},[228,1454,238],{"class":234},[228,1456,816],{"class":234},[228,1458,238],{"class":234},[228,1460,242],{"class":241},[228,1462,238],{"class":234},[228,1464,247],{"class":234},[228,1466,238],{"class":234},[228,1468,475],{"class":252},[228,1470,238],{"class":234},[228,1472,258],{"class":234},[228,1474,238],{"class":234},[228,1476,263],{"class":241},[228,1478,238],{"class":234},[228,1480,247],{"class":234},[228,1482,238],{"class":234},[228,1484,845],{"class":252},[228,1486,238],{"class":234},[228,1488,258],{"class":234},[228,1490,238],{"class":234},[228,1492,281],{"class":241},[228,1494,238],{"class":234},[228,1496,247],{"class":234},[228,1498,238],{"class":234},[228,1500,290],{"class":252},[228,1502,238],{"class":234},[228,1504,258],{"class":234},[228,1506,238],{"class":234},[228,1508,673],{"class":241},[228,1510,238],{"class":234},[228,1512,247],{"class":234},[228,1514,238],{"class":234},[228,1516,253],{"class":252},[228,1518,238],{"class":234},[228,1520,258],{"class":234},[228,1522,238],{"class":234},[228,1524,690],{"class":241},[228,1526,238],{"class":234},[228,1528,247],{"class":234},[228,1530,238],{"class":234},[228,1532,1533],{"class":252},"Mark Defect",[228,1535,238],{"class":234},[228,1537,258],{"class":234},[228,1539,238],{"class":234},[228,1541,903],{"class":241},[228,1543,238],{"class":234},[228,1545,247],{"class":234},[228,1547,238],{"class":234},[228,1549,1550],{"class":252},"const { workOrderId, issueType, severity, affectedPart, description } = msg.payload || {};",[228,1552,922],{"class":915},[228,1554,1555],{"class":252},"if (!workOrderId || !issueType || !severity || !affectedPart) {",[228,1557,916],{"class":915},[228,1559,1560],{"class":252},"    msg.statusCode = 400;",[228,1562,916],{"class":915},[228,1564,1565],{"class":252},"    msg.payload = { error: 'workOrderId, issueType, severity, and affectedPart are required' };",[228,1567,916],{"class":915},[228,1569,1570],{"class":252},"    return msg;",[228,1572,916],{"class":915},[228,1574,1575],{"class":252},"}",[228,1577,922],{"class":915},[228,1579,1580],{"class":252},"const workOrders = global.get('workOrders', 'persistent') || [];",[228,1582,916],{"class":915},[228,1584,1585],{"class":252},"const idx = workOrders.findIndex(w => w.workOrderId === workOrderId);",[228,1587,922],{"class":915},[228,1589,1590],{"class":252},"if (idx === -1) {",[228,1592,916],{"class":915},[228,1594,1595],{"class":252},"    msg.statusCode = 404;",[228,1597,916],{"class":915},[228,1599,1600],{"class":252},"    msg.payload = { error: 'Work order not found' };",[228,1602,916],{"class":915},[228,1604,1570],{"class":252},[228,1606,916],{"class":915},[228,1608,1575],{"class":252},[228,1610,922],{"class":915},[228,1612,1613],{"class":252},"workOrders[idx].status = 'defect';",[228,1615,916],{"class":915},[228,1617,1618],{"class":252},"workOrders[idx].defect = {",[228,1620,916],{"class":915},[228,1622,1623],{"class":252},"    issueType,",[228,1625,916],{"class":915},[228,1627,1628],{"class":252},"    severity,",[228,1630,916],{"class":915},[228,1632,1633],{"class":252},"    affectedPart,",[228,1635,916],{"class":915},[228,1637,1638],{"class":252},"    description: description || null,",[228,1640,916],{"class":915},[228,1642,1643],{"class":252},"    reportedAt: new Date().toISOString()",[228,1645,916],{"class":915},[228,1647,1648],{"class":252},"};",[228,1650,922],{"class":915},[228,1652,1653],{"class":252},"global.set('workOrders', workOrders, 'persistent');",[228,1655,922],{"class":915},[228,1657,1658],{"class":252},"msg.statusCode = 200;",[228,1660,916],{"class":915},[228,1662,1663],{"class":252},"msg.payload = { success: true, workOrder: workOrders[idx] };",[228,1665,916],{"class":915},[228,1667,1000],{"class":252},[228,1669,238],{"class":234},[228,1671,258],{"class":234},[228,1673,238],{"class":234},[228,1675,1009],{"class":241},[228,1677,238],{"class":234},[228,1679,247],{"class":234},[228,1681,337],{"class":573},[228,1683,258],{"class":234},[228,1685,238],{"class":234},[228,1687,1022],{"class":241},[228,1689,238],{"class":234},[228,1691,247],{"class":234},[228,1693,770],{"class":234},[228,1695,258],{"class":234},[228,1697,238],{"class":234},[228,1699,1035],{"class":241},[228,1701,238],{"class":234},[228,1703,247],{"class":234},[228,1705,1042],{"class":573},[228,1707,258],{"class":234},[228,1709,238],{"class":234},[228,1711,1049],{"class":241},[228,1713,238],{"class":234},[228,1715,247],{"class":234},[228,1717,770],{"class":234},[228,1719,258],{"class":234},[228,1721,238],{"class":234},[228,1723,1062],{"class":241},[228,1725,238],{"class":234},[228,1727,247],{"class":234},[228,1729,770],{"class":234},[228,1731,258],{"class":234},[228,1733,238],{"class":234},[228,1735,1075],{"class":241},[228,1737,238],{"class":234},[228,1739,1080],{"class":234},[228,1741,238],{"class":234},[228,1743,566],{"class":241},[228,1745,238],{"class":234},[228,1747,247],{"class":234},[228,1749,1750],{"class":573},"390",[228,1752,258],{"class":234},[228,1754,238],{"class":234},[228,1756,581],{"class":241},[228,1758,238],{"class":234},[228,1760,247],{"class":234},[228,1762,1438],{"class":573},[228,1764,258],{"class":234},[228,1766,238],{"class":234},[228,1768,802],{"class":241},[228,1770,238],{"class":234},[228,1772,807],{"class":234},[228,1774,238],{"class":234},[228,1776,484],{"class":252},[228,1778,238],{"class":234},[228,1780,816],{"class":234},[228,1782,238],{"class":234},[228,1784,242],{"class":241},[228,1786,238],{"class":234},[228,1788,247],{"class":234},[228,1790,238],{"class":234},[228,1792,484],{"class":252},[228,1794,238],{"class":234},[228,1796,258],{"class":234},[228,1798,238],{"class":234},[228,1800,263],{"class":241},[228,1802,238],{"class":234},[228,1804,247],{"class":234},[228,1806,238],{"class":234},[228,1808,1150],{"class":252},[228,1810,238],{"class":234},[228,1812,258],{"class":234},[228,1814,238],{"class":234},[228,1816,281],{"class":241},[228,1818,238],{"class":234},[228,1820,247],{"class":234},[228,1822,238],{"class":234},[228,1824,290],{"class":252},[228,1826,238],{"class":234},[228,1828,258],{"class":234},[228,1830,238],{"class":234},[228,1832,673],{"class":241},[228,1834,238],{"class":234},[228,1836,247],{"class":234},[228,1838,238],{"class":234},[228,1840,253],{"class":252},[228,1842,238],{"class":234},[228,1844,258],{"class":234},[228,1846,238],{"class":234},[228,1848,690],{"class":241},[228,1850,238],{"class":234},[228,1852,247],{"class":234},[228,1854,770],{"class":234},[228,1856,258],{"class":234},[228,1858,238],{"class":234},[228,1860,1203],{"class":241},[228,1862,238],{"class":234},[228,1864,247],{"class":234},[228,1866,770],{"class":234},[228,1868,258],{"class":234},[228,1870,238],{"class":234},[228,1872,1216],{"class":241},[228,1874,238],{"class":234},[228,1876,304],{"class":234},[228,1878,238],{"class":234},[228,1880,1225],{"class":309},[228,1882,238],{"class":234},[228,1884,247],{"class":234},[228,1886,238],{"class":234},[228,1888,1234],{"class":252},[228,1890,238],{"class":234},[228,1892,424],{"class":234},[228,1894,238],{"class":234},[228,1896,566],{"class":241},[228,1898,238],{"class":234},[228,1900,247],{"class":234},[228,1902,1249],{"class":573},[228,1904,258],{"class":234},[228,1906,238],{"class":234},[228,1908,581],{"class":241},[228,1910,238],{"class":234},[228,1912,247],{"class":234},[228,1914,1438],{"class":573},[228,1916,258],{"class":234},[228,1918,238],{"class":234},[228,1920,802],{"class":241},[228,1922,238],{"class":234},[228,1924,1272],{"class":234},[228,1926,238],{"class":234},[228,1928,242],{"class":241},[228,1930,238],{"class":234},[228,1932,247],{"class":234},[228,1934,238],{"class":234},[228,1936,493],{"class":252},[228,1938,238],{"class":234},[228,1940,258],{"class":234},[228,1942,238],{"class":234},[228,1944,263],{"class":241},[228,1946,238],{"class":234},[228,1948,247],{"class":234},[228,1950,238],{"class":234},[228,1952,648],{"class":252},[228,1954,238],{"class":234},[228,1956,258],{"class":234},[228,1958,238],{"class":234},[228,1960,281],{"class":241},[228,1962,238],{"class":234},[228,1964,247],{"class":234},[228,1966,238],{"class":234},[228,1968,290],{"class":252},[228,1970,238],{"class":234},[228,1972,258],{"class":234},[228,1974,238],{"class":234},[228,1976,673],{"class":241},[228,1978,238],{"class":234},[228,1980,247],{"class":234},[228,1982,238],{"class":234},[228,1984,253],{"class":252},[228,1986,238],{"class":234},[228,1988,258],{"class":234},[228,1990,238],{"class":234},[228,1992,690],{"class":241},[228,1994,238],{"class":234},[228,1996,247],{"class":234},[228,1998,238],{"class":234},[228,2000,2001],{"class":252},"POST Complete Order",[228,2003,238],{"class":234},[228,2005,258],{"class":234},[228,2007,238],{"class":234},[228,2009,708],{"class":241},[228,2011,238],{"class":234},[228,2013,247],{"class":234},[228,2015,238],{"class":234},[228,2017,2018],{"class":252},"\u002Fworkorders\u002Fcomplete",[228,2020,238],{"class":234},[228,2022,258],{"class":234},[228,2024,238],{"class":234},[228,2026,726],{"class":241},[228,2028,238],{"class":234},[228,2030,247],{"class":234},[228,2032,238],{"class":234},[228,2034,1383],{"class":252},[228,2036,238],{"class":234},[228,2038,258],{"class":234},[228,2040,238],{"class":234},[228,2042,744],{"class":241},[228,2044,238],{"class":234},[228,2046,749],{"class":234},[228,2048,238],{"class":234},[228,2050,754],{"class":241},[228,2052,238],{"class":234},[228,2054,749],{"class":234},[228,2056,238],{"class":234},[228,2058,763],{"class":241},[228,2060,238],{"class":234},[228,2062,247],{"class":234},[228,2064,770],{"class":234},[228,2066,258],{"class":234},[228,2068,238],{"class":234},[228,2070,566],{"class":241},[228,2072,238],{"class":234},[228,2074,247],{"class":234},[228,2076,2077],{"class":573},"170",[228,2079,258],{"class":234},[228,2081,238],{"class":234},[228,2083,581],{"class":241},[228,2085,238],{"class":234},[228,2087,247],{"class":234},[228,2089,2090],{"class":573},"500",[228,2092,258],{"class":234},[228,2094,238],{"class":234},[228,2096,802],{"class":241},[228,2098,238],{"class":234},[228,2100,807],{"class":234},[228,2102,238],{"class":234},[228,2104,502],{"class":252},[228,2106,238],{"class":234},[228,2108,816],{"class":234},[228,2110,238],{"class":234},[228,2112,242],{"class":241},[228,2114,238],{"class":234},[228,2116,247],{"class":234},[228,2118,238],{"class":234},[228,2120,502],{"class":252},[228,2122,238],{"class":234},[228,2124,258],{"class":234},[228,2126,238],{"class":234},[228,2128,263],{"class":241},[228,2130,238],{"class":234},[228,2132,247],{"class":234},[228,2134,238],{"class":234},[228,2136,845],{"class":252},[228,2138,238],{"class":234},[228,2140,258],{"class":234},[228,2142,238],{"class":234},[228,2144,281],{"class":241},[228,2146,238],{"class":234},[228,2148,247],{"class":234},[228,2150,238],{"class":234},[228,2152,290],{"class":252},[228,2154,238],{"class":234},[228,2156,258],{"class":234},[228,2158,238],{"class":234},[228,2160,673],{"class":241},[228,2162,238],{"class":234},[228,2164,247],{"class":234},[228,2166,238],{"class":234},[228,2168,253],{"class":252},[228,2170,238],{"class":234},[228,2172,258],{"class":234},[228,2174,238],{"class":234},[228,2176,690],{"class":241},[228,2178,238],{"class":234},[228,2180,247],{"class":234},[228,2182,238],{"class":234},[228,2184,2185],{"class":252},"Complete Work Order",[228,2187,238],{"class":234},[228,2189,258],{"class":234},[228,2191,238],{"class":234},[228,2193,903],{"class":241},[228,2195,238],{"class":234},[228,2197,247],{"class":234},[228,2199,238],{"class":234},[228,2201,2202],{"class":252},"const { workOrderId } = msg.payload || {};",[228,2204,922],{"class":915},[228,2206,2207],{"class":252},"if (!workOrderId) {",[228,2209,916],{"class":915},[228,2211,1560],{"class":252},[228,2213,916],{"class":915},[228,2215,2216],{"class":252},"    msg.payload = { error: 'workOrderId is required' };",[228,2218,916],{"class":915},[228,2220,1570],{"class":252},[228,2222,916],{"class":915},[228,2224,1575],{"class":252},[228,2226,922],{"class":915},[228,2228,1580],{"class":252},[228,2230,916],{"class":915},[228,2232,1585],{"class":252},[228,2234,922],{"class":915},[228,2236,1590],{"class":252},[228,2238,916],{"class":915},[228,2240,1595],{"class":252},[228,2242,916],{"class":915},[228,2244,1600],{"class":252},[228,2246,916],{"class":915},[228,2248,1570],{"class":252},[228,2250,916],{"class":915},[228,2252,1575],{"class":252},[228,2254,922],{"class":915},[228,2256,2257],{"class":252},"workOrders[idx].status = 'completed';",[228,2259,916],{"class":915},[228,2261,2262],{"class":252},"workOrders[idx].completedAt = new Date().toISOString();",[228,2264,922],{"class":915},[228,2266,1653],{"class":252},[228,2268,922],{"class":915},[228,2270,1658],{"class":252},[228,2272,916],{"class":915},[228,2274,1663],{"class":252},[228,2276,916],{"class":915},[228,2278,1000],{"class":252},[228,2280,238],{"class":234},[228,2282,258],{"class":234},[228,2284,238],{"class":234},[228,2286,1009],{"class":241},[228,2288,238],{"class":234},[228,2290,247],{"class":234},[228,2292,337],{"class":573},[228,2294,258],{"class":234},[228,2296,238],{"class":234},[228,2298,1022],{"class":241},[228,2300,238],{"class":234},[228,2302,247],{"class":234},[228,2304,770],{"class":234},[228,2306,258],{"class":234},[228,2308,238],{"class":234},[228,2310,1035],{"class":241},[228,2312,238],{"class":234},[228,2314,247],{"class":234},[228,2316,1042],{"class":573},[228,2318,258],{"class":234},[228,2320,238],{"class":234},[228,2322,1049],{"class":241},[228,2324,238],{"class":234},[228,2326,247],{"class":234},[228,2328,770],{"class":234},[228,2330,258],{"class":234},[228,2332,238],{"class":234},[228,2334,1062],{"class":241},[228,2336,238],{"class":234},[228,2338,247],{"class":234},[228,2340,770],{"class":234},[228,2342,258],{"class":234},[228,2344,238],{"class":234},[228,2346,1075],{"class":241},[228,2348,238],{"class":234},[228,2350,1080],{"class":234},[228,2352,238],{"class":234},[228,2354,566],{"class":241},[228,2356,238],{"class":234},[228,2358,247],{"class":234},[228,2360,2361],{"class":573},"410",[228,2363,258],{"class":234},[228,2365,238],{"class":234},[228,2367,581],{"class":241},[228,2369,238],{"class":234},[228,2371,247],{"class":234},[228,2373,2090],{"class":573},[228,2375,258],{"class":234},[228,2377,238],{"class":234},[228,2379,802],{"class":241},[228,2381,238],{"class":234},[228,2383,807],{"class":234},[228,2385,238],{"class":234},[228,2387,511],{"class":252},[228,2389,238],{"class":234},[228,2391,816],{"class":234},[228,2393,238],{"class":234},[228,2395,242],{"class":241},[228,2397,238],{"class":234},[228,2399,247],{"class":234},[228,2401,238],{"class":234},[228,2403,511],{"class":252},[228,2405,238],{"class":234},[228,2407,258],{"class":234},[228,2409,238],{"class":234},[228,2411,263],{"class":241},[228,2413,238],{"class":234},[228,2415,247],{"class":234},[228,2417,238],{"class":234},[228,2419,1150],{"class":252},[228,2421,238],{"class":234},[228,2423,258],{"class":234},[228,2425,238],{"class":234},[228,2427,281],{"class":241},[228,2429,238],{"class":234},[228,2431,247],{"class":234},[228,2433,238],{"class":234},[228,2435,290],{"class":252},[228,2437,238],{"class":234},[228,2439,258],{"class":234},[228,2441,238],{"class":234},[228,2443,673],{"class":241},[228,2445,238],{"class":234},[228,2447,247],{"class":234},[228,2449,238],{"class":234},[228,2451,253],{"class":252},[228,2453,238],{"class":234},[228,2455,258],{"class":234},[228,2457,238],{"class":234},[228,2459,690],{"class":241},[228,2461,238],{"class":234},[228,2463,247],{"class":234},[228,2465,770],{"class":234},[228,2467,258],{"class":234},[228,2469,238],{"class":234},[228,2471,1203],{"class":241},[228,2473,238],{"class":234},[228,2475,247],{"class":234},[228,2477,770],{"class":234},[228,2479,258],{"class":234},[228,2481,238],{"class":234},[228,2483,1216],{"class":241},[228,2485,238],{"class":234},[228,2487,304],{"class":234},[228,2489,238],{"class":234},[228,2491,1225],{"class":309},[228,2493,238],{"class":234},[228,2495,247],{"class":234},[228,2497,238],{"class":234},[228,2499,1234],{"class":252},[228,2501,238],{"class":234},[228,2503,424],{"class":234},[228,2505,238],{"class":234},[228,2507,566],{"class":241},[228,2509,238],{"class":234},[228,2511,247],{"class":234},[228,2513,2514],{"class":573},"620",[228,2516,258],{"class":234},[228,2518,238],{"class":234},[228,2520,581],{"class":241},[228,2522,238],{"class":234},[228,2524,247],{"class":234},[228,2526,2090],{"class":573},[228,2528,258],{"class":234},[228,2530,238],{"class":234},[228,2532,802],{"class":241},[228,2534,238],{"class":234},[228,2536,1272],{"class":234},[228,2538,238],{"class":234},[228,2540,242],{"class":241},[228,2542,238],{"class":234},[228,2544,247],{"class":234},[228,2546,238],{"class":234},[228,2548,520],{"class":252},[228,2550,238],{"class":234},[228,2552,258],{"class":234},[228,2554,238],{"class":234},[228,2556,263],{"class":241},[228,2558,238],{"class":234},[228,2560,247],{"class":234},[228,2562,238],{"class":234},[228,2564,648],{"class":252},[228,2566,238],{"class":234},[228,2568,258],{"class":234},[228,2570,238],{"class":234},[228,2572,281],{"class":241},[228,2574,238],{"class":234},[228,2576,247],{"class":234},[228,2578,238],{"class":234},[228,2580,290],{"class":252},[228,2582,238],{"class":234},[228,2584,258],{"class":234},[228,2586,238],{"class":234},[228,2588,673],{"class":241},[228,2590,238],{"class":234},[228,2592,247],{"class":234},[228,2594,238],{"class":234},[228,2596,253],{"class":252},[228,2598,238],{"class":234},[228,2600,258],{"class":234},[228,2602,238],{"class":234},[228,2604,690],{"class":241},[228,2606,238],{"class":234},[228,2608,247],{"class":234},[228,2610,238],{"class":234},[228,2612,2613],{"class":252},"GET Work Order Stats",[228,2615,238],{"class":234},[228,2617,258],{"class":234},[228,2619,238],{"class":234},[228,2621,708],{"class":241},[228,2623,238],{"class":234},[228,2625,247],{"class":234},[228,2627,238],{"class":234},[228,2629,2630],{"class":252},"\u002Fworkorders\u002Fstats",[228,2632,238],{"class":234},[228,2634,258],{"class":234},[228,2636,238],{"class":234},[228,2638,726],{"class":241},[228,2640,238],{"class":234},[228,2642,247],{"class":234},[228,2644,238],{"class":234},[228,2646,735],{"class":252},[228,2648,238],{"class":234},[228,2650,258],{"class":234},[228,2652,238],{"class":234},[228,2654,744],{"class":241},[228,2656,238],{"class":234},[228,2658,749],{"class":234},[228,2660,238],{"class":234},[228,2662,754],{"class":241},[228,2664,238],{"class":234},[228,2666,749],{"class":234},[228,2668,238],{"class":234},[228,2670,763],{"class":241},[228,2672,238],{"class":234},[228,2674,247],{"class":234},[228,2676,770],{"class":234},[228,2678,258],{"class":234},[228,2680,238],{"class":234},[228,2682,566],{"class":241},[228,2684,238],{"class":234},[228,2686,247],{"class":234},[228,2688,2689],{"class":573},"180",[228,2691,258],{"class":234},[228,2693,238],{"class":234},[228,2695,581],{"class":241},[228,2697,238],{"class":234},[228,2699,247],{"class":234},[228,2701,2702],{"class":573},"220",[228,2704,258],{"class":234},[228,2706,238],{"class":234},[228,2708,802],{"class":241},[228,2710,238],{"class":234},[228,2712,807],{"class":234},[228,2714,238],{"class":234},[228,2716,529],{"class":252},[228,2718,238],{"class":234},[228,2720,816],{"class":234},[228,2722,238],{"class":234},[228,2724,242],{"class":241},[228,2726,238],{"class":234},[228,2728,247],{"class":234},[228,2730,238],{"class":234},[228,2732,529],{"class":252},[228,2734,238],{"class":234},[228,2736,258],{"class":234},[228,2738,238],{"class":234},[228,2740,263],{"class":241},[228,2742,238],{"class":234},[228,2744,247],{"class":234},[228,2746,238],{"class":234},[228,2748,845],{"class":252},[228,2750,238],{"class":234},[228,2752,258],{"class":234},[228,2754,238],{"class":234},[228,2756,281],{"class":241},[228,2758,238],{"class":234},[228,2760,247],{"class":234},[228,2762,238],{"class":234},[228,2764,290],{"class":252},[228,2766,238],{"class":234},[228,2768,258],{"class":234},[228,2770,238],{"class":234},[228,2772,673],{"class":241},[228,2774,238],{"class":234},[228,2776,247],{"class":234},[228,2778,238],{"class":234},[228,2780,253],{"class":252},[228,2782,238],{"class":234},[228,2784,258],{"class":234},[228,2786,238],{"class":234},[228,2788,690],{"class":241},[228,2790,238],{"class":234},[228,2792,247],{"class":234},[228,2794,238],{"class":234},[228,2796,2797],{"class":252},"Compute Stats",[228,2799,238],{"class":234},[228,2801,258],{"class":234},[228,2803,238],{"class":234},[228,2805,903],{"class":241},[228,2807,238],{"class":234},[228,2809,247],{"class":234},[228,2811,238],{"class":234},[228,2813,1580],{"class":252},[228,2815,916],{"class":915},[228,2817,2818],{"class":252},"node.warn(msg.req.query);",[228,2820,916],{"class":915},[228,2822,912],{"class":252},[228,2824,916],{"class":915},[228,2826,919],{"class":252},[228,2828,922],{"class":915},[228,2830,2831],{"class":252},"\u002F\u002F Filter only by station",[228,2833,916],{"class":915},[228,2835,2836],{"class":252},"const stationWorkOrders = stationId",[228,2838,916],{"class":915},[228,2840,2841],{"class":252},"    ? workOrders.filter(w => w.stationId === stationId)",[228,2843,916],{"class":915},[228,2845,2846],{"class":252},"    : workOrders;",[228,2848,922],{"class":915},[228,2850,2851],{"class":252},"const total = stationWorkOrders.length;",[228,2853,916],{"class":915},[228,2855,2856],{"class":252},"const completed = stationWorkOrders.filter(w => w.status === ",[228,2858,928],{"class":915},[228,2860,984],{"class":252},[228,2862,928],{"class":915},[228,2864,2865],{"class":252},").length;",[228,2867,916],{"class":915},[228,2869,2870],{"class":252},"const defected = stationWorkOrders.filter(w => w.status === ",[228,2872,928],{"class":915},[228,2874,970],{"class":252},[228,2876,928],{"class":915},[228,2878,2865],{"class":252},[228,2880,922],{"class":915},[228,2882,2883],{"class":252},"\u002F\u002F Filter by user within the station",[228,2885,916],{"class":915},[228,2887,2888],{"class":252},"const assignedToMe = username",[228,2890,916],{"class":915},[228,2892,2893],{"class":252},"    ? stationWorkOrders.filter(w => w.assignedTo === username).length",[228,2895,916],{"class":915},[228,2897,2898],{"class":252},"    : 0;",[228,2900,922],{"class":915},[228,2902,1658],{"class":252},[228,2904,916],{"class":915},[228,2906,2907],{"class":252},"msg.payload = {",[228,2909,916],{"class":915},[228,2911,2912],{"class":252},"    total,",[228,2914,916],{"class":915},[228,2916,2917],{"class":252},"    completed,",[228,2919,916],{"class":915},[228,2921,2922],{"class":252},"    defected,",[228,2924,916],{"class":915},[228,2926,2927],{"class":252},"    assignedToMe",[228,2929,916],{"class":915},[228,2931,1648],{"class":252},[228,2933,922],{"class":915},[228,2935,1000],{"class":252},[228,2937,238],{"class":234},[228,2939,258],{"class":234},[228,2941,238],{"class":234},[228,2943,1009],{"class":241},[228,2945,238],{"class":234},[228,2947,247],{"class":234},[228,2949,337],{"class":573},[228,2951,258],{"class":234},[228,2953,238],{"class":234},[228,2955,1022],{"class":241},[228,2957,238],{"class":234},[228,2959,247],{"class":234},[228,2961,770],{"class":234},[228,2963,258],{"class":234},[228,2965,238],{"class":234},[228,2967,1035],{"class":241},[228,2969,238],{"class":234},[228,2971,247],{"class":234},[228,2973,1042],{"class":573},[228,2975,258],{"class":234},[228,2977,238],{"class":234},[228,2979,1049],{"class":241},[228,2981,238],{"class":234},[228,2983,247],{"class":234},[228,2985,770],{"class":234},[228,2987,258],{"class":234},[228,2989,238],{"class":234},[228,2991,1062],{"class":241},[228,2993,238],{"class":234},[228,2995,247],{"class":234},[228,2997,770],{"class":234},[228,2999,258],{"class":234},[228,3001,238],{"class":234},[228,3003,1075],{"class":241},[228,3005,238],{"class":234},[228,3007,1080],{"class":234},[228,3009,238],{"class":234},[228,3011,566],{"class":241},[228,3013,238],{"class":234},[228,3015,247],{"class":234},[228,3017,1438],{"class":573},[228,3019,258],{"class":234},[228,3021,238],{"class":234},[228,3023,581],{"class":241},[228,3025,238],{"class":234},[228,3027,247],{"class":234},[228,3029,2702],{"class":573},[228,3031,258],{"class":234},[228,3033,238],{"class":234},[228,3035,802],{"class":241},[228,3037,238],{"class":234},[228,3039,807],{"class":234},[228,3041,238],{"class":234},[228,3043,538],{"class":252},[228,3045,238],{"class":234},[228,3047,816],{"class":234},[228,3049,238],{"class":234},[228,3051,242],{"class":241},[228,3053,238],{"class":234},[228,3055,247],{"class":234},[228,3057,238],{"class":234},[228,3059,538],{"class":252},[228,3061,238],{"class":234},[228,3063,258],{"class":234},[228,3065,238],{"class":234},[228,3067,263],{"class":241},[228,3069,238],{"class":234},[228,3071,247],{"class":234},[228,3073,238],{"class":234},[228,3075,1150],{"class":252},[228,3077,238],{"class":234},[228,3079,258],{"class":234},[228,3081,238],{"class":234},[228,3083,281],{"class":241},[228,3085,238],{"class":234},[228,3087,247],{"class":234},[228,3089,238],{"class":234},[228,3091,290],{"class":252},[228,3093,238],{"class":234},[228,3095,258],{"class":234},[228,3097,238],{"class":234},[228,3099,673],{"class":241},[228,3101,238],{"class":234},[228,3103,247],{"class":234},[228,3105,238],{"class":234},[228,3107,253],{"class":252},[228,3109,238],{"class":234},[228,3111,258],{"class":234},[228,3113,238],{"class":234},[228,3115,690],{"class":241},[228,3117,238],{"class":234},[228,3119,247],{"class":234},[228,3121,770],{"class":234},[228,3123,258],{"class":234},[228,3125,238],{"class":234},[228,3127,1203],{"class":241},[228,3129,238],{"class":234},[228,3131,247],{"class":234},[228,3133,770],{"class":234},[228,3135,258],{"class":234},[228,3137,238],{"class":234},[228,3139,1216],{"class":241},[228,3141,238],{"class":234},[228,3143,304],{"class":234},[228,3145,238],{"class":234},[228,3147,1225],{"class":309},[228,3149,238],{"class":234},[228,3151,247],{"class":234},[228,3153,238],{"class":234},[228,3155,1234],{"class":252},[228,3157,238],{"class":234},[228,3159,424],{"class":234},[228,3161,238],{"class":234},[228,3163,566],{"class":241},[228,3165,238],{"class":234},[228,3167,247],{"class":234},[228,3169,1249],{"class":573},[228,3171,258],{"class":234},[228,3173,238],{"class":234},[228,3175,581],{"class":241},[228,3177,238],{"class":234},[228,3179,247],{"class":234},[228,3181,2702],{"class":573},[228,3183,258],{"class":234},[228,3185,238],{"class":234},[228,3187,802],{"class":241},[228,3189,238],{"class":234},[228,3191,1272],{"class":234},[228,3193,238],{"class":234},[228,3195,242],{"class":241},[228,3197,238],{"class":234},[228,3199,247],{"class":234},[228,3201,238],{"class":234},[228,3203,547],{"class":252},[228,3205,238],{"class":234},[228,3207,258],{"class":234},[228,3209,238],{"class":234},[228,3211,263],{"class":241},[228,3213,238],{"class":234},[228,3215,247],{"class":234},[228,3217,238],{"class":234},[228,3219,845],{"class":252},[228,3221,238],{"class":234},[228,3223,258],{"class":234},[228,3225,238],{"class":234},[228,3227,281],{"class":241},[228,3229,238],{"class":234},[228,3231,247],{"class":234},[228,3233,238],{"class":234},[228,3235,290],{"class":252},[228,3237,238],{"class":234},[228,3239,258],{"class":234},[228,3241,238],{"class":234},[228,3243,673],{"class":241},[228,3245,238],{"class":234},[228,3247,247],{"class":234},[228,3249,238],{"class":234},[228,3251,253],{"class":252},[228,3253,238],{"class":234},[228,3255,258],{"class":234},[228,3257,238],{"class":234},[228,3259,690],{"class":241},[228,3261,238],{"class":234},[228,3263,247],{"class":234},[228,3265,238],{"class":234},[228,3267,3268],{"class":252},"Generate Mock Work Orders",[228,3270,238],{"class":234},[228,3272,258],{"class":234},[228,3274,238],{"class":234},[228,3276,903],{"class":241},[228,3278,238],{"class":234},[228,3280,247],{"class":234},[228,3282,238],{"class":234},[228,3284,3285],{"class":252},"const user = global.get(",[228,3287,928],{"class":915},[228,3289,3290],{"class":252},"user",[228,3292,928],{"class":915},[228,3294,103],{"class":252},[228,3296,928],{"class":915},[228,3298,940],{"class":252},[228,3300,928],{"class":915},[228,3302,990],{"class":252},[228,3304,916],{"class":915},[228,3306,3307],{"class":252},"const currentUser = user?.username || ",[228,3309,928],{"class":915},[228,3311,3312],{"class":252},"operator1",[228,3314,928],{"class":915},[228,3316,3317],{"class":252},";",[228,3319,922],{"class":915},[228,3321,3322],{"class":252},"\u002F\u002F Pool of 5 operators (logged-in user + 4 others)",[228,3324,916],{"class":915},[228,3326,3327],{"class":252},"const operators = [",[228,3329,916],{"class":915},[228,3331,3332],{"class":252},"    currentUser,",[228,3334,916],{"class":915},[228,3336,3337],{"class":915},"    \\\"",[228,3339,3340],{"class":252},"operator2",[228,3342,928],{"class":915},[228,3344,258],{"class":252},[228,3346,916],{"class":915},[228,3348,3337],{"class":915},[228,3350,3351],{"class":252},"operator3",[228,3353,928],{"class":915},[228,3355,258],{"class":252},[228,3357,916],{"class":915},[228,3359,3337],{"class":915},[228,3361,3362],{"class":252},"operator4",[228,3364,928],{"class":915},[228,3366,258],{"class":252},[228,3368,916],{"class":915},[228,3370,3337],{"class":915},[228,3372,3373],{"class":252},"operator5",[228,3375,987],{"class":915},[228,3377,3378],{"class":252},"];",[228,3380,922],{"class":915},[228,3382,3383],{"class":252},"const vehicles = [",[228,3385,916],{"class":915},[228,3387,3388],{"class":252},"    {",[228,3390,916],{"class":915},[228,3392,3393],{"class":252},"        model: ",[228,3395,928],{"class":915},[228,3397,3398],{"class":252},"Sedan X",[228,3400,928],{"class":915},[228,3402,258],{"class":252},[228,3404,916],{"class":915},[228,3406,3407],{"class":252},"        variants: [",[228,3409,928],{"class":915},[228,3411,3412],{"class":252},"Standard",[228,3414,928],{"class":915},[228,3416,103],{"class":252},[228,3418,928],{"class":915},[228,3420,3421],{"class":252},"Premium",[228,3423,928],{"class":915},[228,3425,103],{"class":252},[228,3427,928],{"class":915},[228,3429,3430],{"class":252},"Sport",[228,3432,928],{"class":915},[228,3434,561],{"class":252},[228,3436,916],{"class":915},[228,3438,3439],{"class":252},"        colors: [",[228,3441,928],{"class":915},[228,3443,3444],{"class":252},"White",[228,3446,928],{"class":915},[228,3448,103],{"class":252},[228,3450,928],{"class":915},[228,3452,3453],{"class":252},"Black",[228,3455,928],{"class":915},[228,3457,103],{"class":252},[228,3459,928],{"class":915},[228,3461,3462],{"class":252},"Red",[228,3464,928],{"class":915},[228,3466,3467],{"class":252},"]",[228,3469,916],{"class":915},[228,3471,3472],{"class":252},"    },",[228,3474,916],{"class":915},[228,3476,3388],{"class":252},[228,3478,916],{"class":915},[228,3480,3393],{"class":252},[228,3482,928],{"class":915},[228,3484,3485],{"class":252},"SUV Y",[228,3487,928],{"class":915},[228,3489,258],{"class":252},[228,3491,916],{"class":915},[228,3493,3407],{"class":252},[228,3495,928],{"class":915},[228,3497,3498],{"class":252},"Base",[228,3500,928],{"class":915},[228,3502,103],{"class":252},[228,3504,928],{"class":915},[228,3506,3421],{"class":252},[228,3508,928],{"class":915},[228,3510,103],{"class":252},[228,3512,928],{"class":915},[228,3514,3430],{"class":252},[228,3516,928],{"class":915},[228,3518,561],{"class":252},[228,3520,916],{"class":915},[228,3522,3439],{"class":252},[228,3524,928],{"class":915},[228,3526,3527],{"class":252},"Grey",[228,3529,928],{"class":915},[228,3531,103],{"class":252},[228,3533,928],{"class":915},[228,3535,3444],{"class":252},[228,3537,928],{"class":915},[228,3539,103],{"class":252},[228,3541,928],{"class":915},[228,3543,3453],{"class":252},[228,3545,928],{"class":915},[228,3547,3467],{"class":252},[228,3549,916],{"class":915},[228,3551,3472],{"class":252},[228,3553,916],{"class":915},[228,3555,3388],{"class":252},[228,3557,916],{"class":915},[228,3559,3393],{"class":252},[228,3561,928],{"class":915},[228,3563,3564],{"class":252},"Truck Z",[228,3566,928],{"class":915},[228,3568,258],{"class":252},[228,3570,916],{"class":915},[228,3572,3407],{"class":252},[228,3574,928],{"class":915},[228,3576,3412],{"class":252},[228,3578,928],{"class":915},[228,3580,103],{"class":252},[228,3582,928],{"class":915},[228,3584,3585],{"class":252},"Heavy Duty",[228,3587,928],{"class":915},[228,3589,561],{"class":252},[228,3591,916],{"class":915},[228,3593,3439],{"class":252},[228,3595,928],{"class":915},[228,3597,3598],{"class":252},"Blue",[228,3600,928],{"class":915},[228,3602,103],{"class":252},[228,3604,928],{"class":915},[228,3606,3607],{"class":252},"Green",[228,3609,928],{"class":915},[228,3611,103],{"class":252},[228,3613,928],{"class":915},[228,3615,3444],{"class":252},[228,3617,928],{"class":915},[228,3619,3467],{"class":252},[228,3621,916],{"class":915},[228,3623,3472],{"class":252},[228,3625,916],{"class":915},[228,3627,3388],{"class":252},[228,3629,916],{"class":915},[228,3631,3393],{"class":252},[228,3633,928],{"class":915},[228,3635,3636],{"class":252},"Hatchback W",[228,3638,928],{"class":915},[228,3640,258],{"class":252},[228,3642,916],{"class":915},[228,3644,3407],{"class":252},[228,3646,928],{"class":915},[228,3648,3498],{"class":252},[228,3650,928],{"class":915},[228,3652,103],{"class":252},[228,3654,928],{"class":915},[228,3656,3430],{"class":252},[228,3658,928],{"class":915},[228,3660,561],{"class":252},[228,3662,916],{"class":915},[228,3664,3439],{"class":252},[228,3666,928],{"class":915},[228,3668,3669],{"class":252},"Silver",[228,3671,928],{"class":915},[228,3673,103],{"class":252},[228,3675,928],{"class":915},[228,3677,3678],{"class":252},"Yellow",[228,3680,928],{"class":915},[228,3682,103],{"class":252},[228,3684,928],{"class":915},[228,3686,3462],{"class":252},[228,3688,928],{"class":915},[228,3690,3467],{"class":252},[228,3692,916],{"class":915},[228,3694,3695],{"class":252},"    }",[228,3697,916],{"class":915},[228,3699,3378],{"class":252},[228,3701,922],{"class":915},[228,3703,3704],{"class":252},"const operations = [",[228,3706,916],{"class":915},[228,3708,3388],{"class":252},[228,3710,916],{"class":915},[228,3712,3713],{"class":252},"        operationId: ",[228,3715,928],{"class":915},[228,3717,3718],{"class":252},"OP_WHEEL_FL",[228,3720,928],{"class":915},[228,3722,258],{"class":252},[228,3724,916],{"class":915},[228,3726,3727],{"class":252},"        name: ",[228,3729,928],{"class":915},[228,3731,3732],{"class":252},"Install Front Left Wheel",[228,3734,928],{"class":915},[228,3736,258],{"class":252},[228,3738,916],{"class":915},[228,3740,3741],{"class":252},"        instructionSetId: ",[228,3743,928],{"class":915},[228,3745,3746],{"class":252},"INS001",[228,3748,928],{"class":915},[228,3750,258],{"class":252},[228,3752,916],{"class":915},[228,3754,3755],{"class":252},"        estimatedCycleTime: 45",[228,3757,916],{"class":915},[228,3759,3472],{"class":252},[228,3761,916],{"class":915},[228,3763,3388],{"class":252},[228,3765,916],{"class":915},[228,3767,3713],{"class":252},[228,3769,928],{"class":915},[228,3771,3772],{"class":252},"OP_WHEEL_FR",[228,3774,928],{"class":915},[228,3776,258],{"class":252},[228,3778,916],{"class":915},[228,3780,3727],{"class":252},[228,3782,928],{"class":915},[228,3784,3785],{"class":252},"Install Front Right Wheel",[228,3787,928],{"class":915},[228,3789,258],{"class":252},[228,3791,916],{"class":915},[228,3793,3741],{"class":252},[228,3795,928],{"class":915},[228,3797,3798],{"class":252},"INS002",[228,3800,928],{"class":915},[228,3802,258],{"class":252},[228,3804,916],{"class":915},[228,3806,3755],{"class":252},[228,3808,916],{"class":915},[228,3810,3695],{"class":252},[228,3812,916],{"class":915},[228,3814,3378],{"class":252},[228,3816,922],{"class":915},[228,3818,3819],{"class":252},"const priorities = [",[228,3821,928],{"class":915},[228,3823,3824],{"class":252},"Critical",[228,3826,928],{"class":915},[228,3828,103],{"class":252},[228,3830,928],{"class":915},[228,3832,3833],{"class":252},"High",[228,3835,928],{"class":915},[228,3837,103],{"class":252},[228,3839,928],{"class":915},[228,3841,3842],{"class":252},"Normal",[228,3844,928],{"class":915},[228,3846,103],{"class":252},[228,3848,928],{"class":915},[228,3850,3851],{"class":252},"Low",[228,3853,928],{"class":915},[228,3855,3378],{"class":252},[228,3857,916],{"class":915},[228,3859,3860],{"class":252},"const statuses = [",[228,3862,928],{"class":915},[228,3864,3865],{"class":252},"Ready",[228,3867,928],{"class":915},[228,3869,103],{"class":252},[228,3871,928],{"class":915},[228,3873,3874],{"class":252},"Waiting",[228,3876,928],{"class":915},[228,3878,103],{"class":252},[228,3880,928],{"class":915},[228,3882,3883],{"class":252},"Queued",[228,3885,928],{"class":915},[228,3887,3378],{"class":252},[228,3889,922],{"class":915},[228,3891,3892],{"class":252},"function random(arr) {",[228,3894,916],{"class":915},[228,3896,3897],{"class":252},"    return arr[Math.floor(Math.random() * arr.length)];",[228,3899,916],{"class":915},[228,3901,1575],{"class":252},[228,3903,922],{"class":915},[228,3905,3906],{"class":252},"\u002F\u002F Read existing work orders",[228,3908,916],{"class":915},[228,3910,3911],{"class":252},"const existingWorkOrders = global.get(",[228,3913,928],{"class":915},[228,3915,931],{"class":252},[228,3917,928],{"class":915},[228,3919,103],{"class":252},[228,3921,928],{"class":915},[228,3923,940],{"class":252},[228,3925,928],{"class":915},[228,3927,945],{"class":252},[228,3929,922],{"class":915},[228,3931,3932],{"class":252},"\u002F\u002F Start IDs after the existing ones",[228,3934,916],{"class":915},[228,3936,3937],{"class":252},"let nextId = 10245 + existingWorkOrders.length;",[228,3939,922],{"class":915},[228,3941,3942],{"class":252},"\u002F\u002F Generate 20 new work orders",[228,3944,916],{"class":915},[228,3946,3947],{"class":252},"for (let i = 0; i \u003C 20; i++) {",[228,3949,916],{"class":915},[228,3951,3952],{"class":252},"    const vehicle = random(vehicles);",[228,3954,916],{"class":915},[228,3956,3957],{"class":252},"    const operation = random(operations);",[228,3959,922],{"class":915},[228,3961,3962],{"class":252},"    existingWorkOrders.push({",[228,3964,916],{"class":915},[228,3966,3967],{"class":252},"        workOrderId: `WO-${nextId++}`,",[228,3969,916],{"class":915},[228,3971,3972],{"class":252},"        stationId: ",[228,3974,928],{"class":915},[228,3976,3977],{"class":252},"ST12",[228,3979,928],{"class":915},[228,3981,258],{"class":252},[228,3983,916],{"class":915},[228,3985,3986],{"class":252},"        status: random(statuses),",[228,3988,916],{"class":915},[228,3990,3991],{"class":252},"        priority: random(priorities),",[228,3993,916],{"class":915},[228,3995,3996],{"class":252},"        assignedTo: random(operators),",[228,3998,916],{"class":915},[228,4000,4001],{"class":252},"        vehicle: {",[228,4003,916],{"class":915},[228,4005,4006],{"class":252},"            vin: `MH01AB${1234567890 + existingWorkOrders.length}`,",[228,4008,916],{"class":915},[228,4010,4011],{"class":252},"            model: vehicle.model,",[228,4013,916],{"class":915},[228,4015,4016],{"class":252},"            variant: random(vehicle.variants),",[228,4018,916],{"class":915},[228,4020,4021],{"class":252},"            color: random(vehicle.colors)",[228,4023,916],{"class":915},[228,4025,4026],{"class":252},"        },",[228,4028,916],{"class":915},[228,4030,4031],{"class":252},"        operation: {",[228,4033,916],{"class":915},[228,4035,4036],{"class":252},"            operationId: operation.operationId,",[228,4038,916],{"class":915},[228,4040,4041],{"class":252},"            name: operation.name,",[228,4043,916],{"class":915},[228,4045,4046],{"class":252},"            estimatedCycleTime: operation.estimatedCycleTime,",[228,4048,916],{"class":915},[228,4050,4051],{"class":252},"            instructionSetId: operation.instructionSetId",[228,4053,916],{"class":915},[228,4055,4056],{"class":252},"        }",[228,4058,916],{"class":915},[228,4060,4061],{"class":252},"    });",[228,4063,916],{"class":915},[228,4065,1575],{"class":252},[228,4067,922],{"class":915},[228,4069,4070],{"class":252},"\u002F\u002F Save updated list",[228,4072,916],{"class":915},[228,4074,4075],{"class":252},"global.set(",[228,4077,928],{"class":915},[228,4079,931],{"class":252},[228,4081,928],{"class":915},[228,4083,4084],{"class":252},", existingWorkOrders, ",[228,4086,928],{"class":915},[228,4088,940],{"class":252},[228,4090,928],{"class":915},[228,4092,990],{"class":252},[228,4094,922],{"class":915},[228,4096,4097],{"class":252},"msg.payload = existingWorkOrders;",[228,4099,916],{"class":915},[228,4101,1000],{"class":252},[228,4103,238],{"class":234},[228,4105,258],{"class":234},[228,4107,238],{"class":234},[228,4109,1009],{"class":241},[228,4111,238],{"class":234},[228,4113,247],{"class":234},[228,4115,337],{"class":573},[228,4117,258],{"class":234},[228,4119,238],{"class":234},[228,4121,1022],{"class":241},[228,4123,238],{"class":234},[228,4125,247],{"class":234},[228,4127,1042],{"class":573},[228,4129,258],{"class":234},[228,4131,238],{"class":234},[228,4133,1035],{"class":241},[228,4135,238],{"class":234},[228,4137,247],{"class":234},[228,4139,1042],{"class":573},[228,4141,258],{"class":234},[228,4143,238],{"class":234},[228,4145,1049],{"class":241},[228,4147,238],{"class":234},[228,4149,247],{"class":234},[228,4151,770],{"class":234},[228,4153,258],{"class":234},[228,4155,238],{"class":234},[228,4157,1062],{"class":241},[228,4159,238],{"class":234},[228,4161,247],{"class":234},[228,4163,770],{"class":234},[228,4165,258],{"class":234},[228,4167,238],{"class":234},[228,4169,1075],{"class":241},[228,4171,238],{"class":234},[228,4173,1080],{"class":234},[228,4175,238],{"class":234},[228,4177,566],{"class":241},[228,4179,238],{"class":234},[228,4181,247],{"class":234},[228,4183,4184],{"class":573},"440",[228,4186,258],{"class":234},[228,4188,238],{"class":234},[228,4190,581],{"class":241},[228,4192,238],{"class":234},[228,4194,247],{"class":234},[228,4196,4197],{"class":573},"100",[228,4199,258],{"class":234},[228,4201,238],{"class":234},[228,4203,802],{"class":241},[228,4205,238],{"class":234},[228,4207,4208],{"class":234},":[[]]},{",[228,4210,238],{"class":234},[228,4212,242],{"class":241},[228,4214,238],{"class":234},[228,4216,247],{"class":234},[228,4218,238],{"class":234},[228,4220,556],{"class":252},[228,4222,238],{"class":234},[228,4224,258],{"class":234},[228,4226,238],{"class":234},[228,4228,263],{"class":241},[228,4230,238],{"class":234},[228,4232,247],{"class":234},[228,4234,238],{"class":234},[228,4236,118],{"class":252},[228,4238,238],{"class":234},[228,4240,258],{"class":234},[228,4242,238],{"class":234},[228,4244,281],{"class":241},[228,4246,238],{"class":234},[228,4248,247],{"class":234},[228,4250,238],{"class":234},[228,4252,290],{"class":252},[228,4254,238],{"class":234},[228,4256,258],{"class":234},[228,4258,238],{"class":234},[228,4260,673],{"class":241},[228,4262,238],{"class":234},[228,4264,247],{"class":234},[228,4266,238],{"class":234},[228,4268,253],{"class":252},[228,4270,238],{"class":234},[228,4272,258],{"class":234},[228,4274,238],{"class":234},[228,4276,4277],{"class":241},"ui",[228,4279,238],{"class":234},[228,4281,247],{"class":234},[228,4283,238],{"class":234},[228,4285,4286],{"class":252},"37b66bc5b4d6d3d3",[228,4288,238],{"class":234},[228,4290,258],{"class":234},[228,4292,238],{"class":234},[228,4294,690],{"class":241},[228,4296,238],{"class":234},[228,4298,247],{"class":234},[228,4300,770],{"class":234},[228,4302,258],{"class":234},[228,4304,238],{"class":234},[228,4306,566],{"class":241},[228,4308,238],{"class":234},[228,4310,247],{"class":234},[228,4312,783],{"class":573},[228,4314,258],{"class":234},[228,4316,238],{"class":234},[228,4318,581],{"class":241},[228,4320,238],{"class":234},[228,4322,247],{"class":234},[228,4324,4197],{"class":573},[228,4326,258],{"class":234},[228,4328,238],{"class":234},[228,4330,802],{"class":241},[228,4332,238],{"class":234},[228,4334,807],{"class":234},[228,4336,238],{"class":234},[228,4338,547],{"class":252},[228,4340,238],{"class":234},[228,4342,816],{"class":234},[228,4344,238],{"class":234},[228,4346,242],{"class":241},[228,4348,238],{"class":234},[228,4350,247],{"class":234},[228,4352,238],{"class":234},[228,4354,4286],{"class":252},[228,4356,238],{"class":234},[228,4358,258],{"class":234},[228,4360,238],{"class":234},[228,4362,263],{"class":241},[228,4364,238],{"class":234},[228,4366,247],{"class":234},[228,4368,238],{"class":234},[228,4370,4371],{"class":252},"ui-base",[228,4373,238],{"class":234},[228,4375,258],{"class":234},[228,4377,238],{"class":234},[228,4379,690],{"class":241},[228,4381,238],{"class":234},[228,4383,247],{"class":234},[228,4385,238],{"class":234},[228,4387,4388],{"class":252},"My Dashboard",[228,4390,238],{"class":234},[228,4392,258],{"class":234},[228,4394,238],{"class":234},[228,4396,4397],{"class":241},"path",[228,4399,238],{"class":234},[228,4401,247],{"class":234},[228,4403,238],{"class":234},[228,4405,4406],{"class":252},"\u002Fdashboard",[228,4408,238],{"class":234},[228,4410,258],{"class":234},[228,4412,238],{"class":234},[228,4414,4415],{"class":241},"appIcon",[228,4417,238],{"class":234},[228,4419,247],{"class":234},[228,4421,770],{"class":234},[228,4423,258],{"class":234},[228,4425,238],{"class":234},[228,4427,4428],{"class":241},"includeClientData",[228,4430,238],{"class":234},[228,4432,387],{"class":234},[228,4434,238],{"class":234},[228,4436,4437],{"class":241},"acceptsClientConfig",[228,4439,238],{"class":234},[228,4441,434],{"class":234},[228,4443,238],{"class":234},[228,4445,4446],{"class":252},"ui-notification",[228,4448,238],{"class":234},[228,4450,258],{"class":234},[228,4452,238],{"class":234},[228,4454,115],{"class":252},[228,4456,238],{"class":234},[228,4458,258],{"class":234},[228,4460,238],{"class":234},[228,4462,102],{"class":252},[228,4464,238],{"class":234},[228,4466,258],{"class":234},[228,4468,238],{"class":234},[228,4470,109],{"class":252},[228,4472,238],{"class":234},[228,4474,258],{"class":234},[228,4476,238],{"class":234},[228,4478,106],{"class":252},[228,4480,238],{"class":234},[228,4482,258],{"class":234},[228,4484,238],{"class":234},[228,4486,4487],{"class":252},"ui-text-input",[228,4489,238],{"class":234},[228,4491,258],{"class":234},[228,4493,238],{"class":234},[228,4495,4496],{"class":252},"ui-number-input",[228,4498,238],{"class":234},[228,4500,258],{"class":234},[228,4502,238],{"class":234},[228,4504,4505],{"class":252},"ui-file-input",[228,4507,238],{"class":234},[228,4509,258],{"class":234},[228,4511,238],{"class":234},[228,4513,112],{"class":252},[228,4515,238],{"class":234},[228,4517,258],{"class":234},[228,4519,238],{"class":234},[228,4521,4522],{"class":252},"ui-button-group",[228,4524,238],{"class":234},[228,4526,258],{"class":234},[228,4528,238],{"class":234},[228,4530,4531],{"class":252},"ui-dropdown",[228,4533,238],{"class":234},[228,4535,258],{"class":234},[228,4537,238],{"class":234},[228,4539,4540],{"class":252},"ui-radio-group",[228,4542,238],{"class":234},[228,4544,258],{"class":234},[228,4546,238],{"class":234},[228,4548,4549],{"class":252},"ui-slider",[228,4551,238],{"class":234},[228,4553,258],{"class":234},[228,4555,238],{"class":234},[228,4557,121],{"class":252},[228,4559,238],{"class":234},[228,4561,258],{"class":234},[228,4563,238],{"class":234},[228,4565,4566],{"class":252},"ui-switch",[228,4568,238],{"class":234},[228,4570,258],{"class":234},[228,4572,238],{"class":234},[228,4574,4575],{"class":252},"ui-chart",[228,4577,238],{"class":234},[228,4579,258],{"class":234},[228,4581,238],{"class":234},[228,4583,4584],{"class":252},"ui-audio",[228,4586,238],{"class":234},[228,4588,258],{"class":234},[228,4590,238],{"class":234},[228,4592,4593],{"class":252},"ui-markdown",[228,4595,238],{"class":234},[228,4597,258],{"class":234},[228,4599,238],{"class":234},[228,4601,4602],{"class":252},"ui-progress",[228,4604,238],{"class":234},[228,4606,258],{"class":234},[228,4608,238],{"class":234},[228,4610,4611],{"class":252},"ui-gauge",[228,4613,238],{"class":234},[228,4615,561],{"class":234},[228,4617,238],{"class":234},[228,4619,4620],{"class":241},"showPathInSidebar",[228,4622,238],{"class":234},[228,4624,749],{"class":234},[228,4626,238],{"class":234},[228,4628,4629],{"class":241},"headerContent",[228,4631,238],{"class":234},[228,4633,247],{"class":234},[228,4635,238],{"class":234},[228,4637,4638],{"class":252},"page",[228,4640,238],{"class":234},[228,4642,258],{"class":234},[228,4644,238],{"class":234},[228,4646,4647],{"class":241},"navigationStyle",[228,4649,238],{"class":234},[228,4651,247],{"class":234},[228,4653,238],{"class":234},[228,4655,4656],{"class":252},"default",[228,4658,238],{"class":234},[228,4660,258],{"class":234},[228,4662,238],{"class":234},[228,4664,4665],{"class":241},"titleBarStyle",[228,4667,238],{"class":234},[228,4669,247],{"class":234},[228,4671,238],{"class":234},[228,4673,4656],{"class":252},[228,4675,238],{"class":234},[228,4677,258],{"class":234},[228,4679,238],{"class":234},[228,4681,4682],{"class":241},"showReconnectNotification",[228,4684,238],{"class":234},[228,4686,387],{"class":234},[228,4688,238],{"class":234},[228,4690,4691],{"class":241},"notificationDisplayTime",[228,4693,238],{"class":234},[228,4695,247],{"class":234},[228,4697,337],{"class":573},[228,4699,258],{"class":234},[228,4701,238],{"class":234},[228,4703,4704],{"class":241},"showDisconnectNotification",[228,4706,238],{"class":234},[228,4708,387],{"class":234},[228,4710,238],{"class":234},[228,4712,4713],{"class":241},"allowInstall",[228,4715,238],{"class":234},[228,4717,4718],{"class":234},":false},{",[228,4720,238],{"class":234},[228,4722,242],{"class":241},[228,4724,238],{"class":234},[228,4726,247],{"class":234},[228,4728,238],{"class":234},[228,4730,4731],{"class":252},"4b583d9b76bf5cf2",[228,4733,238],{"class":234},[228,4735,258],{"class":234},[228,4737,238],{"class":234},[228,4739,263],{"class":241},[228,4741,238],{"class":234},[228,4743,247],{"class":234},[228,4745,238],{"class":234},[228,4747,4748],{"class":252},"global-config",[228,4750,238],{"class":234},[228,4752,258],{"class":234},[228,4754,238],{"class":234},[228,4756,4757],{"class":241},"env",[228,4759,238],{"class":234},[228,4761,1080],{"class":234},[228,4763,238],{"class":234},[228,4765,4766],{"class":241},"modules",[228,4768,238],{"class":234},[228,4770,304],{"class":234},[228,4772,238],{"class":234},[228,4774,98],{"class":309},[228,4776,238],{"class":234},[228,4778,247],{"class":234},[228,4780,238],{"class":234},[228,4782,4783],{"class":252},"1.30.2",[228,4785,238],{"class":234},[228,4787,4788],{"class":234},"}}]\n",[12,4790,4791,4792,4795],{},"The flow initializes a set of sample work orders and exposes REST APIs that the Digital Work Instructions application uses throughout this tutorial. The ",[96,4793,4794],{},"GET \u002Fworkorders"," endpoint returns the active work orders, while the other endpoints simulate completing a work order, reporting defects, and retrieving production statistics. This lets you build and test the application without a live ERP or MES. Later, you can replace these endpoints with calls to your production system while keeping the rest of the application unchanged.",[59,4797,4799],{"id":4798},"setting-up-the-dashboard-layout","Setting Up the Dashboard Layout",[12,4801,4802,4803,4808,4809,4812,4813,4816,4817,4820],{},"The application consists of three pages. Most widgets are placed inside named groups, while a few are scoped differently. See the ",[53,4804,4807],{"href":4805,"rel":4806},"https:\u002F\u002Fdashboard.flowfuse.com\u002Fgetting-started",[80],"Dashboard layout docs"," if you're new to how pages, groups, and bases relate. The app bar greeting is ",[45,4810,4811],{},"UI-scoped",", and the work instruction widget is ",[45,4814,4815],{},"page-scoped",", allowing it to fill the entire ",[45,4818,4819],{},"Instructions"," page without requiring a group. Before adding any widgets, create the dashboard structure by setting up the pages and groups.",[147,4822,4823,4868,4871,4903],{},[70,4824,4825,4826,4829,4830],{},"Create three ",[45,4827,4828],{},"ui-page"," nodes. The Dashboard automatically creates a base dashboard the first time you add a Dashboard node to the canvas.",[67,4831,4832,4846,4857],{},[70,4833,4834,4837,4838,4841,4842,4845],{},[45,4835,4836],{},"Home"," (path: ",[96,4839,4840],{},"\u002Fhome",") – The operator's landing page after login. Set the layout to ",[45,4843,4844],{},"Notebook"," to match the demo application.",[70,4847,4848,4837,4850,4853,4854,57],{},[45,4849,4819],{},[96,4851,4852],{},"\u002Finstructions",") – Displays the step-by-step work instructions. Set the layout to ",[45,4855,4856],{},"Grid",[70,4858,4859,4837,4862,4865,4866,57],{},[45,4860,4861],{},"Report Issue",[96,4863,4864],{},"\u002Freport-issue",") – Contains the defect reporting form. Set the layout to ",[45,4867,4856],{},[70,4869,4870],{},"Configure the theme for each page as desired.",[70,4872,4873,4874,4876,4877,4880,4881],{},"On the ",[45,4875,4836],{}," page, create four ",[45,4878,4879],{},"ui-group"," nodes:",[67,4882,4883,4888,4893,4898],{},[70,4884,4885],{},[45,4886,4887],{},"Current Station",[70,4889,4890],{},[45,4891,4892],{},"Stats",[70,4894,4895],{},[45,4896,4897],{},"Current Work Order",[70,4899,4900],{},[45,4901,4902],{},"Up Next",[70,4904,4873,4905,4907,4908,4910,4911,4913],{},[45,4906,4861],{}," page, create a single ",[45,4909,4879],{}," named ",[45,4912,4861],{},". This group will contain the issue reporting form and its action buttons.",[12,4915,4916,4917,4919,4920,4922],{},"The ",[45,4918,4819],{}," page does not require a ",[45,4921,4879],{}," because the work instruction widget is page-scoped and automatically occupies the full page.",[12,4924,4925],{},"With this layout in place, each widget added in the following sections can be assigned to the appropriate group, or directly to the page when required.",[59,4927,4929],{"id":4928},"enabling-flowfuse-user-authentication","Enabling FlowFuse User Authentication",[12,4931,4932],{},"Everything starts with a login. Without authentication, the dashboard cannot identify who is using it, so every visitor sees the same experience.",[40,4934,4935],{},[12,4936,4937,4939],{},[45,4938,47],{}," FlowFuse User Authentication grants dashboard access to members of the same team as the instance. Operators you want to sign in must belong to that team, otherwise they won't be able to reach the dashboard. If you need people outside the team to use the application, you'll need to add them to the team.",[147,4941,4942,4948,4955],{},[70,4943,4944,4945,57],{},"Open your FlowFuse instance ",[45,4946,4947],{},"Settings",[70,4949,4950,4951,4954],{},"Select the ",[45,4952,4953],{},"Security"," tab.",[70,4956,4957,4958,57],{},"Enable ",[45,4959,4960],{},"FlowFuse User Authentication",[12,4962,4963,4967],{},[21,4964],{"alt":4965,"src":4966},"Screenshot: the Security tab in instance settings with FlowFuse User Authentication enabled","\u002Fblog\u002F2024\u002F04\u002Fimages\u002Fdisplaying-logged-in-user-flowfuse-instance-setting.png",[26,4968,4969],{},"Enable FlowFuse User Authentication in the instance Security settings. You'll also create a Personal Access Token here for authenticating API requests later in the tutorial.",[12,4971,4972],{},"The first time someone opens the dashboard, they will be prompted to sign in using their FlowFuse username and password. Once authenticated, the dashboard can personalize the experience for each operator throughout the rest of this tutorial.",[12,4974,4975],{},"Because this tutorial also interacts with the FlowFuse API, you'll need to create a Personal Access Token:",[147,4977,4979,4988,4991],{"start":4978},4,[70,4980,4981,4982,4984,4985,57],{},"In the same ",[45,4983,4953],{}," tab, click ",[45,4986,4987],{},"Add Token",[70,4989,4990],{},"Enter a name for the token and choose an expiration date.",[70,4992,4993,4994,4997],{},"Click ",[45,4995,4996],{},"Create",", then copy the generated token and save it somewhere secure. You will need it later in the tutorial.",[40,4999,5000],{},[12,5001,5002,5005,5006,5009,5010,5012],{},[45,5003,5004],{},"Security note:"," Every ",[96,5007,5008],{},"http request"," node in this tutorial authenticates with this token, and for the sake of a self-contained tutorial we reference it as a plain Bearer token on each node. Don't leave it hardcoded that way in a real deployment. Store it as an environment variable on your FlowFuse instance and reference that variable from each ",[96,5011,5008],{}," node's auth config instead, so the raw token never sits in exported flow JSON or version control.",[59,5014,5016],{"id":5015},"installing-the-user-addon","Installing the User Addon",[12,5018,5019],{},"Authentication identifies the user, but your flows also need access to that information. The FlowFuse User Addon attaches the authenticated user's details to every Dashboard message.",[147,5021,5022,5028,5034,5040],{},[70,5023,5024,5025,57],{},"Open ",[45,5026,5027],{},"Manage Palette",[70,5029,5030,5031,4954],{},"Go to the ",[45,5032,5033],{},"Install",[70,5035,5036,5037,57],{},"Search for ",[96,5038,5039],{},"@flowfuse\u002Fnode-red-dashboard-2-user-addon",[70,5041,4993,5042,57],{},[45,5043,5033],{},[12,5045,5046,5047,5049],{},"After installation, every Dashboard message includes a ",[96,5048,197],{}," object:",[219,5051,5053],{"className":221,"code":5052,"language":223,"meta":224,"style":224},"{\n  \"userId\": \"\",\n  \"username\": \"\",\n  \"email\": \"\",\n  \"name\": \"\",\n  \"image\": \"\"\n}\n",[96,5054,5055,5060,5079,5095,5110,5125,5140],{"__ignoreMap":224},[228,5056,5057],{"class":230,"line":231},[228,5058,5059],{"class":234},"{\n",[228,5061,5063,5066,5069,5071,5073,5076],{"class":230,"line":5062},2,[228,5064,5065],{"class":234},"  \"",[228,5067,5068],{"class":241},"userId",[228,5070,238],{"class":234},[228,5072,247],{"class":234},[228,5074,5075],{"class":234}," \"\"",[228,5077,5078],{"class":234},",\n",[228,5080,5082,5084,5087,5089,5091,5093],{"class":230,"line":5081},3,[228,5083,5065],{"class":234},[228,5085,5086],{"class":241},"username",[228,5088,238],{"class":234},[228,5090,247],{"class":234},[228,5092,5075],{"class":234},[228,5094,5078],{"class":234},[228,5096,5097,5099,5102,5104,5106,5108],{"class":230,"line":4978},[228,5098,5065],{"class":234},[228,5100,5101],{"class":241},"email",[228,5103,238],{"class":234},[228,5105,247],{"class":234},[228,5107,5075],{"class":234},[228,5109,5078],{"class":234},[228,5111,5113,5115,5117,5119,5121,5123],{"class":230,"line":5112},5,[228,5114,5065],{"class":234},[228,5116,690],{"class":241},[228,5118,238],{"class":234},[228,5120,247],{"class":234},[228,5122,5075],{"class":234},[228,5124,5078],{"class":234},[228,5126,5128,5130,5133,5135,5137],{"class":230,"line":5127},6,[228,5129,5065],{"class":234},[228,5131,5132],{"class":241},"image",[228,5134,238],{"class":234},[228,5136,247],{"class":234},[228,5138,5139],{"class":234}," \"\"\n",[228,5141,5143],{"class":230,"line":5142},7,[228,5144,5145],{"class":234},"}\n",[12,5147,5148,5149,5151,5152,5155,5156,5159],{},"The same information is available in a ",[45,5150,102],{}," using ",[96,5153,5154],{},"setup.socketio.auth.user"," (or ",[96,5157,5158],{},"this.setup.socketio.auth.user"," in the script).",[147,5161,5162,5173],{},[70,5163,5164,5165,5168,5169,5172],{},"In the ",[45,5166,5167],{},"FF Auth"," sidebar tab, ensure ",[45,5170,5171],{},"Include Client Data"," is enabled.",[70,5174,5175,5176,5179,5180,103,5182,103,5184,103,5186,5188,5189,5191],{},"Also enable ",[45,5177,5178],{},"Accept Client Data"," for ",[45,5181,102],{},[45,5183,115],{},[45,5185,118],{},[45,5187,109],{},", and ",[45,5190,106],{}," so each browser session is handled independently and operators don't affect each other's dashboard.",[12,5193,5194,5198],{},[21,5195],{"alt":5196,"src":5197},"Screenshot: FF Auth settings showing Include Client Data and Accept Client Data enabled for Dashboard nodes","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fclient-data-tab-dashboard.png",[26,5199,4957,5200,5202,5203,5205],{},[45,5201,5171],{}," and ",[45,5204,5178],{}," to make Dashboard interactions user-specific.",[12,5207,5208,5209,5211,5212,5214,5215,5217],{},"This is the setting that matters most in this tutorial, and it's worth being explicit about why. With ",[45,5210,5178],{}," enabled, every message a widget sends carries ",[96,5213,197],{}," for the session that sent it. That's a per-session identity attached directly to the message, as opposed to a single shared variable that every session would otherwise read and overwrite. We'll use ",[96,5216,197],{}," as the source of truth for \"who is acting right now\" in every function node from here on, rather than a global variable.",[59,5219,5221],{"id":5220},"greeting-the-logged-in-operator","Greeting the Logged-In Operator",[12,5223,5224,5225,5230],{},"The first, simplest payoff: show the operator their name and avatar in the app bar, so it's obvious who's signed in at this station. This uses Vue's ",[53,5226,5229],{"href":5227,"rel":5228},"https:\u002F\u002Fdashboard.flowfuse.com\u002Fnodes\u002Fwidgets\u002Fui-template.html#teleports",[80],"Teleport"," to render into the header's action area from a single widget that lives on every page, so you don't have to add it per page.",[147,5232,5233,5239,5246],{},[70,5234,5235,5236,5238],{},"Add a ",[96,5237,102],{}," node and name it \"App Bar User Info\".",[70,5240,5241,5242,5245],{},"Set its type to ",[45,5243,5244],{},"Widget (UI-Scoped)"," and select your \"My Dashboard\" ui-base. UI-scoped widgets render on every page automatically, so one widget covers the whole app, no group needed.",[70,5247,5248],{},"Paste in the snippet below:",[219,5250,5254],{"className":5251,"code":5252,"language":5253,"meta":224,"style":224},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n    \u003C!-- Teleport into #app-bar-actions, the action bar's right-hand corner -->\n    \u003CTeleport v-if=\"loaded\" to=\"#app-bar-actions\">\n        \u003Cdiv class=\"user-info\">\n            \u003Cimg :src=\"setup.socketio.auth.user.image\" \u002F>\n            \u003Cspan>Hi, {{ setup.socketio.auth.user.name }}\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n    \u003C\u002FTeleport>\n\u003C\u002Ftemplate>\n\n\u003Cscript>\nexport default {\n    data() {\n        return { loaded: false };\n    },\n    mounted() {\n        \u002F\u002F Wait for mount so #app-bar-actions exists before teleporting into it.\n        this.loaded = true;\n    }\n}\n\u003C\u002Fscript>\n\n\u003Cstyle>\n.user-info { display: flex; align-items: center; gap: 8px; }\n.user-info img { width: 24px; height: 24px; }\n\u003C\u002Fstyle>\n","html",[96,5255,5256,5268,5274,5308,5330,5352,5371,5380,5390,5399,5406,5416,5429,5440,5461,5467,5477,5483,5500,5506,5511,5520,5525,5534,5577,5610],{"__ignoreMap":224},[228,5257,5258,5261,5265],{"class":230,"line":231},[228,5259,5260],{"class":234},"\u003C",[228,5262,5264],{"class":5263},"swJcz","template",[228,5266,5267],{"class":234},">\n",[228,5269,5270],{"class":230,"line":5062},[228,5271,5273],{"class":5272},"sHwdD","    \u003C!-- Teleport into #app-bar-actions, the action bar's right-hand corner -->\n",[228,5275,5276,5279,5281,5284,5287,5289,5292,5294,5297,5299,5301,5304,5306],{"class":230,"line":5081},[228,5277,5278],{"class":234},"    \u003C",[228,5280,5229],{"class":5263},[228,5282,5283],{"class":241}," v-if",[228,5285,5286],{"class":234},"=",[228,5288,238],{"class":234},[228,5290,5291],{"class":252},"loaded",[228,5293,238],{"class":234},[228,5295,5296],{"class":241}," to",[228,5298,5286],{"class":234},[228,5300,238],{"class":234},[228,5302,5303],{"class":252},"#app-bar-actions",[228,5305,238],{"class":234},[228,5307,5267],{"class":234},[228,5309,5310,5313,5316,5319,5321,5323,5326,5328],{"class":230,"line":4978},[228,5311,5312],{"class":234},"        \u003C",[228,5314,5315],{"class":5263},"div",[228,5317,5318],{"class":241}," class",[228,5320,5286],{"class":234},[228,5322,238],{"class":234},[228,5324,5325],{"class":252},"user-info",[228,5327,238],{"class":234},[228,5329,5267],{"class":234},[228,5331,5332,5335,5337,5340,5342,5344,5347,5349],{"class":230,"line":5112},[228,5333,5334],{"class":234},"            \u003C",[228,5336,21],{"class":5263},[228,5338,5339],{"class":241}," :src",[228,5341,5286],{"class":234},[228,5343,238],{"class":234},[228,5345,5346],{"class":252},"setup.socketio.auth.user.image",[228,5348,238],{"class":234},[228,5350,5351],{"class":234}," \u002F>\n",[228,5353,5354,5356,5358,5361,5364,5367,5369],{"class":230,"line":5127},[228,5355,5334],{"class":234},[228,5357,228],{"class":5263},[228,5359,5360],{"class":234},">",[228,5362,5363],{"class":915},"Hi, {{ setup.socketio.auth.user.name }}",[228,5365,5366],{"class":234},"\u003C\u002F",[228,5368,228],{"class":5263},[228,5370,5267],{"class":234},[228,5372,5373,5376,5378],{"class":230,"line":5142},[228,5374,5375],{"class":234},"        \u003C\u002F",[228,5377,5315],{"class":5263},[228,5379,5267],{"class":234},[228,5381,5383,5386,5388],{"class":230,"line":5382},8,[228,5384,5385],{"class":234},"    \u003C\u002F",[228,5387,5229],{"class":5263},[228,5389,5267],{"class":234},[228,5391,5393,5395,5397],{"class":230,"line":5392},9,[228,5394,5366],{"class":234},[228,5396,5264],{"class":5263},[228,5398,5267],{"class":234},[228,5400,5402],{"class":230,"line":5401},10,[228,5403,5405],{"emptyLinePlaceholder":5404},true,"\n",[228,5407,5409,5411,5414],{"class":230,"line":5408},11,[228,5410,5260],{"class":234},[228,5412,5413],{"class":5263},"script",[228,5415,5267],{"class":234},[228,5417,5419,5423,5426],{"class":230,"line":5418},12,[228,5420,5422],{"class":5421},"s7zQu","export",[228,5424,5425],{"class":5421}," default",[228,5427,5428],{"class":234}," {\n",[228,5430,5432,5435,5438],{"class":230,"line":5431},13,[228,5433,5434],{"class":5263},"    data",[228,5436,5437],{"class":234},"()",[228,5439,5428],{"class":234},[228,5441,5443,5446,5449,5452,5454,5458],{"class":230,"line":5442},14,[228,5444,5445],{"class":5421},"        return",[228,5447,5448],{"class":234}," {",[228,5450,5451],{"class":5263}," loaded",[228,5453,247],{"class":234},[228,5455,5457],{"class":5456},"sfNiH"," false",[228,5459,5460],{"class":234}," };\n",[228,5462,5464],{"class":230,"line":5463},15,[228,5465,5466],{"class":234},"    },\n",[228,5468,5470,5473,5475],{"class":230,"line":5469},16,[228,5471,5472],{"class":5263},"    mounted",[228,5474,5437],{"class":234},[228,5476,5428],{"class":234},[228,5478,5480],{"class":230,"line":5479},17,[228,5481,5482],{"class":5272},"        \u002F\u002F Wait for mount so #app-bar-actions exists before teleporting into it.\n",[228,5484,5486,5489,5491,5494,5497],{"class":230,"line":5485},18,[228,5487,5488],{"class":234},"        this.",[228,5490,5291],{"class":915},[228,5492,5493],{"class":234}," =",[228,5495,5496],{"class":5456}," true",[228,5498,5499],{"class":234},";\n",[228,5501,5503],{"class":230,"line":5502},19,[228,5504,5505],{"class":234},"    }\n",[228,5507,5509],{"class":230,"line":5508},20,[228,5510,5145],{"class":234},[228,5512,5514,5516,5518],{"class":230,"line":5513},21,[228,5515,5366],{"class":234},[228,5517,5413],{"class":5263},[228,5519,5267],{"class":234},[228,5521,5523],{"class":230,"line":5522},22,[228,5524,5405],{"emptyLinePlaceholder":5404},[228,5526,5528,5530,5532],{"class":230,"line":5527},23,[228,5529,5260],{"class":234},[228,5531,299],{"class":5263},[228,5533,5267],{"class":234},[228,5535,5537,5539,5541,5543,5547,5549,5552,5554,5557,5559,5562,5564,5567,5569,5572,5574],{"class":230,"line":5536},24,[228,5538,57],{"class":234},[228,5540,5325],{"class":309},[228,5542,5448],{"class":234},[228,5544,5546],{"class":5545},"sqsOY"," display",[228,5548,247],{"class":234},[228,5550,5551],{"class":915}," flex",[228,5553,3317],{"class":234},[228,5555,5556],{"class":5545}," align-items",[228,5558,247],{"class":234},[228,5560,5561],{"class":915}," center",[228,5563,3317],{"class":234},[228,5565,5566],{"class":5545}," gap",[228,5568,247],{"class":234},[228,5570,5571],{"class":573}," 8px",[228,5573,3317],{"class":234},[228,5575,5576],{"class":234}," }\n",[228,5578,5580,5582,5584,5587,5589,5592,5594,5597,5599,5602,5604,5606,5608],{"class":230,"line":5579},25,[228,5581,57],{"class":234},[228,5583,5325],{"class":309},[228,5585,5586],{"class":309}," img",[228,5588,5448],{"class":234},[228,5590,5591],{"class":5545}," width",[228,5593,247],{"class":234},[228,5595,5596],{"class":573}," 24px",[228,5598,3317],{"class":234},[228,5600,5601],{"class":5545}," height",[228,5603,247],{"class":234},[228,5605,5596],{"class":573},[228,5607,3317],{"class":234},[228,5609,5576],{"class":234},[228,5611,5613,5615,5617],{"class":230,"line":5612},26,[228,5614,5366],{"class":234},[228,5616,299],{"class":5263},[228,5618,5267],{"class":234},[12,5620,5621,5622,5624],{},"Deploy and open the dashboard. The signed-in operator's name and avatar appear in the top-right corner. You don't redeploy when a different operator logs in, the addon fetches each user's data at runtime, so everyone sees their own. This widget reads identity straight off the browser's own socket session (",[96,5623,5154],{},"), so it's already per-operator by construction, no shared state involved.",[12,5626,5627,75,5631],{},[21,5628],{"alt":5629,"src":5630},"Screenshot: the dashboard app bar showing the logged-in operator's avatar and greeting","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Flogged-in-user-app-bar.png",[26,5632,5633],{},"The signed-in operator greeted by name and avatar in the app bar, rendered from a single UI-scoped widget.",[59,5635,5637],{"id":5636},"seeding-the-operator-into-context-on-login","Seeding the Operator into Context on Login",[12,5639,5640],{},"Greeting the operator is the visible half. The other half is making their identity available to every function node, not just the widgets.",[12,5642,5643,5644,5647,5648,5651],{},"You might reach for a single shared global here, ",[96,5645,5646],{},"global.set('user', msg._client.user, 'persistent')"," on connect, then read it everywhere. ",[45,5649,5650],{},"Don't."," Global context is one store for the whole flow, not one per session, so if two operators are connected at once, whichever connects last overwrites the identity for everyone, and function nodes start attributing the wrong operator's actions to the wrong person.",[12,5653,5654,5655,5657],{},"Instead, read ",[96,5656,197],{}," off each message for \"who is acting right now,\" and use the username only as a durable storage key for saved state. A shared global is still handy as a bootstrap fallback for the very first tick of a page, before any client-tagged message has round-tripped.",[147,5659,5660,5665,5711],{},[70,5661,5235,5662,5664],{},[96,5663,118],{}," node named \"Client connected\" and select the \"My Dashboard\" ui-base. It fires when a browser session connects.",[70,5666,5235,5667,5670,5671,5674,5675],{},[96,5668,5669],{},"change"," node named \"Seed globals\" with these ",[96,5672,5673],{},"set"," rules, in order:\n",[67,5676,5677,5689,5698,5706],{},[70,5678,5679,5681,5682,5684,5685,5688],{},[96,5680,3290],{}," (global, persistent) → ",[96,5683,197],{},". ",[45,5686,5687],{},"Bootstrap fallback only",", not the source of truth elsewhere.",[70,5690,5691,5694,5695,57],{},[96,5692,5693],{},"StationContext.stationName"," (global) → your station's name, e.g. ",[96,5696,5697],{},"Wheel Assembly Station 12",[70,5699,5700,5703,5704,57],{},[96,5701,5702],{},"StationContext.stationId"," (global, persistent) → this station's ID, e.g. ",[96,5705,3977],{},[70,5707,5708,5710],{},[96,5709,4819],{}," (global, persistent) → the instruction set (steps, images, target times, checklists), cached so the Instructions page loads instantly.",[70,5712,5713],{},"Wire \"Client connected\" into \"Seed globals\".",[12,5715,5716],{},"From here on, every function node that needs the current operator uses this pattern, per-session identity first, bootstrap global only as a fallback:",[219,5718,5722],{"className":5719,"code":5720,"language":5721,"meta":224,"style":224},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const username = msg._client?.user?.username\n    || global.get('user', 'persistent')?.username;\n","javascript",[96,5723,5724,5752],{"__ignoreMap":224},[228,5725,5726,5729,5732,5734,5737,5739,5742,5745,5747,5749],{"class":230,"line":231},[228,5727,5728],{"class":241},"const",[228,5730,5731],{"class":915}," username ",[228,5733,5286],{"class":234},[228,5735,5736],{"class":915}," msg",[228,5738,57],{"class":234},[228,5740,5741],{"class":915},"_client",[228,5743,5744],{"class":234},"?.",[228,5746,3290],{"class":915},[228,5748,5744],{"class":234},[228,5750,5751],{"class":915},"username\n",[228,5753,5754,5757,5760,5762,5765,5768,5771,5773,5775,5777,5780,5782,5784,5787,5789,5791],{"class":230,"line":5062},[228,5755,5756],{"class":234},"    ||",[228,5758,5759],{"class":915}," global",[228,5761,57],{"class":234},[228,5763,735],{"class":5764},"s2Zo4",[228,5766,5767],{"class":915},"(",[228,5769,5770],{"class":234},"'",[228,5772,3290],{"class":252},[228,5774,5770],{"class":234},[228,5776,258],{"class":234},[228,5778,5779],{"class":234}," '",[228,5781,940],{"class":252},[228,5783,5770],{"class":234},[228,5785,5786],{"class":915},")",[228,5788,5744],{"class":234},[228,5790,5086],{"class":915},[228,5792,5499],{"class":234},[59,5794,5796],{"id":5795},"showing-the-station-and-stats-on-the-home-page","Showing the Station and Stats on the Home Page",[12,5798,5799],{},"The Home page shows the current station and a quick summary of work order statistics. Both update whenever the page opens.",[5801,5802,5804],"h3",{"id":5803},"display-the-station-name","Display the Station Name",[147,5806,5807,5828],{},[70,5808,5809,5810,5813,5814,5816,5817,5820,5821,5824,5825,57],{},"From the ",[45,5811,5812],{},"Client connected"," event, add a ",[45,5815,5669],{}," node named ",[45,5818,5819],{},"Read station name"," and set ",[96,5822,5823],{},"msg.payload"," to ",[96,5826,5827],{},"global.StationContext.stationName",[70,5829,5830,5831,5816,5833,5835,5836,5838,5839,57],{},"Connect it to a ",[45,5832,121],{},[45,5834,4887],{}," in the ",[45,5837,4887],{}," group. Set the value to ",[96,5840,5823],{},[5801,5842,5844],{"id":5843},"display-the-stats","Display the Stats",[147,5846,5847,5858],{},[70,5848,5235,5849,5816,5851,5854,5855,5857],{},[45,5850,115],{},[45,5852,5853],{},"Page changed",", set its event to ",[45,5856,5669],{},", and select your dashboard.",[70,5859,5235,5860,5816,5862,5865,5866],{},[45,5861,845],{},[45,5863,5864],{},"Build \u002Fstats request URL"," and paste in the following code. ",[45,5867,5868,5869,5872],{},"Replace ",[96,5870,5871],{},"https:\u002F\u002Fyour-instance.flowfuse.cloud"," with your own FlowFuse instance URL.",[219,5874,5876],{"className":5719,"code":5875,"language":5721,"meta":224,"style":224},"const StationContext = global.get('StationContext', 'persistent');\nconst username = msg._client?.user?.username\n    || global.get('user', 'persistent')?.username;\n\nconst params = new URLSearchParams();\nparams.set('stationId', StationContext.stationId);\nif (username) params.set('username', username);\n\nmsg.url = `https:\u002F\u002Fyour-instance.flowfuse.cloud\u002Fworkorders\u002Fstats?${params}`;\nmsg.method = \"GET\";\nreturn msg;\n",[96,5877,5878,5914,5936,5970,5974,5993,6023,6050,6054,6082,6103],{"__ignoreMap":224},[228,5879,5880,5882,5885,5887,5889,5891,5893,5895,5897,5900,5902,5904,5906,5908,5910,5912],{"class":230,"line":231},[228,5881,5728],{"class":241},[228,5883,5884],{"class":915}," StationContext ",[228,5886,5286],{"class":234},[228,5888,5759],{"class":915},[228,5890,57],{"class":234},[228,5892,735],{"class":5764},[228,5894,5767],{"class":915},[228,5896,5770],{"class":234},[228,5898,5899],{"class":252},"StationContext",[228,5901,5770],{"class":234},[228,5903,258],{"class":234},[228,5905,5779],{"class":234},[228,5907,940],{"class":252},[228,5909,5770],{"class":234},[228,5911,5786],{"class":915},[228,5913,5499],{"class":234},[228,5915,5916,5918,5920,5922,5924,5926,5928,5930,5932,5934],{"class":230,"line":5062},[228,5917,5728],{"class":241},[228,5919,5731],{"class":915},[228,5921,5286],{"class":234},[228,5923,5736],{"class":915},[228,5925,57],{"class":234},[228,5927,5741],{"class":915},[228,5929,5744],{"class":234},[228,5931,3290],{"class":915},[228,5933,5744],{"class":234},[228,5935,5751],{"class":915},[228,5937,5938,5940,5942,5944,5946,5948,5950,5952,5954,5956,5958,5960,5962,5964,5966,5968],{"class":230,"line":5081},[228,5939,5756],{"class":234},[228,5941,5759],{"class":915},[228,5943,57],{"class":234},[228,5945,735],{"class":5764},[228,5947,5767],{"class":915},[228,5949,5770],{"class":234},[228,5951,3290],{"class":252},[228,5953,5770],{"class":234},[228,5955,258],{"class":234},[228,5957,5779],{"class":234},[228,5959,940],{"class":252},[228,5961,5770],{"class":234},[228,5963,5786],{"class":915},[228,5965,5744],{"class":234},[228,5967,5086],{"class":915},[228,5969,5499],{"class":234},[228,5971,5972],{"class":230,"line":4978},[228,5973,5405],{"emptyLinePlaceholder":5404},[228,5975,5976,5978,5981,5983,5986,5989,5991],{"class":230,"line":5112},[228,5977,5728],{"class":241},[228,5979,5980],{"class":915}," params ",[228,5982,5286],{"class":234},[228,5984,5985],{"class":234}," new",[228,5987,5988],{"class":5764}," URLSearchParams",[228,5990,5437],{"class":915},[228,5992,5499],{"class":234},[228,5994,5995,5998,6000,6002,6004,6006,6009,6011,6013,6016,6018,6021],{"class":230,"line":5127},[228,5996,5997],{"class":915},"params",[228,5999,57],{"class":234},[228,6001,5673],{"class":5764},[228,6003,5767],{"class":915},[228,6005,5770],{"class":234},[228,6007,6008],{"class":252},"stationId",[228,6010,5770],{"class":234},[228,6012,258],{"class":234},[228,6014,6015],{"class":915}," StationContext",[228,6017,57],{"class":234},[228,6019,6020],{"class":915},"stationId)",[228,6022,5499],{"class":234},[228,6024,6025,6028,6031,6033,6035,6037,6039,6041,6043,6045,6048],{"class":230,"line":5142},[228,6026,6027],{"class":5421},"if",[228,6029,6030],{"class":915}," (username) params",[228,6032,57],{"class":234},[228,6034,5673],{"class":5764},[228,6036,5767],{"class":915},[228,6038,5770],{"class":234},[228,6040,5086],{"class":252},[228,6042,5770],{"class":234},[228,6044,258],{"class":234},[228,6046,6047],{"class":915}," username)",[228,6049,5499],{"class":234},[228,6051,6052],{"class":230,"line":5382},[228,6053,5405],{"emptyLinePlaceholder":5404},[228,6055,6056,6059,6061,6064,6066,6069,6072,6075,6077,6080],{"class":230,"line":5392},[228,6057,6058],{"class":915},"msg",[228,6060,57],{"class":234},[228,6062,6063],{"class":915},"url ",[228,6065,5286],{"class":234},[228,6067,6068],{"class":234}," `",[228,6070,6071],{"class":252},"https:\u002F\u002Fyour-instance.flowfuse.cloud\u002Fworkorders\u002Fstats?",[228,6073,6074],{"class":234},"${",[228,6076,5997],{"class":915},[228,6078,6079],{"class":234},"}`",[228,6081,5499],{"class":234},[228,6083,6084,6086,6088,6091,6093,6096,6099,6101],{"class":230,"line":5401},[228,6085,6058],{"class":915},[228,6087,57],{"class":234},[228,6089,6090],{"class":915},"method ",[228,6092,5286],{"class":234},[228,6094,6095],{"class":234}," \"",[228,6097,6098],{"class":252},"GET",[228,6100,238],{"class":234},[228,6102,5499],{"class":234},[228,6104,6105,6108,6110],{"class":230,"line":5408},[228,6106,6107],{"class":5421},"return",[228,6109,5736],{"class":915},[228,6111,5499],{"class":234},[147,6113,6114,6131,6134,6144],{"start":5081},[70,6115,6116,6117,6119,6120,5202,6123,6126,6127,6130],{},"Add an ",[45,6118,5008],{}," node that uses ",[96,6121,6122],{},"msg.method",[96,6124,6125],{},"msg.url",", returns a parsed JSON object, and uses ",[45,6128,6129],{},"Bearer"," authentication.",[70,6132,6133],{},"Configure the bearer token using the access token you created earlier. For production, store it as an environment variable instead of hardcoding it in the flow.",[70,6135,5235,6136,4910,6138,5835,6141,6143],{},[45,6137,102],{},[45,6139,6140],{},"Stats Cards",[45,6142,4892],{}," group and paste in the template below.",[70,6145,6146,6147,57],{},"Wire the nodes: ",[45,6148,6149],{},"Page changed → Build \u002Fstats request URL → HTTP Request → Stats Cards",[12,6151,6152,6153,6156,6157,6159,6160,6162],{},"The request includes the logged-in username, so the ",[45,6154,6155],{},"Assigned to me"," count is personalized for each operator, and because ",[96,6158,115],{}," is client-data-aware, ",[96,6161,197],{}," reflects whichever operator's browser triggered the page change.",[12,6164,6165,6169],{},[21,6166],{"alt":6167,"src":6168},"Placeholder: Stats Cards widget rendered on the Home page","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fstats-and-station.png",[26,6170,6171],{},"The Home page displays station statistics, including total, assigned to me, completed, and defected work orders.",[59,6173,6175],{"id":6174},"loading-the-operators-work-orders","Loading the Operator's Work Orders",[12,6177,6178],{},"Now for the main part of the Home page: fetching and displaying the operator's work orders. Because the request includes the logged-in username, each operator only sees the work orders assigned to them at the current station.",[147,6180,6181,6191],{},[70,6182,5235,6183,5816,6185,6187,6188,6190],{},[45,6184,115],{},[45,6186,5853],{},", select your dashboard, and set the event to ",[45,6189,5669],{},". It fires whenever the operator navigates to the Home page, triggering the work order request.",[70,6192,5235,6193,5816,6195,6198,6199,5872],{},[45,6194,845],{},[45,6196,6197],{},"Build \u002Fworkorders request URL",", paste in the code below, and replace ",[96,6200,5871],{},[219,6202,6205],{"className":5719,"code":6203,"language":5721,"meta":6204,"style":224},"const StationContext = global.get('StationContext', 'persistent');\nconst username = msg._client?.user?.username\n    || global.get('user', 'persistent')?.username;\n\nconst stationId = StationContext?.stationId;\n\nconst params = new URLSearchParams();\nparams.set('stationId', stationId);\nif (username) params.set('username', username);\n\nmsg.url = `https:\u002F\u002Fyour-instance.flowfuse.cloud\u002Fworkorders?${params.toString()}`;\nmsg.method = 'GET';\nreturn msg;\n","id=\"8m19sv\"",[96,6206,6207,6241,6263,6297,6301,6318,6322,6338,6361,6385,6389,6419,6437],{"__ignoreMap":224},[228,6208,6209,6211,6213,6215,6217,6219,6221,6223,6225,6227,6229,6231,6233,6235,6237,6239],{"class":230,"line":231},[228,6210,5728],{"class":241},[228,6212,5884],{"class":915},[228,6214,5286],{"class":234},[228,6216,5759],{"class":915},[228,6218,57],{"class":234},[228,6220,735],{"class":5764},[228,6222,5767],{"class":915},[228,6224,5770],{"class":234},[228,6226,5899],{"class":252},[228,6228,5770],{"class":234},[228,6230,258],{"class":234},[228,6232,5779],{"class":234},[228,6234,940],{"class":252},[228,6236,5770],{"class":234},[228,6238,5786],{"class":915},[228,6240,5499],{"class":234},[228,6242,6243,6245,6247,6249,6251,6253,6255,6257,6259,6261],{"class":230,"line":5062},[228,6244,5728],{"class":241},[228,6246,5731],{"class":915},[228,6248,5286],{"class":234},[228,6250,5736],{"class":915},[228,6252,57],{"class":234},[228,6254,5741],{"class":915},[228,6256,5744],{"class":234},[228,6258,3290],{"class":915},[228,6260,5744],{"class":234},[228,6262,5751],{"class":915},[228,6264,6265,6267,6269,6271,6273,6275,6277,6279,6281,6283,6285,6287,6289,6291,6293,6295],{"class":230,"line":5081},[228,6266,5756],{"class":234},[228,6268,5759],{"class":915},[228,6270,57],{"class":234},[228,6272,735],{"class":5764},[228,6274,5767],{"class":915},[228,6276,5770],{"class":234},[228,6278,3290],{"class":252},[228,6280,5770],{"class":234},[228,6282,258],{"class":234},[228,6284,5779],{"class":234},[228,6286,940],{"class":252},[228,6288,5770],{"class":234},[228,6290,5786],{"class":915},[228,6292,5744],{"class":234},[228,6294,5086],{"class":915},[228,6296,5499],{"class":234},[228,6298,6299],{"class":230,"line":4978},[228,6300,5405],{"emptyLinePlaceholder":5404},[228,6302,6303,6305,6308,6310,6312,6314,6316],{"class":230,"line":5112},[228,6304,5728],{"class":241},[228,6306,6307],{"class":915}," stationId ",[228,6309,5286],{"class":234},[228,6311,6015],{"class":915},[228,6313,5744],{"class":234},[228,6315,6008],{"class":915},[228,6317,5499],{"class":234},[228,6319,6320],{"class":230,"line":5127},[228,6321,5405],{"emptyLinePlaceholder":5404},[228,6323,6324,6326,6328,6330,6332,6334,6336],{"class":230,"line":5142},[228,6325,5728],{"class":241},[228,6327,5980],{"class":915},[228,6329,5286],{"class":234},[228,6331,5985],{"class":234},[228,6333,5988],{"class":5764},[228,6335,5437],{"class":915},[228,6337,5499],{"class":234},[228,6339,6340,6342,6344,6346,6348,6350,6352,6354,6356,6359],{"class":230,"line":5382},[228,6341,5997],{"class":915},[228,6343,57],{"class":234},[228,6345,5673],{"class":5764},[228,6347,5767],{"class":915},[228,6349,5770],{"class":234},[228,6351,6008],{"class":252},[228,6353,5770],{"class":234},[228,6355,258],{"class":234},[228,6357,6358],{"class":915}," stationId)",[228,6360,5499],{"class":234},[228,6362,6363,6365,6367,6369,6371,6373,6375,6377,6379,6381,6383],{"class":230,"line":5392},[228,6364,6027],{"class":5421},[228,6366,6030],{"class":915},[228,6368,57],{"class":234},[228,6370,5673],{"class":5764},[228,6372,5767],{"class":915},[228,6374,5770],{"class":234},[228,6376,5086],{"class":252},[228,6378,5770],{"class":234},[228,6380,258],{"class":234},[228,6382,6047],{"class":915},[228,6384,5499],{"class":234},[228,6386,6387],{"class":230,"line":5401},[228,6388,5405],{"emptyLinePlaceholder":5404},[228,6390,6391,6393,6395,6397,6399,6401,6404,6406,6408,6410,6413,6415,6417],{"class":230,"line":5408},[228,6392,6058],{"class":915},[228,6394,57],{"class":234},[228,6396,6063],{"class":915},[228,6398,5286],{"class":234},[228,6400,6068],{"class":234},[228,6402,6403],{"class":252},"https:\u002F\u002Fyour-instance.flowfuse.cloud\u002Fworkorders?",[228,6405,6074],{"class":234},[228,6407,5997],{"class":915},[228,6409,57],{"class":234},[228,6411,6412],{"class":5764},"toString",[228,6414,5437],{"class":915},[228,6416,6079],{"class":234},[228,6418,5499],{"class":234},[228,6420,6421,6423,6425,6427,6429,6431,6433,6435],{"class":230,"line":5418},[228,6422,6058],{"class":915},[228,6424,57],{"class":234},[228,6426,6090],{"class":915},[228,6428,5286],{"class":234},[228,6430,5779],{"class":234},[228,6432,6098],{"class":252},[228,6434,5770],{"class":234},[228,6436,5499],{"class":234},[228,6438,6439,6441,6443],{"class":230,"line":5431},[228,6440,6107],{"class":5421},[228,6442,5736],{"class":915},[228,6444,5499],{"class":234},[147,6446,6447,6479],{"start":5081},[70,6448,6116,6449,6451,6452,5824,6455,6460,6461,6464,6465,6467,6468,6471,6472,6475,6476,6478],{},[45,6450,5008],{}," node, set the ",[45,6453,6454],{},"Method",[45,6456,6457,6458],{},"Use ",[96,6459,6122],{},", leave the ",[45,6462,6463],{},"URL"," field blank so it uses ",[96,6466,6125],{},", set the ",[45,6469,6470],{},"Return"," type to a ",[45,6473,6474],{},"parsed JSON object",", and configure ",[45,6477,6129],{}," authentication. Use the access token you created earlier as the bearer token. For production deployments, store the token as an environment variable and reference it here instead of hardcoding it in the flow.",[70,6480,6481,6482,6484,6485,5816,6488,6491,6492,6495],{},"Connect the ",[45,6483,5008],{}," node to a ",[45,6486,6487],{},"link out",[45,6489,6490],{},"Work Orders Out",". The widgets that display the work orders will connect to this node using their own ",[45,6493,6494],{},"link in"," nodes, allowing the same API response to be reused without stretching wires across the canvas.",[12,6497,6498,6499,6501,6502,6505],{},"The username in the request is what makes the dashboard personal. Two operators can open the same page at the same station, yet each receives only the work orders assigned to them, because each one's ",[96,6500,115],{}," event carries their own ",[96,6503,6504],{},"_client.user",", not a shared one.",[59,6507,6509],{"id":6508},"splitting-the-current-order-from-the-queue","Splitting the Current Order From the Queue",[12,6511,6512],{},"The Home page shows one work order front and centre and the rest as a queue. A function splits the list, sorting by priority so the most urgent job is the one the operator sees first. This function also records which work order the operator is about to start, that's the record the Instructions page, the Complete Operation flow, and the Report Issue flow will all read back later, so it has to be attributed to the right operator from the start.",[147,6514,6515,6520],{},[70,6516,5235,6517,6519],{},[96,6518,6494],{}," node named \"link in 6\" and point it at the \"work orders out\" link.",[70,6521,5235,6522,6524,6525,247],{},[96,6523,845],{}," node named \"split current vs queue (by priority)\" with ",[45,6526,6527],{},"2 outputs",[219,6529,6531],{"className":5719,"code":6530,"language":5721,"meta":224,"style":224},"const orders = Array.isArray(msg.payload) ? msg.payload : [];\n\n\u002F\u002F Sort by priority (Critical\u002FUrgent -> High -> Medium -> Normal -> Low)\nconst priorityOrder = { critical: 0, urgent: 0, high: 1, medium: 2, normal: 3, low: 4 };\nconst sorted = [...orders].sort(\n    (a, b) => (priorityOrder[(a.priority || '').toLowerCase()] ?? 5)\n            - (priorityOrder[(b.priority || '').toLowerCase()] ?? 5)\n);\n\nconst currentWorkOrder = sorted[0] || null;\n\n\u002F\u002F Record which work order the current operator is about to see\u002Fstart.\n\u002F\u002F Identity comes from the triggering message's client data, not a shared global,\n\u002F\u002F so this is always attributed to the operator whose browser fetched this list.\nconst username = msg._client?.user?.username\n    || global.get('user', 'persistent')?.username;\n\nif (username && currentWorkOrder) {\n    const userState = global.get(username, 'persistent') || {};\n    userState.workOrderId = currentWorkOrder.workOrderId;\n    global.set(username, userState, 'persistent');\n}\n\nreturn [\n    { payload: currentWorkOrder },  \u002F\u002F output 1: current order (for card)\n    { payload: sorted.slice(1) }    \u002F\u002F output 2: remaining orders (queue)\n];\n",[96,6532,6533,6575,6579,6584,6654,6680,6731,6761,6767,6771,6793,6797,6802,6807,6812,6834,6868,6872,6887,6923,6944,6973,6977,6981,6988,7004,7031],{"__ignoreMap":224},[228,6534,6535,6537,6540,6542,6545,6547,6550,6553,6555,6558,6561,6563,6565,6568,6570,6573],{"class":230,"line":231},[228,6536,5728],{"class":241},[228,6538,6539],{"class":915}," orders ",[228,6541,5286],{"class":234},[228,6543,6544],{"class":915}," Array",[228,6546,57],{"class":234},[228,6548,6549],{"class":5764},"isArray",[228,6551,6552],{"class":915},"(msg",[228,6554,57],{"class":234},[228,6556,6557],{"class":915},"payload) ",[228,6559,6560],{"class":234},"?",[228,6562,5736],{"class":915},[228,6564,57],{"class":234},[228,6566,6567],{"class":915},"payload ",[228,6569,247],{"class":234},[228,6571,6572],{"class":915}," []",[228,6574,5499],{"class":234},[228,6576,6577],{"class":230,"line":5062},[228,6578,5405],{"emptyLinePlaceholder":5404},[228,6580,6581],{"class":230,"line":5081},[228,6582,6583],{"class":5272},"\u002F\u002F Sort by priority (Critical\u002FUrgent -> High -> Medium -> Normal -> Low)\n",[228,6585,6586,6588,6591,6593,6595,6598,6600,6603,6605,6608,6610,6612,6614,6617,6619,6622,6624,6627,6629,6632,6634,6637,6639,6642,6644,6647,6649,6652],{"class":230,"line":4978},[228,6587,5728],{"class":241},[228,6589,6590],{"class":915}," priorityOrder ",[228,6592,5286],{"class":234},[228,6594,5448],{"class":234},[228,6596,6597],{"class":5263}," critical",[228,6599,247],{"class":234},[228,6601,6602],{"class":573}," 0",[228,6604,258],{"class":234},[228,6606,6607],{"class":5263}," urgent",[228,6609,247],{"class":234},[228,6611,6602],{"class":573},[228,6613,258],{"class":234},[228,6615,6616],{"class":5263}," high",[228,6618,247],{"class":234},[228,6620,6621],{"class":573}," 1",[228,6623,258],{"class":234},[228,6625,6626],{"class":5263}," medium",[228,6628,247],{"class":234},[228,6630,6631],{"class":573}," 2",[228,6633,258],{"class":234},[228,6635,6636],{"class":5263}," normal",[228,6638,247],{"class":234},[228,6640,6641],{"class":573}," 3",[228,6643,258],{"class":234},[228,6645,6646],{"class":5263}," low",[228,6648,247],{"class":234},[228,6650,6651],{"class":573}," 4",[228,6653,5460],{"class":234},[228,6655,6656,6658,6661,6663,6666,6669,6672,6674,6677],{"class":230,"line":5112},[228,6657,5728],{"class":241},[228,6659,6660],{"class":915}," sorted ",[228,6662,5286],{"class":234},[228,6664,6665],{"class":915}," [",[228,6667,6668],{"class":234},"...",[228,6670,6671],{"class":915},"orders]",[228,6673,57],{"class":234},[228,6675,6676],{"class":5764},"sort",[228,6678,6679],{"class":915},"(\n",[228,6681,6682,6685,6688,6690,6693,6695,6698,6701,6703,6706,6709,6712,6714,6716,6719,6722,6725,6728],{"class":230,"line":5127},[228,6683,6684],{"class":234},"    (",[228,6686,53],{"class":6687},"sHdIc",[228,6689,258],{"class":234},[228,6691,6692],{"class":6687}," b",[228,6694,5786],{"class":234},[228,6696,6697],{"class":241}," =>",[228,6699,6700],{"class":915}," (priorityOrder[(a",[228,6702,57],{"class":234},[228,6704,6705],{"class":915},"priority ",[228,6707,6708],{"class":234},"||",[228,6710,6711],{"class":234}," ''",[228,6713,5786],{"class":915},[228,6715,57],{"class":234},[228,6717,6718],{"class":5764},"toLowerCase",[228,6720,6721],{"class":915},"()] ",[228,6723,6724],{"class":234},"??",[228,6726,6727],{"class":573}," 5",[228,6729,6730],{"class":915},")\n",[228,6732,6733,6736,6739,6741,6743,6745,6747,6749,6751,6753,6755,6757,6759],{"class":230,"line":5142},[228,6734,6735],{"class":234},"            -",[228,6737,6738],{"class":915}," (priorityOrder[(b",[228,6740,57],{"class":234},[228,6742,6705],{"class":915},[228,6744,6708],{"class":234},[228,6746,6711],{"class":234},[228,6748,5786],{"class":915},[228,6750,57],{"class":234},[228,6752,6718],{"class":5764},[228,6754,6721],{"class":915},[228,6756,6724],{"class":234},[228,6758,6727],{"class":573},[228,6760,6730],{"class":915},[228,6762,6763,6765],{"class":230,"line":5382},[228,6764,5786],{"class":915},[228,6766,5499],{"class":234},[228,6768,6769],{"class":230,"line":5392},[228,6770,5405],{"emptyLinePlaceholder":5404},[228,6772,6773,6775,6778,6780,6783,6785,6788,6790],{"class":230,"line":5401},[228,6774,5728],{"class":241},[228,6776,6777],{"class":915}," currentWorkOrder ",[228,6779,5286],{"class":234},[228,6781,6782],{"class":915}," sorted[",[228,6784,1042],{"class":573},[228,6786,6787],{"class":915},"] ",[228,6789,6708],{"class":234},[228,6791,6792],{"class":234}," null;\n",[228,6794,6795],{"class":230,"line":5408},[228,6796,5405],{"emptyLinePlaceholder":5404},[228,6798,6799],{"class":230,"line":5418},[228,6800,6801],{"class":5272},"\u002F\u002F Record which work order the current operator is about to see\u002Fstart.\n",[228,6803,6804],{"class":230,"line":5431},[228,6805,6806],{"class":5272},"\u002F\u002F Identity comes from the triggering message's client data, not a shared global,\n",[228,6808,6809],{"class":230,"line":5442},[228,6810,6811],{"class":5272},"\u002F\u002F so this is always attributed to the operator whose browser fetched this list.\n",[228,6813,6814,6816,6818,6820,6822,6824,6826,6828,6830,6832],{"class":230,"line":5463},[228,6815,5728],{"class":241},[228,6817,5731],{"class":915},[228,6819,5286],{"class":234},[228,6821,5736],{"class":915},[228,6823,57],{"class":234},[228,6825,5741],{"class":915},[228,6827,5744],{"class":234},[228,6829,3290],{"class":915},[228,6831,5744],{"class":234},[228,6833,5751],{"class":915},[228,6835,6836,6838,6840,6842,6844,6846,6848,6850,6852,6854,6856,6858,6860,6862,6864,6866],{"class":230,"line":5469},[228,6837,5756],{"class":234},[228,6839,5759],{"class":915},[228,6841,57],{"class":234},[228,6843,735],{"class":5764},[228,6845,5767],{"class":915},[228,6847,5770],{"class":234},[228,6849,3290],{"class":252},[228,6851,5770],{"class":234},[228,6853,258],{"class":234},[228,6855,5779],{"class":234},[228,6857,940],{"class":252},[228,6859,5770],{"class":234},[228,6861,5786],{"class":915},[228,6863,5744],{"class":234},[228,6865,5086],{"class":915},[228,6867,5499],{"class":234},[228,6869,6870],{"class":230,"line":5479},[228,6871,5405],{"emptyLinePlaceholder":5404},[228,6873,6874,6876,6879,6882,6885],{"class":230,"line":5485},[228,6875,6027],{"class":5421},[228,6877,6878],{"class":915}," (username ",[228,6880,6881],{"class":234},"&&",[228,6883,6884],{"class":915}," currentWorkOrder) ",[228,6886,5059],{"class":234},[228,6888,6889,6892,6895,6897,6899,6901,6903,6905,6907,6909,6911,6913,6915,6918,6920],{"class":230,"line":5502},[228,6890,6891],{"class":241},"    const",[228,6893,6894],{"class":915}," userState",[228,6896,5493],{"class":234},[228,6898,5759],{"class":915},[228,6900,57],{"class":234},[228,6902,735],{"class":5764},[228,6904,5767],{"class":5263},[228,6906,5086],{"class":915},[228,6908,258],{"class":234},[228,6910,5779],{"class":234},[228,6912,940],{"class":252},[228,6914,5770],{"class":234},[228,6916,6917],{"class":5263},") ",[228,6919,6708],{"class":234},[228,6921,6922],{"class":234}," {};\n",[228,6924,6925,6928,6930,6933,6935,6938,6940,6942],{"class":230,"line":5508},[228,6926,6927],{"class":915},"    userState",[228,6929,57],{"class":234},[228,6931,6932],{"class":915},"workOrderId",[228,6934,5493],{"class":234},[228,6936,6937],{"class":915}," currentWorkOrder",[228,6939,57],{"class":234},[228,6941,6932],{"class":915},[228,6943,5499],{"class":234},[228,6945,6946,6949,6951,6953,6955,6957,6959,6961,6963,6965,6967,6969,6971],{"class":230,"line":5513},[228,6947,6948],{"class":915},"    global",[228,6950,57],{"class":234},[228,6952,5673],{"class":5764},[228,6954,5767],{"class":5263},[228,6956,5086],{"class":915},[228,6958,258],{"class":234},[228,6960,6894],{"class":915},[228,6962,258],{"class":234},[228,6964,5779],{"class":234},[228,6966,940],{"class":252},[228,6968,5770],{"class":234},[228,6970,5786],{"class":5263},[228,6972,5499],{"class":234},[228,6974,6975],{"class":230,"line":5522},[228,6976,5145],{"class":234},[228,6978,6979],{"class":230,"line":5527},[228,6980,5405],{"emptyLinePlaceholder":5404},[228,6982,6983,6985],{"class":230,"line":5536},[228,6984,6107],{"class":5421},[228,6986,6987],{"class":915}," [\n",[228,6989,6990,6992,6995,6997,6999,7001],{"class":230,"line":5579},[228,6991,3388],{"class":234},[228,6993,6994],{"class":5263}," payload",[228,6996,247],{"class":234},[228,6998,6777],{"class":915},[228,7000,424],{"class":234},[228,7002,7003],{"class":5272},"  \u002F\u002F output 1: current order (for card)\n",[228,7005,7006,7008,7010,7012,7015,7017,7020,7022,7024,7026,7028],{"class":230,"line":5612},[228,7007,3388],{"class":234},[228,7009,6994],{"class":5263},[228,7011,247],{"class":234},[228,7013,7014],{"class":915}," sorted",[228,7016,57],{"class":234},[228,7018,7019],{"class":5764},"slice",[228,7021,5767],{"class":915},[228,7023,337],{"class":573},[228,7025,6917],{"class":915},[228,7027,1575],{"class":234},[228,7029,7030],{"class":5272},"    \u002F\u002F output 2: remaining orders (queue)\n",[228,7032,7034,7036],{"class":230,"line":7033},27,[228,7035,3467],{"class":915},[228,7037,5499],{"class":234},[147,7039,7040],{"start":5081},[70,7041,7042],{},"Import the Current Work Order Card ui-template below and assign it to the Current Work Order group. The complete component is provided below, so there's no need to recreate it.",[40,7044,7045],{},[12,7046,7047,7050,7051,7055,7056,7058],{},[45,7048,7049],{},"Tip:"," Whenever you need a custom Dashboard widget, you don't have to write the Vue code yourself. Use ",[53,7052,7054],{"href":7053},"\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai\u002F#css-and-html-generation-for-flowfuse-dashboard","FlowFuse Expert"," and describe the widget in plain English and it will generate the ",[96,7057,102],{}," for you.",[215,7060,7061],{":height":217},[219,7062,7064],{"className":221,"code":7063,"language":223,"meta":224,"style":224},"[{\"id\":\"eb41d1ba8e4bfb01\",\"type\":\"ui-template\",\"z\":\"c50b1b501a74c081\",\"g\":\"3e9b1176168ca254\",\"group\":\"\",\"page\":\"\",\"ui\":\"\",\"name\":\"Current Work Order Card\",\"order\":1,\"width\":0,\"height\":0,\"head\":\"\",\"format\":\"\u003Ctemplate>\\n  \u003Cdiv class=\\\"wi-root\\\">\\n    \u003C!-- Top status bar -->\\n    \u003Cdiv class=\\\"wi-topbar\\\">\\n      \u003Cdiv class=\\\"wi-topbar-left\\\">\\n        \u003Cspan class=\\\"wi-wo-label\\\">WORK ORDER\u003C\u002Fspan>\\n        \u003Cspan class=\\\"wi-wo-id\\\">{{ msg?.payload?.workOrderId ?? '—' }}\u003C\u002Fspan>\\n      \u003C\u002Fdiv>\\n      \u003Cdiv class=\\\"wi-topbar-right\\\">\\n        \u003Cv-chip size=\\\"large\\\" variant=\\\"flat\\\" label :color=\\\"priorityColor\\\" class=\\\"wi-chip\\\">\\n          \u003Cv-icon start icon=\\\"mdi-flag\\\">\u003C\u002Fv-icon>\\n          {{ (msg?.payload?.priority ?? 'Normal').toUpperCase() }} PRIORITY\\n        \u003C\u002Fv-chip>\\n      \u003C\u002Fdiv>\\n    \u003C\u002Fdiv>\\n\\n    \u003Cv-row no-gutters class=\\\"wi-body\\\">\\n      \u003C!-- Left: Station + Operation -->\\n      \u003Cv-col cols=\\\"12\\\" md=\\\"5\\\" class=\\\"wi-col\\\">\\n        \u003Cv-card flat class=\\\"wi-card wi-card-station\\\">\\n          \u003Cdiv class=\\\"wi-card-head\\\">\\n            \u003Cv-icon icon=\\\"mdi-map-marker-radius\\\" size=\\\"22\\\">\u003C\u002Fv-icon>\\n            \u003Cspan>STATION\u003C\u002Fspan>\\n          \u003C\u002Fdiv>\\n          \u003Cdiv class=\\\"wi-station-id\\\">{{ msg?.payload?.stationId ?? '—' }}\u003C\u002Fdiv>\\n\\n          \u003Cv-divider class=\\\"wi-divider\\\">\u003C\u002Fv-divider>\\n\\n          \u003Cdiv class=\\\"wi-card-head\\\">\\n            \u003Cv-icon icon=\\\"mdi-clipboard-text-outline\\\" size=\\\"22\\\">\u003C\u002Fv-icon>\\n            \u003Cspan>OPERATION\u003C\u002Fspan>\\n          \u003C\u002Fdiv>\\n          \u003Cdiv class=\\\"wi-operation-name\\\">\\n            {{ msg?.payload?.operation?.name ?? 'Awaiting operation' }}\\n          \u003C\u002Fdiv>\\n\\n          \u003Cdiv class=\\\"wi-cycle\\\">\\n            \u003Cv-icon icon=\\\"mdi-timer-outline\\\" size=\\\"26\\\">\u003C\u002Fv-icon>\\n            \u003Cdiv class=\\\"wi-cycle-text\\\">\\n              \u003Cspan class=\\\"wi-cycle-label\\\">ESTIMATED CYCLE TIME\u003C\u002Fspan>\\n              \u003Cspan class=\\\"wi-cycle-value\\\">\\n                {{ msg?.payload?.operation?.estimatedCycleTime ?? '—' }}\\n              \u003C\u002Fspan>\\n            \u003C\u002Fdiv>\\n          \u003C\u002Fdiv>\\n        \u003C\u002Fv-card>\\n      \u003C\u002Fv-col>\\n\\n      \u003C!-- Right: Vehicle -->\\n      \u003Cv-col cols=\\\"12\\\" md=\\\"7\\\" class=\\\"wi-col\\\">\\n        \u003Cv-card flat class=\\\"wi-card wi-card-vehicle\\\">\\n          \u003Cdiv class=\\\"wi-card-head\\\">\\n            \u003Cv-icon icon=\\\"mdi-car-side\\\" size=\\\"22\\\">\u003C\u002Fv-icon>\\n            \u003Cspan>VEHICLE\u003C\u002Fspan>\\n          \u003C\u002Fdiv>\\n\\n          \u003Cdiv class=\\\"wi-vehicle-model\\\">\\n            {{ msg?.payload?.vehicle?.model ?? 'Unknown model' }}\\n          \u003C\u002Fdiv>\\n          \u003Cdiv class=\\\"wi-vehicle-variant\\\">\\n            {{ msg?.payload?.vehicle?.variant ?? '' }}\\n          \u003C\u002Fdiv>\\n\\n          \u003Cv-row no-gutters class=\\\"wi-spec-grid\\\">\\n            \u003Cv-col cols=\\\"12\\\" sm=\\\"7\\\">\\n              \u003Cdiv class=\\\"wi-spec\\\">\\n                \u003Cspan class=\\\"wi-spec-label\\\">VIN\u003C\u002Fspan>\\n                \u003Cspan class=\\\"wi-spec-value wi-vin\\\">\\n                  {{ msg?.payload?.vehicle?.vin ?? '—' }}\\n                \u003C\u002Fspan>\\n              \u003C\u002Fdiv>\\n            \u003C\u002Fv-col>\\n            \u003Cv-col cols=\\\"12\\\" sm=\\\"5\\\">\\n              \u003Cdiv class=\\\"wi-spec\\\">\\n                \u003Cspan class=\\\"wi-spec-label\\\">COLOR\u003C\u002Fspan>\\n                \u003Cspan class=\\\"wi-spec-value\\\">\\n                  \u003Cv-icon\\n                    icon=\\\"mdi-circle\\\"\\n                    size=\\\"18\\\"\\n                    class=\\\"wi-color-dot\\\"\\n                  >\u003C\u002Fv-icon>\\n                  {{ msg?.payload?.vehicle?.color ?? '—' }}\\n                \u003C\u002Fspan>\\n              \u003C\u002Fdiv>\\n            \u003C\u002Fv-col>\\n          \u003C\u002Fv-row>\\n        \u003C\u002Fv-card>\\n      \u003C\u002Fv-col>\\n    \u003C\u002Fv-row>\\n\\n    \u003C!-- Start button -->\\n    \u003Cv-btn block size=\\\"x-large\\\" color=\\\"green-darken-1\\\" class=\\\"wi-start-btn\\\" :disabled=\\\"!msg?.payload?.workOrderId\\\"\\n      @click=\\\"send({ payload: { action: 'start', workOrderId: msg?.payload?.workOrderId, stationId: msg?.payload?.stationId } })\\\">\\n      \u003Cv-icon start icon=\\\"mdi-play-circle\\\" size=\\\"34\\\">\u003C\u002Fv-icon>\\n      START WORK ORDER\\n    \u003C\u002Fv-btn>\\n  \u003C\u002Fdiv>\\n\u003C\u002Ftemplate>\\n\\n\u003Cscript>\\n  export default {\\n  computed: {\\n    priorityColor () {\\n      const p = (this.msg?.payload?.priority ?? '').toLowerCase()\\n      if (p === 'high' || p === 'urgent' || p === 'critical') return 'red-darken-1'\\n      if (p === 'medium') return 'amber-darken-2'\\n      return 'blue-grey-darken-1'\\n    }\\n  }\\n}\\n\u003C\u002Fscript>\\n\\n\u003Cstyle>\\n  .wi-root {\\n    font-family: 'Roboto', system-ui, sans-serif;\\n    color: #1f2933;\\n    padding: 4px;\\n  }\\n\\n  .wi-topbar {\\n    display: flex;\\n    align-items: center;\\n    justify-content: space-between;\\n    flex-wrap: wrap;\\n    gap: 12px;\\n    background: #ffffff;\\n    border: 1px solid #e2e8f0;\\n    border-left: 6px solid #1565c0;\\n    border-radius: 10px;\\n    padding: 14px 20px;\\n    margin-bottom: 14px;\\n  }\\n\\n  .wi-topbar-left {\\n    display: flex;\\n    flex-direction: column;\\n    line-height: 1.1;\\n  }\\n\\n  .wi-wo-label {\\n    font-size: 12px;\\n    letter-spacing: 2px;\\n    color: #64748b;\\n    font-weight: 600;\\n  }\\n\\n  .wi-wo-id {\\n    font-size: 30px;\\n    font-weight: 700;\\n    color: #0f172a;\\n    font-variant-numeric: tabular-nums;\\n  }\\n\\n  .wi-topbar-right {\\n    display: flex;\\n    gap: 10px;\\n    flex-wrap: wrap;\\n  }\\n\\n  .wi-chip {\\n    font-weight: 700 !important;\\n    letter-spacing: 0.5px;\\n  }\\n\\n  .wi-body {\\n    gap: 0;\\n  }\\n\\n  .wi-col {\\n    padding: 6px;\\n  }\\n\\n  .wi-card {\\n    background: #ffffff !important;\\n    border: 1px solid #e2e8f0 !important;\\n    border-radius: 10px !important;\\n    padding: 20px 22px;\\n    height: 100%;\\n  }\\n\\n  .wi-card-vehicle {\\n    border-left: 6px solid #00897b !important;\\n  }\\n\\n  .wi-card-station {\\n    border-left: 6px solid #5e35b1 !important;\\n  }\\n\\n  .wi-card-head {\\n    display: flex;\\n    align-items: center;\\n    gap: 8px;\\n    font-size: 13px;\\n    letter-spacing: 2px;\\n    font-weight: 700;\\n    color: #64748b;\\n    margin-bottom: 6px;\\n  }\\n\\n  .wi-station-id {\\n    font-size: 44px;\\n    font-weight: 700;\\n    color: #4527a0;\\n    line-height: 1;\\n    margin-bottom: 6px;\\n  }\\n\\n  .wi-divider {\\n    margin: 16px 0;\\n    border-color: #edf2f7 !important;\\n  }\\n\\n  .wi-operation-name {\\n    font-size: 24px;\\n    font-weight: 600;\\n    color: #0f172a;\\n    margin-bottom: 18px;\\n  }\\n\\n  .wi-cycle {\\n    display: flex;\\n    align-items: center;\\n    gap: 12px;\\n    background: #f1f5f9;\\n    border-radius: 8px;\\n    padding: 12px 16px;\\n  }\\n\\n  .wi-cycle-text {\\n    display: flex;\\n    flex-direction: column;\\n    line-height: 1.2;\\n  }\\n\\n  .wi-cycle-label {\\n    font-size: 11px;\\n    letter-spacing: 1.5px;\\n    font-weight: 600;\\n    color: #64748b;\\n  }\\n\\n  .wi-cycle-value {\\n    font-size: 22px;\\n    font-weight: 700;\\n    color: #0f172a;\\n    font-variant-numeric: tabular-nums;\\n  }\\n\\n  .wi-vehicle-model {\\n    font-size: 34px;\\n    font-weight: 700;\\n    color: #0f172a;\\n    line-height: 1.05;\\n  }\\n\\n  .wi-vehicle-variant {\\n    font-size: 18px;\\n    font-weight: 500;\\n    color: #00695c;\\n    margin-bottom: 20px;\\n  }\\n\\n  .wi-spec-grid {\\n    gap: 0;\\n  }\\n\\n  .wi-spec {\\n    display: flex;\\n    flex-direction: column;\\n    padding: 10px 0;\\n  }\\n\\n  .wi-spec-label {\\n    font-size: 11px;\\n    letter-spacing: 1.5px;\\n    font-weight: 600;\\n    color: #64748b;\\n    margin-bottom: 2px;\\n  }\\n\\n  .wi-spec-value {\\n    font-size: 20px;\\n    font-weight: 600;\\n    color: #0f172a;\\n    display: flex;\\n    align-items: center;\\n    gap: 6px;\\n  }\\n\\n  .wi-vin {\\n    font-family: 'Roboto Mono', monospace;\\n    font-size: 18px;\\n    letter-spacing: 1px;\\n  }\\n\\n  .wi-color-dot {\\n    color: #cbd5e1;\\n  }\\n\\n  .wi-start-btn {\\n    margin-top: 16px;\\n    height: 84px !important;\\n    font-size: 24px !important;\\n    font-weight: 700 !important;\\n    letter-spacing: 1px;\\n    border-radius: 12px !important;\\n  }\\n\u003C\u002Fstyle>\",\"storeOutMessages\":true,\"passthru\":false,\"resendOnRefresh\":true,\"templateScope\":\"local\",\"className\":\"\",\"x\":570,\"y\":620,\"wires\":[[\"455c7536a9adcfe6\"]]},{\"id\":\"77ecf88a48f8c4f0\",\"type\":\"global-config\",\"env\":[],\"modules\":{\"@flowfuse\u002Fnode-red-dashboard\":\"1.30.2\"}}]\n",[96,7065,7066],{"__ignoreMap":224},[228,7067,7068,7070,7072,7074,7076,7078,7080,7083,7085,7087,7089,7091,7093,7095,7097,7099,7101,7103,7105,7107,7109,7111,7113,7116,7118,7120,7122,7124,7126,7128,7130,7133,7135,7137,7139,7141,7143,7145,7147,7149,7151,7153,7155,7157,7159,7161,7163,7165,7167,7169,7171,7173,7175,7177,7179,7181,7183,7186,7188,7190,7192,7195,7197,7199,7201,7203,7205,7208,7210,7212,7214,7216,7218,7221,7223,7225,7227,7229,7231,7234,7236,7238,7240,7242,7244,7247,7249,7251,7253,7256,7258,7261,7263,7266,7268,7270,7272,7275,7277,7280,7282,7285,7287,7289,7291,7294,7296,7299,7301,7303,7305,7308,7310,7313,7315,7318,7320,7322,7324,7327,7329,7332,7334,7337,7339,7341,7343,7346,7348,7350,7352,7355,7357,7360,7362,7365,7367,7370,7372,7375,7377,7380,7382,7385,7387,7390,7392,7394,7396,7399,7401,7404,7406,7409,7411,7414,7416,7419,7421,7423,7425,7428,7430,7433,7435,7438,7440,7442,7444,7447,7449,7452,7454,7457,7459,7462,7464,7467,7469,7471,7473,7476,7478,7480,7482,7485,7487,7490,7492,7494,7496,7499,7501,7504,7506,7508,7510,7513,7515,7518,7520,7523,7525,7528,7530,7532,7534,7537,7539,7542,7544,7546,7548,7551,7553,7556,7558,7561,7563,7566,7568,7571,7573,7575,7577,7579,7581,7583,7585,7587,7589,7592,7594,7596,7598,7600,7602,7604,7606,7609,7611,7613,7615,7617,7619,7622,7624,7626,7628,7631,7633,7635,7637,7639,7641,7644,7646,7648,7650,7652,7654,7657,7659,7661,7663,7666,7668,7670,7672,7675,7677,7680,7682,7684,7686,7689,7691,7694,7696,7699,7701,7703,7705,7708,7710,7712,7714,7717,7719,7722,7724,7727,7729,7731,7733,7736,7738,7741,7743,7746,7748,7750,7752,7754,7756,7758,7760,7763,7765,7767,7769,7771,7773,7775,7777,7779,7781,7784,7786,7788,7790,7792,7794,7796,7798,7800,7802,7804,7806,7809,7811,7813,7815,7817,7819,7821,7823,7826,7828,7830,7832,7834,7836,7839,7841,7843,7845,7848,7850,7852,7854,7856,7858,7861,7863,7865,7867,7870,7872,7874,7876,7879,7881,7884,7886,7888,7890,7893,7895,7897,7899,7902,7904,7906,7908,7910,7912,7915,7917,7920,7922,7924,7926,7929,7931,7934,7936,7939,7941,7943,7945,7948,7950,7952,7954,7957,7959,7962,7964,7967,7969,7972,7974,7976,7978,7980,7982,7984,7986,7988,7990,7992,7994,7996,7998,8000,8002,8004,8006,8008,8010,8012,8014,8017,8019,8021,8023,8026,8028,8030,8032,8035,8037,8040,8042,8045,8047,8050,8052,8055,8057,8060,8062,8065,8067,8070,8072,8075,8077,8079,8081,8083,8085,8087,8089,8092,8094,8096,8098,8100,8102,8105,8107,8110,8112,8115,8117,8120,8122,8125,8127,8130,8132,8134,8136,8139,8141,8144,8146,8149,8151,8154,8156,8159,8161,8163,8165,8168,8170,8173,8175,8177,8179,8182,8184,8186,8188,8191,8193,8196,8198,8201,8203,8206,8208,8211,8213,8216,8218,8221,8223,8226,8228,8231,8233,8236,8238,8241,8243,8246,8248,8250,8252,8255,8257,8259,8261,8264,8266,8269,8271,8274,8276,8279,8281,8284,8286,8289,8291,8293,8295,8298,8300,8303,8305,8308,8310,8313,8315,8318,8320,8323,8325,8328,8330,8333,8335,8338,8340,8343,8345,8348,8350,8353,8355,8357,8359,8362,8364,8366,8368,8371,8373,8376,8378,8380,8382,8385,8387,8390,8392,8395,8397,8400,8402,8405,8407,8409,8411,8414,8416,8419,8421,8424,8426,8429,8431,8434,8436,8438,8440,8443,8445,8447,8449,8452,8454,8456,8458,8460,8462,8465,8467,8470,8472,8475,8477,8479,8481,8484,8486,8489,8491,8493,8495,8498,8500,8503,8505,8507,8509,8512,8514,8517,8519,8522,8524,8527,8529,8532,8534,8537,8539,8541,8543,8546,8548,8551,8553,8555,8557,8560,8562,8565,8567,8569,8571,8574,8576,8578,8580,8582,8584,8587,8589,8592,8594,8596,8598,8600,8602,8604,8606,8609,8611,8613,8615,8618,8620,8623,8625,8627,8629,8632,8634,8637,8639,8641,8643,8645,8647,8650,8652,8655,8657,8660,8662,8664,8666,8669,8671,8674,8676,8678,8680,8682,8684,8687,8689,8691,8693,8696,8698,8700,8702,8704,8706,8708,8710,8713,8715,8718,8720,8723,8725,8727,8729,8732,8734,8736,8738,8740,8742,8745,8747,8749,8751,8754,8756,8759,8761,8764,8766,8768,8770,8772,8774,8776,8778,8781,8783,8786,8788,8790,8792,8794,8796,8798,8800,8802,8804,8807,8809,8812,8814,8816,8818,8820,8822,8825,8827,8829,8831,8834,8836,8839,8841,8844,8846,8849,8851,8854,8856,8858,8860,8863,8865,8867,8869,8871,8873,8876,8878,8880,8882,8884,8886,8889,8891,8893,8895,8898,8900,8902,8904,8906,8908,8910,8912,8914,8916,8919,8921,8923,8925,8928,8930,8933,8935,8937,8939,8941,8943,8945,8947,8949,8951,8954,8956,8958,8960,8963,8965,8968,8970,8972,8974,8977,8979,8981,8983,8986,8988,8991,8993,8995,8997,9000,9002,9005,9007,9010,9012,9015,9017,9019,9021,9023,9025,9028,9030,9032,9034,9037,9039,9041,9043,9046,9048,9050,9052,9055,9057,9059,9061,9064,9066,9068,9070,9073,9075,9077,9079,9082,9084,9086,9088,9091,9093,9095,9097,9099,9101,9103,9105,9107,9110,9112,9114,9116,9118,9120,9122,9124,9126,9128,9130,9132,9134,9137,9139,9141,9143,9145,9147,9149,9151,9154,9156,9158,9160,9162,9164,9166,9168,9170,9172,9174,9176,9178,9180,9182,9184,9186,9188,9190,9192,9194,9196,9198,9200,9202,9204],{"class":230,"line":231},[228,7069,235],{"class":234},[228,7071,238],{"class":234},[228,7073,242],{"class":241},[228,7075,238],{"class":234},[228,7077,247],{"class":234},[228,7079,238],{"class":234},[228,7081,7082],{"class":252},"eb41d1ba8e4bfb01",[228,7084,238],{"class":234},[228,7086,258],{"class":234},[228,7088,238],{"class":234},[228,7090,263],{"class":241},[228,7092,238],{"class":234},[228,7094,247],{"class":234},[228,7096,238],{"class":234},[228,7098,102],{"class":252},[228,7100,238],{"class":234},[228,7102,258],{"class":234},[228,7104,238],{"class":234},[228,7106,281],{"class":241},[228,7108,238],{"class":234},[228,7110,247],{"class":234},[228,7112,238],{"class":234},[228,7114,7115],{"class":252},"c50b1b501a74c081",[228,7117,238],{"class":234},[228,7119,258],{"class":234},[228,7121,238],{"class":234},[228,7123,673],{"class":241},[228,7125,238],{"class":234},[228,7127,247],{"class":234},[228,7129,238],{"class":234},[228,7131,7132],{"class":252},"3e9b1176168ca254",[228,7134,238],{"class":234},[228,7136,258],{"class":234},[228,7138,238],{"class":234},[228,7140,272],{"class":241},[228,7142,238],{"class":234},[228,7144,247],{"class":234},[228,7146,770],{"class":234},[228,7148,258],{"class":234},[228,7150,238],{"class":234},[228,7152,4638],{"class":241},[228,7154,238],{"class":234},[228,7156,247],{"class":234},[228,7158,770],{"class":234},[228,7160,258],{"class":234},[228,7162,238],{"class":234},[228,7164,4277],{"class":241},[228,7166,238],{"class":234},[228,7168,247],{"class":234},[228,7170,770],{"class":234},[228,7172,258],{"class":234},[228,7174,238],{"class":234},[228,7176,690],{"class":241},[228,7178,238],{"class":234},[228,7180,247],{"class":234},[228,7182,238],{"class":234},[228,7184,7185],{"class":252},"Current Work Order Card",[228,7187,238],{"class":234},[228,7189,258],{"class":234},[228,7191,238],{"class":234},[228,7193,7194],{"class":241},"order",[228,7196,238],{"class":234},[228,7198,247],{"class":234},[228,7200,337],{"class":573},[228,7202,258],{"class":234},[228,7204,238],{"class":234},[228,7206,7207],{"class":241},"width",[228,7209,238],{"class":234},[228,7211,247],{"class":234},[228,7213,1042],{"class":573},[228,7215,258],{"class":234},[228,7217,238],{"class":234},[228,7219,7220],{"class":241},"height",[228,7222,238],{"class":234},[228,7224,247],{"class":234},[228,7226,1042],{"class":573},[228,7228,258],{"class":234},[228,7230,238],{"class":234},[228,7232,7233],{"class":241},"head",[228,7235,238],{"class":234},[228,7237,247],{"class":234},[228,7239,770],{"class":234},[228,7241,258],{"class":234},[228,7243,238],{"class":234},[228,7245,7246],{"class":241},"format",[228,7248,238],{"class":234},[228,7250,247],{"class":234},[228,7252,238],{"class":234},[228,7254,7255],{"class":252},"\u003Ctemplate>",[228,7257,916],{"class":915},[228,7259,7260],{"class":252},"  \u003Cdiv class=",[228,7262,928],{"class":915},[228,7264,7265],{"class":252},"wi-root",[228,7267,928],{"class":915},[228,7269,5360],{"class":252},[228,7271,916],{"class":915},[228,7273,7274],{"class":252},"    \u003C!-- Top status bar -->",[228,7276,916],{"class":915},[228,7278,7279],{"class":252},"    \u003Cdiv class=",[228,7281,928],{"class":915},[228,7283,7284],{"class":252},"wi-topbar",[228,7286,928],{"class":915},[228,7288,5360],{"class":252},[228,7290,916],{"class":915},[228,7292,7293],{"class":252},"      \u003Cdiv class=",[228,7295,928],{"class":915},[228,7297,7298],{"class":252},"wi-topbar-left",[228,7300,928],{"class":915},[228,7302,5360],{"class":252},[228,7304,916],{"class":915},[228,7306,7307],{"class":252},"        \u003Cspan class=",[228,7309,928],{"class":915},[228,7311,7312],{"class":252},"wi-wo-label",[228,7314,928],{"class":915},[228,7316,7317],{"class":252},">WORK ORDER\u003C\u002Fspan>",[228,7319,916],{"class":915},[228,7321,7307],{"class":252},[228,7323,928],{"class":915},[228,7325,7326],{"class":252},"wi-wo-id",[228,7328,928],{"class":915},[228,7330,7331],{"class":252},">{{ msg?.payload?.workOrderId ?? '—' }}\u003C\u002Fspan>",[228,7333,916],{"class":915},[228,7335,7336],{"class":252},"      \u003C\u002Fdiv>",[228,7338,916],{"class":915},[228,7340,7293],{"class":252},[228,7342,928],{"class":915},[228,7344,7345],{"class":252},"wi-topbar-right",[228,7347,928],{"class":915},[228,7349,5360],{"class":252},[228,7351,916],{"class":915},[228,7353,7354],{"class":252},"        \u003Cv-chip size=",[228,7356,928],{"class":915},[228,7358,7359],{"class":252},"large",[228,7361,928],{"class":915},[228,7363,7364],{"class":252}," variant=",[228,7366,928],{"class":915},[228,7368,7369],{"class":252},"flat",[228,7371,928],{"class":915},[228,7373,7374],{"class":252}," label :color=",[228,7376,928],{"class":915},[228,7378,7379],{"class":252},"priorityColor",[228,7381,928],{"class":915},[228,7383,7384],{"class":252}," class=",[228,7386,928],{"class":915},[228,7388,7389],{"class":252},"wi-chip",[228,7391,928],{"class":915},[228,7393,5360],{"class":252},[228,7395,916],{"class":915},[228,7397,7398],{"class":252},"          \u003Cv-icon start icon=",[228,7400,928],{"class":915},[228,7402,7403],{"class":252},"mdi-flag",[228,7405,928],{"class":915},[228,7407,7408],{"class":252},">\u003C\u002Fv-icon>",[228,7410,916],{"class":915},[228,7412,7413],{"class":252},"          {{ (msg?.payload?.priority ?? 'Normal').toUpperCase() }} PRIORITY",[228,7415,916],{"class":915},[228,7417,7418],{"class":252},"        \u003C\u002Fv-chip>",[228,7420,916],{"class":915},[228,7422,7336],{"class":252},[228,7424,916],{"class":915},[228,7426,7427],{"class":252},"    \u003C\u002Fdiv>",[228,7429,922],{"class":915},[228,7431,7432],{"class":252},"    \u003Cv-row no-gutters class=",[228,7434,928],{"class":915},[228,7436,7437],{"class":252},"wi-body",[228,7439,928],{"class":915},[228,7441,5360],{"class":252},[228,7443,916],{"class":915},[228,7445,7446],{"class":252},"      \u003C!-- Left: Station + Operation -->",[228,7448,916],{"class":915},[228,7450,7451],{"class":252},"      \u003Cv-col cols=",[228,7453,928],{"class":915},[228,7455,7456],{"class":252},"12",[228,7458,928],{"class":915},[228,7460,7461],{"class":252}," md=",[228,7463,928],{"class":915},[228,7465,7466],{"class":252},"5",[228,7468,928],{"class":915},[228,7470,7384],{"class":252},[228,7472,928],{"class":915},[228,7474,7475],{"class":252},"wi-col",[228,7477,928],{"class":915},[228,7479,5360],{"class":252},[228,7481,916],{"class":915},[228,7483,7484],{"class":252},"        \u003Cv-card flat class=",[228,7486,928],{"class":915},[228,7488,7489],{"class":252},"wi-card wi-card-station",[228,7491,928],{"class":915},[228,7493,5360],{"class":252},[228,7495,916],{"class":915},[228,7497,7498],{"class":252},"          \u003Cdiv class=",[228,7500,928],{"class":915},[228,7502,7503],{"class":252},"wi-card-head",[228,7505,928],{"class":915},[228,7507,5360],{"class":252},[228,7509,916],{"class":915},[228,7511,7512],{"class":252},"            \u003Cv-icon icon=",[228,7514,928],{"class":915},[228,7516,7517],{"class":252},"mdi-map-marker-radius",[228,7519,928],{"class":915},[228,7521,7522],{"class":252}," size=",[228,7524,928],{"class":915},[228,7526,7527],{"class":252},"22",[228,7529,928],{"class":915},[228,7531,7408],{"class":252},[228,7533,916],{"class":915},[228,7535,7536],{"class":252},"            \u003Cspan>STATION\u003C\u002Fspan>",[228,7538,916],{"class":915},[228,7540,7541],{"class":252},"          \u003C\u002Fdiv>",[228,7543,916],{"class":915},[228,7545,7498],{"class":252},[228,7547,928],{"class":915},[228,7549,7550],{"class":252},"wi-station-id",[228,7552,928],{"class":915},[228,7554,7555],{"class":252},">{{ msg?.payload?.stationId ?? '—' }}\u003C\u002Fdiv>",[228,7557,922],{"class":915},[228,7559,7560],{"class":252},"          \u003Cv-divider class=",[228,7562,928],{"class":915},[228,7564,7565],{"class":252},"wi-divider",[228,7567,928],{"class":915},[228,7569,7570],{"class":252},">\u003C\u002Fv-divider>",[228,7572,922],{"class":915},[228,7574,7498],{"class":252},[228,7576,928],{"class":915},[228,7578,7503],{"class":252},[228,7580,928],{"class":915},[228,7582,5360],{"class":252},[228,7584,916],{"class":915},[228,7586,7512],{"class":252},[228,7588,928],{"class":915},[228,7590,7591],{"class":252},"mdi-clipboard-text-outline",[228,7593,928],{"class":915},[228,7595,7522],{"class":252},[228,7597,928],{"class":915},[228,7599,7527],{"class":252},[228,7601,928],{"class":915},[228,7603,7408],{"class":252},[228,7605,916],{"class":915},[228,7607,7608],{"class":252},"            \u003Cspan>OPERATION\u003C\u002Fspan>",[228,7610,916],{"class":915},[228,7612,7541],{"class":252},[228,7614,916],{"class":915},[228,7616,7498],{"class":252},[228,7618,928],{"class":915},[228,7620,7621],{"class":252},"wi-operation-name",[228,7623,928],{"class":915},[228,7625,5360],{"class":252},[228,7627,916],{"class":915},[228,7629,7630],{"class":252},"            {{ msg?.payload?.operation?.name ?? 'Awaiting operation' }}",[228,7632,916],{"class":915},[228,7634,7541],{"class":252},[228,7636,922],{"class":915},[228,7638,7498],{"class":252},[228,7640,928],{"class":915},[228,7642,7643],{"class":252},"wi-cycle",[228,7645,928],{"class":915},[228,7647,5360],{"class":252},[228,7649,916],{"class":915},[228,7651,7512],{"class":252},[228,7653,928],{"class":915},[228,7655,7656],{"class":252},"mdi-timer-outline",[228,7658,928],{"class":915},[228,7660,7522],{"class":252},[228,7662,928],{"class":915},[228,7664,7665],{"class":252},"26",[228,7667,928],{"class":915},[228,7669,7408],{"class":252},[228,7671,916],{"class":915},[228,7673,7674],{"class":252},"            \u003Cdiv class=",[228,7676,928],{"class":915},[228,7678,7679],{"class":252},"wi-cycle-text",[228,7681,928],{"class":915},[228,7683,5360],{"class":252},[228,7685,916],{"class":915},[228,7687,7688],{"class":252},"              \u003Cspan class=",[228,7690,928],{"class":915},[228,7692,7693],{"class":252},"wi-cycle-label",[228,7695,928],{"class":915},[228,7697,7698],{"class":252},">ESTIMATED CYCLE TIME\u003C\u002Fspan>",[228,7700,916],{"class":915},[228,7702,7688],{"class":252},[228,7704,928],{"class":915},[228,7706,7707],{"class":252},"wi-cycle-value",[228,7709,928],{"class":915},[228,7711,5360],{"class":252},[228,7713,916],{"class":915},[228,7715,7716],{"class":252},"                {{ msg?.payload?.operation?.estimatedCycleTime ?? '—' }}",[228,7718,916],{"class":915},[228,7720,7721],{"class":252},"              \u003C\u002Fspan>",[228,7723,916],{"class":915},[228,7725,7726],{"class":252},"            \u003C\u002Fdiv>",[228,7728,916],{"class":915},[228,7730,7541],{"class":252},[228,7732,916],{"class":915},[228,7734,7735],{"class":252},"        \u003C\u002Fv-card>",[228,7737,916],{"class":915},[228,7739,7740],{"class":252},"      \u003C\u002Fv-col>",[228,7742,922],{"class":915},[228,7744,7745],{"class":252},"      \u003C!-- Right: Vehicle -->",[228,7747,916],{"class":915},[228,7749,7451],{"class":252},[228,7751,928],{"class":915},[228,7753,7456],{"class":252},[228,7755,928],{"class":915},[228,7757,7461],{"class":252},[228,7759,928],{"class":915},[228,7761,7762],{"class":252},"7",[228,7764,928],{"class":915},[228,7766,7384],{"class":252},[228,7768,928],{"class":915},[228,7770,7475],{"class":252},[228,7772,928],{"class":915},[228,7774,5360],{"class":252},[228,7776,916],{"class":915},[228,7778,7484],{"class":252},[228,7780,928],{"class":915},[228,7782,7783],{"class":252},"wi-card wi-card-vehicle",[228,7785,928],{"class":915},[228,7787,5360],{"class":252},[228,7789,916],{"class":915},[228,7791,7498],{"class":252},[228,7793,928],{"class":915},[228,7795,7503],{"class":252},[228,7797,928],{"class":915},[228,7799,5360],{"class":252},[228,7801,916],{"class":915},[228,7803,7512],{"class":252},[228,7805,928],{"class":915},[228,7807,7808],{"class":252},"mdi-car-side",[228,7810,928],{"class":915},[228,7812,7522],{"class":252},[228,7814,928],{"class":915},[228,7816,7527],{"class":252},[228,7818,928],{"class":915},[228,7820,7408],{"class":252},[228,7822,916],{"class":915},[228,7824,7825],{"class":252},"            \u003Cspan>VEHICLE\u003C\u002Fspan>",[228,7827,916],{"class":915},[228,7829,7541],{"class":252},[228,7831,922],{"class":915},[228,7833,7498],{"class":252},[228,7835,928],{"class":915},[228,7837,7838],{"class":252},"wi-vehicle-model",[228,7840,928],{"class":915},[228,7842,5360],{"class":252},[228,7844,916],{"class":915},[228,7846,7847],{"class":252},"            {{ msg?.payload?.vehicle?.model ?? 'Unknown model' }}",[228,7849,916],{"class":915},[228,7851,7541],{"class":252},[228,7853,916],{"class":915},[228,7855,7498],{"class":252},[228,7857,928],{"class":915},[228,7859,7860],{"class":252},"wi-vehicle-variant",[228,7862,928],{"class":915},[228,7864,5360],{"class":252},[228,7866,916],{"class":915},[228,7868,7869],{"class":252},"            {{ msg?.payload?.vehicle?.variant ?? '' }}",[228,7871,916],{"class":915},[228,7873,7541],{"class":252},[228,7875,922],{"class":915},[228,7877,7878],{"class":252},"          \u003Cv-row no-gutters class=",[228,7880,928],{"class":915},[228,7882,7883],{"class":252},"wi-spec-grid",[228,7885,928],{"class":915},[228,7887,5360],{"class":252},[228,7889,916],{"class":915},[228,7891,7892],{"class":252},"            \u003Cv-col cols=",[228,7894,928],{"class":915},[228,7896,7456],{"class":252},[228,7898,928],{"class":915},[228,7900,7901],{"class":252}," sm=",[228,7903,928],{"class":915},[228,7905,7762],{"class":252},[228,7907,928],{"class":915},[228,7909,5360],{"class":252},[228,7911,916],{"class":915},[228,7913,7914],{"class":252},"              \u003Cdiv class=",[228,7916,928],{"class":915},[228,7918,7919],{"class":252},"wi-spec",[228,7921,928],{"class":915},[228,7923,5360],{"class":252},[228,7925,916],{"class":915},[228,7927,7928],{"class":252},"                \u003Cspan class=",[228,7930,928],{"class":915},[228,7932,7933],{"class":252},"wi-spec-label",[228,7935,928],{"class":915},[228,7937,7938],{"class":252},">VIN\u003C\u002Fspan>",[228,7940,916],{"class":915},[228,7942,7928],{"class":252},[228,7944,928],{"class":915},[228,7946,7947],{"class":252},"wi-spec-value wi-vin",[228,7949,928],{"class":915},[228,7951,5360],{"class":252},[228,7953,916],{"class":915},[228,7955,7956],{"class":252},"                  {{ msg?.payload?.vehicle?.vin ?? '—' }}",[228,7958,916],{"class":915},[228,7960,7961],{"class":252},"                \u003C\u002Fspan>",[228,7963,916],{"class":915},[228,7965,7966],{"class":252},"              \u003C\u002Fdiv>",[228,7968,916],{"class":915},[228,7970,7971],{"class":252},"            \u003C\u002Fv-col>",[228,7973,916],{"class":915},[228,7975,7892],{"class":252},[228,7977,928],{"class":915},[228,7979,7456],{"class":252},[228,7981,928],{"class":915},[228,7983,7901],{"class":252},[228,7985,928],{"class":915},[228,7987,7466],{"class":252},[228,7989,928],{"class":915},[228,7991,5360],{"class":252},[228,7993,916],{"class":915},[228,7995,7914],{"class":252},[228,7997,928],{"class":915},[228,7999,7919],{"class":252},[228,8001,928],{"class":915},[228,8003,5360],{"class":252},[228,8005,916],{"class":915},[228,8007,7928],{"class":252},[228,8009,928],{"class":915},[228,8011,7933],{"class":252},[228,8013,928],{"class":915},[228,8015,8016],{"class":252},">COLOR\u003C\u002Fspan>",[228,8018,916],{"class":915},[228,8020,7928],{"class":252},[228,8022,928],{"class":915},[228,8024,8025],{"class":252},"wi-spec-value",[228,8027,928],{"class":915},[228,8029,5360],{"class":252},[228,8031,916],{"class":915},[228,8033,8034],{"class":252},"                  \u003Cv-icon",[228,8036,916],{"class":915},[228,8038,8039],{"class":252},"                    icon=",[228,8041,928],{"class":915},[228,8043,8044],{"class":252},"mdi-circle",[228,8046,987],{"class":915},[228,8048,8049],{"class":252},"                    size=",[228,8051,928],{"class":915},[228,8053,8054],{"class":252},"18",[228,8056,987],{"class":915},[228,8058,8059],{"class":252},"                    class=",[228,8061,928],{"class":915},[228,8063,8064],{"class":252},"wi-color-dot",[228,8066,987],{"class":915},[228,8068,8069],{"class":252},"                  >\u003C\u002Fv-icon>",[228,8071,916],{"class":915},[228,8073,8074],{"class":252},"                  {{ msg?.payload?.vehicle?.color ?? '—' }}",[228,8076,916],{"class":915},[228,8078,7961],{"class":252},[228,8080,916],{"class":915},[228,8082,7966],{"class":252},[228,8084,916],{"class":915},[228,8086,7971],{"class":252},[228,8088,916],{"class":915},[228,8090,8091],{"class":252},"          \u003C\u002Fv-row>",[228,8093,916],{"class":915},[228,8095,7735],{"class":252},[228,8097,916],{"class":915},[228,8099,7740],{"class":252},[228,8101,916],{"class":915},[228,8103,8104],{"class":252},"    \u003C\u002Fv-row>",[228,8106,922],{"class":915},[228,8108,8109],{"class":252},"    \u003C!-- Start button -->",[228,8111,916],{"class":915},[228,8113,8114],{"class":252},"    \u003Cv-btn block size=",[228,8116,928],{"class":915},[228,8118,8119],{"class":252},"x-large",[228,8121,928],{"class":915},[228,8123,8124],{"class":252}," color=",[228,8126,928],{"class":915},[228,8128,8129],{"class":252},"green-darken-1",[228,8131,928],{"class":915},[228,8133,7384],{"class":252},[228,8135,928],{"class":915},[228,8137,8138],{"class":252},"wi-start-btn",[228,8140,928],{"class":915},[228,8142,8143],{"class":252}," :disabled=",[228,8145,928],{"class":915},[228,8147,8148],{"class":252},"!msg?.payload?.workOrderId",[228,8150,987],{"class":915},[228,8152,8153],{"class":252},"      @click=",[228,8155,928],{"class":915},[228,8157,8158],{"class":252},"send({ payload: { action: 'start', workOrderId: msg?.payload?.workOrderId, stationId: msg?.payload?.stationId } })",[228,8160,928],{"class":915},[228,8162,5360],{"class":252},[228,8164,916],{"class":915},[228,8166,8167],{"class":252},"      \u003Cv-icon start icon=",[228,8169,928],{"class":915},[228,8171,8172],{"class":252},"mdi-play-circle",[228,8174,928],{"class":915},[228,8176,7522],{"class":252},[228,8178,928],{"class":915},[228,8180,8181],{"class":252},"34",[228,8183,928],{"class":915},[228,8185,7408],{"class":252},[228,8187,916],{"class":915},[228,8189,8190],{"class":252},"      START WORK ORDER",[228,8192,916],{"class":915},[228,8194,8195],{"class":252},"    \u003C\u002Fv-btn>",[228,8197,916],{"class":915},[228,8199,8200],{"class":252},"  \u003C\u002Fdiv>",[228,8202,916],{"class":915},[228,8204,8205],{"class":252},"\u003C\u002Ftemplate>",[228,8207,922],{"class":915},[228,8209,8210],{"class":252},"\u003Cscript>",[228,8212,916],{"class":915},[228,8214,8215],{"class":252},"  export default {",[228,8217,916],{"class":915},[228,8219,8220],{"class":252},"  computed: {",[228,8222,916],{"class":915},[228,8224,8225],{"class":252},"    priorityColor () {",[228,8227,916],{"class":915},[228,8229,8230],{"class":252},"      const p = (this.msg?.payload?.priority ?? '').toLowerCase()",[228,8232,916],{"class":915},[228,8234,8235],{"class":252},"      if (p === 'high' || p === 'urgent' || p === 'critical') return 'red-darken-1'",[228,8237,916],{"class":915},[228,8239,8240],{"class":252},"      if (p === 'medium') return 'amber-darken-2'",[228,8242,916],{"class":915},[228,8244,8245],{"class":252},"      return 'blue-grey-darken-1'",[228,8247,916],{"class":915},[228,8249,3695],{"class":252},[228,8251,916],{"class":915},[228,8253,8254],{"class":252},"  }",[228,8256,916],{"class":915},[228,8258,1575],{"class":252},[228,8260,916],{"class":915},[228,8262,8263],{"class":252},"\u003C\u002Fscript>",[228,8265,922],{"class":915},[228,8267,8268],{"class":252},"\u003Cstyle>",[228,8270,916],{"class":915},[228,8272,8273],{"class":252},"  .wi-root {",[228,8275,916],{"class":915},[228,8277,8278],{"class":252},"    font-family: 'Roboto', system-ui, sans-serif;",[228,8280,916],{"class":915},[228,8282,8283],{"class":252},"    color: #1f2933;",[228,8285,916],{"class":915},[228,8287,8288],{"class":252},"    padding: 4px;",[228,8290,916],{"class":915},[228,8292,8254],{"class":252},[228,8294,922],{"class":915},[228,8296,8297],{"class":252},"  .wi-topbar {",[228,8299,916],{"class":915},[228,8301,8302],{"class":252},"    display: flex;",[228,8304,916],{"class":915},[228,8306,8307],{"class":252},"    align-items: center;",[228,8309,916],{"class":915},[228,8311,8312],{"class":252},"    justify-content: space-between;",[228,8314,916],{"class":915},[228,8316,8317],{"class":252},"    flex-wrap: wrap;",[228,8319,916],{"class":915},[228,8321,8322],{"class":252},"    gap: 12px;",[228,8324,916],{"class":915},[228,8326,8327],{"class":252},"    background: #ffffff;",[228,8329,916],{"class":915},[228,8331,8332],{"class":252},"    border: 1px solid #e2e8f0;",[228,8334,916],{"class":915},[228,8336,8337],{"class":252},"    border-left: 6px solid #1565c0;",[228,8339,916],{"class":915},[228,8341,8342],{"class":252},"    border-radius: 10px;",[228,8344,916],{"class":915},[228,8346,8347],{"class":252},"    padding: 14px 20px;",[228,8349,916],{"class":915},[228,8351,8352],{"class":252},"    margin-bottom: 14px;",[228,8354,916],{"class":915},[228,8356,8254],{"class":252},[228,8358,922],{"class":915},[228,8360,8361],{"class":252},"  .wi-topbar-left {",[228,8363,916],{"class":915},[228,8365,8302],{"class":252},[228,8367,916],{"class":915},[228,8369,8370],{"class":252},"    flex-direction: column;",[228,8372,916],{"class":915},[228,8374,8375],{"class":252},"    line-height: 1.1;",[228,8377,916],{"class":915},[228,8379,8254],{"class":252},[228,8381,922],{"class":915},[228,8383,8384],{"class":252},"  .wi-wo-label {",[228,8386,916],{"class":915},[228,8388,8389],{"class":252},"    font-size: 12px;",[228,8391,916],{"class":915},[228,8393,8394],{"class":252},"    letter-spacing: 2px;",[228,8396,916],{"class":915},[228,8398,8399],{"class":252},"    color: #64748b;",[228,8401,916],{"class":915},[228,8403,8404],{"class":252},"    font-weight: 600;",[228,8406,916],{"class":915},[228,8408,8254],{"class":252},[228,8410,922],{"class":915},[228,8412,8413],{"class":252},"  .wi-wo-id {",[228,8415,916],{"class":915},[228,8417,8418],{"class":252},"    font-size: 30px;",[228,8420,916],{"class":915},[228,8422,8423],{"class":252},"    font-weight: 700;",[228,8425,916],{"class":915},[228,8427,8428],{"class":252},"    color: #0f172a;",[228,8430,916],{"class":915},[228,8432,8433],{"class":252},"    font-variant-numeric: tabular-nums;",[228,8435,916],{"class":915},[228,8437,8254],{"class":252},[228,8439,922],{"class":915},[228,8441,8442],{"class":252},"  .wi-topbar-right {",[228,8444,916],{"class":915},[228,8446,8302],{"class":252},[228,8448,916],{"class":915},[228,8450,8451],{"class":252},"    gap: 10px;",[228,8453,916],{"class":915},[228,8455,8317],{"class":252},[228,8457,916],{"class":915},[228,8459,8254],{"class":252},[228,8461,922],{"class":915},[228,8463,8464],{"class":252},"  .wi-chip {",[228,8466,916],{"class":915},[228,8468,8469],{"class":252},"    font-weight: 700 !important;",[228,8471,916],{"class":915},[228,8473,8474],{"class":252},"    letter-spacing: 0.5px;",[228,8476,916],{"class":915},[228,8478,8254],{"class":252},[228,8480,922],{"class":915},[228,8482,8483],{"class":252},"  .wi-body {",[228,8485,916],{"class":915},[228,8487,8488],{"class":252},"    gap: 0;",[228,8490,916],{"class":915},[228,8492,8254],{"class":252},[228,8494,922],{"class":915},[228,8496,8497],{"class":252},"  .wi-col {",[228,8499,916],{"class":915},[228,8501,8502],{"class":252},"    padding: 6px;",[228,8504,916],{"class":915},[228,8506,8254],{"class":252},[228,8508,922],{"class":915},[228,8510,8511],{"class":252},"  .wi-card {",[228,8513,916],{"class":915},[228,8515,8516],{"class":252},"    background: #ffffff !important;",[228,8518,916],{"class":915},[228,8520,8521],{"class":252},"    border: 1px solid #e2e8f0 !important;",[228,8523,916],{"class":915},[228,8525,8526],{"class":252},"    border-radius: 10px !important;",[228,8528,916],{"class":915},[228,8530,8531],{"class":252},"    padding: 20px 22px;",[228,8533,916],{"class":915},[228,8535,8536],{"class":252},"    height: 100%;",[228,8538,916],{"class":915},[228,8540,8254],{"class":252},[228,8542,922],{"class":915},[228,8544,8545],{"class":252},"  .wi-card-vehicle {",[228,8547,916],{"class":915},[228,8549,8550],{"class":252},"    border-left: 6px solid #00897b !important;",[228,8552,916],{"class":915},[228,8554,8254],{"class":252},[228,8556,922],{"class":915},[228,8558,8559],{"class":252},"  .wi-card-station {",[228,8561,916],{"class":915},[228,8563,8564],{"class":252},"    border-left: 6px solid #5e35b1 !important;",[228,8566,916],{"class":915},[228,8568,8254],{"class":252},[228,8570,922],{"class":915},[228,8572,8573],{"class":252},"  .wi-card-head {",[228,8575,916],{"class":915},[228,8577,8302],{"class":252},[228,8579,916],{"class":915},[228,8581,8307],{"class":252},[228,8583,916],{"class":915},[228,8585,8586],{"class":252},"    gap: 8px;",[228,8588,916],{"class":915},[228,8590,8591],{"class":252},"    font-size: 13px;",[228,8593,916],{"class":915},[228,8595,8394],{"class":252},[228,8597,916],{"class":915},[228,8599,8423],{"class":252},[228,8601,916],{"class":915},[228,8603,8399],{"class":252},[228,8605,916],{"class":915},[228,8607,8608],{"class":252},"    margin-bottom: 6px;",[228,8610,916],{"class":915},[228,8612,8254],{"class":252},[228,8614,922],{"class":915},[228,8616,8617],{"class":252},"  .wi-station-id {",[228,8619,916],{"class":915},[228,8621,8622],{"class":252},"    font-size: 44px;",[228,8624,916],{"class":915},[228,8626,8423],{"class":252},[228,8628,916],{"class":915},[228,8630,8631],{"class":252},"    color: #4527a0;",[228,8633,916],{"class":915},[228,8635,8636],{"class":252},"    line-height: 1;",[228,8638,916],{"class":915},[228,8640,8608],{"class":252},[228,8642,916],{"class":915},[228,8644,8254],{"class":252},[228,8646,922],{"class":915},[228,8648,8649],{"class":252},"  .wi-divider {",[228,8651,916],{"class":915},[228,8653,8654],{"class":252},"    margin: 16px 0;",[228,8656,916],{"class":915},[228,8658,8659],{"class":252},"    border-color: #edf2f7 !important;",[228,8661,916],{"class":915},[228,8663,8254],{"class":252},[228,8665,922],{"class":915},[228,8667,8668],{"class":252},"  .wi-operation-name {",[228,8670,916],{"class":915},[228,8672,8673],{"class":252},"    font-size: 24px;",[228,8675,916],{"class":915},[228,8677,8404],{"class":252},[228,8679,916],{"class":915},[228,8681,8428],{"class":252},[228,8683,916],{"class":915},[228,8685,8686],{"class":252},"    margin-bottom: 18px;",[228,8688,916],{"class":915},[228,8690,8254],{"class":252},[228,8692,922],{"class":915},[228,8694,8695],{"class":252},"  .wi-cycle {",[228,8697,916],{"class":915},[228,8699,8302],{"class":252},[228,8701,916],{"class":915},[228,8703,8307],{"class":252},[228,8705,916],{"class":915},[228,8707,8322],{"class":252},[228,8709,916],{"class":915},[228,8711,8712],{"class":252},"    background: #f1f5f9;",[228,8714,916],{"class":915},[228,8716,8717],{"class":252},"    border-radius: 8px;",[228,8719,916],{"class":915},[228,8721,8722],{"class":252},"    padding: 12px 16px;",[228,8724,916],{"class":915},[228,8726,8254],{"class":252},[228,8728,922],{"class":915},[228,8730,8731],{"class":252},"  .wi-cycle-text {",[228,8733,916],{"class":915},[228,8735,8302],{"class":252},[228,8737,916],{"class":915},[228,8739,8370],{"class":252},[228,8741,916],{"class":915},[228,8743,8744],{"class":252},"    line-height: 1.2;",[228,8746,916],{"class":915},[228,8748,8254],{"class":252},[228,8750,922],{"class":915},[228,8752,8753],{"class":252},"  .wi-cycle-label {",[228,8755,916],{"class":915},[228,8757,8758],{"class":252},"    font-size: 11px;",[228,8760,916],{"class":915},[228,8762,8763],{"class":252},"    letter-spacing: 1.5px;",[228,8765,916],{"class":915},[228,8767,8404],{"class":252},[228,8769,916],{"class":915},[228,8771,8399],{"class":252},[228,8773,916],{"class":915},[228,8775,8254],{"class":252},[228,8777,922],{"class":915},[228,8779,8780],{"class":252},"  .wi-cycle-value {",[228,8782,916],{"class":915},[228,8784,8785],{"class":252},"    font-size: 22px;",[228,8787,916],{"class":915},[228,8789,8423],{"class":252},[228,8791,916],{"class":915},[228,8793,8428],{"class":252},[228,8795,916],{"class":915},[228,8797,8433],{"class":252},[228,8799,916],{"class":915},[228,8801,8254],{"class":252},[228,8803,922],{"class":915},[228,8805,8806],{"class":252},"  .wi-vehicle-model {",[228,8808,916],{"class":915},[228,8810,8811],{"class":252},"    font-size: 34px;",[228,8813,916],{"class":915},[228,8815,8423],{"class":252},[228,8817,916],{"class":915},[228,8819,8428],{"class":252},[228,8821,916],{"class":915},[228,8823,8824],{"class":252},"    line-height: 1.05;",[228,8826,916],{"class":915},[228,8828,8254],{"class":252},[228,8830,922],{"class":915},[228,8832,8833],{"class":252},"  .wi-vehicle-variant {",[228,8835,916],{"class":915},[228,8837,8838],{"class":252},"    font-size: 18px;",[228,8840,916],{"class":915},[228,8842,8843],{"class":252},"    font-weight: 500;",[228,8845,916],{"class":915},[228,8847,8848],{"class":252},"    color: #00695c;",[228,8850,916],{"class":915},[228,8852,8853],{"class":252},"    margin-bottom: 20px;",[228,8855,916],{"class":915},[228,8857,8254],{"class":252},[228,8859,922],{"class":915},[228,8861,8862],{"class":252},"  .wi-spec-grid {",[228,8864,916],{"class":915},[228,8866,8488],{"class":252},[228,8868,916],{"class":915},[228,8870,8254],{"class":252},[228,8872,922],{"class":915},[228,8874,8875],{"class":252},"  .wi-spec {",[228,8877,916],{"class":915},[228,8879,8302],{"class":252},[228,8881,916],{"class":915},[228,8883,8370],{"class":252},[228,8885,916],{"class":915},[228,8887,8888],{"class":252},"    padding: 10px 0;",[228,8890,916],{"class":915},[228,8892,8254],{"class":252},[228,8894,922],{"class":915},[228,8896,8897],{"class":252},"  .wi-spec-label {",[228,8899,916],{"class":915},[228,8901,8758],{"class":252},[228,8903,916],{"class":915},[228,8905,8763],{"class":252},[228,8907,916],{"class":915},[228,8909,8404],{"class":252},[228,8911,916],{"class":915},[228,8913,8399],{"class":252},[228,8915,916],{"class":915},[228,8917,8918],{"class":252},"    margin-bottom: 2px;",[228,8920,916],{"class":915},[228,8922,8254],{"class":252},[228,8924,922],{"class":915},[228,8926,8927],{"class":252},"  .wi-spec-value {",[228,8929,916],{"class":915},[228,8931,8932],{"class":252},"    font-size: 20px;",[228,8934,916],{"class":915},[228,8936,8404],{"class":252},[228,8938,916],{"class":915},[228,8940,8428],{"class":252},[228,8942,916],{"class":915},[228,8944,8302],{"class":252},[228,8946,916],{"class":915},[228,8948,8307],{"class":252},[228,8950,916],{"class":915},[228,8952,8953],{"class":252},"    gap: 6px;",[228,8955,916],{"class":915},[228,8957,8254],{"class":252},[228,8959,922],{"class":915},[228,8961,8962],{"class":252},"  .wi-vin {",[228,8964,916],{"class":915},[228,8966,8967],{"class":252},"    font-family: 'Roboto Mono', monospace;",[228,8969,916],{"class":915},[228,8971,8838],{"class":252},[228,8973,916],{"class":915},[228,8975,8976],{"class":252},"    letter-spacing: 1px;",[228,8978,916],{"class":915},[228,8980,8254],{"class":252},[228,8982,922],{"class":915},[228,8984,8985],{"class":252},"  .wi-color-dot {",[228,8987,916],{"class":915},[228,8989,8990],{"class":252},"    color: #cbd5e1;",[228,8992,916],{"class":915},[228,8994,8254],{"class":252},[228,8996,922],{"class":915},[228,8998,8999],{"class":252},"  .wi-start-btn {",[228,9001,916],{"class":915},[228,9003,9004],{"class":252},"    margin-top: 16px;",[228,9006,916],{"class":915},[228,9008,9009],{"class":252},"    height: 84px !important;",[228,9011,916],{"class":915},[228,9013,9014],{"class":252},"    font-size: 24px !important;",[228,9016,916],{"class":915},[228,9018,8469],{"class":252},[228,9020,916],{"class":915},[228,9022,8976],{"class":252},[228,9024,916],{"class":915},[228,9026,9027],{"class":252},"    border-radius: 12px !important;",[228,9029,916],{"class":915},[228,9031,8254],{"class":252},[228,9033,916],{"class":915},[228,9035,9036],{"class":252},"\u003C\u002Fstyle>",[228,9038,238],{"class":234},[228,9040,258],{"class":234},[228,9042,238],{"class":234},[228,9044,9045],{"class":241},"storeOutMessages",[228,9047,238],{"class":234},[228,9049,387],{"class":234},[228,9051,238],{"class":234},[228,9053,9054],{"class":241},"passthru",[228,9056,238],{"class":234},[228,9058,749],{"class":234},[228,9060,238],{"class":234},[228,9062,9063],{"class":241},"resendOnRefresh",[228,9065,238],{"class":234},[228,9067,387],{"class":234},[228,9069,238],{"class":234},[228,9071,9072],{"class":241},"templateScope",[228,9074,238],{"class":234},[228,9076,247],{"class":234},[228,9078,238],{"class":234},[228,9080,9081],{"class":252},"local",[228,9083,238],{"class":234},[228,9085,258],{"class":234},[228,9087,238],{"class":234},[228,9089,9090],{"class":241},"className",[228,9092,238],{"class":234},[228,9094,247],{"class":234},[228,9096,770],{"class":234},[228,9098,258],{"class":234},[228,9100,238],{"class":234},[228,9102,566],{"class":241},[228,9104,238],{"class":234},[228,9106,247],{"class":234},[228,9108,9109],{"class":573},"570",[228,9111,258],{"class":234},[228,9113,238],{"class":234},[228,9115,581],{"class":241},[228,9117,238],{"class":234},[228,9119,247],{"class":234},[228,9121,2514],{"class":573},[228,9123,258],{"class":234},[228,9125,238],{"class":234},[228,9127,802],{"class":241},[228,9129,238],{"class":234},[228,9131,807],{"class":234},[228,9133,238],{"class":234},[228,9135,9136],{"class":252},"455c7536a9adcfe6",[228,9138,238],{"class":234},[228,9140,816],{"class":234},[228,9142,238],{"class":234},[228,9144,242],{"class":241},[228,9146,238],{"class":234},[228,9148,247],{"class":234},[228,9150,238],{"class":234},[228,9152,9153],{"class":252},"77ecf88a48f8c4f0",[228,9155,238],{"class":234},[228,9157,258],{"class":234},[228,9159,238],{"class":234},[228,9161,263],{"class":241},[228,9163,238],{"class":234},[228,9165,247],{"class":234},[228,9167,238],{"class":234},[228,9169,4748],{"class":252},[228,9171,238],{"class":234},[228,9173,258],{"class":234},[228,9175,238],{"class":234},[228,9177,4757],{"class":241},[228,9179,238],{"class":234},[228,9181,1080],{"class":234},[228,9183,238],{"class":234},[228,9185,4766],{"class":241},[228,9187,238],{"class":234},[228,9189,304],{"class":234},[228,9191,238],{"class":234},[228,9193,98],{"class":309},[228,9195,238],{"class":234},[228,9197,247],{"class":234},[228,9199,238],{"class":234},[228,9201,4783],{"class":252},[228,9203,238],{"class":234},[228,9205,4788],{"class":234},[147,9207,9208],{"start":4978},[70,9209,9210,9211,9214,9215,5835,9217,9219,9220,9222,9223,57],{},"Wire ",[45,9212,9213],{},"output 1"," to the \"Current Work Order Card\" ",[96,9216,102],{},[45,9218,4897],{}," group. It shows the work order ID, station, operation and estimated cycle time, the vehicle (model, variant, VIN, colour), a priority chip, and a ",[45,9221,157],{}," button. On click, the button sends ",[96,9224,9225],{},"{ action: 'start', workOrderId, stationId }",[12,9227,9228,75,9232],{},[21,9229],{"alt":9230,"src":9231},"Placeholder: Current Work Order Card rendered on the Home page","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fcurrent-work-order.png",[26,9233,9234],{},"The Current Work Order card: work order ID, priority chip, station, operation, vehicle details, and the Start button.",[147,9236,9237],{"start":5112},[70,9238,5235,9239,9241,9242,9244],{},[96,9240,106],{}," node and assign it to the ",[45,9243,4902],{}," group. Turn off auto-columns and add two text columns as shown below: Work Order (workOrderId) and Priority (priority). Wire output 2 of the split function into it.",[12,9246,9247,75,9251],{},[21,9248],{"alt":9249,"src":9250},"Placeholder: Up Next table listing queued work orders","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fup-next.png",[26,9252,9253],{},"The Up Next table showing the remaining queued work orders with their priority.",[147,9255,9256],{"start":5127},[70,9257,9258,9259,9261,9262,9265,9266,9268,9269,9271,9272,9274],{},"From the card, wire a ",[96,9260,5669],{}," node named \"go to Instructions\" that sets ",[96,9263,9264],{},"payload"," (msg) to ",[96,9267,4819],{},", then into a ",[96,9270,115],{}," node with its event set to ",[45,9273,5669],{}," to switch the page.",[12,9276,9277,9278,9280,9281,9283],{},"When the operator taps ",[45,9279,157],{},", the card sends them to the Instructions page. Because the split function already saved this operator's ",[96,9282,6932],{}," under their own username, the Instructions page, Complete Operation, and Report Issue flows can all look it back up correctly, even if another operator is doing the exact same thing on another screen at the same moment.",[59,9285,9287],{"id":9286},"loading-the-cached-instruction-set","Loading the Cached Instruction Set",[12,9289,9290],{},"The Instructions page needs the steps to show. Because the instruction set was cached in context on login, the page can paint it instantly without another round trip.",[147,9292,9293,9298,9308],{},[70,9294,5235,9295,9297],{},[96,9296,118],{}," node named \"Page opened\" for the Instructions page.",[70,9299,5235,9300,9302,9303,9305,9306,57],{},[96,9301,5669],{}," node named \"Load cached instruction set\". Set ",[96,9304,9264],{}," (msg) to the persistent global ",[96,9307,4819],{},[70,9309,9310],{},"Wire \"Page opened\" into it, and its output into the \"Work Instruction Widget\" you build next.",[59,9312,9314],{"id":9313},"remembering-each-operators-step","Remembering Each Operator's Step",[12,9316,9317,9318,9321,9322,9325],{},"This is something paper can't do and shared screens get wrong. If an operator completes the first two steps of a five-step wheel installation and returns later, they should resume at ",[45,9319,9320],{},"step 3",", not start again at ",[45,9323,9324],{},"step 1",". We achieve this by saving their progress against their username, the one they were identified as when the step was saved, not whichever username happens to be sitting in a shared global at read time.",[12,9327,9328,9329,9332,9333,9336],{},"The instruction widget emits two housekeeping actions: ",[96,9330,9331],{},"save_step"," whenever the operator moves between steps, and ",[96,9334,9335],{},"load_step"," when the page opens and needs to know where to resume. One function node handles both.",[147,9338,9339],{},[70,9340,9341,9342,75,9345,9347,9348,9350,9351,9354,9355,57],{},"Import the ",[45,9343,9344],{},"Work Instruction Widget",[96,9346,102],{}," below, assign it to the ",[45,9349,4819],{}," page, and set its scope to ",[45,9352,9353],{},"Page",". The widget displays one instruction at a time with its image, target cycle time, and checklist. Operators can't move to the next step until every checklist item is completed, and the final step changes the button to ",[45,9356,9357],{},"Complete Operation",[40,9359,9360],{},[12,9361,9362,7050,9364,7055,9367,7058],{},[45,9363,7049],{},[53,9365,7054],{"href":9366},"\u002Fdocs\u002Fuser\u002Fexpert\u002Fnode-red-embedded-ai\u002F?utm_source=chatgpt.com#css-and-html-generation-for-flowfuse-dashboard",[96,9368,102],{},[215,9370,9371],{":height":217},[219,9372,9374],{"className":221,"code":9373,"language":223,"meta":224,"style":224},"[{\"id\":\"d3492b9665d71f27\",\"type\":\"ui-template\",\"z\":\"c50b1b501a74c081\",\"g\":\"96f12d35d68b430e\",\"group\":\"\",\"page\":\"\",\"ui\":\"\",\"name\":\"Work Instruction Widget\",\"order\":1,\"width\":0,\"height\":0,\"head\":\"\",\"format\":\"\u003Ctemplate>\\n  \u003Cdiv class=\\\"wi-root\\\">\\n    \u003C!-- Context header with live timer -->\\n    \u003Cdiv class=\\\"wi-topbar\\\">\\n      \u003Cdiv class=\\\"wi-topbar-left\\\">\\n        \u003Cspan class=\\\"wi-op-label\\\">OPERATION\u003C\u002Fspan>\\n        \u003Cspan class=\\\"wi-op-name\\\">{{ payload?.operation ?? 'Work Instruction' }}\u003C\u002Fspan>\\n        \u003Cspan class=\\\"wi-op-sub\\\">\\n          {{ payload?.instructionSetId ?? '—' }} &nbsp;·&nbsp; v{{ payload?.version ?? '—' }}\\n        \u003C\u002Fspan>\\n      \u003C\u002Fdiv>\\n      \u003Cdiv class=\\\"wi-topbar-right\\\">\\n        \u003Cdiv class=\\\"wi-timer\\\">\\n          \u003Cv-icon icon=\\\"mdi-timer-outline\\\" size=\\\"26\\\">\u003C\u002Fv-icon>\\n          \u003Cdiv class=\\\"wi-timer-text\\\">\\n            \u003Cspan class=\\\"wi-timer-label\\\">TARGET TIME\u003C\u002Fspan>\\n            \u003Cspan class=\\\"wi-timer-value\\\">{{ currentStep?.estimatedTime ?? '—' }}s\u003C\u002Fspan>\\n          \u003C\u002Fdiv>\\n        \u003C\u002Fdiv>\\n      \u003C\u002Fdiv>\\n    \u003C\u002Fdiv>\\n\\n    \u003C!-- Step progress -->\\n    \u003Cv-card flat class=\\\"wi-card wi-stepper-card\\\">\\n      \u003Cdiv class=\\\"wi-stepper-head\\\">\\n        \u003Cspan class=\\\"wi-step-count\\\">\\n          STEP {{ (currentIndex + 1) }} OF {{ steps.length }}\\n        \u003C\u002Fspan>\\n        \u003Cspan class=\\\"wi-step-percent\\\">{{ progressPercent }}% COMPLETE\u003C\u002Fspan>\\n      \u003C\u002Fdiv>\\n      \u003Cv-progress-linear :model-value=\\\"progressPercent\\\" color=\\\"green-darken-1\\\" height=\\\"8\\\" rounded>\u003C\u002Fv-progress-linear>\\n    \u003C\u002Fv-card>\\n\\n    \u003C!-- Main instruction pane: image left, instruction + checklist right -->\\n    \u003Cv-card flat class=\\\"wi-card wi-card-instruction\\\">\\n      \u003Cdiv class=\\\"wi-instruction-flex\\\">\\n        \u003C!-- Reference image (left) -->\\n        \u003Cdiv class=\\\"wi-img-col\\\">\\n          \u003Cdiv class=\\\"wi-image-wrap\\\">\\n            \u003Cimg\\n              :src=\\\"stepImage\\\"\\n              :alt=\\\"currentStep?.title\\\"\\n              class=\\\"wi-image\\\"\\n              @error=\\\"onImageError\\\"\\n            \u002F>\\n          \u003C\u002Fdiv>\\n        \u003C\u002Fdiv>\\n\\n        \u003C!-- Instruction + checklist (right) -->\\n        \u003Cdiv class=\\\"wi-text-col\\\">\\n          \u003Cdiv class=\\\"wi-card-head\\\">\\n            \u003Cv-icon icon=\\\"mdi-clipboard-text-outline\\\" size=\\\"20\\\">\u003C\u002Fv-icon>\\n            \u003Cspan>INSTRUCTION\u003C\u002Fspan>\\n          \u003C\u002Fdiv>\\n          \u003Cdiv class=\\\"wi-step-title\\\">{{ currentStep?.title ?? '—' }}\u003C\u002Fdiv>\\n          \u003Cp class=\\\"wi-step-instruction\\\">{{ currentStep?.instruction ?? '' }}\u003C\u002Fp>\\n\\n          \u003Cdiv class=\\\"wi-card-head wi-checklist-head\\\">\\n            \u003Cv-icon icon=\\\"mdi-format-list-checks\\\" size=\\\"20\\\">\u003C\u002Fv-icon>\\n            \u003Cspan>CHECKLIST\u003C\u002Fspan>\\n          \u003C\u002Fdiv>\\n          \u003Cdiv class=\\\"wi-checklist\\\">\\n            \u003Clabel\\n              v-for=\\\"(item, i) in (currentStep?.checklist ?? [])\\\"\\n              :key=\\\"i\\\"\\n              class=\\\"wi-check-row\\\"\\n              :class=\\\"{ 'wi-check-row-done': checkedState[i] }\\\"\\n            >\\n              \u003Cv-checkbox-btn\\n                :model-value=\\\"checkedState[i]\\\"\\n                color=\\\"green-darken-1\\\"\\n                density=\\\"comfortable\\\"\\n                @update:model-value=\\\"toggleCheck(i)\\\"\\n              >\u003C\u002Fv-checkbox-btn>\\n              \u003Cspan>{{ item }}\u003C\u002Fspan>\\n            \u003C\u002Flabel>\\n          \u003C\u002Fdiv>\\n        \u003C\u002Fdiv>\\n      \u003C\u002Fdiv>\\n    \u003C\u002Fv-card>\\n\\n    \u003C!-- Controls -->\\n    \u003Cv-row no-gutters class=\\\"wi-controls\\\">\\n      \u003Cv-col cols=\\\"12\\\" sm=\\\"3\\\" class=\\\"wi-ctrl-col\\\">\\n        \u003Cv-btn block size=\\\"x-large\\\" variant=\\\"outlined\\\" color=\\\"blue-grey-darken-1\\\" class=\\\"wi-nav-btn\\\"\\n          :disabled=\\\"currentIndex === 0\\\" @click=\\\"prevStep\\\">\\n          \u003Cv-icon start icon=\\\"mdi-chevron-left\\\" size=\\\"30\\\">\u003C\u002Fv-icon>\\n          PREVIOUS\\n        \u003C\u002Fv-btn>\\n      \u003C\u002Fv-col>\\n\\n      \u003Cv-col cols=\\\"12\\\" sm=\\\"3\\\" class=\\\"wi-ctrl-col\\\">\\n        \u003Cv-btn block size=\\\"x-large\\\" variant=\\\"flat\\\" color=\\\"red-darken-1\\\" class=\\\"wi-nav-btn\\\" @click=\\\"reportDefect\\\">\\n          \u003Cv-icon start icon=\\\"mdi-alert-octagon-outline\\\" size=\\\"28\\\">\u003C\u002Fv-icon>\\n          REPORT ISSUE\\n        \u003C\u002Fv-btn>\\n      \u003C\u002Fv-col>\\n\\n      \u003Cv-col cols=\\\"12\\\" sm=\\\"6\\\" class=\\\"wi-ctrl-col\\\">\\n        \u003Cv-btn block size=\\\"x-large\\\" variant=\\\"flat\\\" :color=\\\"isLastStep ? 'green-darken-2' : 'green-darken-1'\\\"\\n          class=\\\"wi-nav-btn wi-next-btn\\\" :disabled=\\\"!allChecked\\\" @click=\\\"nextStep\\\">\\n          \u003Cv-icon start :icon=\\\"isLastStep ? 'mdi-check-circle' : 'mdi-chevron-right'\\\" size=\\\"30\\\">\u003C\u002Fv-icon>\\n          {{ isLastStep ? 'COMPLETE OPERATION' : 'NEXT STEP' }}\\n        \u003C\u002Fv-btn>\\n      \u003C\u002Fv-col>\\n    \u003C\u002Fv-row>\\n\\n    \u003Cdiv v-if=\\\"!allChecked\\\" class=\\\"wi-hint\\\">\\n      \u003Cv-icon icon=\\\"mdi-information-outline\\\" size=\\\"18\\\">\u003C\u002Fv-icon>\\n      Complete all checklist items to continue.\\n    \u003C\u002Fdiv>\\n  \u003C\u002Fdiv>\\n\u003C\u002Ftemplate>\\n\\n\u003Cscript>\\n  export default {\\n  data () {\\n    return {\\n      currentIndex: 0,\\n      checked: {},\\n      assetBase: '\u002Fassets\u002F',\\n      placeholder: 'https:\u002F\u002Fplacehold.co\u002F800x600\u002Feef2f7\u002F475569?text=Step+Reference',\\n      instruction: null\\n    }\\n  },\\n  computed: {\\n    payload () {\\n      return this.instruction ?? {}\\n    },\\n    steps () {\\n      return this.instruction?.steps ?? []\\n    },\\n    currentStep () {\\n      return this.steps[this.currentIndex] ?? null\\n    },\\n    isLastStep () {\\n      return this.currentIndex === this.steps.length - 1\\n    },\\n    progressPercent () {\\n      if (!this.steps.length) return 0\\n      return Math.round((this.currentIndex \u002F this.steps.length) * 100)\\n    },\\n    checkedState () {\\n      return this.checked[this.currentIndex] ?? []\\n    },\\n    allChecked () {\\n      const list = this.currentStep?.checklist ?? []\\n      if (!list.length) return true\\n      const state = this.checkedState\\n      return list.every((_, i) => state[i])\\n    },\\n    stepImage () {\\n      return this.resolveImage(this.currentStep?.image)\\n    }\\n  },\\n  methods: {\\n    resolveImage (img) {\\n      if (!img) return this.placeholder\\n      if (\u002F^https?:\\\\\u002F\\\\\u002F\u002F.test(img) || img.startsWith('\u002F')) return img\\n      return this.assetBase + img\\n    },\\n    preloadImages () {\\n      for (const step of this.steps) {\\n        const url = this.resolveImage(step?.image)\\n        if (url && url !== this.placeholder) {\\n          const im = new Image()\\n          im.src = url\\n        }\\n      }\\n    },\\n    saveStep () {\\n      this.send({\\n        payload: {\\n          action: 'save_step',\\n          stepIndex: this.currentIndex,\\n          stepName: this.currentStep?.title ?? null,\\n          stepId: this.currentStep?.stepId ?? null\\n        }\\n      })\\n    },\\n    toggleCheck (i) {\\n      const arr = (this.checked[this.currentIndex] ?? []).slice()\\n      arr[i] = !arr[i]\\n      this.checked = { ...this.checked, [this.currentIndex]: arr }\\n    },\\n    onImageError (e) {\\n      if (e?.target && e.target.src !== this.placeholder) {\\n        e.target.src = this.placeholder\\n      }\\n    },\\n    goToStep (i) {\\n      const max = this.steps.length - 1\\n      this.currentIndex = Math.min(Math.max(i, 0), Math.max(max, 0))\\n      this.saveStep()\\n    },\\n    nextStep () {\\n      if (this.isLastStep) {\\n        this.send({ payload: { action: 'complete_operation', stepIndex: this.currentIndex } })\\n        return\\n      }\\n      this.goToStep(this.currentIndex + 1)\\n    },\\n    prevStep () {\\n      if (this.currentIndex === 0) return\\n      this.goToStep(this.currentIndex - 1)\\n    },\\n    reportDefect () {\\n      this.send({\\n        payload: {\\n          action: 'Report Issue',\\n        }\\n      })\\n    }\\n  },\\n  watch: {\\n    msg: {\\n      immediate: true,\\n      handler (m) {\\n        const pl = m?.payload\\n        if (!pl) return\\n        if (Array.isArray(pl.steps)) {\\n          \u002F\u002F Instruction-set data: cache it so later messages can't wipe it.\\n          this.instruction = pl\\n          \u002F\u002F Preload every step image so navigation is instant.\\n          this.$nextTick(() => this.preloadImages())\\n        } else if (typeof pl.stepIndex === 'number') {\\n          \u002F\u002F Resume reply from the tracker: jump to the saved step.\\n          this.currentIndex = Math.min(\\n            Math.max(pl.stepIndex, 0),\\n            Math.max(this.steps.length - 1, 0)\\n          )\\n        }\\n      }\\n    }\\n  },\\n  mounted () {\\n    \u002F\u002F Ask the tracker which step this work order was left on.\\n    this.send({ payload: { action: 'load_step' } })\\n  }\\n}\\n\u003C\u002Fscript>\\n\\n\u003Cstyle>\\n  .wi-root {\\n    font-family: 'Roboto', system-ui, sans-serif;\\n    color: #1f2933;\\n    padding: 2px;\\n  }\\n\\n  \u002F* Header *\u002F\\n  .wi-topbar {\\n    display: flex;\\n    align-items: center;\\n    justify-content: space-between;\\n    flex-wrap: wrap;\\n    gap: 12px;\\n    background: #ffffff;\\n    border: 1px solid #e2e8f0;\\n    border-left: 6px solid #1565c0;\\n    border-radius: 10px;\\n    padding: 10px 16px;\\n    margin-bottom: 10px;\\n  }\\n\\n  .wi-topbar-left {\\n    display: flex;\\n    flex-direction: column;\\n    line-height: 1.15;\\n  }\\n\\n  .wi-op-label {\\n    font-size: 11px;\\n    letter-spacing: 2px;\\n    color: #64748b;\\n    font-weight: 600;\\n  }\\n\\n  .wi-op-name {\\n    font-size: 21px;\\n    font-weight: 700;\\n    color: #0f172a;\\n  }\\n\\n  .wi-op-sub {\\n    font-size: 12px;\\n    color: #94a3b8;\\n    font-weight: 500;\\n    margin-top: 2px;\\n  }\\n\\n  .wi-timer {\\n    display: flex;\\n    align-items: center;\\n    gap: 10px;\\n    padding: 8px 14px;\\n    border-radius: 10px;\\n    background: #f1f5f9;\\n    color: #0f172a;\\n  }\\n\\n  .wi-timer-text {\\n    display: flex;\\n    flex-direction: column;\\n    line-height: 1.1;\\n  }\\n\\n  .wi-timer-label {\\n    font-size: 10px;\\n    letter-spacing: 1.5px;\\n    font-weight: 600;\\n    opacity: 0.75;\\n  }\\n\\n  .wi-timer-value {\\n    font-size: 20px;\\n    font-weight: 700;\\n    font-variant-numeric: tabular-nums;\\n  }\\n\\n  \u002F* Cards *\u002F\\n  .wi-card {\\n    background: #ffffff !important;\\n    border: 1px solid #e2e8f0 !important;\\n    border-radius: 10px !important;\\n    padding: 14px 18px !important;\\n    height: 100%;\\n    box-sizing: border-box;\\n  }\\n\\n  .wi-card-head {\\n    display: flex;\\n    align-items: center;\\n    gap: 8px;\\n    font-size: 13px;\\n    letter-spacing: 2px;\\n    font-weight: 700;\\n    color: #64748b;\\n    margin-bottom: 8px;\\n  }\\n\\n  \u002F* Stepper (compact) *\u002F\\n  .wi-stepper-card {\\n    margin-bottom: 10px;\\n    padding: 10px 16px;\\n  }\\n\\n  .wi-stepper-head {\\n    display: flex;\\n    justify-content: space-between;\\n    align-items: baseline;\\n    margin-bottom: 8px;\\n  }\\n\\n  .wi-step-count {\\n    font-size: 14px;\\n    font-weight: 700;\\n    letter-spacing: 1px;\\n    color: #0f172a;\\n  }\\n\\n  .wi-step-percent {\\n    font-size: 12px;\\n    font-weight: 600;\\n    letter-spacing: 1px;\\n    color: #64748b;\\n  }\\n\\n  \u002F* Instruction card *\u002F\\n  .wi-card-instruction {\\n    border-left: 5px solid #5e35b1 !important;\\n    padding: 16px 20px !important;\\n    box-sizing: border-box;\\n  }\\n\\n  \u002F* Desktop: keep the instruction card a consistent size across every step,\\n     so navigating between steps does not make the layout jump. The card\\n     still grows taller when the reference image needs more room. *\u002F\\n  @media (min-width: 701px) {\\n    .wi-card-instruction {\\n      min-height: 360px;\\n    }\\n  }\\n\\n  .wi-step-title {\\n    font-size: 19px;\\n    font-weight: 700;\\n    color: #0f172a;\\n    margin-bottom: 6px;\\n    line-height: 1.15;\\n  }\\n\\n  .wi-step-instruction {\\n    font-size: 15px;\\n    line-height: 1.55;\\n    color: #334155;\\n    margin: 0 0 16px;\\n  }\\n\\n  .wi-checklist-head {\\n    margin-top: 6px;\\n    padding-top: 12px;\\n    border-top: 1px solid #edf2f7;\\n  }\\n\\n  .wi-checklist {\\n    display: flex;\\n    flex-direction: column;\\n    gap: 4px;\\n  }\\n\\n  .wi-check-row {\\n    display: flex;\\n    align-items: center;\\n    justify-content: flex-start;\\n    gap: 10px;\\n    padding: 6px 4px;\\n    border-radius: 8px;\\n    font-size: 15px;\\n    font-weight: 500;\\n    color: #1f2933;\\n    cursor: pointer;\\n  }\\n\\n  .wi-check-row>span {\\n    flex: 1;\\n    line-height: 1.35;\\n  }\\n\\n  .wi-check-row .v-selection-control {\\n    flex: none;\\n    min-width: 0;\\n  }\\n\\n  .wi-check-row-done>span {\\n    color: #94a3b8;\\n  }\\n\\n  \u002F* Instruction two-column layout (plain flexbox, no Vuetify grid) *\u002F\\n  .wi-instruction-flex {\\n    display: flex;\\n    gap: 20px;\\n    align-items: stretch;\\n    width: 100%;\\n    height: 100%;\\n  }\\n\\n  .wi-img-col {\\n    flex: 0 0 40%;\\n    display: flex;\\n    min-width: 0;\\n  }\\n\\n  .wi-text-col {\\n    flex: 1 1 60%;\\n    padding-top: 4px;\\n    min-width: 0;\\n  }\\n\\n  \u002F* Reference image (left) *\u002F\\n  .wi-image-wrap {\\n    border-radius: 10px;\\n    overflow: hidden;\\n    background: #f1f5f9;\\n    border: 1px solid #e2e8f0;\\n    width: 100%;\\n    height: 100%;\\n    min-height: 210px;\\n    display: flex;\\n    align-items: center;\\n    justify-content: center;\\n  }\\n\\n  \u002F* Desktop: image box tracks a fixed aspect ratio based on its column\\n     width, so the card height scales with the image. The text column\\n     stretches to match via align-items: stretch on the flex container. *\u002F\\n  @media (min-width: 701px) {\\n    .wi-image-wrap {\\n      aspect-ratio: 4 \u002F 3;\\n      height: auto;\\n      align-self: flex-start;\\n    }\\n  }\\n\\n  .wi-image {\\n    width: 100%;\\n    height: 100%;\\n    object-fit: contain;\\n  }\\n\\n  @media (max-width: 700px) {\\n    .wi-instruction-flex {\\n      flex-direction: column;\\n    }\\n\\n    .wi-img-col {\\n      flex: none;\\n    }\\n\\n    .wi-image-wrap {\\n      min-height: 150px;\\n    }\\n  }\\n\\n  \u002F* Controls *\u002F\\n  .wi-controls {\\n    margin-top: 12px;\\n    gap: 0;\\n  }\\n\\n  .wi-ctrl-col {\\n    padding: 6px 8px;\\n  }\\n\\n  .wi-nav-btn {\\n    height: 52px !important;\\n    font-size: 15px !important;\\n    font-weight: 700 !important;\\n    letter-spacing: 0.5px;\\n    border-radius: 12px !important;\\n  }\\n\\n  .wi-nav-btn .v-btn__content {\\n    display: flex;\\n    align-items: center;\\n    justify-content: center;\\n  }\\n\\n  .wi-next-btn {\\n    font-size: 17px !important;\\n  }\\n\\n  .wi-hint {\\n    display: flex;\\n    align-items: center;\\n    justify-content: center;\\n    gap: 6px;\\n    margin-top: 8px;\\n    font-size: 14px;\\n    font-weight: 500;\\n    color: #94a3b8;\\n  }\\n\u003C\u002Fstyle>\",\"storeOutMessages\":true,\"passthru\":true,\"resendOnRefresh\":true,\"templateScope\":\"widget:page\",\"className\":\"\",\"x\":670,\"y\":780,\"wires\":[[\"c67ea1f6c0580816\",\"effed3f3a008aef7\"]]},{\"id\":\"e51561215326fafd\",\"type\":\"global-config\",\"env\":[],\"modules\":{\"@flowfuse\u002Fnode-red-dashboard\":\"1.30.2\"}}]\n",[96,9375,9376],{"__ignoreMap":224},[228,9377,9378,9380,9382,9384,9386,9388,9390,9393,9395,9397,9399,9401,9403,9405,9407,9409,9411,9413,9415,9417,9419,9421,9423,9425,9427,9429,9431,9433,9435,9437,9439,9442,9444,9446,9448,9450,9452,9454,9456,9458,9460,9462,9464,9466,9468,9470,9472,9474,9476,9478,9480,9482,9484,9486,9488,9490,9492,9494,9496,9498,9500,9502,9504,9506,9508,9510,9512,9514,9516,9518,9520,9522,9524,9526,9528,9530,9532,9534,9536,9538,9540,9542,9544,9546,9548,9550,9552,9554,9556,9558,9560,9562,9564,9566,9568,9570,9572,9575,9577,9579,9581,9583,9585,9587,9589,9591,9593,9595,9597,9599,9601,9603,9605,9608,9610,9613,9615,9617,9619,9622,9624,9627,9629,9631,9633,9636,9638,9640,9642,9645,9647,9650,9652,9654,9656,9658,9660,9662,9664,9666,9668,9671,9673,9676,9678,9680,9682,9685,9687,9689,9691,9693,9695,9697,9699,9701,9703,9705,9707,9710,9712,9714,9716,9719,9721,9724,9726,9729,9731,9733,9735,9738,9740,9743,9745,9747,9749,9752,9754,9756,9758,9760,9762,9765,9767,9770,9772,9775,9777,9779,9781,9783,9785,9788,9790,9792,9794,9796,9798,9801,9803,9805,9807,9810,9812,9814,9816,9818,9820,9823,9825,9828,9830,9832,9834,9837,9839,9842,9844,9846,9848,9850,9852,9855,9857,9860,9862,9865,9867,9870,9872,9875,9877,9879,9881,9884,9886,9888,9890,9892,9894,9897,9899,9901,9903,9906,9908,9910,9912,9915,9917,9919,9921,9923,9925,9928,9930,9932,9934,9937,9939,9942,9944,9947,9949,9952,9954,9957,9959,9962,9964,9967,9969,9972,9974,9977,9979,9982,9984,9986,9988,9990,9992,9995,9997,9999,10001,10004,10006,10008,10010,10012,10014,10016,10018,10020,10022,10024,10026,10028,10030,10032,10034,10037,10039,10041,10043,10046,10048,10050,10052,10054,10056,10059,10061,10064,10066,10069,10071,10074,10076,10079,10081,10083,10085,10088,10090,10092,10094,10096,10098,10101,10103,10105,10107,10109,10111,10113,10115,10118,10120,10122,10124,10126,10128,10131,10133,10135,10137,10140,10142,10145,10147,10150,10152,10155,10157,10160,10162,10164,10166,10169,10171,10174,10176,10179,10181,10184,10186,10189,10191,10194,10196,10199,10201,10204,10206,10208,10210,10213,10215,10218,10220,10223,10225,10228,10230,10233,10235,10238,10240,10243,10245,10247,10249,10251,10253,10255,10257,10259,10261,10264,10266,10268,10270,10273,10275,10277,10279,10281,10283,10285,10287,10289,10291,10294,10296,10298,10300,10303,10305,10307,10309,10312,10314,10316,10318,10320,10322,10325,10327,10329,10331,10334,10336,10338,10340,10343,10345,10348,10350,10353,10355,10358,10360,10363,10365,10367,10369,10371,10373,10376,10378,10380,10382,10385,10387,10389,10391,10394,10396,10399,10401,10403,10405,10407,10409,10411,10413,10415,10417,10419,10421,10423,10425,10427,10429,10431,10433,10435,10437,10439,10441,10443,10445,10447,10449,10451,10453,10456,10458,10460,10462,10464,10466,10468,10470,10473,10475,10477,10479,10481,10483,10486,10488,10490,10492,10495,10497,10499,10501,10504,10506,10508,10510,10512,10514,10516,10518,10520,10522,10524,10526,10529,10531,10533,10535,10537,10539,10541,10543,10545,10547,10549,10551,10553,10555,10557,10559,10562,10564,10567,10569,10572,10574,10577,10579,10581,10583,10586,10588,10590,10592,10595,10597,10599,10601,10604,10606,10609,10611,10613,10615,10617,10619,10621,10623,10626,10628,10630,10632,10634,10636,10638,10640,10643,10645,10647,10649,10651,10653,10656,10658,10660,10662,10665,10667,10670,10672,10674,10676,10678,10680,10682,10684,10687,10689,10691,10693,10695,10697,10699,10701,10703,10705,10707,10709,10712,10714,10717,10719,10722,10724,10727,10729,10732,10734,10737,10739,10742,10744,10746,10748,10751,10753,10755,10757,10760,10762,10765,10767,10769,10771,10774,10776,10779,10781,10783,10785,10788,10790,10793,10795,10797,10799,10802,10804,10807,10809,10811,10813,10816,10818,10821,10823,10826,10828,10830,10832,10835,10837,10840,10842,10844,10846,10849,10851,10854,10856,10859,10861,10864,10866,10869,10871,10873,10875,10878,10880,10883,10885,10887,10889,10891,10893,10896,10898,10901,10903,10906,10908,10911,10914,10917,10919,10922,10924,10927,10929,10931,10933,10936,10938,10941,10943,10946,10948,10951,10953,10956,10958,10961,10963,10965,10967,10970,10972,10974,10976,10979,10981,10984,10986,10989,10991,10994,10996,10999,11001,11004,11006,11009,11011,11013,11015,11018,11020,11022,11024,11027,11029,11032,11034,11037,11039,11042,11044,11046,11048,11051,11053,11056,11058,11061,11063,11065,11067,11069,11071,11074,11076,11079,11081,11084,11086,11089,11091,11093,11095,11098,11100,11103,11105,11108,11110,11112,11114,11116,11118,11121,11123,11125,11127,11130,11132,11135,11137,11140,11142,11144,11146,11149,11151,11153,11155,11157,11159,11162,11164,11166,11168,11170,11172,11174,11176,11178,11180,11183,11185,11188,11190,11193,11195,11198,11200,11203,11205,11208,11210,11213,11215,11218,11220,11223,11225,11228,11230,11233,11235,11238,11240,11243,11245,11248,11250,11253,11255,11258,11260,11263,11265,11267,11269,11271,11273,11275,11277,11279,11281,11284,11286,11289,11291,11294,11296,11298,11300,11302,11304,11306,11308,11310,11312,11314,11316,11318,11320,11322,11324,11327,11329,11331,11333,11336,11338,11340,11342,11344,11346,11348,11350,11352,11354,11356,11358,11360,11362,11364,11366,11368,11370,11372,11374,11376,11378,11381,11383,11386,11388,11390,11392,11394,11396,11398,11400,11402,11404,11407,11409,11411,11413,11416,11418,11420,11422,11424,11426,11428,11430,11432,11434,11436,11438,11441,11443,11446,11448,11450,11452,11454,11456,11458,11460,11463,11465,11467,11469,11472,11474,11476,11478,11481,11483,11485,11487,11490,11492,11494,11496,11498,11500,11502,11504,11507,11509,11511,11513,11515,11517,11519,11521,11523,11525,11528,11530,11532,11534,11536,11538,11540,11542,11544,11546,11549,11551,11554,11556,11558,11560,11562,11564,11567,11569,11571,11573,11576,11578,11580,11582,11584,11586,11588,11590,11592,11594,11597,11599,11601,11603,11605,11607,11609,11611,11613,11615,11618,11620,11622,11624,11627,11629,11631,11633,11635,11637,11639,11641,11643,11645,11647,11649,11651,11653,11655,11657,11659,11661,11663,11665,11668,11670,11672,11674,11677,11679,11682,11684,11686,11688,11690,11692,11694,11696,11699,11701,11703,11705,11707,11709,11712,11714,11716,11718,11720,11722,11725,11727,11730,11732,11734,11736,11738,11740,11742,11744,11746,11748,11751,11753,11755,11757,11759,11761,11763,11765,11767,11769,11771,11773,11776,11778,11781,11783,11786,11788,11791,11793,11795,11797,11799,11801,11804,11806,11809,11811,11814,11816,11819,11821,11824,11826,11829,11831,11833,11835,11837,11839,11842,11844,11847,11849,11851,11853,11855,11857,11859,11861,11863,11865,11867,11869,11872,11874,11877,11879,11882,11884,11887,11889,11892,11894,11896,11898,11901,11903,11906,11908,11911,11913,11916,11918,11920,11922,11925,11927,11929,11931,11933,11935,11938,11940,11942,11944,11947,11949,11951,11953,11955,11957,11960,11962,11964,11966,11969,11971,11973,11975,11977,11979,11981,11983,11985,11987,11990,11992,11994,11996,11999,12001,12004,12006,12009,12011,12013,12015,12018,12020,12023,12025,12028,12030,12032,12034,12037,12039,12041,12043,12045,12047,12050,12052,12055,12057,12059,12061,12064,12066,12069,12071,12074,12076,12078,12080,12082,12084,12087,12089,12092,12094,12096,12098,12100,12102,12104,12106,12109,12111,12114,12116,12119,12121,12123,12125,12127,12129,12132,12134,12137,12139,12141,12143,12146,12148,12150,12152,12154,12156,12158,12160,12162,12164,12167,12169,12171,12173,12175,12177,12180,12182,12184,12186,12189,12191,12194,12196,12199,12201,12203,12205,12208,12210,12213,12215,12218,12220,12223,12225,12227,12229,12231,12233,12236,12238,12240,12242,12244,12246,12249,12251,12253,12255,12258,12260,12263,12265,12268,12270,12272,12274,12277,12279,12282,12284,12286,12288,12290,12292,12295,12297,12299,12301,12303,12305,12308,12310,12313,12315,12318,12320,12322,12324,12326,12328,12331,12333,12336,12338,12340,12342,12345,12347,12350,12352,12355,12357,12359,12361,12363,12365,12367,12369,12371,12373,12376,12378,12380,12382,12384,12386,12388,12390,12392,12394,12397,12399,12402,12404,12406,12408,12411,12413,12415,12417,12419,12421,12423,12425,12427,12429,12432,12434,12436,12438,12440,12442,12444,12446,12448,12450,12452,12454,12456,12458,12460,12462,12464,12466,12468,12470,12472,12474,12476,12478,12480,12482,12484,12486,12488,12490,12493,12495,12497,12499,12501,12503,12505,12507,12509,12511,12513,12515,12517,12520,12522,12524,12526,12528,12530,12533,12535,12537,12539,12541,12543,12545,12548,12550,12552,12554,12557,12559,12561,12563,12565,12567,12569,12571,12574,12576,12578,12580,12582,12584,12586,12588,12590,12592,12594,12596,12598,12600,12602,12604,12606,12608,12610,12612,12614,12616,12618,12620,12622,12624],{"class":230,"line":231},[228,9379,235],{"class":234},[228,9381,238],{"class":234},[228,9383,242],{"class":241},[228,9385,238],{"class":234},[228,9387,247],{"class":234},[228,9389,238],{"class":234},[228,9391,9392],{"class":252},"d3492b9665d71f27",[228,9394,238],{"class":234},[228,9396,258],{"class":234},[228,9398,238],{"class":234},[228,9400,263],{"class":241},[228,9402,238],{"class":234},[228,9404,247],{"class":234},[228,9406,238],{"class":234},[228,9408,102],{"class":252},[228,9410,238],{"class":234},[228,9412,258],{"class":234},[228,9414,238],{"class":234},[228,9416,281],{"class":241},[228,9418,238],{"class":234},[228,9420,247],{"class":234},[228,9422,238],{"class":234},[228,9424,7115],{"class":252},[228,9426,238],{"class":234},[228,9428,258],{"class":234},[228,9430,238],{"class":234},[228,9432,673],{"class":241},[228,9434,238],{"class":234},[228,9436,247],{"class":234},[228,9438,238],{"class":234},[228,9440,9441],{"class":252},"96f12d35d68b430e",[228,9443,238],{"class":234},[228,9445,258],{"class":234},[228,9447,238],{"class":234},[228,9449,272],{"class":241},[228,9451,238],{"class":234},[228,9453,247],{"class":234},[228,9455,770],{"class":234},[228,9457,258],{"class":234},[228,9459,238],{"class":234},[228,9461,4638],{"class":241},[228,9463,238],{"class":234},[228,9465,247],{"class":234},[228,9467,770],{"class":234},[228,9469,258],{"class":234},[228,9471,238],{"class":234},[228,9473,4277],{"class":241},[228,9475,238],{"class":234},[228,9477,247],{"class":234},[228,9479,770],{"class":234},[228,9481,258],{"class":234},[228,9483,238],{"class":234},[228,9485,690],{"class":241},[228,9487,238],{"class":234},[228,9489,247],{"class":234},[228,9491,238],{"class":234},[228,9493,9344],{"class":252},[228,9495,238],{"class":234},[228,9497,258],{"class":234},[228,9499,238],{"class":234},[228,9501,7194],{"class":241},[228,9503,238],{"class":234},[228,9505,247],{"class":234},[228,9507,337],{"class":573},[228,9509,258],{"class":234},[228,9511,238],{"class":234},[228,9513,7207],{"class":241},[228,9515,238],{"class":234},[228,9517,247],{"class":234},[228,9519,1042],{"class":573},[228,9521,258],{"class":234},[228,9523,238],{"class":234},[228,9525,7220],{"class":241},[228,9527,238],{"class":234},[228,9529,247],{"class":234},[228,9531,1042],{"class":573},[228,9533,258],{"class":234},[228,9535,238],{"class":234},[228,9537,7233],{"class":241},[228,9539,238],{"class":234},[228,9541,247],{"class":234},[228,9543,770],{"class":234},[228,9545,258],{"class":234},[228,9547,238],{"class":234},[228,9549,7246],{"class":241},[228,9551,238],{"class":234},[228,9553,247],{"class":234},[228,9555,238],{"class":234},[228,9557,7255],{"class":252},[228,9559,916],{"class":915},[228,9561,7260],{"class":252},[228,9563,928],{"class":915},[228,9565,7265],{"class":252},[228,9567,928],{"class":915},[228,9569,5360],{"class":252},[228,9571,916],{"class":915},[228,9573,9574],{"class":252},"    \u003C!-- Context header with live timer -->",[228,9576,916],{"class":915},[228,9578,7279],{"class":252},[228,9580,928],{"class":915},[228,9582,7284],{"class":252},[228,9584,928],{"class":915},[228,9586,5360],{"class":252},[228,9588,916],{"class":915},[228,9590,7293],{"class":252},[228,9592,928],{"class":915},[228,9594,7298],{"class":252},[228,9596,928],{"class":915},[228,9598,5360],{"class":252},[228,9600,916],{"class":915},[228,9602,7307],{"class":252},[228,9604,928],{"class":915},[228,9606,9607],{"class":252},"wi-op-label",[228,9609,928],{"class":915},[228,9611,9612],{"class":252},">OPERATION\u003C\u002Fspan>",[228,9614,916],{"class":915},[228,9616,7307],{"class":252},[228,9618,928],{"class":915},[228,9620,9621],{"class":252},"wi-op-name",[228,9623,928],{"class":915},[228,9625,9626],{"class":252},">{{ payload?.operation ?? 'Work Instruction' }}\u003C\u002Fspan>",[228,9628,916],{"class":915},[228,9630,7307],{"class":252},[228,9632,928],{"class":915},[228,9634,9635],{"class":252},"wi-op-sub",[228,9637,928],{"class":915},[228,9639,5360],{"class":252},[228,9641,916],{"class":915},[228,9643,9644],{"class":252},"          {{ payload?.instructionSetId ?? '—' }} &nbsp;·&nbsp; v{{ payload?.version ?? '—' }}",[228,9646,916],{"class":915},[228,9648,9649],{"class":252},"        \u003C\u002Fspan>",[228,9651,916],{"class":915},[228,9653,7336],{"class":252},[228,9655,916],{"class":915},[228,9657,7293],{"class":252},[228,9659,928],{"class":915},[228,9661,7345],{"class":252},[228,9663,928],{"class":915},[228,9665,5360],{"class":252},[228,9667,916],{"class":915},[228,9669,9670],{"class":252},"        \u003Cdiv class=",[228,9672,928],{"class":915},[228,9674,9675],{"class":252},"wi-timer",[228,9677,928],{"class":915},[228,9679,5360],{"class":252},[228,9681,916],{"class":915},[228,9683,9684],{"class":252},"          \u003Cv-icon icon=",[228,9686,928],{"class":915},[228,9688,7656],{"class":252},[228,9690,928],{"class":915},[228,9692,7522],{"class":252},[228,9694,928],{"class":915},[228,9696,7665],{"class":252},[228,9698,928],{"class":915},[228,9700,7408],{"class":252},[228,9702,916],{"class":915},[228,9704,7498],{"class":252},[228,9706,928],{"class":915},[228,9708,9709],{"class":252},"wi-timer-text",[228,9711,928],{"class":915},[228,9713,5360],{"class":252},[228,9715,916],{"class":915},[228,9717,9718],{"class":252},"            \u003Cspan class=",[228,9720,928],{"class":915},[228,9722,9723],{"class":252},"wi-timer-label",[228,9725,928],{"class":915},[228,9727,9728],{"class":252},">TARGET TIME\u003C\u002Fspan>",[228,9730,916],{"class":915},[228,9732,9718],{"class":252},[228,9734,928],{"class":915},[228,9736,9737],{"class":252},"wi-timer-value",[228,9739,928],{"class":915},[228,9741,9742],{"class":252},">{{ currentStep?.estimatedTime ?? '—' }}s\u003C\u002Fspan>",[228,9744,916],{"class":915},[228,9746,7541],{"class":252},[228,9748,916],{"class":915},[228,9750,9751],{"class":252},"        \u003C\u002Fdiv>",[228,9753,916],{"class":915},[228,9755,7336],{"class":252},[228,9757,916],{"class":915},[228,9759,7427],{"class":252},[228,9761,922],{"class":915},[228,9763,9764],{"class":252},"    \u003C!-- Step progress -->",[228,9766,916],{"class":915},[228,9768,9769],{"class":252},"    \u003Cv-card flat class=",[228,9771,928],{"class":915},[228,9773,9774],{"class":252},"wi-card wi-stepper-card",[228,9776,928],{"class":915},[228,9778,5360],{"class":252},[228,9780,916],{"class":915},[228,9782,7293],{"class":252},[228,9784,928],{"class":915},[228,9786,9787],{"class":252},"wi-stepper-head",[228,9789,928],{"class":915},[228,9791,5360],{"class":252},[228,9793,916],{"class":915},[228,9795,7307],{"class":252},[228,9797,928],{"class":915},[228,9799,9800],{"class":252},"wi-step-count",[228,9802,928],{"class":915},[228,9804,5360],{"class":252},[228,9806,916],{"class":915},[228,9808,9809],{"class":252},"          STEP {{ (currentIndex + 1) }} OF {{ steps.length }}",[228,9811,916],{"class":915},[228,9813,9649],{"class":252},[228,9815,916],{"class":915},[228,9817,7307],{"class":252},[228,9819,928],{"class":915},[228,9821,9822],{"class":252},"wi-step-percent",[228,9824,928],{"class":915},[228,9826,9827],{"class":252},">{{ progressPercent }}% COMPLETE\u003C\u002Fspan>",[228,9829,916],{"class":915},[228,9831,7336],{"class":252},[228,9833,916],{"class":915},[228,9835,9836],{"class":252},"      \u003Cv-progress-linear :model-value=",[228,9838,928],{"class":915},[228,9840,9841],{"class":252},"progressPercent",[228,9843,928],{"class":915},[228,9845,8124],{"class":252},[228,9847,928],{"class":915},[228,9849,8129],{"class":252},[228,9851,928],{"class":915},[228,9853,9854],{"class":252}," height=",[228,9856,928],{"class":915},[228,9858,9859],{"class":252},"8",[228,9861,928],{"class":915},[228,9863,9864],{"class":252}," rounded>\u003C\u002Fv-progress-linear>",[228,9866,916],{"class":915},[228,9868,9869],{"class":252},"    \u003C\u002Fv-card>",[228,9871,922],{"class":915},[228,9873,9874],{"class":252},"    \u003C!-- Main instruction pane: image left, instruction + checklist right -->",[228,9876,916],{"class":915},[228,9878,9769],{"class":252},[228,9880,928],{"class":915},[228,9882,9883],{"class":252},"wi-card wi-card-instruction",[228,9885,928],{"class":915},[228,9887,5360],{"class":252},[228,9889,916],{"class":915},[228,9891,7293],{"class":252},[228,9893,928],{"class":915},[228,9895,9896],{"class":252},"wi-instruction-flex",[228,9898,928],{"class":915},[228,9900,5360],{"class":252},[228,9902,916],{"class":915},[228,9904,9905],{"class":252},"        \u003C!-- Reference image (left) -->",[228,9907,916],{"class":915},[228,9909,9670],{"class":252},[228,9911,928],{"class":915},[228,9913,9914],{"class":252},"wi-img-col",[228,9916,928],{"class":915},[228,9918,5360],{"class":252},[228,9920,916],{"class":915},[228,9922,7498],{"class":252},[228,9924,928],{"class":915},[228,9926,9927],{"class":252},"wi-image-wrap",[228,9929,928],{"class":915},[228,9931,5360],{"class":252},[228,9933,916],{"class":915},[228,9935,9936],{"class":252},"            \u003Cimg",[228,9938,916],{"class":915},[228,9940,9941],{"class":252},"              :src=",[228,9943,928],{"class":915},[228,9945,9946],{"class":252},"stepImage",[228,9948,987],{"class":915},[228,9950,9951],{"class":252},"              :alt=",[228,9953,928],{"class":915},[228,9955,9956],{"class":252},"currentStep?.title",[228,9958,987],{"class":915},[228,9960,9961],{"class":252},"              class=",[228,9963,928],{"class":915},[228,9965,9966],{"class":252},"wi-image",[228,9968,987],{"class":915},[228,9970,9971],{"class":252},"              @error=",[228,9973,928],{"class":915},[228,9975,9976],{"class":252},"onImageError",[228,9978,987],{"class":915},[228,9980,9981],{"class":252},"            \u002F>",[228,9983,916],{"class":915},[228,9985,7541],{"class":252},[228,9987,916],{"class":915},[228,9989,9751],{"class":252},[228,9991,922],{"class":915},[228,9993,9994],{"class":252},"        \u003C!-- Instruction + checklist (right) -->",[228,9996,916],{"class":915},[228,9998,9670],{"class":252},[228,10000,928],{"class":915},[228,10002,10003],{"class":252},"wi-text-col",[228,10005,928],{"class":915},[228,10007,5360],{"class":252},[228,10009,916],{"class":915},[228,10011,7498],{"class":252},[228,10013,928],{"class":915},[228,10015,7503],{"class":252},[228,10017,928],{"class":915},[228,10019,5360],{"class":252},[228,10021,916],{"class":915},[228,10023,7512],{"class":252},[228,10025,928],{"class":915},[228,10027,7591],{"class":252},[228,10029,928],{"class":915},[228,10031,7522],{"class":252},[228,10033,928],{"class":915},[228,10035,10036],{"class":252},"20",[228,10038,928],{"class":915},[228,10040,7408],{"class":252},[228,10042,916],{"class":915},[228,10044,10045],{"class":252},"            \u003Cspan>INSTRUCTION\u003C\u002Fspan>",[228,10047,916],{"class":915},[228,10049,7541],{"class":252},[228,10051,916],{"class":915},[228,10053,7498],{"class":252},[228,10055,928],{"class":915},[228,10057,10058],{"class":252},"wi-step-title",[228,10060,928],{"class":915},[228,10062,10063],{"class":252},">{{ currentStep?.title ?? '—' }}\u003C\u002Fdiv>",[228,10065,916],{"class":915},[228,10067,10068],{"class":252},"          \u003Cp class=",[228,10070,928],{"class":915},[228,10072,10073],{"class":252},"wi-step-instruction",[228,10075,928],{"class":915},[228,10077,10078],{"class":252},">{{ currentStep?.instruction ?? '' }}\u003C\u002Fp>",[228,10080,922],{"class":915},[228,10082,7498],{"class":252},[228,10084,928],{"class":915},[228,10086,10087],{"class":252},"wi-card-head wi-checklist-head",[228,10089,928],{"class":915},[228,10091,5360],{"class":252},[228,10093,916],{"class":915},[228,10095,7512],{"class":252},[228,10097,928],{"class":915},[228,10099,10100],{"class":252},"mdi-format-list-checks",[228,10102,928],{"class":915},[228,10104,7522],{"class":252},[228,10106,928],{"class":915},[228,10108,10036],{"class":252},[228,10110,928],{"class":915},[228,10112,7408],{"class":252},[228,10114,916],{"class":915},[228,10116,10117],{"class":252},"            \u003Cspan>CHECKLIST\u003C\u002Fspan>",[228,10119,916],{"class":915},[228,10121,7541],{"class":252},[228,10123,916],{"class":915},[228,10125,7498],{"class":252},[228,10127,928],{"class":915},[228,10129,10130],{"class":252},"wi-checklist",[228,10132,928],{"class":915},[228,10134,5360],{"class":252},[228,10136,916],{"class":915},[228,10138,10139],{"class":252},"            \u003Clabel",[228,10141,916],{"class":915},[228,10143,10144],{"class":252},"              v-for=",[228,10146,928],{"class":915},[228,10148,10149],{"class":252},"(item, i) in (currentStep?.checklist ?? [])",[228,10151,987],{"class":915},[228,10153,10154],{"class":252},"              :key=",[228,10156,928],{"class":915},[228,10158,10159],{"class":252},"i",[228,10161,987],{"class":915},[228,10163,9961],{"class":252},[228,10165,928],{"class":915},[228,10167,10168],{"class":252},"wi-check-row",[228,10170,987],{"class":915},[228,10172,10173],{"class":252},"              :class=",[228,10175,928],{"class":915},[228,10177,10178],{"class":252},"{ 'wi-check-row-done': checkedState[i] }",[228,10180,987],{"class":915},[228,10182,10183],{"class":252},"            >",[228,10185,916],{"class":915},[228,10187,10188],{"class":252},"              \u003Cv-checkbox-btn",[228,10190,916],{"class":915},[228,10192,10193],{"class":252},"                :model-value=",[228,10195,928],{"class":915},[228,10197,10198],{"class":252},"checkedState[i]",[228,10200,987],{"class":915},[228,10202,10203],{"class":252},"                color=",[228,10205,928],{"class":915},[228,10207,8129],{"class":252},[228,10209,987],{"class":915},[228,10211,10212],{"class":252},"                density=",[228,10214,928],{"class":915},[228,10216,10217],{"class":252},"comfortable",[228,10219,987],{"class":915},[228,10221,10222],{"class":252},"                @update:model-value=",[228,10224,928],{"class":915},[228,10226,10227],{"class":252},"toggleCheck(i)",[228,10229,987],{"class":915},[228,10231,10232],{"class":252},"              >\u003C\u002Fv-checkbox-btn>",[228,10234,916],{"class":915},[228,10236,10237],{"class":252},"              \u003Cspan>{{ item }}\u003C\u002Fspan>",[228,10239,916],{"class":915},[228,10241,10242],{"class":252},"            \u003C\u002Flabel>",[228,10244,916],{"class":915},[228,10246,7541],{"class":252},[228,10248,916],{"class":915},[228,10250,9751],{"class":252},[228,10252,916],{"class":915},[228,10254,7336],{"class":252},[228,10256,916],{"class":915},[228,10258,9869],{"class":252},[228,10260,922],{"class":915},[228,10262,10263],{"class":252},"    \u003C!-- Controls -->",[228,10265,916],{"class":915},[228,10267,7432],{"class":252},[228,10269,928],{"class":915},[228,10271,10272],{"class":252},"wi-controls",[228,10274,928],{"class":915},[228,10276,5360],{"class":252},[228,10278,916],{"class":915},[228,10280,7451],{"class":252},[228,10282,928],{"class":915},[228,10284,7456],{"class":252},[228,10286,928],{"class":915},[228,10288,7901],{"class":252},[228,10290,928],{"class":915},[228,10292,10293],{"class":252},"3",[228,10295,928],{"class":915},[228,10297,7384],{"class":252},[228,10299,928],{"class":915},[228,10301,10302],{"class":252},"wi-ctrl-col",[228,10304,928],{"class":915},[228,10306,5360],{"class":252},[228,10308,916],{"class":915},[228,10310,10311],{"class":252},"        \u003Cv-btn block size=",[228,10313,928],{"class":915},[228,10315,8119],{"class":252},[228,10317,928],{"class":915},[228,10319,7364],{"class":252},[228,10321,928],{"class":915},[228,10323,10324],{"class":252},"outlined",[228,10326,928],{"class":915},[228,10328,8124],{"class":252},[228,10330,928],{"class":915},[228,10332,10333],{"class":252},"blue-grey-darken-1",[228,10335,928],{"class":915},[228,10337,7384],{"class":252},[228,10339,928],{"class":915},[228,10341,10342],{"class":252},"wi-nav-btn",[228,10344,987],{"class":915},[228,10346,10347],{"class":252},"          :disabled=",[228,10349,928],{"class":915},[228,10351,10352],{"class":252},"currentIndex === 0",[228,10354,928],{"class":915},[228,10356,10357],{"class":252}," @click=",[228,10359,928],{"class":915},[228,10361,10362],{"class":252},"prevStep",[228,10364,928],{"class":915},[228,10366,5360],{"class":252},[228,10368,916],{"class":915},[228,10370,7398],{"class":252},[228,10372,928],{"class":915},[228,10374,10375],{"class":252},"mdi-chevron-left",[228,10377,928],{"class":915},[228,10379,7522],{"class":252},[228,10381,928],{"class":915},[228,10383,10384],{"class":252},"30",[228,10386,928],{"class":915},[228,10388,7408],{"class":252},[228,10390,916],{"class":915},[228,10392,10393],{"class":252},"          PREVIOUS",[228,10395,916],{"class":915},[228,10397,10398],{"class":252},"        \u003C\u002Fv-btn>",[228,10400,916],{"class":915},[228,10402,7740],{"class":252},[228,10404,922],{"class":915},[228,10406,7451],{"class":252},[228,10408,928],{"class":915},[228,10410,7456],{"class":252},[228,10412,928],{"class":915},[228,10414,7901],{"class":252},[228,10416,928],{"class":915},[228,10418,10293],{"class":252},[228,10420,928],{"class":915},[228,10422,7384],{"class":252},[228,10424,928],{"class":915},[228,10426,10302],{"class":252},[228,10428,928],{"class":915},[228,10430,5360],{"class":252},[228,10432,916],{"class":915},[228,10434,10311],{"class":252},[228,10436,928],{"class":915},[228,10438,8119],{"class":252},[228,10440,928],{"class":915},[228,10442,7364],{"class":252},[228,10444,928],{"class":915},[228,10446,7369],{"class":252},[228,10448,928],{"class":915},[228,10450,8124],{"class":252},[228,10452,928],{"class":915},[228,10454,10455],{"class":252},"red-darken-1",[228,10457,928],{"class":915},[228,10459,7384],{"class":252},[228,10461,928],{"class":915},[228,10463,10342],{"class":252},[228,10465,928],{"class":915},[228,10467,10357],{"class":252},[228,10469,928],{"class":915},[228,10471,10472],{"class":252},"reportDefect",[228,10474,928],{"class":915},[228,10476,5360],{"class":252},[228,10478,916],{"class":915},[228,10480,7398],{"class":252},[228,10482,928],{"class":915},[228,10484,10485],{"class":252},"mdi-alert-octagon-outline",[228,10487,928],{"class":915},[228,10489,7522],{"class":252},[228,10491,928],{"class":915},[228,10493,10494],{"class":252},"28",[228,10496,928],{"class":915},[228,10498,7408],{"class":252},[228,10500,916],{"class":915},[228,10502,10503],{"class":252},"          REPORT ISSUE",[228,10505,916],{"class":915},[228,10507,10398],{"class":252},[228,10509,916],{"class":915},[228,10511,7740],{"class":252},[228,10513,922],{"class":915},[228,10515,7451],{"class":252},[228,10517,928],{"class":915},[228,10519,7456],{"class":252},[228,10521,928],{"class":915},[228,10523,7901],{"class":252},[228,10525,928],{"class":915},[228,10527,10528],{"class":252},"6",[228,10530,928],{"class":915},[228,10532,7384],{"class":252},[228,10534,928],{"class":915},[228,10536,10302],{"class":252},[228,10538,928],{"class":915},[228,10540,5360],{"class":252},[228,10542,916],{"class":915},[228,10544,10311],{"class":252},[228,10546,928],{"class":915},[228,10548,8119],{"class":252},[228,10550,928],{"class":915},[228,10552,7364],{"class":252},[228,10554,928],{"class":915},[228,10556,7369],{"class":252},[228,10558,928],{"class":915},[228,10560,10561],{"class":252}," :color=",[228,10563,928],{"class":915},[228,10565,10566],{"class":252},"isLastStep ? 'green-darken-2' : 'green-darken-1'",[228,10568,987],{"class":915},[228,10570,10571],{"class":252},"          class=",[228,10573,928],{"class":915},[228,10575,10576],{"class":252},"wi-nav-btn wi-next-btn",[228,10578,928],{"class":915},[228,10580,8143],{"class":252},[228,10582,928],{"class":915},[228,10584,10585],{"class":252},"!allChecked",[228,10587,928],{"class":915},[228,10589,10357],{"class":252},[228,10591,928],{"class":915},[228,10593,10594],{"class":252},"nextStep",[228,10596,928],{"class":915},[228,10598,5360],{"class":252},[228,10600,916],{"class":915},[228,10602,10603],{"class":252},"          \u003Cv-icon start :icon=",[228,10605,928],{"class":915},[228,10607,10608],{"class":252},"isLastStep ? 'mdi-check-circle' : 'mdi-chevron-right'",[228,10610,928],{"class":915},[228,10612,7522],{"class":252},[228,10614,928],{"class":915},[228,10616,10384],{"class":252},[228,10618,928],{"class":915},[228,10620,7408],{"class":252},[228,10622,916],{"class":915},[228,10624,10625],{"class":252},"          {{ isLastStep ? 'COMPLETE OPERATION' : 'NEXT STEP' }}",[228,10627,916],{"class":915},[228,10629,10398],{"class":252},[228,10631,916],{"class":915},[228,10633,7740],{"class":252},[228,10635,916],{"class":915},[228,10637,8104],{"class":252},[228,10639,922],{"class":915},[228,10641,10642],{"class":252},"    \u003Cdiv v-if=",[228,10644,928],{"class":915},[228,10646,10585],{"class":252},[228,10648,928],{"class":915},[228,10650,7384],{"class":252},[228,10652,928],{"class":915},[228,10654,10655],{"class":252},"wi-hint",[228,10657,928],{"class":915},[228,10659,5360],{"class":252},[228,10661,916],{"class":915},[228,10663,10664],{"class":252},"      \u003Cv-icon icon=",[228,10666,928],{"class":915},[228,10668,10669],{"class":252},"mdi-information-outline",[228,10671,928],{"class":915},[228,10673,7522],{"class":252},[228,10675,928],{"class":915},[228,10677,8054],{"class":252},[228,10679,928],{"class":915},[228,10681,7408],{"class":252},[228,10683,916],{"class":915},[228,10685,10686],{"class":252},"      Complete all checklist items to continue.",[228,10688,916],{"class":915},[228,10690,7427],{"class":252},[228,10692,916],{"class":915},[228,10694,8200],{"class":252},[228,10696,916],{"class":915},[228,10698,8205],{"class":252},[228,10700,922],{"class":915},[228,10702,8210],{"class":252},[228,10704,916],{"class":915},[228,10706,8215],{"class":252},[228,10708,916],{"class":915},[228,10710,10711],{"class":252},"  data () {",[228,10713,916],{"class":915},[228,10715,10716],{"class":252},"    return {",[228,10718,916],{"class":915},[228,10720,10721],{"class":252},"      currentIndex: 0,",[228,10723,916],{"class":915},[228,10725,10726],{"class":252},"      checked: {},",[228,10728,916],{"class":915},[228,10730,10731],{"class":252},"      assetBase: '\u002Fassets\u002F',",[228,10733,916],{"class":915},[228,10735,10736],{"class":252},"      placeholder: 'https:\u002F\u002Fplacehold.co\u002F800x600\u002Feef2f7\u002F475569?text=Step+Reference',",[228,10738,916],{"class":915},[228,10740,10741],{"class":252},"      instruction: null",[228,10743,916],{"class":915},[228,10745,3695],{"class":252},[228,10747,916],{"class":915},[228,10749,10750],{"class":252},"  },",[228,10752,916],{"class":915},[228,10754,8220],{"class":252},[228,10756,916],{"class":915},[228,10758,10759],{"class":252},"    payload () {",[228,10761,916],{"class":915},[228,10763,10764],{"class":252},"      return this.instruction ?? {}",[228,10766,916],{"class":915},[228,10768,3472],{"class":252},[228,10770,916],{"class":915},[228,10772,10773],{"class":252},"    steps () {",[228,10775,916],{"class":915},[228,10777,10778],{"class":252},"      return this.instruction?.steps ?? []",[228,10780,916],{"class":915},[228,10782,3472],{"class":252},[228,10784,916],{"class":915},[228,10786,10787],{"class":252},"    currentStep () {",[228,10789,916],{"class":915},[228,10791,10792],{"class":252},"      return this.steps[this.currentIndex] ?? null",[228,10794,916],{"class":915},[228,10796,3472],{"class":252},[228,10798,916],{"class":915},[228,10800,10801],{"class":252},"    isLastStep () {",[228,10803,916],{"class":915},[228,10805,10806],{"class":252},"      return this.currentIndex === this.steps.length - 1",[228,10808,916],{"class":915},[228,10810,3472],{"class":252},[228,10812,916],{"class":915},[228,10814,10815],{"class":252},"    progressPercent () {",[228,10817,916],{"class":915},[228,10819,10820],{"class":252},"      if (!this.steps.length) return 0",[228,10822,916],{"class":915},[228,10824,10825],{"class":252},"      return Math.round((this.currentIndex \u002F this.steps.length) * 100)",[228,10827,916],{"class":915},[228,10829,3472],{"class":252},[228,10831,916],{"class":915},[228,10833,10834],{"class":252},"    checkedState () {",[228,10836,916],{"class":915},[228,10838,10839],{"class":252},"      return this.checked[this.currentIndex] ?? []",[228,10841,916],{"class":915},[228,10843,3472],{"class":252},[228,10845,916],{"class":915},[228,10847,10848],{"class":252},"    allChecked () {",[228,10850,916],{"class":915},[228,10852,10853],{"class":252},"      const list = this.currentStep?.checklist ?? []",[228,10855,916],{"class":915},[228,10857,10858],{"class":252},"      if (!list.length) return true",[228,10860,916],{"class":915},[228,10862,10863],{"class":252},"      const state = this.checkedState",[228,10865,916],{"class":915},[228,10867,10868],{"class":252},"      return list.every((_, i) => state[i])",[228,10870,916],{"class":915},[228,10872,3472],{"class":252},[228,10874,916],{"class":915},[228,10876,10877],{"class":252},"    stepImage () {",[228,10879,916],{"class":915},[228,10881,10882],{"class":252},"      return this.resolveImage(this.currentStep?.image)",[228,10884,916],{"class":915},[228,10886,3695],{"class":252},[228,10888,916],{"class":915},[228,10890,10750],{"class":252},[228,10892,916],{"class":915},[228,10894,10895],{"class":252},"  methods: {",[228,10897,916],{"class":915},[228,10899,10900],{"class":252},"    resolveImage (img) {",[228,10902,916],{"class":915},[228,10904,10905],{"class":252},"      if (!img) return this.placeholder",[228,10907,916],{"class":915},[228,10909,10910],{"class":252},"      if (\u002F^https?:",[228,10912,10913],{"class":915},"\\\\",[228,10915,10916],{"class":252},"\u002F",[228,10918,10913],{"class":915},[228,10920,10921],{"class":252},"\u002F\u002F.test(img) || img.startsWith('\u002F')) return img",[228,10923,916],{"class":915},[228,10925,10926],{"class":252},"      return this.assetBase + img",[228,10928,916],{"class":915},[228,10930,3472],{"class":252},[228,10932,916],{"class":915},[228,10934,10935],{"class":252},"    preloadImages () {",[228,10937,916],{"class":915},[228,10939,10940],{"class":252},"      for (const step of this.steps) {",[228,10942,916],{"class":915},[228,10944,10945],{"class":252},"        const url = this.resolveImage(step?.image)",[228,10947,916],{"class":915},[228,10949,10950],{"class":252},"        if (url && url !== this.placeholder) {",[228,10952,916],{"class":915},[228,10954,10955],{"class":252},"          const im = new Image()",[228,10957,916],{"class":915},[228,10959,10960],{"class":252},"          im.src = url",[228,10962,916],{"class":915},[228,10964,4056],{"class":252},[228,10966,916],{"class":915},[228,10968,10969],{"class":252},"      }",[228,10971,916],{"class":915},[228,10973,3472],{"class":252},[228,10975,916],{"class":915},[228,10977,10978],{"class":252},"    saveStep () {",[228,10980,916],{"class":915},[228,10982,10983],{"class":252},"      this.send({",[228,10985,916],{"class":915},[228,10987,10988],{"class":252},"        payload: {",[228,10990,916],{"class":915},[228,10992,10993],{"class":252},"          action: 'save_step',",[228,10995,916],{"class":915},[228,10997,10998],{"class":252},"          stepIndex: this.currentIndex,",[228,11000,916],{"class":915},[228,11002,11003],{"class":252},"          stepName: this.currentStep?.title ?? null,",[228,11005,916],{"class":915},[228,11007,11008],{"class":252},"          stepId: this.currentStep?.stepId ?? null",[228,11010,916],{"class":915},[228,11012,4056],{"class":252},[228,11014,916],{"class":915},[228,11016,11017],{"class":252},"      })",[228,11019,916],{"class":915},[228,11021,3472],{"class":252},[228,11023,916],{"class":915},[228,11025,11026],{"class":252},"    toggleCheck (i) {",[228,11028,916],{"class":915},[228,11030,11031],{"class":252},"      const arr = (this.checked[this.currentIndex] ?? []).slice()",[228,11033,916],{"class":915},[228,11035,11036],{"class":252},"      arr[i] = !arr[i]",[228,11038,916],{"class":915},[228,11040,11041],{"class":252},"      this.checked = { ...this.checked, [this.currentIndex]: arr }",[228,11043,916],{"class":915},[228,11045,3472],{"class":252},[228,11047,916],{"class":915},[228,11049,11050],{"class":252},"    onImageError (e) {",[228,11052,916],{"class":915},[228,11054,11055],{"class":252},"      if (e?.target && e.target.src !== this.placeholder) {",[228,11057,916],{"class":915},[228,11059,11060],{"class":252},"        e.target.src = this.placeholder",[228,11062,916],{"class":915},[228,11064,10969],{"class":252},[228,11066,916],{"class":915},[228,11068,3472],{"class":252},[228,11070,916],{"class":915},[228,11072,11073],{"class":252},"    goToStep (i) {",[228,11075,916],{"class":915},[228,11077,11078],{"class":252},"      const max = this.steps.length - 1",[228,11080,916],{"class":915},[228,11082,11083],{"class":252},"      this.currentIndex = Math.min(Math.max(i, 0), Math.max(max, 0))",[228,11085,916],{"class":915},[228,11087,11088],{"class":252},"      this.saveStep()",[228,11090,916],{"class":915},[228,11092,3472],{"class":252},[228,11094,916],{"class":915},[228,11096,11097],{"class":252},"    nextStep () {",[228,11099,916],{"class":915},[228,11101,11102],{"class":252},"      if (this.isLastStep) {",[228,11104,916],{"class":915},[228,11106,11107],{"class":252},"        this.send({ payload: { action: 'complete_operation', stepIndex: this.currentIndex } })",[228,11109,916],{"class":915},[228,11111,5445],{"class":252},[228,11113,916],{"class":915},[228,11115,10969],{"class":252},[228,11117,916],{"class":915},[228,11119,11120],{"class":252},"      this.goToStep(this.currentIndex + 1)",[228,11122,916],{"class":915},[228,11124,3472],{"class":252},[228,11126,916],{"class":915},[228,11128,11129],{"class":252},"    prevStep () {",[228,11131,916],{"class":915},[228,11133,11134],{"class":252},"      if (this.currentIndex === 0) return",[228,11136,916],{"class":915},[228,11138,11139],{"class":252},"      this.goToStep(this.currentIndex - 1)",[228,11141,916],{"class":915},[228,11143,3472],{"class":252},[228,11145,916],{"class":915},[228,11147,11148],{"class":252},"    reportDefect () {",[228,11150,916],{"class":915},[228,11152,10983],{"class":252},[228,11154,916],{"class":915},[228,11156,10988],{"class":252},[228,11158,916],{"class":915},[228,11160,11161],{"class":252},"          action: 'Report Issue',",[228,11163,916],{"class":915},[228,11165,4056],{"class":252},[228,11167,916],{"class":915},[228,11169,11017],{"class":252},[228,11171,916],{"class":915},[228,11173,3695],{"class":252},[228,11175,916],{"class":915},[228,11177,10750],{"class":252},[228,11179,916],{"class":915},[228,11181,11182],{"class":252},"  watch: {",[228,11184,916],{"class":915},[228,11186,11187],{"class":252},"    msg: {",[228,11189,916],{"class":915},[228,11191,11192],{"class":252},"      immediate: true,",[228,11194,916],{"class":915},[228,11196,11197],{"class":252},"      handler (m) {",[228,11199,916],{"class":915},[228,11201,11202],{"class":252},"        const pl = m?.payload",[228,11204,916],{"class":915},[228,11206,11207],{"class":252},"        if (!pl) return",[228,11209,916],{"class":915},[228,11211,11212],{"class":252},"        if (Array.isArray(pl.steps)) {",[228,11214,916],{"class":915},[228,11216,11217],{"class":252},"          \u002F\u002F Instruction-set data: cache it so later messages can't wipe it.",[228,11219,916],{"class":915},[228,11221,11222],{"class":252},"          this.instruction = pl",[228,11224,916],{"class":915},[228,11226,11227],{"class":252},"          \u002F\u002F Preload every step image so navigation is instant.",[228,11229,916],{"class":915},[228,11231,11232],{"class":252},"          this.$nextTick(() => this.preloadImages())",[228,11234,916],{"class":915},[228,11236,11237],{"class":252},"        } else if (typeof pl.stepIndex === 'number') {",[228,11239,916],{"class":915},[228,11241,11242],{"class":252},"          \u002F\u002F Resume reply from the tracker: jump to the saved step.",[228,11244,916],{"class":915},[228,11246,11247],{"class":252},"          this.currentIndex = Math.min(",[228,11249,916],{"class":915},[228,11251,11252],{"class":252},"            Math.max(pl.stepIndex, 0),",[228,11254,916],{"class":915},[228,11256,11257],{"class":252},"            Math.max(this.steps.length - 1, 0)",[228,11259,916],{"class":915},[228,11261,11262],{"class":252},"          )",[228,11264,916],{"class":915},[228,11266,4056],{"class":252},[228,11268,916],{"class":915},[228,11270,10969],{"class":252},[228,11272,916],{"class":915},[228,11274,3695],{"class":252},[228,11276,916],{"class":915},[228,11278,10750],{"class":252},[228,11280,916],{"class":915},[228,11282,11283],{"class":252},"  mounted () {",[228,11285,916],{"class":915},[228,11287,11288],{"class":252},"    \u002F\u002F Ask the tracker which step this work order was left on.",[228,11290,916],{"class":915},[228,11292,11293],{"class":252},"    this.send({ payload: { action: 'load_step' } })",[228,11295,916],{"class":915},[228,11297,8254],{"class":252},[228,11299,916],{"class":915},[228,11301,1575],{"class":252},[228,11303,916],{"class":915},[228,11305,8263],{"class":252},[228,11307,922],{"class":915},[228,11309,8268],{"class":252},[228,11311,916],{"class":915},[228,11313,8273],{"class":252},[228,11315,916],{"class":915},[228,11317,8278],{"class":252},[228,11319,916],{"class":915},[228,11321,8283],{"class":252},[228,11323,916],{"class":915},[228,11325,11326],{"class":252},"    padding: 2px;",[228,11328,916],{"class":915},[228,11330,8254],{"class":252},[228,11332,922],{"class":915},[228,11334,11335],{"class":252},"  \u002F* Header *\u002F",[228,11337,916],{"class":915},[228,11339,8297],{"class":252},[228,11341,916],{"class":915},[228,11343,8302],{"class":252},[228,11345,916],{"class":915},[228,11347,8307],{"class":252},[228,11349,916],{"class":915},[228,11351,8312],{"class":252},[228,11353,916],{"class":915},[228,11355,8317],{"class":252},[228,11357,916],{"class":915},[228,11359,8322],{"class":252},[228,11361,916],{"class":915},[228,11363,8327],{"class":252},[228,11365,916],{"class":915},[228,11367,8332],{"class":252},[228,11369,916],{"class":915},[228,11371,8337],{"class":252},[228,11373,916],{"class":915},[228,11375,8342],{"class":252},[228,11377,916],{"class":915},[228,11379,11380],{"class":252},"    padding: 10px 16px;",[228,11382,916],{"class":915},[228,11384,11385],{"class":252},"    margin-bottom: 10px;",[228,11387,916],{"class":915},[228,11389,8254],{"class":252},[228,11391,922],{"class":915},[228,11393,8361],{"class":252},[228,11395,916],{"class":915},[228,11397,8302],{"class":252},[228,11399,916],{"class":915},[228,11401,8370],{"class":252},[228,11403,916],{"class":915},[228,11405,11406],{"class":252},"    line-height: 1.15;",[228,11408,916],{"class":915},[228,11410,8254],{"class":252},[228,11412,922],{"class":915},[228,11414,11415],{"class":252},"  .wi-op-label {",[228,11417,916],{"class":915},[228,11419,8758],{"class":252},[228,11421,916],{"class":915},[228,11423,8394],{"class":252},[228,11425,916],{"class":915},[228,11427,8399],{"class":252},[228,11429,916],{"class":915},[228,11431,8404],{"class":252},[228,11433,916],{"class":915},[228,11435,8254],{"class":252},[228,11437,922],{"class":915},[228,11439,11440],{"class":252},"  .wi-op-name {",[228,11442,916],{"class":915},[228,11444,11445],{"class":252},"    font-size: 21px;",[228,11447,916],{"class":915},[228,11449,8423],{"class":252},[228,11451,916],{"class":915},[228,11453,8428],{"class":252},[228,11455,916],{"class":915},[228,11457,8254],{"class":252},[228,11459,922],{"class":915},[228,11461,11462],{"class":252},"  .wi-op-sub {",[228,11464,916],{"class":915},[228,11466,8389],{"class":252},[228,11468,916],{"class":915},[228,11470,11471],{"class":252},"    color: #94a3b8;",[228,11473,916],{"class":915},[228,11475,8843],{"class":252},[228,11477,916],{"class":915},[228,11479,11480],{"class":252},"    margin-top: 2px;",[228,11482,916],{"class":915},[228,11484,8254],{"class":252},[228,11486,922],{"class":915},[228,11488,11489],{"class":252},"  .wi-timer {",[228,11491,916],{"class":915},[228,11493,8302],{"class":252},[228,11495,916],{"class":915},[228,11497,8307],{"class":252},[228,11499,916],{"class":915},[228,11501,8451],{"class":252},[228,11503,916],{"class":915},[228,11505,11506],{"class":252},"    padding: 8px 14px;",[228,11508,916],{"class":915},[228,11510,8342],{"class":252},[228,11512,916],{"class":915},[228,11514,8712],{"class":252},[228,11516,916],{"class":915},[228,11518,8428],{"class":252},[228,11520,916],{"class":915},[228,11522,8254],{"class":252},[228,11524,922],{"class":915},[228,11526,11527],{"class":252},"  .wi-timer-text {",[228,11529,916],{"class":915},[228,11531,8302],{"class":252},[228,11533,916],{"class":915},[228,11535,8370],{"class":252},[228,11537,916],{"class":915},[228,11539,8375],{"class":252},[228,11541,916],{"class":915},[228,11543,8254],{"class":252},[228,11545,922],{"class":915},[228,11547,11548],{"class":252},"  .wi-timer-label {",[228,11550,916],{"class":915},[228,11552,11553],{"class":252},"    font-size: 10px;",[228,11555,916],{"class":915},[228,11557,8763],{"class":252},[228,11559,916],{"class":915},[228,11561,8404],{"class":252},[228,11563,916],{"class":915},[228,11565,11566],{"class":252},"    opacity: 0.75;",[228,11568,916],{"class":915},[228,11570,8254],{"class":252},[228,11572,922],{"class":915},[228,11574,11575],{"class":252},"  .wi-timer-value {",[228,11577,916],{"class":915},[228,11579,8932],{"class":252},[228,11581,916],{"class":915},[228,11583,8423],{"class":252},[228,11585,916],{"class":915},[228,11587,8433],{"class":252},[228,11589,916],{"class":915},[228,11591,8254],{"class":252},[228,11593,922],{"class":915},[228,11595,11596],{"class":252},"  \u002F* Cards *\u002F",[228,11598,916],{"class":915},[228,11600,8511],{"class":252},[228,11602,916],{"class":915},[228,11604,8516],{"class":252},[228,11606,916],{"class":915},[228,11608,8521],{"class":252},[228,11610,916],{"class":915},[228,11612,8526],{"class":252},[228,11614,916],{"class":915},[228,11616,11617],{"class":252},"    padding: 14px 18px !important;",[228,11619,916],{"class":915},[228,11621,8536],{"class":252},[228,11623,916],{"class":915},[228,11625,11626],{"class":252},"    box-sizing: border-box;",[228,11628,916],{"class":915},[228,11630,8254],{"class":252},[228,11632,922],{"class":915},[228,11634,8573],{"class":252},[228,11636,916],{"class":915},[228,11638,8302],{"class":252},[228,11640,916],{"class":915},[228,11642,8307],{"class":252},[228,11644,916],{"class":915},[228,11646,8586],{"class":252},[228,11648,916],{"class":915},[228,11650,8591],{"class":252},[228,11652,916],{"class":915},[228,11654,8394],{"class":252},[228,11656,916],{"class":915},[228,11658,8423],{"class":252},[228,11660,916],{"class":915},[228,11662,8399],{"class":252},[228,11664,916],{"class":915},[228,11666,11667],{"class":252},"    margin-bottom: 8px;",[228,11669,916],{"class":915},[228,11671,8254],{"class":252},[228,11673,922],{"class":915},[228,11675,11676],{"class":252},"  \u002F* Stepper (compact) *\u002F",[228,11678,916],{"class":915},[228,11680,11681],{"class":252},"  .wi-stepper-card {",[228,11683,916],{"class":915},[228,11685,11385],{"class":252},[228,11687,916],{"class":915},[228,11689,11380],{"class":252},[228,11691,916],{"class":915},[228,11693,8254],{"class":252},[228,11695,922],{"class":915},[228,11697,11698],{"class":252},"  .wi-stepper-head {",[228,11700,916],{"class":915},[228,11702,8302],{"class":252},[228,11704,916],{"class":915},[228,11706,8312],{"class":252},[228,11708,916],{"class":915},[228,11710,11711],{"class":252},"    align-items: baseline;",[228,11713,916],{"class":915},[228,11715,11667],{"class":252},[228,11717,916],{"class":915},[228,11719,8254],{"class":252},[228,11721,922],{"class":915},[228,11723,11724],{"class":252},"  .wi-step-count {",[228,11726,916],{"class":915},[228,11728,11729],{"class":252},"    font-size: 14px;",[228,11731,916],{"class":915},[228,11733,8423],{"class":252},[228,11735,916],{"class":915},[228,11737,8976],{"class":252},[228,11739,916],{"class":915},[228,11741,8428],{"class":252},[228,11743,916],{"class":915},[228,11745,8254],{"class":252},[228,11747,922],{"class":915},[228,11749,11750],{"class":252},"  .wi-step-percent {",[228,11752,916],{"class":915},[228,11754,8389],{"class":252},[228,11756,916],{"class":915},[228,11758,8404],{"class":252},[228,11760,916],{"class":915},[228,11762,8976],{"class":252},[228,11764,916],{"class":915},[228,11766,8399],{"class":252},[228,11768,916],{"class":915},[228,11770,8254],{"class":252},[228,11772,922],{"class":915},[228,11774,11775],{"class":252},"  \u002F* Instruction card *\u002F",[228,11777,916],{"class":915},[228,11779,11780],{"class":252},"  .wi-card-instruction {",[228,11782,916],{"class":915},[228,11784,11785],{"class":252},"    border-left: 5px solid #5e35b1 !important;",[228,11787,916],{"class":915},[228,11789,11790],{"class":252},"    padding: 16px 20px !important;",[228,11792,916],{"class":915},[228,11794,11626],{"class":252},[228,11796,916],{"class":915},[228,11798,8254],{"class":252},[228,11800,922],{"class":915},[228,11802,11803],{"class":252},"  \u002F* Desktop: keep the instruction card a consistent size across every step,",[228,11805,916],{"class":915},[228,11807,11808],{"class":252},"     so navigating between steps does not make the layout jump. The card",[228,11810,916],{"class":915},[228,11812,11813],{"class":252},"     still grows taller when the reference image needs more room. *\u002F",[228,11815,916],{"class":915},[228,11817,11818],{"class":252},"  @media (min-width: 701px) {",[228,11820,916],{"class":915},[228,11822,11823],{"class":252},"    .wi-card-instruction {",[228,11825,916],{"class":915},[228,11827,11828],{"class":252},"      min-height: 360px;",[228,11830,916],{"class":915},[228,11832,3695],{"class":252},[228,11834,916],{"class":915},[228,11836,8254],{"class":252},[228,11838,922],{"class":915},[228,11840,11841],{"class":252},"  .wi-step-title {",[228,11843,916],{"class":915},[228,11845,11846],{"class":252},"    font-size: 19px;",[228,11848,916],{"class":915},[228,11850,8423],{"class":252},[228,11852,916],{"class":915},[228,11854,8428],{"class":252},[228,11856,916],{"class":915},[228,11858,8608],{"class":252},[228,11860,916],{"class":915},[228,11862,11406],{"class":252},[228,11864,916],{"class":915},[228,11866,8254],{"class":252},[228,11868,922],{"class":915},[228,11870,11871],{"class":252},"  .wi-step-instruction {",[228,11873,916],{"class":915},[228,11875,11876],{"class":252},"    font-size: 15px;",[228,11878,916],{"class":915},[228,11880,11881],{"class":252},"    line-height: 1.55;",[228,11883,916],{"class":915},[228,11885,11886],{"class":252},"    color: #334155;",[228,11888,916],{"class":915},[228,11890,11891],{"class":252},"    margin: 0 0 16px;",[228,11893,916],{"class":915},[228,11895,8254],{"class":252},[228,11897,922],{"class":915},[228,11899,11900],{"class":252},"  .wi-checklist-head {",[228,11902,916],{"class":915},[228,11904,11905],{"class":252},"    margin-top: 6px;",[228,11907,916],{"class":915},[228,11909,11910],{"class":252},"    padding-top: 12px;",[228,11912,916],{"class":915},[228,11914,11915],{"class":252},"    border-top: 1px solid #edf2f7;",[228,11917,916],{"class":915},[228,11919,8254],{"class":252},[228,11921,922],{"class":915},[228,11923,11924],{"class":252},"  .wi-checklist {",[228,11926,916],{"class":915},[228,11928,8302],{"class":252},[228,11930,916],{"class":915},[228,11932,8370],{"class":252},[228,11934,916],{"class":915},[228,11936,11937],{"class":252},"    gap: 4px;",[228,11939,916],{"class":915},[228,11941,8254],{"class":252},[228,11943,922],{"class":915},[228,11945,11946],{"class":252},"  .wi-check-row {",[228,11948,916],{"class":915},[228,11950,8302],{"class":252},[228,11952,916],{"class":915},[228,11954,8307],{"class":252},[228,11956,916],{"class":915},[228,11958,11959],{"class":252},"    justify-content: flex-start;",[228,11961,916],{"class":915},[228,11963,8451],{"class":252},[228,11965,916],{"class":915},[228,11967,11968],{"class":252},"    padding: 6px 4px;",[228,11970,916],{"class":915},[228,11972,8717],{"class":252},[228,11974,916],{"class":915},[228,11976,11876],{"class":252},[228,11978,916],{"class":915},[228,11980,8843],{"class":252},[228,11982,916],{"class":915},[228,11984,8283],{"class":252},[228,11986,916],{"class":915},[228,11988,11989],{"class":252},"    cursor: pointer;",[228,11991,916],{"class":915},[228,11993,8254],{"class":252},[228,11995,922],{"class":915},[228,11997,11998],{"class":252},"  .wi-check-row>span {",[228,12000,916],{"class":915},[228,12002,12003],{"class":252},"    flex: 1;",[228,12005,916],{"class":915},[228,12007,12008],{"class":252},"    line-height: 1.35;",[228,12010,916],{"class":915},[228,12012,8254],{"class":252},[228,12014,922],{"class":915},[228,12016,12017],{"class":252},"  .wi-check-row .v-selection-control {",[228,12019,916],{"class":915},[228,12021,12022],{"class":252},"    flex: none;",[228,12024,916],{"class":915},[228,12026,12027],{"class":252},"    min-width: 0;",[228,12029,916],{"class":915},[228,12031,8254],{"class":252},[228,12033,922],{"class":915},[228,12035,12036],{"class":252},"  .wi-check-row-done>span {",[228,12038,916],{"class":915},[228,12040,11471],{"class":252},[228,12042,916],{"class":915},[228,12044,8254],{"class":252},[228,12046,922],{"class":915},[228,12048,12049],{"class":252},"  \u002F* Instruction two-column layout (plain flexbox, no Vuetify grid) *\u002F",[228,12051,916],{"class":915},[228,12053,12054],{"class":252},"  .wi-instruction-flex {",[228,12056,916],{"class":915},[228,12058,8302],{"class":252},[228,12060,916],{"class":915},[228,12062,12063],{"class":252},"    gap: 20px;",[228,12065,916],{"class":915},[228,12067,12068],{"class":252},"    align-items: stretch;",[228,12070,916],{"class":915},[228,12072,12073],{"class":252},"    width: 100%;",[228,12075,916],{"class":915},[228,12077,8536],{"class":252},[228,12079,916],{"class":915},[228,12081,8254],{"class":252},[228,12083,922],{"class":915},[228,12085,12086],{"class":252},"  .wi-img-col {",[228,12088,916],{"class":915},[228,12090,12091],{"class":252},"    flex: 0 0 40%;",[228,12093,916],{"class":915},[228,12095,8302],{"class":252},[228,12097,916],{"class":915},[228,12099,12027],{"class":252},[228,12101,916],{"class":915},[228,12103,8254],{"class":252},[228,12105,922],{"class":915},[228,12107,12108],{"class":252},"  .wi-text-col {",[228,12110,916],{"class":915},[228,12112,12113],{"class":252},"    flex: 1 1 60%;",[228,12115,916],{"class":915},[228,12117,12118],{"class":252},"    padding-top: 4px;",[228,12120,916],{"class":915},[228,12122,12027],{"class":252},[228,12124,916],{"class":915},[228,12126,8254],{"class":252},[228,12128,922],{"class":915},[228,12130,12131],{"class":252},"  \u002F* Reference image (left) *\u002F",[228,12133,916],{"class":915},[228,12135,12136],{"class":252},"  .wi-image-wrap {",[228,12138,916],{"class":915},[228,12140,8342],{"class":252},[228,12142,916],{"class":915},[228,12144,12145],{"class":252},"    overflow: hidden;",[228,12147,916],{"class":915},[228,12149,8712],{"class":252},[228,12151,916],{"class":915},[228,12153,8332],{"class":252},[228,12155,916],{"class":915},[228,12157,12073],{"class":252},[228,12159,916],{"class":915},[228,12161,8536],{"class":252},[228,12163,916],{"class":915},[228,12165,12166],{"class":252},"    min-height: 210px;",[228,12168,916],{"class":915},[228,12170,8302],{"class":252},[228,12172,916],{"class":915},[228,12174,8307],{"class":252},[228,12176,916],{"class":915},[228,12178,12179],{"class":252},"    justify-content: center;",[228,12181,916],{"class":915},[228,12183,8254],{"class":252},[228,12185,922],{"class":915},[228,12187,12188],{"class":252},"  \u002F* Desktop: image box tracks a fixed aspect ratio based on its column",[228,12190,916],{"class":915},[228,12192,12193],{"class":252},"     width, so the card height scales with the image. The text column",[228,12195,916],{"class":915},[228,12197,12198],{"class":252},"     stretches to match via align-items: stretch on the flex container. *\u002F",[228,12200,916],{"class":915},[228,12202,11818],{"class":252},[228,12204,916],{"class":915},[228,12206,12207],{"class":252},"    .wi-image-wrap {",[228,12209,916],{"class":915},[228,12211,12212],{"class":252},"      aspect-ratio: 4 \u002F 3;",[228,12214,916],{"class":915},[228,12216,12217],{"class":252},"      height: auto;",[228,12219,916],{"class":915},[228,12221,12222],{"class":252},"      align-self: flex-start;",[228,12224,916],{"class":915},[228,12226,3695],{"class":252},[228,12228,916],{"class":915},[228,12230,8254],{"class":252},[228,12232,922],{"class":915},[228,12234,12235],{"class":252},"  .wi-image {",[228,12237,916],{"class":915},[228,12239,12073],{"class":252},[228,12241,916],{"class":915},[228,12243,8536],{"class":252},[228,12245,916],{"class":915},[228,12247,12248],{"class":252},"    object-fit: contain;",[228,12250,916],{"class":915},[228,12252,8254],{"class":252},[228,12254,922],{"class":915},[228,12256,12257],{"class":252},"  @media (max-width: 700px) {",[228,12259,916],{"class":915},[228,12261,12262],{"class":252},"    .wi-instruction-flex {",[228,12264,916],{"class":915},[228,12266,12267],{"class":252},"      flex-direction: column;",[228,12269,916],{"class":915},[228,12271,3695],{"class":252},[228,12273,922],{"class":915},[228,12275,12276],{"class":252},"    .wi-img-col {",[228,12278,916],{"class":915},[228,12280,12281],{"class":252},"      flex: none;",[228,12283,916],{"class":915},[228,12285,3695],{"class":252},[228,12287,922],{"class":915},[228,12289,12207],{"class":252},[228,12291,916],{"class":915},[228,12293,12294],{"class":252},"      min-height: 150px;",[228,12296,916],{"class":915},[228,12298,3695],{"class":252},[228,12300,916],{"class":915},[228,12302,8254],{"class":252},[228,12304,922],{"class":915},[228,12306,12307],{"class":252},"  \u002F* Controls *\u002F",[228,12309,916],{"class":915},[228,12311,12312],{"class":252},"  .wi-controls {",[228,12314,916],{"class":915},[228,12316,12317],{"class":252},"    margin-top: 12px;",[228,12319,916],{"class":915},[228,12321,8488],{"class":252},[228,12323,916],{"class":915},[228,12325,8254],{"class":252},[228,12327,922],{"class":915},[228,12329,12330],{"class":252},"  .wi-ctrl-col {",[228,12332,916],{"class":915},[228,12334,12335],{"class":252},"    padding: 6px 8px;",[228,12337,916],{"class":915},[228,12339,8254],{"class":252},[228,12341,922],{"class":915},[228,12343,12344],{"class":252},"  .wi-nav-btn {",[228,12346,916],{"class":915},[228,12348,12349],{"class":252},"    height: 52px !important;",[228,12351,916],{"class":915},[228,12353,12354],{"class":252},"    font-size: 15px !important;",[228,12356,916],{"class":915},[228,12358,8469],{"class":252},[228,12360,916],{"class":915},[228,12362,8474],{"class":252},[228,12364,916],{"class":915},[228,12366,9027],{"class":252},[228,12368,916],{"class":915},[228,12370,8254],{"class":252},[228,12372,922],{"class":915},[228,12374,12375],{"class":252},"  .wi-nav-btn .v-btn__content {",[228,12377,916],{"class":915},[228,12379,8302],{"class":252},[228,12381,916],{"class":915},[228,12383,8307],{"class":252},[228,12385,916],{"class":915},[228,12387,12179],{"class":252},[228,12389,916],{"class":915},[228,12391,8254],{"class":252},[228,12393,922],{"class":915},[228,12395,12396],{"class":252},"  .wi-next-btn {",[228,12398,916],{"class":915},[228,12400,12401],{"class":252},"    font-size: 17px !important;",[228,12403,916],{"class":915},[228,12405,8254],{"class":252},[228,12407,922],{"class":915},[228,12409,12410],{"class":252},"  .wi-hint {",[228,12412,916],{"class":915},[228,12414,8302],{"class":252},[228,12416,916],{"class":915},[228,12418,8307],{"class":252},[228,12420,916],{"class":915},[228,12422,12179],{"class":252},[228,12424,916],{"class":915},[228,12426,8953],{"class":252},[228,12428,916],{"class":915},[228,12430,12431],{"class":252},"    margin-top: 8px;",[228,12433,916],{"class":915},[228,12435,11729],{"class":252},[228,12437,916],{"class":915},[228,12439,8843],{"class":252},[228,12441,916],{"class":915},[228,12443,11471],{"class":252},[228,12445,916],{"class":915},[228,12447,8254],{"class":252},[228,12449,916],{"class":915},[228,12451,9036],{"class":252},[228,12453,238],{"class":234},[228,12455,258],{"class":234},[228,12457,238],{"class":234},[228,12459,9045],{"class":241},[228,12461,238],{"class":234},[228,12463,387],{"class":234},[228,12465,238],{"class":234},[228,12467,9054],{"class":241},[228,12469,238],{"class":234},[228,12471,387],{"class":234},[228,12473,238],{"class":234},[228,12475,9063],{"class":241},[228,12477,238],{"class":234},[228,12479,387],{"class":234},[228,12481,238],{"class":234},[228,12483,9072],{"class":241},[228,12485,238],{"class":234},[228,12487,247],{"class":234},[228,12489,238],{"class":234},[228,12491,12492],{"class":252},"widget:page",[228,12494,238],{"class":234},[228,12496,258],{"class":234},[228,12498,238],{"class":234},[228,12500,9090],{"class":241},[228,12502,238],{"class":234},[228,12504,247],{"class":234},[228,12506,770],{"class":234},[228,12508,258],{"class":234},[228,12510,238],{"class":234},[228,12512,566],{"class":241},[228,12514,238],{"class":234},[228,12516,247],{"class":234},[228,12518,12519],{"class":573},"670",[228,12521,258],{"class":234},[228,12523,238],{"class":234},[228,12525,581],{"class":241},[228,12527,238],{"class":234},[228,12529,247],{"class":234},[228,12531,12532],{"class":573},"780",[228,12534,258],{"class":234},[228,12536,238],{"class":234},[228,12538,802],{"class":241},[228,12540,238],{"class":234},[228,12542,807],{"class":234},[228,12544,238],{"class":234},[228,12546,12547],{"class":252},"c67ea1f6c0580816",[228,12549,238],{"class":234},[228,12551,258],{"class":234},[228,12553,238],{"class":234},[228,12555,12556],{"class":252},"effed3f3a008aef7",[228,12558,238],{"class":234},[228,12560,816],{"class":234},[228,12562,238],{"class":234},[228,12564,242],{"class":241},[228,12566,238],{"class":234},[228,12568,247],{"class":234},[228,12570,238],{"class":234},[228,12572,12573],{"class":252},"e51561215326fafd",[228,12575,238],{"class":234},[228,12577,258],{"class":234},[228,12579,238],{"class":234},[228,12581,263],{"class":241},[228,12583,238],{"class":234},[228,12585,247],{"class":234},[228,12587,238],{"class":234},[228,12589,4748],{"class":252},[228,12591,238],{"class":234},[228,12593,258],{"class":234},[228,12595,238],{"class":234},[228,12597,4757],{"class":241},[228,12599,238],{"class":234},[228,12601,1080],{"class":234},[228,12603,238],{"class":234},[228,12605,4766],{"class":241},[228,12607,238],{"class":234},[228,12609,304],{"class":234},[228,12611,238],{"class":234},[228,12613,98],{"class":309},[228,12615,238],{"class":234},[228,12617,247],{"class":234},[228,12619,238],{"class":234},[228,12621,4783],{"class":252},[228,12623,238],{"class":234},[228,12625,4788],{"class":234},[12,12627,12628,75,12632],{},[21,12629],{"alt":12630,"src":12631},"Placeholder: Work Instruction Widget showing a step with image, checklist, and navigation controls","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Finstructions.png",[26,12633,12634],{},"The Instructions page: step image, checklist, target time, and Previous \u002F Report Issue \u002F Next controls.",[147,12636,12637],{"start":5062},[70,12638,5235,12639,12641],{},[96,12640,845],{}," node named \"Track step (save\u002Fload per user)\":",[219,12643,12645],{"className":5719,"code":12644,"language":5721,"meta":224,"style":224},"\u002F\u002F Remembers the current step per user for the active work order.\n\u002F\u002F Handles two actions from the widget:\n\u002F\u002F   save_step - persist the step the operator is on\n\u002F\u002F   load_step - reply with the saved step so the widget can resume\nconst p = msg.payload || {};\n\n\u002F\u002F Identity comes from this message's own client data first. This is what\n\u002F\u002F keeps two operators using the widget at the same time from reading or\n\u002F\u002F writing each other's progress.\nconst username = msg._client?.user?.username\n    || global.get('user', 'persistent')?.username;\nif (!username) return null;\n\n\u002F\u002F Read the user's saved state\nconst userState = global.get(username, \"persistent\") || {\n    workOrderId: null,\n    stepIndex: 0\n};\n\nswitch (p.action) {\n    case \"save_step\":\n        userState.stepIndex = p.stepIndex ?? 0;\n        global.set(username, userState, \"persistent\");\n        return null;\n\n    case \"load_step\":\n        msg.payload = {\n            workOrderId: userState.workOrderId,\n            stepIndex: userState.stepIndex ?? 0\n        };\n        return msg;\n\n    default:\n        return null;\n}\n",[96,12646,12647,12652,12657,12662,12667,12686,12690,12695,12700,12705,12727,12761,12778,12782,12787,12819,12829,12839,12844,12848,12863,12877,12902,12929,12935,12939,12951,12964,12980,12998,13004,13013,13018,13026,13033],{"__ignoreMap":224},[228,12648,12649],{"class":230,"line":231},[228,12650,12651],{"class":5272},"\u002F\u002F Remembers the current step per user for the active work order.\n",[228,12653,12654],{"class":230,"line":5062},[228,12655,12656],{"class":5272},"\u002F\u002F Handles two actions from the widget:\n",[228,12658,12659],{"class":230,"line":5081},[228,12660,12661],{"class":5272},"\u002F\u002F   save_step - persist the step the operator is on\n",[228,12663,12664],{"class":230,"line":4978},[228,12665,12666],{"class":5272},"\u002F\u002F   load_step - reply with the saved step so the widget can resume\n",[228,12668,12669,12671,12674,12676,12678,12680,12682,12684],{"class":230,"line":5112},[228,12670,5728],{"class":241},[228,12672,12673],{"class":915}," p ",[228,12675,5286],{"class":234},[228,12677,5736],{"class":915},[228,12679,57],{"class":234},[228,12681,6567],{"class":915},[228,12683,6708],{"class":234},[228,12685,6922],{"class":234},[228,12687,12688],{"class":230,"line":5127},[228,12689,5405],{"emptyLinePlaceholder":5404},[228,12691,12692],{"class":230,"line":5142},[228,12693,12694],{"class":5272},"\u002F\u002F Identity comes from this message's own client data first. This is what\n",[228,12696,12697],{"class":230,"line":5382},[228,12698,12699],{"class":5272},"\u002F\u002F keeps two operators using the widget at the same time from reading or\n",[228,12701,12702],{"class":230,"line":5392},[228,12703,12704],{"class":5272},"\u002F\u002F writing each other's progress.\n",[228,12706,12707,12709,12711,12713,12715,12717,12719,12721,12723,12725],{"class":230,"line":5401},[228,12708,5728],{"class":241},[228,12710,5731],{"class":915},[228,12712,5286],{"class":234},[228,12714,5736],{"class":915},[228,12716,57],{"class":234},[228,12718,5741],{"class":915},[228,12720,5744],{"class":234},[228,12722,3290],{"class":915},[228,12724,5744],{"class":234},[228,12726,5751],{"class":915},[228,12728,12729,12731,12733,12735,12737,12739,12741,12743,12745,12747,12749,12751,12753,12755,12757,12759],{"class":230,"line":5408},[228,12730,5756],{"class":234},[228,12732,5759],{"class":915},[228,12734,57],{"class":234},[228,12736,735],{"class":5764},[228,12738,5767],{"class":915},[228,12740,5770],{"class":234},[228,12742,3290],{"class":252},[228,12744,5770],{"class":234},[228,12746,258],{"class":234},[228,12748,5779],{"class":234},[228,12750,940],{"class":252},[228,12752,5770],{"class":234},[228,12754,5786],{"class":915},[228,12756,5744],{"class":234},[228,12758,5086],{"class":915},[228,12760,5499],{"class":234},[228,12762,12763,12765,12768,12771,12774,12776],{"class":230,"line":5418},[228,12764,6027],{"class":5421},[228,12766,12767],{"class":915}," (",[228,12769,12770],{"class":234},"!",[228,12772,12773],{"class":915},"username) ",[228,12775,6107],{"class":5421},[228,12777,6792],{"class":234},[228,12779,12780],{"class":230,"line":5431},[228,12781,5405],{"emptyLinePlaceholder":5404},[228,12783,12784],{"class":230,"line":5442},[228,12785,12786],{"class":5272},"\u002F\u002F Read the user's saved state\n",[228,12788,12789,12791,12794,12796,12798,12800,12802,12805,12807,12809,12811,12813,12815,12817],{"class":230,"line":5463},[228,12790,5728],{"class":241},[228,12792,12793],{"class":915}," userState ",[228,12795,5286],{"class":234},[228,12797,5759],{"class":915},[228,12799,57],{"class":234},[228,12801,735],{"class":5764},[228,12803,12804],{"class":915},"(username",[228,12806,258],{"class":234},[228,12808,6095],{"class":234},[228,12810,940],{"class":252},[228,12812,238],{"class":234},[228,12814,6917],{"class":915},[228,12816,6708],{"class":234},[228,12818,5428],{"class":234},[228,12820,12821,12824,12826],{"class":230,"line":5469},[228,12822,12823],{"class":5263},"    workOrderId",[228,12825,247],{"class":234},[228,12827,12828],{"class":234}," null,\n",[228,12830,12831,12834,12836],{"class":230,"line":5479},[228,12832,12833],{"class":5263},"    stepIndex",[228,12835,247],{"class":234},[228,12837,12838],{"class":573}," 0\n",[228,12840,12841],{"class":230,"line":5485},[228,12842,12843],{"class":234},"};\n",[228,12845,12846],{"class":230,"line":5502},[228,12847,5405],{"emptyLinePlaceholder":5404},[228,12849,12850,12853,12856,12858,12861],{"class":230,"line":5508},[228,12851,12852],{"class":5421},"switch",[228,12854,12855],{"class":915}," (p",[228,12857,57],{"class":234},[228,12859,12860],{"class":915},"action) ",[228,12862,5059],{"class":234},[228,12864,12865,12868,12870,12872,12874],{"class":230,"line":5513},[228,12866,12867],{"class":5421},"    case",[228,12869,6095],{"class":234},[228,12871,9331],{"class":252},[228,12873,238],{"class":234},[228,12875,12876],{"class":234},":\n",[228,12878,12879,12882,12884,12887,12889,12892,12894,12896,12898,12900],{"class":230,"line":5522},[228,12880,12881],{"class":915},"        userState",[228,12883,57],{"class":234},[228,12885,12886],{"class":915},"stepIndex ",[228,12888,5286],{"class":234},[228,12890,12891],{"class":915}," p",[228,12893,57],{"class":234},[228,12895,12886],{"class":915},[228,12897,6724],{"class":234},[228,12899,6602],{"class":573},[228,12901,5499],{"class":234},[228,12903,12904,12907,12909,12911,12913,12915,12917,12919,12921,12923,12925,12927],{"class":230,"line":5527},[228,12905,12906],{"class":915},"        global",[228,12908,57],{"class":234},[228,12910,5673],{"class":5764},[228,12912,12804],{"class":915},[228,12914,258],{"class":234},[228,12916,6894],{"class":915},[228,12918,258],{"class":234},[228,12920,6095],{"class":234},[228,12922,940],{"class":252},[228,12924,238],{"class":234},[228,12926,5786],{"class":915},[228,12928,5499],{"class":234},[228,12930,12931,12933],{"class":230,"line":5536},[228,12932,5445],{"class":5421},[228,12934,6792],{"class":234},[228,12936,12937],{"class":230,"line":5579},[228,12938,5405],{"emptyLinePlaceholder":5404},[228,12940,12941,12943,12945,12947,12949],{"class":230,"line":5612},[228,12942,12867],{"class":5421},[228,12944,6095],{"class":234},[228,12946,9335],{"class":252},[228,12948,238],{"class":234},[228,12950,12876],{"class":234},[228,12952,12953,12956,12958,12960,12962],{"class":230,"line":7033},[228,12954,12955],{"class":915},"        msg",[228,12957,57],{"class":234},[228,12959,6567],{"class":915},[228,12961,5286],{"class":234},[228,12963,5428],{"class":234},[228,12965,12967,12970,12972,12974,12976,12978],{"class":230,"line":12966},28,[228,12968,12969],{"class":5263},"            workOrderId",[228,12971,247],{"class":234},[228,12973,6894],{"class":915},[228,12975,57],{"class":234},[228,12977,6932],{"class":915},[228,12979,5078],{"class":234},[228,12981,12983,12986,12988,12990,12992,12994,12996],{"class":230,"line":12982},29,[228,12984,12985],{"class":5263},"            stepIndex",[228,12987,247],{"class":234},[228,12989,6894],{"class":915},[228,12991,57],{"class":234},[228,12993,12886],{"class":915},[228,12995,6724],{"class":234},[228,12997,12838],{"class":573},[228,12999,13001],{"class":230,"line":13000},30,[228,13002,13003],{"class":234},"        };\n",[228,13005,13007,13009,13011],{"class":230,"line":13006},31,[228,13008,5445],{"class":5421},[228,13010,5736],{"class":915},[228,13012,5499],{"class":234},[228,13014,13016],{"class":230,"line":13015},32,[228,13017,5405],{"emptyLinePlaceholder":5404},[228,13019,13021,13024],{"class":230,"line":13020},33,[228,13022,13023],{"class":5421},"    default",[228,13025,12876],{"class":234},[228,13027,13029,13031],{"class":230,"line":13028},34,[228,13030,5445],{"class":5421},[228,13032,6792],{"class":234},[228,13034,13036],{"class":230,"line":13035},35,[228,13037,5145],{"class":234},[147,13039,13040],{"start":5081},[70,13041,13042,13043,13045],{},"Wire the \"Work Instruction Widget\" output into this node, and wire the node's output back into the widget so the ",[96,13044,9335],{}," reply can jump it to the saved step.",[12,13047,13048,13049,5202,13052,13055,13056,13058,13059,13061,13062,13064],{},"Look at the store key: ",[96,13050,13051],{},"global.get(username, ...)",[96,13053,13054],{},"global.set(username, ...)",". The operator's own username is the storage key, so two operators at the same station never overwrite each other, their progress lives under different keys, and because that key is now sourced from ",[96,13057,197],{}," rather than a shared global, it's always the username of whoever's browser actually sent this particular ",[96,13060,9331],{}," or ",[96,13063,9335],{}," message.",[12,13066,13067],{},"Deploy, walk halfway through an operation, then reload the page. It reopens where you left off, because the step is filed under your name.",[59,13069,13071],{"id":13070},"completing-the-operation-as-the-logged-in-user","Completing the Operation as the Logged-In User",[12,13073,13074,13075,13078],{},"When the operator completes the final instruction, the widget sends ",[96,13076,13077],{},"{ action: \"complete_operation\" }",". The flow looks up the operator's stored work order and builds the payload that will be sent to the API.",[147,13080,13081,13089,13104],{},[70,13082,5235,13083,13085,13086,13088],{},[45,13084,6494],{}," node and connect it to the ",[45,13087,9344],{}," actions link.",[70,13090,5235,13091,5816,13093,13096,13097,13100,13101,57],{},[45,13092,12852],{},[45,13094,13095],{},"Route by Action"," and route messages where ",[96,13098,13099],{},"msg.payload.action"," equals ",[96,13102,13103],{},"complete_operation",[70,13105,5235,13106,5816,13108,13111],{},[45,13107,845],{},[45,13109,13110],{},"Build Complete Payload"," and paste in the following code.",[219,13113,13115],{"className":5719,"code":13114,"language":5721,"meta":224,"style":224},"const username = msg._client?.user?.username\n    || global.get('user', 'persistent')?.username;\n\nif (!username) {\n    node.warn('No logged-in user found — cannot complete operation');\n    return null;\n}\n\nconst stored = global.get(username, 'persistent') || {};\nconst workOrderId = stored.workOrderId || null;\n\nmsg.payload = { workOrderId };\nreturn msg;\n",[96,13116,13117,13139,13173,13177,13189,13212,13219,13223,13227,13258,13279,13283,13299],{"__ignoreMap":224},[228,13118,13119,13121,13123,13125,13127,13129,13131,13133,13135,13137],{"class":230,"line":231},[228,13120,5728],{"class":241},[228,13122,5731],{"class":915},[228,13124,5286],{"class":234},[228,13126,5736],{"class":915},[228,13128,57],{"class":234},[228,13130,5741],{"class":915},[228,13132,5744],{"class":234},[228,13134,3290],{"class":915},[228,13136,5744],{"class":234},[228,13138,5751],{"class":915},[228,13140,13141,13143,13145,13147,13149,13151,13153,13155,13157,13159,13161,13163,13165,13167,13169,13171],{"class":230,"line":5062},[228,13142,5756],{"class":234},[228,13144,5759],{"class":915},[228,13146,57],{"class":234},[228,13148,735],{"class":5764},[228,13150,5767],{"class":915},[228,13152,5770],{"class":234},[228,13154,3290],{"class":252},[228,13156,5770],{"class":234},[228,13158,258],{"class":234},[228,13160,5779],{"class":234},[228,13162,940],{"class":252},[228,13164,5770],{"class":234},[228,13166,5786],{"class":915},[228,13168,5744],{"class":234},[228,13170,5086],{"class":915},[228,13172,5499],{"class":234},[228,13174,13175],{"class":230,"line":5081},[228,13176,5405],{"emptyLinePlaceholder":5404},[228,13178,13179,13181,13183,13185,13187],{"class":230,"line":4978},[228,13180,6027],{"class":5421},[228,13182,12767],{"class":915},[228,13184,12770],{"class":234},[228,13186,12773],{"class":915},[228,13188,5059],{"class":234},[228,13190,13191,13194,13196,13199,13201,13203,13206,13208,13210],{"class":230,"line":5112},[228,13192,13193],{"class":915},"    node",[228,13195,57],{"class":234},[228,13197,13198],{"class":5764},"warn",[228,13200,5767],{"class":5263},[228,13202,5770],{"class":234},[228,13204,13205],{"class":252},"No logged-in user found — cannot complete operation",[228,13207,5770],{"class":234},[228,13209,5786],{"class":5263},[228,13211,5499],{"class":234},[228,13213,13214,13217],{"class":230,"line":5127},[228,13215,13216],{"class":5421},"    return",[228,13218,6792],{"class":234},[228,13220,13221],{"class":230,"line":5142},[228,13222,5145],{"class":234},[228,13224,13225],{"class":230,"line":5382},[228,13226,5405],{"emptyLinePlaceholder":5404},[228,13228,13229,13231,13234,13236,13238,13240,13242,13244,13246,13248,13250,13252,13254,13256],{"class":230,"line":5392},[228,13230,5728],{"class":241},[228,13232,13233],{"class":915}," stored ",[228,13235,5286],{"class":234},[228,13237,5759],{"class":915},[228,13239,57],{"class":234},[228,13241,735],{"class":5764},[228,13243,12804],{"class":915},[228,13245,258],{"class":234},[228,13247,5779],{"class":234},[228,13249,940],{"class":252},[228,13251,5770],{"class":234},[228,13253,6917],{"class":915},[228,13255,6708],{"class":234},[228,13257,6922],{"class":234},[228,13259,13260,13262,13265,13267,13270,13272,13275,13277],{"class":230,"line":5401},[228,13261,5728],{"class":241},[228,13263,13264],{"class":915}," workOrderId ",[228,13266,5286],{"class":234},[228,13268,13269],{"class":915}," stored",[228,13271,57],{"class":234},[228,13273,13274],{"class":915},"workOrderId ",[228,13276,6708],{"class":234},[228,13278,6792],{"class":234},[228,13280,13281],{"class":230,"line":5408},[228,13282,5405],{"emptyLinePlaceholder":5404},[228,13284,13285,13287,13289,13291,13293,13295,13297],{"class":230,"line":5418},[228,13286,6058],{"class":915},[228,13288,57],{"class":234},[228,13290,6567],{"class":915},[228,13292,5286],{"class":234},[228,13294,5448],{"class":234},[228,13296,13264],{"class":915},[228,13298,12843],{"class":234},[228,13300,13301,13303,13305],{"class":230,"line":5431},[228,13302,6107],{"class":5421},[228,13304,5736],{"class":915},[228,13306,5499],{"class":234},[147,13308,13309,13328],{"start":4978},[70,13310,6116,13311,6451,13313,5824,13315,13318,13319,13321,13322,13325,13326,5872],{},[45,13312,5008],{},[45,13314,6454],{},[45,13316,13317],{},"POST",", configure ",[45,13320,6129],{}," authentication using your access token, and set the URL to ",[96,13323,13324],{},"https:\u002F\u002Fyour-instance.flowfuse.cloud\u002Fworkorders\u002Fcomplete",". Replace ",[96,13327,5871],{},[70,13329,5235,13330,13332,13333,5824,13335,13337,13338,13340],{},[45,13331,5669],{}," node that sets ",[96,13334,5823],{},[96,13336,4836],{},", then connect it to a ",[45,13339,6487],{}," node. This will be used in the next step to reset the operator's state and navigate the operator back to the Home page.",[12,13342,13343],{},"Because the payload is built from the logged-in operator's stored state, keyed off that same operator's per-message identity, the API always completes the correct work order, even when multiple operators are using the dashboard at the same time.",[59,13345,13347],{"id":13346},"reporting-a-defect-as-the-logged-in-operator","Reporting a Defect as the Logged-In Operator",[12,13349,13350,13351,13353],{},"If an operator encounters a defect, they can report it from the ",[45,13352,9344],{},". The report is automatically linked to the work order they're currently performing, so there's no need to enter a work order ID manually.",[12,13355,4916,13356,13358,13359,13362],{},[45,13357,4861],{}," button sends ",[96,13360,13361],{},"{ action: \"Report Issue\" }",". Use that action to open the report form.",[147,13364,13365,13375,13385,13399],{},[70,13366,5235,13367,5816,13369,13372,13373,13088],{},[45,13368,6494],{},[45,13370,13371],{},"Widget Action In"," and connect it to the ",[45,13374,9344],{},[70,13376,5235,13377,5816,13379,13096,13381,13100,13383,57],{},[45,13378,12852],{},[45,13380,13095],{},[96,13382,13099],{},[96,13384,4861],{},[70,13386,5235,13387,13332,13389,5824,13391,13337,13393,13395,13396,13398],{},[45,13388,5669],{},[96,13390,5823],{},[96,13392,4861],{},[45,13394,115],{}," node to navigate to the ",[45,13397,4861],{}," page.",[70,13400,5235,13401,5816,13403,13406,13407,13409,13410,13435,13438],{},[45,13402,109],{},[45,13404,13405],{},"Report Issue Form"," to the ",[45,13408,4861],{}," group with four required fields:",[67,13411,13412,13418,13423,13429],{},[70,13413,13414,13417],{},[45,13415,13416],{},"Issue Type"," (dropdown)",[70,13419,13420,13417],{},[45,13421,13422],{},"Severity",[70,13424,13425,13428],{},[45,13426,13427],{},"Affected Part"," (text)",[70,13430,13431,13434],{},[45,13432,13433],{},"Description"," (multiline)",[13436,13437],"br",{},"Populate the dropdown fields with the issue types and severity levels used in your application.",[12,13440,13441,13445],{},[21,13442],{"alt":13443,"src":13444},"Screenshot: Report Issue form fields showing the Issue Type, Severity, Affected Part, and Description inputs","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fform-elements.png",[26,13446,13447],{},"The Report Issue form collects the defect details before submitting them against the current work order.",[12,13449,13450,13454],{},[21,13451],{"alt":13452,"src":13453},"Screenshot: Configuring the dropdown options for the Issue Type and Severity fields in the ui-form node","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fform-dropdown.png",[26,13455,13456],{},"Configure the Issue Type and Severity dropdowns with the options used in your application.",[147,13458,13459],{"start":5112},[70,13460,5235,13461,5816,13463,13111],{},[45,13462,845],{},[45,13464,13465],{},"Prepare Defect Payload",[219,13467,13470],{"className":5719,"code":13468,"language":5721,"meta":13469,"style":224},"const p = msg.payload || {};\n\nconst username = msg._client?.user?.username\n    || global.get('user', 'persistent')?.username;\n\nif (!username) {\n    node.warn('No logged-in user found — cannot report defect');\n    return null;\n}\n\nconst stored = global.get(username, 'persistent') || {};\nconst workOrderId = stored.workOrderId || null;\n\nconst issueType = p.type;\nconst severity = p.severity;\nconst affectedPart = p['affected-part'];\nconst description = p.description || null;\n\nif (!workOrderId || !issueType || !severity || !affectedPart) {\n    node.warn('Missing required defect fields — defect not sent');\n    return null;\n}\n\nmsg.payload = {\n    workOrderId,\n    issueType,\n    severity,\n    affectedPart,\n    description\n};\n\nreturn msg;\n","id=\"vbv4m6\"",[96,13471,13472,13490,13494,13516,13550,13554,13566,13587,13593,13597,13601,13631,13649,13653,13670,13688,13711,13731,13735,13769,13790,13796,13800,13804,13816,13822,13829,13836,13843,13848,13852,13856],{"__ignoreMap":224},[228,13473,13474,13476,13478,13480,13482,13484,13486,13488],{"class":230,"line":231},[228,13475,5728],{"class":241},[228,13477,12673],{"class":915},[228,13479,5286],{"class":234},[228,13481,5736],{"class":915},[228,13483,57],{"class":234},[228,13485,6567],{"class":915},[228,13487,6708],{"class":234},[228,13489,6922],{"class":234},[228,13491,13492],{"class":230,"line":5062},[228,13493,5405],{"emptyLinePlaceholder":5404},[228,13495,13496,13498,13500,13502,13504,13506,13508,13510,13512,13514],{"class":230,"line":5081},[228,13497,5728],{"class":241},[228,13499,5731],{"class":915},[228,13501,5286],{"class":234},[228,13503,5736],{"class":915},[228,13505,57],{"class":234},[228,13507,5741],{"class":915},[228,13509,5744],{"class":234},[228,13511,3290],{"class":915},[228,13513,5744],{"class":234},[228,13515,5751],{"class":915},[228,13517,13518,13520,13522,13524,13526,13528,13530,13532,13534,13536,13538,13540,13542,13544,13546,13548],{"class":230,"line":4978},[228,13519,5756],{"class":234},[228,13521,5759],{"class":915},[228,13523,57],{"class":234},[228,13525,735],{"class":5764},[228,13527,5767],{"class":915},[228,13529,5770],{"class":234},[228,13531,3290],{"class":252},[228,13533,5770],{"class":234},[228,13535,258],{"class":234},[228,13537,5779],{"class":234},[228,13539,940],{"class":252},[228,13541,5770],{"class":234},[228,13543,5786],{"class":915},[228,13545,5744],{"class":234},[228,13547,5086],{"class":915},[228,13549,5499],{"class":234},[228,13551,13552],{"class":230,"line":5112},[228,13553,5405],{"emptyLinePlaceholder":5404},[228,13555,13556,13558,13560,13562,13564],{"class":230,"line":5127},[228,13557,6027],{"class":5421},[228,13559,12767],{"class":915},[228,13561,12770],{"class":234},[228,13563,12773],{"class":915},[228,13565,5059],{"class":234},[228,13567,13568,13570,13572,13574,13576,13578,13581,13583,13585],{"class":230,"line":5142},[228,13569,13193],{"class":915},[228,13571,57],{"class":234},[228,13573,13198],{"class":5764},[228,13575,5767],{"class":5263},[228,13577,5770],{"class":234},[228,13579,13580],{"class":252},"No logged-in user found — cannot report defect",[228,13582,5770],{"class":234},[228,13584,5786],{"class":5263},[228,13586,5499],{"class":234},[228,13588,13589,13591],{"class":230,"line":5382},[228,13590,13216],{"class":5421},[228,13592,6792],{"class":234},[228,13594,13595],{"class":230,"line":5392},[228,13596,5145],{"class":234},[228,13598,13599],{"class":230,"line":5401},[228,13600,5405],{"emptyLinePlaceholder":5404},[228,13602,13603,13605,13607,13609,13611,13613,13615,13617,13619,13621,13623,13625,13627,13629],{"class":230,"line":5408},[228,13604,5728],{"class":241},[228,13606,13233],{"class":915},[228,13608,5286],{"class":234},[228,13610,5759],{"class":915},[228,13612,57],{"class":234},[228,13614,735],{"class":5764},[228,13616,12804],{"class":915},[228,13618,258],{"class":234},[228,13620,5779],{"class":234},[228,13622,940],{"class":252},[228,13624,5770],{"class":234},[228,13626,6917],{"class":915},[228,13628,6708],{"class":234},[228,13630,6922],{"class":234},[228,13632,13633,13635,13637,13639,13641,13643,13645,13647],{"class":230,"line":5418},[228,13634,5728],{"class":241},[228,13636,13264],{"class":915},[228,13638,5286],{"class":234},[228,13640,13269],{"class":915},[228,13642,57],{"class":234},[228,13644,13274],{"class":915},[228,13646,6708],{"class":234},[228,13648,6792],{"class":234},[228,13650,13651],{"class":230,"line":5431},[228,13652,5405],{"emptyLinePlaceholder":5404},[228,13654,13655,13657,13660,13662,13664,13666,13668],{"class":230,"line":5442},[228,13656,5728],{"class":241},[228,13658,13659],{"class":915}," issueType ",[228,13661,5286],{"class":234},[228,13663,12891],{"class":915},[228,13665,57],{"class":234},[228,13667,263],{"class":915},[228,13669,5499],{"class":234},[228,13671,13672,13674,13677,13679,13681,13683,13686],{"class":230,"line":5463},[228,13673,5728],{"class":241},[228,13675,13676],{"class":915}," severity ",[228,13678,5286],{"class":234},[228,13680,12891],{"class":915},[228,13682,57],{"class":234},[228,13684,13685],{"class":915},"severity",[228,13687,5499],{"class":234},[228,13689,13690,13692,13695,13697,13700,13702,13705,13707,13709],{"class":230,"line":5469},[228,13691,5728],{"class":241},[228,13693,13694],{"class":915}," affectedPart ",[228,13696,5286],{"class":234},[228,13698,13699],{"class":915}," p[",[228,13701,5770],{"class":234},[228,13703,13704],{"class":252},"affected-part",[228,13706,5770],{"class":234},[228,13708,3467],{"class":915},[228,13710,5499],{"class":234},[228,13712,13713,13715,13718,13720,13722,13724,13727,13729],{"class":230,"line":5479},[228,13714,5728],{"class":241},[228,13716,13717],{"class":915}," description ",[228,13719,5286],{"class":234},[228,13721,12891],{"class":915},[228,13723,57],{"class":234},[228,13725,13726],{"class":915},"description ",[228,13728,6708],{"class":234},[228,13730,6792],{"class":234},[228,13732,13733],{"class":230,"line":5485},[228,13734,5405],{"emptyLinePlaceholder":5404},[228,13736,13737,13739,13741,13743,13745,13747,13750,13753,13755,13757,13760,13762,13764,13767],{"class":230,"line":5502},[228,13738,6027],{"class":5421},[228,13740,12767],{"class":915},[228,13742,12770],{"class":234},[228,13744,13274],{"class":915},[228,13746,6708],{"class":234},[228,13748,13749],{"class":234}," !",[228,13751,13752],{"class":915},"issueType ",[228,13754,6708],{"class":234},[228,13756,13749],{"class":234},[228,13758,13759],{"class":915},"severity ",[228,13761,6708],{"class":234},[228,13763,13749],{"class":234},[228,13765,13766],{"class":915},"affectedPart) ",[228,13768,5059],{"class":234},[228,13770,13771,13773,13775,13777,13779,13781,13784,13786,13788],{"class":230,"line":5508},[228,13772,13193],{"class":915},[228,13774,57],{"class":234},[228,13776,13198],{"class":5764},[228,13778,5767],{"class":5263},[228,13780,5770],{"class":234},[228,13782,13783],{"class":252},"Missing required defect fields — defect not sent",[228,13785,5770],{"class":234},[228,13787,5786],{"class":5263},[228,13789,5499],{"class":234},[228,13791,13792,13794],{"class":230,"line":5513},[228,13793,13216],{"class":5421},[228,13795,6792],{"class":234},[228,13797,13798],{"class":230,"line":5522},[228,13799,5145],{"class":234},[228,13801,13802],{"class":230,"line":5527},[228,13803,5405],{"emptyLinePlaceholder":5404},[228,13805,13806,13808,13810,13812,13814],{"class":230,"line":5536},[228,13807,6058],{"class":915},[228,13809,57],{"class":234},[228,13811,6567],{"class":915},[228,13813,5286],{"class":234},[228,13815,5428],{"class":234},[228,13817,13818,13820],{"class":230,"line":5579},[228,13819,12823],{"class":915},[228,13821,5078],{"class":234},[228,13823,13824,13827],{"class":230,"line":5612},[228,13825,13826],{"class":915},"    issueType",[228,13828,5078],{"class":234},[228,13830,13831,13834],{"class":230,"line":7033},[228,13832,13833],{"class":915},"    severity",[228,13835,5078],{"class":234},[228,13837,13838,13841],{"class":230,"line":12966},[228,13839,13840],{"class":915},"    affectedPart",[228,13842,5078],{"class":234},[228,13844,13845],{"class":230,"line":12982},[228,13846,13847],{"class":915},"    description\n",[228,13849,13850],{"class":230,"line":13000},[228,13851,12843],{"class":234},[228,13853,13854],{"class":230,"line":13006},[228,13855,5405],{"emptyLinePlaceholder":5404},[228,13857,13858,13860,13862],{"class":230,"line":13015},[228,13859,6107],{"class":5421},[228,13861,5736],{"class":915},[228,13863,5499],{"class":234},[147,13865,13866,13885],{"start":5127},[70,13867,6116,13868,6451,13870,5824,13872,13318,13874,13321,13876,13325,13879,13881,13882,13884],{},[45,13869,5008],{},[45,13871,6454],{},[45,13873,13317],{},[45,13875,6129],{},[96,13877,13878],{},"https:\u002F\u002Fyour-instance.flowfuse.cloud\u002Fworkorders\u002Fdefect",[96,13880,5871],{}," with your own FlowFuse instance URL, then connect the request to a ",[45,13883,6487],{}," node so the flow continues to the reset step.",[70,13886,5235,13887,4910,13889,13892,13893,13895,13896,13898],{},[45,13888,112],{},[45,13890,13891],{},"Back to Work Instructions"," to the same group and connect it to a ",[45,13894,115],{}," node that navigates back to the ",[45,13897,4819],{}," page. Since the operator's progress is stored against their username, they return to the same instruction they left.",[12,13900,13901,13905],{},[21,13902],{"alt":13903,"src":13904},"Screenshot: Completed Report Issue page showing the defect reporting form and Back to Work Instructions button","\u002Fblog\u002F2026\u002F07\u002Fimages\u002Freport-issue.png",[26,13906,13907],{},"The completed Report Issue page where operators can submit a defect or return to the work instructions.",[12,13909,13910],{},"The work order ID is retrieved from the logged-in operator's stored state, ensuring every defect report is associated with the correct work order, and the lookup key for that state again comes from this message's own client data, not a value that could have been overwritten by someone else's login in the meantime.",[59,13912,13914],{"id":13913},"clearing-state-when-work-ends","Clearing State When Work Ends",[12,13916,13917,13918,13920],{},"When an operation is completed or a defect is reported, clear the operator's saved progress so the next work order starts from ",[45,13919,9324],{}," instead of resuming a finished one.",[147,13922,13923,13939,13951],{},[70,13924,5235,13925,5816,13927,13372,13930,13932,13933,5202,13935,13938],{},[45,13926,6494],{},[45,13928,13929],{},"Complete \u002F Defect Result In",[45,13931,6487],{}," nodes from the ",[45,13934,9357],{},[45,13936,13937],{},"Report Defect"," flows.",[70,13940,5235,13941,13943,13944,13100,13947,13950],{},[45,13942,12852],{}," node that checks ",[96,13945,13946],{},"msg.statusCode",[96,13948,13949],{},"200",", so the state is only cleared after a successful API response.",[70,13952,5235,13953,5816,13955,13111],{},[45,13954,845],{},[45,13956,13957],{},"Clear User Step State",[219,13959,13962],{"className":5719,"code":13960,"language":5721,"meta":13961,"style":224},"const username = msg._client?.user?.username\n    || global.get('user', 'persistent')?.username;\n\nif (!username) return null;\n\nglobal.set(username, {}, 'persistent');\n\nmsg.payload = \"Home\";\nreturn msg;\n","id=\"6ej1v5\"",[96,13963,13964,13986,14020,14024,14038,14042,14068,14072,14090],{"__ignoreMap":224},[228,13965,13966,13968,13970,13972,13974,13976,13978,13980,13982,13984],{"class":230,"line":231},[228,13967,5728],{"class":241},[228,13969,5731],{"class":915},[228,13971,5286],{"class":234},[228,13973,5736],{"class":915},[228,13975,57],{"class":234},[228,13977,5741],{"class":915},[228,13979,5744],{"class":234},[228,13981,3290],{"class":915},[228,13983,5744],{"class":234},[228,13985,5751],{"class":915},[228,13987,13988,13990,13992,13994,13996,13998,14000,14002,14004,14006,14008,14010,14012,14014,14016,14018],{"class":230,"line":5062},[228,13989,5756],{"class":234},[228,13991,5759],{"class":915},[228,13993,57],{"class":234},[228,13995,735],{"class":5764},[228,13997,5767],{"class":915},[228,13999,5770],{"class":234},[228,14001,3290],{"class":252},[228,14003,5770],{"class":234},[228,14005,258],{"class":234},[228,14007,5779],{"class":234},[228,14009,940],{"class":252},[228,14011,5770],{"class":234},[228,14013,5786],{"class":915},[228,14015,5744],{"class":234},[228,14017,5086],{"class":915},[228,14019,5499],{"class":234},[228,14021,14022],{"class":230,"line":5081},[228,14023,5405],{"emptyLinePlaceholder":5404},[228,14025,14026,14028,14030,14032,14034,14036],{"class":230,"line":4978},[228,14027,6027],{"class":5421},[228,14029,12767],{"class":915},[228,14031,12770],{"class":234},[228,14033,12773],{"class":915},[228,14035,6107],{"class":5421},[228,14037,6792],{"class":234},[228,14039,14040],{"class":230,"line":5112},[228,14041,5405],{"emptyLinePlaceholder":5404},[228,14043,14044,14047,14049,14051,14053,14055,14058,14060,14062,14064,14066],{"class":230,"line":5127},[228,14045,14046],{"class":915},"global",[228,14048,57],{"class":234},[228,14050,5673],{"class":5764},[228,14052,12804],{"class":915},[228,14054,258],{"class":234},[228,14056,14057],{"class":234}," {},",[228,14059,5779],{"class":234},[228,14061,940],{"class":252},[228,14063,5770],{"class":234},[228,14065,5786],{"class":915},[228,14067,5499],{"class":234},[228,14069,14070],{"class":230,"line":5142},[228,14071,5405],{"emptyLinePlaceholder":5404},[228,14073,14074,14076,14078,14080,14082,14084,14086,14088],{"class":230,"line":5382},[228,14075,6058],{"class":915},[228,14077,57],{"class":234},[228,14079,6567],{"class":915},[228,14081,5286],{"class":234},[228,14083,6095],{"class":234},[228,14085,4836],{"class":252},[228,14087,238],{"class":234},[228,14089,5499],{"class":234},[228,14091,14092,14094,14096],{"class":230,"line":5392},[228,14093,6107],{"class":5421},[228,14095,5736],{"class":915},[228,14097,5499],{"class":234},[147,14099,14100],{"start":4978},[70,14101,14102,14103,14105,14106,13398],{},"Connect the function node to a ",[45,14104,115],{}," node to navigate the operator back to the ",[45,14107,4836],{},[12,14109,14110],{},"Because the state is stored and cleared by username, and that username is read from the message that carried the successful API response rather than a shared global, resetting one operator's progress never affects anyone else, even if a second operator has logged in on another screen in between.",[12,14112,14113],{},"Deploy the flow and open the dashboard. After signing in, operators see only the work orders assigned to them. If they leave and return, they resume from the same instruction. Once they complete the operation or report a defect, their progress is cleared and they're returned to the Home page, ready for the next work order.",[59,14115,14117],{"id":14116},"where-to-go-next","Where to Go Next",[12,14119,14120,14121,103,14123,5188,14125,14127],{},"You've built a personalized digital work instructions application that knows who the operator is, what work they're assigned, and where they left off, correctly, even when several operators are on the dashboard at once. Replacing the simulator with a real ERP or MES is simply a matter of pointing the HTTP Request nodes to your production ",[96,14122,717],{},[96,14124,2018],{},[96,14126,1366],{}," endpoints.",[12,14129,14130,14131,14135,14136,57],{},"From there, you can extend the application with production history, quality tracking, role-based experiences, and the ",[53,14132,14134],{"href":14133},"\u002Fblog\u002F2026\u002F08\u002Fmanufacturing-dashboard-examples\u002F","OEE, downtime, and quality dashboards"," that run alongside it, all powered by the same operator identity. To see how FlowFuse fits into modern automotive manufacturing, explore the ",[53,14137,14139],{"href":14138},"\u002Findustries\u002Fautomotive\u002F","Automotive solutions page",[299,14141,14142],{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":224,"searchDepth":4978,"depth":4978,"links":14144},[14145,14146,14147,14148,14149,14150,14151,14152,14153,14157,14158,14159,14160,14161,14162,14163,14164],{"id":61,"depth":5062,"text":62},{"id":141,"depth":5062,"text":142},{"id":201,"depth":5062,"text":202},{"id":4798,"depth":5062,"text":4799},{"id":4928,"depth":5062,"text":4929},{"id":5015,"depth":5062,"text":5016},{"id":5220,"depth":5062,"text":5221},{"id":5636,"depth":5062,"text":5637},{"id":5795,"depth":5062,"text":5796,"children":14154},[14155,14156],{"id":5803,"depth":5081,"text":5804},{"id":5843,"depth":5081,"text":5844},{"id":6174,"depth":5062,"text":6175},{"id":6508,"depth":5062,"text":6509},{"id":9286,"depth":5062,"text":9287},{"id":9313,"depth":5062,"text":9314},{"id":13070,"depth":5062,"text":13071},{"id":13346,"depth":5062,"text":13347},{"id":13913,"depth":5062,"text":13914},{"id":14116,"depth":5062,"text":14117},{"type":14166,"title":14167,"description":14168},"contact","Want to connect this to your real ERP or MES?","Talk to our team about integrating digital work instructions with your production systems, adding full traceability, and rolling this out across your shop floor.","2026-07-24","Learn how to build digital work instructions with FlowFuse. Create personalized operator apps with work orders, guided steps, defect reporting, and traceability.","md",null,"\u002Fblog\u002F2026\u002F07\u002Fimages\u002Fdigital-instructions-dashboard-flowfuse.png",{"excerpt":14175},{"type":9,"value":14176},[14177],[12,14178,14],{},"\u002Fblog\u002F2026\u002F07\u002Fdigital-work-instruction",{"title":5,"description":14170},{"loc":14179},"blog\u002F2026\u002F07\u002Fdigital-work-instruction","Give every operator their own work instructions, progress, and production history.",[14185],"flowfuse","Build a FlowFuse digital work instructions application that authenticates each operator, loads only their assigned work orders, guides them step by step with per-operator progress tracking, and lets them report defects, all tied to their logged-in identity.","xqLT9xSlO9cVvaRYYZv7RbMrWKmHwyqnLF8Pm4niVz8",{"id":14189,"extension":14190,"meta":14191,"sections":14192,"stem":14580,"__hash__":14581},"featureCatalog\u002Ffeature-catalog.yml","yml",{},[14193,14244,14345,14406,14483,14562],{"id":14194,"title":14195,"features":14196},"ai-automation","AI & Automation",[14197,14207,14217,14227,14233,14239],{"id":14198,"title":14199,"description":14200,"docsLink":14201,"changelog":14202,"tiers":14206},"flowfuse-expert-ai","FlowFuse Expert AI","Build industrial apps with agents, and query the state of the factory with an agent. Adapt your current hardware and machines so agentic work can be done against them, without ripping and replacing what's already on the plant floor.","\u002Fdocs\u002Fuser\u002Fexpert\u002F",[14203],{"url":14204,"release":14205},"\u002Fchangelog\u002F2026\u002F02\u002Fff-expert-update-banner\u002F","2.28",{"edge":5404,"hub":5404,"fleet":5404},{"id":14208,"title":14209,"description":14210,"docsLink":14211,"changelog":14212,"subfeature":5404,"showOnPricing":14215,"tiers":14216},"flowfuse-expert-support-mode","Support Mode","Chat-based assistance for FlowFuse and Node-RED, including Node-RED instance management through natural language.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F#support-mode",[14213],{"url":14214,"release":14205},"\u002Fchangelog\u002F2026\u002F02\u002Fff-expert-debug-log-context\u002F",false,{"edge":5404,"hub":5404,"fleet":5404},{"id":14218,"title":14219,"description":14220,"docsLink":14221,"changelog":14222,"subfeature":5404,"showOnPricing":14215,"tiers":14226},"flowfuse-expert-application-building","Application Building","Describe what you want to build and FlowFuse Expert assembles it on your workspace, adding tabs, wiring nodes, and configuring properties.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F",[14223],{"url":14224,"release":14225},"\u002Fchangelog\u002F2026\u002F05\u002Fexpert-application-building\u002F","2.30",{"edge":5404,"hub":5404,"fleet":5404},{"id":14228,"title":14229,"description":14230,"docsLink":14231,"subfeature":5404,"beta":5404,"showOnPricing":14215,"tiers":14232},"flowfuse-expert-insights-mode","Insights Mode","Connects FlowFuse Expert to MCP servers in your Node-RED instances, enabling real-time data queries and actions through a single chat interface.","\u002Fdocs\u002Fuser\u002Fexpert\u002Fchat\u002F#insights-mode",{"edge":5404,"hub":5404,"fleet":5404},{"id":14234,"title":14235,"description":14236,"docsLink":14237,"tiers":14238},"mcp-servers","Agentic Operations","Expose your Node-RED flows as tools an AI agent can call directly, so agents can query the state of the factory or trigger actions without custom integration work.","\u002Fnode-red\u002Fflowfuse\u002Fmcp\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14240,"title":14241,"description":14242,"tiers":14243},"onnx-integration","ONNX Integration","Run trained machine learning models directly in your flows, including on edge hardware, without sending data out to an external inference service.",{"edge":5404,"hub":5404,"fleet":5404},{"id":14245,"title":14246,"features":14247},"build","Build",[14248,14254,14260,14270,14276,14282,14286,14292,14298,14306,14312,14316,14320,14329,14337],{"id":14249,"title":14250,"description":14251,"docsLink":14252,"tiers":14253},"edge-development","Edge Development","Develop and test Node-RED flows directly on edge devices with a remote editor proxy.","\u002Fdocs\u002Fdevice-agent\u002Fquickstart\u002F",{"edge":5404,"hub":14215,"fleet":5404},{"id":14255,"title":14256,"description":14257,"docsLink":14258,"tiers":14259},"private-npm-registry","Custom Node-RED Nodes","Create and manage your own private npm registry for Node-RED nodes, so you can share custom nodes across your team and devices without publishing them publicly.","\u002Fdocs\u002Fuser\u002Fcustom-npm-packages\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14261,"title":14262,"description":14263,"docsLink":14264,"changelog":14265,"tiers":14269},"flowfuse-tables","FlowFuse Tables","A managed PostgreSQL database for every application, so you can store and query structured data without standing up and maintaining your own database.","\u002Fdocs\u002Fuser\u002Fff-tables\u002F",[14266],{"url":14267,"release":14268},"\u002Fchangelog\u002F2026\u002F07\u002Fexpert-tables-automation\u002F","2.33",{"edge":5404,"hub":5404,"fleet":5404},{"id":14271,"title":14272,"description":14273,"docsLink":14274,"tiers":14275},"persistent-files","File Storage","Store and retrieve files from your Node-RED flows, with automatic replication and backup across your devices and hosted instances.","\u002Fdocs\u002Finstall\u002Ffile-storage\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14277,"title":14278,"description":14279,"docsLink":14280,"showOnPricing":14215,"tiers":14281},"persistent-context","Persistent Context","In-memory values defined in a Node-RED flow persist across project restarts and upgrades.","\u002Fdocs\u002Fuser\u002Fpersistent-context\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14283,"title":14284,"showOnPricing":14215,"tiers":14285},"static-assets","Static Assets",{"edge":5404,"hub":5404,"fleet":5404},{"id":14287,"title":14288,"description":14289,"docsLink":14290,"tiers":14291},"team-library","Team Library","Set up standard nodes and flows that can be shared with all team members across your organisation.","\u002Fdocs\u002Fuser\u002Fshared-library\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14293,"title":14294,"description":14295,"docsLink":14296,"tiers":14297},"personalised-multi-user-dashboards","Personalised Multi-User Dashboards","Build applications that provide unique data to each logged-in user using personalised multi-user dashboards.","https:\u002F\u002Fdashboard.flowfuse.com\u002Fuser\u002Fmulti-tenancy.html",{"edge":5404,"hub":5404,"fleet":5404},{"id":14299,"title":14300,"description":14301,"changelog":14302,"subfeature":5404,"showOnPricing":14215,"tiers":14305},"dashboards-view","Dashboards View","Browse and open every dashboard across your team from a dedicated Dashboards view, at both team and application level, without leaving FlowFuse.",[14303],{"url":14304,"release":14268},"\u002Fchangelog\u002F2026\u002F07\u002Fteam-and-application-dashboards\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14307,"title":14308,"description":14309,"docsLink":14310,"tiers":14311},"blueprints-converge","Blueprints","Ready-made starting points for your apps, from cross-team Converge templates to OT and IT specific blueprints.","\u002Fdocs\u002Fuser\u002Fconcepts\u002F#blueprint",{"edge":5404,"hub":5404,"fleet":5404},{"id":14313,"title":14314,"subfeature":5404,"showOnPricing":14215,"tiers":14315},"blueprints-ot-apps","Blueprints - OT APPS",{"edge":5404,"hub":14215,"fleet":5404},{"id":14317,"title":14318,"subfeature":5404,"showOnPricing":14215,"tiers":14319},"blueprints-it-apps","Blueprints - IT APPS",{"edge":14215,"hub":5404,"fleet":14215},{"id":14321,"title":14322,"description":14323,"changelog":14324,"showOnPricing":14215,"tiers":14328},"immersive-editor-snapshots","Snapshot Details in Immersive Editor","View and manage snapshot details directly inside the immersive editor without leaving your editing session.",[14325],{"url":14326,"release":14327},"\u002Fchangelog\u002F2026\u002F03\u002Fsnapshot-detail-modal-immersive-editor\u002F","2.29",{"edge":5404,"hub":5404,"fleet":5404},{"id":14330,"title":14331,"description":14332,"changelog":14333,"showOnPricing":14215,"tiers":14336},"immersive-editor-drawer","Customisable Immersive Editor Drawer","Pin, move, resize, or full-screen the immersive editor drawer. Your preferences are remembered between sessions.",[14334],{"url":14335,"release":14225},"\u002Fchangelog\u002F2026\u002F04\u002Fimmersive-editor-drawer\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14338,"title":14339,"description":14340,"changelog":14341,"showOnPricing":14215,"tiers":14344},"embedded-editor-tab-title","Embedded Editor Browser Tab Title","The browser tab title updates to reflect the active Node-RED canvas tab when working in the embedded editor.",[14342],{"url":14343,"release":14327},"\u002Fchangelog\u002F2026\u002F03\u002Fembedded-editor-tab-title\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14346,"title":213,"features":14347},"deploy",[14348,14354,14363,14369,14375,14381,14387,14393,14398],{"id":14349,"title":14350,"description":14351,"docsLink":14352,"tiers":14353},"hosted-instances","Cloud Instances","Run Node-RED instances managed and hosted by FlowFuse.","\u002Fdocs\u002Fuser\u002Fintroduction\u002F#creating-a-node-red-instance",{"edge":5404,"hub":5404,"fleet":5404},{"id":14355,"title":14356,"description":14357,"docsLink":14358,"changelog":14359,"tiers":14362},"edge-devices","Edge Instances","Deploy and mange your Node-RED instances on edge PLCs and gateways, with full visibility and control from the cloud.","\u002Fdocs\u002Fdevice-agent\u002Fintroduction\u002F",[14360],{"url":14361,"release":14205},"\u002Fchangelog\u002F2026\u002F02\u002Fdevice-agent-nodejs-options\u002F",{"edge":5404,"hub":14215,"fleet":5404},{"id":14364,"title":14365,"description":14366,"docsLink":14367,"tiers":14368},"custom-hostnames","Custom Hostnames","Access your Node-RED application via your own domain name.","\u002Fdocs\u002Fuser\u002Fcustom-hostnames\u002F",{"edge":14215,"hub":5404,"fleet":14215},{"id":14370,"title":14371,"description":14372,"docsLink":14373,"tiers":14374},"mqtt-broker","MQTT Broker","Manage and create MQTT clients to transport data for efficient messaging and communication within your applications.","\u002Fdocs\u002Fuser\u002Fteambroker\u002F",{"edge":5404,"hub":14215,"fleet":5404},{"id":14376,"title":14377,"description":14378,"docsLink":14379,"showOnPricing":14215,"tiers":14380},"project-nodes","Project Nodes aka seamless project comms","FlowFuse Project Nodes enable the passing of data and messages between your Node-RED projects.","\u002Fdocs\u002Fuser\u002Fprojectnodes\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14382,"title":14383,"description":14384,"docsLink":14385,"tiers":14386},"devops-pipelines","DevOps Pipelines","Set up different environments for development, testing, and production Node-RED instances to support a full software delivery lifecycle.","\u002Fdocs\u002Fuser\u002Fdevops-pipelines\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14388,"title":14389,"description":14390,"docsLink":14391,"tiers":14392},"git-integration","Git Integration","Back up your flows to a remote Git repository through a DevOps Pipeline. Supports GitHub and Azure DevOps repositories.","\u002Fdocs\u002Fuser\u002Fdevops-pipelines\u002F#git-repository-stage",{"edge":14215,"hub":5404,"fleet":14215},{"id":14394,"title":14395,"description":14396,"docsLink":14391,"subfeature":5404,"showOnPricing":14215,"tiers":14397},"git-integration-github","GitHub","Push and pull snapshots to GitHub repositories through DevOps Pipeline Git Stages.",{"edge":14215,"hub":5404,"fleet":14215},{"id":14399,"title":14400,"description":14401,"docsLink":14391,"changelog":14402,"subfeature":5404,"showOnPricing":14215,"tiers":14405},"git-integration-azure","Azure DevOps","Push and pull snapshots to Azure DevOps repositories through DevOps Pipeline Git Stages.",[14403],{"url":14404,"release":14327},"\u002Fchangelog\u002F2026\u002F03\u002Fazure-dev-ops-gitops\u002F",{"edge":14215,"hub":5404,"fleet":14215},{"id":14407,"title":14408,"features":14409},"operate-maintain","Operate & Maintain",[14410,14416,14422,14427,14435,14439,14443,14448,14454,14460,14465,14471,14475,14479],{"id":14411,"title":14412,"description":14413,"docsLink":14414,"tiers":14415},"snapshots","Snapshots & Version History","Automatic snapshots on remote devices and hosted instances, plus a full version history timeline so you can roll back to any prior state.","\u002Fdocs\u002Fuser\u002Fsnapshots\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14417,"title":14418,"description":14419,"docsLink":14420,"subfeature":5404,"showOnPricing":14215,"tiers":14421},"auto-snapshot-remote","Auto Snapshot (Remote)","Automatically capture a snapshot every time a remote instance is deployed, so you always have a recoverable history of what was running on each device.","\u002Fdocs\u002Fuser\u002Fsnapshots\u002F#auto-snapshots",{"edge":5404,"hub":5404,"fleet":5404},{"id":14423,"title":14424,"description":14425,"docsLink":14420,"subfeature":5404,"showOnPricing":14215,"tiers":14426},"auto-snapshot-hosted","Auto Snapshot (Hosted)","Automatically capture a snapshot every time a hosted instance is deployed, so you always have a recoverable history of what was running.",{"edge":5404,"hub":5404,"fleet":5404},{"id":14428,"title":14429,"description":14430,"changelog":14431,"subfeature":5404,"showOnPricing":14215,"tiers":14434},"snapshot-comparison","Snapshot Comparison","Compare two snapshots side-by-side with a navigable diff view. Step through every changed, added, or deleted node and see property and code diffs.",[14432],{"url":14433,"release":14327},"\u002Fchangelog\u002F2026\u002F04\u002Fsnapshot-diff-viewer\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14436,"title":14437,"subfeature":5404,"showOnPricing":14215,"tiers":14438},"version-history-timeline","Version History Timeline",{"edge":5404,"hub":5404,"fleet":5404},{"id":14440,"title":14441,"tiers":14442},"unlimited-workflow-executions","Unlimited Workflow Executions",{"edge":5404,"hub":5404,"fleet":5404},{"id":14444,"title":14445,"description":14446,"tiers":14447},"device-fleet-updates","Device Fleet Updates","Connect to edge devices to quickly assess and update logic. Debug one device and roll out improvements to your fleet in minutes, securely without requiring full device access for your whole organisation.",{"edge":5404,"hub":14215,"fleet":5404},{"id":14449,"title":14450,"description":14451,"docsLink":14452,"tiers":14453},"device-group-management","Device Group Management","Logically group devices assigned to an application and integrate device groups into your DevOps Pipeline for coordinated fleet updates.","\u002Fdocs\u002Fuser\u002Fdevice-groups\u002F",{"edge":5404,"hub":14215,"fleet":5404},{"id":14455,"title":14456,"description":14457,"docsLink":14458,"tiers":14459},"high-availability","High Availability","Leverage horizontal scaling for reliable and scalable processing of your data through Node-RED.","\u002Fdocs\u002Fuser\u002Fhigh-availability\u002F",{"edge":14215,"hub":5404,"fleet":14215},{"id":14461,"title":14462,"description":14463,"tiers":14464},"performance-monitoring","Performance Monitoring & Alerts","Track CPU, memory, and event loop performance across your instances and devices, with email alerts when something needs your attention.",{"edge":5404,"hub":5404,"fleet":5404},{"id":14466,"title":14467,"description":14468,"docsLink":14469,"subfeature":5404,"showOnPricing":14215,"tiers":14470},"instance-monitoring","Instance Monitoring","Enable alerts to be sent via email when your Node-RED instances encounter issues.","\u002Fdocs\u002Fuser\u002Finstance-settings\u002F#alerts",{"edge":5404,"hub":5404,"fleet":5404},{"id":14472,"title":14473,"subfeature":5404,"showOnPricing":14215,"tiers":14474},"email-alerts","Email Alerts",{"edge":5404,"hub":5404,"fleet":5404},{"id":14476,"title":14477,"showOnPricing":14215,"tiers":14478},"api-debug-length-limit","API\u002FDebug Length Limit",{"edge":5404,"hub":5404,"fleet":5404},{"id":14480,"title":14481,"tiers":14482},"protected-instances","Protected Instances",{"edge":14215,"hub":5404,"fleet":14215},{"id":14484,"title":14485,"features":14486},"govern-secure","Govern and Secure",[14487,14496,14502,14508,14513,14519,14525,14531,14539,14545,14551,14557],{"id":14488,"title":14489,"description":14490,"docsLink":14491,"changelog":14492,"tiers":14495},"single-sign-on","Single Sign-On (SSO)","Configure FlowFuse to work with your own SSO provider, allowing users to access FlowFuse with a single set of login credentials.","\u002Fdocs\u002Fadmin\u002Fsso\u002F",[14493],{"url":14494,"release":14268},"\u002Fchangelog\u002F2026\u002F07\u002Fapplication-sso-groups\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14497,"title":14498,"description":14499,"docsLink":14500,"tiers":14501},"two-factor-authentication","Two-Factor Authentication","Two-factor authentication adds an extra layer of security to your FlowFuse account.","\u002Fdocs\u002Fuser\u002Fuser-settings\u002F#two-factor-authentication",{"edge":5404,"hub":5404,"fleet":5404},{"id":14503,"title":14504,"description":14505,"docsLink":14506,"tiers":14507},"certified-nodes-it","Certified Nodes - IT","IT certified node bundle includes: Redis, MQTT, HTTP Request, AI nodes (Gemini, Claude, ChatGPT, Ollama), MCP Server","\u002Fblog\u002F2025\u002F07\u002Fcertified-nodes-v2\u002F",{"edge":14215,"hub":5404,"fleet":5404},{"id":14509,"title":14510,"description":14511,"tiers":14512},"certified-nodes-ot","Certified OT Connections - OPC-UA, Modbus, etc.","OT certified node bundle includes: OPC-UA, Modbus TCP & RTU, RTSP, EtherNet\u002FIP, AI nodes (Gemini, Claude, ChatGPT, Ollama), MCP Server",{"edge":5404,"hub":14215,"fleet":14215},{"id":14514,"title":14515,"description":14516,"docsLink":14517,"tiers":14518},"audit-log","Audit Log","Keep track of everything going on in your Node-RED instances and FlowFuse. Audit Logs provide details on what actions have taken place, when they happened, and who did them.","\u002Fdocs\u002Fuser\u002Flogs\u002F#audit-log",{"edge":5404,"hub":5404,"fleet":5404},{"id":14520,"title":14521,"description":14522,"docsLink":14523,"tiers":14524},"role-based-access-control","Role-Based Access Control","Control who can do what at both the team and application level, from viewers to admins.","\u002Fdocs\u002Fuser\u002Frole-based-access-control\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14526,"title":14527,"description":14528,"docsLink":14529,"subfeature":5404,"showOnPricing":14215,"tiers":14530},"application-level-rbac","Application-Level RBAC","Fine-grained access control per application, allowing team members to have different permission levels across different applications without requiring separate teams.","\u002Fdocs\u002Fuser\u002Frole-based-access-control\u002F#application-level-rbac",{"edge":5404,"hub":5404,"fleet":5404},{"id":14532,"title":14533,"description":14534,"changelog":14535,"subfeature":5404,"showOnPricing":14215,"tiers":14538},"scoped-personal-access-tokens","Scoped Personal Access Tokens","Restrict a Personal Access Token to specific teams, limit it to read-only operations, or control whether it carries admin privileges.",[14536],{"url":14537,"release":14268},"\u002Fchangelog\u002F2026\u002F07\u002Fscoped-pats\u002F",{"edge":5404,"hub":5404,"fleet":5404},{"id":14540,"title":14541,"description":14542,"docsLink":14543,"showOnPricing":14215,"tiers":14544},"team-members","Team Members","Invite multiple team members to collaborate on the same Node-RED flows.","\u002Fdocs\u002Fuser\u002Fteam\u002F#teams",{"edge":5404,"hub":5404,"fleet":5404},{"id":14546,"title":14547,"description":14548,"docsLink":14549,"showOnPricing":14215,"tiers":14550},"endpoint-security","Endpoint Security","Secure HTTP endpoints for hosted Node-RED instances using FlowFuse credentials.","\u002Fdocs\u002Fuser\u002Finstance-settings\u002F#security",{"edge":5404,"hub":5404,"fleet":5404},{"id":14552,"title":14553,"description":14554,"docsLink":14555,"tiers":14556},"baa-for-hipaa","BAA for HIPAA","FlowFuse can sign a Business Associate Agreement to ensure proper safeguarding of protected health information handled on your behalf.","\u002Fhandbook\u002Fsales\u002Fsubscription-agreement-1.5\u002F",{"edge":14215,"hub":5404,"fleet":14215},{"id":14558,"title":14559,"description":14560,"tiers":14561},"sbom","Software Bill of Materials","A complete list of all software components used in your Node-RED instances and hosted applications, including version numbers and license information.",{"edge":14215,"hub":5404,"fleet":14215},{"id":14563,"title":14564,"features":14565},"support","Support",[14566,14571,14575],{"id":14567,"title":14568,"docsLink":14569,"tiers":14570},"installation-support","Installation Support","\u002Fdocs\u002Finstall\u002Fintroduction\u002F#do-you-need-help-installation-service",{"edge":5404,"hub":5404,"fleet":5404},{"id":14572,"title":14573,"showOnPricing":14215,"tiers":14574},"live-chat-support","Live Chat Support",{"edge":5404,"hub":5404,"fleet":5404},{"id":14576,"title":14577,"docsLink":14578,"tiers":14579},"enterprise-support","Enterprise Support","\u002Fdocs\u002Fpremium-support\u002F",{"edge":5404,"hub":5404,"fleet":5404},"feature-catalog","0AnkhTIPCECCwP9NmbTWP5HvRYx4FTSao4lG93-HaWM",[14583,14586,14589,14592,14595,14598,14600,14603,14606,14609,14612,14614,14617,14620,14623,14626,14629,14632,14635,14638,14641,14644,14647,14650,14653,14656,14659,14662,14665,14668,14671,14674,14677,14680,14683,14686,14689,14692,14695,14698,14701,14704,14707,14710,14713,14716,14719,14722,14725,14727,14730,14733,14736,14739,14742,14745,14748,14750,14753,14756,14759,14762,14765,14767,14770,14773,14776,14779,14782,14785,14788,14791,14794,14797,14799,14802,14805,14808,14811,14814,14817,14820,14823,14826,14829,14832,14835,14838,14841,14843,14846,14849,14852,14855,14858,14861,14864,14867,14870,14873,14876,14879,14882,14885,14888,14891,14894,14897,14899,14902,14905,14908,14911,14914,14917,14920,14922,14925,14928,14931,14934,14937,14940,14943,14946,14949,14952,14955,14958,14961,14964,14967,14970,14973,14976,14979,14982,14985,14988,14991,14994,14997,15000,15003,15006,15009,15012,15015,15018,15021,15024,15027,15030,15033,15036,15039,15042,15045,15048,15051,15054,15057,15060,15063,15066,15069,15072,15074,15077,15080,15083,15086,15089,15092,15095,15098,15101,15104,15107,15110,15113],{"path":14584,"title":14585},"\u002Fchangelog\u002F2023\u002F09\u002Fcustom-node-support","Custom Node Support",{"path":14587,"title":14588},"\u002Fchangelog\u002F2023\u002F09\u002Fdevops-actions","DevOps Pipeline with action selection",{"path":14590,"title":14591},"\u002Fchangelog\u002F2023\u002F09\u002Fintroduction-enterprise-tier","Introducing the Enterprise Tier",{"path":14593,"title":14594},"\u002Fchangelog\u002F2023\u002F09\u002Fpipeline-api","API Endpoint for DevOps Pipeline",{"path":14596,"title":14597},"\u002Fchangelog\u002F2023\u002F09\u002Fsnapshots-devices","Usability improvements to Device Management",{"path":14599,"title":14308},"\u002Fchangelog\u002F2023\u002F10\u002Fblueprints",{"path":14601,"title":14602},"\u002Fchangelog\u002F2023\u002F10\u002Fcertified-nodes","Certified Nodes",{"path":14604,"title":14605},"\u002Fchangelog\u002F2023\u002F10\u002Fdevice-snapshot-selection","Enhanced Snapshot Selection",{"path":14607,"title":14608},"\u002Fchangelog\u002F2023\u002F10\u002Fpath-bug-fix","Device Agent path bug fix",{"path":14610,"title":14611},"\u002Fchangelog\u002F2023\u002F10\u002Fresource-alerts","Resource Monitoring in Audit Log",{"path":14613,"title":14498},"\u002Fchangelog\u002F2023\u002F11\u002F2fa",{"path":14615,"title":14616},"\u002Fchangelog\u002F2023\u002F11\u002Fdefault-editor","Device Editor enabled by default",{"path":14618,"title":14619},"\u002Fchangelog\u002F2023\u002F11\u002Fdevices-in-pipelines","Devices in DevOps Pipelines",{"path":14621,"title":14622},"\u002Fchangelog\u002F2023\u002F11\u002Fproject-nodes-devices","Project Nodes for Devices",{"path":14624,"title":14625},"\u002Fchangelog\u002F2023\u002F12\u002Fbilling","No Credit Card required for billing",{"path":14627,"title":14628},"\u002Fchangelog\u002F2023\u002F12\u002Fblueprint-selection","Blueprint Selection Update",{"path":14630,"title":14631},"\u002Fchangelog\u002F2023\u002F12\u002Fdevice-groups","Device Groups",{"path":14633,"title":14634},"\u002Fchangelog\u002F2023\u002F12\u002Femail-alerting-node-red-crash","Email Alerts for Audit Log Events",{"path":14636,"title":14637},"\u002Fchangelog\u002F2023\u002F12\u002Fnode-red-updated","Node-RED 3.1.3 now available",{"path":14639,"title":14640},"\u002Fchangelog\u002F2024\u002F01\u002Fdevice-audit-log","Introducing the Device Auditlog Feature",{"path":14642,"title":14643},"\u002Fchangelog\u002F2024\u002F01\u002Fdevice-groups-snapshot","Device Groups - Automatic snapshot assignment",{"path":14645,"title":14646},"\u002Fchangelog\u002F2024\u002F01\u002Ffleet-mode","Renaming \"Default Device Mode\" to \"Fleet Mode\"",{"path":14648,"title":14649},"\u002Fchangelog\u002F2024\u002F01\u002Fhelm-v2","Helm Chart v2.0",{"path":14651,"title":14652},"\u002Fchangelog\u002F2024\u002F01\u002Fnew-blueprints","New Blueprints added",{"path":14654,"title":14655},"\u002Fchangelog\u002F2024\u002F01\u002Fsecurity-updates","Security Updates",{"path":14657,"title":14658},"\u002Fchangelog\u002F2024\u002F01\u002Fsso-team-membership","Managing Team Membership via SSO",{"path":14660,"title":14661},"\u002Fchangelog\u002F2024\u002F01\u002Fstreamlined-device-assignment","Streamlined Device assignment",{"path":14663,"title":14664},"\u002Fchangelog\u002F2024\u002F02\u002Fdevice-auto-snapshot","Device Auto Snapshots",{"path":14666,"title":14667},"\u002Fchangelog\u002F2024\u002F02\u002Fdevice-instance-audit-logs","Device Instance Audit Logging",{"path":14669,"title":14670},"\u002Fchangelog\u002F2024\u002F02\u002Fdevice-onboarding-improvements","Device Onboarding Improvements",{"path":14672,"title":14673},"\u002Fchangelog\u002F2024\u002F02\u002Fdevice-pricing-change","Pricing change for Devices",{"path":14675,"title":14676},"\u002Fchangelog\u002F2024\u002F02\u002Finstance-auto-snapshots","Instance Auto Snapshots",{"path":14678,"title":14679},"\u002Fchangelog\u002F2024\u002F02\u002Fpostgresql-upgrade","PostgreSQL Version update",{"path":14681,"title":14682},"\u002Fchangelog\u002F2024\u002F03\u002Fbearer-token-authentication","Bearer Token Authentication for Node-RED Instances",{"path":14684,"title":14685},"\u002Fchangelog\u002F2024\u002F03\u002Finstance-protection-mode","Instance Protection Mode",{"path":14687,"title":14688},"\u002Fchangelog\u002F2024\u002F03\u002Flimits-debug-payload","Configure HTTP Payload and Debug Message size",{"path":14690,"title":14691},"\u002Fchangelog\u002F2024\u002F03\u002Frestart-devices-remotly","Remote Device Restart",{"path":14693,"title":14694},"\u002Fchangelog\u002F2024\u002F04\u002Fcustom-nodes-on-devices","Custom Nodes Support on Devices",{"path":14696,"title":14697},"\u002Fchangelog\u002F2024\u002F04\u002Fdevice-auto-snapshot","Direct Dashboard Access",{"path":14699,"title":14700},"\u002Fchangelog\u002F2024\u002F04\u002Fimproving-device-groups","Improving Device Groups",{"path":14702,"title":14703},"\u002Fchangelog\u002F2024\u002F04\u002Fpricing-change","Pricing change Enterprise & Teams Tier",{"path":14705,"title":14706},"\u002Fchangelog\u002F2024\u002F04\u002Ftougher-rate-limiting","Tougher Rate Limiting on Public Routes",{"path":14708,"title":14709},"\u002Fchangelog\u002F2024\u002F05\u002Finstance-healthcheck","Customizing instance health-check settings",{"path":14711,"title":14712},"\u002Fchangelog\u002F2024\u002F05\u002Flibrary-blueprints","Blueprints added to Library",{"path":14714,"title":14715},"\u002Fchangelog\u002F2024\u002F05\u002Flibrary-flowviewer","Team Library - Flow Viewer",{"path":14717,"title":14718},"\u002Fchangelog\u002F2024\u002F05\u002Fmanaging-node-red-version-on-devices","Managing Node-RED versions on Devices",{"path":14720,"title":14721},"\u002Fchangelog\u002F2024\u002F05\u002Fsnapshot-improvements","Snapshot Improvements",{"path":14723,"title":14724},"\u002Fchangelog\u002F2024\u002F05\u002Fsnapshot-improvements-pt3","Snapshot Upload",{"path":14726,"title":14724},"\u002Fchangelog\u002F2024\u002F05\u002Fsnapshot-upload",{"path":14728,"title":14729},"\u002Fchangelog\u002F2024\u002F06\u002Fdevice-agent-proxy-support","Running the Device Agent behind an HTTP proxy",{"path":14731,"title":14732},"\u002Fchangelog\u002F2024\u002F06\u002Flibrary-blueprints","Custom hostnames for your instances",{"path":14734,"title":14735},"\u002Fchangelog\u002F2024\u002F06\u002Fmultiline-env-vars","Multi-line Environment Variables",{"path":14737,"title":14738},"\u002Fchangelog\u002F2024\u002F06\u002Fsnapshot-flow-compare","Compare Snapshots flows",{"path":14740,"title":14741},"\u002Fchangelog\u002F2024\u002F07\u002Fapplications-search","Applications Search",{"path":14743,"title":14744},"\u002Fchangelog\u002F2024\u002F07\u002Fdevice-group-clear-snapshot","Device Groups Snapshots",{"path":14746,"title":14747},"\u002Fchangelog\u002F2024\u002F07\u002Fdevice-management-bulk-delete","Managing devices",{"path":14749,"title":14747},"\u002Fchangelog\u002F2024\u002F07\u002Fdevice-management-bulk-move",{"path":14751,"title":14752},"\u002Fchangelog\u002F2024\u002F07\u002Fedit-snapshots","Edit Snapshots",{"path":14754,"title":14755},"\u002Fchangelog\u002F2024\u002F07\u002Fflowfuse-assistant","The FlowFuse Expert",{"path":14757,"title":14758},"\u002Fchangelog\u002F2024\u002F07\u002Fflowfuse-assistant-json","FlowFuse Expert Writes JSON",{"path":14760,"title":14761},"\u002Fchangelog\u002F2024\u002F07\u002Fimmersive-editor","Immersive Editor Experience",{"path":14763,"title":14764},"\u002Fchangelog\u002F2024\u002F07\u002Fnotifications-inbox","Notifications Inbox",{"path":14766,"title":14764},"\u002Fchangelog\u002F2024\u002F07\u002Fnotifications-update",{"path":14768,"title":14769},"\u002Fchangelog\u002F2024\u002F07\u002Fpersistent-storage","Persistent Storage on FlowFuse Cloud",{"path":14771,"title":14772},"\u002Fchangelog\u002F2024\u002F07\u002Fsso","Single Sign On Updates",{"path":14774,"title":14775},"\u002Fchangelog\u002F2024\u002F08\u002Fbill-of-materials","Bill of Materials",{"path":14777,"title":14778},"\u002Fchangelog\u002F2024\u002F08\u002Fenterprise-license-update","Enforcing Enterprise Restrictions",{"path":14780,"title":14781},"\u002Fchangelog\u002F2024\u002F08\u002Fldap-sso-groups","LDAP Single Sign On Updates",{"path":14783,"title":14784},"\u002Fchangelog\u002F2024\u002F08\u002Fstatic-file-service-navigation-visibility","Static File Service Navigation and Visibility",{"path":14786,"title":14787},"\u002Fchangelog\u002F2024\u002F10\u002Fdevice-group-env-vars","Environment Variables for your Device Groups",{"path":14789,"title":14790},"\u002Fchangelog\u002F2024\u002F10\u002Fmqtt-service","MQTT Broker Service",{"path":14792,"title":14793},"\u002Fchangelog\u002F2024\u002F10\u002Fnotifications-bulk-actions","Managing Notifications",{"path":14795,"title":14796},"\u002Fchangelog\u002F2024\u002F10\u002Fsnapshot-download-upload-options","Snapshot Upload and Download Improvements",{"path":14798,"title":14437},"\u002Fchangelog\u002F2024\u002F10\u002Fversion-history-timeline",{"path":14800,"title":14801},"\u002Fchangelog\u002F2024\u002F11\u002Faudit-log-hierarchy","Audit logs show hierarchical events",{"path":14803,"title":14804},"\u002Fchangelog\u002F2024\u002F11\u002Fdevice-agent-release","Device Agent 3.0 released",{"path":14806,"title":14807},"\u002Fchangelog\u002F2024\u002F11\u002Fmqtt-topic-hierarchy","MQTT Topic Hierarchy view",{"path":14809,"title":14810},"\u002Fchangelog\u002F2024\u002F11\u002Fteam-search","Team-wide search",{"path":14812,"title":14813},"\u002Fchangelog\u002F2024\u002F12\u002Fdashboad-iframe","Allow Dashboards to be embedded in iFrames",{"path":14815,"title":14816},"\u002Fchangelog\u002F2024\u002F12\u002Fdevice-editor-cache","Device Editor Access Speed Up",{"path":14818,"title":14819},"\u002Fchangelog\u002F2024\u002F12\u002Fteam-bom-timeline","Team BOM and Pipeline Views",{"path":14821,"title":14822},"\u002Fchangelog\u002F2025\u002F01\u002Ffree-tier-onboarding","New Onboarding Tour for Free Tier Users",{"path":14824,"title":14825},"\u002Fchangelog\u002F2025\u002F01\u002Fhidden-env-vars","Hidden Environment Variables",{"path":14827,"title":14828},"\u002Fchangelog\u002F2025\u002F01\u002Fimproved-diagnostics","Improved Diagnostics",{"path":14830,"title":14831},"\u002Fchangelog\u002F2025\u002F01\u002Fteam-level-groups","Team level view of Groups",{"path":14833,"title":14834},"\u002Fchangelog\u002F2025\u002F02\u002Fadditional-device-version-history-events","New Remote Instances Version History Events",{"path":14836,"title":14837},"\u002Fchangelog\u002F2025\u002F02\u002Fbroker-error-feedback","Improved Broker Connection Feedback",{"path":14839,"title":14840},"\u002Fchangelog\u002F2025\u002F02\u002Fdevice-agent-updates","FlowFuse User Authentication on Remote Instances",{"path":14842,"title":14437},"\u002Fchangelog\u002F2025\u002F02\u002Fdevice-version-history-timeline",{"path":14844,"title":14845},"\u002Fchangelog\u002F2025\u002F02\u002Fexternal-brokers","External MQTT Brokers",{"path":14847,"title":14848},"\u002Fchangelog\u002F2025\u002F02\u002Fmqtt-schema-suggestions","MQTT Smart Schema Suggestions",{"path":14850,"title":14851},"\u002Fchangelog\u002F2025\u002F02\u002Fresend-and-extend-team-invitation-expiration","Re-send Team Invitations",{"path":14853,"title":14854},"\u002Fchangelog\u002F2025\u002F02\u002Fschema-docs","Personalized Schema Documentation",{"path":14856,"title":14857},"\u002Fchangelog\u002F2025\u002F02\u002Ftopic-hierarchy-search","Search & Filter for Topic Hierarchy List",{"path":14859,"title":14860},"\u002Fchangelog\u002F2025\u002F03\u002Fcontainer-tags","Changes to tags for flowfuse\u002Fnode-red",{"path":14862,"title":14863},"\u002Fchangelog\u002F2025\u002F03\u002Fdevice-groups","Multiple Device Groups in a pipeline",{"path":14865,"title":14866},"\u002Fchangelog\u002F2025\u002F03\u002Fdevice-local-login","Local Login for Remote Instances",{"path":14868,"title":14869},"\u002Fchangelog\u002F2025\u002F03\u002Ffree-tier","Free Tier now more accessible to all",{"path":14871,"title":14872},"\u002Fchangelog\u002F2025\u002F03\u002Fresource-notifications","Resource Alerts",{"path":14874,"title":14875},"\u002Fchangelog\u002F2025\u002F03\u002Fsnapshot-filter","Filtering Snapshots",{"path":14877,"title":14878},"\u002Fchangelog\u002F2025\u002F03\u002Fteam-npm-registry","NPM Package Hosting",{"path":14880,"title":14881},"\u002Fchangelog\u002F2025\u002F03\u002Ftopic-deletion","MQTT Topic Management",{"path":14883,"title":14884},"\u002Fchangelog\u002F2025\u002F04\u002Fdevice-provisioning","Remote Instance Provisioning",{"path":14886,"title":14887},"\u002Fchangelog\u002F2025\u002F04\u002Fgit-integration","Git Integration with Pipelines",{"path":14889,"title":14890},"\u002Fchangelog\u002F2025\u002F04\u002Finstance-log-browsing","Better Node-RED log handling",{"path":14892,"title":14893},"\u002Fchangelog\u002F2025\u002F05\u002Fimport-node-red-flows","Import Node-RED Flows During Remote Instance Setup",{"path":14895,"title":14896},"\u002Fchangelog\u002F2025\u002F06\u002Fflowfuse-assistant","FlowFuse Expert just got smarter",{"path":14898,"title":14896},"\u002Fchangelog\u002F2025\u002F06\u002Fflowfuse-assistant-2",{"path":14900,"title":14901},"\u002Fchangelog\u002F2025\u002F06\u002Fgit-integration","Pulling snapshots from Git with Pipelines",{"path":14903,"title":14904},"\u002Fchangelog\u002F2025\u002F06\u002Finstance-performance-memory","Memory Metrics in Instance Performance View",{"path":14906,"title":14907},"\u002Fchangelog\u002F2025\u002F06\u002Fnew-home-page","Introducing the New Home Page Experience",{"path":14909,"title":14910},"\u002Fchangelog\u002F2025\u002F06\u002Fteam-performance","Team Performance Feature",{"path":14912,"title":14913},"\u002Fchangelog\u002F2025\u002F06\u002Fteam-performance-view","Instance Performance View",{"path":14915,"title":14916},"\u002Fchangelog\u002F2025\u002F06\u002Fui-refresh","Navigation UI Refresh",{"path":14918,"title":14919},"\u002Fchangelog\u002F2025\u002F07\u002Fbrowse-node-red-flows","Browse for Node-RED Flows During Remote Instance Setup",{"path":14921,"title":14262},"\u002Fchangelog\u002F2025\u002F07\u002Fflowfuse-tables",{"path":14923,"title":14924},"\u002Fchangelog\u002F2025\u002F07\u002Fimport-blueprints","Import blueprints directly into your existing instances",{"path":14926,"title":14927},"\u002Fchangelog\u002F2025\u002F07\u002Fsimplified-applications-overview","Simplified Applications Page with Summary Tiles",{"path":14929,"title":14930},"\u002Fchangelog\u002F2025\u002F07\u002Fsmart-suggestions","Smart Suggestions",{"path":14932,"title":14933},"\u002Fchangelog\u002F2025\u002F07\u002Fteam-to-pro-plan-rename","Team Plan Renamed to Pro Plan",{"path":14935,"title":14936},"\u002Fchangelog\u002F2025\u002F08\u002Fai-generated-snapshot-descriptions-hosted","Generate snapshot descriptions with AI",{"path":14938,"title":14939},"\u002Fchangelog\u002F2025\u002F08\u002Fai-generated-snapshot-descriptions-remote","AI Snapshot Descriptions Now Work with Remote Instances",{"path":14941,"title":14942},"\u002Fchangelog\u002F2025\u002F08\u002Fdevice-performance","FlowFuse Remote Instance Performance Data",{"path":14944,"title":14945},"\u002Fchangelog\u002F2025\u002F08\u002Fdirect-sso","Direct SSO Login",{"path":14947,"title":14948},"\u002Fchangelog\u002F2025\u002F08\u002Fflowfuse-assistant","FlowFuse Expert documents your flows",{"path":14950,"title":14951},"\u002Fchangelog\u002F2025\u002F08\u002Fflowfuse-mqtt","FlowFuse MQTT",{"path":14953,"title":14954},"\u002Fchangelog\u002F2025\u002F08\u002Fhttp-cors","Configure HTTP CORS",{"path":14956,"title":14957},"\u002Fchangelog\u002F2025\u002F08\u002Fsubflow-export","Export SubFlow as Node-RED module",{"path":14959,"title":14960},"\u002Fchangelog\u002F2025\u002F08\u002Ftables-assistant","FlowFuse Tables with a little help from the Assistant",{"path":14962,"title":14963},"\u002Fchangelog\u002F2025\u002F09\u002Fexpose-saml-groups-to-dashboard","Allow SSO groups to be shared with the Node-RED Dashboard",{"path":14965,"title":14966},"\u002Fchangelog\u002F2025\u002F09\u002Finline-assist","FlowFuse Expert can help you write code",{"path":14968,"title":14969},"\u002Fchangelog\u002F2025\u002F09\u002Fretiring-flowforge-device-agent","No more @flowforge\u002Fflowforge-device-agent releases",{"path":14971,"title":14972},"\u002Fchangelog\u002F2025\u002F09\u002Frevised-instance-snapshot-ui","Streamlined Snapshot Management",{"path":14974,"title":14975},"\u002Fchangelog\u002F2025\u002F09\u002Fteam-broker-async-api","Capture Async API data from FlowFuse Team Broker",{"path":14977,"title":14978},"\u002Fchangelog\u002F2025\u002F10\u002Fapplication-level-rbac","Application-level access control for Enterprise teams",{"path":14980,"title":14981},"\u002Fchangelog\u002F2025\u002F10\u002Fbulk-device-group-assignment","Easier Access to Bulk Device Group Management",{"path":14983,"title":14984},"\u002Fchangelog\u002F2025\u002F10\u002Fduplicate-instances-across-applications","Duplicate Instances Across Different Applications",{"path":14986,"title":14987},"\u002Fchangelog\u002F2025\u002F10\u002Fimport-flows-on-instance-creation","Import flows during instance creation",{"path":14989,"title":14990},"\u002Fchangelog\u002F2025\u002F10\u002Fmcp-nodes","FlowFuse MCP Server Nodes",{"path":14992,"title":14993},"\u002Fchangelog\u002F2025\u002F10\u002Fonnx-nodes","FlowFuse AI Nodes",{"path":14995,"title":14996},"\u002Fchangelog\u002F2025\u002F10\u002Fsettings-page-device-group-management","Device Group Management from Settings Page",{"path":14998,"title":14999},"\u002Fchangelog\u002F2025\u002F11\u002Fff-expert-update","FlowFuse Expert Update",{"path":15001,"title":15002},"\u002Fchangelog\u002F2025\u002F11\u002Fminimum-nodejs-version","Node.js v20 Minimum Version Requirement",{"path":15004,"title":15005},"\u002Fchangelog\u002F2025\u002F11\u002Fsso-session","SSO control over Session life",{"path":15007,"title":15008},"\u002Fchangelog\u002F2025\u002F12\u002Fff-expert-mcp-insights","FlowFuse Expert: Now with MCP-Powered Insights",{"path":15010,"title":15011},"\u002Fchangelog\u002F2025\u002F12\u002Fscheduled-maintenance","Scheduled Maintenance Mode",{"path":15013,"title":15014},"\u002Fchangelog\u002F2026\u002F01\u002Fdevice-agent-containers","Device Agent Docker Containers updated",{"path":15016,"title":15017},"\u002Fchangelog\u002F2026\u002F01\u002Fff-expert-manage-palette","FlowFuse Expert: Enhanced Palette Integration",{"path":15019,"title":15020},"\u002Fchangelog\u002F2026\u002F01\u002Fff-expert-nr-actions","FlowFuse Expert: Integration with Node-RED",{"path":15022,"title":15023},"\u002Fchangelog\u002F2026\u002F01\u002Fff-expert-palette-queries","FlowFuse Expert: Palette Queries",{"path":15025,"title":15026},"\u002Fchangelog\u002F2026\u002F01\u002Fff-expert-select-flows","FlowFuse Expert: Ask about your flows",{"path":15028,"title":15029},"\u002Fchangelog\u002F2026\u002F01\u002Fmcp-rbacs","FlowFuse Expert: MCP-Powered Insights with RBACs",{"path":15031,"title":15032},"\u002Fchangelog\u002F2026\u002F01\u002Fmcp-security","FlowFuse Expert: MCP-Powered Insights",{"path":15034,"title":15035},"\u002Fchangelog\u002F2026\u002F02\u002Fdevice-agent-nodejs-options","Set Node.js Options for Remote Instances",{"path":15037,"title":15038},"\u002Fchangelog\u002F2026\u002F02\u002Fff-expert-debug-log-context","FlowFuse Expert: Helping you make sense of your debug log",{"path":15040,"title":15041},"\u002Fchangelog\u002F2026\u002F02\u002Fff-expert-update-banner","FlowFuse Expert: Never Miss an Update",{"path":15043,"title":15044},"\u002Fchangelog\u002F2026\u002F02\u002Fha-instance-rolling-restart","HA Hosted Instance Rolling Restart",{"path":15046,"title":15047},"\u002Fchangelog\u002F2026\u002F02\u002Fremote-instances-immersive-editor","Immersive Mode for Remote Instances",{"path":15049,"title":15050},"\u002Fchangelog\u002F2026\u002F02\u002Frestoring-snapshots-to-remote-instances","Restoring snapshots to developer-mode Remote Instances",{"path":15052,"title":15053},"\u002Fchangelog\u002F2026\u002F03\u002Fazure-dev-ops-gitops","Azure DevOps Pipeline support",{"path":15055,"title":15056},"\u002Fchangelog\u002F2026\u002F03\u002Fdeveloper-mode-in-immersive-editor","Developer Mode Now Accessible from the Immersive Editor",{"path":15058,"title":15059},"\u002Fchangelog\u002F2026\u002F03\u002Fembedded-editor-tab-title","Embedded Editor Now Shows Active Tab",{"path":15061,"title":15062},"\u002Fchangelog\u002F2026\u002F03\u002Fmarch-scheduled-maintenance","Updated: Upcoming Scheduled Server Maintenance on March 28th, 2026",{"path":15064,"title":15065},"\u002Fchangelog\u002F2026\u002F03\u002Fsnapshot-detail-modal-immersive-editor","View Snapshot Details in the Immersive Editor",{"path":15067,"title":15068},"\u002Fchangelog\u002F2026\u002F04\u002Fexpert-action-links","FlowFuse expert action links",{"path":15070,"title":15071},"\u002Fchangelog\u002F2026\u002F04\u002Fhosted-instance-url-env-var","Hosted Instances know their own URL",{"path":15073,"title":14331},"\u002Fchangelog\u002F2026\u002F04\u002Fimmersive-editor-drawer",{"path":15075,"title":15076},"\u002Fchangelog\u002F2026\u002F04\u002Fsnapshot-diff-viewer","Richer snapshot comparison view",{"path":15078,"title":15079},"\u002Fchangelog\u002F2026\u002F05\u002Fai-opt-out","AI Feature Opt-Out for Teams",{"path":15081,"title":15082},"\u002Fchangelog\u002F2026\u002F05\u002Fexpert-application-building","FlowFuse Expert Builds Your Application",{"path":15084,"title":15085},"\u002Fchangelog\u002F2026\u002F05\u002Fsingle-sso-provider","Single SSO provider for all users",{"path":15087,"title":15088},"\u002Fchangelog\u002F2026\u002F06\u002Fdark-mode","Dark Mode",{"path":15090,"title":15091},"\u002Fchangelog\u002F2026\u002F06\u002Fdevice-agent-v4-released","Device Agent v4 released",{"path":15093,"title":15094},"\u002Fchangelog\u002F2026\u002F06\u002Fgeneric-git-server-support","Connect Pipelines to Any Git Server",{"path":15096,"title":15097},"\u002Fchangelog\u002F2026\u002F06\u002Fjuly-scheduled-maintenance","Updated: Upcoming Scheduled Server Maintenance on July 11th, 2026",{"path":15099,"title":15100},"\u002Fchangelog\u002F2026\u002F07\u002Fapplication-sso-groups","Application Roles from SSO Groups",{"path":15102,"title":15103},"\u002Fchangelog\u002F2026\u002F07\u002Fdevice-agent-onboarding","Getting started with FlowFuse straight from the terminal",{"path":15105,"title":15106},"\u002Fchangelog\u002F2026\u002F07\u002Fexpert-enhancements","FlowFuse Expert Enhancements",{"path":15108,"title":15109},"\u002Fchangelog\u002F2026\u002F07\u002Fexpert-tables-automation","FlowFuse Expert Can Now Work With Your Tables",{"path":15111,"title":15112},"\u002Fchangelog\u002F2026\u002F07\u002Fscoped-pats","Team Scoped Personal Access Tokens",{"path":15114,"title":15115},"\u002Fchangelog\u002F2026\u002F07\u002Fteam-and-application-dashboards","A Dedicated Home for Your Dashboards",[],1786105903022]