diff --git a/src/renderers/MeasuringEquipmentRenderer.js b/src/renderers/MeasuringEquipmentRenderer.js new file mode 100644 index 0000000000000000000000000000000000000000..2d23e010ac179faeb6ad1f7e5cd5af42c3608a27 --- /dev/null +++ b/src/renderers/MeasuringEquipmentRenderer.js @@ -0,0 +1,189 @@ +// src/renderers/MeasuringEquipmentRenderer.js +import { DCCRealListQuantity } from "../dccQuantity.js"; + +export class MeasuringEquipmentRenderer { + constructor(equipmentData, language) { + // equipmentData may be a single object or an array of measuringEquipment elements + this.data = Array.isArray(equipmentData) + ? equipmentData + : [equipmentData]; + this.language = language; + } + + render() { + const container = document.createElement("div"); + container.innerHTML = `<h3>Measuring Equipment</h3>`; + this.data.forEach((equip) => { + // Create collapsible section for each equipment + const details = document.createElement("details"); + details.style.border = "1px solid #ccc"; + details.style.padding = "8px"; + details.style.marginBottom = "10px"; + + // Build the summary (collapsed view) + const summary = document.createElement("summary"); + summary.style.fontWeight = "bold"; + // Equipment name + const equipName = this._getText(equip["dcc:name"]); + // Manufacturer name (if available) + let manufacturerName = ""; + if (equip["dcc:manufacturer"] && equip["dcc:manufacturer"]["dcc:name"]) { + manufacturerName = this._getText(equip["dcc:manufacturer"]["dcc:name"]); + } + // Model + const model = equip["dcc:model"] ? equip["dcc:model"].trim() : ""; + // First identification (if available) + let firstId = ""; + if ( + equip["dcc:identifications"] && + equip["dcc:identifications"]["dcc:identification"] + ) { + let ids = equip["dcc:identifications"]["dcc:identification"]; + if (!Array.isArray(ids)) { + ids = [ids]; + } + const id0 = ids[0]; + // Get identification name (small label) and value + const idName = this._getText(id0["dcc:name"]); + const idValue = id0["dcc:value"] ? id0["dcc:value"].trim() : ""; + firstId = `<span style="font-size:smaller;">${idName}: ${idValue}</span>`; + } + summary.innerHTML = `${equipName} – ${manufacturerName} – ${model} ${firstId}`; + details.appendChild(summary); + + // Expanded content + const contentDiv = document.createElement("div"); + contentDiv.style.marginTop = "8px"; + contentDiv.style.fontFamily = "sans-serif"; + + // Render full identifications table + if (equip["dcc:identifications"] && equip["dcc:identifications"]["dcc:identification"]) { + const ids = Array.isArray(equip["dcc:identifications"]["dcc:identification"]) + ? equip["dcc:identifications"]["dcc:identification"] + : [equip["dcc:identifications"]["dcc:identification"]]; + const idTable = document.createElement("table"); + idTable.style.width = "100%"; + idTable.style.borderCollapse = "collapse"; + // Header row + const idHeaderRow = document.createElement("tr"); + ["Identification", "Issuer", "Value"].forEach((text) => { + const th = document.createElement("th"); + th.textContent = text; + th.style.border = "1px solid #ccc"; + th.style.padding = "4px"; + idHeaderRow.appendChild(th); + }); + idTable.appendChild(idHeaderRow); + // Data rows + ids.forEach((id) => { + const tr = document.createElement("tr"); + // Identification name (small label) + const tdName = document.createElement("td"); + tdName.style.border = "1px solid #ccc"; + tdName.style.padding = "4px"; + tdName.style.fontSize = "smaller"; + tdName.textContent = this._getText(id["dcc:name"]); + tr.appendChild(tdName); + // Issuer + const tdIssuer = document.createElement("td"); + tdIssuer.style.border = "1px solid #ccc"; + tdIssuer.style.padding = "4px"; + tdIssuer.textContent = id["dcc:issuer"] ? id["dcc:issuer"].trim() : ""; + tr.appendChild(tdIssuer); + // Value + const tdValue = document.createElement("td"); + tdValue.style.border = "1px solid #ccc"; + tdValue.style.padding = "4px"; + tdValue.textContent = id["dcc:value"] ? id["dcc:value"].trim() : ""; + tr.appendChild(tdValue); + idTable.appendChild(tr); + }); + contentDiv.appendChild(idTable); + } + + // Render measuring equipment quantities table (if available) + if ( + equip["dcc:measuringEquipmentQuantities"] && + equip["dcc:measuringEquipmentQuantities"]["dcc:measuringEquipmentQuantity"] + ) { + const qtys = Array.isArray( + equip["dcc:measuringEquipmentQuantities"]["dcc:measuringEquipmentQuantity"] + ) + ? equip["dcc:measuringEquipmentQuantities"]["dcc:measuringEquipmentQuantity"] + : [equip["dcc:measuringEquipmentQuantities"]["dcc:measuringEquipmentQuantity"]]; + const qtyTable = document.createElement("table"); + qtyTable.style.width = "100%"; + qtyTable.style.borderCollapse = "collapse"; + // Header row + const qtyHeaderRow = document.createElement("tr"); + ["Quantity", "Value", "Unit", "Uncertainty"].forEach((text) => { + const th = document.createElement("th"); + th.textContent = text; + th.style.border = "1px solid #ccc"; + th.style.padding = "4px"; + qtyHeaderRow.appendChild(th); + }); + qtyTable.appendChild(qtyHeaderRow); + // Data rows: use DCCRealListQuantity for each measuringEquipmentQuantity + qtys.forEach((q) => { + const row = document.createElement("tr"); + // Quantity name + const tdName = document.createElement("td"); + tdName.style.border = "1px solid #ccc"; + tdName.style.padding = "4px"; + tdName.textContent = this._getText(q["dcc:name"]); + row.appendChild(tdName); + // Value + const tdValue = document.createElement("td"); + tdValue.style.border = "1px solid #ccc"; + tdValue.style.padding = "4px"; + // Create a DCCRealListQuantity instance to extract values, unit, uncertainty + const realQty = new DCCRealListQuantity(q); + const values = realQty.getValues(); + tdValue.textContent = values.join(" / "); + row.appendChild(tdValue); + // Unit + const tdUnit = document.createElement("td"); + tdUnit.style.border = "1px solid #ccc"; + tdUnit.style.padding = "4px"; + const rawUnit = q["si:realListXMLList"] && q["si:realListXMLList"]["si:unitXMLList"] + ? q["si:realListXMLList"]["si:unitXMLList"].trim() + : ""; + if (rawUnit) { + const unitObj = new DSIUnit(rawUnit); + // Here we return plain text instead of HTML markup for the table cell + tdUnit.textContent = unitObj.toString(); + } + row.appendChild(tdUnit); + // Uncertainty + const tdUnc = document.createElement("td"); + tdUnc.style.border = "1px solid #ccc"; + tdUnc.style.padding = "4px"; + const uncValues = realQty.getUncertainty(); + tdUnc.textContent = uncValues.length ? uncValues.join(" / ") : ""; + row.appendChild(tdUnc); + qtyTable.appendChild(row); + }); + contentDiv.appendChild(qtyTable); + } + + // Append expanded content to details + details.appendChild(contentDiv); + container.appendChild(details); + }); + return container; + } + + // Helper to extract language-specific text from a node + _getText(node) { + if (!node) return ""; + const content = node["dcc:content"]; + if (Array.isArray(content)) { + const match = content.find((item) => item.$ && item.$.lang === this.language) || content[0]; + return match._ || match; + } + return content._ || content; + } + + // (Optional) You can add additional helper methods to render other parts of the data +}