@adcops/autocore-react 3.3.8 → 3.3.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 (215) hide show
  1. package/LICENSE +58 -58
  2. package/additional-docs/AutoCoreTagContext.md +441 -441
  3. package/additional-docs/ButtonApiSpecs.md +48 -48
  4. package/additional-docs/GlobalEventEmitter.md +243 -243
  5. package/additional-docs/general_recommendations.md +22 -22
  6. package/additional-docs/react_performance_notes.md +94 -94
  7. package/dist/assets/svg/blockly_logo.svg +82 -82
  8. package/dist/assets/svg/distance.svg +40 -40
  9. package/dist/assets/svg/python_logo.svg +246 -246
  10. package/dist/assets/svg/rotation_ccw.svg +50 -50
  11. package/dist/assets/svg/rotation_ccw_a.svg +57 -57
  12. package/dist/assets/svg/rotation_ccw_b.svg +57 -57
  13. package/dist/assets/svg/rotation_ccw_c.svg +57 -57
  14. package/dist/assets/svg/rotation_cw.svg +49 -49
  15. package/dist/assets/svg/rotation_cw_a.svg +30 -30
  16. package/dist/assets/svg/rotation_cw_b.svg +30 -30
  17. package/dist/assets/svg/rotation_cw_c.svg +30 -30
  18. package/dist/assets/svg/speed.svg +39 -39
  19. package/dist/components/BlocklyEditor.css +93 -93
  20. package/dist/components/JogPanel.css +41 -41
  21. package/dist/components/ProgressBarWithValue.css +27 -27
  22. package/dist/components/ValueIndicator.css +31 -31
  23. package/dist/components/osk.css +123 -123
  24. package/dist/core/AutoCoreTagContext.d.ts.map +1 -1
  25. package/dist/core/AutoCoreTagContext.js +1 -1
  26. package/dist/hub/HubBase.d.ts +3 -3
  27. package/dist/hub/HubBase.d.ts.map +1 -1
  28. package/dist/hub/HubBase.js +1 -1
  29. package/package.json +104 -104
  30. package/readme.md +343 -343
  31. package/src/assets/BlocklyLogo.tsx +27 -27
  32. package/src/assets/Distance.tsx +18 -18
  33. package/src/assets/JogLong.tsx +13 -13
  34. package/src/assets/JogMedium.tsx +13 -13
  35. package/src/assets/JogShort.tsx +13 -13
  36. package/src/assets/PythonLogo.tsx +83 -83
  37. package/src/assets/Rotation3D.tsx +13 -13
  38. package/src/assets/RotationCcw.tsx +33 -33
  39. package/src/assets/RotationCcwA.tsx +45 -45
  40. package/src/assets/RotationCcwB.tsx +45 -45
  41. package/src/assets/RotationCcwC.tsx +45 -45
  42. package/src/assets/RotationCw.tsx +31 -31
  43. package/src/assets/RotationCwA.tsx +42 -42
  44. package/src/assets/RotationCwB.tsx +42 -42
  45. package/src/assets/RotationCwC.tsx +42 -42
  46. package/src/assets/Run.tsx +13 -13
  47. package/src/assets/Speed.tsx +18 -18
  48. package/src/assets/SpeedFast.tsx +13 -13
  49. package/src/assets/SpeedMedium.tsx +13 -13
  50. package/src/assets/SpeedNone.tsx +13 -13
  51. package/src/assets/SpeedSlow.tsx +13 -13
  52. package/src/assets/Walk.tsx +13 -13
  53. package/src/assets/index.ts +22 -22
  54. package/src/assets/svg/blockly_logo.svg +82 -82
  55. package/src/assets/svg/distance.svg +40 -40
  56. package/src/assets/svg/python_logo.svg +246 -246
  57. package/src/assets/svg/rotation_ccw.svg +50 -50
  58. package/src/assets/svg/rotation_ccw_a.svg +57 -57
  59. package/src/assets/svg/rotation_ccw_b.svg +57 -57
  60. package/src/assets/svg/rotation_ccw_c.svg +57 -57
  61. package/src/assets/svg/rotation_cw.svg +49 -49
  62. package/src/assets/svg/rotation_cw_a.svg +30 -30
  63. package/src/assets/svg/rotation_cw_b.svg +30 -30
  64. package/src/assets/svg/rotation_cw_c.svg +30 -30
  65. package/src/assets/svg/speed.svg +39 -39
  66. package/src/components/AutoCoreDevPanel.tsx +414 -414
  67. package/src/components/BlocklyEditor.css +93 -93
  68. package/src/components/BlocklyEditor.tsx +609 -609
  69. package/src/components/CodeEditor.tsx +155 -155
  70. package/src/components/FileList.tsx +390 -390
  71. package/src/components/FileSelect.tsx +128 -128
  72. package/src/components/FitText.tsx +35 -35
  73. package/src/components/Indicator.tsx +188 -188
  74. package/src/components/IndicatorButton.tsx +214 -214
  75. package/src/components/IndicatorRect.tsx +172 -172
  76. package/src/components/JogPanel.css +41 -41
  77. package/src/components/JogPanel.tsx +461 -461
  78. package/src/components/Lamp.tsx +243 -243
  79. package/src/components/Osk.tsx +192 -192
  80. package/src/components/OskDialog.tsx +164 -164
  81. package/src/components/ProgressBarWithValue.css +27 -27
  82. package/src/components/ProgressBarWithValue.tsx +48 -48
  83. package/src/components/TextInput.tsx +195 -195
  84. package/src/components/ToggleGroup.tsx +322 -322
  85. package/src/components/ValueDisplay.tsx +236 -236
  86. package/src/components/ValueIndicator.css +31 -31
  87. package/src/components/ValueIndicator.tsx +135 -135
  88. package/src/components/ValueInput.tsx +368 -368
  89. package/src/components/osk.css +123 -123
  90. package/src/core/ActionMode.ts +19 -19
  91. package/src/core/AutoCoreTagContext.tsx +625 -614
  92. package/src/core/AutoCoreTagTypes.ts +334 -334
  93. package/src/core/CoreStreamTypes.ts +512 -512
  94. package/src/core/EventEmitterContext.tsx +434 -434
  95. package/src/core/IndicatorButtonState.ts +34 -34
  96. package/src/core/IndicatorColor.ts +35 -35
  97. package/src/core/MaskPatterns.ts +87 -87
  98. package/src/core/NumerableTypes.ts +80 -80
  99. package/src/core/PositionContext.ts +59 -59
  100. package/src/core/UniqueId.ts +41 -41
  101. package/src/core/ValueSimulator.ts +166 -166
  102. package/src/core/hoc.tsx +65 -65
  103. package/src/hooks/adsHooks.tsx +287 -287
  104. package/src/hooks/commandHooks.tsx +300 -300
  105. package/src/hooks/index.ts +12 -12
  106. package/src/hooks/useAutoCoreTag.ts +103 -103
  107. package/src/hooks/useScaledValue.tsx +99 -99
  108. package/src/hub/CommandMessage.ts +89 -89
  109. package/src/hub/DebugPanel.ts +307 -307
  110. package/src/hub/HubBase.ts +249 -236
  111. package/src/hub/HubSimulate.ts +124 -124
  112. package/src/hub/HubTauri.ts +140 -140
  113. package/src/hub/HubWebSocket.ts +250 -250
  114. package/src/hub/debug.ts +211 -211
  115. package/src/hub/index.ts +81 -81
  116. package/src/themes/adc-dark/_extensions.scss +166 -166
  117. package/src/themes/adc-dark/_variables.scss +913 -913
  118. package/src/themes/adc-dark/blue/_fonts.scss +23 -23
  119. package/src/themes/adc-dark/blue/adc_theme.scss +31 -31
  120. package/src/themes/adc-dark/blue/theme.scss +14 -14
  121. package/src/themes/theme-base/_colors.scss +17 -17
  122. package/src/themes/theme-base/_common.scss +74 -74
  123. package/src/themes/theme-base/_components.scss +111 -111
  124. package/src/themes/theme-base/_mixins.scss +243 -243
  125. package/src/themes/theme-base/components/button/_button.scss +644 -644
  126. package/src/themes/theme-base/components/button/_speeddial.scss +91 -91
  127. package/src/themes/theme-base/components/button/_splitbutton.scss +358 -358
  128. package/src/themes/theme-base/components/data/_carousel.scss +39 -39
  129. package/src/themes/theme-base/components/data/_datascroller.scss +47 -47
  130. package/src/themes/theme-base/components/data/_datatable.scss +388 -388
  131. package/src/themes/theme-base/components/data/_dataview.scss +47 -47
  132. package/src/themes/theme-base/components/data/_filter.scss +137 -137
  133. package/src/themes/theme-base/components/data/_orderlist.scss +86 -86
  134. package/src/themes/theme-base/components/data/_organizationchart.scss +50 -50
  135. package/src/themes/theme-base/components/data/_paginator.scss +91 -91
  136. package/src/themes/theme-base/components/data/_picklist.scss +73 -73
  137. package/src/themes/theme-base/components/data/_timeline.scss +38 -38
  138. package/src/themes/theme-base/components/data/_tree.scss +184 -184
  139. package/src/themes/theme-base/components/data/_treetable.scss +431 -431
  140. package/src/themes/theme-base/components/file/_fileupload.scss +41 -41
  141. package/src/themes/theme-base/components/input/_autocomplete.scss +94 -94
  142. package/src/themes/theme-base/components/input/_calendar.scss +251 -251
  143. package/src/themes/theme-base/components/input/_cascadeselect.scss +107 -107
  144. package/src/themes/theme-base/components/input/_checkbox.scss +181 -181
  145. package/src/themes/theme-base/components/input/_chips.scss +102 -102
  146. package/src/themes/theme-base/components/input/_colorpicker.scss +17 -17
  147. package/src/themes/theme-base/components/input/_dropdown.scss +252 -252
  148. package/src/themes/theme-base/components/input/_editor.scss +122 -122
  149. package/src/themes/theme-base/components/input/_iconfield.scss +9 -9
  150. package/src/themes/theme-base/components/input/_inputgroup.scss +74 -74
  151. package/src/themes/theme-base/components/input/_inputicon.scss +14 -14
  152. package/src/themes/theme-base/components/input/_inputnumber.scss +4 -4
  153. package/src/themes/theme-base/components/input/_inputotp.scss +10 -10
  154. package/src/themes/theme-base/components/input/_inputswitch.scss +99 -99
  155. package/src/themes/theme-base/components/input/_inputtext.scss +101 -101
  156. package/src/themes/theme-base/components/input/_listbox.scss +138 -138
  157. package/src/themes/theme-base/components/input/_mention.scss +30 -30
  158. package/src/themes/theme-base/components/input/_multiselect.scss +278 -278
  159. package/src/themes/theme-base/components/input/_password.scss +32 -32
  160. package/src/themes/theme-base/components/input/_radiobutton.scss +169 -169
  161. package/src/themes/theme-base/components/input/_rating.scss +80 -80
  162. package/src/themes/theme-base/components/input/_selectbutton.scss +49 -49
  163. package/src/themes/theme-base/components/input/_slider.scss +49 -49
  164. package/src/themes/theme-base/components/input/_togglebutton.scss +99 -99
  165. package/src/themes/theme-base/components/input/_treeselect.scss +151 -151
  166. package/src/themes/theme-base/components/input/_tristatecheckbox.scss +46 -46
  167. package/src/themes/theme-base/components/menu/_breadcrumb.scss +42 -42
  168. package/src/themes/theme-base/components/menu/_contextmenu.scss +39 -39
  169. package/src/themes/theme-base/components/menu/_dock.scss +109 -109
  170. package/src/themes/theme-base/components/menu/_megamenu.scss +141 -141
  171. package/src/themes/theme-base/components/menu/_menu.scss +33 -33
  172. package/src/themes/theme-base/components/menu/_menubar.scss +216 -216
  173. package/src/themes/theme-base/components/menu/_panelmenu.scss +153 -153
  174. package/src/themes/theme-base/components/menu/_slidemenu.scss +60 -60
  175. package/src/themes/theme-base/components/menu/_steps.scss +57 -57
  176. package/src/themes/theme-base/components/menu/_tabmenu.scss +50 -50
  177. package/src/themes/theme-base/components/menu/_tieredmenu.scss +43 -43
  178. package/src/themes/theme-base/components/messages/_inlinemessage.scss +69 -69
  179. package/src/themes/theme-base/components/messages/_message.scss +107 -107
  180. package/src/themes/theme-base/components/messages/_toast.scss +100 -100
  181. package/src/themes/theme-base/components/misc/_avatar.scss +33 -33
  182. package/src/themes/theme-base/components/misc/_badge.scss +76 -76
  183. package/src/themes/theme-base/components/misc/_chip.scss +38 -38
  184. package/src/themes/theme-base/components/misc/_inplace.scss +17 -17
  185. package/src/themes/theme-base/components/misc/_metergroup.scss +80 -80
  186. package/src/themes/theme-base/components/misc/_progressbar.scss +17 -17
  187. package/src/themes/theme-base/components/misc/_scrolltop.scss +24 -24
  188. package/src/themes/theme-base/components/misc/_skeleton.scss +7 -7
  189. package/src/themes/theme-base/components/misc/_tag.scss +39 -39
  190. package/src/themes/theme-base/components/misc/_terminal.scss +12 -12
  191. package/src/themes/theme-base/components/multimedia/_galleria.scss +153 -153
  192. package/src/themes/theme-base/components/multimedia/_image.scss +53 -53
  193. package/src/themes/theme-base/components/overlay/_confirmpopup.scss +72 -72
  194. package/src/themes/theme-base/components/overlay/_dialog.scss +78 -78
  195. package/src/themes/theme-base/components/overlay/_overlaypanel.scss +64 -64
  196. package/src/themes/theme-base/components/overlay/_sidebar.scss +23 -23
  197. package/src/themes/theme-base/components/overlay/_tooltip.scss +33 -33
  198. package/src/themes/theme-base/components/panel/_accordion.scss +118 -118
  199. package/src/themes/theme-base/components/panel/_card.scss +30 -30
  200. package/src/themes/theme-base/components/panel/_divider.scss +30 -30
  201. package/src/themes/theme-base/components/panel/_fieldset.scss +47 -47
  202. package/src/themes/theme-base/components/panel/_panel.scss +47 -47
  203. package/src/themes/theme-base/components/panel/_scrollpanel.scss +10 -10
  204. package/src/themes/theme-base/components/panel/_splitter.scss +23 -23
  205. package/src/themes/theme-base/components/panel/_stepper.scss +136 -136
  206. package/src/themes/theme-base/components/panel/_tabview.scss +147 -147
  207. package/src/themes/theme-base/components/panel/_toolbar.scss +11 -11
  208. package/terser.config.cjs +25 -25
  209. package/todo.md +18 -18
  210. package/tools/build-themes.cjs +65 -65
  211. package/tools/copy-distribution-files.cjs +77 -77
  212. package/tools/minify.cjs +55 -55
  213. package/tsconfig.json +48 -48
  214. package/typedoc.json +12 -12
  215. package/.claude/settings.local.json +0 -7
@@ -1,48 +1,48 @@
1
- # Button API
2
-
3
- ## Overview
4
- Buttons in an HMI need to accomplish the following.
5
-
6
- - Indication of state
7
- - - Properties:
8
- - - - topic? : The name of the topic to monitor for state indicator.
9
- - - - onColor? : The button severity to apply when the state is TRUE.
10
- - - - offColor? : The button severity to apply state is FALSE.
11
- - - - onLabel? : Text displayed when the state is TRUE. If null or undefined, the label property is used.
12
- - - - offLabel? : Text displayed when the state is FALSE. If null or undefined, the label property is used.
13
- - - PrimeReact severity constants should be acceptable for onColor and offColor. However, the following should also map:
14
- - - - "on" -> "success"
15
- - - - "off" -> "secondary"
16
- - - If topic is not undefined or null, but state is undefined or null, then the button is invalid.
17
- - - - Background: black Foreground: gray
18
- - - - This style most likely need to be created as a constant.
19
- - Signal (dispath) events
20
- - - This is more complicated because a signal has three properties:
21
- - - - The name of the command that must be invoked.
22
- - - - The topic for that command.
23
- - - - An optional value. For pushbuttons, it is common for that value to be TRUE when the button is clicked or pressed and FALSE when released.
24
- - - - - It is also common for an invert property so that the direction of those signals are inverted.
25
- - - Edge cases that need more complicated handling (invoking events with additional arguments) can be handled using standard button events.
26
- - - HMI buttons usually support sending signals on the following input modes:
27
- - - - TAP : When the button is pressed down, a TRUE signal is broadcast. When released, a FALSE signal is broadcast.
28
- - - - - This mode is meant to simulate the behavior of an actual industrial pushbutton.
29
- - - - - This is, by far, the most common use case.
30
- - - - TOGGLE: When the button is clicked, it sends and sets its state to the inverse of its current state.
31
- - - - PRESSED : When the button is pressed, it signals the topic and the TRUE value, though the value is usually ignored.
32
- - - - RELEASED : When the button is released, it signals the topic and the FALSE value, though the value is usually ignored.
33
- - - - The signal values listed here would be inverted if the inverted property is true.
34
- - - While theoretically possible that a button have need to support both a tap and toggle, or pressed/relesaed, these are extreme edge cases.
35
- - - - Therefore, instead of creating a massive number of properties, we shall create an inputMode property.
36
- - - Properties
37
- - - - inputMode: Tap, Toggle, pressed, released
38
- - - - command: name of the command to invoke
39
- - - - commandArgs: Arguments sent with the command. Usually this will be an object containing the topic name and the value.
40
- - - - disableTopic : A topic the button can monitor to disable dispatching signals on events.
41
- - - - invisbleTopic : A topic the button can monitor to hide its visibility.
42
- - Because buttons are such a common function, we will extend the PrimeReact Button class to have these features.
43
- - These features are commonly needed, so we will also make a HOC function to add these properties and functions to an existing component.
44
- - Input mode should be enumerated.
45
- - The buttons should default to being "raised," which is a standard attribute of PrimeReact buttons.
46
-
47
-
48
-
1
+ # Button API
2
+
3
+ ## Overview
4
+ Buttons in an HMI need to accomplish the following.
5
+
6
+ - Indication of state
7
+ - - Properties:
8
+ - - - topic? : The name of the topic to monitor for state indicator.
9
+ - - - onColor? : The button severity to apply when the state is TRUE.
10
+ - - - offColor? : The button severity to apply state is FALSE.
11
+ - - - onLabel? : Text displayed when the state is TRUE. If null or undefined, the label property is used.
12
+ - - - offLabel? : Text displayed when the state is FALSE. If null or undefined, the label property is used.
13
+ - - PrimeReact severity constants should be acceptable for onColor and offColor. However, the following should also map:
14
+ - - - "on" -> "success"
15
+ - - - "off" -> "secondary"
16
+ - - If topic is not undefined or null, but state is undefined or null, then the button is invalid.
17
+ - - - Background: black Foreground: gray
18
+ - - - This style most likely need to be created as a constant.
19
+ - Signal (dispath) events
20
+ - - This is more complicated because a signal has three properties:
21
+ - - - The name of the command that must be invoked.
22
+ - - - The topic for that command.
23
+ - - - An optional value. For pushbuttons, it is common for that value to be TRUE when the button is clicked or pressed and FALSE when released.
24
+ - - - - It is also common for an invert property so that the direction of those signals are inverted.
25
+ - - Edge cases that need more complicated handling (invoking events with additional arguments) can be handled using standard button events.
26
+ - - HMI buttons usually support sending signals on the following input modes:
27
+ - - - TAP : When the button is pressed down, a TRUE signal is broadcast. When released, a FALSE signal is broadcast.
28
+ - - - - This mode is meant to simulate the behavior of an actual industrial pushbutton.
29
+ - - - - This is, by far, the most common use case.
30
+ - - - TOGGLE: When the button is clicked, it sends and sets its state to the inverse of its current state.
31
+ - - - PRESSED : When the button is pressed, it signals the topic and the TRUE value, though the value is usually ignored.
32
+ - - - RELEASED : When the button is released, it signals the topic and the FALSE value, though the value is usually ignored.
33
+ - - - The signal values listed here would be inverted if the inverted property is true.
34
+ - - While theoretically possible that a button have need to support both a tap and toggle, or pressed/relesaed, these are extreme edge cases.
35
+ - - - Therefore, instead of creating a massive number of properties, we shall create an inputMode property.
36
+ - - Properties
37
+ - - - inputMode: Tap, Toggle, pressed, released
38
+ - - - command: name of the command to invoke
39
+ - - - commandArgs: Arguments sent with the command. Usually this will be an object containing the topic name and the value.
40
+ - - - disableTopic : A topic the button can monitor to disable dispatching signals on events.
41
+ - - - invisbleTopic : A topic the button can monitor to hide its visibility.
42
+ - Because buttons are such a common function, we will extend the PrimeReact Button class to have these features.
43
+ - These features are commonly needed, so we will also make a HOC function to add these properties and functions to an existing component.
44
+ - Input mode should be enumerated.
45
+ - The buttons should default to being "raised," which is a standard attribute of PrimeReact buttons.
46
+
47
+
48
+
@@ -1,244 +1,244 @@
1
-
2
-
3
- This is a quick example that needs to be updated. Stay tuned.
4
-
5
-
6
- ## Wrap the application in the EventEmitterContext
7
-
8
- ```
9
-
10
- // App.js or App.tsx
11
-
12
- import React from 'react';
13
- import { EventEmitterProvider } from "autocore-react/core/EventEmitterContext.js";
14
- import ContentView from 'path-to/ContentView';
15
-
16
- const App = () => {
17
- return (
18
- <EventEmitterProvider>
19
- <ContentView />
20
- {/* Other components */}
21
- </EventEmitterProvider>
22
- );
23
- };
24
-
25
- export default App;
26
-
27
- ```
28
-
29
-
30
- ## Subscribing in a component
31
-
32
- ```
33
- import React, { useState, useEffect, useContext } from 'react';
34
- import { Button } from "primereact/button";
35
- import { ValueDisplay } from 'autocore-react/components/ValueDisplay';
36
- import { Indicator, IndicatorGreen, IndicatorOff } from "autocore-react/components/Indicator";
37
- import { EventEmitterContext } from '../path/to/EventEmitterContext'; // Adjust the import path as necessary
38
-
39
- export const ContentView: React.FC = () => {
40
- const [count, setCount] = useState(0);
41
- const [blink, setBlink] = useState(false);
42
- const [controlPower, setControlPower] = useState<number | string | null | undefined>(0);
43
- const { subscribe } = useContext(EventEmitterContext);
44
-
45
- useEffect(() => {
46
- console.log("Setting up interval.");
47
-
48
- const intervalId = setInterval(() => {
49
- console.log("blink");
50
- setBlink(blink => !blink);
51
- }, 1000);
52
-
53
- // Subscribe to the 'there-is-no-spoon' topic
54
- const unsubscribe = subscribe('there-is-no-spoon', (value) => {
55
- setControlPower(value);
56
- });
57
-
58
- return () => {
59
- console.log("Cleaning up.");
60
- clearInterval(intervalId);
61
- unsubscribe(); // Unsubscribe when the component unmounts
62
- }
63
- }, [subscribe]);
64
-
65
- const incrementCount = () => {
66
- setCount(count + 1);
67
- };
68
-
69
- return (
70
- <div>
71
- <p>{count}</p>
72
- <Button onClick={incrementCount}>Increment</Button>
73
- <br />
74
- <div>
75
- Maximum Power: <ValueDisplay value={0.34} x={200} y={320} width={100} height={20} format="0%"></ValueDisplay>
76
- </div>
77
- <div>
78
- Control Power: <Indicator value={blink} onColor={IndicatorGreen} offColor={IndicatorOff} />
79
- </div>
80
- <div>
81
- Received Power: <ValueDisplay value={controlPower} x={200} y={350} width={100} height={20} format="0%"></ValueDisplay>
82
- </div>
83
- </div>
84
- );
85
- };
86
- ```
87
-
88
-
89
-
90
-
91
- ## Publishing a value from Typescript.
92
-
93
- This is a shit example. Usually, use the Hub singleton. However, this example displays the concept.
94
-
95
- Implement a publisher function.
96
-
97
- ```
98
- // EventPublisher.ts
99
- import React, { useContext } from 'react';
100
- import { EventEmitterContext } from '../path/to/EventEmitterContext'; // Adjust the import path as necessary
101
-
102
- export const publishToThereIsNoSpoon = (topic: string, payload: any) => {
103
- const { dispatch } = useContext(EventEmitterContext);
104
-
105
- dispatch({
106
- topic: topic,
107
- payload: payload,
108
- });
109
- };
110
-
111
- ```
112
-
113
- Publish from a component:
114
-
115
- ```
116
- import React from 'react';
117
- import { publishToThereIsNoSpoon } from './EventPublisher';
118
-
119
- const SomeComponent: React.FC = () => {
120
- const handleClick = () => {
121
- // Publish an event with some payload
122
- publishToThereIsNoSpoon("New Value");
123
- };
124
-
125
- return (
126
- <button onClick={handleClick}>Publish Event</button>
127
- );
128
- };
129
-
130
- export default SomeComponent;
131
-
132
-
133
- ```
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
- ### Component Example:
142
- ```
143
-
144
- import React, { useState, useEffect, useContext } from 'react';
145
- import { Button } from "primereact/button";
146
- import { ValueDisplay } from 'autocore-react/components/ValueDisplay';
147
- import { Indicator, IndicatorGreen, IndicatorOff } from "autocore-react/components/Indicator";
148
- import {EventEmitterContext} from "autocore-react/core/EventEmitterContext";
149
- import {ValueSimulator} from "autocore-react/core/ValueSimulator";
150
-
151
-
152
-
153
- export const ContentView: React.FC = () => {
154
- const [count, setCount] = useState(0);
155
- const [blink, setBlink] = useState(false);
156
- const [controlPower, setControlPower] = useState(false);
157
- const {dispatch, subscribe, unsubscribe} = useContext(EventEmitterContext);
158
-
159
- const simulator = new ValueSimulator(dispatch);
160
-
161
-
162
- useEffect(() => {
163
-
164
- simulator.start();
165
-
166
-
167
- // Subscribe to the 'there-is-no-spoon' topic
168
- // TODO: add an unsubscribe feature
169
- const unsubscribeControlPower = subscribe('value-simulator-bBit1', (value) => {
170
- console.log(`value-simulator-bBit1: ${value}`);
171
- setControlPower(value);
172
- });
173
-
174
- const unsubscribeBlink = subscribe('value-simulator-bBit2', (value) => {
175
- console.log(`value-simulator-bBit2: ${value}`);
176
- setBlink(value);
177
- });
178
-
179
-
180
- const unsubscribePower = subscribe('value-simulator-iRamp1', (value) => {
181
- console.log(`value-simulator-iRamp1: ${value}`);
182
- setCount(value);
183
- });
184
-
185
-
186
- // console.log(`IntervalID: ${intervalId}`);
187
-
188
- return () => {
189
- unsubscribe(unsubscribeControlPower);
190
- unsubscribe(unsubscribeBlink);
191
- unsubscribe(unsubscribePower);
192
- simulator.stop();
193
- }
194
- }, [] );
195
-
196
- const incrementCount = () => {
197
- setCount(count + 1);
198
- };
199
-
200
-
201
-
202
- return (
203
- <div>
204
- <p>{count}</p>
205
- <Button onClick={incrementCount}>Increment</Button>
206
- <br />
207
- <div>
208
- Maximum Power: <ValueDisplay value={count / 100} x={200} y={320} width={100} height={20} format="0%"></ValueDisplay>
209
- </div>
210
- <div>
211
- Control Power: <Indicator value={controlPower}></Indicator>
212
- </div>
213
- <div>
214
- Blink: <Indicator value={blink} onColor={IndicatorGreen} offColor={IndicatorOff} />
215
- </div>
216
-
217
- </div>
218
-
219
- );
220
- };
221
-
222
-
223
- ```
224
-
225
-
226
-
227
-
228
- # Higher Order Component Subscription
229
-
230
- As it is infeasible for autocore-react to modify every possible component to streamline subscription
231
- and dispatching capabilities, we add Higher Order Component (HOC) functions to easily adapt a generic
232
- component into one that can subscribe to events and values.
233
-
234
-
235
- // For a component expecting 'value' prop
236
- ```
237
-
238
- const SubscribedValueDisplay = hocAddSubscription(ValueDisplay, 'some-topic', 'value');
239
- ```
240
-
241
- And use it in your component:
242
- ```
243
- <SubscribedValueDisplay x={200} y={320} width={100} height={20} format="0%" />
1
+
2
+
3
+ This is a quick example that needs to be updated. Stay tuned.
4
+
5
+
6
+ ## Wrap the application in the EventEmitterContext
7
+
8
+ ```
9
+
10
+ // App.js or App.tsx
11
+
12
+ import React from 'react';
13
+ import { EventEmitterProvider } from "autocore-react/core/EventEmitterContext.js";
14
+ import ContentView from 'path-to/ContentView';
15
+
16
+ const App = () => {
17
+ return (
18
+ <EventEmitterProvider>
19
+ <ContentView />
20
+ {/* Other components */}
21
+ </EventEmitterProvider>
22
+ );
23
+ };
24
+
25
+ export default App;
26
+
27
+ ```
28
+
29
+
30
+ ## Subscribing in a component
31
+
32
+ ```
33
+ import React, { useState, useEffect, useContext } from 'react';
34
+ import { Button } from "primereact/button";
35
+ import { ValueDisplay } from 'autocore-react/components/ValueDisplay';
36
+ import { Indicator, IndicatorGreen, IndicatorOff } from "autocore-react/components/Indicator";
37
+ import { EventEmitterContext } from '../path/to/EventEmitterContext'; // Adjust the import path as necessary
38
+
39
+ export const ContentView: React.FC = () => {
40
+ const [count, setCount] = useState(0);
41
+ const [blink, setBlink] = useState(false);
42
+ const [controlPower, setControlPower] = useState<number | string | null | undefined>(0);
43
+ const { subscribe } = useContext(EventEmitterContext);
44
+
45
+ useEffect(() => {
46
+ console.log("Setting up interval.");
47
+
48
+ const intervalId = setInterval(() => {
49
+ console.log("blink");
50
+ setBlink(blink => !blink);
51
+ }, 1000);
52
+
53
+ // Subscribe to the 'there-is-no-spoon' topic
54
+ const unsubscribe = subscribe('there-is-no-spoon', (value) => {
55
+ setControlPower(value);
56
+ });
57
+
58
+ return () => {
59
+ console.log("Cleaning up.");
60
+ clearInterval(intervalId);
61
+ unsubscribe(); // Unsubscribe when the component unmounts
62
+ }
63
+ }, [subscribe]);
64
+
65
+ const incrementCount = () => {
66
+ setCount(count + 1);
67
+ };
68
+
69
+ return (
70
+ <div>
71
+ <p>{count}</p>
72
+ <Button onClick={incrementCount}>Increment</Button>
73
+ <br />
74
+ <div>
75
+ Maximum Power: <ValueDisplay value={0.34} x={200} y={320} width={100} height={20} format="0%"></ValueDisplay>
76
+ </div>
77
+ <div>
78
+ Control Power: <Indicator value={blink} onColor={IndicatorGreen} offColor={IndicatorOff} />
79
+ </div>
80
+ <div>
81
+ Received Power: <ValueDisplay value={controlPower} x={200} y={350} width={100} height={20} format="0%"></ValueDisplay>
82
+ </div>
83
+ </div>
84
+ );
85
+ };
86
+ ```
87
+
88
+
89
+
90
+
91
+ ## Publishing a value from Typescript.
92
+
93
+ This is a shit example. Usually, use the Hub singleton. However, this example displays the concept.
94
+
95
+ Implement a publisher function.
96
+
97
+ ```
98
+ // EventPublisher.ts
99
+ import React, { useContext } from 'react';
100
+ import { EventEmitterContext } from '../path/to/EventEmitterContext'; // Adjust the import path as necessary
101
+
102
+ export const publishToThereIsNoSpoon = (topic: string, payload: any) => {
103
+ const { dispatch } = useContext(EventEmitterContext);
104
+
105
+ dispatch({
106
+ topic: topic,
107
+ payload: payload,
108
+ });
109
+ };
110
+
111
+ ```
112
+
113
+ Publish from a component:
114
+
115
+ ```
116
+ import React from 'react';
117
+ import { publishToThereIsNoSpoon } from './EventPublisher';
118
+
119
+ const SomeComponent: React.FC = () => {
120
+ const handleClick = () => {
121
+ // Publish an event with some payload
122
+ publishToThereIsNoSpoon("New Value");
123
+ };
124
+
125
+ return (
126
+ <button onClick={handleClick}>Publish Event</button>
127
+ );
128
+ };
129
+
130
+ export default SomeComponent;
131
+
132
+
133
+ ```
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+ ### Component Example:
142
+ ```
143
+
144
+ import React, { useState, useEffect, useContext } from 'react';
145
+ import { Button } from "primereact/button";
146
+ import { ValueDisplay } from 'autocore-react/components/ValueDisplay';
147
+ import { Indicator, IndicatorGreen, IndicatorOff } from "autocore-react/components/Indicator";
148
+ import {EventEmitterContext} from "autocore-react/core/EventEmitterContext";
149
+ import {ValueSimulator} from "autocore-react/core/ValueSimulator";
150
+
151
+
152
+
153
+ export const ContentView: React.FC = () => {
154
+ const [count, setCount] = useState(0);
155
+ const [blink, setBlink] = useState(false);
156
+ const [controlPower, setControlPower] = useState(false);
157
+ const {dispatch, subscribe, unsubscribe} = useContext(EventEmitterContext);
158
+
159
+ const simulator = new ValueSimulator(dispatch);
160
+
161
+
162
+ useEffect(() => {
163
+
164
+ simulator.start();
165
+
166
+
167
+ // Subscribe to the 'there-is-no-spoon' topic
168
+ // TODO: add an unsubscribe feature
169
+ const unsubscribeControlPower = subscribe('value-simulator-bBit1', (value) => {
170
+ console.log(`value-simulator-bBit1: ${value}`);
171
+ setControlPower(value);
172
+ });
173
+
174
+ const unsubscribeBlink = subscribe('value-simulator-bBit2', (value) => {
175
+ console.log(`value-simulator-bBit2: ${value}`);
176
+ setBlink(value);
177
+ });
178
+
179
+
180
+ const unsubscribePower = subscribe('value-simulator-iRamp1', (value) => {
181
+ console.log(`value-simulator-iRamp1: ${value}`);
182
+ setCount(value);
183
+ });
184
+
185
+
186
+ // console.log(`IntervalID: ${intervalId}`);
187
+
188
+ return () => {
189
+ unsubscribe(unsubscribeControlPower);
190
+ unsubscribe(unsubscribeBlink);
191
+ unsubscribe(unsubscribePower);
192
+ simulator.stop();
193
+ }
194
+ }, [] );
195
+
196
+ const incrementCount = () => {
197
+ setCount(count + 1);
198
+ };
199
+
200
+
201
+
202
+ return (
203
+ <div>
204
+ <p>{count}</p>
205
+ <Button onClick={incrementCount}>Increment</Button>
206
+ <br />
207
+ <div>
208
+ Maximum Power: <ValueDisplay value={count / 100} x={200} y={320} width={100} height={20} format="0%"></ValueDisplay>
209
+ </div>
210
+ <div>
211
+ Control Power: <Indicator value={controlPower}></Indicator>
212
+ </div>
213
+ <div>
214
+ Blink: <Indicator value={blink} onColor={IndicatorGreen} offColor={IndicatorOff} />
215
+ </div>
216
+
217
+ </div>
218
+
219
+ );
220
+ };
221
+
222
+
223
+ ```
224
+
225
+
226
+
227
+
228
+ # Higher Order Component Subscription
229
+
230
+ As it is infeasible for autocore-react to modify every possible component to streamline subscription
231
+ and dispatching capabilities, we add Higher Order Component (HOC) functions to easily adapt a generic
232
+ component into one that can subscribe to events and values.
233
+
234
+
235
+ // For a component expecting 'value' prop
236
+ ```
237
+
238
+ const SubscribedValueDisplay = hocAddSubscription(ValueDisplay, 'some-topic', 'value');
239
+ ```
240
+
241
+ And use it in your component:
242
+ ```
243
+ <SubscribedValueDisplay x={200} y={320} width={100} height={20} format="0%" />
244
244
  ``````
@@ -1,22 +1,22 @@
1
- # General Recommendations
2
-
3
- These recommendations will help you skip over all the pitfalls we've already worked through.
4
-
5
- ## Accepting Input
6
-
7
- PrimeReact/InputGroup makes it easy to group a label, input field, units and button into the same contiguous "block." In general,
8
- the user is best served by using InputGroup when accepting user input. Trying to put a similar effect together with a custom layout or CSS
9
- tends to be a waste of time and effort.
10
-
11
- See examples here: [InputGroup](https://primereact.org/inputgroup/ "https://primereact.org/inputgroup/")
12
-
13
- ### Numeric input
14
-
15
- Use PrimeReact/InputNumber to filter numeric input as needed. If you need to filter programatically or the InputNumber field simply
16
- won't work for your application, core/MaskPatterns/RegExMaskPatterns enumerates regular expression constants that can be used
17
- to filter/validate input.
18
-
19
- ### Masking other inputs
20
-
21
- Use PrimeReact/InputMask to filter other data as needed. We provide core/MaskPatterns/PrimeReactMaskPatterns for some common
22
- masks.
1
+ # General Recommendations
2
+
3
+ These recommendations will help you skip over all the pitfalls we've already worked through.
4
+
5
+ ## Accepting Input
6
+
7
+ PrimeReact/InputGroup makes it easy to group a label, input field, units and button into the same contiguous "block." In general,
8
+ the user is best served by using InputGroup when accepting user input. Trying to put a similar effect together with a custom layout or CSS
9
+ tends to be a waste of time and effort.
10
+
11
+ See examples here: [InputGroup](https://primereact.org/inputgroup/ "https://primereact.org/inputgroup/")
12
+
13
+ ### Numeric input
14
+
15
+ Use PrimeReact/InputNumber to filter numeric input as needed. If you need to filter programatically or the InputNumber field simply
16
+ won't work for your application, core/MaskPatterns/RegExMaskPatterns enumerates regular expression constants that can be used
17
+ to filter/validate input.
18
+
19
+ ### Masking other inputs
20
+
21
+ Use PrimeReact/InputMask to filter other data as needed. We provide core/MaskPatterns/PrimeReactMaskPatterns for some common
22
+ masks.