{ "src/main.js": "import { convertXMLToJSON } from './xmlToJson.js';\nimport { globalData } from './globalData.js';\nimport { renderAdministrativeData } from './ui/adminRenderer.js';\nimport { renderMeasurementResults } from './ui/measurementRenderer.js';\n\nconst fileInput = document.getElementById('file-input');\n\nfileInput.addEventListener('change', async (event) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n const reader = new FileReader();\n reader.onload = async () => {\n const xmlString = reader.result;\n globalData.dcc = await convertXMLToJSON(xmlString); // Store DCC globally\n\n console.log(\"DCC Data Loaded:\", globalData.dcc);\n\n renderAdministrativeData(globalData.dcc.administrativeData);\n renderMeasurementResults(globalData.dcc.measurementResults);\n };\n reader.readAsText(file);\n});\n", "src/xmlToJson.js": "import { xml2json } from 'xml-js';\n\nexport function convertXMLToJSON(xmlString) {\n const jsonData = xml2json(xmlString, { compact: true, spaces: 2 });\n return JSON.parse(jsonData);\n}\n", "src/idRegistry.js": "export const idRegistry = {};", "src/globalData.js": "export const globalData = {\n dcc: null // This will hold the parsed DCC JSON data\n};", "src/globalOptions.js": "export const globalOptions = { preferredLanguage: 'en' };", "src/viewerRegistry.js": "import { JSONTreeViewer } from './components/JSONTreeViewer.js';\n\nexport function getViewerForElement() {\n return JSONTreeViewer;\n}", "src/utils.js": "export function getLocalizedText(elements) {\n if (!Array.isArray(elements)) return elements;\n return elements[0]._ || '';\n}", "src/components/BaseViewer.js": "export class BaseViewer {\n constructor(sectionData) {\n this.sectionData = sectionData;\n }\n render() {\n throw new Error('render() must be implemented in subclasses');\n }\n}", "src/components/JSONTreeViewer.js": "import { BaseViewer } from './BaseViewer.js';\n\nexport class JSONTreeViewer extends BaseViewer {\n render() {\n const container = document.createElement('pre');\n container.textContent = JSON.stringify(this.sectionData, null, 2);\n return container;\n }\n}", "src/components/accordionComponent.js": "export function createAccordion(title, contentElement) {\n const container = document.createElement('div');\n container.classList.add('accordion');\n\n const header = document.createElement('button');\n header.textContent = title;\n header.classList.add('accordion-header');\n\n const content = document.createElement('div');\n content.classList.add('accordion-content');\n content.appendChild(contentElement);\n\n header.addEventListener('click', () => {\n content.classList.toggle('open');\n });\n\n container.appendChild(header);\n container.appendChild(content);\n return container;\n}\n", "src/components/tabComponent.js": "export function createTabs(tabsData) {\n const container = document.createElement('div');\n container.classList.add('tabs-container');\n\n const tabs = document.createElement('div');\n tabs.classList.add('tabs');\n\n const contentContainer = document.createElement('div');\n contentContainer.classList.add('tab-content');\n\n tabsData.forEach((tab, index) => {\n const button = document.createElement('button');\n button.textContent = tab.title;\n button.addEventListener('click', () => {\n contentContainer.innerHTML = '';\n contentContainer.appendChild(tab.content);\n });\n\n tabs.appendChild(button);\n\n if (index === 0) {\n contentContainer.appendChild(tab.content);\n }\n });\n\n container.appendChild(tabs);\n container.appendChild(contentContainer);\n return container;\n}\n", "src/ui/languageSelector.js": "import { globalOptions } from '../globalOptions.js';\n\nconst languageSelect = document.getElementById('language-select');\nlanguageSelect.addEventListener('change', (event) => {\n globalOptions.preferredLanguage = event.target.value;\n});", "src/ui/themeSwitcher.js": "const themeToggle = document.getElementById('theme-toggle');\nthemeToggle.addEventListener('click', () => {\n document.body.classList.toggle('dark-mode');\n});", "src/ui/adminRenderer.js": "import { createAccordion } from '../components/accordionComponent.js';\nimport { JSONTreeViewer } from './jsonTreeViewer.js';\nimport { globalData } from '../globalData.js';\n\nexport function renderAdministrativeData() {\n const container = document.getElementById('admin-data-container');\n container.innerHTML = ''; // Clear previous content\n\n const dccRoot = globalData.dcc?.['dcc:digitalCalibrationCertificate'];\n if (!dccRoot) {\n container.innerHTML = \"<p>No Digital Calibration Certificate Found</p>\";\n return;\n }\n\n const adminData = dccRoot?.['dcc:administrativeData'];\n if (!adminData) {\n container.innerHTML = \"<p>No Administrative Data Found</p>\";\n return;\n }\n\n // 🔹 SOFTWARE SECTION\n const softwareContainer = document.createElement('div');\n const softwareList = (adminData?.['dcc:dccSoftware']?.['dcc:software'] || []).map(software => {\n return `\n <div>\n <strong>${software?.['dcc:name']?.['dcc:content'] || 'Unknown Software'}</strong>\n (v${software?.['dcc:release'] || 'N/A'}) - ${software?.['dcc:type'] || 'N/A'}\n </div>\n `;\n }).join('');\n softwareContainer.innerHTML = `<h3>Software Used</h3>${softwareList}`;\n\n // 🔹 CORE DATA SECTION\n const coreData = adminData?.['dcc:coreData'] || {};\n const coreDataContainer = document.createElement('div');\n coreDataContainer.innerHTML = `\n <h3>Core Data</h3>\n <p><strong>Country:</strong> ${coreData?.['dcc:countryCodeISO3166_1']?._text || 'N/A'}</p>\n <p><strong>Languages:</strong> ${Array.isArray(coreData?.['dcc:usedLangCodeISO639_1'])\n ? coreData['dcc:usedLangCodeISO639_1'].map(lang => lang._text).join(', ')\n : coreData?.['dcc:usedLangCodeISO639_1']?._text || 'N/A'}</p>\n <p><strong>Unique Identifier:</strong> ${coreData?.['dcc:uniqueIdentifier']?._text || 'N/A'}</p>\n <p><strong>Issue Date:</strong> ${coreData?.['dcc:issueDate']?._text || 'N/A'}</p>\n `;\n\n // 🔹 CALIBRATION LAB\n const labInfo = adminData?.['dcc:calibrationLaboratory']?.['dcc:contact'] || {};\n const labContainer = document.createElement('div');\n labContainer.innerHTML = `\n <h3>Calibration Laboratory</h3>\n <p><strong>Name:</strong> ${labInfo?.['dcc:name']?.['dcc:content']?._text || 'N/A'}</p>\n <p><strong>Email:</strong> ${labInfo?.['dcc:eMail']?._text || 'N/A'}</p>\n <p><strong>Phone:</strong> ${labInfo?.['dcc:phone']?._text || 'N/A'}</p>\n `;\n\n // 🔹 RESPONSIBLE PERSONS\n const responsiblePersons = (adminData?.['dcc:respPersons']?.['dcc:respPerson'] || []).map(person => {\n return `<p>${person?.['dcc:person']?.['dcc:name']?.['dcc:content']?._text || 'Unknown Person'}\n ${person?.['dcc:mainSigner'] ? '(Main Signer)' : ''}</p>`;\n }).join('');\n const responsibleContainer = document.createElement('div');\n responsibleContainer.innerHTML = `<h3>Responsible Persons</h3>${responsiblePersons}`;\n\n // 🔹 ADD SECTIONS TO ACCORDION\n container.appendChild(createAccordion(\"Software Used\", softwareContainer));\n container.appendChild(createAccordion(\"Core Data\", coreDataContainer));\n container.appendChild(createAccordion(\"Calibration Laboratory\", labContainer));\n container.appendChild(createAccordion(\"Responsible Persons\", responsibleContainer));\n\n // 🔹 JSON DEBUG VIEW\n container.appendChild(createAccordion(\"Raw JSON Data (Debug)\", new JSONTreeViewer(adminData).render()));\n}\n", "src/ui/measurementRenderer.js": "import { createTabs } from '../components/tabComponent.js';\nimport { JSONTreeViewer } from './jsonTreeViewer.js';\nimport { globalData } from '../globalData.js';\n\nexport function renderMeasurementResults() {\n const container = document.getElementById('measurement-data-container');\n container.innerHTML = ''; // Clear previous content\n\n const dccRoot = globalData.dcc?.['dcc:digitalCalibrationCertificate'];\n if (!dccRoot) {\n container.innerHTML = \"<p>No Digital Calibration Certificate Found</p>\";\n return;\n }\n\n const measurements = dccRoot?.['dcc:measurementResults'];\n if (!measurements || !measurements['dcc:measurementResult']) {\n container.innerHTML = \"<p>No Measurement Results Found</p>\";\n return;\n }\n\n const tabs = (Array.isArray(measurements['dcc:measurementResult']) ?\n measurements['dcc:measurementResult'] : [measurements['dcc:measurementResult']]\n ).map((result, index) => {\n const resultContainer = document.createElement('div');\n\n // 🔹 Measurement Methods\n const methods = result?.['dcc:usedMethods']?.['dcc:usedMethod'] || [];\n const methodsList = (Array.isArray(methods) ? methods : [methods]).map(method => `\n <p><strong>${method?.['dcc:name']?.['dcc:content']?._text || 'Unknown Method'}</strong>: \n ${method?.['dcc:description']?.['dcc:content']?._text || 'No description'}</p>\n `).join('');\n\n // 🔹 Measurement Equipment\n const equipments = result?.['dcc:measuringEquipments']?.['dcc:measuringEquipment'] || [];\n const equipmentList = (Array.isArray(equipments) ? equipments : [equipments]).map(eq => `\n <p><strong>${eq?.['dcc:name']?.['dcc:content']?._text || 'Unknown Equipment'}</strong> \n - ${eq?.['dcc:model']?._text || 'N/A'}</p>\n `).join('');\n\n // 🔹 Measurement Results\n const results = result?.['dcc:results']?.['dcc:result'] || [];\n const resultsList = (Array.isArray(results) ? results : [results]).map(res => `\n <h4>${res?.['dcc:name']?.['dcc:content']?._text || 'Unknown Result'}</h4>\n <pre>${JSON.stringify(res['dcc:data'], null, 2)}</pre>\n `).join('');\n\n resultContainer.innerHTML = `\n <h3>Measurement Methods</h3>${methodsList}\n <h3>Equipment Used</h3>${equipmentList}\n <h3>Results</h3>${resultsList}\n `;\n\n return {\n title: `Measurement ${index + 1}`,\n content: resultContainer\n };\n });\n\n container.appendChild(createTabs(tabs));\n\n // 🔹 JSON DEBUGGING VIEW\n container.appendChild(createTabs([{ title: \"Raw JSON\", content: new JSONTreeViewer(measurements).render() }]));\n}\n", "src/ui/jsonTreeViewer.js": "export class JSONTreeViewer {\n constructor(data) {\n this.data = data;\n }\n\n render() {\n const container = document.createElement('pre');\n container.textContent = JSON.stringify(this.data, null, 2);\n return container;\n }\n}\n", "public/index.html": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <title>DCC Viewer</title>\n <script type=\"module\" src=\"/src/main.js\"></script>\n <link rel=\"stylesheet\" href=\"/public/styles.css\">\n</head>\n<body>\n<h1>DCC Viewer</h1>\n\n<input type=\"file\" id=\"file-input\" accept=\".xml\">\n\n<div id=\"admin-data-container\"></div>\n<div id=\"measurement-data-container\"></div>\n</body>\n</html>\n", "public/styles.css": ".accordion-header {\n background-color: #f0f0f0;\n border: none;\n padding: 10px;\n cursor: pointer;\n width: 100%;\n text-align: left;\n}\n\n.accordion-content {\n display: none;\n padding: 10px;\n}\n\n.accordion-content.open {\n display: block;\n}\n\n.tabs {\n display: flex;\n gap: 10px;\n}\n\n.tabs button {\n padding: 5px 10px;\n cursor: pointer;\n}\n\n.tab-content {\n border: 1px solid #ddd;\n padding: 10px;\n}\n" }