134 lines
2.8 KiB
Elm
134 lines
2.8 KiB
Elm
module Main exposing (main)
|
|
|
|
import Browser
|
|
import Sort.Set exposing (Set)
|
|
import Html exposing (Html, div, input, label, p, section, text, h3)
|
|
import Html.Events exposing (onCheck, onClick)
|
|
import Html.Attributes exposing (class, type_, id)
|
|
import Modules exposing
|
|
( Module
|
|
, all_modules
|
|
, download_license
|
|
, DownloadType(..)
|
|
, module_property
|
|
, module_desc
|
|
, module_sorter
|
|
)
|
|
import Html.Attributes exposing (attribute)
|
|
|
|
main: Program () Model Msg
|
|
main =
|
|
Browser.element
|
|
{ init = init
|
|
, update = update
|
|
, view = view
|
|
, subscriptions = subscriptions
|
|
}
|
|
|
|
subscriptions : Model -> Sub Msg
|
|
subscriptions _ = Sub.none
|
|
|
|
-- INIT + Model
|
|
|
|
|
|
type alias Model =
|
|
{ enabled_modules : Set Module
|
|
}
|
|
|
|
init : () -> (Model, Cmd Msg)
|
|
init () =
|
|
( { enabled_modules = Sort.Set.empty module_sorter }
|
|
, Cmd.none
|
|
)
|
|
|
|
-- UPDATE
|
|
|
|
type Msg
|
|
= ToggleModule Module Bool
|
|
| Download DownloadType
|
|
|
|
add_or_remove : Bool -> (a -> Set a -> Set a)
|
|
add_or_remove active =
|
|
if active then
|
|
Sort.Set.insert
|
|
else
|
|
Sort.Set.remove
|
|
|
|
update : Msg -> Model -> (Model, Cmd Msg)
|
|
update msg model =
|
|
case msg of
|
|
ToggleModule mod enabled ->
|
|
( { model | enabled_modules = add_or_remove enabled mod model.enabled_modules }
|
|
, Cmd.none
|
|
)
|
|
Download dtype ->
|
|
( model , download_license dtype (Sort.Set.toList model.enabled_modules) )
|
|
|
|
-- VIEW
|
|
|
|
view_module_button : Set Module -> Module -> Html Msg
|
|
view_module_button enabled mod =
|
|
label
|
|
(class "module-button"
|
|
:: (if Sort.Set.memberOf enabled mod then [class "active"] else [])
|
|
)
|
|
[ div []
|
|
[ div [class "cooler-checkbox"]
|
|
[ input
|
|
[ type_ "checkbox"
|
|
, onCheck (ToggleModule mod)
|
|
] []
|
|
]
|
|
, h3 [] [ text (module_property .name mod) ]
|
|
, p [] (module_desc mod)
|
|
]
|
|
]
|
|
|
|
view_modules : Set Module -> Html Msg
|
|
view_modules modules =
|
|
section [id "modules"] (
|
|
all_modules
|
|
|> List.map (view_module_button modules)
|
|
)
|
|
|
|
view_cooler_button : String -> msg -> Html msg
|
|
view_cooler_button name message =
|
|
div
|
|
[ class "cool-button"
|
|
, onClick message
|
|
]
|
|
[ div
|
|
[ class "bevel"
|
|
, class "tr"
|
|
, attribute "aria-hidden" "true"
|
|
] []
|
|
, div [] [ text name ]
|
|
, div
|
|
[ class "bevel"
|
|
, class "bl"
|
|
, attribute "aria-hidden" "true"
|
|
] []
|
|
]
|
|
|
|
view_download_button : (String, DownloadType) -> Html Msg
|
|
view_download_button (name, dtype) =
|
|
view_cooler_button name (Download dtype)
|
|
|
|
downloads : Html Msg
|
|
downloads =
|
|
section [id "downloads"]
|
|
( List.map view_download_button
|
|
[ ("Markdown", Markdown)
|
|
, ("Plaintext", Plain)
|
|
, ("HTML", Html)
|
|
]
|
|
)
|
|
|
|
|
|
view : Model -> Html Msg
|
|
view model =
|
|
div [id "elm-area"]
|
|
[ view_modules model.enabled_modules
|
|
, downloads
|
|
]
|