Changeset 1182

Show
Ignore:
Timestamp:
22-11-10 17:27:23 (3 years ago)
Author:
robert@…
Message:

Improved file upload fields so users can delete existing files and are able to access uploaded files (using a tag in the tag library). See ticket #17

Location:
trunk
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/dbnp/studycapturing/FileController.groovy

    r959 r1182  
    2323     */ 
    2424    def get = { 
    25         // Check whether the file exists 
    26         def filename = params.id; 
    2725        def fileExists; 
     26 
     27                // Filename is not url decoded for some reason 
     28                def coder = new org.apache.commons.codec.net.URLCodec() 
     29                def filename = coder.decode(params.id) 
     30 
     31                // Security check to prevent accessing files in other directories 
     32                if( filename.contains( '..' ) ) { 
     33                        response.status = 500; 
     34                        render "Invalid filename given"; 
     35                        return; 
     36                } 
     37                 
    2838        try { 
    2939            fileExists = fileService.fileExists( filename ) 
     
    3343        if( !filename || !fileExists ) { 
    3444            response.status = 404; 
    35             render( "" ); 
     45            render( "File not found" ); 
    3646            return; 
    3747        } 
     
    4252 
    4353        // Return the file 
     54                response.setHeader "Content-disposition", "attachment; filename=${filename}" 
    4455        response.outputStream << file.newInputStream() 
     56                response.outputStream.flush() 
    4557    } 
    4658 
     
    7385        } 
    7486    } 
     87 
     88 
    7589} 
  • trunk/grails-app/domain/dbnp/studycapturing/TemplateEntity.groovy

    r1175 r1182  
    450450                        return getStore(field.type)[fieldName] 
    451451                } 
    452  
    453452        } 
    454453 
     
    549548                // Magic setter for files: handle values for file fields 
    550549                // 
    551                 // If NULL is given, the field value is emptied and the old file is removed 
     550                // If NULL is given or "*deleted*", the field value is emptied and the old file is removed 
    552551                // If an empty string is given, the field value is kept as was 
    553552                // If a file is given, it is moved to the right directory. Old files are deleted. If 
     
    559558                        def currentFile = getFieldValue(field.name); 
    560559 
    561                         if (value == null) { 
     560                        if (value == null || ( value.class == String && value == '*deleted*' ) ) { 
    562561                                // If NULL is given, the field value is emptied and the old file is removed 
    563562                                value = ""; 
  • trunk/grails-app/taglib/dbnp/studycapturing/WizardTagLib.groovy

    r1166 r1182  
    793793                out << '<input type="hidden" name="' + attrs.name + '" id="' + attrs.name + '" value="' + attrs.value + '">'; 
    794794                out << '<div id="' + attrs.name + 'Example" class="upload_info"></div>'; 
     795                out << '<a id="' + attrs.name + 'Delete" class="upload_del" href="#" onClick="if( confirm( \'Are you sure to delete this file?\' ) ) { deleteFile( \'' + attrs.name + '\' ); } return false;"><img src="' + resource( dir: 'images/icons', file: 'delete.png', plugin: 'famfamfam' ) + '"></a>'; 
    795796                out << '<script type="text/javascript">'; 
    796797                out << '  $(document).ready( function() { '; 
     
    798799                out << '    fileUploadField( "' + attrs.name + '" );'; 
    799800                out << '    if( filename != "" ) {'; 
     801                out << '      $("#' + attrs.name + 'Delete").show();'; 
    800802                out << '      $("#' + attrs.name + 'Example").html("Current file: " + createFileHTML( filename ) )'; 
    801803                out << '    }'; 
     
    14321434        } 
    14331435 
     1436        def showTemplateField = { attrs, body -> 
     1437                def field = attrs.get( 'field' ); 
     1438                def entity = attrs.get( 'entity' ); 
     1439                def fieldName = ''; 
     1440                def fieldType = ''; 
     1441                 
     1442                if( entity ) { 
     1443                        if( field instanceof String ) { 
     1444                                fieldName = field; 
     1445                                fieldType = ''; 
     1446                        } else if( field instanceof TemplateField ) { 
     1447                                fieldName = field.name 
     1448                                fieldType = field.type.toString(); 
     1449                        } else { 
     1450                                return; 
     1451                        } 
     1452 
     1453                        def value = entity.getFieldValue( fieldName ); 
     1454 
     1455                        if( fieldType == 'FILE' && value != "" ) { 
     1456                          out << '<a href="' + g.createLink( controller: "file", action: "get",  id: value ) + '">' + value + '</a>'; 
     1457                        } else { 
     1458                                out << value; 
     1459                        } 
     1460 
     1461                } 
     1462        } 
     1463 
    14341464} 
  • trunk/grails-app/views/study/show.gsp

    r1036 r1182  
    242242                    <td> 
    243243                                          <g:if test="${studyInstance.fieldExists(field.name)}"> 
    244                                                 ${studyInstance.getFieldValue(field.name)} 
     244                                                <wizard:showTemplateField field="${field}" entity="${studyInstance}" /> 
    245245                                          </g:if> 
    246246                                          <g:else> 
     
    411411                    </g:if> 
    412412                    <g:each in="${subject.giveDomainFields()}" var="field"> 
    413                       <td>${subject.getFieldValue(field.name)}</td> 
     413                      <td><wizard:showTemplateField field="${field}" entity="${subject}" /></td> 
    414414                    </g:each> 
    415415                   
     
    417417                      <td> 
    418418                        <g:if test="${subject.fieldExists(field.name)}"> 
    419                           ${subject.getFieldValue(field.name)} 
     419                                <wizard:showTemplateField field="${field}" entity="${subject}" /> 
    420420                        </g:if> 
    421421                        <g:else> 
     
    495495                          <g:if test="${event.getFieldValue(field.name)}"> 
    496496                            <g:if test="${fieldCounter > 1}">, </g:if> 
    497                               ${field.name} = ${event.getFieldValue( field.name )} 
     497                              ${field.name} = <wizard:showTemplateField field="${field}" entity="${event}" /> 
    498498                            <g:set var="fieldCounter" value="${fieldCounter + 1}" /> 
    499499                          </g:if> 
     
    583583                              <g:if test="${event.getFieldValue(field.name)}"> 
    584584                                <g:if test="${fieldCounter > 1}">, </g:if> 
    585                                   ${field.name} = ${event.getFieldValue( field.name )} 
     585                                  ${field.name} = <wizard:showTemplateField field="${field}" entity="${event}" /> 
    586586                                <g:set var="fieldCounter" value="${fieldCounter + 1}" /> 
    587587                              </g:if> 
     
    744744                          <td>${sample.parentEvent?.template?.name} at ${sample.parentEvent?.getStartTimeString()}</td> 
    745745                    <g:each in="${sample.giveDomainFields()}" var="field"> 
    746                       <td>${sample.getFieldValue(field.name)}</td> 
     746                      <td><wizard:showTemplateField field="${field}" entity="${sample}" /></td> 
    747747                    </g:each> 
    748748 
     
    750750                      <td> 
    751751                        <g:if test="${sample.fieldExists(field.name)}"> 
    752                           ${sample.getFieldValue(field.name)} 
     752                          <wizard:showTemplateField field="${field}" entity="${sample}" /> 
    753753                        </g:if> 
    754754                        <g:else> 
  • trunk/web-app/css/wizard.css

    r980 r1182  
    381381    margin-left: 5px;  
    382382} 
     383 
     384#content .wizard .upload_info a { 
     385        text-decoration: underline; 
     386} 
     387 
     388.wizard .upload_del img { 
     389        border-width: 0; 
     390        padding-left: 6px;  
     391} 
     392 
     393.wizard .upload_del { 
     394        display: none; 
     395} 
     396 
    383397.wizard .upload_info .error { 
    384398    color: red; 
  • trunk/web-app/js/wizard.js

    r1040 r1182  
    372372                    // Give feedback to the user 
    373373                    $('#' + field_id + 'Example').html('Uploading ' + createFileHTML( file )); 
    374  
     374                    $('#' + field_id + 'Delete').hide(); 
    375375 
    376376                }, 
     
    379379                        $('#' + field_id).val( '' ); 
    380380                        $('#' + field_id + 'Example').html('<span class="error">Error uploading ' + createFileHTML( file ) + '</span>' ); 
     381                            $('#' + field_id + 'Delete').hide(); 
    381382                    } else { 
    382383                        $('#' + field_id).val( response ); 
    383384                        $('#' + field_id + 'Example').html('Uploaded ' + createFileHTML( file ) ); 
     385                            $('#' + field_id + 'Delete').show(); 
    384386                    } 
    385387                } 
    386388        }); 
     389} 
     390 
     391function deleteFile( field_id ) { 
     392        $('#' + field_id).val( '*deleted*' ); 
     393        $('#' + field_id + 'Example').html('File deleted' ); 
     394        $('#' + field_id + 'Delete').hide(); 
    387395} 
    388396