diff --git a/src/frontend/src/backend.js b/src/frontend/src/backend.js
index e1bae63..55bfcfb 100644
--- a/src/frontend/src/backend.js
+++ b/src/frontend/src/backend.js
@@ -14,10 +14,71 @@ const performRequest = async (requestingStore, method, url, body, expectResponse
params.body = JSON.stringify(body);
}
- const request = {url: url, params: params};
+ const request = {url: url, params: params, expectResponse: expectResponse, expectedException: expectedException};
logger.info("Request:", request);
- const response = await fetch(url, params
+ const data = await executeRequest(requestingStore, request);
+
+ logger.info("Response:", data);
+ return data;
+}
+
+const performDownload = async (requestingStore, url, expectResponse = true, expectedException = null) => {
+
+ const params = {
+ method: 'GET',
+ };
+
+ const request = {url: url, params: params, expectResponse: expectResponse, expectedException: expectedException};
+ logger.info("Request:", request);
+
+ const processId = await executeRequest(null, request);
+
+ logger.info("Response:", processId);
+ return processId;
+}
+
+const performUpload = async (url, file, expectResponse = true, expectedException = null) => {
+
+ const formData = new FormData();
+ formData.append('file', file);
+
+ const params = {
+ method: 'POST',
+ body: formData
+ };
+
+ const request = {url: url, params: params, expectResponse: expectResponse, expectedException: expectedException};
+ logger.info("Request:", request);
+
+ const processId = await executeRequest(null, request);
+
+ logger.info("Response:", processId);
+ return processId;
+}
+
+function handleErrorResponse(data, requestingStore, request) {
+ const errorObj = {
+ code: data.error.code,
+ title: data.error.title,
+ message: data.error.message,
+ trace: data.error.trace
+ }
+
+ const error = new Error('Internal backend error');
+ error.errorObj = errorObj;
+
+ if (request.expectedException === null || data.error.title !== request.expectedException) {
+ logger.error(errorObj);
+ const errorStore = useErrorStore();
+ void errorStore.addError(errorObj, {store: requestingStore, request: request});
+ }
+
+ throw error;
+}
+
+const executeRequest = async (requestingStore, request) => {
+ const response = await fetch(request.url, request.params
).catch(e => {
const error = {
code: 'Network error.',
@@ -33,7 +94,7 @@ const performRequest = async (requestingStore, method, url, body, expectResponse
});
let data = null;
- if (expectResponse) {
+ if (request.expectResponse) {
data = await response.json().catch(e => {
const error = {
code: 'Malformed response',
@@ -48,23 +109,7 @@ const performRequest = async (requestingStore, method, url, body, expectResponse
});
if (!response.ok) {
- const errorObj = {
- code: data.error.code,
- title: data.error.title,
- message: data.error.message,
- trace: data.error.trace
- }
-
- const error = new Error('Internal backend error');
- error.errorObj = errorObj;
-
- if (expectedException === null || data.error.title !== expectedException) {
- logger.error(errorObj);
- const errorStore = useErrorStore();
- void errorStore.addError(errorObj, {store: requestingStore, request: request});
- }
-
- throw error;
+ handleErrorResponse(data, requestingStore, request);
}
} else {
if (!response.ok) {
@@ -82,28 +127,12 @@ const performRequest = async (requestingStore, method, url, body, expectResponse
});
- const errorObj = {
- code: data.error.code,
- title: data.error.title,
- message: data.error.message,
- trace: data.error.trace
- }
-
- const error = new Error('Internal backend error');
- error.errorObj = errorObj;
-
- if (expectedException === null || data.error.title !== expectedException) {
- logger.error(errorObj);
- const errorStore = useErrorStore();
- void errorStore.addError(errorObj, {store: requestingStore, request: request});
- }
-
- throw error;
+ handleErrorResponse(data, requestingStore, request);
}
}
- logger.info("Response:", data);
return data;
}
export default performRequest;
+export {performUpload, performDownload};
diff --git a/src/frontend/src/components/layout/config/BulkOperations.vue b/src/frontend/src/components/layout/config/BulkOperations.vue
new file mode 100644
index 0000000..dbe3ac5
--- /dev/null
+++ b/src/frontend/src/components/layout/config/BulkOperations.vue
@@ -0,0 +1,227 @@
+
+ Bulk Operations
-
-
-
-
-
-
\ No newline at end of file
diff --git a/src/frontend/src/pages/Config.vue b/src/frontend/src/pages/Config.vue
index b8964b7..9ffbb64 100644
--- a/src/frontend/src/pages/Config.vue
+++ b/src/frontend/src/pages/Config.vue
@@ -22,6 +22,7 @@ import Properties from "@/components/layout/config/Properties.vue";
import Box from "@/components/UI/Box.vue";
import CountryProperties from "@/components/layout/config/CountryProperties.vue";
import StagedChanges from "@/components/layout/config/StagedChanges.vue";
+import BulkOperations from "@/components/layout/config/BulkOperations.vue";
export default {
name: "Config",
@@ -38,25 +39,9 @@ export default {
title: 'Countries',
component: markRaw(CountryProperties),
},
- {
- title: 'Nodes',
- component: (null),
- },
- {
- title: 'Kilometer rates',
- component: (null),
- },
- {
- title: 'Container rates',
- component: (null),
- },
- {
- title: 'Materials & packaging',
- component: (null),
- },
{
title: 'Bulk operations',
- component: (null),
+ component: markRaw(BulkOperations),
}
]
}
diff --git a/src/frontend/src/pages/Reporting.vue b/src/frontend/src/pages/Reporting.vue
index 309d98a..a58db46 100644
--- a/src/frontend/src/pages/Reporting.vue
+++ b/src/frontend/src/pages/Reporting.vue
@@ -8,6 +8,11 @@
+