@pie-lib/config-ui 13.1.0-beta.7 → 14.0.0-next.35

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 (233) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +11 -0
  2. package/dist/alert-dialog.d.ts +44 -0
  3. package/dist/alert-dialog.js +47 -0
  4. package/dist/checkbox.d.ts +34 -0
  5. package/dist/checkbox.js +57 -0
  6. package/dist/choice-configuration/feedback-menu.d.ts +32 -0
  7. package/dist/choice-configuration/feedback-menu.js +85 -0
  8. package/dist/choice-configuration/index.d.ts +62 -0
  9. package/dist/choice-configuration/index.js +240 -0
  10. package/dist/choice-utils.d.ts +21 -0
  11. package/dist/choice-utils.js +15 -0
  12. package/dist/feedback-config/feedback-selector.d.ts +33 -0
  13. package/dist/feedback-config/feedback-selector.js +92 -0
  14. package/dist/feedback-config/group.d.ts +21 -0
  15. package/dist/feedback-config/group.js +33 -0
  16. package/dist/feedback-config/index.d.ts +48 -0
  17. package/dist/feedback-config/index.js +96 -0
  18. package/dist/form-section.d.ts +25 -0
  19. package/dist/form-section.js +25 -0
  20. package/dist/fraction-to-number.d.ts +7 -0
  21. package/dist/fraction-to-number.js +9 -0
  22. package/dist/help.d.ts +41 -0
  23. package/dist/help.js +62 -0
  24. package/dist/index.d.ts +31 -0
  25. package/dist/index.js +34 -0
  26. package/dist/input.d.ts +29 -0
  27. package/dist/input.js +65 -0
  28. package/dist/inputs.d.ts +63 -0
  29. package/dist/inputs.js +70 -0
  30. package/dist/langs.d.ts +41 -0
  31. package/dist/langs.js +76 -0
  32. package/dist/layout/config-layout.d.ts +10 -0
  33. package/dist/layout/config-layout.js +75 -0
  34. package/dist/layout/index.d.ts +11 -0
  35. package/dist/layout/index.js +10 -0
  36. package/dist/layout/layout-contents.d.ts +21 -0
  37. package/dist/layout/layout-contents.js +70 -0
  38. package/dist/layout/settings-box.d.ts +19 -0
  39. package/dist/layout/settings-box.js +32 -0
  40. package/dist/mui-box/index.d.ts +21 -0
  41. package/dist/mui-box/index.js +47 -0
  42. package/dist/node_modules/.bun/@babel_runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/extends.js +12 -0
  43. package/dist/node_modules/.bun/@babel_runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js +7 -0
  44. package/dist/node_modules/.bun/@babel_runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +12 -0
  45. package/dist/node_modules/.bun/@babel_runtime@7.29.7/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +8 -0
  46. package/dist/node_modules/.bun/react-measure@2.5.2_6dbf9a050bc9aadb/node_modules/react-measure/dist/index.esm.js +122 -0
  47. package/dist/node_modules/.bun/resize-observer-polyfill@1.5.1/node_modules/resize-observer-polyfill/dist/ResizeObserver.es.js +276 -0
  48. package/dist/number-text-field-custom.d.ts +51 -0
  49. package/dist/number-text-field-custom.js +192 -0
  50. package/dist/number-text-field.d.ts +47 -0
  51. package/dist/number-text-field.js +122 -0
  52. package/dist/radio-with-label.d.ts +25 -0
  53. package/dist/radio-with-label.js +27 -0
  54. package/dist/settings/display-size.d.ts +26 -0
  55. package/dist/settings/display-size.js +45 -0
  56. package/dist/settings/index.d.ts +45 -0
  57. package/dist/settings/index.js +63 -0
  58. package/dist/settings/panel.d.ts +27 -0
  59. package/dist/settings/panel.js +201 -0
  60. package/dist/settings/settings-radio-label.d.ts +25 -0
  61. package/dist/settings/settings-radio-label.js +29 -0
  62. package/dist/settings/toggle.d.ts +25 -0
  63. package/dist/settings/toggle.js +33 -0
  64. package/dist/tabs/index.d.ts +22 -0
  65. package/dist/tabs/index.js +39 -0
  66. package/dist/tags-input/index.d.ts +21 -0
  67. package/dist/tags-input/index.js +83 -0
  68. package/dist/two-choice.d.ts +43 -0
  69. package/dist/two-choice.js +79 -0
  70. package/dist/with-stateful-model.d.ts +42 -0
  71. package/dist/with-stateful-model.js +32 -0
  72. package/package.json +31 -19
  73. package/CHANGELOG.json +0 -32
  74. package/CHANGELOG.md +0 -2419
  75. package/lib/__tests__/alert-dialog.test.js +0 -262
  76. package/lib/__tests__/alert-dialog.test.js.map +0 -1
  77. package/lib/__tests__/checkbox.test.js +0 -227
  78. package/lib/__tests__/checkbox.test.js.map +0 -1
  79. package/lib/__tests__/choice-utils.test.js +0 -14
  80. package/lib/__tests__/choice-utils.test.js.map +0 -1
  81. package/lib/__tests__/form-section.test.js +0 -252
  82. package/lib/__tests__/form-section.test.js.map +0 -1
  83. package/lib/__tests__/help.test.js +0 -270
  84. package/lib/__tests__/help.test.js.map +0 -1
  85. package/lib/__tests__/input.test.js +0 -268
  86. package/lib/__tests__/input.test.js.map +0 -1
  87. package/lib/__tests__/langs.test.js +0 -541
  88. package/lib/__tests__/langs.test.js.map +0 -1
  89. package/lib/__tests__/number-text-field-custom.test.js +0 -362
  90. package/lib/__tests__/number-text-field-custom.test.js.map +0 -1
  91. package/lib/__tests__/number-text-field.test.js +0 -421
  92. package/lib/__tests__/number-text-field.test.js.map +0 -1
  93. package/lib/__tests__/radio-with-label.test.js +0 -233
  94. package/lib/__tests__/radio-with-label.test.js.map +0 -1
  95. package/lib/__tests__/settings-panel.test.js +0 -184
  96. package/lib/__tests__/settings-panel.test.js.map +0 -1
  97. package/lib/__tests__/settings.test.js +0 -653
  98. package/lib/__tests__/settings.test.js.map +0 -1
  99. package/lib/__tests__/tabs.test.js +0 -211
  100. package/lib/__tests__/tabs.test.js.map +0 -1
  101. package/lib/__tests__/two-choice.test.js +0 -124
  102. package/lib/__tests__/two-choice.test.js.map +0 -1
  103. package/lib/__tests__/with-stateful-model.test.js +0 -221
  104. package/lib/__tests__/with-stateful-model.test.js.map +0 -1
  105. package/lib/alert-dialog.js +0 -68
  106. package/lib/alert-dialog.js.map +0 -1
  107. package/lib/checkbox.js +0 -84
  108. package/lib/checkbox.js.map +0 -1
  109. package/lib/choice-configuration/__tests__/feedback-menu.test.js +0 -287
  110. package/lib/choice-configuration/__tests__/feedback-menu.test.js.map +0 -1
  111. package/lib/choice-configuration/__tests__/index.test.js +0 -253
  112. package/lib/choice-configuration/__tests__/index.test.js.map +0 -1
  113. package/lib/choice-configuration/feedback-menu.js +0 -129
  114. package/lib/choice-configuration/feedback-menu.js.map +0 -1
  115. package/lib/choice-configuration/index.js +0 -381
  116. package/lib/choice-configuration/index.js.map +0 -1
  117. package/lib/choice-utils.js +0 -42
  118. package/lib/choice-utils.js.map +0 -1
  119. package/lib/feedback-config/__tests__/feedback-config.test.js +0 -201
  120. package/lib/feedback-config/__tests__/feedback-config.test.js.map +0 -1
  121. package/lib/feedback-config/__tests__/feedback-selector.test.js +0 -177
  122. package/lib/feedback-config/__tests__/feedback-selector.test.js.map +0 -1
  123. package/lib/feedback-config/feedback-selector.js +0 -155
  124. package/lib/feedback-config/feedback-selector.js.map +0 -1
  125. package/lib/feedback-config/group.js +0 -61
  126. package/lib/feedback-config/group.js.map +0 -1
  127. package/lib/feedback-config/index.js +0 -146
  128. package/lib/feedback-config/index.js.map +0 -1
  129. package/lib/form-section.js +0 -44
  130. package/lib/form-section.js.map +0 -1
  131. package/lib/help.js +0 -106
  132. package/lib/help.js.map +0 -1
  133. package/lib/index.js +0 -186
  134. package/lib/index.js.map +0 -1
  135. package/lib/input.js +0 -106
  136. package/lib/input.js.map +0 -1
  137. package/lib/inputs.js +0 -105
  138. package/lib/inputs.js.map +0 -1
  139. package/lib/langs.js +0 -136
  140. package/lib/langs.js.map +0 -1
  141. package/lib/layout/__tests__/config.layout.test.js +0 -70
  142. package/lib/layout/__tests__/config.layout.test.js.map +0 -1
  143. package/lib/layout/__tests__/layout-content.test.js +0 -6
  144. package/lib/layout/__tests__/layout-content.test.js.map +0 -1
  145. package/lib/layout/config-layout.js +0 -137
  146. package/lib/layout/config-layout.js.map +0 -1
  147. package/lib/layout/index.js +0 -21
  148. package/lib/layout/index.js.map +0 -1
  149. package/lib/layout/layout-contents.js +0 -160
  150. package/lib/layout/layout-contents.js.map +0 -1
  151. package/lib/layout/settings-box.js +0 -57
  152. package/lib/layout/settings-box.js.map +0 -1
  153. package/lib/mui-box/index.js +0 -63
  154. package/lib/mui-box/index.js.map +0 -1
  155. package/lib/number-text-field-custom.js +0 -376
  156. package/lib/number-text-field-custom.js.map +0 -1
  157. package/lib/number-text-field.js +0 -229
  158. package/lib/number-text-field.js.map +0 -1
  159. package/lib/radio-with-label.js +0 -48
  160. package/lib/radio-with-label.js.map +0 -1
  161. package/lib/settings/display-size.js +0 -61
  162. package/lib/settings/display-size.js.map +0 -1
  163. package/lib/settings/index.js +0 -110
  164. package/lib/settings/index.js.map +0 -1
  165. package/lib/settings/panel.js +0 -392
  166. package/lib/settings/panel.js.map +0 -1
  167. package/lib/settings/settings-radio-label.js +0 -51
  168. package/lib/settings/settings-radio-label.js.map +0 -1
  169. package/lib/settings/toggle.js +0 -63
  170. package/lib/settings/toggle.js.map +0 -1
  171. package/lib/tabs/index.js +0 -75
  172. package/lib/tabs/index.js.map +0 -1
  173. package/lib/tags-input/__tests__/index.test.js +0 -183
  174. package/lib/tags-input/__tests__/index.test.js.map +0 -1
  175. package/lib/tags-input/index.js +0 -149
  176. package/lib/tags-input/index.js.map +0 -1
  177. package/lib/two-choice.js +0 -136
  178. package/lib/two-choice.js.map +0 -1
  179. package/lib/with-stateful-model.js +0 -61
  180. package/lib/with-stateful-model.js.map +0 -1
  181. package/src/__tests__/alert-dialog.test.jsx +0 -183
  182. package/src/__tests__/checkbox.test.jsx +0 -152
  183. package/src/__tests__/choice-utils.test.js +0 -12
  184. package/src/__tests__/form-section.test.jsx +0 -328
  185. package/src/__tests__/help.test.jsx +0 -184
  186. package/src/__tests__/input.test.jsx +0 -156
  187. package/src/__tests__/langs.test.jsx +0 -376
  188. package/src/__tests__/number-text-field-custom.test.jsx +0 -255
  189. package/src/__tests__/number-text-field.test.jsx +0 -263
  190. package/src/__tests__/radio-with-label.test.jsx +0 -155
  191. package/src/__tests__/settings-panel.test.js +0 -187
  192. package/src/__tests__/settings.test.jsx +0 -452
  193. package/src/__tests__/tabs.test.jsx +0 -188
  194. package/src/__tests__/two-choice.test.js +0 -110
  195. package/src/__tests__/with-stateful-model.test.jsx +0 -139
  196. package/src/alert-dialog.jsx +0 -75
  197. package/src/checkbox.jsx +0 -61
  198. package/src/choice-configuration/__tests__/feedback-menu.test.jsx +0 -151
  199. package/src/choice-configuration/__tests__/index.test.jsx +0 -234
  200. package/src/choice-configuration/feedback-menu.jsx +0 -96
  201. package/src/choice-configuration/index.jsx +0 -357
  202. package/src/choice-utils.js +0 -30
  203. package/src/feedback-config/__tests__/feedback-config.test.jsx +0 -141
  204. package/src/feedback-config/__tests__/feedback-selector.test.jsx +0 -97
  205. package/src/feedback-config/feedback-selector.jsx +0 -112
  206. package/src/feedback-config/group.jsx +0 -51
  207. package/src/feedback-config/index.jsx +0 -111
  208. package/src/form-section.jsx +0 -31
  209. package/src/help.jsx +0 -79
  210. package/src/index.js +0 -55
  211. package/src/input.jsx +0 -72
  212. package/src/inputs.jsx +0 -69
  213. package/src/langs.jsx +0 -111
  214. package/src/layout/__tests__/config.layout.test.jsx +0 -59
  215. package/src/layout/__tests__/layout-content.test.jsx +0 -3
  216. package/src/layout/config-layout.jsx +0 -103
  217. package/src/layout/index.js +0 -4
  218. package/src/layout/layout-contents.jsx +0 -117
  219. package/src/layout/settings-box.jsx +0 -32
  220. package/src/mui-box/index.jsx +0 -56
  221. package/src/number-text-field-custom.jsx +0 -333
  222. package/src/number-text-field.jsx +0 -215
  223. package/src/radio-with-label.jsx +0 -30
  224. package/src/settings/display-size.jsx +0 -53
  225. package/src/settings/index.js +0 -83
  226. package/src/settings/panel.jsx +0 -333
  227. package/src/settings/settings-radio-label.jsx +0 -32
  228. package/src/settings/toggle.jsx +0 -46
  229. package/src/tabs/index.jsx +0 -47
  230. package/src/tags-input/__tests__/index.test.jsx +0 -113
  231. package/src/tags-input/index.jsx +0 -116
  232. package/src/two-choice.jsx +0 -90
  233. package/src/with-stateful-model.jsx +0 -36
@@ -1,141 +0,0 @@
1
- import React from 'react';
2
- import { render, screen } from '@testing-library/react';
3
- import userEvent from '@testing-library/user-event';
4
- import { buildDefaults, FeedbackConfig } from '../index';
5
-
6
- // Mock FeedbackSelector to simplify testing
7
- jest.mock('../feedback-selector', () => {
8
- return function FeedbackSelector({ label, feedback, onChange }) {
9
- return (
10
- <div data-testid="feedback-selector">
11
- <label>{label}</label>
12
- <select
13
- aria-label={label}
14
- value={feedback.type}
15
- onChange={(e) => onChange({ ...feedback, type: e.target.value })}
16
- >
17
- <option value="default">Default</option>
18
- <option value="custom">Custom</option>
19
- <option value="none">None</option>
20
- </select>
21
- </div>
22
- );
23
- };
24
- });
25
-
26
- describe('FeedbackConfig', () => {
27
- const onChange = jest.fn();
28
-
29
- beforeEach(() => {
30
- onChange.mockClear();
31
- });
32
-
33
- describe('rendering', () => {
34
- it('renders with default feedback types', () => {
35
- const feedback = buildDefaults();
36
-
37
- render(<FeedbackConfig feedback={feedback} onChange={onChange} />);
38
-
39
- expect(screen.getByText('Feedback')).toBeInTheDocument();
40
- expect(screen.getByText('If correct, show')).toBeInTheDocument();
41
- expect(screen.getByText('If partially correct, show')).toBeInTheDocument();
42
- expect(screen.getByText('If incorrect, show')).toBeInTheDocument();
43
- });
44
-
45
- it('renders all three feedback selectors by default', () => {
46
- const feedback = buildDefaults();
47
-
48
- render(<FeedbackConfig feedback={feedback} onChange={onChange} />);
49
-
50
- const selectors = screen.getAllByTestId('feedback-selector');
51
- expect(selectors).toHaveLength(3);
52
- });
53
-
54
- it('does not render partial feedback selector when allowPartial is false', () => {
55
- const feedback = buildDefaults();
56
-
57
- render(<FeedbackConfig allowPartial={false} feedback={feedback} onChange={onChange} />);
58
-
59
- expect(screen.getByText('If correct, show')).toBeInTheDocument();
60
- expect(screen.queryByText('If partially correct, show')).not.toBeInTheDocument();
61
- expect(screen.getByText('If incorrect, show')).toBeInTheDocument();
62
-
63
- const selectors = screen.getAllByTestId('feedback-selector');
64
- expect(selectors).toHaveLength(2);
65
- });
66
- });
67
-
68
- describe('user interactions', () => {
69
- it('calls onChange when correct feedback type changes', async () => {
70
- const user = userEvent.setup();
71
- const feedback = buildDefaults();
72
-
73
- render(<FeedbackConfig feedback={feedback} onChange={onChange} />);
74
-
75
- const correctSelect = screen.getByLabelText('If correct, show');
76
- await user.selectOptions(correctSelect, 'custom');
77
-
78
- expect(onChange).toHaveBeenCalledWith(
79
- expect.objectContaining({
80
- correct: expect.objectContaining({ type: 'custom' }),
81
- }),
82
- );
83
- });
84
-
85
- it('calls onChange when incorrect feedback type changes', async () => {
86
- const user = userEvent.setup();
87
- const feedback = buildDefaults();
88
-
89
- render(<FeedbackConfig feedback={feedback} onChange={onChange} />);
90
-
91
- const incorrectSelect = screen.getByLabelText('If incorrect, show');
92
- await user.selectOptions(incorrectSelect, 'none');
93
-
94
- expect(onChange).toHaveBeenCalledWith(
95
- expect.objectContaining({
96
- incorrect: expect.objectContaining({ type: 'none' }),
97
- }),
98
- );
99
- });
100
-
101
- it('calls onChange when partial feedback type changes', async () => {
102
- const user = userEvent.setup();
103
- const feedback = buildDefaults();
104
-
105
- render(<FeedbackConfig feedback={feedback} onChange={onChange} />);
106
-
107
- const partialSelect = screen.getByLabelText('If partially correct, show');
108
- await user.selectOptions(partialSelect, 'custom');
109
-
110
- expect(onChange).toHaveBeenCalledWith(
111
- expect.objectContaining({
112
- partial: expect.objectContaining({ type: 'custom' }),
113
- }),
114
- );
115
- });
116
- });
117
-
118
- describe('buildDefaults helper', () => {
119
- it('returns default feedback configuration', () => {
120
- const defaults = buildDefaults();
121
-
122
- expect(defaults).toEqual({
123
- correct: { type: 'default', default: 'Correct' },
124
- incorrect: { type: 'default', default: 'Incorrect' },
125
- partial: { type: 'default', default: 'Nearly' },
126
- });
127
- });
128
-
129
- it('merges custom values with defaults', () => {
130
- const defaults = buildDefaults({
131
- correct: { type: 'custom', custom: 'Great job!' },
132
- });
133
-
134
- expect(defaults).toEqual({
135
- correct: { type: 'custom', default: 'Correct', custom: 'Great job!' },
136
- incorrect: { type: 'default', default: 'Incorrect' },
137
- partial: { type: 'default', default: 'Nearly' },
138
- });
139
- });
140
- });
141
- });
@@ -1,97 +0,0 @@
1
- import { render, screen } from '@testing-library/react';
2
- import userEvent from '@testing-library/user-event';
3
- import React from 'react';
4
- import { FeedbackSelector } from '../feedback-selector';
5
-
6
- // Mock the editable-html component to avoid window dependencies in tests
7
- jest.mock('@pie-lib/editable-html-tip-tap', () => {
8
- return {
9
- __esModule: true,
10
- default: ({ markup, onChange }) => (
11
- <textarea data-testid="editable-html" defaultValue={markup || ''} onChange={(e) => onChange(e.target.value)} />
12
- ),
13
- };
14
- });
15
-
16
- describe('feedback-selector', () => {
17
- let onChange;
18
-
19
- const renderComponent = (feedback = { type: 'default', default: 'hi' }) => {
20
- return render(<FeedbackSelector label={'Feedback'} onChange={onChange} feedback={feedback} />);
21
- };
22
-
23
- beforeEach(() => {
24
- onChange = jest.fn();
25
- });
26
-
27
- describe('rendering', () => {
28
- it('renders feedback type selector', () => {
29
- renderComponent();
30
- expect(screen.getByText('Simple Feedback')).toBeInTheDocument();
31
- expect(screen.getByText('No Feedback')).toBeInTheDocument();
32
- expect(screen.getByText('Customized Feedback')).toBeInTheDocument();
33
- });
34
-
35
- it('shows default feedback text when type is default', () => {
36
- renderComponent({ type: 'default', default: 'hi' });
37
- expect(screen.getByText('hi')).toBeInTheDocument();
38
- });
39
-
40
- it('shows editable html when type is custom', () => {
41
- renderComponent({ type: 'custom', default: 'hi', custom: 'custom text' });
42
- expect(screen.getByTestId('editable-html')).toBeInTheDocument();
43
- expect(screen.getByTestId('editable-html')).toHaveValue('custom text');
44
- });
45
-
46
- it('does not show default feedback when type is none', () => {
47
- renderComponent({ type: 'none', default: 'hi' });
48
- expect(screen.queryByText('hi')).not.toBeInTheDocument();
49
- });
50
- });
51
-
52
- describe('user interactions', () => {
53
- it('calls onChange when switching to default feedback', async () => {
54
- const user = userEvent.setup();
55
- renderComponent({ type: 'custom', default: 'hi' });
56
-
57
- await user.click(screen.getByLabelText('Simple Feedback'));
58
-
59
- expect(onChange).toHaveBeenCalledWith({ type: 'default', default: 'hi' });
60
- });
61
-
62
- it('calls onChange when switching to custom feedback', async () => {
63
- const user = userEvent.setup();
64
- renderComponent({ type: 'default', default: 'hi' });
65
-
66
- await user.click(screen.getByLabelText('Customized Feedback'));
67
-
68
- expect(onChange).toHaveBeenCalledWith({ type: 'custom', default: 'hi' });
69
- });
70
-
71
- it('calls onChange when switching to no feedback', async () => {
72
- const user = userEvent.setup();
73
- renderComponent({ type: 'default', default: 'hi' });
74
-
75
- await user.click(screen.getByLabelText('No Feedback'));
76
-
77
- expect(onChange).toHaveBeenCalledWith({ type: 'none', default: 'hi' });
78
- });
79
-
80
- it('calls onChange with custom text when editing custom feedback', async () => {
81
- const user = userEvent.setup();
82
- renderComponent({ type: 'custom', default: 'hi', custom: '' });
83
-
84
- const editor = screen.getByTestId('editable-html');
85
- await user.clear(editor);
86
- await user.type(editor, 'text');
87
-
88
- // user.type triggers onChange for each character, so check that onChange was called
89
- // and that the last call has 'text' in custom field
90
- expect(onChange).toHaveBeenCalled();
91
- const lastCall = onChange.mock.calls[onChange.mock.calls.length - 1][0];
92
- expect(lastCall.type).toBe('custom');
93
- expect(lastCall.custom).toBe('text');
94
- expect(lastCall.default).toBe('hi');
95
- });
96
- });
97
- });
@@ -1,112 +0,0 @@
1
- import EditableHtml from '@pie-lib/editable-html-tip-tap';
2
- import { InputContainer } from '@pie-lib/render-ui';
3
- import PropTypes from 'prop-types';
4
- import React from 'react';
5
- import { styled } from '@mui/material/styles';
6
- import Group from './group';
7
-
8
- // - mathquill error window not defined
9
- const StyledEditableHTML = styled(EditableHtml)(({ theme }) => ({
10
- fontFamily: theme.typography.fontFamily,
11
- }));
12
-
13
- const feedbackLabels = {
14
- default: 'Simple Feedback',
15
- none: 'No Feedback',
16
- custom: 'Customized Feedback',
17
- };
18
-
19
- const StyledFeedbackSelector = styled('div')(({ theme }) => ({
20
- marginBottom: theme.spacing(1),
21
- }));
22
-
23
- const StyledInputContainer = styled(InputContainer)(() => ({
24
- paddingBottom: 0,
25
- }));
26
-
27
- const StyledCustomHolder = styled('div')(({ theme }) => ({
28
- marginTop: '0px',
29
- background: theme.palette.grey[300],
30
- padding: 0,
31
- marginBottom: theme.spacing(2),
32
- borderRadius: '4px',
33
- }));
34
-
35
- const StyledDefaultHolder = styled('div')(({ theme }) => ({
36
- marginTop: '0px',
37
- background: theme.palette.grey[300],
38
- padding: theme.spacing(2),
39
- marginBottom: theme.spacing(2),
40
- borderRadius: '4px',
41
- fontFamily: theme.typography.fontFamily,
42
- cursor: 'default',
43
- }));
44
-
45
- const StyledGroup = styled(Group)(({ theme }) => ({
46
- paddingTop: theme.spacing(1),
47
- }));
48
-
49
- export const FeedbackType = {
50
- type: PropTypes.oneOf(['default', 'custom', 'none']),
51
- default: PropTypes.string,
52
- custom: PropTypes.string,
53
- };
54
-
55
- export class FeedbackSelector extends React.Component {
56
- static propTypes = {
57
- keys: PropTypes.arrayOf(PropTypes.string),
58
- label: PropTypes.string.isRequired,
59
- feedback: PropTypes.shape(FeedbackType).isRequired,
60
- onChange: PropTypes.func.isRequired,
61
- toolbarOpts: PropTypes.object,
62
- mathMlOptions: PropTypes.object,
63
- };
64
-
65
- changeType = (type) => {
66
- const { onChange, feedback } = this.props;
67
-
68
- onChange({ ...feedback, type });
69
- };
70
-
71
- changeCustom = (custom) => {
72
- const { onChange, feedback } = this.props;
73
-
74
- onChange({ ...feedback, type: 'custom', custom });
75
- };
76
-
77
- render() {
78
- const { keys, label, feedback, toolbarOpts, mathMlOptions = {} } = this.props;
79
-
80
- const feedbackKeys = keys || Object.keys(feedbackLabels);
81
-
82
- return (
83
- <StyledFeedbackSelector>
84
- <StyledInputContainer label={label} extraClasses={{ label: { transform: 'translateY(-20%)' } }}>
85
- <StyledGroup
86
- keys={feedbackKeys}
87
- label={label}
88
- value={feedback.type}
89
- onChange={this.changeType}
90
- feedbackLabels={feedbackLabels}
91
- />
92
- </StyledInputContainer>
93
-
94
- {feedback.type === 'custom' && (
95
- <StyledCustomHolder>
96
- <StyledEditableHTML
97
- onChange={this.changeCustom}
98
- markup={feedback.custom || ''}
99
- toolbarOpts={toolbarOpts}
100
- languageCharactersProps={[{ language: 'spanish' }, { language: 'special' }]}
101
- mathMlOptions={mathMlOptions}
102
- />
103
- </StyledCustomHolder>
104
- )}
105
-
106
- {feedback.type === 'default' && <StyledDefaultHolder> {feedback.default}</StyledDefaultHolder>}
107
- </StyledFeedbackSelector>
108
- );
109
- }
110
- }
111
-
112
- export default FeedbackSelector;
@@ -1,51 +0,0 @@
1
- import PropTypes from 'prop-types';
2
- import RadioWithLabel from '../radio-with-label';
3
- import React from 'react';
4
- import { styled } from '@mui/material/styles';
5
-
6
- const StyledChoiceHolder = styled('div')(() => ({
7
- display: 'flex',
8
- alignItems: 'center',
9
- }));
10
-
11
- const StyledChoice = styled('div')(() => ({
12
- display: 'flex',
13
- alignItems: 'center',
14
- }));
15
-
16
- const StyledRadioWithLabel = styled(RadioWithLabel)(({ theme }) => ({
17
- '& .MuiFormControlLabel-label': {
18
- fontSize: theme.typography.fontSize - 2,
19
- },
20
- }));
21
-
22
- const Group = (props) => {
23
- const { feedbackLabels, value, className, onChange, keys } = props;
24
-
25
- return (
26
- <StyledChoiceHolder className={className}>
27
- {keys.map((key) => {
28
- return (
29
- <StyledChoice key={key}>
30
- <StyledRadioWithLabel
31
- value={key}
32
- checked={value === key}
33
- onChange={(e) => onChange(e.currentTarget.value)}
34
- label={feedbackLabels[key]}
35
- />
36
- </StyledChoice>
37
- );
38
- })}
39
- </StyledChoiceHolder>
40
- );
41
- };
42
-
43
- Group.propTypes = {
44
- className: PropTypes.string,
45
- feedbackLabels: PropTypes.object.isRequired,
46
- value: PropTypes.string.isRequired,
47
- keys: PropTypes.arrayOf(PropTypes.string),
48
- onChange: PropTypes.func,
49
- };
50
-
51
- export default Group;
@@ -1,111 +0,0 @@
1
- import FeedbackSelector, { FeedbackType } from './feedback-selector';
2
- import PropTypes from 'prop-types';
3
- import React from 'react';
4
- import { merge } from 'lodash-es';
5
-
6
- import { styled } from '@mui/material/styles';
7
- import Accordion from '@mui/material/Accordion';
8
- import AccordionSummary from '@mui/material/AccordionSummary';
9
- import AccordionDetails from '@mui/material/AccordionDetails';
10
- import Typography from '@mui/material/Typography';
11
- import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
12
-
13
- export { FeedbackSelector };
14
-
15
- const StyledFeedbackContainer = styled('div')(() => ({
16
- display: 'flex',
17
- flex: 1,
18
- flexDirection: 'column',
19
- }));
20
-
21
- const StyledAccordionDetails = styled(AccordionDetails)(() => ({
22
- paddingTop: 0,
23
- paddingBottom: 0,
24
- }));
25
-
26
- export const buildDefaults = (input) => {
27
- return merge(
28
- {},
29
- {
30
- correct: { type: 'default', default: 'Correct' },
31
- incorrect: { type: 'default', default: 'Incorrect' },
32
- partial: { type: 'default', default: 'Nearly' },
33
- },
34
- input,
35
- );
36
- };
37
-
38
- export class FeedbackConfig extends React.Component {
39
- static propTypes = {
40
- allowPartial: PropTypes.bool,
41
- className: PropTypes.string,
42
- feedback: PropTypes.shape({
43
- correct: PropTypes.shape(FeedbackType),
44
- incorrect: PropTypes.shape(FeedbackType),
45
- partial: PropTypes.shape(FeedbackType),
46
- }),
47
- onChange: PropTypes.func.isRequired,
48
- toolbarOpts: PropTypes.object,
49
- };
50
-
51
- static defaultProps = {
52
- allowPartial: true,
53
- feedback: buildDefaults(),
54
- };
55
-
56
- onChange(key, config) {
57
- const { feedback, onChange } = this.props;
58
- const update = { ...feedback, [key]: config };
59
-
60
- onChange(update);
61
- }
62
-
63
- onCorrectChange = this.onChange.bind(this, 'correct');
64
-
65
- onIncorrectChange = this.onChange.bind(this, 'incorrect');
66
-
67
- onPartialChange = this.onChange.bind(this, 'partial');
68
-
69
- render() {
70
- const { className, allowPartial, feedback, toolbarOpts } = this.props;
71
-
72
- return (
73
- <div className={className}>
74
- <Accordion slotProps={{ transition: { timeout: { enter: 225, exit: 195 } } }}>
75
- <AccordionSummary expandIcon={<ExpandMoreIcon />}>
76
- <Typography>Feedback</Typography>
77
- </AccordionSummary>
78
-
79
- <StyledAccordionDetails>
80
- <StyledFeedbackContainer>
81
- <FeedbackSelector
82
- label="If correct, show"
83
- feedback={feedback.correct}
84
- onChange={this.onCorrectChange}
85
- toolbarOpts={toolbarOpts}
86
- />
87
-
88
- {allowPartial && (
89
- <FeedbackSelector
90
- label="If partially correct, show"
91
- feedback={feedback.partial}
92
- onChange={this.onPartialChange}
93
- toolbarOpts={toolbarOpts}
94
- />
95
- )}
96
-
97
- <FeedbackSelector
98
- label="If incorrect, show"
99
- feedback={feedback.incorrect}
100
- onChange={this.onIncorrectChange}
101
- toolbarOpts={toolbarOpts}
102
- />
103
- </StyledFeedbackContainer>
104
- </StyledAccordionDetails>
105
- </Accordion>
106
- </div>
107
- );
108
- }
109
- }
110
-
111
- export default FeedbackConfig;
@@ -1,31 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import Typography from '@mui/material/Typography';
4
- import { styled } from '@mui/material/styles';
5
-
6
- const StyledFormSection = styled('div')(({ theme }) => ({
7
- marginTop: theme.spacing(2),
8
- marginBottom: theme.spacing(2),
9
- }));
10
-
11
- const StyledTypography = styled(Typography)(({ theme }) => ({
12
- marginBottom: theme.spacing(1),
13
- }));
14
-
15
- const FormSection = ({ className, label, children, labelExtraStyle }) => (
16
- <StyledFormSection className={className}>
17
- <StyledTypography variant="subtitle1" style={labelExtraStyle}>
18
- {label}
19
- </StyledTypography>
20
- {children}
21
- </StyledFormSection>
22
- );
23
-
24
- FormSection.propTypes = {
25
- className: PropTypes.string,
26
- label: PropTypes.string,
27
- children: PropTypes.node,
28
- labelExtraStyle: PropTypes.object,
29
- };
30
-
31
- export default FormSection;
package/src/help.jsx DELETED
@@ -1,79 +0,0 @@
1
- import Dialog from '@mui/material/Dialog';
2
- import DialogTitle from '@mui/material/DialogTitle';
3
- import DialogContentText from '@mui/material/DialogContentText';
4
- import DialogContent from '@mui/material/DialogContent';
5
- import DialogActions from '@mui/material/DialogActions';
6
- import PropTypes from 'prop-types';
7
-
8
- import Button from '@mui/material/Button';
9
- import HelpIcon from '@mui/icons-material/Help';
10
- import IconButton from '@mui/material/IconButton';
11
- import React from 'react';
12
- import { styled } from '@mui/material/styles';
13
-
14
- const StyledIconButton = styled(IconButton)(({ theme }) => ({
15
- '&:hover': {
16
- color: theme.palette.grey[300],
17
- },
18
- }));
19
-
20
- export const HelpButton = ({ onClick }) => (
21
- <StyledIconButton onClick={onClick} size="large">
22
- <HelpIcon />
23
- </StyledIconButton>
24
- );
25
-
26
- HelpButton.propTypes = {
27
- onClick: PropTypes.func,
28
- };
29
-
30
- export const HelpDialog = ({ open, onClose, children, title }) => (
31
- <Dialog open={open} onClose={onClose}>
32
- <DialogTitle>{title}</DialogTitle>
33
- <DialogContent>
34
- <DialogContentText>{children}</DialogContentText>
35
- </DialogContent>
36
- <DialogActions>
37
- <Button onClick={onClose} color="primary">
38
- OK
39
- </Button>
40
- </DialogActions>
41
- </Dialog>
42
- );
43
-
44
- HelpDialog.propTypes = {
45
- open: PropTypes.bool,
46
- onClose: PropTypes.func,
47
- children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,
48
- title: PropTypes.string.isRequired,
49
- };
50
-
51
- class Help extends React.Component {
52
- static propTypes = {
53
- children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired,
54
- title: PropTypes.string,
55
- };
56
-
57
- constructor(props) {
58
- super(props);
59
- this.state = {
60
- open: false,
61
- };
62
- }
63
-
64
- render() {
65
- const { children, title } = this.props;
66
-
67
- return (
68
- <div>
69
- <HelpButton color="accent" onClick={() => this.setState({ open: true })} />
70
-
71
- <HelpDialog open={this.state.open} title={title} onClose={() => this.setState({ open: false })}>
72
- {children}
73
- </HelpDialog>
74
- </div>
75
- );
76
- }
77
- }
78
-
79
- export default Help;
package/src/index.js DELETED
@@ -1,55 +0,0 @@
1
- import AlertDialog from './alert-dialog';
2
- import FeedbackConfig, { buildDefaults as feedbackConfigDefaults, FeedbackSelector } from './feedback-config';
3
- import { InputCheckbox, InputRadio, InputSwitch } from './inputs';
4
- import Langs, { LanguageControls } from './langs';
5
- import Tabs from './tabs';
6
- import Checkbox from './checkbox';
7
- import FormSection from './form-section';
8
- import Help from './help';
9
- import Input from './input';
10
- import { InputContainer } from '@pie-lib/render-ui';
11
- import NumberTextField from './number-text-field';
12
- import NumberTextFieldCustom from './number-text-field-custom';
13
- import TwoChoice, { NChoice } from './two-choice';
14
- import TagsInput from './tags-input';
15
- import MuiBox from './mui-box';
16
- import ChoiceConfiguration from './choice-configuration';
17
- import * as layout from './layout';
18
-
19
- import * as choiceUtils from './choice-utils';
20
- import withStatefulModel from './with-stateful-model';
21
- import Toggle from './settings/toggle';
22
- import DisplaySize from './settings/display-size';
23
-
24
- import * as settings from './settings';
25
-
26
- export {
27
- AlertDialog,
28
- FeedbackConfig,
29
- FeedbackSelector,
30
- feedbackConfigDefaults,
31
- InputCheckbox,
32
- InputSwitch,
33
- InputRadio,
34
- Langs,
35
- LanguageControls,
36
- Tabs,
37
- Checkbox,
38
- FormSection,
39
- Help,
40
- Input,
41
- InputContainer,
42
- NumberTextField,
43
- NumberTextFieldCustom,
44
- TwoChoice,
45
- NChoice,
46
- TagsInput,
47
- MuiBox,
48
- ChoiceConfiguration,
49
- layout,
50
- choiceUtils,
51
- withStatefulModel,
52
- Toggle,
53
- DisplaySize,
54
- settings,
55
- };