jetpack-modules.models.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. this.jetpackModules = this.jetpackModules || {};
  2. window.jetpackModules.models = (function( window, $, _, Backbone ) {
  3. 'use strict';
  4. var models = {};
  5. models.Modules = Backbone.Model.extend({
  6. visibles : {},
  7. /**
  8. * Updates modules.items dataset to be a reflection of both the current
  9. * modules.raw data, as well as any filters or sorting that may be in effect.
  10. */
  11. filter_and_sort : function() {
  12. var subsubsub = $('.subsubsub .current'),
  13. items = this.get( 'raw' ),
  14. m_filter = $('.button-group.filter-active .active'),
  15. m_sort = $('.button-group.sort .active'),
  16. m_search = $('#srch-term-search-input').val().toLowerCase(),
  17. groups;
  18. // If a module filter has been selected, filter it!
  19. if ( ! subsubsub.closest('li').hasClass( 'all' ) ) {
  20. items = _.filter( items, function( item ) {
  21. return _.contains( item.module_tags, subsubsub.data( 'title' ) );
  22. } );
  23. }
  24. if ( m_filter.data('filter-by') ) {
  25. items = _.filter( items, function( item ) {
  26. return item[ m_filter.data('filter-by') ] === m_filter.data('filter-value');
  27. } );
  28. }
  29. if ( m_search.length ) {
  30. items = _.filter( items, function( item ) {
  31. var search_text = item.name + ' ' + item.description + ' ' + item.long_description + ' ' + item.search_terms + ' ' + item.jumpstart_desc + ' ' + item.module_tags;
  32. return ( -1 !== search_text.toLowerCase().indexOf( m_search ) );
  33. } );
  34. }
  35. if ( m_sort.data('sort-by') ) {
  36. items = _.sortBy( items, m_sort.data('sort-by') );
  37. if ( 'reverse' === m_sort.data('sort-order') ) {
  38. items.reverse();
  39. }
  40. }
  41. // Sort unavailable modules to the end if the user is running in local mode.
  42. groups = _.groupBy( items, 'available' );
  43. if ( _.has( groups, 'false' ) ) {
  44. items = [].concat( groups[true], groups[false] );
  45. }
  46. // Now shove it back in.
  47. this.set( 'items', items );
  48. return this;
  49. },
  50. initialize : function() {
  51. var items = this.get( 'items' );
  52. this.set( 'raw', items );
  53. }
  54. });
  55. return models;
  56. })( this, jQuery, _, Backbone );