<commit_before>(() => {
    'use strict';

    angular.module('localModulo').controller('LocalEdicaoController', ['$state', 'APP_STATES', 'Local', 'local', 'LocaisService', 'ModalService', 'ToastService', function ($state, APP_STATES, Local, local, LocaisService, ModalService, ToastService) {

        const self = this;
        this.local = local || new Local();
        this.localBackup;

        /**
         * Salva o local atual redirecionando para tela de visualização do mesmo em caso
         * de sucesso, ou exibindo um modal de erro caso contrário.
         */
        this.salvarLocal = function () {
            function callbackSucesso(data) {
                self.local = data.data;
                const mensagem = 'Local salvo com sucesso!';
                ToastService.showActionToast(mensagem);
                $state.go(APP_STATES.LOCAL_ID_INFO.nome, {idLocal: self.local._id});
            }

            function callbackErro() {
                const mensagem = 'Um erro ocorreu, o local não foi salvo. Por favor, ' +
                    'tente novamente.';
                ModalService.error(mensagem);
            }

            LocaisService.salvarLocal(self.local)
               .then(callbackSucesso)
               .catch(callbackErro);
        };

        /**
         * Verifica se há necessidade de limpar os campos, se sim, limpa-os, se não,
         * não executa ação.
         */
        this.limparCampos = function () {
            if (podeLimparCampos()) {
                limparCampos();
            }
        };

        /**
         * Limpa todos os campos, fornecendo ao usuário a opção de desfazer a limpeza.
         */
        function limparCampos() {
            preLimparCampos();

            const opcoesToast = {
                textContent: 'Campos limpos com sucesso!',
                position: 'bottom left'
            };

            ToastService.showUndoToast(opcoesToast).then(info => {
                if (info) { desfazerLimpezaDeCampos(); }
            });
        }

        /**
         * Checa se os campos do formulário podem ser limpos.
         *
         * @return {boolean} {@code true} caso o local atual tenha algum campo a ser
         * limpo, {@code false} caso contrário.
         *
         * FIXME: Os array inicializados (e.g. equipamentos) são retornados pelo _.values() como vazios,
         * FIXME: porém ainda contam como atributos, então a lista de atributos nunca é vazia.
         */
        function podeLimparCampos() {
            const local = angular.copy(self.local);
            delete local._id;

            const atributosLocal = _.values(local);
            return !_.isEmpty(atributosLocal);
        }

        /**
         * Realiza backup das informações do local antes de limpar todos os campos
         * do formulário.
         */
        function preLimparCampos() {
            self.localBackup = angular.copy(self.local);
            self.local = new Local();
        }

        /**
         * Desfaz a limpeza de campos.
         */
        function desfazerLimpezaDeCampos() {
            self.local = angular.copy(self.localBackup);
        }

    }]);
})();<commit_msg>Fix para o caso de limpar os campos do local quando os mesmos já são vazios<commit_after>(() => {
    'use strict';

    angular.module('localModulo').controller('LocalEdicaoController', ['$state', 'APP_STATES', 'Local', 'local', 'LocaisService', 'ModalService', 'ToastService', function ($state, APP_STATES, Local, local, LocaisService, ModalService, ToastService) {

        const self = this;
        this.local = local || new Local();
        this.localBackup;

        /**
         * Salva o local atual redirecionando para tela de visualização do mesmo em caso
         * de sucesso, ou exibindo um modal de erro caso contrário.
         */
        this.salvarLocal = function () {
            function callbackSucesso(data) {
                self.local = data.data;
                const mensagem = 'Local salvo com sucesso!';
                ToastService.showActionToast(mensagem);
                $state.go(APP_STATES.LOCAL_ID_INFO.nome, {idLocal: self.local._id});
            }

            function callbackErro() {
                const mensagem = 'Um erro ocorreu, o local não foi salvo. Por favor, ' +
                    'tente novamente.';
                ModalService.error(mensagem);
            }

            LocaisService.salvarLocal(self.local)
               .then(callbackSucesso)
               .catch(callbackErro);
        };

        /**
         * Verifica se há necessidade de limpar os campos, se sim, limpa-os, se não,
         * não executa ação.
         */
        this.limparCampos = function () {
            if (podeLimparCampos()) {
                limparCampos();
            }
        };

        /**
         * Limpa todos os campos, fornecendo ao usuário a opção de desfazer a limpeza.
         */
        function limparCampos() {
            preLimparCampos();

            const opcoesToast = {
                textContent: 'Campos limpos com sucesso!',
                position: 'bottom left'
            };

            ToastService.showUndoToast(opcoesToast).then(info => {
                if (info) { desfazerLimpezaDeCampos(); }
            });
        }

        /**
         * Checa se os campos do formulário podem ser limpos.
         *
         * @return {boolean} {@code true} caso o local atual tenha algum campo a ser
         * limpo, {@code false} caso contrário.
         */
        function podeLimparCampos() {
            const local = angular.copy(self.local);
            delete local._id;

            return !contemApenasAtributosVazios(local);
        }

        /**
         * Retorna se todos os atributos do local especificado são vazios. Utiliza a função
         * values do lodash, a qual retorna a lista com todos os atributos não vazios de um
         * objeto, porém, um array vazio é um objeto não vazio, logo temos que desconsiderá-los.
         *
         * @param local Local a ter seus atributos verificados como vazios ou não.
         * @return {boolean} {@code true} caso todos os atributos do local sejam vazios ou sejam
         * arrays vazios, {@code false} caso contrário.
         */
        function contemApenasAtributosVazios(local) {
            const atributosLocal = _.values(local);

            let contemApenasAtributosVazios = true;

            _.each(atributosLocal, (atributo) => {
                contemApenasAtributosVazios &= _.isArray(atributo) && _.isEmpty(atributo);
            });

            return contemApenasAtributosVazios;
        }

        /**
         * Realiza backup das informações do local antes de limpar todos os campos
         * do formulário.
         */
        function preLimparCampos() {
            self.localBackup = angular.copy(self.local);
            self.local = new Local();
        }

        /**
         * Desfaz a limpeza de campos.
         */
        function desfazerLimpezaDeCampos() {
            self.local = angular.copy(self.localBackup);
        }

    }]);
})();
{'fraction_non_alphanumeric': 0.09780467210807768, 'fraction_numerical': 0.0, 'mean_word_length': 1.728214971209213, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 8, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2009553', 'n_tokens_mistral': 2087, 'n_tokens_neox': 2010, 'n_words': 540}