NodeBB/NodeBB

View on GitHub
public/src/admin/appearance/themes.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict';


define('admin/appearance/themes', ['bootbox', 'translator', 'alerts'], function (bootbox, translator, alerts) {
    const Themes = {};

    Themes.init = function () {
        $('#installed_themes').on('click', function (e) {
            const target = $(e.target);
            const action = target.attr('data-action');

            if (action && action === 'use') {
                const parentEl = target.parents('[data-theme]');
                const themeType = parentEl.attr('data-type');
                const cssSrc = parentEl.attr('data-css');
                const themeId = parentEl.attr('data-theme');

                if (config['theme:id'] === themeId) {
                    return;
                }
                socket.emit('admin.themes.set', {
                    type: themeType,
                    id: themeId,
                    src: cssSrc,
                }, function (err) {
                    if (err) {
                        return alerts.error(err);
                    }
                    config['theme:id'] = themeId;
                    highlightSelectedTheme(themeId);

                    alerts.alert({
                        alert_id: 'admin:theme',
                        type: 'info',
                        title: '[[admin/appearance/themes:theme-changed]]',
                        message: '[[admin/appearance/themes:restart-to-activate]]',
                        timeout: 5000,
                        clickfn: function () {
                            require(['admin/modules/instance'], function (instance) {
                                instance.rebuildAndRestart();
                            });
                        },
                    });
                });
            }
        });

        $('#revert_theme').on('click', function () {
            if (config['theme:id'] === 'nodebb-theme-harmony') {
                return;
            }
            bootbox.confirm('[[admin/appearance/themes:revert-confirm]]', function (confirm) {
                if (confirm) {
                    socket.emit('admin.themes.set', {
                        type: 'local',
                        id: 'nodebb-theme-harmony',
                    }, function (err) {
                        if (err) {
                            return alerts.error(err);
                        }
                        config['theme:id'] = 'nodebb-theme-harmony';
                        highlightSelectedTheme('nodebb-theme-harmony');
                        alerts.alert({
                            alert_id: 'admin:theme',
                            type: 'success',
                            title: '[[admin/appearance/themes:theme-changed]]',
                            message: '[[admin/appearance/themes:revert-success]]',
                            timeout: 3500,
                        });
                    });
                }
            });
        });

        socket.emit('admin.themes.getInstalled', function (err, themes) {
            if (err) {
                return alerts.error(err);
            }

            const instListEl = $('#installed_themes');

            if (!themes.length) {
                instListEl.append($('<li/ >').addClass('no-themes').translateHtml('[[admin/appearance/themes:no-themes]]'));
            } else {
                app.parseAndTranslate('admin/partials/theme_list', {
                    themes: themes,
                }, function (html) {
                    instListEl.html(html);
                    highlightSelectedTheme(config['theme:id']);
                });
            }
        });
    };

    function highlightSelectedTheme(themeId) {
        translator.translate('[[admin/appearance/themes:select-theme]]  ||  [[admin/appearance/themes:current-theme]]', function (text) {
            text = text.split('  ||  ');
            const select = text[0];
            const current = text[1];

            $('[data-theme]')
                .removeClass('selected')
                .find('[data-action="use"]')
                .html(select)
                .removeClass('btn-success')
                .addClass('btn-primary');

            $('[data-theme="' + themeId + '"]')
                .addClass('selected')
                .find('[data-action="use"]')
                .html(current)
                .removeClass('btn-primary')
                .addClass('btn-success');
        });
    }

    return Themes;
});