Skip to content

Commit e296982

Browse files
committed
Adds activity/step dialogs; reorganizes event JSON
Improves script editing with dedicated dialogs for adding activities and steps, removing the inline node editor for clarity. Also refactors session info data into multiline format to enhance readability and maintainability.
1 parent a774fff commit e296982

File tree

5 files changed

+128
-67
lines changed

5 files changed

+128
-67
lines changed
Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,63 @@
1-
[{"id":"469bd5fd-7bdb-464c-9141-5ed9526db570","subject":"/facility/f5456fe9-5829-45ec-9721-2f6bf130e9c5/location/f5456fe9-5829-45ec-9721-2f6bf130e9c5/bay/e9acfb8b-6ddd-45ac-9d5b-f23e51b1fe2d","data":{"EventModel":{"Id":"ed27849d-7f10-476a-bb4f-20614c7e4728","Status":"Active","Timestamp":"2025-09-27T16:13:50.0503607+00:00","Players":[{"Id":"dab917d3-9588-476d-aeb0-0b65e775d0bc","Name":"Mr. Bertelsen Dev","IsGuest":false,"Picture":"https://golf-upload-service-dev.trackmangolfdev.com/files/69af5703-9832-4f3d-980a-33f23f05e33b"}],"Language":"en-US","IsLocked":false},"Facility":{"Id":"f5456fe9-5829-45ec-9721-2f6bf130e9c5","Name":"DSG Global Dev"},"Location":{"Id":"f5456fe9-5829-45ec-9721-2f6bf130e9c5","Name":"DSG Global"},"Bay":{"Id":"e9acfb8b-6ddd-45ac-9d5b-f23e51b1fe2d","Name":"JFE Office"},"Client":{"Name":"TrackMan Performance Studio","Properties":{"Version":"10.2.119"}},"Device":{"Id":"1d1d211b-981e-4ff4-907c-fc22f776358c"},"Radar":{"Properties":{"Model":"TMA4A","Serial":"17404099","Firmware":"2.10.0"}},"User":{"Id":"dab917d3-9588-476d-aeb0-0b65e775d0bc","Name":"Michael Bertelsen"},"CustomerSession":{"Id":"ed27849d-7f10-476a-bb4f-20614c7e4728"}},"eventType":"TPS.SessionInfo","dataVersion":"1.0","metadataVersion":"1","eventTime":"2025-09-27T16:14:04.5367318Z","topic":"/subscriptions/09c4d679-8b43-4520-ad0a-c598267ed94c/resourceGroups/dr2-dev/providers/Microsoft.EventGrid/domains/dr-eventgrid-dev/topics/facility-f5456fe9-5829-45ec-9721-2f6bf130e9c5"}]
1+
[
2+
{
3+
"id": "469bd5fd-7bdb-464c-9141-5ed9526db570",
4+
"subject": "/facility/f5456fe9-5829-45ec-9721-2f6bf130e9c5/location/f5456fe9-5829-45ec-9721-2f6bf130e9c5/bay/e9acfb8b-6ddd-45ac-9d5b-f23e51b1fe2d",
5+
"data": {
6+
"EventModel": {
7+
"Id": "ed27849d-7f10-476a-bb4f-20614c7e4728",
8+
"Status": "Active",
9+
"Timestamp": "2025-09-27T16:13:50.0503607+00:00",
10+
"Players": [
11+
{
12+
"Id": "dab917d3-9588-476d-aeb0-0b65e775d0bc",
13+
"Name": "Mr. Bertelsen Dev",
14+
"IsGuest": false,
15+
"Picture": "https://golf-upload-service-dev.trackmangolfdev.com/files/69af5703-9832-4f3d-980a-33f23f05e33b"
16+
}
17+
],
18+
"Language": "en-US",
19+
"IsLocked": false
20+
},
21+
"Facility": {
22+
"Id": "f5456fe9-5829-45ec-9721-2f6bf130e9c5",
23+
"Name": "DSG Global Dev"
24+
},
25+
"Location": {
26+
"Id": "f5456fe9-5829-45ec-9721-2f6bf130e9c5",
27+
"Name": "DSG Global"
28+
},
29+
"Bay": {
30+
"Id": "e9acfb8b-6ddd-45ac-9d5b-f23e51b1fe2d",
31+
"Name": "JFE Office"
32+
},
33+
"Client": {
34+
"Name": "TrackMan Performance Studio",
35+
"Properties": {
36+
"Version": "10.2.119"
37+
}
38+
},
39+
"Device": {
40+
"Id": "1d1d211b-981e-4ff4-907c-fc22f776358c"
41+
},
42+
"Radar": {
43+
"Properties": {
44+
"Model": "TMA4A",
45+
"Serial": "17404099",
46+
"Firmware": "2.10.0"
47+
}
48+
},
49+
"User": {
50+
"Id": "dab917d3-9588-476d-aeb0-0b65e775d0bc",
51+
"Name": "Michael Bertelsen"
52+
},
53+
"CustomerSession": {
54+
"Id": "ed27849d-7f10-476a-bb4f-20614c7e4728"
55+
}
56+
},
57+
"eventType": "TPS.SessionInfo",
58+
"dataVersion": "1.0",
59+
"metadataVersion": "1",
60+
"eventTime": "2025-09-27T16:14:04.5367318Z",
61+
"topic": "/subscriptions/09c4d679-8b43-4520-ad0a-c598267ed94c/resourceGroups/dr2-dev/providers/Microsoft.EventGrid/domains/dr-eventgrid-dev/topics/facility-f5456fe9-5829-45ec-9721-2f6bf130e9c5"
62+
}
63+
]

src/App.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ export default function App() {
574574
selectedNode={selectedNode}
575575
script={script}
576576
isValid={isValid}
577-
validationErrors={validationErrors}
577+
validationErrors={validationErrors}
578578
selections={selections}
579579
selectedLocation={selectedLocation}
580580
selectedBayObj={selectedBayObj}
@@ -584,6 +584,14 @@ export default function App() {
584584
onLocationSelect={handleLocationSelect}
585585
onBaySelect={handleBaySelect}
586586
dispatch={dispatch}
587+
showActivityDialog={showActivityDialog}
588+
showStepDialog={showStepDialog}
589+
onShowActivityDialog={() => setShowActivityDialog(true)}
590+
onShowStepDialog={() => setShowStepDialog(true)}
591+
onCloseActivityDialog={() => setShowActivityDialog(false)}
592+
onCloseStepDialog={() => setShowStepDialog(false)}
593+
onAddActivity={handleAddActivity}
594+
onAddStep={handleAddStep}
587595
/>
588596
</AppProviders>
589597
);

src/app/AppShell.tsx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ export interface AppShellProps {
3535
onLocationSelect: (l: any) => void;
3636
onBaySelect: (b: any) => void;
3737
dispatch: any;
38+
// Dialog state and handlers
39+
showActivityDialog: boolean;
40+
showStepDialog: boolean;
41+
onShowActivityDialog: () => void;
42+
onShowStepDialog: () => void;
43+
onCloseActivityDialog: () => void;
44+
onCloseStepDialog: () => void;
45+
onAddActivity: (activity: Activity) => void;
46+
onAddStep: (step: Step, parentActivityId: string) => void;
3847
}
3948

4049
export const AppShell: React.FC<AppShellProps> = (props) => {
@@ -56,7 +65,15 @@ export const AppShell: React.FC<AppShellProps> = (props) => {
5665
onDownloadScript,
5766
onLocationSelect,
5867
onBaySelect,
59-
dispatch
68+
dispatch,
69+
showActivityDialog,
70+
showStepDialog,
71+
onShowActivityDialog,
72+
onShowStepDialog,
73+
onCloseActivityDialog,
74+
onCloseStepDialog,
75+
onAddActivity,
76+
onAddStep,
6077
} = props;
6178

6279
// Prefer a hydrated selected node object from the top-level App when available
@@ -80,7 +97,7 @@ export const AppShell: React.FC<AppShellProps> = (props) => {
8097
<Routes
8198
activeTab={activeTab}
8299
state={state}
83-
selectedNode={effectiveSelectedNode ?? null}
100+
selectedNode={effectiveSelectedNode ?? null}
84101
script={script}
85102
isValid={isValid}
86103
validationErrors={validationErrors}
@@ -94,6 +111,14 @@ export const AppShell: React.FC<AppShellProps> = (props) => {
94111
onLocationSelect={onLocationSelect}
95112
onBaySelect={onBaySelect}
96113
dispatch={dispatch}
114+
showActivityDialog={showActivityDialog}
115+
showStepDialog={showStepDialog}
116+
onShowActivityDialog={onShowActivityDialog}
117+
onShowStepDialog={onShowStepDialog}
118+
onCloseActivityDialog={onCloseActivityDialog}
119+
onCloseStepDialog={onCloseStepDialog}
120+
onAddActivity={onAddActivity}
121+
onAddStep={onAddStep}
97122
/>
98123
</div>
99124
);

src/app/Routes.tsx

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,15 @@ export interface RoutesProps {
2929
onSelectActivity?: SidebarProps['onSelectActivity'];
3030
onSelectStep?: SidebarProps['onSelectStep'];
3131
dispatch: any;
32+
// Dialog props
33+
showActivityDialog: boolean;
34+
showStepDialog: boolean;
35+
onShowActivityDialog: () => void;
36+
onShowStepDialog: () => void;
37+
onCloseActivityDialog: () => void;
38+
onCloseStepDialog: () => void;
39+
onAddActivity: (activity: any) => void;
40+
onAddStep: (step: any, parentActivityId: string) => void;
3241
}
3342

3443
const Routes: React.FC<RoutesProps> = ({
@@ -47,7 +56,15 @@ const Routes: React.FC<RoutesProps> = ({
4756
onDownloadScript,
4857
onLocationSelect,
4958
onBaySelect,
50-
dispatch
59+
dispatch,
60+
showActivityDialog,
61+
showStepDialog,
62+
onShowActivityDialog,
63+
onShowStepDialog,
64+
onCloseActivityDialog,
65+
onCloseStepDialog,
66+
onAddActivity,
67+
onAddStep,
5168
}) => {
5269
const effectiveSelectedNode = (() => {
5370
if (selectedNode !== undefined) return selectedNode;
@@ -58,14 +75,13 @@ const Routes: React.FC<RoutesProps> = ({
5875
return (
5976
<div className="tree-flex">
6077
<DialogManager
61-
// preserved minimal API here; detailed dialog state is still in App.tsx
62-
showActivityDialog={false}
63-
showStepDialog={false}
64-
onCloseActivityDialog={() => {}}
65-
onCloseStepDialog={() => {}}
66-
onAddActivity={() => {}}
67-
onAddStep={() => {}}
68-
parentActivityForAdd={undefined}
78+
showActivityDialog={showActivityDialog}
79+
showStepDialog={showStepDialog}
80+
onCloseActivityDialog={onCloseActivityDialog}
81+
onCloseStepDialog={onCloseStepDialog}
82+
onAddActivity={onAddActivity}
83+
onAddStep={onAddStep}
84+
parentActivityForAdd={parentActivityForAdd}
6985
/>
7086
<Sidebar
7187
script={script}
@@ -84,8 +100,8 @@ const Routes: React.FC<RoutesProps> = ({
84100
onLocationSelect={onLocationSelect}
85101
onBaySelect={onBaySelect}
86102
onCloneSelected={() => dispatch({ type: 'CLONE_SELECTED' })}
87-
onShowActivityDialog={() => {}}
88-
onShowStepDialog={() => {}}
103+
onShowActivityDialog={onShowActivityDialog}
104+
onShowStepDialog={onShowStepDialog}
89105
onSelectScript={() => dispatch({ type: 'SELECT_SCRIPT' })}
90106
onSelectActivity={(activityId: string) => dispatch({ type: 'SELECT_ACTIVITY', activityId })}
91107
onSelectStep={(activityId: string, stepId: string) => dispatch({ type: 'SELECT_STEP', activityId, stepId })}

src/components/Sidebar.tsx

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { TreeView } from './TreeView';
44
import { BaySelector } from './BaySelector';
55
import { LocationSelector } from './LocationSelector';
66
import { CollapsibleSection } from './CollapsibleSection';
7-
import { NodeEditor } from './NodeEditor';
87
import { LoadScriptButton, DownloadButton, CloneSelectedButton, AddActivityButton, AddStepButton } from './buttons';
98

109
interface Bay {
@@ -43,8 +42,6 @@ export interface SidebarProps {
4342
onDeleteActivity: (activityId: string) => void;
4443
onDeleteStep: (activityId: string, stepId: string) => void;
4544
parentActivityForAdd: Activity | undefined;
46-
onUpdateActivity?: (activityId: string, patch: Partial<Activity>) => void;
47-
onUpdateStep?: (stepId: string, patch: Partial<Step>) => void;
4845
}
4946

5047
export const Sidebar: React.FC<SidebarProps> = ({
@@ -72,35 +69,9 @@ export const Sidebar: React.FC<SidebarProps> = ({
7269
onDeleteActivity,
7370
onDeleteStep,
7471
parentActivityForAdd,
75-
onUpdateActivity,
76-
onUpdateStep,
7772
}) => {
7873
const [executing, setExecuting] = React.useState(false);
7974
const [execMessage, setExecMessage] = React.useState<string | null>(null);
80-
// Track selection locally to avoid deselection after ID change
81-
const [localSelectedRef, setLocalSelectedRef] = React.useState(selectedRef);
82-
83-
React.useEffect(() => {
84-
setLocalSelectedRef(selectedRef);
85-
}, [selectedRef]);
86-
87-
// Track last selected node ID for reselection after ID change
88-
const lastSelectedRef = React.useRef(selectedRef);
89-
90-
React.useEffect(() => {
91-
lastSelectedRef.current = selectedRef;
92-
}, [selectedRef]);
93-
94-
// Handler to reselect node after ID change
95-
function handleNodeIdChange(oldId: string, newId: string, kind: 'activity' | 'step', parentActivityId?: string) {
96-
if (kind === 'activity') {
97-
setLocalSelectedRef({ kind: 'activity', activityId: newId });
98-
onSelectActivity(newId);
99-
} else if (kind === 'step' && parentActivityId) {
100-
setLocalSelectedRef({ kind: 'step', activityId: parentActivityId, stepId: newId });
101-
onSelectStep(parentActivityId, newId);
102-
}
103-
}
10475

10576
const canExecute = isValid && !!selectedBayObj?.dbId;
10677

@@ -208,37 +179,16 @@ export const Sidebar: React.FC<SidebarProps> = ({
208179
parentActivityForAdd={parentActivityForAdd}
209180
onShowStepDialog={onShowStepDialog}
210181
/>
211-
{/* Pass handleNodeIdChange to NodeEditor below */}
182+
{/* Script Structure Tree */}
212183
<TreeView
213184
script={script}
214-
selectedRef={localSelectedRef}
185+
selectedRef={selectedRef}
215186
onSelectScript={onSelectScript}
216187
onSelectActivity={onSelectActivity}
217188
onSelectStep={onSelectStep}
218189
onDeleteActivity={onDeleteActivity}
219190
onDeleteStep={onDeleteStep}
220191
/>
221-
{selectedNode && (
222-
<NodeEditor
223-
node={selectedNode}
224-
onUpdateActivity={(activityId: string, patch: Partial<Activity>) => {
225-
if (patch.id && patch.id !== activityId) {
226-
handleNodeIdChange(activityId, patch.id, 'activity');
227-
}
228-
onUpdateActivity?.(activityId, patch);
229-
}}
230-
onUpdateStep={(stepId: string, patch: Partial<Step>) => {
231-
if (patch.id && patch.id !== stepId) {
232-
let parentId = null;
233-
if (selectedRef && selectedRef.kind === 'step') {
234-
parentId = selectedRef.activityId;
235-
}
236-
handleNodeIdChange(stepId, patch.id, 'step', parentId || undefined);
237-
}
238-
onUpdateStep?.(stepId, patch);
239-
}}
240-
/>
241-
)}
242192
</CollapsibleSection>
243193
</div>
244194

0 commit comments

Comments
 (0)