Skip to content
Snippets Groups Projects
project_snapshot.json 11.9 KiB
Newer Older
Benedikt's avatar
Benedikt committed
{
    "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});",
Benedikt's avatar
Benedikt committed
    "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",
Benedikt's avatar
Benedikt committed
    "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"
}