divio/django-cms

View on GitHub
cms/static/cms/js/widgets/forms.pagesmartlinkwidget.js

Summary

Maintainability
A
3 hrs
Test Coverage
/*
 * Copyright https://github.com/divio/django-cms
 */

// this essentially makes sure that dynamically required bundles are loaded
// from the same place
// eslint-disable-next-line
__webpack_public_path__ = require('../modules/get-dist-path')('bundle.forms.pagesmartlinkwidget');

// #############################################################################
// PAGE SMART LINK WIDGET
// cms/forms/widgets.py used for redirects in admin/cms/page/advanced-settings
require.ensure([], function (require) {
    var $ = require('jquery');
    var Class = require('classjs');

    require('../select2/select2');

    /**
     * Creates a select field using jquery.select2 to filter through
     * available pages or set a custom url.
     *
     * @class PageSmartLinkWidget
     * @namespace CMS
     */
    var PageSmartLinkWidget = new Class({

        initialize: function initialize(options) {
            this.options = $.extend(true, {}, this.options, options);
            // load functionality
            this._setup(options);
        },

        /**
         * Setup internal functions and events.
         *
         * @private
         * @method _setup
         * @param {Object} options
         * @param {String} options.id
         * @param {String} options.url
         */
        _setup: function _setup(options) {
            $('#' + options.id).select2({
                placeholder: options.text,
                allowClear: true,
                multiple: false,
                ajax: {
                    url: options.url,
                    dataType: 'json',
                    data: function (term) {
                        return {
                            q: term,
                            language_code: options.lang
                        };
                    },
                    // default search output, will be overridden if no results map
                    results: function (data) {
                        return {
                            more: false,
                            results: $.map(data, function (item) {
                                return {
                                    id: item.redirect_url,
                                    text: item.title + ' (/' + item.path + ')'
                                };
                            })
                        };
                    }
                },
                // create fallback entry if no choices are found
                createSearchChoice: function (term, data) {
                    if ($(data).filter(
                        function () {
                            return this.text.localeCompare(term) === 0;
                        }).length === 0
                    ) {
                        return {
                            id: term,
                            text: term
                        };
                    }
                },
                // ensures initial selection is loaded
                initSelection: function (element, callback) {
                    callback({
                        id: element.val(),
                        text: element.val()
                    });
                }
            });
        }
    });

    window.CMS = window.CMS || {};
    window.CMS.PageSmartLinkWidget = PageSmartLinkWidget;

    $(function () {
        window.CMS.Widgets._pageSmartLinkWidgets.forEach(function (widget) {
            new PageSmartLinkWidget(widget);
        });
    });
}, 'admin.widget');