Page 1 of 1

Collapsible Div

Posted: Fri May 11, 2018 11:53 am
by atom
Hello nuBuilder Pros,
Any idea how to organize and group fields
into a Collapsible Divs, more importantly
for lengthy data entry Tables, also is it
possible to replace Tabs with the same.
Thank you.

Re: Collapsible Div

Posted: Fri May 11, 2018 1:48 pm
by toms
atom wrote: Any idea how to organize and group fields
into a Collapsible Divs, more importantly
for lengthy data entry Tables,
This (https://vimeo.com/269171750) is my attempt, using this code as a basis: https://www.w3schools.com/howto/tryit.a ... ollapsible

1. Create a html object. This serves as a container for the Collapsibles.
html_object.png
HTML Code:

Code: Select all

<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.collapsible {
    background-color: #777;
    color: white;
    cursor: pointer;
    padding: 18px;
    width: 100%;
    border: none;
    text-align: left;
    outline: none;
    font-size: 15px;
}

.active, .collapsible:hover {
    background-color: #555;
}

.content {
    padding: 0 18px;
    display: none;
    overflow: hidden;
    background-color: #f1f1f1;
    height: 100px;
}
</style>
</head>
<body>

<h2>Collapsibles</h2>

<p>A Collapsible:</p>
<button id="collapsible0"  class="collapsible">Open Collapsible</button>
<div id="section0" class="content">
</div>

<p>Collapsible Set:</p>
<button id="collapsible1" class="collapsible">Open Section 1</button>
<div id="section1" class="content">
</div>
<button id="collapsible2" class="collapsible">Open Section 2</button>
<div id="section2" class="content">
</div>
<button id="collapsible3" class="collapsible">Open Section 3</button>
<div id="section3" class="content">
</div>

<script>
var coll = document.getElementsByClassName("collapsible");
var i;

for (i = 0; i < coll.length; i++) {
    coll[i].addEventListener("click", function() {
        this.classList.toggle("active");
        var content = this.nextElementSibling;
        if (content.style.display === "block") {
            content.style.display = "none";
        } else {
            content.style.display = "block";
        }
    });
}
</script>

</body>
2.
This code (to be placed in the form's JavaScript field) is used to move your fields to the different sections:

Code: Select all


(function ($) {
    $.fn.moveTo = function (selector) {
        return this.each(function () {
            var cl = $(this).clone();
            $(cl).appendTo(selector);
            $(this).remove();
        });
    };
})(jQuery);

function moveFieldToSection(f, c, s, t) { // field, section
   
    $('#' + f).moveTo('#' + s);
    $('#' + 'label_' + f).moveTo('#' + s);	
    var newTop = $('#' + c).offset().top + t -$('#nuRECORD').offset().top + 30;

    $('#' + f).css({ "top": newTop, "position": "absolute"});
    $('#' + 'label_' + f).css({"top": newTop, "position": "absolute"});
}

if (nuFormType() == 'edit') {
moveFieldToSection('customer_city', 'collapsible2', 'section2', 20); // position within the div
moveFieldToSection('customer_name', 'collapsible1', 'section1', 20);
moveFieldToSection('customer_address', 'collapsible1', 'section1', 46);
}
Fields on the form:
fields_on_form.PNG
This is just a proof of concept and will need some fine-tuning!
atom wrote: also is it
possible to replace Tabs with the same.
I don't think this is easily possible.

Re: Collapsible Div

Posted: Sat May 12, 2018 10:15 am
by toms
This is how you could implement vertical tabs: https://vimeo.com/269331514


1. Place a html object on your form with this html content:

Code: Select all

<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
* {box-sizing: border-box}
body {font-family: "Lato", sans-serif;}

/* Style the tab */
.tab {
    float: left;
    border: 1px solid #ccc;
    background-color: #f1f1f1; 
    width: 30%;
    height: 132;
}

/* Style the buttons inside the tab */
.tab button {
    display: block;
    background-color: inherit;
    color: black;
    padding: 12px 16px;
    width: 100px;
    border: none;
    outline: none;
    text-align: left;
    cursor: pointer;
    transition: 0.3s;
    font-size: 17px;
}

/* Change background color of buttons on hover */
.tab button:hover {
    background-color: #ddd;
}

/* Create an active/current "tab button" class */
.tab button.active {
    background-color: #ccc;
}

</style>
</head>
<body>


<div class="tab">
  <button class="tablinks" onclick="openTab(event, 'Tab 1')">Tab 1</button>
  <button class="tablinks" onclick="openTab(event, 'Tab 2')">Tab 2</button>
  <button class="tablinks" onclick="openTab(event, 'Tab 3')">Tab 3</button>
</div>

<script>

function openTab(evt, tab) {
    // Show the current tab, and add an "active" class to the link that opened the tab
    evt.currentTarget.className += " active";

    tablinks = document.getElementsByClassName("tablinks");
    for (i = 0; i < tablinks.length; i++) {
        tablinks[i].className = tablinks[i].className.replace(" active", "");
    }
    
	nuSelectTabByTitle(tab);
	
	$('#html_vert_tabs').show();
}

function nuSelectTabByTitle(tab) {
    $('[id^=nuTab]').each(function (index) {
        if ($(this).html() == tab) {
            var tabNumber = +index -1;
            var e = document.getElementById('nuTab' + tabNumber);
            nuSelectTab(e);
            $('.nuTab[id^="nuTab"]').hide();
            return true;
        }
    });
}

</script>

</body>
2. In your form's JavaScript field:

Code: Select all

if (nuFormType() == 'edit') {
      $('.nuTab[id^="nuTab"]').hide(); // hide horizontal tabs
}
3. To test it, create add these 3 tabs to your form:
form_tabs.png

Re: Collapsible Div

Posted: Sat May 12, 2018 6:55 pm
by atom
Thanks a lot @toms, this is great,
do you think, a separate band/section
before Tab holder is doable, in this
section I can put some fields I need
viewable at all times, then below
this, the usual Tabs are fine plus
the collapsibles.

Re: Collapsible Div

Posted: Sun May 13, 2018 7:52 am
by toms
You could clone the existing nuTabHolder div:

Code: Select all

$('#nuTabHolder').clone(false,false).attr('id', 'nuTopBar').removeClass('nuTabHolder').addClass('nuTopBar').insertBefore($('#nuTabHolder')).children().remove();
$("#nuTopBar").css({ "height":  20 });
Then move the fields to the new div.

Code: Select all

$('#cus_name').prependTo("#nuTopBar");
  $('#cus_name').css({
        "top":  0,
        "left": 0,
        "position": "relative",
 });
To do: Keep the fields visible / make them visible again when the tab changes.