@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,110 +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 { NChoice } from '../two-choice';
5
-
6
- describe('NChoice', () => {
7
- const onChange = jest.fn();
8
-
9
- beforeEach(() => {
10
- onChange.mockClear();
11
- });
12
-
13
- it('renders radio buttons with vertical direction', () => {
14
- render(
15
- <NChoice
16
- direction="vertical"
17
- header="n-choice-vertical"
18
- value={'left'}
19
- onChange={onChange}
20
- opts={[
21
- { label: 'left', value: 'left' },
22
- { label: 'center', value: 'center' },
23
- { label: 'right', value: 'right' },
24
- ]}
25
- />,
26
- );
27
-
28
- expect(screen.getByText('n-choice-vertical')).toBeInTheDocument();
29
- expect(screen.getByLabelText('left')).toBeInTheDocument();
30
- expect(screen.getByLabelText('center')).toBeInTheDocument();
31
- expect(screen.getByLabelText('right')).toBeInTheDocument();
32
- });
33
-
34
- it('shows selected value as checked', () => {
35
- render(
36
- <NChoice
37
- direction="vertical"
38
- header="Options"
39
- value={'center'}
40
- onChange={onChange}
41
- opts={[
42
- { label: 'left', value: 'left' },
43
- { label: 'center', value: 'center' },
44
- { label: 'right', value: 'right' },
45
- ]}
46
- />,
47
- );
48
-
49
- const centerRadio = screen.getByLabelText('center');
50
- expect(centerRadio).toBeChecked();
51
- expect(screen.getByLabelText('left')).not.toBeChecked();
52
- expect(screen.getByLabelText('right')).not.toBeChecked();
53
- });
54
-
55
- it('calls onChange when user selects a different option', async () => {
56
- const user = userEvent.setup();
57
- render(
58
- <NChoice
59
- direction="vertical"
60
- header="Options"
61
- value={'left'}
62
- onChange={onChange}
63
- opts={[
64
- { label: 'left', value: 'left' },
65
- { label: 'center', value: 'center' },
66
- { label: 'right', value: 'right' },
67
- ]}
68
- />,
69
- );
70
-
71
- await user.click(screen.getByLabelText('center'));
72
-
73
- expect(onChange).toHaveBeenCalledWith('center');
74
- });
75
-
76
- it('renders with horizontal direction', () => {
77
- const { container } = render(
78
- <NChoice
79
- direction="horizontal"
80
- header="Options"
81
- value={'left'}
82
- onChange={onChange}
83
- opts={[
84
- { label: 'left', value: 'left' },
85
- { label: 'right', value: 'right' },
86
- ]}
87
- />,
88
- );
89
-
90
- // Check that all options are rendered
91
- expect(screen.getByLabelText('left')).toBeInTheDocument();
92
- expect(screen.getByLabelText('right')).toBeInTheDocument();
93
- });
94
-
95
- it('handles string options by converting them', () => {
96
- render(
97
- <NChoice
98
- direction="vertical"
99
- header="Options"
100
- value={'option1'}
101
- onChange={onChange}
102
- opts={['option1', 'option2', 'option3']}
103
- />,
104
- );
105
-
106
- expect(screen.getByLabelText('option1')).toBeInTheDocument();
107
- expect(screen.getByLabelText('option2')).toBeInTheDocument();
108
- expect(screen.getByLabelText('option3')).toBeInTheDocument();
109
- });
110
- });
@@ -1,139 +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 withStatefulModel from '../with-stateful-model';
5
-
6
- const MockComponent = ({ model, onChange }) => (
7
- <div>
8
- <div data-testid="model-value">{JSON.stringify(model)}</div>
9
- <button onClick={() => onChange({ ...model, updated: true })}>Update Model</button>
10
- </div>
11
- );
12
-
13
- describe('withStatefulModel', () => {
14
- it('wraps component and passes model and onChange', () => {
15
- const WrappedComponent = withStatefulModel(MockComponent);
16
- const model = { name: 'test' };
17
- const onChange = jest.fn();
18
-
19
- render(<WrappedComponent model={model} onChange={onChange} />);
20
-
21
- expect(screen.getByTestId('model-value')).toBeInTheDocument();
22
- expect(screen.getByText(JSON.stringify(model))).toBeInTheDocument();
23
- });
24
-
25
- it('manages local state with initial model prop', () => {
26
- const WrappedComponent = withStatefulModel(MockComponent);
27
- const model = { id: 1, name: 'test' };
28
-
29
- render(<WrappedComponent model={model} onChange={jest.fn()} />);
30
-
31
- expect(screen.getByText(JSON.stringify(model))).toBeInTheDocument();
32
- });
33
-
34
- it('calls onChange with updated model when component calls onChange', async () => {
35
- const user = userEvent.setup();
36
- const WrappedComponent = withStatefulModel(MockComponent);
37
- const model = { name: 'test' };
38
- const onChange = jest.fn();
39
-
40
- render(<WrappedComponent model={model} onChange={onChange} />);
41
-
42
- const updateButton = screen.getByRole('button', { name: /Update Model/i });
43
- await user.click(updateButton);
44
-
45
- expect(onChange).toHaveBeenCalled();
46
- expect(onChange).toHaveBeenCalledWith(expect.objectContaining({ updated: true }));
47
- });
48
-
49
- it('updates internal state when model prop changes', () => {
50
- const WrappedComponent = withStatefulModel(MockComponent);
51
- const initialModel = { name: 'initial' };
52
- const updatedModel = { name: 'updated' };
53
- const onChange = jest.fn();
54
-
55
- const { rerender } = render(<WrappedComponent model={initialModel} onChange={onChange} />);
56
-
57
- expect(screen.getByText(JSON.stringify(initialModel))).toBeInTheDocument();
58
-
59
- rerender(<WrappedComponent model={updatedModel} onChange={onChange} />);
60
-
61
- expect(screen.getByText(JSON.stringify(updatedModel))).toBeInTheDocument();
62
- });
63
-
64
- it('maintains state across multiple onChange calls', async () => {
65
- const user = userEvent.setup();
66
- const WrappedComponent = withStatefulModel(MockComponent);
67
- const model = { count: 0 };
68
- const onChange = jest.fn();
69
-
70
- render(<WrappedComponent model={model} onChange={onChange} />);
71
-
72
- const updateButton = screen.getByRole('button', { name: /Update Model/i });
73
-
74
- await user.click(updateButton);
75
- expect(onChange).toHaveBeenCalledTimes(1);
76
-
77
- await user.click(updateButton);
78
- expect(onChange).toHaveBeenCalledTimes(2);
79
- });
80
-
81
- it('passes updated model state to onChange callback', async () => {
82
- const user = userEvent.setup();
83
- const WrappedComponent = withStatefulModel(MockComponent);
84
- const model = { value: 'original' };
85
- const onChange = jest.fn();
86
-
87
- render(<WrappedComponent model={model} onChange={onChange} />);
88
-
89
- const updateButton = screen.getByRole('button', { name: /Update Model/i });
90
- await user.click(updateButton);
91
-
92
- const lastCall = onChange.mock.calls[onChange.mock.calls.length - 1];
93
- expect(lastCall[0]).toHaveProperty('updated', true);
94
- expect(lastCall[0]).toHaveProperty('value', 'original');
95
- });
96
-
97
- it('handles empty model object', () => {
98
- const WrappedComponent = withStatefulModel(MockComponent);
99
- const model = {};
100
- const onChange = jest.fn();
101
-
102
- render(<WrappedComponent model={model} onChange={onChange} />);
103
-
104
- expect(screen.getByText(JSON.stringify(model))).toBeInTheDocument();
105
- });
106
-
107
- it('handles model with nested properties', () => {
108
- const WrappedComponent = withStatefulModel(MockComponent);
109
- const model = { user: { name: 'John', age: 30 }, settings: { theme: 'dark' } };
110
- const onChange = jest.fn();
111
-
112
- render(<WrappedComponent model={model} onChange={onChange} />);
113
-
114
- expect(screen.getByText(JSON.stringify(model))).toBeInTheDocument();
115
- });
116
-
117
- it('requires model and onChange props', () => {
118
- const WrappedComponent = withStatefulModel(MockComponent);
119
-
120
- const consoleSpy = jest.spyOn(console, 'error').mockImplementation();
121
-
122
- render(<WrappedComponent model={{ test: 'data' }} onChange={jest.fn()} />);
123
-
124
- expect(screen.getByTestId('model-value')).toBeInTheDocument();
125
-
126
- consoleSpy.mockRestore();
127
- });
128
-
129
- it('renders wrapped component with correct props structure', () => {
130
- const WrappedComponent = withStatefulModel(MockComponent);
131
- const model = { id: 1 };
132
- const onChange = jest.fn();
133
-
134
- const { container } = render(<WrappedComponent model={model} onChange={onChange} />);
135
-
136
- expect(container.querySelector('[data-testid="model-value"]')).toBeInTheDocument();
137
- expect(container.querySelector('button')).toBeInTheDocument();
138
- });
139
- });
@@ -1,75 +0,0 @@
1
- import React from 'react';
2
- import PropTypes from 'prop-types';
3
- import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';
4
- import { styled } from '@mui/material/styles';
5
-
6
- const StyledDialogTitle = styled(DialogTitle)(() => ({
7
- fontSize: 'max(1.25rem, 18px)',
8
- }));
9
-
10
- const StyledDialogContentText = styled(DialogContentText)(() => ({
11
- fontSize: 'max(1rem, 14px)',
12
- }));
13
-
14
- const AlertDialog = ({
15
- text,
16
- title,
17
- onClose,
18
- onConfirm,
19
- open,
20
- onCloseText,
21
- onConfirmText,
22
- disableAutoFocus,
23
- disableEnforceFocus,
24
- disableRestoreFocus,
25
- }) => (
26
- <Dialog
27
- open={open}
28
- disableAutoFocus={disableAutoFocus}
29
- disableEnforceFocus={disableEnforceFocus}
30
- disableRestoreFocus={disableRestoreFocus}
31
- onClose={onClose}
32
- >
33
- {title && <StyledDialogTitle>{title}</StyledDialogTitle>}
34
- {text && (
35
- <DialogContent>
36
- <StyledDialogContentText>{text}</StyledDialogContentText>
37
- </DialogContent>
38
- )}
39
- <DialogActions>
40
- {onClose && (
41
- <Button onClick={onClose} color="primary">
42
- {onCloseText}
43
- </Button>
44
- )}
45
- {onConfirm && (
46
- <Button autoFocus onClick={onConfirm} color="primary">
47
- {onConfirmText}
48
- </Button>
49
- )}
50
- </DialogActions>
51
- </Dialog>
52
- );
53
-
54
- AlertDialog.defaultProps = {
55
- onCloseText: 'CANCEL',
56
- onConfirmText: 'OK',
57
- disableAutoFocus: false,
58
- disableEnforceFocus: false,
59
- disableRestoreFocus: false,
60
- };
61
-
62
- AlertDialog.propTypes = {
63
- text: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
64
- title: PropTypes.string,
65
- onClose: PropTypes.func,
66
- onConfirm: PropTypes.func,
67
- open: PropTypes.bool,
68
- onConfirmText: PropTypes.string,
69
- onCloseText: PropTypes.string,
70
- disableAutoFocus: PropTypes.bool,
71
- disableEnforceFocus: PropTypes.bool,
72
- disableRestoreFocus: PropTypes.bool,
73
- };
74
-
75
- export default AlertDialog;
package/src/checkbox.jsx DELETED
@@ -1,61 +0,0 @@
1
- import FormControlLabel from '@mui/material/FormControlLabel';
2
- import MuiCheckbox from '@mui/material/Checkbox';
3
- import PropTypes from 'prop-types';
4
- import React from 'react';
5
- import { styled } from '@mui/material/styles';
6
- import { color } from '@pie-lib/render-ui';
7
- import { grey } from '@mui/material/colors';
8
-
9
- const StyledFormControlLabel = styled(FormControlLabel)(({ theme, mini }) => ({
10
- margin: 0,
11
- marginLeft: 0,
12
- padding: 0,
13
- '& .MuiFormControlLabel-label': {
14
- fontSize: theme.typography.fontSize - 1,
15
- transform: 'translate(-4%, 2%)',
16
- color: 'rgba(0,0,0,1.0)',
17
- ...(mini && {
18
- marginLeft: theme.spacing(1),
19
- color: grey[700],
20
- fontSize: theme.typography.fontSize - 3,
21
- }),
22
- },
23
- }));
24
-
25
- const StyledCheckbox = styled(MuiCheckbox)(({ theme, mini, error }) => ({
26
- color: `${color.tertiary()} !important`,
27
- ...(mini && {
28
- margin: 0,
29
- padding: 0,
30
- width: theme.spacing(3),
31
- height: theme.spacing(3),
32
- }),
33
- ...(error && {
34
- color: `${theme.palette.error.main} !important`,
35
- }),
36
- }));
37
-
38
- const Checkbox = ({ mini, checked, onChange, value, label, error }) => (
39
- <StyledFormControlLabel
40
- mini={mini}
41
- control={<StyledCheckbox checked={checked} onChange={onChange} value={value} mini={mini} error={error} />}
42
- label={label}
43
- />
44
- );
45
-
46
- Checkbox.propTypes = {
47
- mini: PropTypes.bool,
48
- checked: PropTypes.bool.isRequired,
49
- onChange: PropTypes.func.isRequired,
50
- value: PropTypes.string,
51
- label: PropTypes.string.isRequired,
52
- error: PropTypes.bool,
53
- };
54
-
55
- Checkbox.defaultProps = {
56
- value: '',
57
- mini: false,
58
- error: false,
59
- };
60
-
61
- export default Checkbox;
@@ -1,151 +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 FeedbackMenu from '../feedback-menu';
5
-
6
- describe('feedback-menu', () => {
7
- const onChange = jest.fn();
8
-
9
- beforeEach(() => {
10
- onChange.mockClear();
11
- });
12
-
13
- describe('rendering', () => {
14
- it('renders feedback menu with default options', () => {
15
- const { container } = render(<FeedbackMenu onChange={onChange} classes={{}} />);
16
- expect(container.firstChild).toBeInTheDocument();
17
- });
18
-
19
- it('renders menu with feedback type selector', () => {
20
- render(<FeedbackMenu onChange={onChange} value={{ type: 'default' }} classes={{}} />);
21
- // Menu button should be in the document
22
- expect(screen.getByRole('button')).toBeInTheDocument();
23
- });
24
-
25
- it('renders with no feedback type', () => {
26
- render(<FeedbackMenu onChange={onChange} value={{ type: 'none' }} classes={{}} />);
27
- expect(screen.getByRole('button')).toBeInTheDocument();
28
- });
29
-
30
- it('renders with custom feedback type', () => {
31
- render(<FeedbackMenu onChange={onChange} value={{ type: 'custom' }} classes={{}} />);
32
- expect(screen.getByRole('button')).toBeInTheDocument();
33
- });
34
-
35
- it('renders feedback icon button', () => {
36
- render(<FeedbackMenu onChange={onChange} classes={{}} />);
37
- const button = screen.getByRole('button');
38
- expect(button).toBeInTheDocument();
39
- });
40
- });
41
-
42
- describe('user interactions', () => {
43
- it('opens menu when button is clicked', async () => {
44
- const user = userEvent.setup();
45
- render(<FeedbackMenu onChange={onChange} value={{ type: 'default' }} classes={{}} />);
46
-
47
- const button = screen.getByRole('button');
48
- await user.click(button);
49
-
50
- // Menu items should appear
51
- expect(screen.getByText('No Feedback')).toBeInTheDocument();
52
- expect(screen.getByText('Default')).toBeInTheDocument();
53
- expect(screen.getByText('Custom')).toBeInTheDocument();
54
- });
55
-
56
- it('calls onChange with "none" when No Feedback is selected', async () => {
57
- const user = userEvent.setup();
58
- render(<FeedbackMenu onChange={onChange} value={{ type: 'default' }} classes={{}} />);
59
-
60
- const button = screen.getByRole('button');
61
- await user.click(button);
62
-
63
- const noFeedbackOption = screen.getByText('No Feedback');
64
- await user.click(noFeedbackOption);
65
-
66
- expect(onChange).toHaveBeenCalledWith('none');
67
- });
68
-
69
- it('calls onChange with "default" when Default is selected', async () => {
70
- const user = userEvent.setup();
71
- render(<FeedbackMenu onChange={onChange} value={{ type: 'none' }} classes={{}} />);
72
-
73
- const button = screen.getByRole('button');
74
- await user.click(button);
75
-
76
- const defaultOption = screen.getByText('Default');
77
- await user.click(defaultOption);
78
-
79
- expect(onChange).toHaveBeenCalledWith('default');
80
- });
81
-
82
- it('calls onChange with "custom" when Custom is selected', async () => {
83
- const user = userEvent.setup();
84
- render(<FeedbackMenu onChange={onChange} value={{ type: 'none' }} classes={{}} />);
85
-
86
- const button = screen.getByRole('button');
87
- await user.click(button);
88
-
89
- const customOption = screen.getByText('Custom');
90
- await user.click(customOption);
91
-
92
- expect(onChange).toHaveBeenCalledWith('custom');
93
- });
94
-
95
- it('closes menu after selection', async () => {
96
- const user = userEvent.setup();
97
- render(<FeedbackMenu onChange={onChange} value={{ type: 'default' }} classes={{}} />);
98
-
99
- const button = screen.getByRole('button');
100
- await user.click(button);
101
-
102
- expect(screen.getByText('No Feedback')).toBeInTheDocument();
103
-
104
- const noFeedbackOption = screen.getByText('No Feedback');
105
- await user.click(noFeedbackOption);
106
-
107
- // Menu should close after selection
108
- expect(onChange).toHaveBeenCalledWith('none');
109
- });
110
- });
111
-
112
- describe('feedback type indicators', () => {
113
- it('shows correct icon color for default feedback', () => {
114
- const { container } = render(<FeedbackMenu onChange={onChange} value={{ type: 'default' }} classes={{}} />);
115
- // Icon should be present with primary color
116
- expect(container.querySelector('svg')).toBeInTheDocument();
117
- });
118
-
119
- it('shows correct icon color for custom feedback', () => {
120
- const { container } = render(<FeedbackMenu onChange={onChange} value={{ type: 'custom' }} classes={{}} />);
121
- // Icon should be present with primary color
122
- expect(container.querySelector('svg')).toBeInTheDocument();
123
- });
124
-
125
- it('shows correct icon color for disabled feedback', () => {
126
- const { container } = render(<FeedbackMenu onChange={onChange} value={{ type: 'none' }} classes={{}} />);
127
- // Icon should be present with disabled color
128
- expect(container.querySelector('svg')).toBeInTheDocument();
129
- });
130
- });
131
-
132
- describe('aria labels', () => {
133
- it('has aria-label on button for default feedback', () => {
134
- render(<FeedbackMenu onChange={onChange} value={{ type: 'default' }} classes={{}} />);
135
- const button = screen.getByRole('button', { name: /Default Feedback/i });
136
- expect(button).toBeInTheDocument();
137
- });
138
-
139
- it('has aria-label on button for custom feedback', () => {
140
- render(<FeedbackMenu onChange={onChange} value={{ type: 'custom' }} classes={{}} />);
141
- const button = screen.getByRole('button', { name: /Custom Feedback/i });
142
- expect(button).toBeInTheDocument();
143
- });
144
-
145
- it('has aria-label on button for disabled feedback', () => {
146
- render(<FeedbackMenu onChange={onChange} value={{ type: 'none' }} classes={{}} />);
147
- const button = screen.getByRole('button', { name: /Feedback disabled/i });
148
- expect(button).toBeInTheDocument();
149
- });
150
- });
151
- });