Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/external_auth/views/ProvidersController.js

/*
# templates/external_auth/views/ProvidersController.js         Copyright(c) 2020 cPanel, L.L.C.
#                                                               All rights reserved.
# copyright@cpanel.net                                             http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited
*/

/* global define: false */
/* jshint -W100 */

// Then load the application dependencies
define(
    [
        "angular",
        "lodash",
        "cjt/util/locale",
        "ngSanitize",
        "cjt/modules",
        "cjt/directives/toggleSortDirective",
        "cjt/directives/searchDirective",
        "cjt/directives/pageSizeDirective",
        "cjt/directives/toggleSwitchDirective",
        "cjt/filters/startFromFilter",
        "cjt/decorators/paginationDecorator",
        "app/services/ProvidersService",
    ],
    function(angular, _, LOCALE) {

        var app = angular.module("App");

        function ProviderController($scope, $filter, $location, ProvidersService, PAGE) {

            $scope.providers = [];

            // meta information
            $scope.meta = {

                // sort settings
                sortReverse: false,
                sortBy: "label",
                sortDirection: "asc",

                // pager settings
                maxPages: 5,
                totalItems: $scope.providers.length,
                currentPage: 1,
                pageSize: 20,
                pageSizes: [20, 50, 100, 500],
                start: 0,
                limit: 10,

                filterValue: "",
            };

            // initialize filter list
            $scope.filteredList = $scope.providers;
            $scope.showPager = true;

            $scope.get_service_column_label = function(service) {
                return LOCALE.maketext("Status ([_1])", service);
            };

            $scope.allowed_authentication_services = PAGE.allowed_authentication_services;

            /**
             * Initialize the variables required for
             * row selections in the table.
             */
            $scope.checkdropdownOpen = false;

            // This updates the selected tracker in the 'Selected' Badge.
            $scope.totalSelectedProviders = 0;
            var selectedProviderList = [];

            // update the table on sort
            $scope.sortList = function() {
                $scope.fetch();
            };

            // update table on pagination changes
            $scope.selectPage = function() {
                $scope.fetch();
            };

            // update table on page size changes
            $scope.selectPageSize = function() {
                $scope.fetch();
            };

            // Select all providers on a page.
            $scope.selectAllProviders = function() {
                if ($scope.allRowsSelected) {
                    $scope.filteredList.forEach(function(item) {
                        item.rowSelected = true;

                        if (selectedProviderList.indexOf(item.id) !== -1) {
                            return;
                        }

                        selectedProviderList.push(item.id);
                    });
                } else {

                    // Extract the unselected items and remove them from the selected collection.
                    var unselectedList = $scope.filteredList.map(function(item) {
                        item.rowSelected = false;
                        return item.id;
                    });

                    selectedProviderList = _.difference(selectedProviderList, unselectedList);
                }

                // Update the selected count tracker.
                $scope.totalSelectedProviders = selectedProviderList.length;
            };

            $scope.configureProvider = function(provider) {
                $location.path("/providers/" + provider.id);
            };

            // Select an provider on a page.
            $scope.selectProvider = function(providerInfo) {
                if (typeof providerInfo !== "undefined") {
                    if (providerInfo.rowSelected) {
                        selectedProviderList.push(providerInfo.id);

                        // Sync 'Select All' checkbox status when a new selction/unselection
                        // is made.
                        $scope.allRowsSelected = $scope.filteredList.every(function(item) {
                            return item.rowSelected;
                        });
                    } else {
                        selectedProviderList = selectedProviderList.filter(function(item) {
                            return item !== providerInfo.id;
                        });

                        // Unselect Select All checkbox.
                        $scope.allRowsSelected = false;
                    }
                }

                // Update the selected count tracker.
                $scope.totalSelectedProviders = selectedProviderList.length;
            };

            // Clear all selections by unchecking all checkboxes in all pages.
            $scope.clearAllSelections = function(event) {
                event.preventDefault();
                event.stopPropagation();

                selectedProviderList = [];
                $scope.filteredList.forEach(function(item) {
                    item.rowSelected = false;
                });

                $scope.checkdropdownOpen = false;
                $scope.allRowsSelected = false;
                $scope.totalSelectedProviders = 0;
            };

            // update table on search
            $scope.searchList = function() {
                $scope.fetch();
            };

            // have your filters all in one place - easy to use
            var filters = {
                filter: $filter("filter"),
                orderBy: $filter("orderBy"),
                startFrom: $filter("startFrom"),
                limitTo: $filter("limitTo")
            };

            // update table
            $scope.fetch = function() {
                var filteredList = [];

                // filter list based on search text
                if ($scope.meta.filterValue !== "") {
                    filteredList = filters.filter($scope.providers, $scope.meta.filterValue, false);
                } else {
                    filteredList = $scope.providers;
                }

                // sort the filtered list
                if ($scope.meta.sortDirection !== "" && $scope.meta.sortBy !== "") {
                    filteredList = filters.orderBy(filteredList, $scope.meta.sortBy, $scope.meta.sortDirection === "asc" ? true : false);
                }

                // update the total items after search
                $scope.meta.totalItems = filteredList.length;

                // filter list based on page size and pagination
                if ($scope.meta.totalItems > _.min($scope.meta.pageSizes)) {
                    var start = ($scope.meta.currentPage - 1) * $scope.meta.pageSize;
                    var limit = $scope.meta.pageSize;

                    filteredList = filters.limitTo(filters.startFrom(filteredList, start), limit);
                    $scope.showPager = true;

                    // table statistics
                    $scope.meta.start = start + 1;
                    $scope.meta.limit = start + filteredList.length;

                } else {

                    // hide pager and pagination
                    $scope.showPager = false;

                    if (filteredList.length === 0) {
                        $scope.meta.start = 0;
                    } else {

                        // table statistics
                        $scope.meta.start = 1;
                    }

                    $scope.meta.limit = filteredList.length;
                }

                var countNonSelected = 0;

                // Add rowSelected attribute to each item in the list to track selections.
                filteredList.forEach(function(item) {

                    // Select the rows if they were previously selected on this page.
                    if (selectedProviderList.indexOf(item.id) !== -1) {
                        item.rowSelected = true;
                    } else {
                        item.rowSelected = false;
                        countNonSelected++;
                    }
                });

                $scope.filteredList = filteredList;

                // Clear the 'Select All' checkbox if at least one row is not selected.
                $scope.allRowsSelected = (filteredList.length > 0) && (countNonSelected === 0);

                return filteredList;
            };

            $scope.init = function() {
                $scope.providers = ProvidersService.get_providers();
                $scope.fetch();
            };

            // first page load
            $scope.init();
        }
        ProviderController.$inject = ["$scope", "$filter", "$location", "ProvidersService", "PAGE"];
        app.controller("ProvidersController", ProviderController);


    });
Back to Directory File Manager