Implement nested fieldsets
This commit is contained in:
parent
ab364e1908
commit
7c607ad025
|
@ -17,39 +17,83 @@ function loadFields(callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function drawForm(fields) {
|
function drawForm(fields) {
|
||||||
var container = document.getElementById('fields');
|
var container = document.getElementById('fields'),
|
||||||
|
fieldsets = {};
|
||||||
|
|
||||||
|
for (var i = 0; i < fields.length; i++) {
|
||||||
|
var field = fields[i];
|
||||||
|
|
||||||
|
if (field.value !== null) {
|
||||||
|
var fieldNode = makeFieldNode(field),
|
||||||
|
fieldSetName = field.path.match("(.*\/).*")[1];
|
||||||
|
|
||||||
|
if (!fieldsets[fieldSetName]) {
|
||||||
|
fieldsets[fieldSetName] = [];
|
||||||
|
}
|
||||||
|
fieldsets[fieldSetName].push(fieldNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (var i = 0; i < fields.length; i++) {
|
for (var i = 0; i < fields.length; i++) {
|
||||||
var field = fields[i],
|
var field = fields[i],
|
||||||
formGroup = makeDivNode('form-group'),
|
node;
|
||||||
label = makeLabelNode(field.path, field.title),
|
|
||||||
input;
|
|
||||||
|
|
||||||
formGroup.appendChild(label);
|
if (field.value === null) {
|
||||||
|
node = makeFieldSetNode(field.title, fieldsets[field.path + '/']);
|
||||||
if (field.options !== null) {
|
} else if (!field.path.match(/^\/[^\/]+\//)) {
|
||||||
input = makeSelectNode(field.options, !field.is_required)
|
node = makeFieldNode(field);
|
||||||
} else {
|
|
||||||
input = document.createElement('input');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
input.setAttribute('value', field.value);
|
container.appendChild(node);
|
||||||
input.setAttribute('id', field.path);
|
|
||||||
input.setAttribute('class', 'form-control');
|
|
||||||
if (field.is_readonly) {
|
|
||||||
input.setAttribute('readonly', 'readonly');
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (field.type) {
|
|
||||||
case "string":
|
|
||||||
input.setAttribute('type', 'text');
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
console.log("Invalid field type: "+ field.type, field)
|
|
||||||
}
|
|
||||||
|
|
||||||
formGroup.appendChild(input);
|
|
||||||
container.appendChild(formGroup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeFieldNode(field) {
|
||||||
|
var formGroup = makeDivNode('form-group'),
|
||||||
|
label = makeLabelNode(field.path, field.title),
|
||||||
|
input;
|
||||||
|
|
||||||
|
formGroup.appendChild(label);
|
||||||
|
|
||||||
|
if (field.options !== null) {
|
||||||
|
input = makeSelectNode(field.options, !field.is_required)
|
||||||
|
} else {
|
||||||
|
input = document.createElement('input');
|
||||||
|
}
|
||||||
|
|
||||||
|
input.setAttribute('value', field.value);
|
||||||
|
input.setAttribute('id', field.path);
|
||||||
|
input.setAttribute('class', 'form-control');
|
||||||
|
if (field.is_readonly) {
|
||||||
|
input.setAttribute('readonly', 'readonly');
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (field.type) {
|
||||||
|
case "string":
|
||||||
|
input.setAttribute('type', 'text');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.log("Invalid field type: "+ field.type, field)
|
||||||
|
}
|
||||||
|
|
||||||
|
formGroup.appendChild(input);
|
||||||
|
|
||||||
|
return formGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeFieldSetNode(title, fields) {
|
||||||
|
var fieldsetNode = document.createElement('fieldset'),
|
||||||
|
legendNode = document.createElement('legend');
|
||||||
|
|
||||||
|
legendNode.appendChild(document.createTextNode(title));
|
||||||
|
fieldsetNode.appendChild(legendNode);
|
||||||
|
|
||||||
|
for (var i = 0; i < fields.length; i++) {
|
||||||
|
fieldsetNode.appendChild(fields[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fieldsetNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
function makeDivNode(classes) {
|
function makeDivNode(classes) {
|
||||||
|
|
|
@ -6,6 +6,30 @@
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title>Configuration Management</title>
|
<title>Configuration Management</title>
|
||||||
<link rel="stylesheet" href="/bootstrap.min.css">
|
<link rel="stylesheet" href="/bootstrap.min.css">
|
||||||
|
<style type="text/css">
|
||||||
|
.container {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
fieldset:before {
|
||||||
|
position: absolute;
|
||||||
|
top: -1%;
|
||||||
|
left: -1.5em;
|
||||||
|
display: block;
|
||||||
|
content: '\0020';
|
||||||
|
width: 8px;
|
||||||
|
height: 95%;
|
||||||
|
margin: 2% 0;
|
||||||
|
background-color: #eee;
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
fieldset:hover:before {
|
||||||
|
background-color: #66afe9;
|
||||||
|
}
|
||||||
|
fieldset {
|
||||||
|
position: relative;
|
||||||
|
margin-left: 1.5em;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue