PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.3
16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / _inc / jetpack-modules.models.js
jetpack / _inc Last commit date
blocks 5 days ago build 5 days ago fonts 1 year ago genericons 5 months ago lib 5 days ago accessible-focus.js 6 years ago blogging-prompts.php 1 month ago class.jetpack-provision.php 8 months ago content-guidelines-ai.js 2 weeks ago content-guidelines-ai.php 1 week ago crowdsignal-shortcode.js 1 year ago crowdsignal-survey.js 6 years ago deprecate.js 8 months ago facebook-embed.js 4 years ago gallery-settings.js 6 years ago genericons.php 1 year ago jetpack-admin.js 3 years ago jetpack-deactivate-dialog.js 1 year ago jetpack-modules.js 5 days ago jetpack-modules.models.js 5 days ago jetpack-modules.views.js 5 days ago polldaddy-shortcode.js 3 weeks ago site-switcher-endpoint.php 6 months ago site-switcher.jsx 2 weeks ago site-switcher.php 6 months ago social-logos.php 4 months ago twitter-timeline.js 2 months ago
jetpack-modules.models.js
165 lines
1 window.jetpackModules = window.jetpackModules || {};
2
3 window.jetpackModules.models = ( function ( window, $, Backbone ) {
4 'use strict';
5
6 var models = {};
7
8 models.Modules = Backbone.Model.extend( {
9 visibles: {},
10
11 /**
12 * Applies the active availability, tag, state/purpose and search filters
13 * to the raw module set and returns the matching items (unsorted).
14 *
15 * @param {Object} [options] Filtering options.
16 * @param {boolean} [options.ignoreTag] When true, skip the "Show" tag
17 * facet so counts can be computed independently of the current tag
18 * selection (faceted counting).
19 * @param {boolean} [options.ignorePurpose] When true, skip the "Purpose"
20 * facet so its own faceted counts can be computed.
21 * @return {Array} Filtered module items.
22 */
23 apply_filters: function ( options ) {
24 options = options || {};
25
26 var subsubsub = $( '.subsubsub .current a' ),
27 purpose = $( '.purpose-filter .current a' ),
28 items = Object.values( this.get( 'raw' ) ),
29 m_availability = $( '.button-group.availability-filter .active' ),
30 m_search = $( '#srch-term-search-input' ).val().toLowerCase();
31
32 // Offline-mode top-level filter: when "Hide unavailable" is selected,
33 // drop every module that isn't available offline, regardless of the
34 // other filters below it.
35 if ( 'hide-unavailable' === m_availability.data( 'availability' ) ) {
36 items = items.filter( item => item.available );
37 }
38
39 // Tag facet ("Show"). Skipped when computing that facet's own counts.
40 if ( ! options.ignoreTag && ! subsubsub.closest( 'li' ).hasClass( 'all' ) ) {
41 items = items.filter( item => item.module_tags.includes( subsubsub.data( 'title' ) ) );
42 }
43
44 // Purpose facet. Skipped when computing that facet's own counts.
45 if (
46 ! options.ignorePurpose &&
47 purpose.length &&
48 ! purpose.closest( 'li' ).hasClass( 'all' )
49 ) {
50 items = items.filter( item => item.product_group === purpose.data( 'group' ) );
51 }
52
53 // State facet (segmented buttons). "All" carries no data-filter-by.
54 $( '.button-group.module-filter .active' ).each( function () {
55 var by = $( this ).data( 'filter-by' ),
56 value = $( this ).data( 'filter-value' );
57
58 if ( by ) {
59 items = items.filter( item => item[ by ] === value );
60 }
61 } );
62
63 if ( m_search.length ) {
64 items = items.filter( function ( item ) {
65 var search_text =
66 item.name +
67 ' ' +
68 item.description +
69 ' ' +
70 item.long_description +
71 ' ' +
72 item.search_terms +
73 ' ' +
74 item.module_tags;
75 return -1 !== search_text.toLowerCase().indexOf( m_search );
76 } );
77 }
78
79 return items;
80 },
81
82 /**
83 * Computes, for the "Show" tag list, how many modules match every active
84 * filter except the tag facet itself. This powers faceted counts that
85 * stay meaningful as the user narrows the other filters.
86 *
87 * @return {Object} Map of translated tag title to count, plus an
88 * `__all__` key holding the total across all tags.
89 */
90 tag_counts: function () {
91 var base = this.apply_filters( { ignoreTag: true } ),
92 counts = { __all__: base.length };
93
94 base.forEach( function ( item ) {
95 ( item.module_tags || [] ).forEach( function ( tag ) {
96 counts[ tag ] = ( counts[ tag ] || 0 ) + 1;
97 } );
98 } );
99
100 return counts;
101 },
102
103 /**
104 * Computes, for the "Purpose" list, how many modules fall in each product
105 * group under every active filter except the Purpose facet itself. Mirrors
106 * tag_counts() so the two facet lists behave identically.
107 *
108 * @return {Object} Map of product-group slug to count, plus an `__all__`
109 * key holding the total across all groups.
110 */
111 purpose_counts: function () {
112 var base = this.apply_filters( { ignorePurpose: true } ),
113 counts = { __all__: base.length };
114
115 base.forEach( function ( item ) {
116 if ( item.product_group ) {
117 counts[ item.product_group ] = ( counts[ item.product_group ] || 0 ) + 1;
118 }
119 } );
120
121 return counts;
122 },
123
124 /**
125 * Updates modules.items dataset to be a reflection of both the current
126 * modules.raw data, as well as any filters or sorting that may be in effect.
127 */
128 filter_and_sort: function () {
129 var items = this.apply_filters();
130
131 // Default alphabetical order by name. The product-group sort below is
132 // stable, so this ordering is preserved within each group.
133 items.sort( ( a, b ) => a.name.localeCompare( b.name ) );
134
135 // Group by product group (primary), then push unavailable modules to
136 // the end of their group. Any user-selected sort above is preserved
137 // within a group because Array.prototype.sort is stable in the
138 // browsers we support.
139 var groupOrder = { growth: 0, performance: 1, security: 2, other: 3 };
140 items.sort( function ( a, b ) {
141 var ga = groupOrder[ a.product_group ] !== undefined ? groupOrder[ a.product_group ] : 99;
142 var gb = groupOrder[ b.product_group ] !== undefined ? groupOrder[ b.product_group ] : 99;
143
144 if ( ga !== gb ) {
145 return ga - gb;
146 }
147
148 return ( b.available ? 1 : 0 ) - ( a.available ? 1 : 0 );
149 } );
150
151 // Now shove it back in.
152 this.set( 'items', items );
153
154 return this;
155 },
156
157 initialize: function () {
158 var items = this.get( 'items' );
159 this.set( 'raw', items );
160 },
161 } );
162
163 return models;
164 } )( window, jQuery, Backbone );
165