Add support for reordering sponsor slides.

This commit is contained in:
Patrick Fairbank
2019-09-14 12:24:39 -07:00
parent edd3923fb4
commit 33e5d932de
8 changed files with 117 additions and 15 deletions

View File

@@ -84,8 +84,8 @@ func TestRankingsApi(t *testing.T) {
func TestSponsorSlidesApi(t *testing.T) {
web := setupTestWeb(t)
slide1 := model.SponsorSlide{1, "subtitle", "line1", "line2", "image", 2}
slide2 := model.SponsorSlide{2, "Chezy Sponsaur", "Teh", "Chezy Pofs", "ejface.jpg", 54}
slide1 := model.SponsorSlide{1, "subtitle", "line1", "line2", "image", 2, 0}
slide2 := model.SponsorSlide{2, "Chezy Sponsaur", "Teh", "Chezy Pofs", "ejface.jpg", 54, 1}
web.arena.Database.CreateSponsorSlide(&slide1)
web.arena.Database.CreateSponsorSlide(&slide2)

View File

@@ -160,6 +160,7 @@ func (web *Web) saveLowerThird(lowerThird *model.LowerThird) error {
return nil
}
// Swaps the lower third having the given ID with the one immediately above or below it.
func (web *Web) reorderLowerThird(id int, moveUp bool) error {
lowerThird, err := web.arena.Database.GetLowerThirdById(id)
if err != nil {
@@ -187,7 +188,7 @@ func (web *Web) reorderLowerThird(id int, moveUp bool) error {
// The one to move is already at the limit; return an error to prevent a page reload.
return fmt.Errorf("Already at the limit.")
}
adjacentLowerThird, err := web.arena.Database.GetLowerThirdById(lowerThirds[lowerThirdIndex].Id)
adjacentLowerThird := &lowerThirds[lowerThirdIndex]
if err != nil {
return err
}

View File

@@ -54,18 +54,21 @@ func (web *Web) sponsorSlidesPostHandler(w http.ResponseWriter, r *http.Request)
handleWebErr(w, err)
return
}
if r.PostFormValue("action") == "delete" {
switch r.PostFormValue("action") {
case "delete":
err := web.arena.Database.DeleteSponsorSlide(sponsorSlide)
if err != nil {
handleWebErr(w, err)
return
}
} else {
case "save":
displayTimeSec, _ := strconv.Atoi(r.PostFormValue("displayTimeSec"))
if sponsorSlide == nil {
sponsorSlide = &model.SponsorSlide{Subtitle: r.PostFormValue("subtitle"),
Line1: r.PostFormValue("line1"), Line2: r.PostFormValue("line2"),
Image: r.PostFormValue("image"), DisplayTimeSec: displayTimeSec}
Image: r.PostFormValue("image"), DisplayTimeSec: displayTimeSec,
DisplayOrder: web.arena.Database.GetNextSponsorSlideDisplayOrder(),
}
err = web.arena.Database.CreateSponsorSlide(sponsorSlide)
} else {
sponsorSlide.Subtitle = r.PostFormValue("subtitle")
@@ -79,7 +82,65 @@ func (web *Web) sponsorSlidesPostHandler(w http.ResponseWriter, r *http.Request)
handleWebErr(w, err)
return
}
case "reorderUp":
if err = web.reorderSponsorSlide(sponsorSlideId, true); err != nil {
handleWebErr(w, err)
return
}
case "reorderDown":
if err = web.reorderSponsorSlide(sponsorSlideId, false); err != nil {
handleWebErr(w, err)
return
}
}
http.Redirect(w, r, "/setup/sponsor_slides", 303)
}
// Swaps the sponsor slide having the given ID with the one immediately above or below it.
func (web *Web) reorderSponsorSlide(id int, moveUp bool) error {
sponsorSlide, err := web.arena.Database.GetSponsorSlideById(id)
if err != nil {
return err
}
// Get the sponsor slide to swap positions with.
sponsorSlides, err := web.arena.Database.GetAllSponsorSlides()
if err != nil {
return err
}
var sponsorSlideIndex int
for i, slide := range sponsorSlides {
if slide.Id == sponsorSlide.Id {
sponsorSlideIndex = i
break
}
}
if moveUp {
sponsorSlideIndex--
} else {
sponsorSlideIndex++
}
if sponsorSlideIndex < 0 || sponsorSlideIndex == len(sponsorSlides) {
// The one to move is already at the limit; do nothing.
return nil
}
adjacentSponsorSlide := &sponsorSlides[sponsorSlideIndex]
if err != nil {
return err
}
// Swap their display orders and save.
sponsorSlide.DisplayOrder, adjacentSponsorSlide.DisplayOrder =
adjacentSponsorSlide.DisplayOrder, sponsorSlide.DisplayOrder
err = web.arena.Database.SaveSponsorSlide(sponsorSlide)
if err != nil {
return err
}
err = web.arena.Database.SaveSponsorSlide(adjacentSponsorSlide)
if err != nil {
return err
}
return nil
}

View File

@@ -12,8 +12,10 @@ import (
func TestSetupSponsorSlides(t *testing.T) {
web := setupTestWeb(t)
web.arena.Database.CreateSponsorSlide(&model.SponsorSlide{0, "Subtitle", "Sponsor Line 1", "Sponsor Line 2", "", 10})
web.arena.Database.CreateSponsorSlide(&model.SponsorSlide{0, "Subtitle", "", "", "Image.gif", 10})
web.arena.Database.CreateSponsorSlide(&model.SponsorSlide{0, "Subtitle", "Sponsor Line 1", "Sponsor Line 2", "", 10,
0})
web.arena.Database.CreateSponsorSlide(&model.SponsorSlide{0, "Subtitle", "", "", "Image.gif", 10,
1})
recorder := web.getHttpResponse("/setup/sponsor_slides")
assert.Equal(t, 200, recorder.Code)
@@ -43,4 +45,20 @@ func TestSetupSponsorSlides(t *testing.T) {
assert.Contains(t, recorder.Body.String(), "Image2.gif")
sponsorSlide, _ = web.arena.Database.GetSponsorSlideById(3)
assert.NotNil(t, sponsorSlide)
sponsorSlides1, _ := web.arena.Database.GetAllSponsorSlides()
recorder = web.postHttpResponse("/setup/sponsor_slides", "action=reorderUp&id=3")
assert.Equal(t, 303, recorder.Code)
sponsorSlides2, _ := web.arena.Database.GetAllSponsorSlides()
if assert.Equal(t, 2, len(sponsorSlides1)) && assert.Equal(t, 2, len(sponsorSlides2)) {
assert.Equal(t, sponsorSlides1[0].Id, sponsorSlides2[1].Id)
assert.Equal(t, sponsorSlides1[1].Id, sponsorSlides2[0].Id)
}
recorder = web.postHttpResponse("/setup/sponsor_slides", "action=reorderDown&id=3")
assert.Equal(t, 303, recorder.Code)
sponsorSlides3, _ := web.arena.Database.GetAllSponsorSlides()
if assert.Equal(t, 2, len(sponsorSlides1)) && assert.Equal(t, 2, len(sponsorSlides2)) {
assert.Equal(t, sponsorSlides1[0].Id, sponsorSlides3[0].Id)
assert.Equal(t, sponsorSlides1[1].Id, sponsorSlides3[1].Id)
}
}