superdesk/superdesk-client-core

View on GitHub
scripts/apps/dictionaries/controllers/DictionaryEditController.ts

Summary

Maintainability
D
1 day
Test Coverage
import _ from 'lodash';
import {gettext} from 'core/utils';

DictionaryEditController.$inject = ['$scope', 'dictionaries', 'upload', 'notify',
    'modal', '$rootScope', '$q'];
export function DictionaryEditController($scope, dictionaries, upload, notify,
    modal, $rootScope, $q) {
    function onSuccess(result) {
        if ($scope.isAbbreviations()) {
            $rootScope.$broadcast('abbreviations:updated', result.content);
        }
        $scope.closeDictionary();
        $scope.fetchDictionaries();
        notify.success(gettext('Dictionary saved successfully'));
        $scope.progress = null;
        return result;
    }

    function onError(response) {
        if (angular.isDefined(response.data._issues)) {
            if (angular.isDefined(response.data._issues['validator exception'])) {
                notify.error(gettext('Error: ' + response.data._issues['validator exception']));
            } else if (angular.isDefined(response.data._issues.name)) {
                notify.error(gettext('Error: The dictionary already exists.'));
                $scope._errorUniqueness = true;
            }
        } else {
            notify.error(gettext('Error. Dictionary not saved.'));
        }
        $scope.progress = null;
    }

    // listen for the file selected event
    $scope.$on('fileSelected', (event, args) => {
        $scope.$apply(() => {
            $scope.file = args.file;
        });
    });

    $scope.save = function() {
        $scope._errorUniqueness = false;
        $scope.progress = {width: 1};
        if ($scope.file) {
            dictionaries.upload($scope.origDictionary, $scope.dictionary, $scope.file,
                onSuccess, onError, (update) => {
                    $scope.progress.width = Math.round(update.loaded / update.total * 100.0);
                },
            );
        } else {
            dictionaries.update($scope.origDictionary, $scope.dictionary, onSuccess, onError);
        }
    };

    $scope.cancel = function() {
        $scope._errorUniqueness = false;
        $scope.closeDictionary();
    };

    $scope.addWord = function(word) {
        if (!$scope.dictionary.content.hasOwnProperty(word)) {
            addWordToTrie(word);
        }

        $scope.dictionary.content[word] = 1;
        $scope.filterWords(word);
        $scope.wordsCount++;
    };

    $scope.removeWord = function(word, search) {
        $scope.dictionary.content[word] = 0;
        $scope.filterWords(search);
        $scope.wordsCount--;
    };

    $scope.stopLoading = $scope.stopLoading || angular.noop;

    function isPrefix(prefix, word) {
        return word.length >= prefix.length && word.substr(0, prefix.length).toLowerCase() === prefix.toLowerCase();
    }

    $scope.filterWords = function filterWords(search) {
        $scope.words = [];
        $scope.isNew = !!search;

        if (!search) {
            return;
        }

        var key = search[0].toLowerCase();

        if (!wordsTrie[key]) {
            return;
        }

        var searchWords = wordsTrie[key],
            length = searchWords.length,
            words = [],
            word;

        for (var i = 0; i < length; i++) {
            word = searchWords[i];
            if ($scope.dictionary.content[word] > 0 && isPrefix(search, word)) {
                words.push(word);
                if (word === search) {
                    $scope.isNew = false;
                }
            }
        }
        words.sort();
        $scope.words = words;
    };

    var wordsTrie = {};

    $scope.wordsCount = 0;
    generateTrie();
    $scope.stopLoading();

    function addWordToTrie(word) {
        var key = word[0].toLowerCase();

        if (wordsTrie.hasOwnProperty(key)) {
            wordsTrie[key].push(word);
        } else {
            wordsTrie[key] = [word];
        }
    }

    function generateTrie() {
        var content = $scope.origDictionary.content || $scope.dictionary.content;
        var words = Object.keys(content || {});

        $scope.wordsCount = words.length;
        for (var i = 0; i < $scope.wordsCount; i++) {
            addWordToTrie(words[i]);
        }
    }

    $scope.isAbbreviations = function() {
        return dictionaries.isAbbreviationsDictionary($scope.dictionary);
    };

    $scope.editAbbreviations = function(abbreviation, phrase) {
        $scope.dictionary.content[abbreviation] = phrase;
    };

    $scope.removeAbbreviation = function(abbreviation) {
        modal.confirm(gettext('Do you want to remove Abbreviation?'))
            .then(() => {
                delete $scope.dictionary.content[abbreviation];
                init();
            });
    };

    function confirmAdd() {
        if ($scope.dictionary.content[$scope.abbreviation.key]) {
            return modal.confirm(gettext('Abbreviation already exists. Do you want to overwrite it?'))
                .then(() => true, () => false);
        }

        return $q.when(true);
    }

    $scope.addAbbreviation = function() {
        confirmAdd().then((result) => {
            if (result) {
                $scope.dictionary.content[$scope.abbreviation.key] = $scope.abbreviation.phrase;
                init();
            }
        });
    };

    function init() {
        if ($scope.isAbbreviations()) {
            $scope.abbreviation = {
                key: '', phrase: '',
            };

            $scope.abbreviationKeys = _.sortBy(Object.keys($scope.dictionary.content));
        }
    }

    init();
}