• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

divio / django-cms / #30167

24 Nov 2025 12:49PM UTC coverage: 89.964% (+14.8%) from 75.132%
#30167

push

travis-ci

web-flow
Merge 565a22220 into 5f080488d

1337 of 2146 branches covered (62.3%)

9206 of 10233 relevant lines covered (89.96%)

11.2 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

83.33
/cms/static/cms/js/modules/cms.pagetree.dropdown.js
1
import $ from 'jquery';
2

3
/**
4
 * Dropdowns in the pagetree.
5
 * Have to be delegated, since pagetree nodes can be
6
 * lazy loaded.
7
 *
8
 * @class PageTreeDropdowns
9
 * @namespace CMS
10
 */
11
class PageTreeDropdowns {
12
    constructor(options) {
13
        this.options = $.extend(true, {}, {
12✔
14
            dropdownSelector: '.js-cms-pagetree-dropdown',
15
            triggerSelector: '.js-cms-pagetree-dropdown-trigger',
16
            menuSelector: '.js-cms-pagetree-dropdown-menu',
17
            openCls: 'cms-pagetree-dropdown-menu-open'
18
        }, options);
19

20
        this.click = 'click.cms.pagetree.dropdown';
12✔
21

22
        this._setupUI();
12✔
23
        this._events();
12✔
24
    }
25

26
    /**
27
     * @method _setupUI
28
     * @private
29
     */
30
    _setupUI() {
31
        this.ui = {
12✔
32
            container: this.options.container,
33
            document: $(document)
34
        };
35
    }
36

37
    /**
38
     * Event handlers.
39
     *
40
     * @method _events
41
     * @private
42
     */
43
    _events() {
44
        var that = this;
14✔
45

46
        // attach event to the trigger
47
        this.ui.container.on(this.click, this.options.triggerSelector, function(e) {
14✔
48
            e.preventDefault();
1✔
49
            e.stopImmediatePropagation();
1✔
50

51
            that._toggleDropdown(this);
1✔
52
        });
53

54
        // stop propagation on the element
55
        this.ui.container.on(this.click, that.options.menuSelector, function(e) {
14✔
56
            e.stopImmediatePropagation();
2✔
57
        });
58

59
        this.ui.container.on(this.click, that.options.menuSelector + ' a', function() {
14✔
60
            that.closeAllDropdowns();
1✔
61
        });
62

63
        this.ui.document.on(this.click, function() {
14✔
64
            that.closeAllDropdowns();
50✔
65
        });
66
    }
67

68
    /**
69
     * @method _toggleDropdown
70
     * @param {jQuery} trigger trigger clicked
71
     * @private
72
     * @returns {Boolean|void}
73
     */
74
    _toggleDropdown(trigger) {
75
        var dropdowns = $(this.options.dropdownSelector);
3✔
76
        var dropdown = $(trigger).closest(this.options.dropdownSelector);
3✔
77

78
        // cancel if opened tooltip is triggered again
79
        if (dropdown.hasClass(this.options.openCls)) {
3✔
80
            dropdowns.removeClass(this.options.openCls);
1✔
81
            return false;
1✔
82
        }
83

84
        // otherwise show the dropdown
85
        dropdowns.removeClass(this.options.openCls);
2✔
86
        dropdown.addClass(this.options.openCls);
2✔
87

88
        this._loadContent(dropdown);
2✔
89
    }
90

91
    /**
92
     * @method _loadContent
93
     * @private
94
     * @param {jQuery} dropdown
95
     * @returns {Boolean|$.Deferred} false if not lazy or already loaded or promise
96
     */
97
    _loadContent(dropdown) {
98
        var data = dropdown.data();
2✔
99
        var LOADER_SHOW_TIMEOUT = 200;
2✔
100

101
        if (!data.lazyUrl || data.loaded) {
2!
102
            return false;
2✔
103
        }
104

105
        var loaderTimeout = setTimeout(function() {
×
106
            dropdown.find('.js-cms-pagetree-dropdown-loader').addClass('cms-loader');
×
107
        }, LOADER_SHOW_TIMEOUT);
108

109
        $.ajax({
×
110
            url: data.lazyUrl,
111
            data: data.lazyUrlData
112
        }).done(function(response) {
113
            dropdown.find('.js-cms-pagetree-dropdown-menu').html(response);
×
114
            dropdown.data('loaded', true);
×
115
            clearTimeout(loaderTimeout);
×
116
        });
117
    }
118

119
    /**
120
     * @method closeAllDropdowns
121
     * @public
122
     */
123
    closeAllDropdowns() {
124
        $(this.options.dropdownSelector).removeClass(this.options.openCls);
50✔
125
    }
126
}
127

128
// Define default options on the prototype for test compatibility
129
PageTreeDropdowns.prototype.options = {
1✔
130
    dropdownSelector: '.js-cms-pagetree-dropdown',
131
    triggerSelector: '.js-cms-pagetree-dropdown-trigger',
132
    menuSelector: '.js-cms-pagetree-dropdown-menu',
133
    openCls: 'cms-pagetree-dropdown-menu-open'
134
};
135

136
export default PageTreeDropdowns;
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc