@@ -75,13 +67,13 @@ import {
isEnabled,
and,
categorizationHasCategory,
- uiTypeIs,
deriveLabelForUISchemaElement,
+ optionIs,
+ isCategorization,
} from '@jsonforms/core';
import type {
JsonFormsRendererRegistryEntry,
Layout,
- Category,
Categorization,
UISchemaElement,
} from '@jsonforms/core';
@@ -91,10 +83,10 @@ import {
useJsonFormsLayout,
type RendererProps,
} from '@jsonforms/vue';
-import { useTranslator, useVanillaLayout } from '../util';
+import { type CategoryItem, useTranslator, useVanillaLayout } from '../util';
const layoutRenderer = defineComponent({
- name: 'CategorizationRenderer',
+ name: 'CategorizationStepperRenderer',
components: {
DispatchRenderer,
},
@@ -103,13 +95,10 @@ const layoutRenderer = defineComponent({
},
setup(props: RendererProps
) {
const input = useVanillaLayout(useJsonFormsLayout(props));
- const isStepper = 'stepper' === input.appliedOptions?.value.variant;
- const showNavButtons =
- isStepper && !!input.appliedOptions?.value.showNavButtons;
+ const showNavButtons = !!input.appliedOptions?.value.showNavButtons;
return {
...input,
- isStepper,
showNavButtons,
ajv: createAjv(),
t: useTranslator(),
@@ -125,22 +114,16 @@ const layoutRenderer = defineComponent({
currentUischema(): UISchemaElement {
return this.categories[this.selected].element;
},
- categories(): any {
+ categories(): CategoryItem[] {
+ const { data, path } = this.layout;
return (this.layout.uischema as Categorization).elements
- .filter((category: Category | Categorization) =>
- isVisible(category, this.layout.data, this.layout.path, this.ajv)
- )
- .map((category: Category | Categorization) => {
+ .filter((category) => isVisible(category, data, path, this.ajv))
+ .map((category) => {
return {
element: category,
- isEnabled: isEnabled(
- category,
- this.layout.data,
- this.layout.path,
- this.ajv
- ),
+ isEnabled: isEnabled(category, data, path, this.ajv),
label: deriveLabelForUISchemaElement(category, this.t),
- };
+ } as CategoryItem;
});
},
},
@@ -150,8 +133,12 @@ export default layoutRenderer;
export const entry: JsonFormsRendererRegistryEntry = {
renderer: layoutRenderer,
tester: rankWith(
- 2,
- and(uiTypeIs('Categorization'), categorizationHasCategory)
+ 3,
+ and(
+ isCategorization,
+ categorizationHasCategory,
+ optionIs('variant', 'stepper')
+ )
),
};
diff --git a/packages/vue-vanilla/src/complex/index.ts b/packages/vue-vanilla/src/complex/index.ts
index 4916b88e8..5eb9262a5 100644
--- a/packages/vue-vanilla/src/complex/index.ts
+++ b/packages/vue-vanilla/src/complex/index.ts
@@ -1,16 +1,19 @@
export { default as ObjectRenderer } from './ObjectRenderer.vue';
export { default as OneOfRenderer } from './OneOfRenderer.vue';
export { default as EnumArrayRenderer } from './EnumArrayRenderer.vue';
-export { default as CategorizationRenderer } from './Categorization.vue';
+export { default as CategorizationRenderer } from './CategorizationRenderer.vue';
+export { default as CategorizationStepperRenderer } from './CategorizationStepperRenderer.vue';
import { entry as objectRendererEntry } from './ObjectRenderer.vue';
import { entry as oneOfRendererEntry } from './OneOfRenderer.vue';
import { entry as enumArrayRendererEntry } from './EnumArrayRenderer.vue';
-import { entry as categorizationEntry } from './Categorization.vue';
+import { entry as categorizationEntry } from './CategorizationRenderer.vue';
+import { entry as categorizationStepperEntry } from './CategorizationStepperRenderer.vue';
export const complexRenderers = [
objectRendererEntry,
oneOfRendererEntry,
enumArrayRendererEntry,
categorizationEntry,
+ categorizationStepperEntry,
];
diff --git a/packages/vue-vanilla/src/util/categorization.ts b/packages/vue-vanilla/src/util/categorization.ts
new file mode 100644
index 000000000..c2941b8ef
--- /dev/null
+++ b/packages/vue-vanilla/src/util/categorization.ts
@@ -0,0 +1,7 @@
+import { Categorization, Category } from '@jsonforms/core';
+
+export type CategoryItem = {
+ element: Category | Categorization;
+ isEnabled: boolean;
+ label?: string;
+};
diff --git a/packages/vue-vanilla/src/util/index.ts b/packages/vue-vanilla/src/util/index.ts
index e1d5a5963..1c7fcd421 100644
--- a/packages/vue-vanilla/src/util/index.ts
+++ b/packages/vue-vanilla/src/util/index.ts
@@ -1,2 +1,3 @@
export * from './options';
export * from './composition';
+export * from './categorization';
diff --git a/packages/vue-vanilla/tests/unit/complex/CategorizationRenderer.spec.ts b/packages/vue-vanilla/tests/unit/complex/CategorizationRenderer.spec.ts
index 7eba7a8c6..7c1bfc2e9 100644
--- a/packages/vue-vanilla/tests/unit/complex/CategorizationRenderer.spec.ts
+++ b/packages/vue-vanilla/tests/unit/complex/CategorizationRenderer.spec.ts
@@ -25,20 +25,6 @@ const uischema = {
],
};
-const uischemaStepper = {
- ...uischema,
- options: {
- variant: 'stepper',
- },
-};
-const uischemaStepperNav = {
- ...uischema,
- options: {
- variant: 'stepper',
- showNavButtons: true,
- },
-};
-
describe('CategorizationRenderer.vue', () => {
it('renders categorization', () => {
const wrapper = mountJsonForms('', schema, uischema);
@@ -56,28 +42,4 @@ describe('CategorizationRenderer.vue', () => {
const inputs = wrapper.findAll('.categorization-panel > *');
expect(inputs.length).to.equal(1);
});
-
- it('renders categorization as stepper', () => {
- const wrapper = mountJsonForms('', schema, uischemaStepper);
- expect(wrapper.find('.categorization-stepper').exists()).to.be.true;
- });
-
- it('renders 2 stepper items and one line', () => {
- const wrapper = mountJsonForms('', schema, uischemaStepper);
- const inputs = wrapper.findAll('.categorization-stepper > div');
- expect(inputs.length).to.equal(2);
- const lines = wrapper.findAll('.categorization-stepper > hr');
- expect(lines.length).to.equal(1);
- });
-
- it('renders a next button at stepper nav bar', () => {
- const wrapper = mountJsonForms('', schema, uischemaStepperNav);
- expect(
- wrapper
- .find(
- '.categorization footer.categorization-stepper-footer > div.categorization-stepper-button-next'
- )
- .exists()
- ).to.be.true;
- });
});
diff --git a/packages/vue-vanilla/tests/unit/complex/CategorizationStepperRenderer.spec.ts b/packages/vue-vanilla/tests/unit/complex/CategorizationStepperRenderer.spec.ts
new file mode 100644
index 000000000..9fd0f01ae
--- /dev/null
+++ b/packages/vue-vanilla/tests/unit/complex/CategorizationStepperRenderer.spec.ts
@@ -0,0 +1,63 @@
+import { expect } from 'chai';
+import { mountJsonForms } from '../util';
+
+const schema = {
+ type: 'string',
+};
+const uischema = {
+ type: 'Categorization',
+ elements: [
+ {
+ type: 'Category',
+ label: 'A',
+ elements: [
+ {
+ type: 'Control',
+ scope: '#',
+ },
+ ],
+ },
+ {
+ type: 'Category',
+ label: 'B',
+ elements: [],
+ },
+ ],
+ options: {
+ variant: 'stepper',
+ },
+};
+
+const uischemaNav = {
+ ...uischema,
+ options: {
+ variant: 'stepper',
+ showNavButtons: true,
+ },
+};
+
+describe('CategorizationStepperRenderer.vue', () => {
+ it('renders categorization as stepper', () => {
+ const wrapper = mountJsonForms('', schema, uischema);
+ expect(wrapper.find('.categorization-stepper').exists()).to.be.true;
+ });
+
+ it('renders 2 stepper items and one line', () => {
+ const wrapper = mountJsonForms('', schema, uischema);
+ const inputs = wrapper.findAll('.categorization-stepper > div');
+ expect(inputs.length).to.equal(2);
+ const lines = wrapper.findAll('.categorization-stepper > hr');
+ expect(lines.length).to.equal(1);
+ });
+
+ it('renders a next button at stepper nav bar', () => {
+ const wrapper = mountJsonForms('', schema, uischemaNav);
+ expect(
+ wrapper
+ .find(
+ '.categorization footer.categorization-stepper-footer > div.categorization-stepper-button-next'
+ )
+ .exists()
+ ).to.be.true;
+ });
+});