Skip to content
Snippets Groups Projects
app.js 3.35 KiB
Newer Older
Benedikt's avatar
Benedikt committed
import { parseString } from 'xml2js';
import { renderMeasurementResults } from './renderers/MeasurementRenderer.js';
Benedikt's avatar
Benedikt committed
import { renderAdminData } from './renderers/AdminRenderer.js';
Benedikt's avatar
Benedikt committed
import { version } from '../package.json';

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;
  }
Benedikt's avatar
Benedikt committed
  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>`;
  // Parse the XML string first
  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;
    }
Benedikt's avatar
Benedikt committed

    // 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;
      }
    }
Benedikt's avatar
Benedikt committed

    // 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');
Benedikt's avatar
Benedikt committed

    // 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);
Benedikt's avatar
Benedikt committed

    // Create containers for admin data and measurement results
    const adminContainer = document.createElement('div');
    adminContainer.id = 'adminData';
    appContainer.appendChild(adminContainer);
Benedikt's avatar
Benedikt committed

    const measContainer = document.createElement('div');
    measContainer.id = 'measurementResults';
    appContainer.appendChild(measContainer);
Benedikt's avatar
Benedikt committed

    // Render admin and measurement data if available
Benedikt's avatar
Benedikt committed
    if (cert['dcc:administrativeData']) {
      renderAdminData(cert['dcc:administrativeData'], selectedLanguage);
    }
    if (cert['dcc:measurementResults']) {
      renderMeasurementResults(cert['dcc:measurementResults'], selectedLanguage);
    }
Benedikt's avatar
Benedikt committed
}