Index: trunk/application.properties
===================================================================
--- trunk/application.properties	(revision 164)
+++ trunk/application.properties	(revision 165)
@@ -1,4 +1,5 @@
 #utf-8
-#Mon Oct 12 09:03:21 EST 2009
+#Fri Oct 23 11:43:54 EST 2009
+plugins.export=0.4
 plugins.acegi=0.5.1
 plugins.navigation=1.1
Index: trunk/grails-app/conf/Config.groovy
===================================================================
--- trunk/grails-app/conf/Config.groovy	(revision 164)
+++ trunk/grails-app/conf/Config.groovy	(revision 165)
@@ -19,4 +19,8 @@
                       css: 'text/css',
                       csv: 'text/csv',
+                      pdf: 'application/pdf',
+                      rtf: 'application/rtf',
+                      excel: 'application/vnd.ms-excel',
+                      ods: 'application/vnd.oasis.opendocument.spreadsheet',
                       all: '*/*',
                       json: ['application/json','text/json'],
Index: trunk/grails-app/controllers/TaskDetailedController.groovy
===================================================================
--- trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 164)
+++ trunk/grails-app/controllers/TaskDetailedController.groovy	(revision 165)
@@ -1,3 +1,4 @@
 import org.codehaus.groovy.grails.plugins.springsecurity.Secured
+import org.codehaus.groovy.grails.commons.ConfigurationHolder
 
 class TaskDetailedController extends BaseController {
@@ -7,4 +8,5 @@
     def taskSearchService
     def filterService
+    def exportService
 
     // the delete, save and update actions only accept POST requests
@@ -102,4 +104,48 @@
         return[ taskInstanceList: filterService.filter( params, Task ),
             taskInstanceTotal: taskInstanceTotal,
+            filterParams: com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
+            params:params ]
+    }
+
+    def budget = {
+//         println params
+        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100 )
+
+        // Quick Search:
+        if(!params.filter)
+        {
+            def taskInstanceList = []
+            def personInstance = Person.get(authenticateService.userDomain().id)
+
+            if(params.quickSearch == "budgetUnplanned") {
+                taskInstanceList = taskSearchService.getBudgetUnplanned(params)
+                if(taskInstanceList.totalCount > 0) { params.message = "Budget unplanned tasks in the last week." }
+                else { params.message = "No tasks found." }
+            }
+            //else if(params.quickSearch == "budgetPlanned") {
+            else {
+                //Default:
+                taskInstanceList = taskSearchService.getBudgetPlanned(params)
+                if(taskInstanceList.totalCount > 0) { params.message = "Budget planned Tasks in the last week." }
+                else { params.message = "No tasks found.." }
+            }
+            // export plugin:
+            if(params?.format && params.format != "html") {
+                response.contentType = ConfigurationHolder.config.grails.mime.types[params.format]
+                response.setHeader("Content-disposition", "attachment; filename=tasks.${params.extension}")
+                List fields = ["id", "targetStartDate", "description", "leadPerson", "taskStatus", "taskType"]
+                Map labels = ["id": "ID", "targetStartDate": "Target Start Date", "description": "Description",
+                                        "leadPerson": "Lead Person", "taskStatus": "Task Status", "taskType": "Task Type"]
+                Map formatters = [:]
+                String title = "${params.quickSearch} tasks in the last week."
+                Map parameters = [title: title]
+
+                exportService.export(params.format, response.outputStream, taskInstanceList, fields, labels, formatters, parameters) 
+            }
+            return[taskInstanceList: taskInstanceList, taskInstanceTotal: taskInstanceList.totalCount, filterParams: params]
+        }
+        // filterPane:
+        return[ taskInstanceList: filterService.filter( params, Task ),
+            taskInstanceTotal: filterService.count( params, Task ),
             filterParams: com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
             params:params ]
Index: trunk/grails-app/services/TaskSearchService.groovy
===================================================================
--- trunk/grails-app/services/TaskSearchService.groovy	(revision 164)
+++ trunk/grails-app/services/TaskSearchService.groovy	(revision 165)
@@ -76,3 +76,39 @@
             }
     }
+
+    def getBudgetPlanned(params) {
+        params.max = Math.min(params?.max?.toInteger() ?: 10, 100)
+        params.offset = params?.offset?.toInteger() ?: 0
+        params.sort = params?.sort ?: "id"
+        params.order = params?.order ?: "desc"
+
+        def taskInstanceList = Task.createCriteria().list(
+            max: params.max,
+            offset: params.offset,
+            sort: params.sort,
+            order: params.order) {
+                ne("taskType", TaskType.findByName("Unscheduled Breakin"))
+                ge("targetStartDate", dateUtilService.getToday()-7)
+                lt("targetStartDate", dateUtilService.getTomorrow())
+                eq("isActive", true)
+            }
+    }
+
+    def getBudgetUnplanned(params) {
+        params.max = Math.min(params?.max?.toInteger() ?: 10, 100)
+        params.offset = params?.offset?.toInteger() ?: 0
+        params.sort = params?.sort ?: "id"
+        params.order = params?.order ?: "desc"
+
+        def taskInstanceList = Task.createCriteria().list(
+            max: params.max,
+            offset: params.offset,
+            sort: params.sort,
+            order: params.order) {
+                eq("taskType", TaskType.findByName("Unscheduled Breakin"))
+                ge("targetStartDate", dateUtilService.getToday()-7)
+                lt("targetStartDate", dateUtilService.getTomorrow())
+                eq("isActive", true)
+            }
+    }
 }
Index: trunk/grails-app/views/appCore/manager.gsp
===================================================================
--- trunk/grails-app/views/appCore/manager.gsp	(revision 164)
+++ trunk/grails-app/views/appCore/manager.gsp	(revision 165)
@@ -29,4 +29,23 @@
                         <tr class="prop">
                             <td valign="top" class="name">
+                                <label>Budget:</label>
+                            </td>
+                            <td valign="top" class="value">
+                                <g:link controller="taskDetailed"
+                                                action="budget"
+                                                params="[quickSearch: 'budgetPlanned']">
+                                                Planned Tasks
+                                </g:link>
+                                <br />
+                                <g:link controller="taskDetailed" 
+                                                action="budget"
+                                                params="[quickSearch: 'budgetUnplanned']">
+                                                Unplanned Tasks
+                                </g:link>
+                            </td>
+                        </tr>
+
+                        <tr class="prop">
+                            <td valign="top" class="name">
                                 <label>Entity Relationship Diagram:</label>
                             </td>
Index: trunk/grails-app/views/taskDetailed/budget.gsp
===================================================================
--- trunk/grails-app/views/taskDetailed/budget.gsp	(revision 165)
+++ trunk/grails-app/views/taskDetailed/budget.gsp	(revision 165)
@@ -0,0 +1,130 @@
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+        <meta name="layout" content="main" />
+        <title>Task Search</title>
+        <g:javascript src="overlayPane.js" />
+        <nav:resources override="true"/>
+        <export:resource />
+    </head>
+    <body>
+        <div class="nav">
+            <nav:renderSubItems group="nav"/>
+        </div>
+
+        <div class="body">
+            <g:if test="${flash.message}">
+                <div class="message">${flash.message}</div>
+            </g:if>
+            <g:if test="${params.message}">
+                <div class="message">${params.message}</div>
+            </g:if>
+            <g:hasErrors bean="${appCore}">
+                <div class="errors">
+                    <g:renderErrors bean="${appCore}" as="list" />
+                </div>
+            </g:hasErrors>
+
+            <div class="paginateButtons">
+                <a href='' onclick="showElement('searchPane'); return false;">Quick</a>
+                Results:${taskInstanceTotal}
+            </div>
+
+            <div class="list">
+                <table>
+                    <thead>
+                        <tr>
+
+                            <g:sortableColumn property="id" title="Id" params="${filterParams}" />
+
+                            <g:sortableColumn property="targetStartDate" title="Target Start Date" params="${filterParams}" />
+
+                            <g:sortableColumn property="description" title="Description" params="${filterParams}" />
+
+                            <g:sortableColumn  property="leadPerson" title="Lead Person" params="${filterParams}" />
+
+                            <g:sortableColumn  property="taskPriority" title="Task Priority" params="${filterParams}" />
+
+                            <g:sortableColumn  property="taskStatus" title="Task Status" params="${filterParams}" />
+
+                            <th></th>
+
+                        </tr>
+                    </thead>
+                    <tbody>
+                    <g:each in="${taskInstanceList}" status="i" var="taskInstance">
+                    <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/taskDetailed/show/${taskInstance.id}"'/>
+
+                            <td>${fieldValue(bean:taskInstance, field:'id')}</td>
+
+                            <td><g:formatDate date="${taskInstance.targetStartDate}" format="EEE, dd-MMM-yyyy"/></td>
+
+                            <td>${fieldValue(bean:taskInstance, field:'description')}</td>
+
+                            <td>${fieldValue(bean:taskInstance, field:'leadPerson')}</td>
+
+                            <td>${fieldValue(bean:taskInstance, field:'taskPriority')}</td>
+
+                            <td>${fieldValue(bean:taskInstance, field:'taskStatus')}</td>
+
+                            <td>
+                                <g:link action="show" id="${taskInstance.id}">
+                                    <img  src="${resource(dir:'images/skin',file:'database_go.png')}" alt="Show" />
+                                </g:link>
+                            </td>
+
+                        </tr>
+                    </g:each>
+                    </tbody>
+                </table>
+            </div>
+            <div class="paginateButtons">
+                <g:paginate total="${taskInstanceTotal}" params="${filterParams}" />
+            </div>
+            <export:formats  params="${filterParams}" formats="['csv', 'excel', 'pdf', 'rtf']"/>
+        </div> <!-- end body  -->
+
+        <!-- Start Search Pane -->
+        <div class="overlayPane" id="searchPane" style="display:none;">
+            <h2>Quick Search</h2>
+            <g:form method="post" id="searchForm" name="searchForm" >
+                <table>
+                    <tbody>
+
+                        <tr class="prop">
+                            <td valign="top" class="name">
+                                <label>Budget:</label>
+                            </td>
+                            <td valign="top" class="value">
+                                <g:link controller="taskDetailed"
+                                                action="budget"
+                                                params="[quickSearch: 'budgetPlanned']">
+                                                Planned Tasks
+                                </g:link>
+                                <br />
+                                <g:link controller="taskDetailed" 
+                                                action="budget"
+                                                params="[quickSearch: 'budgetUnplanned']">
+                                                Unplanned Tasks
+                                </g:link>
+                            </td>
+                        </tr>
+
+                    </tbody>
+                </table>
+                <div class="buttons">
+                    <span class="button">
+                        <input type="button" value="${g.message(code:'fp.tag.filterPane.button.cancel.text', default:'Cancel')}" onclick="return hideElement('searchPane');" />
+                    </span>
+<!--                    <span class="button">
+                        <input type="button" value="${g.message(code:'fp.tag.filterPane.button.clear.text', default:'Clear')}" onclick="return clearFilterPane('searchForm');" />
+                    </span>
+                    <span class="button">
+                        <g:actionSubmit class="search" value="Search" />
+                    </span>-->
+                </div>
+            </g:form>
+        </div> <!-- end search pane -->
+
+    </body>
+</html>
