From f0adf25c540c245cabdde188cd2def612bbb1470 Mon Sep 17 00:00:00 2001 From: MauserBitfly <125363940+MauserBitfly@users.noreply.github.com> Date: Mon, 13 Mar 2023 15:46:59 +0100 Subject: [PATCH] Bids 1582/generic ad module (#1910) * (BIDS-1582) replace old ad system with new generic ad configurations --- cmd/explorer/main.go | 3 + db/db.go | 141 +++++++++++++++ handlers/404.go | 5 +- handlers/ad_configuration.go | 164 ++++++++++++++++++ handlers/advertisewithus.go | 5 +- handlers/auth.go | 29 ++-- handlers/broadcast.go | 10 +- handlers/burn.go | 5 +- handlers/calculator.go | 6 +- handlers/charts.go | 17 +- handlers/confirmation.go | 6 +- handlers/correlations.go | 7 +- handlers/dashboard.go | 14 +- handlers/education.go | 6 +- handlers/epoch.go | 25 +-- handlers/epochs.go | 7 +- handlers/eth1Account.go | 11 +- handlers/eth1Block.go | 39 +++-- handlers/eth1Blocks.go | 6 +- handlers/eth1Deposits.go | 13 +- handlers/eth1Token.go | 6 +- handlers/eth1Transactions.go | 6 +- handlers/eth1tx.go | 69 ++++---- handlers/ethClientsServices.go | 5 +- handlers/ethstore.go | 7 +- handlers/faq.go | 6 +- handlers/gasnow.go | 5 +- handlers/graffitiwall.go | 6 +- handlers/imprint.go | 7 +- handlers/index.go | 3 +- handlers/mempoolView.go | 6 +- handlers/mobilepage.go | 6 +- handlers/pageData.go | 13 +- handlers/poap.go | 6 +- handlers/pools.go | 13 +- handlers/pools_rocketpool.go | 6 +- handlers/pricing.go | 17 +- handlers/relays.go | 5 +- handlers/search.go | 6 +- handlers/slot.go | 50 +++--- handlers/slot_finder.go | 9 +- handlers/slots.go | 6 +- handlers/stakingServices.go | 6 +- handlers/unitConverter.go | 5 +- handlers/user.go | 30 ++-- handlers/validator.go | 44 +++-- handlers/validatorRewards.go | 5 +- handlers/validators.go | 6 +- handlers/validators_leaderboard.go | 6 +- handlers/validators_slashings.go | 6 +- handlers/validators_streakleaderboard.go | 6 +- handlers/vis.go | 12 +- handlers/withdrawals.go | 7 +- tables.sql | 18 +- templates/bannerPools.html | 42 ----- templates/broadcast.html | 12 +- templates/burn.html | 1 + templates/calculator.html | 4 +- templates/components/banner.html | 47 ----- templates/components/bannerGeneric.html | 42 ----- .../components/bannerStakingServices.html | 42 ----- templates/components/bannerValidator.html | 60 ------- templates/dashboard.html | 2 + templates/deposits.html | 4 +- templates/epochs.html | 4 +- templates/eth1DepositsLeaderboard.html | 4 +- templates/eth1tx.html | 33 ++-- templates/execution/block.html | 1 + templates/gasnow.html | 14 +- templates/genericchart.html | 4 +- templates/index/index.html | 2 +- templates/layout.html | 10 +- templates/layout/ad_handler.html | 84 +++++++++ templates/pools/pools.html | 1 + templates/pools_rocketpool.html | 4 +- templates/slot/deposits.html | 4 +- templates/slot/slot.html | 1 + templates/slots.html | 4 +- templates/stakingServices.html | 2 +- templates/templates.go | 14 +- templates/user/ad_configuration.html | 115 ++++++++++++ templates/user/notificationsCenter.html | 1 + templates/validator/validator.html | 2 +- templates/validators.html | 4 +- templates/validators_leaderboard.html | 4 +- templates/validators_slashings.html | 4 +- templates/validators_streakleaderboard.html | 4 +- templates/withdrawals.html | 4 +- types/templates.go | 25 ++- 89 files changed, 916 insertions(+), 622 deletions(-) create mode 100644 handlers/ad_configuration.go delete mode 100644 templates/bannerPools.html delete mode 100644 templates/components/banner.html delete mode 100644 templates/components/bannerGeneric.html delete mode 100644 templates/components/bannerStakingServices.html delete mode 100644 templates/components/bannerValidator.html create mode 100644 templates/layout/ad_handler.html create mode 100644 templates/user/ad_configuration.html diff --git a/cmd/explorer/main.go b/cmd/explorer/main.go index c446bc2630..07994f2a32 100644 --- a/cmd/explorer/main.go +++ b/cmd/explorer/main.go @@ -605,6 +605,9 @@ func main() { authRouter.HandleFunc("/notifications/bundled/subscribe", handlers.MultipleUsersNotificationsSubscribeWeb).Methods("POST", "OPTIONS") authRouter.HandleFunc("/global_notification", handlers.UserGlobalNotification).Methods("GET") authRouter.HandleFunc("/global_notification", handlers.UserGlobalNotificationPost).Methods("POST") + authRouter.HandleFunc("/ad_configuration", handlers.AdConfiguration).Methods("GET") + authRouter.HandleFunc("/ad_configuration", handlers.AdConfigurationPost).Methods("POST") + authRouter.HandleFunc("/ad_configuration/delete", handlers.AdConfigurationDeletePost).Methods("POST") authRouter.HandleFunc("/notifications-center", handlers.UserNotificationsCenter).Methods("GET") authRouter.HandleFunc("/notifications-center/removeall", handlers.RemoveAllValidatorsAndUnsubscribe).Methods("POST") diff --git a/db/db.go b/db/db.go index db895b1802..1e8b9df0aa 100644 --- a/db/db.go +++ b/db/db.go @@ -2510,6 +2510,147 @@ func GetMostRecentWithdrawalValidator() (uint64, error) { return validatorindex, nil } +// get all ad configurations +func GetAdConfigurations() ([]*types.AdConfig, error) { + var adConfigs []*types.AdConfig + + err := ReaderDb.Select(&adConfigs, ` + SELECT + id, + template_id, + jquery_selector, + insert_mode, + refresh_interval, + enabled, + for_all_users, + banner_id, + html_content + FROM + ad_configurations`) + if err != nil { + if err == sql.ErrNoRows { + return []*types.AdConfig{}, nil + } + return nil, fmt.Errorf("error getting ad configurations: %w", err) + } + + return adConfigs, nil +} + +// get the ad configuration for a specific template that are active +func GetAdConfigurationsForTemplate(ids []string, noAds bool) ([]*types.AdConfig, error) { + var adConfigs []*types.AdConfig + forAllUsers := "" + if noAds { + forAllUsers = " AND for_all_users = true" + } + err := ReaderDb.Select(&adConfigs, fmt.Sprintf(` + SELECT + id, + template_id, + jquery_selector, + insert_mode, + refresh_interval, + enabled, + for_all_users, + banner_id, + html_content + FROM + ad_configurations + WHERE + template_id = ANY($1) AND + enabled = true %v`, forAllUsers), pq.Array(ids)) + if err != nil { + if err == sql.ErrNoRows { + return []*types.AdConfig{}, nil + } + return nil, fmt.Errorf("error getting ad configurations for template: %v %s", err, ids) + } + + return adConfigs, nil +} + +// insert new ad configuration +func InsertAdConfigurations(adConfig types.AdConfig) error { + _, err := WriterDb.Exec(` + INSERT INTO ad_configurations ( + id, + template_id, + jquery_selector, + insert_mode, + refresh_interval, + enabled, + for_all_users, + banner_id, + html_content) + VALUES($1, $2, $3, $4, $5, $6, $7, $8, $9) + ON CONFLICT DO NOTHING`, + adConfig.Id, + adConfig.TemplateId, + adConfig.JQuerySelector, + adConfig.InsertMode, + adConfig.RefreshInterval, + adConfig.Enabled, + adConfig.ForAllUsers, + adConfig.BannerId, + adConfig.HtmlContent) + if err != nil { + return fmt.Errorf("error inserting ad configuration: %w", err) + } + return nil +} + +// update exisiting ad configuration +func UpdateAdConfiguration(adConfig types.AdConfig) error { + tx, err := WriterDb.Begin() + if err != nil { + return fmt.Errorf("error starting db transactions: %w", err) + } + defer tx.Rollback() + _, err = tx.Exec(` + UPDATE ad_configurations SET + template_id = $2, + jquery_selector = $3, + insert_mode = $4, + refresh_interval = $5, + enabled = $6, + for_all_users = $7, + banner_id = $8, + html_content = $9 + WHERE id = $1;`, + adConfig.Id, + adConfig.TemplateId, + adConfig.JQuerySelector, + adConfig.InsertMode, + adConfig.RefreshInterval, + adConfig.Enabled, + adConfig.ForAllUsers, + adConfig.BannerId, + adConfig.HtmlContent) + if err != nil { + return fmt.Errorf("error updating ad configuration: %w", err) + } + return tx.Commit() +} + +// delete ad configuration +func DeleteAdConfiguration(id string) error { + + tx, err := WriterDb.Beginx() + if err != nil { + return fmt.Errorf("error starting db transactions: %w", err) + } + defer tx.Rollback() + + // delete ad configuration + _, err = WriterDb.Exec(` + DELETE FROM ad_configurations + WHERE + id = $1;`, + id) + return err +} + func GetTotalBLSChanges() (uint64, error) { var count uint64 err := ReaderDb.Get(&count, ` diff --git a/handlers/404.go b/handlers/404.go index dbe61882d2..e967894d41 100644 --- a/handlers/404.go +++ b/handlers/404.go @@ -64,11 +64,12 @@ func handleHTTPError(err error, handler func(http.ResponseWriter, *http.Request) } func NotFound(w http.ResponseWriter, r *http.Request) { - notFoundTemplate := templates.GetTemplate(append(layoutTemplateFiles, "svg/relax.html", "404notfound.html")...) + templateFiles := append(layoutTemplateFiles, "svg/relax.html", "404notfound.html") + notFoundTemplate := templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") w.WriteHeader(http.StatusNotFound) - data := InitPageData(w, r, "blockchain", r.URL.Path, "Not Found") + data := InitPageData(w, r, "blockchain", r.URL.Path, "Not Found", templateFiles) err := notFoundTemplate.ExecuteTemplate(w, "layout", data) if err != nil { logger.Errorf("error executing not-found template for %v route: %v", r.URL.String(), err) diff --git a/handlers/ad_configuration.go b/handlers/ad_configuration.go new file mode 100644 index 0000000000..177098f093 --- /dev/null +++ b/handlers/ad_configuration.go @@ -0,0 +1,164 @@ +package handlers + +import ( + "eth2-exporter/db" + "eth2-exporter/templates" + "eth2-exporter/types" + "eth2-exporter/utils" + "net/http" + "strconv" + + "github.com/google/uuid" + "github.com/gorilla/csrf" +) + +// Load Ad Configuration page +func AdConfiguration(w http.ResponseWriter, r *http.Request) { + templateFiles := append(layoutTemplateFiles, "user/ad_configuration.html") + var userTemplate = templates.GetTemplate(templateFiles...) + + w.Header().Set("Content-Type", "text/html") + + if !hasPermission(w, r) { + return + } + + configs, err := db.GetAdConfigurations() + + if err != nil { + utils.LogError(err, "error loading the ad configuration", 0) + http.Error(w, "Internal server error", http.StatusInternalServerError) + return + } + + data := InitPageData(w, r, "user", "/user/ad_configuration", "Ad Configuration", templateFiles) + pageData := types.AdConfigurationPageData{} + pageData.CsrfField = csrf.TemplateField(r) + pageData.Configurations = configs + pageData.TemplateNames = templates.GetTemplateNames() + pageData.New = types.AdConfig{ + InsertMode: "replace", + TemplateId: "index/index.html", + JQuerySelector: "#r-banner", + Enabled: true, + } + data.Data = pageData + + if handleTemplateError(w, r, "ad_configuration.go", "AdConfiguration", "", userTemplate.ExecuteTemplate(w, "layout", data)) != nil { + return // an error has occurred and was processed + } +} + +// Insert / Update Ad configuration +func AdConfigurationPost(w http.ResponseWriter, r *http.Request) { + if !hasPermission(w, r) { + return + } + + err := r.ParseForm() + if err != nil { + utils.LogError(err, "error parsing form", 0) + http.Redirect(w, r, "/user/ad_configuration?error=parsingForm", http.StatusSeeOther) + return + } + id := r.FormValue(`id`) + + refreshInterval, err := strconv.ParseUint(r.FormValue(`refreshInterval`), 0, 64) + if err != nil { + refreshInterval = 0 + } + + var bannerId uint64 + var htmlContent = "" + if len(r.FormValue(`useHtmlContent`)) > 0 { + htmlContent = r.FormValue(`htmlContent`) + + if len(htmlContent) == 0 { + utils.LogError(nil, "error with provided html content", 0) + http.Redirect(w, r, "/user/ad_configuration?error=noHtmlContent", http.StatusSeeOther) + return + } + } else { + bannerId, err = strconv.ParseUint(r.FormValue(`bannerId`), 0, 64) + if err != nil || bannerId == 0 { + utils.LogError(err, "error no bannerId provided", 0) + http.Redirect(w, r, "/user/ad_configuration?error=noBannerId", http.StatusSeeOther) + return + } + } + + adConfig := types.AdConfig{ + Id: id, + TemplateId: r.FormValue(`templateId`), + JQuerySelector: r.FormValue(`jQuerySelector`), + InsertMode: r.FormValue(`insertMode`), + RefreshInterval: refreshInterval, + Enabled: len(r.FormValue(`enabled`)) > 0, + ForAllUsers: len(r.FormValue(`forAllUsers`)) > 0, + BannerId: bannerId, + HtmlContent: htmlContent, + } + + if len(adConfig.Id) == 0 { + adConfig.Id = uuid.New().String() + err = db.InsertAdConfigurations(adConfig) + if err != nil { + utils.LogError(err, "error inserting new ad config", 0) + http.Redirect(w, r, "/user/ad_configuration?error=insertingConfig", http.StatusSeeOther) + return + } + + } else { + err = db.UpdateAdConfiguration(adConfig) + if err != nil { + utils.LogError(err, "error updating ad config", 0) + http.Redirect(w, r, "/user/ad_configuration?error=updatingConfig", http.StatusSeeOther) + return + } + } + + http.Redirect(w, r, "/user/ad_configuration", http.StatusSeeOther) +} + +// Delete Ad configuration +func AdConfigurationDeletePost(w http.ResponseWriter, r *http.Request) { + if !hasPermission(w, r) { + return + } + err := r.ParseForm() + if err != nil { + utils.LogError(err, "error parsing form", 0) + http.Redirect(w, r, "/user/ad_configuration?error=parsingForm", http.StatusSeeOther) + return + } + id := r.FormValue(`id`) + if len(id) == 0 { + utils.LogError(err, "error no id provided", 0) + http.Redirect(w, r, "/user/ad_configuration?error=noTemplateId", http.StatusSeeOther) + return + } + + err = db.DeleteAdConfiguration(id) + if err != nil { + utils.LogError(err, "error deleting ad config", 0) + http.Redirect(w, r, "/user/ad_configuration?error=notDeleted", http.StatusSeeOther) + return + } + + http.Redirect(w, r, "/user/ad_configuration", http.StatusSeeOther) +} + +func hasPermission(w http.ResponseWriter, r *http.Request) bool { + user, _, err := getUserSession(r) + if err != nil { + utils.LogError(err, "error retrieving session", 0) + http.Error(w, "Internal server error", http.StatusInternalServerError) + return false + } + + if user.UserGroup != "ADMIN" { + http.Error(w, "Insufficient privileges", http.StatusUnauthorized) + return false + } + return true +} diff --git a/handlers/advertisewithus.go b/handlers/advertisewithus.go index aa088015dd..400402b297 100644 --- a/handlers/advertisewithus.go +++ b/handlers/advertisewithus.go @@ -11,13 +11,14 @@ import ( ) func AdvertiseWithUs(w http.ResponseWriter, r *http.Request) { - var advertisewithusTemplate = templates.GetTemplate(append(layoutTemplateFiles, "advertisewithus.html")...) + templateFiles := append(layoutTemplateFiles, "advertisewithus.html") + var advertisewithusTemplate = templates.GetTemplate(templateFiles...) var err error w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "advertisewithus", "/advertisewithus", "Adverstise With Us") + data := InitPageData(w, r, "advertisewithus", "/advertisewithus", "Adverstise With Us", templateFiles) pageData := &types.AdvertiseWithUsPageData{} pageData.RecaptchaKey = utils.Config.Frontend.RecaptchaSiteKey diff --git a/handlers/auth.go b/handlers/auth.go index 8bba9fd42a..fdf08bccb9 100644 --- a/handlers/auth.go +++ b/handlers/auth.go @@ -27,11 +27,12 @@ var authInternalServerErrorFlashMsg = "Error: Something went wrong :( Please ret // Register handler renders a template that allows for the creation of a new user. func Register(w http.ResponseWriter, r *http.Request) { - var registerTemplate = templates.GetTemplate(append(layoutTemplateFiles, "register.html")...) + templateFiles := append(layoutTemplateFiles, "register.html") + var registerTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "register", "/register", "Register new account") + data := InitPageData(w, r, "register", "/register", "Register new account", templateFiles) data.Data = types.AuthData{Flashes: utils.GetFlashes(w, r, authSessionName), CsrfField: csrf.TemplateField(r)} data.Meta.NoTrack = true @@ -150,12 +151,12 @@ func RegisterPost(w http.ResponseWriter, r *http.Request) { // Login handler renders a template that allows a user to login. func Login(w http.ResponseWriter, r *http.Request) { - - var loginTemplate = templates.GetTemplate(append(layoutTemplateFiles, "login.html")...) + templateFiles := append(layoutTemplateFiles, "login.html") + var loginTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "login", "/login", "Login") + data := InitPageData(w, r, "login", "/login", "Login", templateFiles) data.Data = types.AuthData{ Flashes: utils.GetFlashes(w, r, authSessionName), CsrfField: csrf.TemplateField(r), @@ -346,8 +347,8 @@ func Logout(w http.ResponseWriter, r *http.Request) { // This only works if the hash in the url is correct. This will also confirm // the email of the user if it has not been confirmed yet. func ResetPassword(w http.ResponseWriter, r *http.Request) { - - var resetPasswordTemplate = templates.GetTemplate(append(layoutTemplateFiles, "resetPassword.html")...) + templateFiles := append(layoutTemplateFiles, "resetPassword.html") + var resetPasswordTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") @@ -418,7 +419,7 @@ func ResetPassword(w http.ResponseWriter, r *http.Request) { session.SetValue("subscription", user.Subscription) session.Save(r, w) - data := InitPageData(w, r, "requestReset", "/requestReset", "Reset Password") + data := InitPageData(w, r, "requestReset", "/requestReset", "Reset Password", templateFiles) data.Data = types.AuthData{Flashes: utils.GetFlashes(w, r, authSessionName), Email: dbUser.Email, CsrfField: csrf.TemplateField(r)} data.Meta.NoTrack = true @@ -504,11 +505,11 @@ func ResetPasswordPost(w http.ResponseWriter, r *http.Request) { // RequestResetPassword renders a template that lets the user enter his email and request a reset link. func RequestResetPassword(w http.ResponseWriter, r *http.Request) { - - var requestResetPaswordTemplate = templates.GetTemplate(append(layoutTemplateFiles, "requestResetPassword.html")...) + templateFiles := append(layoutTemplateFiles, "requestResetPassword.html") + var requestResetPaswordTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "register", "/register", "Reset Password") + data := InitPageData(w, r, "register", "/register", "Reset Password", templateFiles) data.Data = types.AuthData{Flashes: utils.GetFlashes(w, r, authSessionName), CsrfField: csrf.TemplateField(r)} data.Meta.NoTrack = true @@ -569,12 +570,12 @@ func RequestResetPasswordPost(w http.ResponseWriter, r *http.Request) { // ResendConfirmation handler sends a template for the user to request another confirmation link via email. func ResendConfirmation(w http.ResponseWriter, r *http.Request) { - - var resendConfirmationTemplate = templates.GetTemplate(append(layoutTemplateFiles, "resendConfirmation.html")...) + templateFiles := append(layoutTemplateFiles, "resendConfirmation.html") + var resendConfirmationTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "resendConfirmation", "/resendConfirmation", "Resend Password Reset") + data := InitPageData(w, r, "resendConfirmation", "/resendConfirmation", "Resend Password Reset", templateFiles) data.Data = types.AuthData{Flashes: utils.GetFlashes(w, r, authSessionName), CsrfField: csrf.TemplateField(r)} if handleTemplateError(w, r, "auth.go", "ResendConfirmation", "", resendConfirmationTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/broadcast.go b/handlers/broadcast.go index da7038667f..3d8689e43b 100644 --- a/handlers/broadcast.go +++ b/handlers/broadcast.go @@ -13,10 +13,11 @@ import ( ) func Broadcast(w http.ResponseWriter, r *http.Request) { - var tpl = templates.GetTemplate(append(layoutTemplateFiles, "components/bannerGeneric.html", "broadcast.html", "validator/withdrawalOverviewRow.html")...) + templateFiles := append(layoutTemplateFiles, "broadcast.html", "validator/withdrawalOverviewRow.html") + var tpl = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "tools", "/tools/broadcast", "Broadcast") + data := InitPageData(w, r, "tools", "/tools/broadcast", "Broadcast", templateFiles) pageData := &types.BroadcastPageData{} pageData.Stats = services.GetLatestStats() pageData.RecaptchaKey = utils.Config.Frontend.RecaptchaSiteKey @@ -76,10 +77,11 @@ func BroadcastPost(w http.ResponseWriter, r *http.Request) { } func BroadcastStatus(w http.ResponseWriter, r *http.Request) { - var tpl = templates.GetTemplate(append(layoutTemplateFiles, "components/bannerGeneric.html", "broadcaststatus.html")...) + templateFiles := append(layoutTemplateFiles, "broadcaststatus.html") + var tpl = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "tools", "/tools/broadcast/status", "Broadcast Status") + data := InitPageData(w, r, "tools", "/tools/broadcast/status", "Broadcast Status", templateFiles) vars := mux.Vars(r) diff --git a/handlers/burn.go b/handlers/burn.go index 270b311f1c..9ec0ee541d 100644 --- a/handlers/burn.go +++ b/handlers/burn.go @@ -10,9 +10,10 @@ import ( func Burn(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "burn", "/burn", "Eth Burned") + templateFiles := append(layoutTemplateFiles, "burn.html") + data := InitPageData(w, r, "burn", "/burn", "Eth Burned", templateFiles) - var burnTemplate = templates.GetTemplate(append(layoutTemplateFiles, "burn.html")...) + var burnTemplate = templates.GetTemplate(templateFiles...) // data.Meta.Tdata1 = utils.FormatAmount((data.Data.(*types.BurnPageData).TotalBurned / 1e18) * data.Data.(*types.BurnPageData).Price) // data.Meta.Tdata2 = utils.FormatAmount(data.Data.(*types.BurnPageData).BurnRate24h/1e18) + " ETH/min" diff --git a/handlers/calculator.go b/handlers/calculator.go index ed0690d1aa..6e73b7c077 100644 --- a/handlers/calculator.go +++ b/handlers/calculator.go @@ -9,8 +9,8 @@ import ( // StakingCalculator renders stakingCalculatorTemplate func StakingCalculator(w http.ResponseWriter, r *http.Request) { - - var stakingCalculatorTemplate = templates.GetTemplate(append(layoutTemplateFiles, "calculator.html")...) + templateFiles := append(layoutTemplateFiles, "calculator.html") + var stakingCalculatorTemplate = templates.GetTemplate(templateFiles...) calculatorPageData := types.StakingCalculatorPageData{} @@ -25,7 +25,7 @@ func StakingCalculator(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "stats", "/calculator", "Staking calculator") + data := InitPageData(w, r, "stats", "/calculator", "Staking calculator", templateFiles) data.Data = calculatorPageData if handleTemplateError(w, r, "calculator.go", "StakingCalculator", "", stakingCalculatorTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/charts.go b/handlers/charts.go index 25eccc7b92..217984c34d 100644 --- a/handlers/charts.go +++ b/handlers/charts.go @@ -16,13 +16,13 @@ const CHART_PREVIEW_POINTS = 100 // Charts uses a go template for presenting the page to show charts func Charts(w http.ResponseWriter, r *http.Request) { - - var chartsTemplate = templates.GetTemplate(append(layoutTemplateFiles, "charts.html")...) + templateFiles := append(layoutTemplateFiles, "charts.html") + var chartsTemplate = templates.GetTemplate(templateFiles...) var chartsUnavailableTemplate = templates.GetTemplate(append(layoutTemplateFiles, "chartsunavailable.html")...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "stats", "/charts", "Charts") + data := InitPageData(w, r, "stats", "/charts", "Charts", templateFiles) chartsPageData := services.LatestChartsPageData() @@ -65,15 +65,15 @@ func Chart(w http.ResponseWriter, r *http.Request) { // GenericChart uses a go template for presenting the page of a generic chart func GenericChart(w http.ResponseWriter, r *http.Request) { - - var genericChartTemplate = templates.GetTemplate(append(layoutTemplateFiles, "genericchart.html")...) + templateFiles := append(layoutTemplateFiles, "genericchart.html") + var genericChartTemplate = templates.GetTemplate(templateFiles...) var chartsUnavailableTemplate = templates.GetTemplate(append(layoutTemplateFiles, "chartsunavailable.html")...) vars := mux.Vars(r) chartVar := vars["chart"] w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "stats", "/charts", "Chart") + data := InitPageData(w, r, "stats", "/charts", "Chart", templateFiles) chartsPageData := services.LatestChartsPageData() if chartsPageData == nil { @@ -136,10 +136,11 @@ func GenericChartData(w http.ResponseWriter, r *http.Request) { // SlotViz renders a single page with a d3 slot (block) visualisation func SlotViz(w http.ResponseWriter, r *http.Request) { - var slotVizTemplate = templates.GetTemplate(append(layoutTemplateFiles, "slotViz.html", "slotVizPage.html")...) + templateFiles := append(layoutTemplateFiles, "slotViz.html", "slotVizPage.html") + var slotVizTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "stats", "/charts", "Charts") + data := InitPageData(w, r, "stats", "/charts", "Charts", templateFiles) slotVizData := types.SlotVizPageData{ Selector: "checklist", diff --git a/handlers/confirmation.go b/handlers/confirmation.go index 6b2608a225..a6deb3a011 100644 --- a/handlers/confirmation.go +++ b/handlers/confirmation.go @@ -8,8 +8,8 @@ import ( // Will return the confirmation page func Confirmation(w http.ResponseWriter, r *http.Request) { - - var confirmationTemplate = templates.GetTemplate(append(layoutTemplateFiles, "confirmation.html")...) + templateFiles := append(layoutTemplateFiles, "confirmation.html") + var confirmationTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") @@ -35,7 +35,7 @@ func Confirmation(w http.ResponseWriter, r *http.Request) { return } - data := InitPageData(w, r, "confirmation", "/blocks", "Blocks") + data := InitPageData(w, r, "confirmation", "/blocks", "Blocks", templateFiles) data.Data = pageData data.Meta.NoTrack = true diff --git a/handlers/correlations.go b/handlers/correlations.go index 3e08f31186..70d5c388e9 100644 --- a/handlers/correlations.go +++ b/handlers/correlations.go @@ -13,8 +13,8 @@ import ( // Blocks will return information about blocks using a go template func Correlations(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") - - data := InitPageData(w, r, "correlations", "/correlations", "Correlations") + templateFiles := append(layoutTemplateFiles, "correlations.html") + data := InitPageData(w, r, "correlations", "/correlations", "Correlations", templateFiles) var indicators []string err := db.ReaderDb.Select(&indicators, "SELECT DISTINCT(indicator) AS indicator FROM chart_series WHERE time > NOW() - INTERVAL '1 week' ORDER BY indicator;") @@ -27,10 +27,9 @@ func Correlations(w http.ResponseWriter, r *http.Request) { data.Data = indicators - var correlationsTemplate = templates.GetTemplate(append(layoutTemplateFiles, "correlations.html")...) + var correlationsTemplate = templates.GetTemplate(templateFiles...) // data := &types.PageData{ - // HeaderAd: true, // Meta: &types.Meta{ // Image: "https://etherchain.org/img/ballon-512x512.png", // Title: fmt.Sprintf("%v - Correlations - etherchain.org - %v", utils.Config.Frontend.SiteName, time.Now().Year()), diff --git a/handlers/dashboard.go b/handlers/dashboard.go index ec0cc7e570..86205c598c 100644 --- a/handlers/dashboard.go +++ b/handlers/dashboard.go @@ -58,8 +58,8 @@ func parseValidatorsFromQueryString(str string, validatorLimit int) ([]uint64, e } func Heatmap(w http.ResponseWriter, r *http.Request) { - - var heatmapTemplate = templates.GetTemplate(append(layoutTemplateFiles, "heatmap.html")...) + templateFiles := append(layoutTemplateFiles, "heatmap.html") + var heatmapTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") validatorLimit := getUserPremium(r).MaxValidators @@ -137,8 +137,7 @@ func Heatmap(w http.ResponseWriter, r *http.Request) { logger.Infof("retrieved income history of %v validators in %v", len(incomeData), time.Since(start)) - data := InitPageData(w, r, "dashboard", "/heatmap", "Validator Heatmap") - data.HeaderAd = true + data := InitPageData(w, r, "dashboard", "/heatmap", "Validator Heatmap", templateFiles) data.Data = heatmapData if handleTemplateError(w, r, "dashboard.go", "Heatmap", "", heatmapTemplate.ExecuteTemplate(w, "layout", data)) != nil { @@ -147,8 +146,8 @@ func Heatmap(w http.ResponseWriter, r *http.Request) { } func Dashboard(w http.ResponseWriter, r *http.Request) { - - var dashboardTemplate = templates.GetTemplate(append(layoutTemplateFiles, "dashboard.html", "dashboard/tables.html")...) + templateFiles := append(layoutTemplateFiles, "dashboard.html", "dashboard/tables.html") + var dashboardTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") validatorLimit := getUserPremium(r).MaxValidators @@ -159,8 +158,7 @@ func Dashboard(w http.ResponseWriter, r *http.Request) { epoch := services.LatestEpoch() dashboardData.CappellaHasHappened = epoch >= (utils.Config.Chain.Config.CappellaForkEpoch) - data := InitPageData(w, r, "dashboard", "/dashboard", "Dashboard") - data.HeaderAd = true + data := InitPageData(w, r, "dashboard", "/dashboard", "Dashboard", templateFiles) data.Data = dashboardData if handleTemplateError(w, r, "dashboard.go", "Dashboard", "", dashboardTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/education.go b/handlers/education.go index f29f931756..5eb28d5147 100644 --- a/handlers/education.go +++ b/handlers/education.go @@ -6,12 +6,12 @@ import ( ) func EducationServices(w http.ResponseWriter, r *http.Request) { - - var educationServicesTemplate = templates.GetTemplate(append(layoutTemplateFiles, "educationServices.html")...) + templateFiles := append(layoutTemplateFiles, "educationServices.html") + var educationServicesTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "services", "/educationServices", "Ethereum Education Services Overview") + data := InitPageData(w, r, "services", "/educationServices", "Ethereum Education Services Overview", templateFiles) if handleTemplateError(w, r, "education.go", "EducationServices", "", educationServicesTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/epoch.go b/handlers/epoch.go index 0acd3c66f1..79769f4127 100644 --- a/handlers/epoch.go +++ b/handlers/epoch.go @@ -17,25 +17,25 @@ import ( // Epoch will show the epoch using a go template func Epoch(w http.ResponseWriter, r *http.Request) { - - var epochTemplate = templates.GetTemplate(append(layoutTemplateFiles, "epoch.html")...) - var epochFutureTemplate = templates.GetTemplate(append(layoutTemplateFiles, "epochFuture.html")...) - var epochNotFoundTemplate = templates.GetTemplate(append(layoutTemplateFiles, "epochnotfound.html")...) + epochTemplateFiles := append(layoutTemplateFiles, "epoch.html") + epochFutureTemplateFiles := append(layoutTemplateFiles, "epochFuture.html") + epochNotFoundTemplateFiles := append(layoutTemplateFiles, "epochnotfound.html") + var epochTemplate = templates.GetTemplate(epochTemplateFiles...) + var epochFutureTemplate = templates.GetTemplate(epochFutureTemplateFiles...) + var epochNotFoundTemplate = templates.GetTemplate(epochNotFoundTemplateFiles...) const MaxEpochValue = 4294967296 // we only render a page for epochs up to this value w.Header().Set("Content-Type", "text/html") vars := mux.Vars(r) epochString := strings.Replace(vars["epoch"], "0x", "", -1) - - data := InitPageData(w, r, "blockchain", "/epochs", "Epoch") - data.HeaderAd = true + epochTitle := fmt.Sprintf("Epoch %v", epochString) epoch, err := strconv.ParseUint(epochString, 10, 64) + metaPath := fmt.Sprintf("/epoch/%v", epoch) if err != nil { - SetPageDataTitle(data, fmt.Sprintf("Epoch %v", epochString)) - data.Meta.Path = "/epoch/" + epochString + data := InitPageData(w, r, "blockchain", metaPath, epochTitle, append(layoutTemplateFiles, epochNotFoundTemplateFiles...)) if handleTemplateError(w, r, "epoch.go", "Epoch", "parse epochString", epochNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed @@ -43,9 +43,6 @@ func Epoch(w http.ResponseWriter, r *http.Request) { return } - SetPageDataTitle(data, fmt.Sprintf("Epoch %v", epochString)) - data.Meta.Path = fmt.Sprintf("/epoch/%v", epoch) - epochPageData := types.EpochPageData{} err = db.ReaderDb.Get(&epochPageData, ` @@ -68,6 +65,7 @@ func Epoch(w http.ResponseWriter, r *http.Request) { if err != nil { //Epoch not in database -> Show future epoch if epoch > MaxEpochValue { + data := InitPageData(w, r, "blockchain", metaPath, epochTitle, append(layoutTemplateFiles, epochNotFoundTemplateFiles...)) if handleTemplateError(w, r, "epoch.go", "Epoch", ">MaxEpochValue", epochNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed } @@ -96,6 +94,7 @@ func Epoch(w http.ResponseWriter, r *http.Request) { } //Render template + data := InitPageData(w, r, "blockchain", metaPath, epochTitle, append(layoutTemplateFiles, epochFutureTemplateFiles...)) data.Data = epochPageData if handleTemplateError(w, r, "epoch.go", "Epoch", "Done (not in Database)", epochFutureTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed @@ -125,6 +124,7 @@ func Epoch(w http.ResponseWriter, r *http.Request) { ORDER BY blocks.slot DESC`, epoch) if err != nil { logger.Errorf("error epoch blocks data: %v", err) + data := InitPageData(w, r, "blockchain", metaPath, epochTitle, append(layoutTemplateFiles, epochNotFoundTemplateFiles...)) if handleTemplateError(w, r, "epoch.go", "Epoch", "read Blocks from db", epochNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed @@ -181,6 +181,7 @@ func Epoch(w http.ResponseWriter, r *http.Request) { } } + data := InitPageData(w, r, "blockchain", metaPath, epochTitle, append(layoutTemplateFiles, epochTemplateFiles...)) data.Data = epochPageData if utils.IsApiRequest(r) { diff --git a/handlers/epochs.go b/handlers/epochs.go index 2d2ec23e72..c073866682 100644 --- a/handlers/epochs.go +++ b/handlers/epochs.go @@ -14,15 +14,14 @@ import ( // Epochs will return the epochs using a go template func Epochs(w http.ResponseWriter, r *http.Request) { - - var epochsTemplate = templates.GetTemplate(append(layoutTemplateFiles, "epochs.html")...) + templateFiles := append(layoutTemplateFiles, "epochs.html") + var epochsTemplate = templates.GetTemplate(templateFiles...) currency := GetCurrency(r) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "blockchain", "/epochs", "Epochs") - data.HeaderAd = true + data := InitPageData(w, r, "blockchain", "/epochs", "Epochs", templateFiles) var epochs []*types.EpochsPageData diff --git a/handlers/eth1Account.go b/handlers/eth1Account.go index 25663fa127..e4666a3de2 100644 --- a/handlers/eth1Account.go +++ b/handlers/eth1Account.go @@ -22,17 +22,18 @@ import ( ) func Eth1Address(w http.ResponseWriter, r *http.Request) { - - var eth1AddressTemplate = templates.GetTemplate(append(layoutTemplateFiles, "sprites.html", "execution/address.html")...) + templateFiles := append(layoutTemplateFiles, "sprites.html", "execution/address.html") + var eth1AddressTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") vars := mux.Vars(r) address := template.HTMLEscapeString(vars["address"]) isValid := utils.IsEth1Address(address) if !isValid { - data := InitPageData(w, r, "blockchain", "/address", "not found") + templateFiles = append(layoutTemplateFiles, "sprites.html", "execution/addressNotFound.html") + data := InitPageData(w, r, "blockchain", "/address", "not found", templateFiles) - if handleTemplateError(w, r, "eth1Account.go", "Eth1Address", "not valid", templates.GetTemplate(append(layoutTemplateFiles, "sprites.html", "execution/addressNotFound.html")...).ExecuteTemplate(w, "layout", data)) != nil { + if handleTemplateError(w, r, "eth1Account.go", "Eth1Address", "not valid", templates.GetTemplate(templateFiles...).ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed } return @@ -46,7 +47,7 @@ func Eth1Address(w http.ResponseWriter, r *http.Request) { symbol := GetCurrencySymbol(r) addressBytes := common.FromHex(address) - data := InitPageData(w, r, "blockchain", "/address", fmt.Sprintf("Address 0x%x", addressBytes)) + data := InitPageData(w, r, "blockchain", "/address", fmt.Sprintf("Address 0x%x", addressBytes), templateFiles) metadata, err := db.BigtableClient.GetMetadataForAddress(addressBytes) if err != nil { diff --git a/handlers/eth1Block.go b/handlers/eth1Block.go index 13a479167b..d3bdc59d0c 100644 --- a/handlers/eth1Block.go +++ b/handlers/eth1Block.go @@ -18,21 +18,25 @@ import ( func Eth1Block(w http.ResponseWriter, r *http.Request) { + blockTemplateFiles := append(layoutTemplateFiles, + "slot/slot.html", + "slot/transactions.html", + "slot/attestations.html", + "slot/deposits.html", + "slot/votes.html", + "slot/attesterSlashing.html", + "slot/proposerSlashing.html", + "slot/exits.html", + "slot/overview.html", + "slot/execTransactions.html", + "slot/withdrawals.html") var blockTemplate = templates.GetTemplate( - append(layoutTemplateFiles, "slot/slot.html", - "slot/transactions.html", - "slot/attestations.html", - "slot/deposits.html", - "slot/votes.html", - "slot/attesterSlashing.html", - "slot/proposerSlashing.html", - "slot/exits.html", - "slot/overview.html", - "slot/execTransactions.html", - "slot/withdrawals.html")..., + blockTemplateFiles..., ) - var blockNotFoundTemplate = templates.GetTemplate(append(layoutTemplateFiles, "slotnotfound.html")...) - var preMergeBlockTemplate = templates.GetTemplate(append(layoutTemplateFiles, "execution/block.html", "slot/execTransactions.html")...) + preMergeTemplateFiles := append(layoutTemplateFiles, "execution/block.html", "slot/execTransactions.html") + notFountTemplateFiles := append(layoutTemplateFiles, "slotnotfound.html") + var blockNotFoundTemplate = templates.GetTemplate(notFountTemplateFiles...) + var preMergeBlockTemplate = templates.GetTemplate(preMergeTemplateFiles...) w.Header().Set("Content-Type", "text/html") vars := mux.Vars(r) @@ -48,7 +52,7 @@ func Eth1Block(w http.ResponseWriter, r *http.Request) { } if err != nil { - data := InitPageData(w, r, "blockchain", "/block", fmt.Sprintf("Block %d", 0)) + data := InitPageData(w, r, "blockchain", "/block", fmt.Sprintf("Block %d", 0), notFountTemplateFiles) data.Data = "block" if handleTemplateError(w, r, "eth1Block.go", "Eth1Block", "number", blockNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { @@ -57,9 +61,9 @@ func Eth1Block(w http.ResponseWriter, r *http.Request) { return } - data := InitPageData(w, r, "blockchain", "/block", fmt.Sprintf("Block %d", number)) eth1BlockPageData, err := GetExecutionBlockPageData(number, 10) if err != nil { + data := InitPageData(w, r, "blockchain", "/block", fmt.Sprintf("Block %d", 0), notFountTemplateFiles) data.Data = "block" if handleTemplateError(w, r, "eth1Block.go", "Eth1Block", "GetExecutionBlockPageData", blockNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed @@ -69,6 +73,7 @@ func Eth1Block(w http.ResponseWriter, r *http.Request) { // execute template based on whether block is pre or post merge if eth1BlockPageData.Difficulty.Cmp(big.NewInt(0)) == 0 { + data := InitPageData(w, r, "blockchain", "/block", fmt.Sprintf("Block %d", number), blockTemplateFiles) // Post Merge PoS Block // calculate PoS slot number based on block timestamp @@ -88,7 +93,6 @@ func Eth1Block(w http.ResponseWriter, r *http.Request) { blockPageData.ExecutionData = eth1BlockPageData blockPageData.ExecutionData.IsValidMev = blockPageData.IsValidMev - data.HeaderAd = true data.Data = blockPageData if handleTemplateError(w, r, "eth1Block.go", "Eth1Block", "Done (Post Merge)", blockTemplate.ExecuteTemplate(w, "layout", data)) != nil { @@ -96,8 +100,7 @@ func Eth1Block(w http.ResponseWriter, r *http.Request) { } } else { // Pre Merge PoW Block - data := InitPageData(w, r, "block", "/block", fmt.Sprintf("Block %d", eth1BlockPageData.Number)) - data.HeaderAd = true + data := InitPageData(w, r, "block", "/block", fmt.Sprintf("Block %d", eth1BlockPageData.Number), preMergeTemplateFiles) data.Data = eth1BlockPageData if handleTemplateError(w, r, "eth1Block.go", "Eth1Block", "Done (Pre Merge)", preMergeBlockTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/eth1Blocks.go b/handlers/eth1Blocks.go index a66e3bdbd4..1180a1ec03 100644 --- a/handlers/eth1Blocks.go +++ b/handlers/eth1Blocks.go @@ -18,12 +18,12 @@ import ( ) func Eth1Blocks(w http.ResponseWriter, r *http.Request) { - - var eth1BlocksTemplate = templates.GetTemplate(append(layoutTemplateFiles, "execution/blocks.html")...) + templateFiles := append(layoutTemplateFiles, "execution/blocks.html") + var eth1BlocksTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "blockchain", "/eth1blocks", "Ethereum Blocks") + data := InitPageData(w, r, "blockchain", "/eth1blocks", "Ethereum Blocks", templateFiles) if handleTemplateError(w, r, "eth1Blocks.go", "Eth1Blocks", "", eth1BlocksTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed } diff --git a/handlers/eth1Deposits.go b/handlers/eth1Deposits.go index 856932ceb6..d5f1f88ce8 100644 --- a/handlers/eth1Deposits.go +++ b/handlers/eth1Deposits.go @@ -14,8 +14,8 @@ import ( // Deposits will return information about deposits using a go template func Deposits(w http.ResponseWriter, r *http.Request) { - - var DepositsTemplate = templates.GetTemplate(append(layoutTemplateFiles, "deposits.html", "index/depositChart.html")...) + templateFiles := append(layoutTemplateFiles, "deposits.html", "index/depositChart.html") + var DepositsTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") @@ -34,8 +34,7 @@ func Deposits(w http.ResponseWriter, r *http.Request) { pageData.Stats = services.GetLatestStats() pageData.DepositContract = utils.Config.Chain.Config.DepositContractAddress - data := InitPageData(w, r, "blockchain", "/deposits", "Deposits") - data.HeaderAd = true + data := InitPageData(w, r, "blockchain", "/deposits", "Deposits", templateFiles) data.Data = pageData if handleTemplateError(w, r, "eth1Depostis.go", "Deposits", "", DepositsTemplate.ExecuteTemplate(w, "layout", data)) != nil { @@ -145,12 +144,12 @@ func Eth1DepositsData(w http.ResponseWriter, r *http.Request) { // Eth1Deposits will return information about deposits using a go template func Eth1DepositsLeaderboard(w http.ResponseWriter, r *http.Request) { - var eth1DepositsLeaderboardTemplate = templates.GetTemplate(append(layoutTemplateFiles, "eth1DepositsLeaderboard.html")...) + templateFiles := append(layoutTemplateFiles, "eth1DepositsLeaderboard.html") + var eth1DepositsLeaderboardTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "eth1Deposits", "/deposits/eth1", "Initiated Deposits") - data.HeaderAd = true + data := InitPageData(w, r, "eth1Deposits", "/deposits/eth1", "Initiated Deposits", templateFiles) data.Data = types.EthOneDepositLeaderBoardPageData{ DepositContract: utils.Config.Indexer.Eth1DepositContractAddress, diff --git a/handlers/eth1Token.go b/handlers/eth1Token.go index 8d3a6c5463..bed549b4d4 100644 --- a/handlers/eth1Token.go +++ b/handlers/eth1Token.go @@ -20,8 +20,8 @@ import ( ) func Eth1Token(w http.ResponseWriter, r *http.Request) { - - var eth1TokenTemplate = templates.GetTemplate(append(layoutTemplateFiles, "execution/token.html")...) + templateFiles := append(layoutTemplateFiles, "execution/token.html") + var eth1TokenTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") vars := mux.Vars(r) @@ -101,7 +101,7 @@ func Eth1Token(w http.ResponseWriter, r *http.Request) { } } - data := InitPageData(w, r, "blockchain", "/token", fmt.Sprintf("Token 0x%x", token)) + data := InitPageData(w, r, "blockchain", "/token", fmt.Sprintf("Token 0x%x", token), templateFiles) data.Data = types.Eth1TokenPageData{ Token: fmt.Sprintf("%x", token), diff --git a/handlers/eth1Transactions.go b/handlers/eth1Transactions.go index cac4cdbce8..6cf6a17d29 100644 --- a/handlers/eth1Transactions.go +++ b/handlers/eth1Transactions.go @@ -20,12 +20,12 @@ const ( ) func Eth1Transactions(w http.ResponseWriter, r *http.Request) { - - var eth1TransactionsTemplate = templates.GetTemplate(append(layoutTemplateFiles, "execution/transactions.html")...) + templateFiles := append(layoutTemplateFiles, "execution/transactions.html") + var eth1TransactionsTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "blockchain", "/eth1transactions", "Transactions") + data := InitPageData(w, r, "blockchain", "/eth1transactions", "Transactions", templateFiles) data.Data = getTransactionDataStartingWithPageToken("") if handleTemplateError(w, r, "eth1Transactions.go", "Eth1Transactions", "", eth1TransactionsTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/eth1tx.go b/handlers/eth1tx.go index d2b2756274..95f125b87a 100644 --- a/handlers/eth1tx.go +++ b/handlers/eth1tx.go @@ -18,55 +18,52 @@ import ( // Tx will show the tx using a go template func Eth1TransactionTx(w http.ResponseWriter, r *http.Request) { - - var txNotFoundTemplate = templates.GetTemplate(append(layoutTemplateFiles, "eth1txnotfound.html")...) - var txTemplate = templates.GetTemplate(append(layoutTemplateFiles, "eth1tx.html")...) - var mempoolTxTemplate = templates.GetTemplate(append(layoutTemplateFiles, "mempoolTx.html")...) + txNotFoundTemplateFiles := append(layoutTemplateFiles, "eth1txnotfound.html") + txTemplateFiles := append(layoutTemplateFiles, "eth1tx.html") + mempoolTxTemplateFiles := append(layoutTemplateFiles, "mempoolTx.html") + var txNotFoundTemplate = templates.GetTemplate(txNotFoundTemplateFiles...) + var txTemplate = templates.GetTemplate(txTemplateFiles...) + var mempoolTxTemplate = templates.GetTemplate(mempoolTxTemplateFiles...) w.Header().Set("Content-Type", "text/html") vars := mux.Vars(r) txHashString := vars["hash"] - - data := InitPageData(w, r, "blockchain", "/tx", "Transaction") - data.HeaderAd = true - - SetPageDataTitle(data, fmt.Sprintf("Transaction %v", txHashString)) - data.Meta.Path = "/tx/" + txHashString + var data *types.PageData + title := fmt.Sprintf("Transaction %v", txHashString) + path := fmt.Sprintf("/tx/%v", txHashString) txHash, err := hex.DecodeString(strings.ReplaceAll(txHashString, "0x", "")) if err != nil { logger.Errorf("error parsing tx hash %v: %v", txHashString, err) + data = InitPageData(w, r, "blockchain", path, title, txNotFoundTemplateFiles) + txTemplate = txNotFoundTemplate + } else { + txData, err := eth1data.GetEth1Transaction(common.BytesToHash(txHash)) + if err != nil { + mempool := services.LatestMempoolTransactions() + mempoolTx := mempool.FindTxByHash(txHashString) + if mempoolTx != nil { - if handleTemplateError(w, r, "eth1tx.go", "Eth1TransactionTx", "decodeString", txNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { - return // an error has occurred and was processed - } - return - } + data = InitPageData(w, r, "blockchain", path, title, mempoolTxTemplateFiles) + mempoolPageData := &types.MempoolTxPageData{RawMempoolTransaction: *mempoolTx} + txTemplate = mempoolTxTemplate + if mempoolTx.To == nil { + mempoolPageData.IsContractCreation = true + } + if mempoolTx.Input != nil { + mempoolPageData.TargetIsContract = true + } - txData, err := eth1data.GetEth1Transaction(common.BytesToHash(txHash)) - if err != nil { - mempool := services.LatestMempoolTransactions() - mempoolTx := mempool.FindTxByHash(txHashString) - if mempoolTx != nil { - mempoolPageData := &types.MempoolTxPageData{RawMempoolTransaction: *mempoolTx} - txTemplate = mempoolTxTemplate - if mempoolTx.To == nil { - mempoolPageData.IsContractCreation = true - } - if mempoolTx.Input != nil { - mempoolPageData.TargetIsContract = true + data.Data = mempoolPageData + } else { + logger.Errorf("error getting eth1 transaction data: %v", err) + data = InitPageData(w, r, "blockchain", path, title, txNotFoundTemplateFiles) + txTemplate = txNotFoundTemplate } - - data.Data = mempoolPageData } else { - logger.Errorf("error getting eth1 transaction data: %v", err) - if handleTemplateError(w, r, "eth1tx.go", "Eth1TransactionTx", "GetEth1Transaction", txNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { - return // an error has occurred and was processed - } - return + data = InitPageData(w, r, "blockchain", path, title, txTemplateFiles) + data.Data = txData } - } else { - data.Data = txData } if utils.IsApiRequest(r) { diff --git a/handlers/ethClientsServices.go b/handlers/ethClientsServices.go index 6a0e94e4c3..8410b8ae8d 100644 --- a/handlers/ethClientsServices.go +++ b/handlers/ethClientsServices.go @@ -11,13 +11,14 @@ import ( ) func EthClientsServices(w http.ResponseWriter, r *http.Request) { - var ethClientsServicesTemplate = templates.GetTemplate(append(layoutTemplateFiles, "ethClientsServices.html")...) + templateFiles := append(layoutTemplateFiles, "ethClientsServices.html") + var ethClientsServicesTemplate = templates.GetTemplate(templateFiles...) var err error w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "services", "/ethClientsServices", "Ethereum Clients Services Overview") + data := InitPageData(w, r, "services", "/ethClientsServices", "Ethereum Clients Services Overview", templateFiles) pageData := ethclients.GetEthClientData() pageData.CsrfField = csrf.TemplateField(r) diff --git a/handlers/ethstore.go b/handlers/ethstore.go index eae5f49648..7ef82be01d 100644 --- a/handlers/ethstore.go +++ b/handlers/ethstore.go @@ -7,11 +7,10 @@ import ( ) func EthStore(w http.ResponseWriter, r *http.Request) { - ethStoreTemplate := templates.GetTemplate( - append(layoutTemplateFiles, "ethstore.html", "svg/barChart.html")..., - ) + templateFiles := append(layoutTemplateFiles, "ethstore.html", "svg/barChart.html") + ethStoreTemplate := templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "services", "/ethstore", "ETH.STORE Statistics") + data := InitPageData(w, r, "services", "/ethstore", "ETH.STORE Statistics", templateFiles) data.Data = services.LatestEthStoreStatistics() if handleTemplateError(w, r, "ethstore.go", "EthStore", "", ethStoreTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/faq.go b/handlers/faq.go index a6cb26f6b4..7a92b7d5c3 100644 --- a/handlers/faq.go +++ b/handlers/faq.go @@ -7,12 +7,12 @@ import ( // Faq will return the data from the frequently asked questions (FAQ) using a go template func Faq(w http.ResponseWriter, r *http.Request) { - var faqTemplate = templates.GetTemplate(append(layoutTemplateFiles, "faq.html")...) + templateFiles := append(layoutTemplateFiles, "faq.html") + var faqTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "faq", "/faq", "FAQ") - data.HeaderAd = true + data := InitPageData(w, r, "faq", "/faq", "FAQ", templateFiles) if handleTemplateError(w, r, "faq.go", "Faq", "", faqTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/gasnow.go b/handlers/gasnow.go index cdd037dd10..4e953816c2 100644 --- a/handlers/gasnow.go +++ b/handlers/gasnow.go @@ -15,11 +15,12 @@ import ( // Will return the gas now page func GasNow(w http.ResponseWriter, r *http.Request) { - var gasNowTemplate = templates.GetTemplate(append(layoutTemplateFiles, "gasnow.html")...) + templateFiles := append(layoutTemplateFiles, "gasnow.html") + var gasNowTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "gasnow", "/gasnow", fmt.Sprintf("%v Gwei", 34)) + data := InitPageData(w, r, "gasnow", "/gasnow", fmt.Sprintf("%v Gwei", 34), templateFiles) now := time.Now().Truncate(time.Minute) lastWeek := time.Now().Truncate(time.Minute).Add(-time.Hour * 24 * 7) diff --git a/handlers/graffitiwall.go b/handlers/graffitiwall.go index 8b4f1b71bc..0ceaf5f042 100644 --- a/handlers/graffitiwall.go +++ b/handlers/graffitiwall.go @@ -8,7 +8,8 @@ import ( ) func Graffitiwall(w http.ResponseWriter, r *http.Request) { - var graffitiwallTemplate = templates.GetTemplate(append(layoutTemplateFiles, "graffitiwall.html")...) + templateFiles := append(layoutTemplateFiles, "graffitiwall.html") + var graffitiwallTemplate = templates.GetTemplate(templateFiles...) var err error @@ -24,8 +25,7 @@ func Graffitiwall(w http.ResponseWriter, r *http.Request) { return } - data := InitPageData(w, r, "more", "/graffitiwall", "Graffitiwall") - data.HeaderAd = true + data := InitPageData(w, r, "more", "/graffitiwall", "Graffitiwall", templateFiles) data.Data = graffitiwallData if handleTemplateError(w, r, "graffitiwall.go", "Graffitiwall", "", graffitiwallTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/imprint.go b/handlers/imprint.go index e4d3c6a241..63eca0caf0 100644 --- a/handlers/imprint.go +++ b/handlers/imprint.go @@ -11,10 +11,13 @@ import ( // Imprint will show the imprint data using a go template func Imprint(w http.ResponseWriter, r *http.Request) { + templateFiles := []string{getImprintPath()} + if len(templateFiles) == 0 { + templateFiles = append(layoutTemplateFiles, "imprint.example.html") + } w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "imprint", "/imprint", "Imprint") - data.HeaderAd = true + data := InitPageData(w, r, "imprint", "/imprint", "Imprint", templateFiles) if handleTemplateError(w, r, "imprint.go", "Imprint", "", getImprintTemplate(getImprintPath()).ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/index.go b/handlers/index.go index bc6da4279d..eec15b7bca 100644 --- a/handlers/index.go +++ b/handlers/index.go @@ -24,7 +24,6 @@ var indexTemplateFiles = append(layoutTemplateFiles, "index/recentEpochs.html", "index/genesisCountdown.html", "index/depositDistribution.html", - "components/banner.html", "svg/bricks.html", "svg/professor.html", "svg/timeline.html", @@ -40,7 +39,7 @@ var indexTemplate = template.Must(template.New("index").Funcs(utils.GetTemplateF func Index(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "index", "", "") + data := InitPageData(w, r, "index", "", "", indexTemplateFiles) data.Data = services.LatestIndexPageData() // data.Data.(*types.IndexPageData).ShowSyncingMessage = data.ShowSyncingMessage diff --git a/handlers/mempoolView.go b/handlers/mempoolView.go index 05d78754ae..698b24c7e6 100644 --- a/handlers/mempoolView.go +++ b/handlers/mempoolView.go @@ -14,11 +14,11 @@ import ( func MempoolView(w http.ResponseWriter, r *http.Request) { mempool := services.LatestMempoolTransactions() formatedData := formatToTable(mempool) - - var mempoolViewTemplate = templates.GetTemplate(append(layoutTemplateFiles, "mempoolview.html")...) + templateFiles := append(layoutTemplateFiles, "mempoolview.html") + var mempoolViewTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "services", "/mempool", "Pending Mempool Transactions") + data := InitPageData(w, r, "services", "/mempool", "Pending Mempool Transactions", templateFiles) data.Data = formatedData diff --git a/handlers/mobilepage.go b/handlers/mobilepage.go index 0a01ad8cf2..bb71d713fd 100644 --- a/handlers/mobilepage.go +++ b/handlers/mobilepage.go @@ -11,12 +11,13 @@ import ( ) func MobilePage(w http.ResponseWriter, r *http.Request) { - var mobileTemplate = templates.GetTemplate(append(layoutTemplateFiles, "mobilepage.html")...) + templateFiles := append(layoutTemplateFiles, "mobilepage.html") + var mobileTemplate = templates.GetTemplate(templateFiles...) var err error w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "more", "/mobile", "Beaconchain Dashboard") + data := InitPageData(w, r, "more", "/mobile", "Beaconchain Dashboard", templateFiles) pageData := &types.AdvertiseWithUsPageData{} pageData.RecaptchaKey = utils.Config.Frontend.RecaptchaSiteKey @@ -27,7 +28,6 @@ func MobilePage(w http.ResponseWriter, r *http.Request) { return } data.Data = pageData - data.HeaderAd = true if handleTemplateError(w, r, "mobilepage.go", "MobilePage", "", mobileTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/pageData.go b/handlers/pageData.go index 21103c58b9..871675e27c 100644 --- a/handlers/pageData.go +++ b/handlers/pageData.go @@ -3,6 +3,7 @@ package handlers import ( "context" "errors" + "eth2-exporter/db" ethclients "eth2-exporter/ethClients" "eth2-exporter/price" "eth2-exporter/services" @@ -18,9 +19,10 @@ import ( var layoutTemplateFiles = []string{ "layout.html", "layout/mainnavigation.html", + "layout/ad_handler.html", } -func InitPageData(w http.ResponseWriter, r *http.Request, active, path, title string) *types.PageData { +func InitPageData(w http.ResponseWriter, r *http.Request, active, path, title string, mainTemplates []string) *types.PageData { fullTitle := fmt.Sprintf("%v - %v - beaconcha.in - %v", title, utils.Config.Frontend.SiteName, time.Now().Year()) if title == "" { @@ -30,13 +32,13 @@ func InitPageData(w http.ResponseWriter, r *http.Request, active, path, title st isMainnet := utils.Config.Chain.Config.ConfigName == "mainnet" user := getUser(r) data := &types.PageData{ - HeaderAd: false, Meta: &types.Meta{ Title: fullTitle, Description: "beaconcha.in makes Ethereum accessible to non-technical end users", Path: path, GATag: utils.Config.Frontend.GATag, NoTrack: false, + Templates: strings.Join(mainTemplates, ","), }, Active: active, Data: &types.Empty{}, @@ -89,6 +91,13 @@ func InitPageData(w http.ResponseWriter, r *http.Request, active, path, title st MainMenuItems: createMenuItems(active, isMainnet), } + adConfigurations, err := db.GetAdConfigurationsForTemplate(mainTemplates, data.NoAds) + if err != nil { + utils.LogError(err, fmt.Sprintf("error loading the ad configurations for template %v", path), 0) + } else { + data.AdConfigurations = adConfigurations + } + if utils.Config.Frontend.Debug { _, session, err := getUserSession(r) if err != nil { diff --git a/handlers/poap.go b/handlers/poap.go index 84d1bc54e7..7f58d14494 100644 --- a/handlers/poap.go +++ b/handlers/poap.go @@ -24,12 +24,12 @@ var poapData atomic.Value var poapDataEpoch uint64 func Poap(w http.ResponseWriter, r *http.Request) { - var poapTemplate = templates.GetTemplate(append(layoutTemplateFiles, "poap.html")...) + templateFiles := append(layoutTemplateFiles, "poap.html") + var poapTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "more", "/poap", "POAP") - data.HeaderAd = true + data := InitPageData(w, r, "more", "/poap", "POAP", templateFiles) data.Data = struct { PoapClients []string }{ diff --git a/handlers/pools.go b/handlers/pools.go index b2d23e5c91..1602f6840b 100644 --- a/handlers/pools.go +++ b/handlers/pools.go @@ -10,16 +10,15 @@ import ( ) func Pools(w http.ResponseWriter, r *http.Request) { - var poolsServicesTemplate = templates.GetTemplate( - append(layoutTemplateFiles, "pools/pools.html", - "pools/loadingSvg.html", - "pools/charts.html", - "bannerPools.html")..., - ) + templateFiles := append(layoutTemplateFiles, + "pools/pools.html", + "pools/loadingSvg.html", + "pools/charts.html") + var poolsServicesTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "services", "/pools", "Staking Pools Services Overview") + data := InitPageData(w, r, "services", "/pools", "Staking Pools Services Overview", templateFiles) distributionData, err := services.ChartHandlers["pools_distribution"].DataFunc() if err != nil { diff --git a/handlers/pools_rocketpool.go b/handlers/pools_rocketpool.go index 1e2c222b4e..b59f4b8118 100644 --- a/handlers/pools_rocketpool.go +++ b/handlers/pools_rocketpool.go @@ -16,11 +16,11 @@ import ( // PoolsRocketpool returns the rocketpool using a go template func PoolsRocketpool(w http.ResponseWriter, r *http.Request) { - var poolsRocketpoolTemplate = templates.GetTemplate(append(layoutTemplateFiles, "pools_rocketpool.html")...) + templateFiles := append(layoutTemplateFiles, "pools_rocketpool.html") + var poolsRocketpoolTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "pools/rocketpool", "/pools/rocketpool", "Rocketpool") - data.HeaderAd = true + data := InitPageData(w, r, "pools/rocketpool", "/pools/rocketpool", "Rocketpool", templateFiles) if handleTemplateError(w, r, "pools_rocketpool.go", "PoolsRocketpool", "", poolsRocketpoolTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/pricing.go b/handlers/pricing.go index af1525df7f..cc1ee90527 100644 --- a/handlers/pricing.go +++ b/handlers/pricing.go @@ -15,15 +15,13 @@ import ( ) func Pricing(w http.ResponseWriter, r *http.Request) { - - var pricingTemplate = templates.GetTemplate( - append(layoutTemplateFiles, "payment/pricing.html", "svg/pricing.html")..., - ) + templateFiles := append(layoutTemplateFiles, "payment/pricing.html", "svg/pricing.html") + var pricingTemplate = templates.GetTemplate(templateFiles...) var err error w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "pricing", "/pricing", "API Pricing") + data := InitPageData(w, r, "pricing", "/pricing", "API Pricing", templateFiles) pageData := &types.ApiPricing{} pageData.RecaptchaKey = utils.Config.Frontend.RecaptchaSiteKey @@ -61,16 +59,13 @@ func Pricing(w http.ResponseWriter, r *http.Request) { func MobilePricing(w http.ResponseWriter, r *http.Request) { - var mobilePricingTemplate = templates.GetTemplate( - append(layoutTemplateFiles, "payment/mobilepricing.html", - "svg/mobilepricing.html")..., - ) + templateFiles := append(layoutTemplateFiles, "payment/mobilepricing.html", "svg/mobilepricing.html") + var mobilePricingTemplate = templates.GetTemplate(templateFiles...) var err error w.Header().Set("Content-Type", "text/html") - - data := InitPageData(w, r, "premium", "/premium", "Premium Pricing") + data := InitPageData(w, r, "premium", "/premium", "Premium Pricing", templateFiles) pageData := &types.MobilePricing{} pageData.RecaptchaKey = utils.Config.Frontend.RecaptchaSiteKey diff --git a/handlers/relays.go b/handlers/relays.go index fd0d289bc7..c369911143 100644 --- a/handlers/relays.go +++ b/handlers/relays.go @@ -8,9 +8,10 @@ import ( func Relays(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") - var relaysServicesTemplate = templates.GetTemplate(append(layoutTemplateFiles, "relays.html")...) + templateFiles := append(layoutTemplateFiles, "relays.html") + var relaysServicesTemplate = templates.GetTemplate(templateFiles...) - data := InitPageData(w, r, "services", "/relays", "Relay Overview") + data := InitPageData(w, r, "services", "/relays", "Relay Overview", templateFiles) relayData := services.LatestRelaysPageData() diff --git a/handlers/search.go b/handlers/search.go index 8353acba4c..75a90857fe 100644 --- a/handlers/search.go +++ b/handlers/search.go @@ -25,7 +25,6 @@ var thresholdHexLikeRE = regexp.MustCompile(`^[0-9a-fA-F]{5,96}$`) // Search handles search requests func Search(w http.ResponseWriter, r *http.Request) { - var searchNotFoundTemplate = templates.GetTemplate(append(layoutTemplateFiles, "searchnotfound.html")...) search := r.FormValue("search") @@ -45,8 +44,9 @@ func Search(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/address/"+search, http.StatusMovedPermanently) } else { w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "search", "/search", "") - data.HeaderAd = true + templateFiles := append(layoutTemplateFiles, "searchnotfound.html") + var searchNotFoundTemplate = templates.GetTemplate(templateFiles...) + data := InitPageData(w, r, "search", "/search", "", templateFiles) if handleTemplateError(w, r, "search.go", "Search", "", searchNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/slot.go b/handlers/slot.go index 5dd9d3fff1..5c2f42d88d 100644 --- a/handlers/slot.go +++ b/handlers/slot.go @@ -29,27 +29,23 @@ const MaxSlotValue = 137438953503 // we only render a page for blocks up to this // Slot will return the data for a block contained in the slot func Slot(w http.ResponseWriter, r *http.Request) { - - var slotTemplate = templates.GetTemplate( - append(layoutTemplateFiles, - "slot/slot.html", - "slot/transactions.html", - "slot/withdrawals.html", - "slot/attestations.html", - "slot/deposits.html", - "slot/votes.html", - "slot/attesterSlashing.html", - "slot/proposerSlashing.html", - "slot/exits.html", - "slot/overview.html", - "slot/execTransactions.html")..., - ) - - var slotFutureTemplate = templates.GetTemplate( - append(layoutTemplateFiles, "slot/slotFuture.html")..., - ) - - var blockNotFoundTemplate = templates.GetTemplate(append(layoutTemplateFiles, "slotnotfound.html")...) + slotTemplateFiles := append(layoutTemplateFiles, + "slot/slot.html", + "slot/transactions.html", + "slot/withdrawals.html", + "slot/attestations.html", + "slot/deposits.html", + "slot/votes.html", + "slot/attesterSlashing.html", + "slot/proposerSlashing.html", + "slot/exits.html", + "slot/overview.html", + "slot/execTransactions.html") + slotFutureTemplateFiles := append(layoutTemplateFiles, "slot/slotFuture.html") + blockNotFoundTemplateFiles := append(layoutTemplateFiles, "slotnotfound.html") + var slotTemplate = templates.GetTemplate(slotTemplateFiles...) + var slotFutureTemplate = templates.GetTemplate(slotFutureTemplateFiles...) + var blockNotFoundTemplate = templates.GetTemplate(blockNotFoundTemplateFiles...) w.Header().Set("Content-Type", "text/html") @@ -62,7 +58,7 @@ func Slot(w http.ResponseWriter, r *http.Request) { blockRootHash = []byte{} blockSlot, err = strconv.ParseInt(vars["slotOrHash"], 10, 64) if err != nil || blockSlot >= 2147483648 { // block slot must be lower then max int4 - data := InitPageData(w, r, "blockchain", "/slots", fmt.Sprintf("Slot %v", slotOrHash)) + data := InitPageData(w, r, "blockchain", "/slots", fmt.Sprintf("Slot %v", slotOrHash), blockNotFoundTemplateFiles) data.Data = "slot" if handleTemplateError(w, r, "slot.go", "Slot", "blockSlot", blockNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed @@ -71,11 +67,10 @@ func Slot(w http.ResponseWriter, r *http.Request) { } } - data := InitPageData(w, r, "blockchain", "/slots", fmt.Sprintf("Slot %v", slotOrHash)) - if blockSlot == -1 { err = db.ReaderDb.Get(&blockSlot, `SELECT slot FROM blocks WHERE blockroot = $1 OR stateroot = $1 LIMIT 1`, blockRootHash) if blockSlot == -1 { + data := InitPageData(w, r, "blockchain", "/slots", fmt.Sprintf("Slot %v", slotOrHash), blockNotFoundTemplateFiles) data.Data = "slot" if handleTemplateError(w, r, "slot.go", "Slot", "blockSlot", blockNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed @@ -93,15 +88,18 @@ func Slot(w http.ResponseWriter, r *http.Request) { if err == sql.ErrNoRows { slot := uint64(blockSlot) //Slot not in database -> Show future block - data.Meta.Path = "/slot/" + slotOrHash if slot > MaxSlotValue { logger.Errorf("error retrieving blockPageData: %v", err) + + data := InitPageData(w, r, "blockchain", "/slots", fmt.Sprintf("Slot %v", slotOrHash), blockNotFoundTemplateFiles) if handleTemplateError(w, r, "slot.go", "Slot", "MaxSlotValue", blockNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed } } + data := InitPageData(w, r, "blockchain", "/slots", fmt.Sprintf("Slot %v", slotOrHash), slotFutureTemplateFiles) + data.Meta.Path = "/slot/" + slotOrHash futurePageData := types.BlockPageData{ Slot: slot, Epoch: utils.EpochOfSlot(slot), @@ -131,7 +129,7 @@ func Slot(w http.ResponseWriter, r *http.Request) { blockPageData.ExecutionData.IsValidMev = blockPageData.IsValidMev } } - data.Meta.Path = fmt.Sprintf("/slot/%v", blockPageData.Slot) + data := InitPageData(w, r, "blockchain", fmt.Sprintf("/slot/%v", blockPageData.Slot), fmt.Sprintf("Slot %v", slotOrHash), slotTemplateFiles) data.Data = blockPageData if utils.IsApiRequest(r) { diff --git a/handlers/slot_finder.go b/handlers/slot_finder.go index aeafee293c..404b5102dc 100644 --- a/handlers/slot_finder.go +++ b/handlers/slot_finder.go @@ -7,12 +7,15 @@ import ( // Will return the slot finder page func SlotFinder(w http.ResponseWriter, r *http.Request) { - - var template = templates.GetTemplate(append(layoutTemplateFiles, "slot/slotfinder.html", "slot/components/slotfinder.html", "slot/components/upgradescheduler.html")...) + templateFiles := append(layoutTemplateFiles, + "slot/slotfinder.html", + "slot/components/slotfinder.html", + "slot/components/upgradescheduler.html") + var template = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "blockchain", "/slotFinder", "Slot Finder") + data := InitPageData(w, r, "blockchain", "/slotFinder", "Slot Finder", templateFiles) if handleTemplateError(w, r, "slot_finder.go", "Slot Finder", "", template.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/slots.go b/handlers/slots.go index 154ffa908b..97ad0d727b 100644 --- a/handlers/slots.go +++ b/handlers/slots.go @@ -17,13 +17,13 @@ import ( // Will return the slots page func Slots(w http.ResponseWriter, r *http.Request) { - - var blocksTemplate = templates.GetTemplate(append(layoutTemplateFiles, "slots.html")...) + templateFiles := append(layoutTemplateFiles, "slots.html") + var blocksTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") q := r.URL.Query() - data := InitPageData(w, r, "blockchain", "/slots", "Slots") + data := InitPageData(w, r, "blockchain", "/slots", "Slots", templateFiles) user, session, err := getUserSession(r) if err != nil { diff --git a/handlers/stakingServices.go b/handlers/stakingServices.go index 19a9773470..4e391d4dba 100644 --- a/handlers/stakingServices.go +++ b/handlers/stakingServices.go @@ -11,13 +11,14 @@ import ( ) func StakingServices(w http.ResponseWriter, r *http.Request) { - var stakingServicesTemplate = templates.GetTemplate(append(layoutTemplateFiles, "stakingServices.html", "components/bannerStakingServices.html")...) + templateFiles := append(layoutTemplateFiles, "stakingServices.html") + var stakingServicesTemplate = templates.GetTemplate(templateFiles...) var err error w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "services", "/stakingServices", "Ethereum Staking Services Overview") + data := InitPageData(w, r, "services", "/stakingServices", "Ethereum Staking Services Overview", templateFiles) pageData := &types.StakeWithUsPageData{} pageData.RecaptchaKey = utils.Config.Frontend.RecaptchaSiteKey @@ -27,7 +28,6 @@ func StakingServices(w http.ResponseWriter, r *http.Request) { http.Error(w, "Internal server error", http.StatusServiceUnavailable) return } - pageData.NoAds = data.NoAds data.Data = pageData if handleTemplateError(w, r, "stakingServices.go", "StakingServices", "", stakingServicesTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/unitConverter.go b/handlers/unitConverter.go index 6c0b24fa81..eaf37827be 100644 --- a/handlers/unitConverter.go +++ b/handlers/unitConverter.go @@ -7,11 +7,12 @@ import ( // Faq will return the data from the frequently asked questions (FAQ) using a go template func UnitConverter(w http.ResponseWriter, r *http.Request) { - var unitConverterTemplate = templates.GetTemplate(append(layoutTemplateFiles, "unitConverter.html")...) + templateFiles := append(layoutTemplateFiles, "unitConverter.html") + var unitConverterTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "unitConverter", "/unitConerter", "Unit Converter") + data := InitPageData(w, r, "unitConverter", "/unitConerter", "Unit Converter", templateFiles) if handleTemplateError(w, r, "unitConverter.go", "UnitConverter", "", unitConverterTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/user.go b/handlers/user.go index 4af23f2f13..e77591a5df 100644 --- a/handlers/user.go +++ b/handlers/user.go @@ -46,7 +46,8 @@ func UserAuthMiddleware(next http.Handler) http.Handler { // UserSettings renders the user-template func UserSettings(w http.ResponseWriter, r *http.Request) { - var userTemplate = templates.GetTemplate(append(layoutTemplateFiles, "user/settings.html")...) + templateFiles := append(layoutTemplateFiles, "user/settings.html") + var userTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") userSettingsData := &types.UserSettingsPageData{} @@ -126,8 +127,7 @@ func UserSettings(w http.ResponseWriter, r *http.Request) { userSettingsData.Flashes = utils.GetFlashes(w, r, authSessionName) userSettingsData.CsrfField = csrf.TemplateField(r) - data := InitPageData(w, r, "user", "/user", "User Settings") - data.HeaderAd = true + data := InitPageData(w, r, "user", "/user", "User Settings", templateFiles) data.Data = userSettingsData data.User = user @@ -161,7 +161,8 @@ func GenerateAPIKey(w http.ResponseWriter, r *http.Request) { // UserAuthorizeConfirm renders the user-authorize template func UserAuthorizeConfirm(w http.ResponseWriter, r *http.Request) { - var authorizeTemplate = templates.GetTemplate(append(layoutTemplateFiles, "user/authorize.html")...) + templateFiles := append(layoutTemplateFiles, "user/authorize.html") + var authorizeTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") authorizeData := &types.UserAuthorizeConfirmPageData{} @@ -203,7 +204,7 @@ func UserAuthorizeConfirm(w http.ResponseWriter, r *http.Request) { authorizeData.CsrfField = csrf.TemplateField(r) authorizeData.Flashes = utils.GetFlashes(w, r, authSessionName) - data := InitPageData(w, r, "user", "/user", "") + data := InitPageData(w, r, "user", "/user", "", templateFiles) data.Data = authorizeData data.Meta.NoTrack = true @@ -232,7 +233,8 @@ func UserAuthorizationCancel(w http.ResponseWriter, r *http.Request) { } func UserNotifications(w http.ResponseWriter, r *http.Request) { - var notificationTemplate = templates.GetTemplate(append(layoutTemplateFiles, "user/notifications.html")...) + templateFiles := append(layoutTemplateFiles, "user/notifications.html") + var notificationTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") userNotificationsData := &types.UserNotificationsPageData{} @@ -280,7 +282,7 @@ func UserNotifications(w http.ResponseWriter, r *http.Request) { link = link[:len(link)-1] userNotificationsData.DashboardLink = link - data := InitPageData(w, r, "user", "/user", "") + data := InitPageData(w, r, "user", "/user", "", templateFiles) data.Data = userNotificationsData data.User = user @@ -613,7 +615,7 @@ func UserNotificationsCenter(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html") userNotificationsCenterData := &types.UserNotificationsCenterPageData{} - data := InitPageData(w, r, "user", "/user", "") + data := InitPageData(w, r, "user", "/user", "", notificationCenterParts) user := getUser(r) @@ -2365,13 +2367,13 @@ func MobileDeviceDeletePOST(w http.ResponseWriter, r *http.Request) { // Imprint will show the imprint data using a go template func NotificationWebhookPage(w http.ResponseWriter, r *http.Request) { - - var webhookTemplate = templates.GetTemplate(append(layoutTemplateFiles, "user/webhooks.html")...) + templateFiles := append(layoutTemplateFiles, "user/webhooks.html") + var webhookTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") user := getUser(r) - data := InitPageData(w, r, "webhook", "/webhook", "Webhook configuration") + data := InitPageData(w, r, "webhook", "/webhook", "Webhook configuration", templateFiles) pageData := types.WebhookPageData{} ctx, done := ctxt.WithTimeout(ctxt.Background(), time.Second*30) @@ -2930,7 +2932,8 @@ func UsersNotificationChannels(w http.ResponseWriter, r *http.Request) { // UserSettings renders the user-template func UserGlobalNotification(w http.ResponseWriter, r *http.Request) { - var userTemplate = templates.GetTemplate(append(layoutTemplateFiles, "user/global_notification.html")...) + templateFiles := append(layoutTemplateFiles, "user/global_notification.html") + var userTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") @@ -2982,8 +2985,7 @@ func UserGlobalNotification(w http.ResponseWriter, r *http.Request) { pageData.GlobalNotificationMessages = configs pageData.CsrfField = csrf.TemplateField(r) - data := InitPageData(w, r, "user", "/user/global_notification", "Global Notification") - data.HeaderAd = true + data := InitPageData(w, r, "user", "/user/global_notification", "Global Notification", templateFiles) data.Data = pageData data.User = user diff --git a/handlers/validator.go b/handlers/validator.go index 21fa0b396f..36675e46f1 100644 --- a/handlers/validator.go +++ b/handlers/validator.go @@ -37,22 +37,20 @@ var validatorEditFlash = "edit_validator_flash" // Validator returns validator data using a go template func Validator(w http.ResponseWriter, r *http.Request) { - var validatorTemplate = templates.GetTemplate( - append(layoutTemplateFiles, - "validator/validator.html", - "validator/heading.html", - "validator/tables.html", - "validator/modals.html", - "modals.html", - "validator/overview.html", - "validator/charts.html", - "validator/countdown.html", - - "components/flashMessage.html", - "components/rocket.html", - "components/bannerValidator.html")..., - ) - var validatorNotFoundTemplate = templates.GetTemplate(append(layoutTemplateFiles, "validator/validatornotfound.html")...) + validatorTemplateFiles := append(layoutTemplateFiles, + "validator/validator.html", + "validator/heading.html", + "validator/tables.html", + "validator/modals.html", + "modals.html", + "validator/overview.html", + "validator/charts.html", + "validator/countdown.html", + "components/flashMessage.html", + "components/rocket.html") + validatorNotFoundTemplateFiles := append(layoutTemplateFiles, "validator/validatornotfound.html") + var validatorTemplate = templates.GetTemplate(validatorTemplateFiles...) + var validatorNotFoundTemplate = templates.GetTemplate(validatorNotFoundTemplateFiles...) currency := GetCurrency(r) @@ -105,11 +103,9 @@ func Validator(w http.ResponseWriter, r *http.Request) { validatorPageData.PendingCount = *pendingCount validatorPageData.InclusionDelay = int64((utils.Config.Chain.Config.Eth1FollowDistance*utils.Config.Chain.Config.SecondsPerEth1Block+utils.Config.Chain.Config.SecondsPerSlot*utils.Config.Chain.Config.SlotsPerEpoch*utils.Config.Chain.Config.EpochsPerEth1VotingPeriod)/3600) + 1 - data := InitPageData(w, r, "validators", "/validators", "") - data.HeaderAd = true + data := InitPageData(w, r, "validators", "/validators", "", validatorTemplateFiles) validatorPageData.NetworkStats = services.LatestIndexPageData() validatorPageData.User = data.User - validatorPageData.NoAds = data.NoAds validatorPageData.FlashMessage, err = utils.GetFlash(w, r, validatorEditFlash) if err != nil { @@ -162,7 +158,7 @@ func Validator(w http.ResponseWriter, r *http.Request) { validatorPageData.ShowMultipleWithdrawalCredentialsWarning = hasMultipleWithdrawalCredentials(deposits) if err != nil || len(deposits.Eth1Deposits) == 0 { SetPageDataTitle(data, fmt.Sprintf("Validator %x", pubKey)) - data.Meta.Path = fmt.Sprintf("/validator/%v", index) + data := InitPageData(w, r, "validators", fmt.Sprintf("/validator/%v", index), "", validatorNotFoundTemplateFiles) if handleTemplateError(w, r, "validator.go", "Validator", "GetValidatorDeposits", validatorNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed @@ -299,6 +295,7 @@ func Validator(w http.ResponseWriter, r *http.Request) { WHERE validators.validatorindex = $1`, index) if err == sql.ErrNoRows { + data := InitPageData(w, r, "validators", fmt.Sprintf("/validator/%v", index), "", validatorNotFoundTemplateFiles) if handleTemplateError(w, r, "validator.go", "Validator", "no rows", validatorNotFoundTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed } @@ -1680,8 +1677,8 @@ func ValidatorHistory(w http.ResponseWriter, r *http.Request) { // Validator returns validator data using a go template func ValidatorStatsTable(w http.ResponseWriter, r *http.Request) { - - var validatorStatsTableTemplate = templates.GetTemplate(append(layoutTemplateFiles, "validator_stats_table.html")...) + templateFiles := append(layoutTemplateFiles, "validator_stats_table.html") + var validatorStatsTableTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") vars := mux.Vars(r) @@ -1689,8 +1686,7 @@ func ValidatorStatsTable(w http.ResponseWriter, r *http.Request) { var index uint64 var err error - data := InitPageData(w, r, "validators", "/validators", "") - data.HeaderAd = true + data := InitPageData(w, r, "validators", "/validators", "", templateFiles) // Request came with a hash if strings.Contains(vars["index"], "0x") || len(vars["index"]) == 96 { diff --git a/handlers/validatorRewards.go b/handlers/validatorRewards.go index f416abc1ed..0b589d4a18 100644 --- a/handlers/validatorRewards.go +++ b/handlers/validatorRewards.go @@ -28,13 +28,14 @@ type rewardsResp struct { } func ValidatorRewards(w http.ResponseWriter, r *http.Request) { - var validatorRewardsServicesTemplate = templates.GetTemplate(append(layoutTemplateFiles, "validatorRewards.html")...) + templateFiles := append(layoutTemplateFiles, "validatorRewards.html") + var validatorRewardsServicesTemplate = templates.GetTemplate(templateFiles...) var err error w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "services", "/rewards", "Ethereum Validator Rewards") + data := InitPageData(w, r, "services", "/rewards", "Ethereum Validator Rewards", templateFiles) var supportedCurrencies []string err = db.ReaderDb.Select(&supportedCurrencies, diff --git a/handlers/validators.go b/handlers/validators.go index b314ff082d..5f320cba85 100644 --- a/handlers/validators.go +++ b/handlers/validators.go @@ -23,7 +23,8 @@ type states struct { // Validators returns the validators using a go template func Validators(w http.ResponseWriter, r *http.Request) { - var validatorsTemplate = templates.GetTemplate(append(layoutTemplateFiles, "validators.html")...) + templateFiles := append(layoutTemplateFiles, "validators.html") + var validatorsTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") @@ -73,8 +74,7 @@ func Validators(w http.ResponseWriter, r *http.Request) { validatorsPageData.TotalCount = validatorsPageData.ActiveCount + validatorsPageData.ExitingCount + validatorsPageData.ExitedCount + validatorsPageData.PendingCount + validatorsPageData.DepositedCount validatorsPageData.CappellaHasHappened = epoch >= (utils.Config.Chain.Config.CappellaForkEpoch) - data := InitPageData(w, r, "validators", "/validators", "Validators") - data.HeaderAd = true + data := InitPageData(w, r, "validators", "/validators", "Validators", templateFiles) data.Data = validatorsPageData if handleTemplateError(w, r, "validators.go", "Validators", "", validatorsTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/validators_leaderboard.go b/handlers/validators_leaderboard.go index 6a5079c965..a5381a828e 100644 --- a/handlers/validators_leaderboard.go +++ b/handlers/validators_leaderboard.go @@ -14,12 +14,12 @@ import ( // ValidatorsLeaderboard returns the validator-leaderboard using a go template func ValidatorsLeaderboard(w http.ResponseWriter, r *http.Request) { - var validatorsLeaderboardTemplate = templates.GetTemplate(append(layoutTemplateFiles, "validators_leaderboard.html")...) + templateFiles := append(layoutTemplateFiles, "validators_leaderboard.html") + var validatorsLeaderboardTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "validators", "/validators/leaderboard", "Validator Staking Leaderboard") - data.HeaderAd = true + data := InitPageData(w, r, "validators", "/validators/leaderboard", "Validator Staking Leaderboard", templateFiles) if handleTemplateError(w, r, "validators_leaderboard.go", "ValidatorsLeaderboard", "", validatorsLeaderboardTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/validators_slashings.go b/handlers/validators_slashings.go index eb42bcb1aa..ca152a572f 100644 --- a/handlers/validators_slashings.go +++ b/handlers/validators_slashings.go @@ -14,12 +14,12 @@ import ( // ValidatorsSlashings returns validator slashing using a go template func ValidatorsSlashings(w http.ResponseWriter, r *http.Request) { - var validatorsSlashingsTemplate = templates.GetTemplate(append(layoutTemplateFiles, "validators_slashings.html")...) + templateFiles := append(layoutTemplateFiles, "validators_slashings.html") + var validatorsSlashingsTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "validators", "/validators/slashings", "Validator Slashings") - data.HeaderAd = true + data := InitPageData(w, r, "validators", "/validators/slashings", "Validator Slashings", templateFiles) if handleTemplateError(w, r, "validators_slashings.go", "ValidatorsSlashings", "", validatorsSlashingsTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/validators_streakleaderboard.go b/handlers/validators_streakleaderboard.go index ea9a67a98e..704d6e4d68 100644 --- a/handlers/validators_streakleaderboard.go +++ b/handlers/validators_streakleaderboard.go @@ -14,12 +14,12 @@ import ( // ValidatorsStreaksLeaderboard returns the attestation-streak-leaderboard using a go template func ValidatorsStreakLeaderboard(w http.ResponseWriter, r *http.Request) { - var validatorsStreakLeaderboardTemplate = templates.GetTemplate(append(layoutTemplateFiles, "validators_streakleaderboard.html")...) + templateFiles := append(layoutTemplateFiles, "validators_streakleaderboard.html") + var validatorsStreakLeaderboardTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "validators", "/validators/streaksleaderboard", "Validator Streaks Leaderboard") - data.HeaderAd = true + data := InitPageData(w, r, "validators", "/validators/streaksleaderboard", "Validator Streaks Leaderboard", templateFiles) if handleTemplateError(w, r, "validators_streakLeaderboard.go", "ValidatorsStreakLeaderboard", "", validatorsStreakLeaderboardTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed diff --git a/handlers/vis.go b/handlers/vis.go index a3fa04b2ee..7252c193f2 100644 --- a/handlers/vis.go +++ b/handlers/vis.go @@ -14,12 +14,12 @@ import ( // Vis returns the visualizations using a go template func Vis(w http.ResponseWriter, r *http.Request) { - var visTemplate = templates.GetTemplate(append(layoutTemplateFiles, "vis.html")...) + templateFiles := append(layoutTemplateFiles, "vis.html") + var visTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") - data := InitPageData(w, r, "stats", "/viz", "Visualizations") - data.HeaderAd = true + data := InitPageData(w, r, "stats", "/viz", "Visualizations", templateFiles) if handleTemplateError(w, r, "vis.go", "Vis", "", visTemplate.ExecuteTemplate(w, "layout", data)) != nil { return // an error has occurred and was processed @@ -77,7 +77,8 @@ func VisBlocks(w http.ResponseWriter, r *http.Request) { // VisVotes shows the votes visualizations using a go template func VisVotes(w http.ResponseWriter, r *http.Request) { - var visVotesTemplate = templates.GetTemplate(append(layoutTemplateFiles, "vis_votes.html")...) + templateFiles := append(layoutTemplateFiles, "vis_votes.html") + var visVotesTemplate = templates.GetTemplate(templateFiles...) var err error @@ -119,8 +120,7 @@ func VisVotes(w http.ResponseWriter, r *http.Request) { logger.Printf("returning %v entries since %v", len(chartData), sinceSlot) - data := InitPageData(w, r, "vis", "/vis", "Votes") - data.HeaderAd = true + data := InitPageData(w, r, "vis", "/vis", "Votes", templateFiles) data.Data = &types.VisVotesPageData{ChartData: chartData} if handleTemplateError(w, r, "vis.go", "VisVotes", "", visVotesTemplate.ExecuteTemplate(w, "layout", data)) != nil { diff --git a/handlers/withdrawals.go b/handlers/withdrawals.go index a7be248bbc..552f98906c 100644 --- a/handlers/withdrawals.go +++ b/handlers/withdrawals.go @@ -18,16 +18,15 @@ import ( // Withdrawals will return information about recent withdrawals func Withdrawals(w http.ResponseWriter, r *http.Request) { currency := GetCurrency(r) - - var withdrawalsTemplate = templates.GetTemplate(append(layoutTemplateFiles, "withdrawals.html", "validator/withdrawalOverviewRow.html", "components/charts.html")...) + templateFiles := append(layoutTemplateFiles, "withdrawals.html", "validator/withdrawalOverviewRow.html", "components/charts.html") + var withdrawalsTemplate = templates.GetTemplate(templateFiles...) w.Header().Set("Content-Type", "text/html") pageData := &types.WithdrawalsPageData{} pageData.Stats = services.GetLatestStats() - data := InitPageData(w, r, "validators", "/withdrawals", "Validator Withdrawals") - data.HeaderAd = true + data := InitPageData(w, r, "validators", "/withdrawals", "Validator Withdrawals", templateFiles) latestChartsPageData := services.LatestChartsPageData() if len(latestChartsPageData) != 0 { diff --git a/tables.sql b/tables.sql index e608b2d6b4..c00c9e2891 100644 --- a/tables.sql +++ b/tables.sql @@ -1041,4 +1041,20 @@ create table node_jobs completed_time timestamp without time zone, data jsonb not null, primary key (id) -); \ No newline at end of file +); + +drop table if exists ad_configurations; +create table ad_configurations +( + id varchar(40), --uuid + template_id varchar(100) not null, --relative path to the main html file of the page + jquery_selector varchar(40) not null, --selector with the html + insert_mode varchar(10) not null, -- can be before, after, replace or insert + refresh_interval int not null, -- defines how often the ad is refreshed in seconds, 0 = don't refresh + enabled bool not null, -- defines if the ad is active + for_all_users bool not null, -- if set the ad will be shown to all users even if they have NoAds + banner_id int, -- an ad must either have a banner_id OR an html_content + html_content text, + primary key (id) +); +create index idx_ad_configuration_for_template on ad_configurations (template_id, enabled); \ No newline at end of file diff --git a/templates/bannerPools.html b/templates/bannerPools.html deleted file mode 100644 index 8829c0860f..0000000000 --- a/templates/bannerPools.html +++ /dev/null @@ -1,42 +0,0 @@ -{{ define "bannerPoolsServices" }} -
-
-
-
- - -
-{{ end }} diff --git a/templates/broadcast.html b/templates/broadcast.html index 02df182cef..6f58887c6f 100644 --- a/templates/broadcast.html +++ b/templates/broadcast.html @@ -165,8 +165,11 @@ {{ end }} {{ define "content" }} - {{ with .Data }} -
+
+
+
+
+ {{ with .Data }}
{{ if ne .FlashMessage "" }} @@ -177,7 +180,6 @@
{{ end }} - {{ if not $.NoAds }}{{ template "bannerGeneric" dict "desktop" "52" "mobile" "52" }}{{ end }} {{ template "withdrawalOverviewRow" .Stats }}
@@ -214,6 +216,6 @@

Submit your signed message

-
- {{ end }} + {{ end }} + {{ end }} diff --git a/templates/burn.html b/templates/burn.html index a6a533df53..7a820a695f 100644 --- a/templates/burn.html +++ b/templates/burn.html @@ -702,6 +702,7 @@

Watch as ETH gets burned with EIP-1559

In total ${ page.total_burned | formatETH(1) } ETH have been burned up to now.
+
diff --git a/templates/calculator.html b/templates/calculator.html index 961ec03d95..de98546874 100644 --- a/templates/calculator.html +++ b/templates/calculator.html @@ -1055,9 +1055,7 @@
Estimated Rewards
-
- -
+
diff --git a/templates/components/banner.html b/templates/components/banner.html deleted file mode 100644 index 677aa50661..0000000000 --- a/templates/components/banner.html +++ /dev/null @@ -1,47 +0,0 @@ -{{ define "banner" }} -
-
-
- -
-
- -
-
- - -
-{{ end }} diff --git a/templates/components/bannerGeneric.html b/templates/components/bannerGeneric.html deleted file mode 100644 index 5646e59f2d..0000000000 --- a/templates/components/bannerGeneric.html +++ /dev/null @@ -1,42 +0,0 @@ -{{ define "bannerGeneric" }} -
-
-
-
- - -
-{{ end }} diff --git a/templates/components/bannerStakingServices.html b/templates/components/bannerStakingServices.html deleted file mode 100644 index 02eb96e063..0000000000 --- a/templates/components/bannerStakingServices.html +++ /dev/null @@ -1,42 +0,0 @@ -{{ define "bannerStakingServices" }} -
-
-
-
- - -
-{{ end }} diff --git a/templates/components/bannerValidator.html b/templates/components/bannerValidator.html deleted file mode 100644 index bc7114353f..0000000000 --- a/templates/components/bannerValidator.html +++ /dev/null @@ -1,60 +0,0 @@ -{{ define "bannerValidator" }} -
-
-
-
- - -
-{{ end }} diff --git a/templates/dashboard.html b/templates/dashboard.html index 9007d02b7f..4f241e90ee 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -194,6 +194,8 @@ +
+
diff --git a/templates/deposits.html b/templates/deposits.html index f080bdbbc9..93e9575226 100644 --- a/templates/deposits.html +++ b/templates/deposits.html @@ -251,9 +251,7 @@
This table displays the deposits received by the Ethereum Beacon Chain.
-
- -
+
{{ end }} {{ end }} diff --git a/templates/epochs.html b/templates/epochs.html index 3b135ef5e9..cdae252315 100644 --- a/templates/epochs.html +++ b/templates/epochs.html @@ -110,9 +110,7 @@

Epochs

-
- -
+
{{ end }} {{ end }} diff --git a/templates/eth1DepositsLeaderboard.html b/templates/eth1DepositsLeaderboard.html index 5a40a1cb78..926113d098 100644 --- a/templates/eth1DepositsLeaderboard.html +++ b/templates/eth1DepositsLeaderboard.html @@ -381,9 +381,7 @@
This table displays the leaderboard for deposits made by Ethereum A -
- -
+
{{ end }} {{ end }} diff --git a/templates/eth1tx.html b/templates/eth1tx.html index 042145c660..34fe2d55fc 100644 --- a/templates/eth1tx.html +++ b/templates/eth1tx.html @@ -6,21 +6,22 @@ {{ end }} {{ define "content" }} - {{ with .Data }} -
-
-
-

- Transaction Details -

- -
+
+
+
+

+ Transaction Details +

+
+
+
+ {{ with .Data }}
-
- {{ end }} + {{ end }} +
{{ end }} diff --git a/templates/execution/block.html b/templates/execution/block.html index e37180a78a..ef9655209f 100644 --- a/templates/execution/block.html +++ b/templates/execution/block.html @@ -30,6 +30,7 @@

+