menu

SFRA / Server-side JS / Source: modules/server/forms/formField.js

'use strict';

var resource = require('dw/web/Resource');
var secureEncoder = require('dw/util/SecureEncoder');

/**
 * Function to conver <dw.web.FormField> object to plain JS object.
 * @param  {dw.web.FormField} field original formField object.
 * @return {Object} Plain JS object representing formField.
 */
function formField(field) {
    var result = {};
    Object.defineProperty(result, 'attributes', {
        get: function () {
            var attributes = '';
            attributes += 'name="' + result.htmlName + '"';
            if (result.mandatory) {
                attributes += ' required';
                attributes += ' aria-required="true"';
            }
            if (field.options && field.options.optionsCount > 0) {
                return attributes;
            }

            if (field.type === field.FIELD_TYPE_BOOLEAN && result.checked) {
                attributes += ' checked="' + result.checked + '"';
            }

            var value = field.htmlValue == null ? '' : field.htmlValue;
            attributes += ' value="' + secureEncoder.forHtmlInDoubleQuoteAttribute(value) + '"';

            if (result.maxValue) {
                attributes += ' max="' + result.maxValue + '"';
            }
            if (result.minValue) {
                attributes += ' min="' + result.minValue + '"';
            }
            if (result.maxLength) {
                attributes += ' maxLength="' + result.maxLength + '"';
            }
            if (result.minLength) {
                attributes += ' minLength="' + result.minLength + '"';
            }
            if (result.regEx) {
                attributes += ' pattern="' + result.regEx + '"';
            }
            return attributes;
        }
    });
    Object.defineProperty(result, 'value', {
        get: function () {
            return field.value;
        },
        set: function (value) {
            field.value = value; // eslint-disable-line no-param-reassign
            // reset htmlValue
            result.htmlValue = field.htmlValue || '';
        }
    });
    var attributesToCopy = {
        string: ['maxLength', 'minLength', 'regEx'],
        bool: ['checked', 'selected'],
        int: ['maxValue', 'minValue'],
        common: ['htmlValue', 'mandatory',
            'dynamicHtmlName', 'htmlName', 'valid'
        ],
        resources: ['error', 'description', 'label']
    };

    if (field.type === field.FIELD_TYPE_BOOLEAN && field.mandatory && !field.checked) {
        field.invalidateFormElement();
    }

    attributesToCopy.common.forEach(function (item) {
        if (item !== 'valid') {
            result[item] = field[item] || '';
        } else {
            result.valid = field.valid;
        }
    });

    attributesToCopy.resources.forEach(function (item) {
        if (field[item]) {
            result[item] = resource.msg(field[item], 'forms', null);
        }
    });

    if (field.options && field.options.optionsCount > 0) {
        result.options = [];
        for (var i = 0, l = field.options.optionsCount; i < l; i++) {
            result.options.push({
                checked: field.options[i].checked,
                htmlValue: field.options[i].htmlValue,
                label: field.options[i].label
                    ? resource.msg(field.options[i].label, 'forms', null)
                    : '',
                id: field.options[i].optionId,
                selected: field.options[i].selected,
                value: field.options[i].value
            });
        }

        result.selectedOption = field.selectedOption ? field.selectedOption.optionId : '';
    }

    switch (field.type) {
        case field.FIELD_TYPE_BOOLEAN:
            attributesToCopy.bool.forEach(function (item) {
                result[item] = field[item];
            });
            break;
        case field.FIELD_TYPE_DATE:
        case field.FIELD_TYPE_INTEGER:
        case field.FIELD_TYPE_NUMBER:
            attributesToCopy.int.forEach(function (item) {
                result[item] = field[item];
            });
            break;
        case field.FIELD_TYPE_STRING:
            attributesToCopy.string.forEach(function (item) {
                result[item] = field[item];
            });
            break;
        default:
            break;
    }

    result.formType = 'formField';

    return result;
}

module.exports = formField;

X Privacy Update: We use cookies to make interactions with our websites and services easy and meaningful, to better understand how they are used. By continuing to use this site you are giving us your consent to do this. Privacy Policy.