Skip to content

Commit ca615e6

Browse files
Merge pull request #273 from getodk/features/value-nodes
Support for `<select>` and `<select1>` value types, partial support for `<range>`
2 parents 4b31432 + a0c3da2 commit ca615e6

81 files changed

Lines changed: 3913 additions & 870 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.changeset/curvy-owls-joke.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
"@getodk/common": patch
3+
"@getodk/scenario": patch
4+
"@getodk/web-forms": minor
5+
---
6+
7+
- Partial support for `<odk:range>` (basic horizontal and vertical sliders)
8+
- Partial support for `<select1>` bind/value types (string, int, decimal)
9+
- Partial support for `<select>` bind/value types (string, int, decimal)
10+
- **BREAKING CHANGE** (`@getodk/xforms-engine`): `SelectNode`'s write methods have been replaced with more ergonomic alternatives

eslint.config.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,13 @@ export default tseslint.config(
380380
'prettier-vue/prettier': 'error',
381381
'vue/html-indent': ['error', 'tab'],
382382
'vue/html-comment-indent': ['error', 'tab'],
383-
'vue/script-indent': ['error', 'tab'],
383+
'vue/script-indent': [
384+
'error',
385+
'tab',
386+
{
387+
switchCase: 1,
388+
},
389+
],
384390
// should be based on the printWidth
385391
'vue/max-attributes-per-line': 'off',
386392
'vue/no-undef-components': 'error',
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<h:html xmlns="http://www.w3.org/2002/xforms"
2+
xmlns:h="http://www.w3.org/1999/xhtml">
3+
4+
<h:head>
5+
<h:title>Range controls</h:title>
6+
<model>
7+
<instance>
8+
<root id="range-controls">
9+
<range-decimal>1.0</range-decimal>
10+
<range-int>2</range-int>
11+
12+
<vertical>
13+
<v-decimal>1.25</v-decimal>
14+
<v-int>1</v-int>
15+
</vertical>
16+
</root>
17+
</instance>
18+
<bind nodeset="/root/range-decimal" type="xsd:decimal" />
19+
<bind nodeset="/root/range-int" type="int" />
20+
<bind nodeset="/root/vertical/v-decimal" type="decimal" />
21+
<bind nodeset="/root/vertical/v-int" type="xsd:int" />
22+
</model>
23+
</h:head>
24+
25+
<h:body>
26+
<range ref="/root/range-decimal" start="-2.0" end="2.0" step="0.5">
27+
<label>Range control (decimal)</label>
28+
</range>
29+
<range ref="/root/range-int" start="-6" end="4" step="2">
30+
<label>Range control (int)</label>
31+
</range>
32+
33+
<group ref="/root/vertical">
34+
<range ref="/root/vertical/v-decimal" start="-5.0" end="7.0" step="0.5"
35+
appearance="vertical">
36+
<label>Range control (decimal)</label>
37+
</range>
38+
<range ref="/root/vertical/v-int" start="-3" end="4" step="3" appearance="vertical no-ticks">
39+
<label>Range control (int)</label>
40+
</range>
41+
</group>
42+
</h:body>
43+
44+
</h:html>

packages/common/src/fixtures/notes/2-all-possible-notes.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<note_w_ex_appearance />
1919
<read_only_int />
2020
<read_only_int_value>3</read_only_int_value>
21+
<note_calc_decimal_from_int />
2122
</group>
2223
<meta>
2324
<instanceID />
@@ -34,6 +35,8 @@
3435
<bind nodeset="/data/group/note_w_ex_appearance" readonly="true()" type="string" />
3536
<bind nodeset="/data/group/read_only_int" type="int" readonly="true()" />
3637
<bind nodeset="/data/group/read_only_int_value" type="int" readonly="true()" />
38+
<bind nodeset="/data/group/note_calc_decimal_from_int" type="decimal"
39+
calculate="/data/group/read_only_int_value + 1.5" readonly="true()" />
3740
<bind nodeset="/data/meta/instanceID" type="string" readonly="true()" jr:preload="uid" />
3841
</model>
3942
</h:head>
@@ -70,6 +73,9 @@
7073
<input ref="/data/group/read_only_int_value">
7174
<label>A readonly integer with value</label>
7275
</input>
76+
<input ref="/data/group/note_calc_decimal_from_int">
77+
<label>A note with decimal type calculated from int</label>
78+
</input>
7379
</group>
7480
</h:body>
7581
</h:html>
Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
<?xml version="1.0"?>
2+
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:h="http://www.w3.org/1999/xhtml"
3+
xmlns:jr="http://openrosa.org/javarosa" xmlns:odk="http://www.opendatakit.org/xforms"
4+
xmlns:orx="http://openrosa.org/xforms">
5+
<h:head>
6+
<h:title>Select types</h:title>
7+
<model>
8+
<instance>
9+
<root id="select-types">
10+
<select-relevance>yes</select-relevance>
11+
12+
<sel-1>
13+
<string-value>explicit string</string-value>
14+
<implicit-string-value>implicit string</implicit-string-value>
15+
<int-value>123</int-value>
16+
<decimal-value>45.67</decimal-value>
17+
</sel-1>
18+
19+
<sel-n>
20+
<string-value>explicit string</string-value>
21+
<implicit-string-value>implicit string</implicit-string-value>
22+
<int-value>123</int-value>
23+
<decimal-value>45.67</decimal-value>
24+
</sel-n>
25+
</root>
26+
</instance>
27+
<instance id="strings">
28+
<root>
29+
<!-- for select1 -->
30+
<item>
31+
<value>implicit string</value>
32+
<label>Implicit String</label>
33+
</item>
34+
<item>
35+
<value>explicit string</value>
36+
<label>Explicit String</label>
37+
</item>
38+
<item>
39+
<value>updated string</value>
40+
<label>Updated String</label>
41+
</item>
42+
43+
<!-- for select (multiple) -->
44+
<item>
45+
<value>implicit</value>
46+
<label>Implicit</label>
47+
</item>
48+
<item>
49+
<value>explicit</value>
50+
<label>Explicit</label>
51+
</item>
52+
<item>
53+
<value>updated</value>
54+
<label>Updated</label>
55+
</item>
56+
<item>
57+
<value>string</value>
58+
<label>string</label>
59+
</item>
60+
</root>
61+
</instance>
62+
<instance id="ints">
63+
<root>
64+
<item>
65+
<value>123</value>
66+
<label>123</label>
67+
</item>
68+
<item>
69+
<value>10</value>
70+
<label>10</label>
71+
</item>
72+
<item>
73+
<value>23</value>
74+
<label>23</label>
75+
</item>
76+
<item>
77+
<value>89</value>
78+
<label>89</label>
79+
</item>
80+
</root>
81+
</instance>
82+
<instance id="decimals">
83+
<root>
84+
<item>
85+
<value>45.67</value>
86+
<label>45.67</label>
87+
</item>
88+
<item>
89+
<value>89</value>
90+
<label>89</label>
91+
</item>
92+
<item>
93+
<value>10</value>
94+
<label>10</label>
95+
</item>
96+
<item>
97+
<value>23.4</value>
98+
<label>23.4</label>
99+
</item>
100+
</root>
101+
</instance>
102+
<bind nodeset="/root/sel-1/string-value" type="string"
103+
relevant="/root/select-relevance = 'yes'" />
104+
<bind nodeset="/root/sel-1/implicit-string-value" relevant="/root/select-relevance = 'yes'" />
105+
<bind nodeset="/root/sel-1/int-value" type="int" relevant="/root/select-relevance = 'yes'" />
106+
<bind nodeset="/root/sel-1/decimal-value" type="decimal"
107+
relevant="/root/select-relevance = 'yes'" />
108+
<bind nodeset="/root/sel-n/string-value" type="string"
109+
relevant="/root/select-relevance = 'yes'" />
110+
<bind nodeset="/root/sel-n/implicit-string-value" relevant="/root/select-relevance = 'yes'" />
111+
<bind nodeset="/root/sel-n/int-value" type="int" relevant="/root/select-relevance = 'yes'" />
112+
<bind nodeset="/root/sel-n/decimal-value" type="decimal"
113+
relevant="/root/select-relevance = 'yes'" />
114+
</model>
115+
</h:head>
116+
<h:body>
117+
<select1 ref="/root/select-relevance">
118+
<label>All selects relevant?</label>
119+
<item>
120+
<label>Yes</label>
121+
<value>yes</value>
122+
</item>
123+
<item>
124+
<label>No</label>
125+
<value>no</value>
126+
</item>
127+
</select1>
128+
129+
<group ref="/root/sel-1">
130+
<label>Select (1) with types</label>
131+
132+
<select1 ref="/root/sel-1/string-value">
133+
<itemset nodeset="instance('strings')/root/item">
134+
<value ref="value" />
135+
<label ref="label" />
136+
</itemset>
137+
</select1>
138+
<select1 ref="/root/sel-1/implicit-string-value">
139+
<itemset nodeset="instance('strings')/root/item">
140+
<value ref="value" />
141+
<label ref="label" />
142+
</itemset>
143+
</select1>
144+
<select1 ref="/root/sel-1/int-value">
145+
<itemset nodeset="instance('ints')/root/item">
146+
<value ref="value" />
147+
<label ref="label" />
148+
</itemset>
149+
</select1>
150+
<select1 ref="/root/sel-1/decimal-value">
151+
<itemset nodeset="instance('decimals')/root/item">
152+
<value ref="value" />
153+
<label ref="label" />
154+
</itemset>
155+
</select1>
156+
</group>
157+
158+
<group ref="/root/sel-n">
159+
<label>Select (N) with types</label>
160+
161+
<select ref="/root/sel-n/string-value">
162+
<itemset nodeset="instance('strings')/root/item[not(contains(value, ' '))]">
163+
<value ref="value" />
164+
<label ref="label" />
165+
</itemset>
166+
</select>
167+
<select ref="/root/sel-n/implicit-string-value">
168+
<itemset nodeset="instance('strings')/root/item[not(contains(value, ' '))]">
169+
<value ref="value" />
170+
<label ref="label" />
171+
</itemset>
172+
</select>
173+
<select ref="/root/sel-n/int-value">
174+
<itemset nodeset="instance('ints')/root/item">
175+
<value ref="value" />
176+
<label ref="label" />
177+
</itemset>
178+
</select>
179+
<select ref="/root/sel-n/decimal-value">
180+
<itemset nodeset="instance('decimals')/root/item">
181+
<value ref="value" />
182+
<label ref="label" />
183+
</itemset>
184+
</select>
185+
</group>
186+
</h:body>
187+
</h:html>

0 commit comments

Comments
 (0)