summaryrefslogtreecommitdiff
blob: d25f4ad5767a5d04dbf7f46c4eebdc79478c0156 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
this.jetpackModules = this.jetpackModules || {};

window.jetpackModules.models = ( function( window, $, _, Backbone ) {
	'use strict';

	var models = {};

	models.Modules = Backbone.Model.extend( {
		visibles: {},

		/**
		 * Updates modules.items dataset to be a reflection of both the current
		 * modules.raw data, as well as any filters or sorting that may be in effect.
		 */
		filter_and_sort: function() {
			var subsubsub = $( '.subsubsub .current' ),
				items = this.get( 'raw' ),
				m_filter = $( '.button-group.filter-active .active' ),
				m_sort = $( '.button-group.sort .active' ),
				m_search = $( '#srch-term-search-input' )
					.val()
					.toLowerCase(),
				groups;

			// If a module filter has been selected, filter it!
			if ( ! subsubsub.closest( 'li' ).hasClass( 'all' ) ) {
				items = _.filter( items, function( item ) {
					return _.contains( item.module_tags, subsubsub.data( 'title' ) );
				} );
			}

			if ( m_filter.data( 'filter-by' ) ) {
				items = _.filter( items, function( item ) {
					return item[ m_filter.data( 'filter-by' ) ] === m_filter.data( 'filter-value' );
				} );
			}

			if ( m_search.length ) {
				items = _.filter( items, function( item ) {
					var search_text =
						item.name +
						' ' +
						item.description +
						' ' +
						item.long_description +
						' ' +
						item.search_terms +
						' ' +
						item.jumpstart_desc +
						' ' +
						item.module_tags;
					return -1 !== search_text.toLowerCase().indexOf( m_search );
				} );
			}

			if ( m_sort.data( 'sort-by' ) ) {
				items = _.sortBy( items, m_sort.data( 'sort-by' ) );
				if ( 'reverse' === m_sort.data( 'sort-order' ) ) {
					items.reverse();
				}
			}

			// Sort unavailable modules to the end if the user is running in local mode.
			groups = _.groupBy( items, 'available' );
			if ( _.has( groups, 'false' ) ) {
				items = [].concat( groups[ true ], groups[ false ] );
			}

			// Now shove it back in.
			this.set( 'items', items );

			return this;
		},

		initialize: function() {
			var items = this.get( 'items' );
			this.set( 'raw', items );
		},
	} );

	return models;
} )( this, jQuery, _, Backbone );