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

(function () {
    'use strict';

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

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

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

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

        /**
         * The assessors
         * @member {array}
         * @memberof Components.AssessorsGrid
         */
        self.assessors = gridFilter(self.rawItems || fedrampData.assessors());

        /**
         * Event reciever for when the grid is updated.
         * @public
         * @member {object}
         * @memberof Components.AssessorsGrid
         *
         * @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.AssessorsGrid
         *
         * @param {array} products
         *  Array of items available
         *
         * @returns
         *  An array of option values for filtering
         */
        self.reuseRangeOptions = function (assessors) {
            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.AssessorsController
         *
         * @param {object} assessor
         *  The assessor 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 (assessor, index, arr, selectedOptions) {
            return selectedOptions.find(function (option) {
                if (assessor.reuses >= option.value.min && assessor.reuses <= option.value.max) {
                    return option;
                }
            });
        };

        /**
         * Filter the data set by the accredited vendors
         * @private
         * @member {object}
         * @memberof Controllers.AssessorsController
         *
         * @param {object} assessors
         *  The items to compare
         *
         * @returns
         *  A pre-filtered array of items to use in the grid
         */
        function gridFilter (assessors) {
            if (!assessors || assessors.length === 0) {
                return [];
            }
            return assessors.filter(x => x.accreditationDate);
        }
    }
})();