Source: components/admin/controllers/icones.controller.js

/**
 * @ngdoc controllers
 * @name Icones
 * @module s4c.components.admin.controllers.Icones
 *
 * @description
 * `AdminIconesCtrl` Controller da tela de Upload de Ícones do módulo de administração
 * 
 * 
 */
(function () {
    'use strict';

    AdminIconesCtrl.$inject = [
        '$scope',
        '$http',
        '$mdDialog',
        'API_ENDPOINT',
        'ngFileReader',
        '$rootScope',
        'Usuario',
        'FileUploader'
    ];

    angular.module('s4c.controllers.AdminIconesCtrl', [
        's4c.services.Categoria',
        's4c.directives.ngFileReader'
    ]).controller('AdminIconesCtrl', AdminIconesCtrl);

    function AdminIconesCtrl($scope, $http, $mdDialog, API_ENDPOINT, ngFileReader, $rootScope, Usuario, FileUploader) {

        $scope.res = $rootScope.res;

        /**
         * @method carregarIcones
         */
        function carregarIcones() {

            $http.get(API_ENDPOINT + "filemanager/showicons")
                .then(function (result) {
                    $scope.listIcons = [];
                    $scope.listIconsName = [];
                    $scope.listIcons = result.data;
                    for (var index in $scope.listIcons) {
                        var str = $scope.listIcons[index].filePath;
                        var n = str.indexOf("uploads");
                        var res = str.substring(n, str.length);
                        $scope.listIcons[index].filePath = res;
                        $scope.listIconsName.push($scope.listIcons[index].fileName);
                    }
                }, function (err) {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_ERRO'))
                            .content(err.data.message)
                            .ok($scope.res('COMUM_OK')));
                });
        }



        /**
         * @method salvarImagem
         */
        function salvarImagem() {
            var eviarAlerta = false;

            for (var element in uploader.queue) {
                if ($.inArray(uploader.queue[element].novoNome, $scope.listIconsName) >= 0) {
                    eviarAlerta = true;
                }
            }

            if (eviarAlerta) {
                var confirm = $mdDialog.confirm()
                    .title($scope.res('COMUM_AVISO'))
                    .content($scope.res('COMUM_ICONE_DUPLICADO'))
                    .ok($scope.res('COMUM_SIM'))
                    .cancel($scope.res('COMUM_CANCELAR'));

                $mdDialog.show(confirm).then(function () {
                    enviarArquivo(true);

                }, function () {
                    enviarArquivo(false);
                });
            } else {
                _salvarArquivo();
            }
        }

        /**
         * @method cancelar
         */
        function cancelar() {
            uploader.clearQueue();
            $("#renderCropper").empty();
            $scope.listIconsToRemove = [];
        }

        /**
         * @method toBlob
         */
        function toBlob() {
            var canvas = document.createElement('canvas');
            var ctx = canvas.getContext('2d');
            canvas.height = 400;
            canvas.width = 400;
            ctx.drawImage(document.getElementById('image'), 10, 10);

            if (canvas.toBlob) {
                canvas.toBlob(function (blob) {
                    var formData = new FormData();

                    var token = window.sessionStorage.getItem('s4cToken');
                    var tokenObj = JSON.parse(token);

                    formData.append('arquivo', blob, "arquivo.png");
                    $.ajax('/filemanager/addarquivo', {
                        method: "POST",
                        data: formData,
                        processData: false,
                        contentType: false,
                        headers: {
                            'Authorization': 'Bearer ' + tokenObj.access_token
                        },
                        success: function (data) {
                            $("#renderCropper").empty();
                            carregarIcones();
                        },
                        error: function () {
                            console.log('Upload error');
                        }
                    });
                });
            }
        }

        $scope.input = angular.element('input.uploadArquivo');
        function abrirUpload() {
            $("#renderCropper").empty();
            $scope.input.click();
            $scope.listIconsToRemove = [];
        }

        var uploader = $scope.uploader = new FileUploader(),
            uploadCallbackQueue = [];

        uploader.clearQueue();

        $scope.uploader.filters.push({
            'name': 'enforceMaxFileSize',
            'fn': function (item, evt) {

                if (item.size <= 51200) {
                    return item.size <= 51200
                } else {
                    uploader.clearQueue();

                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_TAMANHOFILEULTRAPASSADO'))
                            .content($scope.res('LIMITE_ICONE_ULTRAPASSADO') + " " + parseInt(item.size / 1024) + "KB" + " - " + $scope.res('LIMITE_ULTRAPASSADO'))
                            .ok($scope.res('COMUM_OK')));

                    return item.size <= 51200;
                }

            }
        });

        $scope.uploader.filters.push({
            'name': 'enforceTypeFile',
            'fn': function (item, evt) {

                if (isImage(ext(item.name))) {
                    return true;
                } else {
                    $mdDialog
                        .show($mdDialog.alert()
                            .title($scope.res('COMUM_TIPO_ARQUIVO_INVALIDO'))
                            .content($scope.res('COMUM_TIPO_IMAGEM_VALIDA'))
                            .ok($scope.res('COMUM_OK')));

                    return false;
                }

            }
        });

        $scope.uploader.onCompleteItem = function (item, response) {
            $scope.mensagem = response;
        };

        $scope.uploader.onAfterAddingFile = function (item, evt, arquivo) {
            item.novoNome = item.file.name;

            if (item.file) {
                _preview(item);
            }
        }

        /**
         * @method _preview
         * @param {*} item 
         */
        function _preview(item) {
            var reader = new FileReader();

            reader.onload = function (e) {

                var label = $('<label />', {
                    id: 'arquivo_anexado' + item.file.name,
                    for: 'myvalue',
                    class: 'fake-label nopad',
                }).appendTo($('#renderCropper'));

                $("#arquivo_anexado" + item.file.name).text(item.file.name);

                var img = $('<img />',
                    {
                        id: 'image',
                        src: e.target.result,
                        style: 'max-width: 24px; max-height: 24px; margin-left: 10px;'
                    }).appendTo($('#renderCropper'));
            };

            reader.readAsDataURL(item._file);
        }

        function ext(filename) {
            var index = _.lastIndexOf(filename, '.');
            return filename.substring(index, filename.length);
        }

        $scope.uploader.onBeforeUploadItem = function (item) {
            item.url = uploader.url;
            var token = window.sessionStorage.getItem('s4cToken');
            try {
                var tokenObj = JSON.parse(token);
                item.headers = {
                    'Authorization': 'Bearer ' + tokenObj.access_token
                };
            } catch (erro) {
                item.headers = {
                    'Authorization': 'Bearer ' + token
                };
            }
            item.file.name = item.novoNome;
        };

        $scope.uploader.onProgressItem = function (fileItem, progress) {
            console.info('onProgressItem', fileItem, progress);
            //listaEquals = [];
        };

        $scope.uploader.onCompleteAll = function (result) {
            _.each(uploadCallbackQueue, function (callback) {
                callback();
            });
        };


        /**
         * @method mostrarImagem
         */
        $scope.mostrarImagem = function () {
            $('#arquivo').each(function (index) {
                if ($('#arquivo').eq(index).val() != "") {
                    $scope.readURL(this);
                }
            });
        }


        /**
         * @method readURL
         */
        $scope.readURL = function (input) {
            if (input.files && input.files[index]) {
                var reader = new FileReader();

                reader.onload = function (e) {
                    $("#renderCropper").empty();


                    var label = $('<label />', {
                        id: 'arquivo_anexado',
                        for: 'myvalue',
                        class: 'fake-label nopad',
                    }).appendTo($('#renderCropper'));

                    $("#arquivo_anexado").text(input.files[0]);


                    var img = $('<img />',
                        {
                            id: 'image' + index,
                            src: e.target.result,
                            style: 'max-width: 24px; max-height: 24px;'
                        }).appendTo($('#renderCropper'));
                };

                reader.readAsDataURL(input.files[0]);
            }

        }

        /**
         * @method enviarArquivo
         * @param {*} substituir 
         */
        function enviarArquivo(substituir) {
            var listIconsToAdd = [];
            for (var element in uploader.queue) {
                if ($.inArray(uploader.queue[element].novoNome, $scope.listIconsName) >= 0 && substituir) {

                    var iconToRemove = _.find($scope.listIcons, function (icons) { return icons.filePath.contains(uploader.queue[element].novoNome) });

                    if (iconToRemove) {
                        $scope.listIconsToRemove.push(iconToRemove.fileId);
                        listIconsToAdd.push(uploader.queue[element]);
                    }
                }
                else if ($.inArray(uploader.queue[element].novoNome, $scope.listIconsName) < 0) {
                    listIconsToAdd.push(uploader.queue[element]);
                }
            }

            uploader.clearQueue();

            for (var index in listIconsToAdd) {
                uploader.queue.push(listIconsToAdd[index]);
            }

            if ($scope.listIconsToRemove.length > 0) {
                for (var index in $scope.listIconsToRemove) {
                    $http.delete(API_ENDPOINT + "filemanager/" + $scope.listIconsToRemove[index]).then(function () {
                        if (index == $scope.listIconsToRemove.length - 1) {
                            _salvarArquivo();
                        }
                    });
                }
            } else {
                _salvarArquivo();
            }

        }

        /**
         * @method _salvarArquivo
         */
        function _salvarArquivo() {
            $scope.isUploading = true;

            uploader.url = '/filemanager/addarquivo/ICONE';
            uploader.uploadAll();
            uploadCallbackQueue.push(function () {
                $scope.isUploading = false;
                $scope.arquivosPraSubir = false;
                carregarIcones();
            });
            $("#renderCropper").empty();
        }

        $scope.uploader.alias = 'arquivo';
        $scope.uploader.removeAfterUpload = true;

        /**
         * @method copyUrlIcons
         * @param {*} icons 
         */
        function copyUrlIcons(icons) {
            var tempInput = document.createElement("input");
            tempInput.style = "position: absolute; left: -1000px; top: -1000px";
            tempInput.value = icons.filePath;
            document.body.appendChild(tempInput);
            tempInput.select();
            document.execCommand("copy");
            document.body.removeChild(tempInput);

            $mdDialog.show({
                controller: function ($scope) {
                    $scope.res = $scope.$root.res;
                    $scope.icons = icons;

                    $scope.ok = function () {
                        $mdDialog.hide();
                    };

                    $scope.cancelar = function () {
                        $mdDialog.cancel();
                    };

                    $scope.deleteIcons = function (icons) {
                        var confirm = $mdDialog.confirm()
                            .title($scope.res('COMUM_MENSAGEM_ACAOIRREVERSIVEL'))
                            .content($scope.res('CERTEZA_REMOVER_ICONE'))
                            .ok($scope.res('COMUM_SIM'))
                            .cancel($scope.res('COMUM_CANCELAR'));

                        $mdDialog.show(confirm).then(function () {

                            $http.delete(API_ENDPOINT + "filemanager/" + icons.fileId)
                                .then(function (result) {
                                    carregarIcones();
                                    $mdDialog
                                        .show($mdDialog.alert()
                                            .title($scope.res('COMUM_SUCESSO'))
                                            .content($scope.res('REMOVER_ICONE_SUCESSO'))
                                            .ok($scope.res('COMUM_OK')));
                                }, function (err) {
                                    $mdDialog
                                        .show($mdDialog.alert()
                                            .title($scope.res('COMUM_ERRO'))
                                            .content(err.data.message)
                                            .ok($scope.res('COMUM_OK')));
                                });
                        }, function (err) {
                            $mdDialog
                                .show($mdDialog.alert()
                                    .title($scope.res('COMUM_ERRO'))
                                    .content(err.data.message)
                                    .ok($scope.res('COMUM_OK')));
                        });
                    };
                },
                templateUrl: 'app/components/admin/modulos/manutencao/icones/dialogIcones.html'
            });

        }


        /**
         * @method isImage
         * @param {*} extension 
         */
        function isImage(extension) {
            if (extension.contains(".jpg")) {
                return true;
            }

            if (extension.contains(".jpeg")) {
                return true;
            }

            if (extension.contains(".png")) {
                return true;
            }

            if (extension.contains(".bmp")) {
                return true;
            }

            if (extension.contains(".svg")) {
                return true;
            }

            if (extension.contains(".gif")) {
                return true;
            }

            if (extension.contains(".tiff")) {
                return true;
            }

            if (extension.contains(".tif")) {
                return true;
            }

            return false;
        }

        $(function () {
            carregarIcones();
        });

        angular.extend($scope, {
            carregarIcones: carregarIcones,
            salvarImagem: salvarImagem,
            abrirUpload: abrirUpload,
            copyUrlIcons: copyUrlIcons,
            cancelar: cancelar
        });

    }

}());