Changeset 798

Show
Ignore:
Timestamp:
02/08/11 23:00:27 (3 years ago)
Author:
gav
Message:

Svn merge -r752:r797 branches/features/taskProcedureRework into trunk/.

Location:
trunk
Files:
5 removed
14 modified
11 copied

Legend:

Unmodified
Added
Removed
  • trunk/application.properties

    r612 r798  
    11#Grails Metadata file 
    2 #Wed Jun 02 11:20:51 EST 2010 
     2#Thu Jan 27 17:24:52 EST 2011 
    33app.grails.version=1.2.2 
    44app.name=gnuMims 
  • trunk/grails-app/controllers/TaskProcedureDetailedController.groovy

    r403 r798  
    55 
    66    def filterService 
     7    def assetService 
     8    def taskProcedureService 
    79 
    810    def index = { redirect(action:list,params:params) } 
     
    4042 
    4143        if(!taskProcedureInstance) { 
    42             flash.message = "TaskProcedure not found with id ${params.id}" 
    43             redirect(action:list) 
    44         } 
    45         else { return [ taskProcedureInstance : taskProcedureInstance ] } 
     44            flash.errorMessage = "TaskProcedure not found with id ${params.id}" 
     45            redirect(controller:'taskDetailed', action:'search') 
     46            return 
     47        } 
     48 
     49        redirect(controller:'taskDetailed', 
     50                        action:'show', 
     51                        id:taskProcedureInstance.linkedTask?.id, 
     52                        params:[showTab:"showProcedureTab"]) 
    4653    } 
    4754 
     
    4956        def taskProcedureInstance = TaskProcedure.get( params.id ) 
    5057        if(taskProcedureInstance) { 
     58            def taskInstance = taskProcedureInstance.linkedTask 
    5159            try { 
     60                taskProcedureInstance.tasks.each { 
     61                    it.taskProcedure = null 
     62                } 
    5263                taskProcedureInstance.delete(flush:true) 
    5364                flash.message = "TaskProcedure ${params.id} deleted" 
    54                 redirect(action:list) 
     65                redirect(controller:'taskDetailed', 
     66                                action:'show', 
     67                                id:taskInstance.id, 
     68                                params:[showTab:"showProcedureTab"]) 
    5569            } 
    5670            catch(org.springframework.dao.DataIntegrityViolationException e) { 
    57                 flash.message = "TaskProcedure ${params.id} could not be deleted" 
    58                 redirect(action:show,id:params.id) 
     71                flash.errorMessage = "TaskProcedure ${params.id} could not be deleted" 
     72                redirect(controller:'taskDetailed', 
     73                                action:'show', 
     74                                id:taskInstance.id, 
     75                                params:[showTab:"showProcedureTab"]) 
    5976            } 
    6077        } 
    6178        else { 
    62             flash.message = "TaskProcedure not found with id ${params.id}" 
     79            flash.errorMessage = "TaskProcedure not found with id ${params.id}" 
    6380            redirect(action:list) 
    6481        } 
     
    7491 
    7592        if(!taskProcedureInstance) { 
    76             flash.message = "TaskProcedure not found with id ${params.id}" 
     93            flash.errorMessage = "TaskProcedure not found with id ${params.id}" 
    7794            redirect(action:list) 
    7895        } 
    7996        else { 
    80             return [ taskProcedureInstance : taskProcedureInstance ] 
     97            def assemblies = assetService.getAssemblies(taskProcedureInstance.linkedTask.primaryAsset) 
     98            return [ taskProcedureInstance : taskProcedureInstance, 
     99                            assemblies: assemblies ] 
    81100        } 
    82101    } 
    83102 
    84103    def update = { 
    85         def taskProcedureInstance = TaskProcedure.get( params.id ) 
    86         if(taskProcedureInstance) { 
    87             if(params.version) { 
    88                 def version = params.version.toLong() 
    89                 if(taskProcedureInstance.version > version) { 
    90  
    91                     taskProcedureInstance.errors.rejectValue("version", "default.optimistic.locking.failure") 
    92                     render(view:'edit',model:[taskProcedureInstance:taskProcedureInstance]) 
    93                     return 
    94                 } 
    95             } 
    96             taskProcedureInstance.properties = params 
    97             if(!taskProcedureInstance.hasErrors() && taskProcedureInstance.save(flush: true)) { 
    98                 flash.message = "TaskProcedure ${params.id} updated" 
    99                 redirect(action:show,id:taskProcedureInstance.id) 
    100             } 
    101             else { 
    102                 render(view:'edit',model:[taskProcedureInstance:taskProcedureInstance]) 
    103             } 
    104         } 
    105         else { 
    106             flash.message = "TaskProcedure not found with id ${params.id}" 
     104        def result = taskProcedureService.update(params) 
     105 
     106        if(!result.error) { 
     107            flash.message = g.message(code: "default.update.success", args: ["TaskProcedure", params.id]) 
     108            redirect(controller:'taskDetailed', 
     109                            action:'show', 
     110                            id:result.taskProcedureInstance.linkedTask.id, 
     111                            params:[showTab:"showProcedureTab"]) 
     112            return 
     113        } 
     114 
     115        if(result.error.code == "default.not.found") { 
     116            flash.errorMessage = g.message(code: result.error.code, args: result.error.args) 
    107117            redirect(action:list) 
    108         } 
     118            return 
     119        } 
     120 
     121        if(result.error.code == "default.optimistic.locking.failure") { 
     122            flash.errorMessage = g.message(code: result.error.code, args: result.error.args) 
     123            redirect(controller:'taskDetailed', 
     124                            action:'show', 
     125                            id:result.taskProcedureInstance.linkedTask.id, 
     126                            params:[showTab:"showProcedureTab"]) 
     127            return 
     128        } 
     129 
     130        def assemblies = assetService.getAssemblies(result.taskProcedureInstance.linkedTask.primaryAsset) 
     131        render(view:'edit', model:[taskProcedureInstance: result.taskProcedureInstance, 
     132                                                assemblies: assemblies]) 
    109133    } 
    110134 
    111135    def create = { 
    112         if(params.taskInstance?.id) { 
    113             def taskInstance = Task.get(params.taskInstance.id) 
    114  
    115             def taskProcedureInstance = new TaskProcedure() 
    116             taskProcedureInstance.properties = params 
    117             return ['taskProcedureInstance':taskProcedureInstance, 
    118                             taskInstance: taskInstance] 
    119         } else { 
    120             flash.message = "Please select or create a task, then go to the Procedure tab." 
     136 
     137        if(!params.taskInstance?.id) { 
     138            flash.errorMessage = "Please select or create a task, then go to the Procedure tab." 
    121139            redirect(controller:"taskDetailed", action:"search") 
    122         } 
     140            return 
     141        } 
     142 
     143        params.linkedTask = Task.get(params.taskInstance.id) 
     144 
     145        // Task already has a taskProcedure. 
     146        if(params.linkedTask.taskProcedure) { 
     147            flash.errorMessage = g.message(code: 'default.optimistic.locking.failure') 
     148            redirect(controller:'taskDetailed', 
     149                            action:'show', 
     150                            id:params.linkedTask.id, 
     151                            params:[showTab:"showProcedureTab"]) 
     152            return 
     153        } 
     154 
     155        // Task does not have a primaryAsset. 
     156        if(!params.linkedTask?.primaryAsset) { 
     157            flash.errorMessage = "Please set a Primary Asset first, then go to the Procedure tab." 
     158            redirect(controller:"taskDetailed", action:"show", id:params.linkedTask?.id) 
     159            return 
     160        } 
     161 
     162        def taskProcedureInstance = new TaskProcedure() 
     163        taskProcedureInstance.properties = params 
     164 
     165        // Populate a couple of maintenanceActions for the first assembly. 
     166        def assemblies = assetService.getAssemblies(params.linkedTask.primaryAsset) 
     167        if(assemblies) { 
     168            def assembly = assemblies[0] 
     169            def ma = taskProcedureInstance.maintenanceActionLazyList.get(0) 
     170            ma.assetSubItem = assembly 
     171            ma.procedureStepNumber = 10 
     172            ma = taskProcedureInstance.maintenanceActionLazyList.get(1) 
     173            ma.assetSubItem = assembly 
     174            ma.procedureStepNumber = 20 
     175        } 
     176 
     177        return ['taskProcedureInstance':taskProcedureInstance, 'assemblies': assemblies] 
    123178    } 
    124179 
    125180    def save = { 
    126         def taskProcedureInstance = new TaskProcedure(params) 
    127         def taskInstance = Task.get(params.taskInstance.id) 
    128  
    129         if(!taskProcedureInstance.hasErrors() && taskProcedureInstance.save(flush: true)) { 
    130             taskProcedureInstance.addToTasks(taskInstance) 
    131             flash.message = "TaskProcedure ${taskProcedureInstance.id} created." 
    132             redirect(action:show,id:taskProcedureInstance.id) 
    133         } 
    134         else { 
    135             render(view:'create',model:[taskProcedureInstance:taskProcedureInstance, taskInstance: taskInstance]) 
    136         } 
    137     } 
     181        def result = taskProcedureService.save(params) 
     182 
     183        if(!result.error) { 
     184            flash.message = g.message(code: "default.create.success", args: ["TaskProcedure", result.taskProcedureInstance.id]) 
     185            redirect(controller:'taskDetailed', 
     186                            action:'show', 
     187                            id:result.taskProcedureInstance.linkedTask.id, 
     188                            params:[showTab:"showProcedureTab"]) 
     189            return 
     190        } 
     191 
     192        if(result.error.code == "default.optimistic.locking.failure") { 
     193            flash.errorMessage = g.message(code: result.error.code, args: result.error.args) 
     194            redirect(controller:'taskDetailed', 
     195                            action:'show', 
     196                            id:result.taskProcedureInstance.linkedTask.id, 
     197                            params:[showTab:"showProcedureTab"]) 
     198            return 
     199        } 
     200 
     201        def assemblies = assetService.getAssemblies(result.taskProcedureInstance.linkedTask.primaryAsset) 
     202        render(view:'create', model:[taskProcedureInstance: result.taskProcedureInstance, 
     203                                                    assemblies: assemblies]) 
     204    } 
     205 
    138206} 
  • trunk/grails-app/domain/MaintenanceAction.groovy

    r268 r798  
    88 
    99    String description 
    10     String reasoning = "" 
     10    String pageRef = "" 
    1111    Integer procedureStepNumber 
    12     boolean isActive = true 
     12 
     13    Boolean toBeDeleted 
     14    Boolean isNew 
     15    static transients = [ 'toBeDeleted', 'isNew' ] 
    1316 
    1417//     static hasMany = [] 
    1518 
    16 //     static belongsTo = [] 
     19    static belongsTo = [TaskProcedure] 
    1720 
    1821    static constraints = { 
     
    2225        maintenancePolicy(nullable:true) 
    2326        procedureStepNumber(nullable:true) 
    24         description() 
    25         reasoning() 
    26         isActive() 
     27        description(blank:false,maxSize:100) 
     28        pageRef(maxSize:100) 
    2729    } 
    2830 
  • trunk/grails-app/domain/TaskProcedure.groovy

    r131 r798  
     1import org.apache.commons.collections.list.LazyList 
     2import org.apache.commons.collections.FactoryUtils 
     3 
    14class TaskProcedure { 
    25 
    3     String name 
    4     String description = "" 
    5     Boolean isActive = true 
     6    Task linkedTask 
     7    Person createdBy 
     8    Person lastUpdatedBy 
     9    Date dateCreated = new Date() // autoTimestamp 
     10    Date lastUpdated = new Date() // autoTimestamp 
    611 
    7     static hasMany = [tasks: Task, maintenanceActions: MaintenanceAction] 
     12    def getDescription() { linkedTask.description } 
     13    def getAsset() { linkedTask.primaryAsset } 
     14 
     15    List maintenanceActions = new ArrayList() 
     16    List documentReferences = new ArrayList() 
     17 
     18    static hasMany = [tasks: Task, 
     19                                    maintenanceActions: MaintenanceAction, 
     20                                    documentReferences: DocumentReference] 
     21 
     22    def getMaintenanceActionLazyList() { 
     23        return LazyList.decorate(maintenanceActions, FactoryUtils.instantiateFactory(MaintenanceAction.class)) 
     24    } 
     25 
     26    def getDocumentReferenceLazyList() { 
     27        return LazyList.decorate(documentReferences, FactoryUtils.instantiateFactory(DocumentReference.class)) 
     28    } 
     29 
     30    static mappedBy = [tasks:"taskProcedure"] 
     31 
     32    static mapping = { 
     33        maintenanceActions cascade:"all-delete-orphan" 
     34        documentReferences cascade:"all-delete-orphan" 
     35    } 
    836 
    937//     static belongsTo = [] 
    1038 
    1139    static constraints = { 
    12         name(maxSize:75,unique:true,blank:false) 
    13         description(maxSize:100) 
    1440    } 
    1541 
    1642    String toString() { 
    17         "${this.name}" 
     43        "${this.id}" 
    1844    } 
    1945} 
  • trunk/grails-app/services/AssetService.groovy

    r689 r798  
    2222                } 
    2323        } 
     24    } 
     25 
     26    /** 
     27    * Determines and returns a list of assemblies for an asset. 
     28    * This is purely a 'load from database' type method since a new hibernateSession is used. 
     29    * @params Asset to get the subItems for. 
     30    * @returns A list of the assemblies. 
     31    */ 
     32    def getAssemblies(asset) { 
     33        def assemblies = [] 
     34        if(!(asset instanceof Asset)) 
     35            return assemblies 
     36        // Database efficiency: 
     37        // The asset is configured to batch fetch assetSubItems which 
     38        // in turn are configured to batch fetch subItems. 
     39        Asset.withNewSession { 
     40            Asset.get(asset.id).assetSubItems.each { 
     41                assemblies.addAll(it.subItems) 
     42            } 
     43        } 
     44        assemblies.sort { p1, p2 -> p1.name.compareToIgnoreCase(p2.name) } 
     45        return assemblies 
    2446    } 
    2547 
  • trunk/grails-app/services/CreateDataService.groovy

    r751 r798  
    33/** 
    44* Provides a data service to create base and demo data. 
    5 * Beware that most, if not all, base data is referenced by "Id" throughout the program. 
     5* Beware that most, if not all, BASE data is referenced by "Id" throughout the program. 
    66* This allows changing the text of the 'name' property to something of the same meaning. 
    77* But be sure to maintain the correct Id during creation, indicated by #1, #2 etc. 
     8* Task.list()[0] is used to allow integration testing with DEMO data, where Id's may change due to create-delete. 
    89*/ 
    910class  CreateDataService { 
     
    846847        //Task #1 
    847848        p = [taskGroup:TaskGroup.findByName("Engineering Activites"), 
    848                 taskPriority:TaskPriority.get(2), 
     849                taskPriority:TaskPriority.get(1), 
    849850                taskType:TaskType.get(1), 
    850851                leadPerson:Person.get(2), 
     
    10971098        //TaskProcedure 
    10981099        def taskProcedureInstance 
    1099  
    1100         taskProcedureInstance = new TaskProcedure(name: "Daily check") 
     1100        def taskInstance 
     1101        def person = Person.get(3) 
     1102 
     1103        taskInstance = Task.list()[6] 
     1104        taskProcedureInstance = new TaskProcedure(linkedTask: taskInstance, 
     1105                                                                                    createdBy: person, 
     1106                                                                                    lastUpdatedBy: person) 
    11011107        saveAndTest(taskProcedureInstance) 
    1102         taskProcedureInstance.addToTasks(Task.list()[0]) 
    1103  
    1104         taskProcedureInstance = new TaskProcedure(name: "100hr Service") 
     1108        taskProcedureInstance.addToTasks(taskInstance) 
     1109 
     1110        taskInstance = Task.list()[4] 
     1111        taskProcedureInstance = new TaskProcedure(linkedTask: taskInstance, 
     1112                                                                                    createdBy: person, 
     1113                                                                                    lastUpdatedBy: person) 
    11051114        saveAndTest(taskProcedureInstance) 
    1106         taskProcedureInstance.addToTasks(Task.list()[6]) 
     1115        taskProcedureInstance.addToTasks(taskInstance) 
    11071116    } 
    11081117 
     
    11111120        //MaintenanceAction 
    11121121        def maintenanceActionInstance 
     1122        def taskProcedure = TaskProcedure.get(1) 
     1123        def assetSubItem = AssetSubItem.get(6) 
    11131124 
    11141125        //MaintenanceAction #1 
    11151126        maintenanceActionInstance = new MaintenanceAction(description: "Check all E-stops, activate E-stops S1-S12 and ensure machine cannot run", 
    11161127                                                                                                        procedureStepNumber: 10, 
    1117                                                                                                         maintenancePolicy: MaintenancePolicy.get(1), 
    1118                                                                                                         taskProcedure: TaskProcedure.get(1)) 
    1119         saveAndTest(maintenanceActionInstance) 
     1128                                                                                                        assetSubItem: assetSubItem, 
     1129                                                                                                        taskProcedure: taskProcedure) 
     1130        taskProcedure.addToMaintenanceActions(maintenanceActionInstance) 
    11201131 
    11211132        //MaintenanceAction #2 
    11221133        maintenanceActionInstance = new MaintenanceAction(description: "Do more pushups", 
    11231134                                                                                                        procedureStepNumber: 20, 
    1124                                                                                                         maintenancePolicy: MaintenancePolicy.get(1), 
    1125                                                                                                         taskProcedure: TaskProcedure.get(1)) 
    1126         saveAndTest(maintenanceActionInstance) 
     1135                                                                                                        assetSubItem: assetSubItem, 
     1136                                                                                                        taskProcedure: taskProcedure) 
     1137        taskProcedure.addToMaintenanceActions(maintenanceActionInstance) 
    11271138 
    11281139        //MaintenanceAction #3 
    11291140        maintenanceActionInstance = new MaintenanceAction(description: "Ok just one more pushup", 
    11301141                                                                                                        procedureStepNumber: 30, 
    1131                                                                                                         maintenancePolicy: MaintenancePolicy.get(1), 
    1132                                                                                                         taskProcedure: TaskProcedure.get(1)) 
    1133         saveAndTest(maintenanceActionInstance) 
     1142                                                                                                        assetSubItem: assetSubItem, 
     1143                                                                                                        taskProcedure: taskProcedure) 
     1144        taskProcedure.addToMaintenanceActions(maintenanceActionInstance) 
     1145 
     1146        saveAndTest(taskProcedure) 
    11341147    } 
    11351148 
     
    14751488                                                                section: Section.get(1)) 
    14761489        saveAndTest(assetInstance1) 
    1477 //        assetInstance.addToMaintenanceActions(MaintenanceAction.get(1)) 
    14781490 
    14791491        //Asset #2 
  • trunk/grails-app/taglib/CustomTagLib.groovy

    r672 r798  
     1//import org.apache.commons.validator.UrlValidator 
     2import org.codehaus.groovy.grails.validation.routines.UrlValidator 
     3import org.codehaus.groovy.grails.validation.routines.RegexValidator 
    14 
    25/** 
     
    238241    } // jasperButtons 
    239242 
     243    /** 
     244    * Easily create a link from a hopeful url string. 
     245    * If the supplied url is not considered a valid url the string is simply displayed. 
     246    * 
     247    * Fields: 
     248    *  url - String url to use. 
     249    *  body - If no body is supplied in the GSP then url.encodeAsHTML() is displayed. 
     250    * 
     251    * Example: 
     252    * <!-- 
     253    * <custom:easyUrl url="${docRef.location}" /> 
     254    * --> 
     255    */ 
     256    def easyUrl = {attrs, body -> 
     257 
     258        def url = attrs.url 
     259 
     260        def html 
     261 
     262        body = body() 
     263        if(!body) 
     264            body = url.encodeAsHTML() 
     265 
     266        html = "${body}" 
     267 
     268        if(isURLValid(url)) { 
     269            html = """ 
     270                        <a href="${url}"> 
     271                            ${html} 
     272                        </a> 
     273                        """ 
     274        } 
     275 
     276        out << html 
     277    } 
     278 
     279    /** 
     280    * Determine if a supplied string is considered a url or not. 
     281    * The scheme/protocol can be adjusted, file:// has been excluded here. 
     282    * A domainValidator regex is used to allow localhost domain. 
     283    * A Grails branched version of commons.validator is used, this should 
     284    * be compatible with the apache 1.4 version release. 
     285    * See: http://jira.codehaus.org/browse/GRAILS-1692 for more on Grails url validation. 
     286    */ 
     287    private Boolean isURLValid(url) { 
     288 
     289        def schemes = ["http","https", "ftp"] as String[] 
     290        def domainValidator = new RegexValidator("localhost(:(\\d{1,5}))?") 
     291        def validator = new UrlValidator(schemes, domainValidator, UrlValidator.ALLOW_2_SLASHES) 
     292        return validator.isValid(url) 
     293 
     294    } 
     295 
    240296} // end class 
  • trunk/grails-app/views/layouts/main.gsp

    r711 r798  
    55        <link rel="stylesheet" href="${resource(dir:'css',file:'main.css')}" /> 
    66        <link rel="shortcut icon" href="${resource(dir:'images',file:'gnuMimsIcon.ico')}" type="image/x-icon" /> 
     7        <g:javascript library="jquery" /> 
    78        <g:javascript library="prototype/prototype" /> 
    89        <g:javascript library="prototype/effects" /> 
  • trunk/grails-app/views/taskDetailed/show.gsp

    r736 r798  
    513513                                        <tr class="prop"> 
    514514                                            <td valign="top" class="name">Procedure Id:</td> 
    515  
    516                                             <td valign="top" class="value">${fieldValue(bean:taskProcedureInstance, field:'id')}</td> 
    517  
    518                                         </tr> 
    519  
    520                                         <tr class="prop"> 
    521                                             <td valign="top" class="name">Name:</td> 
    522  
    523                                             <td valign="top" class="value">${fieldValue(bean:taskProcedureInstance, field:'name')}</td> 
    524  
    525                                         </tr> 
    526  
    527                                         <tr class="prop"> 
    528                                             <td valign="top" class="name">Description:</td> 
    529  
    530                                             <td valign="top" class="value">${fieldValue(bean:taskProcedureInstance, field:'description')}</td> 
    531  
    532                                         </tr> 
    533  
    534                                         <tr class="prop"> 
    535                                             <td valign="top" class="name">Is Active:</td> 
    536  
    537                                             <td valign="top" class="value">${fieldValue(bean:taskProcedureInstance, field:'isActive')}</td> 
    538  
     515                                            <td valign="top" class="value"> 
     516                                                ${fieldValue(bean:taskProcedureInstance, field:'id')} 
     517                                            </td> 
     518                                        </tr> 
     519 
     520                                        <tr class="prop"> 
     521                                            <td valign="top" class="name">Linked Task:</td> 
     522                                            <td valign="top" class="value"> 
     523                                                <g:link controller="taskDetailed" 
     524                                                                action="show" 
     525                                                                id="${taskProcedureInstance.linkedTask.id}"> 
     526                                                    ${taskProcedureInstance.linkedTask.encodeAsHTML()} 
     527                                                </g:link> 
     528                                            </td> 
     529                                        </tr> 
     530 
     531                                        <tr class="prop"> 
     532                                            <td valign="top" class="name">Linked Asset:</td> 
     533                                            <td valign="top" class="value"> 
     534                                                <g:render template="/shared/assetTreeCompact" model="['assetInstance': taskProcedureInstance.linkedTask.primaryAsset]" /> 
     535                                            </td> 
     536                                        </tr> 
     537 
     538                                        <tr class="prop"> 
     539                                            <td valign="top" class="name">Version:</td> 
     540                                            <td valign="top" class="value"> 
     541                                                    ${fieldValue(bean:taskProcedureInstance, field:'version')} 
     542                                            </td> 
     543                                        </tr> 
     544 
     545                                        <tr class="prop"> 
     546                                            <td valign="top" class="name">Last Updated:</td> 
     547                                            <td valign="top" class="value"> 
     548                                                <g:formatDate date="${taskProcedureInstance.lastUpdated}" 
     549                                                                            format="EEE, dd-MMM-yyyy"/> 
     550                                            </td> 
    539551                                        </tr> 
    540552 
     
    549561                            </div> 
    550562 
     563                            <br /> 
     564 
     565                            <g:if test="${taskProcedureInstance.documentReferences}"> 
     566                                <div class="list"> 
     567                                    <table> 
     568                                        <thead> 
     569                                            <tr> 
     570                                                <th>Document Reference</th> 
     571                                                <th>Location</th> 
     572                                            </tr> 
     573                                        </thead> 
     574                                        <tbody> 
     575                                            <g:each in="${taskProcedureInstance.documentReferences}" status="i" var="docRef"> 
     576                                                <tr class="${(i % 2) == 0 ? 'odd' : 'even'}"> 
     577 
     578                                                    <td valign="top" class="name"> 
     579                                                        ${fieldValue(bean:docRef, field:'name')} 
     580                                                    </td> 
     581 
     582                                                    <td  valign="top" style="text-align:left;" class="value"> 
     583                                                        <custom:easyUrl url="${docRef.location}" /> 
     584                                                    </td> 
     585 
     586                                                </tr> 
     587                                            </g:each> 
     588 
     589                                        </tbody> 
     590                                    </table> 
     591                                </div> 
     592                            </g:if> 
     593 
     594                            <br /> 
     595 
    551596                            <div class="list"> 
    552597                                <table> 
     
    554599                                        <tr> 
    555600                                            <th>Step</th> 
     601                                            <th>Assembly</th> 
    556602                                            <th>Description</th> 
    557                                             <th>Reasoning</th> 
    558                                             <th>Asset</th> 
    559                                             <th>Sub Item</th> 
     603                                            <th>Page Ref</th> 
     604                                            <th>Condition</th> 
    560605                                        </tr> 
    561606                                    </thead> 
     
    569614 
    570615                                                <td  valign="top" style="text-align:left;" class="value"> 
     616                                                    <g:if test="${maintenanceAction.assetSubItem}"> 
     617                                                        ${maintenanceAction.assetSubItem.parentItem?.encodeAsHTML()} 
     618                                                        -- 
     619                                                        ${maintenanceAction.assetSubItem.encodeAsHTML()} 
     620                                                    </g:if> 
     621                                                </td> 
     622 
     623                                                <td  valign="top" style="text-align:left;" class="value"> 
    571624                                                    ${fieldValue(bean:maintenanceAction, field:'description')} 
    572625                                                </td> 
    573626 
    574627                                                <td  valign="top" style="text-align:left;" class="value"> 
    575                                                     ${fieldValue(bean:maintenanceAction, field:'reasoning')} 
     628                                                    ${fieldValue(bean:maintenanceAction, field:'pageRef')} 
    576629                                                </td> 
    577630 
    578631                                                <td  valign="top" style="text-align:left;" class="value"> 
    579                                                     ${fieldValue(bean:maintenanceAction, field:'asset')} 
    580                                                 </td> 
    581  
    582                                                 <td  valign="top" style="text-align:left;" class="value"> 
    583                                                     ${fieldValue(bean:maintenanceAction, field:'assetSubItem')} 
    584632                                                </td> 
    585633 
  • trunk/grails-app/views/taskProcedureDetailed/create.gsp

    r173 r798  
    77        <title>Create TaskProcedure</title> 
    88        <nav:resources override="true"/> 
     9        <g:javascript src="dynamicOneToMany.js" /> 
    910    </head> 
    1011    <body> 
     
    1314        </div> 
    1415        <div class="body"> 
    15             <g:if test="${flash.message}"> 
    16             <div class="message">${flash.message}</div> 
    17             </g:if> 
     16            <g:render template="/shared/messages" /> 
     17 
    1818            <g:hasErrors bean="${taskProcedureInstance}"> 
    19             <div class="errors"> 
    20                 <g:renderErrors bean="${taskProcedureInstance}" as="list" /> 
    21             </div> 
     19                <div class="errors"> 
     20                    <g:renderErrors bean="${taskProcedureInstance}" as="list" /> 
     21                </div> 
    2222            </g:hasErrors> 
     23 
    2324            <g:form action="save" method="post" > 
    24             <input type="hidden" name="taskInstance.id" value="${taskInstance?.id}" /> 
     25                <input type="hidden" name="linkedTask.id" value="${taskProcedureInstance.linkedTask.id}" /> 
    2526 
    26                 <div class="dialog"> 
    27                     <table> 
    28                         <tbody> 
     27                <g:render template="taskProcedure" model="['taskProcedureInstance': taskProcedureInstance]" /> 
    2928 
    30                             <tr class="prop"> 
    31                                 <td valign="top" class="name"> 
    32                                     <label for="name">Name:</label> 
    33                                 </td> 
    34                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'name','errors')}"> 
    35                                     <input type="text"  class="description" maxlength="75" id="name" name="name" value="${fieldValue(bean:taskProcedureInstance,field:'name')}"/> 
    36                                 </td> 
    37                             </tr> 
    38  
    39                             <tr class="prop"> 
    40                                 <td valign="top" class="name"> 
    41                                     <label for="description">Description:</label> 
    42                                 </td> 
    43                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'description','errors')}"> 
    44                                     <input type="text"  class="description" maxlength="100" id="description" name="description" value="${fieldValue(bean:taskProcedureInstance,field:'description')}"/> 
    45                                 </td> 
    46                             </tr> 
    47  
    48                             <tr class="prop"> 
    49                                 <td valign="top" class="name"> 
    50                                     <label for="isActive">Is Active:</label> 
    51                                 </td> 
    52                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'isActive','errors')}"> 
    53                                     <g:checkBox name="isActive" value="${taskProcedureInstance?.isActive}" ></g:checkBox> 
    54                                 </td> 
    55                             </tr> 
    56  
    57                             <g:if test="${taskInstance}"> 
    58                                 <tr class="prop"> 
    59                                     <td valign="top" class="name"> 
    60                                         <label for="taskInstance">Linking with Task:</label> 
    61                                     </td> 
    62                                     <td valign="top" name="taskInstance" class="value"> 
    63                                         ${taskInstance} 
    64                                     </td> 
    65                                 </tr> 
    66                             </g:if> 
    67  
    68                         </tbody> 
    69                     </table> 
    70                 </div> 
    7129                <div class="buttons"> 
    7230                    <span class="button"><input class="save" type="submit" value="Create" /></span> 
     
    7432            </g:form> 
    7533        </div> 
     34        <table style="display:none;"> 
     35            <g:render template="documentReference" model="['docRef': null, 
     36                                                                                                        'i': '_clone']" /> 
     37        </table> 
     38        <table style="display:none;"> 
     39            <g:render template="maintenanceAction" model="['tp': null, 
     40                                                                                                'ma': null, 
     41                                                                                                'i': '_clone', 
     42                                                                                                'assemblies': assemblies]" /> 
     43        </table> 
    7644    </body> 
    7745</html> 
  • trunk/grails-app/views/taskProcedureDetailed/edit.gsp

    r410 r798  
    77        <title>Edit TaskProcedure</title> 
    88        <nav:resources override="true"/> 
     9        <g:javascript src="dynamicOneToMany.js" /> 
    910    </head> 
    1011    <body> 
     
    1314        </div> 
    1415        <div class="body"> 
    15             <g:if test="${flash.message}"> 
    16             <div class="message">${flash.message}</div> 
    17             </g:if> 
     16            <g:render template="/shared/messages" /> 
     17 
    1818            <g:hasErrors bean="${taskProcedureInstance}"> 
    19             <div class="errors"> 
    20                 <g:renderErrors bean="${taskProcedureInstance}" as="list" /> 
    21             </div> 
     19                <div class="errors"> 
     20                    <g:renderErrors bean="${taskProcedureInstance}" as="list" /> 
     21                </div> 
    2222            </g:hasErrors> 
     23 
    2324            <g:form method="post" > 
    2425                <input type="hidden" name="id" value="${taskProcedureInstance?.id}" /> 
    2526                <input type="hidden" name="version" value="${taskProcedureInstance?.version}" /> 
    26                 <div class="dialog"> 
    27                     <table> 
    28                         <tbody> 
    29                          
    30                             <tr class="prop"> 
    31                                 <td valign="top" class="name"> 
    32                                     <label for="name">Name:</label> 
    33                                 </td> 
    34                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'name','errors')}"> 
    35                                     <input type="text"  class="description" maxlength="75" id="name" name="name" value="${fieldValue(bean:taskProcedureInstance,field:'name')}"/> 
    36                                 </td> 
    37                             </tr>  
    38                          
    39                             <tr class="prop"> 
    40                                 <td valign="top" class="name"> 
    41                                     <label for="description">Description:</label> 
    42                                 </td> 
    43                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'description','errors')}"> 
    44                                     <input type="text"  class="description" maxlength="100" id="description" name="description" value="${fieldValue(bean:taskProcedureInstance,field:'description')}"/> 
    45                                 </td> 
    46                             </tr>  
    47                          
    48                             <tr class="prop"> 
    49                                 <td valign="top" class="name"> 
    50                                     <label for="isActive">Is Active:</label> 
    51                                 </td> 
    52                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'isActive','errors')}"> 
    53                                     <g:checkBox name="isActive" value="${taskProcedureInstance?.isActive}" ></g:checkBox> 
    54                                 </td> 
    55                             </tr>  
    56                          
    57                             <tr class="prop"> 
    58                                 <td valign="top" class="name"> 
    59                                     <label for="maintenanceActions">Maintenance Actions:</label> 
    60                                 </td> 
    61                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'maintenanceActions','errors')}"> 
    62                                      
    63 <ul> 
    64 <g:each var="m" in="${taskProcedureInstance?.maintenanceActions?}"> 
    65     <li><g:link controller="maintenanceActionDetailed" action="show" id="${m.id}">${m?.encodeAsHTML()}</g:link></li> 
    66 </g:each> 
    67 </ul> 
    68 <g:link controller="maintenanceActionDetailed" params="['taskProcedure.id':taskProcedureInstance?.id]" action="create">+Add MaintenanceAction</g:link> 
    6927 
    70                                 </td> 
    71                             </tr>  
    72                          
    73                             <tr class="prop"> 
    74                                 <td valign="top" class="name"> 
    75                                     <label for="tasks">Tasks:</label> 
    76                                 </td> 
    77                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'tasks','errors')}"> 
    78                                      
    79 <ul> 
    80 <g:each var="t" in="${taskProcedureInstance?.tasks?}"> 
    81     <li><g:link controller="taskDetailed" action="show" id="${t.id}">${t?.encodeAsHTML()}</g:link></li> 
    82 </g:each> 
    83 </ul> 
    84 <g:link controller="taskDetailed" params="['taskProcedure.id':taskProcedureInstance?.id]" action="create">+Add Task</g:link> 
     28                <g:render template="taskProcedure" model="['taskProcedureInstance': taskProcedureInstance]" /> 
    8529 
    86                                 </td> 
    87                             </tr>  
    88                          
    89                         </tbody> 
    90                     </table> 
    91                 </div> 
    9230                <div class="buttons"> 
    9331                    <span class="button"><g:actionSubmit class="save" value="Update" /></span> 
     32                    <span class="button"><g:actionSubmit class="cancel" value="Cancel" action="Show"/></span> 
    9433                    <span class="button"><g:actionSubmit class="delete" onclick="return confirm('Are you sure?');" value="Delete" /></span> 
    9534                </div> 
    9635            </g:form> 
    9736        </div> 
     37        <table style="display:none;"> 
     38            <g:render template="documentReference" model="['docRef': null, 
     39                                                                                                        'i': '_clone']" /> 
     40        </table> 
     41        <table style="display:none;"> 
     42            <g:render template="maintenanceAction" model="['tp': null, 
     43                                                                                                'ma': null, 
     44                                                                                                'i': '_clone', 
     45                                                                                                'assemblies': assemblies]" /> 
     46        </table> 
    9847    </body> 
    9948</html> 
  • trunk/grails-app/views/taskProcedureDetailed/list.gsp

    r467 r798  
    3737                        <thead> 
    3838                            <tr> 
    39                              
     39 
    4040                                <g:sortableColumn property="id" title="Id"  params="${filterParams}" /> 
    41                              
    42                                 <g:sortableColumn property="name" title="Name"  params="${filterParams}" /> 
    43                              
    44                                 <g:sortableColumn property="description" title="Description"  params="${filterParams}" /> 
    45                              
    46                                 <g:sortableColumn property="isActive" title="Is Active"  params="${filterParams}" /> 
     41                                <th>Description</th> 
     42                                <th>Asset</th> 
    4743 
    4844                                <th></th> 
    49                              
     45 
    5046                            </tr> 
    5147                        </thead> 
     
    5349                        <g:each in="${taskProcedureInstanceList}" status="i" var="taskProcedureInstance"> 
    5450                            <tr class="${(i % 2) == 0 ? 'clickableOdd' : 'clickableEven'}" onclick='window.location = "${request.getContextPath()}/taskProcedureDetailed/show/${taskProcedureInstance.id}"'/> 
    55                              
     51 
    5652                                <td>${fieldValue(bean:taskProcedureInstance, field:'id')}</td> 
    57                              
    58                                 <td>${fieldValue(bean:taskProcedureInstance, field:'name')}</td> 
    59                              
    60                                 <td>${fieldValue(bean:taskProcedureInstance, field:'description')}</td> 
    61                              
    62                                 <td>${fieldValue(bean:taskProcedureInstance, field:'isActive')}</td> 
    63                                  
     53 
     54                                <td>${taskProcedureInstance.description.encodeAsHTML()}</td> 
     55 
     56                                <td>${taskProcedureInstance.asset?.encodeAsHTML()}</td> 
     57 
    6458                                <td> 
    6559                                    <g:link action="show" id="${taskProcedureInstance.id}"> 
     
    6761                                    </g:link> 
    6862                                </td> 
    69                              
     63 
    7064                            </tr> 
    7165                        </g:each> 
     
    8377                                    action="list" 
    8478                                    class="overlayPane" 
    85                                     excludeProperties="" /> 
     79                                    additionalProperties="id" 
     80                                    excludeProperties="" 
     81                                    associatedProperties="linkedTask.description" /> 
    8682        </div> 
    8783    </body> 
  • trunk/web-app/css/main.css

    r729 r798  
    690690div.static_tree { 
    691691} 
     692div.static_tree_compact { 
     693    height:10em; 
     694    width:100%; 
     695    overflow:auto; 
     696} 
    692697div.static_tree ul { 
    693698    list-style-type: none; 
  • trunk/web-app/js/jsUtil.js

    r714 r798  
    119119    } 
    120120} 
     121 
     122function openWindow(url) { 
     123    window.open(url); 
     124}