restore/export data popup, TODO: backend for restore data
This commit is contained in:
parent
fc9b313832
commit
4f069bfb20
@ -144,6 +144,14 @@ def changeListContent():
|
|||||||
except:
|
except:
|
||||||
return str('error changing content'), 400
|
return str('error changing content'), 400
|
||||||
|
|
||||||
|
@app.route('/app/restore', methods=['POST'])
|
||||||
|
def restore():
|
||||||
|
data = request.get_json()
|
||||||
|
d = data.get('data')
|
||||||
|
# print(d)
|
||||||
|
restore_db(d)
|
||||||
|
return '1'
|
||||||
|
|
||||||
@app.route('/app/datahistory',methods = ['GET'])
|
@app.route('/app/datahistory',methods = ['GET'])
|
||||||
def data_history_request():
|
def data_history_request():
|
||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
|
11
src/db.py
11
src/db.py
@ -383,6 +383,17 @@ def fetch_all():
|
|||||||
connection.close()
|
connection.close()
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
def restore_db(data):
|
||||||
|
tables_with_uuid = ["item", "itemlist"]
|
||||||
|
tables = ["item", "itemlist", "listcontent", "history"]
|
||||||
|
connection = connect_db()
|
||||||
|
cursor = connection.cursor()
|
||||||
|
for elem in data["item"]:
|
||||||
|
print(elem)
|
||||||
|
for table in tables:
|
||||||
|
for elem in data[table]:
|
||||||
|
print(elem)
|
||||||
|
|
||||||
def export_csv():
|
def export_csv():
|
||||||
'''join item and history data from database and export it in ./output.csv'''
|
'''join item and history data from database and export it in ./output.csv'''
|
||||||
connection = connect_db()
|
connection = connect_db()
|
||||||
|
26
web/app.html
26
web/app.html
@ -39,8 +39,8 @@
|
|||||||
<div class="btn-group mr-2" role="group" aria-label="Toggle show group">
|
<div class="btn-group mr-2" role="group" aria-label="Toggle show group">
|
||||||
<button id="global_toggleshow" class="btn btn-secondary" type="button">show hidden</button>
|
<button id="global_toggleshow" class="btn btn-secondary" type="button">show hidden</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group mr-2" role="group" aria-label="export">
|
<div class="btn-group mr-2" role="group" aria-label="export restore">
|
||||||
<button id="export_data_button" class="btn btn-secondary" type="button">export</button>
|
<button id="export_restore" class="btn btn-secondary" type="button">manage data</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -97,6 +97,27 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- popup export restore -->
|
||||||
|
<div id="restorePopup" class="popup">
|
||||||
|
<div class="popup-content">
|
||||||
|
<div id="exportdata_content">
|
||||||
|
<button id="export_data_button" class="btn btn-secondary" type="button">export</button>
|
||||||
|
</div>
|
||||||
|
<p><br/>Restore from file:</p>
|
||||||
|
<div class="btn-toolbar" role="toolbar">
|
||||||
|
<div class="btn-group mr-2" role="group">
|
||||||
|
<div class="custom-file">
|
||||||
|
<input type="file" class="custom-file-input" id="inputGroupFile01">
|
||||||
|
<label class="custom-file-label" for="inputGroupFile01">Choose file</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="btn-group mr-2" role="group">
|
||||||
|
<button id="submit_restore" type="submit" class="btn btn-primary">Submit</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!--popup confirmation window-->
|
<!--popup confirmation window-->
|
||||||
<div id="confirmationPopup" class="popup">
|
<div id="confirmationPopup" class="popup">
|
||||||
<div class="popup-content">
|
<div class="popup-content">
|
||||||
@ -116,4 +137,5 @@
|
|||||||
<script src="{{ url_for('static', filename='rendergraphs.js') }}"></script>
|
<script src="{{ url_for('static', filename='rendergraphs.js') }}"></script>
|
||||||
<script src="{{ url_for('static', filename='list.js') }}"></script>
|
<script src="{{ url_for('static', filename='list.js') }}"></script>
|
||||||
<script src="{{ url_for('static', filename='csv.js') }}"></script>
|
<script src="{{ url_for('static', filename='csv.js') }}"></script>
|
||||||
|
<script src="{{ url_for('static', filename='restore.js') }}"></script>
|
||||||
<script src="{{ url_for('static', filename='app.js') }}"></script>
|
<script src="{{ url_for('static', filename='app.js') }}"></script>
|
||||||
|
13
web/csv.js
13
web/csv.js
@ -1,11 +1,11 @@
|
|||||||
// CSV to JS object
|
// CSV to JS object
|
||||||
function csvToObject(csvData) {
|
function csvToObject(csvData) {
|
||||||
const rows = csvData.split('\n');
|
const rows = csvData.split('\n');
|
||||||
const headers = rows[0].split(',');
|
const headers = rows[0].split(';');
|
||||||
const dataArray = [];
|
const dataArray = [];
|
||||||
|
|
||||||
for (let i = 1; i < rows.length; i++) {
|
for (let i = 1; i < rows.length; i++) {
|
||||||
const values = rows[i].trim().split(','); // trim to remove linebreak
|
const values = rows[i].trim().split(';'); // trim to remove linebreak
|
||||||
if (rows[i] != '') {
|
if (rows[i] != '') {
|
||||||
//don't treat empty lines
|
//don't treat empty lines
|
||||||
const obj = {};
|
const obj = {};
|
||||||
@ -21,19 +21,22 @@ function csvToObject(csvData) {
|
|||||||
|
|
||||||
// JS object to CSV
|
// JS object to CSV
|
||||||
function objectToCsv(objArray) {
|
function objectToCsv(objArray) {
|
||||||
|
console.log(objArray)
|
||||||
const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
|
const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
|
||||||
let csv = '';
|
let csv = '';
|
||||||
// field names in first line
|
// field names in first line
|
||||||
const fields = Object.keys(array[0]);
|
const fields = Object.keys(array[0]);
|
||||||
csv += fields.join(',') + '\r\n'; // \r\n for cross platform compatibility
|
csv += fields.join(';') + '\n';
|
||||||
// data rows
|
// data rows
|
||||||
for (let i = 0; i < array.length; i++) {
|
for (let i = 0; i < array.length; i++) {
|
||||||
let line = '';
|
let line = '';
|
||||||
for (let index in array[i]) {
|
for (let index in array[i]) {
|
||||||
if (line !== '') line += ',';
|
if (line !== '') {
|
||||||
|
line += ';';
|
||||||
|
}
|
||||||
line += array[i][index];
|
line += array[i][index];
|
||||||
}
|
}
|
||||||
csv += line + '\r\n';
|
csv += line + '\n';
|
||||||
}
|
}
|
||||||
return csv;
|
return csv;
|
||||||
}
|
}
|
||||||
|
@ -224,3 +224,8 @@ document.addEventListener('DOMContentLoaded', function () {
|
|||||||
confirmationPopup.style.display = 'none';
|
confirmationPopup.style.display = 'none';
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// restore/export data popup
|
||||||
|
document.getElementById("export_restore").addEventListener("click", function () {
|
||||||
|
restorePopup.style.display = 'flex';
|
||||||
|
});
|
||||||
|
56
web/restore.js
Normal file
56
web/restore.js
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
function handleFileUpload(event) {
|
||||||
|
const file = document.getElementById('inputGroupFile01').files[0];
|
||||||
|
const reader = new FileReader();
|
||||||
|
|
||||||
|
reader.onload = function(e) {
|
||||||
|
const rawData = e.target.result;
|
||||||
|
var blocks = rawData.split('#####');
|
||||||
|
blocks.shift() // 1st element is empty
|
||||||
|
console.log(blocks);
|
||||||
|
var data = {};
|
||||||
|
blocks.forEach(function (block) {
|
||||||
|
const split = block.indexOf('\n');
|
||||||
|
const table_name = block.substring(0, split);
|
||||||
|
const content = csvToObject(block.substring(split+1));
|
||||||
|
data[table_name] = content;
|
||||||
|
});
|
||||||
|
restore_request(data);
|
||||||
|
};
|
||||||
|
reader.readAsText(file);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function restore_request(data) {
|
||||||
|
try {
|
||||||
|
// SELECT uuid, itemid, skuid, choice, attributes, image, show
|
||||||
|
const apiUrl = `${currentUrl}app/restore`;
|
||||||
|
const postData = {
|
||||||
|
data: data
|
||||||
|
};
|
||||||
|
|
||||||
|
const requestOptions = {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
|
body: JSON.stringify(postData)
|
||||||
|
};
|
||||||
|
|
||||||
|
await fetch(apiUrl, requestOptions)
|
||||||
|
.catch(error => {
|
||||||
|
console.error('Error during POST request:', error);
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error fetching data item: ', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// change file picker text on file upload
|
||||||
|
$(".custom-file-input").on("change", function() {
|
||||||
|
var fileName = $(this).val().split("\\").pop();
|
||||||
|
$(this).siblings(".custom-file-label").addClass("selected").html(fileName);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Event listener restore from file
|
||||||
|
document.getElementById('submit_restore').addEventListener("click", handleFileUpload);
|
Loading…
x
Reference in New Issue
Block a user