restore/export data popup, TODO: backend for restore data

This commit is contained in:
Sam Hadow 2024-03-02 15:46:44 +01:00
parent fc9b313832
commit 4f069bfb20
6 changed files with 112 additions and 7 deletions

View File

@ -144,6 +144,14 @@ def changeListContent():
except:
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'])
def data_history_request():
if request.method == 'GET':

View File

@ -383,6 +383,17 @@ def fetch_all():
connection.close()
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():
'''join item and history data from database and export it in ./output.csv'''
connection = connect_db()

View File

@ -39,8 +39,8 @@
<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>
</div>
<div class="btn-group mr-2" role="group" aria-label="export">
<button id="export_data_button" class="btn btn-secondary" type="button">export</button>
<div class="btn-group mr-2" role="group" aria-label="export restore">
<button id="export_restore" class="btn btn-secondary" type="button">manage data</button>
</div>
</div>
</div>
@ -97,6 +97,27 @@
</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-->
<div id="confirmationPopup" class="popup">
<div class="popup-content">
@ -116,4 +137,5 @@
<script src="{{ url_for('static', filename='rendergraphs.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='restore.js') }}"></script>
<script src="{{ url_for('static', filename='app.js') }}"></script>

View File

@ -1,11 +1,11 @@
// CSV to JS object
function csvToObject(csvData) {
const rows = csvData.split('\n');
const headers = rows[0].split(',');
const headers = rows[0].split(';');
const dataArray = [];
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] != '') {
//don't treat empty lines
const obj = {};
@ -21,19 +21,22 @@ function csvToObject(csvData) {
// JS object to CSV
function objectToCsv(objArray) {
console.log(objArray)
const array = typeof objArray !== 'object' ? JSON.parse(objArray) : objArray;
let csv = '';
// field names in first line
const fields = Object.keys(array[0]);
csv += fields.join(',') + '\r\n'; // \r\n for cross platform compatibility
csv += fields.join(';') + '\n';
// data rows
for (let i = 0; i < array.length; i++) {
let line = '';
for (let index in array[i]) {
if (line !== '') line += ',';
if (line !== '') {
line += ';';
}
line += array[i][index];
}
csv += line + '\r\n';
csv += line + '\n';
}
return csv;
}

View File

@ -224,3 +224,8 @@ document.addEventListener('DOMContentLoaded', function () {
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
View 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);