This helper takes the JSONSchema of a single property and transforms it into an object representing an ExtJS field.
Currently, four types for properties are supported: string, integer, number and boolean. Additionally, the helper also takes "extra attributes" and a "context" which allows for more fine-grained control over how the ExtJS field is actually constructed and also makes it possible to express different UI-specific behaviors that cannot be modeled via JSONSchema (for example, whether a field's contents are sensitive). Signed-off-by: Max R. Carrara <[email protected]> --- src/Utils.js | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/src/Utils.js b/src/Utils.js index 5457ffa..a9bcb56 100644 --- a/src/Utils.js +++ b/src/Utils.js @@ -1571,6 +1571,112 @@ Ext.define('Proxmox.Utils', { } hiddenElement.click(); }, + + /** + * Takes a JSONSchema of a single property and transforms it into an + * object representing an ExtJS field. + * + * @param {string} fieldName - The value for the `name` property of the resulting object. + * @param {Object} propSchema - The JSONSchema of a property. + * @param {Object} extraAttributes - Additional attributes describing the + * field that are not or cannot be represented by the given JSONSchema. + * Note that none of these attributes represent any specific ExtJS property. + * @param {Boolean} extraAttributes.readonly - Whether the field shall be read-only. + * "Read-only" here means that the field's `xtype` will be set to + * `'displayfield'`, regardless of what data type the field will + * display. Additionally, checkboxes (booleans) will be displayed as + * "Yes" or "No" depending on their value (locale-aware). + * @param {Boolean} extraAttributes.sensitive - Whether the field + * contains sensitive data, such as a password or similar. + * @param {Object} context - The context within which the field is being used. + * @param {Boolean} context.isCreate - Whether the field will be used during creation. + */ + getFieldDefFromPropertySchema: function (fieldName, propSchema, extraAttributes, context) { + const fieldPropsByType = { + string: { + xtype: 'proxmoxtextfield', + minLength: propSchema.minLength, + maxLength: propSchema.maxLength, + }, + integer: { + xtype: 'proxmoxintegerfield', + minValue: propSchema.minimum, + maxValue: propSchema.maximum, + }, + number: { + xtype: 'numberfield', + minValue: propSchema.minimum, + maxValue: propSchema.maximum, + }, + boolean: { + xtype: 'proxmoxcheckbox', + uncheckedValue: 0, + }, + }; + + const commonFieldProps = { + name: fieldName, + emptyText: propSchema.default || '', + allowBlank: propSchema.optional, + }; + + let fieldProps = fieldPropsByType[propSchema.type]; + if (fieldProps === undefined) { + console.warn(`Unhandled property type '${propSchema.type}'`); + fieldProps = fieldPropsByType.string; + } + + let field = { + ...fieldProps, + ...commonFieldProps, + }; + + if (propSchema.title) { + field.fieldLabel = Ext.htmlEncode(propSchema.title); + } + + if (propSchema.description) { + field.autoEl = { + tag: 'div', + 'data-qtip': Ext.htmlEncode(Ext.htmlEncode(propSchema.description)), + }; + } + + if (context.isCreate && propSchema.default !== undefined) { + if (propSchema.type === 'boolean') { + field.checked = propSchema.default; + } else { + field.value = propSchema.default; + } + } + + if (extraAttributes.sensitive) { + field.xtype = 'proxmoxtextfield'; + field.inputType = 'password'; + + if (context.isCreate) { + field.value = ''; + field.emptyText = Proxmox.Utils.NoneText; + } else { + field.emptyText = gettext('Unchanged'); + } + } + + if (extraAttributes.readonly) { + field.xtype = 'displayfield'; + + if (propSchema.type === 'boolean') { + field.renderer = Proxmox.Utils.format_boolean; + } + + if (extraAttributes.sensitive) { + field.value = '*********'; + field.emptyText = ''; + } + } + + return field; + }, }, singleton: true, -- 2.47.3 _______________________________________________ pve-devel mailing list [email protected] https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
