@itwin/appui-react 5.19.0 → 5.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/lib/appui-react/UiFramework.js +20 -13
  3. package/lib/appui-react/UiFramework.js.map +1 -1
  4. package/lib/appui-react/accudraw/AccuDrawPopupManager.js +1 -1
  5. package/lib/appui-react/accudraw/AccuDrawPopupManager.js.map +1 -1
  6. package/lib/appui-react/accudraw/AccuDrawWidget.js +1 -1
  7. package/lib/appui-react/accudraw/AccuDrawWidget.js.map +1 -1
  8. package/lib/appui-react/accudraw/Calculator.js +92 -98
  9. package/lib/appui-react/accudraw/Calculator.js.map +1 -1
  10. package/lib/appui-react/accudraw/CalculatorEngine.js +130 -129
  11. package/lib/appui-react/accudraw/CalculatorEngine.js.map +1 -1
  12. package/lib/appui-react/accudraw/CalculatorPopup.js +9 -12
  13. package/lib/appui-react/accudraw/CalculatorPopup.js.map +1 -1
  14. package/lib/appui-react/accudraw/FrameworkAccuDraw.js +39 -38
  15. package/lib/appui-react/accudraw/FrameworkAccuDraw.js.map +1 -1
  16. package/lib/appui-react/accudraw/MenuButton.js +20 -20
  17. package/lib/appui-react/accudraw/MenuButton.js.map +1 -1
  18. package/lib/appui-react/accudraw/MenuButtonPopup.js +9 -12
  19. package/lib/appui-react/accudraw/MenuButtonPopup.js.map +1 -1
  20. package/lib/appui-react/backstage/BackstageItemsManager.js +5 -5
  21. package/lib/appui-react/backstage/BackstageItemsManager.js.map +1 -1
  22. package/lib/appui-react/backstage/BackstageManager.js +1 -3
  23. package/lib/appui-react/backstage/BackstageManager.js.map +1 -1
  24. package/lib/appui-react/backstage/InternalBackstageManager.js +3 -5
  25. package/lib/appui-react/backstage/InternalBackstageManager.js.map +1 -1
  26. package/lib/appui-react/childwindow/InternalChildWindowManager.js +30 -32
  27. package/lib/appui-react/childwindow/InternalChildWindowManager.js.map +1 -1
  28. package/lib/appui-react/configurableui/ActivityTracker.js +33 -33
  29. package/lib/appui-react/configurableui/ActivityTracker.js.map +1 -1
  30. package/lib/appui-react/configurableui/ConfigurableUiContent.scss +0 -1
  31. package/lib/appui-react/configurableui/ConfigurableUiControl.js +8 -0
  32. package/lib/appui-react/configurableui/ConfigurableUiControl.js.map +1 -1
  33. package/lib/appui-react/configurableui/InternalConfigurableUiManager.js +8 -8
  34. package/lib/appui-react/configurableui/InternalConfigurableUiManager.js.map +1 -1
  35. package/lib/appui-react/configurableui/TimeTracker.js +25 -27
  36. package/lib/appui-react/configurableui/TimeTracker.js.map +1 -1
  37. package/lib/appui-react/content/ContentControl.js +2 -1
  38. package/lib/appui-react/content/ContentControl.js.map +1 -1
  39. package/lib/appui-react/content/ContentGroup.js +8 -4
  40. package/lib/appui-react/content/ContentGroup.js.map +1 -1
  41. package/lib/appui-react/content/ContentLayout.js +47 -38
  42. package/lib/appui-react/content/ContentLayout.js.map +1 -1
  43. package/lib/appui-react/content/IModelViewport.js +28 -23
  44. package/lib/appui-react/content/IModelViewport.js.map +1 -1
  45. package/lib/appui-react/content/InternalContentLayoutManager.js +1 -1
  46. package/lib/appui-react/content/InternalContentLayoutManager.js.map +1 -1
  47. package/lib/appui-react/content/InternalContentViewManager.js +9 -8
  48. package/lib/appui-react/content/InternalContentViewManager.js.map +1 -1
  49. package/lib/appui-react/content/StandardContentLayouts.js +141 -141
  50. package/lib/appui-react/content/StandardContentLayouts.js.map +1 -1
  51. package/lib/appui-react/content/ViewportContentControl.js +25 -22
  52. package/lib/appui-react/content/ViewportContentControl.js.map +1 -1
  53. package/lib/appui-react/cursor/CursorInformation.js +7 -6
  54. package/lib/appui-react/cursor/CursorInformation.js.map +1 -1
  55. package/lib/appui-react/cursor/cursorpopup/CursorPopup.js +9 -9
  56. package/lib/appui-react/cursor/cursorpopup/CursorPopup.js.map +1 -1
  57. package/lib/appui-react/cursor/cursorpopup/CursorPopupManager.js +7 -7
  58. package/lib/appui-react/cursor/cursorpopup/CursorPopupManager.js.map +1 -1
  59. package/lib/appui-react/dialog/DialogManagerBase.js +18 -19
  60. package/lib/appui-react/dialog/DialogManagerBase.js.map +1 -1
  61. package/lib/appui-react/dialog/InternalContentDialogManager.js +7 -7
  62. package/lib/appui-react/dialog/InternalContentDialogManager.js.map +1 -1
  63. package/lib/appui-react/dialog/InternalModalDialogManager.js +4 -4
  64. package/lib/appui-react/dialog/InternalModalDialogManager.js.map +1 -1
  65. package/lib/appui-react/dialog/InternalModelessDialogManager.js +6 -6
  66. package/lib/appui-react/dialog/InternalModelessDialogManager.js.map +1 -1
  67. package/lib/appui-react/dialog/ModelessDialog.js +3 -3
  68. package/lib/appui-react/dialog/ModelessDialog.js.map +1 -1
  69. package/lib/appui-react/feedback/ElementTooltip.js +3 -1
  70. package/lib/appui-react/feedback/ElementTooltip.js.map +1 -1
  71. package/lib/appui-react/feedback/ValidationTextbox.js +25 -25
  72. package/lib/appui-react/feedback/ValidationTextbox.js.map +1 -1
  73. package/lib/appui-react/frontstage/FrontstageDef.js +28 -10
  74. package/lib/appui-react/frontstage/FrontstageDef.js.map +1 -1
  75. package/lib/appui-react/frontstage/InternalFrontstageManager.js +96 -96
  76. package/lib/appui-react/frontstage/InternalFrontstageManager.js.map +1 -1
  77. package/lib/appui-react/frontstage/ModalFrontstage.js +5 -5
  78. package/lib/appui-react/frontstage/ModalFrontstage.js.map +1 -1
  79. package/lib/appui-react/frontstage/ModalSettingsStage.js +5 -4
  80. package/lib/appui-react/frontstage/ModalSettingsStage.js.map +1 -1
  81. package/lib/appui-react/frontstage/StandardFrontstageProvider.js +1 -0
  82. package/lib/appui-react/frontstage/StandardFrontstageProvider.js.map +1 -1
  83. package/lib/appui-react/keyboardshortcut/InternalKeyboardShortcut.js +22 -22
  84. package/lib/appui-react/keyboardshortcut/InternalKeyboardShortcut.js.map +1 -1
  85. package/lib/appui-react/keyboardshortcut/KeyboardShortcut.js +11 -9
  86. package/lib/appui-react/keyboardshortcut/KeyboardShortcut.js.map +1 -1
  87. package/lib/appui-react/keyboardshortcut/KeyboardShortcutMenu.js +17 -20
  88. package/lib/appui-react/keyboardshortcut/KeyboardShortcutMenu.js.map +1 -1
  89. package/lib/appui-react/layout/backstage/Backstage.js +11 -14
  90. package/lib/appui-react/layout/backstage/Backstage.js.map +1 -1
  91. package/lib/appui-react/layout/base/DragManager.js +6 -7
  92. package/lib/appui-react/layout/base/DragManager.js.map +1 -1
  93. package/lib/appui-react/layout/base/SafeAreaInsets.js +8 -8
  94. package/lib/appui-react/layout/base/SafeAreaInsets.js.map +1 -1
  95. package/lib/appui-react/layout/popup/Tooltip.js +8 -11
  96. package/lib/appui-react/layout/popup/Tooltip.js.map +1 -1
  97. package/lib/appui-react/layout/widget/Tab.d.ts.map +1 -1
  98. package/lib/appui-react/layout/widget/Tab.js +7 -5
  99. package/lib/appui-react/layout/widget/Tab.js.map +1 -1
  100. package/lib/appui-react/messages/InputField.js +21 -24
  101. package/lib/appui-react/messages/InputField.js.map +1 -1
  102. package/lib/appui-react/messages/MessageManager.js +39 -38
  103. package/lib/appui-react/messages/MessageManager.js.map +1 -1
  104. package/lib/appui-react/messages/Pointer.js +38 -38
  105. package/lib/appui-react/messages/Pointer.js.map +1 -1
  106. package/lib/appui-react/messages/ReactNotifyMessageDetails.js +6 -0
  107. package/lib/appui-react/messages/ReactNotifyMessageDetails.js.map +1 -1
  108. package/lib/appui-react/messages/StatusMessageManager.js +2 -4
  109. package/lib/appui-react/messages/StatusMessageManager.js.map +1 -1
  110. package/lib/appui-react/navigationaids/CubeNavigationAidControl.js +1 -1
  111. package/lib/appui-react/navigationaids/CubeNavigationAidControl.js.map +1 -1
  112. package/lib/appui-react/navigationaids/DrawingNavigationAidControl.js +1 -1
  113. package/lib/appui-react/navigationaids/DrawingNavigationAidControl.js.map +1 -1
  114. package/lib/appui-react/navigationaids/NavigationAidControl.js +1 -0
  115. package/lib/appui-react/navigationaids/NavigationAidControl.js.map +1 -1
  116. package/lib/appui-react/navigationaids/SheetNavigationAid.js +55 -54
  117. package/lib/appui-react/navigationaids/SheetNavigationAid.js.map +1 -1
  118. package/lib/appui-react/navigationaids/SheetsModalFrontstage.js +22 -20
  119. package/lib/appui-react/navigationaids/SheetsModalFrontstage.js.map +1 -1
  120. package/lib/appui-react/navigationaids/StandardRotationNavigationAid.js +15 -14
  121. package/lib/appui-react/navigationaids/StandardRotationNavigationAid.js.map +1 -1
  122. package/lib/appui-react/pickers/ListPicker.js +28 -28
  123. package/lib/appui-react/pickers/ListPicker.js.map +1 -1
  124. package/lib/appui-react/pickers/ViewSelector.js +87 -86
  125. package/lib/appui-react/pickers/ViewSelector.js.map +1 -1
  126. package/lib/appui-react/popup/CardPopup.js +18 -21
  127. package/lib/appui-react/popup/CardPopup.js.map +1 -1
  128. package/lib/appui-react/popup/HTMLElementPopup.js +9 -12
  129. package/lib/appui-react/popup/HTMLElementPopup.js.map +1 -1
  130. package/lib/appui-react/popup/InputEditorPopup.js +18 -20
  131. package/lib/appui-react/popup/InputEditorPopup.js.map +1 -1
  132. package/lib/appui-react/popup/PopupManager.js +22 -25
  133. package/lib/appui-react/popup/PopupManager.js.map +1 -1
  134. package/lib/appui-react/popup/ToolSettingsPopup.js +17 -17
  135. package/lib/appui-react/popup/ToolSettingsPopup.js.map +1 -1
  136. package/lib/appui-react/popup/ToolbarPopup.js +18 -21
  137. package/lib/appui-react/popup/ToolbarPopup.js.map +1 -1
  138. package/lib/appui-react/redux/ReducerRegistry.js +2 -0
  139. package/lib/appui-react/redux/ReducerRegistry.js.map +1 -1
  140. package/lib/appui-react/redux/StateManager.js +4 -1
  141. package/lib/appui-react/redux/StateManager.js.map +1 -1
  142. package/lib/appui-react/selection/HideIsolateEmphasizeManager.js +7 -3
  143. package/lib/appui-react/selection/HideIsolateEmphasizeManager.js.map +1 -1
  144. package/lib/appui-react/shared/ActionButtonItemDef.js +13 -6
  145. package/lib/appui-react/shared/ActionButtonItemDef.js.map +1 -1
  146. package/lib/appui-react/shared/CommandItemDef.js +3 -3
  147. package/lib/appui-react/shared/CommandItemDef.js.map +1 -1
  148. package/lib/appui-react/shared/CustomItemDef.js +4 -2
  149. package/lib/appui-react/shared/CustomItemDef.js.map +1 -1
  150. package/lib/appui-react/shared/ItemDefBase.js +13 -5
  151. package/lib/appui-react/shared/ItemDefBase.js.map +1 -1
  152. package/lib/appui-react/shared/MenuItem.js +6 -1
  153. package/lib/appui-react/shared/MenuItem.js.map +1 -1
  154. package/lib/appui-react/shared/ToolItemDef.js +1 -1
  155. package/lib/appui-react/shared/ToolItemDef.js.map +1 -1
  156. package/lib/appui-react/stagepanels/StagePanelDef.js +4 -3
  157. package/lib/appui-react/stagepanels/StagePanelDef.js.map +1 -1
  158. package/lib/appui-react/statusbar/StatusBarItemsManager.js +5 -5
  159. package/lib/appui-react/statusbar/StatusBarItemsManager.js.map +1 -1
  160. package/lib/appui-react/statusfields/ViewAttributes.js +16 -16
  161. package/lib/appui-react/statusfields/ViewAttributes.js.map +1 -1
  162. package/lib/appui-react/statusfields/tileloading/TileLoadingIndicator.js +35 -33
  163. package/lib/appui-react/statusfields/tileloading/TileLoadingIndicator.js.map +1 -1
  164. package/lib/appui-react/syncui/InternalSyncUiEventDispatcher.js +7 -0
  165. package/lib/appui-react/syncui/InternalSyncUiEventDispatcher.js.map +1 -1
  166. package/lib/appui-react/syncui/SyncUiEventDispatcher.js +4 -3
  167. package/lib/appui-react/syncui/SyncUiEventDispatcher.js.map +1 -1
  168. package/lib/appui-react/timeline/AnalysisAnimationProvider.js +9 -8
  169. package/lib/appui-react/timeline/AnalysisAnimationProvider.js.map +1 -1
  170. package/lib/appui-react/timeline/ScheduleAnimationProvider.js +13 -12
  171. package/lib/appui-react/timeline/ScheduleAnimationProvider.js.map +1 -1
  172. package/lib/appui-react/timeline/SolarTimelineDataProvider.js +6 -5
  173. package/lib/appui-react/timeline/SolarTimelineDataProvider.js.map +1 -1
  174. package/lib/appui-react/toolbar/GroupItem.js +11 -5
  175. package/lib/appui-react/toolbar/GroupItem.js.map +1 -1
  176. package/lib/appui-react/toolbar/ToolbarItemsManager.js +7 -7
  177. package/lib/appui-react/toolbar/ToolbarItemsManager.js.map +1 -1
  178. package/lib/appui-react/tools/FrameworkToolAdmin.js +5 -1
  179. package/lib/appui-react/tools/FrameworkToolAdmin.js.map +1 -1
  180. package/lib/appui-react/tools/KeyinPaletteTools.js +2 -2
  181. package/lib/appui-react/tools/KeyinPaletteTools.js.map +1 -1
  182. package/lib/appui-react/tools/OpenSettingsTool.js +2 -2
  183. package/lib/appui-react/tools/OpenSettingsTool.js.map +1 -1
  184. package/lib/appui-react/tools/RestoreLayoutTool.js +4 -4
  185. package/lib/appui-react/tools/RestoreLayoutTool.js.map +1 -1
  186. package/lib/appui-react/tools/ToolSettingsTools.js +2 -2
  187. package/lib/appui-react/tools/ToolSettingsTools.js.map +1 -1
  188. package/lib/appui-react/toolsettings/DefaultToolSettingsProvider.js +15 -18
  189. package/lib/appui-react/toolsettings/DefaultToolSettingsProvider.js.map +1 -1
  190. package/lib/appui-react/toolsettings/InternalToolSettingsManager.js +8 -8
  191. package/lib/appui-react/toolsettings/InternalToolSettingsManager.js.map +1 -1
  192. package/lib/appui-react/toolsettings/ToolInformation.js +2 -0
  193. package/lib/appui-react/toolsettings/ToolInformation.js.map +1 -1
  194. package/lib/appui-react/toolsettings/ToolUiProvider.js +3 -0
  195. package/lib/appui-react/toolsettings/ToolUiProvider.js.map +1 -1
  196. package/lib/appui-react/ui-items-provider/AbstractUiItemsManager.js +1 -0
  197. package/lib/appui-react/ui-items-provider/AbstractUiItemsManager.js.map +1 -1
  198. package/lib/appui-react/ui-items-provider/BaseUiItemsProvider.js +2 -0
  199. package/lib/appui-react/ui-items-provider/BaseUiItemsProvider.js.map +1 -1
  200. package/lib/appui-react/ui-items-provider/StandardContentToolsProvider.js +1 -0
  201. package/lib/appui-react/ui-items-provider/StandardContentToolsProvider.js.map +1 -1
  202. package/lib/appui-react/ui-items-provider/StandardContentToolsUiItemsProvider.js +1 -0
  203. package/lib/appui-react/ui-items-provider/StandardContentToolsUiItemsProvider.js.map +1 -1
  204. package/lib/appui-react/ui-items-provider/StandardNavigationToolsProvider.js +1 -0
  205. package/lib/appui-react/ui-items-provider/StandardNavigationToolsProvider.js.map +1 -1
  206. package/lib/appui-react/ui-items-provider/StandardNavigationToolsUiItemsProvider.js +1 -0
  207. package/lib/appui-react/ui-items-provider/StandardNavigationToolsUiItemsProvider.js.map +1 -1
  208. package/lib/appui-react/ui-items-provider/StandardStatusbarItemsProvider.js +1 -0
  209. package/lib/appui-react/ui-items-provider/StandardStatusbarItemsProvider.js.map +1 -1
  210. package/lib/appui-react/ui-items-provider/StandardStatusbarUiItemsProvider.js +1 -0
  211. package/lib/appui-react/ui-items-provider/StandardStatusbarUiItemsProvider.js.map +1 -1
  212. package/lib/appui-react/ui-items-provider/UiItemsManager.js +3 -3
  213. package/lib/appui-react/ui-items-provider/UiItemsManager.js.map +1 -1
  214. package/lib/appui-react/uiadmin/FrameworkUiAdmin.js +1 -4
  215. package/lib/appui-react/uiadmin/FrameworkUiAdmin.js.map +1 -1
  216. package/lib/appui-react/uiprovider/ComponentGenerator.js +2 -0
  217. package/lib/appui-react/uiprovider/ComponentGenerator.js.map +1 -1
  218. package/lib/appui-react/uistate/AppUiSettings.js +41 -33
  219. package/lib/appui-react/uistate/AppUiSettings.js.map +1 -1
  220. package/lib/appui-react/utils/InternalUiShowHideManager.js +13 -14
  221. package/lib/appui-react/utils/InternalUiShowHideManager.js.map +1 -1
  222. package/lib/appui-react/widgets/StatusBarWidgetComposerControl.js +2 -5
  223. package/lib/appui-react/widgets/StatusBarWidgetComposerControl.js.map +1 -1
  224. package/lib/appui-react/widgets/WidgetControl.js +2 -0
  225. package/lib/appui-react/widgets/WidgetControl.js.map +1 -1
  226. package/lib/appui-react/widgets/WidgetDef.js +28 -7
  227. package/lib/appui-react/widgets/WidgetDef.js.map +1 -1
  228. package/lib/appui-react/widgets/WidgetHost.js +4 -4
  229. package/lib/appui-react/widgets/WidgetHost.js.map +1 -1
  230. package/lib/appui-react/widgets/WidgetManager.js +5 -7
  231. package/lib/appui-react/widgets/WidgetManager.js.map +1 -1
  232. package/lib/cjs/appui-react/configurableui/ConfigurableUiContent.scss +0 -1
  233. package/lib/esm/appui-react/configurableui/ConfigurableUiContent.scss +0 -1
  234. package/package.json +9 -9
@@ -17,91 +17,13 @@ import { SvgCheckmark, SvgRemove } from "@itwin/itwinui-icons-react";
17
17
  import { SvgBackspace } from "../icons/SvgBackspace.js";
18
18
  /** @public */
19
19
  export class Calculator extends React.PureComponent {
20
+ _mainDiv = React.createRef();
21
+ _equalsClicked = false;
22
+ static defaultProps = {
23
+ engine: new CalculatorEngine(),
24
+ };
20
25
  constructor(props) {
21
26
  super(props);
22
- this._mainDiv = React.createRef();
23
- this._equalsClicked = false;
24
- this._onValueButtonClick = (keyChar) => {
25
- const displayValue = this.props.engine.processValue(keyChar);
26
- this._mainDivFocus();
27
- this.setState({ displayValue });
28
- };
29
- this._onOperatorButtonClick = (operator) => {
30
- if (operator === CalculatorOperator.Clear && this._equalsClicked)
31
- operator = CalculatorOperator.ClearAll;
32
- const displayValue = this.props.engine.processOperator(operator);
33
- this._mainDivFocus();
34
- this.setState({ displayValue });
35
- if (operator === CalculatorOperator.Equals)
36
- this._equalsClicked = true;
37
- else if (operator === CalculatorOperator.ClearAll)
38
- this._equalsClicked = false;
39
- };
40
- this._handleOk = (_event) => {
41
- this._ok();
42
- };
43
- this._handleCancel = (_event) => {
44
- this._cancel();
45
- };
46
- this._handleKeyDown = (event) => {
47
- switch (event.key) {
48
- case "0":
49
- case "1":
50
- case "2":
51
- case "3":
52
- case "4":
53
- case "5":
54
- case "6":
55
- case "7":
56
- case "8":
57
- case "9":
58
- this._onValueButtonClick(event.key);
59
- break;
60
- case "a":
61
- case "A":
62
- this._onOperatorButtonClick(CalculatorOperator.ClearAll);
63
- break;
64
- case "c":
65
- case "C":
66
- case Key.Clear.valueOf():
67
- this._onOperatorButtonClick(CalculatorOperator.Clear);
68
- break;
69
- case Key.Escape.valueOf():
70
- this._cancel();
71
- break;
72
- case Key.Backspace.valueOf():
73
- this._onOperatorButtonClick(CalculatorOperator.Backspace);
74
- break;
75
- case "/":
76
- case Key.Divide.valueOf():
77
- this._onOperatorButtonClick(CalculatorOperator.Divide);
78
- break;
79
- case "*":
80
- case Key.Multiply.valueOf():
81
- this._onOperatorButtonClick(CalculatorOperator.Multiply);
82
- break;
83
- case "-":
84
- case Key.Subtract.valueOf():
85
- this._onOperatorButtonClick(CalculatorOperator.Subtract);
86
- break;
87
- case "+":
88
- case Key.Add.valueOf():
89
- this._onOperatorButtonClick(CalculatorOperator.Add);
90
- break;
91
- case ".":
92
- case Key.Decimal.valueOf():
93
- this._onOperatorButtonClick(CalculatorOperator.Decimal);
94
- break;
95
- case "=":
96
- this._onOperatorButtonClick(CalculatorOperator.Equals);
97
- break;
98
- case Key.Enter.valueOf():
99
- if (!this._equalsClicked)
100
- this._onOperatorButtonClick(CalculatorOperator.Equals);
101
- this._ok();
102
- break;
103
- }
104
- };
105
27
  let displayValue = "0";
106
28
  if (this.props.initialValue)
107
29
  displayValue = this.props.engine.processValue(this.props.initialValue.toString());
@@ -109,12 +31,34 @@ export class Calculator extends React.PureComponent {
109
31
  displayValue,
110
32
  };
111
33
  }
34
+ _onValueButtonClick = (keyChar) => {
35
+ const displayValue = this.props.engine.processValue(keyChar);
36
+ this._mainDivFocus();
37
+ this.setState({ displayValue });
38
+ };
39
+ _onOperatorButtonClick = (operator) => {
40
+ if (operator === CalculatorOperator.Clear && this._equalsClicked)
41
+ operator = CalculatorOperator.ClearAll;
42
+ const displayValue = this.props.engine.processOperator(operator);
43
+ this._mainDivFocus();
44
+ this.setState({ displayValue });
45
+ if (operator === CalculatorOperator.Equals)
46
+ this._equalsClicked = true;
47
+ else if (operator === CalculatorOperator.ClearAll)
48
+ this._equalsClicked = false;
49
+ };
50
+ _handleOk = (_event) => {
51
+ this._ok();
52
+ };
112
53
  _ok() {
113
54
  if (this.props.onOk) {
114
55
  this.props.onOk(this.props.engine.result);
115
56
  }
116
57
  this._clearAll();
117
58
  }
59
+ _handleCancel = (_event) => {
60
+ this._cancel();
61
+ };
118
62
  _cancel() {
119
63
  if (this.props.onCancel) {
120
64
  this.props.onCancel();
@@ -150,10 +94,66 @@ export class Calculator extends React.PureComponent {
150
94
  React.createElement(Button, { className: classnames("uifw-calculator-large-button", "uifw-calculator-cancel-button"), onClick: this._handleCancel },
151
95
  React.createElement(Icon, { iconSpec: React.createElement(SvgRemove, null) })))));
152
96
  }
97
+ _handleKeyDown = (event) => {
98
+ switch (event.key) {
99
+ case "0":
100
+ case "1":
101
+ case "2":
102
+ case "3":
103
+ case "4":
104
+ case "5":
105
+ case "6":
106
+ case "7":
107
+ case "8":
108
+ case "9":
109
+ this._onValueButtonClick(event.key);
110
+ break;
111
+ case "a":
112
+ case "A":
113
+ this._onOperatorButtonClick(CalculatorOperator.ClearAll);
114
+ break;
115
+ case "c":
116
+ case "C":
117
+ case Key.Clear.valueOf():
118
+ this._onOperatorButtonClick(CalculatorOperator.Clear);
119
+ break;
120
+ case Key.Escape.valueOf():
121
+ this._cancel();
122
+ break;
123
+ case Key.Backspace.valueOf():
124
+ this._onOperatorButtonClick(CalculatorOperator.Backspace);
125
+ break;
126
+ case "/":
127
+ case Key.Divide.valueOf():
128
+ this._onOperatorButtonClick(CalculatorOperator.Divide);
129
+ break;
130
+ case "*":
131
+ case Key.Multiply.valueOf():
132
+ this._onOperatorButtonClick(CalculatorOperator.Multiply);
133
+ break;
134
+ case "-":
135
+ case Key.Subtract.valueOf():
136
+ this._onOperatorButtonClick(CalculatorOperator.Subtract);
137
+ break;
138
+ case "+":
139
+ case Key.Add.valueOf():
140
+ this._onOperatorButtonClick(CalculatorOperator.Add);
141
+ break;
142
+ case ".":
143
+ case Key.Decimal.valueOf():
144
+ this._onOperatorButtonClick(CalculatorOperator.Decimal);
145
+ break;
146
+ case "=":
147
+ this._onOperatorButtonClick(CalculatorOperator.Equals);
148
+ break;
149
+ case Key.Enter.valueOf():
150
+ if (!this._equalsClicked)
151
+ this._onOperatorButtonClick(CalculatorOperator.Equals);
152
+ this._ok();
153
+ break;
154
+ }
155
+ };
153
156
  }
154
- Calculator.defaultProps = {
155
- engine: new CalculatorEngine(),
156
- };
157
157
  class CalculatorKeyPad extends React.PureComponent {
158
158
  render() {
159
159
  return (React.createElement("div", { className: classnames("uifw-calculator-button-grid") },
@@ -183,12 +183,9 @@ class CalculatorKeyPad extends React.PureComponent {
183
183
  }
184
184
  }
185
185
  class ValueButton extends React.PureComponent {
186
- constructor() {
187
- super(...arguments);
188
- this._handleOnClick = (_event) => {
189
- this.props.onClick(this.props.keyChar);
190
- };
191
- }
186
+ _handleOnClick = (_event) => {
187
+ this.props.onClick(this.props.keyChar);
188
+ };
192
189
  render() {
193
190
  const { className, keyChar, onClick, ...props } = this.props;
194
191
  const itemClassNames = classnames("uifw-calculator-item", className);
@@ -196,12 +193,9 @@ class ValueButton extends React.PureComponent {
196
193
  }
197
194
  }
198
195
  class OperatorButton extends React.PureComponent {
199
- constructor() {
200
- super(...arguments);
201
- this._handleOnClick = (_event) => {
202
- this.props.onClick(this.props.operator);
203
- };
204
- }
196
+ _handleOnClick = (_event) => {
197
+ this.props.onClick(this.props.operator);
198
+ };
205
199
  render() {
206
200
  const { className, children, operator, onClick, ...props } = this.props;
207
201
  const itemClassNames = classnames("uifw-calculator-item", className);
@@ -1 +1 @@
1
- {"version":3,"file":"Calculator.js","sourceRoot":"","sources":["../../../src/appui-react/accudraw/Calculator.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module AccuDraw\n */\n\nimport \"./Calculator.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { Key } from \"ts-key-enum\";\nimport type { OnCancelFunc, OnNumberCommitFunc } from \"@itwin/appui-abstract\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { Icon, IconInput } from \"@itwin/core-react\";\nimport { Button, Input } from \"@itwin/itwinui-react\";\nimport { CalculatorEngine, CalculatorOperator } from \"./CalculatorEngine.js\";\nimport { SquareButton } from \"./SquareButton.js\";\nimport { SvgCheckmark, SvgRemove } from \"@itwin/itwinui-icons-react\";\nimport { SvgBackspace } from \"../icons/SvgBackspace.js\";\n\ntype SquareButtonProps = React.ComponentProps<typeof SquareButton>;\n\n/** @public */\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport interface CalculatorProps extends CommonProps {\n /** Initial value */\n initialValue?: number;\n /** Icon to display beside the calculated result */\n resultIcon?: React.ReactNode;\n /** A function to be run when the OK button is clicked */\n onOk?: OnNumberCommitFunc;\n /** A function to be run when the Cancel button is clicked */\n onCancel?: OnCancelFunc;\n\n /** @internal Calculator state machine. */\n engine: CalculatorEngine;\n}\n\ninterface CalculatorState {\n displayValue: string;\n}\n\n/** @public */\nexport class Calculator extends React.PureComponent<\n CalculatorProps,\n CalculatorState\n> {\n private _mainDiv = React.createRef<HTMLDivElement>();\n private _equalsClicked = false;\n\n public static readonly defaultProps: Pick<CalculatorProps, \"engine\"> = {\n engine: new CalculatorEngine(),\n };\n\n constructor(props: CalculatorProps) {\n super(props);\n\n let displayValue = \"0\";\n if (this.props.initialValue)\n displayValue = this.props.engine.processValue(\n this.props.initialValue.toString()\n );\n\n this.state = {\n displayValue,\n };\n }\n\n private _onValueButtonClick = (keyChar: string) => {\n const displayValue = this.props.engine.processValue(keyChar);\n this._mainDivFocus();\n this.setState({ displayValue });\n };\n\n private _onOperatorButtonClick = (operator: CalculatorOperator) => {\n if (operator === CalculatorOperator.Clear && this._equalsClicked)\n operator = CalculatorOperator.ClearAll;\n\n const displayValue = this.props.engine.processOperator(operator);\n this._mainDivFocus();\n this.setState({ displayValue });\n\n if (operator === CalculatorOperator.Equals) this._equalsClicked = true;\n else if (operator === CalculatorOperator.ClearAll)\n this._equalsClicked = false;\n };\n\n private _handleOk = (_event: React.MouseEvent): void => {\n this._ok();\n };\n\n private _ok() {\n if (this.props.onOk) {\n this.props.onOk(this.props.engine.result);\n }\n this._clearAll();\n }\n\n private _handleCancel = (_event: React.MouseEvent): void => {\n this._cancel();\n };\n\n private _cancel() {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n this._clearAll();\n }\n\n private _clearAll() {\n this.props.engine.clearAll();\n this._equalsClicked = false;\n }\n\n public override componentDidMount() {\n this._mainDivFocus();\n }\n\n private _mainDivFocus() {\n if (this._mainDiv.current) this._mainDiv.current.focus();\n }\n\n public override render() {\n const { className, resultIcon, onOk, onCancel, initialValue, ...props } =\n this.props;\n\n const classNames = classnames(\"uifw-calculator\", className);\n\n const topSection = resultIcon ? (\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n <IconInput\n containerClassName=\"uifw-calculator-top-input\"\n value={this.state.displayValue}\n readOnly={true}\n icon={resultIcon}\n />\n ) : (\n <Input value={this.state.displayValue} readOnly={true} size=\"small\" />\n );\n\n return (\n // The event handler is only being used to capture bubbled events\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n {...props}\n ref={this._mainDiv}\n tabIndex={-1}\n className={classNames}\n onKeyDown={this._handleKeyDown}\n >\n <div className=\"uifw-calculator-top\">{topSection}</div>\n <CalculatorKeyPad\n onValueClick={this._onValueButtonClick}\n onOperatorClick={this._onOperatorButtonClick}\n />\n <div className=\"uifw-calculator-bottom-buttons\">\n <Button\n className={classnames(\n \"uifw-calculator-large-button\",\n \"uifw-calculator-ok-button\"\n )}\n styleType=\"cta\"\n onClick={this._handleOk}\n >\n {/* eslint-disable-next-line @typescript-eslint/no-deprecated */}\n <Icon iconSpec={<SvgCheckmark />} />\n </Button>\n <Button\n className={classnames(\n \"uifw-calculator-large-button\",\n \"uifw-calculator-cancel-button\"\n )}\n onClick={this._handleCancel}\n >\n {/* eslint-disable-next-line @typescript-eslint/no-deprecated */}\n <Icon iconSpec={<SvgRemove />} />\n </Button>\n </div>\n </div>\n );\n }\n\n private _handleKeyDown = (\n event: React.KeyboardEvent<HTMLDivElement>\n ): void => {\n switch (event.key) {\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n this._onValueButtonClick(event.key);\n break;\n case \"a\":\n case \"A\":\n this._onOperatorButtonClick(CalculatorOperator.ClearAll);\n break;\n case \"c\":\n case \"C\":\n case Key.Clear.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Clear);\n break;\n case Key.Escape.valueOf():\n this._cancel();\n break;\n case Key.Backspace.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Backspace);\n break;\n case \"/\":\n case Key.Divide.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Divide);\n break;\n case \"*\":\n case Key.Multiply.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Multiply);\n break;\n case \"-\":\n case Key.Subtract.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Subtract);\n break;\n case \"+\":\n case Key.Add.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Add);\n break;\n case \".\":\n case Key.Decimal.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Decimal);\n break;\n case \"=\":\n this._onOperatorButtonClick(CalculatorOperator.Equals);\n break;\n case Key.Enter.valueOf():\n if (!this._equalsClicked)\n this._onOperatorButtonClick(CalculatorOperator.Equals);\n this._ok();\n break;\n }\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-deprecated\ninterface CalculatorKeyPadProps extends CommonProps {\n /** A function to be run when a value is clicked */\n onValueClick: (key: string) => void;\n /** A function to be run when a value is clicked */\n onOperatorClick: (operator: CalculatorOperator) => void;\n}\n\nclass CalculatorKeyPad extends React.PureComponent<CalculatorKeyPadProps> {\n public override render() {\n return (\n <div className={classnames(\"uifw-calculator-button-grid\")}>\n <OperatorButton\n operator={CalculatorOperator.ClearAll}\n onClick={this.props.onOperatorClick}\n >\n AC\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Clear}\n onClick={this.props.onOperatorClick}\n >\n C\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Backspace}\n onClick={this.props.onOperatorClick}\n >\n <div className=\"uifw-calculator-button-svg\">\n {/* eslint-disable-next-line @typescript-eslint/no-deprecated */}\n <Icon iconSpec={<SvgBackspace />} />\n </div>\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Divide}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &divide;\n </OperatorButton>\n\n <ValueButton keyChar=\"7\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"8\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"9\" onClick={this.props.onValueClick} />\n <OperatorButton\n operator={CalculatorOperator.Multiply}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &times;\n </OperatorButton>\n\n <ValueButton keyChar=\"4\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"5\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"6\" onClick={this.props.onValueClick} />\n <OperatorButton\n operator={CalculatorOperator.Subtract}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &minus;\n </OperatorButton>\n\n <ValueButton keyChar=\"1\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"2\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"3\" onClick={this.props.onValueClick} />\n <OperatorButton\n operator={CalculatorOperator.Add}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &#43;\n </OperatorButton>\n\n <ValueButton keyChar=\"0\" onClick={this.props.onValueClick} />\n <OperatorButton\n operator={CalculatorOperator.NegPos}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &plusmn;\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Decimal}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n .\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Equals}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &#61;\n </OperatorButton>\n <span />\n </div>\n );\n }\n}\n\ninterface ValueButtonProps extends Omit<SquareButtonProps, \"onClick\"> {\n /** Key to display */\n keyChar: string;\n /** A function to be run when the element is clicked */\n onClick: (key: string) => void;\n}\n\nclass ValueButton extends React.PureComponent<ValueButtonProps> {\n private _handleOnClick = (\n _event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n this.props.onClick(this.props.keyChar);\n };\n\n public override render() {\n const { className, keyChar, onClick, ...props } = this.props;\n\n const itemClassNames = classnames(\"uifw-calculator-item\", className);\n\n return (\n <SquareButton\n {...props}\n className={itemClassNames}\n onClick={this._handleOnClick}\n >\n {keyChar}\n </SquareButton>\n );\n }\n}\n\ninterface OperatorButtonProps extends Omit<SquareButtonProps, \"onClick\"> {\n /** Key to display */\n operator: CalculatorOperator;\n /** A function to be run when the element is clicked */\n onClick: (operator: CalculatorOperator) => void;\n}\n\nclass OperatorButton extends React.PureComponent<OperatorButtonProps> {\n private _handleOnClick = (\n _event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n this.props.onClick(this.props.operator);\n };\n\n public override render() {\n const { className, children, operator, onClick, ...props } = this.props;\n\n const itemClassNames = classnames(\"uifw-calculator-item\", className);\n\n return (\n <SquareButton\n {...props}\n className={itemClassNames}\n onClick={this._handleOnClick}\n >\n {children}\n </SquareButton>\n );\n }\n}\n"]}
1
+ {"version":3,"file":"Calculator.js","sourceRoot":"","sources":["../../../src/appui-react/accudraw/Calculator.tsx"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n * See LICENSE.md in the project root for license terms and full copyright notice.\n *--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module AccuDraw\n */\n\nimport \"./Calculator.scss\";\nimport classnames from \"classnames\";\nimport * as React from \"react\";\nimport { Key } from \"ts-key-enum\";\nimport type { OnCancelFunc, OnNumberCommitFunc } from \"@itwin/appui-abstract\";\nimport type { CommonProps } from \"@itwin/core-react\";\nimport { Icon, IconInput } from \"@itwin/core-react\";\nimport { Button, Input } from \"@itwin/itwinui-react\";\nimport { CalculatorEngine, CalculatorOperator } from \"./CalculatorEngine.js\";\nimport { SquareButton } from \"./SquareButton.js\";\nimport { SvgCheckmark, SvgRemove } from \"@itwin/itwinui-icons-react\";\nimport { SvgBackspace } from \"../icons/SvgBackspace.js\";\n\ntype SquareButtonProps = React.ComponentProps<typeof SquareButton>;\n\n/** @public */\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport interface CalculatorProps extends CommonProps {\n /** Initial value */\n initialValue?: number;\n /** Icon to display beside the calculated result */\n resultIcon?: React.ReactNode;\n /** A function to be run when the OK button is clicked */\n onOk?: OnNumberCommitFunc;\n /** A function to be run when the Cancel button is clicked */\n onCancel?: OnCancelFunc;\n\n /** @internal Calculator state machine. */\n engine: CalculatorEngine;\n}\n\ninterface CalculatorState {\n displayValue: string;\n}\n\n/** @public */\nexport class Calculator extends React.PureComponent<\n CalculatorProps,\n CalculatorState\n> {\n private _mainDiv = React.createRef<HTMLDivElement>();\n private _equalsClicked = false;\n\n public static readonly defaultProps: Pick<CalculatorProps, \"engine\"> = {\n engine: new CalculatorEngine(),\n };\n\n constructor(props: CalculatorProps) {\n super(props);\n\n let displayValue = \"0\";\n if (this.props.initialValue)\n displayValue = this.props.engine.processValue(\n this.props.initialValue.toString()\n );\n\n this.state = {\n displayValue,\n };\n }\n\n private _onValueButtonClick = (keyChar: string) => {\n const displayValue = this.props.engine.processValue(keyChar);\n this._mainDivFocus();\n this.setState({ displayValue });\n };\n\n private _onOperatorButtonClick = (operator: CalculatorOperator) => {\n if (operator === CalculatorOperator.Clear && this._equalsClicked)\n operator = CalculatorOperator.ClearAll;\n\n const displayValue = this.props.engine.processOperator(operator);\n this._mainDivFocus();\n this.setState({ displayValue });\n\n if (operator === CalculatorOperator.Equals) this._equalsClicked = true;\n else if (operator === CalculatorOperator.ClearAll)\n this._equalsClicked = false;\n };\n\n private _handleOk = (_event: React.MouseEvent): void => {\n this._ok();\n };\n\n private _ok() {\n if (this.props.onOk) {\n this.props.onOk(this.props.engine.result);\n }\n this._clearAll();\n }\n\n private _handleCancel = (_event: React.MouseEvent): void => {\n this._cancel();\n };\n\n private _cancel() {\n if (this.props.onCancel) {\n this.props.onCancel();\n }\n this._clearAll();\n }\n\n private _clearAll() {\n this.props.engine.clearAll();\n this._equalsClicked = false;\n }\n\n public override componentDidMount() {\n this._mainDivFocus();\n }\n\n private _mainDivFocus() {\n if (this._mainDiv.current) this._mainDiv.current.focus();\n }\n\n public override render() {\n const { className, resultIcon, onOk, onCancel, initialValue, ...props } =\n this.props;\n\n const classNames = classnames(\"uifw-calculator\", className);\n\n const topSection = resultIcon ? (\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n <IconInput\n containerClassName=\"uifw-calculator-top-input\"\n value={this.state.displayValue}\n readOnly={true}\n icon={resultIcon}\n />\n ) : (\n <Input value={this.state.displayValue} readOnly={true} size=\"small\" />\n );\n\n return (\n // The event handler is only being used to capture bubbled events\n // eslint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n {...props}\n ref={this._mainDiv}\n tabIndex={-1}\n className={classNames}\n onKeyDown={this._handleKeyDown}\n >\n <div className=\"uifw-calculator-top\">{topSection}</div>\n <CalculatorKeyPad\n onValueClick={this._onValueButtonClick}\n onOperatorClick={this._onOperatorButtonClick}\n />\n <div className=\"uifw-calculator-bottom-buttons\">\n <Button\n className={classnames(\n \"uifw-calculator-large-button\",\n \"uifw-calculator-ok-button\"\n )}\n styleType=\"cta\"\n onClick={this._handleOk}\n >\n {/* eslint-disable-next-line @typescript-eslint/no-deprecated */}\n <Icon iconSpec={<SvgCheckmark />} />\n </Button>\n <Button\n className={classnames(\n \"uifw-calculator-large-button\",\n \"uifw-calculator-cancel-button\"\n )}\n onClick={this._handleCancel}\n >\n {/* eslint-disable-next-line @typescript-eslint/no-deprecated */}\n <Icon iconSpec={<SvgRemove />} />\n </Button>\n </div>\n </div>\n );\n }\n\n private _handleKeyDown = (\n event: React.KeyboardEvent<HTMLDivElement>\n ): void => {\n switch (event.key) {\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n this._onValueButtonClick(event.key);\n break;\n case \"a\":\n case \"A\":\n this._onOperatorButtonClick(CalculatorOperator.ClearAll);\n break;\n case \"c\":\n case \"C\":\n case Key.Clear.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Clear);\n break;\n case Key.Escape.valueOf():\n this._cancel();\n break;\n case Key.Backspace.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Backspace);\n break;\n case \"/\":\n case Key.Divide.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Divide);\n break;\n case \"*\":\n case Key.Multiply.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Multiply);\n break;\n case \"-\":\n case Key.Subtract.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Subtract);\n break;\n case \"+\":\n case Key.Add.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Add);\n break;\n case \".\":\n case Key.Decimal.valueOf():\n this._onOperatorButtonClick(CalculatorOperator.Decimal);\n break;\n case \"=\":\n this._onOperatorButtonClick(CalculatorOperator.Equals);\n break;\n case Key.Enter.valueOf():\n if (!this._equalsClicked)\n this._onOperatorButtonClick(CalculatorOperator.Equals);\n this._ok();\n break;\n }\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-deprecated\ninterface CalculatorKeyPadProps extends CommonProps {\n /** A function to be run when a value is clicked */\n onValueClick: (key: string) => void;\n /** A function to be run when a value is clicked */\n onOperatorClick: (operator: CalculatorOperator) => void;\n}\n\nclass CalculatorKeyPad extends React.PureComponent<CalculatorKeyPadProps> {\n public override render() {\n return (\n <div className={classnames(\"uifw-calculator-button-grid\")}>\n <OperatorButton\n operator={CalculatorOperator.ClearAll}\n onClick={this.props.onOperatorClick}\n >\n AC\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Clear}\n onClick={this.props.onOperatorClick}\n >\n C\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Backspace}\n onClick={this.props.onOperatorClick}\n >\n <div className=\"uifw-calculator-button-svg\">\n {/* eslint-disable-next-line @typescript-eslint/no-deprecated */}\n <Icon iconSpec={<SvgBackspace />} />\n </div>\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Divide}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &divide;\n </OperatorButton>\n\n <ValueButton keyChar=\"7\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"8\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"9\" onClick={this.props.onValueClick} />\n <OperatorButton\n operator={CalculatorOperator.Multiply}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &times;\n </OperatorButton>\n\n <ValueButton keyChar=\"4\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"5\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"6\" onClick={this.props.onValueClick} />\n <OperatorButton\n operator={CalculatorOperator.Subtract}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &minus;\n </OperatorButton>\n\n <ValueButton keyChar=\"1\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"2\" onClick={this.props.onValueClick} />\n <ValueButton keyChar=\"3\" onClick={this.props.onValueClick} />\n <OperatorButton\n operator={CalculatorOperator.Add}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &#43;\n </OperatorButton>\n\n <ValueButton keyChar=\"0\" onClick={this.props.onValueClick} />\n <OperatorButton\n operator={CalculatorOperator.NegPos}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &plusmn;\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Decimal}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n .\n </OperatorButton>\n <OperatorButton\n operator={CalculatorOperator.Equals}\n onClick={this.props.onOperatorClick}\n className=\"uifw-calculator-large-font\"\n >\n &#61;\n </OperatorButton>\n <span />\n </div>\n );\n }\n}\n\ninterface ValueButtonProps extends Omit<SquareButtonProps, \"onClick\"> {\n /** Key to display */\n keyChar: string;\n /** A function to be run when the element is clicked */\n onClick: (key: string) => void;\n}\n\nclass ValueButton extends React.PureComponent<ValueButtonProps> {\n private _handleOnClick = (\n _event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n this.props.onClick(this.props.keyChar);\n };\n\n public override render() {\n const { className, keyChar, onClick, ...props } = this.props;\n\n const itemClassNames = classnames(\"uifw-calculator-item\", className);\n\n return (\n <SquareButton\n {...props}\n className={itemClassNames}\n onClick={this._handleOnClick}\n >\n {keyChar}\n </SquareButton>\n );\n }\n}\n\ninterface OperatorButtonProps extends Omit<SquareButtonProps, \"onClick\"> {\n /** Key to display */\n operator: CalculatorOperator;\n /** A function to be run when the element is clicked */\n onClick: (operator: CalculatorOperator) => void;\n}\n\nclass OperatorButton extends React.PureComponent<OperatorButtonProps> {\n private _handleOnClick = (\n _event: React.MouseEvent<HTMLButtonElement, MouseEvent>\n ) => {\n this.props.onClick(this.props.operator);\n };\n\n public override render() {\n const { className, children, operator, onClick, ...props } = this.props;\n\n const itemClassNames = classnames(\"uifw-calculator-item\", className);\n\n return (\n <SquareButton\n {...props}\n className={itemClassNames}\n onClick={this._handleOnClick}\n >\n {children}\n </SquareButton>\n );\n }\n}\n"]}
@@ -29,136 +29,12 @@ export var CalculatorKeyType;
29
29
  })(CalculatorKeyType || (CalculatorKeyType = {}));
30
30
  /** @internal */
31
31
  export class CalculatorEngine {
32
+ _displayValue = "0";
33
+ _operator;
34
+ _previousKeyType = CalculatorKeyType.None;
35
+ _firstValue = "";
36
+ _modValue = "";
32
37
  constructor() {
33
- this._displayValue = "0";
34
- this._previousKeyType = CalculatorKeyType.None;
35
- this._firstValue = "";
36
- this._modValue = "";
37
- this._createResultString = (operator, displayedNum) => {
38
- let resultString = displayedNum;
39
- if (this._isMathOperator(operator)) {
40
- const firstValue = this._firstValue;
41
- const savedOperator = this._operator;
42
- resultString =
43
- firstValue &&
44
- savedOperator &&
45
- this._previousKeyType !== CalculatorKeyType.Operator &&
46
- this._previousKeyType !== CalculatorKeyType.Equals
47
- ? this._calculate(firstValue, savedOperator, displayedNum)
48
- : displayedNum;
49
- }
50
- else {
51
- switch (operator) {
52
- case CalculatorOperator.Clear:
53
- resultString = "0";
54
- break;
55
- case CalculatorOperator.ClearAll:
56
- resultString = "0";
57
- break;
58
- case CalculatorOperator.Backspace:
59
- resultString = resultString.slice(0, -1);
60
- if (resultString.length === 0)
61
- resultString = "0";
62
- break;
63
- case CalculatorOperator.Decimal:
64
- if (!resultString.includes("."))
65
- resultString = `${displayedNum}.`;
66
- else if (this._previousKeyType === CalculatorKeyType.Operator ||
67
- this._previousKeyType === CalculatorKeyType.Equals)
68
- resultString = "0.";
69
- break;
70
- case CalculatorOperator.NegPos:
71
- if (displayedNum.length > 0 && displayedNum[0] === "-")
72
- resultString = displayedNum.substring(1);
73
- else
74
- resultString = `-${displayedNum}`;
75
- break;
76
- case CalculatorOperator.Equals: {
77
- const firstValue = this._firstValue;
78
- const savedOperator = this._operator;
79
- const modValue = this._modValue;
80
- if (firstValue && savedOperator) {
81
- resultString =
82
- this._previousKeyType === CalculatorKeyType.Equals
83
- ? this._calculate(displayedNum, savedOperator, modValue)
84
- : this._calculate(firstValue, savedOperator, displayedNum);
85
- }
86
- else {
87
- resultString = displayedNum;
88
- }
89
- break;
90
- }
91
- }
92
- }
93
- return resultString;
94
- };
95
- this._isMathOperator = (operator) => {
96
- switch (operator) {
97
- case CalculatorOperator.Add:
98
- case CalculatorOperator.Subtract:
99
- case CalculatorOperator.Multiply:
100
- case CalculatorOperator.Divide:
101
- return true;
102
- }
103
- return false;
104
- };
105
- this._calculate = (n1Str, operator, n2Str) => {
106
- let result = 0;
107
- const n1 = parseFloat(n1Str);
108
- const n2 = parseFloat(n2Str);
109
- switch (operator) {
110
- case CalculatorOperator.Add:
111
- result = n1 + n2;
112
- break;
113
- case CalculatorOperator.Subtract:
114
- result = n1 - n2;
115
- break;
116
- case CalculatorOperator.Multiply:
117
- result = n1 * n2;
118
- break;
119
- case CalculatorOperator.Divide:
120
- const displayValue = n2;
121
- if (displayValue !== 0)
122
- result = n1 / displayValue;
123
- else
124
- result = 0;
125
- break;
126
- }
127
- return result.toString();
128
- };
129
- this._updateCalculatorState = (operator, resultString, displayedNum) => {
130
- let keyType = CalculatorKeyType.None;
131
- if (this._isMathOperator(operator)) {
132
- if (this._firstValue &&
133
- this._operator &&
134
- this._previousKeyType === CalculatorKeyType.None) {
135
- this._firstValue = resultString;
136
- }
137
- else {
138
- this._firstValue = displayedNum;
139
- }
140
- this._operator = operator;
141
- keyType = CalculatorKeyType.Operator;
142
- }
143
- else {
144
- switch (operator) {
145
- case CalculatorOperator.ClearAll:
146
- this.clearAll();
147
- break;
148
- case CalculatorOperator.Equals: {
149
- let secondValue = displayedNum;
150
- if (this._firstValue) {
151
- if (this._previousKeyType === CalculatorKeyType.Equals) {
152
- secondValue = this._modValue;
153
- }
154
- }
155
- this._modValue = secondValue;
156
- keyType = CalculatorKeyType.Equals;
157
- }
158
- }
159
- }
160
- this._previousKeyType = keyType;
161
- };
162
38
  this.clearAll();
163
39
  }
164
40
  clearAll() {
@@ -195,5 +71,130 @@ export class CalculatorEngine {
195
71
  this._updateCalculatorState(operator, resultString, displayedNum);
196
72
  return resultString;
197
73
  }
74
+ _createResultString = (operator, displayedNum) => {
75
+ let resultString = displayedNum;
76
+ if (this._isMathOperator(operator)) {
77
+ const firstValue = this._firstValue;
78
+ const savedOperator = this._operator;
79
+ resultString =
80
+ firstValue &&
81
+ savedOperator &&
82
+ this._previousKeyType !== CalculatorKeyType.Operator &&
83
+ this._previousKeyType !== CalculatorKeyType.Equals
84
+ ? this._calculate(firstValue, savedOperator, displayedNum)
85
+ : displayedNum;
86
+ }
87
+ else {
88
+ switch (operator) {
89
+ case CalculatorOperator.Clear:
90
+ resultString = "0";
91
+ break;
92
+ case CalculatorOperator.ClearAll:
93
+ resultString = "0";
94
+ break;
95
+ case CalculatorOperator.Backspace:
96
+ resultString = resultString.slice(0, -1);
97
+ if (resultString.length === 0)
98
+ resultString = "0";
99
+ break;
100
+ case CalculatorOperator.Decimal:
101
+ if (!resultString.includes("."))
102
+ resultString = `${displayedNum}.`;
103
+ else if (this._previousKeyType === CalculatorKeyType.Operator ||
104
+ this._previousKeyType === CalculatorKeyType.Equals)
105
+ resultString = "0.";
106
+ break;
107
+ case CalculatorOperator.NegPos:
108
+ if (displayedNum.length > 0 && displayedNum[0] === "-")
109
+ resultString = displayedNum.substring(1);
110
+ else
111
+ resultString = `-${displayedNum}`;
112
+ break;
113
+ case CalculatorOperator.Equals: {
114
+ const firstValue = this._firstValue;
115
+ const savedOperator = this._operator;
116
+ const modValue = this._modValue;
117
+ if (firstValue && savedOperator) {
118
+ resultString =
119
+ this._previousKeyType === CalculatorKeyType.Equals
120
+ ? this._calculate(displayedNum, savedOperator, modValue)
121
+ : this._calculate(firstValue, savedOperator, displayedNum);
122
+ }
123
+ else {
124
+ resultString = displayedNum;
125
+ }
126
+ break;
127
+ }
128
+ }
129
+ }
130
+ return resultString;
131
+ };
132
+ _isMathOperator = (operator) => {
133
+ switch (operator) {
134
+ case CalculatorOperator.Add:
135
+ case CalculatorOperator.Subtract:
136
+ case CalculatorOperator.Multiply:
137
+ case CalculatorOperator.Divide:
138
+ return true;
139
+ }
140
+ return false;
141
+ };
142
+ _calculate = (n1Str, operator, n2Str) => {
143
+ let result = 0;
144
+ const n1 = parseFloat(n1Str);
145
+ const n2 = parseFloat(n2Str);
146
+ switch (operator) {
147
+ case CalculatorOperator.Add:
148
+ result = n1 + n2;
149
+ break;
150
+ case CalculatorOperator.Subtract:
151
+ result = n1 - n2;
152
+ break;
153
+ case CalculatorOperator.Multiply:
154
+ result = n1 * n2;
155
+ break;
156
+ case CalculatorOperator.Divide:
157
+ const displayValue = n2;
158
+ if (displayValue !== 0)
159
+ result = n1 / displayValue;
160
+ else
161
+ result = 0;
162
+ break;
163
+ }
164
+ return result.toString();
165
+ };
166
+ _updateCalculatorState = (operator, resultString, displayedNum) => {
167
+ let keyType = CalculatorKeyType.None;
168
+ if (this._isMathOperator(operator)) {
169
+ if (this._firstValue &&
170
+ this._operator &&
171
+ this._previousKeyType === CalculatorKeyType.None) {
172
+ this._firstValue = resultString;
173
+ }
174
+ else {
175
+ this._firstValue = displayedNum;
176
+ }
177
+ this._operator = operator;
178
+ keyType = CalculatorKeyType.Operator;
179
+ }
180
+ else {
181
+ switch (operator) {
182
+ case CalculatorOperator.ClearAll:
183
+ this.clearAll();
184
+ break;
185
+ case CalculatorOperator.Equals: {
186
+ let secondValue = displayedNum;
187
+ if (this._firstValue) {
188
+ if (this._previousKeyType === CalculatorKeyType.Equals) {
189
+ secondValue = this._modValue;
190
+ }
191
+ }
192
+ this._modValue = secondValue;
193
+ keyType = CalculatorKeyType.Equals;
194
+ }
195
+ }
196
+ }
197
+ this._previousKeyType = keyType;
198
+ };
198
199
  }
199
200
  //# sourceMappingURL=CalculatorEngine.js.map