Skip to content

Commit 9ea6b2f

Browse files
committed
create renderer for Radio Group in vue vanilla (WIP)
1 parent af9125b commit 9ea6b2f

File tree

6 files changed

+191
-0
lines changed

6 files changed

+191
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<template>
2+
<control-wrapper
3+
v-bind="controlWrapper"
4+
:styles="styles"
5+
:is-focused="isFocused"
6+
:applied-options="appliedOptions"
7+
>
8+
<RadioGroupControl
9+
:id="control.id"
10+
:options="control.options"
11+
:enabled="control.enabled"
12+
:required="control.required"
13+
:styles="styles"
14+
:on-change="onChange"
15+
/>
16+
</control-wrapper>
17+
</template>
18+
19+
<script lang="ts">
20+
import { defineComponent } from 'vue';
21+
import {
22+
and,
23+
type ControlElement,
24+
isEnumControl,
25+
type JsonFormsRendererRegistryEntry,
26+
optionIs,
27+
rankWith,
28+
} from '@jsonforms/core';
29+
import {
30+
rendererProps,
31+
type RendererProps,
32+
useJsonFormsEnumControl,
33+
} from '@jsonforms/vue';
34+
import { ControlWrapper } from '../controls';
35+
import { useVanillaControl } from '../util';
36+
import RadioGroupControl from './components/RadioGroupControl.vue';
37+
38+
const controlRenderer = defineComponent({
39+
name: 'RadioGroupControlRenderer',
40+
components: {
41+
RadioGroupControl,
42+
ControlWrapper,
43+
},
44+
props: {
45+
...rendererProps<ControlElement>(),
46+
},
47+
setup(props: RendererProps<ControlElement>) {
48+
return useVanillaControl(useJsonFormsEnumControl(props));
49+
},
50+
});
51+
52+
export default controlRenderer;
53+
54+
export const entry: JsonFormsRendererRegistryEntry = {
55+
renderer: controlRenderer,
56+
tester: rankWith(20, and(isEnumControl, optionIs('format', 'radio'))),
57+
};
58+
</script>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<template>
2+
<control-wrapper
3+
v-bind="controlWrapper"
4+
:styles="styles"
5+
:is-focused="isFocused"
6+
:applied-options="appliedOptions"
7+
>
8+
<RadioGroupControl
9+
:id="control.id"
10+
:options="control.options"
11+
:enabled="control.enabled"
12+
:required="control.required"
13+
:styles="styles"
14+
:on-change="onChange"
15+
/>
16+
</control-wrapper>
17+
</template>
18+
19+
20+
<script lang="ts">
21+
import { defineComponent } from 'vue';
22+
import {
23+
and,
24+
type ControlElement,
25+
isOneOfEnumControl,
26+
type JsonFormsRendererRegistryEntry,
27+
optionIs,
28+
rankWith,
29+
} from '@jsonforms/core';
30+
import {
31+
rendererProps,
32+
type RendererProps,
33+
useJsonFormsOneOfEnumControl,
34+
} from '@jsonforms/vue';
35+
import { ControlWrapper } from '../controls';
36+
import { useVanillaControl } from '../util';
37+
import RadioGroupControl from './components/RadioGroupControl.vue';
38+
39+
const controlRenderer = defineComponent({
40+
name: 'RadioGroupControlRenderer',
41+
components: {
42+
RadioGroupControl,
43+
ControlWrapper,
44+
},
45+
props: {
46+
...rendererProps<ControlElement>(),
47+
},
48+
setup(props: RendererProps<ControlElement>) {
49+
return useVanillaControl(useJsonFormsOneOfEnumControl(props));
50+
},
51+
});
52+
53+
export default controlRenderer;
54+
55+
export const entry: JsonFormsRendererRegistryEntry = {
56+
renderer: controlRenderer,
57+
tester: rankWith(20, and(isOneOfEnumControl, optionIs('format', 'radio'))),
58+
};
59+
</script>
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<template>
2+
<div :id="id + '-input'" :class="styles.control.radioGroup">
3+
<div
4+
v-for="option in options"
5+
:key="option.value"
6+
:class="styles.control.radioGroupItem"
7+
>
8+
<input
9+
:id="id + '.' + option.value"
10+
type="radio"
11+
:name="id"
12+
:value="option.value"
13+
:disabled="!enabled"
14+
:required="required"
15+
@change="onChange"
16+
/>
17+
18+
<label
19+
:for="id + '.' + option.value"
20+
:class="styles.control.radioGroupItemLabel"
21+
>{{ option.label }}</label
22+
>
23+
</div>
24+
</div>
25+
</template>
26+
27+
<script lang="ts">
28+
import { defineComponent, PropType } from 'vue';
29+
import { Styles } from '../../styles';
30+
31+
export default defineComponent({
32+
name: 'RadioGroupControl',
33+
props: {
34+
id: {
35+
required: true,
36+
type: String,
37+
},
38+
enabled: {
39+
required: false as const,
40+
type: Boolean,
41+
default: true,
42+
},
43+
required: {
44+
required: false as const,
45+
type: Boolean,
46+
default: false,
47+
},
48+
styles: {
49+
required: true,
50+
type: Object as PropType<Styles>,
51+
},
52+
options: {
53+
required: true,
54+
type: Array,
55+
},
56+
onChange: {
57+
required: true,
58+
type: Function,
59+
},
60+
},
61+
});
62+
</script>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
export { default as ObjectRenderer } from './ObjectRenderer.vue';
22
export { default as OneOfRenderer } from './OneOfRenderer.vue';
33
export { default as EnumArrayRenderer } from './EnumArrayRenderer.vue';
4+
export { default as RadioGroupEnumControlRenderer } from './RadioGroupEnumControlRenderer.vue';
5+
export { default as RadioGroupControlRenderer } from './RadioGroupOneOfControlRenderer.vue';
46

57
import { entry as objectRendererEntry } from './ObjectRenderer.vue';
68
import { entry as oneOfRendererEntry } from './OneOfRenderer.vue';
79
import { entry as enumArrayRendererEntry } from './EnumArrayRenderer.vue';
10+
import { entry as radioGroupEnumControlEntry } from './RadioGroupEnumControlRenderer.vue';
11+
import { entry as radioGroupOneOfControlEntry } from './RadioGroupOneOfControlRenderer.vue';
812

913
export const complexRenderers = [
1014
objectRendererEntry,
1115
oneOfRendererEntry,
1216
enumArrayRendererEntry,
17+
radioGroupEnumControlEntry,
18+
radioGroupOneOfControlEntry,
1319
];

packages/vue-vanilla/src/styles/defaultStyles.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ export const defaultStyles: Styles = {
77
label: 'label',
88
description: 'description',
99
input: 'input',
10+
radioGroup: 'radio-group',
11+
radioGroupItem: 'radio-group-item',
12+
radioGroupItemLabel: 'radio-group-item-label',
1013
error: 'error',
1114
textarea: 'text-area',
1215
select: 'select',

packages/vue-vanilla/src/styles/styles.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ export interface Styles {
2323
description?: string;
2424
error?: string;
2525
input?: string;
26+
radioGroup?: string;
27+
radioGroupItem?: string;
28+
radioGroupItemLabel?: string;
2629
textarea?: string;
2730
select?: string;
2831
option?: string;

0 commit comments

Comments
 (0)