diff --git a/langs/ru.php b/langs/ru.php index 6fb6132..149a45f 100644 --- a/langs/ru.php +++ b/langs/ru.php @@ -6,8 +6,8 @@ Original name: Русский Author: Max Pozdeev Author Url: http://www.mytinytodo.net - AppVersion: v1.3.2 - Date: 2009-12-26 + AppVersion: v1.3.3 + Date: 2010-01-23 */ class Lang extends DefaultLang @@ -70,7 +70,6 @@ class Lang extends DefaultLang 'f_past' => "Просроченные", 'f_today' => "Сегодня и завтра", 'f_soon' => "Скоро", - 'tasks_and_compl' => "Задачи + завершенные", 'action_edit' => "Редактировать", 'action_note' => "Заметка", 'action_delete' => "Удалить", @@ -80,9 +79,10 @@ class Lang extends DefaultLang 'notes_show' => "Показать", 'notes_hide' => "Скрыть", 'list_new' => "Новый список", - 'list_rename' => "Переименовать", - 'list_delete' => "Удалить", - 'list_publish' => "Опубликовать", + 'list_rename' => "Переименовать список", + 'list_delete' => "Удалить список", + 'list_publish' => "Опубликовать список", + 'list_showcompleted' => "Показать завершенные задачи", 'alltags' => "Все теги:", 'alltags_show' => "Показать все", 'alltags_hide' => "Скрыть все", diff --git a/src/ajax.js b/src/ajax.js index 83f4b52..5eb569e 100644 --- a/src/ajax.js +++ b/src/ajax.js @@ -26,37 +26,33 @@ var mytinytodo = { actions: {} }; -function loadTasks() +function loadTasks(opts) { if(!curList) return false; setSort(curList.sort, 1); + opts = opts || {}; var tz = -1 * (new Date()).getTimezoneOffset(); $('#tasklist').html(''); setAjaxErrorTrigger(); + $('#total').html('...'); var search = filter.search ? '&s='+encodeURIComponent(filter.search) : ''; var tag = filter.tag ? '&t='+encodeURIComponent(filter.tag) : ''; var nocache = '&rnd='+Math.random(); - $.getJSON('ajax.php?loadTasks&list='+curList.id+'&compl='+filter.compl+'&sort='+sortBy+search+tag+'&tz='+tz+nocache, function(json){ + var setCompl = opts.setCompl != null ? '&setCompl=1' : ''; + $.getJSON('ajax.php?loadTasks&list='+curList.id+'&compl='+curList.showCompl+'&sort='+sortBy+search+tag+'&tz='+tz+setCompl+nocache, function(json){ resetAjaxErrorTrigger(); taskList = new Array(); taskOrder = new Array(); - taskCnt.past = taskCnt.today = taskCnt.soon = 0; - taskCnt.total = json.total; + taskCnt.total = taskCnt.past = taskCnt.today = taskCnt.soon = 0; var tasks = ''; $.each(json.list, function(i,item){ tasks += prepareTaskStr(item); taskList[item.id] = item; taskOrder.push(parseInt(item.id)); - if(!item.compl) changeTaskCnt(item.dueClass); + changeTaskCnt(item, 1); }); refreshTaskCnt(); - if(filter.due == '') $('#total').html(taskCnt.total); - else if(filter.due == 'past') $('#total').html(taskCnt.past); - else if(filter.due == 'today') $('#total').html(taskCnt.today); - else if(filter.due == 'soon') $('#total').html(taskCnt.soon); $('#tasklist').html(tasks); - if(filter.compl) showhide($('#compl_hide'),$('#compl_show')); - else showhide($('#compl_show'),$('#compl_hide')); if(json.denied) errorDenied(); }); } @@ -125,7 +121,8 @@ function submitNewTask(form) $.post('ajax.php?newTask'+nocache, { list:curList.id, title: form.task.value, tz:tz, tag:filter.tag }, function(json){ resetAjaxErrorTrigger(); if(!parseInt(json.total)) return; - $('#total').text( parseInt($('#total').text()) + parseInt(json.total) ); + $('#total').text( parseInt($('#total').text()) + 1 ); + taskCnt.total++; form.task.value = ''; var item = json.list[0]; taskList[item.id] = item; @@ -133,6 +130,7 @@ function submitNewTask(form) $('#tasklist').append(prepareTaskStr(item)); changeTaskOrder(item.id); $('#taskrow_'+item.id).effect("highlight", {color:theme.newTaskFlashColor}, 2000); + refreshTaskCnt(); }, 'json'); flag.tagsChanged = true; return false; @@ -189,12 +187,11 @@ function deleteTask(id) $.getJSON('ajax.php?deleteTask='+id+nocache, function(json){ resetAjaxErrorTrigger(); if(!parseInt(json.total)) return; - taskCnt.total--; - $('#total').text( parseInt($('#total').text()) - 1 ); var item = json.list[0]; taskOrder.splice($.inArray(id,taskOrder), 1); $('#taskrow_'+item.id).fadeOut('normal', function(){ $(this).remove() }); - if(!taskList[id].compl && changeTaskCnt(taskList[id].dueClass, -1)) refreshTaskCnt(); + changeTaskCnt(taskList[id], -1); + refreshTaskCnt(); delete taskList[id]; }); flag.tagsChanged = true; @@ -213,20 +210,19 @@ function completeTask(id,ch) var item = json.list[0]; if(item.compl) $('#taskrow_'+id).addClass('task-completed'); else $('#taskrow_'+id).removeClass('task-completed'); - if(changeTaskCnt(taskList[id].dueClass, item.compl?-1:1)) refreshTaskCnt(); - if(item.compl && !filter.compl) { + taskList[id].ow = item.ow; + taskList[id].compl = item.compl; + changeTaskCnt(taskList[id], 0); + if(item.compl && !curList.showCompl) { delete taskList[id]; taskOrder.splice($.inArray(id,taskOrder), 1); $('#taskrow_'+item.id).fadeOut('normal', function(){ $(this).remove() }); - taskCnt.total--; - $('#total').html( parseInt($('#total').text())-1 ); } - else if(filter.compl) { - taskList[id].ow = item.ow; - taskList[id].compl = item.compl; + else if(curList.showCompl) { changeTaskOrder(id); - $('#taskrow_'+id).effect("highlight", {color:theme.editTaskFlashColor}, 'normal'); + $('#taskrow_'+id).effect("highlight", {color:theme.editTaskFlashColor}, 'normal', function(){$(this).css('display','')} ); } + refreshTaskCnt(); }); return false; } @@ -360,17 +356,14 @@ function saveTask(form) resetAjaxErrorTrigger(); if(!parseInt(json.total)) return; var item = json.list[0]; - if(!taskList[item.id].compl) changeTaskCnt(taskList[item.id].dueClass, -1); + changeTaskCnt(item, 0, taskList[item.id]); taskList[item.id] = item; var noteExpanded = (item.note != '' && $('#taskrow_'+item.id).is('.task-expanded')) ? 1 : 0; $('#taskrow_'+item.id).replaceWith(prepareTaskStr(item, noteExpanded)); if(sortBy != 0) changeTaskOrder(item.id); cancelEdit(); - if(!taskList[item.id].compl) { - changeTaskCnt(item.dueClass, 1); - refreshTaskCnt(); - } - $('#taskrow_'+item.id).effect("highlight", {color:theme.editTaskFlashColor}, 'normal'); + refreshTaskCnt(); + $('#taskrow_'+item.id).effect("highlight", {color:theme.editTaskFlashColor}, 'normal', function(){$(this).css('display','')}); }, 'json'); $("#edittags").flushCache(); flag.tagsChanged = true; @@ -733,54 +726,45 @@ function tagCloudClose(e) $('#tagcloud').hide(); } -function changeTaskCnt(cl, dir) +function changeTaskCnt(task, dir, old) { - if(!dir) dir = 1; - else if(dir > 0) dir = 1; + if(dir > 0) dir = 1; else if(dir < 0) dir = -1; - if(cl == 'soon') { taskCnt.soon += dir; return true; } - else if(cl == 'today') { taskCnt.today += dir; return true; } - else if(cl == 'past') { taskCnt.past+= dir; return true; } + if(dir == 0 && old != null && task.dueClass != old.dueClass) //on saveTask + { + if(old.dueClass != '') taskCnt[old.dueClass]--; + if(task.dueClass != '') taskCnt[task.dueClass]++; + } + else if(dir == 0 && old == null) //on comleteTask + { + if(!curList.showCompl && task.compl) taskCnt.total--; + if(task.dueClass != '') taskCnt[task.dueClass] += task.compl ? -1 : 1; + } + if(dir != 0) { + if(task.dueClass != '' && !task.compl) taskCnt[task.dueClass] += dir; + taskCnt.total += dir; + } } function refreshTaskCnt() { + $('#cnt_total').text(taskCnt.total); $('#cnt_past').text(taskCnt.past); $('#cnt_today').text(taskCnt.today); $('#cnt_soon').text(taskCnt.soon); + if(filter.due == '') $('#total').text(taskCnt.total); + else if(taskCnt[filter.due] != null) $('#total').text(taskCnt[filter.due]); } -function setTaskview(v, dontLoadTasks) +function setTaskview(v) { if(v == 0) { - if(filter.due == '' && filter.compl == 0) return; + if(filter.due == '') return; $('#taskview .btnstr').text($('#view_tasks').text()); - if(filter.due != '') { - $('#tasklist').removeClass('filter-'+filter.due); - filter.due = ''; - if(filter.compl == 0) $('#total').text(taskCnt.total); - } - if(filter.compl != 0) { - filter.compl = 0; - $('#total').text('...'); - if(dontLoadTasks==null || !dontLoadTasks) loadTasks(); - } - } - else if(v == 1) - { - if(filter.due == '' && filter.compl == 1) return; - $('#taskview .btnstr').text($('#view_compl').text()); - if(filter.due != '') { - $('#tasklist').removeClass('filter-'+filter.due); - filter.due = ''; - if(filter.compl == 1) $('#total').text(taskCnt.total); - } - if(filter.compl != 1) { - filter.compl = 1; - $('#total').text('...'); - loadTasks(); - } + $('#tasklist').removeClass('filter-'+filter.due); + filter.due = ''; + $('#total').text(taskCnt.total); } else if(v=='past' || v=='today' || v=='soon') { @@ -826,11 +810,13 @@ function mttTabSelected(id, indx) $('#rss_icon').find('a').attr('href', 'feed.php?list='+tabLists[indx].id); if(tabLists[indx].published) $('#btnPublish').addClass('mtt-item-checked'); else $('#btnPublish').removeClass('mtt-item-checked'); + if(tabLists[indx].showCompl) $('#btnShowCompleted').addClass('mtt-item-checked'); + else $('#btnShowCompleted').removeClass('mtt-item-checked'); } curList = tabLists[indx]; flag.tagsChanged = true; cancelTagFilter(1); - setTaskview(0, 1); + setTaskview(0); loadTasks(); } @@ -921,6 +907,8 @@ function loadLists(onInit, updAccess) loadTasks(); if(curList.published) $('#btnPublish').addClass('mtt-item-checked'); else $('#btnPublish').removeClass('mtt-item-checked'); + if(curList.showCompl) $('#btnShowCompleted').addClass('mtt-item-checked'); + else $('#btnShowCompleted').removeClass('mtt-item-checked'); //if(curList.published) $('#rss_icon').find('a').attr('href', 'feed.php?list='+curList.id); if(flag.needAuth && !flag.isLogged) $('#bar_public').show(); @@ -1095,7 +1083,6 @@ function submitFullTask(form) $.post('ajax.php?fullNewTask'+nocache, { list:curList.id, tag:filter.tag, title: form.task.value, note:form.note.value, prio:form.prio.value, tags:form.tags.value, duedate:form.duedate.value }, function(json){ resetAjaxErrorTrigger(); if(!parseInt(json.total)) return; - $('#total').text( parseInt($('#total').text()) + parseInt(json.total) ); form.task.value = ''; var item = json.list[0]; taskList[item.id] = item; @@ -1104,6 +1091,8 @@ function submitFullTask(form) changeTaskOrder(item.id); cancelEdit(); $('#taskrow_'+item.id).effect("highlight", {color:theme.newTaskFlashColor}, 2000); + changeTaskCnt(item, 1); + refreshTaskCnt(); }, 'json'); $("#edittags").flushCache(); flag.tagsChanged = true; @@ -1305,12 +1294,11 @@ function moveTaskToList(taskId, listId) $.post('ajax.php?moveTask&rnd='+Math.random(), { id:taskId, from:curList.id, to:listId }, function(json){ resetAjaxErrorTrigger(); if(!parseInt(json.total)) return; - if(changeTaskCnt(taskList[taskId].dueClass, -1)) refreshTaskCnt(); - taskCnt.total--; + changeTaskCnt(taskList[taskId], -1) delete taskList[taskId]; taskOrder.splice($.inArray(taskId,taskOrder), 1); $('#taskrow_'+taskId).fadeOut('normal', function(){ $(this).remove() }); - $('#total').html( parseInt($('#total').text())-1 ); + refreshTaskCnt(); }, 'json'); $("#edittags").flushCache(); flag.tagsChanged = true; @@ -1341,4 +1329,13 @@ function cmenuListRenamed(opts) mytinytodo.addAction('listsLoaded', cmenuListsLoaded); mytinytodo.addAction('listAdded', cmenuListAdded); -mytinytodo.addAction('listRenamed', cmenuListRenamed); \ No newline at end of file +mytinytodo.addAction('listRenamed', cmenuListRenamed); + +function showCompletedToggle() +{ + var act = curList.showCompl ? 0 : 1; + curList.showCompl = tabLists[curList.i].showCompl = act; + if(act) $('#btnShowCompleted').addClass('mtt-item-checked'); + else $('#btnShowCompleted').removeClass('mtt-item-checked'); + loadTasks({setCompl:1}); +} diff --git a/src/ajax.php b/src/ajax.php index 940d086..4e9f52d 100644 --- a/src/ajax.php +++ b/src/ajax.php @@ -24,12 +24,7 @@ if(isset($_GET['loadLists'])) while($r = $q->fetch_assoc($q)) { $t['total']++; - $t['list'][] = array( - 'id' => $r['id'], - 'name' => htmlarray($r['name']), - 'sort' => (int)$r['sorting'], - 'published' => $r['published'] ? 1 :0, - ); + $t['list'][] = prepareList($r); } echo json_encode($t); exit; @@ -66,6 +61,10 @@ elseif(isset($_GET['loadTasks'])) $t['total']++; $t['list'][] = prepareTaskRow($r, $tz); } + if(_get('setCompl') && have_write_access()) { + $bitwise = (_get('compl') == 0) ? 'taskview & ~1' : 'taskview | 1'; + $db->dq("UPDATE {$db->prefix}lists SET taskview=$bitwise WHERE id=$listId"); + } echo json_encode($t); exit; } @@ -356,12 +355,7 @@ elseif(isset($_POST['addList'])) $id = $db->last_insert_id(); $t['total'] = 1; $r = $db->sqa("SELECT * FROM {$db->prefix}lists WHERE id=$id"); - $t['list'][] = array( - 'id' => $r['id'], - 'name' => htmlarray($r['name']), - 'sort' => (int)$r['sorting'], - 'published' => $r['published'] ? 1 :0, - ); + $t['list'][] = prepareList($r); echo json_encode($t); exit; } @@ -376,12 +370,7 @@ elseif(isset($_POST['renameList'])) $db->dq("UPDATE {$db->prefix}lists SET name=? WHERE id=$id", array($name)); $t['total'] = $db->affected(); $r = $db->sqa("SELECT * FROM {$db->prefix}lists WHERE id=$id"); - $t['list'][] = array( - 'id' => $r['id'], - 'name' => htmlarray($r['name']), - 'sort' => (int)$r['sorting'], - 'published' => $r['published'] ? 1 :0, - ); + $t['list'][] = prepareList($r); echo json_encode($t); exit; } @@ -476,10 +465,15 @@ function check_read_access($listId = null) exit; } +function have_write_access() +{ + if(Config::get('password') == '') return true; + if(is_logged()) return true; +} + function check_write_access() { - if(Config::get('password') == '') return; - if(is_logged()) return; + if(have_write_access()) return; echo json_encode( array('total'=>0, 'list'=>array(), 'denied'=>1) ); exit; } @@ -723,4 +717,17 @@ function moveTask($id, $listId) return true; } +function prepareList($row) +{ + $taskview = (int)$row['taskview']; + return array( + 'id' => $row['id'], + 'name' => htmlarray($row['name']), + 'sort' => (int)$row['sorting'], + 'published' => $row['published'] ? 1 :0, + 'showCompl' => $taskview & 1 ? 1 : 0, +// 'showNotes' => $taskview & 2 ? 1 : 0, + ); +} + ?> \ No newline at end of file diff --git a/src/lang/class.default.php b/src/lang/class.default.php index ee89680..c06d55b 100644 --- a/src/lang/class.default.php +++ b/src/lang/class.default.php @@ -66,7 +66,6 @@ class DefaultLang 'f_past' => "Overdue", 'f_today' => "Today and tomorrow", 'f_soon' => "Soon", - 'tasks_and_compl' => "Tasks + completed", 'action_edit' => "Edit", 'action_note' => "Edit Note", 'action_delete' => "Delete", @@ -79,6 +78,7 @@ class DefaultLang 'list_rename' => "Rename list", 'list_delete' => "Delete list", 'list_publish' => "Publish list", + 'list_showcompleted' => "Show completed tasks", 'alltags' => "All tags:", 'alltags_show' => "Show all", 'alltags_hide' => "Hide all", diff --git a/src/lang/en.php b/src/lang/en.php index 5305e0b..86d862c 100644 --- a/src/lang/en.php +++ b/src/lang/en.php @@ -6,8 +6,8 @@ Original name: English Author: Max Pozdeev Author Url: http://www.mytinytodo.net - AppVersion: v1.3.2 - Date: 2009-12-26 + AppVersion: v1.3.3 + Date: 2010-01-23 */ class Lang extends DefaultLang @@ -70,7 +70,6 @@ class Lang extends DefaultLang 'f_past' => "Overdue", 'f_today' => "Today and tomorrow", 'f_soon' => "Soon", - 'tasks_and_compl' => "Tasks + completed", 'action_edit' => "Edit", 'action_note' => "Edit Note", 'action_delete' => "Delete", @@ -83,6 +82,7 @@ class Lang extends DefaultLang 'list_rename' => "Rename list", 'list_delete' => "Delete list", 'list_publish' => "Publish list", + 'list_showcompleted' => "Show completed tasks", 'alltags' => "All tags:", 'alltags_show' => "Show all", 'alltags_hide' => "Hide all", diff --git a/src/themes/default/index.php b/src/themes/default/index.php index cbcb94a..79b541f 100644 --- a/src/themes/default/index.php +++ b/src/themes/default/index.php @@ -177,8 +177,7 @@ $().ajaxStop( function(r,s) {$("#loading").fadeOut();} );