Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
3caf20f
chore(vue-vuetify): upgrade vuetify to v4 and apply template codemods
darius-lesch Oct 2, 2026
e226277
test(vue-vuetify): fix brittle stepper test and update vuetify 4 snap…
darius-lesch Oct 3, 2026
cc0ea2b
Added missing component import
darius-lesch Oct 3, 2026
983bc1e
Regenerated the snapshots
darius-lesch Oct 3, 2026
2558636
fix: resolved issues raised by
darius-lesch Oct 16, 2026
673e9b8
chore: added notes for migration from Vuetify 3 to 4
darius-lesch Oct 16, 2026
f71d837
chore: remove unused ESLint plugin
darius-lesch Oct 16, 2026
d69d248
fix: revert stepper avatar unit test
darius-lesch Oct 16, 2026
4df8353
fix: updated snapshot due to failint test
darius-lesch Oct 16, 2026
be7a529
fix: cleanup component state to fix failing test due to race conditio…
darius-lesch Oct 16, 2026
1197031
chore(vue-vuetify): update typography and formatting
darius-lesch Oct 16, 2026
125fa08
fix: resolve the unintended scope creep
darius-lesch Oct 17, 2026
6a61f75
chore: strictly bump vuetify to v4 without side effects
darius-lesch Oct 17, 2026
d02840a
fix: vuetify version inconsistency
darius-lesch Oct 21, 2026
198bb2c
fix: resolved prettier fail issue
darius-lesch Oct 21, 2026
943871b
fix: resolve class inconsistency
darius-lesch Oct 21, 2026
015d9aa
update vuetify to 4.3.0, vite-plugin-vuetify to 2.1.3, regen lock file
lucas-koehler Oct 23, 2026
7ef6b1f
merge imports
lucas-koehler Oct 23, 2026
850e56d
chore: regenerated outdated snapshots
darius-lesch Oct 23, 2026
3041bd5
fix: `TypeError` in `CombinatorProperties.vue`
darius-lesch Oct 23, 2026
2d163e2
fix: remove the explicit `| null` cast
darius-lesch Oct 23, 2026
6dbcfef
chore: revert CombinatorProperties to master and rely on updated core…
darius-lesch Oct 26, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions MIGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,19 @@ If you apply custom styling that relies on the previous `Grid`-based DOM structu
Furthermore, if you use exported method `renderLayoutElements`, it no longer wraps children in `Grid` items for direction `column`.
This should not affect you except if you explicitly use this method in custom renderers.

### Vue Vuetify renderers now require Vuetify v4

The Vue Vuetify renderers (`@jsonforms/vue-vuetify`) were upgraded from Vuetify 3 to Vuetify 4. When using JSON Forms 3.9, your application now needs to provide `vuetify` in version 4.

To upgrade your application, follow the official [Vuetify upgrade guide](https://vuetifyjs.com/en/getting-started/upgrade-guide/).

Use JSON Forms 3.8 if you need to stay on Vuetify 3.

As part of this upgrade, you may notice several visible changes due to Vuetify 4's updated design specifications:
* Typography has been updated to Material Design 3 (MD3) specifications.
* The grid system is now gap-based.
* The default theme is now `system` instead of `light`.

## Migrating to JSON Forms 3.8

### `Translator` type changed from overloaded signatures to a generic conditional type
Expand Down
4 changes: 2 additions & 2 deletions packages/vue-vuetify/dev/components/ExampleAppBar.vue
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,15 @@ const appStore = useAppStore();
/>
<v-toolbar-title>
<v-container fill-height fluid
><v-row align="center" justify="center" dense>
><v-row class="align-center justify-center" density="compact">
<JsonFormsLogo width="40" height="40"></JsonFormsLogo>
<v-col>JSON Forms </v-col>
</v-row>
</v-container>
</v-toolbar-title>
<v-toolbar-items>
<v-container fill-height fluid justify-end
><v-row dense>
><v-row density="compact">
<v-col>
<v-tooltip location="bottom">
<template v-slot:activator="{ props }">
Expand Down
4 changes: 3 additions & 1 deletion packages/vue-vuetify/dev/components/ExampleDrawer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ const filteredExamples = computed(() => {
<template v-slot:prepend>
<VuetifyLogo width="40" height="40" />
</template>
<v-list-item-title class="text-h6"> Examples </v-list-item-title>
<v-list-item-title class="text-title-large">
Examples
</v-list-item-title>
<v-list-item-subtitle> Vuetify Renderers </v-list-item-subtitle>
</v-list-item>

Expand Down
12 changes: 4 additions & 8 deletions packages/vue-vuetify/dev/components/ExampleForm.vue
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,9 @@ const properties = computed<JsonFormsProps>(() => ({
<v-container v-else>
<v-row
v-if="!resolvedSchema.resolved"
class="fill-height"
align-content="center"
justify="center"
class="fill-height align-content-center justify-center"
>
<v-col class="text-subtitle-1 text-center" cols="12">
<v-col class="text-body-large text-center" cols="12">
Resolving Schema Refs
</v-col>
<v-col cols="6">
Expand All @@ -127,11 +125,9 @@ const properties = computed<JsonFormsProps>(() => ({
</v-row>
<v-row
v-else-if="resolvedSchema.error !== undefined"
class="fill-height"
align-content="center"
justify="center"
class="fill-height align-content-center justify-center"
>
<v-col class="text-subtitle-1 text-center" cols="12">
<v-col class="text-body-large text-center" cols="12">
<v-alert color="red" dark>
{{ resolvedSchema.error }}
</v-alert>
Expand Down
6 changes: 3 additions & 3 deletions packages/vue-vuetify/package.json
Comment thread
lucas-koehler marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@
"lodash": "^4.17.21",
"maska": "^2.1.11",
"vue": "^3.5.0",
"vuetify": "^3.11.0"
"vuetify": "^4.3.0"
},
"devDependencies": {
"@fortawesome/fontawesome-free": "^6.5.2",
Expand Down Expand Up @@ -114,11 +114,11 @@
"vite-plugin-dts": "^3.9.1",
"vite-plugin-node-polyfills": "^0.21.0",
"vite-plugin-static-copy": "^2.3.2",
"vite-plugin-vuetify": "^2.1.1",
"vite-plugin-vuetify": "^2.1.3",
"vitest": "^1.4.0",
"vue": "^3.5.17",
"vue-eslint-parser": "^9.4.2",
"vue-tsc": "^2.2.0",
"vuetify": "^3.12.8"
"vuetify": "^4.3.0"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -125,8 +125,7 @@
class="ma-0"
:aria-label="control.translations.downAriaLabel"
:disabled="
index >= dataLength - 1 ||
!isControlEditable(control)
index >= dataLength - 1 || !isControlEditable(control)
"
:class="styles.listWithDetail.itemMoveDown"
@click="moveDownClick($event, index)"
Expand Down Expand Up @@ -172,7 +171,9 @@
</v-list>
</v-col>
<v-col v-if="selectedIndex === undefined" class="flex-grow-1">
<span class="text-h6">{{ control.translations.noSelection }}</span>
<span class="text-title-large">{{
control.translations.noSelection
}}</span>
</v-col>
<v-col
v-else
Expand Down
2 changes: 1 addition & 1 deletion packages/vue-vuetify/src/complex/ArrayControlRenderer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
</v-card-title>
<v-card-text v-bind="vuetifyProps('v-card-text')">
<v-container justify-space-around align-content-center>
<v-row justify="center">
<v-row class="justify-center">
<v-table
class="array-container flex"
v-bind="vuetifyProps('v-table')"
Expand Down
4 changes: 2 additions & 2 deletions packages/vue-vuetify/src/complex/MixedRenderer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<v-expansion-panel-title class="py-0 px-0">
<v-container class="py-0">
<v-row>
<v-col align-self="center" class="pl-0"
<v-col class="pl-0 align-self-center"
><v-select
v-if="mixedRenderInfos"
v-disabled-icon-focus
Expand All @@ -31,7 +31,7 @@
>
</v-select
></v-col>
<v-col cols="3" align-self="center" class="text-truncate">{{
<v-col cols="3" class="text-truncate align-self-center">{{
computedLabel
}}</v-col>
</v-row>
Expand Down
2 changes: 1 addition & 1 deletion packages/vue-vuetify/src/complex/OneOfRenderer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@

<v-dialog v-model="dialog" persistent max-width="600" @keydown.esc="cancel">
<v-card>
<v-card-title class="text-h5">
<v-card-title class="text-headline-small">
{{ control.translations.clearDialogTitle }}
</v-card-title>

Expand Down
2 changes: 1 addition & 1 deletion packages/vue-vuetify/src/complex/OneOfTabRenderer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@

<v-dialog v-model="dialog" persistent max-width="600" @keydown.esc="cancel">
<v-card>
<v-card-title class="text-h5">
<v-card-title class="text-headline-small">
{{ control.translations.clearDialogTitle }}
</v-card-title>

Expand Down
15 changes: 7 additions & 8 deletions packages/vue-vuetify/src/layouts/ArrayLayoutRenderer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
align-content-center
:class="styles.arrayList.container"
>
<v-row justify="center">
<v-row class="justify-center">
<v-expansion-panels
accordion
v-bind="expansionPanelsProps"
Expand All @@ -86,7 +86,7 @@
: ''
}`"
>
<v-col v-if="!hideAvatar" align-self="center" class="pl-0">
<v-col v-if="!hideAvatar" class="pl-0 align-self-center">
<validation-badge
overlap
bordered
Expand All @@ -101,12 +101,11 @@
</v-col>

<v-col
align-self="center"
:class="`pl-0 text-truncate ${styles.arrayList.itemLabel}`"
:class="`align-self-center pl-0 text-truncate ${styles.arrayList.itemLabel}`"
>{{ childLabelForIndex(index) }}</v-col
>
<v-col
align-self="center"
class="align-self-center"
v-if="appliedOptions.showSortButtons"
>
<v-tooltip location="bottom">
Expand Down Expand Up @@ -134,7 +133,7 @@
</v-tooltip>
</v-col>
<v-col
align-self="center"
class="align-self-center"
v-if="appliedOptions.showSortButtons"
>
<v-tooltip location="bottom">
Expand Down Expand Up @@ -162,7 +161,7 @@
{{ control.translations.down }}
</v-tooltip>
</v-col>
<v-col align-self="center">
<v-col class="align-self-center">
<v-tooltip location="bottom">
<template v-slot:activator="{ props }">
<v-btn
Expand Down Expand Up @@ -237,7 +236,7 @@
@click:outside="suggestToDelete = null"
>
<v-card>
<v-card-title class="text-h5">
<v-card-title class="text-headline-small">
{{ control.translations.deleteDialogTitle }}
</v-card-title>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,11 @@ import {
VStepperActions,
VStepperHeader,
VStepperItem,
VStepperVertical,
VStepperVerticalItem,
VStepperWindow,
VStepperWindowItem,
} from 'vuetify/components';
import {
VStepperVertical,
VStepperVerticalItem,
} from 'vuetify/labs/VStepperVertical';
import { useVuetifyLayout } from '../util';

const layoutRenderer = defineComponent({
Expand Down Expand Up @@ -133,7 +131,7 @@ const layoutRenderer = defineComponent({
category,
originalIndex,
}))
.filter((e) => e.category.value.visible)
.filter((e) => e.category.value.visible),
);

watch(
Expand All @@ -142,13 +140,13 @@ const layoutRenderer = defineComponent({
if (
visibleCategories.length > 0 &&
!visibleCategories.some(
(entry) => entry.originalIndex + 1 === activeCategory.value
(entry) => entry.originalIndex + 1 === activeCategory.value,
)
) {
activeCategory.value = visibleCategories[0].originalIndex + 1;
}
},
{ immediate: true }
{ immediate: true },
);

return {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ exports[`ListWithDetailRenderer.vue > should render component and match snapshot
"<div class="v-application v-theme--light v-layout v-layout--full-height v-locale--is-ltr">
<div class="v-application__wrap">
<div data-v-7e93fcc2="" class="v-container v-locale--is-ltr list-with-detail" fill-height="">
<div data-v-7e93fcc2="" class="v-row">
<div data-v-7e93fcc2="" class="v-row v-row--density-default">
<div data-v-7e93fcc2="" class="v-col pa-0">
<header data-v-7e93fcc2="" class="v-toolbar v-toolbar--collapse-start v-toolbar--flat v-toolbar--density-default v-theme--light v-locale--is-ltr list-with-detail-toolbar">
<!---->
Expand Down Expand Up @@ -32,7 +32,7 @@ exports[`ListWithDetailRenderer.vue > should render component and match snapshot
</header>
</div>
</div>
<div data-v-7e93fcc2="" class="v-row list-with-detail-no-data">
<div data-v-7e93fcc2="" class="v-row v-row--density-default list-with-detail-no-data">
<div data-v-7e93fcc2="" class="v-col">No data</div>
</div>
</div>
Expand Down
6 changes: 6 additions & 0 deletions packages/vue-vuetify/tests/unit/complex/OneOfRenderer.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,12 @@ describe('OneOfRenderer.vue', () => {
}
});
expect(found).toBeTruthy();

// Cleanup: Close the dialog and flush pending Vuetify animations
// to prevent JSDOM from throwing an error during teardown.
wrapper.getComponent(OneOfControlRenderer).vm.cancel();
await wrapper.vm.$nextTick();
await new Promise((resolve) => requestAnimationFrame(resolve));
});

it('should render component and match snapshot', () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ exports[`ArrayControlRenderer.vue > should render component and match snapshot 1
<div data-v-4896f876="" class="v-card v-theme--light v-card--density-default elevation-0 v-card--variant-elevated array-list">
<!---->
<div class="v-card__loader">
<div class="v-progress-linear v-theme--light v-locale--is-ltr" style="top: 0px; height: 0px; --v-progress-linear-height: 2px;" role="progressbar" aria-hidden="true" aria-valuemin="0" aria-valuemax="100">
<div class="v-progress-linear v-theme--light v-locale--is-ltr" style="top: 0px; height: 0px; --v-progress-linear-height: 2px; --v-progress-reveal-duration: 900ms; --v-progress-chunk-gap: 4px;" role="progressbar" aria-hidden="true" aria-valuemin="0" aria-valuemax="100">
<!---->
<div class="v-progress-linear__background"></div>
<div class="v-progress-linear__buffer" style="width: 0%;"></div>
<!---->
<transition-stub name="fade-transition" appear="false" persisted="false" css="true">
<div class="v-progress-linear__indeterminate">
<!---->
<div class="v-progress-linear__indeterminate long"></div>
<div class="v-progress-linear__indeterminate short"></div>
</div>
Expand Down Expand Up @@ -49,11 +51,12 @@ exports[`ArrayControlRenderer.vue > should render component and match snapshot 1
</div>
<div data-v-4896f876="" class="v-card-text">
<div data-v-4896f876="" class="v-container v-locale--is-ltr" justify-space-around="" align-content-center="">
<div data-v-4896f876="" class="v-row justify-center">
<div data-v-4896f876="" class="v-table v-theme--light v-table--density-default array-container flex">
<div data-v-4896f876="" class="v-row v-row--density-default justify-center">
<div data-v-4896f876="" class="v-table v-table--gridlines-horizontal v-theme--light v-table--density-default array-container flex">
<!---->
<div class="v-table__wrapper">
<table>
<!---->
<thead data-v-4896f876="">
<tr data-v-4896f876="">
<th data-v-4896f876="" scope="col">Name</th>
Expand Down
Loading
Loading