From 89f81f6c0e30e44d8c5c68ef0c5d67cd3a65b14d Mon Sep 17 00:00:00 2001 From: Dmitry Zuikov Date: Mon, 25 Mar 2024 16:19:37 +0300 Subject: [PATCH] wip --- hbs2-browser/assets/css/custom.css | 89 ++++++++++++++++++++ hbs2-browser/lib/HBS2/Peer/Browser/Assets.hs | 2 + hbs2-browser/templates/browser.html | 45 ++++++++++ hbs2-peer/app/HttpWorker.hs | 36 ++++++-- hbs2-peer/hbs2-peer.cabal | 8 +- 5 files changed, 172 insertions(+), 8 deletions(-) create mode 100644 hbs2-browser/assets/css/custom.css create mode 100644 hbs2-browser/templates/browser.html diff --git a/hbs2-browser/assets/css/custom.css b/hbs2-browser/assets/css/custom.css new file mode 100644 index 00000000..5fbc80aa --- /dev/null +++ b/hbs2-browser/assets/css/custom.css @@ -0,0 +1,89 @@ +header { + background-color: #f8f9fa; + padding: 10px 0; + text-align: left; + border-bottom: 1px solid #eaeaea; + margin-bottom: 30px; +} + +header h1 { + color: #333; + font-size: 20px; + font-weight: 400; + padding: 10px 20px; + /* font-weight: 300; */ + margin: 0; + text-shadow: 0 2px 4px rgba(0,0,0,0.1); +} + +body { + font-size: 0.725rem; /* Уменьшаем размер шрифта, если он кажется слишком большим */ +} + +button.primary, button.secondary, button.success { + padding: 0.5rem 1rem; /* Уменьшаем отступы */ + font-size: 0.75rem; /* Уменьшаем размер шрифта в кнопке */ + line-height: 1.2; /* Опционально можно установить высоту строки */ +} + +.flex-container { + display: flex; + flex-wrap: wrap; /* Элементы будут переноситься на следующую строку при нехватке места */ + gap: 1rem; /* Отступ между элементами */ +} + +.flex-item { + padding: 1rem; /* добавляем отступ внутри боксов */ + border: 1px solid #cccccc; /* добавляем тонкую серую границу */ + margin: 10px; /* добавляем внешний отступ вокруг боксов */ + border-radius: 8px; /* если хотите скругленные углы */ + background: #ffffff; /* установка белого фона для боксов, если нужно */ + + flex: 1; /* Каждый элемент будет занимать равное пространство, но не меньше минимальной ширины */ + min-width: 12em; /* Минимальная ширина для каждого бокса */ + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* Добавляем немного тени для лучшей визуализации */ +} + +@media (max-width: 1024px) { + .flex-container { + flex-direction: column; + } + .flex-item { + /* Блоки будут занимать всю ширину контейнера на меньших экранах */ + min-width: 100%; + } +} + +.flex-item:nth-child(1) { + flex: 1.5; /* Третий элемент будет расти вдвое быстрее остальных */ +} + +th { + font-weight: bolder; +} + +td.colr { + text-align: right; +} + +.ref { + font-family: 'Courier New', Courier, monospace; + font-size: 0.8rem; +} + +.lab { + padding-left: 0.8em; +} + +td.ref { + width: 35em; +} + +td.reftype { + width: 10em; +} + +td.reftime { + width: 4em; +} + diff --git a/hbs2-browser/lib/HBS2/Peer/Browser/Assets.hs b/hbs2-browser/lib/HBS2/Peer/Browser/Assets.hs index edefa833..064245f8 100644 --- a/hbs2-browser/lib/HBS2/Peer/Browser/Assets.hs +++ b/hbs2-browser/lib/HBS2/Peer/Browser/Assets.hs @@ -8,4 +8,6 @@ import Data.ByteString cssDir :: [(FilePath, ByteString)] cssDir = $(embedDir "assets") +templates :: [(FilePath, ByteString)] +templates = $(embedDir "templates") diff --git a/hbs2-browser/templates/browser.html b/hbs2-browser/templates/browser.html new file mode 100644 index 00000000..6d0b9282 --- /dev/null +++ b/hbs2-browser/templates/browser.html @@ -0,0 +1,45 @@ + + + + + + hbs2-peer browser + + + + + + +
+
+

hbs2-peer 0.24.1.0

+
+ + + +
+ + + + + + + +
5GnroAC8FXNRL8rcgJj6RTu9mt1AbuNd5MZVnDBcCKzb
+ +
+ + +
+ + + diff --git a/hbs2-peer/app/HttpWorker.hs b/hbs2-peer/app/HttpWorker.hs index ec4089db..d72b87db 100644 --- a/hbs2-peer/app/HttpWorker.hs +++ b/hbs2-peer/app/HttpWorker.hs @@ -1,7 +1,8 @@ {-# Language TypeOperators #-} module HttpWorker where -import HBS2.Prelude +import HBS2.Prelude.Plated +import HBS2.OrDie import HBS2.Hash import HBS2.Actors.Peer import HBS2.Storage @@ -15,7 +16,7 @@ import HBS2.Net.Auth.Schema import HBS2.Data.Types.SignedBox import HBS2.Events import HBS2.Storage.Operations.ByteString - +import HBS2.Misc.PrettyStuff import PeerTypes @@ -31,10 +32,16 @@ import Network.Wai.Middleware.StaticEmbedded import Text.InterpolatedString.Perl6 (qc) import Web.Scotty +import Data.Text.Lazy.IO qualified as TIO +import Data.Text.Lazy.Encoding qualified as Enc +import Text.Microstache.Compile +import Text.Microstache.Render + import Data.ByteString.Builder (byteString, Builder) import Control.Concurrent import Data.Either +import Data.HashMap.Strict qualified as HM import Codec.Serialise (deserialiseOrFail) import Data.Aeson (object, (.=)) import Data.ByteString.Lazy.Char8 qualified as LBS8 @@ -76,6 +83,18 @@ httpWorker (PeerConfig syn) pmeta e = do let bro = runReader (cfgValue @PeerBrowser) syn == FeatureOn penv <- ask + let tpl = templates + + + tpls <- for tpl $ \(n,bs) -> do + let txt = Enc.decodeUtf8 (LBS.fromStrict bs) + tpl <- compileMustacheText (fromString n) txt + & orThrowUser [qc|Can't compile template {n}|] + debug $ green "TEMPLATE" <+> pretty n + pure (n, tpl) + + let templates = HM.fromList tpls + maybe1 port' none $ \port -> liftIO do scotty port $ do @@ -199,12 +218,15 @@ httpWorker (PeerConfig syn) pmeta e = do get "/metadata" do raw $ serialise $ pmeta - when bro do - middleware (static cssDir) + middleware (static cssDir) - get "/browser" do - text "BRO" - status status200 + when bro do + + get "/browser" $ flip runContT pure do + template <- orElse (status status500) (HM.lookup "browser.html" templates) + lift do + html $ renderMustache template "JOPAKITA" + status status200 put "/" do -- FIXME: optional-header-based-authorization diff --git a/hbs2-peer/hbs2-peer.cabal b/hbs2-peer/hbs2-peer.cabal index dd965d59..ebe1c472 100644 --- a/hbs2-peer/hbs2-peer.cabal +++ b/hbs2-peer/hbs2-peer.cabal @@ -279,7 +279,13 @@ executable hbs2-peer , Paths_hbs2_peer -- other-extensions: - build-depends: base, hbs2-peer, hbs2-keyman, hbs2-browser, vty + build-depends: + base + , hbs2-peer + , hbs2-keyman + , hbs2-browser + , microstache + , vty hs-source-dirs: app