diff --git a/.claude/settings.local.json b/.claude/settings.local.json index c9d0425..9495fd2 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -9,7 +9,8 @@ "Bash(wc:*)", "Bash(ls:*)", "Bash(node -c:*)", - "Bash(npm run lint:*)" + "Bash(npm run lint:*)", + "Bash(python:*)" ] } } diff --git a/backend/builder/service.py b/backend/builder/service.py index bec2aa4..b7e0fe7 100644 --- a/backend/builder/service.py +++ b/backend/builder/service.py @@ -11,7 +11,7 @@ from fastapi import HTTPException logger = logging.getLogger("builder.service") # Storage directory for built .bsm files -STORAGE_DIR = Path("storage/built_melodies") +STORAGE_DIR = Path(__file__).parent.parent / "storage" / "built_melodies" def _ensure_storage_dir(): diff --git a/backend/mqtt_data.db b/backend/mqtt_data.db new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/melodies/MelodyDetail.jsx b/frontend/src/melodies/MelodyDetail.jsx index 74c4df6..a101d37 100644 --- a/frontend/src/melodies/MelodyDetail.jsx +++ b/frontend/src/melodies/MelodyDetail.jsx @@ -443,6 +443,7 @@ export default function MelodyDetail() { setShowSpeedCalc(false)} onSaved={() => { setShowSpeedCalc(false); diff --git a/frontend/src/melodies/MelodyForm.jsx b/frontend/src/melodies/MelodyForm.jsx index 6f90df8..255011a 100644 --- a/frontend/src/melodies/MelodyForm.jsx +++ b/frontend/src/melodies/MelodyForm.jsx @@ -4,6 +4,7 @@ import api from "../api/client"; import TranslationModal from "./TranslationModal"; import SelectBuiltMelodyModal from "./builder/SelectBuiltMelodyModal"; import BuildOnTheFlyModal from "./builder/BuildOnTheFlyModal"; +import SpeedCalculatorModal from "./SpeedCalculatorModal"; import { getLocalizedValue, getLanguageName, @@ -84,6 +85,8 @@ export default function MelodyForm() { const [showSelectBuilt, setShowSelectBuilt] = useState(false); const [showBuildOnTheFly, setShowBuildOnTheFly] = useState(false); + const [showSpeedCalc, setShowSpeedCalc] = useState(false); + const [builtMelody, setBuiltMelody] = useState(null); useEffect(() => { api.get("/settings/melody").then((ms) => { @@ -124,6 +127,13 @@ export default function MelodyForm() { setPid(melody.pid || ""); setMelodyStatus(melody.status || "published"); setExistingFiles(files); + // Load built melody assignment (non-fatal) + try { + const bm = await api.get(`/builder/melodies/for-melody/${id}`); + setBuiltMelody(bm || null); + } catch { + setBuiltMelody(null); + } } catch (err) { setError(err.message); } finally { @@ -259,6 +269,16 @@ export default function MelodyForm() { {isEdit ? "Edit Melody" : "Add Melody"}
+ {isEdit && ( + + )}
-
- {/* Steps Input */} -
- -
-