ELOS-License-Builder/src/Main.elm

204 lines
5.0 KiB
Elm

module Main exposing (main)
import Browser
import Sort.Set as Set exposing (Set)
import Html exposing (Html, button, div, h2, h3, input, label, p, section, text, span, h3)
import Html.Events exposing (onCheck, onClick)
import Html.Attributes exposing (class, type_, id)
import Html.Attributes exposing (attribute)
import License exposing (License, DownloadType (..))
import License.Hippocratic as Hippocratic
import License.NPL as NPL
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 SelectedLicense
= Hippocratic
| NPL
availableLicenses : List SelectedLicense
availableLicenses = [ Hippocratic, NPL ]
type alias Model =
{ selected : SelectedLicense
, hippocratic : License Hippocratic.Module
, npl : License NPL.Module
}
selectedInfo : SelectedLicense -> License.LicenseDescriptors
selectedInfo selected =
case selected of
Hippocratic -> Hippocratic.info.descriptors
NPL -> NPL.info.descriptors
init : () -> (Model, Cmd Msg)
init () =
(
{ selected = Hippocratic
, hippocratic = License.empty Hippocratic.info
, npl = License.empty NPL.info
}
, Cmd.none
)
-- UPDATE
type Msg
= SwitchLicense SelectedLicense
| ToggleModule AnyModule Bool
| Download License.DownloadType
type AnyModule
= HippocraticMod Hippocratic.Module
| NPLMod NPL.Module
type alias ModuleWrapper mtype = mtype -> AnyModule
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
SwitchLicense newLicense ->
( { model | selected = newLicense }
, Cmd.none
)
ToggleModule mod enabled ->
( case mod of
HippocraticMod modu ->
{ model | hippocratic = License.toggleModule enabled modu model.hippocratic }
NPLMod modu ->
{ model | npl = License.toggleModule enabled modu model.npl }
, Cmd.none
)
Download dtype ->
( model
, case model.selected of
Hippocratic -> License.download dtype model.hippocratic
NPL -> License.download dtype model.npl
)
-- VIEW
view_module_button : ModuleWrapper moduleType -> (moduleType -> License.ModuleInfo) -> Set moduleType -> moduleType -> Html Msg
view_module_button wrapModule moduleInfo enabled mod =
label
(class "module-button"
:: (if Set.memberOf enabled mod then [class "active"] else [])
)
[ div []
[ div [class "cooler-checkbox"]
[ input
[ type_ "checkbox"
, onCheck (ToggleModule (wrapModule mod))
] []
]
, h3 [] [ text (.name (moduleInfo mod)) ]
, Html.map never (p [] (.desc (moduleInfo mod)))
]
]
viewLicenseChooser : SelectedLicense -> Html Msg
viewLicenseChooser selected =
div
[ id "license-chooser" ]
[ selected
|> selectedInfo
|> viewLicenseInfo
|> Html.map never
, div [ id "available-licenses" ]
( availableLicenses
|> List.map (selectableLicense selected)
)
]
viewLicenseInfo : License.LicenseDescriptors -> Html Never
viewLicenseInfo info =
div [ id "selected-license" ]
[ h2 [] [text info.name]
, p [] [text info.desc]
]
selectableLicense : SelectedLicense -> SelectedLicense -> Html Msg
selectableLicense currentlySelected license =
button
( [ onClick (SwitchLicense license)
, class "selectable-license"
]
++ if currentlySelected == license then [class "active"] else []
)
[ span []
[ text (.slug (selectedInfo license))
]
]
view_modules : ModuleWrapper moduleType -> License moduleType -> Html Msg
view_modules wrap license =
section [id "modules"] (
license.info.availableModules
|> List.map (view_module_button wrap license.info.moduleInfo license.activeModules)
)
view_cooler_button : String -> msg -> Html msg
view_cooler_button name message =
button
[ 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)
]
)
divider : String -> Html Never
divider sectionName =
div [class "divider"]
[ div [] []
, h3 [] [text sectionName]
, div [] []
]
view : Model -> Html Msg
view model =
div [id "elm-area"]
[ viewLicenseChooser model.selected
, Html.map never (divider "Customize")
, case model.selected of
Hippocratic -> view_modules HippocraticMod model.hippocratic
NPL -> view_modules NPLMod model.npl
, Html.map never (divider "Download")
, downloads
]