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

@@ -5,7 +5,8 @@ CREATE TABLE sponsor_slides (
line1 VARCHAR(255),
line2 VARCHAR(255),
image VARCHAR(255),
displaytimesec int
displaytimesec int,
displayorder int
);
-- +goose Down

View File

@@ -12,6 +12,7 @@ type SponsorSlide struct {
Line2 string
Image string
DisplayTimeSec int
DisplayOrder int
}
func (database *Database) CreateSponsorSlide(sponsorSlide *SponsorSlide) error {
@@ -44,6 +45,12 @@ func (database *Database) TruncateSponsorSlides() error {
func (database *Database) GetAllSponsorSlides() ([]SponsorSlide, error) {
var sponsorSlides []SponsorSlide
err := database.sponsorSlideMap.Select(&sponsorSlides, "SELECT * FROM sponsor_slides ORDER BY id")
err := database.sponsorSlideMap.Select(&sponsorSlides, "SELECT * FROM sponsor_slides ORDER BY displayorder")
return sponsorSlides, err
}
func (database *Database) GetNextSponsorSlideDisplayOrder() int {
var count int
_ = database.sponsorSlideMap.SelectOne(&count, "SELECT MAX(displayorder) + 1 FROM sponsor_slides")
return count
}

View File

@@ -19,11 +19,14 @@ func TestGetNonexistentSponsorSlide(t *testing.T) {
func TestSponsorSlideCrud(t *testing.T) {
db := setupTestDb(t)
sponsorSlide := SponsorSlide{0, "Subtitle", "Line 1", "Line 2", "", 10}
assert.Equal(t, 0, db.GetNextSponsorSlideDisplayOrder())
sponsorSlide := SponsorSlide{0, "Subtitle", "Line 1", "Line 2", "", 10, 0}
db.CreateSponsorSlide(&sponsorSlide)
sponsorSlide2, err := db.GetSponsorSlideById(1)
assert.Nil(t, err)
assert.Equal(t, sponsorSlide, *sponsorSlide2)
assert.Equal(t, 1, db.GetNextSponsorSlideDisplayOrder())
sponsorSlide.Line1 = "Blorpy"
db.SaveSponsorSlide(&sponsorSlide)
@@ -40,10 +43,11 @@ func TestSponsorSlideCrud(t *testing.T) {
func TestTruncateSponsorSlides(t *testing.T) {
db := setupTestDb(t)
sponsorSlide := SponsorSlide{0, "Subtitle", "Line 1", "Line 2", "", 10}
sponsorSlide := SponsorSlide{0, "Subtitle", "Line 1", "Line 2", "", 10, 0}
db.CreateSponsorSlide(&sponsorSlide)
db.TruncateSponsorSlides()
sponsorSlide2, err := db.GetSponsorSlideById(1)
assert.Nil(t, err)
assert.Nil(t, sponsorSlide2)
assert.Equal(t, 0, db.GetNextSponsorSlideDisplayOrder())
}

View File

@@ -11,7 +11,7 @@
<div class="well">
<legend>Sponsor Slides Configuration</legend>
<p>Place images in /static/img/sponsors/</p>
{{range $sponsorSlide := .SponsorSlides}}
{{range $i, $sponsorSlide := .SponsorSlides}}
<form class="form-horizontal existing" action="/setup/sponsor_slides" method="POST">
<div class="form-group">
<div class="col-lg-7">
@@ -54,8 +54,18 @@
</div>
<div class="col-lg-5">
<button type="submit" class="btn btn-info btn-lower-third" name="action" value="save">Save</button>
<br />
<button type="submit" class="btn btn-primary btn-lower-third" name="action" value="delete">Delete</button>
{{if lt $i (add (len $.SponsorSlides) -1) }}
<button type="submit" class="btn btn-info" name="action" value="reorderUp">
<i class="glyphicon glyphicon-arrow-up"></i>
</button>
<br />
<button type="submit" class="btn btn-primary btn-lower-third" name="action" value="delete">
Delete
</button>
<button type="submit" class="btn btn-info" name="action" value="reorderDown">
<i class="glyphicon glyphicon-arrow-down"></i>
</button>
{{end}}
<br />
<button class="btn btn-warning" name="toggleImage">Toggle Image/Text</button>
</div>

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)
}
}