diff --git a/conference.go b/conference.go index bad77c9..528d812 100644 --- a/conference.go +++ b/conference.go @@ -95,6 +95,14 @@ func Conferences(ctxt ui.AmContext) (string, any, error) { return "framed_template", "conflist.jet", err } +/* Topics displayes the list of topics in a conference. + * Parameters: + * ctxt - The AmContext for the request. + * Returns: + * Command string dictating what to be rendered. + * Data as a parameter for the command string. + * Standard Go error status. + */ func Topics(ctxt ui.AmContext) (string, any, error) { cmd, arg, err := singleConferencePrequel(ctxt) if cmd != "" { @@ -158,3 +166,28 @@ func Topics(ctxt ui.AmContext) (string, any, error) { ctxt.VarMap().Set("amsterdam_pageTitle", "Topics in "+conf.Name) return "framed_template", "topiclist.jet", nil } + +func NewTopicForm(ctxt ui.AmContext) (string, any, error) { + cmd, arg, err := singleConferencePrequel(ctxt) + if cmd != "" { + return cmd, arg, err + } + comm := ctxt.CurrentCommunity() + conf := ctxt.GetScratch("currentConference").(*database.Conference) + ci, err := ctxt.CurrentUser().ContactInfo() + if err != nil { + return ui.ErrorPage(ctxt, err) + } + myLevel := ctxt.GetScratch("levelInConference").(uint16) + if !conf.TestPermission("Conference.Create", myLevel) { + ctxt.SetRC(http.StatusForbidden) + return ui.ErrorPage(ctxt, errors.New("you are not permitted to read this conference")) + } + ctxt.VarMap().Set("conferenceName", conf.Name) + ctxt.VarMap().Set("urlStem", fmt.Sprintf("/comm/%s/conf/%s", comm.Alias, ctxt.URLParam("confid"))) + ctxt.VarMap().Set("topicName", "") + ctxt.VarMap().Set("pseud", ci.FullName(false)) + ctxt.VarMap().Set("pb", "") + ctxt.VarMap().Set("amsterdam_pageTitle", "Create New Topic") + return "framed_template", "new_topic.jet", nil +} diff --git a/database/contactinfo.go b/database/contactinfo.go index 386f9d6..be31dc7 100644 --- a/database/contactinfo.go +++ b/database/contactinfo.go @@ -12,6 +12,7 @@ package database import ( "errors" "fmt" + "strings" "sync" "time" @@ -73,6 +74,45 @@ func lookupUserContact(uid int32) (int32, error) { return rc, err } +// FullName returns the full name inside this contact info. +func (ci *ContactInfo) FullName(ps bool) string { + var b strings.Builder + writeSpace := false + if ps && ci.Prefix != nil && *ci.Prefix != "" { + b.WriteString(*ci.Prefix) + writeSpace = true + } + if ci.GivenName != nil && *ci.GivenName != "" { + if writeSpace { + b.WriteString(" ") + } + b.WriteString(*ci.GivenName) + writeSpace = true + } + if ci.MiddleInit != nil && *ci.MiddleInit != "" { + if writeSpace { + b.WriteString(" ") + } + b.WriteString(*ci.MiddleInit) + b.WriteString(".") + writeSpace = true + } + if ci.FamilyName != nil && *ci.FamilyName != "" { + if writeSpace { + b.WriteString(" ") + } + b.WriteString(*ci.FamilyName) + writeSpace = true + } + if ps && ci.Suffix != nil && *ci.Suffix != "" { + if writeSpace { + b.WriteString(" ") + } + b.WriteString(*ci.Suffix) + } + return b.String() +} + /* Save saves the contact info to the database. * Returns: * true if the E-mail address on this account has been changed, false if not. diff --git a/main.go b/main.go index 6ab9ac7..a30bea4 100644 --- a/main.go +++ b/main.go @@ -85,6 +85,7 @@ func setupEcho() *echo.Echo { e.POST("/comm/:cid/admin/logo", ui.AmWrap(EditCommunityLogo)) e.GET("/comm/:cid/conf", ui.AmWrap(Conferences)) e.GET("/comm/:cid/conf/:confid", ui.AmWrap(Topics)) + e.GET("/comm/:cid/conf/:confid/new_topic", ui.AmWrap(NewTopicForm)) return e } diff --git a/ui/views/new_topic.jet b/ui/views/new_topic.jet new file mode 100644 index 0000000..85d0743 --- /dev/null +++ b/ui/views/new_topic.jet @@ -0,0 +1,84 @@ +{* + * Amsterdam Web Communities System + * Copyright (c) 2025 Erbosoft Metaverse Design Solutions, All Rights Reserved + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + *} +