superdesk/superdesk-client-core

View on GitHub
scripts/apps/monitoring/directives/AggregateSettings.ts

Summary

Maintainability
F
4 days
Test Coverage
import _ from 'lodash';
import {gettext} from 'core/utils';

import {
    DESK_OUTPUT,
    SENT_OUTPUT,
    SCHEDULED_OUTPUT,
} from 'apps/desks/constants';
import {getLabelForStage} from 'apps/workspace/content/constants';

AggregateSettings.$inject = ['desks', 'workspaces', 'session', 'preferencesService', 'WizardHandler', '$filter'];
export function AggregateSettings(desks, workspaces, session, preferencesService, WizardHandler, $filter) {
    return {
        templateUrl: 'scripts/apps/monitoring/views/aggregate-settings-configuration.html',
        scope: {
            modalActive: '=',
            desks: '=',
            deskStages: '=',
            searches: '=',
            deskLookup: '=',
            stageLookup: '=',
            searchLookup: '=',
            groups: '=',
            editGroups: '=',
            onclose: '&',
            widget: '=',
            settings: '=',
            currentStep: '=',
            displayOnlyCurrentStep: '=',
            columnsLimit: '=',
        },
        link: function(scope, elem) {
            var PREFERENCES_KEY = 'agg:view';
            var defaultMaxItems = 10;

            scope.showGlobalSavedSearches = false;
            scope.showPrivateSavedSearches = true;
            scope.privateSavedSearches = [];
            scope.globalSavedSearches = [];

            scope.DESK_OUTPUT = DESK_OUTPUT;
            scope.SENT_OUTPUT = SENT_OUTPUT;
            scope.SCHEDULED_OUTPUT = SCHEDULED_OUTPUT;

            scope.deskOutputs = [
                {
                    id: ':scheduled',
                    type: SCHEDULED_OUTPUT,
                    label: gettext('Output/Scheduled'),
                    listLabel: gettext('Desk Schedule Output'),
                },
                {
                    id: ':output',
                    type: DESK_OUTPUT,
                    label: gettext('Output/Published'),
                    listLabel: gettext('Desk Output'),
                },
                {
                    id: ':sent',
                    type: SENT_OUTPUT,
                    label: gettext('Output/Sent'),
                    listLabel: gettext('Desk Sent Output'),
                },
            ];

            desks.initialize()
                .then(() => {
                    scope.userLookup = desks.userLookup;
                    scope.setCurrentStep();
                });

            scope.$watch('step.current', (step) => {
                if (step === 'searches') {
                    workspaces.getActiveId().then((activeWorkspace) => {
                        if (activeWorkspace.type === 'workspace') {
                            scope.showPrivateSavedSearches = true;
                        } else {
                            scope.showGlobalSavedSearches = true;
                            scope.showPrivateSavedSearches = false;
                        }
                    });

                    scope.initGlobalSavedSearches();
                    scope.initPrivateSavedSearches();
                }
            });

            scope.labelForStage = getLabelForStage;

            scope.closeModal = function() {
                scope.step.current = 'desks';
                scope.modalActive = false;
                scope.showGlobalSavedSearches = false;
                scope.onclose();
            };

            scope.previous = function() {
                WizardHandler.wizard('aggregatesettings').previous();
            };

            scope.next = function() {
                WizardHandler.wizard('aggregatesettings').next();
            };

            /**
             * @description Returns true if this step in wizard should need to hide, false otherwise.
             * Only current step will be shown when displayOnlyCurrentStep is defined.
             * @param {String} code name of this step in wizard, i.e: desks, searches, reorder, maxitems
             * @returns {Boolean}
             */
            scope.shouldHideStep = function(code) {
                return !_.isNil(scope.displayOnlyCurrentStep) && !(scope.displayOnlyCurrentStep
                    && scope.currentStep === code);
            };

            /**
             * @description Sets current step in wizard, default is 'desks'.
             */
            scope.setCurrentStep = function() {
                scope.step = {
                    current: scope.currentStep || 'desks',
                };
            };

            scope.cancel = function() {
                scope.closeModal();
            };

            scope.setDeskInfo = function(_id) {
                var item = scope.editGroups[_id];

                item._id = _id;
                item.type = 'desk';
                item.order = 0;

                var deskOutput = scope.editGroups[_id + ':output'];

                if (deskOutput) {
                    deskOutput.selected = item.selected;
                }

                var scheduledDeskOutput = scope.editGroups[_id + ':scheduled'];

                if (scheduledDeskOutput) {
                    scheduledDeskOutput.selected = item.selected;
                }
            };

            scope.labelForStage = getLabelForStage;

            scope.setStageInfo = function(_id) {
                var item = scope.editGroups[_id];

                if (!item.type) {
                    item._id = _id;
                    item.type = 'stage';
                    item.max_items = defaultMaxItems;
                    item.order = _.size(scope.editGroups);
                }
            };

            scope.setDeskOutputInfo = function(_id, type) {
                var item = scope.editGroups[_id];

                item._id = _id;
                item.type = type;
                item.max_items = defaultMaxItems;
                item.order = _.size(scope.editGroups);

                scope.editGroups[_id] = item;
            };

            scope.setSearchInfo = function(_id) {
                var item = scope.editGroups[_id];

                if (!item.type) {
                    item._id = _id;
                    item.type = 'search';
                    item.max_items = defaultMaxItems;
                    item.order = _.size(scope.editGroups);
                }
            };

            scope.setPersonalInfo = function() {
                var item = scope.editGroups.personal;

                if (!item.type) {
                    item._id = 'personal';
                    item.type = 'personal';
                    item.max_items = defaultMaxItems;
                    item.order = _.size(scope.editGroups);
                }
            };

            /**
             * Init private saved searches with all saved searches for this user
             */
            scope.initPrivateSavedSearches = function() {
                var user = session.identity._id;

                if (scope.privateSavedSearches.length > 0) {
                    scope.privateSavedSearches.length = 0;
                }
                _.each($filter('sortByName')(scope.searches), (item) => {
                    if (item.user === user && !item.is_global) {
                        scope.privateSavedSearches.push(item);
                    }
                });
            };

            /**
             * Init global saved searches with all saved searches for all users
             * where is_global flag is true
             */
            scope.initGlobalSavedSearches = function() {
                if (scope.globalSavedSearches.length > 0) {
                    scope.globalSavedSearches.length = 0;
                }
                _.each($filter('sortByName')(scope.searches), (item) => {
                    if (item.is_global) {
                        scope.globalSavedSearches.push(item);
                        var group = scope.editGroups[item._id];

                        if (group && group.selected) {
                            scope.showGlobalSavedSearches = true;
                        }
                    }
                });
            };

            /**
             * Return the list of selected groups (stages, personal or saved searches)
             * @return {Array} list of groups
             */
            scope.getValues = function() {
                var values = Object.keys(scope.editGroups).map((key) => scope.editGroups[key]);

                values = _.filter(values, (item) => {
                    if (item.type === 'desk' || !item.selected) {
                        return false;
                    }
                    if (item.type === 'stage') {
                        var stage = scope.stageLookup[item._id];

                        return scope.editGroups[stage.desk].selected;
                    }

                    if (item.type === 'personal') {
                        return scope.editGroups.personal.selected;
                    }
                    return true;
                });
                values = _.sortBy(values, (item) => item.order);

                _.each(values, (item) => {
                    if (desks.isOutputType(item.type)) {
                        var deskId = item._id.substring(0, item._id.indexOf(':'));

                        item.name = desks.deskLookup[deskId].name;
                    }
                });

                return values;
            };

            scope.reorder = function(start, end, uiItem) {
                var values = scope.getValues();

                if (end.index !== start.index) {
                    values.splice(end.index, 0, values.splice(start.index, 1)[0]);
                    _.each(values, (item, index) => {
                        item.order = index;
                    });
                }
            };

            scope.save = function() {
                var groups = [];

                _.each(scope.getValues(), (item, index) => {
                    if (item.selected && item.type !== 'desk') {
                        groups.push({
                            _id: item._id,
                            type: item.type,
                            max_items: item.max_items,
                        });
                    }
                });

                if (scope.widget) {
                    workspaces.getActive()
                        .then((workspace) => {
                            var widgets = angular.copy(workspace.widgets);

                            _.each(widgets, (widget) => {
                                if (scope.widget._id === widget._id
                                    && scope.widget.multiple_id === widget.multiple_id) {
                                    widget.configuration = {};
                                    widget.configuration.groups = groups;
                                    if (scope.widget.configuration.label) {
                                        widget.configuration.label = scope.widget.configuration.label;
                                    }
                                }
                            });
                            workspaces.save(workspace, {widgets: widgets})
                                .then(() => {
                                    scope.showGlobalSavedSearches = false;
                                    scope.onclose();
                                });
                        });
                } else if (scope.settings && scope.settings.desk) {
                    desks.save(scope.deskLookup[scope.settings.desk._id], {monitoring_settings: groups})
                        .then(() => {
                            WizardHandler.wizard('aggregatesettings').finish();
                        });
                } else {
                    workspaces.getActiveId()
                        .then((activeWorkspace) => {
                            if (activeWorkspace.type === 'workspace' || activeWorkspace.type === 'desk') {
                                preferencesService.get(PREFERENCES_KEY)
                                    .then((preferences) => {
                                        var updates = {};

                                        if (preferences) {
                                            updates[PREFERENCES_KEY] = preferences;
                                        }
                                        updates[PREFERENCES_KEY][activeWorkspace.id] = {groups: groups};
                                        preferencesService.update(updates, PREFERENCES_KEY)
                                            .then(() => {
                                                WizardHandler.wizard('aggregatesettings').finish();
                                            });
                                    });
                            }
                        });
                    scope.showGlobalSavedSearches = false;
                    scope.onclose();
                }
            };
        },
    };
}