Changeset 147 for trunk/grails-app


Ignore:
Timestamp:
Oct 8, 2009, 7:58:38 PM (14 years ago)
Author:
gav
Message:

Re-install class-diagram from local svn build with patch to allow war deployment.
Class-diagram overrides removed from Config.groovy since these have all been included upstream.
Tidy comments in SecurityConfig?.groovy
Some work on adding assignedPerson work flow and PersonController?.
Add navAlt and filterPane search to Person and TaskProcedure?.

Location:
trunk/grails-app
Files:
30 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/conf/Config.groovy

    r140 r147  
    111111]
    112112
    113 /** Class-diagram plugin overrides.
    114   *
    115   */
    116 classDiagram {
    117     associations {
    118         arrows {
    119             // See http://www.graphviz.org/doc/info/arrows.html for available arrowheads and their visual appearance
    120             references = "open"
    121             belongsTo = "odiamond"
    122             embedded = "diamond"
    123             inherits = "onormal"
    124             none = "none"
    125         }
    126         decorators {
    127             // plain text to be shown on edge ends
    128             hasOne = "1"
    129             hasMany = "*"
    130             none = ""
    131         }
    132     }
    133     skins {
    134         classicSpacey {
    135             name = " Classic Spacey"
    136             graphStyle = [bgcolor:"none", mclimit:100, nodesep:'1.5 equally', ranksep:'2 equally' ]
    137             nodeStyle = [style:"rounded,filled", color:"blue", fillcolor:"azure2", fontname:"Verdana", fontsize:18]
    138             edgeStyle = [color:"gray40", fontname:"Verdana", fontsize:18, labelfontsize:20, labeldistance:3.5]
    139         }
    140     }
    141 }
     113/** Navigation plugin alternate menu.
     114   * The alternate top level titles are not displayed anywhere.
     115   * Subitems i18n message bundles are not currently resolving with this plugin.
     116   */
     117navigation.navAlt = [
     118    [order:10, controller:'person', title:'person', action:'list',
     119        subItems: [
     120            [order:10, controller:'person', title:'Person List', action:'list', isVisible: { true }],
     121            [order:20, controller:'person', title:'Create', action:'create', isVisible: { true }],
     122            [order:90, controller:'person', title:'Show', action:'show', isVisible: { params.action == 'show' }],
     123            [order:91, controller:'person', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
     124        ]
     125    ],
     126    [order:20, controller:'taskProcedureDetailed', title:'task', action:'list',
     127        subItems: [
     128            [order:10, controller:'taskProcedureDetailed', title:'Task Procedure List', action:'list', isVisible: { true }],
     129            [order:20, controller:'taskProcedureDetailed', title:'Create', action:'create', isVisible: { true }],
     130            [order:90, controller:'taskProcedureDetailed', title:'Show', action:'show', isVisible: { params.action == 'show' }],
     131            [order:91, controller:'taskProcedureDetailed', title:'Edit', action:'edit', isVisible: { params.action == 'edit' }]
     132        ]
     133    ]
     134]
  • trunk/grails-app/conf/SecurityConfig.groovy

    r145 r147  
    33    def authenticateService
    44
    5         // see DefaultSecurityConfig.groovy for all settable/overridable properties
     5        // See DefaultSecurityConfig.groovy for all settable/overridable properties
    66
    77        active = true
     
    1414        authorityDomainClass = "Authority"
    1515
    16     //Required if we want to run "grails generate-manager"
    17     //Which recreates the controller and views, so save the views!
     16    // Required if we want to run "grails generate-manager"
     17    // Which recreates the controller and views, so save the views!
    1818//     requestMapClass = 'Requestmap'
    1919
     20    // The whole application relies on controllerAnnotations and the static rules bellow.
    2021    useRequestMapDomainClass = false
    2122    useControllerAnnotations = true
    2223
    23     //Set true especially if used across the internet.
     24    // Set true especially if used across the internet.
    2425    forceHttps = 'false'
    2526
    26     //Pessimistic locking, deny access to all URLs that don't
    27     //have an applicable URL-Role configuration.
    28     //This forces us to set an annotation, static rule or
    29     //extend BaseController and prevents accidentally leaving pages open.
     27    // Pessimistic locking, deny access to all URLs that don't
     28    // have an applicable URL-Role configuration.
     29    // This forces us to set an annotation, static rule or
     30    // extend BaseController and prevents accidentally leaving pages open.
    3031    controllerAnnotationsRejectIfNoRule = true
    31    
    32     //Static rules for controllers, actions and urls.
    33     //Since we are using pessimistic locking we have to set some things
    34     //here but most security should be set in the controllers.
     32
     33    // Static rules for controllers, actions and urls.
     34    // Since we are using pessimistic locking we have to set some things
     35    // here but most security should be set in the controllers.
    3536    controllerAnnotationStaticRules = [
    3637    '/': ['IS_AUTHENTICATED_FULLY'],
     
    3940    '/images/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
    4041    '/js/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
    41      '/plugins/**': ['IS_AUTHENTICATED_FULLY'],
    42 //     '/plugins/help-balloons-1.2/**': ['IS_AUTHENTICATED_FULLY'],
    43 //     '/plugins/richui-0.6/**': ['IS_AUTHENTICATED_FULLY'],
    44 //     '/plugins/navigation-1.1/**': ['IS_AUTHENTICATED_FULLY'],
    45 //     '/plugins/filterpane-0.6.2/**': ['IS_AUTHENTICATED_FULLY'],
    46 //     '/plugins/calendar-1.2.0-SNAPSHOT2/**': ['IS_AUTHENTICATED_FULLY'],
    47 //
    48 //     '/plugins/class-diagram-0.3/**': ['IS_AUTHENTICATED_FULLY'],
    49 //     '/classDiagram*': ['IS_AUTHENTICATED_FULLY'],
    50 //     '/classDiagram/**': ['IS_AUTHENTICATED_FULLY'],
     42    '/plugins/**': ['IS_AUTHENTICATED_FULLY'],
     43    '/classDiagram*': ['IS_AUTHENTICATED_FULLY'],
     44    '/classDiagram/**': ['IS_AUTHENTICATED_FULLY'],
    5145    '/login*': ['IS_AUTHENTICATED_ANONYMOUSLY'],
    5246    '/login/**': ['IS_AUTHENTICATED_ANONYMOUSLY'],
     
    5549    ]
    5650
    57     //We always want to go to the home page so that bookmarks are not used.
     51    // Always call the welcome action so that bookmarks are not used, a
     52    // welcome message can be populated and the sessionTimeout can be set.
    5853    defaultTargetUrl = '/appCore/welcome'
    5954    alwaysUseDefaultTargetUrl = true
    6055
    61     //User caching, turned this off so that password changes take effect.
    62     //It would appear that user is still in the session as logout/login
     56    // User caching, turned this off so that password changes take effect.
     57    // It would appear that user is still in the session as logout/login
    6358    // is still required for role changes to take effect.
    64     //If this option causes high database load try:
     59    // If this option causes high database load try:
    6560    //  import org.acegisecurity.providers.dao.DaoAuthenticationProvider
    6661    //  import org.acegisecurity.context.SecurityContextHolder
     
    7166    cacheUsers = false
    7267
    73 //    //List for and events and run the closure(s) that follow.
    74 //    //Unfortunately the session is not available yet so many things can't be done here, us an defaultTargetUrl and controller.
     68//    // Listen for events and run the closure(s) that follow.
     69//    // Unfortunately the session is not available yet so many things can't be done here, use a defaultTargetUrl and controller.
    7570//    useSecurityEventListener = true
    7671//
  • trunk/grails-app/controllers/AssignedPersonDetailedController.groovy

    r134 r147  
    22
    33class AssignedPersonDetailedController extends BaseController {
    4    
     4
    55    def index = { redirect(action:list,params:params) }
    66
     
    2727        if(assignedPersonInstance) {
    2828            try {
     29                def taskId = assignedPersonInstance.task.id
    2930                assignedPersonInstance.delete()
    3031                flash.message = "AssignedPerson ${params.id} deleted"
    31                 redirect(action:list)
     32                redirect(controller:"taskDetailed", action:"show", id: taskId)
    3233            }
    3334            catch(org.springframework.dao.DataIntegrityViolationException e) {
     
    6061                def version = params.version.toLong()
    6162                if(assignedPersonInstance.version > version) {
    62                    
     63
    6364                    assignedPersonInstance.errors.rejectValue("version", "assignedPerson.optimistic.locking.failure", "Another user has updated this AssignedPerson while you were editing.")
    6465                    render(view:'edit',model:[assignedPersonInstance:assignedPersonInstance])
     
    8283
    8384    def create = {
    84                 if(!params.task?.id) {
    85                         flash.message = "Please select a task and then 'Add Assigned Person'"
    86                         redirect(controller: "taskDetailed", action: list)
    87                 }
    88                 else {
    89         def assignedPersonInstance = new AssignedPerson()
    90         assignedPersonInstance.properties = params
    91         return ['assignedPersonInstance':assignedPersonInstance]
    92                 }
     85        if(!params.task?.id) {
     86            flash.message = "Please select a task and then 'Add Assigned Person'"
     87            redirect(controller: "taskDetailed", action: list)
     88        }
     89        else {
     90            def assignedPersonInstance = new AssignedPerson()
     91            assignedPersonInstance.properties = params
     92            return ['assignedPersonInstance':assignedPersonInstance]
     93        }
    9394    }
    9495
    9596    def save = {
    9697        def assignedPersonInstance = new AssignedPerson(params)
     98
    9799        if(!assignedPersonInstance.hasErrors() && assignedPersonInstance.save()) {
    98100            flash.message = "AssignedPerson ${assignedPersonInstance.id} created"
    99             redirect(action:show,id:assignedPersonInstance.id)
     101            redirect(controller:"taskDetailed", action:"show", id: params.task.id)
    100102        }
    101103        else {
  • trunk/grails-app/controllers/EntryDetailedController.groovy

    r98 r147  
    44
    55    def authenticateService
    6    
     6
    77    def index = { redirect(action:list,params:params) }
    88
  • trunk/grails-app/controllers/PersonController.groovy

    r136 r147  
    44class PersonController extends BaseAppAdminController {
    55
    6         def authenticateService
     6    def authenticateService
     7    def filterService
    78
    89        // the delete, save and update actions only accept POST requests
     
    1314        }
    1415
    15         def list = {
    16                 if (!params.max) {
    17                         params.max = 10
    18                 }
    19                 [personList: Person.list(params)]
    20         }
     16    def list = {
     17        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100 )
     18
     19        if(!params.filter)
     20        { return [personList: Person.list(params), personTotal: Person.count()] }
     21
     22        // filterPane:
     23        return[ personList: filterService.filter( params, Person ),
     24            personTotal: filterService.count( params, Person ),
     25            filterParams: com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
     26            params:params ]
     27    }
    2128
    2229        def show = {
     30
     31        // In the case of an actionSubmit button, rewrite action name from 'index'.
     32        if(params._action_Show)
     33        { params.action='show' }
     34
    2335                def person = Person.get(params.id)
    2436                if (!person) {
     
    4658                if (person) {
    4759                        def authPrincipal = authenticateService.principal()
    48                         //avoid self-delete if the logged-in user is an admin
     60                        // Avoid self-delete.
    4961                        if (!(authPrincipal instanceof String) && authPrincipal.username == person.loginName) {
    50                                 flash.message = "You can not delete yourself, please login as another admin and try again"
     62                                flash.message = "You cannot delete yourself, please login as another manager and try again."
     63                redirect(action:show,id:params.id)
    5164                        }
    5265                        else {
    5366                                //first, delete this person from Persons_Authorities table.
    5467                                Authority.findAll().each { it.removeFromPersons(person) }
    55                
     68                person.isActive = false
     69                person.save(flush: true)
     70
    5671                try {
    57                     person.delete()
     72                    person.delete(flush: true)
    5873                    flash.message = "Person $params.id deleted."
    5974                    redirect(action:list)
     
    7287        def edit = {
    7388
     89        // In the case of an actionSubmit button, rewrite action name from 'index'.
     90        if(params._action_Edit)
     91        { params.action='edit' }
     92
    7493                def person = Person.get(params.id)
    7594                if (!person) {
     
    7897                        return
    7998                }
    80 
     99        flash.message = "To allow login at least the 'ROLE_AppUser' authority must be given."
    81100                return buildPersonModel(person)
    82101        }
     
    126145
    127146        def create = {
     147        flash.message = "To allow login at least the 'ROLE_AppUser' authority must be given."
    128148                [person: new Person(params), authorityList: Authority.list()]
    129149        }
  • trunk/grails-app/controllers/TaskDetailedController.groovy

    r144 r147  
    202202
    203203    def show = {
    204        
     204
    205205        // In the case of an actionSubmit button, rewrite action name from 'index'.
    206206        if(params._action_Show)
     
    286286
    287287    def edit = {
    288        
     288
    289289        // In the case of an actionSubmit button, rewrite action name from 'index'.
    290290        if(params._action_Edit)
  • trunk/grails-app/controllers/TaskProcedureDetailedController.groovy

    r134 r147  
    22
    33class TaskProcedureDetailedController extends BaseController {
    4    
     4
    55    def index = { redirect(action:list,params:params) }
    66
     
    1010    def list = {
    1111        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100)
    12         [ taskProcedureInstanceList: TaskProcedure.list( params ), taskProcedureInstanceTotal: TaskProcedure.count() ]
     12
     13        if(!params.filter)
     14        { return [taskProcedureInstanceList: TaskProcedure.list(params), taskProcedureInstanceTotal: TaskProcedure.count()] }
     15
     16        // filterPane:
     17        return[ taskProcedureInstanceList: filterService.filter( params, TaskProcedure ),
     18            taskProcedureInstanceTotal: filterService.count( params, TaskProcedure ),
     19            filterParams: com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
     20            params:params ]
    1321    }
    14        
     22
    1523    def search = {
    1624        redirect(action:list)
     
    1826
    1927    def show = {
     28
     29        // In the case of an actionSubmit button, rewrite action name from 'index'.
     30        if(params._action_Show)
     31        { params.action='show' }
     32
    2033        def taskProcedureInstance = TaskProcedure.get( params.id )
    2134
     
    4760
    4861    def edit = {
     62
     63        // In the case of an actionSubmit button, rewrite action name from 'index'.
     64        if(params._action_Edit)
     65        { params.action='edit' }
     66
    4967        def taskProcedureInstance = TaskProcedure.get( params.id )
    5068
     
    6482                def version = params.version.toLong()
    6583                if(taskProcedureInstance.version > version) {
    66                    
     84
    6785                    taskProcedureInstance.errors.rejectValue("version", "taskProcedure.optimistic.locking.failure", "Another user has updated this TaskProcedure while you were editing.")
    6886                    render(view:'edit',model:[taskProcedureInstance:taskProcedureInstance])
     
    86104
    87105    def create = {
    88                 def taskInstance = Task.get(params.taskInstance?.id)
    89                
    90         def taskProcedureInstance = new TaskProcedure()
    91         taskProcedureInstance.properties = params
    92         return ['taskProcedureInstance':taskProcedureInstance,
    93                                                 taskInstance: taskInstance]
     106        if(params.taskInstance?.id) {
     107            def taskInstance = Task.get(params.taskInstance.id)
     108
     109            def taskProcedureInstance = new TaskProcedure()
     110            taskProcedureInstance.properties = params
     111            return ['taskProcedureInstance':taskProcedureInstance,
     112                            taskInstance: taskInstance]
     113        } else {
     114            flash.message = "Please select a task, then the Procedure tab.'"
     115            redirect(controller:"taskDetailed", action:"list")
     116        }
    94117    }
    95118
    96119    def save = {
    97120        def taskProcedureInstance = new TaskProcedure(params)
    98                 def taskInstance = Task.get(params.taskInstance.id)
    99                                
     121        def taskInstance = Task.get(params.taskInstance.id)
     122
    100123        if(!taskProcedureInstance.hasErrors() && taskProcedureInstance.save()) {
    101                         taskProcedureInstance.addToTasks(taskInstance)
    102             flash.message = "TaskProcedure ${taskProcedureInstance.id} created"
     124            taskProcedureInstance.addToTasks(taskInstance)
     125            flash.message = "TaskProcedure ${taskProcedureInstance.id} created."
    103126            redirect(action:show,id:taskProcedureInstance.id)
    104127        }
    105128        else {
    106             render(view:'create',model:[taskProcedureInstance:taskProcedureInstance])
     129            render(view:'create',model:[taskProcedureInstance:taskProcedureInstance, taskInstance: taskInstance])
    107130        }
    108131    }
  • trunk/grails-app/domain/Authority.groovy

    r58 r147  
    1212                description()
    1313        }
     14
     15    String toString() {
     16        "${this.authority}"
     17    }
    1418}
  • trunk/grails-app/domain/Person.groovy

    r139 r147  
    3333
    3434        static constraints = {
    35                 loginName(blank: false, unique: true, minSize:4)//minSize:7
     35                loginName(blank: false, unique: true, minSize:4) //minSize:7
    3636                firstName(blank: false)
    3737        lastName(blank: false)
     
    4444                password(blank: false)
    4545        //So we need to use pass for validation then encode it for above.
    46         pass(blank: false, minSize:4)
     46        pass(blank: false, minSize:4) //minSize:7
    4747        sessionTimeout(min:60, max:43200)
    4848
  • trunk/grails-app/domain/Task.groovy

    r146 r147  
    2020
    2121    static hasMany = [entries: Entry,
    22                         taskModifications: TaskModification, 
    23                         assignedPersons: AssignedPerson, 
     22                        taskModifications: TaskModification,
     23                        assignedPersons: AssignedPerson,
    2424                        subTasks: Task,
    2525                        associatedAssets: Asset,
  • trunk/grails-app/i18n/messages.properties

    r139 r147  
    55entry.duration=Duration
    66entry.duration.help=The time (hh:mm) booked against this entry for date done.
     7
     8assignedPerson.estimatedDuration=Estimated Duration
     9assignedPerson.estimatedDuration.help=The estimated amount of time (hh:mm) that you would like to assign this person to the task.
    710
    811task.assignedPersons=Assigned Persons
  • trunk/grails-app/views/appCore/manager.gsp

    r143 r147  
    1414                <div class="message">${flash.message}</div>
    1515            </g:if>
    16             <br />
    17             <br />
    18             <a href="${createLink(controller:'person', action:'list')}">Manage application users</a>
    19             <br />
    20             <br />
    21 <!--            View Entity Relationship Diagram:
    22             <a href="${createLink(controller:'classDiagram', action:'model', params:[outputFormat: 'pdf', skin: 'classicSpacey', showMethods: 'false', autoUpdate: 'false'])}">pdf</a>
    23             and
    24             <a href="${createLink(controller:'classDiagram', action:'legend', target:'_blank')}">legend</a>
    25             or
    26             <a href="${createLink(controller:'classDiagram', action:'show')}">interactive.</a>-->
    27         </div>
     16            <div class="dialog">
     17                <table>
     18                    <tbody>
     19
     20                        <tr class="prop">
     21                            <td valign="top" class="name">
     22                                <label>Manage:</label>
     23                            </td>
     24                            <td valign="top" class="value">
     25                                <a href="${createLink(controller:'person', action:'list')}">Application users</a>
     26                            </td>
     27                        </tr>
     28
     29                        <tr class="prop">
     30                            <td valign="top" class="name">
     31                                <label>Entity Relationship Diagram:</label>
     32                            </td>
     33                            <td valign="top" class="value">
     34
     35                                <a href="${createLink(controller:'classDiagram', action:'model', params:[outputFormat: 'pdf', skin: 'classicSpaced', showMethods: 'false', autoUpdate: 'false'])}">PDF</a>
     36                                <br />
     37                                <a href="${createLink(controller:'classDiagram', action:'legend', target:'_blank')}">Legend</a>
     38                                <br />
     39                                <a href="${createLink(controller:'classDiagram', action:'show')}">Interactive.</a>
     40                            </td>
     41                        </tr>
     42
     43                    </tbody>
     44                </table>
     45            </div> <!--End dialog-->
     46        </div> <!--End body-->
    2847    </body>
    2948</html>
  • trunk/grails-app/views/appCore/start.gsp

    r144 r147  
    8989                        <br />
    9090                        <br />
    91                         Static reports
     91                        <div class="dialog">
     92                            <table>
     93                                <tbody>
     94
     95                                    <tr class="prop">
     96                                        <td valign="top" class="name">
     97                                            <label>Static reports:</label>
     98                                        </td>
     99<!--                                        <td valign="top" class="value">
     100                                            <a href="${createLink(action:'changePassword')}"> Password</a>
     101                                            <br />
     102                                            <a href="${createLink(action:'changeSessionTimeout')}">Session Timeout</a>
     103                                        </td>-->
     104                                    </tr>
     105
     106                                </tbody>
     107                            </table>
     108                        </div> <!--End dialog-->
    92109                    </richui:tabContent>
    93110<!-- End Reports tab  -->
     
    97114                        <br />
    98115                        <br />
    99                         <a href="${createLink(action:'changePassword')}">Change Password</a>
    100                         <br />
    101                         <br />
    102                         <a href="${createLink(action:'changeSessionTimeout')}">Change Session Timeout</a>
     116                        <div class="dialog">
     117                            <table>
     118                                <tbody>
     119
     120                                    <tr class="prop">
     121                                        <td valign="top" class="name">
     122                                            <label>Change:</label>
     123                                        </td>
     124                                        <td valign="top" class="value">
     125                                            <a href="${createLink(action:'changePassword')}"> Password</a>
     126                                            <br />
     127                                            <a href="${createLink(action:'changeSessionTimeout')}">Session Timeout</a>
     128                                        </td>
     129                                    </tr>
     130
     131                                </tbody>
     132                            </table>
     133                        </div> <!--End dialog-->
    103134                    </richui:tabContent>
    104135<!-- End Options tab -->
  • trunk/grails-app/views/assignedPersonDetailed/create.gsp

    r134 r147  
    99    <body>
    1010        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">AssignedPerson List</g:link></span>
     11            <h1>Create Assigned Person</h1>
    1312        </div>
    1413        <div class="body">
    15             <h1>Create AssignedPerson</h1>
    1614            <g:if test="${flash.message}">
    1715            <div class="message">${flash.message}</div>
     
    4846                            <tr class="prop">
    4947                                <td valign="top" class="name">
    50                                     <label for="estimatedHour">Estimated Hour:</label>
     48                                    <label for="durationHour">Estimated Duration:</label>
    5149                                </td>
    52                                 <td valign="top" class="value ${hasErrors(bean:assignedPersonInstance,field:'estimatedHour','errors')}">
    53                                     <input type="text" id="estimatedHour" name="estimatedHour" value="${fieldValue(bean:assignedPersonInstance,field:'estimatedHour')}" />
    54                                 </td>
    55                             </tr>
    56                        
    57                             <tr class="prop">
    58                                 <td valign="top" class="name">
    59                                     <label for="estimatedMinute">Estimated Minute:</label>
    60                                 </td>
    61                                 <td valign="top" class="value ${hasErrors(bean:assignedPersonInstance,field:'estimatedMinute','errors')}">
    62                                     <input type="text" id="estimatedMinute" name="estimatedMinute" value="${fieldValue(bean:assignedPersonInstance,field:'estimatedMinute')}" />
    63                                 </td>
    64                             </tr>
     50
     51                                <td valign="top" class="value">
     52                                    <input class="time ${hasErrors(bean:assignedPersonInstance,field:'estimatedHour','errors')}"
     53                                        type="text" id="estimatedHour" name="estimatedHour"
     54                                        value="${fieldValue(bean:assignedPersonInstance,field:'estimatedHour')}" />
     55                                    :
     56                                    <input class="time ${hasErrors(bean:assignedPersonInstance,field:'estimatedMinute','errors')}"
     57                                        type="text" id="estimatedMinute" name="estimatedMinute"
     58                                        value="${fieldValue(bean:assignedPersonInstance,field:'estimatedMinute')}" />
     59                                    <g:helpBalloon code="assignedPerson.estimatedDuration" />
     60                                </td>
     61                            </tr>
    6562                       
    6663                        </tbody>
  • trunk/grails-app/views/assignedPersonDetailed/edit.gsp

    r96 r147  
    99    <body>
    1010        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">AssignedPerson List</g:link></span>
    13             <span class="menuButton"><g:link class="create" action="create">New AssignedPerson</g:link></span>
     11            <h1>Edit Assigned Person</h1>
    1412        </div>
    1513        <div class="body">
    16             <h1>Edit AssignedPerson</h1>
    1714            <g:if test="${flash.message}">
    1815            <div class="message">${flash.message}</div>
     
    4643                                    <g:select optionKey="id" from="${Person.list()}" name="person.id" value="${assignedPersonInstance?.person?.id}" ></g:select>
    4744                                </td>
    48                             </tr> 
    49                        
     45                            </tr>
     46
    5047                            <tr class="prop">
    5148                                <td valign="top" class="name">
    52                                     <label for="estimatedHour">Estimated Hour:</label>
     49                                    <label for="durationHour">Estimated Duration:</label>
    5350                                </td>
    54                                 <td valign="top" class="value ${hasErrors(bean:assignedPersonInstance,field:'estimatedHour','errors')}">
    55                                     <input type="text" id="estimatedHour" name="estimatedHour" value="${fieldValue(bean:assignedPersonInstance,field:'estimatedHour')}" />
    56                                 </td>
    57                             </tr>
    58                        
    59                             <tr class="prop">
    60                                 <td valign="top" class="name">
    61                                     <label for="estimatedMinute">Estimated Minute:</label>
    62                                 </td>
    63                                 <td valign="top" class="value ${hasErrors(bean:assignedPersonInstance,field:'estimatedMinute','errors')}">
    64                                     <input type="text" id="estimatedMinute" name="estimatedMinute" value="${fieldValue(bean:assignedPersonInstance,field:'estimatedMinute')}" />
    65                                 </td>
    66                             </tr>
    67                        
     51                                <td valign="top" class="value">
     52                                    <input class="time ${hasErrors(bean:assignedPersonInstance,field:'estimatedHour','errors')}"
     53                                        type="text" id="estimatedHour" name="estimatedHour"
     54                                        value="${fieldValue(bean:assignedPersonInstance,field:'estimatedHour')}" />
     55                                    :
     56                                    <input class="time ${hasErrors(bean:assignedPersonInstance,field:'estimatedMinute','errors')}"
     57                                        type="text" id="estimatedMinute" name="estimatedMinute"
     58                                        value="${fieldValue(bean:assignedPersonInstance,field:'estimatedMinute')}" />
     59                                    <g:helpBalloon code="assignedPerson.estimatedDuration" />
     60                                </td>
     61                            </tr>
     62
    6863                        </tbody>
    6964                    </table>
  • trunk/grails-app/views/assignedPersonDetailed/list.gsp

    r96 r147  
    99    <body>
    1010        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="create" action="create">New AssignedPerson</g:link></span>
     11            <h1>Assigned Person List</h1>
    1312        </div>
    1413        <div class="body">
    15             <h1>AssignedPerson List</h1>
    1614            <g:if test="${flash.message}">
    1715            <div class="message">${flash.message}</div>
  • trunk/grails-app/views/assignedPersonDetailed/show.gsp

    r114 r147  
    99    <body>
    1010        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">AssignedPerson List</g:link></span>
    13             <span class="menuButton"><g:link class="create" action="create">New AssignedPerson</g:link></span>
     11            <h1>Show Assigned Person</h1>
    1412        </div>
    1513        <div class="body">
    16             <h1>Show AssignedPerson</h1>
    1714            <g:if test="${flash.message}">
    1815            <div class="message">${flash.message}</div>
     
    4542                   
    4643                        <tr class="prop">
    47                             <td valign="top" class="name">Estimated Hour:</td>
    48                            
    49                             <td valign="top" class="value">${fieldValue(bean:assignedPersonInstance, field:'estimatedHour')}</td>
    50                            
     44                            <td valign="top" class="name">Estimated Duration:</td>
     45                            <td valign="top" class="value">${assignedPersonInstance.estimatedHour}h : ${assignedPersonInstance.estimatedMinute}min</td>
    5146                        </tr>
    52                    
    53                         <tr class="prop">
    54                             <td valign="top" class="name">Estimated Minute:</td>
    55                            
    56                             <td valign="top" class="value">${fieldValue(bean:assignedPersonInstance, field:'estimatedMinute')}</td>
    57                            
    58                         </tr>
    59                    
     47
    6048                    </tbody>
    6149                </table>
  • trunk/grails-app/views/entryDetailed/create.gsp

    r134 r147  
    55        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    66        <meta name="layout" content="main" />
    7         <title>Create Entry</title>         
     7        <title>Create Entry</title>
     8        <nav:resources override="true"/>
     9        <resource:dateChooser />
    810    </head>
    911    <body>
    1012        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">Entry List</g:link></span>
     13            <h1>Create Entry</h1>
    1314        </div>
    1415        <div class="body">
    15             <h1>Create Entry</h1>
    1616            <g:if test="${flash.message}">
    1717            <div class="message">${flash.message}</div>
     
    5151                                </td>
    5252                                <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'dateDone','errors')}">
    53                                     <g:datePicker name="dateDone" value="${entryInstance?.dateDone}" precision="day"></g:datePicker>
     53                                    <richui:dateChooser name="dateDone" format="dd-MM-yyyy" value="${new Date()}" />
    5454                                </td>
    5555                            </tr>
  • trunk/grails-app/views/entryDetailed/edit.gsp

    r139 r147  
    66        <meta name="layout" content="main" />
    77        <title>Edit Entry</title>
     8        <resource:dateChooser />
    89    </head>
    910    <body>
    1011        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">Entry List</g:link></span>
    13             <span class="menuButton"><g:link class="create" action="create">New Entry</g:link></span>
     12            <h1>Edit Entry</h1>
    1413        </div>
    1514        <div class="body">
    16             <h1>Edit Entry</h1>
    1715            <g:if test="${flash.message}">
    1816            <div class="message">${flash.message}</div>
     
    5250                                </td>
    5351                                <td valign="top" class="value ${hasErrors(bean:entryInstance,field:'dateDone','errors')}">
    54                                     <g:datePicker name="dateDone" value="${entryInstance?.dateDone}" precision="day"></g:datePicker>
     52                                    <richui:dateChooser name="dateDone" format="dd-MM-yyyy" value="${entryInstance?.dateDone}" />
    5553                                </td>
    5654                            </tr>
  • trunk/grails-app/views/entryDetailed/show.gsp

    r98 r147  
    99    <body>
    1010        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">Entry List</g:link></span>
    13             <span class="menuButton"><g:link class="create" action="create">New Entry</g:link></span>
     11            <h1>Show Entry</h1>
    1412        </div>
    1513        <div class="body">
    16             <h1>Show Entry</h1>
    1714            <g:if test="${flash.message}">
    1815            <div class="message">${flash.message}</div>
     
    4744                            <td valign="top" class="name">Date Done:</td>
    4845                           
    49                             <td valign="top" class="value">${fieldValue(bean:entryInstance, field:'dateDone')}</td>
     46                            <td valign="top" class="value">
     47                                <g:formatDate date="${entryInstance.dateDone}" format="EEE, dd-MMM-yyyy"/>
     48                            </td>
    5049                           
    5150                        </tr>
    5251                   
    5352                        <tr class="prop">
    54                             <td valign="top" class="name">Duration Hour:</td>
    55                            
    56                             <td valign="top" class="value">${fieldValue(bean:entryInstance, field:'durationHour')}</td>
    57                            
    58                         </tr>
    59                    
    60                         <tr class="prop">
    61                             <td valign="top" class="name">Duration Minute:</td>
    62                            
    63                             <td valign="top" class="value">${fieldValue(bean:entryInstance, field:'durationMinute')}</td>
    64                            
     53                            <td valign="top" class="name">Duration:</td>
     54                            <td valign="top" class="value">${entryInstance.durationHour}h : ${entryInstance.durationMinute}min</td>
    6555                        </tr>
    6656                   
     
    6858                            <td valign="top" class="name">Date Entered:</td>
    6959                           
    70                             <td valign="top" class="value">${fieldValue(bean:entryInstance, field:'dateEntered')}</td>
     60                            <td valign="top" class="value">
     61                                <g:formatDate date="${entryInstance.dateEntered}" format="EEE, dd-MMM-yyyy @ HH:mm"/>
     62                            </td>
    7163                           
    7264                        </tr>
  • trunk/grails-app/views/person/create.gsp

    r97 r147  
    22        <meta name="layout" content="main" />
    33        <title>Create Person</title>
     4    <nav:resources override="true"/>
    45</head>
    56
     
    78
    89        <div class="nav">
    9                 <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    10                 <span class="menuButton"><g:link class="list" action="list">Person List</g:link></span>
     10        <nav:renderSubItems group="navAlt"/>
    1111        </div>
    1212
    1313        <div class="body">
    14                 <h1>Create Person</h1>
    1514                <g:if test="${flash.message}">
    1615                <div class="message">${flash.message}</div>
  • trunk/grails-app/views/person/edit.gsp

    r97 r147  
    22        <meta name="layout" content="main" />
    33        <title>Edit Person</title>
     4    <nav:resources override="true"/>
    45</head>
    56
     
    78
    89        <div class="nav">
    9                 <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    10                 <span class="menuButton"><g:link class="list" action="list">Person List</g:link></span>
    11                 <span class="menuButton"><g:link class="create" action="create">New Person</g:link></span>
     10        <nav:renderSubItems group="navAlt"/>
    1211        </div>
    1312
    1413        <div class="body">
    15                 <h1>Edit Person</h1>
    1614                <g:if test="${flash.message}">
    1715                <div class="message">${flash.message}</div>
     
    2321                </g:hasErrors>
    2422
    25                 <div class="prop">
     23<!--            <div class="prop">
    2624                        <span class="name">ID: ${person.id}</span>
    27                 </div>
     25                </div>-->
    2826
    2927                <g:form>
  • trunk/grails-app/views/person/list.gsp

    r59 r147  
    11<head>
    2         <meta name="layout" content="main" />
    3         <title>Person List</title>
     2    <meta name="layout" content="main" />
     3    <title>Person List</title>
     4    <filterpane:includes />
     5    <nav:resources override="true"/>
    46</head>
    57
    68<body>
    79
    8         <div class="nav">
    9                 <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    10                 <span class="menuButton"><g:link class="create" action="create">New Person</g:link></span>
    11         </div>
     10    <div class="nav">
     11        <nav:renderSubItems group="navAlt"/>
     12    </div>
    1213
    13         <div class="body">
    14                 <h1>Person List</h1>
    15                 <g:if test="${flash.message}">
    16                 <div class="message">${flash.message}</div>
    17                 </g:if>
    18                 <div class="list">
    19                         <table>
    20                         <thead>
    21                                 <tr>
    22                                         <g:sortableColumn property="id" title="Id" />
    23                                         <g:sortableColumn property="loginName" title="Login Name" />
    24                                         <g:sortableColumn property="firstName" title="First Name" />
    25                     <g:sortableColumn property="lastName" title="Last Name" />
    26                     <g:sortableColumn property="isActive " title="isActive" />
    27                                         <th>&nbsp;</th>
    28                     <th>&nbsp;</th>
    29                                 </tr>
    30                         </thead>
    31                         <tbody>
    32                         <g:each in="${personList}" status="i" var="person">
    33                                 <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
    34                                         <td>${person.id}</td>
    35                                         <td>${person.loginName?.encodeAsHTML()}</td>
    36                                         <td>${person.firstName?.encodeAsHTML()}</td>
     14    <div class="body">
     15        <g:if test="${flash.message}">
     16        <div class="message">${flash.message}</div>
     17        </g:if>
     18        <filterpane:currentCriteria domainBean="Person"
     19                                action="list"
     20                                dateFormat="${'EEE, dd-MMM-yyyy'}"
     21                                removeImgDir="images"
     22                                removeImgFile="bullet_delete.png"
     23                                title="Search"/>
     24        <div class="list">
     25            <table>
     26            <thead>
     27                <tr>
     28                    <g:sortableColumn property="id" title="Id" params="${filterParams}" />
     29                    <g:sortableColumn property="loginName" title="Login Name" params="${filterParams}" />
     30                    <g:sortableColumn property="firstName" title="First Name" params="${filterParams}" />
     31                    <g:sortableColumn property="lastName" title="Last Name" params="${filterParams}" />
     32                    <g:sortableColumn property="isActive " title="isActive" params="${filterParams}" />
     33                    <th></th>
     34                </tr>
     35            </thead>
     36            <tbody>
     37            <g:each in="${personList}" status="i" var="person">
     38                <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/person/show/${person.id}"'/>
     39
     40                    <td>${person.id}</td>
     41                    <td>${person.loginName?.encodeAsHTML()}</td>
     42                    <td>${person.firstName?.encodeAsHTML()}</td>
    3743                    <td>${person.lastName?.encodeAsHTML()}</td>
    38                                         <td>${person.isActive?.encodeAsHTML()}</td>
    39                                         <td class="actionButtons">
    40                                                 <span class="actionButton">
    41                                                         <g:link action="show" id="${person.id}">Show</g:link>
    42                                                 </span>
    43                                         </td>
    44                     <td class="actionButtons">
    45                         <span class="actionButton">
    46                             <g:link action="edit" id="${person.id}">Edit</g:link>
    47                         </span>
     44                    <td>${person.isActive?.encodeAsHTML()}</td>
     45                    <td>
     46                        <g:link action="show" id="${person.id}">
     47                            <img  src="${createLinkTo(dir:'images/skin',file:'database_go.png')}" alt="Show" />
     48                        </g:link>
    4849                    </td>
    49                                 </tr>
    50                         </g:each>
    51                         </tbody>
    52                         </table>
    53                 </div>
     50                </tr>
     51            </g:each>
     52            </tbody>
     53            </table>
     54        </div>
    5455
    55                 <div class="paginateButtons">
    56                         <g:paginate total="${Person.count()}" />
    57                 </div>
     56        <div class="paginateButtons">
     57            <g:paginate total="${personTotal}" params="${filterParams}" />
     58            <filterpane:filterButton text="Search" appliedText="Change Search" />
     59            Results:${personTotal}
     60        </div>
    5861
    59         </div>
     62        <filterpane:filterPane domainBean="Person"
     63                                title="Search"
     64                                action="list"
     65                                excludeProperties="password, sessionTimeout, emailShow"
     66                                associatedProperties="authorities.authority, personGroups.name"
     67                                    filterPropertyValues="${['personGroups.name':[values:PersonGroup.list()],
     68                                                                                'authorities.authority':[values:Authority.list()]]}" />
     69
     70
     71    </div><!-- end body div -->
    6072</body>
  • trunk/grails-app/views/person/show.gsp

    r59 r147  
    22        <meta name="layout" content="main" />
    33        <title>Show Person</title>
     4    <nav:resources override="true"/>
    45</head>
    56
     
    78
    89        <div class="nav">
    9                 <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    10                 <span class="menuButton"><g:link class="list" action="list">Person List</g:link></span>
    11                 <span class="menuButton"><g:link class="create" action="create">New Person</g:link></span>
     10        <nav:renderSubItems group="navAlt"/>
    1211        </div>
    1312
    1413        <div class="body">
    15                 <h1>Show Person</h1>
    1614                <g:if test="${flash.message}">
    1715                <div class="message">${flash.message}</div>
  • trunk/grails-app/views/taskDetailed/edit.gsp

    r139 r147  
    77        <title>Edit Task</title>
    88        <nav:resources override="true"/>
     9        <resource:dateChooser />
    910    </head>
    1011    <body>
     
    5758                                </td>
    5859                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'targetStartDate','errors')}">
    59                                     <g:datePicker name="targetStartDate" value="${taskInstance?.targetStartDate}" precision="day"></g:datePicker>
     60                                    <richui:dateChooser name="targetStartDate" format="dd-MM-yyyy" value="${taskInstance?.targetStartDate}" />
    6061                                </td>
    6162                            </tr>
     
    6667                                </td>
    6768                                <td valign="top" class="value ${hasErrors(bean:taskInstance,field:'targetCompletionDate','errors')}">
    68                                     <g:datePicker name="targetCompletionDate" value="${taskInstance?.targetCompletionDate}" precision="day"></g:datePicker>
     69                                    <richui:dateChooser name="targetCompletionDate" format="dd-MM-yyyy" value="${taskInstance?.targetCompletionDate}" />
    6970                                </td>
    7071                            </tr>
  • trunk/grails-app/views/taskDetailed/search.gsp

    r143 r147  
    3030                                    removeImgFile="bullet_delete.png"
    3131                                    title="Quick Search"/>
    32            
    33             <div class="list">               
     32
     33            <div class="list">
    3434                <table>
    3535                    <thead>
     
    8585                <g:link action="advancedSearch">Goto: Advanced Search</g:link>
    8686            </div>
    87            
     87
    8888            <filterpane:filterPane domainBean="Task"
    8989                                    title="Quick Search"
  • trunk/grails-app/views/taskProcedureDetailed/create.gsp

    r134 r147  
    55        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    66        <meta name="layout" content="main" />
    7         <title>Create TaskProcedure</title>         
     7        <title>Create TaskProcedure</title>
     8        <nav:resources override="true"/>
    89    </head>
    910    <body>
    1011        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">TaskProcedure List</g:link></span>
     12            <nav:renderSubItems group="navAlt"/>
    1313        </div>
    1414        <div class="body">
    15             <h1>Create TaskProcedure</h1>
    1615            <g:if test="${flash.message}">
    1716            <div class="message">${flash.message}</div>
  • trunk/grails-app/views/taskProcedureDetailed/edit.gsp

    r134 r147  
    66        <meta name="layout" content="main" />
    77        <title>Edit TaskProcedure</title>
     8        <nav:resources override="true"/>
    89    </head>
    910    <body>
    1011        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">TaskProcedure List</g:link></span>
    13             <span class="menuButton"><g:link class="create" action="create">New TaskProcedure</g:link></span>
     12            <nav:renderSubItems group="navAlt"/>
    1413        </div>
    1514        <div class="body">
    16             <h1>Edit TaskProcedure</h1>
    1715            <g:if test="${flash.message}">
    1816            <div class="message">${flash.message}</div>
  • trunk/grails-app/views/taskProcedureDetailed/list.gsp

    r133 r147  
    66        <meta name="layout" content="main" />
    77        <title>TaskProcedure List</title>
     8        <filterpane:includes />
     9        <nav:resources override="true"/>
    810    </head>
    911    <body>
    1012        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="create" action="create">New TaskProcedure</g:link></span>
     13            <nav:renderSubItems group="navAlt"/>
    1314        </div>
    1415        <div class="body">
    15             <h1>TaskProcedure List</h1>
    1616            <g:if test="${flash.message}">
    1717            <div class="message">${flash.message}</div>
    1818            </g:if>
     19            <filterpane:currentCriteria domainBean="TaskProcedureDetailed"
     20                                    action="list"
     21                                    dateFormat="${'EEE, dd-MMM-yyyy'}"
     22                                    removeImgDir="images"
     23                                    removeImgFile="bullet_delete.png"
     24                                    title="Search"/>
    1925            <div class="list">
    2026                <table>
     
    2228                        <tr>
    2329                       
    24                                 <g:sortableColumn property="id" title="Id" />
     30                                <g:sortableColumn property="id" title="Id"  params="${filterParams}" />
    2531                       
    26                                 <g:sortableColumn property="name" title="Name" />
     32                                <g:sortableColumn property="name" title="Name"  params="${filterParams}" />
    2733                       
    28                                 <g:sortableColumn property="description" title="Description" />
     34                                <g:sortableColumn property="description" title="Description"  params="${filterParams}" />
    2935                       
    30                                 <g:sortableColumn property="isActive" title="Is Active" />
     36                                <g:sortableColumn property="isActive" title="Is Active"  params="${filterParams}" />
     37
     38                            <th></th>
    3139                       
    3240                        </tr>
     
    3442                    <tbody>
    3543                    <g:each in="${taskProcedureInstanceList}" status="i" var="taskProcedureInstance">
    36                         <tr class="${(i % 2) == 0 ? 'odd' : 'even'}">
     44                        <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/taskProcedureDetailed/show/${taskProcedureInstance.id}"'/>
    3745                       
    38                             <td><g:link action="show" id="${taskProcedureInstance.id}">${fieldValue(bean:taskProcedureInstance, field:'id')}</g:link></td>
     46                            <td>${fieldValue(bean:taskProcedureInstance, field:'id')}</td>
    3947                       
    4048                            <td>${fieldValue(bean:taskProcedureInstance, field:'name')}</td>
     
    4351                       
    4452                            <td>${fieldValue(bean:taskProcedureInstance, field:'isActive')}</td>
     53                           
     54                            <td>
     55                                <g:link action="show" id="${taskProcedureInstance.id}">
     56                                    <img  src="${createLinkTo(dir:'images/skin',file:'database_go.png')}" alt="Show" />
     57                                </g:link>
     58                            </td>
    4559                       
    4660                        </tr>
     
    4963                </table>
    5064            </div>
     65
    5166            <div class="paginateButtons">
    52                 <g:paginate total="${taskProcedureInstanceTotal}" />
     67                <g:paginate total="${taskProcedureInstanceTotal}" params="${filterParams}" />
     68                <filterpane:filterButton text="Search" appliedText="Change Search" />
     69                Results:${askProcedureInstanceTotal}
    5370            </div>
     71
     72            <filterpane:filterPane domainBean="TaskProcedure"
     73                                    title="Search"
     74                                    action="list"
     75                                    excludeProperties="" />
    5476        </div>
    5577    </body>
  • trunk/grails-app/views/taskProcedureDetailed/show.gsp

    r133 r147  
    66        <meta name="layout" content="main" />
    77        <title>Show TaskProcedure</title>
     8        <nav:resources override="true"/>
    89    </head>
    910    <body>
    1011        <div class="nav">
    11             <span class="menuButton"><a class="home" href="${createLinkTo(dir:'')}">Home</a></span>
    12             <span class="menuButton"><g:link class="list" action="list">TaskProcedure List</g:link></span>
    13             <span class="menuButton"><g:link class="create" action="create">New TaskProcedure</g:link></span>
     12            <nav:renderSubItems group="navAlt"/>
    1413        </div>
    1514        <div class="body">
    16             <h1>Show TaskProcedure</h1>
    1715            <g:if test="${flash.message}">
    1816            <div class="message">${flash.message}</div>
Note: See TracChangeset for help on using the changeset viewer.