Newer
Older
import { parseString } from 'xml2js';
import { renderMeasurementResults } from './renderers/MeasurementRenderer.js';
import { renderAdminData } from './renderers/AdminRenderer.js';
import { EventEmitter } from 'events';
if (typeof window.EventEmitter !== 'function') {
window.EventEmitter = EventEmitter;
}
export function init(xmlStr, options = {}) {
const containerId = options.containerId || 'app';
const appContainer = document.getElementById(containerId);
if (!appContainer) {
console.error('No container found with id', containerId);
return;
}
appContainer.innerHTML = `<div id="disclaimer" style="background:orangered; color:#000; padding:8px; margin-bottom:10px; font-family: sans-serif; font-weight:bold;">
This is a proof of concept and contains missing fields and errors. It is not for production use. dcc-viewer-js Version ${version}
</div>`;

Benedikt
committed
const cleanXmlStr = xmlStr.trim();
console.log("Clean XML string:", cleanXmlStr);
parseString(cleanXmlStr, { explicitArray: false }, (err, result) => {
if (err) {
console.error('Error parsing XML:', err);
return;
}
const dccData = result;
const cert = dccData['dcc:digitalCalibrationCertificate'];
if (!cert) {
console.error("No dcc:digitalCalibrationCertificate found in XML");
return;
}
// Extract available languages from the administrative data coreData section
let languages = [];
if (cert['dcc:administrativeData'] && cert['dcc:administrativeData']['dcc:coreData']) {
const coreData = cert['dcc:administrativeData']['dcc:coreData'];
let langs = coreData['dcc:usedLangCodeISO639_1'];
if (langs) {
if (!Array.isArray(langs)) { langs = [langs]; }
languages = langs;
}
}
// Use provided default language if available and present, else use the first available or fallback to 'en'
let selectedLanguage = (options.language && languages.includes(options.language))
? options.language
: (languages.length ? languages[0] : 'en');
// Build a dynamic language dropdown based on the extracted languages
const langSelect = document.createElement('select');
languages.forEach(lang => {
const option = document.createElement('option');
option.value = lang;
option.textContent = lang;
if (lang === selectedLanguage) option.selected = true;
langSelect.appendChild(option);
});
// When the language is changed, reinitialize the app with the same XML but new language.
langSelect.addEventListener('change', (e) => {
init(xmlStr, { containerId, language: e.target.value });
});
appContainer.appendChild(langSelect);
// Create containers for admin data and measurement results
const adminContainer = document.createElement('div');
adminContainer.id = 'adminData';
appContainer.appendChild(adminContainer);
const measContainer = document.createElement('div');
measContainer.id = 'measurementResults';
appContainer.appendChild(measContainer);
// Render admin and measurement data if available
if (cert['dcc:administrativeData']) {
renderAdminData(cert['dcc:administrativeData'], selectedLanguage);
}
if (cert['dcc:measurementResults']) {
renderMeasurementResults(cert['dcc:measurementResults'], selectedLanguage);
}