diff --git a/packages/vue-vuetify/README.md b/packages/vue-vuetify/README.md index 6f1a2d9247..8ae9c6d561 100644 --- a/packages/vue-vuetify/README.md +++ b/packages/vue-vuetify/README.md @@ -126,6 +126,34 @@ If note done yet, please [install Vuetify for Vue](https://vuetifyjs.com/en/gett 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). +## Override the ControlWrapper component + +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, +); +``` + ## License The JSONForms project is licensed under the MIT License. See the [LICENSE file](https://github.com/eclipsesource/jsonforms/blob/master/LICENSE) for more information. diff --git a/packages/vue-vuetify/dev/App.vue b/packages/vue-vuetify/dev/App.vue index eab6fa09be..e3a9cb4964 100644 --- a/packages/vue-vuetify/dev/App.vue +++ b/packages/vue-vuetify/dev/App.vue @@ -1,5 +1,6 @@ diff --git a/packages/vue-vuetify/src/controls/components/DefaultControlWrapper.vue b/packages/vue-vuetify/src/controls/components/DefaultControlWrapper.vue new file mode 100644 index 0000000000..40358d969a --- /dev/null +++ b/packages/vue-vuetify/src/controls/components/DefaultControlWrapper.vue @@ -0,0 +1,28 @@ + + + diff --git a/packages/vue-vuetify/src/controls/components/index.ts b/packages/vue-vuetify/src/controls/components/index.ts index 87028e7c11..37f42e9682 100644 --- a/packages/vue-vuetify/src/controls/components/index.ts +++ b/packages/vue-vuetify/src/controls/components/index.ts @@ -1,2 +1,3 @@ +export { default as DefaultControlWrapper } from './DefaultControlWrapper.vue'; export { default as ValidationBadge } from './ValidationBadge.vue'; export { default as ValidationIcon } from './ValidationIcon.vue'; diff --git a/packages/vue-vuetify/src/util/inject.ts b/packages/vue-vuetify/src/util/inject.ts index ec04df9b0a..d22dad3fb1 100644 --- a/packages/vue-vuetify/src/util/inject.ts +++ b/packages/vue-vuetify/src/util/inject.ts @@ -1,5 +1,30 @@ -import type { InjectionKey } from 'vue'; +import type { DefineComponent, InjectionKey } from 'vue'; +import type { Styles } from '../styles'; +import type { useControlAppliedOptions } from './composition'; export const IsDynamicPropertyContext: InjectionKey = Symbol.for( 'jsonforms-vue-vuetify:IsDynamicPropertyContext', ); + +export type AppliedOptions = ReturnType; +export interface ControlWrapperProps { + id?: string; + description?: string; + errors?: string; + label?: string; + visible?: boolean; + required?: boolean; + isFocused?: boolean; + styles?: Styles; + appliedOptions?: AppliedOptions; +} + +export type ControlWrapperType = DefineComponent< + ControlWrapperProps, + any, + any, + any +>; + +export const ControlWrapperSymbol: InjectionKey = + Symbol.for('jsonforms-vue-vuetify:ControlWrapper'); diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap index f5bc93c5d8..7bd4b13e91 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/BooleanControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`BooleanControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap index 227943dc49..1c82a25d1a 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`DateControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
@@ -64,7 +64,7 @@ exports[`DateControlRenderer.vue > should render component and match snapshot 1` exports[`DateControlRenderer.vue > should render component and match snapshot when clicked 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap index 4f7bf6e921..63bf698e5e 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/DateTimeControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`DateTimeControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
@@ -64,7 +64,7 @@ exports[`DateTimeControlRenderer.vue > should render component and match snapsho exports[`DateTimeControlRenderer.vue > should render component and match snapshot when clicked 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap index b0f2bdeb3f..6be82fd497 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/EnumControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`EnumControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
@@ -66,7 +66,7 @@ exports[`EnumControlRenderer.vue > should render component and match snapshot 1` exports[`EnumControlRenderer.vue > should render component and match snapshot when clicked 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap index f6a2a9da7a..416cd7f3f2 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/IntegerControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`IntegerControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap index 590dc994e5..13deccdd6b 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/MultiStringControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`MultiStringControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap index ac9b3e429e..133a3e5346 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/NumberControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`NumberControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap index a67b4b0222..1e64f77c1b 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/OneOfEnumControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`OneOfEnumControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
@@ -66,7 +66,7 @@ exports[`OneOfEnumControlRenderer.vue > should render component and match snapsh exports[`OneOfEnumControlRenderer.vue > should render component and match snapshot when clicked 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap index aacafa72cf..f864eed53d 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/StringControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`StringControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
@@ -61,7 +61,7 @@ exports[`StringControlRenderer.vue > should render component and match snapshot exports[`StringControlRenderer.vue with suggestion > should render component and match snapshot 1`] = ` "
-
+
@@ -124,7 +124,7 @@ exports[`StringControlRenderer.vue with suggestion > should render component and exports[`StringControlRenderer.vue with suggestion > should render component and match snapshot when clicked 1`] = ` "
-
+
diff --git a/packages/vue-vuetify/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap b/packages/vue-vuetify/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap index 4cd26d2aba..4f1fa5fbcd 100644 --- a/packages/vue-vuetify/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap +++ b/packages/vue-vuetify/tests/unit/controls/__snapshots__/TimeControlRenderer.spec.ts.snap @@ -3,7 +3,7 @@ exports[`TimeControlRenderer.vue > should render component and match snapshot 1`] = ` "
-
+
@@ -64,7 +64,7 @@ exports[`TimeControlRenderer.vue > should render component and match snapshot 1` exports[`TimeControlRenderer.vue > should render component and match snapshot when clicked 1`] = ` "
-
+