Viewing File: /usr/local/cpanel/whostmgr/docroot/templates/pkgform.tmpl
[%
# cpanel - whostmgr/docroot/templates/pkgform.tmpl
# 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
USE Whostmgr;
USE JSON;
USE NVData;
# We fill this below.
SET fields_with_help = [];
WRAPPER 'master_templates/master.tmpl' theme="yui"
app_key = 'add_a_package'
scripts = [
'/templates/packages/pkgform.min.js',
],
stylesheets = [
'/cjt/css/ajaxapp-min.css',
'/templates/common/revised_notices.min.css',
'/templates/packages/common.min.css',
'/templates/packages/pkgform.min.css',
]
-%]
<div id="content">
[% IF ! edit %]
<div id="extensionDryDock">
[% FOREACH package IN data.extensions.keys %]
<div id="[% package %]" class="fatBorder hidden">
<fieldset>
<div class="propertyGroup">
[% file_to_process = data.extensions_path _ package _ '.tt2' %]
[% PROCESS $file_to_process %]
</div>
</fieldset>
</div>
[% END %]
</div> <!-- end extensionDryDock -->
[% END %]
[% IF Whostmgr.hasroot() -%]
<div id="resellerNotice" class="notice addEditPkgTopNotice">
<div class="notice-content">
[% locale.maketext("[output,strong,Note]: If a package name is [output,strong,preceded] by a reseller’s username and an underscore, [output,strong,only] that reseller can see the package.") %]
</div>
</div>
[% END -%]
<form name="mainform" action="javascript:void(0);" onsubmit="ajax_save(this);">
[%# Package Name %]
<div class="fatBorder">
<fieldset class="groupEditor">
<div class="propertyGroup">
<div class="propertyEditor last">
<div class="propertyLabel">[% locale.maketext('Package Name') %]</div>
<div class="propertyValue">
[%~ IF edit -%]
<input value="[% data.name.html() %]" disabled="disabled" size="40" />
<input type="hidden" name="name" value="[% data.name.html() %]" />
<input type="hidden" name="_PACKAGE_EXTENSIONS" value="[% data.PACKAGE_EXTENSIONS %]" />
[%~ ELSE %]
<input name="name" size="40" />
[% END -%]
</div>
</div>
</div>
</fieldset>
</div>
<div class="fatBorder">
<fieldset class="groupEditor">
<h3>[% locale.maketext('Resources') %]</h3>
<div class="propertyGroup">
[% FOR resource IN data.package_resources_order -%]
[%
NEXT IF !data.package_resources.$resource;
SET cur = data.package_resources.$resource;
SET cur_value = cur.exists('value') ? cur.value : cur.default;
SET is_unlimited = cur_value.match('[.\D]');
-%]
[% IF !cur.hide %]
<div class="propertyEditor">
<div class="propertyLabel">
[% locale.makevar( cur.label ) %]
[% IF cur.help_text -%]
[% fields_with_help.push([ resource, cur ]) -%]
<span id="[% resource %]__help" class="pkgform-help"><span class="far fa-question-circle help-text"></span></span>
[% END -%]
</div>
<div class="propertyValue">
[% SET display_num = is_unlimited
? ( cur.default.match('[.\D]') ? cur.limited_default || ( resource == 'max_defer_fail_percentage' ? '100' :'0' ) : cur.default )
: cur_value
-%]
[% IF cur.allowed -%]
<input
type="radio"
id="[% resource %]_custom_radio"
name="[% resource %]_control"
[% is_unlimited ? '' : 'checked="checked"' %]
[%
IF cur.can_unlimited;
'value="custom"';
ELSE;
'style="visibility:hidden"';
END;
-%]
/>
[% END -%]
<input
class="resource-text"
name="[% resource %]"
value="[% display_num -%]"
type="number"
size="10"
min=[% cur.min || 0 %]
[% cur.max ? "max=${cur.max}" : '' %]
[% ((is_unlimited || cur.can_unlimited || (!cur.allowed))) ? 'disabled="disabled"' : '' %]
/>
[% IF cur.allowed && (cur.can_unlimited || is_unlimited) -%]
<label>
<input type="radio" id="[% resource %]_unlimited_radio" name="[% resource %]_control" value="unlimited" [% is_unlimited ? 'checked="checked"' : '' %] [% cur.can_unlimited || is_unlimited ? '' : 'disabled="disabled"' -%] />
[% locale.maketext("Unlimited") -%]
</label>
<script>YAHOO.util.Event.onDOMReady(function () { new CPANEL.ajax.Grouped_Input_Set( document.forms.mainform, "[% resource %]_custom_radio", "[% resource %]_unlimited_radio")});</script>
[% END -%]
</div>
</div>
[% END -%]
[% END -%]
</div>
</fieldset>
</div>
[%
SET options_order = ['ip'];
IF data.show_shell;
options_order.push('hasshell');
END;
IF data.show_cgi;
options_order.push('cgi');
END;
options_order.push('digestauth');
-%]
<div class="fatBorder">
<fieldset class="groupEditor">
<div class="propertyGroup">
<h3>[% locale.maketext('Settings') %]</h3>
<div class="propertyEditor">
<div class="propertyLabel multiOptionLabel">[% locale.maketext('Options') %]</div>
<div class="propertyValue">
[%~ FOR option = options_order ~%]
[%~ SET cur = data.package_items.$option ~%]
[%~ SET cur_value = cur.exists('value') ? cur.value : cur.default ~%]
[%~ SET checked = cur_value && cur_value != 'n' ~%]
<input value="1" type="checkbox" name="[% option %]" [% cur.allowed ? '' : 'disabled="disabled"' -%] [% checked ? 'checked="checked"' : '' -%] />[%~ locale.makevar(cur.label) -%]
[%~ IF checked && !cur.allowed ~%]
<input type="hidden" name="[% option %]" value="1" />
[%~ END ~%]<br>
[%~ END -%]
</div>
</div>
[% SET cur = data.package_items.cpmod; -%]
<div class="propertyEditor">
<div class="propertyLabel">[% locale.makevar(cur.label) %]</div>
<div class="propertyValue">
<select name="cpmod">
[% SET selected_theme = ( cur.exists('value') && (data.themes.grep(cur.regexp) > 0 ) ) ? cur.value : cur.default -%]
[% FOR cur_theme = data.themes -%]
[% SET selected_text = cur_theme == selected_theme ? 'selected="selected"' : '' -%]
<option value="[% cur_theme %]" [% selected_text %]>
[% cur_theme %]
</option>
[% END -%]
</select>
</div>
</div>
[% SET cur = data.package_items.featurelist; -%]
<div class="propertyEditor">
<div class="propertyLabel">
[% locale.makevar(cur.label) %]
</div>
<div class="propertyValue">
<select name="featurelist" onchange="document.getElementById('editFeatureListLink').setAttribute('href','../scripts2/featuremanager/editFeatureList?name=' + this.value)">
[% SET selected_featurelist = ( cur.exists('value') && ( data.feature_list_options.grep(cur.regexp).size > 0 ) ) ? cur.value : cur.default -%]
[% FOR fl = data.feature_list_options -%]
<option value="[% fl %]" [% fl == selected_featurelist ? ' selected="selected"' : '' %]>[% fl %]</option>
[% END -%]
</select>
[% IF Whostmgr.checkacl('add-pkg') %]
<a id="editFeatureListLink" href="../scripts2/featuremanager/editFeatureList?name=[% selected_featurelist %]" title="[% locale.maketext('View the selected feature list.') %]" target="_blank">[% locale.maketext('View') %] <i class="fas fa-external-link-alt" aria-hidden="true"></i></a>
[% END %]
</div>
</div>
[% SET cur = data.package_items.language; -%]
<div class="propertyEditor last">
<div class="propertyLabel">[% locale.makevar(cur.label) %]</div>
<div class="propertyValue">
<select name="language">[%# TODO: change from 'language' to 'locale' %]
[% PROCESS '_locale_option_tags.tmpl' %]
</select>
<span class="help-block">
[% user_feedback_text_for_more_locales() %]
</span>
</div>
</div>
</div>
</fieldset>
</div>
<div id="packageExtensions">
[% IF data.extensions.keys.size > 0 || data.missing_extensions.size > 0 %]
<div id="packageExtensionHeader" class="pkgExtensionHeader">[% locale.maketext('Package Extensions') %]</div>
[% END %]
[% IF edit %]
[% IF data.missing_extensions.size > 0 %]
<div class="fatBorder" id="missingExtensionsGroup">
<fieldset class="groupEditor">
<div id="missingPackageError" class="notice notice-error">
<div class="notice-content error-notice-content">[% locale.maketext("You must install the following extensions before you can edit their values: [list_and,_1]", data.missing_extensions) %]</div>
</div>
<div id="missingExtensionsOption"><input type="checkbox" name="remove_missing_extensions" value="[% data.missing_extensions.join(' ') %]" id="missingExtensionsCheckbox"><label class="bolded" for="missingPackagesCheckbox">[% locale.maketext('Remove these extensions from the package.') %]</label></div>
</fieldset>
</div>
[% END -%]
[% FOREACH package IN data.extensions.keys %]
<div id="[% package %]" class="fatBorder">
<fieldset>
<h3>[% locale.makevar(data.extensions.$package) %]</h3>
<div class="propertyGroup">
[% file_to_process = data.extensions_path _ package _ '.tt2' %]
[% PROCESS $file_to_process %]
</div>
</fieldset>
</div>
[% END %]
[% ELSE %]
[% FOREACH package IN data.extensions.keys %]
<h3 class="pkgSelectorWrapper" id="[% package %]DataWrapper">
<input type="checkbox" name="_PACKAGE_EXTENSIONS" value="[% package %]" id="[% package %]Control" class="packageOptionSelector" data-packageOptions="[% package %]">[% locale.makevar(data.extensions.$package) %]
</h3>
[% END %]
[% END %]
</div>
<div class="formButtons">
[% IF edit -%]
<input type="hidden" name="edit" value="yes" />
<input type="submit" id="submit" class="btn-primary" value="[% locale.maketext('Save Changes') %]" />
<input type="reset" class="btn-secondary" value="[% locale.maketext('Reset') %]" />
[% ELSE -%]
<input type="submit" id="submit" class="btn-primary" value="[% locale.maketext('Add') %]" />
[% END -%]
</div>
</form>
</div> <!-- end content -->
[% PROCESS '_ajaxapp_footer.tmpl' -%]
<script type="text/javascript">
import('[% MagicRevision('/js/modules/pkgform-help_optimized.js') %]').then( o => {
[% FOR name_cur = fields_with_help -%]
o.cPSetupResourceHelp(
DOM.get('[% "${name_cur.0}__help" %]'),
[% locale.makevar( name_cur.1.label ).json %],
[% locale.makevar( name_cur.1.help_text ).json %]
);
[% END -%]
} );
function ajax_save(form) {
var form_data = CPANEL.dom.get_data_from_form(form, {
include_unchecked_checkboxes: 0
});
[% IF ! edit %]
// massage the package extensions variable (if there)
// to remove extraneous package name values (0)
// This is necessary because get_data_from_form() sets unchecked checkboxes to 0.
if (form_data._PACKAGE_EXTENSIONS && Object.prototype.toString.call(form_data._PACKAGE_EXTENSIONS) === "[object Array]") {
var massagedExtensions = [];
var candidateExtensionsLength = form_data._PACKAGE_EXTENSIONS.length;
for (var x = 0; x < candidateExtensionsLength; x++) {
if (isNaN(form_data._PACKAGE_EXTENSIONS[x]) || parseFloat(form_data._PACKAGE_EXTENSIONS[x]) !== 0) {
massagedExtensions.push(form_data._PACKAGE_EXTENSIONS[x]);
}
}
form_data._PACKAGE_EXTENSIONS = massagedExtensions;
}
[% END %]
// package extension controls could be named *_control,
// so explicitly test for known manual controls to avoid
// accidentally failing to update a value for a package
// extension
var customControlMatcher = /^(quota|maxftp|maxsql|maxpop|maxlst|maxsub|bwlimit|maxpark|maxaddon|max_email_per_hour|max_defer_fail_percentage|max_emailacct_quota|max_team_users)_control$/;
for (var key in form_data) {
var match = key.match(customControlMatcher);
if (match) {
if (form_data[key] === "unlimited") {
form_data[match[1]] = "unlimited";
}
delete form_data[key];
}
}
var status_template = [% edit
? locale.maketext('Saving package “[output,class,_1,code]” ….','{pkg}').json()
: locale.maketext('Creating new package “[output,class,_1,code]” …','{pkg}').json()
%];
var before_success = function () {
var missingExtensionsCheckbox = YAHOO.util.Dom.get("missingExtensionsCheckbox");
if (missingExtensionsCheckbox) {
var isChecked = YAHOO.util.Dom.getAttribute(missingExtensionsCheckbox, "checked");
if (isChecked) {
var missingExtensionsDiv = YAHOO.util.Dom.get("missingExtensionsGroup");
if (missingExtensionsDiv) {
// check to see if there are any other fatBorder divs left
var extensionsContainer = YAHOO.util.Dom.get("packageExtensions");
var isFatBorder = function (el) {
return YAHOO.util.Dom.hasClass(el, "fatBorder");
};
var remainingExtensions = YAHOO.util.Dom.getChildrenBy(extensionsContainer, isFatBorder);
// hide the subhead if no more extensions
if (remainingExtensions.length === 1) {
YAHOO.util.Dom.addClass("packageExtensionHeader", "hidden");
}
YAHOO.util.Dom.addClass(missingExtensionsDiv, "hidden");
missingExtensionsDiv.parentNode.removeChild(missingExtensionsDiv);
}
}
}
};
CPANEL.api( {
progress_panel: {
status_html: status_template.replace('{pkg}',form_data.name.html_encode()),
source_el: "submit",
before_success: before_success
},
func: "[% edit ? 'editpkg' : 'addpkg' %]",
data: form_data
});
}
</script>
[% END -%]
Back to Directory
File Manager