update full objects type
Some checks are pending
Test / test (push) Waiting to run

This commit is contained in:
2026-06-20 11:43:48 +02:00
parent 90e8e9d252
commit 365a15c32a
16 changed files with 4253 additions and 21 deletions

View File

@@ -863,6 +863,56 @@
</div>
</div>
<div class="page" id="pageSounds" data-page-content="sounds" hidden>
<div class="soundsPage">
<section class="card">
<div class="cardHeader">
<div>
<div class="cardTitle" data-i18n="sounds.title">Sounds</div>
<div class="cardSub" data-i18n="sounds.subtitle">Setup → Sounds — upload and manage robot sounds for sound zones.</div>
</div>
<button id="soundCreateBtn" type="button" class="btn primary" data-i18n="sounds.create">Create sound</button>
</div>
<div class="cardBody">
<div id="soundListEmpty" class="mutedNote" hidden data-i18n="sounds.empty">No sounds yet. Create one to use in sound zones.</div>
<div id="soundList" class="missionList"></div>
</div>
</section>
</div>
<dialog id="soundEditDialog" class="mapsMirDialog">
<form id="soundEditForm" method="dialog">
<h2 class="mapsMirDialogTitle" id="soundEditTitle" data-i18n="sounds.createTitle">Create sound</h2>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="sounds.name">Name</span>
<input type="text" id="soundEditName" autocomplete="off" required />
</label>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="sounds.description">Description</span>
<textarea id="soundEditDescription" rows="2"></textarea>
</label>
<label class="mapsMirField mapsMirField--checkbox">
<input type="checkbox" id="soundEditEnabled" checked />
<span data-i18n="sounds.enabled">Enabled</span>
</label>
<div class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="sounds.file">Audio file</span>
<p id="soundEditFileMeta" class="mutedNote"></p>
<div class="mapsMirDialogFooter mapsMirDialogFooter--inline">
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="soundEditUploadBtn" data-i18n="sounds.upload">Upload file…</button>
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="soundEditPlayBtn" disabled data-i18n="sounds.play">Play</button>
</div>
<input type="file" id="soundEditUploadInput" accept="audio/*,.wav,.mp3,.ogg" hidden />
</div>
<div class="mapsMirDialogFooter">
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="soundEditCancelBtn" data-i18n="common.cancel">Cancel</button>
<button type="button" class="mapsMirBtn mapsMirBtn--danger" id="soundEditDeleteBtn" hidden data-i18n="common.delete">Delete</button>
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
</div>
</form>
</dialog>
</div>
<div class="page" id="pageMaps" data-page-content="maps" hidden>
<div id="mapsListView" class="mapsMirPage">
<header class="mapsMirHeader">
@@ -993,7 +1043,7 @@
</button>
</header>
<div class="mapEditorMappingBar" role="toolbar" data-i18n-aria="maps.editor.toolbarAria">
<div class="mapEditorMappingBar" id="mapEditorMappingBar" role="toolbar" data-i18n-aria="maps.editor.toolbarAria">
<button type="button" class="mapEditorMapTool" id="mapEditorSearchBtn" disabled data-i18n-title="maps.editor.tool.search" title="Search">
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><circle cx="8.5" cy="8.5" r="5.5" fill="none" stroke="currentColor" stroke-width="1.6"/><path d="M12.5 12.5L17 17" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
</button>
@@ -1010,9 +1060,119 @@
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M10 2.5v15M2.5 10h15" stroke="currentColor" stroke-width="1.2"/><path d="M10 2.5L8 5.5h4L10 2.5zM10 17.5l-2-3h4l-2 3zM2.5 10l3-2v4l-3-2zM17.5 10l-3-2v4l3-2z" fill="currentColor"/></svg>
</button>
<div class="mapEditorMappingBarSpacer" aria-hidden="true"></div>
<select class="mapEditorObjectSelect" id="mapEditorObjectSelect" disabled>
<option value="" data-i18n="maps.editor.objectTypesNone">No object-type selected</option>
</select>
<div class="mapEditorObjectTypePicker" id="mapEditorObjectTypePicker">
<button
type="button"
class="mapEditorObjectTypeBtn"
id="mapEditorObjectTypeBtn"
disabled
aria-haspopup="listbox"
aria-expanded="false"
aria-controls="mapEditorObjectTypeMenu"
>
<span class="mapEditorObjectTypeIcon" id="mapEditorObjectTypeIcon" aria-hidden="true"></span>
<span class="mapEditorObjectTypeLabel" id="mapEditorObjectTypeLabel" data-i18n="maps.editor.objectTypesNone">No object-type selected</span>
<svg class="mapEditorObjectTypeChevron" width="10" height="6" viewBox="0 0 10 6" aria-hidden="true"><path d="M1 1l4 4 4-4" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/></svg>
</button>
<ul class="mapEditorObjectTypeMenu" id="mapEditorObjectTypeMenu" role="listbox" hidden>
<li class="mapEditorObjectTypeOption" role="option" data-value="" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><rect x="3" y="3" width="12" height="12" rx="1.5" fill="none" stroke="currentColor" stroke-width="1.4" stroke-dasharray="2.5 2"/></svg>
</span>
<span data-i18n="maps.editor.objectTypesNone">No object-type selected</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="wall" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--wall" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><path d="M3 14L15 4" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.wall">Walls</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="floor" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--floor" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.18" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.floor">Floors</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="position" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--position" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><circle cx="4.5" cy="9" r="2.2" fill="currentColor"/><path d="M7 9h8M13 9l-2.5-2.2M13 9l-2.5 2.2" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.position">Positions</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="forbidden" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--forbidden" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.22" stroke="currentColor" stroke-width="1.5"/><path d="M5 13L13 5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.forbidden">Forbidden zones</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="preferred" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--preferred" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.28" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.preferred">Preferred zones</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="unpreferred" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--unpreferred" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.18" stroke="currentColor" stroke-width="1.5" stroke-dasharray="3 2" stroke-linejoin="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.unpreferred">Unpreferred zones</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="speed" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--speed" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.2" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 11h6M9 8v3" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.speed">Speed zones</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="sound" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--sound" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.18" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M6 10.5v-3h2l2.5-1.5v7L8 11.5H6z" fill="currentColor" fill-opacity="0.5"/></svg>
</span>
<span data-i18n="maps.editor.objectType.sound">Sound zones</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="directional" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--directional" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.16" stroke="currentColor" stroke-width="1.5"/><path d="M6 9h6M10 9l-2-2M10 9l-2 2" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.directional">Directional zones</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="directional_line" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--directionalLine" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><path d="M3 14L15 4" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/><path d="M11 4h4v4" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.directionalLine">Directional lines</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="planner" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--planner" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.14" stroke="currentColor" stroke-width="1.5" stroke-dasharray="4 2"/><circle cx="9" cy="9" r="2" fill="currentColor"/></svg>
</span>
<span data-i18n="maps.editor.objectType.planner">Planner zones</span>
</li>
<li class="mapEditorObjectTypeOption" role="option" data-value="io" tabindex="-1">
<span class="mapEditorObjectTypeOptionIcon mapEditorObjectTypeOptionIcon--io" aria-hidden="true">
<svg width="18" height="18" viewBox="0 0 18 18"><polygon points="3,14 9,4 15,14" fill="currentColor" fill-opacity="0.12" stroke="currentColor" stroke-width="1.5"/><path d="M6.5 10h5M8 8v4M10 8v4" stroke="currentColor" stroke-width="1.3" stroke-linecap="round"/></svg>
</span>
<span data-i18n="maps.editor.objectType.io">I/O zones</span>
</li>
</ul>
</div>
<button type="button" class="mapEditorMapTool" id="mapEditorDrawBtn" data-tool="draw" disabled data-i18n-title="maps.editor.tool.draw" title="Draw">
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.5 3.5l2 2-9 9H5.5v-2l9-9z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/><path d="M12.5 5.5l2 2" stroke="currentColor" stroke-width="1.4"/></svg>
</button>
<button type="button" class="mapEditorMapTool" id="mapEditorSelectBtn" data-tool="select" disabled data-i18n-title="maps.editor.tool.select" title="Select">
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M4 3l12 7-5.5 1.5L8 17 6.5 11.5 4 3z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></svg>
</button>
<button type="button" class="mapEditorMapTool" id="mapEditorEraserBtn" data-tool="eraser" disabled data-i18n-title="maps.editor.tool.eraser" title="Eraser">
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M4 14h12M6.5 14L14 6.5l2.5 2.5L9 16.5H6.5V14z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linejoin="round"/></svg>
</button>
<button type="button" class="mapEditorMapTool" id="mapEditorEraseSelectionBtn" data-tool="eraseSelection" disabled data-i18n-title="maps.editor.tool.eraseSelection" title="Erase by selection">
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><rect x="4" y="4" width="12" height="12" rx="1" fill="none" stroke="currentColor" stroke-width="1.4" stroke-dasharray="3 2"/></svg>
</button>
<button type="button" class="mapEditorMapTool" id="mapEditorEraseShapeBtn" data-tool="eraseShape" disabled data-i18n-title="maps.editor.tool.eraseShape" title="Erase shape">
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M5 5l10 10M15 5L5 15" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/></svg>
</button>
<button type="button" class="mapEditorMapTool" id="mapEditorConfirmDrawBtn" hidden disabled data-i18n-title="maps.editor.tool.confirmDraw" title="Confirm shape">
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><path d="M5 10l3.5 3.5L15 7" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg>
</button>
<button type="button" class="mapEditorMapTool" id="mapEditorCrosshairBtn" disabled data-i18n-title="maps.editor.tool.crosshair" title="Crosshair">
<svg width="20" height="20" viewBox="0 0 20 20" aria-hidden="true"><circle cx="10" cy="10" r="6" fill="none" stroke="currentColor" stroke-width="1.4"/><path d="M10 4v12M4 10h12" stroke="currentColor" stroke-width="1.3"/></svg>
</button>
@@ -1050,6 +1210,7 @@
<div class="mapEditorSheetGrid" id="mapEditorSheetGrid" aria-hidden="true"></div>
<img id="mapEditorImage" class="mapEditorImageLoader" alt="" draggable="false" hidden />
<canvas id="mapEditorOccupancyCanvas" class="mapEditorOccupancyCanvas" hidden aria-hidden="true"></canvas>
<svg id="mapEditorObjectsSvg" class="mapEditorObjectsSvg" xmlns="http://www.w3.org/2000/svg" hidden aria-hidden="true"></svg>
<div id="mapEditorOrigin" class="mapEditorOrigin" hidden aria-hidden="true">
<span class="mapEditorOriginAxis mapEditorOriginAxis--x" aria-hidden="true"></span>
<span class="mapEditorOriginAxis mapEditorOriginAxis--z" aria-hidden="true"></span>
@@ -1198,6 +1359,164 @@
</form>
</dialog>
<dialog id="mapEditorPositionDialog" class="mapsMirDialog">
<form id="mapEditorPositionForm" method="dialog">
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.position.title">Position</h2>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.position.name">Name</span>
<input type="text" id="mapPositionName" autocomplete="off" />
</label>
<div class="mapsMirFieldRow">
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.position.x">X (m)</span>
<input type="number" id="mapPositionX" step="any" required />
</label>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.position.y">Y (m)</span>
<input type="number" id="mapPositionY" step="any" required />
</label>
</div>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.position.yaw">Orientation (°)</span>
<input type="number" id="mapPositionYaw" step="any" required />
</label>
<p class="mapsMirDialogHint" data-i18n="maps.editor.position.hint">Click map and drag to set orientation, then confirm.</p>
<div class="mapsMirDialogFooter">
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapPositionCancelBtn" data-i18n="common.cancel">Cancel</button>
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
</div>
</form>
</dialog>
<dialog id="mapEditorSpeedDialog" class="mapsMirDialog">
<form id="mapEditorSpeedForm" method="dialog">
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.speed.title">Speed zone</h2>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.speed.limit">Speed limit (m/s)</span>
<input type="number" id="mapSpeedMps" min="0.1" max="1.5" step="0.05" value="0.8" required />
</label>
<p class="mapsMirDialogHint" data-i18n="maps.editor.speed.hint">Robot slows to this speed while inside the zone (0.11.5 m/s).</p>
<div class="mapsMirDialogFooter">
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapSpeedCancelBtn" data-i18n="common.cancel">Cancel</button>
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
</div>
</form>
</dialog>
<dialog id="mapEditorSoundDialog" class="mapsMirDialog">
<form id="mapEditorSoundForm" method="dialog">
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.sound.title">Sound zone</h2>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.sound.select">Sound</span>
<select id="mapSoundZoneSelect" required></select>
</label>
<p class="mapsMirDialogHint">
<button type="button" class="mapsMirLinkBtn" id="mapSoundManageLink" data-i18n="maps.editor.sound.manage">Manage sounds in Setup → Sounds</button>
</p>
<div class="mapsMirDialogFooter">
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapSoundCancelBtn" data-i18n="common.cancel">Cancel</button>
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
</div>
</form>
</dialog>
<dialog id="mapEditorDirectionalDialog" class="mapsMirDialog">
<form id="mapEditorDirectionalForm" method="dialog">
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.directional.title">Directional zone</h2>
<div id="mapDirectionalShapePanel">
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.directional.direction">Direction</span>
<select id="mapDirectionalDeg"></select>
</label>
<p class="mapsMirDialogHint" data-i18n="maps.editor.directional.shapeHint">Robot cannot move opposite to the arrow (45° steps).</p>
</div>
<div id="mapDirectionalLinePanel" hidden>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.directional.lineWidth">Line width (px)</span>
<input type="number" id="mapDirectionalLineWidth" min="2" max="48" step="1" value="8" />
</label>
<label class="mapsMirField mapsMirField--checkbox">
<input type="checkbox" id="mapDirectionalReversed" />
<span data-i18n="maps.editor.directional.reversed">Reverse direction</span>
</label>
<p class="mapsMirDialogHint" data-i18n="maps.editor.directional.lineHint">Direction follows line from first to last point.</p>
</div>
<div class="mapsMirDialogFooter">
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapDirectionalCancelBtn" data-i18n="common.cancel">Cancel</button>
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
</div>
</form>
</dialog>
<dialog id="mapEditorPlannerDialog" class="mapsMirDialog">
<form id="mapEditorPlannerForm" method="dialog">
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.planner.title">Planner zone</h2>
<label class="mapsMirField mapsMirField--checkbox">
<input type="checkbox" id="mapPlannerNoLocalization" />
<span data-i18n="maps.editor.planner.noLocalization">No localization (encoders only)</span>
</label>
<label class="mapsMirField mapsMirField--checkbox">
<input type="checkbox" id="mapPlannerLookAhead" />
<span data-i18n="maps.editor.planner.lookAhead">Look-ahead (narrow field of view)</span>
</label>
<label class="mapsMirField mapsMirField--checkbox">
<input type="checkbox" id="mapPlannerIgnoreObstacles" />
<span data-i18n="maps.editor.planner.ignoreObstacles">Ignore obstacles</span>
</label>
<div class="mapsMirFieldRow">
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.planner.pathDeviation">Path deviation (m)</span>
<input type="number" id="mapPlannerPathDeviation" min="0" max="3" step="0.1" value="0.5" />
</label>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.planner.pathTimeout">Path timeout (s)</span>
<input type="number" id="mapPlannerPathTimeout" min="0" step="1" value="30" />
</label>
</div>
<div class="mapsMirDialogFooter">
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapPlannerCancelBtn" data-i18n="common.cancel">Cancel</button>
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
</div>
</form>
</dialog>
<dialog id="mapEditorIoDialog" class="mapsMirDialog">
<form id="mapEditorIoForm" method="dialog">
<h2 class="mapsMirDialogTitle" data-i18n="maps.editor.io.title">I/O zone</h2>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.io.module">I/O module</span>
<input type="text" id="mapIoModule" list="mapIoModuleList" autocomplete="off" required />
<datalist id="mapIoModuleList">
<option value="GPIO module 1"></option>
<option value="PLC I/O 1"></option>
</datalist>
</label>
<div class="mapsMirFieldRow">
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.io.plcRegister">PLC register</span>
<input type="number" id="mapIoPlcRegister" step="1" />
</label>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.io.plcValue">Value</span>
<input type="number" id="mapIoPlcValue" step="1" />
</label>
</div>
<label class="mapsMirField">
<span class="mapsMirFieldLabel" data-i18n="maps.editor.io.plcMode">PLC mode</span>
<select id="mapIoPlcMode">
<option value="set" data-i18n="maps.editor.io.plcModeSet">Set</option>
<option value="add" data-i18n="maps.editor.io.plcModeAdd">Add</option>
<option value="subtract" data-i18n="maps.editor.io.plcModeSubtract">Subtract</option>
</select>
</label>
<p class="mapsMirDialogHint" data-i18n="maps.editor.io.hint">Robot activates I/O when entering the zone.</p>
<div class="mapsMirDialogFooter">
<button type="button" class="mapsMirBtn mapsMirBtn--outline" id="mapIoCancelBtn" data-i18n="common.cancel">Cancel</button>
<button type="submit" class="mapsMirBtn mapsMirBtn--primary" data-i18n="common.save">Save</button>
</div>
</form>
</dialog>
<dialog id="mapUploadConfirmDialog" class="mapsMirDialog">
<div class="mapsMirDialogPanel">
<h2 class="mapsMirDialogTitle" data-i18n="maps.uploadConfirm.title">Overwrite map?</h2>
@@ -1729,8 +2048,14 @@ GET /api/v2.0.0/status</pre>
<script src="/missions.js"></script>
<script src="/map-geo.js"></script>
<script src="/map-occupancy-canvas.js"></script>
<script src="/map-occupancy-edit.js"></script>
<script src="/map-planner-zones.js"></script>
<script src="/map-behavior-zones.js"></script>
<script src="/map-advanced-zones.js"></script>
<script src="/map-objects.js"></script>
<script src="/map-yaml.js"></script>
<script src="/maps.js"></script>
<script src="/sounds.js"></script>
<script src="/map-editor.js"></script>
<script src="/topbar.js"></script>
<script src="/dashboard.js"></script>