Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/contact_manager/index.cmb.js

/*
# templates/contact_manager/filters/notificationFilter.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 */

define(
    'app/filters/notificationFilter',[
        "angular"
    ],
    function(angular) {

        // Retrieve the current application
        var app;
        try {
            app = angular.module("App"); // For runtime
        } catch (e) {
            app = angular.module("App", []); // Fall-back for unit testing
        }

        /**
         * Filter for display_name or system_name of a given notification.
         * @param  {onject} item
         * @return {array}
         */
        app.filter("notificationFilter", function() {
            return function(notifications, filterText) {
                if (!filterText) {
                    return notifications;
                }
                var filteredNotifications = [];
                filterText = filterText.toLocaleLowerCase();
                angular.forEach(notifications, function(notification) {
                    var system_name = notification.system_name.toLocaleLowerCase();
                    var display_name = notification.display_name.toLocaleLowerCase();

                    if (system_name.indexOf(filterText) !== -1) {
                        filteredNotifications.push(notification);
                    } else if (display_name.indexOf(filterText) !== -1) {
                        filteredNotifications.push(notification);
                    }
                });

                return filteredNotifications;
            };
        });

        /**
         * Filter for services associated with a notification
         * @param  {onject} item
         * @return {array}
         */
        app.filter("notificationServiceFilter", function() {
            return function(services, notificationImportance) {
                if (typeof notificationImportance === "undefined") {
                    return services;
                }
                var filteredServices = [];
                angular.forEach(services, function(service) {
                    var service_level = Number(service.level);
                    if ( Number(notificationImportance) !== 0 && service_level !== 0 && service_level >= notificationImportance ) {
                        filteredServices.push(service);
                    }
                });

                return filteredServices;
            };
        });
    }
);

/*
# templates/contact_manager/filters/splitOnComma.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 */

define(
    'app/filters/splitOnComma',[
        "angular"
    ],
    function(angular) {

        // Retrieve the current application
        var app;
        try {
            app = angular.module("App"); // For runtime
        } catch (e) {
            app = angular.module("App", []); // Fall-back for unit testing
        }

        /**
         * Filter to split comma delimited strings
         * @param  {string} input
         * @param  {number} limit
         * @return {array}
         */
        app.filter("splitOnComma", function() {
            return function(input, limit) {

                // If it's not a string we got an array somehow, lets punt it back
                if (typeof input !== "string" ) {
                    return input;
                }

                // If no comma, lets also punt it
                var commaRegex = new RegExp(",");
                if (!commaRegex.test(input)) {
                    return [input];
                }

                // We use 5 as a default since this will give 3 + message about more listed
                limit = limit || 5;

                // This assume we are using a comma delimited list, this will break if strings with commas are valid
                var items = input.split(",");

                if ( items.length < limit ) {
                    return items;
                } else {

                    // If the limit is 5 we want to always use 4 or less lines, since the message takes up one
                    // this means we do limit-2
                    var newItems = items.slice(0, limit - 2);
                    newItems.push(LOCALE.maketext(" … and [numf,_1] more", (items.length - (limit - 2))));

                    return newItems;
                }
            };
        });

        /**
         * Filter to split comma delimited strings for title attribute
         * @param  {string} input
         * @return {string}
         */
        app.filter("splitOnCommaForTitle", function() {
            return function(input) {

                // If it's not a string we got an array somehow, lets punt it back
                if (typeof input !== "string" ) {
                    return input;
                }

                // If no comma, lets also punt it
                var commaRegex = new RegExp(",");
                if (!commaRegex.test(input)) {
                    return input;
                }

                var items = input.split(",");
                return items.join(",\n");
            };
        });
    }
);

/*
# templates/contact_manager/services/VerifyNotificationService.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 */

define(
    'app/services/verifyNotificationService',[

        // Libraries
        "angular",

        // CJT
        "cjt/io/api",
        "cjt/io/whm-v1-request",
        "cjt/io/whm-v1",

        // Angular components
        "cjt/services/APIService"
    ],
    function(angular, API, APIREQUEST) {

        // Constants
        var NO_MODULE = "";

        // Fetch the current application
        var app;

        try {
            app = angular.module("App"); // For runtime
        } catch (e) {
            app = angular.module("App", ["cjt2.services.api"]); // Fall-back for unit testing
        }


        app.factory("verifyNotificationService", ["$q", "APIService",
            function($q, APIService) {

                // Set up the service's constructor and parent
                var BaseService = function() {};
                BaseService.prototype = new APIService();

                // Extend the prototype with any class-specific functionality
                angular.extend(BaseService.prototype, {

                    /**
                     * get forward location for provided user
                     *
                     * @method
                     * @param  {String}
                     * @return {Promise} Promise that will fulfill the request.
                     */
                    verify_service: function(verification_api) {
                        var apiCall = new APIREQUEST.Class();
                        apiCall.initialize(NO_MODULE, verification_api);

                        var deferred = this.deferred(apiCall);

                        // pass the promise back to the controller
                        return deferred.promise;
                    },
                });

                return new BaseService();
            }
        ]);
    }
);

/*
# templates/contact_manager/services/indexService.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 */


define(
    'app/services/indexService',[

        // Libraries
        "angular",
        "cjt/io/whm-v1-request",
        "cjt/services/APICatcher",
    ],
    function(angular, APIREQUEST) {

        var app = angular.module("whm.contactManager.indexService", ["cjt2.services.apicatcher"]);

        var NO_MODULE = "";

        function indexServiceFactory(PAGE, api) {
            var indexService = {};

            /**
             * Create a User Session to transfer to cPanel
             *
             * @method createUserSession
             *
             * @return {Promise.<string,Error>} returns the string url to redirect to
             *
             */

            indexService.createUserSession = function() {

                var apicall = new APIREQUEST.Class().initialize(
                    NO_MODULE,
                    "create_user_session",
                    {
                        "user": PAGE.REMOTE_USER,
                        "service": "cpaneld",
                        "app": "ContactInfo_Change"
                    }
                );

                return api.promise(apicall).then(function(result) {
                    return result.data.url;
                });
            };

            return indexService;
        }

        indexServiceFactory.$inject = ["PAGE", "APICatcher"];
        return app.factory("indexService", indexServiceFactory);
    });

/*
# templates/contact_manager/controllers/MainController.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 -W003 */

define(
    'app/controllers/mainController',[
        "angular",
        "lodash",
        "cjt/util/locale",
        "app/filters/notificationFilter",
        "app/filters/splitOnComma",
        "app/services/verifyNotificationService",
        "app/services/indexService",
        "cjt/directives/spinnerDirective",
    ],
    function(angular, _, LOCALE) {

        var app;
        try {
            app = angular.module("App"); // For runtime
            app.value("PAGE", window.app.PAGE);
            app.value("LOCALE", LOCALE);
            app.value("_", _);
        } catch (e) {
            app = angular.module("App", []); // Fall-back for unit testing
        }

        var MainController = function($scope, $filter, $window, PAGE, growl, verifyNotificationService, indexService, LOCALE, spinnerAPI, _) {
            var _this = this;
            var orderBy = $filter("orderBy");
            var notificationFilter = $filter("notificationFilter");

            _this.filteredNotifications = [];
            _this.selectedNotifications = [];

            _this.PAGE = PAGE;
            _this.meta = {
                current_sort_key: "importance",
                reverse_sort: false,
                search_key: "",
            };

            if ( _this.PAGE["event"] ) {
                _this.meta.search_key = _this.PAGE["event"];
                _this.show_notifications = true;
            }

            _this.locale = LOCALE;

            _this.will_verify = false;

            for (var x = 0; x < PAGE.contactmethods.length; x++ ) {
                if (PAGE.contactmethods[x].verification_api && PAGE.contactmethods[x].contact) {
                    _this.will_verify = true;
                    break;
                }
            }

            _this.orderNotifications = function(key) {
                if (_this.meta.current_sort_key === key) {
                    _this.meta.reverse_sort = !_this.meta.reverse_sort;
                } else {
                    _this.meta.reverse_sort = 0;
                    _this.meta.current_sort_key = key;
                }

                _this.updateFilteredNotifications();
            };

            /**
             * Creates a cPanel session and then redirects to it in a new window
             *
             * @method loginTocPanel
             *
             */

            _this.loginTocPanel = function() {
                return indexService.createUserSession().then(function(loginUrl) {
                    if (!$window.open(loginUrl, "_blank")) {
                        growl.success(LOCALE.maketext("Click to continue as the “[_1]” user and modify the [asis,cPanel] notification settings.", _.escape(PAGE.REMOTE_USER)), {
                            ttl: -1,
                            variables: {
                                buttonLabel: LOCALE.maketext("Go to [asis,cPanel]"),
                                showAction: true,
                                action: function() {
                                    $window.open(loginUrl);
                                }
                            }
                        });
                    }
                });
            };

            _this.updateFilteredNotifications = function() {
                _this.filteredNotifications = orderBy(notificationFilter(_this.PAGE.notifications, _this.meta.search_key), _this.meta.current_sort_key, _this.meta.reverse_sort);
            };

            _this.verify_service = function(contactMethod) {
                contactMethod.verifying = true;

                spinnerAPI.start(contactMethod.system_name + "-spinner");

                // verify_{{contactMethod.system_name}}
                return verifyNotificationService.verify_service(contactMethod.verification_api)
                    .then(function(results) {

                        // Handle the multiple returns from pushbullet(may be used by multiple other services later)
                        if (results.data && results.data.length) {
                            angular.forEach(results.data, function(o) {
                                if (o.result.error) {
                                    growl.error(_this.locale.maketext("The system was unable to send the [_1] notification to “[_2]” because of the following error: [_3]", _.escape(contactMethod.display_name), _.escape((o.url || o.access_token)), _.escape(o.result.error)));
                                } else {
                                    growl.success(_this.locale.maketext("The system sent the [_1] notification message “[_2]” successfully to “[_3]”.", _.escape(contactMethod.display_name), _.escape(o.result.message_id), _.escape((o.url || o.access_token))));
                                }
                            });
                        } else { // if not passing back an array but instead just simple success
                            growl.success(_this.locale.maketext("The system sent the [_1] notification message “[_2]” successfully.", _.escape(contactMethod.display_name), _.escape(results.data.message_id)));
                        }
                    }, function(error) {
                        growl.error(_this.locale.maketext("The system was unable to send the [_1] notification because of the following error: [_2]", _.escape(contactMethod.display_name), _.escape(error)));
                    }).finally(function() {
                        contactMethod.verifying = false;
                        spinnerAPI.stop(contactMethod.system_name + "-spinner");
                    });
            };

            _this.orderNotifications("display_name");

            $scope.$watch(function() {
                return _this.filteredNotifications;
            }, function(newVal) {
                _this.selectedNotifications = $filter("filter")(newVal, {
                    selected: true
                });
            }, true);

            return _this;
        };

        MainController.prototype.setSelected = function(dataset, selected) {
            angular.forEach(dataset, function(o) {
                o.selected = selected;
            });
        };

        MainController.prototype.setLevel = function(dataset, level) {
            angular.forEach(dataset, function(o) {
                if (!o.disabled ) {
                    o.importance = level.toString();
                }
            });
        };

        MainController.prototype.selectedHeaderClass = function(column, tableMeta) {
            var className = "icon-arrow-" + (tableMeta.reverse_sort ? "down" : "up");
            return column === tableMeta.current_sort_key && className;
        };


        MainController.$inject = ["$scope", "$filter", "$window", "PAGE", "growl", "verifyNotificationService", "indexService", "LOCALE", "spinnerAPI", "_"];
        var controller = app.controller("MainController", MainController);

        return controller;
    }
);

/*
# templates/contact_manager/directives/indeterminate.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 */

define(
    'app/directives/indeterminate',[
        "angular"
    ],
    function(angular) {

        // Retrieve the current application
        var app;
        try {
            app = angular.module("App"); // For runtime
        } catch (e) {
            app = angular.module("App", []); // Fall-back for unit testing
        }

        /**
         * Angular directive that when attached to a checkbox will set indeterminate based on the passed in value.
         * This is sugar since we cannot set this attribute in HTML directly.
         */
        app.directive("cpIndeterminate", [

            function() {
                return {
                    restrict: "A",
                    scope: {
                        cpIndeterminate: "@",
                    },

                    link: function(scope, elem) {
                        scope.$watch("cpIndeterminate", function(newVal) {
                            var booleanVal = false;
                            if (newVal === "true") {
                                booleanVal = true;
                            }
                            elem.prop("indeterminate", booleanVal);
                        });

                    }
                };
            }
        ]);
    }
);

/*
# templates/contact_manager/index.js                 Copyright 2022 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 require:false, define:false */

define(
    'app/index',[
        "angular",
        "cjt/core",
        "uiBootstrap",
        "cjt/directives/searchDirective",
        "cjt/modules",
        "cjt/decorators/growlDecorator",
    ],
    function(angular, CJT) {
        "use strict";

        return function() {
            angular.module("App", [
                "cjt2.config.whm.configProvider", // This needs to load first
                "ui.bootstrap",
                "cjt2.directives.search",
                "cjt2.whm",
                "angular-growl",
                "whm.contactManager.indexService"
            ]);

            var app = require(
                [
                    "cjt/bootstrap",

                    // Application Modules
                    "app/controllers/mainController",
                    "app/directives/indeterminate",
                ], function(BOOTSTRAP) {

                    BOOTSTRAP(document);

                });

            return app;
        };
    }
);

Back to Directory File Manager