mirror of
https://github.com/Eggbertx/gochan.git
synced 2025-09-06 11:46:24 -07:00
Add announcement functionality
This commit is contained in:
parent
d5e614b664
commit
b80c8b3f76
5 changed files with 108 additions and 29 deletions
|
@ -31,22 +31,6 @@ var funcMap = template.FuncMap{
|
|||
return a - b
|
||||
},
|
||||
|
||||
// Comparison functions (some copied from text/template for compatibility)
|
||||
"ge": func(a int, b int) bool {
|
||||
return a >= b
|
||||
},
|
||||
"gt": func(a int, b int) bool {
|
||||
return a > b
|
||||
},
|
||||
"le": func(a int, b int) bool {
|
||||
return a <= b
|
||||
},
|
||||
"lt": func(a int, b int) bool {
|
||||
return a < b
|
||||
},
|
||||
"intEq": func(a, b int) bool {
|
||||
return a == b
|
||||
},
|
||||
"isNil": func(i interface{}) bool {
|
||||
return i == nil
|
||||
},
|
||||
|
|
|
@ -52,10 +52,83 @@ func registerAdminPages() {
|
|||
errEv.Err(err).Caller().Msg("Unable to get staff announcements")
|
||||
return "", err
|
||||
}
|
||||
data := map[string]any{}
|
||||
editIdStr := request.FormValue("edit")
|
||||
var editID int
|
||||
deleteIdStr := request.FormValue("delete")
|
||||
var deleteID int
|
||||
var announcement announcementWithName
|
||||
if editIdStr != "" {
|
||||
if editID, err = strconv.Atoi(editIdStr); err != nil {
|
||||
errEv.Err(err).Str("editID", editIdStr).Send()
|
||||
return "", err
|
||||
}
|
||||
data["editID"] = editID
|
||||
for _, ann := range announcements {
|
||||
if ann.ID == uint(editID) {
|
||||
announcement = ann
|
||||
break
|
||||
}
|
||||
}
|
||||
if announcement.ID < 1 {
|
||||
return "", fmt.Errorf("no announcement found with id %d", editID)
|
||||
}
|
||||
fmt.Println(announcement)
|
||||
if request.PostFormValue("doedit") == "Submit" {
|
||||
// announcement update submitted
|
||||
announcement.Subject = request.PostFormValue("subject")
|
||||
announcement.Message = request.PostFormValue("message")
|
||||
if announcement.Message == "" {
|
||||
errEv.Err(errMissingAnnouncementMessage).Caller().Send()
|
||||
return "", errMissingAnnouncementMessage
|
||||
}
|
||||
updateSQL := `UPDATE DBPREFIXannouncements SET subject = ?, message = ?, timestamp = CURRENT_TIMESTAMP WHERE id = ?`
|
||||
if _, err = gcsql.ExecSQL(updateSQL,
|
||||
announcement.Subject,
|
||||
announcement.Message,
|
||||
announcement.ID); err != nil {
|
||||
errEv.Err(err).Caller().
|
||||
Str("subject", announcement.Subject).
|
||||
Str("message", announcement.Message).
|
||||
Uint("id", announcement.ID).
|
||||
Msg("Unable to update announcement")
|
||||
return "", errors.New("unable to update announcement")
|
||||
}
|
||||
fmt.Printf("Updated announcement #%d, message = %s\n", announcement.ID, announcement.Message)
|
||||
}
|
||||
} else if deleteIdStr != "" {
|
||||
if deleteID, err = strconv.Atoi(deleteIdStr); err != nil {
|
||||
errEv.Err(err).Str("deleteID", deleteIdStr).Send()
|
||||
return "", err
|
||||
}
|
||||
deleteSQL := `DELETE FROM DBPREFIXannouncements WHERE id = ?`
|
||||
if _, err = gcsql.ExecSQL(deleteSQL, deleteID); err != nil {
|
||||
errEv.Err(err).Caller().
|
||||
Int("deleteID", deleteID).
|
||||
Msg("Unable to delete announcement")
|
||||
return "", errors.New("unable to delete announcement")
|
||||
}
|
||||
} else if request.PostFormValue("newannouncement") == "Submit" {
|
||||
insertSQL := `INSERT INTO DBPREFIXannouncements (staff_id, subject, message) VALUES(?, ?, ?)`
|
||||
announcement.Subject = request.PostFormValue("subject")
|
||||
announcement.Message = request.PostFormValue("message")
|
||||
if _, err = gcsql.ExecSQL(insertSQL, staff.ID, announcement.Subject, announcement.Message); err != nil {
|
||||
errEv.Err(err).Caller().
|
||||
Str("subject", announcement.Subject).
|
||||
Str("message", announcement.Message).
|
||||
Msg("Unable to submit new announcement")
|
||||
return "", errors.New("unable to submit announcement")
|
||||
}
|
||||
}
|
||||
// update announcements array in data so the creation/edit/deletion shows up immediately
|
||||
if data["announcements"], err = getAllAnnouncements(); err != nil {
|
||||
errEv.Err(err).Caller().Msg("Unable to get staff announcements")
|
||||
return "", err
|
||||
}
|
||||
data["announcement"] = announcement
|
||||
pageBuffer := bytes.NewBufferString("")
|
||||
err = serverutil.MinifyTemplate(gctemplates.ManageAnnouncements, map[string]any{
|
||||
"announcements": announcements,
|
||||
}, pageBuffer, "tex/thtml")
|
||||
err = serverutil.MinifyTemplate(gctemplates.ManageAnnouncements, data,
|
||||
pageBuffer, "tex/thtml")
|
||||
return pageBuffer.String(), err
|
||||
}},
|
||||
Action{
|
||||
|
|
|
@ -129,7 +129,7 @@ func registerJanitorPages() {
|
|||
Permissions: JanitorPerms,
|
||||
JSONoutput: AlwaysJSON,
|
||||
Callback: func(writer http.ResponseWriter, request *http.Request, staff *gcsql.Staff, wantsJSON bool, infoEv *zerolog.Event, errEv *zerolog.Event) (output interface{}, err error) {
|
||||
// return an array of announcements and any errors
|
||||
// return an array of announcements (with staff name instead of ID) and any errors
|
||||
return getAllAnnouncements()
|
||||
}},
|
||||
Action{
|
||||
|
|
|
@ -1,11 +1,16 @@
|
|||
package manage
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"github.com/gochan-org/gochan/pkg/gcsql"
|
||||
)
|
||||
|
||||
var (
|
||||
errMissingAnnouncementMessage = errors.New("missing message field in announcement")
|
||||
)
|
||||
|
||||
type announcementWithName struct {
|
||||
ID uint `json:"no"`
|
||||
Staff string `json:"name"`
|
||||
|
|
|
@ -1,6 +1,24 @@
|
|||
<table>
|
||||
<tr><th>Subject</th><th>Message</th><th>Staff</th><th>Timestamp</th></tr>
|
||||
{{$pagePath := webPath "/manage/updateannouncements" -}}
|
||||
{{$editing := (gt $.announcement.ID 0)}}
|
||||
<style>
|
||||
table#announcements, table#announcements th, table#announcements td {
|
||||
border: 1px double;
|
||||
}
|
||||
</style>
|
||||
<table id="announcements">
|
||||
<tr>
|
||||
<th style="width: 7%;"></th>
|
||||
<th style="width: 18%;">Subject</th>
|
||||
<th style="width: 50%;">Message</th>
|
||||
<th style="width: 12.5%;">Staff</th>
|
||||
<th style="width: 12.5%;">Timestamp</th>
|
||||
</tr>
|
||||
{{range $a, $announcement := $.announcements -}}<tr>
|
||||
<td>
|
||||
<a href="{{webPath $pagePath}}?edit={{$announcement.ID}}">Edit</a>
|
||||
<a href="{{webPath $pagePath}}?delete={{$announcement.ID}}"
|
||||
onclick="return confirm('Are you sure you want to delete this announcement?')">Delete</a>
|
||||
</td>
|
||||
<td>{{$announcement.Subject}}</td>
|
||||
<td>{{$announcement.Message}}</td>
|
||||
<td>{{$announcement.Staff}}</td>
|
||||
|
@ -8,21 +26,20 @@
|
|||
</tr>{{else}}<i>No announcements</i>{{end}}
|
||||
</table>
|
||||
<hr/>
|
||||
<header>
|
||||
<h1>Create new announcement</h1>
|
||||
</header>
|
||||
<form>
|
||||
<header><h1>{{if $editing}}Edit announcement{{else}}Create new announcement{{end}}</h1></header>
|
||||
<form method="POST" action="{{$pagePath}}">
|
||||
{{if $editing}}<input type="hidden" name="edit" value="{{$.announcement.ID}}" />{{end}}
|
||||
<table id="postbox-static">
|
||||
<tr>
|
||||
<th class="postblock">Subject</th>
|
||||
<td>
|
||||
<input type="text" name="subject" size="25" maxlength="100"/>
|
||||
<input type="submit" value="Submit"/>
|
||||
<input type="text" name="subject" size="25" maxlength="100" value="{{$.announcement.Subject}}"/>
|
||||
<input type="submit" name="{{if $editing}}doedit{{else}}newannouncement{{end}}" value="Submit"/>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="postblock">Message</th>
|
||||
<td><textarea rows="5" cols="35" name="announcementmsg"></textarea></td>
|
||||
<td><textarea rows="5" cols="35" name="message" required>{{$.announcement.Message}}</textarea></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue