Skip to content

Commit 81bc6fe

Browse files
authored
Merge pull request #67 from mapswipe/feature/test-validate-aoi
Add option to test AOI on validate project
2 parents a1d2549 + 828f34e commit 81bc6fe

File tree

3 files changed

+239
-3
lines changed
  • app/views
    • EditProject/UpdateProjectForm/ValidateProjectSpecifics/ObjectSourceInput
    • NewProject/ProjectGeneralInputs

3 files changed

+239
-3
lines changed

app/views/EditProject/UpdateProjectForm/ValidateProjectSpecifics/ObjectSourceInput/index.tsx

Lines changed: 237 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,67 @@
1-
import { useContext } from 'react';
1+
import {
2+
useContext,
3+
useMemo,
4+
} from 'react';
5+
import {
6+
isDefined,
7+
isNotDefined,
8+
} from '@togglecorp/fujs';
29
import {
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';
919
import Container from '#components/Container';
1020
import AssetInput from '#components/domain/AssetInput';
1121
import RadioInput from '#components/RadioInput';
1222
import TextInput from '#components/TextInput';
1323
import EnumsContext from '#contexts/EnumsContext';
1424
import {
1525
ProjectAssetInputTypeEnum,
26+
useTestAoiObjectsQuery,
27+
useTestTaskingManagerProjectQuery,
1628
ValidateObjectSourceTypeEnum,
1729
} from '#generated/types/graphql';
1830
import {
31+
formatNumber,
1932
keySelector,
2033
labelSelector,
2134
} from '#utils/common';
2235

2336
import { 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+
2565
interface 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"

app/views/NewProject/ProjectGeneralInputs/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import { DeepNonNullable } from '#utils/types';
3232
// eslint-disable-next-line @typescript-eslint/no-unused-vars
3333
const PROJECT_NAME_QUERY = gql`
3434
query ProjectName($params: ProjectNameInput) {
35-
projectName(params: $params)
35+
projectName(params: $params)
3636
}
3737
`;
3838

0 commit comments

Comments
 (0)