Source: mixins/table-export.js

/**
 * @desc A mixin object containing methods for data preprocessing before download.
 * @module TableCustomMixin
 */
export const TableExportMixin = {
    methods: {
        // /**
        //  * @desc Converts the spectra table data for download to a CSV file.
        //  * @param {Array} rows - The table rows.
        //  * @param {Array} columns - The table columns. 
        //  */
        // spectraTableFrugal(rows, columns) {
            
        //     // find the columns with wavelengths and values
        //     let iWawelengths = -1, iValues = -1;
        //     for (let i = 0; i < columns.length; i++) {
        //         if (columns[i].name == "wavelengths")
        //             iWawelengths = i;
        //         else if (columns[i].name == "values") {
        //             iValues = i;
        //         }
        //     }

        //     // collect all wavelengths (covers case when some rows have different wavelengths)
        //     let owl = {};
        //     for (let row of rows) {
        //         for (let wl of row[iWawelengths]) {
        //             if (!owl[wl]) {
        //                 owl[wl] = 0;
        //             }
        //         }
        //     }

        //     // assign indices to wavelengths
        //     let i = 0;
        //     let cwl = "";
        //     for (let key of Object.keys(owl).sort((a, b) => a - b)) {
        //         owl[key] = i++;
        //         cwl += '"' + key + '",';
        //     }

        //     // create the header row
        //     let content = "";
        //     for (let c of columns) {
        //         if (c.name != "wavelengths" && c.name != "values") {
        //             content += '"' + c.label + '",';
        //         }
        //     }
        //     content += cwl + "\r\n";

        //     // create the content rows
        //     for (let row of rows) {

        //         // create other row columns
        //         let cr = "";
        //         for (let i = 0; i < columns.length; i++) {
        //             if (i != iValues && i != iWawelengths) {
        //                 if (columns[i].type == "string" && columns[i].field == "date") {
        //                     cr += '"' + row[i] + '",';
        //                 } else {
        //                     cr += row[i] + ",";
        //                 }
        //             }
        //         }

        //         // create the values
        //         let v = [];
        //         for (let i = 0; i < row[iWawelengths].length; i++) {
        //             v[owl[row[iWawelengths][i]]] = row[iValues][i];
        //         }
        //         content += cr + v.join(",") + "\r\n";
        //     }
        
        //     return content;
        // },
        
        /**
         * @desc Converts the spectra table data for download to a CSV file.
         * @param {Array} rows - The table rows.
         * @param {Array} columns - The table columns. 
         */
        spectraTable(rowsOrig, columns) {
            
            if (rowsOrig.length == 0) return "";

            let rows = rowsOrig;
            if (this.frugal) {
                rows = rowsOrig.map(row => this.rowToObject(row));
            }

            console.log("rows", rows);
            let owl = {};
            if (rows[0].wavelengths) {
                // collect all wavelengths (covers case when some rows have different wavelengths)
                for (let row of rows) {
                    if (row.wavelengths) {
                        for (let wl of row.wavelengths) {
                            if (!owl[wl]) {
                                owl[wl] = 0;
                            }
                        }
                    }
                }
            }

            // assign indices to wavelengths
            let i = 0;
            let cwl = "";
            for (let key of Object.keys(owl).sort((a, b) => a - b)) {
                owl[key] = i++;
                cwl += '"' + key + '",';
            }

            // create the header row
            let content = "";
            for (let c of columns) {
                if (c.name != "wavelengths" && c.name != "values") {
                    content += '"' + c.label + '",';
                }
            }
        
            content += cwl + "\r\n";

            // create the content rows
            for (let row of rows) {

                // create other row columns
                let cr = "";
                for (let c of columns) {
                    if (c.name != "wavelengths" && c.name != "values") {
                        if (c.type == "string" && c.name == "date") {
                            cr += '"' + (row[c.name] ?? "") + '",';
                        } else {
                            cr += (row[c.name] ?? "") + ",";
                        }
                    }
                }
                content += cr;

                if (row.wavelengths) {
                    // create the values
                    let v = [];
                    for (let i = 0; i < row.wavelengths.length; i++) {
                        v[owl[row.wavelengths[i]]] = row.values[i];
                    }
                    content += v.join(",");
                }

                content += "\r\n";
            }
        
            return content;
        }
    }
};