|
| 1 | +port module CustomElement exposing (init, subscriptions, update, view) |
| 2 | + |
| 3 | +--import Html.Attributes exposing (class, classList) |
| 4 | +--import Html.Events exposing (onClick) |
| 5 | + |
| 6 | +import Html exposing (Html, div, h3, text) |
| 7 | +import Json.Decode exposing (Value, decodeValue) |
| 8 | +import Json.Encode as Encode |
| 9 | +import Json.Form |
| 10 | +import Json.Schema.Definitions |
| 11 | +import Json.Value as JsonValue exposing (decoder) |
| 12 | + |
| 13 | + |
| 14 | +type alias Model = |
| 15 | + { form : Json.Form.Model |
| 16 | + , schema : Json.Schema.Definitions.Schema |
| 17 | + , editedValue : Maybe JsonValue.JsonValue |
| 18 | + } |
| 19 | + |
| 20 | + |
| 21 | +init : Value -> ( Model, Cmd Msg ) |
| 22 | +init v = |
| 23 | + let |
| 24 | + schema = |
| 25 | + v |
| 26 | + |> decodeValue (Json.Decode.at [ "schema" ] Json.Schema.Definitions.decoder) |
| 27 | + |> Result.mapError Debug.log |
| 28 | + |> Result.withDefault Json.Schema.Definitions.blankSchema |
| 29 | + |
| 30 | + value = |
| 31 | + v |
| 32 | + |> decodeValue (Json.Decode.at [ "value" ] JsonValue.decoder) |
| 33 | + |> Result.toMaybe |
| 34 | + in |
| 35 | + { form = Json.Form.init schema value |
| 36 | + , editedValue = value |
| 37 | + , schema = schema |
| 38 | + } |
| 39 | + ! [] |
| 40 | + |
| 41 | + |
| 42 | +type Msg |
| 43 | + = JsonFormMsg Json.Form.Msg |
| 44 | + | ChangeValue Value |
| 45 | + | ChangeSchema Value |
| 46 | + |
| 47 | + |
| 48 | +update : Msg -> Model -> ( Model, Cmd Msg ) |
| 49 | +update message model = |
| 50 | + case message of |
| 51 | + ChangeSchema v -> |
| 52 | + let |
| 53 | + schema = |
| 54 | + v |
| 55 | + |> decodeValue Json.Schema.Definitions.decoder |
| 56 | + |> Result.withDefault Json.Schema.Definitions.blankSchema |
| 57 | + in |
| 58 | + { model |
| 59 | + | schema = schema |
| 60 | + , form = Json.Form.init schema model.editedValue |
| 61 | + } |
| 62 | + ! [] |
| 63 | + |
| 64 | + ChangeValue v -> |
| 65 | + let |
| 66 | + value = |
| 67 | + v |
| 68 | + |> decodeValue JsonValue.decoder |
| 69 | + |> Result.toMaybe |
| 70 | + in |
| 71 | + { model |
| 72 | + | editedValue = value |
| 73 | + , form = Json.Form.init model.schema value |
| 74 | + } |
| 75 | + ! [] |
| 76 | + |
| 77 | + JsonFormMsg msg -> |
| 78 | + let |
| 79 | + ( ( m, cmd ), exMsg ) = |
| 80 | + Json.Form.update msg model.form |
| 81 | + |
| 82 | + ( editedValue, exCmd ) = |
| 83 | + case exMsg of |
| 84 | + Json.Form.UpdateValue v isValid -> |
| 85 | + ( v |
| 86 | + , Encode.object |
| 87 | + [ ( "value" |
| 88 | + , v |
| 89 | + |> Maybe.withDefault JsonValue.NullValue |
| 90 | + |> JsonValue.encode |
| 91 | + ) |
| 92 | + , ( "isValid", Encode.bool isValid ) |
| 93 | + ] |
| 94 | + |> value |
| 95 | + ) |
| 96 | + |
| 97 | + _ -> |
| 98 | + ( model.editedValue, Cmd.none ) |
| 99 | + in |
| 100 | + { model |
| 101 | + | form = m |
| 102 | + , editedValue = editedValue |
| 103 | + } |
| 104 | + ! [ cmd |> Cmd.map JsonFormMsg, exCmd ] |
| 105 | + |
| 106 | + |
| 107 | +view : Model -> Html Msg |
| 108 | +view model = |
| 109 | + model.form |
| 110 | + |> Json.Form.view |
| 111 | + |> Html.map JsonFormMsg |
| 112 | + |
| 113 | + |
| 114 | +port valueChange : (Value -> msg) -> Sub msg |
| 115 | + |
| 116 | + |
| 117 | +port value : Value -> Cmd msg |
| 118 | + |
| 119 | + |
| 120 | +port schemaChange : (Value -> msg) -> Sub msg |
| 121 | + |
| 122 | + |
| 123 | +subscriptions : Model -> Sub Msg |
| 124 | +subscriptions _ = |
| 125 | + Sub.batch |
| 126 | + [ valueChange ChangeValue |
| 127 | + , schemaChange ChangeSchema |
| 128 | + ] |
0 commit comments