+* v1.3 prototype

This commit is contained in:
Max Pozdeev 2009-09-19 11:47:22 +04:00
parent d13d93c9ce
commit f59a53fa4d
7 changed files with 147 additions and 188 deletions

View file

@ -17,10 +17,12 @@ var tz = 0;
var img = {
'note': ['images/page_white_text_add_bw.png','images/page_white_text_add.png'],
'edit': ['images/page_white_edit_bw.png','images/page_white_edit.png'],
'del': ['images/page_cross_bw.png','images/page_cross.png']
'del': ['images/page_cross_bw.png','images/page_cross.png'],
'toggle': ['images/toggle_plus.gif','images/toggle_minus.gif']
};
var taskCnt = { total:0, past: 0, today:0, soon:0 };
var tmp = {};
var oBtnMenu = {};
function loadTasks()
{
@ -60,11 +62,12 @@ function prepareTaskStr(item)
'<a href="#" onClick="return toggleTaskNote('+id+')"><img src="'+img.note[0]+'" onMouseOver="this.src=img.note[1]" onMouseOut="this.src=img.note[0]" title="'+lang.actionNote+'"></a>'+
'<a href="#" onClick="return editTask('+id+')"><img src="'+img.edit[0]+'" onMouseOver="this.src=img.edit[1]" onMouseOut="this.src=img.edit[0]" title="'+lang.actionEdit+'"></a>'+
'<a href="#" onClick="return deleteTask('+id+')"><img src="'+img.del[0]+'" onMouseOver="this.src=img.del[1]" onMouseOut="this.src=img.del[0]" title="'+lang.actionDelete+'"></a></div>'+
'<div class="task-left"><input type="checkbox" '+(readOnly?'disabled':'')+' onClick="completeTask('+id+',this)" '+(item.compl?'checked':'')+'></div>'+
'<div class="task-left"><img src="'+img.toggle[0]+'" class="mtt-toggle '+(item.note==''?'invisible':'')+'" onClick="toggleNote('+id+')">'+
'<input type="checkbox" '+(readOnly?'disabled':'')+' onClick="completeTask('+id+',this)" '+(item.compl?'checked':'')+'></div>'+
'<div class="task-middle">'+prepareDuedate(item.duedate, item.dueClass, item.dueStr)+
'<span class="nobr"><span class="task-through">'+preparePrio(prio,id)+'<span class="task-title">'+prepareHtml(item.title)+'</span>'+
prepareTagsStr(item.tags)+'<span class="task-date">'+lang.taskDate(item.date)+'</span></span></span>'+
'<div class="task-note-block'+(item.note==''?' hidden':'')+'">'+
'<div class="task-note-block hidden">'+
'<div id="tasknote'+id+'" class="task-note"><span>'+prepareHtml(item.note)+'</span></div>'+
'<div id="tasknotearea'+id+'" class="task-note-area"><textarea id="notetext'+id+'"></textarea>'+
'<span class="task-note-actions"><a href="#" onClick="return saveTaskNote('+id+')">'+lang.actionNoteSave+
@ -837,3 +840,78 @@ function editFormResize(startstop, event)
}
else $('#page_taskedit textarea').height(f.height() - tmp.editformdiff);
}
function mttTabSelected(el, indx)
{
$(el.parentNode.parentNode).children('.mtt-tabs-selected').removeClass('mtt-tabs-selected');
$(el.parentNode).addClass('mtt-tabs-selected');
}
function btnMenu(el)
{
if(!el.id) return;
oBtnMenu.container = el.id+'container';
oBtnMenu.targets = [el.id, oBtnMenu.container];
w = $('#'+oBtnMenu.container);
if(w.css('display') == 'none')
{
oBtnMenu.h = [];
$(w).children('.li').each( function(i,o){
if(o.onclick) {
oBtnMenu.h[i] = o.onclick;
$(o).bind("click2", o.onclick);
o.onclick = function(event) { $('#'+oBtnMenu.container).hide(); $(o).trigger('click2'); btnMenuClose(); }
} else {
oBtnMenu.h[i] = null;
}
} );
offset = $(el).offset();
w.css({ position: 'absolute', top: offset.top+el.offsetHeight-1, left: offset.left , 'min-width': $(el).width() }).show();
$(document).bind("click", btnMenuClose);
}
else {
el.blur();
btnMenuClose();
}
}
function btnMenuClose(e)
{
if(e) {
if(isParentId(e.target, oBtnMenu.targets)) return;
}
$(document).unbind("click", btnMenuClose);
$('#'+oBtnMenu.container).hide().children('.li').each( function(i,o){
if(oBtnMenu.h[i]) {
o.onclick = oBtnMenu.h[i];
$(o).unbind('click2');
}
});
oBtnMenu = {};
}
function toggleNote(id)
{
var o = $('#taskrow_'+id+'>div>div.task-note-block');
if(o.is('.hidden')) $('#taskrow_'+id+'>div>.mtt-toggle').attr('src', img.toggle[1]);
else $('#taskrow_'+id+'>div>.mtt-toggle').attr('src', img.toggle[0]);
o.toggleClass('hidden');
}
function toggleAllNotes(showhide)
{
for(id in taskList)
{
if(taskList[id].note == '') continue;
if(showhide) {
$('#taskrow_'+id+'>div>.mtt-toggle').attr('src', img.toggle[1]);
$('#taskrow_'+id+'>div>div.task-note-block').removeClass('hidden');
}
else {
$('#taskrow_'+id+'>div>.mtt-toggle').attr('src', img.toggle[0]);
$('#taskrow_'+id+'>div>div.task-note-block').addClass('hidden');
}
}
}

View file

@ -1,158 +0,0 @@
<?php
class DatabaseResult_Sqlite
{
private $parent;
private $q;
var $query;
private $rows = NULL;
private $affected = NULL;
function __construct($query, &$h, $resultless = 0)
{
$this->parent = $h;
$this->query = $query;
if($resultless) $this->q = @$this->parent->dbh->queryExec($query, $error);
else $this->q = @$this->parent->dbh->query($query, 0, $error);
if(!$this->q)
{
if($error) throw new Exception($error);
else throw new Exception(sqlite_error_string($this->parent->dbh->lastError()));
}
}
function rows()
{
if (!is_null($this->rows)) return $this->rows;
$this->rows = $this->q->numRows();
return $this->rows;
}
function fetch_row()
{
return $this->q->fetch(SQLITE_NUM);
}
function fetch_assoc()
{
return $this->q->fetch(SQLITE_ASSOC);
}
}
class Database_Sqlite
{
var $dbh;
private $affected = null;
function __construct()
{
}
function connect($filename, $mode=0666)
{
try {
$this->dbh = new SQLiteDatabase($filename, 0666, $error);
}
catch(Exception $e) {
throw new Exception($error);
}
return true;
}
function sq($query, $p = NULL)
{
$q = $this->_dq($query, $p);
if($q->rows()) $res = $q->fetch_row();
else return NULL;
if(sizeof($res) > 1) return $res;
else return $res[0];
}
function sqa($query, $p = NULL)
{
$q = $this->_dq($query, $p);
if($q->rows()) $res = $q->fetch_assoc();
else return NULL;
if(sizeof($res) > 1) return $res;
else return $res[0];
}
function dq($query, $p = NULL)
{
return $this->_dq($query, $p);
}
/*
for resultless queries like INSERT,UPDATE
*/
function ex($query, $p = NULL)
{
return $this->_dq($query, $p, 1);
}
private function _dq($query, $p = NULL, $resultless = 0)
{
if(!isset($p)) $p = array();
elseif(!is_array($p)) $p = array($p);
$m = explode('?', $query);
if(sizeof($p)>0)
{
if(sizeof($m)< sizeof($p)+1) {
throw new Exception("params to set MORE than query params");
}
if(sizeof($m)> sizeof($p)+1) {
throw new Exception("params to set LESS than query params");
}
$query = "";
for($i=0; $i<sizeof($m)-1; $i++) {
$query .= $m[$i]. $this->quote($p[$i]);
}
$query .= $m[$i];
}
return new DatabaseResult_Sqlite($query, $this, $resultless);
}
function affected()
{
if(is_null($this->affected))
{
$this->affected = $this->dbh->changes();
}
return $this->affected;
}
function quote($s)
{
return '\''. sqlite_escape_string($s). '\'';
}
function quoteForLike($format, $s)
{
$s = str_replace(array('\\','%','_'), array('\\\\','\%','\_'), $s);
return $this->quote(sprintf($format, $s));
}
function last_insert_id()
{
return $this->dbh->lastInsertRowid();
}
function table_exists($table)
{
$table = $this->quote($table);
$q = @$this->dbh->query("SELECT 1 FROM $table WHERE 1=0");
if($q === false) return false;
else return true;
}
}
?>

View file

@ -6,9 +6,6 @@ $config = array();
# Uncomment this line if you want to use Mysql, in format: array("host","login","password","database");
#$config['mysql'] = array("localhost","user","password", "mytinytodo");
# To use old SQLite2 (instead of SQLite3) uncomment the line below
#$config['sqlite'] = 2;
# Language pack
$config['lang'] = "en";

BIN
src/images/toggle_minus.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 B

BIN
src/images/toggle_plus.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 B

View file

@ -56,7 +56,7 @@ function __($s)
<script type="text/javascript">
$().ready(function(){
$("#tabs").tabs({ select: tabSelected <?php echo $tabDisabled; ?>});
// $("#tabs").tabs({ select: tabSelected <?php echo $tabDisabled; ?>});
$("#tasklist").sortable({cancel:'span,input,a,textarea', delay: 150, update:orderChanged, start:sortStart, items:'> :not(.task-completed)'});
$("#tasklist").bind("click", tasklistClick);
$("#edittags").autocomplete('ajax.php?suggestTags', {scroll: false, multiple: true, selectFirst:false, max:8});
@ -100,6 +100,10 @@ $().ajaxStop( function(r,s) {$("#loading").fadeOut();} );
<div id="bar">
<div style="float:left"><span id="msg" onClick="toggleMsgDetails()"></span><div id="msgdetails"></div></div>
<div id="bar_auth" align="right">
<a href="#" id="mylists" class="nodecor" onClick="btnMenu(this);return false;"><u>My lists</u> <img src="images/arrdown.gif" border=0></a> |
<a href="settings.php">Settings</a> |
<span id="bar_login"><span id="authstr">&nbsp;</span> <a href="#" class="nodecor" onClick="showAuth(this);return false;"><u><?php __('a_login');?></u> <img src="images/arrdown.gif" border=0></a></span>
<a href="#" id="bar_logout" onClick="logout();return false"><?php __('a_logout');?></a>
</div>
@ -109,23 +113,38 @@ $().ajaxStop( function(r,s) {$("#loading").fadeOut();} );
<div id="page_tasks">
<div id="tabs">
<div id="lists" class="mtt-tabs">
<ul class="">
<li><a href="#newtask"><?php __('tab_newtask');?></a></li>
<li><a href="#searchtask"><?php __('tab_search');?></a></li>
</ul><br clear="all">
<div class="tab-content" id="newtask">
<form onSubmit="return submitNewTask(this)"><input type="text" name="task" value="" maxlength="250" id="task"> <input type="submit" value="<?php __('btn_add');?>"></form>
</div>
<div class="tab-content" id="searchtask">
<form onSubmit="return searchTasks()"><input type="text" name="search" value="" maxlength="250" id="search" onKeyUp="timerSearch()" autocomplete="off"> <input type="submit" value="<?php __('btn_search');?>"></form>
<div id="searchbar"><?php __('searching');?> <span id="searchbarkeyword"></span></div>
<li class="mtt-tabs-selected"><a href="#list1" onClick="mttTabSelected(this,0)">ToDo</a></li>
<li><a href="#list2" onClick="mttTabSelected(this,1)">Todo #2</a></li>
</ul>
<div class="mtt-htabs">
<span id="htab_newtask">
New task
<form onSubmit="return submitNewTask(this)"><input type="text" name="task" value="" maxlength="250" id="task"> <input type="submit" value="<?php __('btn_add');?>"></form>
&nbsp;| <a href="#" onClick="showhide($('#htab_search'),$('#htab_newtask')); return false;">Search</a> </span>
<span id="htab_search" style="display:none">
<a href="#" onClick="showhide($('#htab_newtask'),$('#htab_search')); return false;">New task</a> |&nbsp;
Search
<form onSubmit="return searchTasks()"><input type="text" name="search" value="" maxlength="250" id="search" onKeyUp="timerSearch()" autocomplete="off"> <input type="submit" value="<?php __('btn_search');?>"></form>
<div id="searchbar"><?php __('searching');?> <span id="searchbarkeyword"></span></div>
</span>
</div>
</div>
<h3><span id="taskviewcontainer" onClick="showTaskview(this);"><span class="btnstr"><?php __('tasks');?></span> (<span id="total">0</span>) &nbsp;<img src="images/arrdown.gif"></span>
<span id="sort" onClick="showSort(this);"><span class="btnstr"></span> <img src="images/arrdown.gif"></span>
<span id="tagcloudbtn" onClick="showTagCloud(this);" title="<?php __('tags');?>"><span class="btnstr"><?php __('tags');?></span> <img src="images/arrdown.gif"></span>
<span class="mtt-notes-showhide">Notes: <a href="#" onClick="toggleAllNotes(1);this.blur();return false;">Show</a> / <a href="#" onClick="toggleAllNotes(0);this.blur();return false;">Hide</a></span>
</h3>
<div id="taskcontainer">
@ -183,11 +202,17 @@ $().ajaxStop( function(r,s) {$("#loading").fadeOut();} );
<div id="tagcloudcontent"></div>
</div>
<div id="mylistscontainer" class="mtt-btnmenu-container" style="display:none">
<div class="li" onClick="prompt('New list', 'To-Do')">New list</div>
<div class="li" onClick="prompt('Rename list', 'list name')">Rename</div>
<div class="li" onClick="confirm('This will delete current list with all tasks in it.\nAre you sure?')">Delete</div>
</div>
</div>
<div id="space"></div>
</div>
<div id="footer"><div id="footer_content">Powered by <strong><a href="http://www.pozdeev.com/mytinytodo/">myTinyTodo</a></strong> v1.2.6 </div></div>
<div id="footer"><div id="footer_content">Powered by <strong><a href="http://www.pozdeev.com/mytinytodo/">myTinyTodo</a></strong> v1.3a </div></div>
</div>
</body>

View file

@ -22,13 +22,22 @@ a { color:#0000ff; }
#authform div { padding:2px 0px; }
#authform div.h { font-weight:bold; }
#tabs ul { list-style: none; padding:0; margin:0; }
#tabs ul li { margin:0; font-size: 9pt; font-weight:bold; float: left; width:90px; text-align:center; margin-right: 6px; }
#tabs ul a { margin:0px; text-decoration: none; color:#444444; display: block; height:24px; width: 100%; padding-top: 4px; outline:none; }
#tabs ul li.ui-tabs-selected { background-color: #ededed; }
#tabs ul li.ui-state-hover a { color: #888888; }
/*
.tabs ul { list-style: none; padding:0; margin:0; }
.tabs ul li { margin:0; font-size: 9pt; font-weight:bold; float: left; width:90px; text-align:center; margin-right: 6px; }
.tabs ul a { margin:0px; text-decoration: none; color:#444444; display: block; height:24px; width: 100%; padding-top: 4px; outline:none; }
.tabs ul li.ui-tabs-selected { background-color: #ededed; }
.tabs ul li.ui-state-hover a { color: #888888; }
.ui-tabs .ui-tabs-hide { display: none; }
#tabs ul li.ui-state-disabled a { color: #cccccc; }
.tabs ul li.ui-state-disabled a { color: #cccccc; }
*/
.mtt-tabs ul { list-style: none; padding:0; margin:0; }
.mtt-tabs ul li { margin:0; font-size: 9pt; font-weight:bold; float: left; width:90px; text-align:center; margin-right: 6px; }
.mtt-tabs ul a { margin:0px; text-decoration: none; color:#444444; display: block; height:24px; width: 100%; padding-top: 4px; outline:none; }
.mtt-tabs ul li:hover a { color: #888888; }
.mtt-tabs ul li.mtt-tabs-selected { background-color:#ededed; }
.mtt-htabs { clear:both; background-color:#ededed; padding:8px; border-bottom:2px solid #DEDEDE; }
.tab-content { background-color: #ededed; padding:8px; border-bottom:2px solid #DEDEDE; }
#loading { float:left; padding-top:5px; background-color:#ffffff; display:none; padding-right:6px;}
@ -46,8 +55,11 @@ a { color:#0000ff; }
#sortform .li { margin:1px 0px; padding:2px; cursor:pointer; }
#sortform .li:hover { background-color:#316AC5; color:white; }
.task-left { width:25px; float:left; }
.task-middle { margin-left:25px; margin-right:65px; }
.mtt-notes-showhide { font-size:8pt; font-weight:normal; margin-left:5px; }
.task-left { float:left; }
.task-left .mtt-toggle { cursor:pointer; }
.task-middle { margin-left:40px; margin-right:65px; }
.nobr input { margin-left:0px; margin-right:4px; }
#tasklist { list-style-type: none; margin: 0; padding: 0;}
#tasklist li { padding:6px 2px 6px 6px; border-bottom:1px solid #DEDEDE; min-height:18px; margin-bottom:1px; background-color:#fff; }
@ -82,16 +94,17 @@ div.task-note-area { display:none; margin-bottom:5px; }
div.task-note-area textarea { color:#999999; width:100%; display:block; height:65px; }
.task-note-actions { font-size:8pt; }
.hidden { display:none; }
.invisible { visibility:hidden; }
.in500 { width:500px; color:#444444; }
.in100 { width:100px; color:#444444; }
.task-note span a { color:#777777; }
.task-note span a:hover { color:#af0000; }
.task-prio { padding-left:2px; padding-right:2px; margin-left: 2px; margin-right:3px; cursor:default; }
.task-prio { padding-left:2px; padding-right:2px; margin-left:0px; margin-right:4px; cursor:default; }
.prio-neg { background-color:#3377ff; color:#ffffff; }
.prio-pos { background-color:#ff3030; color:#ffffff; }
.prio-o { background-color:#dedede; }
#tasklist li .prio-o { display:none; }
.task-prio.prio-o { display:none; }
#authstr { display: none; color:#999999; }
#authstr.attention { color:#ff0000; }
@ -152,7 +165,7 @@ div.task-note-area textarea { color:#999999; width:100%; display:block; height:6
.ui-datepicker-title { text-align:center; }
.ui-datepicker-prev, .ui-datepicker-next { cursor:pointer; padding:0px 3px; }
#taskviewcontainer { border-bottom:1px dashed #ccc; padding:1px 2px; }
#taskviewcontainer { border-bottom:1px dashed #ccc; padding:1px 2px; margin-left:4px; }
#taskviewcontainer:hover { cursor:pointer; border-bottom:1px solid #bbb; }
#taskview { overflow: hidden; z-index:103; background-color:#f9f9f9; border:1px solid #cccccc; padding:3px; }
#taskview .li { margin:1px 0px; padding:2px; cursor:pointer; }
@ -164,3 +177,7 @@ div.task-note-area textarea { color:#999999; width:100%; display:block; height:6
.ui-resizable-s { cursor:s-resize; height:7px; width:100%; bottom:-5px; left:0px; }
.ui-resizable-e { cursor:e-resize; width:7px; right:-5px; top:0px; height:100%; }
.ui-resizable-se { cursor:se-resize; width:12px; height:12px; right:1px; bottom:1px; }
.mtt-btnmenu-container { overflow: hidden; z-index:103; background-color:#f9f9f9; border:1px solid #cccccc; padding:3px; }
.mtt-btnmenu-container .li { margin:1px 0px; padding:2px; cursor:pointer; }
.mtt-btnmenu-container .li:hover { background-color:#316AC5; color:white; }