1- import { useContext } from 'react' ;
1+ import {
2+ useContext ,
3+ useMemo ,
4+ } from 'react' ;
5+ import {
6+ isDefined ,
7+ isNotDefined ,
8+ } from '@togglecorp/fujs' ;
29import {
310 EntriesAsList ,
411 getErrorObject ,
512 LeafError ,
613 ObjectError ,
714} from '@togglecorp/toggle-form' ;
15+ import { gql } from 'urql' ;
816
17+ import Alert from '#components/Alert' ;
18+ import Button from '#components/Button' ;
919import Container from '#components/Container' ;
1020import AssetInput from '#components/domain/AssetInput' ;
1121import RadioInput from '#components/RadioInput' ;
1222import TextInput from '#components/TextInput' ;
1323import EnumsContext from '#contexts/EnumsContext' ;
1424import {
1525 ProjectAssetInputTypeEnum ,
26+ useTestAoiObjectsQuery ,
27+ useTestTaskingManagerProjectQuery ,
1628 ValidateObjectSourceTypeEnum ,
1729} from '#generated/types/graphql' ;
1830import {
31+ formatNumber ,
1932 keySelector ,
2033 labelSelector ,
2134} from '#utils/common' ;
2235
2336import { PartialValidateObjectSourceInputFields } from './schema' ;
2437
38+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
39+ const TEST_AOI_OBJECTS_QUERY = gql `
40+ query TestAoiObjects($assetId: ID, $projectId: ID, $ohsomeFilter: String) {
41+ testAoiObjects(assetId: $assetId, projectId: $projectId, ohsomeFilter: $ohsomeFilter) {
42+ ok
43+ error
44+ objectCount
45+ assetId
46+ projectId
47+ ohsomeFilter
48+ }
49+ }
50+ ` ;
51+
52+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
53+ const TEST_TASKING_MANAGER_PROJECT_QUERY = gql `
54+ query TestTaskingManagerProject($hotTmId: String, $ohsomeFilter: String) {
55+ testTaskingManagerProject(hotTmId: $hotTmId, ohsomeFilter: $ohsomeFilter) {
56+ ok
57+ error
58+ objectCount
59+ hotTmId
60+ ohsomeFilter
61+ }
62+ }
63+ ` ;
64+
2565interface Props {
2666 value : PartialValidateObjectSourceInputFields | undefined ,
2767 error : LeafError | ObjectError < PartialValidateObjectSourceInputFields > ,
@@ -43,6 +83,37 @@ function ObjectSourceInput(props: Props) {
4383
4484 const error = getErrorObject ( formError ) ;
4585
86+ const [
87+ {
88+ data : testAoiObjectsResponse ,
89+ fetching : testAoiObjectsPending ,
90+ error : testAoiObjectsError ,
91+ } ,
92+ triggerTestAoiObjects ,
93+ ] = useTestAoiObjectsQuery ( {
94+ variables : {
95+ projectId,
96+ assetId : value ?. aoiGeometry ,
97+ ohsomeFilter : value ?. ohsomeFilter ,
98+ } ,
99+ pause : true ,
100+ } ) ;
101+
102+ const [
103+ {
104+ data : testTaskingManagerProjectResponse ,
105+ fetching : testTaskingManagerProjectPending ,
106+ error : testTaskingManagerProjectError ,
107+ } ,
108+ triggerTestTaskingManagerProject ,
109+ ] = useTestTaskingManagerProjectQuery ( {
110+ variables : {
111+ hotTmId : value ?. taskingManagerProjectId ,
112+ ohsomeFilter : value ?. ohsomeFilter ,
113+ } ,
114+ pause : true ,
115+ } ) ;
116+
46117 const {
47118 validateObjectSourceTypeOptions,
48119 } = useContext ( EnumsContext ) ;
@@ -53,10 +124,175 @@ function ObjectSourceInput(props: Props) {
53124 TaskingManager,
54125 } = ValidateObjectSourceTypeEnum ;
55126
127+ const headerDescription = useMemo ( ( ) => {
128+ if ( isNotDefined ( value ?. sourceType ) ) {
129+ return null ;
130+ }
131+
132+ if ( value . sourceType === AoiGeojsonFile ) {
133+ if ( isDefined ( testAoiObjectsError ) ) {
134+ return (
135+ < Alert
136+ name = "test-aoi-message"
137+ type = "danger"
138+ title = "Failed to validate AOI"
139+ description = { testAoiObjectsError . message }
140+ fullWidth
141+ withoutShadow
142+ />
143+ ) ;
144+ }
145+
146+ if ( isNotDefined ( testAoiObjectsResponse ) ) {
147+ return null ;
148+ }
149+
150+ const {
151+ testAoiObjects : {
152+ ok,
153+ error : testError ,
154+ objectCount,
155+ assetId,
156+ ohsomeFilter,
157+ } ,
158+ } = testAoiObjectsResponse ;
159+
160+ if ( assetId !== value . aoiGeometry || ohsomeFilter !== value . ohsomeFilter ) {
161+ return null ;
162+ }
163+
164+ return (
165+ < Alert
166+ name = "test-aoi-message"
167+ type = { ok ? 'success' : 'danger' }
168+ title = { ok
169+ ? `AOI is valid. It contains ${ formatNumber ( objectCount ) } object(s)`
170+ : 'Failed to validate AOI' }
171+ description = { testError }
172+ fullWidth
173+ withoutShadow
174+ />
175+ ) ;
176+ }
177+
178+ if ( value . sourceType === TaskingManager ) {
179+ if ( isDefined ( testTaskingManagerProjectError ) ) {
180+ return (
181+ < Alert
182+ name = "test-tasking-manager-project-message"
183+ type = "danger"
184+ title = "Failed to validate project AOI"
185+ description = { testTaskingManagerProjectError . message }
186+ fullWidth
187+ withoutShadow
188+ />
189+ ) ;
190+ }
191+ if ( isNotDefined ( testTaskingManagerProjectResponse ) ) {
192+ return null ;
193+ }
194+
195+ const {
196+ testTaskingManagerProject : {
197+ ok,
198+ error : testError ,
199+ objectCount,
200+ hotTmId,
201+ ohsomeFilter,
202+ } ,
203+ } = testTaskingManagerProjectResponse ;
204+
205+ if ( hotTmId !== value . taskingManagerProjectId || ohsomeFilter !== value . ohsomeFilter ) {
206+ return null ;
207+ }
208+
209+ return (
210+ < Alert
211+ name = "test-tasking-manager-project-message"
212+ type = { ok ? 'success' : 'danger' }
213+ title = { ok
214+ ? `Project is valid. It contains ${ formatNumber ( objectCount ) } object(s)`
215+ : 'Failed to validate project AOI' }
216+ description = { testError }
217+ fullWidth
218+ withoutShadow
219+ />
220+ ) ;
221+ }
222+
223+ return null ;
224+ } , [
225+ AoiGeojsonFile ,
226+ TaskingManager ,
227+ testAoiObjectsResponse ,
228+ testAoiObjectsError ,
229+ testTaskingManagerProjectResponse ,
230+ testTaskingManagerProjectError ,
231+ value ?. sourceType ,
232+ value ?. taskingManagerProjectId ,
233+ value ?. ohsomeFilter ,
234+ value ?. aoiGeometry ,
235+ ] ) ;
236+
237+ const actions = useMemo ( ( ) => {
238+ if ( isNotDefined ( value ?. sourceType ) ) {
239+ return null ;
240+ }
241+
242+ if ( value . sourceType === AoiGeojsonFile ) {
243+ if ( isNotDefined ( value ?. aoiGeometry ) || isNotDefined ( value . ohsomeFilter ) ) {
244+ return null ;
245+ }
246+
247+ return (
248+ < Button
249+ name = { undefined }
250+ onClick = { triggerTestAoiObjects }
251+ disabled = { testAoiObjectsPending }
252+ >
253+ { testAoiObjectsPending ? 'Testing AOI on ohsome...' : 'Test AOI on ohsome' }
254+ </ Button >
255+ ) ;
256+ }
257+
258+ if ( value . sourceType === TaskingManager ) {
259+ if ( isNotDefined ( value . taskingManagerProjectId ) || isNotDefined ( value . ohsomeFilter ) ) {
260+ return null ;
261+ }
262+
263+ return (
264+ < Button
265+ name = { undefined }
266+ onClick = { triggerTestTaskingManagerProject }
267+ disabled = { testTaskingManagerProjectPending }
268+ >
269+ { testTaskingManagerProjectPending
270+ ? 'Testing Tasking Manager project AOI on ohsome...'
271+ : 'Test Tasking Manager project AOI on ohsome' }
272+ </ Button >
273+ ) ;
274+ }
275+
276+ return null ;
277+ } , [
278+ AoiGeojsonFile ,
279+ TaskingManager ,
280+ testAoiObjectsPending ,
281+ testTaskingManagerProjectPending ,
282+ triggerTestAoiObjects ,
283+ triggerTestTaskingManagerProject ,
284+ value ?. aoiGeometry ,
285+ value ?. ohsomeFilter ,
286+ value ?. sourceType ,
287+ value ?. taskingManagerProjectId ,
288+ ] ) ;
289+
56290 return (
57291 < Container
58292 heading = "Validation Object Source"
59293 headingLevel = { 4 }
294+ headerDescription = { headerDescription }
295+ footerActions = { actions }
60296 >
61297 < RadioInput
62298 label = "Source type"
0 commit comments