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

/*
# services/pageDataService.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/pageDataService',[
        "angular"
    ],
    function(angular) {

        // Fetch the current application
        var app = angular.module("App");

        /**
         * Setup the domainlist models API service
         */
        app.factory("pageDataService", [ function() {

            return {

                /**
                 * Helper method to remodel the default data passed from the backend
                 * @param  {Object} defaults - Defaults object passed from the backend
                 * @return {Object}
                 */
                prepareDefaultInfo: function(defaults) {
                    defaults.security_token = defaults.security_token || "";
                    defaults.addon_domains = defaults.addon_domains || [];
                    defaults.username_restrictions = defaults.username_restrictions || {};
                    defaults.username_restrictions.maxLength = Number(defaults.username_restrictions.maxLength) || 16;
                    return defaults;
                }

            };
        }]);
    }
);

/*
# templates/convert_addon_to_account/services/ConvertAddonData.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/ConvertAddonData',[
        "angular",
        "jquery",
        "lodash",
        "cjt/util/locale",
        "cjt/util/parse",
        "cjt/io/api",
        "cjt/io/whm-v1-request",
        "cjt/io/whm-v1" // IMPORTANT: Load the driver so it's ready
    ],
    function(angular, $, _, LOCALE, PARSE, API, APIREQUEST, APIDRIVER) {

        // Retrieve the current application
        var app = angular.module("App");

        var convertAddonData = app.factory("ConvertAddonData", ["$q", "defaultInfo", function($q, defaultInfo) {

            var addonData = {};

            addonData.domains = [];
            var default_options = {
                "email-accounts": true,
                "autoresponders": true,
                "email-forwarders": true,
                "docroot": true,
                "preserve-ownership": true,
                "custom-dns-records": true,
                "mysql_dbs": [],
                "mysql_users": [],
                "db_move_type": "move",
                "custom-vhost-includes": true,
                "copy-installed-ssl-cert": true,
                "ftp-accounts": true,
                "webdisk-accounts": true
            };

            function _getAddonData(domain) {
                var data = addonData.domains.filter(function(domain_data) {
                    return domain === domain_data.addon_domain;
                });
                return (data.length) ? data[0] : {};
            }

            /**
             * Fetch the addon domain
             *
             * @method getAddonDomain
             * @param {string} addonDomain - the addon domain you want to get
             * @returns A Promise that resolves to an object for the addon domain
             */
            addonData.getAddonDomain = function(addonDomain) {

                // If the domains data is empty, then we should fetch the data first
                if (addonData.domains.length === 0) {
                    return $q.when(addonData.loadList())
                        .then(function(result) {
                            return _getAddonData(addonDomain);
                        });
                } else {
                    return $q.when(_getAddonData(addonDomain));
                }
            };

            addonData.getAddonDomainDetails = function(addonDomain) {

                // if we already fetched the details previously, shortcircuit this api call
                var found = _getAddonData(addonDomain);
                if (Object.keys(found).length > 1 && Object.keys(found.details).length > 1) {
                    return $q.when(found);
                } else {
                    var apiCall = new APIREQUEST.Class();
                    apiCall.initialize("", "convert_addon_fetch_domain_details");
                    apiCall.addArgument("domain", addonDomain);

                    return $q.when(API.promise(apiCall.getRunArguments()))
                        .then(function(response) {
                            response = response.parsedResponse;

                            // update this addon domain in the data structure
                            // with the details
                            return addonData.getAddonDomain(addonDomain)
                                .then(function(result) {
                                    if (response.data !== null) {
                                        angular.extend(result.details, response.data);

                                        // if the addon domain has no options, initialize it with some
                                        if (Object.keys(result.move_options).length === 0) {
                                            angular.extend(result.move_options, default_options);
                                        }
                                    }

                                    return result;
                                });
                        })
                        .catch(function(response) {
                            response = response.parsedResponse;
                            return response.error;
                        });
                }
            };

            addonData.convertDomainObjectToList = function(domainObject) {
                addonData.domains = Object.keys(domainObject).map(function(domainName) {
                    var domainDetail = domainObject[domainName];
                    domainDetail.addon_domain = domainName;
                    domainDetail.details = {};
                    domainDetail.move_options = {};
                    domainDetail.account_settings = {};
                    return domainDetail;
                });
            };

            addonData.loadList = function() {
                var deferred = $q.defer();

                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "convert_addon_list_addon_domains");

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {

                        // create items from the response
                        response = response.parsedResponse;
                        if (response.status) {
                            addonData.convertDomainObjectToList(response.data);
                            deferred.resolve(addonData.domains);
                        } else {

                            // pass the error along
                            deferred.reject(response.error);
                        }
                    });

                // pass the promise back to the controller

                return deferred.promise;
            };

            addonData.beginConversion = function(addon) {
                var i, len;
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "convert_addon_initiate_conversion");

                for (var setting in addon.account_settings) {
                    if (addon.account_settings.hasOwnProperty(setting)) {
                        apiCall.addArgument(setting, addon.account_settings[setting]);
                    }
                }

                for (var service in addon.move_options) {
                    if (addon.move_options.hasOwnProperty(service)) {

                        // ignore this value
                        if (service === "db_move_type") {
                            continue;
                        }

                        if (service === "mysql_dbs") {
                            for (i = 0, len = addon.move_options[service].length; i < len; i++) {
                                if (addon.move_options.db_move_type === "copy") {
                                    apiCall.addArgument("copymysqldb-" + addon.move_options[service][i].name,
                                        addon.move_options[service][i].new_name);
                                } else {
                                    apiCall.addArgument("movemysqldb-" + i, addon.move_options[service][i].name);
                                }
                            }
                        } else if (service === "mysql_users" && addon.move_options.db_move_type === "move") {
                            for (i = 0, len = addon.move_options[service].length; i < len; i++) {
                                apiCall.addArgument("movemysqluser-" + i, addon.move_options[service][i].name);
                            }
                        } else {

                            // The backend expects boolean options to use 1 or 0
                            if (_.isBoolean(addon.move_options[service])) {
                                apiCall.addArgument(service, (addon.move_options[service]) ? 1 : 0);
                            } else {
                                apiCall.addArgument(service, addon.move_options[service]);
                            }
                        }
                    }
                }

                return $q.when(API.promise(apiCall.getRunArguments()))
                    .then(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            return response.data;
                        } else {
                            return $q.reject(response.meta);
                        }
                    });
            };

            addonData.init = function() {
                addonData.convertDomainObjectToList(defaultInfo.addon_domains);
            };

            addonData.init();

            return addonData;
        }]);

        return convertAddonData;
    }
);

/*
# convert_addon_to_account/services/Databases.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/Databases',[
        "angular",
        "jquery",
        "lodash",
        "cjt/util/locale",
        "cjt/util/parse",
        "cjt/io/api",
        "cjt/io/whm-v1-request",
        "cjt/io/whm-v1" // IMPORTANT: Load the driver so it's ready
    ],
    function(angular, $, _, LOCALE, PARSE, API, APIREQUEST, APIDRIVER) {

        // Retrieve the current application
        var app = angular.module("App");

        var databasesFactory = app.factory("Databases", ["$q", function($q) {

            var db = {};

            db.databases = {};
            db.users = {};
            db.currentOwner = "";

            var uses_prefixing;
            var mysql_version;
            var prefix_length;

            // these are functions that exist in the old cjt/sql.js
            var verify_func_name = {
                mysql: {
                    database: "verify_mysql_database_name"
                },
                postgresql: {
                    database: "verify_postgresql_database_name"
                }
            };

            db.setPrefixing = function(option) {
                uses_prefixing = option;
            };

            db.isPrefixingEnabled = function() {
                return uses_prefixing;
            };

            db.setMySQLVersion = function(version) {
                mysql_version = version;

                // this has to be exported for the old cjt/sql.js to work correctly
                window.MYSQL_SERVER_VERSION = mysql_version;
            };

            db.getMySQLVersion = function() {
                return mysql_version;
            };

            db.setPrefixLength = function(length) {
                prefix_length = length;
            };

            db.getPrefixLength = function() {
                return prefix_length;
            };

            db.createPrefix = function(user) {

                /*
                 * Transfers and some older accounts might have underscores or periods
                 * in the cpusername. For historical reasons, the account's "main" database
                 * username always strips these characters out.
                 * In 99% of cases, this function is a no-op.
                 */
                var username = user.replace(/[_.]/, "");

                var prefixLength = db.getPrefixLength();
                return username.substr(0, prefixLength) + "_";
            };

            db.addPrefix = function(database, user) {
                return db.createPrefix(user) + database;
            };

            db.addPrefixIfNeeded = function(database, user) {
                if (database === void 0 || database === "") {
                    return;
                }

                var prefix = db.createPrefix(user);
                var prefix_regex = new RegExp("^" + prefix + ".+$");

                // if the db already has a prefix, just return it
                if (prefix_regex.test(database)) {
                    return database;
                }

                // else, return the database with the prefix
                return prefix + database;
            };

            /**
             * Transform the data from the API call into a
             * map of users and their corresponding databases.
             *
             * @method createUsersDictionary
             * @param {Object} data - the data returned from the
             * list_mysql_databases_and_users API call
             * return {Object} an object where the keys are db users and values are
             * their associated databases.
             */
            function createUsersDictionary(data) {
                var usersObj = {};
                var user = "";
                var dbs = data.mysql_databases;

                for (var database in dbs) {
                    if (dbs.hasOwnProperty(database)) {
                        for (var i = 0, len = dbs[database].length; i < len; i++) {
                            user = dbs[database][i];
                            if (usersObj.hasOwnProperty(user)) {
                                usersObj[user].push(database);

                            } else {
                                usersObj[user] = [database];
                            }
                        }
                    }
                }

                return usersObj;
            }

            db.listMysqlDbsAndUsers = function(owner) {
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "list_mysql_databases_and_users");
                apiCall.addArgument("user", owner);

                return $q.when(API.promise(apiCall.getRunArguments()))
                    .then(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            db.setPrefixing(PARSE.parsePerlBoolean(response.data.mysql_config.use_db_prefix));
                            db.setPrefixLength(response.data.mysql_config.prefix_length);
                            db.setMySQLVersion(response.data.mysql_config["mysql-version"]);
                            db.databases = response.data.mysql_databases;
                            db.users = createUsersDictionary(response.data);
                        } else {
                            return $q.reject(response.meta);
                        }
                    });
            };

            /**
             * Get the databases from the service. This will call the API
             * if there are no databases stored in the service.
             *
             * @method getDatabases
             * @param {String} owner - the owner of the databases
             * @return {Promise} a promise that resolves to a dictionary of databases for the owner
             */
            db.getDatabases = function(owner) {
                if (Object.keys(db.databases).length > 0 && db.currentOwner === owner) {
                    return $q.when(db.databases);
                } else {
                    return db.listMysqlDbsAndUsers(owner)
                        .then(function() {
                            db.currentOwner = owner;
                            return db.databases;
                        });
                }
            };

            /**
             * Get the users from the service.
             *
             * @method getUsers
             * @return {Object} a dictionary of mysql users
             */
            db.getUsers = function() {
                return db.users;
            };

            db.validateName = function(name, engine) {
                return CPANEL.sql[verify_func_name[engine]["database"]](name);
            };

            return db;
        }]);

        return databasesFactory;
    }
);

/*
# convert_addon_to_account/services/account_packages.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/account_packages',[
        "angular",
        "jquery",
        "lodash",
        "cjt/util/locale",
        "cjt/util/parse",
        "cjt/io/api",
        "cjt/io/whm-v1-request",
        "cjt/io/whm-v1" // IMPORTANT: Load the driver so it's ready
    ],
    function(angular, $, _, LOCALE, PARSE, API, APIREQUEST, APIDRIVER) {

        // Retrieve the current application
        var app = angular.module("App");

        var packagesFactory = app.factory("AccountPackages", ["$q", function($q) {

            var pkg = {};

            pkg.packages = [];

            /**
             * Fetch the list of packages from the listpkgs API call.
             *
             * @method listPackages
             * return {Promise} a promise that on success, returns an array of packages
             * and on error, an error object.
             */
            pkg.listPackages = function() {
                if (pkg.packages.length > 0) {
                    return $q.when(pkg.packages);
                } else {
                    var apiCall = new APIREQUEST.Class();
                    apiCall.initialize("", "listpkgs");

                    return $q.when(API.promise(apiCall.getRunArguments()))
                        .then(function(response) {
                            response = response.parsedResponse;
                            if (response.status) {
                                pkg.packages = response.data;
                                return pkg.packages;
                            } else {
                                return $q.reject(response.meta);
                            }
                        });
                }
            };

            return pkg;
        }]);

        return packagesFactory;
    }
);

/*
# convert_addon_to_account/services/conversion_history.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/conversion_history',[
        "angular",
        "lodash",
        "cjt/util/locale",
        "cjt/util/parse",
        "cjt/io/api",
        "cjt/io/whm-v1-request",
        "cjt/io/whm-v1"
    ],
    function(angular, _, LOCALE, PARSE, API, APIREQUEST, APIDRIVER) {

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

        var conversionHistory = app.factory("ConversionHistory", ["$q", function($q) {

            var store = {};
            store.conversions = [];

            /**
             * Gets the details for a conversion
             *
             * @method getDetails
             * @param {Number} job_id - The job id of the desired conversion.
             * @return {Object} An object consisting of conversion details and steps.
             */

            store.getDetails = function(job_id) {

                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "convert_addon_fetch_conversion_details");
                apiCall.addArgument("job_id", job_id);

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response.data);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            /**
             * Gets the current status for a conversion
             *
             * @method getJobStatus
             * @param {Number} job_ids - An array job ids of the desired conversions.
             * @return {Object} An object consisting of status information
             */

            store.getJobStatus = function(job_ids) {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "convert_addon_get_conversion_status");
                var jobIdCount = job_ids.length;
                var i = 0;

                for (; i < jobIdCount; i++) {
                    apiCall.addArgument("job_id" + "-" + i, job_ids[i]);
                }

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            deferred.resolve(response.data);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            /**
             * Fetches all the conversion jobs
             *
             * @method load
             * @return {Array} An arrary of conversion jobs.
             */
            store.load = function() {
                var deferred = $q.defer();
                var apiCall = new APIREQUEST.Class();
                apiCall.initialize("", "convert_addon_list_conversions");

                API.promise(apiCall.getRunArguments())
                    .done(function(response) {
                        response = response.parsedResponse;
                        if (response.status) {
                            store.conversions = response.data;
                            deferred.resolve(store.conversions);
                        } else {
                            deferred.reject(response.error);
                        }
                    });

                return deferred.promise;
            };

            return store;
        }]);

        return conversionHistory;
    }
);

/*
# convert_addon_to_account/filters/local_datetime_filter.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/local_datetime_filter',["angular", "cjt/util/locale"], function(angular, LOCALE) {

    var app = angular.module("App");
    app.filter("local_datetime", function() {
        return function(input) {
            if (input === void 0 || input === null || input === "") {
                return "";
            }

            if (typeof input !== "number") {
                input = Number(input);
            }

            return LOCALE.local_datetime(input, "datetime_format_medium");
        };
    });

});

/*
# views/main.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/views/main',[
        "angular",
        "cjt/util/locale",
        "lodash",
        "uiBootstrap",
        "cjt/decorators/growlDecorator",
        "cjt/directives/searchDirective",
        "app/services/ConvertAddonData"
    ],
    function(angular, LOCALE, _) {

        // Retrieve the current application
        var app = angular.module("App");

        var controller = app.controller(
            "mainController",
            ["$anchorScroll", "$location", "growl", "ConvertAddonData",
                function($anchorScroll, $location, growl, ConvertAddonData) {

                    var main = this;

                    main.allDomains = [];
                    main.loadingDomains = false;

                    main.meta = {
                        sortDirection: "asc",
                        sortBy: "domain",
                        sortType: "",
                        sortReverse: false,
                        maxPages: 0,
                        totalItems: main.allDomains.length || 0,
                        pageNumber: 1,
                        pageNumberStart: 0,
                        pageNumberEnd: 0,
                        pageSize: 20,
                        pageSizes: [20, 50, 100],
                        pagedList: [],
                        filteredList: main.allDomains,
                        filter: ""
                    };

                    main.resetPagination = function() {
                        main.meta.pageNumber = 1;
                        main.fetchPage();
                    };

                    main.includeItem = function(domainInfo) {
                        if (domainInfo.addon_domain.indexOf(main.meta.filter) !== -1 ||
                        domainInfo.owner.indexOf(main.meta.filter) !== -1) {
                            return true;
                        }
                        return false;
                    };

                    main.filterList = function() {
                        main.meta.filteredList = main.allDomains.filter(main.includeItem);
                        main.resetPagination();
                    };

                    main.clearFilter = function() {
                        if (main.hasFilter()) {
                            main.meta.filter = "";
                            main.meta.filteredList = main.allDomains.slice();
                            main.resetPagination();
                        }
                    };

                    main.hasFilter = function() {
                        return main.meta.filter.length > 0;
                    };

                    main.fetchPage = function(scrollToTop) {
                        var pageSize = main.meta.pageSize;
                        var beginIndex = ((main.meta.pageNumber - 1) * pageSize) + 1;
                        var endIndex = beginIndex + pageSize - 1;
                        if (endIndex > main.meta.filteredList.length) {
                            endIndex = main.meta.filteredList.length;
                        }

                        main.meta.totalItems = main.meta.filteredList.length;
                        main.meta.pagedList = main.meta.filteredList.slice(beginIndex - 1, endIndex);
                        main.meta.pageNumberStart = main.meta.filteredList.length === 0 ? 0 : beginIndex;
                        main.meta.pageNumberEnd = endIndex;

                        if (scrollToTop) {
                            $anchorScroll("pageContainer");
                        }
                    };

                    main.paginationMessage = function() {
                        return LOCALE.maketext("Displaying [numf,_1] to [numf,_2] out of [quant,_3,item,items]", main.meta.pageNumberStart, main.meta.pageNumberEnd, main.meta.totalItems);
                    };

                    main.convertDomain = function(domainInfo) {
                        $location.path("/convert/" + encodeURIComponent(domainInfo.addon_domain) + "/migrations");
                    };

                    main.compareDomains = function(domainA, domainB) {
                        if (main.meta.sortBy === "domain") {
                            return domainA.addon_domain.localeCompare(domainB.addon_domain);
                        } else { // sort by owner
                            var ownerComparison = domainA.owner.localeCompare(domainB.owner);
                            if (ownerComparison === 0) {

                            // if the owners are the same, sort by domain
                                return domainA.addon_domain.localeCompare(domainB.addon_domain);
                            }
                            return ownerComparison;
                        }
                    };

                    main.sortList = function() {
                        main.allDomains.sort(main.compareDomains);

                        if (main.meta.sortDirection !== "asc") {
                            main.allDomains = main.allDomains.reverse();
                        }
                    };

                    main.hasAddonDomains = function() {
                        return main.meta.pagedList.length > 0;
                    };

                    main.resetDisplay = function() {
                        main.sortList();
                        main.filterList();
                    };

                    main.loadList = function() {
                        main.loadingDomains = true;
                        return ConvertAddonData.loadList()
                            .then(
                                function(result) {
                                    main.allDomains = result;
                                }, function(error) {
                                    growl.error(error);
                                }
                            )
                            .finally( function() {
                                main.loadingDomains = false;
                                main.resetDisplay();
                            });
                    };

                    main.forceLoadList = function() {
                        main.allDomains = [];
                        main.meta.pagedList = [];
                        main.loadList();
                    };

                    main.viewHistory = function() {
                        $location.path("/history/");
                    };

                    main.init = function() {
                        if (app.firstLoad.addonList) {
                            app.firstLoad.addonList = false;
                            main.allDomains = ConvertAddonData.domains;
                            main.resetDisplay();
                        } else {
                            main.loadList();
                        }
                    };

                    main.init();
                }
            ]);

        return controller;
    }
);

/*
# directives/move_status.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/move_status',[
        "angular",
        "cjt/util/locale",
        "cjt/core",
    ],
    function(angular, LOCALE, CJT) {

        var app = angular.module("App");
        app.directive("itemMoveStatus",
            [
                function() {
                    var TEMPLATE_PATH = "directives/move_status.phtml";
                    var RELATIVE_PATH = "templates/convert_addon_to_account/" + TEMPLATE_PATH;
                    var MOVE_TEXT = LOCALE.maketext("Selected");
                    var DO_NOT_MOVE_TEXT = LOCALE.maketext("Not Selected");

                    return {
                        replace: true,
                        require: "ngModel",
                        restrict: "E",
                        scope: {
                            ngModel: "=",
                        },
                        templateUrl: CJT.config.debug ? CJT.buildFullPath(RELATIVE_PATH) : TEMPLATE_PATH,
                        link: function(scope, element, attrs) {
                            scope.moveLabel = MOVE_TEXT;
                            scope.noMoveLabel = DO_NOT_MOVE_TEXT;
                        }
                    };
                }
            ]);
    }
);

/*
# views/move_options.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/views/move_options',[
        "angular",
        "cjt/util/locale",
        "cjt/decorators/growlDecorator",
        "cjt/validator/email-validator",
        "cjt/directives/validationItemDirective",
        "cjt/directives/validationContainerDirective",
        "cjt/directives/validateEqualsDirective",
        "cjt/directives/actionButtonDirective",
        "app/services/ConvertAddonData",
        "app/services/Databases",
        "app/services/account_packages",
        "app/directives/move_status",
    ],
    function(angular, LOCALE) {

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

        var controller = app.controller(
            "moveSelectionController",
            ["$q", "$location", "$routeParams", "defaultInfo", "growl", "ConvertAddonData", "Databases", "AccountPackages", "$scope",
                function($q, $location, $routeParams, defaultInfo, growl, ConvertAddonData, Databases, AccountPackages, $scope) {
                    var move_options_vm = this;

                    move_options_vm.ui = {};
                    move_options_vm.ui.is_loading = false;
                    move_options_vm.ui.domain_exists = false;
                    move_options_vm.ui.is_conversion_started = false;
                    move_options_vm.enable_db_button = false;
                    move_options_vm.this_domain = {};
                    move_options_vm.copy_mysql_dbs = false;
                    move_options_vm.has_dedicated_ip = false;
                    move_options_vm.account_packages = [];
                    move_options_vm.ip_addr_will_change = false;
                    move_options_vm.selected_package = void 0;

                    move_options_vm.stats = {};

                    move_options_vm.no_databases_tooltip = LOCALE.maketext("Disabled because there are no databases to move");
                    move_options_vm.no_email_tooltip = LOCALE.maketext("Disabled because there are no email-related items to move");

                    // initialize the view
                    function init() {
                        move_options_vm.ui.is_loading = true;

                        ConvertAddonData.getAddonDomainDetails($routeParams.addondomain)
                            .then(function(data) {
                                if (Object.keys(data).length) {
                                    move_options_vm.domain_name = data.addon_domain;
                                    move_options_vm.this_domain = data;

                                    move_options_vm.this_domain.account_settings.domain = data.addon_domain;
                                    if (move_options_vm.this_domain.account_settings.email === void 0) {
                                        move_options_vm.this_domain.account_settings.email = "";
                                    }

                                    if (move_options_vm.this_domain.account_settings.pkgname === void 0) {
                                        move_options_vm.this_domain.account_settings.pkgname = "";
                                    }

                                    if (move_options_vm.this_domain.account_settings.username === void 0) {
                                        move_options_vm.generate_username(move_options_vm.domain_name);
                                    }

                                    if (move_options_vm.this_domain.details.has_dedicated_ip === 1) {
                                        move_options_vm.ip_addr_will_change = true;
                                    }

                                    // we only want to show the SSL certificate copy option if the user has chosen to copy the ssl cert
                                    // and they have an SSL cert installed for that domain
                                    move_options_vm.show_ssl_copy_option = move_options_vm.this_domain.move_options["copy-installed-ssl-cert"] &&
                                    move_options_vm.this_domain.details.has_ssl_cert_installed === 1;

                                    // intelligently set some options based on the data we have
                                    if (!move_options_vm.this_domain.modified) {
                                        change_defaults(move_options_vm.this_domain);
                                        move_options_vm.this_domain.modified = false;
                                    }

                                    stringify_stats(move_options_vm.this_domain.details);

                                    move_options_vm.move_email_category =
                                    move_options_vm.this_domain.move_options["email-accounts"] ||
                                    move_options_vm.this_domain.move_options["email-forwarders"] ||
                                    move_options_vm.this_domain.move_options["autoresponders"];

                                    // Disable the email section configure button if there is no email data to move
                                    move_options_vm.disable_email_button = (
                                        move_options_vm.this_domain.details.number_of_email_accounts +
                                    move_options_vm.this_domain.details.number_of_domain_forwarders +
                                    move_options_vm.this_domain.details.number_of_email_forwarders +
                                    move_options_vm.this_domain.details.number_of_autoresponders) === 0;

                                    move_options_vm.move_db_category = move_options_vm.this_domain.move_options.mysql_dbs.length || move_options_vm.this_domain.move_options.mysql_users.length;
                                    move_options_vm.copy_mysql_dbs = (move_options_vm.this_domain.move_options.db_move_type === "copy") ? true : false;

                                    move_options_vm.move_website_data = move_options_vm.this_domain.move_options["docroot"] ||
                                                                    move_options_vm.this_domain.move_options["custom-vhost-includes"] ||
                                                                    move_options_vm.this_domain.move_options["copy-installed-ssl-cert"];

                                    move_options_vm.move_subaccount_category = move_options_vm.this_domain.move_options["ftp-accounts"] ||
                                    move_options_vm.this_domain.move_options["webdisk-accounts"];

                                    move_options_vm.selected_dbs_message = move_options_vm.copy_mysql_dbs ? LOCALE.maketext("You selected the following [asis,MySQL] databases to copy:") : LOCALE.maketext("You selected the following [asis,MySQL] databases to move:");

                                    // get the count of databases and the account packages available for the current user
                                    return $q.all([
                                        Databases.getDatabases(move_options_vm.this_domain.owner),
                                        AccountPackages.listPackages(),
                                    ])
                                        .then(function(data) {
                                            move_options_vm.enable_db_button = Object.keys(data[0]).length > 0;
                                            move_options_vm.account_packages = data[1];

                                            for (var i = 0, len = move_options_vm.account_packages.length; i < len; i++) {
                                                if (move_options_vm.account_packages[i].name &&
                                                    move_options_vm.account_packages[i].name === move_options_vm.this_domain.account_settings.pkgname) {
                                                    move_options_vm.selected_package = move_options_vm.account_packages[i];
                                                }
                                            }

                                            // default to the first package if one has not been selected
                                            if (move_options_vm.this_domain.account_settings.pkgname === "") {
                                                move_options_vm.selected_package = move_options_vm.account_packages[0];
                                            }

                                            move_options_vm.sync_pkg_settings();
                                        })
                                        .catch(function(meta) {
                                            var len = meta.errors.length;
                                            if (len > 1) {
                                                growl.error(meta.reason);
                                            }
                                            for (var i = 0; i < len; i++) {
                                                growl.error(meta.errors[i]);
                                            }
                                        })
                                        .finally(function() {
                                            move_options_vm.ui.domain_exists = true;
                                        });
                                } else {
                                    move_options_vm.domain_name = $routeParams.addondomain;
                                    move_options_vm.ui.domain_exists = false;
                                }
                            })
                            .finally(function() {
                                move_options_vm.ui.is_loading = false;
                            });
                    }

                    function stringify_stats(data) {
                        move_options_vm.stats.email = {
                            "accounts": LOCALE.maketext("[quant,_1,Email account,Email accounts]", data.number_of_email_accounts),
                            "forwarders": LOCALE.maketext("[quant,_1,Forwarder,Forwarders]", data.number_of_email_forwarders + data.number_of_domain_forwarders),
                            "autoresponders": LOCALE.maketext("[quant,_1,Autoresponder,Autoresponders]", data.number_of_autoresponders),
                        };
                    }

                    function change_defaults(data) {
                        if (data.details.number_of_email_accounts === 0) {
                            move_options_vm.this_domain.move_options["email-accounts"] = false;
                        }

                        var total_forwarders = data.details.number_of_domain_forwarders + data.details.number_of_email_forwarders;
                        if (total_forwarders === 0) {
                            move_options_vm.this_domain.move_options["email-forwarders"] = false;
                        }

                        if (data.details.number_of_autoresponders === 0) {
                            move_options_vm.this_domain.move_options["autoresponders"] = false;
                        }

                        move_options_vm.show_ssl_copy_option = move_options_vm.this_domain.details.has_ssl_cert_installed === 1;

                        move_options_vm.sync_pkg_settings();
                    }

                    move_options_vm.sync_pkg_settings = function() {
                        if (move_options_vm.this_domain.details.has_dedicated_ip === 1 || move_options_vm.has_dedicated_ip) {
                            move_options_vm.ip_addr_will_change = true;
                        } else {
                            move_options_vm.ip_addr_will_change = false;
                        }
                    };

                    move_options_vm.generate_username = function(domain) {

                        // we want to strip off the TLD, then replace the numbers, dots, and anything
                        // not an ascii character for the username
                        var username = domain
                            .replace(/^\d+/, "")
                            .replace(/\.[^.]+$/, "")
                            .replace(/[^A-Za-z0-9]/g, "")
                            .substr(0, defaultInfo.username_restrictions.maxLength);
                        move_options_vm.this_domain.account_settings.username = username.toLowerCase();
                    };

                    move_options_vm.disableSave = function(form) {
                        return (form.$dirty && form.$invalid) || move_options_vm.ui.is_conversion_started || !move_options_vm.account_packages.length;
                    };

                    move_options_vm.addDbPrefix = function(db) {
                        if (Databases.isPrefixingEnabled()) {
                            return Databases.addPrefixIfNeeded(db, move_options_vm.this_domain.account_settings.username);
                        }

                        return db;
                    };

                    // watch the value of the selected account package
                    $scope.$watch(function() {
                        return move_options_vm.selected_package;
                    }, function(newPkg, oldPkg) {

                        // if we have no data yet, then just return.
                        // newPkg being undefined happens on initial load
                        if (Object.keys(move_options_vm.this_domain).length === 0 ||
                        newPkg === void 0) {
                            return;
                        }

                        // if the new package is null, then give the default values
                        if (newPkg === null) {
                            move_options_vm.has_dedicated_ip = false;
                            move_options_vm.this_domain.account_settings.pkgname = "";
                        } else {

                            // we have a new selected package, so lets update the values.
                            move_options_vm.has_dedicated_ip = newPkg.IP === "y" ? true : false;
                            move_options_vm.this_domain.account_settings.pkgname = newPkg.name;
                        }

                        move_options_vm.sync_pkg_settings();
                    });

                    move_options_vm.startConversion = function(form) {
                        if (!form.$valid) {
                            return;
                        }

                        move_options_vm.this_domain.modified = true;

                        // add prefixes to the databases as the last step in case they change the username before submission
                        if (Databases.isPrefixingEnabled() && move_options_vm.this_domain.move_options.db_move_type === "copy") {
                            for (var j = 0, dblen = move_options_vm.this_domain.move_options.mysql_dbs.length; j < dblen; j++) {
                                var db = move_options_vm.this_domain.move_options.mysql_dbs[j];
                                db.new_name = Databases.addPrefix(db.new_name, move_options_vm.this_domain.account_settings.username);
                            }
                        }

                        return ConvertAddonData.beginConversion(move_options_vm.this_domain)
                            .then(function(data) {
                                growl.success(LOCALE.maketext("The system started the conversion process for “[_1]”.",
                                    move_options_vm.domain_name));
                                move_options_vm.ui.is_conversion_started = true;

                                // send the user to the conversion history page
                                // would be better to do to the conversion details
                                // page, but the job id is not available at this point

                                return $location.path("/history");
                            })
                            .catch(function(meta) {
                                var len = meta.errors.length;
                                if (len > 1) {
                                    growl.error(meta.reason);
                                }
                                for (var i = 0; i < len; i++) {
                                    growl.error(meta.errors[i]);
                                }

                                move_options_vm.ui.is_conversion_started = false;
                            });
                    };

                    move_options_vm.goToEditView = function(category) {
                        return $location.path("/convert/" + move_options_vm.domain_name + "/migrations/edit/" + category);
                    };

                    move_options_vm.goToMain = function() {

                        // reset the account settings
                        move_options_vm.this_domain.account_settings = {};
                        return $location.path("/main");
                    };

                    init();
                },
            ]);

        return controller;
    }
);

/*
# views/docroot.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/views/docroot',[
        "angular",
        "cjt/util/locale",
        "cjt/decorators/growlDecorator",
        "app/services/ConvertAddonData"
    ],
    function(angular, LOCALE) {

        // Retrieve the current application
        var app = angular.module("App");

        var controller = app.controller(
            "docrootController",
            ["$anchorScroll", "$location", "$routeParams", "growl", "ConvertAddonData",
                function($anchorScroll, $location, $routeParams, growl, ConvertAddonData) {

                    var docroot = this;

                    docroot.loading = true;

                    docroot.moveIt = false;
                    docroot.moveVhostIncludes = false;
                    docroot.copySSLCert = false;
                    docroot.sslCertInstalled = false;
                    docroot.addonDomain = "";
                    docroot.domainData = {};
                    docroot.noSSLCertTooltip = LOCALE.maketext("The domain does not have an [asis,SSL] certificate installed.");

                    docroot.load = function() {
                        return ConvertAddonData.getAddonDomainDetails(docroot.addonDomain)
                            .then(
                                function(result) {
                                    docroot.moveIt = result.move_options.docroot;
                                    docroot.moveVhostIncludes = result.move_options["custom-vhost-includes"];
                                    docroot.sslCertInstalled = result.details["has_ssl_cert_installed"] === 1 ? true : false;
                                    docroot.copySSLCert = result.move_options["copy-installed-ssl-cert"] && docroot.sslCertInstalled;
                                    docroot.domainData = result;
                                }, function(error) {
                                    growl.error(error);
                                }
                            )
                            .finally(
                                function() {
                                    docroot.loading = false;
                                }
                            );
                    };

                    docroot.goToOverview = function() {
                        return $location.path("/convert/" + docroot.addonDomain + "/migrations");
                    };

                    docroot.save = function() {
                        docroot.domainData.modified = true;
                        docroot.domainData.move_options.docroot = docroot.moveIt;
                        docroot.domainData.move_options["custom-vhost-includes"] = docroot.moveVhostIncludes;
                        docroot.domainData.move_options["copy-installed-ssl-cert"] = docroot.copySSLCert;
                        docroot.goToOverview();
                    };

                    docroot.cancel = function() {
                        docroot.goToOverview();
                    };

                    docroot.init = function() {
                        docroot.addonDomain = $routeParams.addondomain;
                        docroot.load();
                    };

                    docroot.init();
                }
            ]);

        return controller;
    }
);

/*
# views/dns.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/views/dns',[
        "angular",
        "cjt/util/locale",
        "cjt/decorators/growlDecorator",
        "app/services/ConvertAddonData"
    ],
    function(angular, LOCALE) {

        // Retrieve the current application
        var app = angular.module("App");

        var controller = app.controller(
            "dnsSelectionController",
            ["$anchorScroll", "$location", "$routeParams", "growl", "ConvertAddonData",
                function($anchorScroll, $location, $routeParams, growl, ConvertAddonData) {

                    var dns = this;

                    dns.loading = true;

                    dns.moveIt = true;
                    dns.addonDomain = "";
                    dns.domainData = {};

                    dns.load = function() {
                        return ConvertAddonData.getAddonDomainDetails(dns.addonDomain)
                            .then(
                                function(result) {
                                    dns.moveIt = result.move_options["custom-dns-records"];
                                    dns.domainData = result;
                                }, function(error) {
                                    growl.error(error);
                                }
                            )
                            .finally(
                                function() {
                                    dns.loading = false;
                                }
                            );
                    };

                    dns.goToOverview = function() {
                        return $location.path("/convert/" + dns.addonDomain + "/migrations");
                    };

                    dns.save = function() {
                        dns.domainData.modified = true;
                        dns.domainData.move_options["custom-dns-records"] = dns.moveIt;
                        dns.goToOverview();
                    };

                    dns.cancel = function() {
                        dns.goToOverview();
                    };

                    dns.init = function() {
                        dns.addonDomain = $routeParams.addondomain;
                        dns.load();
                    };

                    dns.init();
                }
            ]);

        return controller;
    }
);

/*
# views/email_options.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/views/email_options',[
        "angular",
        "cjt/util/locale",
        "cjt/decorators/growlDecorator",
        "app/services/ConvertAddonData"
    ],
    function(angular, LOCALE) {

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

        var controller = app.controller(
            "emailSelectionController",
            ["$scope", "$q", "$location", "$routeParams", "ConvertAddonData",
                function($scope, $q, $location, $routeParams, ConvertAddonData) {
                    var email_selection_vm = this;

                    email_selection_vm.ui = {};
                    email_selection_vm.ui.is_loading = false;
                    email_selection_vm.ui.domain_exists = false;
                    email_selection_vm.this_domain = {};

                    email_selection_vm.stats = {};

                    email_selection_vm.noEmailAccountsTooltip = LOCALE.maketext("The domain does not have email accounts.");
                    email_selection_vm.noAutorespondersTooltip = LOCALE.maketext("The domain does not have autoresponders.");
                    email_selection_vm.noForwardersTooltip = LOCALE.maketext("The domain does not have email forwarders.");

                    // initialize the view
                    function init() {
                        email_selection_vm.ui.is_loading = true;

                        ConvertAddonData.getAddonDomain($routeParams.addondomain)
                            .then(function(data) {
                                if (Object.keys(data).length) {
                                    email_selection_vm.domain_name = data.addon_domain;
                                    email_selection_vm.this_domain = data;

                                    if (data.details.number_of_email_forwarders === void 0) {
                                        data.details.number_of_email_forwarders = 0;
                                    }

                                    if (data.details.number_of_domain_forwarders === void 0) {
                                        data.details.number_of_domain_forwarders = 0;
                                    }

                                    if (data.details.number_of_email_accounts === void 0) {
                                        data.details.number_of_email_accounts = 0;
                                    }

                                    if (data.details.number_of_autoresponders === void 0) {
                                        data.details.number_of_autoresponders = 0;
                                    }

                                    email_selection_vm.email_accounts = data.move_options["email-accounts"];
                                    email_selection_vm.email_forwarders = data.move_options["email-forwarders"];
                                    email_selection_vm.autoresponders = data.move_options["autoresponders"];

                                    // disable webmail data if there are no email accounts
                                    if (data.details.number_of_email_accounts === 0) {
                                        email_selection_vm.webmail_data = false;
                                    }

                                    stringify_stats(email_selection_vm.this_domain.details);

                                    email_selection_vm.total_forwarders = data.details.number_of_email_forwarders +
                                    data.details.number_of_domain_forwarders;
                                    email_selection_vm.ui.domain_exists = true;
                                } else {
                                    email_selection_vm.domain_name = $routeParams.addondomain;
                                    email_selection_vm.ui.domain_exists = false;
                                }
                            })
                            .finally(function() {
                                email_selection_vm.ui.is_loading = false;
                            });
                    }

                    function stringify_stats(data) {
                        email_selection_vm.stats = {
                            "accounts": LOCALE.maketext("[quant,_1,Email account,Email accounts]", data.number_of_email_accounts),
                            "emailForwarders": LOCALE.maketext("[quant,_1,Email forwarder,Email forwarders]", data.number_of_email_forwarders),
                            "domainForwarders": LOCALE.maketext("[quant,_1,Domain forwarder,Domain forwarders]", data.number_of_domain_forwarders),
                            "autoresponders": LOCALE.maketext("[quant,_1,Autoresponder,Autoresponders]", data.number_of_autoresponders)
                        };
                    }

                    email_selection_vm.saveOptions = function() {
                        email_selection_vm.this_domain.modified = true;
                        email_selection_vm.this_domain.move_options["email-accounts"] = email_selection_vm.email_accounts;
                        email_selection_vm.this_domain.move_options["email-forwarders"] = email_selection_vm.email_forwarders;
                        email_selection_vm.this_domain.move_options["autoresponders"] = email_selection_vm.autoresponders;
                        return $location.path("/convert/" + email_selection_vm.domain_name + "/migrations");
                    };

                    email_selection_vm.goBack = function() {
                        return $location.path("/convert/" + email_selection_vm.domain_name + "/migrations");
                    };

                    init();
                }
            ]);

        return controller;
    }
);

/*
# models/dynamic_table.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/models/dynamic_table',[
        "lodash",
        "cjt/util/locale",
    ],
    function(_, LOCALE) {

        /**
         * Creates a Dynamic Table object
         *
         * @class
         */
        function DynamicTable() {
            this.items = [];
            this.filteredList = this.items;
            this.selected = [];
            this.allDisplayedRowsSelected = false;
            this.filterFunction = void 0;

            this.meta = {
                sortBy: "",
                sortDirection: "asc",
                maxPages: 0,
                totalItems: this.items.length,
                pageNumber: 1,
                pageSize: 10,
                pageSizes: [10, 20, 50, 100],
                start: 0,
                limit: 10,
                filterValue: "",
            };
        }

        /**
         * Set the filter function to be used for searching the table
         *
         * @method loadData
         * @param {Array} data - an array of objects representing the data to display
         */
        DynamicTable.prototype.loadData = function(data) {
            this.items = data;

            for (var i = 0, len = this.items.length; i < len; i++) {

                // add a unique id to each piece of data
                this.items[i]._id = i;

                // initialize the selected array with the ids of selected items
                if (this.items[i].selected) {
                    this.selected.push(this.items[i]._id);
                }
            }
        };

        /**
         * Set the filter function to be used for searching the table
         *
         * @method setFilterFunction
         * @param {Function} func - a function that can be used to search the data
         * @note The function passed to this function must
         * - return a boolean
         * - accept the following args: an item object and the search text
         */
        DynamicTable.prototype.setFilterFunction = function(func) {
            if (_.isFunction(func)) {
                this.filterFunction = func;
            }
        };

        /**
         * Set the filter function to be used for searching the table
         *
         * @method setSort
         * @param {String} by - the field you want to sort on
         * @param {String} direction - the direction you want to sort, "asc" or "desc"
         */
        DynamicTable.prototype.setSort = function(by, direction) {
            if (by !== void 0) {
                this.meta.sortBy = by;
            }

            if (direction !== void 0) {
                this.meta.sortDirection = direction;
            }
        };

        /**
         * Get the table metadata
         *
         * @method getMetadata
         * @return {Object} The metadata for the table
         */
        DynamicTable.prototype.getMetadata = function() {
            return this.meta;
        };

        /**
         * Get the table data
         *
         * @method getList
         * @return {Array} The table data
         */
        DynamicTable.prototype.getList = function() {
            return this.filteredList;
        };

        /**
         * Get the table data that is selected
         *
         * @method getSelectedList
         * @return {Array} The table data that is selected
         */
        DynamicTable.prototype.getSelectedList = function() {
            return this.items.filter(function(item) {
                return item.selected;
            });
        };

        /**
         * Determine if all the filtered table rows are selected
         *
         * @method areAllDisplayedRowsSelected
         * @return {Boolean}
         */
        DynamicTable.prototype.areAllDisplayedRowsSelected = function() {
            return this.allDisplayedRowsSelected;
        };

        /**
         * Get the total selected rows in the table
         *
         * @method getTotalRowsSelected
         * @return {Number} total of selected rows in the table
         */
        DynamicTable.prototype.getTotalRowsSelected = function() {
            return this.selected.length;
        };

        /**
         * Select all items for a single page of data in the table
         *
         * @method selectAllDisplayed
         * @param {Boolean} toggle - determines whether to select or unselect all
         * displayed items
         */
        DynamicTable.prototype.selectAllDisplayed = function(toggle) {
            if (toggle) {

                // Select the rows if they were previously selected on this page.
                for (var i = 0, filteredLen = this.filteredList.length; i < filteredLen; i++) {
                    var item = this.filteredList[i];
                    item.selected = true;

                    // make sure this item is not already in the list
                    if (this.selected.indexOf(item._id) !== -1) {
                        continue;
                    }

                    this.selected.push(item._id);
                }
            } else {

                // Extract the unselected items and remove them from the selected collection.
                var unselected = this.filteredList.map(function(item) {
                    item.selected = false;
                    return item._id;
                });

                this.selected = _.difference(this.selected, unselected);
            }

            this.allDisplayedRowsSelected = toggle;
        };

        /**
         * Select an item on the current page.
         *
         * @method selectItem
         * @param {Object} item - the item that we want to mark as selected.
         * NOTE: the item must have the selected property set to true before
         * passing it to this function
         */
        DynamicTable.prototype.selectItem = function(item) {
            if (typeof item !== "undefined") {
                if (item.selected) {

                    // make sure this item is not already in the list
                    if (this.selected.indexOf(item._id) !== -1) {
                        return;
                    }

                    this.selected.push(item._id);

                    // Sync 'Select All' checkbox status when a new selction/unselection
                    // is made.
                    this.allDisplayedRowsSelected = this.filteredList.every(function(thisitem) {
                        return thisitem.selected;
                    });
                } else {
                    this.selected = this.selected.filter(function(thisid) {
                        return thisid !== item._id;
                    });

                    // Unselect Select All checkbox.
                    this.allDisplayedRowsSelected = false;
                }
            }
        };

        /**
         * Clear all selections for all pages.
         *
         * @method clearAllSelections
         */
        DynamicTable.prototype.clearAllSelections = function() {
            this.selected = [];

            for (var i = 0, len = this.items.length; i < len; i++) {
                var item = this.items[i];
                item.selected = false;
            }

            this.allDisplayedRowsSelected = false;
        };

        /**
         * Clear the entire table.
         *
         * @method clear
         */
        DynamicTable.prototype.clear = function() {
            this.items = [];
            this.selected = [];
            this.allDisplayedRowsSelected = false;
            this.filteredList = this.populate();
        };

        /**
         * Populate the table with data accounting for filtering, sorting, and paging
         *
         * @method populate
         * @return {Array} the table data
         */
        DynamicTable.prototype.populate = function() {
            var filtered = [];
            var self = this;

            // filter list based on search text
            if (this.meta.filterValue !== "" && _.isFunction(this.filterFunction)) {
                filtered = this.items.filter(function(item) {
                    return self.filterFunction(item, self.meta.filterValue);
                });
            } else {
                filtered = this.items;
            }

            // sort the filtered list
            if (this.meta.sortDirection !== "" && this.meta.sortBy !== "") {
                filtered = _.orderBy(filtered, [this.meta.sortBy], [this.meta.sortDirection]);
            }

            // update the total items after search
            this.meta.totalItems = filtered.length;

            // filter list based on page size and pagination and handle the case
            // where the page size is "ALL" (-1)
            if (this.meta.totalItems > _.min(this.meta.pageSizes) ) {
                var start = (this.meta.pageNumber - 1) * this.meta.pageSize;
                var limit = this.meta.pageNumber * this.meta.pageSize;

                filtered = _.slice(filtered, start, limit);

                this.meta.start = start + 1;
                this.meta.limit = start + filtered.length;
            } else {
                if (filtered.length === 0) {
                    this.meta.start = 0;
                } else {
                    this.meta.start = 1;
                }

                this.meta.limit = filtered.length;
            }

            var countNonSelected = 0;
            for (var i = 0, filteredLen = filtered.length; i < filteredLen; i++) {
                var item = filtered[i];

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

            this.filteredList = filtered;

            // Clear the 'Select All' checkbox if at least one row is not selected.
            this.allDisplayedRowsSelected = (filtered.length > 0) && (countNonSelected === 0);

            return filtered;
        };

        /**
         * Create a localized message for the table stats
         *
         * @method paginationMessage
         * @return {String}
         */
        DynamicTable.prototype.paginationMessage = function() {
            return LOCALE.maketext("Displaying [numf,_1] to [numf,_2] out of [quant,_3,item,items]", this.meta.start, this.meta.limit, this.meta.totalItems);
        };

        return DynamicTable;
    }
);

/*
# convert_addon_to_account/directives/db_name_validators.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, CPANEL: false */
/* --------------------------*/

define('app/directives/db_name_validators',[
    "angular",
    "cjt/validator/validator-utils",
    "cjt/util/locale",
    "cjt/validator/validateDirectiveFactory",
    "app/services/Databases"
],
function(angular, validationUtils, LOCALE, validateFactory, Databases) {
    var validators = {

        /**
             * Validate a MySQL Database Name
             * NOTE: This method depends on the old cjt/sql.js file being loaded
             *
             * @method mysqlDbName
             * @param {string} val - the value to be validated
             * @return a validation result object
             */
        mysqlDbName: function(val) {
            var result = validationUtils.initializeValidationResult();

            try {
                CPANEL.sql.verify_mysql_database_name(val);
                result.isValid = true;
            } catch (error) {
                result.isValid = false;
                result.add("db", error);
            }

            return result;
        },

        /**
             * Validate a Postgres Database Name
             * NOTE: This method depends on the old cjt/sql.js file being loaded
             *
             * @method postrgresDbName
             * @param {string} val - the value to be validated
             * @return a validation result object
             */
        postgresqlDbName: function(val) {
            var result = validationUtils.initializeValidationResult();

            try {
                CPANEL.sql.verify_postgresql_database_name(val);
                result.isValid = true;
            } catch (error) {
                result.isValid = false;
                result.add("db", error);
            }

            return result;
        }
    };

    var validatorModule = angular.module("cjt2.validate");

    validatorModule.run(["validatorFactory", "Databases",
        function(validatorFactory, Databases) {
            validatorFactory.generate(validators);
        }
    ]);

    return {
        methods: validators,
        name: "dbNameValidators",
        description: "Validation directives for db names.",
        version: 11.56,
    };
}
);

/*
# views/db_options.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, CPANEL: false */

define(
    'app/views/db_options',[
        "angular",
        "lodash",
        "cjt/util/locale",
        "app/models/dynamic_table",
        "cjt/decorators/growlDecorator",
        "cjt/decorators/paginationDecorator",
        "cjt/directives/toggleSortDirective",
        "cjt/directives/searchDirective",
        "cjt/directives/pageSizeDirective",
        "cjt/filters/startFromFilter",
        "app/services/ConvertAddonData",
        "app/services/Databases",
        "app/directives/db_name_validators"
    ],
    function(angular, _, LOCALE, DynamicTable) {

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

        var controller = app.controller(
            "databaseSelectionController",
            ["$q", "$location", "$routeParams", "growl", "ConvertAddonData", "Databases", "$anchorScroll",
                function($q, $location, $routeParams, growl, ConvertAddonData, Databases, $anchorScroll) {
                    var db_selection_vm = this;

                    db_selection_vm.ui = {};
                    db_selection_vm.ui.is_loading = false;
                    db_selection_vm.ui.domain_exists = false;
                    db_selection_vm.this_domain = {};

                    db_selection_vm.is_prefixing_enabled = void 0;
                    db_selection_vm.move_type = "move";

                    // This function exists in the old cjt/sql.js file
                    db_selection_vm.database_name_max_length = CPANEL.sql.get_name_length_limit("mysql", "database");

                    var db_table = new DynamicTable();
                    db_table.setSort("db_name");

                    var user_table = new DynamicTable();
                    user_table.setSort("user_name");

                    function searchDbsFunction(item, searchText) {
                        return item.db_name.indexOf(searchText) !== -1;
                    }
                    db_table.setFilterFunction(searchDbsFunction);

                    function searchUsersFunction(item, searchText) {
                        return item.user_name.indexOf(searchText) !== -1;
                    }
                    user_table.setFilterFunction(searchUsersFunction);

                    db_selection_vm.dbs = {
                        "checkDropdownOpen": false,
                        "allRowsSelected": db_table.areAllDisplayedRowsSelected(),
                        "meta": db_table.getMetadata(),
                        "filteredList": db_table.getList(),
                        "totalSelected": db_table.getTotalRowsSelected(),
                        "paginationMessage": db_table.paginationMessage,
                        "fetch": function() {
                            db_selection_vm.dbs.filteredList = db_table.populate();
                            db_selection_vm.dbs.allRowsSelected = db_table.areAllDisplayedRowsSelected();
                            db_selection_vm.dbs.totalSelected = db_table.getTotalRowsSelected();
                        },
                        "sortList": function() {
                            db_selection_vm.dbs.fetch();
                        },
                        "selectPage": function() {
                            db_selection_vm.dbs.fetch();
                        },
                        "selectPageSize": function() {
                            db_selection_vm.dbs.fetch();
                        },
                        "searchList": function() {
                            db_selection_vm.dbs.fetch();
                        },
                        "selectAll": function(model) {
                            db_table.selectAllDisplayed(model);
                            db_selection_vm.dbs.fetch();
                            db_selection_vm.dbs.allRowsSelected = db_table.areAllDisplayedRowsSelected();
                            db_selection_vm.dbs.totalSelected = db_table.getTotalRowsSelected();
                        },
                        "selectDb": function(db) {
                            db_table.selectItem(db);
                            db_selection_vm.dbs.allRowsSelected = db_table.areAllDisplayedRowsSelected();
                            db_selection_vm.dbs.totalSelected = db_table.getTotalRowsSelected();
                        },
                        "clearAllSelections": function(event) {
                            event.preventDefault();
                            event.stopPropagation();

                            db_table.clearAllSelections();
                            db_selection_vm.dbs.checkDropdownOpen = false;
                            db_selection_vm.dbs.allRowsSelected = db_table.areAllDisplayedRowsSelected();
                            db_selection_vm.dbs.totalSelected = db_table.getTotalRowsSelected();
                        }
                    };

                    db_selection_vm.users = {
                        "checkDropdownOpen": false,
                        "allRowsSelected": user_table.areAllDisplayedRowsSelected(),
                        "meta": user_table.getMetadata(),
                        "filteredList": user_table.getList(),
                        "totalSelected": user_table.getTotalRowsSelected(),
                        "paginationMessage": user_table.paginationMessage,
                        "fetch": function() {
                            db_selection_vm.users.filteredList = user_table.populate();
                            db_selection_vm.users.allRowsSelected = user_table.areAllDisplayedRowsSelected();
                            db_selection_vm.users.totalSelected = user_table.getTotalRowsSelected();
                        },
                        "sortList": function() {
                            db_selection_vm.users.fetch();
                        },
                        "selectPage": function() {
                            db_selection_vm.users.fetch();
                        },
                        "selectPageSize": function() {
                            db_selection_vm.users.fetch();
                        },
                        "searchList": function() {
                            db_selection_vm.users.fetch();
                        },
                        "selectAll": function(model) {
                            user_table.selectAllDisplayed(model);
                            db_selection_vm.users.fetch();
                            db_selection_vm.users.allRowsSelected = user_table.areAllDisplayedRowsSelected();
                            db_selection_vm.users.totalSelected = user_table.getTotalRowsSelected();
                        },
                        "selectUser": function(db) {
                            user_table.selectItem(db);
                            db_selection_vm.users.allRowsSelected = user_table.areAllDisplayedRowsSelected();
                            db_selection_vm.users.totalSelected = user_table.getTotalRowsSelected();
                        },
                        "clearAllSelections": function(event) {
                            event.preventDefault();
                            event.stopPropagation();

                            user_table.clearAllSelections();
                            db_selection_vm.users.checkDropdownOpen = false;
                            db_selection_vm.users.allRowsSelected = user_table.areAllDisplayedRowsSelected();
                            db_selection_vm.users.totalSelected = user_table.getTotalRowsSelected();
                        }
                    };

                    function convertDBObjectToList(dbs) {
                        var existing_db;
                        var has_selections = db_selection_vm.this_domain.move_options["mysql_dbs"] &&
                        db_selection_vm.this_domain.move_options["mysql_dbs"].length > 0;
                        var prefix = Databases.createPrefix(db_selection_vm.this_domain.account_settings.username);
                        var data = [];
                        for (var db in dbs) {
                            if (dbs.hasOwnProperty(db)) {

                            // If the user had already selected this database to move,
                            // we should mark it as selected
                                if (has_selections &&
                                (existing_db = _.find(db_selection_vm.this_domain.move_options.mysql_dbs, { "name": db })) !== void 0) {
                                    data.push({
                                        "db_name": db,
                                        "db_users": dbs[db],
                                        "selected": true,
                                        "db_new_name": existing_db.new_name,
                                        "db_prefix": prefix
                                    });
                                } else {
                                    data.push({
                                        "db_name": db,
                                        "db_users": dbs[db],
                                        "selected": false,
                                        "db_new_name": "",
                                        "db_prefix": prefix
                                    });
                                }
                                existing_db = void 0;
                            }
                        }
                        db_table.loadData(data);
                    }

                    function convertUsersObjectToList(users) {
                        var existing_user;
                        var has_selections = db_selection_vm.this_domain.move_options["mysql_users"] &&
                        db_selection_vm.this_domain.move_options["mysql_users"].length > 0;
                        var data = [];
                        for (var user in users) {
                            if (users.hasOwnProperty(user)) {

                            // If the user had already selected this user to move,
                            // we should mark it as selected
                                if (has_selections &&
                                (existing_user = _.find(db_selection_vm.this_domain.move_options.mysql_users, { "name": user })) !== void 0) {
                                    data.push({
                                        "user_name": user,
                                        "user_databases": users[user],
                                        "selected": true
                                    });
                                } else {
                                    data.push({
                                        "user_name": user,
                                        "user_databases": users[user],
                                        "selected": false
                                    });
                                }
                                existing_user = void 0;
                            }
                        }
                        user_table.loadData(data);
                    }

                    db_selection_vm.disableSave = function(form) {
                        return (form.$dirty && form.$invalid);
                    };

                    db_selection_vm.saveOptions = function(form) {
                        if (!form.$valid) {
                            return;
                        }

                        db_selection_vm.this_domain.modified = true;

                        var selected_dbs = db_table.getSelectedList();

                        db_selection_vm.this_domain.move_options.db_move_type = db_selection_vm.move_type;
                        db_selection_vm.this_domain.move_options["mysql_dbs"] = selected_dbs.map(function(item) {
                            return {
                                "name": item.db_name,
                                "new_name": item.db_new_name
                            };
                        });

                        if (db_selection_vm.this_domain.move_options.db_move_type === "move") {
                            var selected_users = user_table.getSelectedList();
                            db_selection_vm.this_domain.move_options["mysql_users"] = selected_users.map(function(item) {
                                return {
                                    "name": item.user_name,
                                };
                            });
                        } else {
                            db_selection_vm.this_domain.move_options["mysql_users"] = [];
                        }

                        return $location.path("/convert/" + db_selection_vm.domain_name + "/migrations");
                    };

                    db_selection_vm.goBack = function() {
                        return $location.path("/convert/" + db_selection_vm.domain_name + "/migrations");
                    };

                    db_selection_vm.init = function() {
                        db_selection_vm.ui.is_loading = true;

                        ConvertAddonData.getAddonDomain($routeParams.addondomain)
                            .then(function(data) {
                                if (Object.keys(data).length) {
                                    db_selection_vm.domain_name = data.addon_domain;
                                    db_selection_vm.this_domain = data;

                                    if (data.move_options.db_move_type) {
                                        db_selection_vm.move_type = data.move_options.db_move_type;
                                    }

                                    return Databases.getDatabases(db_selection_vm.this_domain.owner)
                                        .then(function(data) {
                                            convertDBObjectToList(data);
                                            convertUsersObjectToList(Databases.getUsers());
                                            db_selection_vm.is_prefixing_enabled = Databases.isPrefixingEnabled();
                                            if (db_selection_vm.is_prefixing_enabled) {
                                                db_selection_vm.database_name_max_length -= Databases.getPrefixLength();
                                            }
                                            db_selection_vm.dbs.fetch();
                                            db_selection_vm.users.fetch();
                                            db_selection_vm.ui.domain_exists = true;
                                        })
                                        .catch(function(meta) {
                                            var len = meta.errors.length;
                                            if (len > 1) {
                                                growl.error(meta.reason);
                                            }
                                            for (var i = 0; i < len; i++) {
                                                growl.error(meta.errors[i]);
                                            }
                                        });
                                } else {
                                    db_selection_vm.domain_name = $routeParams.addondomain;
                                    db_selection_vm.ui.domain_exists = false;
                                }
                            })
                            .finally(function() {
                                db_selection_vm.ui.is_loading = false;
                                $location.hash("pageContainer");
                                $anchorScroll();
                            });
                    };

                    db_selection_vm.init();
                }
            ]);

        return controller;
    }
);

/*
# views/conversion_detail.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/views/conversion_detail',[
        "angular",
        "cjt/util/locale",
        "cjt/decorators/growlDecorator",
        "app/services/conversion_history"
    ],
    function(angular, LOCALE) {

        // Retrieve the current application
        var app = angular.module("App");

        var controller = app.controller(
            "conversionDetailController",
            ["$anchorScroll", "$location", "$routeParams", "growl", "ConversionHistory", "$timeout",
                function($anchorScroll, $location, $routeParams, growl, ConversionHistory, $timeout) {

                    var detail = this;

                    detail.loading = true;

                    detail.jobId = 0;

                    detail.conversionData = {};
                    detail.progressBarType = "info";
                    detail.currentProgressMessage = "";

                    detail.splitWarnings = function(warnings) {
                        if (warnings) {
                            return warnings.split("\n");
                        }
                        return null;
                    };

                    detail.viewHistory = function() {
                        $location.path("/history/");
                    };

                    detail.viewAddons = function() {
                        $location.path("/main");
                    };

                    detail.updateSteps = function() {
                        return ConversionHistory.getDetails(detail.jobId, detail.currentStep)
                            .then(
                                function(result) {

                                    // check to see if local copy of conversion data is
                                    // populated. if not, put the results of the getDatails
                                    // call there
                                    if (!detail.conversionData.hasOwnProperty("domain")) {

                                        // make a local copy of the data so the
                                        // ui is properly synchronized
                                        for (var prop in result) {

                                            if (result.hasOwnProperty(prop)) {
                                                if (prop === "steps") {
                                                    continue;
                                                }
                                                detail.conversionData[prop] = result[prop];
                                            }
                                        }

                                        detail.conversionData.steps = result.steps.slice();

                                        if (detail.conversionData.job_status === "INPROGRESS") {
                                            detail.currentProgressMessage = detail.conversionData.steps[detail.conversionData.steps.length - 1].step_name;
                                            detail.progressBarType = "info";
                                            return $timeout(function() {
                                                return detail.updateSteps();
                                            }, 2000);
                                        } else if (detail.conversionData.job_status === "DONE") {
                                            detail.currentProgressMessage = LOCALE.maketext("Conversion Completed");
                                            detail.progressBarType = "success";
                                        } else {
                                            detail.currentProgressMessage = LOCALE.maketext("Conversion Failed");
                                            detail.progressBarType = "danger";
                                        }
                                    } else { // otherwise, add any new steps to the local copy

                                        // if the current list of steps is shorter than the new list
                                        // add the new steps to the end of the list
                                        var currentStepCount = detail.conversionData.steps.length;
                                        var newStepCount = result.steps.length;

                                        if ( currentStepCount < newStepCount) {

                                            // update last step with new status and warnings, if any
                                            detail.conversionData.steps[currentStepCount - 1].status = result.steps[currentStepCount - 1].status;
                                            if (result.steps[currentStepCount - 1].warnings) {
                                                detail.conversionData.steps[currentStepCount - 1].warnings = result.steps[currentStepCount - 1].warnings;
                                            }

                                            // add any new steps after the updated last step
                                            var newSteps = result.steps.slice(currentStepCount);
                                            detail.conversionData.steps = detail.conversionData.steps.concat(newSteps);

                                            // update the status message to the new last step name
                                            if (result.job_status === "FAILED") {
                                                detail.progressBarType = "danger";
                                            } else if (result.job_status === "DONE") {
                                                detail.progressBarType = "success";
                                            } else {
                                                detail.progressBarType = "info";
                                            }

                                            detail.currentProgressMessage = detail.conversionData.steps[detail.conversionData.steps.length - 1].step_name;
                                        }

                                        if (!result.job_end_time || result.steps[newStepCount - 1].status === "INPROGRESS") {

                                            // still in progress--schedule the next check
                                            // schedule at least one final check in any case
                                            return $timeout(function() {
                                                return detail.updateSteps();
                                            }, 2000);
                                        } else {
                                            detail.conversionData.job_status = result.job_status;
                                            detail.conversionData.job_end_time = result.job_end_time;

                                            if (detail.conversionData.job_status === "DONE") {
                                                detail.currentProgressMessage = LOCALE.maketext("Conversion Completed");
                                                detail.progressBarType = "success";
                                            } else if (detail.conversionData.job_status === "FAILED") {
                                                detail.currentProgressMessage = LOCALE.maketext("Conversion Failed");
                                                detail.progressBarType = "danger";
                                            }
                                        }
                                    }

                                }, function(error) {
                                    growl.error(error);
                                }
                            );
                    };

                    detail.load = function() {
                        detail.loading = true;
                        detail.updateSteps()
                            .finally(
                                function() {
                                    detail.loading = false;
                                }
                            );
                    };

                    detail.goToHistory = function() {
                        return $location.path("/history");
                    };

                    detail.init = function() {
                        detail.jobId = $routeParams.jobid;
                        detail.load();
                    };

                    detail.init();
                }
            ]);

        return controller;
    }
);

/*
# views/subaccounts.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/views/subaccounts',[
        "angular",
        "cjt/util/locale",
        "cjt/decorators/growlDecorator",
        "app/services/ConvertAddonData"
    ],
    function(angular, LOCALE) {

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

        var controller = app.controller(
            "subaccountSelectionController",
            ["$scope", "$q", "$location", "$routeParams", "ConvertAddonData",
                function($scope, $q, $location, $routeParams, ConvertAddonData) {
                    var sub_vm = this;

                    sub_vm.ui = {};
                    sub_vm.ui.is_loading = false;
                    sub_vm.ui.domain_exists = false;
                    sub_vm.this_domain = {};

                    sub_vm.stats = {};

                    function init() {
                        sub_vm.ui.is_loading = true;

                        ConvertAddonData.getAddonDomain($routeParams.addondomain)
                            .then(function(data) {
                                if (Object.keys(data).length) {
                                    sub_vm.domain_name = data.addon_domain;
                                    sub_vm.this_domain = data;

                                    sub_vm.ftp_accounts = data.move_options["ftp-accounts"];
                                    sub_vm.webdisk_accounts = data.move_options["webdisk-accounts"];

                                    sub_vm.ui.domain_exists = true;
                                } else {
                                    sub_vm.domain_name = $routeParams.addondomain;
                                    sub_vm.ui.domain_exists = false;
                                }
                            })
                            .finally(function() {
                                sub_vm.ui.is_loading = false;
                            });
                    }

                    sub_vm.saveOptions = function() {
                        sub_vm.this_domain.modified = true;
                        sub_vm.this_domain.move_options["ftp-accounts"] = sub_vm.ftp_accounts;
                        sub_vm.this_domain.move_options["webdisk-accounts"] = sub_vm.webdisk_accounts;
                        return $location.path("/convert/" + sub_vm.domain_name + "/migrations");
                    };

                    sub_vm.goBack = function() {
                        return $location.path("/convert/" + sub_vm.domain_name + "/migrations");
                    };

                    init();
                }
            ]);

        return controller;
    }
);

/*
# convert_addon_to_account/directives/job_status.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/job_status',[
        "angular",
        "cjt/util/locale",
        "cjt/core",
    ],
    function(angular, LOCALE, CJT) {

        var app = angular.module("App");
        app.directive("jobStatus",
            [
                function() {
                    var TEMPLATE_PATH = "directives/job_status.phtml";
                    var RELATIVE_PATH = "templates/convert_addon_to_account/" + TEMPLATE_PATH;
                    var IN_PROGRESS_TEXT = LOCALE.maketext("In Progress");
                    var DONE_TEXT = LOCALE.maketext("Done");
                    var FAILED_TEXT = LOCALE.maketext("Failed");
                    var DEFAULT_TEXT = "";

                    function update_status(status, scope) {
                        scope.success = false;
                        scope.error = false;
                        scope.pending = false;

                        if (status === "INPROGRESS") {
                            scope.label = IN_PROGRESS_TEXT;
                            scope.pending = true;
                        } else if (status === "DONE") {
                            scope.label = DONE_TEXT;
                            scope.success = true;
                        } else if (status === "FAILED") {
                            scope.label = FAILED_TEXT;
                            scope.error = true;
                        } else {
                            scope.label = DEFAULT_TEXT;
                        }
                    }

                    return {
                        replace: true,
                        require: "ngModel",
                        restrict: "E",
                        scope: {
                            ngModel: "=",
                        },
                        templateUrl: CJT.config.debug ? CJT.buildFullPath(RELATIVE_PATH) : TEMPLATE_PATH,
                        link: function(scope, element, attrs) {
                            update_status(scope.ngModel, scope);

                            scope.$watch("ngModel", function(newValue, oldValue) {
                                if (newValue && newValue !== oldValue) {
                                    update_status(newValue, scope);
                                }
                            });
                        }
                    };
                }
            ]);
    }
);

/*
# convert_addon_to_account/views/history.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 */
/* eslint camelcase: "off" */

define(
    'app/views/history',[
        "angular",
        "lodash",
        "cjt/util/locale",
        "app/models/dynamic_table",
        "app/services/conversion_history",
        "app/filters/local_datetime_filter",
        "app/directives/job_status",
        "cjt/decorators/growlDecorator",
        "cjt/decorators/paginationDecorator",
        "cjt/directives/toggleSortDirective",
        "cjt/directives/searchDirective",
        "cjt/directives/pageSizeDirective"
    ],
    function(angular, _, LOCALE, DynamicTable, ConversionHistory) {
        "use strict";

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

        var controller = app.controller(
            "historyController",
            ["$location", "growl", "ConversionHistory", "$timeout", "$scope",
                function($location, growl, ConversionHistory, $timeout, $scope) {
                    var history_vm = this;

                    history_vm.ui = {};
                    history_vm.ui.is_loading = false;
                    history_vm.in_progress = {};
                    history_vm.in_progress_timer = null;

                    var conversion_table = new DynamicTable();
                    conversion_table.setSort("start_time");

                    function searchConversionsFunction(item, searchText) {
                        return item.domain.indexOf(searchText) !== -1;
                    }
                    conversion_table.setFilterFunction(searchConversionsFunction);

                    history_vm.conversions = {
                        "meta": conversion_table.getMetadata(),
                        "filteredList": conversion_table.getList(),
                        "paginationMessage": conversion_table.paginationMessage,
                        "fetch": function() {
                            history_vm.conversions.filteredList = conversion_table.populate();
                        },
                        "sortList": function() {
                            history_vm.conversions.fetch();
                        },
                        "selectPage": function() {
                            history_vm.conversions.fetch();
                        },
                        "selectPageSize": function() {
                            history_vm.conversions.fetch();
                        },
                        "searchList": function() {
                            history_vm.conversions.fetch();
                        }
                    };

                    history.clearSearch = function(event) {
                        if (event.keyCode === 27) {
                            history.conversions.meta.filterValue = "";
                            history.conversions.searchList();
                        }
                    };

                    // sort the status in descending order to make the
                    // most recent ones show at the top
                    history_vm.conversions.meta.sortDirection = "desc";

                    history_vm.updateStatusFor = function(job_ids) {
                        return ConversionHistory.getJobStatus(job_ids)
                            .then(function(data) {
                                for (var job in data) {
                                    if (history_vm.in_progress[job] !== void 0 &&
                                    data[job].job_status !== history_vm.in_progress[job].status) {
                                        history_vm.in_progress[job].status = data[job].job_status;

                                        if (data[job].job_status !== "INPROGRESS") {
                                            history_vm.in_progress[job].end_time = data[job].job_end_time;
                                            var this_domain = history_vm.in_progress[job].domain;
                                            if (data[job].job_status === "FAILED") {
                                                growl.error(LOCALE.maketext("The conversion of the domain “[_1]” failed.", _.escape(this_domain)));
                                            } else {
                                                growl.info(LOCALE.maketext("The conversion of the domain “[_1]” succeeded.", _.escape(this_domain)));
                                            }
                                            delete history_vm.in_progress[job];
                                        }
                                    }
                                }

                                if (Object.keys(history_vm.in_progress).length !== 0) {
                                    history_vm.in_progress_timer = $timeout(function() {
                                        history_vm.updateStatusFor(job_ids);
                                    }, 1000);
                                }
                            });
                    };

                    history_vm.goToDetailsView = function(job_id) {
                        return $location.path("/history/" + job_id + "/detail");
                    };

                    history_vm.viewAddons = function() {
                        $location.path("/main");
                    };

                    history_vm.init = function() {
                        history_vm.ui.is_loading = true;

                        ConversionHistory.load()
                            .then(function(data) {
                                conversion_table.loadData(data);
                                history_vm.conversions.fetch();

                                // iterate through the list of
                                // jobs and find the ones that are
                                // in progress
                                var totalJobs = data.length;
                                var i = 0;

                                for (; i < totalJobs; i++) {
                                    if (data[i].status === "INPROGRESS") {
                                        history_vm.in_progress[data[i].job_id] = data[i];
                                    }
                                }

                                var job_ids = Object.keys(history_vm.in_progress);

                                if (job_ids.length > 0) {
                                /* jshint -W083 */
                                    history_vm.in_progress_timer = $timeout( function() {
                                        history_vm.updateStatusFor(job_ids);
                                    }, 1000);
                                /* jshint +W083 */
                                }

                            })
                            .catch(function(meta) {
                                growl.error(meta.reason);
                            })
                            .finally(function() {
                                history_vm.ui.is_loading = false;
                            });
                    };

                    history_vm.clearInProgress = function() {
                        if (history_vm.in_progress_timer) {
                            $timeout.cancel(history_vm.in_progress_timer);
                            history_vm.in_progress_timer = null;
                        }
                        history_vm.in_progress = {};
                    };

                    history_vm.forceLoadList = function() {
                        conversion_table.clear();
                        history_vm.clearInProgress();
                        history_vm.init();
                    };

                    $scope.$on("$destroy", function() {
                        history_vm.clearInProgress();
                    });

                    history_vm.init();
                }
            ]);

        return controller;
    }
);

/*
# index.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 require: false, define: false, PAGE: false */
/* jshint -W100 */

define(
    'app/index',[
        "angular",
        "jquery",
        "cjt/core",
        "cjt/modules",
        "ngRoute",
        "ngAnimate",
        "uiBootstrap"
    ],
    function(angular, $, CJT) {
        return function() {
            angular.module("App", [
                "cjt2.config.whm.configProvider", // This needs to load first
                "ngRoute",
                "ngAnimate",
                "ui.bootstrap",
                "angular-growl",
                "cjt2.whm"
            ]);

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

                    // Application Modules
                    "app/services/pageDataService",
                    "app/services/ConvertAddonData",
                    "app/services/Databases",
                    "app/services/account_packages",
                    "app/services/conversion_history",
                    "app/filters/local_datetime_filter",
                    "app/views/main",
                    "app/views/move_options",
                    "app/views/docroot",
                    "app/views/dns",
                    "app/views/email_options",
                    "app/views/db_options",
                    "app/views/conversion_detail",
                    "app/views/subaccounts",
                    "app/views/history",
                    "app/directives/move_status",
                    "app/directives/job_status"
                ], function(BOOTSTRAP) {

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

                    app.firstLoad = {
                        addonList: true
                    };

                    // setup the defaults for the various services.
                    app.factory("defaultInfo", [
                        "pageDataService",
                        function(pageDataService) {
                            return pageDataService.prepareDefaultInfo(PAGE);
                        }
                    ]);

                    app.config([
                        "$routeProvider",
                        "$anchorScrollProvider",
                        function($routeProvider,
                            $anchorScrollProvider) {

                            $anchorScrollProvider.disableAutoScrolling();

                            // Setup the routes
                            $routeProvider.when("/main", {
                                controller: "mainController",
                                controllerAs: "main",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/main.ptt")
                            });

                            $routeProvider.when("/convert/:addondomain/migrations", {
                                controller: "moveSelectionController",
                                controllerAs: "move_options_vm",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/move_options.ptt")
                            });

                            $routeProvider.when("/convert/:addondomain/migrations/edit/docroot", {
                                controller: "docrootController",
                                controllerAs: "docroot",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/docroot.ptt")
                            });

                            $routeProvider.when("/convert/:addondomain/migrations/edit/email", {
                                controller: "emailSelectionController",
                                controllerAs: "email_selection_vm",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/email_options.ptt")
                            });

                            $routeProvider.when("/convert/:addondomain/migrations/edit/databases", {
                                controller: "databaseSelectionController",
                                controllerAs: "db_selection_vm",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/db_options.ptt")
                            });

                            $routeProvider.when("/convert/:addondomain/migrations/edit/dns", {
                                controller: "dnsSelectionController",
                                controllerAs: "dns",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/dns.ptt")
                            });

                            $routeProvider.when("/convert/:addondomain/migrations/edit/subaccounts", {
                                controller: "subaccountSelectionController",
                                controllerAs: "sub_vm",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/subaccounts.ptt")
                            });

                            $routeProvider.when("/history", {
                                controller: "historyController",
                                controllerAs: "history",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/history.ptt")
                            });

                            $routeProvider.when("/history/:jobid/detail", {
                                controller: "conversionDetailController",
                                controllerAs: "detail",
                                templateUrl: CJT.buildFullPath("convert_addon_to_account/views/conversion_detail.ptt"),
                            });

                            $routeProvider.otherwise({
                                "redirectTo": "/main"
                            });
                        }
                    ]);

                    app.run(["$rootScope", "$anchorScroll", "$timeout", "$location", "growl", "growlMessages",
                        function($rootScope, $anchorScroll, $timeout, $location, growl, growlMessages) {

                            // account for the extra margin from the pageContainer div
                            $anchorScroll.yOffset = 41;
                        }
                    ]);

                    BOOTSTRAP(document);

                });

            return app;
        };
    }
);

Back to Directory File Manager