diff --git a/README.md b/README.md index 5c1f0f63..4440b96e 100644 --- a/README.md +++ b/README.md @@ -539,6 +539,9 @@ Allows you to configure the application wide defaults for the dashboard's UI. So | `ui.header` | Header at the top of the dashboard. | `Gatus` | | `ui.logo` | URL to the logo to display. | `""` | | `ui.link` | Link to open when the logo is clicked. | `""` | +| `ui.favicon.default` | Favourite default icon to display in web browser tab or address bar. | `/favicon.ico` | +| `ui.favicon.size16x16` | Favourite icon to display in web browser for 16x16 size. | `/favicon-16x16.png` | +| `ui.favicon.size32x32` | Favourite icon to display in web browser for 32x32 size. | `/favicon-32x32.png` | | `ui.buttons` | List of buttons to display below the header. | `[]` | | `ui.buttons[].name` | Text to display on the button. | Required `""` | | `ui.buttons[].link` | Link to open when the button is clicked. | Required `""` | diff --git a/config/ui/ui.go b/config/ui/ui.go index e56a8c5c..6a62a33f 100644 --- a/config/ui/ui.go +++ b/config/ui/ui.go @@ -17,6 +17,9 @@ const ( defaultDashboardSubheading = "Monitor the health of your endpoints in real-time" defaultLogo = "" defaultLink = "" + defaultFavicon = "/favicon.ico" + defaultFavicon16 = "/favicon-16x16.png" + defaultFavicon32 = "/favicon-32x32.png" defaultCustomCSS = "" defaultSortBy = "name" defaultFilterBy = "none" @@ -39,6 +42,7 @@ type Config struct { Header string `yaml:"header,omitempty"` // Header is the text at the top of the page Logo string `yaml:"logo,omitempty"` // Logo to display on the page Link string `yaml:"link,omitempty"` // Link to open when clicking on the logo + Favicon Favicon `yaml:"favicon,omitempty"` // Favourite icon to display in web browser tab or address bar Buttons []Button `yaml:"buttons,omitempty"` // Buttons to display below the header CustomCSS string `yaml:"custom-css,omitempty"` // Custom CSS to include in the page DarkMode *bool `yaml:"dark-mode,omitempty"` // DarkMode is a flag to enable dark mode by default @@ -71,6 +75,12 @@ func (btn *Button) Validate() error { return nil } +type Favicon struct { + Default string `yaml:"default,omitempty"` // URL or path to default favourite icon. + Size16x16 string `yaml:"size16x16,omitempty"` // URL or path to favourite icon for 16x16 size. + Size32x32 string `yaml:"size32x32,omitempty"` // URL or path to favourite icon for 32x32 size. +} + // GetDefaultConfig returns a Config struct with the default values func GetDefaultConfig() *Config { return &Config{ @@ -86,6 +96,11 @@ func GetDefaultConfig() *Config { DefaultSortBy: defaultSortBy, DefaultFilterBy: defaultFilterBy, MaximumNumberOfResults: storage.DefaultMaximumNumberOfResults, + Favicon: Favicon{ + Default: defaultFavicon, + Size16x16: defaultFavicon16, + Size32x32: defaultFavicon32, + }, } } @@ -128,6 +143,15 @@ func (cfg *Config) ValidateAndSetDefaults() error { } else if cfg.DefaultFilterBy != "none" && cfg.DefaultFilterBy != "failing" && cfg.DefaultFilterBy != "unstable" { return ErrInvalidDefaultFilterBy } + if len(cfg.Favicon.Default) == 0 { + cfg.Favicon.Default = defaultFavicon + } + if len(cfg.Favicon.Size16x16) == 0 { + cfg.Favicon.Size16x16 = defaultFavicon16 + } + if len(cfg.Favicon.Size32x32) == 0 { + cfg.Favicon.Size32x32 = defaultFavicon32 + } for _, btn := range cfg.Buttons { if err := btn.Validate(); err != nil { return err diff --git a/config/ui/ui_test.go b/config/ui/ui_test.go index 12033b32..536872ef 100644 --- a/config/ui/ui_test.go +++ b/config/ui/ui_test.go @@ -41,6 +41,15 @@ func TestConfig_ValidateAndSetDefaults(t *testing.T) { if cfg.DefaultFilterBy != defaultFilterBy { t.Errorf("expected defaultFilterBy to be %s, got %s", defaultFilterBy, cfg.DefaultFilterBy) } + if cfg.Favicon.Default != defaultFavicon { + t.Errorf("expected favicon to be %s, got %s", defaultFavicon, cfg.Favicon.Default) + } + if cfg.Favicon.Size16x16 != defaultFavicon16 { + t.Errorf("expected favicon to be %s, got %s", defaultFavicon16, cfg.Favicon.Size16x16) + } + if cfg.Favicon.Size32x32 != defaultFavicon32 { + t.Errorf("expected favicon to be %s, got %s", defaultFavicon32, cfg.Favicon.Size32x32) + } }) t.Run("custom-values", func(t *testing.T) { cfg := &Config{ diff --git a/web/app/public/index.html b/web/app/public/index.html index 292029a9..890fdf1f 100644 --- a/web/app/public/index.html +++ b/web/app/public/index.html @@ -19,10 +19,10 @@ - - + + - + diff --git a/web/static/index.html b/web/static/index.html index 9f9a0a29..10022bbf 100644 --- a/web/static/index.html +++ b/web/static/index.html @@ -8,4 +8,4 @@ } else { document.documentElement.classList.remove('dark'); } - })();{{ .UI.Title }}
\ No newline at end of file + })();{{ .UI.Title }}
\ No newline at end of file