81 lines
2.3 KiB
JavaScript
81 lines
2.3 KiB
JavaScript
import TracksTable from "./tracks_table.mjs"
|
|
import IntegrityManager from "./integrity_manager.mjs"
|
|
import { updateObjectFromJoinedKey } from "./utils.mjs"
|
|
|
|
export default class Editor {
|
|
constructor() {
|
|
const params = new URLSearchParams(window.location.search)
|
|
this.filename = params.get("f")
|
|
window.addEventListener("keydown", e => {
|
|
if (e.key === "s" && e.ctrlKey) {
|
|
e.preventDefault()
|
|
this.save()
|
|
}
|
|
})
|
|
|
|
this.tables = {
|
|
audio: new TracksTable(this, "audio", "audio-tracks", "audio_tracks"),
|
|
subtitle: new TracksTable(this, "subtitle", "subtitle-tracks", "subtitle_tracks")
|
|
}
|
|
|
|
this.data = {}
|
|
this.dirty = false
|
|
|
|
this.integrity_mgr = new IntegrityManager(this)
|
|
|
|
this.setup()
|
|
}
|
|
|
|
setup() {
|
|
document.getElementById("filename").innerText = this.filename
|
|
this.fetchData()
|
|
}
|
|
|
|
fetchData() {
|
|
fetch(`/api/file/${this.filename}`).then(res => {
|
|
if (res.ok) {
|
|
return res.json()
|
|
}
|
|
return null
|
|
}).then(res => {
|
|
if (res !== null) {
|
|
this.data = res
|
|
this.displayData()
|
|
}
|
|
})
|
|
}
|
|
|
|
displayData() {
|
|
document.getElementById("title").value = this.data.title
|
|
this.tables.audio.loadTracks(this.data.audio_tracks)
|
|
this.tables.subtitle.loadTracks(this.data.subtitle_tracks)
|
|
this.integrity_mgr.checkIntegrity()
|
|
}
|
|
|
|
save() {
|
|
fetch(`/api/file/${this.filename}`, {
|
|
method: "POST",
|
|
body: JSON.stringify(this.data),
|
|
headers: {
|
|
"Content-Type": "application/json"
|
|
}
|
|
}).then(res => {
|
|
if (res.ok) {
|
|
this.dirty = false
|
|
document.getElementById("unsaved").classList.remove("show")
|
|
} else {
|
|
alert(`Error ${res.status}: ${res.statusText}`)
|
|
}
|
|
})
|
|
}
|
|
|
|
setDirty() {
|
|
this.dirty = true
|
|
document.getElementById("unsaved").classList.add("show")
|
|
}
|
|
|
|
editTrack(listKey, trackIdx, key, value) {
|
|
updateObjectFromJoinedKey(this.data[listKey][trackIdx], key, value)
|
|
this.setDirty()
|
|
}
|
|
} |