15

I get data from database and use jquery tabs to display it:

<script>
$(function () {
   $( "#treeTabs" ).tabs();
});
</script>

<div id="treeTabs">
    <ul>
<?php
$hod_result = getFamilyTree();
$i = 0;
while($hod_row = mysqli_fetch_array($hod_result))
{
?>
    <li>
        <a href="#<?php echo $hod_row["staff_id"]?>" class="tab_header"><span class="closer" data-id3="<?php echo $hod_row["staff_id"] ?>"><i class="fa fa-times" aria-hidden="true"></i></span><?php echo $hod_row["longname"].' ('.$hod_row["team_role"].')' ?></a>              
    </li>
<?php $i++;} ?>
    </ul>
<?php
$hod_result_tabs = getFamilyTree();
$i_tabs = 0;
while($hod_row_tabs = mysqli_fetch_array($hod_result_tabs))
{
?>    
  <div id="<?php echo $hod_row_tabs["staff_id"]?>">
    <div class="tree" id="<?php echo $hod_row_tabs["staff_id"]?>"> 
    <ul>
    <li>
    <?php
    $hod_id_list = $hod_row_tabs["staff_id"];
    $sv_result_list= getSupervisorRole($hod_id_list);
    ?>
    <a href="#">
        <table>
        <tr>
            <th colspan="3">Head Of The Department:</th>    
        </tr>
        <tr>
            <td>
                <?php echo $hod_row_tabs["username"].' '.$hod_row_tabs["staff_id"]; ?>
                <span class="closer" data-id3="<?php echo $hod_row_tabs["staff_id"]; ?>"><i class="fa fa-times" aria-hidden="true"></i></span>
                <a href="#" style="background-color:#808080; color:white; font-size: 8px; padding: 3px 3px 3px 3px;"><?php echo substr($hod_row_tabs["team_role"], 0, 3); ?></a>
                <span class="createTree" data-id3="<?php echo $hod_row_tabs["staff_id"].'|Supervisor';?>"><!--<img alt="" src="imagesAssessment/add.png">--><i class="fa fa-user-plus fa-lg" aria-hidden="true"></i></span>
                <span class="btn_details" data-id3="<?php echo $hod_row_tabs["staff_id"]; ?>"><!--<img title="View Evaluation Details" src="imagesAssessment/details.png">--><i class="fa fa-search fa-lg" aria-hidden="true"></i></span>
            </td>            
        </tr>
        </table>
    </a>
        <?php
        $sv_result= getSupervisorRole($hod_id_list);
        if(mysqli_num_rows($sv_result) > 0){
        ?>        
        <ul>
        <?php
            while($sv_row = mysqli_fetch_array($sv_result))
            {
        ?>
        <!--<ul>-->
            <li>
                <a href="#" >
                    <table style='all:unset;'>
                    <tr>
                        <td>
                            <a href="#" style='all:unset;' class="expand" data-id3="<?php echo $sv_row["staff_id"].'|'.$sv_row["username"].'|'.$sv_row["importance"]; ?>">
                            <?php echo $sv_row["username"]; ?> 
                            </a>
                            <span class="closer" data-id3="<?php echo $sv_row["staff_id"]; ?>"><i class="fa fa-times" aria-hidden="true"></i></span>  
                            <a href="#" style="background-color:#808080; color:white; font-size: 8px; padding: 3px 3px 3px 3px;"><?php echo strtoupper(substr($sv_row["team_role"], 0, 3)); ?></a>              
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <?php echo $sv_row["staff_id"]; ?> 
                            <span class="createTree" data-id3="<?php echo $sv_row["staff_id"].'|Checker'; ?>"><!--<img alt="" src="imagesAssessment/add.png">--><i class="fa fa-user-plus fa-lg" aria-hidden="true"></i></span>
                            <span class="btn_details" data-id3="<?php echo $sv_row["staff_id"]; ?>"><!--<img title="View Evaluation Details" src="imagesAssessment/details.png">--><i class="fa fa-search fa-lg" aria-hidden="true"></i></span>
                        </td>
                    </tr>
                    </table>
                </a>
                <?php                     
                $sv_id=$sv_row["staff_id"];
                $ch_result= getCheckerRole($sv_id); 
                if (mysqli_num_rows($ch_result) > 0){?>
                <ul style='' >
                    <li >
                    <?php
                    while($ch_row = mysqli_fetch_array($ch_result)){ ?>
                <a href="#" style='display: block;'>
                    <table style='all:unset;'>
                    <tr>
                        <td>
                            <a href="#" style='all:unset;' class="expand" data-id3="<?php echo $ch_row["staff_id"].'|'.$ch_row["username"].'|'.$ch_row["importance"]; ?>">
                            <?php echo $ch_row["username"]; ?>                             
                            </a>
                            <span class="closer" data-id3="<?php echo $ch_row["staff_id"]; ?>"><i class="fa fa-times" aria-hidden="true"></i></span>    
                            <a href="#" style="background-color:#808080; color:white; font-size: 8px; padding: 3px 3px 3px 3px;"><?php echo strtoupper(substr($ch_row["team_role"], 0, 3)); ?></a>    
                        </td>
                    </tr>                        
                    <tr>
                        <td>
                            <?php echo $ch_row["staff_id"]; ?>  
                            <span class="createTree" data-id3="<?php echo $ch_row["staff_id"].'|Squad Leader'; ?>"><!--<img alt="" src="imagesAssessment/add.png">--><i class="fa fa-user-plus fa-lg" aria-hidden="true"></i></span>                            
                            <span class="btn_details" data-id3="<?php echo $ch_row["staff_id"]; ?>"><!--<img title="View Evaluation Details" src="imagesAssessment/details.png">--><i class="fa fa-search fa-lg" aria-hidden="true"></i></span>
                        </td>
                    </tr>
                    </table>
                </a>
                    <?php } ?>
                    </li>
                </ul>
                <?php } ?>
            </li>

        <!--</ul>-->
        <?php }} ?>
        </ul>
    </li>
    </ul>
    </div>
    <div class="input"></div>
  </div>
<?php $i_tabs++;} ?>
</div>

Inside each tab i get a tree of names: enter image description here enter image description here

Then by clicking on enter image description here icon there is popup window with list of users: enter image description here

Here is code for dialog window:

var addUserDlg, form;

/*create and open pop up window to create a team*/
addUserDlg = $("#addUserDialog").dialog({
    autoOpen: false,
    height: 650,
    width: 570,
    modal: true,
    position: { my: "center", at: "top" },
    buttons: {
        "Create a tree": addUser,
        Cancel: function () {
            addUserDlg.dialog("close");
        }
    },
    close: function () {
        form[ 0 ].reset();
    }
});
$(document).on('click', '.createTree', function(){
    addUserDlg.dialog("open");
    var leader_role = $(this).data("id3");              
    $.ajax({
        url: "comAssessment/hr_tree_list.php",
        method: "POST",
        data: {leader_role: leader_role},
        success: function (data) {
            $('#users').html(data);

        }
    });
});
 form = addUserDlg.find("form").on("submit", function (event) {
    event.preventDefault();
    addUser();
});

And function addUser:

/*function to add new user to team*/
function addUser() {
    var insert = [];
    if ($('input[name="chk"]:checked').length > 0)
    {
        $('.get_value').each(function () {
            if ($(this).is(":checked"))
            {
                insert.push($(this).val());
            }
        });
        var user_to_leader = $('#user_to_leader').val();
        var team_role = $('#team_role').val();
        insert = insert.toString();
        $.ajax({
            url: "comAssessment/hr_tree_insert.php",
            method: "POST",
            data: {insert: insert, user_to_leader:user_to_leader, team_role:team_role},
            success: function (data) {
                location.reload();
                addUserDlg.dialog("close");
            }
        });
    }
}

Right now I update whole page location.reload(); but it doesnt look nice because it opens first tab every time. How can I update only current tab after adding new users?

EDIT

Ok, I tried to get index of the tab and refresh it. I added button for testing:

<button id="button">Click me</button>
<div class="test_bt"></div>

And jquery:

$("#button").click(function() {
    var current_index = $("#treeTabs").tabs("option","active");
    $("#treeTabs").tabs('load',current_index);
    $('.test_bt').html(current_index);
});

Then I removed location.reload(); from ajax success function to check if my button will do the work. But it doesnt work. I only get index, no loading happens.

function addUser() {
    var insert = [];
    if ($('input[name="chk"]:checked').length > 0)
    {
        $('.get_value').each(function () {
            if ($(this).is(":checked"))
            {
                insert.push($(this).val());
            }
        });
        var user_to_leader = $('#user_to_leader').val();
        var team_role = $('#team_role').val();
        insert = insert.toString();
        $.ajax({
            url: "comAssessment/hr_tree_insert.php",
            method: "POST",
            data: {insert: insert, user_to_leader:user_to_leader, team_role:team_role},
            success: function (data) {

                addUserDlg.dialog("close");
            }
        });
    }
}

4 Answers4

4

You have two options

  1. Create the tabs' html content on clientside with ajax&javascript.
  2. Put an anchor of the current tab into the url, so you can show the current tab when the page is refreshed.

Option 1 is alot of work, so I'm gonna elaborate option 2 now.

Replace your current tabs initializing code with this:

For jQuery 1.11

<script>
$(function () {

    var url_hashtag_index = location.href.indexOf('#')
    var initial_tab = url_hashtag_index==-1 ? 0 : parseInt(location.href.slice(url_hashtag_index+1))

    $("#treeTabs").tabs({activate: tabSelected, active: initial_tab});

    function tabSelected(event,ui){
        var tab_index = $('#treeTabs').tabs("option", "active")
        var hashtag_index = location.href.indexOf('#')
        var url = hashtag_index==-1 ? location.href : location.href.slice(0,hashtag_index)
        location.replace(url+'#'+tab_index)
    }

});
</script>

For jQuery 1.9+

<script>
$(function () {

    var url_hashtag_index = location.href.indexOf('#') // check if # is un url
    var initial_tab = url_hashtag_index==-1 ? 0 : parseInt(location.href.slice(url_hashtag_index+1)) // if so get tab index

    $("#treeTabs").tabs({select: tabSelected, selected: initial_tab}); // set tab index and add listener for tab selection

    function tabSelected(event,ui){
        var hashtag_index = location.href.indexOf('#')
        var url = hashtag_index==-1 ? location.href : location.href.slice(0,hashtag_index) // remove existing tab from url
        location.replace(url+'#'+ui.index) // replace url with new tab index (replace -> no history in browser)
    }

});
</script>
Manuel Otto
  • 6,410
  • 1
  • 18
  • 25
  • @YevgeniyBagackiy You have to put the `location.reload()` back in ;) – Manuel Otto Aug 30 '17 at 06:29
  • If i put it back page reloads but always reloads to the first tab. I want it to stay on the tab I updated. So lets say if i click add user on the third tab after adding page is reloaded and i am on first tab again – Yevgeniy Bagackiy Aug 30 '17 at 06:35
  • @YevgeniyBagackiy Hmmm.. It worked for my test. Can you check if there is #1 at the end of the url when you switch tabs? – Manuel Otto Aug 30 '17 at 06:38
  • @YevgeniyBagackiy Ah, seems like I used a different version, replace `active: initial_tab` with `selected: initial_tab`. I updated my post. – Manuel Otto Aug 30 '17 at 06:48
  • I think it should be `active` because I use jquery jQuery 1.11. I think I dont get index of the tab when I tried to print `url` or `hashtag_index` by using `$('.test_bt').html(hashtag_index);` but i dont get anything. – Yevgeniy Bagackiy Aug 30 '17 at 07:01
  • @YevgeniyBagackiy Ok, I've updated my post for jQuery 1.11. – Manuel Otto Aug 30 '17 at 07:23
  • Still reloads whole page instead of current tab only – Yevgeniy Bagackiy Aug 30 '17 at 07:34
  • Alright. It still reloads whole page and return me back on first tab after I add someone to the tree when there is `location.reload();` inside `success: function()` However I noticed that when i reload page manualy by clicking on reload button i stay on my opened tab and system doesnt drop me to the first tab – Yevgeniy Bagackiy Aug 30 '17 at 08:31
  • You might want to look @ [this](https://stackoverflow.com/q/298503/6577822) ... you can use native JavaScript to simplify much of your HASH code. – fjoe Aug 31 '17 at 06:06
4

I am trying to build upon Manuel Otto Answer to the question by simplifying the logic greatly through the usage of the window.location.hash property.

<script>
    $(function () {
        // Setup event for selecting a tab
        $("#treeTabs").tabs({ activate: tabSelected });

        // Bail if there is no hash as the first tab will load by default
        if (!window.location.hash) { return; }

        // Get the index
        var tabIndex = location.hash.split("#")[1]

        // Set the current index
        $("#treeTabs").tabs({ activate: tabSelected, active: tabIndex });
    });

    function tabSelected(event, ui) {
        window.location.hash = "#" + ui.newTab.index();
        return false; //disables browser anchor jump behavior
    }
</script>

This logic will fail if you decided to use the HASH for anything but the index of your tab but should get you started with a solution. If you need a more comprehensive usage of the URL HASH leave a comment below and I would be happy to expand the answer.

fjoe
  • 1,150
  • 7
  • 15
  • Nice! Didn't know about that. – Manuel Otto Aug 31 '17 at 13:20
  • I tried your solution but still didnt get result I want. I changed `select` to `activate` and `selected` to `active` and i got `#undefined` in my browser link – Yevgeniy Bagackiy Sep 04 '17 at 01:14
  • @YevgeniyBagackiy You are correct I have check the documentation and updated the calls you mentioned. I also found that the correct way to get the new tabs index is ui.newTab.index() not ui.index and have updated that too. Let me know if that fixes it as it would explain the #undefined – fjoe Sep 05 '17 at 02:27
1

You could extract the code from the loop that populates the content of the tab and create a new file. The new file should use the staffid/hod from a querystring parameter and instead of using the id from the loop. Then on the master page, each tab only gets an empty div with an id of the of the employee. When you first load the page, use ajax to populate the first tab from the new script. When you update any tab, just use ajax to post the change and if successful, reload the contents of the current tab into the div again. Better still, return the updated results from the post and insert that into the div.

biznetix
  • 94
  • 5
0

It doesn't currently do ajax tabs (yet). Unbelievably, no one has requested it yet, so I just never got around to building that in. I could probably have that in the next version.

In the meantime, you could do something like this:

 <div id="container">

   <a href="#panel-1" data-url="/some/url/path" class="tabs">I'm a tab</a>
      ...
      <div id="panel-1"></div>
      ...
 </div>

And then in your javascript, having something like:

  $('#container').easytabs();
    $('.tabs').click(function(){
     var $this = $(this);
     $($this.attr('href')).load($this.data('url'));
   });

I think this discussion is very helpful to

Loading tab content via Ajax

Kondal
  • 2,870
  • 5
  • 26
  • 40