@@ -9,10 +9,16 @@ import {
9
9
MenuTrigger ,
10
10
MenuPopover ,
11
11
MenuList ,
12
- MenuItem ,
12
+ MenuItemRadio ,
13
13
Text ,
14
14
Input ,
15
15
Switch ,
16
+ useId ,
17
+ Toaster ,
18
+ useToastController ,
19
+ Toast ,
20
+ ToastTitle ,
21
+ ToastBody ,
16
22
} from "@fluentui/react-components" ;
17
23
import * as React from "react" ;
18
24
import { useEffect , useState } from "react" ;
@@ -23,21 +29,31 @@ import {
23
29
} from "@fluentui/react-icons" ;
24
30
25
31
import { watch } from "@arcgis/core/core/reactiveUtils.js" ;
32
+ import Conversion from "@arcgis/core/widgets/CoordinateConversion/support/Conversion.js" ;
26
33
27
34
import "./FluentCoordinateConversion.css" ;
28
35
29
- async function reverseConvert ( { vm, value, activeFormat } ) {
30
- //coordinateEditable.editingEnabled = false;
31
- //const value = coordinateInput.value;
32
- try {
33
- const point = await vm . reverseConvert ( value , activeFormat ) ;
34
- vm . view . goTo ( point ) ;
35
- } catch ( e ) {
36
- //coordinateInput.status = "invalid";
36
+ export default function FluentCoordinateConversion ( { vm } ) {
37
+ const toasterId = useId ( "toaster" ) ;
38
+ const { dispatchToast } = useToastController ( toasterId ) ;
39
+ const toastError = ( ) =>
40
+ dispatchToast (
41
+ < Toast >
42
+ < ToastTitle > Error</ ToastTitle >
43
+ < ToastBody > Invalid coordinates entered.</ ToastBody >
44
+ </ Toast > ,
45
+ { intent : "error" }
46
+ ) ;
47
+
48
+ async function reverseConvert ( { vm, value, activeFormat } ) {
49
+ try {
50
+ const point = await vm . reverseConvert ( value , activeFormat ) ;
51
+ vm . view . goTo ( point ) ;
52
+ } catch ( e ) {
53
+ toastError ( ) ;
54
+ }
37
55
}
38
- }
39
56
40
- export default function FluentCoordinateConversion ( { vm } ) {
41
57
const [ activeFormat , setActiveFormat ] = useState ( ) ;
42
58
43
59
useEffect ( ( ) => {
@@ -67,27 +83,47 @@ export default function FluentCoordinateConversion({ vm }) {
67
83
} ;
68
84
} , [ vm ] ) ;
69
85
70
- console . log ( { vm, reverseConvert, activeFormat } ) ;
71
-
72
- const [ checkedValues , setCheckedValues ] = useState ( {
86
+ const [ toolbarCheckedValues , setToolbarCheckedValues ] = useState ( {
73
87
editing : [ ] ,
74
88
} ) ;
75
89
76
- const onChange = ( e , { name, checkedItems } ) => {
77
- setCheckedValues ( ( s ) => {
90
+ const onToolbarChange = ( e , { name, checkedItems } ) => {
91
+ setToolbarCheckedValues ( ( s ) => {
92
+ return s ? { ...s , [ name ] : checkedItems } : { [ name ] : checkedItems } ;
93
+ } ) ;
94
+ } ;
95
+
96
+ const showEditing = toolbarCheckedValues . editing . includes ( "edit" ) ;
97
+
98
+ const [ formatCheckedValues , setFormatCheckedValues ] = useState ( {
99
+ format : [ activeFormat ?. name ] ,
100
+ } ) ;
101
+
102
+ const onFormatChange = ( e , { name, checkedItems } ) => {
103
+ const value = checkedItems [ 0 ] ;
104
+ const format = vm . formats . find ( ( format ) => format . name === value ) ;
105
+ const newConversion = new Conversion ( { format } ) ;
106
+ vm . conversions . removeAt ( 0 ) ;
107
+ vm . conversions . add ( newConversion , 0 ) ;
108
+
109
+ setFormatCheckedValues ( ( s ) => {
78
110
return s ? { ...s , [ name ] : checkedItems } : { [ name ] : checkedItems } ;
79
111
} ) ;
80
112
} ;
81
113
82
- const showEditing = checkedValues . editing . includes ( "edit" ) ;
114
+ const formats = vm ?. formats ?. toArray ( ) . map ( ( format ) => (
115
+ < MenuItemRadio name = "format" value = { format . name } key = { format . name } >
116
+ { format . name . toLowerCase ( ) }
117
+ </ MenuItemRadio >
118
+ ) ) ;
83
119
84
120
return (
85
121
< div className = "fluent-coordinate-conversion" >
86
122
< FluentProvider theme = { webDarkTheme } >
87
123
< Toolbar
88
- checkedValues = { checkedValues }
124
+ checkedValues = { toolbarCheckedValues }
89
125
aria-label = "Default"
90
- onCheckedValueChange = { onChange }
126
+ onCheckedValueChange = { onToolbarChange }
91
127
>
92
128
< Location24Regular />
93
129
{ ! showEditing ? (
@@ -96,7 +132,20 @@ export default function FluentCoordinateConversion({ vm }) {
96
132
</ Text >
97
133
) : null }
98
134
{ showEditing ? (
99
- < Input className = "input" value = { activeDisplayCoordinate } />
135
+ < Input
136
+ placeholder = "Enter coordinates"
137
+ className = "input"
138
+ defaultValue = { activeDisplayCoordinate }
139
+ onKeyDown = { ( event ) => {
140
+ if ( event . key === "Enter" ) {
141
+ reverseConvert ( {
142
+ vm,
143
+ value : event . target . value ,
144
+ activeFormat,
145
+ } ) ;
146
+ }
147
+ } }
148
+ />
100
149
) : null }
101
150
< ToolbarDivider />
102
151
< ToolbarToggleButton
@@ -113,23 +162,23 @@ export default function FluentCoordinateConversion({ vm }) {
113
162
} }
114
163
/>
115
164
< ToolbarDivider />
116
- < Menu >
165
+ < Menu
166
+ hasCheckmarks
167
+ onCheckedValueChange = { onFormatChange }
168
+ checkedValues = { formatCheckedValues }
169
+ >
117
170
< MenuTrigger >
118
171
< ToolbarButton
119
172
aria-label = "Formats"
120
173
icon = { < Settings24Regular /> }
121
174
/>
122
175
</ MenuTrigger >
123
176
< MenuPopover >
124
- < MenuList >
125
- < MenuItem > New </ MenuItem >
126
- < MenuItem > New Window</ MenuItem >
127
- < MenuItem disabled > Open File</ MenuItem >
128
- < MenuItem > Open Folder</ MenuItem >
129
- </ MenuList >
177
+ < MenuList > { formats } </ MenuList >
130
178
</ MenuPopover >
131
179
</ Menu >
132
180
</ Toolbar >
181
+ < Toaster toasterId = { toasterId } />
133
182
</ FluentProvider >
134
183
</ div >
135
184
) ;
0 commit comments