location editor can now be used to edit locations. And add them!

pull/3/head
Marek Baczynski 6 years ago
parent a99a356985
commit 954b449757

@ -80,7 +80,7 @@ def get_locationURL(locationID):
@app.route('/parts/locationEditor')
def locationEditor():
query = 'select c.name as container, l.name as name, l.id from locations as l inner join containers as c on l.container_id = c.id order by container, name;'
query = 'select c.name as container, l.name as name, l.id, c.id as container_id from locations as l inner join containers as c on l.container_id = c.id order by container, name;'
r = db_engine.execute(text(query))
locations = []
for row in r:
@ -95,19 +95,19 @@ def alterLocation(locationID):
s = ''
if locationID < 0:
# New entry
s = 'insert into locations (name, map) '
s += 'values (:name, :map);'
s = 'insert into locations (name, container_id) '
s += 'values (:name, :container);'
s = text(s)
r = db_engine.execute(s,name=request.form['name'],map=request.form['map']);
r = db_engine.execute(s,name=request.form['name'],container=request.form['container']);
r.close()
return '{"status":"ok"}'
else:
# Modify entry
s = 'update locations '
s += 'set name=:name, map=:map, '
s += 'set name=:name, container_id=:container '
s += 'where id=:locationID;'
s = text(s)
r = db_engine.execute(s, name=request.form['name'],map=request.form['map'],locationID=locationID);
r = db_engine.execute(s, name=request.form['name'],container=request.form['container'],locationID=locationID);
r.close()
return '{"status":"ok"}'

@ -1,27 +1,25 @@
function new_location_entry() {
$('#location-name-input').text('');
$('#location-name-input').show();
$('#mapfile-input').show();
init_Location_edit(-1);
overlay_in();
}
function init_Location_edit(locationID) {
$('table#details tr#datasheet td input').show();
function init_Location_edit(locationID, name, containerID) {
var newButton = '<div class="round-button-left"><a href="#" onclick="saveLocation(' + locationID + ')"><i class="fa fa-check" aria-hidden="true"></i></a></div>';
$('.round-button-left').replaceWith(newButton);
$('#save-button').attr("onclick", "saveLocation(" + locationID + ")");
$('#location-name-input').val(name);
if(containerID > 0){
$("#container-input").val(containerID);
}
overlay_in();
}
function update_clickable_map() {
var selected_map_file = $('#mapfile-input').val();
$('#clickablemap').attr('src', 'map/' + selected_map_file);
function update_map() {
var selected_map_file = $('#container-input').val();
$('#map').attr('src', 'map/' + selected_map_file);
}
function saveLocation(locationID) {
var map_v = $('#clickablemap').attr('src').substring(4);
var container_v = $('#container-input').val();
var name_v = $('#location-name-input').val();
if(name_v.length > 100) {
@ -30,7 +28,7 @@ function saveLocation(locationID) {
}
var data = new FormData();
data.append('map', map_v);
data.append('container', container_v);
data.append('name', name_v)
$.ajax({
@ -54,7 +52,41 @@ function saveLocation(locationID) {
});
}
function end_edit(){
//intentionally left blank
}
function show_location_info(locationID) {
$.getJSON(rootURL + 'getpartinfo/' + partID, function(data) {
$('table#details tr#location td p').text(text_filter(data.location_descriptor)); // name is the location friendly name
$('#location-dropdown').val(data.location_id);
$('#container-dropdown').val(data.container_id);
$('table#details tr#partno td p').text(text_filter(data.partno));
$('table#details tr#partno td input').val(text_filter(data.partno));
$('table#details tr#description td p').text(text_filter(data.description));
$('table#details tr#description td input').val(text_filter(data.description));
container_onchange();
if (data.datasheet != null) {
$('tr#datasheet-head').html($('<td>DATASHEET: <a href="parts/getfile/' + data.datasheet + '"><i class="fa fa-file-text" aria-hidden="true"></i></a></td>'));
$('#datasheet-input').val(data.datasheet);
}
else
$('tr#datasheet-head td').text('DATASHEET: ');
$('#edit-button').click(function() {
init_edit(partID);
});
$('#delete-button').click(function() {
delete_entry(partID);
});
overlay_in();
}).fail(function() {
console.log( "Fetching part info failed" );
});
}
function placeMarker(locationID){
//temporarily not used
var $img = $('#clickablemap');
var currentClickPosX = event.pageX - $img.offset().left;
var currentClickPosY = event.pageY - $img.offset().top;

@ -399,4 +399,14 @@ td p {
.pinfo-input {
display: none;
width: 90%;
}
.nothidden{
display: initial !important;
}
.results-locations{
max-width: 1000px;
margin-left: auto;
margin-right: auto;
}

@ -2,7 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<title>ELAB Part Search Engine</title>
<title>ELAB Part Search Engine - Location editor</title>
<script
src="https://code.jquery.com/jquery-3.2.1.min.js"
integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
@ -14,19 +14,21 @@
<script type="text/javascript" src="{{ url_for('static', filename='locationEditorScript.js') }}"></script>
</head>
<body>
<h1>ELAB Part Search Engine - LOCATION EDITOR</h1>
<p>Looking for a place to store your obsolete ICs discontinued years ago? Just toss them anywhere and mark that location here!</p>
<table id="results">
<h1>LOCATION EDITOR</h1>
<p>Looking for a place to store your obsolete ICs discontinued years ago? Just toss them anywhere and mark that location here! <a href=".">back to parts</a></p>
<table id="results" class="results-locations">
<tr>
<th id="id">Container</th>
<th id="location">Location name</th>
<th id="mapURL">ID</th>
<th>ID</th>
<th>c.ID</th>
<th>Container name</th>
<th>Location name</th>
</tr>
{% for location in locations %}
<tr>
<tr onclick="init_Location_edit({{location['id']}}, '{{location['name']}}', {{location['container_id']}});">
<td>{{location['id']}}</td>
<td>{{location['container_id']}}</td>
<td>{{location['container']}}</td>
<td>{{location['name']}}</td>
<td>{{location['id']}}</td>
</tr>
{% endfor %}
</table>
@ -35,26 +37,28 @@
<div class="overlay">
<h2>Part Details</h2>
<table id="details">
<tr><td>Name</td></tr>
<tr><td><p></p><input type="text" name="location-name-input" id="location-name-input" placeholder="Location name" class="pinfo-input"/></td></tr>
<tr><td>MAP</td></tr>
<tr><td>Adding a new LOCATION inside a given CONTAINER</td></tr>
<tr><td>
<select class="pinfo-input" onchange="update_clickable_map()" name="mapfile-input" id="mapfile-input">
<select class="pinfo-input nothidden" onchange="update_map()" name="mapfile-input" id="container-input">
{% for container in containers %}
<option value="{{container['id']}}">{{container['name']}}</option>
{% endfor %}
</select>
</td></tr>
<tr><td>And click on the map to place the marker</td></tr>
<tr><td>Location name (obs! If a drawer has an identification sticker, start the name with it.<br />Example: ".2 - Power resistors"</td></tr>
<tr><td><p></p><input type="text" name="location-name-input" id="location-name-input" placeholder="Location name" class="pinfo-input nothidden"/></td></tr>
<tr><td>Note: adding custom "containers" is currently insupported and unpossible.</td></tr>
</table>
<img src="map/{{defaultMapfile}}" id="clickablemap" class="map" onclick="placeMarker()"/>
<div class="round-button-left"><a href="#" id="edit-button"><i class="fa fa-pencil" aria-hidden="true"></i></a></div>
<img src="map/{{containers[0]['id']}}" id="map" class="map"/>
<div class="round-button-left"><a href="#" id="save-button"><i class="fa fa-check" aria-hidden="true"></i></a></div>
<div class="round-button"><a href="#" id="delete-button"><i class="fa fa-trash" aria-hidden="true"></i></a></div>
<div class="small-square-button"><a href="#" onclick="overlay_out()"><i class="fa fa-times" aria-hidden="true"></i></a></div>
</div>
<div class="round-floating-button"><a href="#" onclick="new_location_entry()"><i class="fa fa-plus" aria-hidden="true"></i></a></div>
<div class="round-floating-button"><a href="#" onclick="init_Location_edit(-1, '', 0)"><i class="fa fa-plus" aria-hidden="true"></i></a></div>
</body>
</html>

Loading…
Cancel
Save