/**
* @ngdoc directives
* @name FileReader
* @module s4c.directives.filereader.FileReader
*
* @description Componente para importação de arquivo, usado para leitura de arquivos kml e kmz
*
*
*@example
* <ng-file-reader hide-input="true" element-id="admin-cameras-btn-upload"></ng-file-reader>
*
*/
(function () {
'use strict';
function ngFileReader(ngFileReader) {
return {
restrict: 'E',
templateUrl: 'app/directives/file-reader/file-reader.html',
replace: true,
scope: {
'hideInput': '@'
},
link: function ($scope, $elem, $attrs) {
angular.element(document.querySelector('#' + $attrs.elementId)).on('click', function () {
$elem.click();
});
/**
* Descompacta um arquivo zipado
*
* @method unzip
*
* @param file {File} Arquivo a ser descompactado
* @param callback {Function} Função a ser chamada após término do método
*
*/
function unzip(file, callback) {
zip.workerScriptsPath = "/assets/js/lib/";
// use a zip.BlobReader object to read zipped data stored into blob variable
zip.createReader(new zip.BlobReader(file), function (zipReader) {
// get entries from the zip file
zipReader.getEntries(function (entries) {
_.each(entries, function (entry) {
var extn_ = entry.filename.split(".").pop();
if (extn_ == 'kml') {
// get data from the files
entry.getData(new zip.BlobWriter("text/plain"), function (data) {
// close the reader and calls callback function with uncompressed data as parameter
zipReader.close();
callback(data);
});
}
});
});
}, onerror);
}
function onerror(message) {
console.error(message);
}
/**
* Retorna o arquivo chamando a função responsável pela leitura,
* como cada módulo pode ter a sua implementação, é aqui que será definida qual implementação deve ser chamada
*
* @method returnFile
*
* @param file {File} Arquivo a ser lido
*
*
*/
function returnFile(file) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
var contents = e.target.result;
if ($attrs.elementId == 'admin-pois-btn-upload') {
ngFileReader.fileSelectedPOI({
contents: contents
});
} else if ($attrs.elementId == 'admin-rotas-btn-upload') {
ngFileReader.fileSelectedROTAS({
contents: contents
});
} else if ($attrs.elementId == 'admin-cameras-btn-upload') {
ngFileReader.fileSelectedCAMERAS({
contents: contents
});
} else if ($attrs.elementId == 'admin-area-atuacao-btn-upload') {
ngFileReader.fileSelectedAREAATUACAO({
contents: contents
});
} else {
ngFileReader.fileSelected({
contents: contents
});
}
$elem.wrap('<form>').closest('form').get(0).reset();
$elem.unwrap();
};
fileReader.readAsText(file);
}
$elem.on('change', function (changeEvent) {
var files = changeEvent.target.files;
if (files.length) {
var extn = files[0].name.split(".").pop();
if (extn == 'kmz') {
unzip(files[0], returnFile);
} else {
returnFile(files[0]);
}
}
});
}
};
}
/**
* @ngdoc overview
* @name s4c.components.fileUploader
*/
angular.module('s4c.directives.ngFileReader', [])
.directive('ngFileReader', ngFileReader);
}());