Source: fedramp.components/agencies-grid.component.js

(function () {
    'use strict';

    angular
        .module('fedramp.components')
        .component('agenciesGrid', {
            templateUrl: 'templates/components/agencies-grid.html',
            controller: AgenciesGrid,
            controllerAs: 'controller',
            bindings: {
                rawItems: '<?',
                onUpdate: '&?'
            }
        });

    AgenciesGrid.$inject = ['$log', 'fedrampData', '$attrs'];

    /**
     * @constructor
     * @memberof Components
     */
    function AgenciesGrid ($log, fedrampData, $attrs) {
        var self = this;

        /**
         * The filtered data
         * @member {array}
         * @memberof Components.AgenciesGrid
         */
        self.filteredData = [];

        /**
         * The agencies
         * @member {array}
         * @memberof Components.AgenciesGrid
         */
        self.agencies = self.rawItems || fedrampData.agencies();

        /**
         * Event reciever for when the grid is updated.
         * @public
         * @member {object}
         * @memberof Components.AgenciesGrid
         *
         * @param {array} items
         *  Array of items with filtering and sorting applied.
         */
        self.onUpdate = function (func) {
            return function (items, state) {
                self.filteredData = items;
                if (func) {
                    func({items: items});
                }
            };
        }(self.onUpdate);

        /**
         * Flag to hide filters
         */
        self.hideFilters = angular.isDefined($attrs.hideFilters) ? $attrs.hideFilters : false;

        /**
         * Flag to toggle filters on mobile
         */
        self.toggleFilters = false;

        /**
         * Determine the options available for filtering the reuse metric
         * @public
         * @member {object}
         * @memberof Components.AgenciesGrid
         *
         * @param {array} products
         *  Array of items available
         *
         * @returns
         *  An array of option values for filtering
         */
        self.reuseRangeOptions = function (agencies) {
            return [
                {value: {min: 0, max:5}, label: '0 - 5', selected: false},
                {value: {min: 6, max:10}, label: '5 - 10', selected:false},
                {value: {min: 11, max:1000}, label: '> 10', selected:false}];
        };

        /**
         * Filter the data set by the reuse metric
         * @public
         * @member {object}
         * @memberof Controllers.AgenciesController
         *
         * @param {object} agency
         *  The agency to compare
         * @param {integer} index
         *  The current index within the array of items
         * @param {array} arr
         *  Array of items
         * @param {array} selectedOptions
         *  Array of selected options
         *
         * @returns
         *  The matched item or null
         */
        self.reuseRangeFilter = function (agency, index, arr, selectedOptions) {
            return selectedOptions.find(function (option) {
                if (agency.products.length >= option.value.min && agency.products.length <= option.value.max) {
                    return agency;
                }
            });
        };
    }
})();