github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/clib/theme.go (about) 1 // Package clib - Content managed by Project Forge, see [projectforge.md] for details. 2 package clib 3 4 import ( 5 "net/http" 6 7 "github.com/pkg/errors" 8 9 "github.com/kyleu/dbaudit/app" 10 "github.com/kyleu/dbaudit/app/controller" 11 "github.com/kyleu/dbaudit/app/controller/csession" 12 "github.com/kyleu/dbaudit/app/controller/cutil" 13 "github.com/kyleu/dbaudit/app/lib/theme" 14 "github.com/kyleu/dbaudit/app/util" 15 "github.com/kyleu/dbaudit/views/vtheme" 16 ) 17 18 const themeIcon = "gift" 19 20 func ThemeList(w http.ResponseWriter, r *http.Request) { 21 controller.Act("theme.list", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 22 th := as.Themes.All(ps.Logger) 23 ps.SetTitleAndData("Themes", th) 24 ps.DefaultNavIcon = themeIcon 25 return controller.Render(w, r, as, &vtheme.List{Themes: th}, ps, "Themes||/theme") 26 }) 27 } 28 29 func ThemeEdit(w http.ResponseWriter, r *http.Request) { 30 controller.Act("theme.edit", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 31 key, err := cutil.RCRequiredString(r, "key", false) 32 if err != nil { 33 return "", err 34 } 35 if key == theme.Default.Key { 36 return controller.FlashAndRedir(false, "Unable to edit default theme", "/theme", w, ps) 37 } 38 var t *theme.Theme 39 if key == theme.KeyNew { 40 t = theme.Default.Clone(key) 41 } else { 42 t = as.Themes.Get(key, ps.Logger) 43 if t == nil { 44 if pal := r.URL.Query().Get("palette"); pal != "" { 45 themes, err := theme.PaletteThemes(pal) 46 if err != nil { 47 return "", err 48 } 49 t = themes.Get(key) 50 } 51 } 52 } 53 if t == nil { 54 return "", errors.Errorf("invalid theme [%s]", key) 55 } 56 ps.SetTitleAndData("Edit theme ["+t.Key+"]", t) 57 ps.DefaultNavIcon = themeIcon 58 page := &vtheme.Edit{Theme: t, Icon: "app", Exists: as.Themes.FileExists(t.Key)} 59 return controller.Render(w, r, as, page, ps, "Themes||/theme", t.Key) 60 }) 61 } 62 63 func ThemeSave(w http.ResponseWriter, r *http.Request) { 64 controller.Act("theme.save", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 65 key, err := cutil.RCRequiredString(r, "key", false) 66 if err != nil { 67 return "", err 68 } 69 frm, err := cutil.ParseForm(r, ps.RequestBody) 70 if err != nil { 71 return "", err 72 } 73 74 orig := as.Themes.Get(key, ps.Logger) 75 76 newKey, err := frm.GetString("key", false) 77 if err != nil { 78 return "", err 79 } 80 if newKey == theme.KeyNew { 81 newKey = util.RandomString(12) 82 } 83 84 l := orig.Light.Clone().ApplyMap(frm, "light-") 85 d := orig.Dark.Clone().ApplyMap(frm, "dark-") 86 87 t := &theme.Theme{Key: newKey, Light: l, Dark: d} 88 89 err = as.Themes.Save(t, frm.GetStringOpt("originalKey"), ps.Logger) 90 if err != nil { 91 return "", errors.Wrap(err, "unable to save theme") 92 } 93 94 ps.Profile.Theme = newKey 95 err = csession.SaveProfile(ps.Profile, w, ps.Session, ps.Logger) 96 if err != nil { 97 return "", err 98 } 99 100 return controller.ReturnToReferrer("saved changes to theme ["+newKey+"]", "/theme", w, ps) 101 }) 102 } 103 104 func ThemeRemove(w http.ResponseWriter, r *http.Request) { 105 controller.Act("theme.remove", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 106 key, err := cutil.RCRequiredString(r, "key", false) 107 if err != nil { 108 return "", err 109 } 110 err = as.Themes.Remove(key, ps.Logger) 111 if err != nil { 112 return "", errors.Wrap(err, "unable to remove theme") 113 } 114 return controller.ReturnToReferrer("removed theme ["+key+"]", "/theme", w, ps) 115 }) 116 }