{"version":3,"sources":["jsdelivr-header.js","/gh/cederig/rowtorecord@1.0.1/rowtorecord.js"],"names":[],"mappings":"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","file":"/gh/cederig/rowtorecord@1.0.1/rowtorecord.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /gh/cederig/rowtorecord@1.0.1/rowtorecord.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\n\nconst spinner = document.getElementById('spinner');\n\nlet store = Object.create(null);\n\nconst handleConfiguration = async (event) => {\n    try {\n        inputReset(event.target);\n\n        const file = event.target.files[0];\n        if (!file) throw 'File not found';\n\n        const fileContent = await readFileAsText(file);\n        const configuration = parseYaml(fileContent);\n        if (!configuration) throw 'Configuration file not found';\n        store['configuration'] = configuration;\n\n        const { generatedFileName } = configuration;\n        if (generatedFileName) {\n            store['generatedFile'] = generatedFileName;\n\n            const { extension, name } = getFileNameExtension(generatedFileName);\n            if (name && extension) {\n                document.querySelector('#generatedFile').value = name;\n                document.getElementById(\"generatedFile\").disabled = true;\n                document.getElementById('generatedFileExt').innerHTML = `.${extension}`;\n            }\n        }\n\n        event.target.classList.add('is-valid');\n    } catch (error) {\n        event.target.classList.add('is-invalid');\n        event.target.nextElementSibling.innerHTML = `Error : ${error}`;\n    }\n}\n\nconst getWorkbook = async (event, store) => {\n    try {\n        const file = event.target.files[0];\n        if (!file) throw new Error('Error: File not found');\n\n        try {\n            let data = await XlsxPopulate.fromDataAsync(file);\n            if (!data) throw new Error('Error: Data not found');\n            event.target.classList.add('is-valid');\n\n            const { extension } = getFileNameExtension(file.name);\n            if (!extension) throw new Error('Invalid file extension');\n            store(data, extension);\n\n        } catch (error) {\n            throw new Error(\"Error: Invalid file\");\n        }\n\n    } catch (error) {\n        event.target.classList.add('is-invalid');\n        event.target.nextElementSibling.innerHTML = `${error.message}`;\n    }\n}\n\ndocument.querySelector('#templateFile').addEventListener('change', event => {\n    getWorkbook(event, (data, extension) => {\n        store['templateWorkbook'] = data;\n        store['extension'] = extension;\n        document.getElementById('generatedFileExt').innerHTML = `.${extension}`;\n    });\n});\n\ndocument.querySelector('#sourceFile').addEventListener('change', event => {\n    getWorkbook(event, (data) => {\n        store['sourceWorkbook'] = data;\n    });\n});\n\ndocument.querySelector('#configurationFile').addEventListener('change', handleConfiguration);\n\ndocument.querySelector('#generatedFile').addEventListener('change', event => {\n    store['generatedFile'] = store['extension'] ? `${event.target.value}.${store['extension']}` : event.target.value;\n});\n\nasync function converter() {\n    try {\n        if (!store['templateWorkbook']) {\n            document.querySelector('#templateFile').classList.add('is-invalid');\n            throw 'Template file not found';\n        }\n        if (!store['sourceWorkbook']) {\n            document.querySelector('#sourceFile').classList.add('is-invalid');\n            throw 'Source file not found';\n        }\n        if (!store['configuration']) {\n            document.querySelector('#configurationFile').classList.add('is-invalid');\n            throw 'Mapping file not found';\n        }\n        if (!store['generatedFile']) {\n            document.querySelector('#generatedFile').classList.add('is-invalid');\n            throw 'Generated file name not found';\n        }\n\n        const { sheets, modelSheetName } = store['configuration'];\n\n        spinnerOn(spinner);\n\n        Object.values(sheets).map(sheet => {\n            try {\n                const { sheet: { name, startRow, stopRow, referenceColumn, mapping } } = sheet;\n\n                if (!modelSheetName) throw new SyntaxError('Missing model sheet name parameter');\n                let mws = store['templateWorkbook'].sheet(modelSheetName);\n                if (!mws) throw new SyntaxError(`Model sheet name '${modelSheetName}' not found`);\n\n                if (!name) throw new SyntaxError('Missing source sheet name parameter');\n                let sws = store['sourceWorkbook'].sheet(name);\n                if (!sws) throw new SyntaxError(`Source sheet name '${name}' not found`);\n\n                const rowCount = stopRow ?? sws._rows.length;\n\n                if (!startRow) throw 'Missing start row parameter';\n                if (!referenceColumn) throw 'Missing reference column parameter';\n\n                for (let i = startRow; i < rowCount; i++) {\n\n                    let sheetName = sws.row(i).cell(referenceColumn).value();\n                    if (!sheetName) break;\n\n                    let clone = store['templateWorkbook'].cloneSheet(mws, sheetName);\n\n                    Object.values(mapping).map(e => {\n                        clone.cell(e.target).value(sws.row(i).cell(e.source).value());\n                    });\n\n                    clone.activeCell(\"A1\");\n                }\n            } catch (error) {\n                document.getElementById(\"err\").innerHTML = error;\n                throw error;\n            }\n        });\n\n        // let workbookSheets = modelWorkbook.sheets();\n        // modelWorkbook.activeSheet(workbookSheets[0]);\n        // workbookSheets[0].activeCell(\"A1\");\n        // workbookSheets[1].activeCell(\"A1\");\n\n        generate(store['templateWorkbook']).then((blob) => {\n            var url = window.URL.createObjectURL(blob);\n            var a = document.createElement(\"a\");\n            document.body.appendChild(a);\n            a.href = url;\n            a.download = store['generatedFile'];\n            a.click();\n            window.URL.revokeObjectURL(url);\n            document.body.removeChild(a);\n\n            resetForm();\n            // console.log(XlsxPopulate.MIME_TYPE);\n            // location.href = \"data:\" + XlsxPopulate.MIME_TYPE + \";base64,\" + base64;\n        });\n    } catch (error) {\n        document.getElementById(\"err\").innerHTML = error;\n    }\n}\n\nconst generate = workbook => {\n    return workbook.outputAsync();\n}\n\nconst parseYaml = contents => {\n    return jsyaml.load(contents);\n}\n\nconst readFileAsText = inputFile => {\n    const reader = new FileReader();\n\n    return new Promise((resolve, reject) => {\n        reader.onerror = () => {\n            reader.abort();\n            reject(new DOMException(\"Problem parsing input file.\"));\n        };\n\n        reader.onload = () => {\n            resolve(reader.result);\n        };\n        reader.readAsText(inputFile);\n    });\n};\n\nconst spinnerOn = element => {\n    element.removeAttribute(\"hidden\");\n    element.parentNode.setAttribute(\"disabled\", \"\");\n}\n\nconst spinnerOff = element => {\n    element.setAttribute(\"hidden\", \"\");\n    element.parentNode.removeAttribute(\"disabled\");\n}\n\nconst inputReset = value => {\n    value.classList.remove('is-invalid');\n    value.classList.remove('is-valid');\n}\n\nconst resetForm = () => {\n    document.getElementById(\"err\").innerHTML = '';\n    document.getElementById(\"generatedFile\").disabled = false;\n    document.getElementById('generatedFileExt').innerHTML = \".xlsx\";\n\n    let t = document.getElementById('templateFile');\n    let s = document.getElementById('sourceFile');\n    let v = document.getElementById('configurationFile');\n    let u = document.getElementById('generatedFile');\n    t.value = t.defaultValue;\n    s.value = s.defaultValue;\n    u.value = u.defaultValue;\n    v.value = v.defaultValue;\n\n    inputReset(t);\n    inputReset(s);\n    inputReset(u);\n    inputReset(v);\n    store = {};\n    spinnerOff(spinner);\n\n}\n\nconst getFileNameExtension = (filename) => {\n    let last_dot = filename.lastIndexOf('.');\n    if (last_dot == -1) throw new SyntaxError('Missing extension file');\n    let ext = filename.slice(last_dot + 1);\n    let name = filename.slice(0, last_dot);\n    return { filename: filename, extension: ext, name: name };\n}"]}