Index: /trunk/grails-app/controllers/AssignedPersonDetailedController.groovy
===================================================================
--- /trunk/grails-app/controllers/AssignedPersonDetailedController.groovy	(revision 254)
+++ /trunk/grails-app/controllers/AssignedPersonDetailedController.groovy	(revision 255)
@@ -12,29 +12,4 @@
     // the delete, save and update actions only accept POST requests
     static allowedMethods = [delete:'POST', save:'POST', update:'POST']
-
-    def list = {
-            def result = assignedPersonService.list(params)
-            if(!result.error) {
-                return [ assignedPersonInstanceList: result.assignedPersonInstanceList,
-                                assignedPersonInstanceTotal: result.assignedPersonInstanceTotal ]
-            }
-
-            flash.message = g.message(code: result.error.code, args: result.error.args)
-            redirect( controller: "appCore", action: "start" )
-    }
-
-    def show = {
-        def result = assignedPersonService.show(params)
-
-        if(!result.error)
-            return [ assignedPersonInstance: result.assignedPersonInstance ]
-
-        flash.message = g.message(code: result.error.code, args: result.error.args)
-
-        if(params.task?.id)
-            redirect(controller:"taskDetailed", action:"show", id: params.task.id)
-
-        redirect(controller:"taskDetailed", action:"search")
-    }
 
     def delete = {
@@ -60,6 +35,9 @@
         def result = assignedPersonService.edit(params)
 
-        if(!result.error)
-            return [ assignedPersonInstance : result.assignedPersonInstance ]
+        if(!result.error) {
+            return [assignedPersonInstance: result.assignedPersonInstance,
+                            person: result.person,
+                            groupsForPerson: result.groupsForPerson]
+        }
 
         flash.message = g.message(code: result.error.code, args: result.error.args)
@@ -74,5 +52,5 @@
         if(!result.error) {
             flash.message = g.message(code: "default.update.success", args: ["AssignedPerson", params.id])
-            redirect(action:show, id: params.id)
+            redirect(controller:"taskDetailed", action:"show", id: result.assignedPersonInstance.task.id)
             return
         }
@@ -84,5 +62,13 @@
         }
 
-        render(view:'edit', model:[assignedPersonInstance: result.assignedPersonInstance.attach()])
+        if(result.error.code == "person.not.found") {
+            flash.message = g.message(code: result.error.code, args: result.error.args)
+            redirect(action:"edit", id: params.id)
+            return
+        }
+
+        render(view:'edit', model:[assignedPersonInstance: result.assignedPersonInstance.attach(),
+                                                person: result.person.attach(),
+                                                groupsForPerson: result.groupsForPerson])
     }
 
@@ -90,6 +76,9 @@
         def result = assignedPersonService.create(params)
 
-        if(!result.error)
-            return [assignedPersonInstance: result.assignedPersonInstance]
+        if(!result.error) {
+            return [assignedPersonInstance: result.assignedPersonInstance,
+                            person: result.person,
+                            groupsForPerson: result.groupsForPerson]
+        }
 
         if(result.error.code == "assignedPerson.task.not.found") {
@@ -112,5 +101,28 @@
         }
 
-        render(view:'edit', model:[assignedPersonInstance: result.assignedPersonInstance])
+        if(result.error.code == "person.not.found") {
+            flash.message = g.message(code: result.error.code, args: result.error.args)
+            redirect(action:"create", params:["task.id": params.task?.id])
+            return
+        }
+
+        render(view:'create', model:[assignedPersonInstance: result.assignedPersonInstance,
+                                                person: result.person.attach(),
+                                                groupsForPerson: result.groupsForPerson])
+    }
+
+    def groupsForPerson = {
+        def result = assignedPersonService.groupsForPerson(params)
+
+        if(!result.error) {
+            render ( template:"groupsForPerson",
+                            model: [person: result.person, groupsForPerson: result.groupsForPerson] )
+            return
+        }
+
+        render {
+            div(id:"groupsForPerson", g.message(code: result.error.code, args: result.error.args) )
+        }
+
     }
 
Index: /trunk/grails-app/i18n/messages.properties
===================================================================
--- /trunk/grails-app/i18n/messages.properties	(revision 254)
+++ /trunk/grails-app/i18n/messages.properties	(revision 255)
@@ -53,4 +53,5 @@
 taskRecurringSchedule.notFound=Could not complete operation, recurring schedule not found.
 personGroup.not.found=Person Group not found, it may have been deleted.
+person.not.found=Person record not found, it may have been deleted.
 
 task.assignedGroups=Assigned Groups
Index: /trunk/grails-app/services/AssignedPersonService.groovy
===================================================================
--- /trunk/grails-app/services/AssignedPersonService.groovy	(revision 254)
+++ /trunk/grails-app/services/AssignedPersonService.groovy	(revision 255)
@@ -4,38 +4,4 @@
 
     def personService
-
-    def list(params) {
-        def result = [:]
-        def fail = { Map m ->
-            result.error = [ code: m.code, args: ["AssignedPerson"] ]
-            return result
-        }
-
-        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
-        result.assignedPersonInstanceList = AssignedPerson.list(params)
-        result.assignedPersonInstanceTotal = AssignedPerson.count()
-
-        if(!result.assignedPersonInstanceList || !result.assignedPersonInstanceTotal)
-            return fail(code:"default.list.failure")
-
-        // Success.
-        return result
-    }
-
-    def show(params) {
-        def result = [:]
-        def fail = { Map m ->
-            result.error = [ code: m.code, args: ["AssignedPerson", params.id] ]
-            return result
-        }
-
-        result.assignedPersonInstance = AssignedPerson.get(params.id)
-
-        if(!result.assignedPersonInstance)
-            return fail(code:"default.not.found")
-
-        // Success.
-        return result
-    }
 
     def delete(params) {
@@ -86,4 +52,7 @@
             return fail(code:"default.not.found")
 
+        result.person = result.assignedPersonInstance.person
+        result.groupsForPerson = result.person.personGroups.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) }
+
         // Success.
         return result
@@ -101,4 +70,12 @@
                 return result
             }
+
+            result.person = Person.get(params.person.id)
+
+            // Prevent a null property reference.
+            if(!result.person)
+                return fail(code:"person.not.found")
+
+            result.groupsForPerson = result.person.personGroups.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) }
 
             result.assignedPersonInstance = AssignedPerson.get(params.id)
@@ -144,5 +121,8 @@
         result.assignedPersonInstance.properties = params
 
-        // success
+        result.person = Person.list().sort { p1, p2 -> p1.firstName.compareToIgnoreCase(p2.firstName) }[0] // Get the first result.
+        result.groupsForPerson = result.person.personGroups.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) }
+
+        // Success.
         return result
     }
@@ -153,4 +133,5 @@
 
             def fail = { Map m ->
+                status.setRollbackOnly()
                 if(result.assignedPersonInstance && m.field)
                     result.assignedPersonInstance.errors.rejectValue(m.field, m.code)
@@ -159,5 +140,14 @@
             }
 
-            result.assignedPersonInstance = new AssignedPerson(params)
+            result.person = Person.get(params.person.id)
+
+            // Prevent a null property reference.
+            if(!result.person)
+                return fail(code:"person.not.found")
+
+            result.groupsForPerson = result.person.personGroups.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) }
+
+            result.assignedPersonInstance = new AssignedPerson()
+            result.assignedPersonInstance.properties = params
 
             if(result.assignedPersonInstance.hasErrors() || !result.assignedPersonInstance.save())
@@ -180,3 +170,22 @@
     } // end save()
 
+    def groupsForPerson(params) {
+        def result = [:]
+
+        def fail = { Map m ->
+            result.error = [ code: m.code, args: ["Person", params.person?.id] ]
+            return result
+        }
+
+        result.person = Person.get(params.person?.id)
+
+        if(!result.person)
+            return fail(code:"default.not.found")
+
+        result.groupsForPerson = result.person.personGroups.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) }
+
+        // Success.
+        return result
+    }
+
 } // end class
Index: /trunk/grails-app/views/assignedPersonDetailed/_groupsForPerson.gsp
===================================================================
--- /trunk/grails-app/views/assignedPersonDetailed/_groupsForPerson.gsp	(revision 255)
+++ /trunk/grails-app/views/assignedPersonDetailed/_groupsForPerson.gsp	(revision 255)
@@ -0,0 +1,22 @@
+
+<table>
+    <tbody>
+        <tr class="prop">
+            <td valign="top" class="name">
+                <label for="groups">Groups for person (${person.encodeAsHTML()}):</label>
+            </td>
+            <td valign="top" class="value">
+                <ul>
+                    <g:if test="${groupsForPerson.size() > 0}">
+                        <g:each var="a" in="${groupsForPerson}">
+                            <li>${a?.encodeAsHTML()}</li>
+                        </g:each>
+                    </g:if>
+                    <g:else>
+                        <li>None</li>
+                    </g:else>
+                </ul>
+            </td>
+        </tr>
+    </tbody>
+</table>
Index: /trunk/grails-app/views/assignedPersonDetailed/create.gsp
===================================================================
--- /trunk/grails-app/views/assignedPersonDetailed/create.gsp	(revision 254)
+++ /trunk/grails-app/views/assignedPersonDetailed/create.gsp	(revision 255)
@@ -5,5 +5,5 @@
         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
         <meta name="layout" content="main" />
-        <title>Create AssignedPerson</title>         
+        <title>Create AssignedPerson</title>
     </head>
     <body>
@@ -42,7 +42,12 @@
                                 </td>
                                 <td valign="top" class="value ${hasErrors(bean:assignedPersonInstance,field:'person','errors')}">
-                                    <g:select optionKey="id" from="${Person.list()}" name="person.id" value="${assignedPersonInstance?.person?.id}" ></g:select>
+                                    <g:select optionKey="id"
+                                                        from="${Person.list().sort { p1, p2 -> p1.firstName.compareToIgnoreCase(p2.firstName) }}"
+                                                        name="person.id"
+                                                        value="${assignedPersonInstance?.person?.id}"
+                                                        onchange="${remoteFunction(action:'groupsForPerson', update:'groupsForPerson', params: '\'person.id=\' + this.value' )}">
+                                    </g:select>
                                 </td>
-                            </tr> 
+                            </tr>
                         
                             <tr class="prop">
@@ -70,4 +75,11 @@
                 </div>
             </g:form>
+
+            <br />
+
+            <div id="groupsForPerson" class="dialog">
+                <g:render template="groupsForPerson" />
+            </div>
+
         </div>
     </body>
Index: /trunk/grails-app/views/assignedPersonDetailed/edit.gsp
===================================================================
--- /trunk/grails-app/views/assignedPersonDetailed/edit.gsp	(revision 254)
+++ /trunk/grails-app/views/assignedPersonDetailed/edit.gsp	(revision 255)
@@ -44,5 +44,10 @@
                                 </td>
                                 <td valign="top" class="value ${hasErrors(bean:assignedPersonInstance,field:'person','errors')}">
-                                    <g:select optionKey="id" from="${Person.list()}" name="person.id" value="${assignedPersonInstance?.person?.id}" ></g:select>
+                                    <g:select optionKey="id"
+                                                        from="${Person.list().sort { p1, p2 -> p1.firstName.compareToIgnoreCase(p2.firstName) }}"
+                                                        name="person.id"
+                                                        value="${assignedPersonInstance?.person?.id}"
+                                                        onchange="${remoteFunction(action:'groupsForPerson', update:'groupsForPerson', params: '\'person.id=\' + this.value' )}">
+                                    </g:select>
                                 </td>
                             </tr>
@@ -72,4 +77,11 @@
                 </div>
             </g:form>
+
+            <br />
+
+            <div id="groupsForPerson" class="dialog">
+                <g:render template="groupsForPerson" />
+            </div>
+
         </div>
     </body>
Index: unk/grails-app/views/assignedPersonDetailed/list.gsp
===================================================================
--- /trunk/grails-app/views/assignedPersonDetailed/list.gsp	(revision 254)
+++ 	(revision )
@@ -1,58 +1,0 @@
-
-
-<html>
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-        <meta name="layout" content="main" />
-        <title>AssignedPerson List</title>
-    </head>
-    <body>
-        <div class="nav">
-            <h1>Assigned Person List</h1>
-        </div>
-        <div class="body">
-            <g:if test="${flash.message}">
-            <div class="message">${flash.message}</div>
-            </g:if>
-            <div class="list">
-                <table>
-                    <thead>
-                        <tr>
-                        
-                   	        <g:sortableColumn property="id" title="Id" />
-                        
-                   	        <th>Task</th>
-                   	    
-                   	        <th>Person</th>
-                   	    
-                   	        <g:sortableColumn property="estimatedHour" title="Estimated Hour" />
-                        
-                   	        <g:sortableColumn property="estimatedMinute" title="Estimated Minute" />
-                        
-                        </tr>
-                    </thead>
-                    <tbody>
-                    <g:each in="${assignedPersonInstanceList}" status="i" var="assignedPersonInstance">
-                        <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
-                        
-                            <td><g:link action="show" id="${assignedPersonInstance.id}">${fieldValue(bean:assignedPersonInstance, field:'id')}</g:link></td>
-                        
-                            <td>${fieldValue(bean:assignedPersonInstance, field:'task')}</td>
-                        
-                            <td>${fieldValue(bean:assignedPersonInstance, field:'person')}</td>
-                        
-                            <td>${fieldValue(bean:assignedPersonInstance, field:'estimatedHour')}</td>
-                        
-                            <td>${fieldValue(bean:assignedPersonInstance, field:'estimatedMinute')}</td>
-                        
-                        </tr>
-                    </g:each>
-                    </tbody>
-                </table>
-            </div>
-            <div class="paginateButtons">
-                <g:paginate total="${assignedPersonInstanceTotal}" />
-            </div>
-        </div>
-    </body>
-</html>
Index: unk/grails-app/views/assignedPersonDetailed/show.gsp
===================================================================
--- /trunk/grails-app/views/assignedPersonDetailed/show.gsp	(revision 254)
+++ 	(revision )
@@ -1,61 +1,0 @@
-
-
-<html>
-    <head>
-        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
-        <meta name="layout" content="main" />
-        <title>Show AssignedPerson</title>
-    </head>
-    <body>
-        <div class="nav">
-            <h1>Show Assigned Person</h1>
-        </div>
-        <div class="body">
-            <g:if test="${flash.message}">
-            <div class="message">${flash.message}</div>
-            </g:if>
-            <div class="dialog">
-                <table>
-                    <tbody>
-
-                    
-                        <tr class="prop">
-                            <td valign="top" class="name">Id:</td>
-                            
-                            <td valign="top" class="value">${fieldValue(bean:assignedPersonInstance, field:'id')}</td>
-                            
-                        </tr>
-                    
-                        <tr class="prop">
-                            <td valign="top" class="name">Task:</td>
-                            
-                            <td valign="top" class="value"><g:link controller="taskDetailed" action="show" id="${assignedPersonInstance?.task?.id}">${assignedPersonInstance?.task?.encodeAsHTML()}</g:link></td>
-                            
-                        </tr>
-                    
-                        <tr class="prop">
-                            <td valign="top" class="name">Person:</td>
-                            
-                            <td valign="top" class="value"><g:link controller="person" action="show" id="${assignedPersonInstance?.person?.id}">${assignedPersonInstance?.person?.encodeAsHTML()}</g:link></td>
-                            
-                        </tr>
-                    
-                        <tr class="prop">
-                            <td valign="top" class="name">Estimated Duration:</td>
-                            <td valign="top" class="value">${assignedPersonInstance.estimatedHour}h : ${assignedPersonInstance.estimatedMinute}min</td>
-                        </tr>
-
-                    </tbody>
-                </table>
-            </div>
-            <div class="buttons">
-                <g:form>
-                    <g:hiddenField name="id" value="${assignedPersonInstance?.id}" />
-                    <g:hiddenField name="task.id" value="${assignedPersonInstance?.task?.id}" />
-                    <span class="button"><g:actionSubmit class="edit" value="Edit" /></span>
-                    <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span>
-                </g:form>
-            </div>
-        </div>
-    </body>
-</html>
