diff --git a/cmd/backend/atom.go b/cmd/backend/atom.go index 4a894f4..ef2f12e 100644 --- a/cmd/backend/atom.go +++ b/cmd/backend/atom.go @@ -46,7 +46,7 @@ func GenerateAtomFeed(c *Config, db *DB) (*string, error) { } if len(article.BannerLink) > 0 { - linkID := entry.AddLink(atom.NewLink(article.BannerLink)) + linkID := entry.AddLink(atom.NewLink(c.Domain + "/image/serve/" + article.BannerLink)) entry.Links[linkID].Rel = "enclosure" entry.Links[linkID].Type = "image/webp" } @@ -55,7 +55,8 @@ func GenerateAtomFeed(c *Config, db *DB) (*string, error) { if err != nil { return nil, fmt.Errorf("error getting user user info for Atom feed: %v", err) } - entry.AddAuthor(atom.NewPerson(user.FirstName + " " + user.LastName)) + authorID := entry.AddAuthor(atom.NewPerson(user.FirstName + " " + user.LastName)) + entry.Authors[authorID].URI = c.Domain + "/image/serve/" + user.ProfilePicLink tags, err := db.GetArticleTags(article.ID) if err != nil { diff --git a/cmd/backend/users.go b/cmd/backend/users.go index 0677334..5a1c08e 100644 --- a/cmd/backend/users.go +++ b/cmd/backend/users.go @@ -149,11 +149,11 @@ func (db *DB) AddUser(c *Config, u *User, pass string) (int64, error) { } query := ` - INSERT INTO users (username, password, first_name, last_name, email, role) - VALUES (?, ?, ?, ?, ?, ?) + INSERT INTO users (username, password, first_name, last_name, email, profile_pic_link, role) + VALUES (?, ?, ?, ?, ?, ?, ?) ` - result, err := db.Exec(query, u.UserName, string(hashedPass), aesFirstName, aesLastName, aesEmail, u.Role) + result, err := db.Exec(query, u.UserName, string(hashedPass), aesFirstName, aesLastName, aesEmail, u.ProfilePicLink, u.Role) if err != nil { return 0, fmt.Errorf("error inserting new user %v into DB: %v", u.UserName, err) } @@ -253,13 +253,13 @@ func (db *DB) GetUser(c *Config, id int64) (*User, error) { user := new(User) query := ` - SELECT id, username, first_name, last_name, email, role + SELECT id, username, first_name, last_name, email, profile_pic_link, role FROM users WHERE id = ? ` row := db.QueryRow(query, id) - if err := row.Scan(&user.ID, &user.UserName, &aesFirstName, &aesLastName, &aesEmail, &user.Role); err != nil { + if err := row.Scan(&user.ID, &user.UserName, &aesFirstName, &aesLastName, &aesEmail, &user.ProfilePicLink, &user.Role); err != nil { return nil, fmt.Errorf("error reading user information: %v", err) } @@ -281,10 +281,10 @@ func (db *DB) GetUser(c *Config, id int64) (*User, error) { return user, nil } -func (db *DB) UpdateOwnUserAttributes(c *Config, id int64, userName, firstName, lastName, email, oldPass, newPass string) error { +func (db *DB) UpdateOwnUserAttributes(c *Config, id int64, userName, firstName, lastName, email, profilePicLink, oldPass, newPass string) error { var err error tx := new(Tx) - passwordEmpty := len(newPass) > 0 + passwordEmpty := len(newPass) == 0 for i := 0; i < TxMaxRetries; i++ { err := func() error { @@ -293,6 +293,7 @@ func (db *DB) UpdateOwnUserAttributes(c *Config, id int64, userName, firstName, return fmt.Errorf("error starting transaction: %v", err) } + fmt.Println(len(newPass), passwordEmpty) if !passwordEmpty { if err = tx.ChangePassword(id, oldPass, newPass); err != nil { if rollbackErr := tx.Rollback(); rollbackErr != nil { @@ -326,11 +327,13 @@ func (db *DB) UpdateOwnUserAttributes(c *Config, id int64, userName, firstName, return fmt.Errorf("error encrypting email: %v", err) } + fmt.Println("profilePicLink:", profilePicLink) if err = tx.UpdateAttributes( &Attribute{Table: "users", ID: id, AttName: "username", Value: userName}, &Attribute{Table: "users", ID: id, AttName: "first_name", Value: aesFirstName}, &Attribute{Table: "users", ID: id, AttName: "last_name", Value: aesLastName}, &Attribute{Table: "users", ID: id, AttName: "email", Value: aesEmail}, + &Attribute{Table: "users", ID: id, AttName: "profile_pic_link", Value: profilePicLink}, ); err != nil { if rollbackErr := tx.Rollback(); rollbackErr != nil { log.Fatalf("transaction error: %v, rollback error: %v", err, rollbackErr) @@ -360,8 +363,8 @@ func (db *DB) AddFirstUser(c *Config, u *User, pass string) (int64, error) { txOptions := &sql.TxOptions{Isolation: sql.LevelSerializable} selectQuery := "SELECT COUNT(*) FROM users" insertQuery := ` - INSERT INTO users (username, password, first_name, last_name, email, role) - VALUES (?, ?, ?, ?, ?, ?) + INSERT INTO users (username, password, first_name, last_name, email, profile_pic_link, role) + VALUES (?, ?, ?, ?, ?, ?, ?) ` for i := 0; i < TxMaxRetries; i++ { @@ -416,7 +419,7 @@ func (db *DB) AddFirstUser(c *Config, u *User, pass string) (int64, error) { return 0, fmt.Errorf("error encrypting email: %v", err) } - result, err := tx.Exec(insertQuery, u.UserName, string(hashedPass), aesFirstName, aesLastName, aesEmail, u.Role) + result, err := tx.Exec(insertQuery, u.UserName, string(hashedPass), aesFirstName, aesLastName, aesEmail, u.ProfilePicLink, u.Role) if err != nil { if rollbackErr := tx.Rollback(); rollbackErr != nil { log.Fatalf("transaction error: %v, rollback error: %v", err, rollbackErr) @@ -451,7 +454,7 @@ func (db *DB) GetAllUsers(c *Config) (map[int64]*User, error) { var aesFirstName, aesLastName, aesEmail string var err error - query := "SELECT id, username, first_name, last_name, email, role FROM users" + query := "SELECT id, username, first_name, last_name, email, profile_pic_link, role FROM users" rows, err := db.Query(query) if err != nil { @@ -461,7 +464,7 @@ func (db *DB) GetAllUsers(c *Config) (map[int64]*User, error) { users := make(map[int64]*User, 0) for rows.Next() { user := new(User) - if err = rows.Scan(&user.ID, &user.UserName, &aesFirstName, &aesLastName, &aesEmail, &user.Role); err != nil { + if err = rows.Scan(&user.ID, &user.UserName, &aesFirstName, &aesLastName, &aesEmail, &user.ProfilePicLink, &user.Role); err != nil { return nil, fmt.Errorf("error getting user info: %v", err) } @@ -506,10 +509,10 @@ func (tx *Tx) SetPassword(id int64, newPass string) error { return nil } -func (db *DB) UpdateUserAttributes(c *Config, id int64, userName, firstName, lastName, email, newPass string, role int) error { +func (db *DB) UpdateUserAttributes(c *Config, id int64, userName, firstName, lastName, email, profilePicLink, newPass string, role int) error { var err error tx := new(Tx) - passwordEmpty := len(newPass) > 0 + passwordEmpty := len(newPass) == 0 for i := 0; i < TxMaxRetries; i++ { err := func() error { @@ -556,6 +559,7 @@ func (db *DB) UpdateUserAttributes(c *Config, id int64, userName, firstName, las &Attribute{Table: "users", ID: id, AttName: "first_name", Value: aesFirstName}, &Attribute{Table: "users", ID: id, AttName: "last_name", Value: aesLastName}, &Attribute{Table: "users", ID: id, AttName: "email", Value: aesEmail}, + &Attribute{Table: "users", ID: id, AttName: "profile_pic_link", Value: profilePicLink}, &Attribute{Table: "users", ID: id, AttName: "role", Value: role}, ); err != nil { if rollbackErr := tx.Rollback(); rollbackErr != nil { diff --git a/cmd/frontend/articles.go b/cmd/frontend/articles.go index 9886490..019fcc6 100644 --- a/cmd/frontend/articles.go +++ b/cmd/frontend/articles.go @@ -7,7 +7,6 @@ import ( "net/http" "os" "strconv" - "strings" "time" b "streifling.com/jason/cpolis/cmd/backend" @@ -24,7 +23,7 @@ type EditorHTMLData struct { Action string ActionTitle string ActionButton string - BannerImage string + Image string HTMLContent template.HTML Article *b.Article Tags []*b.Tag @@ -80,7 +79,7 @@ func SubmitArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { article := &b.Article{ Title: r.PostFormValue("article-title"), - BannerLink: c.Domain + "/image/serve/" + r.PostFormValue("article-banner-url"), + BannerLink: r.PostFormValue("article-banner-url"), Summary: r.PostFormValue("article-summary"), Published: false, Rejected: false, @@ -170,11 +169,6 @@ func ResubmitArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return } - bannerLink := r.PostFormValue("article-banner-url") - if len(bannerLink) != 0 { - bannerLink = c.Domain + "/image/serve/" + bannerLink - } - summary := r.PostFormValue("article-summary") if len(summary) == 0 { http.Error(w, "Bitte die Beschreibung eingeben.", http.StatusBadRequest) @@ -196,7 +190,7 @@ func ResubmitArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { if err = db.UpdateAttributes( &b.Attribute{Table: "articles", ID: id, AttName: "title", Value: title}, - &b.Attribute{Table: "articles", ID: id, AttName: "banner_link", Value: bannerLink}, + &b.Attribute{Table: "articles", ID: id, AttName: "banner_link", Value: r.PostFormValue("article-banner-url")}, &b.Attribute{Table: "articles", ID: id, AttName: "summary", Value: summary}, &b.Attribute{Table: "articles", ID: id, AttName: "rejected", Value: false}, &b.Attribute{Table: "articles", ID: id, AttName: "is_in_issue", Value: r.PostFormValue("issue") == "on"}, @@ -341,8 +335,7 @@ func ReviewRejectedArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.Handler return } - imgURL := strings.Split(data.Article.BannerLink, "/") - data.BannerImage = imgURL[len(imgURL)-1] + data.Image = data.Article.BannerLink articleAbsName := fmt.Sprint(c.ArticleDir, "/", data.Article.ID, ".md") content, err := os.ReadFile(articleAbsName) @@ -612,8 +605,7 @@ func ReviewArticle(c *b.Config, db *b.DB, s *b.CookieStore, action, title, butto return } - imgURL := strings.Split(article.BannerLink, "/") - data.BannerImage = imgURL[len(imgURL)-1] + data.Image = article.BannerLink data.Article.Summary, err = b.ConvertToPlain(article.Summary) if err != nil { @@ -789,8 +781,7 @@ func EditArticle(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return } - imgURL := strings.Split(data.Article.BannerLink, "/") - data.BannerImage = imgURL[len(imgURL)-1] + data.Image = data.Article.BannerLink content, err := os.ReadFile(fmt.Sprint(c.ArticleDir, "/", data.Article.ID, ".md")) if err != nil { diff --git a/cmd/frontend/images.go b/cmd/frontend/images.go index d6aecbe..079929c 100644 --- a/cmd/frontend/images.go +++ b/cmd/frontend/images.go @@ -9,7 +9,7 @@ import ( b "streifling.com/jason/cpolis/cmd/backend" ) -func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc { +func UploadEasyMDEImage(c *b.Config, s *b.CookieStore) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if _, err := GetSession(w, r, c, s); err != nil { log.Println(err) @@ -42,7 +42,7 @@ func UploadImage(c *b.Config, s *b.CookieStore) http.HandlerFunc { } } -func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate string) http.HandlerFunc { +func UploadImage(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate string) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if _, err := GetSession(w, r, c, s); err != nil { log.Println(err) @@ -69,8 +69,8 @@ func UploadBanner(c *b.Config, s *b.CookieStore, fileKey, htmlFile, htmlTemplate return } - data := new(struct{ BannerImage string }) - data.BannerImage = filename + data := new(struct{ Image string }) + data.Image = filename tmpl, err := template.ParseFiles(c.WebDir + "/templates/" + htmlFile) if err = template.Must(tmpl, err).ExecuteTemplate(w, htmlTemplate, data); err != nil { diff --git a/cmd/frontend/sessions.go b/cmd/frontend/sessions.go index ffef532..788a484 100644 --- a/cmd/frontend/sessions.go +++ b/cmd/frontend/sessions.go @@ -57,15 +57,21 @@ func HomePage(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { } data := new(struct { + *UserHTMLData Version string - Role int }) + data.UserHTMLData = &UserHTMLData{User: new(b.User)} data.Version = c.Version files := make([]string, 2) files[0] = c.WebDir + "/templates/index.html" if numRows == 0 { - files[1] = c.WebDir + "/templates/first-user.html" + data.Role = b.NonExistent + data.Title = "Erster Benutzer (Administrator)" + data.ButtonText = "Anlegen" + data.URL = "/user/add-first" + + files[1] = c.WebDir + "/templates/edit-user.html" tmpl, err := template.ParseFiles(files...) if err = template.Must(tmpl, err).Execute(w, data); err != nil { log.Println(err) @@ -79,6 +85,7 @@ func HomePage(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { http.Error(w, err.Error(), http.StatusInternalServerError) return } + if auth, ok := session.Values["authenticated"].(bool); auth && ok { data.Role = session.Values["role"].(int) files[1] = c.WebDir + "/templates/hub.html" @@ -89,6 +96,7 @@ func HomePage(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return } } else { + data.Role = b.Author files[1] = c.WebDir + "/templates/login.html" tmpl, err := template.ParseFiles(files...) if err = template.Must(tmpl, err).Execute(w, data); err != nil { diff --git a/cmd/frontend/users.go b/cmd/frontend/users.go index e3aed55..be3c978 100644 --- a/cmd/frontend/users.go +++ b/cmd/frontend/users.go @@ -10,6 +10,14 @@ import ( b "streifling.com/jason/cpolis/cmd/backend" ) +type UserHTMLData struct { + *b.User + Title string + ButtonText string + URL string + Image string +} + func checkUserStrings(user *b.User) (string, int, bool) { userLen := 63 // max value for utf-8 at 255 bytes nameLen := 56 // max value when aes encrypting utf-8 at up to 255 bytes @@ -33,8 +41,15 @@ func CreateUser(c *b.Config, s *b.CookieStore) http.HandlerFunc { return } - tmpl, err := template.ParseFiles(c.WebDir + "/templates/add-user.html") - if err = template.Must(tmpl, err).ExecuteTemplate(w, "page-content", nil); err != nil { + data := &UserHTMLData{ + User: &b.User{Role: b.Author}, + Title: "Neuer Benutzer", + ButtonText: "Anlegen", + URL: "/user/add", + } + + tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-user.html") + if err = template.Must(tmpl, err).ExecuteTemplate(w, "page-content", data); err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -52,10 +67,11 @@ func AddUser(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { } user := &b.User{ - UserName: r.PostFormValue("username"), - FirstName: r.PostFormValue("first-name"), - LastName: r.PostFormValue("last-name"), - Email: r.PostFormValue("email"), + UserName: r.PostFormValue("username"), + FirstName: r.PostFormValue("first-name"), + LastName: r.PostFormValue("last-name"), + Email: r.PostFormValue("email"), + ProfilePicLink: r.PostFormValue("profile-pic-url"), } pass := r.PostFormValue("password") pass2 := r.PostFormValue("password2") @@ -136,8 +152,16 @@ func EditSelf(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return } - tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-self.html") - if err = template.Must(tmpl, err).ExecuteTemplate(w, "page-content", user); err != nil { + data := &UserHTMLData{ + User: user, + Title: "Mein Profil bearbeiten", + ButtonText: "Übernehmen", + URL: "/user/update/self", + Image: user.ProfilePicLink, + } + + tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-user.html") + if err = template.Must(tmpl, err).ExecuteTemplate(w, "page-content", data); err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -155,11 +179,12 @@ func UpdateSelf(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { } user := &b.User{ - ID: session.Values["id"].(int64), - UserName: r.PostFormValue("username"), - FirstName: r.PostFormValue("first-name"), - LastName: r.PostFormValue("last-name"), - Email: r.PostFormValue("email"), + ID: session.Values["id"].(int64), + UserName: r.PostFormValue("username"), + FirstName: r.PostFormValue("first-name"), + LastName: r.PostFormValue("last-name"), + Email: r.PostFormValue("email"), + ProfilePicLink: r.PostFormValue("profile-pic-url"), } oldPass := r.PostFormValue("old-password") @@ -202,7 +227,7 @@ func UpdateSelf(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return } - if err = db.UpdateOwnUserAttributes(c, user.ID, user.UserName, user.FirstName, user.LastName, user.Email, oldPass, newPass); err != nil { + if err = db.UpdateOwnUserAttributes(c, user.ID, user.UserName, user.FirstName, user.LastName, user.Email, user.ProfilePicLink, oldPass, newPass); err != nil { log.Println("error: user:", user.ID, err) http.Error(w, "Benutzerdaten konnten nicht aktualisiert werden.", http.StatusInternalServerError) return @@ -225,11 +250,12 @@ func AddFirstUser(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { var err error user := &b.User{ - UserName: r.PostFormValue("username"), - FirstName: r.PostFormValue("first-name"), - LastName: r.PostFormValue("last-name"), - Email: r.PostFormValue("email"), - Role: b.Admin, + UserName: r.PostFormValue("username"), + FirstName: r.PostFormValue("first-name"), + LastName: r.PostFormValue("last-name"), + Email: r.PostFormValue("email"), + ProfilePicLink: r.PostFormValue("profile-pic-url"), + Role: b.Admin, } pass := r.PostFormValue("password") pass2 := r.PostFormValue("password2") @@ -345,8 +371,16 @@ func EditUser(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return } + data := &UserHTMLData{ + User: user, + Title: "Profil von " + user.FirstName + " " + user.LastName + " bearbeiten", + ButtonText: "Übernehmen", + URL: fmt.Sprint("/user/update/", user.ID), + Image: user.ProfilePicLink, + } + tmpl, err := template.ParseFiles(c.WebDir + "/templates/edit-user.html") - if err = template.Must(tmpl, err).ExecuteTemplate(w, "page-content", user); err != nil { + if err = template.Must(tmpl, err).ExecuteTemplate(w, "page-content", data); err != nil { log.Println(err) http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -402,6 +436,8 @@ func UpdateUser(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return } + user.ProfilePicLink = r.PostFormValue("profile-pic-url") + newPass := r.PostFormValue("password") newPass2 := r.PostFormValue("password2") if newPass != newPass2 { @@ -420,7 +456,7 @@ func UpdateUser(c *b.Config, db *b.DB, s *b.CookieStore) http.HandlerFunc { return } - if err = db.UpdateUserAttributes(c, user.ID, user.UserName, user.FirstName, user.LastName, user.Email, newPass, user.Role); err != nil { + if err = db.UpdateUserAttributes(c, user.ID, user.UserName, user.FirstName, user.LastName, user.Email, user.ProfilePicLink, newPass, user.Role); err != nil { log.Println("error: user:", user.ID, err) http.Error(w, "Benutzerdaten konnten nicht aktualisiert werden.", http.StatusInternalServerError) return diff --git a/cmd/main.go b/cmd/main.go index e2f05db..8a43477 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -83,10 +83,10 @@ func main() { mux.HandleFunc("POST /article/resubmit/{id}", f.ResubmitArticle(config, db, store)) mux.HandleFunc("POST /article/submit", f.SubmitArticle(config, db, store)) - mux.HandleFunc("POST /article/upload-banner", f.UploadBanner(config, store, "article-banner", "editor.html", "article-banner-template")) - mux.HandleFunc("POST /article/upload-image", f.UploadImage(config, store)) + mux.HandleFunc("POST /article/upload-banner", f.UploadImage(config, store, "article-banner", "editor.html", "article-banner-template")) + mux.HandleFunc("POST /article/upload-image", f.UploadEasyMDEImage(config, store)) mux.HandleFunc("POST /issue/publish", f.PublishLatestIssue(config, db, store)) - mux.HandleFunc("POST /issue/upload-banner", f.UploadBanner(config, store, "issue-banner", "current-issue.html", "issue-banner-template")) + mux.HandleFunc("POST /issue/upload-banner", f.UploadImage(config, store, "issue-banner", "current-issue.html", "issue-banner-template")) mux.HandleFunc("POST /login", f.Login(config, db, store)) mux.HandleFunc("POST /pdf/upload", f.UploadPDF(config, store)) mux.HandleFunc("POST /tag/add", f.AddTag(config, db, store)) @@ -94,6 +94,7 @@ func main() { mux.HandleFunc("POST /user/add-first", f.AddFirstUser(config, db, store)) mux.HandleFunc("POST /user/update/{id}", f.UpdateUser(config, db, store)) mux.HandleFunc("POST /user/update/self", f.UpdateSelf(config, db, store)) + mux.HandleFunc("POST /user/upload-profile-pic", f.UploadImage(config, store, "upload-profile-pic", "edit-user.html", "profile-pic-template")) log.Fatalln(http.ListenAndServe(config.Port, mux)) } diff --git a/create_db.sql b/create_db.sql index 0a0763c..f32822e 100644 --- a/create_db.sql +++ b/create_db.sql @@ -11,7 +11,7 @@ CREATE TABLE users ( first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, - -- profile_pic_link VARCHAR(255) NOT NULL, + profile_pic_link VARCHAR(255), role INT NOT NULL, PRIMARY KEY (id) ); @@ -26,7 +26,7 @@ CREATE TABLE articles ( id INT AUTO_INCREMENT, title VARCHAR(255) NOT NULL, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - banner_link VARCHAR(255) NOT NULL, + banner_link VARCHAR(255), summary TEXT NOT NULL, published BOOL NOT NULL, rejected BOOL NOT NULL, diff --git a/web/static/css/input.css b/web/static/css/input.css index b7778b5..b7475d6 100644 --- a/web/static/css/input.css +++ b/web/static/css/input.css @@ -24,7 +24,7 @@ textarea { } .btn-area { - @apply grid grid-cols-1 md:grid-cols-2 gap-x-4 gap-y-1 mt-4; + @apply grid grid-cols-1 md:grid-cols-2 gap-x-4 gap-y-1; } .btn-area-3 { @@ -40,33 +40,33 @@ textarea { } .EasyMDEContainer .CodeMirror { - @apply bg-slate-50 dark:bg-slate-950 border-slate-200 dark:border-slate-800 text-slate-900 dark:text-slate-100 + @apply bg-slate-50 dark:bg-slate-950 border-slate-200 dark:border-slate-800 text-slate-900 dark:text-slate-100; } .EasyMDEContainer .cm-s-easymde .CodeMirror-cursor { - @apply border-slate-900 dark:border-slate-100 + @apply border-slate-900 dark:border-slate-100; } .EasyMDEContainer .editor-toolbar > * { - @apply text-slate-900 dark:text-slate-100 + @apply text-slate-900 dark:text-slate-100; } .EasyMDEContainer .editor-toolbar > .active, .editor-toolbar > button:hover, .editor-preview pre, .cm-s-easymde .cm-comment { - @apply bg-slate-100 dark:bg-slate-900 + @apply bg-slate-100 dark:bg-slate-900; } .EasyMDEContainer .CodeMirror-fullscreen { - @apply bg-slate-50 dark:bg-slate-950 + @apply bg-slate-50 dark:bg-slate-950; } .editor-toolbar { - @apply border border-slate-200 dark:border-slate-800 + @apply border border-slate-200 dark:border-slate-800; } .editor-toolbar.fullscreen { - @apply bg-slate-50 dark:bg-slate-950 + @apply bg-slate-50 dark:bg-slate-950; } .editor-preview { - @apply bg-slate-50 dark:bg-slate-950 + @apply bg-slate-50 dark:bg-slate-950; } diff --git a/web/templates/add-user.html b/web/templates/add-user.html deleted file mode 100644 index 013b8eb..0000000 --- a/web/templates/add-user.html +++ /dev/null @@ -1,66 +0,0 @@ -{{define "page-content"}} -