Changeset 770


Ignore:
Timestamp:
02/02/11 20:38:20 (8 years ago)
Author:
gav
Message:

Domain change, improved draft of creating taskProcedure dynamic form.

Location:
branches/features/taskProcedureRework/grails-app
Files:
2 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • branches/features/taskProcedureRework/grails-app/controllers/TaskProcedureDetailedController.groovy

    r762 r770  
    4040 
    4141        if(!taskProcedureInstance) { 
    42             flash.message = "TaskProcedure not found with id ${params.id}" 
    43             redirect(action:list) 
    44         } 
    45         else { return [ taskProcedureInstance : taskProcedureInstance ] } 
     42            flash.errorMessage = "TaskProcedure not found with id ${params.id}" 
     43            redirect(controller:'taskDetailed', action:'search') 
     44            return 
     45        } 
     46 
     47        redirect(controller:'taskDetailed', 
     48                        action:'show', 
     49                        id:taskProcedureInstance.linkedTask?.id, 
     50                        params:[showTab:"showProcedureTab"]) 
    4651    } 
    4752 
     
    4954        def taskProcedureInstance = TaskProcedure.get( params.id ) 
    5055        if(taskProcedureInstance) { 
     56            def taskInstance = taskProcedureInstance.linkedTask 
    5157            try { 
    5258                taskProcedureInstance.tasks.each { 
     
    5561                taskProcedureInstance.delete(flush:true) 
    5662                flash.message = "TaskProcedure ${params.id} deleted" 
    57                 redirect(action:list) 
     63                redirect(controller:'taskDetailed', 
     64                                action:'show', 
     65                                id:taskInstance.id, 
     66                                params:[showTab:"showProcedureTab"]) 
    5867            } 
    5968            catch(org.springframework.dao.DataIntegrityViolationException e) { 
    6069                flash.message = "TaskProcedure ${params.id} could not be deleted" 
    61                 redirect(action:show,id:params.id) 
     70                redirect(controller:'taskDetailed', 
     71                                action:'show', 
     72                                id:taskInstance.id, 
     73                                params:[showTab:"showProcedureTab"]) 
    6274            } 
    6375        } 
     
    99111            taskProcedureInstance.properties = params 
    100112 
    101             def toBeDeleted = taskProcedureInstance.maintenanceActions.findAll {it.deleted} 
    102             if(toBeDeleted) { 
     113            // Gaps in the html index's can be created by adding 2 items and removing the first one. 
     114            // This creates a gap at the missing index where LazyList will return a null. 
     115            def nullMaintenanceActions = taskProcedureInstance.maintenanceActions.findAll {!it} 
     116            if (nullMaintenanceActions) { 
     117                taskProcedureInstance.maintenanceActions.removeAll(nullMaintenanceActions) 
     118            } 
     119 
     120            // Save for restoration if validation fails. 
     121            def savedMaintenanceActions = new ArrayList(taskProcedureInstance.maintenanceActions) 
     122 
     123            // Remove toBeDeleted before validation. 
     124            def toBeDeleted = taskProcedureInstance.maintenanceActions.findAll {it.toBeDeleted} 
     125            if (toBeDeleted) { 
    103126                taskProcedureInstance.maintenanceActions.removeAll(toBeDeleted) 
    104127            } 
     
    106129            if(!taskProcedureInstance.hasErrors() && taskProcedureInstance.save(flush: true)) { 
    107130                flash.message = "TaskProcedure ${params.id} updated" 
    108                 redirect(action:show,id:taskProcedureInstance.id) 
     131                redirect(controller:'taskDetailed', 
     132                                action:'show', 
     133                                id:taskProcedureInstance.linkedTask.id, 
     134                                params:[showTab:"showProcedureTab"]) 
    109135            } 
    110136            else { 
     137                // Restore the saved items, some of which contain toBeDeleted flags but 
     138                // have not been deleted yet since validation failed. 
     139                // The toBeDeleted items are hidden in the view. 
     140                taskProcedureInstance.maintenanceActions = savedMaintenanceActions 
     141                // Populate maintenanceAction errors for display. 
     142                taskProcedureInstance.maintenanceActions.each { it.validate() } 
    111143                render(view:'edit',model:[taskProcedureInstance:taskProcedureInstance]) 
    112144            } 
     
    119151 
    120152    def create = { 
    121         if(params.taskInstance?.id) { 
    122             def taskInstance = Task.get(params.taskInstance.id) 
    123  
    124             def taskProcedureInstance = new TaskProcedure() 
    125             taskProcedureInstance.properties = params 
    126             return ['taskProcedureInstance':taskProcedureInstance, 
    127                             taskInstance: taskInstance] 
    128         } else { 
    129             flash.message = "Please select or create a task, then go to the Procedure tab." 
     153 
     154        if(!params.taskInstance?.id) { 
     155            flash.errorMessage = "Please select or create a task, then go to the Procedure tab." 
    130156            redirect(controller:"taskDetailed", action:"search") 
    131         } 
     157            return 
     158        } 
     159 
     160        params.linkedTask = Task.get(params.taskInstance.id) 
     161 
     162        if(!params.linkedTask?.primaryAsset) { 
     163            flash.errorMessage = "Please set a Primary Asset first, then go to the Procedure tab." 
     164            redirect(controller:"taskDetailed", action:"show", id:params.linkedTask?.id) 
     165            return 
     166        } 
     167 
     168        def taskProcedureInstance = new TaskProcedure() 
     169        taskProcedureInstance.properties = params 
     170        return ['taskProcedureInstance':taskProcedureInstance] 
    132171    } 
    133172 
     
    136175        def taskInstance = Task.get(params.linkedTask.id) 
    137176 
     177        // Gaps in the html index's can be created by adding 2 items and removing the first one. 
     178        // This creates a gap at the missing index where LazyList will return a null. 
     179        def nullMaintenanceActions = taskProcedureInstance.maintenanceActions.findAll {!it} 
     180        if (nullMaintenanceActions) { 
     181            taskProcedureInstance.maintenanceActions.removeAll(nullMaintenanceActions) 
     182        } 
     183 
    138184        if(!taskProcedureInstance.hasErrors() && taskProcedureInstance.save(flush: true)) { 
    139             taskProcedureInstance.addToTasks(taskInstance) // also sets: taskInstance.taskProcedure = taskProcedureInstance 
     185             // Also sets: taskInstance.taskProcedure = taskProcedureInstance 
     186            taskProcedureInstance.addToTasks(taskInstance) 
    140187            flash.message = "TaskProcedure ${taskProcedureInstance.id} created." 
    141             redirect(action:show,id:taskProcedureInstance.id) 
    142         } 
    143         else { 
    144             render(view:'create',model:[taskProcedureInstance:taskProcedureInstance, taskInstance: taskInstance]) 
    145         } 
    146     } 
     188            redirect(controller:'taskDetailed', 
     189                            action:'show', 
     190                            id:taskProcedureInstance.linkedTask.id, 
     191                            params:[showTab:"showProcedureTab"]) 
     192        } 
     193        else { 
     194            // Populate maintenanceAction errors for display. 
     195            taskProcedureInstance.maintenanceActions.each { it.validate() } 
     196            render(view:'create',model:[taskProcedureInstance:taskProcedureInstance]) 
     197        } 
     198    } 
     199 
    147200} 
  • branches/features/taskProcedureRework/grails-app/domain/MaintenanceAction.groovy

    r769 r770  
    1111    Integer procedureStepNumber 
    1212 
    13     Boolean deleted 
    14     static transients = [ 'deleted' ] 
     13    Boolean toBeDeleted 
     14    Boolean isNew 
     15    static transients = [ 'toBeDeleted', 'isNew' ] 
    1516 
    1617//     static hasMany = [] 
  • branches/features/taskProcedureRework/grails-app/views/taskDetailed/show.gsp

    r762 r770  
    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">Linked Task:</td> 
    522                             <td valign="top" class="value"> 
    523                                 <g:link controller="taskDetailed" action="show" id="${taskProcedureInstance.linkedTask.id}"> 
    524                                     ${taskProcedureInstance.linkedTask.encodeAsHTML()} 
    525                                 </g:link> 
    526                             </td> 
    527                         </tr> 
     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                                                ${fieldValue(bean:taskProcedureInstance, field:'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> 
    528544 
    529545                                    </tbody> 
     
    542558                                        <tr> 
    543559                                            <th>Step</th> 
     560                                            <th>Sub Item</th> 
    544561                                            <th>Description</th> 
    545562                                            <th>Reasoning</th> 
    546                                             <th>Sub Item</th> 
    547563                                        </tr> 
    548564                                    </thead> 
     
    556572 
    557573                                                <td  valign="top" style="text-align:left;" class="value"> 
     574                                                    ${fieldValue(bean:maintenanceAction, field:'assetSubItem')} 
     575                                                </td> 
     576 
     577                                                <td  valign="top" style="text-align:left;" class="value"> 
    558578                                                    ${fieldValue(bean:maintenanceAction, field:'description')} 
    559579                                                </td> 
     
    561581                                                <td  valign="top" style="text-align:left;" class="value"> 
    562582                                                    ${fieldValue(bean:maintenanceAction, field:'reasoning')} 
    563                                                 </td> 
    564  
    565                                                 <td  valign="top" style="text-align:left;" class="value"> 
    566                                                     ${fieldValue(bean:maintenanceAction, field:'assetSubItem')} 
    567583                                                </td> 
    568584 
  • branches/features/taskProcedureRework/grails-app/views/taskProcedureDetailed/_maintenanceActions.gsp

    r762 r770  
    11<script type="text/javascript"> 
    22    var childCount = ${taskProcedureInstance?.maintenanceActions.size()} + 0; 
     3    var ma_wrapperId = "ma_wrapper"; 
     4    var ma_cloneId = "maintenanceActionLazyList_clone"; 
     5    var ma_lazyList = "maintenanceActionLazyList"; 
     6    var ma_fields = ["toBeDeleted", "isNew", "description", "reasoning", "assetSubItem.id", "procedureStepNumber"]; 
     7    var ma_focusField = "procedureStepNumber"; 
    38 
    4     function addChild() { 
    5         var htmlId = "maintenanceAction" + childCount; 
    6         var deleteIcon = "${resource(dir:'images/skin', file:'database_delete.png')}"; 
    7         var templateHtml = "<div id='" + htmlId + "' name='" + htmlId + "'>\n"; 
    8         templateHtml += "<input type='text' id='maintenanceActionLazyList[" + childCount + "].description' name='maintenanceActionLazyList[" + childCount + "].description' />\n"; 
    9         templateHtml += "<span onClick='jQuery(\"#" + htmlId + "\").remove();'><img src='" + deleteIcon + "' /></span>\n"; 
    10         templateHtml += "</div>\n"; 
    11         jQuery("#childList").append(templateHtml); 
     9 
     10    function addChild(wrapperId, cloneId, lazyList, fields, focusField){ 
     11 
     12        var clone = jQuery("#"+cloneId).clone(); 
     13        clone.attr('id', lazyList+childCount); 
     14        var htmlId = lazyList+'['+childCount+'].'; 
     15 
     16        var fieldsMap = {}; 
     17        jQuery.each(fields, function(index, field) { 
     18            fieldsMap[field] = clone.find('[id$="'+field+'"]'); 
     19            fieldsMap[field].attr('id',htmlId + field) 
     20                                        .attr('name',htmlId + field); 
     21            if(field == 'isNew') { 
     22                fieldsMap[field].attr('value', 'true'); 
     23            } 
     24        }); 
     25 
     26        jQuery("#"+wrapperId).append(clone); 
     27        clone.show(); 
     28        fieldsMap[focusField].focus(); 
    1229        childCount++; 
    1330    } 
     31 
     32    // Click event on add button. 
     33    jQuery('.add-ma').live('click', function() { 
     34            addChild(ma_wrapperId, ma_cloneId, ma_lazyList, ma_fields, ma_focusField); 
     35    }); 
     36 
     37    // Click event on delete buttons. 
     38    jQuery('.del-ma').live('click', function() { 
     39        //find the parent div 
     40        var prnt = jQuery(this).parents(".ma-div"); 
     41        //find the deleted hidden input 
     42        var delInput = prnt.find("input[id$=toBeDeleted]"); 
     43        //check if this is still not persisted 
     44        var newValue = prnt.find("input[id$=isNew]").attr('value'); 
     45        //if it is new then i can safely remove from dom 
     46        if(newValue == 'true'){ 
     47            prnt.remove(); 
     48        }else{ 
     49            //set the deletedFlag to true 
     50            delInput.attr('value','true'); 
     51            //hide the div 
     52            prnt.hide(); 
     53        } 
     54    }); 
     55 
     56    jQuery(window).load(function() { 
     57        if(childCount == 0) { 
     58            addChild(ma_wrapperId, ma_cloneId, ma_lazyList, ma_fields, ma_focusField); 
     59        } 
     60    }); 
     61 
    1462</script> 
    1563 
    16 <div id="childList"> 
    17     <g:each var="ma" in="${taskProcedureInstance.maintenanceActions}" status="i"> 
    18         <div id="maintenanceAction${i}"> 
    19             <g:hiddenField name='maintenanceActionLazyList[${i}].id' value='${ma.id}'/> 
    20             <g:textField name='maintenanceActionLazyList[${i}].description' value='${ma.description}'/> 
    21             <input type="hidden" name='maintenanceActionLazyList[${i}].deleted' id='maintenanceActionLazyList[${i}].deleted' value='false'/> 
    22             <span onClick="jQuery('#maintenanceActionLazyList\\[${i}\\]\\.deleted').val('true'); jQuery('#maintenanceAction${i}').hide()"> 
    23                 <img src="${resource(dir:'images/skin', file:'database_delete.png')}" /> 
    24             </span> 
    25         </div> 
    26     </g:each> 
    27 </div> 
    28 <input type="button" value="Add MaintenanceAction" onclick="addChild();" /> 
     64 
     65 
     66    <div> 
     67        <table> 
     68            <thead> 
     69                <tr> 
     70 
     71                    <th>Step</th> 
     72                    <th>Sub Item</th> 
     73                    <th>Description</th> 
     74                    <th>Reasoning</th> 
     75                    <th></th> 
     76 
     77                </tr> 
     78            </thead> 
     79            <tbody id="ma_wrapper"> 
     80                    <g:each var="ma" in="${taskProcedureInstance.maintenanceActions}" status="i"> 
     81                            <g:render template="maintenanceAction" model="['tp':taskProcedureInstance, 'ma': ma, 'i':i]" /> 
     82                    </g:each> 
     83                    </tr> 
     84            </tbody> 
     85        </table> 
     86    </div> 
     87 
     88    <br /> 
     89 
     90    <div style="text-align:right;"> 
     91        <span class="buttons add-ma"> 
     92            <input type="button" class="add" value="Add MaintenanceAction" /> 
     93        </span> 
     94    </div> 
  • branches/features/taskProcedureRework/grails-app/views/taskProcedureDetailed/create.gsp

    r762 r770  
    1313        </div> 
    1414        <div class="body"> 
    15             <g:if test="${flash.message}"> 
    16             <div class="message">${flash.message}</div> 
    17             </g:if> 
     15            <g:render template="/shared/messages" /> 
     16 
    1817            <g:hasErrors bean="${taskProcedureInstance}"> 
    19             <div class="errors"> 
    20                 <g:renderErrors bean="${taskProcedureInstance}" as="list" /> 
    21             </div> 
     18                <div class="errors"> 
     19                    <g:renderErrors bean="${taskProcedureInstance}" as="list" /> 
     20                </div> 
    2221            </g:hasErrors> 
    2322 
    2423            <g:form action="save" method="post" > 
    25             <input type="hidden" name="linkedTask.id" value="${taskInstance.id}" /> 
     24                <input type="hidden" name="linkedTask.id" value="${taskProcedureInstance.linkedTask.id}" /> 
    2625 
    27                 <div class="dialog"> 
    28                     <table> 
    29                         <tbody> 
     26                <g:render template="taskProcedure" model="['taskProcedureInstance': taskProcedureInstance]" /> 
    3027 
    31                             <tr class="prop"> 
    32                                 <td valign="top" class="name"> 
    33                                     <label for="taskInstance">Parent Task:</label> 
    34                                 </td> 
    35                                 <td valign="top" name="taskInstance" class="value"> 
    36                                     <g:link controller="taskDetailed" action="show" id="${taskInstance.id}"> 
    37                                         ${taskInstance.encodeAsHTML()} 
    38                                     </g:link> 
    39                                 </td> 
    40                             </tr> 
    41  
    42                             <tr class="prop"> 
    43                                 <td valign="top" class="name"> 
    44                                     <label for="maintenanceActions">Maintenance Actions:</label> 
    45                                 </td> 
    46                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'maintenanceActions','errors')}"> 
    47                                     <g:render template="maintenanceActions" model="['taskProcedureInstance': taskProcedureInstance]" /> 
    48                                 </td> 
    49                             </tr> 
    50  
    51                         </tbody> 
    52                     </table> 
    53                 </div> 
    5428                <div class="buttons"> 
    5529                    <span class="button"><input class="save" type="submit" value="Create" /></span> 
     
    5731            </g:form> 
    5832        </div> 
     33        <table style="display:none;"> 
     34            <g:render template="maintenanceAction" model="['tp': null, 'ma': null, 'i': '_clone']" /> 
     35        </table> 
    5936    </body> 
    6037</html> 
  • branches/features/taskProcedureRework/grails-app/views/taskProcedureDetailed/edit.gsp

    r762 r770  
    1313        </div> 
    1414        <div class="body"> 
    15             <g:if test="${flash.message}"> 
    16             <div class="message">${flash.message}</div> 
    17             </g:if> 
     15            <g:render template="/shared/messages" /> 
     16 
    1817            <g:hasErrors bean="${taskProcedureInstance}"> 
    19             <div class="errors"> 
    20                 <g:renderErrors bean="${taskProcedureInstance}" as="list" /> 
    21             </div> 
     18                <div class="errors"> 
     19                    <g:renderErrors bean="${taskProcedureInstance}" as="list" /> 
     20                </div> 
    2221            </g:hasErrors> 
     22 
    2323            <g:form method="post" > 
    2424                <input type="hidden" name="id" value="${taskProcedureInstance?.id}" /> 
    2525                <input type="hidden" name="version" value="${taskProcedureInstance?.version}" /> 
    26                 <div class="dialog"> 
    27                     <table> 
    28                         <tbody> 
    2926 
    30                             <tr class="prop"> 
    31                                 <td valign="top" class="name">Id:</td> 
    32                                 <td valign="top" class="value">${fieldValue(bean:taskProcedureInstance, field:'id')}</td> 
    33                             </tr> 
     27                <g:render template="taskProcedure" model="['taskProcedureInstance': taskProcedureInstance]" /> 
    3428 
    35                             <tr class="prop"> 
    36                                 <td valign="top" class="name"> 
    37                                     <label for="taskInstance">Linked Task:</label> 
    38                                 </td> 
    39                                 <td valign="top" name="taskInstance" class="value"> 
    40                                     <g:link controller="taskDetailed" action="show" id="${taskProcedureInstance.linkedTask.id}"> 
    41                                         ${taskProcedureInstance.linkedTask.encodeAsHTML()} 
    42                                     </g:link> 
    43                                 </td> 
    44                             </tr> 
    45  
    46                             <tr class="prop"> 
    47                                 <td valign="top" class="name"> 
    48                                     <label for="maintenanceActions">Maintenance Actions:</label> 
    49                                 </td> 
    50  
    51                                 <td valign="top" class="value ${hasErrors(bean:taskProcedureInstance,field:'maintenanceActions','errors')}"> 
    52                                     <g:render template="maintenanceActions" model="['taskProcedureInstance': taskProcedureInstance]" /> 
    53                                 </td> 
    54                             </tr> 
    55  
    56                         </tbody> 
    57                     </table> 
    58                 </div> 
    5929                <div class="buttons"> 
    6030                    <span class="button"><g:actionSubmit class="save" value="Update" /></span> 
     
    6333            </g:form> 
    6434        </div> 
     35        <table style="display:none;"> 
     36            <g:render template="maintenanceAction" model="['tp': null, 'ma': null, 'i': '_clone']" /> 
     37        </table> 
    6538    </body> 
    6639</html> 
Note: See TracChangeset for help on using the changeset viewer.