📁
SKYSHELL MANAGER
PHP v8.2.31
Create
Create
Path:
root
/
home
/
thevaxnx
/
nativize.com
/
staging
/
wp-includes
/
js
/
tinymce
/
themes
/
Name
Size
Perm
Actions
📁
inlite
-
0755
🗑️
🏷️
🔒
📁
modern
-
0755
🗑️
🏷️
🔒
📄
wp-links-opml.php
6.83 KB
0444
🗑️
🏷️
⬇️
✏️
🔒
Edit: index.cmb.js
/* * tools/views/sslStatus.js Copyright 2022 cPanel, L.L.C. * All rights reserved. * copyright@cpanel.net http://cpanel.net * This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false */ define( 'app/views/sslStatus',[ "angular", "cjt/util/locale", "cjt/modules", "cjt/services/cpanel/SSLStatus", "uiBootstrap", ], function(angular, LOCALE, modules, SSLStatus) { "use strict"; var MODULE_NAMESPACE = "cpanel.tools.views.sslStatus"; var MODULE_DEPENDANCIES = [ "cjt2.cpanel", SSLStatus.namespace, ]; var CONTROLLER_NAME = "sslStatusController"; var CONTROLLER_INJECTABLES = ["$scope", SSLStatus.serviceName, "$timeout"]; var CONTROLLER = function SSLStatusController($scope, $service, $timeout) { $scope.sslStatusString = null; $scope.sslStatusLoaded = false; $scope.sslValidationIconClasses = "fas fa-spinner fa-spin"; $scope.statusColorClasses = ""; $scope.certErrorsMessage = ""; $scope.domainLink = "#"; $scope._setSSLCertificate = function _setSSLCertificate(sslCertificate) { $scope.sslStatusLoaded = true; $scope.sslStatusString = sslCertificate.getTypeName(); $scope.expandedSslStatusString = sslCertificate.getTypeName({ stripMarkup: true }); $scope.sslValidationIconClasses = sslCertificate.getIconClasses() === "fas fa-unlock-alt" ? "ri-lock-unlock-line" : "ri-lock-line"; $scope.statusColorClasses = sslCertificate.getStatusColorClass(); $scope.sslSecured = $scope.statusColorClasses !== "text-danger"; $scope.certHasErrors = sslCertificate.hasErrors; $scope.certErrorsMessage = LOCALE.maketext("The certificate has the following errors: [list_and,_1]", sslCertificate.getErrors()); // since a cert is always returned, if it has any kind of validation type, display it as ssl $scope.domainLink = sslCertificate.validationType ? "https://" + $scope.primaryDomain : "http://" + $scope.primaryDomain; }; $scope._domainNotSet = function _domainNotSet() { throw "primaryDomain must be set on init"; }; // return this for testing return $timeout(function() { if (!$scope.primaryDomain) { $scope._domainNotSet(); return; } $scope.domainLink = "http://" + $scope.primaryDomain; return $service.getDomainSSLCertificate($scope.primaryDomain, true).then($scope._setSSLCertificate.bind($scope)); }, 1); }; CONTROLLER_INJECTABLES.push(CONTROLLER); var app = angular.module(MODULE_NAMESPACE, MODULE_DEPENDANCIES); app.controller(CONTROLLER_NAME, CONTROLLER_INJECTABLES); return { "controller": CONTROLLER_NAME, "class": CONTROLLER, "namespace": MODULE_NAMESPACE, }; } ); (function(root) { define("jquery-chosen", ["jquery"], function() { return (function() { /*! Chosen, a Select Box Enhancer for jQuery and Prototype by Patrick Filler for Harvest, http://getharvest.com Version 1.5.1 Full source at https://github.com/harvesthq/chosen Copyright (c) 2011-2016 Harvest http://getharvest.com MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md This file is generated by `grunt build`, do not edit it by hand. */ (function() { var $, AbstractChosen, Chosen, SelectParser, _ref, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }; SelectParser = (function() { function SelectParser() { this.options_index = 0; this.parsed = []; } SelectParser.prototype.add_node = function(child) { if (child.nodeName.toUpperCase() === "OPTGROUP") { return this.add_group(child); } else { return this.add_option(child); } }; SelectParser.prototype.add_group = function(group) { var group_position, option, _i, _len, _ref, _results; group_position = this.parsed.length; this.parsed.push({ array_index: group_position, group: true, label: this.escapeExpression(group.label), title: group.title ? group.title : void 0, children: 0, disabled: group.disabled, classes: group.className }); _ref = group.childNodes; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { option = _ref[_i]; _results.push(this.add_option(option, group_position, group.disabled)); } return _results; }; SelectParser.prototype.add_option = function(option, group_position, group_disabled) { if (option.nodeName.toUpperCase() === "OPTION") { if (option.text !== "") { if (group_position != null) { this.parsed[group_position].children += 1; } this.parsed.push({ array_index: this.parsed.length, options_index: this.options_index, value: option.value, text: option.text, html: option.innerHTML, title: option.title ? option.title : void 0, selected: option.selected, disabled: group_disabled === true ? group_disabled : option.disabled, group_array_index: group_position, group_label: group_position != null ? this.parsed[group_position].label : null, classes: option.className, style: option.style.cssText }); } else { this.parsed.push({ array_index: this.parsed.length, options_index: this.options_index, empty: true }); } return this.options_index += 1; } }; SelectParser.prototype.escapeExpression = function(text) { var map, unsafe_chars; if ((text == null) || text === false) { return ""; } if (!/[\&\<\>\"\'\`]/.test(text)) { return text; } map = { "<": "<", ">": ">", '"': """, "'": "'", "`": "`" }; unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g; return text.replace(unsafe_chars, function(chr) { return map[chr] || "&"; }); }; return SelectParser; })(); SelectParser.select_to_array = function(select) { var child, parser, _i, _len, _ref; parser = new SelectParser(); _ref = select.childNodes; for (_i = 0, _len = _ref.length; _i < _len; _i++) { child = _ref[_i]; parser.add_node(child); } return parser.parsed; }; AbstractChosen = (function() { function AbstractChosen(form_field, options) { this.form_field = form_field; this.options = options != null ? options : {}; if (!AbstractChosen.browser_is_supported()) { return; } this.is_multiple = this.form_field.multiple; this.set_default_text(); this.set_default_values(); this.setup(); this.set_up_html(); this.register_observers(); this.on_ready(); } AbstractChosen.prototype.set_default_values = function() { var _this = this; this.click_test_action = function(evt) { return _this.test_active_click(evt); }; this.activate_action = function(evt) { return _this.activate_field(evt); }; this.active_field = false; this.mouse_on_container = false; this.results_showing = false; this.result_highlighted = null; this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; this.disable_search_threshold = this.options.disable_search_threshold || 0; this.disable_search = this.options.disable_search || false; this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; this.group_search = this.options.group_search != null ? this.options.group_search : true; this.search_contains = this.options.search_contains || false; this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; this.max_selected_options = this.options.max_selected_options || Infinity; this.inherit_select_classes = this.options.inherit_select_classes || false; this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; this.include_group_label_in_selected = this.options.include_group_label_in_selected || false; return this.max_shown_results = this.options.max_shown_results || Number.POSITIVE_INFINITY; }; AbstractChosen.prototype.set_default_text = function() { if (this.form_field.getAttribute("data-placeholder")) { this.default_text = this.form_field.getAttribute("data-placeholder"); } else if (this.is_multiple) { this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; } else { this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; } return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; }; AbstractChosen.prototype.choice_label = function(item) { if (this.include_group_label_in_selected && (item.group_label != null)) { return "<b class='group-name'>" + item.group_label + "</b>" + item.html; } else { return item.html; } }; AbstractChosen.prototype.mouse_enter = function() { return this.mouse_on_container = true; }; AbstractChosen.prototype.mouse_leave = function() { return this.mouse_on_container = false; }; AbstractChosen.prototype.input_focus = function(evt) { var _this = this; if (this.is_multiple) { if (!this.active_field) { return setTimeout((function() { return _this.container_mousedown(); }), 50); } } else { if (!this.active_field) { return this.activate_field(); } } }; AbstractChosen.prototype.input_blur = function(evt) { var _this = this; if (!this.mouse_on_container) { this.active_field = false; return setTimeout((function() { return _this.blur_test(); }), 100); } }; AbstractChosen.prototype.results_option_build = function(options) { var content, data, data_content, shown_results, _i, _len, _ref; content = ''; shown_results = 0; _ref = this.results_data; for (_i = 0, _len = _ref.length; _i < _len; _i++) { data = _ref[_i]; data_content = ''; if (data.group) { data_content = this.result_add_group(data); } else { data_content = this.result_add_option(data); } if (data_content !== '') { shown_results++; content += data_content; } if (options != null ? options.first : void 0) { if (data.selected && this.is_multiple) { this.choice_build(data); } else if (data.selected && !this.is_multiple) { this.single_set_selected_text(this.choice_label(data)); } } if (shown_results >= this.max_shown_results) { break; } } return content; }; AbstractChosen.prototype.result_add_option = function(option) { var classes, option_el; if (!option.search_match) { return ''; } if (!this.include_option_in_results(option)) { return ''; } classes = []; if (!option.disabled && !(option.selected && this.is_multiple)) { classes.push("active-result"); } if (option.disabled && !(option.selected && this.is_multiple)) { classes.push("disabled-result"); } if (option.selected) { classes.push("result-selected"); } if (option.group_array_index != null) { classes.push("group-option"); } if (option.classes !== "") { classes.push(option.classes); } option_el = document.createElement("li"); option_el.className = classes.join(" "); option_el.style.cssText = option.style; option_el.setAttribute("data-option-array-index", option.array_index); option_el.innerHTML = option.search_text; if (option.title) { option_el.title = option.title; } return this.outerHTML(option_el); }; AbstractChosen.prototype.result_add_group = function(group) { var classes, group_el; if (!(group.search_match || group.group_match)) { return ''; } if (!(group.active_options > 0)) { return ''; } classes = []; classes.push("group-result"); if (group.classes) { classes.push(group.classes); } group_el = document.createElement("li"); group_el.className = classes.join(" "); group_el.innerHTML = group.search_text; if (group.title) { group_el.title = group.title; } return this.outerHTML(group_el); }; AbstractChosen.prototype.results_update_field = function() { this.set_default_text(); if (!this.is_multiple) { this.results_reset_cleanup(); } this.result_clear_highlight(); this.results_build(); if (this.results_showing) { return this.winnow_results(); } }; AbstractChosen.prototype.reset_single_select_options = function() { var result, _i, _len, _ref, _results; _ref = this.results_data; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { result = _ref[_i]; if (result.selected) { _results.push(result.selected = false); } else { _results.push(void 0); } } return _results; }; AbstractChosen.prototype.results_toggle = function() { if (this.results_showing) { return this.results_hide(); } else { return this.results_show(); } }; AbstractChosen.prototype.results_search = function(evt) { if (this.results_showing) { return this.winnow_results(); } else { return this.results_show(); } }; AbstractChosen.prototype.winnow_results = function() { var escapedSearchText, option, regex, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref; this.no_results_clear(); results = 0; searchText = this.get_search_text(); escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); zregex = new RegExp(escapedSearchText, 'i'); regex = this.get_search_regex(escapedSearchText); _ref = this.results_data; for (_i = 0, _len = _ref.length; _i < _len; _i++) { option = _ref[_i]; option.search_match = false; results_group = null; if (this.include_option_in_results(option)) { if (option.group) { option.group_match = false; option.active_options = 0; } if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { results_group = this.results_data[option.group_array_index]; if (results_group.active_options === 0 && results_group.search_match) { results += 1; } results_group.active_options += 1; } option.search_text = option.group ? option.label : option.html; if (!(option.group && !this.group_search)) { option.search_match = this.search_string_match(option.search_text, regex); if (option.search_match && !option.group) { results += 1; } if (option.search_match) { if (searchText.length) { startpos = option.search_text.search(zregex); text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length); option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos); } if (results_group != null) { results_group.group_match = true; } } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { option.search_match = true; } } } } this.result_clear_highlight(); if (results < 1 && searchText.length) { this.update_results_content(""); return this.no_results(searchText); } else { this.update_results_content(this.results_option_build()); return this.winnow_results_set_highlight(); } }; AbstractChosen.prototype.get_search_regex = function(escaped_search_string) { var regex_anchor; regex_anchor = this.search_contains ? "" : "^"; return new RegExp(regex_anchor + escaped_search_string, 'i'); }; AbstractChosen.prototype.search_string_match = function(search_string, regex) { var part, parts, _i, _len; if (regex.test(search_string)) { return true; } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) { parts = search_string.replace(/\[|\]/g, "").split(" "); if (parts.length) { for (_i = 0, _len = parts.length; _i < _len; _i++) { part = parts[_i]; if (regex.test(part)) { return true; } } } } }; AbstractChosen.prototype.choices_count = function() { var option, _i, _len, _ref; if (this.selected_option_count != null) { return this.selected_option_count; } this.selected_option_count = 0; _ref = this.form_field.options; for (_i = 0, _len = _ref.length; _i < _len; _i++) { option = _ref[_i]; if (option.selected) { this.selected_option_count += 1; } } return this.selected_option_count; }; AbstractChosen.prototype.choices_click = function(evt) { evt.preventDefault(); if (!(this.results_showing || this.is_disabled)) { return this.results_show(); } }; AbstractChosen.prototype.keyup_checker = function(evt) { var stroke, _ref; stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; this.search_field_scale(); switch (stroke) { case 8: if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { return this.keydown_backstroke(); } else if (!this.pending_backstroke) { this.result_clear_highlight(); return this.results_search(); } break; case 13: evt.preventDefault(); if (this.results_showing) { return this.result_select(evt); } break; case 27: if (this.results_showing) { this.results_hide(); } return true; case 9: case 38: case 40: case 16: case 91: case 17: case 18: break; default: return this.results_search(); } }; AbstractChosen.prototype.clipboard_event_checker = function(evt) { var _this = this; return setTimeout((function() { return _this.results_search(); }), 50); }; AbstractChosen.prototype.container_width = function() { if (this.options.width != null) { return this.options.width; } else { return "" + this.form_field.offsetWidth + "px"; } }; AbstractChosen.prototype.include_option_in_results = function(option) { if (this.is_multiple && (!this.display_selected_options && option.selected)) { return false; } if (!this.display_disabled_options && option.disabled) { return false; } if (option.empty) { return false; } return true; }; AbstractChosen.prototype.search_results_touchstart = function(evt) { this.touch_started = true; return this.search_results_mouseover(evt); }; AbstractChosen.prototype.search_results_touchmove = function(evt) { this.touch_started = false; return this.search_results_mouseout(evt); }; AbstractChosen.prototype.search_results_touchend = function(evt) { if (this.touch_started) { return this.search_results_mouseup(evt); } }; AbstractChosen.prototype.outerHTML = function(element) { var tmp; if (element.outerHTML) { return element.outerHTML; } tmp = document.createElement("div"); tmp.appendChild(element); return tmp.innerHTML; }; AbstractChosen.browser_is_supported = function() { if (/iP(od|hone)/i.test(window.navigator.userAgent)) { return false; } if (/Android/i.test(window.navigator.userAgent)) { if (/Mobile/i.test(window.navigator.userAgent)) { return false; } } if (/IEMobile/i.test(window.navigator.userAgent)) { return false; } if (/Windows Phone/i.test(window.navigator.userAgent)) { return false; } if (/BlackBerry/i.test(window.navigator.userAgent)) { return false; } if (/BB10/i.test(window.navigator.userAgent)) { return false; } if (window.navigator.appName === "Microsoft Internet Explorer") { return document.documentMode >= 8; } return true; }; AbstractChosen.default_multiple_text = "Select Some Options"; AbstractChosen.default_single_text = "Select an Option"; AbstractChosen.default_no_result_text = "No results match"; return AbstractChosen; })(); $ = jQuery; $.fn.extend({ chosen: function(options) { if (!AbstractChosen.browser_is_supported()) { return this; } return this.each(function(input_field) { var $this, chosen; $this = $(this); chosen = $this.data('chosen'); if (options === 'destroy') { if (chosen instanceof Chosen) { chosen.destroy(); } return; } if (!(chosen instanceof Chosen)) { $this.data('chosen', new Chosen(this, options)); } }); } }); Chosen = (function(_super) { __extends(Chosen, _super); function Chosen() { _ref = Chosen.__super__.constructor.apply(this, arguments); return _ref; } Chosen.prototype.setup = function() { this.form_field_jq = $(this.form_field); this.current_selectedIndex = this.form_field.selectedIndex; return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl"); }; Chosen.prototype.set_up_html = function() { var container_classes, container_props; container_classes = ["chosen-container"]; container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); if (this.inherit_select_classes && this.form_field.className) { container_classes.push(this.form_field.className); } if (this.is_rtl) { container_classes.push("chosen-rtl"); } container_props = { 'class': container_classes.join(' '), 'style': "width: " + (this.container_width()) + ";", 'title': this.form_field.title }; if (this.form_field.id.length) { container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; } this.container = $("<div />", container_props); if (this.is_multiple) { this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>'); } else { this.container.html('<a class="chosen-single chosen-default"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>'); } this.form_field_jq.hide().after(this.container); this.dropdown = this.container.find('div.chosen-drop').first(); this.search_field = this.container.find('input').first(); this.search_results = this.container.find('ul.chosen-results').first(); this.search_field_scale(); this.search_no_results = this.container.find('li.no-results').first(); if (this.is_multiple) { this.search_choices = this.container.find('ul.chosen-choices').first(); this.search_container = this.container.find('li.search-field').first(); } else { this.search_container = this.container.find('div.chosen-search').first(); this.selected_item = this.container.find('.chosen-single').first(); } this.results_build(); this.set_tab_index(); return this.set_label_behavior(); }; Chosen.prototype.on_ready = function() { return this.form_field_jq.trigger("chosen:ready", { chosen: this }); }; Chosen.prototype.register_observers = function() { var _this = this; this.container.bind('touchstart.chosen', function(evt) { _this.container_mousedown(evt); return evt.preventDefault(); }); this.container.bind('touchend.chosen', function(evt) { _this.container_mouseup(evt); return evt.preventDefault(); }); this.container.bind('mousedown.chosen', function(evt) { _this.container_mousedown(evt); }); this.container.bind('mouseup.chosen', function(evt) { _this.container_mouseup(evt); }); this.container.bind('mouseenter.chosen', function(evt) { _this.mouse_enter(evt); }); this.container.bind('mouseleave.chosen', function(evt) { _this.mouse_leave(evt); }); this.search_results.bind('mouseup.chosen', function(evt) { _this.search_results_mouseup(evt); }); this.search_results.bind('mouseover.chosen', function(evt) { _this.search_results_mouseover(evt); }); this.search_results.bind('mouseout.chosen', function(evt) { _this.search_results_mouseout(evt); }); this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) { _this.search_results_mousewheel(evt); }); this.search_results.bind('touchstart.chosen', function(evt) { _this.search_results_touchstart(evt); }); this.search_results.bind('touchmove.chosen', function(evt) { _this.search_results_touchmove(evt); }); this.search_results.bind('touchend.chosen', function(evt) { _this.search_results_touchend(evt); }); this.form_field_jq.bind("chosen:updated.chosen", function(evt) { _this.results_update_field(evt); }); this.form_field_jq.bind("chosen:activate.chosen", function(evt) { _this.activate_field(evt); }); this.form_field_jq.bind("chosen:open.chosen", function(evt) { _this.container_mousedown(evt); }); this.form_field_jq.bind("chosen:close.chosen", function(evt) { _this.input_blur(evt); }); this.search_field.bind('blur.chosen', function(evt) { _this.input_blur(evt); }); this.search_field.bind('keyup.chosen', function(evt) { _this.keyup_checker(evt); }); this.search_field.bind('keydown.chosen', function(evt) { _this.keydown_checker(evt); }); this.search_field.bind('focus.chosen', function(evt) { _this.input_focus(evt); }); this.search_field.bind('cut.chosen', function(evt) { _this.clipboard_event_checker(evt); }); this.search_field.bind('paste.chosen', function(evt) { _this.clipboard_event_checker(evt); }); if (this.is_multiple) { return this.search_choices.bind('click.chosen', function(evt) { _this.choices_click(evt); }); } else { return this.container.bind('click.chosen', function(evt) { evt.preventDefault(); }); } }; Chosen.prototype.destroy = function() { $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); if (this.search_field[0].tabIndex) { this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; } this.container.remove(); this.form_field_jq.removeData('chosen'); return this.form_field_jq.show(); }; Chosen.prototype.search_field_disabled = function() { this.is_disabled = this.form_field_jq[0].disabled; if (this.is_disabled) { this.container.addClass('chosen-disabled'); this.search_field[0].disabled = true; if (!this.is_multiple) { this.selected_item.unbind("focus.chosen", this.activate_action); } return this.close_field(); } else { this.container.removeClass('chosen-disabled'); this.search_field[0].disabled = false; if (!this.is_multiple) { return this.selected_item.bind("focus.chosen", this.activate_action); } } }; Chosen.prototype.container_mousedown = function(evt) { if (!this.is_disabled) { if (evt && evt.type === "mousedown" && !this.results_showing) { evt.preventDefault(); } if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { if (!this.active_field) { if (this.is_multiple) { this.search_field.val(""); } $(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action); this.results_show(); } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { evt.preventDefault(); this.results_toggle(); } return this.activate_field(); } } }; Chosen.prototype.container_mouseup = function(evt) { if (evt.target.nodeName === "ABBR" && !this.is_disabled) { return this.results_reset(evt); } }; Chosen.prototype.search_results_mousewheel = function(evt) { var delta; if (evt.originalEvent) { delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail; } if (delta != null) { evt.preventDefault(); if (evt.type === 'DOMMouseScroll') { delta = delta * 40; } return this.search_results.scrollTop(delta + this.search_results.scrollTop()); } }; Chosen.prototype.blur_test = function(evt) { if (!this.active_field && this.container.hasClass("chosen-container-active")) { return this.close_field(); } }; Chosen.prototype.close_field = function() { $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); this.active_field = false; this.results_hide(); this.container.removeClass("chosen-container-active"); this.clear_backstroke(); this.show_search_field_default(); return this.search_field_scale(); }; Chosen.prototype.activate_field = function() { this.container.addClass("chosen-container-active"); this.active_field = true; this.search_field.val(this.search_field.val()); return this.search_field.focus(); }; Chosen.prototype.test_active_click = function(evt) { var active_container; active_container = $(evt.target).closest('.chosen-container'); if (active_container.length && this.container[0] === active_container[0]) { return this.active_field = true; } else { return this.close_field(); } }; Chosen.prototype.results_build = function() { this.parsing = true; this.selected_option_count = null; this.results_data = SelectParser.select_to_array(this.form_field); if (this.is_multiple) { this.search_choices.find("li.search-choice").remove(); } else if (!this.is_multiple) { this.single_set_selected_text(); if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { this.search_field[0].readOnly = true; this.container.addClass("chosen-container-single-nosearch"); } else { this.search_field[0].readOnly = false; this.container.removeClass("chosen-container-single-nosearch"); } } this.update_results_content(this.results_option_build({ first: true })); this.search_field_disabled(); this.show_search_field_default(); this.search_field_scale(); return this.parsing = false; }; Chosen.prototype.result_do_highlight = function(el) { var high_bottom, high_top, maxHeight, visible_bottom, visible_top; if (el.length) { this.result_clear_highlight(); this.result_highlight = el; this.result_highlight.addClass("highlighted"); maxHeight = parseInt(this.search_results.css("maxHeight"), 10); visible_top = this.search_results.scrollTop(); visible_bottom = maxHeight + visible_top; high_top = this.result_highlight.position().top + this.search_results.scrollTop(); high_bottom = high_top + this.result_highlight.outerHeight(); if (high_bottom >= visible_bottom) { return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); } else if (high_top < visible_top) { return this.search_results.scrollTop(high_top); } } }; Chosen.prototype.result_clear_highlight = function() { if (this.result_highlight) { this.result_highlight.removeClass("highlighted"); } return this.result_highlight = null; }; Chosen.prototype.results_show = function() { if (this.is_multiple && this.max_selected_options <= this.choices_count()) { this.form_field_jq.trigger("chosen:maxselected", { chosen: this }); return false; } this.container.addClass("chosen-with-drop"); this.results_showing = true; this.search_field.focus(); this.search_field.val(this.search_field.val()); this.winnow_results(); return this.form_field_jq.trigger("chosen:showing_dropdown", { chosen: this }); }; Chosen.prototype.update_results_content = function(content) { return this.search_results.html(content); }; Chosen.prototype.results_hide = function() { if (this.results_showing) { this.result_clear_highlight(); this.container.removeClass("chosen-with-drop"); this.form_field_jq.trigger("chosen:hiding_dropdown", { chosen: this }); } return this.results_showing = false; }; Chosen.prototype.set_tab_index = function(el) { var ti; if (this.form_field.tabIndex) { ti = this.form_field.tabIndex; this.form_field.tabIndex = -1; return this.search_field[0].tabIndex = ti; } }; Chosen.prototype.set_label_behavior = function() { var _this = this; this.form_field_label = this.form_field_jq.parents("label"); if (!this.form_field_label.length && this.form_field.id.length) { this.form_field_label = $("label[for='" + this.form_field.id + "']"); } if (this.form_field_label.length > 0) { return this.form_field_label.bind('click.chosen', function(evt) { if (_this.is_multiple) { return _this.container_mousedown(evt); } else { return _this.activate_field(); } }); } }; Chosen.prototype.show_search_field_default = function() { if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { this.search_field.val(this.default_text); return this.search_field.addClass("default"); } else { this.search_field.val(""); return this.search_field.removeClass("default"); } }; Chosen.prototype.search_results_mouseup = function(evt) { var target; target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); if (target.length) { this.result_highlight = target; this.result_select(evt); return this.search_field.focus(); } }; Chosen.prototype.search_results_mouseover = function(evt) { var target; target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); if (target) { return this.result_do_highlight(target); } }; Chosen.prototype.search_results_mouseout = function(evt) { if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { return this.result_clear_highlight(); } }; Chosen.prototype.choice_build = function(item) { var choice, close_link, _this = this; choice = $('<li />', { "class": "search-choice" }).html("<span>" + (this.choice_label(item)) + "</span>"); if (item.disabled) { choice.addClass('search-choice-disabled'); } else { close_link = $('<a />', { "class": 'search-choice-close', 'data-option-array-index': item.array_index }); close_link.bind('click.chosen', function(evt) { return _this.choice_destroy_link_click(evt); }); choice.append(close_link); } return this.search_container.before(choice); }; Chosen.prototype.choice_destroy_link_click = function(evt) { evt.preventDefault(); evt.stopPropagation(); if (!this.is_disabled) { return this.choice_destroy($(evt.target)); } }; Chosen.prototype.choice_destroy = function(link) { if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { this.show_search_field_default(); if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) { this.results_hide(); } link.parents('li').first().remove(); return this.search_field_scale(); } }; Chosen.prototype.results_reset = function() { this.reset_single_select_options(); this.form_field.options[0].selected = true; this.single_set_selected_text(); this.show_search_field_default(); this.results_reset_cleanup(); this.form_field_jq.trigger("change"); if (this.active_field) { return this.results_hide(); } }; Chosen.prototype.results_reset_cleanup = function() { this.current_selectedIndex = this.form_field.selectedIndex; return this.selected_item.find("abbr").remove(); }; Chosen.prototype.result_select = function(evt) { var high, item; if (this.result_highlight) { high = this.result_highlight; this.result_clear_highlight(); if (this.is_multiple && this.max_selected_options <= this.choices_count()) { this.form_field_jq.trigger("chosen:maxselected", { chosen: this }); return false; } if (this.is_multiple) { high.removeClass("active-result"); } else { this.reset_single_select_options(); } high.addClass("result-selected"); item = this.results_data[high[0].getAttribute("data-option-array-index")]; item.selected = true; this.form_field.options[item.options_index].selected = true; this.selected_option_count = null; if (this.is_multiple) { this.choice_build(item); } else { this.single_set_selected_text(this.choice_label(item)); } if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) { this.results_hide(); } this.show_search_field_default(); if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { this.form_field_jq.trigger("change", { 'selected': this.form_field.options[item.options_index].value }); } this.current_selectedIndex = this.form_field.selectedIndex; evt.preventDefault(); return this.search_field_scale(); } }; Chosen.prototype.single_set_selected_text = function(text) { if (text == null) { text = this.default_text; } if (text === this.default_text) { this.selected_item.addClass("chosen-default"); } else { this.single_deselect_control_build(); this.selected_item.removeClass("chosen-default"); } return this.selected_item.find("span").html(text); }; Chosen.prototype.result_deselect = function(pos) { var result_data; result_data = this.results_data[pos]; if (!this.form_field.options[result_data.options_index].disabled) { result_data.selected = false; this.form_field.options[result_data.options_index].selected = false; this.selected_option_count = null; this.result_clear_highlight(); if (this.results_showing) { this.winnow_results(); } this.form_field_jq.trigger("change", { deselected: this.form_field.options[result_data.options_index].value }); this.search_field_scale(); return true; } else { return false; } }; Chosen.prototype.single_deselect_control_build = function() { if (!this.allow_single_deselect) { return; } if (!this.selected_item.find("abbr").length) { this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>"); } return this.selected_item.addClass("chosen-single-with-deselect"); }; Chosen.prototype.get_search_text = function() { return $('<div/>').text($.trim(this.search_field.val())).html(); }; Chosen.prototype.winnow_results_set_highlight = function() { var do_high, selected_results; selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); if (do_high != null) { return this.result_do_highlight(do_high); } }; Chosen.prototype.no_results = function(terms) { var no_results_html; no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>'); no_results_html.find("span").first().html(terms); this.search_results.append(no_results_html); return this.form_field_jq.trigger("chosen:no_results", { chosen: this }); }; Chosen.prototype.no_results_clear = function() { return this.search_results.find(".no-results").remove(); }; Chosen.prototype.keydown_arrow = function() { var next_sib; if (this.results_showing && this.result_highlight) { next_sib = this.result_highlight.nextAll("li.active-result").first(); if (next_sib) { return this.result_do_highlight(next_sib); } } else { return this.results_show(); } }; Chosen.prototype.keyup_arrow = function() { var prev_sibs; if (!this.results_showing && !this.is_multiple) { return this.results_show(); } else if (this.result_highlight) { prev_sibs = this.result_highlight.prevAll("li.active-result"); if (prev_sibs.length) { return this.result_do_highlight(prev_sibs.first()); } else { if (this.choices_count() > 0) { this.results_hide(); } return this.result_clear_highlight(); } } }; Chosen.prototype.keydown_backstroke = function() { var next_available_destroy; if (this.pending_backstroke) { this.choice_destroy(this.pending_backstroke.find("a").first()); return this.clear_backstroke(); } else { next_available_destroy = this.search_container.siblings("li.search-choice").last(); if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { this.pending_backstroke = next_available_destroy; if (this.single_backstroke_delete) { return this.keydown_backstroke(); } else { return this.pending_backstroke.addClass("search-choice-focus"); } } } }; Chosen.prototype.clear_backstroke = function() { if (this.pending_backstroke) { this.pending_backstroke.removeClass("search-choice-focus"); } return this.pending_backstroke = null; }; Chosen.prototype.keydown_checker = function(evt) { var stroke, _ref1; stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode; this.search_field_scale(); if (stroke !== 8 && this.pending_backstroke) { this.clear_backstroke(); } switch (stroke) { case 8: this.backstroke_length = this.search_field.val().length; break; case 9: if (this.results_showing && !this.is_multiple) { this.result_select(evt); } this.mouse_on_container = false; break; case 13: if (this.results_showing) { evt.preventDefault(); } break; case 32: if (this.disable_search) { evt.preventDefault(); } break; case 38: evt.preventDefault(); this.keyup_arrow(); break; case 40: evt.preventDefault(); this.keydown_arrow(); break; } }; Chosen.prototype.search_field_scale = function() { var div, f_width, h, style, style_block, styles, w, _i, _len; if (this.is_multiple) { h = 0; w = 0; style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"; styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing']; for (_i = 0, _len = styles.length; _i < _len; _i++) { style = styles[_i]; style_block += style + ":" + this.search_field.css(style) + ";"; } div = $('<div />', { 'style': style_block }); div.text(this.search_field.val()); $('body').append(div); w = div.width() + 25; div.remove(); f_width = this.container.outerWidth(); if (w > f_width - 10) { w = f_width - 10; } return this.search_field.css({ 'width': w + 'px' }); } }; return Chosen; })(AbstractChosen); }).call(this); }).apply(root, arguments); }); }(this)); (function(root) { define("angular-chosen", ["angular","jquery-chosen"], function() { return (function() { /** * angular-chosen-localytics - Angular Chosen directive is an AngularJS Directive that brings the Chosen jQuery in a Angular way * @version v1.3.0 * @link http://github.com/leocaseiro/angular-chosen * @license MIT */ (function() { var indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; angular.module('localytics.directives', []); angular.module('localytics.directives').directive('chosen', [ '$timeout', function($timeout) { var CHOSEN_OPTION_WHITELIST, NG_OPTIONS_REGEXP, isEmpty, snakeCase; NG_OPTIONS_REGEXP = /^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/; CHOSEN_OPTION_WHITELIST = ['persistentCreateOption', 'createOptionText', 'createOption', 'skipNoResults', 'noResultsText', 'allowSingleDeselect', 'disableSearchThreshold', 'disableSearch', 'enableSplitWordSearch', 'inheritSelectClasses', 'maxSelectedOptions', 'placeholderTextMultiple', 'placeholderTextSingle', 'searchContains', 'singleBackstrokeDelete', 'displayDisabledOptions', 'displaySelectedOptions', 'width', 'includeGroupLabelInSelected', 'maxShownResults']; snakeCase = function(input) { return input.replace(/[A-Z]/g, function($1) { return "_" + ($1.toLowerCase()); }); }; isEmpty = function(value) { var key; if (angular.isArray(value)) { return value.length === 0; } else if (angular.isObject(value)) { for (key in value) { if (value.hasOwnProperty(key)) { return false; } } } return true; }; return { restrict: 'A', require: '?ngModel', priority: 1, link: function(scope, element, attr, ngModel) { var chosen, empty, initOrUpdate, match, options, origRender, startLoading, stopLoading, updateMessage, valuesExpr, viewWatch; scope.disabledValuesHistory = scope.disabledValuesHistory ? scope.disabledValuesHistory : []; element = $(element); element.addClass('localytics-chosen'); options = scope.$eval(attr.chosen) || {}; angular.forEach(attr, function(value, key) { if (indexOf.call(CHOSEN_OPTION_WHITELIST, key) >= 0) { return attr.$observe(key, function(value) { options[snakeCase(key)] = String(element.attr(attr.$attr[key])).slice(0, 2) === '{{' ? value : scope.$eval(value); return updateMessage(); }); } }); startLoading = function() { return element.addClass('loading').attr('disabled', true).trigger('chosen:updated'); }; stopLoading = function() { element.removeClass('loading'); if (angular.isDefined(attr.disabled)) { element.attr('disabled', attr.disabled); } else { element.attr('disabled', false); } return element.trigger('chosen:updated'); }; chosen = null; empty = false; initOrUpdate = function() { var defaultText; if (chosen) { return element.trigger('chosen:updated'); } else { $timeout(function() { chosen = element.chosen(options).data('chosen'); }); if (angular.isObject(chosen)) { return defaultText = chosen.default_text; } } }; updateMessage = function() { if (empty) { element.attr('data-placeholder', chosen.results_none_found).attr('disabled', true); } else { element.removeAttr('data-placeholder'); } return element.trigger('chosen:updated'); }; if (ngModel) { origRender = ngModel.$render; ngModel.$render = function() { origRender(); return initOrUpdate(); }; element.on('chosen:hiding_dropdown', function() { return scope.$apply(function() { return ngModel.$setTouched(); }); }); if (attr.multiple) { viewWatch = function() { return ngModel.$viewValue; }; scope.$watch(viewWatch, ngModel.$render, true); } } else { initOrUpdate(); } attr.$observe('disabled', function() { return element.trigger('chosen:updated'); }); if (attr.ngOptions && ngModel) { match = attr.ngOptions.match(NG_OPTIONS_REGEXP); valuesExpr = match[7]; scope.$watchCollection(valuesExpr, function(newVal, oldVal) { var timer; return timer = $timeout(function() { if (angular.isUndefined(newVal)) { return startLoading(); } else { empty = isEmpty(newVal); stopLoading(); return updateMessage(); } }); }); return scope.$on('$destroy', function(event) { if (typeof timer !== "undefined" && timer !== null) { return $timeout.cancel(timer); } }); } } }; } ]); }).call(this); }).apply(root, arguments); }); }(this)); /* # tools/directives/draggableDirective.js Copyright(c) 2022 cPanel, L.L.C. # All rights reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false */ define( 'app/directives/draggableDirective',[ "angular", ], function(angular) { "use strict"; // Retrieve the current application var app; try { app = angular.module("App"); // For runtime } catch (e) { app = angular.module("App", []); // Fall-back for unit testing } /** * Directive that adds HTML5 draggable functionality to DOM objects */ app.directive("draggable", [ function() { return { restrict: "A", scope: { drag: "&", dragEnd: "&", }, link: function(scope, element) { var dragElement = element[0]; dragElement.draggable = true; dragElement.addEventListener("dragstart", function(e) { e.dataTransfer.effectAllowed = "move"; e.dataTransfer.setData("text", this.id); angular.element(this).addClass("drag"); var element = this; scope.$apply(function(scope) { var action = scope.drag(); if ( angular.isDefined(action) ) { action(element.id); } }); return false; }, false); dragElement.addEventListener("dragend", function() { angular.element(this).removeClass("drag"); var element = this; scope.$apply(function(scope) { var action = scope.dragEnd(); if ( angular.isDefined(action) ) { action(element.id); } }); return false; }, false); }, }; }]); } ); /* # tools/directives/dropDirective.js Copyright(c) 2022 cPanel, L.L.C. # All rights reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false */ define( 'app/directives/dropDirective',[ "angular", ], function(angular) { "use strict"; // Retrieve the current application var app; try { app = angular.module("App"); // For runtime } catch (e) { app = angular.module("App", []); // Fall-back for unit testing } /** * Directive that adds HTML5 drop functionality to DOM objects */ app.directive("dropArea", [ function() { return { scope: { drop: "&", }, link: function(scope, element) { var dropAreaElement = element[0]; dropAreaElement.addEventListener("dragover", function(e) { e.dataTransfer.dropEffect = "move"; if (e.preventDefault) { e.preventDefault(); } angular.element(this).addClass("drag-over"); return false; }, false); dropAreaElement.addEventListener("dragenter", function() { angular.element(this).addClass("drag-over"); return false; }, false); dropAreaElement.addEventListener("dragleave", function() { angular.element(this).removeClass("drag-over"); return false; }, false); dropAreaElement.addEventListener("drop", function(e) { if (e.stopPropagation) { e.stopPropagation(); } if (e.preventDefault) { e.preventDefault(); } angular.element(this).removeClass("drag-over"); var dropTarget = this, element = document.getElementById(e.dataTransfer.getData("text")); scope.$apply(function(scope) { var action = scope.drop(); if ( angular.isDefined(action) ) { action(element, dropTarget); } }); return false; }, false); }, }; }]); } ); // Copyright 2023 cPanel, L.L.C. - All rights reserved. // copyright@cpanel.net // https://cpanel.net // This code is subject to the cPanel license. Unauthorized copying is prohibited define( 'app/views/applicationListController',[ "angular", "lodash", "cjt/util/locale", "cjt/services/cpanel/nvDataService", // application related "app/directives/draggableDirective", "app/directives/dropDirective", ], function(angular, _, LOCALE) { "use strict"; // Retrieve the current application var app = angular.module("App"); var controller = app.controller( "applicationListController", ["$scope", "nvDataService", function($scope, nvDataService) { var applicationList = PAGE.appGroups; var collapsedGroupsList = PAGE.collapsedGroups.split("|"); // Binding it to the scope so that $scope.collapsedGroups = PAGE.collapsedGroups; /* Updating the searchText model with the value in * search Field if typed before angular bootstrap. * Hack to ensure delayed search is preformed on the * text in the search box, if user types in before angular * bootstrap completes */ var searchBox = document.querySelector("#quickjump"); if (searchBox && $scope.searchText !== searchBox.value) { $scope.searchText = searchBox.value; } init(); function init() { trackAppLinkClicks(); } function trackAppLinkClicks() { var querySelForAppLinks = "#boxes [id*='-container'] > [id*='-group'] > [id*='-body'] > .icon-container-body > a"; var appLinkEls = document.querySelectorAll(querySelForAppLinks); if (appLinkEls && appLinkEls.length && window["mixpanel"]) { window["mixpanel"].track_links(appLinkEls, "cPanel-Tools-Nav-Link", (linkEl) => { return { "nav-link-id": linkEl.id }; }); } } /** * Clears search on Esc * * @method clearSearch * @param {Event} event Event */ $scope.clearSearch = function(event) { // clear the search when pressing the Esc key if (event.keyCode === 27) { $scope.searchText = ""; } }; var searchCache = {}; /** * Search Groups * * @method searchGroup * @param {Object} group Group * @return {Boolean} If the group needs to be displayed */ $scope.searchGroup = function(group) { if (!$scope.searchText) { return 1; } if (!searchCache[$scope.searchText]) { searchCache[$scope.searchText] = new RegExp($scope.searchText, "i"); } var regex = searchCache[$scope.searchText]; var found = false; var groupInfo = _.find(applicationList, function(app) { return app.group === group; }); var items = groupInfo.length ? groupInfo.items : []; for (var i = 0, len = items.length; i < len; i++) { found = regex.test(items[i].searchtext); if (found) { return found; } } }; /** * Search Item * * @method searchItem * @param {Object} Item Item * @return {Boolean} If the item searchtext matches the searchtext */ $scope.searchItem = function(item) { if (!$scope.searchText) { return 1; } if (!searchCache[$scope.searchText]) { searchCache[$scope.searchText] = new RegExp($scope.searchText, "i"); } var regex = searchCache[$scope.searchText]; return regex.test(item.searchtext); }; /** * Sends the ordered list of application groups to the server to retain * user preferences in the page's NVData object * @param {String} groups - The | delimited list of group order */ var setGroupsOrder = function(groups) { nvDataService.setObject( { xmaingroupsorder: groups, }) .catch(function(error) { console.error(error); }); }; /** * Sends the list of collapsed menu groups to the server to retain * user preferences in the page's NVData object * @param {String} groups - The | delimited list of collapsed menu groups */ var setCollapsedGroupsList = function(groups) { nvDataService.setObject( { xmainrollstatus: groups, }) .catch(function(error) { console.error(error); }); }; /** * Toggles group and saves state in NvData * * @method toggleGroup * @param {Object} group Group */ $scope.toggleGroup = function(group) { var groupBody = angular.element(document.querySelector("#" + group + "-body")); var groupCollapseIndicator = angular.element(document.querySelector("#" + group + "-collapsed-indicator")); group = group + "=0"; var index = collapsedGroupsList.indexOf(group); if (index === -1) { groupBody.removeClass("maximize"); collapsedGroupsList.push(group); groupBody.addClass("minimized ng-hide"); groupCollapseIndicator.removeClass("fa-minus"); groupCollapseIndicator.addClass("fa-plus"); } else { groupBody.removeClass("minimized ng-hide"); collapsedGroupsList.splice(index, 1); groupBody.addClass("maximize"); groupCollapseIndicator.removeClass("fa-plus"); groupCollapseIndicator.addClass("fa-minus"); } var groupList = collapsedGroupsList.join("|"); // updating the collapseGroups model with new changes $scope.collapsedGroups = groupList; // Save the changes to NvData setCollapsedGroupsList(groupList); }; /** * Handles drag event * * @method handleDrag * @param {String} itemID ID of the item thats being dragged. */ $scope.handleDrag = function(itemID) { var groupName = itemID.replace("-group", ""), groupBody = angular.element(document.querySelector("#" + groupName + "-body")); groupBody.removeClass("minimize maximize"); var startingPosition = _.findIndex(applicationList, function(group) { return group.group === groupName; }); var previousDropAreaId = "#top-drop-area"; if (startingPosition > 0) { previousDropAreaId = "#" + applicationList[startingPosition - 1].group + "-drop-area"; } // Hidding the DropArea of the group right above the item being moved. We dont want to // drop the group in the same place var hiddenDropArea = angular.element(document.querySelector(previousDropAreaId)); hiddenDropArea.addClass("drag-hidden"); }; /** * Handles the case when a drag event is started but the item is never dropped into a dropArea * * @method handleDragEnd */ $scope.handleDragEnd = function() { var hiddenDropArea = angular.element(document.querySelectorAll(".drag-hidden")); // On DragEnd ensures none of the dragAreas are hidden hiddenDropArea.removeClass("drag-hidden"); }; /** * Handles the drop of group in dropArea * * @method handleDrop * @param {Object} item The item thats being moved * @param {Object} dropArea The area where the item is dropped */ $scope.handleDrop = function(item, dropArea) { var groupToMove = item.getAttribute("data-group-name"); var moveAfter = dropArea.getAttribute("data-group-name"); var boxes = document.querySelector("#boxes"); var groupToMoveContainer, moveAfterContainer; if (moveAfter) { groupToMoveContainer = document.querySelector("#" + groupToMove + "-container"); moveAfterContainer = document.querySelector("#" + moveAfter + "-container"); } else { groupToMoveContainer = document.querySelector("#" + groupToMove + "-container"); moveAfterContainer = document.querySelector("#top-drop-area"); } // Moving DOM elements if (boxes && groupToMoveContainer && moveAfterContainer) { boxes.insertBefore(groupToMoveContainer, moveAfterContainer.nextSibling); } var oldPosition = _.findIndex(applicationList, function(group) { return group.group === item.id.replace("-group", ""); }); var movedGroup = applicationList[oldPosition]; var newPosition = _.findIndex(applicationList, function(group) { return group.group === dropArea.id.replace("-drop-area", ""); }); if (oldPosition > newPosition) { newPosition += 1; } applicationList.splice(oldPosition, 1); applicationList.splice(newPosition, 0, movedGroup); var newOrder = _.map(applicationList, "group").join("|"); setGroupsOrder(newOrder); }; }, ]); return controller; } ); /* * tools/services/statisticsService.js Copyright(c) 2022 cPanel, L.L.C. * All rights reserved. * copyright@cpanel.net http://cpanel.net * This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false */ define( 'app/services/statisticsService',[ // Libraries "lodash", "angular", "cjt/io/uapi-request", "cjt/services/APICatcher", ], function(_, angular, APIREQUEST) { "use strict"; // Fetch the current application var app = angular.module("App"); /** * Setup the account list model's API service */ app.factory("statisticsService", ["APICatcher", function(api) { var idsToShowWarningsInGlass = ["disk_usage", "cachedmysqldiskusage", "bandwidth"]; function _mungeData(data) { for (var i = 0; i < data.length; i++) { var item = data[i]; item.maximum = item.maximum && parseInt( item.maximum, 10 ); var isLimited = (item.maximum !== null); var percent = isLimited ? parseFloat((100 * item.usage / item.maximum).toFixed(2)) : 0; var isWarningShown = false; var isActionButtonShown = false; if (percent >= 80) { isActionButtonShown = true; if (idsToShowWarningsInGlass.includes(item.id)) { isWarningShown = true; } } _.assign( item, { isLimited: isLimited, percent: percent, needFix: percent >= 60, showWarning: isWarningShown, showActionButton: isActionButtonShown, } ); } return data; } // return the factory interface return { /** * Get extended stats. * @return {Promise} - Promise that will fulfill the request. */ fetchExtendedStats: function() { var apicall = new APIREQUEST.Class().initialize("ResourceUsage", "get_usages"); return api.promise(apicall).then( function(resp) { _mungeData(resp.data); return resp.data; } ); }, }; }, ]); } ); /* * tools/views/statisticsController.js Copyright(c) 2022 cPanel, L.L.C. * All rights reserved. * copyright@cpanel.net http://cpanel.net * This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false */ define( 'app/views/statisticsController',[ "lodash", "angular", "cjt/util/locale", "app/services/statisticsService", "cjt/directives/spinnerDirective", "cjt/decorators/growlDecorator", "cjt/decorators/growlAPIReporter", ], function(_, angular, LOCALE) { "use strict"; var USE_BYTES = { format_bytes: true, format_bytes_per_second: true, // for CloudLinux }; function _massageStatsDataForDisplay(data) { for (var i = 0; i < data.length; i++) { var item = data[i]; var isBytes = !!USE_BYTES[item.formatter]; var formattedUsage = isBytes ? LOCALE.format_bytes(item.usage) : LOCALE.numf(item.usage); var formattedMax = null; if (item.formatter === "format_bytes_per_second") { formattedUsage += "/s"; // Leave formattedMax null for the unlimited per-second items. if (item.isLimited) { formattedMax = LOCALE.format_bytes(item.maximum) + "/s"; } } else { formattedMax = !item.isLimited ? "∞" : isBytes ? LOCALE.format_bytes(item.maximum) : LOCALE.numf(item.maximum); } var warningMessage = null; if (item.showWarning) { if (item.percent >= 100) { warningMessage = LOCALE.maketext("[_1] limit exceeded.", item.description); } else { warningMessage = LOCALE.maketext("[_1] is nearing its limit.", item.description); } } _.assign( item, { showPercent: !!(item.isLimited && item.maximum), formattedPercent: LOCALE.numf(item.percent), formattedMaximum: formattedMax, formattedUsage: formattedUsage, warningTooltip: warningMessage, } ); } return data; } // Retrieve the current application var app = angular.module("App"); var controller = app.controller( "statisticsController", [ "$scope", "spinnerAPI", "statisticsService", "growl", "$timeout", function( $scope, spinnerAPI, statisticsService, growl, $timeout) { spinnerAPI.start("loadingStatsSpinner"); /** We are running into browser limits on the number of * concurrent HTTP connections. We want these AJAX * calls to be low priority so that CSS/sprites/etc. * will load first; otherwise, the UI takes longer to * be usable. * * We need to reduce the number of concurrent * HTTP calls, but for now this stop-gap will * ensure that AJAX post-back calls don’t delay the * loading of critical UI resources. */ $timeout(function() { statisticsService.fetchExtendedStats().then(function(response) { $scope.statistics = _massageStatsDataForDisplay(response); }).finally(function() { spinnerAPI.stop("loadingStatsSpinner"); }); }); $scope.appUpgradeUrl = PAGE.appUpgradeUrl && ((PAGE.dprefix || "") + PAGE.appUpgradeUrl); $scope.getStatStatus = function(percentage, error) { if (error) { return "warning"; } if (percentage >= 80) { return "danger"; } if (percentage >= 60) { return "warning"; } if (percentage >= 40) { return "info"; } if (percentage >= 0) { return "success"; } }; /** * Used to determine the class of an element based on the percentage of quota usage. * @param {number} percentage - amount of quota used. * @returns {string} bootstrap class to style an element. */ $scope.glassGetStatStatus = function(percentage) { if (percentage >= 100) { return "danger"; } if (percentage >= 80) { return "warning"; } }; }, ]); return controller; } ); /* * tools/services/themesService.js Copyright(c) 2022 cPanel, L.L.C. * All rights reserved. * copyright@cpanel.net http://cpanel.net * This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false */ define( 'app/services/themesService',[ // Libraries "angular", // CJT "cjt/io/api", "cjt/io/uapi-request", "cjt/io/uapi", // IMPORTANT: Load the driver so its ready ], function(angular, API, APIREQUEST, APIDRIVER) { // Fetch the current application var app = angular.module("App"); /** * Setup the account list model's API service */ app.factory("themesService", ["$q", function($q) { // return the factory interface return { /** * Get available themes list * @return {Promise} - Promise that will fulfill the request. */ getAvailableThemes: function() { // make a promise var deferred = $q.defer(); var apiCall = new APIREQUEST.Class(); apiCall.initialize("Themes", "list", { show_mail_themes: 0, }); API.promise(apiCall.getRunArguments()) .done(function(response) { // Create items from the response response = response.parsedResponse; if (response.status) { // Keep the promise deferred.resolve(response.data); } else { // Pass the error along deferred.reject(response.error); } }); // Pass the promise back to the controller return deferred.promise; }, /** * Set theme * @param {String} theme - Theme Name * @return {Promise} - Promise that will fulfill the request **/ setTheme: function(themeName) { var deferred = $q.defer(); var apiCall = new APIREQUEST.Class(); apiCall.initialize("Themes", "update", { theme: themeName, }); API.promise(apiCall.getRunArguments()) .done(function(response) { // Create items from the response response = response.parsedResponse; if (response.status) { // Keep the promise deferred.resolve(response.data); } else { // Pass the error along deferred.reject(response.error); } }); // pass the promise back to the controller return deferred.promise; }, }; }, ]); } ); /* * tools/views/themesController.js Copyright(c) 2022 cPanel, L.L.C. * All rights reserved. * copyright@cpanel.net http://cpanel.net * This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false, PAGE: true */ define( 'app/views/themesController',[ "angular", "jquery", "app/services/themesService", "cjt/decorators/growlDecorator", "jquery-chosen", "angular-chosen", ], function(angular) { "use strict"; // Retrieve the current application var app = angular.module("App"); var controller = app.controller( "themesController", [ "$scope", "$window", "themesService", "growl", "$timeout", function( $scope, $window, themesService, growl, $timeout) { $scope.isRTL = PAGE.isRTL || false; $scope.updated = true; /** We are running into browser limits on the number of * concurrent HTTP connections. We want these AJAX * calls to be low priority so that CSS/sprites/etc. * will load first; otherwise, the UI takes longer to * be usable. * * We need to reduce the number of concurrent * HTTP calls, but for now this stop-gap will * ensure that AJAX post-back calls don’t delay the * loading of critical UI resources. */ $timeout(function() { themesService.getAvailableThemes().then(function(response) { if (response && response.length > 0) { $scope.themes = response; // selects current theme if (PAGE.currentTheme) { $scope.selectedTheme = PAGE.currentTheme; } } }, function(error) { growl.error(error); }).finally(function() { $scope.updated = true; }); }); /** * Set theme of the account * Note: Transfers the page */ $scope.themeChanged = function() { if ($scope.selectedTheme !== "") { themesService.setTheme($scope.selectedTheme).then(function() { if (PAGE && PAGE.securityToken && PAGE.userName) { $window.location.href = PAGE.securityToken + "/xfercpanel/" + PAGE.userName + "?theme=" + $scope.selectedTheme; } }).catch(function(err) { growl.error(err); }); } }; }, ]); return controller; } ); /* # cpanel - base/frontend/jupiter/tools/services/nginxService.js # Copyright 2022 cPanel, L.L.C. # All rights reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited */ define( 'app/services/nginxService',[ // Libraries "angular", // CJT "cjt/io/api", "cjt/io/uapi-request", "cjt/io/uapi", // IMPORTANT: Load the driver so its ready "cjt/services/APICatcher", ], function(angular, API, APIREQUEST, APIDRIVER) { "use strict"; // Fetch the current application var app = angular.module("cpanel.tools.service.nginxService", []); /** * Setup the account list model's API service */ app.factory("nginxService", ["$q", "APICatcher", function($q, apiCatcher) { // return the factory interface return { /** * Clear NGINX caching for the cPanel user. * @return {Promise} - Promise that will fulfill the request. */ clearCache: function() { var apiCall = new APIREQUEST.Class(); apiCall.initialize("NginxCaching", "clear_cache", {}); return apiCatcher.promise(apiCall); }, /** * Enable NGINX caching for the cPanel user. * @return {Promise} - Promise that will fulfill the request. */ enableCaching: function() { var apiCall = new APIREQUEST.Class(); apiCall.initialize("NginxCaching", "enable_cache", {}); return apiCatcher.promise(apiCall); }, /** * Disable NGINX caching for the cPanel user. * @return {Promise} - Promise that will fulfill the request. */ disableCaching: function() { var apiCall = new APIREQUEST.Class(); apiCall.initialize("NginxCaching", "disable_cache", {}); return apiCatcher.promise(apiCall); }, }; }, ]); } ); /* # cpanel - base/frontend/jupiter/tools/views/nginxController.js # Copyright 2022 cPanel, L.L.C. # All rights reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited */ define( 'app/views/nginxController',[ "angular", "cjt/util/locale", "jquery", // CJT "cjt/services/alertService", "cjt/directives/alert", "cjt/directives/alertList", "app/services/nginxService", ], function(angular, LOCALE) { "use strict"; // Retrieve the current application var app = angular.module("App"); var controller = app.controller( "nginxController", [ "$scope", "alertService", "nginxService", function( $scope, alertService, nginxService) { $scope.isRTL = PAGE.isRTL || false; $scope.nginxCachingIsEnabled = PAGE.isNginxCachingEnabled || false; $scope.nginxClearCache = function() { return nginxService.clearCache().then(function() { alertService.add({ type: "success", message: LOCALE.maketext("NGINX cache cleared."), closeable: true, replace: true, autoClose: 10000, }); }); }; $scope.toggleNginxCachingStatus = function() { if ($scope.nginxCachingIsEnabled) { return nginxService.disableCaching().then(function() { $scope.nginxCachingIsEnabled = false; alertService.add({ type: "success", message: LOCALE.maketext("[asis,NGINX] cache is inactive."), closeable: true, replace: true, autoClose: 10000, }); }); } else { return nginxService.enableCaching().then(function() { $scope.nginxCachingIsEnabled = true; alertService.add({ type: "success", message: LOCALE.maketext("[asis,NGINX] cache is active."), closeable: true, replace: true, autoClose: 10000, }); }); } }; $scope.showClearCacheButton = function() { if ($scope.nginxCachingIsEnabled) { return "ng-show"; } else { return "ng-hide"; } }; }, ]); return controller; } ); /* * tools/services/accountsService.js Copyright(c) 2022 cPanel, L.L.C. * All rights reserved. * copyright@cpanel.net http://cpanel.net * This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false */ define( 'app/services/accountsService',[ // Libraries "angular", // CJT "cjt/io/api", "cjt/io/uapi-request", "cjt/io/uapi", // IMPORTANT: Load the driver so its ready ], function(angular, API, APIREQUEST, APIDRIVER) { // Fetch the current application var app = angular.module("App"); /** * Setup the account list model's API service */ app.factory("accountsService", ["$q", function($q) { // return the factory interface return { /** * Get available accounts list * @param {Boolean} [isRTL] - Optional flag denoting that the interface is in RTL * @return {Promise} - Promise that will fulfill the request. */ getAvailableAccounts: function(isRTL) { // make a promise var deferred = $q.defer(); var apiCall = new APIREQUEST.Class(); apiCall.initialize("Resellers", "list_accounts"); API.promise(apiCall.getRunArguments()) .done(function(response) { // Create items from the response response = response.parsedResponse; if (response.status) { // set RTL friendly account label isRTL = isRTL || false; var currentAccount; for (var i = 0, length = response.data.length; i < length; i++) { currentAccount = response.data[i]; if ( isRTL ) { currentAccount.accountLabel = "\u200e(" + currentAccount.domain + ") " + currentAccount.user; } else { currentAccount.accountLabel = currentAccount.user + " (" + currentAccount.domain + ")"; } } // Keep the promise deferred.resolve(response.data); } else { // Pass the error along deferred.reject(response.error); } }); // Pass the promise back to the controller return deferred.promise; }, }; }, ]); } ); /* * tools/views/accountsController.js Copyright(c) 2022 cPanel, L.L.C. * All rights reserved. * copyright@cpanel.net http://cpanel.net * This code is subject to the cPanel license. Unauthorized copying is prohibited */ /* global define: false, PAGE: true */ define( 'app/views/accountsController',[ "angular", "lodash", "jquery", "app/services/accountsService", "cjt/decorators/growlDecorator", "jquery-chosen", "angular-chosen", ], function(angular, _) { "use strict"; // Retrieve the current application var app = angular.module("App"); var controller = app.controller( "accountsController", [ "$scope", "$window", "accountsService", "growl", "$timeout", function( $scope, $window, accountsService, growl, $timeout) { $scope.isRTL = PAGE.isRTL || false; $scope.updated = true; /** We are running into browser limits on the number of * concurrent HTTP connections. We want these AJAX * calls to be low priority so that CSS/sprites/etc. * will load first; otherwise, the UI takes longer to * be usable. * * We need to reduce the number of concurrent * HTTP calls, but for now this stop-gap will * ensure that AJAX post-back calls don’t delay the * loading of critical UI resources. */ $timeout(function() { accountsService.getAvailableAccounts($scope.isRTL).then(function(response) { if (response && response.length >= 1) { $scope.accounts = response; // helps select current user if (PAGE.userName) { $scope.selectedAccount = _.find(response, ["user", PAGE.userName]); } } }, function(error) { growl.error(error); }).finally(function() { $scope.updated = true; }); }); /** * Switches Account * Note: Transfers the page */ $scope.accountChanged = function() { if ($scope.selectedAccount && PAGE && PAGE.securityToken) { $window.location.href = PAGE.securityToken + "/xfercpanel/" + $scope.selectedAccount.user; } }; }, ]); return controller; } ); /* # cpanel - base/frontend/jupiter/tools/services/wordPressService.js # Copyright 2022 cPanel, L.L.C. # All rights reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited */ define( 'app/services/wordPressService',[ // Libraries "angular", // CJT "cjt/io/api", "cjt/io/uapi-request", "cjt/io/uapi", // IMPORTANT: Load the driver so its ready "cjt/services/APICatcher", ], function(angular, API, APIREQUEST) { "use strict"; // Fetch the current application var app = angular.module("cpanel.tools.service.wordPressService", []); /** * Setup the WordPress polling service. */ app.factory("wordPressService", ["$q", "APICatcher", function($q, apiCatcher) { // return the factory interface return { startPolling: function() { var apiCall = new APIREQUEST.Class(); apiCall.initialize("WordPressSite", "retrieve", {}); return apiCatcher.promise(apiCall); }, }; }, ]); } ); /* # Copyright 2025 WebPros International, LLC # All rights reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited. */ define( 'app/index',[ "angular", "cjt/core", "ngSanitize", "cjt/modules", "app/views/sslStatus", "uiBootstrap", "angular-chosen", "cjt/services/alertService", ], function(angular, CJT) { "use strict"; return function() { // First create the application angular.module("App", ["ngSanitize", "ui.bootstrap", "cjt2.cpanel", "angular-growl", "localytics.directives", "cpanel.tools.views.sslStatus", "cpanel.tools.service.nginxService", "cpanel.tools.service.wordPressService"]); // Then load the application dependencies var app = require( [ // Application Modules "cjt/bootstrap", "cjt/util/locale", "app/views/applicationListController", "app/views/statisticsController", "app/views/themesController", "app/views/nginxController", "app/views/accountsController", "app/services/wordPressService", ], function(BOOTSTRAP, LOCALE) { var app = angular.module("App"); app.value("PAGE", PAGE); // A custom controller to show the htmlpopover for user analytics app.controller("analyticsController", [ "$scope", function($scope) { $scope.htmlPopover = LOCALE.maketext("Analytics helps us understand how our customers use our products. Go to Account Preferences to update your enrollment. [output,url,_1,Learn More,target,external-link]", "https://go.cpanel.net/cpanelanalyticstable"); }, ]); app.controller("langController", [ "$scope", "PAGE", "nvDataService", function($scope, PAGE, nvDataService) { function getLocaleCookieValue() { const match = document.cookie.match(/(?:^|; )session_locale=([^;]*)/); return match ? decodeURIComponent(match[1]) : null; } const sessionLocaleCookie = getLocaleCookieValue(); const localeNeedsReset = sessionLocaleCookie && sessionLocaleCookie !== PAGE.accountLocale; const resetToAccountLocaleDismissedInCurrentSession = PAGE.reset_to_account_locale_dismissed_nvdata_details && PAGE.reset_to_account_locale_dismissed_nvdata_details === PAGE.securityToken; $scope.showLanguageBanner = localeNeedsReset && !resetToAccountLocaleDismissedInCurrentSession; $scope.bannerDescriptionText = LOCALE.maketext("When you logged in, you selected a different language. Would you like to use the language you selected in your account’s settings?"); $scope.bannerButtonText = LOCALE.maketext("Switch to [asis,_1]", PAGE.accountLocaleName); function cookieReset() { document.cookie = "session_locale=; path=/; expires=" + new Date(0).toUTCString(); } $scope.resetLanguage = function() { if ($scope.showLanguageBanner) { cookieReset(); location.href = location.pathname; } }; $scope.runClose = function() { $scope.showLanguageBanner = false; nvDataService.setObject( { reset_to_account_locale_dismissed: PAGE.securityToken, }) .catch(function(error) { console.error(error); }); }; }, ]); app.config(["$httpProvider", function($httpProvider) { $httpProvider.useApplyAsync(true); }]); app.run(["wordPressService", "alertService", "PAGE", "$rootScope", function(wordPressService, alertService, PAGE, $rootScope) { // This event comes from the welcome modal web component. document.addEventListener("wordPressInstallPoll", function() { $rootScope.$apply(function() { alertService.add({ type: "info", message: LOCALE.maketext("Your WordPress site is being created."), closeable: true, replace: true, }); pollForWordPressInstall(); }); }); function pollForWordPressInstall() { // Let the users know the install is continuing var pollingIntervalId; pollingIntervalId = setInterval(function() { wordPressService.startPolling().then(function(uapiResponse) { if (uapiResponse.data.install_status === "success") { clearInterval(pollingIntervalId); pollingIntervalId = null; alertService.add({ type: "success", message: LOCALE.maketext("Your website is ready. Start adding content and personalizing “[output,strong,_1]” using [output,url,_2,WP Toolkit,title,WP Toolkit interface].", PAGE.domain, PAGE.wpToolkitUrl), closeable: true, replace: true, autoClose: 10000, }); } }) .catch(function(errors) { clearInterval(pollingIntervalId); pollingIntervalId = null; alertService.add({ type: "danger", message: LOCALE.maketext("Something went wrong. Your website failed to create. Try creating your website manually using [output,url,_1,WP Toolkit,title,WP Toolkit interface].", PAGE.wpToolkitUrl), closeable: true, replace: true, }); }); }, 5000); } // Account UUID copy event handler. var copyUuidLinkEl = document.getElementById("linkCopyUuid"); var copyUuidIconEl = document.getElementById("iconCopyUuid"); if (copyUuidLinkEl && copyUuidIconEl) { copyUuidLinkEl.addEventListener("click", copyUuidHandler); copyUuidIconEl.addEventListener("click", copyUuidHandler); } function copyUuidHandler() { var uuidTxtEl = document.getElementById("txtAcctUuid"); var copyMsgEl = document.getElementById("copyMsgContainer"); const copyText = uuidTxtEl.textContent; navigator.clipboard .writeText(copyText) .then(() => { copyMsgEl.classList.add("show-copy-success"); window.setTimeout(function() { copyMsgEl.classList.remove("show-copy-success"); }, 3000); }, (err) => { console.error(err); }); } // ===== Mixpanel Tracking for Sidebar Links ===== // Event name format: 'CP_USR:TOOLS_PAGE-{SECTION_NAME}-{ACTION}-CLICKED' if (window.mixpanel) { // SSL/TLS related sidebar links mixpanel.track_links('#sslCertificateAction', 'CP_USR:TOOLS_PAGE-SSL_CERTIFICATE_SIDEBAR-CLICKED'); // Tracking for other sidebar links can go in as needed. } }]); BOOTSTRAP("#content", "App"); }); return app; }; } );
Save