$(() => {
$('#form').dxForm({
formData: employee,
items: [{
itemType: 'group',
caption: 'Employee Details',
colCount: 2,
items: [{
dataField: 'FirstName',
editorOptions: {
disabled: true,
},
label: {
template: labelTemplate('user'),
},
}, {
dataField: 'Position',
editorType: 'dxSelectBox',
editorOptions: {
items: positions,
searchEnabled: true,
value: '',
},
validationRules: [{
type: 'required',
message: 'Position is required',
}],
label: {
template: labelTemplate('info'),
},
}, {
dataField: 'LastName',
editorOptions: {
disabled: true,
},
label: {
template: labelTemplate('user'),
},
}, {
dataField: 'HireDate',
editorType: 'dxDateBox',
editorOptions: {
value: null,
width: '100%',
},
validationRules: [{
type: 'required',
message: 'Hire date is required',
}],
label: {
template: labelTemplate('event'),
},
}, {
dataField: 'BirthDate',
editorType: 'dxDateBox',
editorOptions: {
disabled: true,
width: '100%',
},
label: {
template: labelTemplate('event'),
},
}, {
dataField: 'Address',
label: {
template: labelTemplate('home'),
},
}, {
colSpan: 2,
dataField: 'Notes',
editorType: 'dxTextArea',
editorOptions: {
height: 90,
maxLength: 200,
},
label: {
template: (data, element) => {
const lineBreak = '<br>';
const infoIcon = '<i id="helpedInfo" class="dx-icon dx-icon-info"></i>';
const labelText = `Additional${lineBreak}${data.text}`;
element.append(`<div id='template-content'>${infoIcon}${labelText}</div>`);
$('<div>').dxTooltip({
target: '#helpedInfo',
showEvent: 'mouseenter',
hideEvent: 'mouseleave',
contentTemplate(args) {
args.html('<div id="tooltip-content">This field must not exceed 200 characters</div>');
},
}).appendTo(element);
},
},
}, {
dataField: 'Phone',
editorOptions: {
mask: '+1 (X00) 000-0000',
maskRules: { X: /[02-9]/ },
},
label: {
template: labelTemplate('tel'),
},
}, {
dataField: 'Email',
label: {
template: labelTemplate('email'),
},
}],
}],
});
$('#form').dxForm('instance').validate();
function labelTemplate(iconName) {
return (data) => $(`<div><i class='dx-icon dx-icon-${iconName}'></i>${data.text}</div>`);
}
});
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>DevExtreme Demo</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>window.jQuery || document.write(decodeURIComponent('%3Cscript src="js/jquery.min.js"%3E%3C/script%3E'))</script>
<link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/23.1.5/css/dx.light.css" />
<script src="https://cdn3.devexpress.com/jslib/23.1.5/js/dx.all.js"></script>
<script src="data.js"></script>
<link rel="stylesheet" type="text/css" href="styles.css" />
<script src="index.js"></script>
</head>
<body class="dx-viewport">
<div class="demo-container">
<div id="form"></div>
</div>
</body>
</html>
#helpedInfo {
color: #42a5f5;
}
#tooltip-content {
font-size: 14px;
font-weight: bold;
}
#template-content {
display: inline-flex;
}
const employee = {
ID: 1,
FirstName: 'John',
LastName: 'Heart',
Position: 'CEO',
BirthDate: '1964/03/16',
HireDate: '1995/01/15',
Notes: 'John has been in the Audio/Video industry since 1990. He has led DevAv as its CEO since 2003.\r\n\r\nWhen not working hard as the CEO, John loves to golf and bowl. He once bowled a perfect game of 300.',
Address: '351 S Hill St., Los Angeles, CA',
Phone: '360-684-1334',
Email: 'jheart@dx-email.com',
};
const positions = [
'HR Manager',
'IT Manager',
'CEO',
'Controller',
'Sales Manager',
'Support Manager',
'Shipping Manager',
];