source : csvCtrl.js

(function (angular) {
    'use strict';
    /**
     * @memberof spApp
     * @ngdoc controller
     * @name CsvCtrl
     * @description
     *   Display a CSV
     */
    angular.module('csv-ctrl', ['map-service', 'biocache-service'])
        .controller('CsvCtrl', ['$scope', 'MapService', '$timeout', 'LayoutService', '$uibModalInstance', 'BiocacheService', 'data',
            function ($scope, MapService, $timeout, LayoutService, $uibModalInstance, BiocacheService, data) {
                $scope.data = data;
                $scope.truncated = data.csv.length > 100000;
                $scope.summary = $.csv.toArrays(data.csv.substring(0, 100000));
                if ($scope.truncated) {
                    // cleanup last row that was truncated
                    $scope.summary = $scope.summary.splice(0, $scope.summary.length - 2);
                }
                $scope.step = 1;
                $scope.exportUrl = null;
                $scope.mappable = false;
                $scope.distributions = false;
                $scope.species = false;
                LayoutService.addToSave($scope);
                //TODO: implement addToMap for csvCtrl
                $scope.addToMap = function (item) {
                    if ($scope.distributions) {
                    } else if ($scope.species) {
                    }
                };
                //adjust sequence of header
                $scope.sortColumn = function(src){
                    if (data.columnOrder) {
                        var columnOrder = data.columnOrder;
                        var csv_data = new Map();
                        for (i in columnOrder) {
                            csv_data.set(columnOrder[i], []);
                        }
                        var transpose = _.zip.apply(null, src);
                        for (var i = 0; i < transpose.length; i++) {
                            csv_data.set(transpose[i][0], transpose[i].slice(1))
                        }
                        //Map to Array
                        var da = Array.from(csv_data);
                        //flat array
                        for (i in da) {
                            da[i] = da[i].flat();
                        }
                        // reverse x/y
                        return _.zip.apply(null, da)
                    }
                };
                if ($scope.summary.length > 0 && $scope.summary[0].length > 0) {
                    $.each($scope.summary[0], function (fieldName) {
                        if (fieldName === 'spcode') {
                            $scope.mappable = true;
                            $scope.distributions = true
                        } else if (fieldName === 'names_and_lsid') {
                            $scope.mappable = true;
                            $scope.species = true
                        }
                    });
                    $scope.summary = $scope.sortColumn($scope.summary);
                }
                $timeout(function () {
                    if ($scope.data.csv.length > 0) {
                        var blob = new Blob([$scope.data.csv], {type: 'text/plain'});
                        $scope.exportUrl = (window.URL || window.webkitURL).createObjectURL(blob);
                    } else {
                        $scope.exportUrl = null
                    }
                }, 0)
            }
            ])
}(angular));