@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.
- package/LICENSE +58 -58
- package/additional-docs/AutoCoreTagContext.md +441 -441
- package/additional-docs/ButtonApiSpecs.md +48 -48
- package/additional-docs/GlobalEventEmitter.md +243 -243
- package/additional-docs/general_recommendations.md +22 -22
- package/additional-docs/react_performance_notes.md +94 -94
- package/dist/assets/svg/blockly_logo.svg +82 -82
- package/dist/assets/svg/distance.svg +40 -40
- package/dist/assets/svg/python_logo.svg +246 -246
- package/dist/assets/svg/rotation_ccw.svg +50 -50
- package/dist/assets/svg/rotation_ccw_a.svg +57 -57
- package/dist/assets/svg/rotation_ccw_b.svg +57 -57
- package/dist/assets/svg/rotation_ccw_c.svg +57 -57
- package/dist/assets/svg/rotation_cw.svg +49 -49
- package/dist/assets/svg/rotation_cw_a.svg +30 -30
- package/dist/assets/svg/rotation_cw_b.svg +30 -30
- package/dist/assets/svg/rotation_cw_c.svg +30 -30
- package/dist/assets/svg/speed.svg +39 -39
- package/dist/components/BlocklyEditor.css +93 -93
- package/dist/components/JogPanel.css +41 -41
- package/dist/components/ProgressBarWithValue.css +27 -27
- package/dist/components/ValueIndicator.css +31 -31
- package/dist/components/osk.css +123 -123
- package/dist/core/AutoCoreTagContext.d.ts.map +1 -1
- package/dist/core/AutoCoreTagContext.js +1 -1
- package/dist/hub/HubBase.d.ts +3 -3
- package/dist/hub/HubBase.d.ts.map +1 -1
- package/dist/hub/HubBase.js +1 -1
- package/package.json +104 -104
- package/readme.md +343 -343
- package/src/assets/BlocklyLogo.tsx +27 -27
- package/src/assets/Distance.tsx +18 -18
- package/src/assets/JogLong.tsx +13 -13
- package/src/assets/JogMedium.tsx +13 -13
- package/src/assets/JogShort.tsx +13 -13
- package/src/assets/PythonLogo.tsx +83 -83
- package/src/assets/Rotation3D.tsx +13 -13
- package/src/assets/RotationCcw.tsx +33 -33
- package/src/assets/RotationCcwA.tsx +45 -45
- package/src/assets/RotationCcwB.tsx +45 -45
- package/src/assets/RotationCcwC.tsx +45 -45
- package/src/assets/RotationCw.tsx +31 -31
- package/src/assets/RotationCwA.tsx +42 -42
- package/src/assets/RotationCwB.tsx +42 -42
- package/src/assets/RotationCwC.tsx +42 -42
- package/src/assets/Run.tsx +13 -13
- package/src/assets/Speed.tsx +18 -18
- package/src/assets/SpeedFast.tsx +13 -13
- package/src/assets/SpeedMedium.tsx +13 -13
- package/src/assets/SpeedNone.tsx +13 -13
- package/src/assets/SpeedSlow.tsx +13 -13
- package/src/assets/Walk.tsx +13 -13
- package/src/assets/index.ts +22 -22
- package/src/assets/svg/blockly_logo.svg +82 -82
- package/src/assets/svg/distance.svg +40 -40
- package/src/assets/svg/python_logo.svg +246 -246
- package/src/assets/svg/rotation_ccw.svg +50 -50
- package/src/assets/svg/rotation_ccw_a.svg +57 -57
- package/src/assets/svg/rotation_ccw_b.svg +57 -57
- package/src/assets/svg/rotation_ccw_c.svg +57 -57
- package/src/assets/svg/rotation_cw.svg +49 -49
- package/src/assets/svg/rotation_cw_a.svg +30 -30
- package/src/assets/svg/rotation_cw_b.svg +30 -30
- package/src/assets/svg/rotation_cw_c.svg +30 -30
- package/src/assets/svg/speed.svg +39 -39
- package/src/components/AutoCoreDevPanel.tsx +414 -414
- package/src/components/BlocklyEditor.css +93 -93
- package/src/components/BlocklyEditor.tsx +609 -609
- package/src/components/CodeEditor.tsx +155 -155
- package/src/components/FileList.tsx +390 -390
- package/src/components/FileSelect.tsx +128 -128
- package/src/components/FitText.tsx +35 -35
- package/src/components/Indicator.tsx +188 -188
- package/src/components/IndicatorButton.tsx +214 -214
- package/src/components/IndicatorRect.tsx +172 -172
- package/src/components/JogPanel.css +41 -41
- package/src/components/JogPanel.tsx +461 -461
- package/src/components/Lamp.tsx +243 -243
- package/src/components/Osk.tsx +192 -192
- package/src/components/OskDialog.tsx +164 -164
- package/src/components/ProgressBarWithValue.css +27 -27
- package/src/components/ProgressBarWithValue.tsx +48 -48
- package/src/components/TextInput.tsx +195 -195
- package/src/components/ToggleGroup.tsx +322 -322
- package/src/components/ValueDisplay.tsx +236 -236
- package/src/components/ValueIndicator.css +31 -31
- package/src/components/ValueIndicator.tsx +135 -135
- package/src/components/ValueInput.tsx +368 -368
- package/src/components/osk.css +123 -123
- package/src/core/ActionMode.ts +19 -19
- package/src/core/AutoCoreTagContext.tsx +625 -614
- package/src/core/AutoCoreTagTypes.ts +334 -334
- package/src/core/CoreStreamTypes.ts +512 -512
- package/src/core/EventEmitterContext.tsx +434 -434
- package/src/core/IndicatorButtonState.ts +34 -34
- package/src/core/IndicatorColor.ts +35 -35
- package/src/core/MaskPatterns.ts +87 -87
- package/src/core/NumerableTypes.ts +80 -80
- package/src/core/PositionContext.ts +59 -59
- package/src/core/UniqueId.ts +41 -41
- package/src/core/ValueSimulator.ts +166 -166
- package/src/core/hoc.tsx +65 -65
- package/src/hooks/adsHooks.tsx +287 -287
- package/src/hooks/commandHooks.tsx +300 -300
- package/src/hooks/index.ts +12 -12
- package/src/hooks/useAutoCoreTag.ts +103 -103
- package/src/hooks/useScaledValue.tsx +99 -99
- package/src/hub/CommandMessage.ts +89 -89
- package/src/hub/DebugPanel.ts +307 -307
- package/src/hub/HubBase.ts +249 -236
- package/src/hub/HubSimulate.ts +124 -124
- package/src/hub/HubTauri.ts +140 -140
- package/src/hub/HubWebSocket.ts +250 -250
- package/src/hub/debug.ts +211 -211
- package/src/hub/index.ts +81 -81
- package/src/themes/adc-dark/_extensions.scss +166 -166
- package/src/themes/adc-dark/_variables.scss +913 -913
- package/src/themes/adc-dark/blue/_fonts.scss +23 -23
- package/src/themes/adc-dark/blue/adc_theme.scss +31 -31
- package/src/themes/adc-dark/blue/theme.scss +14 -14
- package/src/themes/theme-base/_colors.scss +17 -17
- package/src/themes/theme-base/_common.scss +74 -74
- package/src/themes/theme-base/_components.scss +111 -111
- package/src/themes/theme-base/_mixins.scss +243 -243
- package/src/themes/theme-base/components/button/_button.scss +644 -644
- package/src/themes/theme-base/components/button/_speeddial.scss +91 -91
- package/src/themes/theme-base/components/button/_splitbutton.scss +358 -358
- package/src/themes/theme-base/components/data/_carousel.scss +39 -39
- package/src/themes/theme-base/components/data/_datascroller.scss +47 -47
- package/src/themes/theme-base/components/data/_datatable.scss +388 -388
- package/src/themes/theme-base/components/data/_dataview.scss +47 -47
- package/src/themes/theme-base/components/data/_filter.scss +137 -137
- package/src/themes/theme-base/components/data/_orderlist.scss +86 -86
- package/src/themes/theme-base/components/data/_organizationchart.scss +50 -50
- package/src/themes/theme-base/components/data/_paginator.scss +91 -91
- package/src/themes/theme-base/components/data/_picklist.scss +73 -73
- package/src/themes/theme-base/components/data/_timeline.scss +38 -38
- package/src/themes/theme-base/components/data/_tree.scss +184 -184
- package/src/themes/theme-base/components/data/_treetable.scss +431 -431
- package/src/themes/theme-base/components/file/_fileupload.scss +41 -41
- package/src/themes/theme-base/components/input/_autocomplete.scss +94 -94
- package/src/themes/theme-base/components/input/_calendar.scss +251 -251
- package/src/themes/theme-base/components/input/_cascadeselect.scss +107 -107
- package/src/themes/theme-base/components/input/_checkbox.scss +181 -181
- package/src/themes/theme-base/components/input/_chips.scss +102 -102
- package/src/themes/theme-base/components/input/_colorpicker.scss +17 -17
- package/src/themes/theme-base/components/input/_dropdown.scss +252 -252
- package/src/themes/theme-base/components/input/_editor.scss +122 -122
- package/src/themes/theme-base/components/input/_iconfield.scss +9 -9
- package/src/themes/theme-base/components/input/_inputgroup.scss +74 -74
- package/src/themes/theme-base/components/input/_inputicon.scss +14 -14
- package/src/themes/theme-base/components/input/_inputnumber.scss +4 -4
- package/src/themes/theme-base/components/input/_inputotp.scss +10 -10
- package/src/themes/theme-base/components/input/_inputswitch.scss +99 -99
- package/src/themes/theme-base/components/input/_inputtext.scss +101 -101
- package/src/themes/theme-base/components/input/_listbox.scss +138 -138
- package/src/themes/theme-base/components/input/_mention.scss +30 -30
- package/src/themes/theme-base/components/input/_multiselect.scss +278 -278
- package/src/themes/theme-base/components/input/_password.scss +32 -32
- package/src/themes/theme-base/components/input/_radiobutton.scss +169 -169
- package/src/themes/theme-base/components/input/_rating.scss +80 -80
- package/src/themes/theme-base/components/input/_selectbutton.scss +49 -49
- package/src/themes/theme-base/components/input/_slider.scss +49 -49
- package/src/themes/theme-base/components/input/_togglebutton.scss +99 -99
- package/src/themes/theme-base/components/input/_treeselect.scss +151 -151
- package/src/themes/theme-base/components/input/_tristatecheckbox.scss +46 -46
- package/src/themes/theme-base/components/menu/_breadcrumb.scss +42 -42
- package/src/themes/theme-base/components/menu/_contextmenu.scss +39 -39
- package/src/themes/theme-base/components/menu/_dock.scss +109 -109
- package/src/themes/theme-base/components/menu/_megamenu.scss +141 -141
- package/src/themes/theme-base/components/menu/_menu.scss +33 -33
- package/src/themes/theme-base/components/menu/_menubar.scss +216 -216
- package/src/themes/theme-base/components/menu/_panelmenu.scss +153 -153
- package/src/themes/theme-base/components/menu/_slidemenu.scss +60 -60
- package/src/themes/theme-base/components/menu/_steps.scss +57 -57
- package/src/themes/theme-base/components/menu/_tabmenu.scss +50 -50
- package/src/themes/theme-base/components/menu/_tieredmenu.scss +43 -43
- package/src/themes/theme-base/components/messages/_inlinemessage.scss +69 -69
- package/src/themes/theme-base/components/messages/_message.scss +107 -107
- package/src/themes/theme-base/components/messages/_toast.scss +100 -100
- package/src/themes/theme-base/components/misc/_avatar.scss +33 -33
- package/src/themes/theme-base/components/misc/_badge.scss +76 -76
- package/src/themes/theme-base/components/misc/_chip.scss +38 -38
- package/src/themes/theme-base/components/misc/_inplace.scss +17 -17
- package/src/themes/theme-base/components/misc/_metergroup.scss +80 -80
- package/src/themes/theme-base/components/misc/_progressbar.scss +17 -17
- package/src/themes/theme-base/components/misc/_scrolltop.scss +24 -24
- package/src/themes/theme-base/components/misc/_skeleton.scss +7 -7
- package/src/themes/theme-base/components/misc/_tag.scss +39 -39
- package/src/themes/theme-base/components/misc/_terminal.scss +12 -12
- package/src/themes/theme-base/components/multimedia/_galleria.scss +153 -153
- package/src/themes/theme-base/components/multimedia/_image.scss +53 -53
- package/src/themes/theme-base/components/overlay/_confirmpopup.scss +72 -72
- package/src/themes/theme-base/components/overlay/_dialog.scss +78 -78
- package/src/themes/theme-base/components/overlay/_overlaypanel.scss +64 -64
- package/src/themes/theme-base/components/overlay/_sidebar.scss +23 -23
- package/src/themes/theme-base/components/overlay/_tooltip.scss +33 -33
- package/src/themes/theme-base/components/panel/_accordion.scss +118 -118
- package/src/themes/theme-base/components/panel/_card.scss +30 -30
- package/src/themes/theme-base/components/panel/_divider.scss +30 -30
- package/src/themes/theme-base/components/panel/_fieldset.scss +47 -47
- package/src/themes/theme-base/components/panel/_panel.scss +47 -47
- package/src/themes/theme-base/components/panel/_scrollpanel.scss +10 -10
- package/src/themes/theme-base/components/panel/_splitter.scss +23 -23
- package/src/themes/theme-base/components/panel/_stepper.scss +136 -136
- package/src/themes/theme-base/components/panel/_tabview.scss +147 -147
- package/src/themes/theme-base/components/panel/_toolbar.scss +11 -11
- package/terser.config.cjs +25 -25
- package/todo.md +18 -18
- package/tools/build-themes.cjs +65 -65
- package/tools/copy-distribution-files.cjs +77 -77
- package/tools/minify.cjs +55 -55
- package/tsconfig.json +48 -48
- package/typedoc.json +12 -12
- 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.
|