orc-shared 5.10.2 → 5.99.0-dev.10

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 (234) hide show
  1. package/dist/components/AppFrame/About.js +13 -13
  2. package/dist/components/AppFrame/Anchor.js +7 -7
  3. package/dist/components/AppFrame/AppFrame.js +3 -3
  4. package/dist/components/AppFrame/Help.js +4 -4
  5. package/dist/components/AppFrame/MenuItem.js +17 -26
  6. package/dist/components/AppFrame/Preferences.js +14 -14
  7. package/dist/components/AppFrame/Sidebar.js +6 -6
  8. package/dist/components/AppFrame/Topbar.js +6 -6
  9. package/dist/components/ApplicationModuleLoader.js +3 -2
  10. package/dist/components/Authenticate.js +29 -22
  11. package/dist/components/DropMenu/Menu.js +9 -9
  12. package/dist/components/ErrorPlaceholder.js +8 -24
  13. package/dist/components/Form/Field.js +4 -4
  14. package/dist/components/Form/Inputs/Button.js +2 -2
  15. package/dist/components/Form/Inputs/MultiSelector.js +137 -0
  16. package/dist/components/Form/Inputs/Selector.js +13 -10
  17. package/dist/components/Form/Inputs/index.js +1 -1
  18. package/dist/components/InternetExplorerWarningMessage.js +15 -15
  19. package/dist/components/LoadingIcon.js +38 -17
  20. package/dist/components/MaterialUI/DataDisplay/Modal.js +3 -3
  21. package/dist/components/MaterialUI/DataDisplay/PredefinedElements/Placeholder.js +6 -6
  22. package/dist/components/MaterialUI/DataDisplay/PredefinedElements/StepperModal.js +1 -1
  23. package/dist/components/MaterialUI/DataDisplay/PredefinedElements/TableInfoBar.js +1 -1
  24. package/dist/components/MaterialUI/DataDisplay/SelectionList.js +1 -1
  25. package/dist/components/MaterialUI/DataDisplay/Table.js +2 -1
  26. package/dist/components/MaterialUI/DataDisplay/TableProps.js +3 -1
  27. package/dist/components/MaterialUI/DataDisplay/TransferList.js +1 -1
  28. package/dist/components/MaterialUI/Inputs/CheckboxGroup.js +1 -1
  29. package/dist/components/MaterialUI/Inputs/DatePicker.js +1 -1
  30. package/dist/components/MaterialUI/Inputs/PredefinedElements/SearchControl.js +1 -1
  31. package/dist/components/MaterialUI/Inputs/Select.js +175 -109
  32. package/dist/components/MaterialUI/Inputs/SelectProps.js +11 -1
  33. package/dist/components/MaterialUI/Inputs/Switch.js +1 -1
  34. package/dist/components/MaterialUI/Navigation/DropDownMenu.js +2 -4
  35. package/dist/components/MaterialUI/ScopeSelector/ScopeSelector.js +1 -1
  36. package/dist/components/MaterialUI/ScopeSelector/TreeItem.js +27 -42
  37. package/dist/components/MaterialUI/Surfaces/Paper.js +1 -1
  38. package/dist/components/MaterialUI/Surfaces/SectionExpansionPanel.js +3 -2
  39. package/dist/components/MaterialUI/muiThemes.js +3 -1
  40. package/dist/components/Provision.js +30 -13
  41. package/dist/components/Routing/SegmentPage.js +117 -56
  42. package/dist/components/Scope/ScopeNode.js +62 -57
  43. package/dist/components/Sidepanel.js +59 -23
  44. package/dist/components/Spritesheet.js +35 -17
  45. package/dist/components/Text.js +1 -60
  46. package/dist/components/ToastList.js +95 -64
  47. package/dist/components/Treeview/Branch.js +82 -20
  48. package/dist/components/Treeview/Label.js +108 -31
  49. package/dist/components/Treeview/Leaf.js +56 -12
  50. package/dist/components/Treeview/Node.js +22 -9
  51. package/dist/components/Treeview/index.js +7 -1
  52. package/dist/components/Treeview/settings.js +17 -6
  53. package/dist/{components/Modal/index.js → hooks/useWindowSize.js} +38 -36
  54. package/dist/sharedMessages.js +8 -0
  55. package/dist/utils/index.js +0 -4
  56. package/dist/utils/testUtils.js +1 -12
  57. package/dist/{components/Modal/Background.js → utils/toastHelper.js} +11 -14
  58. package/package.json +2 -2
  59. package/src/components/AppFrame/About.js +13 -13
  60. package/src/components/AppFrame/Anchor.js +7 -7
  61. package/src/components/AppFrame/AppFrame.js +3 -3
  62. package/src/components/AppFrame/Help.js +4 -4
  63. package/src/components/AppFrame/MenuItem.js +15 -23
  64. package/src/components/AppFrame/Preferences.js +14 -14
  65. package/src/components/AppFrame/Sidebar.js +6 -6
  66. package/src/components/AppFrame/Topbar.js +6 -6
  67. package/src/components/ApplicationModuleLoader.js +2 -2
  68. package/src/components/ApplicationModuleLoader.test.js +15 -28
  69. package/src/components/Authenticate.js +21 -23
  70. package/src/components/Authenticate.test.js +19 -27
  71. package/src/components/DropMenu/Menu.js +9 -9
  72. package/src/components/ErrorPlaceholder.js +4 -21
  73. package/src/components/ErrorPlaceholder.test.js +7 -14
  74. package/src/components/Form/Field.js +4 -4
  75. package/src/components/Form/InputField.test.js +2 -1
  76. package/src/components/Form/Inputs/Button.js +2 -2
  77. package/src/components/Form/Inputs/MultiSelector.js +73 -0
  78. package/src/components/Form/Inputs/MultiSelector.test.js +332 -0
  79. package/src/components/Form/Inputs/Selector.js +12 -4
  80. package/src/components/Form/Inputs/Selector.test.js +27 -12
  81. package/src/components/Form/Inputs/index.js +1 -1
  82. package/src/components/InternetExplorerWarningMessage.js +15 -15
  83. package/src/components/Loader.test.js +50 -59
  84. package/src/components/LoadingIcon.js +27 -14
  85. package/src/components/LoadingIcon.test.js +11 -15
  86. package/src/components/MaterialUI/DataDisplay/Modal.js +3 -3
  87. package/src/components/MaterialUI/DataDisplay/PredefinedElements/Placeholder.js +6 -6
  88. package/src/components/MaterialUI/DataDisplay/PredefinedElements/StepperModal.js +1 -1
  89. package/src/components/MaterialUI/DataDisplay/PredefinedElements/TableInfoBar.js +1 -1
  90. package/src/components/MaterialUI/DataDisplay/SelectionList.js +1 -1
  91. package/src/components/MaterialUI/DataDisplay/Table.js +6 -1
  92. package/src/components/MaterialUI/DataDisplay/Table.test.js +21 -1
  93. package/src/components/MaterialUI/DataDisplay/TableProps.js +2 -0
  94. package/src/components/MaterialUI/DataDisplay/TableProps.test.js +20 -2
  95. package/src/components/MaterialUI/DataDisplay/TransferList.js +1 -1
  96. package/src/components/MaterialUI/Inputs/CheckboxGroup.js +1 -1
  97. package/src/components/MaterialUI/Inputs/DatePicker.js +1 -1
  98. package/src/components/MaterialUI/Inputs/PredefinedElements/SearchControl.js +1 -1
  99. package/src/components/MaterialUI/Inputs/PredefinedElements/SearchControl.test.js +1 -1
  100. package/src/components/MaterialUI/Inputs/Select.js +143 -83
  101. package/src/components/MaterialUI/Inputs/Select.test.js +199 -14
  102. package/src/components/MaterialUI/Inputs/SelectProps.js +10 -0
  103. package/src/components/MaterialUI/Inputs/SelectProps.test.js +10 -0
  104. package/src/components/MaterialUI/Inputs/Switch.js +1 -1
  105. package/src/components/MaterialUI/Navigation/DropDownMenu.js +2 -2
  106. package/src/components/MaterialUI/Navigation/DropDownMenu.test.js +5 -6
  107. package/src/components/MaterialUI/ScopeSelector/ScopeSelector.js +1 -2
  108. package/src/components/MaterialUI/ScopeSelector/TreeItem.js +8 -31
  109. package/src/components/MaterialUI/Surfaces/Paper.js +1 -1
  110. package/src/components/MaterialUI/Surfaces/SectionExpansionPanel.js +2 -1
  111. package/src/components/MaterialUI/muiThemes.js +4 -1
  112. package/src/components/Navigation/Navigation.test.js +0 -5
  113. package/src/components/Navigation/useNavigationState.test.js +79 -222
  114. package/src/components/Provision.js +36 -42
  115. package/src/components/Provision.test.js +10 -26
  116. package/src/components/Routing/SegmentPage.js +68 -52
  117. package/src/components/Routing/SegmentPage.test.js +4 -12
  118. package/src/components/Scope/ScopeNode.js +44 -55
  119. package/src/components/Scope/ScopeNode.test.js +84 -163
  120. package/src/components/ScopeExtendedConfigurationLoader.test.js +1 -4
  121. package/src/components/Sidepanel.js +38 -32
  122. package/src/components/Sidepanel.test.js +54 -27
  123. package/src/components/Spritesheet.js +23 -21
  124. package/src/components/Spritesheet.test.js +10 -10
  125. package/src/components/Text.js +0 -49
  126. package/src/components/ToastList.js +79 -90
  127. package/src/components/ToastList.test.js +29 -103
  128. package/src/components/Treeview/Branch.js +65 -47
  129. package/src/components/Treeview/Branch.test.js +2 -43
  130. package/src/components/Treeview/Label.js +68 -54
  131. package/src/components/Treeview/Label.test.js +55 -63
  132. package/src/components/Treeview/Leaf.js +41 -22
  133. package/src/components/Treeview/Leaf.test.js +1 -15
  134. package/src/components/Treeview/Node.js +16 -9
  135. package/src/components/Treeview/Node.test.js +269 -200
  136. package/src/components/Treeview/Treeview.test.js +248 -248
  137. package/src/components/Treeview/index.js +6 -0
  138. package/src/components/Treeview/settings.js +10 -6
  139. package/src/hooks/useMultipleFieldEditState.test.js +0 -1
  140. package/src/hooks/useWindowSize.js +39 -0
  141. package/src/hooks/useWindowSize.test.js +68 -0
  142. package/src/sharedMessages.js +8 -0
  143. package/src/translations/en-US.json +2 -0
  144. package/src/translations/fr-CA.json +2 -0
  145. package/src/utils/index.js +0 -4
  146. package/src/utils/testUtils.js +0 -10
  147. package/src/utils/testUtils.test.js +0 -68
  148. package/src/utils/toastHelper.js +8 -0
  149. package/src/utils/toastHelper.test.js +41 -0
  150. package/dist/components/Button.js +0 -70
  151. package/dist/components/CategoryList.js +0 -197
  152. package/dist/components/Checkbox.js +0 -103
  153. package/dist/components/Icon.js +0 -69
  154. package/dist/components/IconButton.js +0 -80
  155. package/dist/components/Input.js +0 -101
  156. package/dist/components/List/DataCell.js +0 -129
  157. package/dist/components/List/HeadCell.js +0 -125
  158. package/dist/components/List/HeadRow.js +0 -73
  159. package/dist/components/List/List.js +0 -274
  160. package/dist/components/List/Row.js +0 -109
  161. package/dist/components/List/enhanceColumnDefs.js +0 -111
  162. package/dist/components/List/index.js +0 -59
  163. package/dist/components/Modal/Dialog.js +0 -75
  164. package/dist/components/Modal/Wrapper.js +0 -69
  165. package/dist/components/MultiSelector.js +0 -187
  166. package/dist/components/Navigation/Bar.js +0 -293
  167. package/dist/components/Navigation/Tab.js +0 -182
  168. package/dist/components/Placeholder.js +0 -114
  169. package/dist/components/Scope/Selector.js +0 -123
  170. package/dist/components/Selector.js +0 -185
  171. package/dist/components/Switch.js +0 -128
  172. package/dist/components/Toolbar.js +0 -227
  173. package/dist/components/Tooltip.js +0 -66
  174. package/dist/getTheme.js +0 -158
  175. package/dist/getThemeOverrides.js +0 -93
  176. package/dist/hocs/withAuthentication.js +0 -72
  177. package/dist/utils/styledPropFuncs.js +0 -88
  178. package/src/components/Button.js +0 -90
  179. package/src/components/Button.test.js +0 -49
  180. package/src/components/CategoryList.js +0 -140
  181. package/src/components/CategoryList.test.js +0 -667
  182. package/src/components/Checkbox.js +0 -63
  183. package/src/components/Checkbox.test.js +0 -122
  184. package/src/components/Icon.js +0 -18
  185. package/src/components/IconButton.js +0 -30
  186. package/src/components/IconButton.test.js +0 -61
  187. package/src/components/Input.js +0 -35
  188. package/src/components/Input.test.js +0 -34
  189. package/src/components/List/DataCell.js +0 -77
  190. package/src/components/List/DataCell.test.js +0 -357
  191. package/src/components/List/HeadCell.js +0 -105
  192. package/src/components/List/HeadCell.test.js +0 -331
  193. package/src/components/List/HeadRow.js +0 -21
  194. package/src/components/List/HeadRow.test.js +0 -27
  195. package/src/components/List/List.js +0 -162
  196. package/src/components/List/List.test.js +0 -705
  197. package/src/components/List/Row.js +0 -72
  198. package/src/components/List/Row.test.js +0 -194
  199. package/src/components/List/enhanceColumnDefs.js +0 -54
  200. package/src/components/List/enhanceColumnDefs.test.js +0 -179
  201. package/src/components/List/index.js +0 -6
  202. package/src/components/Modal/Background.js +0 -10
  203. package/src/components/Modal/Dialog.js +0 -27
  204. package/src/components/Modal/Dialog.test.js +0 -20
  205. package/src/components/Modal/Modal.test.js +0 -52
  206. package/src/components/Modal/Wrapper.js +0 -32
  207. package/src/components/Modal/Wrapper.test.js +0 -55
  208. package/src/components/Modal/index.js +0 -22
  209. package/src/components/MultiSelector.js +0 -104
  210. package/src/components/MultiSelector.test.js +0 -348
  211. package/src/components/Navigation/Bar.js +0 -212
  212. package/src/components/Navigation/Bar.test.js +0 -552
  213. package/src/components/Navigation/Tab.js +0 -156
  214. package/src/components/Navigation/Tab.test.js +0 -404
  215. package/src/components/Placeholder.js +0 -61
  216. package/src/components/Placeholder.test.js +0 -106
  217. package/src/components/Scope/Selector.js +0 -70
  218. package/src/components/Scope/Selector.test.js +0 -138
  219. package/src/components/Selector.js +0 -191
  220. package/src/components/Selector.test.js +0 -157
  221. package/src/components/Switch.js +0 -112
  222. package/src/components/Switch.test.js +0 -130
  223. package/src/components/Text.test.js +0 -132
  224. package/src/components/Toolbar.js +0 -178
  225. package/src/components/Toolbar.test.js +0 -478
  226. package/src/components/Tooltip.js +0 -51
  227. package/src/components/Tooltip.test.js +0 -21
  228. package/src/getTheme.js +0 -103
  229. package/src/getTheme.test.js +0 -92
  230. package/src/getThemeOverrides.js +0 -27
  231. package/src/hocs/withAuthentication.js +0 -18
  232. package/src/hocs/withAuthentication.test.js +0 -120
  233. package/src/utils/styledPropFuncs.js +0 -20
  234. package/src/utils/styledPropFuncs.test.js +0 -166
@@ -0,0 +1,332 @@
1
+ import React from "react";
2
+ import sinon from "sinon";
3
+ import MultiSelector from "./MultiSelector";
4
+ import { TestWrapper, createMuiTheme, extractMessages } from "../../../utils/testUtils";
5
+ import Immutable from "immutable";
6
+ import SelectMUI from "@material-ui/core/Select";
7
+ import MenuItem from "@material-ui/core/MenuItem";
8
+ import TooltippedTypography from "../../MaterialUI/DataDisplay/TooltippedElements/TooltippedTypography";
9
+ import Icon from "../../MaterialUI/DataDisplay/Icon";
10
+ import FormControl from "@material-ui/core/FormControl";
11
+ import { render, screen, fireEvent } from "@testing-library/react";
12
+ import sharedMessages from "../../../sharedMessages";
13
+
14
+ const messages = extractMessages(sharedMessages);
15
+
16
+ describe("MultiSelector", () => {
17
+ let update, state, store, chevronDown, multipleRenderValue;
18
+ beforeEach(() => {
19
+ update = sinon.spy().named("update");
20
+ multipleRenderValue = sinon.fake.returns("En, It");
21
+
22
+ state = Immutable.fromJS({
23
+ locale: {
24
+ locale: "en-CA",
25
+ },
26
+ });
27
+
28
+ store = {
29
+ subscribe: () => {},
30
+ dispatch: () => {},
31
+ getState: () => state,
32
+ };
33
+
34
+ chevronDown = props => {
35
+ return <Icon id="dropdown-chevron-down" {...props} />;
36
+ };
37
+ });
38
+
39
+ const theme = createMuiTheme();
40
+
41
+ it("renders a multi selector with multiple options", () =>
42
+ expect(
43
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
44
+ <MultiSelector
45
+ update={update}
46
+ value={["English"]}
47
+ options={[
48
+ { value: "English", label: "English" },
49
+ { value: "Francais", label: "Francais" },
50
+ ]}
51
+ />
52
+ </TestWrapper>,
53
+ "when mounted",
54
+ "to satisfy",
55
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
56
+ <FormControl>
57
+ <SelectMUI
58
+ value={["English"]}
59
+ disableUnderline={true}
60
+ IconComponent={chevronDown}
61
+ error={false}
62
+ multiple={true}
63
+ renderValue={selected => selected.join(", ")}
64
+ >
65
+ <MenuItem key="English" value="English">
66
+ <TooltippedTypography children="English" titleValue="English" />
67
+ </MenuItem>
68
+ <MenuItem key="Francais" value="Francais">
69
+ <TooltippedTypography noWrap children="Francais" titleValue="Francais" />
70
+ </MenuItem>
71
+ </SelectMUI>
72
+ </FormControl>
73
+ </TestWrapper>,
74
+ ));
75
+
76
+ it("renders a multi selector with select all and clear options without errors", () =>
77
+ expect(
78
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
79
+ <MultiSelector
80
+ update={update}
81
+ addClearSelectAll={true}
82
+ value={["English"]}
83
+ options={[
84
+ { value: "English", label: "English" },
85
+ { value: "Francais", label: "Francais" },
86
+ ]}
87
+ />
88
+ </TestWrapper>,
89
+ "when mounted",
90
+ "to satisfy",
91
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
92
+ <FormControl>
93
+ <SelectMUI
94
+ value={["English"]}
95
+ disableUnderline={true}
96
+ IconComponent={chevronDown}
97
+ error={false}
98
+ multiple={false}
99
+ renderValue={selected => selected.join(", ")}
100
+ >
101
+ <MenuItem key="English" value="English">
102
+ <TooltippedTypography children="English" titleValue="English" />
103
+ </MenuItem>
104
+ <MenuItem key="Francais" value="Francais">
105
+ <TooltippedTypography noWrap children="Francais" titleValue="Francais" />
106
+ </MenuItem>
107
+ </SelectMUI>
108
+ </FormControl>
109
+ </TestWrapper>,
110
+ ));
111
+
112
+ it("Expect multipleRenderValue to be called and selection to be rendered correctly", () => {
113
+ const allOptions = [
114
+ { value: "English", label: "English" },
115
+ { value: "Francais", label: "Francais" },
116
+ { value: "Italiano", label: "Italiano" },
117
+ ];
118
+
119
+ const multiSelector = (
120
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
121
+ <MultiSelector
122
+ update={update}
123
+ multipleRenderValue={multipleRenderValue}
124
+ value={["English", "Italiano"]}
125
+ options={allOptions}
126
+ />
127
+ </TestWrapper>
128
+ );
129
+
130
+ render(multiSelector);
131
+
132
+ const selectionText = screen.queryByText("En, It");
133
+
134
+ expect(selectionText, "not to be null");
135
+ expect(multipleRenderValue, "to have a call satisfying", { args: [["English", "Italiano"], allOptions] });
136
+ });
137
+
138
+ it("Expect to have both 'Select All' and 'Clear' options to be available with partial selection", () => {
139
+ const multiSelector = (
140
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
141
+ <MultiSelector
142
+ update={update}
143
+ addClearSelectAll={true}
144
+ value={["English"]}
145
+ options={[
146
+ { value: "English", label: "English" },
147
+ { value: "Francais", label: "Francais" },
148
+ ]}
149
+ />
150
+ </TestWrapper>
151
+ );
152
+
153
+ render(multiSelector);
154
+
155
+ const selectButton = screen.getByRole("button");
156
+ fireEvent.mouseDown(selectButton);
157
+
158
+ const selectAllOption = screen.queryByText("Select All");
159
+ const clearOption = screen.queryByText("Clear");
160
+
161
+ expect(selectAllOption, "not to be null");
162
+ expect(clearOption, "not to be null");
163
+ });
164
+
165
+ it("Expect to have only 'Clear' option to be available with all options being selected", () => {
166
+ const multiSelector = (
167
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
168
+ <MultiSelector
169
+ update={update}
170
+ addClearSelectAll={true}
171
+ value={["English", "Francais"]}
172
+ options={[
173
+ { value: "English", label: "English" },
174
+ { value: "Francais", label: "Francais" },
175
+ ]}
176
+ />
177
+ </TestWrapper>
178
+ );
179
+
180
+ render(multiSelector);
181
+
182
+ const selectButton = screen.getByRole("button");
183
+ fireEvent.mouseDown(selectButton);
184
+
185
+ const selectAllOption = screen.queryByText("Select All");
186
+ const clearOption = screen.queryByText("Clear");
187
+
188
+ expect(selectAllOption, "to be null");
189
+ expect(clearOption, "not to be null");
190
+ });
191
+
192
+ it("Expect to have only 'Select All' option to be available with an empty selection", () => {
193
+ const multiSelector = (
194
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
195
+ <MultiSelector
196
+ update={update}
197
+ addClearSelectAll={true}
198
+ value={[]}
199
+ options={[
200
+ { value: "English", label: "English" },
201
+ { value: "Francais", label: "Francais" },
202
+ ]}
203
+ />
204
+ </TestWrapper>
205
+ );
206
+
207
+ render(multiSelector);
208
+
209
+ const selectButton = screen.getByRole("button");
210
+ fireEvent.mouseDown(selectButton);
211
+
212
+ const selectAllOption = screen.queryByText("Select All");
213
+ const clearOption = screen.queryByText("Clear");
214
+
215
+ expect(selectAllOption, "not to be null");
216
+ expect(clearOption, "to be null");
217
+ });
218
+
219
+ it("Picking one selection should update with it along with existing ones", () => {
220
+ const multiSelector = (
221
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
222
+ <MultiSelector
223
+ update={update}
224
+ addClearSelectAll={true}
225
+ value={["English"]}
226
+ options={[
227
+ { value: "English", label: "English" },
228
+ { value: "Francais", label: "Francais" },
229
+ { value: "Italiano", label: "Italiano" },
230
+ ]}
231
+ />
232
+ </TestWrapper>
233
+ );
234
+
235
+ render(multiSelector);
236
+
237
+ const selectButton = screen.getByRole("button");
238
+ fireEvent.mouseDown(selectButton);
239
+
240
+ const optionToSelect = screen.getByText("Italiano");
241
+ fireEvent.click(optionToSelect);
242
+
243
+ expect(update, "to have calls satisfying", [{ args: [["English", "Italiano"]] }]);
244
+ });
245
+
246
+ it("The 'Select All' option should update with all values", () => {
247
+ const multiSelector = (
248
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
249
+ <MultiSelector
250
+ update={update}
251
+ addClearSelectAll={true}
252
+ value={["English"]}
253
+ options={[
254
+ { value: "English", label: "English" },
255
+ { value: "Francais", label: "Francais" },
256
+ { value: "Italiano", label: "Italiano" },
257
+ ]}
258
+ />
259
+ </TestWrapper>
260
+ );
261
+
262
+ render(multiSelector);
263
+
264
+ const selectButton = screen.getByRole("button");
265
+ fireEvent.mouseDown(selectButton);
266
+
267
+ const optionToSelect = screen.getByText("Select All");
268
+ fireEvent.click(optionToSelect);
269
+
270
+ expect(update, "to have calls satisfying", [{ args: [["English", "Francais", "Italiano"]] }]);
271
+ });
272
+
273
+ it("The 'Clear' option should update with an empty list", () => {
274
+ const multiSelector = (
275
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
276
+ <MultiSelector
277
+ update={update}
278
+ addClearSelectAll={true}
279
+ value={["English"]}
280
+ options={[
281
+ { value: "English", label: "English" },
282
+ { value: "Francais", label: "Francais" },
283
+ { value: "Italiano", label: "Italiano" },
284
+ ]}
285
+ />
286
+ </TestWrapper>
287
+ );
288
+
289
+ render(multiSelector);
290
+
291
+ const selectButton = screen.getByRole("button");
292
+ fireEvent.mouseDown(selectButton);
293
+
294
+ const optionToSelect = screen.getByText("Clear");
295
+ fireEvent.click(optionToSelect);
296
+
297
+ expect(update, "to have calls satisfying", [{ args: [[]] }]);
298
+ });
299
+
300
+ it("renders a multi selector with an error", () => {
301
+ expect(
302
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
303
+ <MultiSelector
304
+ update={update}
305
+ required={true}
306
+ value={[]}
307
+ options={[
308
+ { value: "English", label: "English" },
309
+ { value: "Francais", label: "Francais" },
310
+ ]}
311
+ />
312
+ </TestWrapper>,
313
+ "when mounted",
314
+ "to satisfy",
315
+ <TestWrapper provider={{ store }} intlProvider={{ messages }} stylesProvider muiThemeProvider={{ theme }}>
316
+ <FormControl>
317
+ <div>
318
+ <SelectMUI value={[""]} disableUnderline={true} IconComponent={chevronDown} error={true} multiple={true}>
319
+ <MenuItem key="English" value="English">
320
+ <TooltippedTypography children="English" titleValue="English" />
321
+ </MenuItem>
322
+ <MenuItem key="Francais" value="Francais">
323
+ <TooltippedTypography noWrap children="Francais" titleValue="Francais" />
324
+ </MenuItem>
325
+ </SelectMUI>
326
+ <div></div>
327
+ </div>
328
+ </FormControl>
329
+ </TestWrapper>,
330
+ );
331
+ });
332
+ });
@@ -1,17 +1,25 @@
1
1
  import React from "react";
2
2
  import Select from "../../MaterialUI/Inputs/Select";
3
- import { memoize } from "../../../utils";
4
3
  import SelectProps from "../../MaterialUI/Inputs/SelectProps";
5
4
 
6
- export const selectEventUpdater = memoize(update => value => update(value));
7
-
8
5
  const Selector = ({ value, options, update, ...props }) => {
9
6
  const selectProps = new SelectProps();
10
7
 
11
8
  selectProps.set(SelectProps.propNames.value, value);
12
9
  selectProps.set(SelectProps.propNames.onClose, props.onBlur);
13
10
  selectProps.set(SelectProps.propNames.disabled, props.disabled);
14
- selectProps.set(SelectProps.propNames.update, selectEventUpdater(update));
11
+ selectProps.set(SelectProps.propNames.update, update);
12
+ selectProps.set(SelectProps.propNames.autoWidth, false);
13
+ selectProps.set(SelectProps.propNames.positionOverride, {
14
+ anchorOrigin: {
15
+ vertical: "bottom",
16
+ horizontal: "left",
17
+ },
18
+ transformOrigin: {
19
+ vertical: "top",
20
+ horizontal: "left",
21
+ },
22
+ });
15
23
 
16
24
  const hasError = props.required && !value ? true : false;
17
25
  selectProps.set(SelectProps.propNames.error, hasError);
@@ -1,12 +1,13 @@
1
1
  import React from "react";
2
2
  import sinon from "sinon";
3
- import Selector, { selectEventUpdater } from "./Selector";
3
+ import Selector from "./Selector";
4
4
  import { TestWrapper, createMuiTheme } from "./../../../utils/testUtils";
5
5
  import Immutable from "immutable";
6
6
  import SelectMUI from "@material-ui/core/Select";
7
7
  import MenuItem from "@material-ui/core/MenuItem";
8
8
  import TooltippedTypography from "../../MaterialUI/DataDisplay/TooltippedElements/TooltippedTypography";
9
9
  import Icon from "../../MaterialUI/DataDisplay/Icon";
10
+ import { mount } from "enzyme";
10
11
 
11
12
  describe("Selector", () => {
12
13
  let update, state, store, chevronDown;
@@ -88,18 +89,32 @@ describe("Selector", () => {
88
89
  </TestWrapper>,
89
90
  );
90
91
  });
91
- });
92
92
 
93
- describe("selectEventUpdater", () => {
94
- let update;
95
- beforeEach(() => {
96
- update = sinon.spy().named("update");
97
- });
93
+ it("Update is invoked when selection has changed", () => {
94
+ const mountedComponent = mount(
95
+ <TestWrapper provider={{ store }} stylesProvider muiThemeProvider intlProvider>
96
+ <Selector
97
+ update={update}
98
+ required={true}
99
+ value={null}
100
+ options={[
101
+ { value: "English", label: "English" },
102
+ { value: "Francais", label: "Francais" },
103
+ ]}
104
+ />
105
+ </TestWrapper>,
106
+ );
98
107
 
99
- it("creates a handler for an event and calls update with the value of the target", () =>
100
- expect(selectEventUpdater, "called with", [update], "called with", ["foo"]).then(() =>
101
- expect(update, "to have calls satisfying", [{ args: ["foo"] }]),
102
- ));
108
+ const selectMui = mountedComponent.find(SelectMUI);
103
109
 
104
- it("is memoized", () => expect(selectEventUpdater, "called with", [update], "to be", selectEventUpdater(update)));
110
+ const event = {
111
+ target: {
112
+ value: "Francais",
113
+ },
114
+ };
115
+
116
+ selectMui.invoke("onChange")(event);
117
+
118
+ expect(update, "to have calls satisfying", [{ args: ["Francais"] }]);
119
+ });
105
120
  });
@@ -1,5 +1,5 @@
1
1
  import Selector from "./Selector";
2
- import MultiSelector from "../../MultiSelector";
2
+ import MultiSelector from "./MultiSelector";
3
3
  import Button from "./Button";
4
4
  import { ReadOnly } from "./ReadOnly";
5
5
  import { SwitchInput } from "./Toggles";
@@ -8,29 +8,29 @@ import sharedMessages from "../sharedMessages";
8
8
  const useStyles = makeStyles(theme => ({
9
9
  container: {
10
10
  fontFamily: "'Open Sans', sans-serif",
11
- fontSize: "14px",
11
+ fontSize: theme.spacing(1.4),
12
12
  background: "rgba(255,255,255,0.85)",
13
- maxWidth: "700px",
14
- width: "calc(100% - 40px)",
13
+ maxWidth: theme.spacing(70),
14
+ width: `calc(100% - ${theme.spacing(4)})`,
15
15
  display: "block",
16
16
  top: "50%",
17
17
  left: "50%",
18
18
  position: "absolute",
19
- boxShadow: "0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19)",
19
+ boxShadow: `${theme.spacing(0, 0.4, 0.8, 0)} rgba(0, 0, 0, 0.2), ${theme.spacing(0, 0.6, 2, 0)} rgba(0, 0, 0, 0.19)`,
20
20
  transform: "translateY(-50%) translateX(-50%)",
21
- padding: "80px",
22
- borderRadius: "3px",
21
+ padding: theme.spacing(8),
22
+ borderRadius: theme.spacing(0.3),
23
23
  "& header": {
24
- paddingBottom: "20px",
25
- marginBottom: "20px",
24
+ paddingBottom: theme.spacing(2),
25
+ marginBottom: theme.spacing(2),
26
26
  borderBottom: "1px solid #999",
27
27
  "& h1": {
28
28
  fontWeight: 400,
29
- fontWize: "30px",
29
+ fontWize: theme.spacing(3),
30
30
  marginTop: 0,
31
- marginBottom: "5px",
31
+ marginBottom: theme.spacing(0.5),
32
32
  "& p": {
33
- fontSize: "16px",
33
+ fontSize: theme.spacing(1.6),
34
34
  margin: 0,
35
35
  color: "#999",
36
36
  fontWeight: 400,
@@ -43,7 +43,7 @@ const useStyles = makeStyles(theme => ({
43
43
  flexWrap: "wrap",
44
44
  width: "100%",
45
45
  boxSizing: "border-box",
46
- marginTop: "40px",
46
+ marginTop: theme.spacing(4),
47
47
  },
48
48
  gridItem: {
49
49
  display: "flex",
@@ -52,16 +52,16 @@ const useStyles = makeStyles(theme => ({
52
52
  flexDirection: "column",
53
53
  },
54
54
  browserIconContainer: {
55
- width: "48px",
55
+ width: theme.spacing(4.8),
56
56
  textAlign: "center",
57
57
  },
58
58
  browserIconCaption: {
59
- fontSize: "11px",
59
+ fontSize: theme.spacing(1.1),
60
60
  color: "#999",
61
61
  },
62
62
  browserIcon: {
63
63
  stroke: "none",
64
- fontSize: "48px",
64
+ fontSize: theme.spacing(4.8),
65
65
  },
66
66
  }));
67
67