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  }