BZtodo

From Wiki2

running on http://cascada.sitebuilt.net/BZtodo/client/

by Timothy S. McKenna
mckenna.tim@gmail.com
(857)498-2574
http://mckennatim.github.io/mckennatim/
https://github.com/mckennatim/BZtodo

main.js

<source lang="javascript"> /*----------------------------Events-------------------------*/

$( document ).ready(function() {

 model.loadList();
 $('form').submit(function(){
   ctrl.add2list(); 
 });
 $('input[type="checkbox"]').live('click',function(){
   ctrl.updDone($(this));
 }) 
 $('.priority').live('change', function(){
   ctrl.updPriority($(this));
 }) 
 $('a').live('click', function(){
   ctrl.deleteItem($(this));
 })
 $('#sortDoneBut').click(function(){
   ctrl.sortOnDone();
 })
 $('#sortPriorBut').click(function(){
   ctrl.sortOnPriority();
 })

});

/*----------------------------Model-------------------------*/

var model = {

 list: {BZtodo:[]},
 priority: ['high', 'normal', 'low'],
 defaultPriority: 'normal',
 urlqstr: 'list=BZtodo',
 defaultPriorityIdx: 1, 
 saveList: function(){
   var listJ=JSON.stringify(this.list);
   localStorage.setItem('BZtodo', listJ);
   itemsJ = JSON.stringify(this.list.BZtodo)
   $.post("../server/post.php?"+this.urlqstr, {data: itemsJ}).done(function(data){});     
 },
 loadList: function(){
   $.get('../server/get.php', this.urlqstr, function(dataJ) {
     if (!(dataJ==false)){
       var data =JSON.parse(dataJ);
       var items = JSON.parse(data.items);
       model.list.BZtodo = items;
       view.refreshList(model.list.BZtodo);
       localStorage.setItem('BZtodo',JSON.stringify(model.list));           
     }
   }); 
 } 

}

/*----------------------------Controller-------------------------*/

var ctrl ={

 add2list:function(item){
   event.preventDefault();
   console.log($('#inpTxt').val())
   var newItem = $('input').val();
   if(newItem.length>1){  
     var itemObject ={
       item: newItem,
       done: false,
       priority: model.defaultPriorityIdx
     }
     view.appendLi(itemObject);
     model.list.BZtodo.push(itemObject);
     model.saveList();
   }
   $('#inpTxt').val();
 },
 updDone: function(el){
   var done;
   if(el.prop('checked')){
     done=true;
   }else{
     done=false
   }
   model.list.BZtodo[el.parent().index()].done=done;
   model.saveList();
 },
 updPriority: function(el){
   model.list.BZtodo[el.parent().parent().index()].priority=el.val()*1;
   model.saveList();
 },
 deleteItem: function(el){
   event.preventDefault();
   var idx = el.parent().parent().index();
   if (idx > -1) {
     model.list.BZtodo.splice(idx, 1);
   }
   view.refreshList(model.list.BZtodo);
   model.saveList();    
 },
 sortOnDone: function(){
   event.preventDefault();
   model.list.BZtodo.sort(function(a,b){
     return a.done-b.done
   })
   view.refreshList(model.list.BZtodo);
   model.saveList();
 },
 sortOnPriority: function(){
   event.preventDefault();
   model.list.BZtodo.sort(function(a,b){
     return a.priority-b.priority
   })
   view.refreshList(model.list.BZtodo);
   model.saveList();    
 }

}

/*----------------------------View-------------------------*/

var view ={

 appendLi: function(itemObj){
   var item = itemObj.item;
   var priority = itemObj.priority;
   var checked=;
   if(itemObj.done){checked='checked="checked"'}

$('ul').append('

  • ' +'<input type="checkbox"'+checked+'/>' +' '+ item +'' +'' + this.priorityOptions(priority) +'<a href="">' +'' +'</a>' +'
  • '); }, refreshList: function(list){ $('ul').empty(); $.each(list, function(index, itemObj) { view.appendLi(itemObj); }); }, priorityOptions: function(pridx){ var ostr= '<select class="priority">'; $.each(model.priority, function(index, opt){ if(index==pridx){ ostr+= '<option value='+index+' selected="selected">'+opt+'</option>'; }else{ ostr+= '<option value='+index+'>'+opt+'</option>'; } }) ostr+='</select>'; return ostr; } } </source>

    index.html

    <source lang="html5"> <!DOCTYPE html> BZtodo

    </source>

    post.php

    <source lang="php"> <?php include('/usr/local/lib/tm/ChromePhp.php'); include '/usr/local/lib/tm/db.php'; $list=$_GET['list']; if(isset($_POST['data'])){

     $blob=$_POST['data'];
     ChromePhp::log($blob);
    

    }else{

     $blob='a blob';
    

    }

    ChromePhp::log($list);

    $db = new Db('test');

    $dbh = new PDO("mysql:host=$db->host; dbname=$db->database",$db->user, $db->pass); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    try {

     $dsql = "DELETE FROM `todos` WHERE `list`= ?";
     $stmt = $dbh->prepare($dsql);
     $stmt->execute(array($list));
    

    } catch(PDOException $e) {

         echo '{"error":{"text":'. $e->getMessage() .$dsql.'}}'; 
    

    }

    try {

     $sql = "INSERT INTO `todos` (`list`, `items`) VALUES (?, ?)";
     $stmt = $dbh->prepare($sql);
     $stmt->execute(array($list, $blob));
    

    } catch(PDOException $e) {

         echo '{"error":{"text":'. $e->getMessage() .$sql.'}}'; 
    

    } ?> </source>

    get.php

    <source lang="php"> <?php include('/usr/local/lib/tm/ChromePhp.php'); include '/usr/local/lib/tm/db.php'; $list=mysql_real_escape_string($_GET['list']); ChromePhp::log($list);

    $db= new Db('test');

    try {

     $dbh  = new PDO("mysql:host=$db->host; dbname=$db->database",$db->user, $db->pass);
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     $sql  = 'SELECT `items` FROM `todos` WHERE list=?';
     $stmt = $dbh->prepare($sql);
     $stmt->execute(array($list));
     $result = $stmt->fetch(PDO::FETCH_OBJ);
     //print_r($result);
    

    } catch(PDOException $e) { echo '{"error":{"text":'. $e->getMessage() .$sql.'}}'; }

    $retJSON= json_encode($result); echo $retJSON; ?> </source>