Skip to content

Commit 4afb8e7

Browse files
committed
React to attr changes in custom element
1 parent ccb0540 commit 4afb8e7

File tree

5 files changed

+69
-19
lines changed

5 files changed

+69
-19
lines changed

bower.json

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"name": "json-form-custom-element",
3+
"description": "JSON Schema based form generator",
4+
"main": "build/custom-element.js",
5+
"authors": [
6+
"Anatoliy <[email protected]>"
7+
],
8+
"license": "GNU GENERAL PUBLIC LICENSE v3",
9+
"homepage": "https://github.com/1602/json-form",
10+
"ignore": [
11+
"**/.*",
12+
"node_modules",
13+
"bower_components",
14+
"test",
15+
"tests"
16+
]
17+
}

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "json-form-custom-element",
3-
"private": true,
4-
"version": "1.0.0",
3+
"private": false,
4+
"version": "1.0.5",
55
"description": "JSON Schema based form generator",
66
"main": "build/custom-element.js",
77
"repository": "[email protected]:1602/json-form.git",

src/CustomElement.elm

+44-14
Original file line numberDiff line numberDiff line change
@@ -14,39 +14,66 @@ import Json.Schema.Definitions
1414

1515
type alias Model =
1616
{ form : Json.Form.Model
17+
, schema : Json.Schema.Definitions.Schema
1718
, editedValue : Maybe JsonValue.JsonValue
1819
}
1920

2021

2122
init : Value -> ( Model, Cmd Msg )
2223
init v =
2324
let
24-
schema = v
25-
|> decodeValue (Json.Decode.at [ "schema" ] Json.Schema.Definitions.decoder)
26-
|> Result.withDefault Json.Schema.Definitions.blankSchema
27-
28-
value = v
29-
|> decodeValue (Json.Decode.at [ "value" ] JsonValue.decoder)
30-
|> Result.toMaybe
25+
schema =
26+
v
27+
|> decodeValue (Json.Decode.at [ "schema" ] Json.Schema.Definitions.decoder)
28+
|> Result.mapError Debug.log
29+
|> Result.withDefault Json.Schema.Definitions.blankSchema
30+
31+
value =
32+
v
33+
|> decodeValue (Json.Decode.at [ "value" ] JsonValue.decoder)
34+
|> Result.toMaybe
3135
in
3236
{ form = Json.Form.init schema value
3337
, editedValue = value
38+
, schema = schema
3439
}
35-
! [ loadSnippet "traveller" ]
40+
! []
3641

3742

3843
type Msg
3944
= JsonFormMsg Json.Form.Msg
4045
| ChangeValue Value
46+
| ChangeSchema Value
4147

4248

4349
update : Msg -> Model -> ( Model, Cmd Msg )
4450
update message model =
4551
case message of
52+
ChangeSchema v ->
53+
let
54+
schema =
55+
v
56+
|> decodeValue Json.Schema.Definitions.decoder
57+
|> Result.withDefault Json.Schema.Definitions.blankSchema
58+
in
59+
{ model
60+
| schema = schema
61+
, form = Json.Form.init schema model.editedValue
62+
}
63+
! []
64+
4665
ChangeValue v ->
47-
{ model | editedValue = v |> decodeValue JsonValue.decoder |> Result.toMaybe
48-
}
49-
! []
66+
let
67+
value =
68+
v
69+
|> decodeValue JsonValue.decoder
70+
|> Result.toMaybe
71+
in
72+
{ model
73+
| editedValue = value
74+
, form = Json.Form.init model.schema value
75+
}
76+
! []
5077

5178
JsonFormMsg msg ->
5279
let
@@ -73,12 +100,15 @@ view model =
73100
|> Html.map JsonFormMsg
74101

75102

76-
port loadSnippet : String -> Cmd msg
103+
port valueChange : (Value -> msg) -> Sub msg
77104

78105

79-
port valueChange : (Value -> msg) -> Sub msg
106+
port schemaChange : (Value -> msg) -> Sub msg
80107

81108

82109
subscriptions : Model -> Sub Msg
83110
subscriptions _ =
84-
valueChange ChangeValue
111+
Sub.batch
112+
[ valueChange ChangeValue
113+
, schemaChange ChangeSchema
114+
]

src/Json/Form.elm

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ viewNode model schema isRequired path =
6464
Object ->
6565
viewObject model schema isRequired path
6666

67-
_ ->
68-
text "Not implemented"
67+
x ->
68+
text (toString x ++ ": not implemented")
6969

7070

7171
editingMode : Model -> Schema -> EditingMode

src/custom-element.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ customElements.define('json-form',
66
class extends HTMLElement {
77

88
static get observedAttributes() {
9-
return ['value'];
9+
return ['value', 'schema'];
1010
}
1111

1212
constructor() {
@@ -32,6 +32,9 @@ customElements.define('json-form',
3232
case 'value':
3333
this.app.ports.valueChange.send(JSON.parse(newValue));
3434
break;
35+
case 'schema':
36+
this.app.ports.schemaChange.send(JSON.parse(newValue));
37+
break;
3538
}
3639
}
3740
});

0 commit comments

Comments
 (0)