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

Allow to disable columns in confirmation modal #360

Merged
merged 4 commits into from
Mar 8, 2024
Merged
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

- Add files upload examples and fix form data header (#357)
- Add code parameters with builder and add initial request to element value changed code (#358)
- Allow to disable columns in confirmation modal (#360)

## 3.6.0 (2023-01-10)

Expand Down
107 changes: 104 additions & 3 deletions src/components/FormPanel/FormPanel.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,15 @@ import {
TEST_IDS,
} from '../../constants';
import { useDatasourceRequest } from '../../hooks';
import { ButtonOrientation, ButtonVariant, FormElement, LocalFormElement, UpdateEnabledMode } from '../../types';
import {
ButtonOrientation,
ButtonVariant,
FormElement,
LocalFormElement,
ModalColumnName,
PanelOptions,
UpdateEnabledMode,
} from '../../types';
import { getFormElementsSelectors, getPanelSelectors, toLocalFormElement } from '../../utils';
import { FormElements } from '../FormElements';
import { FormPanel } from './FormPanel';
Expand Down Expand Up @@ -1968,7 +1976,7 @@ describe('Panel', () => {
});

describe('Confirm changes', () => {
const prepareComponent = async () => {
const prepareComponent = async (options?: Partial<PanelOptions>) => {
let triggerChangeElement: (element: LocalFormElement) => void = jest.fn();
jest.mocked(FormElements).mockImplementation(({ onChangeElement }) => {
triggerChangeElement = onChangeElement;
Expand Down Expand Up @@ -2002,7 +2010,11 @@ describe('Panel', () => {
await act(async () =>
render(
getComponent({
options: { elements: [elementWithInitialValue, elementWithoutInitialValue], update: { confirm: true } },
options: {
elements: [elementWithInitialValue, elementWithoutInitialValue],
update: { confirm: true },
...options,
},
})
)
);
Expand Down Expand Up @@ -2108,6 +2120,95 @@ describe('Panel', () => {
);
expect(updatedFieldSelectors.confirmModalFieldValue()).toHaveTextContent('111');
});

it('Should show only included columns', async () => {
const { triggerChangeElement, elementWithInitialValue } = await prepareComponent({
confirmModal: {
columns: {
include: [ModalColumnName.NEW_VALUE],
},
} as any,
});

/**
* Trigger field change
*/
await act(async () =>
triggerChangeElement({
...elementWithInitialValue,
value: '111',
})
);

/**
* Check if submit button is enabled
*/
expect(selectors.buttonSubmit()).not.toBeDisabled();

/**
* Open confirm modal
*/
await act(async () => fireEvent.click(selectors.buttonSubmit()));

/**
* Check confirm modal presence
*/
expect(selectors.confirmModalContent()).toBeInTheDocument();

/**
* Check updated field presence in confirm modal
*/
const updatedField = selectors.confirmModalField(false, elementWithInitialValue.id);
expect(updatedField).toBeInTheDocument();

/**
* Check if only included columns are shown
*/
const updatedFieldSelectors = getPanelSelectors(within(updatedField));
expect(updatedFieldSelectors.confirmModalFieldTitle(true)).not.toBeInTheDocument();
expect(updatedFieldSelectors.confirmModalFieldPreviousValue(true)).not.toBeInTheDocument();
expect(updatedFieldSelectors.confirmModalFieldValue()).toBeInTheDocument();
});

it('Should not show table if no included columns', async () => {
const { triggerChangeElement, elementWithInitialValue } = await prepareComponent({
confirmModal: {
columns: {
include: [],
},
} as any,
});

/**
* Trigger field change
*/
await act(async () =>
triggerChangeElement({
...elementWithInitialValue,
value: '111',
})
);

/**
* Check if submit button is enabled
*/
expect(selectors.buttonSubmit()).not.toBeDisabled();

/**
* Open confirm modal
*/
await act(async () => fireEvent.click(selectors.buttonSubmit()));

/**
* Check confirm modal presence
*/
expect(selectors.confirmModalContent()).toBeInTheDocument();

/**
* Check no columns are show
*/
expect(selectors.confirmModalField(true, elementWithInitialValue.id)).not.toBeInTheDocument();
});
});

describe('Save default values', () => {
Expand Down
95 changes: 60 additions & 35 deletions src/components/FormPanel/FormPanel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,14 @@ import {
TEST_IDS,
} from '../../constants';
import { useDatasourceRequest, useFormElements, useMutableState } from '../../hooks';
import { ButtonVariant, FormElement, LocalFormElement, PanelOptions, UpdateEnabledMode } from '../../types';
import {
ButtonVariant,
FormElement,
LocalFormElement,
ModalColumnName,
PanelOptions,
UpdateEnabledMode,
} from '../../types';
import {
convertToElementValue,
elementValueChangedCodeParameters,
Expand Down Expand Up @@ -1078,19 +1085,25 @@ export const FormPanel: React.FC<Props> = ({
body={
<div data-testid={TEST_IDS.panel.confirmModalContent}>
<h4>{options.confirmModal.body}</h4>
{options.layout.variant !== LayoutVariant.NONE && (
{options.layout.variant !== LayoutVariant.NONE && options.confirmModal.columns.include.length > 0 && (
<table className={styles.confirmTable}>
<thead>
<tr className={styles.confirmTable}>
<td className={styles.confirmTableTd}>
<b>{options.confirmModal.columns.name}</b>
</td>
<td className={styles.confirmTableTd}>
<b>{options.confirmModal.columns.oldValue}</b>
</td>
<td className={styles.confirmTableTd}>
<b>{options.confirmModal.columns.newValue}</b>
</td>
{options.confirmModal.columns.include.includes(ModalColumnName.NAME) && (
<td className={styles.confirmTableTd}>
<b>{options.confirmModal.columns.name}</b>
</td>
)}
{options.confirmModal.columns.include.includes(ModalColumnName.OLD_VALUE) && (
<td className={styles.confirmTableTd}>
<b>{options.confirmModal.columns.oldValue}</b>
</td>
)}
{options.confirmModal.columns.include.includes(ModalColumnName.NEW_VALUE) && (
<td className={styles.confirmTableTd}>
<b>{options.confirmModal.columns.newValue}</b>
</td>
)}
</tr>
</thead>
<tbody>
Expand All @@ -1116,18 +1129,24 @@ export const FormPanel: React.FC<Props> = ({
key={element.id}
data-testid={TEST_IDS.panel.confirmModalField(element.id)}
>
<td className={styles.confirmTableTd} data-testid={TEST_IDS.panel.confirmModalFieldTitle}>
{element.title || element.tooltip}
</td>
<td
className={styles.confirmTableTd}
data-testid={TEST_IDS.panel.confirmModalFieldPreviousValue}
>
*********
</td>
<td className={styles.confirmTableTd} data-testid={TEST_IDS.panel.confirmModalFieldValue}>
*********
</td>
{options.confirmModal.columns.include.includes(ModalColumnName.NAME) && (
<td className={styles.confirmTableTd} data-testid={TEST_IDS.panel.confirmModalFieldTitle}>
{element.title || element.tooltip}
</td>
)}
{options.confirmModal.columns.include.includes(ModalColumnName.OLD_VALUE) && (
<td
className={styles.confirmTableTd}
data-testid={TEST_IDS.panel.confirmModalFieldPreviousValue}
>
*********
</td>
)}
{options.confirmModal.columns.include.includes(ModalColumnName.NEW_VALUE) && (
<td className={styles.confirmTableTd} data-testid={TEST_IDS.panel.confirmModalFieldValue}>
*********
</td>
)}
</tr>
);
}
Expand All @@ -1146,18 +1165,24 @@ export const FormPanel: React.FC<Props> = ({
key={element.id}
data-testid={TEST_IDS.panel.confirmModalField(element.id)}
>
<td className={styles.confirmTableTd} data-testid={TEST_IDS.panel.confirmModalFieldTitle}>
{element.title || element.tooltip}
</td>
<td
className={styles.confirmTableTd}
data-testid={TEST_IDS.panel.confirmModalFieldPreviousValue}
>
{initial[element.id] === undefined ? '' : String(initial[element.id])}
</td>
<td className={styles.confirmTableTd} data-testid={TEST_IDS.panel.confirmModalFieldValue}>
{currentValue === undefined ? '' : String(currentValue)}
</td>
{options.confirmModal.columns.include.includes(ModalColumnName.NAME) && (
<td className={styles.confirmTableTd} data-testid={TEST_IDS.panel.confirmModalFieldTitle}>
{element.title || element.tooltip}
</td>
)}
{options.confirmModal.columns.include.includes(ModalColumnName.OLD_VALUE) && (
<td
className={styles.confirmTableTd}
data-testid={TEST_IDS.panel.confirmModalFieldPreviousValue}
>
{initial[element.id] === undefined ? '' : String(initial[element.id])}
</td>
)}
{options.confirmModal.columns.include.includes(ModalColumnName.NEW_VALUE) && (
<td className={styles.confirmTableTd} data-testid={TEST_IDS.panel.confirmModalFieldValue}>
{currentValue === undefined ? '' : String(currentValue)}
</td>
)}
</tr>
);
})}
Expand Down
19 changes: 19 additions & 0 deletions src/constants/confirm-modal.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { ModalColumnName } from '../types';

/**
* Confirm Modal Columns Include Options
*/
export const CONFIRM_MODAL_COLUMNS_INCLUDE_OPTIONS = [
{
value: ModalColumnName.NAME,
label: 'Name',
},
{
value: ModalColumnName.OLD_VALUE,
label: 'Old Value',
},
{
value: ModalColumnName.NEW_VALUE,
label: 'New Value',
},
];
2 changes: 2 additions & 0 deletions src/constants/default.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {
CodeLanguage,
CodeOptions,
FormElement,
ModalColumnName,
ModalOptions,
NumberOptions,
SelectOptions,
Expand Down Expand Up @@ -187,6 +188,7 @@ export const CONFIRM_MODAL_DEFAULT: ModalOptions = {
title: 'Confirm update request',
body: 'Please confirm to update changed values',
columns: {
include: [ModalColumnName.NAME, ModalColumnName.OLD_VALUE, ModalColumnName.NEW_VALUE],
name: 'Label',
oldValue: 'Old Value',
newValue: 'New Value',
Expand Down
1 change: 1 addition & 0 deletions src/constants/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export * from './button';
export * from './code-editor';
export * from './confirm-modal';
export * from './data';
export * from './default';
export * from './form-element';
Expand Down
1 change: 1 addition & 0 deletions src/module.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ describe('plugin', () => {
addSelect: jest.fn().mockImplementation(() => builder),
addSliderInput: jest.fn().mockImplementation(() => builder),
addTextInput: jest.fn().mockImplementation(() => builder),
addMultiSelect: jest.fn().mockImplementation(() => builder),
};

it('Should be instance of PanelPlugin', () => {
Expand Down
19 changes: 16 additions & 3 deletions src/module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
BUTTON_SIZE_OPTIONS,
BUTTON_VARIANT_HIDDEN_OPTIONS,
BUTTON_VARIANT_OPTIONS,
CONFIRM_MODAL_COLUMNS_INCLUDE_OPTIONS,
CONFIRM_MODAL_DEFAULT,
CONTENT_TYPE_OPTIONS,
ContentType,
Expand Down Expand Up @@ -47,6 +48,7 @@
ButtonSize,
ButtonVariant,
CodeEditorType,
ModalColumnName,
PanelOptions,
RequestOptions,
UpdateEnabledMode,
Expand Down Expand Up @@ -435,26 +437,37 @@
defaultValue: CONFIRM_MODAL_DEFAULT.body,
showIf: (config) => config.update.confirm,
})
.addMultiSelect({
path: 'confirmModal.columns.include',
name: 'Include columns',
category: ['Update Confirmation Window'],
defaultValue: CONFIRM_MODAL_DEFAULT.columns.include as unknown,
showIf: (config) => config.update.confirm,

Check warning on line 445 in src/module.ts

View check run for this annotation

Codecov / codecov/patch

src/module.ts#L445

Added line #L445 was not covered by tests
settings: {
options: CONFIRM_MODAL_COLUMNS_INCLUDE_OPTIONS,
},
})
.addTextInput({
path: 'confirmModal.columns.name',
name: 'Label column',
category: ['Update Confirmation Window'],
defaultValue: CONFIRM_MODAL_DEFAULT.columns.name,
showIf: (config) => config.update.confirm,
showIf: (config) => config.update.confirm && config.confirmModal.columns.include.includes(ModalColumnName.NAME),
})
.addTextInput({
path: 'confirmModal.columns.oldValue',
name: 'Old value column',
category: ['Update Confirmation Window'],
defaultValue: CONFIRM_MODAL_DEFAULT.columns.oldValue,
showIf: (config) => config.update.confirm,
showIf: (config) =>
config.update.confirm && config.confirmModal.columns.include.includes(ModalColumnName.OLD_VALUE),
})
.addTextInput({
path: 'confirmModal.columns.newValue',
name: 'New value column',
category: ['Update Confirmation Window'],
defaultValue: CONFIRM_MODAL_DEFAULT.columns.newValue,
showIf: (config) => config.update.confirm,
showIf: (config) => config.update.confirm && config.confirmModal.columns.include.includes(ModalColumnName.NAME),
})
.addTextInput({
path: 'confirmModal.confirm',
Expand Down
Loading
Loading