Subversion Repositories eFlore/Applications.cel

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

/*
 * Ext JS Library 0.20
 * Copyright(c) 2006-2008, Ext JS, LLC.
 * licensing@extjs.com
 * 
 * http://extjs.com/license
 */

TaskGrid = function(){
        
        // custom columns
        var completeColumn = new CompleteColumn();
        var reminderColumn = new ReminderColumn();
        
        TaskGrid.superclass.constructor.call(this, {
                id:'tasks-grid',
        store: tx.data.tasks,
        sm: new Ext.grid.RowSelectionModel({moveEditorOnEnter: false}),
        clicksToEdit: 'auto',
        enableColumnHide:false,
        enableColumnMove:false,
                autoEncode: true,
        title:'All Tasks',
        iconCls:'icon-folder',
        region:'center',
        plugins: [completeColumn, reminderColumn],
                margins:'3 3 3 0',
        columns: [
            completeColumn,
            {
                header: "Task",
                width:400,
                sortable: true,
                dataIndex: 'title',
                id:'task-title',
                editor: new Ext.form.TextField({
                    allowBlank: false
                })
            },
            {
                header: "List",
                width:150,
                sortable: true,
                dataIndex: 'listId',
                editor: new ListSelector({
                                store:tx.data.lists
                            }),
                                renderer : function(v){
                                        return tx.data.lists.getName(v);
                                }
            },
            {
                                id:'dueDate',
                header: "Due Date",
                width: 150,
                sortable: true,
                renderer: Ext.util.Format.dateRenderer('D m/d/Y'),
                dataIndex: 'dueDate',
                groupRenderer: Ext.util.Format.createTextDateRenderer(),
                groupName: 'Due',
                editor: new Ext.form.DateField({
                    format : "m/d/Y"
                })
            },
                        reminderColumn
        ],

        view: new TaskView()
        });
        
        // Keep the visible date groups in the grid accurate
        Ext.TaskMgr.start({
                run: function(){
                        var col = this.getColumnModel().getColumnById('dueDate');
                        if(col.groupRenderer.date.getTime() != new Date().clearTime().getTime()){
                                col.groupRenderer = Ext.util.Format.createTextDateRenderer();
                                tx.data.tasks.applyGrouping();
                        }
                },
                interval: 60000,
                scope: this
        });
        
        this.on('rowcontextmenu', this.onRowContext, this);
};

Ext.extend(TaskGrid, Ext.grid.EditorGridPanel, {
        onCellDblClick: function(g, row){
                clearTimeout(this.autoEditTimer); // allow dbl click without starting edit
                var id = this.store.getAt(row).id;
                
                Ext.air.NativeWindowManager.getTaskWindow(id);
        },

    // private
    onAutoEditClick : function(e, t){
                clearTimeout(this.autoEditTimer);
        if(e.button !== 0){
            return;
        }
        var row = this.view.findRowIndex(t);
        var col = this.view.findCellIndex(t);
        if(row !== false && col !== false){
                if(this.selModel.isSelected(row) && this.selModel.getCount() === 1){
                                this.autoEditTimer = this.startEditing.defer(300, this, [row, col]);
            }
        }
    },
        
        onRowContext : function(grid, row, e){
        if(!this.menu){ // create context menu on first right click
            this.menu = new Ext.menu.Menu({
                id:'tasks-ctx',
                                listWidth: 200,
                items: [{
                    text:'Open',
                    scope: this,
                    handler:function(){
                                                Ext.each(this.selModel.getSelections(), function(r){
                                                        Ext.air.NativeWindowManager.getTaskWindow(r.id);
                                                });
                    }
                },'-',
                                        tx.actions.complete,
                                        tx.actions.deleteTask
                ]
            });
        }
                if(!this.selModel.isSelected(row)){
                        this.selModel.selectRow(row);
                }
                
                this.menu.showAt(e.getXY());
    }
})


TaskView = Ext.extend(Ext.grid.GroupingView, {
        forceFit:true,
    ignoreAdd: true,
    emptyText: 'There are no tasks to show in this list.',

    templates: {
        header: Templates.gridHeader
    },
    getRowClass : function(r){
        var d = r.data;
        if(d.completed){
            return 'task-completed';
        }
        if(d.dueDate && d.dueDate.getTime() < new Date().clearTime().getTime()){
            return 'task-overdue';
        }
        return '';
    }
});


TaskHeader = function(grid){
        grid.on('resize', syncFields);
        grid.on('columnresize', syncFields);
                
    // The fields in the grid's header
    var ntTitle = this.ntTitle = new Ext.form.TextField({
        renderTo: 'new-task-title',
        emptyText: 'Add a task...'
    });

    var ntCat = new ListSelector({
        renderTo: 'new-task-cat',
        disabled:true,
        store:tx.data.lists,
                listenForLoad: true
    });

    var ntDue = new Ext.form.DateField({
        renderTo: 'new-task-due',
        value: new Date(),
        disabled:true,
        format : "m/d/Y"
    });

    // syncs the header fields' widths with the grid column widths
    function syncFields(){
        var cm = grid.getColumnModel();
        ntTitle.setSize(cm.getColumnWidth(1)-2);
        ntCat.setSize(cm.getColumnWidth(2)-4);
        ntDue.setSize(cm.getColumnWidth(3)-4);
    }
    syncFields();

    var editing = false, focused = false, userTriggered = false;
    var handlers = {
        focus: function(){
            setFocus.defer(20, window, [true]);
        },
        blur: function(){
            focused = false;
            doBlur.defer(250);
        },
        specialkey: function(f, e){
            if(e.getKey()==e.ENTER && (!f.isExpanded || !f.isExpanded())){
                userTriggered = true;
                e.stopEvent();
                f.el.blur();
                if(f.triggerBlur){
                    f.triggerBlur();
                }
            }
        }
    }
    ntTitle.on(handlers);
    ntCat.on(handlers);
    ntDue.on(handlers);

    ntTitle.on('focus', function(){
        focused = true;
        if(!editing){
            ntCat.enable();
            ntDue.enable();
            syncFields();
            editing = true;
                        
                        ntCat.setValue(tx.data.getActiveListId());
        }
    });

    function setFocus(v){
                focused = v;
        }
    // when a field in the add bar is blurred, this determines
    // whether a new task should be created
    function doBlur(){
        if(editing && !focused){
                        var title = ntTitle.getValue();
            if(!Ext.isEmpty(title)){
                                tx.data.tasks.createTask(title, ntCat.getRawValue(), ntDue.getValue());
                ntTitle.setValue('');
                if(userTriggered){ // if they entered to add the task, then go to a new add automatically
                    userTriggered = false;
                    ntTitle.focus.defer(100, ntTitle);
                }
            }
            ntCat.disable();
            ntDue.disable();
            editing = false;
        }
    }
};