continuous-integration/drone/push Build encountered an error
- html/embed.go embeds html/ (pages, css, img, js, video); src/assets.go
serves it, with os.DirFS("html") under -dev. Static assets get an ETag
and Cache-Control: no-cache; HTML pages are still templated (only the
login error message is substituted now).
- Delete the generated src/webUI.go (783 KB base64), src/html-build.go and
cmd/webui-gen; Dockerfile no longer runs a generator.
- Language layer removed: 254 {{.x}} placeholders inlined as English
strings in ts/*.ts and the two auth pages; html/lang/en.json, the
LanguageUI struct and the 'language' setting are gone.
- ts/tsconfig.json + package.json pin typescript 5.9.3; the seven sources
compile (ES2020, global scripts) into one committed html/js/app.js.
Ten unreferenced legacy scripts under html/js/ deleted; all pages load
js/app.js.
- Fix the six type errors that blocked a clean compile, including a real
bug: a missing semicolon in the search shortcut handler made the code
call the result of preventDefault(), so the shortcut threw instead of
focusing the search box.
- /healthz liveness endpoint; Dockerfile healthcheck and README use it.
- Drone: go vet, and a webui-check step that rebuilds the bundle and fails
if the committed app.js is stale.
- README-DEV.md documents build, UI toolchain, -dev, versioning, CI.
177 lines
4.4 KiB
TypeScript
177 lines
4.4 KiB
TypeScript
class WizardCategory {
|
|
DocumentID = "content"
|
|
|
|
createCategoryHeadline(value:string):any {
|
|
var element = document.createElement("H4")
|
|
element.innerHTML = value
|
|
return element
|
|
}
|
|
}
|
|
|
|
class WizardItem extends WizardCategory {
|
|
key:string
|
|
headline:string
|
|
|
|
constructor(key:string, headline:string) {
|
|
super()
|
|
this.headline = headline
|
|
this.key = key
|
|
}
|
|
|
|
createWizard():void {
|
|
var headline = this.createCategoryHeadline(this.headline)
|
|
var key = this.key
|
|
var content:PopupContent = new PopupContent()
|
|
var description:string
|
|
|
|
var doc = document.getElementById(this.DocumentID)
|
|
doc.innerHTML = ""
|
|
doc.appendChild(headline)
|
|
|
|
switch (key) {
|
|
case "tuner":
|
|
var text = new Array()
|
|
var values = new Array()
|
|
|
|
for (var i = 1; i <= 100; i++) {
|
|
text.push(i)
|
|
values.push(i)
|
|
}
|
|
|
|
var select = content.createSelect(text, values, "1", key)
|
|
select.setAttribute("class", "wizard")
|
|
select.id = key
|
|
doc.appendChild(select)
|
|
|
|
description = "Number of parallel connections that can be established to the provider.<br>Available for: Plex, Emby (HDHR), M3U (with active buffer).<br>After a change, xTeVe must be delete in the Plex / Emby DVR settings and set up again."
|
|
|
|
break;
|
|
|
|
case "epgSource":
|
|
var text:any[] = ["PMS", "XEPG"]
|
|
var values:any[] = ["PMS", "XEPG"]
|
|
|
|
var select = content.createSelect(text, values, "XEPG", key)
|
|
select.setAttribute("class", "wizard")
|
|
select.id = key
|
|
doc.appendChild(select)
|
|
|
|
description = "PMS:<br>- Use EPG data from Plex or Emby <br><br>XEPG:<br>- Use of one or more XMLTV files<br>- Channel management<br>- M3U / XMLTV export (HTTP link for IPTV apps)"
|
|
|
|
break
|
|
|
|
case "m3u":
|
|
var input = content.createInput("text", key, "")
|
|
input.setAttribute("placeholder", "File path or URL of the M3U")
|
|
input.setAttribute("class", "wizard")
|
|
input.id = key
|
|
doc.appendChild(input)
|
|
|
|
description = "Local or remote playlists"
|
|
|
|
break
|
|
|
|
case "xmltv":
|
|
var input = content.createInput("text", key, "")
|
|
input.setAttribute("placeholder", "File path or URL of the XMLTV")
|
|
input.setAttribute("class", "wizard")
|
|
input.id = key
|
|
doc.appendChild(input)
|
|
|
|
description = "Local or remote XMLTV file"
|
|
|
|
break
|
|
|
|
default:
|
|
console.log(key)
|
|
break;
|
|
}
|
|
|
|
var pre = document.createElement("PRE")
|
|
pre.innerHTML = description
|
|
doc.appendChild(pre)
|
|
|
|
console.log(headline, key)
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function readyForConfiguration(wizard:number) {
|
|
|
|
var server:Server = new Server("getServerConfig")
|
|
server.request(new Object())
|
|
|
|
showElement("loading", false)
|
|
|
|
configurationWizard[wizard].createWizard()
|
|
|
|
}
|
|
|
|
function saveWizard() {
|
|
|
|
var cmd = "saveWizard"
|
|
var div = document.getElementById("content")
|
|
var config = div.getElementsByClassName("wizard")
|
|
|
|
var wizard = new Object()
|
|
|
|
for (var i = 0; i < config.length; i++) {
|
|
|
|
var name:string
|
|
var value:any
|
|
|
|
switch (config[i].tagName) {
|
|
case "SELECT":
|
|
name = (config[i] as HTMLSelectElement).name
|
|
value = (config[i] as HTMLSelectElement).value
|
|
|
|
// Wenn der Wert eine Zahl ist, wird dieser als Zahl gespeichert
|
|
if(isNaN(value)){
|
|
wizard[name] = value
|
|
} else {
|
|
wizard[name] = parseInt(value)
|
|
}
|
|
|
|
break
|
|
|
|
case "INPUT":
|
|
switch ((config[i] as HTMLInputElement).type) {
|
|
case "text":
|
|
name = (config[i] as HTMLInputElement).name
|
|
value = (config[i] as HTMLInputElement).value
|
|
|
|
if (value.length == 0) {
|
|
var msg = name.toUpperCase() + ": " + "Missing input"
|
|
alert(msg)
|
|
return
|
|
}
|
|
|
|
wizard[name] = value
|
|
break
|
|
}
|
|
break
|
|
|
|
default:
|
|
// code...
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
var data = new Object()
|
|
data["wizard"] = wizard
|
|
|
|
var server:Server = new Server(cmd)
|
|
server.request(data)
|
|
|
|
console.log(data)
|
|
}
|
|
|
|
// Wizard
|
|
var configurationWizard = new Array()
|
|
configurationWizard.push(new WizardItem("tuner", "Number of tuners"))
|
|
configurationWizard.push(new WizardItem("epgSource", "EPG Source"))
|
|
configurationWizard.push(new WizardItem("m3u", "M3U Playlist"))
|
|
configurationWizard.push(new WizardItem("xmltv", "XMLTV File")) |