Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[OF#5086] Fix showing soft requirement warning in hidden components #795

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
102 changes: 101 additions & 1 deletion src/formio/components/EditGrid.stories.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import {ConfigDecorator, withUtrechtDocument} from 'story-utils/decorators';
import {sleep} from 'utils';

import {mockBAGDataGet, mockBAGNoDataGet} from './AddressNL.mocks';
import {SingleFormioComponent} from './story-util';
import {MultipleFormioComponents, SingleFormioComponent} from './story-util';

const defaultNested = [
{
Expand Down Expand Up @@ -357,3 +357,103 @@ export const WithLayoutComponents = {
});
},
};

export const WithSoftRequiredComponent = {
name: 'With soft required component',
render: MultipleFormioComponents,
args: {
components: [
{
type: 'editgrid',
key: 'editgrid',
label: "Auto's",
groupLabel: 'Auto',
hidden: false,
components: [
{
type: 'file',
key: 'file',
label: 'Soft required upload',
openForms: {softRequired: true},
},
],
},

{
type: 'softRequiredErrors',
html: `
<p>Not all required fields are filled out. That can get expensive!</p>

{{ missingFields }}

<p>Are you sure you want to continue?</p>
`,
},
],
},
play: async ({canvasElement}) => {
const canvas = within(canvasElement);

// needed for formio
await sleep(100);

expect(await canvas.findByText("Auto's")).toBeVisible();

const addButton = await canvas.findByRole('button', {name: 'Add Another'});
await userEvent.click(addButton);

const saveButton = await canvas.findByRole('button', {name: 'Save'});
await userEvent.click(saveButton);

await canvas.findByText('Not all required fields are filled out. That can get expensive!');
const list = await canvas.findByRole('list', {name: 'Empty fields'});
const listItem = within(list).getByRole('listitem');
expect(listItem.textContent).toEqual('Soft required upload');
},
};

export const WithSoftRequiredComponentHiddenEditGrid = {
name: 'With soft required component hidden editgrid',
render: MultipleFormioComponents,
args: {
components: [
{
type: 'editgrid',
key: 'editgrid',
label: "Auto's",
groupLabel: 'Auto',
hidden: true,
components: [
{
type: 'file',
key: 'file',
label: 'Soft required upload',
openForms: {softRequired: true},
},
],
},

{
type: 'softRequiredErrors',
html: `
<p>Not all required fields are filled out. That can get expensive!</p>

{{ missingFields }}

<p>Are you sure you want to continue?</p>
`,
},
],
},
play: async ({canvasElement}) => {
const canvas = within(canvasElement);

// needed for formio
await sleep(100);

await expect(canvas.queryByText("Auto's")).not.toBeInTheDocument();
await expect(
canvas.queryByText('Not all required fields are filled out. That can get expensive!')
).not.toBeInTheDocument();
},
};
98 changes: 97 additions & 1 deletion src/formio/components/Fieldset.stories.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import {expect, within} from '@storybook/test';

import {withUtrechtDocument} from 'story-utils/decorators';
import {sleep} from 'utils';

import {SingleFormioComponent} from './story-util';
import {MultipleFormioComponents, SingleFormioComponent} from './story-util';

export default {
title: 'Form.io components / Vanilla / Fieldset',
Expand Down Expand Up @@ -67,3 +70,96 @@ export const Fieldset = {
hideHeader: false,
},
};

export const WithSoftRequiredComponent = {
name: 'With soft required component',
render: MultipleFormioComponents,
args: {
components: [
{
type: 'fieldset',
key: 'fieldset',
label: "Auto's",
groupLabel: 'Auto',
components: [
{
type: 'file',
key: 'file',
label: 'Soft required upload',
openForms: {softRequired: true},
},
],
},

{
type: 'softRequiredErrors',
html: `
<p>Not all required fields are filled out. That can get expensive!</p>

{{ missingFields }}

<p>Are you sure you want to continue?</p>
`,
},
],
},
play: async ({canvasElement}) => {
const canvas = within(canvasElement);

// needed for formio
await sleep(100);

expect(await canvas.findByText("Auto's")).toBeVisible();

await canvas.findByText('Not all required fields are filled out. That can get expensive!');
const list = await canvas.findByRole('list', {name: 'Empty fields'});
const listItem = within(list).getByRole('listitem');
expect(listItem.textContent).toEqual('Soft required upload');
},
};

export const WithSoftRequiredComponentHiddenParent = {
name: 'With soft required component hidden parent',
render: MultipleFormioComponents,
args: {
components: [
{
type: 'fieldset',
key: 'fieldset',
label: "Auto's",
groupLabel: 'Auto',
hidden: true,
components: [
{
type: 'file',
key: 'file',
label: 'Soft required upload',
openForms: {softRequired: true},
},
],
},

{
type: 'softRequiredErrors',
html: `
<p>Not all required fields are filled out. That can get expensive!</p>

{{ missingFields }}

<p>Are you sure you want to continue?</p>
`,
},
],
},
play: async ({canvasElement}) => {
const canvas = within(canvasElement);

// needed for formio
await sleep(100);

await expect(canvas.queryByText("Auto's")).not.toBeInTheDocument();
await expect(
canvas.queryByText('Not all required fields are filled out. That can get expensive!')
).not.toBeInTheDocument();
},
};
6 changes: 5 additions & 1 deletion src/formio/components/SoftRequiredErrors.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ class SoftRequiredErrors extends FormioContentField {
// check which components have an empty value
for (const component of softRequiredComponents) {
const isEmpty = component.isEmpty();
if (isEmpty) missingFieldLabels.push(component.label);
const isParentVisible = component.parent?.visible;
const isComponentVisible = component.visible;

if (isEmpty && isParentVisible && isComponentVisible)
missingFieldLabels.push(component.label);
}

if (!missingFieldLabels.length) return '';
Expand Down