module DocEdit exposing (main) import Html exposing (..) import Html.Attributes exposing (..) import Html.Events exposing (..) import Browser import Browser.Navigation exposing (load) import Json.Encode as JE import Lib.Html exposing (..) import Lib.TextPreview as TP import Lib.Api as Api import Lib.Ffi as Ffi import Lib.Editsum as Editsum import Gen.Api as GApi import Gen.DocEdit as GD main : Program GD.Recv Model Msg main = Browser.element { init = \e -> (init e, Cmd.none) , view = view , update = update , subscriptions = always Sub.none } type alias Model = { state : Api.State , editsum : Editsum.Model , title : String , content : TP.Model , id : Int } init : GD.Recv -> Model init d = { state = Api.Normal , editsum = { authmod = True, editsum = TP.bbcode d.editsum, locked = d.locked, hidden = d.hidden } , title = d.title , content = TP.markdown d.content , id = d.id } encode : Model -> GD.Send encode model = { id = model.id , editsum = model.editsum.editsum.data , hidden = model.editsum.hidden , locked = model.editsum.locked , title = model.title , content = model.content.data } type Msg = Editsum Editsum.Msg | Submit | Submitted GApi.Response | Title String | Content TP.Msg update : Msg -> Model -> (Model, Cmd Msg) update msg model = case msg of Editsum m -> let (nm,nc) = Editsum.update m model.editsum in ({ model | editsum = nm }, Cmd.map Editsum nc) Title s -> ({ model | title = s }, Cmd.none) Content m -> let (nm,nc) = TP.update m model.content in ({ model | content = nm }, Cmd.map Content nc) Submit -> let body = GD.encode (encode model) in ({ model | state = Api.Loading }, Api.post "/d/edit.json" body Submitted) Submitted (GApi.Redirect s) -> (model, load s) Submitted r -> ({ model | state = Api.Error r }, Cmd.none) view : Model -> Html Msg view model = form_ Submit (model.state == Api.Loading) [ div [ class "mainbox" ] [ h1 [] [ text <| "Edit d" ++ String.fromInt model.id ] , table [ class "formtable" ] [ formField "title::Title" [ inputText "title" model.title Title (style "width" "300px" :: GD.valTitle) ] , formField "none" [ br_ 1 , b [] [ text "Contents" ] , TP.view "content" model.content Content 850 ([rows 50, cols 90] ++ GD.valContent) [ text "HTML and MultiMarkdown supported, which is " , a [ href "https://daringfireball.net/projects/markdown/basics", target "_blank" ] [ text "Markdown" ] , text " with some " , a [ href "http://fletcher.github.io/MultiMarkdown-5/syntax.html", target "_blank" ][ text "extensions" ] , text "." ] ] ] ] , div [ class "mainbox" ] [ fieldset [ class "submit" ] [ Html.map Editsum (Editsum.view model.editsum) , submitButton "Submit" model.state True ] ] ]