diff --git a/public/index.html b/public/index.html index 28c2161..b4ffe72 100644 --- a/public/index.html +++ b/public/index.html @@ -42,6 +42,10 @@
+ + + +
componentquantity
diff --git a/public/partdb.js b/public/partdb.js index 2e52dbd..8094732 100644 --- a/public/partdb.js +++ b/public/partdb.js @@ -11,7 +11,9 @@ var parts = null; // part field to populate const fields = ["name", "description", "details", "package", "manufacturer", "mpn", "family", "datasheet", "page", "location", "stock"]; // URLs to set -const urls = ["page","datasheet"]; +const urls = ["page", "datasheet"]; +// tables with key value information +const tables = ["distributors", "properties", "components"]; function search() { @@ -71,15 +73,11 @@ function clear() const a = document.getElementById('url_' + field); a.href = null; } - // clear distributors - const distributors = document.getElementById('distributors'); - distributors.innerHTML = null; - // clear properties - const properties = document.getElementById('properties'); - properties.innerHTML = null; - // clear attachments - const attachments = document.getElementById('attachments'); - attachments.innerHTML = null; + // clear tables + for (const table of tables) { + const body = document.getElementById(table); + body.innerHTML = null; + } } function select_part() @@ -137,42 +135,42 @@ function select_part() tr.appendChild(td_url); distributors.appendChild(tr); } - // add properties - const properties = document.getElementById('properties'); - properties.innerHTML = null; - for (const prop in part["properties"]) { - const tr = document.createElement('tr'); - let td = document.createElement('td'); - let input = document.createElement('input'); - input.type = "text"; - input.style.width = "95%"; - input.value = prop; - td.appendChild(input); - tr.appendChild(td); - td = document.createElement('td'); - input = document.createElement('input'); - input.type = "text"; - input.style.width = "95%"; - input.value = part["properties"][prop].join(","); - td.appendChild(input); - tr.appendChild(td); - properties.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]) { + 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; + td.appendChild(input); + tr.appendChild(td); + td = document.createElement('td'); + input = document.createElement('input'); + if ('components' == kv_table) { + 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.style.width = "95%"; + td.appendChild(input); + tr.appendChild(td); + table.appendChild(tr); + } } - // add empty property field - let tr = document.createElement('tr'); - let td = document.createElement('td'); - let input = document.createElement('input'); - input.type = "text"; - input.style.width = "95%"; - td.appendChild(input); - tr.appendChild(td); - td = document.createElement('td'); - input = document.createElement('input'); - input.type = "text"; - input.style.width = "95%"; - td.appendChild(input); - tr.appendChild(td); - properties.appendChild(tr); // add attachments const attachments = document.getElementById('attachments'); attachments.innerHTML = null; @@ -245,6 +243,16 @@ function update_part() part.properties[name] = value.split(","); } } + // get 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); + } + } console.log(part); var post = new XMLHttpRequest(); diff --git a/server.rb b/server.rb index 6a0daf0..0bcd227 100755 --- a/server.rb +++ b/server.rb @@ -139,6 +139,17 @@ def get_part_by_id(id) if parent then part["attachments"] += parent["attachments"] end + # add components for assembly + part["components"] = {} + if parent then + parent["components"].each do |k,v| + part["components"][k] ||= v + end + end + 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"] + end # clean up delete = ["parent"] delete.each do |k| @@ -297,7 +308,6 @@ def add_part(part) # update inventory field = "location" part[field] = nil if part[field] and 0 == part[field].length - part["location"] = nil if part["stock"] and 0 == part["stock"].length if part[field] then statement = @db.prepare("SELECT id FROM #{field} WHERE LOWER(name) = ?") ref = statement.execute(part[field].downcase).to_a[0] @@ -336,10 +346,9 @@ def add_part(part) end # update properties field = "properties" - part[field] = nil if part[field] and 0 == part[field].length - delete = @db.prepare("DELETE FROM property_value WHERE part = ?") - delete.execute(part["id"]) 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? statement = @db.prepare("SELECT id FROM property WHERE LOWER(name) = ?") @@ -356,6 +365,22 @@ def add_part(part) end end end + # update components + field = "components" + 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 + statement = @db.prepare("SELECT id FROM part WHERE LOWER(name) = ?") + ref = statement.execute(name.downcase).to_a[0] + #raise StandardError.new("component #{name} does not exist") unless ref + next unless ref + quantity ||= 0 + insert = @db.prepare("INSERT INTO assembly (assembled,component,quantity) VALUES (?,?,?)"); + insert.execute(part["id"], ref["id"], quantity) + end + end end post '/part' do