Skip to content

Commit 485edf5

Browse files
committed
feat(validate): add option to test AOI & TM project
1 parent a1d2549 commit 485edf5

File tree

3 files changed

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

3 files changed

+207
-3
lines changed

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

Lines changed: 205 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,64 @@
1-
import { useContext } from 'react';
1+
import {
2+
useContext,
3+
useMemo,
4+
} from 'react';
5+
import { isNotDefined } from '@togglecorp/fujs';
26
import {
37
EntriesAsList,
48
getErrorObject,
59
LeafError,
610
ObjectError,
711
} from '@togglecorp/toggle-form';
12+
import { gql } from 'urql';
813

14+
import Alert from '#components/Alert';
15+
import Button from '#components/Button';
916
import Container from '#components/Container';
1017
import AssetInput from '#components/domain/AssetInput';
1118
import RadioInput from '#components/RadioInput';
1219
import TextInput from '#components/TextInput';
1320
import EnumsContext from '#contexts/EnumsContext';
1421
import {
1522
ProjectAssetInputTypeEnum,
23+
useTestAoiObjectsQuery,
24+
useTestTaskingManagerProjectQuery,
1625
ValidateObjectSourceTypeEnum,
1726
} from '#generated/types/graphql';
1827
import {
28+
formatNumber,
1929
keySelector,
2030
labelSelector,
2131
} from '#utils/common';
2232

2333
import { PartialValidateObjectSourceInputFields } from './schema';
2434

35+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
36+
const TEST_AOI_OBJECTS_QUERY = gql`
37+
query TestAoiObjects($assetId: ID, $projectId: ID, $ohsomeFilter: String) {
38+
testAoiObjects(assetId: $assetId, projectId: $projectId, ohsomeFilter: $ohsomeFilter) {
39+
ok
40+
error
41+
objectCount
42+
assetId
43+
projectId
44+
ohsomeFilter
45+
}
46+
}
47+
`;
48+
49+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
50+
const TEST_TASKING_MANAGER_PROJECT_QUERY = gql`
51+
query TestTaskingManagerProject($hotTmId: String, $ohsomeFilter: String) {
52+
testTaskingManagerProject(hotTmId: $hotTmId, ohsomeFilter: $ohsomeFilter) {
53+
ok
54+
error
55+
objectCount
56+
hotTmId
57+
ohsomeFilter
58+
}
59+
}
60+
`;
61+
2562
interface Props {
2663
value: PartialValidateObjectSourceInputFields | undefined,
2764
error: LeafError | ObjectError<PartialValidateObjectSourceInputFields>,
@@ -43,6 +80,35 @@ function ObjectSourceInput(props: Props) {
4380

4481
const error = getErrorObject(formError);
4582

83+
const [
84+
{
85+
data: testAoiObjectsResponse,
86+
fetching: testAoiObjectsPending,
87+
},
88+
triggerTestAoiObjects,
89+
] = useTestAoiObjectsQuery({
90+
variables: {
91+
projectId,
92+
assetId: value?.aoiGeometry,
93+
ohsomeFilter: value?.ohsomeFilter,
94+
},
95+
pause: true,
96+
});
97+
98+
const [
99+
{
100+
data: testTaskingManagerProjectResponse,
101+
fetching: testTaskingManagerProjectPending,
102+
},
103+
triggerTestTaskingManagerProject,
104+
] = useTestTaskingManagerProjectQuery({
105+
variables: {
106+
hotTmId: value?.taskingManagerProjectId,
107+
ohsomeFilter: value?.ohsomeFilter,
108+
},
109+
pause: true,
110+
});
111+
46112
const {
47113
validateObjectSourceTypeOptions,
48114
} = useContext(EnumsContext);
@@ -53,10 +119,148 @@ function ObjectSourceInput(props: Props) {
53119
TaskingManager,
54120
} = ValidateObjectSourceTypeEnum;
55121

122+
const headerDescription = useMemo(() => {
123+
if (isNotDefined(value?.sourceType)) {
124+
return null;
125+
}
126+
127+
if (value.sourceType === AoiGeojsonFile) {
128+
if (isNotDefined(testAoiObjectsResponse)) {
129+
return null;
130+
}
131+
132+
const {
133+
testAoiObjects: {
134+
ok,
135+
error: testError,
136+
objectCount,
137+
assetId,
138+
ohsomeFilter,
139+
},
140+
} = testAoiObjectsResponse;
141+
142+
if (assetId !== value.aoiGeometry || ohsomeFilter !== value.ohsomeFilter) {
143+
return null;
144+
}
145+
146+
return (
147+
<Alert
148+
name="test-aoi-message"
149+
type={ok ? 'success' : 'danger'}
150+
title={ok
151+
? `AOI is valid. It contains ${formatNumber(objectCount)} object(s)`
152+
: 'Failed to validate AOI'}
153+
description={testError}
154+
fullWidth
155+
withoutShadow
156+
/>
157+
);
158+
}
159+
160+
if (value.sourceType === TaskingManager) {
161+
if (isNotDefined(testTaskingManagerProjectResponse)) {
162+
return null;
163+
}
164+
165+
const {
166+
testTaskingManagerProject: {
167+
ok,
168+
error: testError,
169+
objectCount,
170+
hotTmId,
171+
ohsomeFilter,
172+
},
173+
} = testTaskingManagerProjectResponse;
174+
175+
if (hotTmId !== value.taskingManagerProjectId || ohsomeFilter !== value.ohsomeFilter) {
176+
return null;
177+
}
178+
179+
return (
180+
<Alert
181+
name="test-tasking-manager-project-message"
182+
type={ok ? 'success' : 'danger'}
183+
title={ok
184+
? `Project is valid. It contains ${formatNumber(objectCount)} object(s)`
185+
: 'Failed to validate AOI'}
186+
description={testError}
187+
fullWidth
188+
withoutShadow
189+
/>
190+
);
191+
}
192+
193+
return null;
194+
}, [
195+
AoiGeojsonFile,
196+
TaskingManager,
197+
testAoiObjectsResponse,
198+
testTaskingManagerProjectResponse,
199+
value?.sourceType,
200+
value?.taskingManagerProjectId,
201+
value?.ohsomeFilter,
202+
value?.aoiGeometry,
203+
]);
204+
205+
const actions = useMemo(() => {
206+
if (isNotDefined(value?.sourceType)) {
207+
return null;
208+
}
209+
210+
if (value.sourceType === AoiGeojsonFile) {
211+
if (isNotDefined(value?.aoiGeometry) || isNotDefined(value.ohsomeFilter)) {
212+
return null;
213+
}
214+
215+
return (
216+
<Button
217+
name={undefined}
218+
onClick={triggerTestAoiObjects}
219+
disabled={testAoiObjectsPending}
220+
>
221+
{testAoiObjectsPending ? 'Testing AOI on ohsome...' : 'Test AOI on ohsome'}
222+
</Button>
223+
);
224+
}
225+
226+
if (value.sourceType === TaskingManager) {
227+
if (isNotDefined(value.taskingManagerProjectId) || isNotDefined(value.ohsomeFilter)) {
228+
return null;
229+
}
230+
231+
return (
232+
<Button
233+
name={undefined}
234+
onClick={triggerTestTaskingManagerProject}
235+
disabled={testTaskingManagerProjectPending}
236+
>
237+
{testTaskingManagerProjectPending
238+
? 'Testing Tasking Manager project AOI on ohsome...'
239+
: 'Test Tasking Manager project AOI on ohsome'}
240+
</Button>
241+
);
242+
}
243+
244+
return null;
245+
}, [
246+
AoiGeojsonFile,
247+
TaskingManager,
248+
testAoiObjectsPending,
249+
testTaskingManagerProjectPending,
250+
triggerTestAoiObjects,
251+
triggerTestTaskingManagerProject,
252+
value?.aoiGeometry,
253+
value?.ohsomeFilter,
254+
value?.sourceType,
255+
value?.taskingManagerProjectId,
256+
]);
257+
56258
return (
57259
<Container
58260
heading="Validation Object Source"
59261
headingLevel={4}
262+
headerDescription={headerDescription}
263+
footerActions={actions}
60264
>
61265
<RadioInput
62266
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)