<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: khupi</title>
    <description>The latest articles on DEV Community by khupi (@khupi).</description>
    <link>https://dev.to/khupi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F220388%2F9c83716b-4ac4-4f66-aef2-1b27aab2581a.png</url>
      <title>DEV Community: khupi</title>
      <link>https://dev.to/khupi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/khupi"/>
    <language>en</language>
    <item>
      <title>I want to run Javascript countup timetracker in the background when page closed</title>
      <dc:creator>khupi</dc:creator>
      <pubDate>Thu, 29 Aug 2019 11:10:47 +0000</pubDate>
      <link>https://dev.to/khupi/i-want-to-run-javascript-countup-timetracker-in-the-background-when-page-closed-25kb</link>
      <guid>https://dev.to/khupi/i-want-to-run-javascript-countup-timetracker-in-the-background-when-page-closed-25kb</guid>
      <description>&lt;p&gt;I want run the javascript countup timetracker in the background when page closed&lt;/p&gt;

&lt;p&gt;$(document).ready(function(){&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;t.run = function() {
    $( "#table input[type=checkbox]" ).each(function(index){
        var tr = $(this).closest('tr');

        if ($(this).is(":checked")) {   
            var total = tr.find('.total'),
                rate = tr.find('.rate'),
                timed = tr.find('.timed');

            total.data('value', total.data('value') + (rate.val()/3600) );
            total.val( t.config.currency+total.data('value').toFixed(2) );
            timed.data('value', parseInt(timed.data('value')) + 1 );
            timed.val( t.niceTime(timed.data('value')) );

            tr.addClass('success');
        }else{
            tr.removeClass('success');
        }
    });

    // Update title and save countdown
    if ($('.timer:checked').length&amp;gt;0) {
        document.title = '('+$('.timer:checked').length+') Timetracker';
        t.config.savenext = t.config.savenext - 1000;
    }else{
        document.title = 'Timetracker';
    }
    // Saving time?
    if (t.config.savenext &amp;lt;= 0) {
        t.config.savenext = t.config.savedefault;
        t.save();
    }

};

t.save = function() {

    var data = {};

    $( "#table tr.taskrow" ).each(function(index){
        var tr = $(this);
        var row = {
            timer: tr.find('.timer').checked,
            date: tr.find('.date').val(),
            client: tr.find('.client').val(),
            task: tr.find('.task').val(),
            rate: tr.find('.rate').val(),
            total: tr.find('.total').data('value'),
            desc: tr.find('.desc').val(),
            timed: tr.find('.timed').data('value')
        };

        data[tr.data('id')] = row;
    });


    var jsondata = JSON.stringify(data);

    $.ajax({
        type: "POST",
        url: "?action=save",
        data: { json: jsondata }
    })
    .done(function( msg ) {
        console.log(msg);
    });

};

t.load = function() {
    jsondata = t.config.initialdata;
    data = JSON.parse(jsondata);

    $('#table tbody').html('');
    var buffer = '&amp;lt;!--start--&amp;gt;';
    //console.log(data);
    for (var key in data) {
        var obj = data[key];
        buffer += 
            '&amp;lt;tr id="task-'+key+'" data-id="'+key+'" class="taskrow"&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="timer" type="checkbox" class="save-cb-state" id="timetrackercheckbox" name="timetrackercheckbox" value="yes"&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="task input-large" type="text" placeholder="Case" value=""&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="date input-mini" type="text" placeholder="Date" value="'+obj.date+'"&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="client input-mini" type="text" placeholder="Client" value="'+obj.client+'" style="color:'+t.generateColor( obj.client )+'"&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="task input-large" type="text" placeholder="Task" value="'+obj.task+'"&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="rate input-mini" type="text" placeholder="'+obj.rate+'" value="'+obj.rate+'"&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="total input-mini" data-value="'+obj.total+'" type="text" placeholder="'+t.config.currency+obj.total.toFixed(2)+'" value="'+t.config.currency+obj.total.toFixed(2)+'"&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="desc" type="text" placeholder="Notes" value="'+obj.desc+'"&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;input class="timed input-mini" type="text" placeholder="0:00:00" data-value="'+obj.timed+'" value="'+t.niceTime(obj.timed)+'"&amp;gt;&amp;lt;/td&amp;gt;' +
                '&amp;lt;td&amp;gt;&amp;lt;button class="delete btn btn-danger btn-small" title="Clear task"&amp;gt;&amp;lt;i class="icon-remove icon-white"&amp;gt;&amp;lt;/i&amp;gt;&amp;lt;/button&amp;gt;&amp;lt;/td&amp;gt;' +
            '&amp;lt;/tr&amp;gt;';
    };
    //console.log(buffer);
    $('#table tbody').html(buffer);

};

t.niceTime = function(s) {
    if (!s) {s=0;}
    hours = parseInt( s / 3600 ) % 24;
    minutes = parseInt( s / 60 ) % 60;
    seconds = s % 60;

    return (hours &amp;lt; 10 ? "0" + hours : hours) + ":" + (minutes &amp;lt; 10 ? "0" + minutes : minutes) + ":" + (seconds  &amp;lt; 10 ? "0" + seconds.toFixed(0) : seconds.toFixed(0));
};

t.generateColor = function(string) {
    string += 'makeitlongerjustincase';
    var hash = '',
        curchar;
    for (var i = 0; i &amp;lt; string.length; i++) {
        curchar = (string.toLowerCase().charCodeAt(i)-97) /25*255;
        curchar = parseInt(curchar.toFixed(0), 10).toString(16);
        hash += curchar;
    }
    return '#'+hash.substr(0,6);
};


/**
 * Events
 */

$('#save').on('click', function() {
    t.config.savenext = 0;
});

$('button.delete').live('click', function() {
    if (confirm('Are you sure you want to delete this task?')) {
        var tr = $(this).closest('tr');
        tr.find('.task').val('');
        tr.find('.client').val('');
        tr.find('.total').data('value', 0);
        tr.find('.total').val(t.config.currency+'0.00');
        tr.find('.rate').val(t.config.rate);
        tr.find('.desc').val('');
        tr.find('.timed').data('value', 0);
        tr.find('.timed').val('00:00:00');
    }
    t.config.savenext = 0;
});

// Update time manually
$(document.body).on('keyup', 'input.timed', function() {
    var secs = $(this).val().split(':');
    $(this).data('value', parseInt(secs[0])*3600+parseInt(secs[1])*60+parseInt(secs[2]));
    t.config.savenext = 0;
});

// Update total manually
$(document.body).on('keyup', 'input.total', function() {
    $(this).data('value', parseFloat($(this).val().replace(/[^0-9\.]/g, '')) );
    t.config.savenext = 0;
});

// Change color of Client
$(document.body).on('input paste', 'input.client', function() {
    $(this).css('color', t.generateColor( $(this).val() ) );
    t.config.savenext = 0;
});

// Trigger saving when editing other fields too
$(document.body).on('keyup', 'input.date,input.task,input.rate,input.desc', function() {
    t.config.savenext = 0;
});

setInterval(function(){t.run();}, 1000);

t.load();
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;});&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
