2025-09-30 19:03:35 +01:00
|
|
|
package templates
|
|
|
|
|
|
|
|
|
|
import (
|
2025-10-21 17:15:26 +01:00
|
|
|
"arimelody-web/log"
|
|
|
|
|
_ "embed"
|
|
|
|
|
"fmt"
|
|
|
|
|
"html/template"
|
|
|
|
|
"strings"
|
|
|
|
|
"time"
|
2025-09-30 19:03:35 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
//go:embed "html/layout.html"
|
|
|
|
|
var layoutHTML string
|
|
|
|
|
//go:embed "html/prideflag.html"
|
|
|
|
|
var prideflagHTML string
|
|
|
|
|
|
|
|
|
|
//go:embed "html/index.html"
|
|
|
|
|
var indexHTML string
|
|
|
|
|
|
|
|
|
|
//go:embed "html/register.html"
|
|
|
|
|
var registerHTML string
|
|
|
|
|
//go:embed "html/login.html"
|
|
|
|
|
var loginHTML string
|
|
|
|
|
//go:embed "html/login-totp.html"
|
|
|
|
|
var loginTotpHTML string
|
|
|
|
|
//go:embed "html/totp-confirm.html"
|
|
|
|
|
var totpConfirmHTML string
|
|
|
|
|
//go:embed "html/totp-setup.html"
|
|
|
|
|
var totpSetupHTML string
|
|
|
|
|
//go:embed "html/logout.html"
|
|
|
|
|
var logoutHTML string
|
|
|
|
|
|
|
|
|
|
//go:embed "html/logs.html"
|
|
|
|
|
var logsHTML string
|
|
|
|
|
|
|
|
|
|
//go:embed "html/edit-account.html"
|
|
|
|
|
var editAccountHTML string
|
2025-10-21 17:15:26 +01:00
|
|
|
|
|
|
|
|
//go:embed "html/releases.html"
|
|
|
|
|
var releasesHTML string
|
|
|
|
|
//go:embed "html/artists.html"
|
|
|
|
|
var artistsHTML string
|
|
|
|
|
//go:embed "html/tracks.html"
|
|
|
|
|
var tracksHTML string
|
|
|
|
|
|
2025-09-30 19:03:35 +01:00
|
|
|
//go:embed "html/edit-release.html"
|
|
|
|
|
var editReleaseHTML string
|
2025-10-21 17:15:26 +01:00
|
|
|
//go:embed "html/edit-artist.html"
|
|
|
|
|
var editArtistHTML string
|
2025-09-30 19:03:35 +01:00
|
|
|
//go:embed "html/edit-track.html"
|
|
|
|
|
var editTrackHTML string
|
|
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
//go:embed "html/components/credit/newcredit.html"
|
2025-09-30 19:03:35 +01:00
|
|
|
var componentNewCreditHTML string
|
2025-10-21 18:39:38 +01:00
|
|
|
//go:embed "html/components/credit/addcredit.html"
|
2025-09-30 19:03:35 +01:00
|
|
|
var componentAddCreditHTML string
|
2025-10-21 18:39:38 +01:00
|
|
|
//go:embed "html/components/credit/editcredits.html"
|
2025-09-30 19:03:35 +01:00
|
|
|
var componentEditCreditsHTML string
|
|
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
//go:embed "html/components/link/editlinks.html"
|
2025-09-30 19:03:35 +01:00
|
|
|
var componentEditLinksHTML string
|
|
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
//go:embed "html/components/release/release.html"
|
|
|
|
|
var componentReleaseHTML string
|
|
|
|
|
//go:embed "html/components/artist/artist.html"
|
|
|
|
|
var componentArtistHTML string
|
|
|
|
|
//go:embed "html/components/track/track.html"
|
|
|
|
|
var componentTrackHTML string
|
2025-09-30 19:03:35 +01:00
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
//go:embed "html/components/track/newtrack.html"
|
2025-09-30 19:03:35 +01:00
|
|
|
var componentNewTrackHTML string
|
2025-10-21 18:39:38 +01:00
|
|
|
//go:embed "html/components/track/addtrack.html"
|
2025-09-30 19:03:35 +01:00
|
|
|
var componentAddTrackHTML string
|
2025-10-21 18:39:38 +01:00
|
|
|
//go:embed "html/components/track/edittracks.html"
|
2025-09-30 19:03:35 +01:00
|
|
|
var componentEditTracksHTML string
|
|
|
|
|
|
2025-10-21 17:15:26 +01:00
|
|
|
var BaseTemplate = template.Must(
|
|
|
|
|
template.New("base").Funcs(
|
|
|
|
|
template.FuncMap{
|
2025-10-21 18:39:38 +01:00
|
|
|
"hasPrefix": strings.HasPrefix,
|
2025-10-21 17:15:26 +01:00
|
|
|
},
|
|
|
|
|
).Parse(strings.Join([]string{
|
|
|
|
|
layoutHTML,
|
|
|
|
|
prideflagHTML,
|
|
|
|
|
}, "\n")))
|
2025-09-30 19:03:35 +01:00
|
|
|
|
|
|
|
|
var IndexTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(
|
|
|
|
|
strings.Join([]string{
|
|
|
|
|
indexHTML,
|
2025-10-21 18:39:38 +01:00
|
|
|
componentReleaseHTML,
|
|
|
|
|
componentArtistHTML,
|
|
|
|
|
componentTrackHTML,
|
2025-09-30 19:03:35 +01:00
|
|
|
}, "\n"),
|
|
|
|
|
))
|
|
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
|
|
|
|
|
|
2025-09-30 19:03:35 +01:00
|
|
|
var LoginTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(loginHTML))
|
|
|
|
|
var LoginTOTPTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(loginTotpHTML))
|
|
|
|
|
var RegisterTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(registerHTML))
|
|
|
|
|
var LogoutTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(logoutHTML))
|
|
|
|
|
var AccountTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(editAccountHTML))
|
|
|
|
|
var TOTPSetupTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(totpSetupHTML))
|
|
|
|
|
var TOTPConfirmTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(totpConfirmHTML))
|
|
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
|
|
|
|
|
|
2025-09-30 19:03:35 +01:00
|
|
|
var LogsTemplate = template.Must(template.Must(BaseTemplate.Clone()).Funcs(template.FuncMap{
|
2025-10-21 18:39:38 +01:00
|
|
|
"parseLevel": parseLevel,
|
|
|
|
|
"titleCase": titleCase,
|
|
|
|
|
"toLower": toLower,
|
|
|
|
|
"prettyTime": prettyTime,
|
2025-09-30 19:03:35 +01:00
|
|
|
}).Parse(logsHTML))
|
|
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
|
|
|
|
|
|
2025-10-21 17:15:26 +01:00
|
|
|
var ReleasesTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(
|
|
|
|
|
strings.Join([]string{
|
|
|
|
|
releasesHTML,
|
2025-10-21 18:39:38 +01:00
|
|
|
componentReleaseHTML,
|
|
|
|
|
}, "\n"),
|
|
|
|
|
))
|
|
|
|
|
var ArtistsTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(
|
|
|
|
|
strings.Join([]string{
|
|
|
|
|
artistsHTML,
|
|
|
|
|
componentArtistHTML,
|
2025-10-21 17:15:26 +01:00
|
|
|
}, "\n"),
|
|
|
|
|
))
|
2025-10-21 18:39:38 +01:00
|
|
|
var TracksTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(
|
|
|
|
|
strings.Join([]string{
|
|
|
|
|
tracksHTML,
|
|
|
|
|
componentTrackHTML,
|
|
|
|
|
}, "\n"),
|
|
|
|
|
))
|
|
|
|
|
|
|
|
|
|
|
2025-10-21 17:15:26 +01:00
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
var EditReleaseTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(
|
|
|
|
|
strings.Join([]string{
|
|
|
|
|
editReleaseHTML,
|
|
|
|
|
componentTrackHTML,
|
|
|
|
|
}, "\n"),
|
|
|
|
|
))
|
2025-09-30 19:03:35 +01:00
|
|
|
var EditArtistTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(editArtistHTML))
|
|
|
|
|
var EditTrackTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(
|
|
|
|
|
strings.Join([]string{
|
|
|
|
|
editTrackHTML,
|
2025-10-21 18:39:38 +01:00
|
|
|
componentReleaseHTML,
|
2025-09-30 19:03:35 +01:00
|
|
|
}, "\n"),
|
|
|
|
|
))
|
|
|
|
|
|
2025-10-21 18:39:38 +01:00
|
|
|
|
|
|
|
|
|
2025-09-30 19:03:35 +01:00
|
|
|
var EditCreditsTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(componentEditCreditsHTML))
|
|
|
|
|
var AddCreditTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(componentAddCreditHTML))
|
|
|
|
|
var NewCreditTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(componentNewCreditHTML))
|
|
|
|
|
|
|
|
|
|
var EditLinksTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(componentEditLinksHTML))
|
|
|
|
|
|
|
|
|
|
var EditTracksTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(componentEditTracksHTML))
|
|
|
|
|
var AddTrackTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(componentAddTrackHTML))
|
|
|
|
|
var NewTrackTemplate = template.Must(template.Must(BaseTemplate.Clone()).Parse(componentNewTrackHTML))
|
2025-10-21 18:39:38 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func parseLevel(level log.LogLevel) string {
|
|
|
|
|
switch level {
|
|
|
|
|
case log.LEVEL_INFO:
|
|
|
|
|
return "INFO"
|
|
|
|
|
case log.LEVEL_WARN:
|
|
|
|
|
return "WARN"
|
|
|
|
|
}
|
|
|
|
|
return fmt.Sprintf("%d?", level)
|
|
|
|
|
}
|
|
|
|
|
func titleCase(logType string) string {
|
|
|
|
|
runes := []rune(logType)
|
|
|
|
|
for i, r := range runes {
|
|
|
|
|
if (i == 0 || runes[i - 1] == ' ') && r >= 'a' && r <= 'z' {
|
|
|
|
|
runes[i] = r + ('A' - 'a')
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return string(runes)
|
|
|
|
|
}
|
|
|
|
|
func toLower(str string) string {
|
|
|
|
|
return strings.ToLower(str)
|
|
|
|
|
}
|
|
|
|
|
func prettyTime(t time.Time) string {
|
|
|
|
|
// return t.Format("2006-01-02 15:04:05")
|
|
|
|
|
// return t.Format("15:04:05, 2 Jan 2006")
|
|
|
|
|
return t.Format("02 Jan 2006, 15:04:05")
|
|
|
|
|
}
|