remodel distributors, properties, components

This commit is contained in:
King Kévin 2023-01-30 12:12:40 +01:00
parent 07104226be
commit 6a626282cd
3 changed files with 89 additions and 117 deletions

View File

@ -38,7 +38,7 @@
<tbody id="distributors"></tbody>
</table>
<table>
<thead><tr><th>property</th><th>value(s)</th></tr></thead>
<thead><tr><th>property</th><th>value</th></tr></thead>
<tbody id="properties"></tbody>
</table>
<div class="hscroll" id="attachments"></div>

View File

@ -109,64 +109,55 @@ function select_part()
span.appendChild(a);
}
}
// set distributors
const distributors = document.getElementById('distributors');
distributors.innerHTML = null;
for (const distributor of part["distributors"]) {
const tr = document.createElement('tr');
const td_name = document.createElement('td');
td_name.innerText = distributor.name;
tr.appendChild(td_name);
const td_sku = document.createElement('td');
const input = document.createElement('input');
input.type = "text";
input.style.width = "95%";
if (distributor.sku) {
input.value = distributor.sku;
}
td_sku.appendChild(input);
tr.appendChild(td_sku);
const td_url = document.createElement('td');
if (distributor.url) {
td_url.innerHTML = "<a href='" + distributor.url + "'>link</a>";
}
tr.appendChild(td_url);
distributors.appendChild(tr);
}
// add properties and components
const kv_tables = ['properties', 'components'];
for (const kv_table of kv_tables) {
const table = document.getElementById(kv_table);
table.innerHTML = null;
part[kv_table][""] = ""; // empty field to add
for (const key in part[kv_table]) {
// add distributors, properties and components
for (const table of tables) {
const tbody = document.getElementById(table);
tbody.innerHTML = null;
part[table].push({name: "", value: ""}); // empty field to add
for (const row of part[table]) {
const tr = document.createElement('tr');
let td = document.createElement('td');
let input = document.createElement('input');
input.type = "text";
input.style.width = "95%";
input.value = key;
input.value = row.name;
td.appendChild(input);
tr.appendChild(td);
td = document.createElement('td');
input = document.createElement('input');
if ('components' == kv_table) {
if (null != row.value) {
td = document.createElement('td');
input = document.createElement('input');
input.type = "text";
input.value = row.value;
input.style.width = "95%";
td.appendChild(input);
tr.appendChild(td);
}
if (row.sku) {
td = document.createElement('td');
input = document.createElement('input');
input.type = "text";
input.value = row.sku;
input.style.width = "95%";
td.appendChild(input);
tr.appendChild(td);
}
if (null != row.quantity) {
td = document.createElement('td');
input = document.createElement('input');
input.type = "number";
input.min = "0";
input.step = "1";
input.value = part[kv_table][key]
} else {
input.type = "text";
if ("object" == typeof part[kv_table][key]) {
input.value = part[kv_table][key].join(",");
} else {
input.value = part[kv_table][key];
}
input.value = row.quantity;
input.style.width = "95%";
td.appendChild(input);
tr.appendChild(td);
}
input.style.width = "95%";
td.appendChild(input);
tr.appendChild(td);
table.appendChild(tr);
if (row.url) {
td = document.createElement('td');
td.innerHTML = "<a href='" + row.url + "'>link</a>";
tr.appendChild(td);
}
tbody.appendChild(tr);
}
}
// add attachments
@ -226,32 +217,28 @@ function update_part()
return;
}
// get distributors
part.distributors = {};
part.distributors = [];
const distributors = document.getElementById('distributors');
for (const distributor of distributors.rows) {
part.distributors[distributor.cells[0].innerText] = distributor.cells[1].firstChild.value;
part.distributors.push({name: distributor.cells[0].firstChild.value, sku: distributor.cells[1].firstChild.value});
}
// get properties
part.properties = {};
part.properties = [];
const properties = document.getElementById('properties');
for (const prop of properties.rows) {
const name = prop.cells[0].firstChild.value;
const value = prop.cells[1].firstChild.value;
if (name && name.length > 0 && value && value.length > 0) {
part.properties[name] = value.split(",");
}
part.properties.push({name: prop.cells[0].firstChild.value, value: prop.cells[1].firstChild.value});
}
// get components
part.components = {};
part.components = [];
const components = document.getElementById('components');
for (const component of components.rows) {
const name = component.cells[0].firstChild.value;
const quantity = component.cells[1].firstChild.value;
if (name && name.length > 0) {
part.components[name] = parseInt(quantity);
const nam = component.cells[0].firstChild.value;
const q = component.cells[1].firstChild.value;
if (nam && nam.length > 0) {
part.components.push({name: nam, quantity: parseInt(q)});
}
}
//console.log(part);
console.log(part);
var post = new XMLHttpRequest();
post.open("POST", "part");

View File

@ -90,22 +90,13 @@ def get_part_by_id(id)
part[k] ||= parent[k]
end
end
# add all distributors
distributors = @db.query("SELECT * FROM distributor").to_a
statement = @db.prepare("SELECT * FROM distribution WHERE part = ?")
distributions = statement.execute(id).to_a
distributors.each do |distributor|
distributions.each do |distribution|
if distribution["distributor"] == distributor["id"] then
distributor["sku"] = distribution["sku"]
distributor["url"] = distributor["product_page"].gsub("%s", distribution["sku"])
end
end
distributor.delete("id")
distributor.delete("homepage")
distributor.delete("product_page")
# add distributors
part["distributors"] = []
statement = @db.prepare("SELECT distribution.sku AS sku, distributor.name AS name, distributor.product_page AS url FROM distribution LEFT JOIN distributor ON distributor.id = distribution.distributor WHERE distribution.part = ?")
statement.execute(id).each do |distribution|
distribution["url"].gsub!("%s", distribution["sku"])
part["distributors"] << distribution
end
part["distributors"] = distributors
# add inventory
statement = @db.prepare("SELECT location.name AS location, inventory.quantity AS stock FROM inventory LEFT JOIN location ON location.id = inventory.location WHERE inventory.part = ? ORDER BY inventory.quantity DESC LIMIT 1")
inventory = statement.execute(id).to_a[0]
@ -114,17 +105,12 @@ def get_part_by_id(id)
part["stock"] = inventory["stock"]
end
# add properties
part["properties"] = {}
part["properties"] = []
statement = @db.prepare("SELECT property.name AS name, property_value.value AS value FROM property_value JOIN property ON property.id = property_value.property WHERE property_value.part = ?")
statement.execute(id).each do |row|
part["properties"][row["name"]] ||= []
part["properties"][row["name"]] << row["value"]
end
if parent then
parent["properties"].each do |k,v|
part["properties"][k] ||= v
end
part["properties"] << row
end
part["properties"] += parent["properties"] if parent
# add attachments
part["attachments"] = []
dir = PUBLIC + "/" + ATTACHMENTS + "/" + part["name"].gsub("/", "_")
@ -136,20 +122,14 @@ def get_part_by_id(id)
end
end
part["attachments"].sort!
if parent then
part["attachments"] += parent["attachments"]
end
part["attachments"] += parent["attachments"] if parent
# add components for assembly
part["components"] = {}
if parent then
parent["components"].each do |k,v|
part["components"][k] ||= v
end
end
part["components"] = []
statement = @db.prepare("SELECT part.name AS name, assembly.quantity AS quantity FROM assembly JOIN part ON part.id = assembly.component WHERE assembly.assembled = ?")
statement.execute(id).each do |row|
part["components"][row["name"]] = row["quantity"]
part["components"] << row
end
part["components"] += parent["components"] if parent
# clean up
delete = ["parent"]
delete.each do |k|
@ -345,7 +325,7 @@ def add_part(part)
statement = @db.prepare("SELECT id FROM inventory WHERE part = ? AND location = ?")
ref_inv = statement.execute(part["id"], ref["id"]).to_a[0]
unless ref_inv then
insert = @db.prepare("INSERT INTO inventory (part, location, quantity) VALUES (?,?,?)");
insert = @db.prepare("INSERT INTO inventory (part, location, quantity) VALUES (?,?,?)")
insert.execute(part["id"], ref["id"], part["stock"].to_i)
end
ref_inv = statement.execute(part["id"], ref["id"]).to_a[0]
@ -361,13 +341,18 @@ def add_part(part)
delete = @db.prepare("DELETE FROM distribution WHERE part = ?")
delete.execute(part["id"])
if part[field] then
part[field].each do |distributor,sku|
next unless sku and !sku.empty?
part[field].each do |row|
next unless row["name"] and !row["name"].empty?
next unless row["sku"] and !row["sku"].empty?
statement = @db.prepare("SELECT id FROM distributor WHERE LOWER(name) = ?")
ref = statement.execute(distributor.downcase).to_a[0]
raise StandardError.new("distributor unknown") unless ref
insert = @db.prepare("INSERT INTO distribution (distributor,part,sku) VALUES (?,?,?)");
insert.execute(ref["id"], part["id"], sku)
ref = statement.execute(row["name"].downcase).to_a[0]
unless ref then
insert = @db.prepare("INSERT INTO distributor (name) VALUES (?)");
insert.execute(row["name"])
ref = statement.execute(row["name"].downcase).to_a[0]
end
insert = @db.prepare("INSERT INTO distribution (distributor,part,sku) VALUES (?,?,?)")
insert.execute(ref["id"], part["id"], row["sku"])
end
end
# update properties
@ -375,20 +360,19 @@ def add_part(part)
if part[field] then
delete = @db.prepare("DELETE FROM property_value WHERE part = ?")
delete.execute(part["id"])
part[field].each do |name,values|
next unless values and !values.empty?
part[field].each do |row|
next unless row["name"] and !row["name"].empty?
next unless row["value"] and !row["value"].empty?
next if family and family["properties"] and family["properties"].include?(row)
statement = @db.prepare("SELECT id FROM property WHERE LOWER(name) = ?")
ref = statement.execute(name.downcase).to_a[0]
ref = statement.execute(row["name"].downcase).to_a[0]
unless ref then
insert = @db.prepare("INSERT INTO property (name) VALUES (?)");
insert.execute(name)
end
ref = statement.execute(name.downcase).to_a[0]
insert = @db.prepare("INSERT INTO property_value (property,part,value) VALUES (?,?,?)");
values.each do |value|
next if family and family["properties"] and family["properties"][name] and family["properties"][name].include?(value)
insert.execute(ref["id"], part["id"], value)
insert.execute(row["name"])
ref = statement.execute(row["name"].downcase).to_a[0]
end
insert = @db.prepare("INSERT INTO property_value (property,part,value) VALUES (?,?,?)")
insert.execute(ref["id"], part["id"], row["value"])
end
end
# update components
@ -396,15 +380,16 @@ def add_part(part)
if part[field] then
delete = @db.prepare("DELETE FROM assembly WHERE assembled = ?")
delete.execute(part["id"])
part[field].each do |name,quantity|
next unless name
part[field].each do |row|
next unless row["name"] and !row["name"].empty?
next unless row["quantity"]
statement = @db.prepare("SELECT id FROM part WHERE LOWER(name) = ?")
ref = statement.execute(name.downcase).to_a[0]
ref = statement.execute(row["name"].downcase).to_a[0]
#raise StandardError.new("component #{name} does not exist") unless ref
next unless ref
quantity ||= 0
row["quantity"] ||= 0
insert = @db.prepare("INSERT INTO assembly (assembled,component,quantity) VALUES (?,?,?)");
insert.execute(part["id"], ref["id"], quantity)
insert.execute(part["id"], ref["id"], row["quantity"])
end
end
end