diff --git a/main.go b/main.go index 79744cc8..d74a4c3a 100644 --- a/main.go +++ b/main.go @@ -182,7 +182,7 @@ func configure(app *aero.Application) *aero.Application { middleware.Firewall(), middleware.Log(), middleware.Session(), - middleware.UserInfo() + middleware.UserInfo(), ) // API diff --git a/mixins/Input.pixy b/mixins/Input.pixy index 2c0b93d1..df1a39e8 100644 --- a/mixins/Input.pixy +++ b/mixins/Input.pixy @@ -18,7 +18,7 @@ component InputSelection(id string, value string, label string, placeholder stri label(for=id)= label + ":" select.widget-ui-element.action(id=id, data-field=id, value=value, title=placeholder, data-action="save", data-trigger="change") -component InputTags(id string, value []string, label string) +component InputTags(id string, value []string, label string, tooltip string) .widget-section label(for=id)= label + ":" .tags(id=id) @@ -30,4 +30,6 @@ component InputTags(id string, value []string, label string) button.tag-add.action(data-action="arrayAppend", data-trigger="click", data-field=id) RawIcon("plus") + + p!= tooltip \ No newline at end of file diff --git a/pages/anime/anime.go b/pages/anime/anime.go index 1339dfef..d256057e 100644 --- a/pages/anime/anime.go +++ b/pages/anime/anime.go @@ -23,7 +23,9 @@ func Get(ctx *aero.Context) string { return ctx.Error(http.StatusNotFound, "Anime not found", err) } - tracks, err := arn.GetSoundTracksByTag("anime:" + anime.ID) + tracks, err := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool { + return !track.IsDraft && len(track.Media) > 0 && arn.Contains(track.Tags, "anime:"+anime.ID) + }) if err != nil { return ctx.Error(http.StatusNotFound, "Error fetching soundtracks", err) diff --git a/pages/profile/tracks.go b/pages/profile/tracks.go index 2b723403..083f3ae9 100644 --- a/pages/profile/tracks.go +++ b/pages/profile/tracks.go @@ -19,7 +19,9 @@ func GetSoundTracksByUser(ctx *aero.Context) string { return ctx.Error(http.StatusNotFound, "User not found", err) } - tracks, err := arn.GetSoundTracksByUser(viewUser) + tracks, err := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool { + return !track.IsDraft && len(track.Media) > 0 && track.CreatedBy == viewUser.ID + }) if err != nil { return ctx.Error(http.StatusInternalServerError, "Error fetching soundtracks", err) diff --git a/pages/soundtrack/edit.go b/pages/soundtrack/edit.go index 0246fa0d..dd72b80d 100644 --- a/pages/soundtrack/edit.go +++ b/pages/soundtrack/edit.go @@ -89,7 +89,15 @@ func RenderField(b *bytes.Buffer, v *reflect.Value, field reflect.StructField, i case "string": b.WriteString(components.InputText(idPrefix+field.Name, fieldValue.String(), field.Name, "")) case "[]string": - b.WriteString(components.InputTags(idPrefix+field.Name, fieldValue.Interface().([]string), field.Name)) + b.WriteString(components.InputTags(idPrefix+field.Name, fieldValue.Interface().([]string), field.Name, field.Tag.Get("tooltip"))) + case "bool": + if field.Name == "IsDraft" { + if fieldValue.Bool() { + b.WriteString(`
`) + } else { + b.WriteString(`
`) + } + } case "[]*arn.ExternalMedia": for sliceIndex := 0; sliceIndex < fieldValue.Len(); sliceIndex++ { b.WriteString(`
`) diff --git a/pages/soundtrack/soundtrack.go b/pages/soundtrack/soundtrack.go index afc492c8..5a5c8e75 100644 --- a/pages/soundtrack/soundtrack.go +++ b/pages/soundtrack/soundtrack.go @@ -20,12 +20,15 @@ func Get(ctx *aero.Context) string { ctx.Data = &arn.OpenGraph{ Tags: map[string]string{ "og:title": track.Title, - "og:image": track.MainAnime().Image.Large, "og:url": "https://" + ctx.App.Config.Domain + track.Link(), "og:site_name": "notify.moe", "og:type": "music.song", }, } + if track.MainAnime() != nil { + ctx.Data.(*arn.OpenGraph).Tags["og:image"] = track.MainAnime().Image.Large + } + return ctx.HTML(components.Track(track)) } diff --git a/pages/soundtrack/soundtrack.pixy b/pages/soundtrack/soundtrack.pixy index 6c7a57dc..453ee76b 100644 --- a/pages/soundtrack/soundtrack.pixy +++ b/pages/soundtrack/soundtrack.pixy @@ -13,6 +13,12 @@ component Track(track *arn.SoundTrack) h3.widget-title= media.Service .sound-track-media ExternalMedia(media) + + .widget.mountable + h3.widget-title Tags + ul + each tag in track.Tags + li= tag .footer.text-center.mountable if track.EditedBy != "" diff --git a/pages/soundtracks/soundtracks.go b/pages/soundtracks/soundtracks.go index 93c8c7f6..11dee8b2 100644 --- a/pages/soundtracks/soundtracks.go +++ b/pages/soundtracks/soundtracks.go @@ -13,7 +13,7 @@ const maxTracks = 9 // Get renders the soundtracks page. func Get(ctx *aero.Context) string { tracks, err := arn.FilterSoundTracks(func(track *arn.SoundTrack) bool { - return !track.IsDraft + return !track.IsDraft && len(track.Media) > 0 }) if err != nil { diff --git a/pages/soundtracks/soundtracks.pixy b/pages/soundtracks/soundtracks.pixy index 82bbdf01..0d175189 100644 --- a/pages/soundtracks/soundtracks.pixy +++ b/pages/soundtracks/soundtracks.pixy @@ -2,7 +2,7 @@ component SoundTracks(tracks []*arn.SoundTrack) h1 Soundtracks .music-buttons - a.button.ajax(href="/new/soundtrack") + a.button.action(data-action="newSoundTrack", data-trigger="click") Icon("plus") span Add soundtrack diff --git a/scripts/Actions.ts b/scripts/Actions.ts index eb8a8e53..65ec77fb 100644 --- a/scripts/Actions.ts +++ b/scripts/Actions.ts @@ -195,21 +195,29 @@ export function createThread(arn: AnimeNotifier) { .catch(err => arn.statusMessage.showError(err)) } -// Create soundtrack -export function createSoundTrack(arn: AnimeNotifier, button: HTMLButtonElement) { - let soundcloud = arn.app.find("soundcloud-link") as HTMLInputElement - let youtube = arn.app.find("youtube-link") as HTMLInputElement - let anime = arn.app.find("anime-link") as HTMLInputElement - let osu = arn.app.find("osu-link") as HTMLInputElement +// New soundtrack +export function newSoundTrack(arn: AnimeNotifier, button: HTMLButtonElement) { + arn.post("/api/new/soundtrack", "") + .then(response => response.json()) + .then(response => console.log(response)) + .catch(err => arn.statusMessage.showError(err)) +} - let soundtrack = { - soundcloud: soundcloud.value, - youtube: youtube.value, - tags: [anime.value, osu.value], - } +// Publish +export function publish(arn: AnimeNotifier, button: HTMLButtonElement) { + let endpoint = arn.findAPIEndpoint(button) - arn.post("/api/new/soundtrack", soundtrack) - .then(() => arn.app.load("/soundtracks")) + arn.post(endpoint + "/publish", "") + .then(() => arn.reloadContent()) + .catch(err => arn.statusMessage.showError(err)) +} + +// Unpublish +export function unpublish(arn: AnimeNotifier, button: HTMLButtonElement) { + let endpoint = arn.findAPIEndpoint(button) + + arn.post(endpoint + "/unpublish", "") + .then(() => arn.reloadContent()) .catch(err => arn.statusMessage.showError(err)) } diff --git a/scripts/AnimeNotifier.ts b/scripts/AnimeNotifier.ts index 538d1b99..14e6f79d 100644 --- a/scripts/AnimeNotifier.ts +++ b/scripts/AnimeNotifier.ts @@ -671,7 +671,7 @@ export class AnimeNotifier { post(url: string, body: any) { if(this.isLoading) { - return Promise.resolve() + return Promise.resolve(null) } if(typeof body !== "string") { @@ -685,13 +685,16 @@ export class AnimeNotifier { body, credentials: "same-origin" }) - .then(response => response.text()) - .then(body => { + .then(response => { this.loading(false) - if(body !== "ok") { - throw body + if(response.status === 200) { + return Promise.resolve(response) } + + return response.text().then(err => { + throw err + }) }) .catch(err => { this.loading(false)