#include <infocon.style>
#include "common.inc"
+<future>
+<page func=InfoCon title="Stempeluhr">
+<script type="text/javascript" src="<root_prefix>jquery.editable.js"></script>
+
<?
session_name('STEMPEL');
session_start();
$name = load_customers();
- $table_head = '<h3 class="bar">Kunde: %s</h3><script type="text/javascript">plant(%d);</script>
+ $table_head = '<h3 class="bar">Kunde: %s</h3><script type="text/javascript">plant(%d,%.2f);</script>
<form action="status.php" method="POST">
- <table class="smallfont border" width="100%%" cellpadding=0 cellspacing=0>
- <tr class="head" onclick="edit_task_finish(this)">
+ <table class="smallfont border" id="table_%d" width="100%%" cellpadding=0 cellspacing=0>
+ <thead>
+ <tr class="head">
<th width=15%%>Datum</th>
<th width=5%%>Dauer</th>
<th width=5%%>St.</th>
- <th width=75%% align=left>Verwendungszweck</th>
- </tr>';
+ <th width=75%% align=left>Arbeitsbeschreibung</th>
+ </tr>
+ </thead>
+ <tbody>';
if (!is_array($stati))
$stati = find_status();
foreach ($stati as $k=>$v)
$table_foot .= sprintf('<input type="radio" name="status" value="%s"%s>%s ', $k, 0==$k?' checked':'', $v);
- $table_foot .= '<input type="submit" class="button" value="Aktualisieren"></p></div>'.
+ $table_foot .= '<input type="submit" class="button" value="Aktualisieren" onclick="return status_change(event)"></p></div>'.
'<input type="hidden" name="fields" value="%d">'.
'</form>';
- $table_row = '<tr class="t%d"><td>%s</td><td align="center">%s</td><td align="center">%s</td><td onclick="edit_task(this)">%s</td></tr>';
- $table_sum = '<tr class="t%d"><td> </td><td align="center">%s</td><td> </td><td>Summe</td></tr>';
+ $table_row = '<tr class="t%d" status="%d"><td>%s</td><td align="center" onclick="toggle_checkbox(%d,this)">%s</td>' .
+ '<td align="center" onclick="toggle_checkbox(%d,this)">%s</td><td><span route="Stempel/EditTask" item_id="%d">%s</span></td></tr>';
+ $table_sum = '</tbody><tfoot><tr class="t%d" onclick="edit_task_finish(this)">' .
+ '<td> </td><td align="center">%s</td><td> </td><td>Summe</td></tr></tfoot>';
- $query = "SELECT stempel.oid,start,customer,time,task,kurz FROM stempel JOIN stempel_status ON (stempel.status = stempel_status.id) WHERE time IS NOT NULL ";
+ $query = "SELECT stempel.oid,stempel.id,stempel.status,start,customer,time,task,kurz FROM stempel JOIN stempel_status ON (stempel.status = stempel_status.id) WHERE time IS NOT NULL ";
if (isset($month) && strlen($month))
$query .= "AND cast(start AS TEXT) LIKE '".$month."-%' ";
if (isset($cust) && strlen($cust))
printf($table_foot, $fieldnr);
$form++;
}
- $cname = $name[$row['customer']];
+ $cname = $name[$row['customer']]['name'];
if (!strlen($cname)) $cname = ucfirst($row['customer']);
- printf($table_head, $cname, $form);
+ printf($table_head, $cname, $form, $name[$row['customer']]['rate'], $form);
$customer = $row['customer'];
$fieldnr = 0;
$sum = 0;
$fieldnr++,
$row['oid'],
$form);
- printf($table_row, $color, $check.$d[0], min2hour($row['time']), $row['kurz'], htmlspecialchars($row['task']));
+ $date = sprintf('<span onclick="toggle_checkbox(%d,this)">%s</span>', $form, $d[0]);
+ printf($table_row, $color, $row['status'], $check.$date, $form, min2hour($row['time']), $form, $row['kurz'],
+ $row['id'],
+ htmlspecialchars($row['task'], ENT_COMPAT | ENT_HTML401, 'ISO-8859-1'));
$color = !$color;
}
if (pg_num_rows($sth) > 0) {
<script src="<root_prefix>basics.js"></script>
<script type="text/javascript">
+<protect>
var color_checked = '#c4ffc3';
function format_int(value, width)
{
function check(id, value)
{
- var form = document.forms[id];
- var sum = document.getElementById('sum_'+id.toString());
- var newval = 0;
-
- for (i=0; i< form.elements.length; i++) {
- if (form.elements[i].name.substr(0,4) == 'oid_') {
- form.elements[i].checked = value;
- if (value) {
- var ta = form.elements[i].parentNode.nextSibling.innerHTML.split(':');
- newval = newval + parseInt(ta[0],10) * 60 + parseInt(ta[1],10);
- form.elements[i].parentNode.parentNode.style.backgroundColor = color_checked;
- } else
- form.elements[i].parentNode.parentNode.style.backgroundColor = '';
- }
- }
+ var hours = $('#time_'+id);
+ var rate = $('#rate_'+id);
+ var sum = $('#sum_'+id);
+ var newval = 0;
+
+ $('table#table_'+id+' tbody tr:visible').each(function(i,e){
+ var checkbox = $(this).find('input[type="checkbox"]');
+ if (checkbox.prop('checked') != value) {
+ checkbox.prop('checked', !checkbox.prop('checked'));
+ if (checkbox.prop('checked'))
+ $(this).css('background-color', color_checked);
+ else
+ $(this).css('background-color', '');
+ add_sum(id, checkbox);
+ }
+ });
- sum.innerHTML = timestr(newval);
+ return false;
}
-function plant(form)
+function plant(form, rate)
{
document.write('<div class="jscode">');
- document.write('<a href="javascript:check('+form+',true)">Check all</a>');
+ document.write('<input class="filter" id="filter_'+form+'" size="10" value="">');
+ document.write('<img class="filter" id="img_'+form+'" src="/pix/Actions-edit-delete-icon.png" border="0" ' +
+ 'title="Filter löschen">');
+ document.write('<input type="hidden" id="rate_'+form+'" value="'+rate+'">');
+ document.write('<a href="#" onclick="return check('+form+',true)">Check all</a>');
document.write(" / ");
- document.write('<a href="javascript:check('+form+',false)">Uncheck all</a>');
+ document.write('<a href="#" onclick="return check('+form+',false)">Uncheck all</a>');
document.write(" ");
- document.write('<span id="sum_'+form+'" class="sum">0:00</span>');
+ document.write('<span id="time_'+form+'" class="sum">0:00</span>' );
+ document.write('<span id="sum_'+form+'" class="sum">€0.00</span>');
document.write(" ");
document.write('</div>');
}
function add_sum(form, checkbox)
{
- var sum = document.getElementById('sum_'+form.toString());
- var time = strtime(checkbox.parentNode.nextSibling.innerHTML);
+ var hours = $('#time_'+form);
+ var rate = $('#rate_'+form);
+ var sum = $('#sum_'+form);
+ var time = strtime($(checkbox).parents('tr:first').find('td:nth-child(2)').text());
var newval;
- if (checkbox.checked) {
- newval = strtime(sum.innerHTML) + time;
- checkbox.parentNode.parentNode.style.backgroundColor = color_checked;
+ if ($(checkbox).prop('checked')) {
+ newval = strtime(hours.text()) + time;
+ $(checkbox).parents('tr:first').css('background-color', color_checked);
} else {
- newval = strtime(sum.innerHTML) - time;
- checkbox.parentNode.parentNode.style.backgroundColor = '';
+ newval = strtime(hours.text()) - time;
+ $(checkbox).parents('tr:first').css('background-color', '');
}
- sum.innerHTML = timestr(newval);
+ hours.text(timestr(newval));
+ sum.html('€' + ((newval/60)*rate.val()).toFixed(2));
}
-var task_parent = null;
-var task_title = '';
-var task_oid = 0;
-function edit_task(obj)
+function toggle_checkbox(form, obj)
{
- if (task_oid) {
- if (task_oid != obj.parentNode.children[0].children[0].value)
- edit_task_save();
- }
-
- if (!task_oid) {
- task_parent = obj;
- task_title = obj.innerHTML;
- task_oid = obj.parentNode.children[0].children[0].value;
-
- var input = document.createElement('input');
- input.value = obj.innerHTML
- input.style.fontSize = '100%';
- input.style.width = '100%';
- input.style.background = 'yellow';
+ var row = $(obj).parents('tr:first');
+ var checkbox = row.find('input[type="checkbox"]')
+ checkbox.prop('checked', !checkbox.prop('checked'));
- obj.innerHTML = '';
- obj.appendChild(input);
- input.focus();
- }
+ checkbox.checked = !checkbox.checked;
+ add_sum(form, checkbox);
}
-function edit_task_save()
+function filter_change(e)
{
- if (!task_parent) return;
-
- if (task_parent.children[0].value != task_title)
- ajax_request('save','oid='+task_oid+'&task='+encodeURIComponent(task_parent.children[0].value));
+ var form = $(this).attr('id').split('_')[1];
+ var filter = $('input#filter_'+form).val();
+
+ var cnum = 0;
+ $('table#table_'+form+' tbody tr').not('.deleted').each(function(i,e){
+ if (filter.length) {
+ var td = $(this).find('td:nth-child(4)');
+ if (td.text().toLowerCase().indexOf(filter) > -1) {
+ $(this).removeClass('t0').removeClass('t1').addClass('t'+cnum).show();
+ cnum = cnum ? 0 : 1;
+ } else {
+ if ($(this).find('input[type="checkbox"]').prop('checked')) {
+ toggle_checkbox(form, td);
+ }
+ $(this).hide();
+ }
+ } else {
+ $(this).removeClass('t0').removeClass('t1').addClass('t'+cnum).show();
+ cnum = cnum ? 0 : 1;
+ }
+ });
+}
- task_parent.innerHTML = task_parent.children[0].value;
- task_parent = null;
- task_title = '';
- task_oid = 0;
+function filter_clear(e)
+{
+ var form = $(this).attr('id').split('_')[1];
+ $('div.jscode input.filter#filter_'+form).val('').keyup();
}
-function edit_task_finish(obj)
+function status_change(e)
{
- if (task_oid)
- edit_task_save();
+ var ids = [];
+ var form = $(e.target).parents('form:first');
+ var p = $(e.target).parents('p:first');
+ form.find('tr').not('.deleted').find('input.checkbox').each(function(i,e){
+ if ($(this).prop('checked') == true)
+ ids.push($(this).val());
+ });
+
+ var new_status = 0;
+ p.find('input[name="status"]').each(function(i,e){
+ if ($(this).prop('checked') == true)
+ new_status = $(this).val();
+ });
+
+ $.invoke('Sales/SetStatus', {status: new_status, ids: ids}, function(data){
+ for (var i=0; i < ids.length; i++) {
+ show_message('Positionen aktualisiert');
+ var checkbox = form.find('input.checkbox[value="'+ids[i]+'"]');
+ var row = checkbox.parents('tr:first');
+
+ checkbox.prop('checked',false);
+ add_sum(form.find('table:first').attr('id').split('_')[1], checkbox);
+
+ if (row.attr('status') != new_status)
+ row.addClass('deleted').hide();
+ }
+ });
+
+ return false;
}
+$(function(){
+ $('div.jscode input.filter').keyup(filter_change);
+ $('div.jscode img.filter').click(filter_clear);
+ make_editable('table.smallfont tr span');
+});
+</protect>
</script>
<style type="text/css">
margin-top: -13px;
font-size: 12px;
}
+div.jscode input.filter {
+ font-size: 90%;
+ position: relative;
+ bottom: 2px;
+}
+div.jscode img.filter {
+ position: relative;
+ bottom: -3px;
+ margin-left: 1px;
+ margin-right: 10px;
+}
span.sum {
display: inline;
border: 1px solid #9b9b9b;
}
</style>
-<page func=InfoCon title="Stempeluhr">
-
<?
if (!empty($msg))
echo $msg;