superdesk/superdesk-client-core

View on GitHub
scripts/apps/search/controllers/SearchController.ts

Summary

Maintainability
A
3 hrs
Test Coverage
import {intersection} from 'lodash';
import {appConfig} from 'appConfig';

SearchController.$inject = ['$location', 'searchProviderService'];
export function SearchController($location, searchProviderService) {
    const SUPERDESK = 'local';
    const INTERNAL = ['archive', 'published', 'ingest', 'archived'];
    const DEFAULT_CONFIG = Object.assign({}, {
        ingest: true,
        archive: true,
        published: true,
        archived: true,
        search: SUPERDESK,
    }, appConfig.defaultSearch);

    this.hideNested = appConfig.features.nestedItemsInOutputStage;

    const getActiveRepos = () => INTERNAL.filter((name) => this.repo[name]);
    const resetInternalRepo = () => this.repo = Object.assign({}, DEFAULT_CONFIG);

    resetInternalRepo();

    // init based on $location
    if ($location.search().repo && !intersection($location.search().repo.split(','), INTERNAL).length) {
        this.repo.search = $location.search().repo;
    }

    // init search providers
    searchProviderService.getActiveSearchProviders()
        .then((providers) => {
            this.providers = providers;

            // init selected/default provider
            if (this.providers.length && $location.search().internal == null) {
                const selectedProvider = this.providers.find((provider) =>
                    provider.search_provider === $location.search().repo || provider._id === $location.search().repo,
                );
                const defaultProvider = $location.search().repo === undefined &&
                                        this.providers.find((provider) => provider.is_default);

                this.activeProvider = selectedProvider || defaultProvider;
                if (this.activeProvider) {
                    this.toggleProvider(this.activeProvider);
                    return;
                }
            }

            // internal search - init repos
            const repos = ($location.search().repo || '').split(',').filter((repo) => !!repo);

            INTERNAL.forEach((repo) => {
                this.repo[repo] = repos.length === 0 ? DEFAULT_CONFIG[repo] : repos.indexOf(repo) >= 0;
            });
        });

    /**
     * Toggle internal repo
     * @param {string} repoName
     */
    this.toggleRepo = (repoName) => {
        this.repo[repoName] = !this.repo[repoName];
        let active = getActiveRepos();

        if (active.length === 0) {
            // if no active repo then reset the state of the all repo buttons to active.
            resetInternalRepo();
            active = getActiveRepos();
        }

        $location.search('repo', active.join(','));
    };

    /**
     * Toggle search provider
     * @param {Object} provider
     */
    this.toggleProvider = (provider) => {
        this.activeProvider = provider || null;
        this.providerType = provider ? provider.search_provider : null;
        if (provider) {
            $location.search('repo', provider._id);
            this.repo = {search: provider._id};
        } else {
            $location.search('repo', '');
            resetInternalRepo();
        }
    };
}