Pixel Reaper
Pixel Reaper

Reputation: 263

On click, highlight a tables column

With my table, the user can sort the results ascending and descending. I need to make it to where when they click on the header button to sort that column, it changes the background of all the columns (directly underneath that header column) to change the background color... Here's my code thus far: Here's the CSS:

<style type="text/css">
.move_right {
    padding-left: 5px;
}
.center-text {
    padding-right: 5px;
}
.bottom_center_text {
    padding-left: 2px;
}
#nav_bottom {
    height: 0px; !important
}
#portfolio_header {
    Background-color: #5E90B3;
    color: white;
    border: 1px solid #CCCCCC;
    font-weight: bold;
    font-size: 14px;
    margin-bottom: 0px;
    padding: 10px;
}
table#bin, table#fallen, table#growth, table#turn { margin:10px 0; border:1px solid #ccc; }
th, td { padding:10px 7px; }
tr th { background:#ededed; color:#545454; font-weight:bold; cursor:pointer;}
#bin tr.even td { background:#e1eff1; }
#turn tr.even td { background:#f7f2d8; }
#fallen tr.even td { background:#f2dcbd; }
#growth tr.even td { background:#deefdc; }
td.title a { text-decoration:none; display:block; text-transform:uppercase; font-weight:bold;}
#bin td.title { background:#5198a0; }
#fallen td.title { background:#e6a850; }
#turn td.title { background:#ebd870; }
#growth td.title { background:#6ab065; }
#bin td.title a { color:#182c2e; font-size:13px;}
#fallen td.title a { color:#352713;  font-size:13px;}

#turn td.title a { color:#37321a;  font-size:13px; }
#growth td.title a { color:#233d21;  font-size:13px;}
hr { border:2px dotted #ccc; border-bottom:none; }
#tooltip { position:absolute; z-index:3000; border:1px solid #111; background-color:#eee; padding:5px; }
#tooltip h3, #tooltip div, #tooltip p { margin:0; }


/*#bin tr.even td.click, th.click,*/ td.click, th.click
{
    background-color: #000000;
}
/*#bin tr.even td.hover, tr.hover,*/ td.hover, tr.hover
{
    background-color: #CCC;
}
/*#bin tr.even th.hover, tfoot td.hover,*/ th.hover, tfoot td.hover
{
    background-color: ivory;
}
/*#bin tr.even td.hovercell, th.hovercell,*/ td.hovercell, th.hovercell
{
    background-color: #abc;
}
/*#bin tr.even td.hoverrow, th.hoverrow,*/ td.hoverrow, th.hoverrow
{
    background-color: #6df;
}
</style>

Here's the HTML:

        <table cellspacing="0" cellpadding="0" id="bin" width="100%">
        <thead>
            <tr>
                <th style="text-align:left; padding-top: 20px;" width="10%" title="Sort by Symbol" id="row-1" data-column="1">Symbol <img src="/images/sort-arrow-up.jpg" title="Sort by Symbol" alt="Sort by Symbol" class="sort-right move-left bottom-image" id="image1"/></th>
                <th style="text-align:left;" width="20%" title="Sort by Company Name" id="row-2" data-column="2">Company<br><span class="move_right">Name</span> <img src="/images/sort-arrow-up.jpg" title="Sort by Company Name" alt="Sort by Company Name" class="sort-right move-left" id="image2"/></th>
                <th style="text-align:center;" width="12%" title="Sort by Buy Date" id="row-3" data-column="3"><span class="center-text">Buy</span><br>Date <img title="Sort by Buy Date" src="/images/sort-arrow.jpg" alt="Sort by Buy Date" id="image3"/></th>
                <th style="text-align:center;" width="10%" title="Sort by Buy Price" id="row-4" data-column="4"><span class="center-text">Buy</span><br>Price &nbsp;<img title="Sort by Buy Price" src="/images/sort-arrow.jpg" alt="Sort by Buy Price" id="image4"/></th>
                <th style="text-align:center;" width="9%" title="Sort by Closed Price" id="row-5" data-column="5"><span class="center-text">Closed</span><br>Price &nbsp;<img title="Sort by Closed Price" src="/images/sort-arrow.jpg" alt="Sort by Closed Price" id="image5"/></th>
                <th style="text-align:center;" width="9%" title="Sort by Closed Date" id="row-6" data-column="6"><span class="center-text">Closed</span><br>Date &nbsp;<img title="Sort by Closed Date" src="/images/sort-arrow.jpg" alt="Sort by Closed Date" id="image6"/></th>
                <th style="text-align:center;" width="10%" title="Sort by Current Return" id="row-7" data-column="7"><span class="center-text">Total</span><br>Return &nbsp;<img title="Sort by Current Return" src="/images/sort-arrow.jpg" alt="Sort by Current Return" id="image7"/></th>
            </tr>
        </thead>
        <tbody>
<?php
    foreach($buylist as $a) {
        $bg = ($c % 2) ? ' class="even"' : '';
        $direction = (is_numeric($a['creturn']) && $a['creturn'] >= 0) ? 'up_green' : 'down_red';
        $tick = (is_numeric($a['creturn']) && $a['creturn'] >= 0) ? '<img src="/images/icon_up.gif">' : '<img src="/images/icon_down.gif">';
        $tick2 = (is_numeric($a['cchange']) && $a['cchange'] >= 0) ? '<img src="/images/icon_up.gif">' : '<img src="/images/icon_down.gif">';   
        $tick3 = (is_numeric($a['final_return_pct']) && $a['final_return_pct'] >= 0) ? '<img src="/images/icon_up.gif">' : '<img src="/images/icon_down.gif">'; 
        $type = '';
        $entry_price = (is_numeric($a['buyprice'])) ? '$'.$a['buyprice'] : '&ndash;';
        $sold_price = (is_numeric($a['sold_price'])) ? '$'.$a['sold_price'] : '&ndash;';
        $total_return= sprintf("%.02f", (($a['sold_price'] - $a['buyprice'])/$a['buyprice']) * 100);
?>
            <tr<?=$bg;?>>
                <td data-column="1"><b><a href="/gamechangers/getaquote/?symbolsearch=<?php echo $a['symbol']; ?>"><?=$a['symbol'];?></a></b><?=$type;?></td>
                <td data-column="2"><?=$a['name'];?></td>
                <td align="center" data-column="3"><?=$a['buydate'];?></td>
                <td align="center" data-column="4"><?=$entry_price;?></td>
                <td align="center" data-column="5"><?php echo $sold_price; ?></td>
                <td align="center" data-column="6"><?=$a['sold_date'];?></td>
                <td align="center" data-column="7"><?php echo $total_return; ?>%</td>
            </tr>
<?php
        $c++;
    }
?>
        </tbody>
    </table>

I have tried using a plugin, but that was to no avail because I am having PHP grab content from the database and directly feed it into the table. Side note: When PHP grabs the content from the database, it is alternating the color of the rows in the table from white to blue.

Any and all help is greatly appreciated.

Upvotes: 1

Views: 4240

Answers (2)

Andrew
Andrew

Reputation: 1126

I would assign every <td> and <th> a data-column attribute indicating which column it is. Then on click of the <th>, grab the data-column attribute of the header and use jQuery (or similar library) to change the color of all table cells with that data-column attribute.

Example table markup:

<table id="table">
  <thead>
    <tr>
      <th data-column="1">Column 1</th>
      <th data-column="2">Column 2</th> // etc ....
    </tr>
  </thead>
  <tbody>
    <tr>
      <td data-column="1">contents</td>
      <td data-column="2">contents</td> // etc...
    </tr>
  </tbody>
</table>

Example jQuery:

$('body').on('click', '#table th', function(){

  // Grab the column number
  var column = $(this).attr('data-column');

  // Reset any highlighted columns
  $('#table td').removeClass('highlighted'); 

  // Set all columns with the same column number to have the highlight class
  $('#table td[data-column='+column+']').addClass('highlighted');

})

Hope this helps!

Best, Andrew

Upvotes: 3

talemyn
talemyn

Reputation: 7960

You should be able to do this pretty easily with JQuery, using .index() and :eq(), without having to change your current HTML at all.

When you click to do the sort, after everything is sorted, grab the position of the clicked <th> in the row using this:

var colNum = $(this).parent().children().index($(this));

. . . though, this is assuming that the click event is bound to the <th> itself. If it is tied to a lower-level element, you'd have to modify the code a little bit, to this:

var parentTH = $(this).closest("th");
var colNum = parentTH.parent().children().index(parentTH);

Once you have the index of the <th> in the row, you can then select all of the <td> tags that are in the same positions of their row, like this:

var selectedColCells = $("#bin tr").find("td:eq(" + colNum + ")");

Once you have those, you can add a class or change the style directly for each one (I'd recommend using a class :) ). You will also want to clear the class/style from all <td> tags in the table, each time, so that it resets to the default "unsorted" look.

On side note, if you used a <colgroup> in your table, with a <col> for each column, you could use the same logic, but you would only have to update the selected <col> with the class/style, instead of each <td> in the column.

Edit: fixed a minor issue in the logic for finding the "colNum" value, when the click event is tied to an element below the <th> level.

Upvotes: 0

Related Questions