@jsonforms/vue-vuetify
Version:
Vue Vuetify renderers for JSON Forms
180 lines (135 loc) • 4.74 kB
Markdown
_Complex Forms in the blink of an eye_
JSON Forms eliminates the tedious task of writing fully-featured forms by hand by leveraging the capabilities of JSON, JSON Schema and Javascript.
This is the JSON Forms Vue Vuetify renderers package which provides a Vuetify based renderer set for [JSON Forms Vue](https://github.com/eclipsesource/jsonforms/blob/master/packages/vue).
The renderers are in a preview state.
Install JSON Forms Core, Vue 3 and Vue 3 Vuetify Renderers.
```bash
npm i --save @jsonforms/core @jsonforms/vue @jsonforms/vue-vuetify
```
Also add the packages to the transpile dependencies in the `vite.config.js` file:
```js
// https://vitejs.dev/config/
export default defineConfig({
optimizeDeps: {
// Exclude vuetify since it has an issue with vite dev - TypeError: makeVExpansionPanelTextProps is not a function - the makeVExpansionPanelTextProps is used before it is defined
exclude: ['vuetify'],
},
// more config....
});
```
Use the `json-forms` component for each form you want to render and hand over the renderer set.
```vue
<script>
import { JsonForms } from '@jsonforms/vue';
import { extendedVuetifyRenderers } from '@jsonforms/vue-vuetify';
import { markRaw } from 'vue';
const renderers = markRaw([
...extendedVuetifyRenderers,
// here you can add custom renderers
]);
export default defineComponent({
name: 'app',
components: {
JsonForms,
},
data() {
return {
renderers: Object.freeze(renderers),
data,
schema,
uischema,
};
},
methods: {
onChange(event) {
this.data = event.data;
},
},
});
</script>
<template>
<json-forms
:data="data"
:schema="schema"
:uischema="uischema"
:renderers="renderers"
@change="onChange"
/>
</template>
<style>
@import '@jsonforms/vue-vuetify/lib/jsonforms-vue-vuetify.css';
</style>
```
In your vuetify creation specify the icons used
Material Design Icons (mdi)
```js
import { mdi, aliases as mdiAliases } from 'vuetify/iconsets/mdi';
import { createVuetify } from 'vuetify';
import { mdiIconAliases } from '@jsonforms/vue-vuetify';
import '@mdi/font/css/materialdesignicons.css';
createVuetify({
icons: {
defaultSet: 'mdi',
sets: {
mdi,
},
aliases: { ...mdiAliases, ...mdiIconAliases };,
},
});
```
Font Awesome (fa)
```js
import { fa, aliases as faAliases } from 'vuetify/iconsets/fa';
import { createVuetify } from 'vuetify';
import { faIconAliases } from '@jsonforms/vue-vuetify';
import '@fortawesome/fontawesome-free/css/all.css';
createVuetify({
icons: {
defaultSet: 'fa',
sets: {
fa,
},
aliases: { ...faAliases, ...faIconAliases };,
},
});
```
If note done yet, please [install Vuetify for Vue](https://vuetifyjs.com/en/getting-started/installation/).
For more information on how JSON Forms can be configured, please see the [README of `@jsonforms/vue`](https://github.com/eclipsesource/jsonforms/blob/master/packages/vue/README.md).
All control renderers now support `prepend` and `append` slots, allowing you to add custom content before or after input fields without creating entirely custom renderers.
**Example:**
```vue
<template>
<string-control-renderer v-bind="$props">
<template
<v-icon>mdi-help-circle</v-icon>
</template>
</string-control-renderer>
</template>
```
See the "Prepend/Append Slots (Basic)" example in the dev app.
All control renderers wrap their components with a **`ControlWrapper`** component, which by default uses **`DefaultControlWrapper`** to render the wrapper element around each control.
If you want to:
- Replace the **`DefaultControlWrapper`** with your own implementation, or
- Provide custom renderers that render their child controls differently,
you can use Vue’s **`provide` / `inject` mechanism** to supply your own wrapper under the **`ControlWrapperSymbol`**.
For example, the demo application includes a custom wrapper that can be enabled from the **Example App Settings**. It is registered like this:
```ts
import { provide, type DefineComponent } from 'vue';
import {
ControlWrapperSymbol,
type ControlWrapperProps,
} from '@jsonforms/vue-vuetify';
import ControlWrapper from './components/ControlWrapper.vue';
provide(
ControlWrapperSymbol,
ControlWrapper as DefineComponent<ControlWrapperProps>,
);
```
The JSONForms project is licensed under the MIT License. See the [LICENSE file](https://github.com/eclipsesource/jsonforms/blob/master/LICENSE) for more information.