Commit a555091a by Georgina Mondino

Merge branch 'master' of http://git.anacsoft.com/Lusho/mini-web

2 parents 6c8b0597 c342ffdb
function ArmarForm() { function ArmarForm(data) {
document.getElementById("ArmarFormContainer").style.display="none"; document.getElementById("ArmarFormContainer").style.display="none";
document.getElementById("BotonesContainer").style.display="block"; document.getElementById("BotonesContainer").style.display="block";
document.getElementById("TabsContainer").style.display="block"; document.getElementById("TabsContainer").style.display="block";
let m = document.getElementById("CantBotones").value; let m = data.length;
let n; for (let n = 0; n < m; n++) {
for (n = 0; n < m; n++) {
let padreBotones = document.getElementById("BotonesContainer"); let padreBotones = document.getElementById("BotonesContainer");
let padreTabs = document.getElementById("TabsContainer"); let padreTabs = document.getElementById("TabsContainer");
...@@ -26,7 +25,3 @@ function ArmarForm() { ...@@ -26,7 +25,3 @@ function ArmarForm() {
document.getElementById("Tab0").style.display="block"; document.getElementById("Tab0").style.display="block";
} }
/** /**
* Lambdas
*/
var accessNumber = e => {
if (e.childElementCount == 0) return 0;
if (e.children[0].childElementCount == 0) return 0;
return e.children[0].children[0];
}
var getAncestorByAttribute = (elem,attr,val) => {
while (elem.getAttribute(attr) != val || elem == null) elem = elem.parentElement;
return elem;
}
var getDescendantByAttribute = (elem,attr,val) => {
if (elem == null || elem.getAttribute(attr) == val) return elem;
return Array.from(elem.children).reduce( (a,b) => {
let x = getDescendantByAttribute(a,attr,val);
let y = getDescendantByAttribute(b,attr,val);
return x == null ? y : x;
}, null);
}
/**
* Armado de formulario * Armado de formulario
*/ */
function removeField(b){ function removeTab(button){
while(b.getAttribute("name") != "Field") b = b.parentElement; let tabs = document.getElementById('tabs')
if(b.nodeElement == "body") return; tabs.removeChild(
b.parentElement.removeChild(b); getAncestorByAttribute(button,'name','Tab')
)
if (tabs.childElementCount == 0){
document.getElementById("ContinuarText").style.display = 'none';
document.getElementById("ContinuarButton").style.display = 'none';
}
} }
function addField(b){ function addField(b,n){
let newfield = document.createElement("div"); let newfield = document.createElement("div");
newfield.setAttribute("name","Field"); newfield.setAttribute("name","Field");
newfield.innerHTML = document.getElementById("fieldTemplate").innerHTML; newfield.innerHTML = document.getElementById("fieldTemplate").innerHTML;
let tab = b.parentElement; accessNumber(newfield).setAttribute("value",n);
// swap // swap
tab.removeChild(b); let container = b.parentElement;
tab.appendChild(newfield); container.appendChild(newfield);
tab.appendChild(b); container.appendChild(b);
}
function removeTab(b){
while(b.getAttribute("name") != "Tab") b = b.parentElement;
if(b.nodeElement == "body") return;
b.parentElement.removeChild(b);
} }
function addTab(t){ function addTab(t,n){
document.getElementById("ContinuarText").style.display = 'block'; document.getElementById("ContinuarText").style.display = 'block';
document.getElementById("ContinuarButton").style.display = 'block'; document.getElementById("ContinuarButton").style.display = 'block';
let newtab = document.createElement("div"); let newtab = document.createElement("div");
newtab.setAttribute("name","Tab"); newtab.setAttribute("name","Tab");
newtab.innerHTML = document.getElementById("tabTemplate").innerHTML; newtab.innerHTML = document.getElementById("tabTemplate").innerHTML;
accessNumber(newtab).setAttribute("value",n);
t.appendChild(newtab); t.appendChild(newtab);
} }
/** /**
* Lectura de información y formateado * Lectura de información y formateado
*/ */
function processField(field){ function processField(field){
let data = field.children[0];
return { return {
'Title' : field.children[0], 'Title' : data.children[1].value,
'Input' : field.children[1].selectedOptions[0].value, 'Input' : data.children[2].selectedOptions[0].value,
'Required' : field.children[2].checked, 'Required' : data.children[3].checked,
}; };
} }
function processTab(tab){ function processTab(tab){
let dict = {}; let dict = [];
for(let i = 0; i < tab.children.length; i++){ let container = getDescendantByAttribute(tab,"name","Field").parentElement;
if (tab.children[i].getAttribute("name") == "Field"){ for(let i = 0; i < container.children.length; i++){
dict[i] = processField(tab.children[i]); if (container.children[i].getAttribute("name") == "Field") {
dict.push(processField(container.children[i]));
} }
} }
return dict; return dict;
} }
function generate(tabs){ function generate(tabs){
let dict = {}; let dict = [];
for(let i = 0; i < tabs.children.length; i++){ for (let i = 0; i < tabs.children.length; i++) {
if (tabs.children[i].getAttribute("name") == "Tab"){ let c = tabs.children[i];
dict[i] = processTab(tabs.children[i]); if (c.getAttribute("name") == "Tab") {
dict.push({
"Title" : getDescendantByAttribute(c,"class","TabTitle").value,
"Fields" : processTab(c),
});
} }
} }
console.log(JSON.stringify(dict)); console.log(JSON.stringify(dict));
return dict;
} }
function sortTabs(){ function sortChildren(container,number){
let tabs = document.getElementById("tabs"); let fixinput = a => number(a).nodeName == "INPUT" && number(a).type == "number" ? parseInt(number(a).value) : Infinity;
Array.from(tabs.children).sort(
(a,b) => a.children[0].value < b.children[0].value ? -1 : a.children[0].value > b.children[0].value ? 1 : 0 Array.from(container.children).sort(
(a,b) => fixinput(a) < fixinput(b) ? -1 : fixinput(a) > fixinput(b) ? 1 : 0
).forEach( ).forEach(
c => tabs.appendChild(c) c => container.appendChild(c)
) )
} }
function sortFields(tab){ function maxChild(container,number){
Array.from(tab.children).sort( let fixinput = a => number(a).nodeName == "INPUT" && number(a).type == "number" ? parseInt(number(a).value) : 0;
(a,b) => a.children[0].value < b.children[0].value ? -1 : a.children[0].value > b.children[0].value ? 1 : 0
).forEach( if (container.childElementCount == 0) return 0;
c => tabs.appendChild(c) let max = Array.from(container.children).reduce(
) (a,b) => fixinput(a) > fixinput(b) ? a : b
);
return fixinput(max);
} }
\ No newline at end of file \ No newline at end of file
...@@ -10,8 +10,7 @@ ...@@ -10,8 +10,7 @@
<script src="./Scripts/ArmadoDeForm.js"></script> <script src="./Scripts/ArmadoDeForm.js"></script>
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet">
<title>Generador de Formularios</title> <title>Generador de Formularios</title>
<link rel="icon" href="./Assets/ICONO ANACSOFT 48 SIN TRASNSF.png" <link rel="icon" href="./Assets/ICONO ANACSOFT 48 SIN TRASNSF.png" type="image/png">
type="image/png">
</head> </head>
<body> <body>
...@@ -21,14 +20,14 @@ ...@@ -21,14 +20,14 @@
<br> <br>
<div id="tabs"></div> <div id="tabs"></div>
<div style="text-align: center;"> <div style="text-align: center;">
<button class="NewTabButton" onclick="addTab(document.getElementById('tabs'))"> <button class="NewTabButton"
onclick="let t = document.getElementById('tabs'); addTab(t, maxChild(t, accessNumber) + 1)">
+ +
</button> </button>
</div> </div>
<h3 id="ContinuarText">Cuando se encuentre conforme con el formulario presione Continuar</h3> <h3 id="ContinuarText">Cuando se encuentre conforme con el formulario presione Continuar</h3>
<input type="number" placeholder="Cant de Tabs" id="CantBotones"> <button id="ContinuarButton" onclick="ArmarForm( generate(document.getElementById('tabs')) )"> Continuar </button>
<button id="ContinuarButton" onclick="ArmarForm()"> Continuar </button> </section>
</section>
<section id="BotonesContainer" style="display: none;"> <section id="BotonesContainer" style="display: none;">
</section> </section>
<section id="TabsContainer" style="display: none;"> <section id="TabsContainer" style="display: none;">
...@@ -38,14 +37,15 @@ ...@@ -38,14 +37,15 @@
<!-- templates --> <!-- templates -->
<template id="tabTemplate"> <template id="tabTemplate">
<div class="TabCards"> <div class="TabCards">
<input type="number" class="TabNumber"> <input type="number" class="TabNumber"
onchange="sortChildren(getAncestorByAttribute(this,'name','Tab').parentElement, accessNumber)">
<input class="TabTitle" placeholder="Titulo del Tab" type="text"> <input class="TabTitle" placeholder="Titulo del Tab" type="text">
<button class="RemoveTabButton" onclick="removeTab(this)"> <button class="RemoveTabButton" onclick="removeTab(this)">
X X
</button> </button>
<br> <br>
<div style="text-align: center;"> <div style="text-align: center;">
<button class="NewInputButton" onclick="addField(this)"> <button class="NewInputButton" onclick="addField(this, maxChild(this.parentElement,accessNumber) + 1)">
+ +
</button> </button>
</div> </div>
...@@ -55,7 +55,8 @@ ...@@ -55,7 +55,8 @@
<template id="fieldTemplate"> <template id="fieldTemplate">
<div class="InputContainer"> <div class="InputContainer">
<input type="number" class="InputNumber"> <input type="number" class="InputNumber"
onchange="sortChildren(getAncestorByAttribute(this,'name','Field').parentElement, accessNumber)">
<input type="text" id="Titulo" class="Input" placeholder="Título"> <input type="text" id="Titulo" class="Input" placeholder="Título">
<select name="input" class="Input"> <select name="input" class="Input">
...@@ -70,7 +71,8 @@ ...@@ -70,7 +71,8 @@
<option id="checkbox" value="checkbox">Selección</option> <option id="checkbox" value="checkbox">Selección</option>
</select> </select>
Obligatorio : <input type="checkbox"> Obligatorio : <input type="checkbox">
<button class="RemoveInputButton" onclick="removeField(this)"> <button class="RemoveInputButton"
onclick="let f = getAncestorByAttribute(this,'name','Field'); f.parentElement.removeChild(f)">
- -
</button> </button>
</div> </div>
......
function ArmarForm(data) {
document.getElementById("ArmarFormContainer").style.display="none";
document.getElementById("BotonesContainer").style.display="block";
document.getElementById("TabsContainer").style.display="block";
let m = data.length;
for (let n = 0; n < m; n++) {
let padreBotones = document.getElementById("BotonesContainer");
let padreTabs = document.getElementById("TabsContainer");
let boton = document.createElement("Button");
padreBotones.appendChild(boton);
boton.setAttribute("id", "Boton" + n);
boton.setAttribute("value", n);
boton.setAttribute("class", "Botones");
boton.addEventListener("click", HabilitarTab);
let ancho = ((100 - (0.2 * m)) / m) + "%";
boton.style.width = ancho;
let tab = document.createElement("div");
padreTabs.appendChild(tab);
tab.style.width=ancho * m;
tab.setAttribute("id", "Tab" + n);
tab.setAttribute("class", "Tabs");
}
document.getElementById("Tab0").style.display="block";
}
function HabilitarTab() {
for (let n = 0; n < m; n++) {
document.getElementById("Tab" + n).style.display="none"
}
}
\ No newline at end of file \ No newline at end of file
...@@ -91,6 +91,7 @@ function generate(tabs){ ...@@ -91,6 +91,7 @@ function generate(tabs){
} }
} }
console.log(JSON.stringify(dict)); console.log(JSON.stringify(dict));
return dict;
} }
function sortChildren(container,number){ function sortChildren(container,number){
......
html {
--Color: rgb(122, 230, 163);
}
#BotonesContainer {
width: 100%;
height: 5%;
}
#TabsContainer {
width: 100%;
height: 95%;
}
.Botones {
border-radius: 5px 5px 0px 0px;
background-color: rgb(168, 168, 168);
border: none;
height: 100%;
margin: 0.1%;
}
.Botones:active {
background-color: var(--Color);
border-bottom: none;
height: 6%;
border-bottom: none;
}
.Botones:hover {
background-color: rgb(53, 53, 53), 0.5;
}
.Tabs {
display: none;
height: 100%;
border: 3px solid var(--Color);
}
\ No newline at end of file \ No newline at end of file
html{ html {
font-family: 'Montserrat', sans-serif; font-family: 'Montserrat', sans-serif;
} }
h1,h3{
h1,
h3 {
text-align: center; text-align: center;
} }
h1{
h1 {
font-size: 40px; font-size: 40px;
} }
body{
body {
background-color: whitesmoke; background-color: whitesmoke;
} }
.TabCards{
.TabCards {
background-color: white; background-color: white;
box-shadow: 2px 2px 5px #575757; box-shadow: 2px 2px 5px #575757;
margin: 2% auto; margin: 2% auto;
padding: 2%; padding: 2%;
border-radius: 2px; border-radius: 2px;
} }
.TabTitle, .TabNumber{
.TabTitle,
.TabNumber {
color: grey; color: grey;
margin-bottom: 5%; margin-bottom: 5%;
font-size: 30px; font-size: 30px;
width: 84%; width: 84%;
text-align: left; text-align: left;
border:none; border: none;
border-bottom: 1px solid grey; border-bottom: 1px solid grey;
} }
.TabNumber{
.TabNumber {
width: 10%; width: 10%;
} }
.InputContainer{
.InputContainer {
width: 100%; width: 100%;
text-align: center; text-align: center;
} }
.InputNumber{
.InputNumber {
width: 5%; width: 5%;
} }
.Input,.InputNumber{
.Input,
.InputNumber {
color: grey; color: grey;
border:none; border: none;
border-bottom: 1px solid grey; border-bottom: 1px solid grey;
width: 25%; width: 25%;
margin: 1%; margin: 1%;
font-size: 15px;
} }
.InputNumber{
.InputNumber {
width: 5%; width: 5%;
} }
.NewTabButton, .NewInputButton, .RemoveInputButton, .RemoveTabButton{
.NewTabButton,
.NewInputButton,
.RemoveInputButton,
.RemoveTabButton {
text-align: center; text-align: center;
margin: auto; margin: auto;
color: whitesmoke; color: whitesmoke;
border-radius: 50%; border-radius: 50%;
} }
.NewTabButton{
font-size:45px; .NewTabButton {
width: 90px; font-size: 45px;
height: 90px; width: 70px;
height: 70px;
border: 3px solid rgb(0, 88, 170); border: 3px solid rgb(0, 88, 170);
background-color: rgb(0, 102, 255); background-color: rgb(0, 102, 255);
} }
.NewInputButton { .NewInputButton {
font-size: 25px; font-size: 25px;
width: 40px; width: 40px;
...@@ -70,7 +90,9 @@ body{ ...@@ -70,7 +90,9 @@ body{
border: 3px solid rgb(1, 194, 120); border: 3px solid rgb(1, 194, 120);
background-color: rgb(14, 211, 135); background-color: rgb(14, 211, 135);
} }
.RemoveInputButton, .RemoveTabButton{
.RemoveInputButton,
.RemoveTabButton {
width: 35px; width: 35px;
height: 35px; height: 35px;
margin: 1%; margin: 1%;
...@@ -78,15 +100,18 @@ body{ ...@@ -78,15 +100,18 @@ body{
border: 3px solid rgb(230, 25, 25); border: 3px solid rgb(230, 25, 25);
background-color: rgba(211, 14, 14, 0.788); background-color: rgba(211, 14, 14, 0.788);
} }
.RemoveTabButton{
.RemoveTabButton {
width: 40px; width: 40px;
height: 40px; height: 40px;
} }
#ContinuarText, #ContinuarButton{
#ContinuarText,
#ContinuarButton {
display: none; display: none;
} }
#ContinuarButton{ #ContinuarButton {
font-size: 20px; font-size: 20px;
border: none; border: none;
background-color: rgb(1, 194, 120); background-color: rgb(1, 194, 120);
...@@ -98,53 +123,63 @@ body{ ...@@ -98,53 +123,63 @@ body{
border-radius: 5px; border-radius: 5px;
} }
@media ( max-width: 1050px) { @media (max-width: 1050px) {
.TabNumber{ .TabNumber {
width: 10%; width: 10%;
} }
.TabTitle{
.TabTitle {
width: 80%; width: 80%;
} }
} }
@media (max-width: 600px) { @media (max-width: 600px) {
.TabNumber{ .TabNumber {
width: 10%; width: 10%;
} }
.TabTitle{
width:75%; .TabTitle {
width: 75%;
} }
.RemoveInputButton{
.RemoveInputButton {
width: 30px; width: 30px;
height: 30px; height: 30px;
} }
.RemoveTabButton{ .RemoveTabButton {
width: 30px; width: 30px;
height: 30px; height: 30px;
} }
.Input{
.Input {
width: 16%; width: 16%;
margin: none; margin: none;
} }
} }
@media ( max-width: 350px) {
.TabNumber{ @media (max-width: 400px) {
.TabNumber {
width: 10%; width: 10%;
} }
.TabTitle{
width:70%; .TabTitle {
width: 70%;
} }
.RemoveInputButton{
width: 30px; .RemoveInputButton {
height: 30px; width: 25px;
height: 25px;
font-size: 15px;
} }
.RemoveTabButton{ .RemoveTabButton {
width: 30px; width: 30px;
height: 30px; height: 30px;
} }
.Input{
.Input {
width: 15%; width: 15%;
margin: 0%; margin: 0%;
} }
......
...@@ -2,17 +2,18 @@ ...@@ -2,17 +2,18 @@
<head> <head>
<script src="{{url_for('static',filename='Scripts/construct.js')}}"></script> <script src="{{url_for('static',filename='Scripts/construct.js')}}"></script>
<script src="{{url_for('static',filename='Scripts/ArmadoDeForm.js')}}"></script>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge"> <meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="{{url_for('static',filename='Style/Templates.css')}}"> <link rel="stylesheet" href="{{url_for('static',filename='Style/Templates.css')}}">
<link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Montserrat&display=swap" rel="stylesheet">
<title>Generador de Formularios</title> <title>Generador de Formularios</title>
<link rel="icon" href="{{url_for('static',filename='Assets/ICONO ANACSOFT 48 SIN TRASNSF.png')}}" <link rel="icon" href="{{url_for('static',filename='Assets/ICONO ANACSOFT 48 SIN TRASNSF.png')}}" type="image/png">
type="image/png">
</head> </head>
<body> <body>
<section id="ArmarFormContainer">
<h1> Generador de Formularios</h1> <h1> Generador de Formularios</h1>
<h3>Para comenzar por favor cree un nuevo tab</h3> <h3>Para comenzar por favor cree un nuevo tab</h3>
<br> <br>
...@@ -24,7 +25,12 @@ ...@@ -24,7 +25,12 @@
</button> </button>
</div> </div>
<h3 id="ContinuarText">Cuando se encuentre conforme con el formulario presione Continuar</h3> <h3 id="ContinuarText">Cuando se encuentre conforme con el formulario presione Continuar</h3>
<button id="ContinuarButton" onclick="generate(document.getElementById('tabs'))"> Continuar </button> <button id="ContinuarButton" onclick="ArmarForm( generate(document.getElementById('tabs')) )"> Continuar </button>
</section>
<section id="BotonesContainer" style="display: none;">
</section>
<section id="TabsContainer" style="display: none;">
</section>
</body> </body>
<!-- templates --> <!-- templates -->
...@@ -38,8 +44,7 @@ ...@@ -38,8 +44,7 @@
</button> </button>
<br> <br>
<div style="text-align: center;"> <div style="text-align: center;">
<button class="NewInputButton" <button class="NewInputButton" onclick="addField(this, maxChild(this.parentElement,accessNumber) + 1)">
onclick="addField(this, maxChild(this.parentElement,accessNumber) + 1)">
+ +
</button> </button>
</div> </div>
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!