Skip to content

Commit 171a920

Browse files
bsekachevnmanovic
authored andcommitted
React & Antd: Dashboard migration (#892)
* Removed old dashboard * Getting all users * Updated changelog * Reimplemented login decorator * Implicit host, scheme in docker-compose * Fixed issue with pagination * Implicit page size parameter for tasks * Fixed linkedin icon, added links to tasks in notifications * Configurable method for check plugin
1 parent dc7bfa9 commit 171a920

File tree

55 files changed

+293
-3350
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+293
-3350
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ https://github.com/opencv/cvat/issues/750).
2121

2222
### Changed
2323
- page_size parameter for all REST API methods
24+
- React & Redux & Antd based dashboard
2425

2526
### Deprecated
2627
-

cvat-core/src/server-proxy.js

Lines changed: 31 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,14 @@
1515
const store = require('store');
1616
const config = require('./config');
1717

18-
function generateError(errorData, baseMessage) {
18+
function generateError(errorData) {
1919
if (errorData.response) {
20-
const message = `${baseMessage}. `
21-
+ `${errorData.message}. ${JSON.stringify(errorData.response.data) || ''}.`;
20+
const message = `${errorData.message}. ${JSON.stringify(errorData.response.data) || ''}.`;
2221
return new ServerError(message, errorData.response.status);
2322
}
2423

2524
// Server is unavailable (no any response)
26-
const message = `${baseMessage}. `
27-
+ `${errorData.message}.`; // usually is "Error Network"
25+
const message = `${errorData.message}.`; // usually is "Error Network"
2826
return new ServerError(message, 0);
2927
}
3028

@@ -49,7 +47,7 @@
4947
proxy: config.proxy,
5048
});
5149
} catch (errorData) {
52-
throw generateError(errorData, 'Could not get "about" information from the server');
50+
throw generateError(errorData);
5351
}
5452

5553
return response.data;
@@ -65,7 +63,7 @@
6563
proxy: config.proxy,
6664
});
6765
} catch (errorData) {
68-
throw generateError(errorData, 'Could not get "share" information from the server');
66+
throw generateError(errorData);
6967
}
7068

7169
return response.data;
@@ -82,7 +80,7 @@
8280
},
8381
});
8482
} catch (errorData) {
85-
throw generateError(errorData, 'Could not send an exception to the server');
83+
throw generateError(errorData);
8684
}
8785
}
8886

@@ -95,7 +93,7 @@
9593
proxy: config.proxy,
9694
});
9795
} catch (errorData) {
98-
throw generateError(errorData, 'Could not get annotation formats from the server');
96+
throw generateError(errorData);
9997
}
10098

10199
return response.data;
@@ -111,7 +109,7 @@
111109
});
112110
response = JSON.parse(response.data);
113111
} catch (errorData) {
114-
throw generateError(errorData, 'Could not get export formats from the server');
112+
throw generateError(errorData);
115113
}
116114

117115
return response;
@@ -135,7 +133,7 @@
135133
},
136134
});
137135
} catch (errorData) {
138-
throw generateError(errorData, `Could not register '${username}' user on the server`);
136+
throw generateError(errorData);
139137
}
140138

141139
return response.data;
@@ -157,7 +155,7 @@
157155
},
158156
);
159157
} catch (errorData) {
160-
throw generateError(errorData, 'Could not login on a server');
158+
throw generateError(errorData);
161159
}
162160

163161
if (authenticationResponse.headers['set-cookie']) {
@@ -178,7 +176,7 @@
178176
proxy: config.proxy,
179177
});
180178
} catch (errorData) {
181-
throw generateError(errorData, 'Could not logout from the server');
179+
throw generateError(errorData);
182180
}
183181

184182
store.remove('token');
@@ -206,7 +204,7 @@
206204
...data,
207205
})).data;
208206
} catch (errorData) {
209-
throw generateError(errorData, 'Could not have done the request');
207+
throw generateError(errorData);
210208
}
211209
}
212210

@@ -215,11 +213,11 @@
215213

216214
let response = null;
217215
try {
218-
response = await Axios.get(`${backendAPI}/tasks?${filter}`, {
216+
response = await Axios.get(`${backendAPI}/tasks?page_size=10&${filter}`, {
219217
proxy: config.proxy,
220218
});
221219
} catch (errorData) {
222-
throw generateError(errorData, 'Could not get tasks from a server');
220+
throw generateError(errorData);
223221
}
224222

225223
response.data.results.count = response.data.count;
@@ -237,7 +235,7 @@
237235
},
238236
});
239237
} catch (errorData) {
240-
throw generateError(errorData, 'Could not save the task on the server');
238+
throw generateError(errorData);
241239
}
242240
}
243241

@@ -247,7 +245,7 @@
247245
try {
248246
await Axios.delete(`${backendAPI}/tasks/${id}`);
249247
} catch (errorData) {
250-
throw generateError(errorData, `Could not delete the task ${id} from the server`);
248+
throw generateError(errorData);
251249
}
252250
}
253251

@@ -269,10 +267,7 @@
269267
resolve(url);
270268
}
271269
} catch (errorData) {
272-
reject(generateError(
273-
errorData,
274-
`Failed to export the task ${id} as a dataset`,
275-
));
270+
reject(generateError(errorData));
276271
}
277272
}
278273

@@ -311,7 +306,7 @@
311306
}
312307
} catch (errorData) {
313308
reject(
314-
generateError(errorData, 'Could not put task to the server'),
309+
generateError(errorData),
315310
);
316311
}
317312
}
@@ -340,7 +335,7 @@
340335
},
341336
});
342337
} catch (errorData) {
343-
throw generateError(errorData, 'Could not put task to the server');
338+
throw generateError(errorData);
344339
}
345340

346341
onUpdate('The data is being uploaded to the server..');
@@ -355,7 +350,7 @@
355350
// ignore
356351
}
357352

358-
throw generateError(errorData, 'Could not put data to the server');
353+
throw generateError(errorData);
359354
}
360355

361356
try {
@@ -378,7 +373,7 @@
378373
proxy: config.proxy,
379374
});
380375
} catch (errorData) {
381-
throw generateError(errorData, 'Could not get jobs from a server');
376+
throw generateError(errorData);
382377
}
383378

384379
return response.data;
@@ -395,7 +390,7 @@
395390
},
396391
});
397392
} catch (errorData) {
398-
throw generateError(errorData, 'Could not save the job on the server');
393+
throw generateError(errorData);
399394
}
400395
}
401396

@@ -405,7 +400,7 @@
405400
let response = null;
406401
try {
407402
if (id === null) {
408-
response = await Axios.get(`${backendAPI}/users`, {
403+
response = await Axios.get(`${backendAPI}/users?page_size=all`, {
409404
proxy: config.proxy,
410405
});
411406
} else {
@@ -414,7 +409,7 @@
414409
});
415410
}
416411
} catch (errorData) {
417-
throw generateError(errorData, 'Could not get users from the server');
412+
throw generateError(errorData);
418413
}
419414

420415
return response.data.results;
@@ -429,7 +424,7 @@
429424
proxy: config.proxy,
430425
});
431426
} catch (errorData) {
432-
throw generateError(errorData, 'Could not get user data from the server');
427+
throw generateError(errorData);
433428
}
434429

435430
return response.data;
@@ -466,10 +461,7 @@
466461
responseType: 'blob',
467462
});
468463
} catch (errorData) {
469-
throw generateError(
470-
errorData,
471-
`Could not get frame ${frame} for the task ${tid} from the server`,
472-
);
464+
throw generateError(errorData);
473465
}
474466

475467
return response.data;
@@ -484,10 +476,7 @@
484476
proxy: config.proxy,
485477
});
486478
} catch (errorData) {
487-
throw generateError(
488-
errorData,
489-
`Could not get frame meta info for the task ${tid} from the server`,
490-
);
479+
throw generateError(errorData);
491480
}
492481

493482
return response.data;
@@ -503,10 +492,7 @@
503492
proxy: config.proxy,
504493
});
505494
} catch (errorData) {
506-
throw generateError(
507-
errorData,
508-
`Could not get annotations for the ${session} ${id} from the server`,
509-
);
495+
throw generateError(errorData);
510496
}
511497

512498
return response.data;
@@ -534,10 +520,7 @@
534520
},
535521
});
536522
} catch (errorData) {
537-
throw generateError(
538-
errorData,
539-
`Could not ${action} annotations for the ${session} ${id} on the server`,
540-
);
523+
throw generateError(errorData);
541524
}
542525

543526
return response.data;
@@ -564,10 +547,7 @@
564547
resolve();
565548
}
566549
} catch (errorData) {
567-
reject(generateError(
568-
errorData,
569-
`Could not upload annotations for the ${session} ${id}`,
570-
));
550+
reject(generateError(errorData));
571551
}
572552
}
573553

@@ -595,10 +575,7 @@
595575
resolve(url);
596576
}
597577
} catch (errorData) {
598-
reject(generateError(
599-
errorData,
600-
`Could not dump annotations for the task ${id} from the server`,
601-
));
578+
reject(generateError(errorData));
602579
}
603580
}
604581

cvat-ui/src/actions/models-actions.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,10 +551,11 @@ function inferModelSuccess(): AnyAction {
551551
return action;
552552
}
553553

554-
function inferModelFailed(error: any): AnyAction {
554+
function inferModelFailed(error: any, taskID: number): AnyAction {
555555
const action = {
556556
type: ModelsActionTypes.INFER_MODEL_FAILED,
557557
payload: {
558+
taskID,
558559
error,
559560
},
560561
};
@@ -599,7 +600,7 @@ export function inferModelAsync(
599600

600601
dispatch(getInferenceStatusAsync([taskInstance.id]));
601602
} catch (error) {
602-
dispatch(inferModelFailed(error));
603+
dispatch(inferModelFailed(error, taskInstance.id));
603604
return;
604605
}
605606

cvat-ui/src/actions/tasks-actions.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,12 @@ ThunkAction<Promise<void>, {}, {}, AnyAction> {
9090
return;
9191
}
9292

93-
const array = Array.from(result);
93+
const array = Array.from(result)
94+
.filter((task: any) => task.jobs.length > 0);
9495
const previews = [];
9596
const promises = array
9697
.map((task): string => (task as any).frames.preview());
98+
9799
dispatch(
98100
getInferenceStatusAsync(
99101
array.map(
@@ -441,23 +443,23 @@ function updateTask(): AnyAction {
441443
return action;
442444
}
443445

444-
function updateTaskSuccess(taskInstance: any): AnyAction {
446+
function updateTaskSuccess(task: any): AnyAction {
445447
const action = {
446448
type: TasksActionTypes.UPDATE_TASK_SUCCESS,
447449
payload: {
448-
taskInstance,
450+
task,
449451
},
450452
};
451453

452454
return action;
453455
}
454456

455-
function updateTaskFailed(error: any, taskInstance: any): AnyAction {
457+
function updateTaskFailed(error: any, task: any): AnyAction {
456458
const action = {
457459
type: TasksActionTypes.UPDATE_TASK_FAILED,
458460
payload: {
459461
error,
460-
taskInstance,
462+
task,
461463
},
462464
};
463465

cvat-ui/src/components/create-model-page/create-model-content.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import {
77
Alert,
88
Button,
99
Tooltip,
10-
Modal,
1110
message,
1211
notification,
1312
} from 'antd';
@@ -96,7 +95,7 @@ export default class CreateModelContent extends React.PureComponent<Props> {
9695
const status = this.props.modelCreatingStatus
9796
&& this.props.modelCreatingStatus !== 'CREATED' ? this.props.modelCreatingStatus : '';
9897

99-
const guideLink = 'https://github.com/opencv/cvat/tree/develop/cvat/apps/auto_annotation';
98+
const guideLink = 'https://github.com/opencv/cvat/blob/develop/cvat/apps/auto_annotation/README.md';
10099
return (
101100
<Row type='flex' justify='start' align='middle' className='cvat-create-model-content'>
102101
<Col span={24}>

0 commit comments

Comments
 (0)