--- /home/ray/ARMOR/apps/shire-mobile/limbforge-workspace/static/index.html 2026-08-05 11:53:39.542553077 +0800
+++ /tmp/shire-limbforge-oi.f8UkEb/stage/index.html 2026-08-06 16:33:50.014258822 +0800
@@ -814,6 +814,37 @@
Yes — osseointegration
+
+
+ Osseointegration hardware type
+
+
+
+
+
+ Required for the correct OI safety workflow.
+ This does not authorise manufacturing.
+
+
+
@@ -1189,6 +1251,11 @@
elements.projectCoverClass.value = project.cover_class;
elements.projectOi.value =
String(project.osseointegration);
+ document.querySelector(
+ "#project-oi-type"
+ ).value = project.oi_type || "none";
+
+ shireSyncOiHardwareControls();
elements.projectSpecialist.value =
project.specialist_name;
elements.projectClinic.value = project.clinic_name;
@@ -1380,12 +1447,26 @@
document.querySelector(
"#new-project-oi"
).value === "true",
+ oi_type:
+ document.querySelector(
+ "#new-project-oi"
+ ).value === "true"
+ ? document.querySelector(
+ "#new-project-oi-type"
+ ).value
+ : "none",
}),
});
elements.newProjectDialog.close();
elements.newProjectForm.reset();
+ document.querySelector(
+ "#new-project-oi-type"
+ ).value = "none";
+
+ shireSyncOiHardwareControls();
+
await loadProjects();
await openProject(project.id);
@@ -1410,6 +1491,12 @@
elements.projectCoverClass.value,
osseointegration:
elements.projectOi.value === "true",
+ oi_type:
+ elements.projectOi.value === "true"
+ ? document.querySelector(
+ "#project-oi-type"
+ ).value
+ : "none",
specialist_name:
elements.projectSpecialist.value,
clinic_name:
@@ -1612,6 +1699,69 @@
}
start().catch(reportError);
+
+// SHIRE-LIMBFORGE-OI-UI-0001
+function shireOiEnabled(id) {
+ return (
+ document.querySelector(`#${id}`)?.value
+ === "true"
+ );
+}
+
+function shireSyncOiHardwareControl(
+ oiId,
+ typeId,
+) {
+ const enabled = shireOiEnabled(oiId);
+ const typeControl =
+ document.querySelector(`#${typeId}`);
+ const field = document.querySelector(
+ `[data-oi-source="${oiId}"]`
+ );
+
+ if (!typeControl || !field) {
+ return;
+ }
+
+ field.style.display = enabled
+ ? "block"
+ : "none";
+
+ typeControl.disabled = !enabled;
+
+ if (!enabled) {
+ typeControl.value = "none";
+ }
+}
+
+function shireSyncOiHardwareControls() {
+ shireSyncOiHardwareControl(
+ "project-oi",
+ "project-oi-type",
+ );
+
+ shireSyncOiHardwareControl(
+ "new-project-oi",
+ "new-project-oi-type",
+ );
+}
+
+document.querySelector(
+ "#project-oi"
+)?.addEventListener(
+ "change",
+ shireSyncOiHardwareControls,
+);
+
+document.querySelector(
+ "#new-project-oi"
+)?.addEventListener(
+ "change",
+ shireSyncOiHardwareControls,
+);
+
+shireSyncOiHardwareControls();
+