1349- 1350- state.activeMeasurementKey = null; 1351- 1352- renderProjects(); 1353- renderProject(); 1354- closeEditor(); 1355- } 1356- 1357: async function createProject(event) { 1358- event.preventDefault(); 1359- 1360- const project = await request("/api/projects", { 1361- method: "POST", 1362- body: JSON.stringify({ 1363- name: 1364- document.querySelector( 1365- "#new-project-name" 1366- ).value, 1367- reference_id: 1368- document.querySelector( 1369- "#new-project-reference" 1370- ).value, 1371- side: 1372- document.querySelector( 1373- "#new-project-side" 1374- ).value, 1375- cover_class: 1376- document.querySelector( 1377- "#new-project-cover-class" 1378- ).value, 1379: osseointegration: 1380- document.querySelector( 1381- "#new-project-oi" 1382- ).value === "true", 1383- }), 1384- }); 1385- 1386- elements.newProjectDialog.close(); 1387- elements.newProjectForm.reset(); 1388- 1389- await loadProjects(); 1390- await openProject(project.id); 1391- 1392- showToast("LimbForge project created."); 1393- } 1394- 1395: async function saveProject() { 1396- if (!state.activeProject) { 1397- return; 1398- } 1399- 1400- state.activeProject = await request( 1401- `/api/projects/${state.activeProject.id}`, 1402- { 1403- method: "PUT", 1404- body: JSON.stringify({ 1405- name: elements.projectName.value, 1406- reference_id: 1407- elements.projectReference.value, 1408- side: elements.projectSide.value, 1409- cover_class: 1410- elements.projectCoverClass.value, 1411: osseointegration: 1412- elements.projectOi.value === "true", 1413- specialist_name: 1414- elements.projectSpecialist.value, 1415- clinic_name: 1416- elements.projectClinic.value, 1417- exclusion_zones: 1418- elements.projectExclusion.value, 1419- component_notes: 1420- elements.projectComponents.value, 1421- review_notes: 1422- elements.projectReview.value, 1423- }), 1424- } 1425- ); 1426- 1427- await loadProjects(); 1428- renderProject(); 1429- 1430- if ( 1431- state.activeMeasurementKey && 1432- !visibleDefinitions().some( 1433- (definition) => 1434- definition.key === 1435- state.activeMeasurementKey 1436- ) 1437- ) { 1438- closeEditor(); 1439- } 1440- 1441- showToast("Project details saved."); 1442- } 1443- 1444- async function saveMeasurement(moveNext) { 1445- const definition = selectedDefinition();