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) -%]
                        &nbsp;
                        <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