@pie-lib/config-ui 11.30.3-next.2 → 11.30.4-next.0

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.
Files changed (145) hide show
  1. package/CHANGELOG.md +7 -78
  2. package/lib/__tests__/alert-dialog.test.js +262 -0
  3. package/lib/__tests__/checkbox.test.js +227 -0
  4. package/lib/__tests__/choice-utils.test.js +14 -0
  5. package/lib/__tests__/form-section.test.js +252 -0
  6. package/lib/__tests__/help.test.js +270 -0
  7. package/lib/__tests__/input.test.js +268 -0
  8. package/lib/__tests__/langs.test.js +541 -0
  9. package/lib/__tests__/number-text-field-custom.test.js +362 -0
  10. package/lib/__tests__/number-text-field.test.js +421 -0
  11. package/lib/__tests__/radio-with-label.test.js +233 -0
  12. package/lib/__tests__/settings-panel.test.js +184 -0
  13. package/lib/__tests__/settings.test.js +653 -0
  14. package/lib/__tests__/tabs.test.js +211 -0
  15. package/lib/__tests__/two-choice.test.js +124 -0
  16. package/lib/__tests__/with-stateful-model.test.js +221 -0
  17. package/lib/alert-dialog.js +36 -43
  18. package/lib/alert-dialog.js.map +1 -1
  19. package/lib/checkbox.js +57 -72
  20. package/lib/checkbox.js.map +1 -1
  21. package/lib/choice-configuration/__tests__/feedback-menu.test.js +287 -0
  22. package/lib/choice-configuration/__tests__/index.test.js +253 -0
  23. package/lib/choice-configuration/feedback-menu.js +30 -65
  24. package/lib/choice-configuration/feedback-menu.js.map +1 -1
  25. package/lib/choice-configuration/index.js +203 -263
  26. package/lib/choice-configuration/index.js.map +1 -1
  27. package/lib/choice-utils.js +7 -19
  28. package/lib/choice-utils.js.map +1 -1
  29. package/lib/feedback-config/__tests__/feedback-config.test.js +201 -0
  30. package/lib/feedback-config/__tests__/feedback-selector.test.js +177 -0
  31. package/lib/feedback-config/feedback-selector.js +80 -116
  32. package/lib/feedback-config/feedback-selector.js.map +1 -1
  33. package/lib/feedback-config/group.js +27 -41
  34. package/lib/feedback-config/group.js.map +1 -1
  35. package/lib/feedback-config/index.js +48 -91
  36. package/lib/feedback-config/index.js.map +1 -1
  37. package/lib/form-section.js +32 -34
  38. package/lib/form-section.js.map +1 -1
  39. package/lib/help.js +40 -81
  40. package/lib/help.js.map +1 -1
  41. package/lib/index.js +2 -32
  42. package/lib/index.js.map +1 -1
  43. package/lib/input.js +22 -55
  44. package/lib/input.js.map +1 -1
  45. package/lib/inputs.js +62 -96
  46. package/lib/inputs.js.map +1 -1
  47. package/lib/langs.js +59 -102
  48. package/lib/langs.js.map +1 -1
  49. package/lib/layout/__tests__/config.layout.test.js +70 -0
  50. package/lib/layout/__tests__/layout-content.test.js +6 -0
  51. package/lib/layout/config-layout.js +41 -71
  52. package/lib/layout/config-layout.js.map +1 -1
  53. package/lib/layout/index.js +1 -4
  54. package/lib/layout/index.js.map +1 -1
  55. package/lib/layout/layout-contents.js +73 -104
  56. package/lib/layout/layout-contents.js.map +1 -1
  57. package/lib/layout/settings-box.js +28 -57
  58. package/lib/layout/settings-box.js.map +1 -1
  59. package/lib/mui-box/index.js +42 -58
  60. package/lib/mui-box/index.js.map +1 -1
  61. package/lib/number-text-field-custom.js +80 -162
  62. package/lib/number-text-field-custom.js.map +1 -1
  63. package/lib/number-text-field.js +81 -115
  64. package/lib/number-text-field.js.map +1 -1
  65. package/lib/radio-with-label.js +31 -32
  66. package/lib/radio-with-label.js.map +1 -1
  67. package/lib/settings/display-size.js +17 -33
  68. package/lib/settings/display-size.js.map +1 -1
  69. package/lib/settings/index.js +15 -48
  70. package/lib/settings/index.js.map +1 -1
  71. package/lib/settings/panel.js +160 -230
  72. package/lib/settings/panel.js.map +1 -1
  73. package/lib/settings/settings-radio-label.js +29 -31
  74. package/lib/settings/settings-radio-label.js.map +1 -1
  75. package/lib/settings/toggle.js +36 -47
  76. package/lib/settings/toggle.js.map +1 -1
  77. package/lib/tabs/index.js +23 -58
  78. package/lib/tabs/index.js.map +1 -1
  79. package/lib/tags-input/__tests__/index.test.js +183 -0
  80. package/lib/tags-input/index.js +51 -100
  81. package/lib/tags-input/index.js.map +1 -1
  82. package/lib/two-choice.js +47 -91
  83. package/lib/two-choice.js.map +1 -1
  84. package/lib/with-stateful-model.js +9 -32
  85. package/lib/with-stateful-model.js.map +1 -1
  86. package/package.json +12 -20
  87. package/src/__tests__/alert-dialog.test.jsx +283 -0
  88. package/src/__tests__/checkbox.test.jsx +249 -0
  89. package/src/__tests__/form-section.test.jsx +334 -0
  90. package/src/__tests__/help.test.jsx +184 -0
  91. package/src/__tests__/input.test.jsx +192 -0
  92. package/src/__tests__/langs.test.jsx +435 -15
  93. package/src/__tests__/number-text-field-custom.test.jsx +438 -0
  94. package/src/__tests__/number-text-field.test.jsx +295 -102
  95. package/src/__tests__/radio-with-label.test.jsx +259 -0
  96. package/src/__tests__/settings-panel.test.js +66 -83
  97. package/src/__tests__/settings.test.jsx +515 -0
  98. package/src/__tests__/tabs.test.jsx +193 -0
  99. package/src/__tests__/two-choice.test.js +104 -18
  100. package/src/__tests__/with-stateful-model.test.jsx +145 -0
  101. package/src/alert-dialog.jsx +21 -19
  102. package/src/checkbox.jsx +42 -46
  103. package/src/choice-configuration/__tests__/feedback-menu.test.jsx +157 -4
  104. package/src/choice-configuration/__tests__/index.test.jsx +198 -56
  105. package/src/choice-configuration/feedback-menu.jsx +6 -6
  106. package/src/choice-configuration/index.jsx +201 -196
  107. package/src/feedback-config/__tests__/feedback-config.test.jsx +130 -60
  108. package/src/feedback-config/__tests__/feedback-selector.test.jsx +87 -40
  109. package/src/feedback-config/feedback-selector.jsx +52 -53
  110. package/src/feedback-config/group.jsx +21 -22
  111. package/src/feedback-config/index.jsx +27 -29
  112. package/src/form-section.jsx +26 -18
  113. package/src/help.jsx +20 -28
  114. package/src/input.jsx +1 -1
  115. package/src/inputs.jsx +34 -50
  116. package/src/langs.jsx +41 -46
  117. package/src/layout/__tests__/config.layout.test.jsx +55 -38
  118. package/src/layout/config-layout.jsx +38 -32
  119. package/src/layout/layout-contents.jsx +38 -39
  120. package/src/layout/settings-box.jsx +16 -19
  121. package/src/mui-box/index.jsx +35 -43
  122. package/src/number-text-field-custom.jsx +30 -36
  123. package/src/number-text-field.jsx +45 -29
  124. package/src/radio-with-label.jsx +25 -13
  125. package/src/settings/display-size.jsx +12 -11
  126. package/src/settings/panel.jsx +97 -91
  127. package/src/settings/settings-radio-label.jsx +25 -13
  128. package/src/settings/toggle.jsx +30 -29
  129. package/src/tabs/index.jsx +8 -8
  130. package/src/tags-input/__tests__/index.test.jsx +88 -37
  131. package/src/tags-input/index.jsx +35 -38
  132. package/src/two-choice.jsx +15 -19
  133. package/esm/index.css +0 -847
  134. package/esm/index.js +0 -213950
  135. package/esm/index.js.map +0 -1
  136. package/esm/package.json +0 -3
  137. package/src/__tests__/__snapshots__/langs.test.jsx.snap +0 -32
  138. package/src/__tests__/__snapshots__/settings-panel.test.js.snap +0 -115
  139. package/src/__tests__/__snapshots__/two-choice.test.js.snap +0 -171
  140. package/src/choice-configuration/__tests__/__snapshots__/feedback-menu.test.jsx.snap +0 -51
  141. package/src/choice-configuration/__tests__/__snapshots__/index.test.jsx.snap +0 -519
  142. package/src/feedback-config/__tests__/__snapshots__/feedback-config.test.jsx.snap +0 -27
  143. package/src/feedback-config/__tests__/__snapshots__/feedback-selector.test.jsx.snap +0 -38
  144. package/src/layout/__tests__/__snapshots__/config.layout.test.jsx.snap +0 -59
  145. 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', () => () => <div />);
9
-
10
- Enzyme.configure({ adapter: new Adapter() });
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
- checked: true,
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('index - snapshot', () => {
31
- it('renders correctly with default props', () => {
32
- const tree = renderer
33
- .create(<ChoiceConfiguration classes={classes} defaultFeedback={defaultFeedback} data={data} />)
34
- .toJSON();
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('index - logic', () => {
56
- let wrapper, instance, onChange;
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
- beforeEach(() => {
59
- onChange = jest.fn();
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
- wrapper = shallow(
62
- <ChoiceConfiguration classes={classes} defaultFeedback={defaultFeedback} data={data} onChange={onChange} />,
63
- );
64
- instance = wrapper.instance();
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('onCheckedChange', () => {
68
- it('calls onChange', () => {
69
- instance.onLabelChange('new label');
70
- expect(onChange.mock.calls.length).toBe(1);
71
- expect(onChange.mock.calls[0][0]).toMatchObject({ label: 'new label' });
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('onFeedbackTypeChange', () => {
76
- it('calls onChange', () => {
77
- instance.onFeedbackTypeChange('default');
78
- expect(onChange.mock.calls[0][0]).toMatchObject({
79
- feedback: { type: 'default' },
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('onFeedbackValueChange', () => {
85
- it('calls onChange', () => {
86
- instance.onFeedbackValueChange('new feedback');
87
- expect(onChange.mock.calls[0][0]).toMatchObject({
88
- feedback: { value: 'new feedback' },
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-ui/core/Menu';
2
- import MenuItem from '@material-ui/core/MenuItem';
3
- import ActionFeedback from '@material-ui/icons/Feedback';
4
- import IconButton from '@material-ui/core/IconButton';
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
  );