@pie-lib/config-ui 11.30.3-next.0 → 11.30.3-next.155
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -78
- package/esm/package.json +3 -0
- package/lib/alert-dialog.js +35 -42
- package/lib/alert-dialog.js.map +1 -1
- package/lib/checkbox.js +56 -71
- package/lib/checkbox.js.map +1 -1
- package/lib/choice-configuration/feedback-menu.js +29 -64
- package/lib/choice-configuration/feedback-menu.js.map +1 -1
- package/lib/choice-configuration/index.js +202 -262
- package/lib/choice-configuration/index.js.map +1 -1
- package/lib/choice-utils.js +6 -18
- package/lib/choice-utils.js.map +1 -1
- package/lib/feedback-config/feedback-selector.js +79 -115
- package/lib/feedback-config/feedback-selector.js.map +1 -1
- package/lib/feedback-config/group.js +26 -40
- package/lib/feedback-config/group.js.map +1 -1
- package/lib/feedback-config/index.js +47 -90
- package/lib/feedback-config/index.js.map +1 -1
- package/lib/form-section.js +31 -33
- package/lib/form-section.js.map +1 -1
- package/lib/help.js +39 -80
- package/lib/help.js.map +1 -1
- package/lib/index.js +1 -31
- package/lib/index.js.map +1 -1
- package/lib/input.js +21 -54
- package/lib/input.js.map +1 -1
- package/lib/inputs.js +61 -95
- package/lib/inputs.js.map +1 -1
- package/lib/langs.js +58 -101
- package/lib/langs.js.map +1 -1
- package/lib/layout/config-layout.js +40 -70
- package/lib/layout/config-layout.js.map +1 -1
- package/lib/layout/index.js +0 -3
- package/lib/layout/index.js.map +1 -1
- package/lib/layout/layout-contents.js +72 -103
- package/lib/layout/layout-contents.js.map +1 -1
- package/lib/layout/settings-box.js +27 -56
- package/lib/layout/settings-box.js.map +1 -1
- package/lib/mui-box/index.js +41 -57
- package/lib/mui-box/index.js.map +1 -1
- package/lib/number-text-field-custom.js +79 -161
- package/lib/number-text-field-custom.js.map +1 -1
- package/lib/number-text-field.js +80 -114
- package/lib/number-text-field.js.map +1 -1
- package/lib/radio-with-label.js +30 -31
- package/lib/radio-with-label.js.map +1 -1
- package/lib/settings/display-size.js +16 -32
- package/lib/settings/display-size.js.map +1 -1
- package/lib/settings/index.js +14 -47
- package/lib/settings/index.js.map +1 -1
- package/lib/settings/panel.js +159 -229
- package/lib/settings/panel.js.map +1 -1
- package/lib/settings/settings-radio-label.js +28 -30
- package/lib/settings/settings-radio-label.js.map +1 -1
- package/lib/settings/toggle.js +35 -46
- package/lib/settings/toggle.js.map +1 -1
- package/lib/tabs/index.js +22 -57
- package/lib/tabs/index.js.map +1 -1
- package/lib/tags-input/index.js +50 -99
- package/lib/tags-input/index.js.map +1 -1
- package/lib/two-choice.js +46 -90
- package/lib/two-choice.js.map +1 -1
- package/lib/with-stateful-model.js +8 -31
- package/lib/with-stateful-model.js.map +1 -1
- package/package.json +20 -12
- package/src/__tests__/alert-dialog.test.jsx +283 -0
- package/src/__tests__/checkbox.test.jsx +249 -0
- package/src/__tests__/form-section.test.jsx +334 -0
- package/src/__tests__/help.test.jsx +184 -0
- package/src/__tests__/input.test.jsx +192 -0
- package/src/__tests__/langs.test.jsx +435 -15
- package/src/__tests__/number-text-field-custom.test.jsx +438 -0
- package/src/__tests__/number-text-field.test.jsx +295 -102
- package/src/__tests__/radio-with-label.test.jsx +259 -0
- package/src/__tests__/settings-panel.test.js +66 -83
- package/src/__tests__/settings.test.jsx +515 -0
- package/src/__tests__/tabs.test.jsx +193 -0
- package/src/__tests__/two-choice.test.js +104 -18
- package/src/__tests__/with-stateful-model.test.jsx +145 -0
- package/src/alert-dialog.jsx +21 -19
- package/src/checkbox.jsx +42 -46
- package/src/choice-configuration/__tests__/feedback-menu.test.jsx +157 -4
- package/src/choice-configuration/__tests__/index.test.jsx +198 -56
- package/src/choice-configuration/feedback-menu.jsx +6 -6
- package/src/choice-configuration/index.jsx +201 -196
- package/src/feedback-config/__tests__/feedback-config.test.jsx +130 -60
- package/src/feedback-config/__tests__/feedback-selector.test.jsx +87 -40
- package/src/feedback-config/feedback-selector.jsx +52 -53
- package/src/feedback-config/group.jsx +21 -22
- package/src/feedback-config/index.jsx +27 -29
- package/src/form-section.jsx +26 -18
- package/src/help.jsx +20 -28
- package/src/input.jsx +1 -1
- package/src/inputs.jsx +34 -50
- package/src/langs.jsx +41 -46
- package/src/layout/__tests__/config.layout.test.jsx +55 -38
- package/src/layout/config-layout.jsx +38 -32
- package/src/layout/layout-contents.jsx +38 -39
- package/src/layout/settings-box.jsx +16 -19
- package/src/mui-box/index.jsx +35 -43
- package/src/number-text-field-custom.jsx +30 -36
- package/src/number-text-field.jsx +45 -29
- package/src/radio-with-label.jsx +25 -13
- package/src/settings/display-size.jsx +12 -11
- package/src/settings/panel.jsx +97 -91
- package/src/settings/settings-radio-label.jsx +25 -13
- package/src/settings/toggle.jsx +30 -29
- package/src/tabs/index.jsx +8 -8
- package/src/tags-input/__tests__/index.test.jsx +88 -37
- package/src/tags-input/index.jsx +35 -38
- package/src/two-choice.jsx +15 -19
- package/src/__tests__/__snapshots__/langs.test.jsx.snap +0 -32
- package/src/__tests__/__snapshots__/settings-panel.test.js.snap +0 -115
- package/src/__tests__/__snapshots__/two-choice.test.js.snap +0 -171
- package/src/choice-configuration/__tests__/__snapshots__/feedback-menu.test.jsx.snap +0 -51
- package/src/choice-configuration/__tests__/__snapshots__/index.test.jsx.snap +0 -519
- package/src/feedback-config/__tests__/__snapshots__/feedback-config.test.jsx.snap +0 -27
- package/src/feedback-config/__tests__/__snapshots__/feedback-selector.test.jsx.snap +0 -38
- package/src/layout/__tests__/__snapshots__/config.layout.test.jsx.snap +0 -59
- package/src/tags-input/__tests__/__snapshots__/index.test.jsx.snap +0 -170
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { render, screen } from '@testing-library/react';
|
|
3
|
+
import userEvent from '@testing-library/user-event';
|
|
2
4
|
import { ChoiceConfiguration } from '../index';
|
|
3
|
-
import renderer from 'react-test-renderer';
|
|
4
|
-
import { shallow } from 'enzyme';
|
|
5
|
-
import Enzyme from 'enzyme';
|
|
6
|
-
import Adapter from 'enzyme-adapter-react-16';
|
|
7
5
|
|
|
8
|
-
jest.mock('@pie-lib/editable-html', () => (
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
jest.mock('@pie-lib/editable-html', () => ({
|
|
7
|
+
__esModule: true,
|
|
8
|
+
default: ({ markup, onChange, disabled }) => (
|
|
9
|
+
<textarea
|
|
10
|
+
data-testid="editable-html"
|
|
11
|
+
defaultValue={markup || ''}
|
|
12
|
+
onChange={(e) => onChange(e.target.value)}
|
|
13
|
+
disabled={disabled}
|
|
14
|
+
/>
|
|
15
|
+
),
|
|
16
|
+
}));
|
|
11
17
|
|
|
12
18
|
const defaultFeedback = {
|
|
13
19
|
correct: 'Correct',
|
|
@@ -15,7 +21,7 @@ const defaultFeedback = {
|
|
|
15
21
|
};
|
|
16
22
|
|
|
17
23
|
const data = {
|
|
18
|
-
|
|
24
|
+
correct: true,
|
|
19
25
|
value: 'foo',
|
|
20
26
|
label: 'Foo',
|
|
21
27
|
feedback: {
|
|
@@ -27,66 +33,202 @@ const classes = {
|
|
|
27
33
|
choiceConfiguration: 'choiceConfiguration',
|
|
28
34
|
};
|
|
29
35
|
|
|
30
|
-
describe('
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
expect(tree).toMatchSnapshot();
|
|
36
|
-
});
|
|
37
|
-
it('renders correctly when feedback is not allowed', () => {
|
|
38
|
-
const tree = renderer
|
|
39
|
-
.create(
|
|
40
|
-
<ChoiceConfiguration allowFeedBack={false} classes={classes} defaultFeedback={defaultFeedback} data={data} />,
|
|
41
|
-
)
|
|
42
|
-
.toJSON();
|
|
43
|
-
expect(tree).toMatchSnapshot();
|
|
44
|
-
});
|
|
45
|
-
it('renders correctly when delete is not allowed', () => {
|
|
46
|
-
const tree = renderer
|
|
47
|
-
.create(
|
|
48
|
-
<ChoiceConfiguration allowDelete={false} classes={classes} defaultFeedback={defaultFeedback} data={data} />,
|
|
49
|
-
)
|
|
50
|
-
.toJSON();
|
|
51
|
-
expect(tree).toMatchSnapshot();
|
|
36
|
+
describe('ChoiceConfiguration', () => {
|
|
37
|
+
const onChange = jest.fn();
|
|
38
|
+
|
|
39
|
+
beforeEach(() => {
|
|
40
|
+
onChange.mockClear();
|
|
52
41
|
});
|
|
53
|
-
});
|
|
54
42
|
|
|
55
|
-
describe('
|
|
56
|
-
|
|
43
|
+
describe('rendering', () => {
|
|
44
|
+
it('renders correctly with default props', () => {
|
|
45
|
+
const { container } = render(
|
|
46
|
+
<ChoiceConfiguration classes={classes} defaultFeedback={defaultFeedback} data={data} onChange={onChange} />,
|
|
47
|
+
);
|
|
48
|
+
expect(container.firstChild).toBeInTheDocument();
|
|
49
|
+
});
|
|
57
50
|
|
|
58
|
-
|
|
59
|
-
|
|
51
|
+
it('renders with checked state', () => {
|
|
52
|
+
render(
|
|
53
|
+
<ChoiceConfiguration
|
|
54
|
+
classes={classes}
|
|
55
|
+
defaultFeedback={defaultFeedback}
|
|
56
|
+
data={data}
|
|
57
|
+
onChange={onChange}
|
|
58
|
+
mode="checkbox"
|
|
59
|
+
/>,
|
|
60
|
+
);
|
|
61
|
+
const checkbox = screen.getByRole('checkbox');
|
|
62
|
+
expect(checkbox).toBeChecked();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('renders without feedback when allowFeedBack is false', () => {
|
|
66
|
+
render(
|
|
67
|
+
<ChoiceConfiguration
|
|
68
|
+
allowFeedBack={false}
|
|
69
|
+
classes={classes}
|
|
70
|
+
defaultFeedback={defaultFeedback}
|
|
71
|
+
data={data}
|
|
72
|
+
onChange={onChange}
|
|
73
|
+
/>,
|
|
74
|
+
);
|
|
75
|
+
expect(screen.queryByRole('button', { name: /feedback/i })).not.toBeInTheDocument();
|
|
76
|
+
});
|
|
60
77
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
78
|
+
it('renders without delete button when allowDelete is false', () => {
|
|
79
|
+
render(
|
|
80
|
+
<ChoiceConfiguration
|
|
81
|
+
allowDelete={false}
|
|
82
|
+
classes={classes}
|
|
83
|
+
defaultFeedback={defaultFeedback}
|
|
84
|
+
data={data}
|
|
85
|
+
onChange={onChange}
|
|
86
|
+
/>,
|
|
87
|
+
);
|
|
88
|
+
expect(screen.queryByRole('button', { name: /delete/i })).not.toBeInTheDocument();
|
|
89
|
+
});
|
|
65
90
|
});
|
|
66
91
|
|
|
67
|
-
describe('
|
|
68
|
-
it('calls onChange', () => {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
92
|
+
describe('user interactions', () => {
|
|
93
|
+
it('calls onChange when label is edited', async () => {
|
|
94
|
+
const user = userEvent.setup();
|
|
95
|
+
render(
|
|
96
|
+
<ChoiceConfiguration classes={classes} defaultFeedback={defaultFeedback} data={data} onChange={onChange} />,
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
const editableHtmlElements = screen.getAllByTestId('editable-html');
|
|
100
|
+
const editableHtml = editableHtmlElements[0];
|
|
101
|
+
await user.clear(editableHtml);
|
|
102
|
+
await user.type(editableHtml, 'new label');
|
|
103
|
+
|
|
104
|
+
expect(onChange).toHaveBeenCalled();
|
|
105
|
+
expect(onChange).toHaveBeenCalledWith(
|
|
106
|
+
expect.objectContaining({
|
|
107
|
+
label: expect.stringContaining('new label'),
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it('calls onChange when checkbox is toggled', async () => {
|
|
113
|
+
const user = userEvent.setup();
|
|
114
|
+
render(
|
|
115
|
+
<ChoiceConfiguration
|
|
116
|
+
classes={classes}
|
|
117
|
+
defaultFeedback={defaultFeedback}
|
|
118
|
+
data={{ ...data, correct: false }}
|
|
119
|
+
onChange={onChange}
|
|
120
|
+
mode="checkbox"
|
|
121
|
+
/>,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
const checkbox = screen.getByRole('checkbox');
|
|
125
|
+
await user.click(checkbox);
|
|
126
|
+
|
|
127
|
+
expect(onChange).toHaveBeenCalledWith(
|
|
128
|
+
expect.objectContaining({
|
|
129
|
+
correct: true,
|
|
130
|
+
}),
|
|
131
|
+
);
|
|
72
132
|
});
|
|
73
133
|
});
|
|
74
134
|
|
|
75
|
-
describe('
|
|
76
|
-
it('
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
135
|
+
describe('prop variations', () => {
|
|
136
|
+
it('renders with radio mode instead of checkbox', () => {
|
|
137
|
+
render(
|
|
138
|
+
<ChoiceConfiguration
|
|
139
|
+
classes={classes}
|
|
140
|
+
defaultFeedback={defaultFeedback}
|
|
141
|
+
data={data}
|
|
142
|
+
onChange={onChange}
|
|
143
|
+
mode="radio"
|
|
144
|
+
/>,
|
|
145
|
+
);
|
|
146
|
+
const radio = screen.getByRole('radio');
|
|
147
|
+
expect(radio).toBeInTheDocument();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('renders with disabled state', () => {
|
|
151
|
+
render(
|
|
152
|
+
<ChoiceConfiguration
|
|
153
|
+
classes={classes}
|
|
154
|
+
defaultFeedback={defaultFeedback}
|
|
155
|
+
data={data}
|
|
156
|
+
onChange={onChange}
|
|
157
|
+
disabled={true}
|
|
158
|
+
mode="checkbox"
|
|
159
|
+
/>,
|
|
160
|
+
);
|
|
161
|
+
const checkbox = screen.getByRole('checkbox');
|
|
162
|
+
expect(checkbox).toBeInTheDocument();
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('renders with custom feedback type', () => {
|
|
166
|
+
render(
|
|
167
|
+
<ChoiceConfiguration
|
|
168
|
+
classes={classes}
|
|
169
|
+
defaultFeedback={defaultFeedback}
|
|
170
|
+
data={{ ...data, feedback: { type: 'custom' } }}
|
|
171
|
+
onChange={onChange}
|
|
172
|
+
mode="checkbox"
|
|
173
|
+
/>,
|
|
174
|
+
);
|
|
175
|
+
const editableElements = screen.getAllByTestId('editable-html');
|
|
176
|
+
expect(editableElements.length).toBeGreaterThan(0);
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
it('renders with incorrect answer', () => {
|
|
180
|
+
render(
|
|
181
|
+
<ChoiceConfiguration
|
|
182
|
+
classes={classes}
|
|
183
|
+
defaultFeedback={defaultFeedback}
|
|
184
|
+
data={{ ...data, correct: false }}
|
|
185
|
+
onChange={onChange}
|
|
186
|
+
mode="checkbox"
|
|
187
|
+
/>,
|
|
188
|
+
);
|
|
189
|
+
const checkbox = screen.getByRole('checkbox');
|
|
190
|
+
expect(checkbox).not.toBeChecked();
|
|
81
191
|
});
|
|
82
192
|
});
|
|
83
193
|
|
|
84
|
-
describe('
|
|
85
|
-
it('
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
194
|
+
describe('edge cases', () => {
|
|
195
|
+
it('handles data with empty label', () => {
|
|
196
|
+
render(
|
|
197
|
+
<ChoiceConfiguration
|
|
198
|
+
classes={classes}
|
|
199
|
+
defaultFeedback={defaultFeedback}
|
|
200
|
+
data={{ ...data, label: '' }}
|
|
201
|
+
onChange={onChange}
|
|
202
|
+
/>,
|
|
203
|
+
);
|
|
204
|
+
const editableElements = screen.getAllByTestId('editable-html');
|
|
205
|
+
expect(editableElements.length).toBeGreaterThan(0);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it('handles multiple feedback types', () => {
|
|
209
|
+
const { rerender } = render(
|
|
210
|
+
<ChoiceConfiguration
|
|
211
|
+
classes={classes}
|
|
212
|
+
defaultFeedback={defaultFeedback}
|
|
213
|
+
data={{ ...data, feedback: { type: 'default' } }}
|
|
214
|
+
onChange={onChange}
|
|
215
|
+
/>,
|
|
216
|
+
);
|
|
217
|
+
|
|
218
|
+
let editableElements = screen.getAllByTestId('editable-html');
|
|
219
|
+
expect(editableElements.length).toBeGreaterThan(0);
|
|
220
|
+
|
|
221
|
+
rerender(
|
|
222
|
+
<ChoiceConfiguration
|
|
223
|
+
classes={classes}
|
|
224
|
+
defaultFeedback={defaultFeedback}
|
|
225
|
+
data={{ ...data, feedback: { type: 'custom' } }}
|
|
226
|
+
onChange={onChange}
|
|
227
|
+
/>,
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
editableElements = screen.getAllByTestId('editable-html');
|
|
231
|
+
expect(editableElements.length).toBeGreaterThan(0);
|
|
90
232
|
});
|
|
91
233
|
});
|
|
92
234
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import Menu from '@material
|
|
2
|
-
import MenuItem from '@material
|
|
3
|
-
import ActionFeedback from '@
|
|
4
|
-
import IconButton from '@material
|
|
1
|
+
import Menu from '@mui/material/Menu';
|
|
2
|
+
import MenuItem from '@mui/material/MenuItem';
|
|
3
|
+
import ActionFeedback from '@mui/icons-material/Feedback';
|
|
4
|
+
import IconButton from '@mui/material/IconButton';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import React from 'react';
|
|
7
7
|
|
|
@@ -40,7 +40,7 @@ export class IconMenu extends React.Component {
|
|
|
40
40
|
return (
|
|
41
41
|
<div>
|
|
42
42
|
<div onClick={this.handleClick}>{this.props.iconButtonElement}</div>
|
|
43
|
-
<Menu id="simple-menu" anchorEl={this.state.anchorEl} open={this.state.open} onClose={this.handleRequestClose}>
|
|
43
|
+
<Menu id="simple-menu" anchorEl={this.state.anchorEl} open={this.state.open} onClose={this.handleRequestClose} transitionDuration={{ enter: 225, exit: 195 }}>
|
|
44
44
|
{keys.map((k, index) => (
|
|
45
45
|
<MenuItem key={index} onClick={handleMenuClick(k)}>
|
|
46
46
|
{opts[k]}
|
|
@@ -70,7 +70,7 @@ export default class FeedbackMenu extends React.Component {
|
|
|
70
70
|
const tooltip = t === 'custom' ? 'Custom Feedback' : t === 'default' ? 'Default Feedback' : 'Feedback disabled';
|
|
71
71
|
|
|
72
72
|
const icon = (
|
|
73
|
-
<IconButton className={classes.icon} aria-label={tooltip}>
|
|
73
|
+
<IconButton className={classes.icon} aria-label={tooltip} size="large">
|
|
74
74
|
<ActionFeedback color={iconColor} />
|
|
75
75
|
</IconButton>
|
|
76
76
|
);
|