diff --git a/.gitignore b/.gitignore index f01b38a..f4417f8 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ _testmain.go # Elm UI # elm-package generated files +/ui/index.html /ui/elm-stuff /ui/tests/elm-stuff # elm-repl generated files diff --git a/ui/src/Api.elm b/ui/src/Api.elm index 6bd5ee9..058552d 100644 --- a/ui/src/Api.elm +++ b/ui/src/Api.elm @@ -40,7 +40,7 @@ apiV1Url elements = -} serveUrl : List String -> String serveUrl elements = - Url.Builder.absolute ([ "serve" ] ++ elements) [] + Url.Builder.absolute ("serve" :: elements) [] deleteMessage : HttpResult msg -> String -> String -> Cmd msg diff --git a/ui/src/Data/Date.elm b/ui/src/Data/Date.elm index 51ab39c..d028305 100644 --- a/ui/src/Data/Date.elm +++ b/ui/src/Data/Date.elm @@ -1,6 +1,6 @@ module Data.Date exposing (date) -import Json.Decode exposing (..) +import Json.Decode exposing (Decoder, int, map) import Time exposing (Posix) diff --git a/ui/src/Data/Message.elm b/ui/src/Data/Message.elm index f6caced..b193af9 100644 --- a/ui/src/Data/Message.elm +++ b/ui/src/Data/Message.elm @@ -1,8 +1,8 @@ module Data.Message exposing (Attachment, Message, attachmentDecoder, decoder) import Data.Date exposing (date) -import Json.Decode exposing (..) -import Json.Decode.Pipeline exposing (..) +import Json.Decode exposing (Decoder, bool, int, list, string, succeed) +import Json.Decode.Pipeline exposing (optional, required) import Time exposing (Posix) diff --git a/ui/src/Data/MessageHeader.elm b/ui/src/Data/MessageHeader.elm index e796201..742d72b 100644 --- a/ui/src/Data/MessageHeader.elm +++ b/ui/src/Data/MessageHeader.elm @@ -1,8 +1,8 @@ module Data.MessageHeader exposing (MessageHeader, decoder) import Data.Date exposing (date) -import Json.Decode exposing (..) -import Json.Decode.Pipeline exposing (..) +import Json.Decode exposing (Decoder, bool, int, list, string, succeed) +import Json.Decode.Pipeline exposing (optional, required) import Time exposing (Posix) diff --git a/ui/src/Data/Metrics.elm b/ui/src/Data/Metrics.elm index 26b264e..4cd8e5c 100644 --- a/ui/src/Data/Metrics.elm +++ b/ui/src/Data/Metrics.elm @@ -1,8 +1,8 @@ module Data.Metrics exposing (Metrics, decodeIntList, decoder) import Data.Date exposing (date) -import Json.Decode as Decode exposing (..) -import Json.Decode.Pipeline exposing (..) +import Json.Decode exposing (Decoder, int, map, string, succeed) +import Json.Decode.Pipeline exposing (requiredAt) import Time exposing (Posix) diff --git a/ui/src/Data/Session.elm b/ui/src/Data/Session.elm index 6d18aed..02ade26 100644 --- a/ui/src/Data/Session.elm +++ b/ui/src/Data/Session.elm @@ -15,11 +15,9 @@ module Data.Session exposing import Browser.Navigation as Nav import Data.AppConfig as AppConfig exposing (AppConfig) -import Html exposing (Html) import Json.Decode as D -import Json.Decode.Pipeline exposing (..) +import Json.Decode.Pipeline exposing (optional) import Json.Encode as E -import Ports import Time import Url exposing (Url) diff --git a/ui/src/HttpUtil.elm b/ui/src/HttpUtil.elm index 629782f..7733c9f 100644 --- a/ui/src/HttpUtil.elm +++ b/ui/src/HttpUtil.elm @@ -1,7 +1,6 @@ module HttpUtil exposing (Error, RequestContext, delete, errorFlash, expectJson, expectString, patch) import Data.Session as Session -import Html exposing (Html, div, text) import Http import Json.Decode as Decode diff --git a/ui/src/Layout.elm b/ui/src/Layout.elm index 717d7cc..cb36952 100644 --- a/ui/src/Layout.elm +++ b/ui/src/Layout.elm @@ -1,17 +1,37 @@ module Layout exposing (Model, Msg, Page(..), frame, init, reset, update) import Data.Session as Session exposing (Session) -import Html exposing (..) +import Html + exposing + ( Attribute + , Html + , a + , button + , div + , footer + , form + , h2 + , header + , i + , input + , li + , nav + , pre + , span + , td + , text + , th + , tr + , ul + ) import Html.Attributes exposing ( attribute , class , classList , href - , id , placeholder , rel - , selected , target , type_ , value @@ -146,7 +166,7 @@ frame { model, session, activePage, activeMailbox, modal, content } = ] , div [ class "navbar-bg" ] [ text "" ] , frameModal modal - , div [ class "page" ] ([ errorFlash model session.flash ] ++ content) + , div [ class "page" ] (errorFlash model session.flash :: content) , footer [] [ div [ class "footer" ] [ externalLink "https://www.inbucket.org" "Inbucket" @@ -229,13 +249,6 @@ navbarRecent page activeMailbox model session = else session.persistent.recentMailboxes - dropdownExpanded = - if model.recentVisible then - "true" - - else - "false" - recentLink mailbox = a [ Route.href (Route.Mailbox mailbox) ] [ text mailbox ] in diff --git a/ui/src/Main.elm b/ui/src/Main.elm index 00cd708..7099576 100644 --- a/ui/src/Main.elm +++ b/ui/src/Main.elm @@ -4,7 +4,7 @@ import Browser exposing (Document, UrlRequest) import Browser.Navigation as Nav import Data.AppConfig as AppConfig exposing (AppConfig) import Data.Session as Session exposing (Session) -import Html exposing (..) +import Html exposing (Html) import Json.Decode as D exposing (Value) import Layout import Page.Home as Home diff --git a/ui/src/Page/Home.elm b/ui/src/Page/Home.elm index 3ce3f99..832902b 100644 --- a/ui/src/Page/Home.elm +++ b/ui/src/Page/Home.elm @@ -2,12 +2,10 @@ module Page.Home exposing (Model, Msg, init, update, view) import Api import Data.Session as Session exposing (Session) -import Html exposing (..) -import Html.Attributes exposing (..) -import Http +import Html exposing (Html) +import Html.Attributes exposing (class, property) import HttpUtil import Json.Encode as Encode -import Ports diff --git a/ui/src/Page/Mailbox.elm b/ui/src/Page/Mailbox.elm index 108d60f..045cb87 100644 --- a/ui/src/Page/Mailbox.elm +++ b/ui/src/Page/Mailbox.elm @@ -2,11 +2,36 @@ module Page.Mailbox exposing (Model, Msg, init, load, subscriptions, update, vie import Api import Data.Message as Message exposing (Message) -import Data.MessageHeader as MessageHeader exposing (MessageHeader) +import Data.MessageHeader exposing (MessageHeader) import Data.Session as Session exposing (Session) import DateFormat as DF import DateFormat.Relative as Relative -import Html exposing (..) +import Html + exposing + ( Attribute + , Html + , a + , article + , aside + , button + , dd + , div + , dl + , dt + , h3 + , i + , input + , li + , main_ + , nav + , p + , span + , table + , td + , text + , tr + , ul + ) import Html.Attributes exposing ( alt @@ -15,7 +40,6 @@ import Html.Attributes , disabled , download , href - , id , placeholder , property , tabindex @@ -24,11 +48,9 @@ import Html.Attributes , value ) import Html.Events as Events -import Http exposing (Error) import HttpUtil import Json.Decode as D import Json.Encode as E -import Ports import Route import Task import Time exposing (Posix) @@ -138,7 +160,6 @@ type Msg = ListLoaded (Result HttpUtil.Error (List MessageHeader)) | ClickMessage MessageID | ListKeyPress String Int - | OpenMessage MessageID | CloseMessage | MessageLoaded (Result HttpUtil.Error Message) | MessageBody Body @@ -167,9 +188,6 @@ update msg model = ] ) - OpenMessage id -> - updateOpenMessage model id - CloseMessage -> case model.state of ShowingList list _ -> @@ -350,7 +368,7 @@ updatePurge model = ] in case model.state of - ShowingList list _ -> + ShowingList _ _ -> ( { model | promptPurge = False , session = Session.disableRouting model.session diff --git a/ui/src/Page/Monitor.elm b/ui/src/Page/Monitor.elm index 855e831..b0bc696 100644 --- a/ui/src/Page/Monitor.elm +++ b/ui/src/Page/Monitor.elm @@ -3,8 +3,25 @@ module Page.Monitor exposing (Model, Msg, init, update, view) import Data.MessageHeader as MessageHeader exposing (MessageHeader) import Data.Session as Session exposing (Session) import DateFormat as DF -import Html exposing (..) -import Html.Attributes exposing (..) +import Html + exposing + ( Attribute + , Html + , button + , div + , em + , h1 + , node + , span + , table + , tbody + , td + , text + , th + , thead + , tr + ) +import Html.Attributes exposing (class, tabindex) import Html.Events as Events import Json.Decode as D import Route diff --git a/ui/src/Page/Status.elm b/ui/src/Page/Status.elm index e719c1e..00ead55 100644 --- a/ui/src/Page/Status.elm +++ b/ui/src/Page/Status.elm @@ -1,14 +1,21 @@ module Page.Status exposing (Model, Msg, init, subscriptions, update, view) import Api -import Data.Metrics as Metrics exposing (Metrics) -import Data.ServerConfig as ServerConfig exposing (ServerConfig) +import Data.Metrics exposing (Metrics) +import Data.ServerConfig exposing (ServerConfig) import Data.Session as Session exposing (Session) import DateFormat.Relative as Relative import Filesize -import Html exposing (..) -import Html.Attributes exposing (..) -import Http exposing (Error) +import Html + exposing + ( Html + , div + , h1 + , h2 + , i + , text + ) +import Html.Attributes exposing (class) import HttpUtil import Sparkline as Spark import Svg.Attributes as SvgAttrib @@ -93,7 +100,7 @@ initDataSet = subscriptions : Model -> Sub Msg -subscriptions model = +subscriptions _ = Time.every (10 * 1000) Tick @@ -271,18 +278,19 @@ configPanel maybeConfig = , textEntry "SMTP Listener" config.smtpConfig.addr , textEntry "POP3 Listener" config.pop3Listener , textEntry "HTTP Listener" config.webListener - , textEntry "Accept Policy" (acceptPolicy config.smtpConfig) - , textEntry "Store Policy" (storePolicy config.smtpConfig) + , textEntry "Accept Policy" (acceptPolicy config) + , textEntry "Store Policy" (storePolicy config) , textEntry "Store Type" config.storageConfig.storeType , textEntry "Message Cap" (mailboxCap config) , textEntry "Retention Period" (retentionPeriod config) ] +acceptPolicy : ServerConfig -> String acceptPolicy config = - if config.defaultAccept then + if config.smtpConfig.defaultAccept then "All domains" - ++ (case config.rejectDomains of + ++ (case config.smtpConfig.rejectDomains of Nothing -> "" @@ -295,7 +303,7 @@ acceptPolicy config = else "No domains" - ++ (case config.acceptDomains of + ++ (case config.smtpConfig.acceptDomains of Nothing -> "" @@ -307,10 +315,11 @@ acceptPolicy config = ) +storePolicy : ServerConfig -> String storePolicy config = - if config.defaultStore then + if config.smtpConfig.defaultStore then "All domains" - ++ (case config.discardDomains of + ++ (case config.smtpConfig.discardDomains of Nothing -> "" @@ -323,7 +332,7 @@ storePolicy config = else "No domains" - ++ (case config.storeDomains of + ++ (case config.smtpConfig.storeDomains of Nothing -> "" @@ -412,23 +421,6 @@ viewMetric metric = ] -viewLiveMetric : String -> (Int -> String) -> Int -> Html a -> Html a -viewLiveMetric label formatter value graph = - div [ class "metric" ] - [ div [ class "label" ] [ text label ] - , div [ class "value" ] [ text (formatter value) ] - , div [ class "graph" ] - [ graph - , text "(10min)" - ] - ] - - -graphNull : Html a -graphNull = - div [] [] - - graphSize : Spark.Size graphSize = { width = 180