Ext.BLANK_IMAGE_URL = 'images/s.gif'; Task = Ext.data.Record.create([ {name: 'taskId', type:'string'}, {name: 'title', type:'string'}, {name: 'category', type:'string'}, {name: 'description', type:'string'}, {name: 'dueDate', type:'date', dateFormat: 'Y-m-d H:i:s'}, {name: 'completed', type:'boolean'} ]); Task.nextId = function(){ // if the time isn't unique enough, the addition // of random chars should be var t = String(new Date().getTime()).substr(4); var s = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; for(var i = 0; i < 4; i++){ t += s.charAt(Math.floor(Math.random()*26)); } return t; } // The main grid's store TaskStore = function(conn){ TaskStore.superclass.constructor.call(this, { sortInfo:{field: 'dueDate', direction: "ASC"}, groupField:'dueDate', taskFilter: 'all', reader: new Ext.data.JsonReader({ idProperty: 'taskId' }, Task) }); this.proxy = new Ext.data.SqlDB.Proxy(conn, 'task', 'taskId', this); if(window.google){ // google needs the table created this.proxy.on('beforeload', this.prepareTable, conn); } this.addEvents({newcategory: true}); }; Ext.extend(TaskStore, Ext.data.GroupingStore, { applyFilter : function(filter){ if(filter !== undefined){ this.taskFilter = filter; } var value = this.taskFilter; if(value == 'all'){ return this.clearFilter(); } return this.filterBy(function(item){ return item.data.completed === value; }); }, addTask : function(data){ this.suspendEvents(); this.clearFilter(); this.resumeEvents(); this.loadData([data], true); this.suspendEvents(); this.applyFilter(); this.applyGrouping(true); this.resumeEvents(); this.fireEvent('datachanged', this); this.fireEvent('newcategory', data.category); }, prepareTable : function(){ try{ this.createTable({ name: 'task', key: 'taskId', fields: Task.prototype.fields }); }catch(e){console.log(e)} } }); // The store for Categories CategoryStore = function(){ CategoryStore.superclass.constructor.call(this, { expandData: true, data: [], fields:[{name: 'text', type:'string'}], sortInfo:{field:'text', direction:'ASC'}, id: 0 }); } Ext.extend(CategoryStore, Ext.data.ArrayStore, { init : function(store){ var cats = store.collect('category', false, true); this.loadData(cats); }, addCategory : function(cat){ if(cat && this.indexOfId(cat) === -1){ this.clearFilter(true); this.loadData([cat], true); this.applySort(); } } }); // Grid column plugin that does the complete/active button in the left-most column CompleteColumn = function(){ var grid; function getRecord(t){ var index = grid.getView().findRowIndex(t); return grid.store.getAt(index); } function onMouseDown(e, t){ if(Ext.fly(t).hasClass('task-check')){ e.stopEvent(); var record = getRecord(t); record.set('completed', !record.data.completed); grid.store.applyFilter(); } } function onMouseOver(e, t){ if(Ext.fly(t).hasClass('task-check')){ Ext.fly(t.parentNode).addClass('task-check-over'); } } function onMouseOut(e, t){ if(Ext.fly(t).hasClass('task-check')){ Ext.fly(t.parentNode).removeClass('task-check-over'); } } Ext.apply(this, { width: 22, header: '', menuDisabled:true, fixed: true, id: 'task-col', renderer: function(){ return ''; }, init : function(xg){ grid = xg; grid.on('render', function(){ var view = grid.getView(); view.mainBody.on('mousedown', onMouseDown); view.mainBody.on('mouseover', onMouseOver); view.mainBody.on('mouseout', onMouseOut); }); } }); };