Changeset 72


Ignore:
Timestamp:
Jun 18, 2011, 10:23:22 PM (8 years ago)
Author:
robert@…
Message:

Implemented addition of logfiles to sequence data

Location:
trunk
Files:
2 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/grails-app/controllers/nl/tno/massSequencing/files/FileController.groovy

    r49 r72  
    9191               
    9292                // Search for the file in the sequenceData file fields
    93                 def sd = SequenceData.findBySequenceFileOrQualityFile( filename, filename );
     93                def sd = SequenceData.executeQuery( "FROM SequenceData WHERE sequenceFile = :file OR qualityFile = :file OR logFile = :file", [ "file": filename ]);
    9494                if( sd ) {
    95                         if( sd.sample?.sample?.study?.canRead( session.user ) ) {
     95                        if( sd[0].sample?.sample?.study?.canRead( session.user ) ) {
    9696                                return true;
    9797                        } else {
  • trunk/grails-app/controllers/nl/tno/massSequencing/files/ImportController.groovy

    r70 r72  
    148148                   httpSession.process[ processId ].processedFiles = [ parsed: parsedFiles,  matched: matchedFiles, notMatched: notMatchedFiles ];
    149149                   
     150                   // Check whether quality, classification or logfiles have been added
     151                   def types = [ "fasta", "qual", "taxonomy", "logfile" ];
     152                   def typesExist = [:]
     153                   types.each { type -> typesExist[ type ] = parsedFiles.success.any { it.type == type } }
     154                   
     155                   httpSession.process[ processId ].fileTypes = typesExist
     156                   
    150157                   // Tell the frontend we are finished
    151158                   httpSession.progress[ processId ].finished = true;
     
    203210                        matchedFiles: session.process[ processId ].processedFiles.matched,
    204211                        remainingClassificationFiles: extraClassifications,
     212                        existingTypes: session.process[ processId ].fileTypes,
    205213                        selectedRun: params.selectedRun ]
    206214        }
     
    333341                                numQualFiles: fastaReturn.numQualFiles,
    334342                                numClassificationFiles: fastaReturn.numClassificationFiles,
     343                                numLogFiles: fastaReturn.numLogFiles,
    335344                                numExtraClassificationFiles: classificationReturn.numExtraClassifications,
    336345                                numTotal: fastaReturn.numSequenceFiles + classificationReturn.numExtraClassifications,
     
    357366                int numQualFiles = 0;
    358367                int numClassificationFiles = 0;
     368                int numLogFiles = 0;
    359369                def samplesClassified = [];
    360370                def errors = [];
     
    368378                                if( fileService.fileExists( filevalue.fasta ) ) {
    369379                                        try {
    370                                                 def permanent = fastaService.savePermanent( filevalue.fasta, filevalue.qual, processedFiles );
     380                                                def permanent = fastaService.savePermanent( filevalue.fasta, filevalue.qual, filevalue.logfile, processedFiles );
    371381                                               
    372382                                                // Save the data into the database
     
    375385                                                sd.sequenceFile = permanent.fasta
    376386                                                sd.qualityFile = permanent.qual
     387                                                sd.logFile = permanent.logfile
    377388                                                sd.numSequences = permanent.numSequences
    378389                                                sd.averageQuality = permanent.avgQuality
     
    401412                                                                numQualFiles++;
    402413                                                       
     414                                                        if( sd.logFile )
     415                                                                numLogFiles++;
     416                                                       
    403417                                                        numSuccesful++;
    404418                                                }
     
    414428                }
    415429               
    416                 return [ numSequenceFiles: numSuccesful, numQualFiles: numQualFiles, numClassificationFiles: numClassificationFiles, errors: errors, samplesClassified: samplesClassified.unique() ]
     430                return [ numSequenceFiles: numSuccesful, numQualFiles: numQualFiles, numClassificationFiles: numClassificationFiles, numLogFiles: numLogFiles, errors: errors, samplesClassified: samplesClassified.unique() ]
    417431        }
    418432       
     
    488502                        }
    489503                       
    490                         if( result.numQualFiles > 0 || result.numClassificationFiles > 0 ) {
     504                        if( result.numQualFiles > 0 || result.numClassificationFiles > 0 || result.numLogFiles > 0 ) {
    491505                                flash.message += ", with";
    492506                        }
     
    498512                        }
    499513                       
    500                         if( result.numQualFiles > 0 && result.numClassificationFiles > 0 ) {
     514                        if( result.numQualFiles > 0 && ( result.numClassificationFiles > 0 || result.numLogFiles > 0 ) ) {
    501515                                flash.message += " and";
    502516                        }
     
    507521                                flash.message += " " + result.numClassificationFiles + " classification files"
    508522                        }
    509                        
     523
     524                        if( ( result.numQualFiles > 0 || result.numClassificationFiles > 0 ) && result.numLogFiles > 0 ) {
     525                                flash.message += " and";
     526                        }
     527                       
     528                        if( result.numLogFiles == 1 ) {
     529                                flash.message += " 1 log file"
     530                        } else if( result.numLogFiles > 1 ) {
     531                                flash.message += " " + result.numLogFiles + " log files"
     532                        }
     533                                               
    510534                        if( flash.message )
    511535                                flash.message += "."
  • trunk/grails-app/domain/nl/tno/massSequencing/SequenceData.groovy

    r59 r72  
    22
    33import org.codehaus.groovy.grails.commons.ConfigurationHolder
     4import nl.tno.massSequencing.classification.Classification
    45
    56class SequenceData {
     
    1112        Float averageQuality = 0.0
    1213
     14        // Store the logfile with data about how this sample is processed
     15        String logFile
     16       
    1317        static belongsTo = [sample: AssaySample]
    1418        static constraints = {
    1519                qualityFile(nullable: true)
     20                logFile(nullable:true)
    1621                numSequences(nullable: true)
    1722                averageQuality(nullable: true)
     
    3338        }
    3439       
    35        
    3640        /**
    3741         * Returns the number of quality scores in this data object. This equals
     
    4650                        return 0;
    4751        }
    48        
     52
     53        /**
     54        * Returns the number of classification scores in this data object.
     55        *
     56        * @return       Number of classifications of sequences in this data object
     57        */
     58   public int numClassifications() {
     59           def num = Classification.executeQuery( "SELECT COUNT(*) FROM Sequence s WHERE s.sequenceData = :sd", [ "sd": this ] );
     60           
     61           return num[ 0 ] ?: 0;
     62   }
     63               
    4964        def beforeDelete = {
    5065                def permanentDir = fileService.absolutePath( ConfigurationHolder.config.massSequencing.fileDir.toString() )
     
    5671                        fileService.delete( qualityFile, permanentDir )
    5772               
     73                if( logFile )
     74                        fileService.delete( logFile, permanentDir )
    5875                       
    5976                // Remove all sequence objects referencing this sequenceData object
  • trunk/grails-app/services/nl/tno/massSequencing/FastaService.groovy

    r70 r72  
    265265           def quals = parsedFiles.findAll { it.type == "qual" }
    266266           def classifications = parsedFiles.findAll { it.type == "taxonomy" }
     267           def logfiles = parsedFiles.findAll { it.type == "logfile" }
    267268           def excels = parsedFiles.findAll { it.type == "excel" }
    268269           
     
    287288                   def feasibleQuals = quals.findAll { it.numSequences == fastaFile.numSequences }
    288289                   def feasibleClassifications = classifications.findAll { it.numLines == fastaFile.numSequences }
     290                   def feasibleLogfiles = logfiles;
    289291
    290292                   // Best matching qual file
     
    302304                           classification = feasibleClassifications[ classificationIdx ];
    303305                           
     306                   // Best matching classification file
     307                   def logfileIdx = fuzzySearchService.mostSimilarWithIndex( matchWith + '.logfile', feasibleLogfiles.originalfilename );
     308                   
     309                   def logfile = null
     310                   if( logfileIdx != null )
     311                           logfile = feasibleLogfiles[ logfileIdx ];
     312                                   
    304313                   // Best matching sample
    305314                   def assaySample = null
     
    330339                                           feasibleQuals: feasibleQuals,
    331340                                           feasibleClassifications: feasibleClassifications,
     341                                           feasibleLogfiles: feasibleLogfiles,
    332342                                           qual: qual,
    333343                                           classification: classification,
     344                                           logfile: logfile,
    334345                                           assaySample: assaySample,
    335346                                           checked: checked
     
    454465         * @return      [ fasta: <fasta filename>, qual: <qual filename>, numSequences: <number of sequences>, avgQuality: <average quality> ]
    455466         */
    456         public def savePermanent( String fastaFile, String qualFile, def processedFiles ) {
     467        public def savePermanent( String fastaFile, String qualFile, String logFile, def processedFiles ) {
    457468                File permanentDirectory = fileService.absolutePath( ConfigurationHolder.config.massSequencing.fileDir );
    458469                def returnStructure = [:];
     
    488499                        returnStructure.qual = null
    489500                        returnStructure.avgQuality = 0;
     501                }
     502               
     503                if( logFile && fileService.fileExists( logFile ) ) {
     504                        // Lookup the original filename
     505                        def logData = processedFiles.parsed.success.find { it.filename == logFile };
     506
     507                        if( logData ) {
     508                                returnStructure.logfile = fileService.moveFileToUploadDir( fileService.get(logFile), logData.originalfilename, permanentDirectory, true );
     509                        } else {
     510                                // Delete the uploaded fasta file, since this is a serious error
     511                                fileService.delete( returnStructure.fasta, permanentDirectory );
     512                               
     513                                if( returnStructure.qual )
     514                                        fileService.delete( returnStructure.qual, permanentDirectory );
     515                                       
     516                                throw new Exception( "Log file wasn't uploaded the right way. Maybe the session has expired" );
     517                        }
     518                } else {
     519                        // If the file doesn't exist, we don't save any log file
     520                        returnStructure.logfile = null
    490521                }
    491522
  • trunk/grails-app/services/nl/tno/massSequencing/files/CsvService.groovy

    r60 r72  
    211211        * Parses a given excel file with a match between filenames and samples
    212212        * @param file                   File to parse
    213         * @param onProgress             Closure to execute when progress indicators should be updated.
    214         *                                               Has 2 parameters: numFilesProcessed and numBytesProcessed that indicate the number
    215         *                                               of files and bytes that have been processed in this file (so the first parameter should
    216         *                                               only be 1 when the file is finished)
     213         * @param onProgress    Closure to execute when progress indicators should be updated.
     214         *                                              Has 2 parameters: progress that indicates the number of bytes that have been processed. The second parameter determines
     215         *                                              the number of bytes that has to be processed extra after this action (e.g. when a zip file is extracted, the extracted
     216         *                                              files should be added to the total number of bytes to be processed)
    217217        * @return                               List structure. The matches array contains an array of matches between filenames and sample(name)s.
    218218        *                                               The extension for all files are removed in the 'basename' parameter, in order to improve matching.
  • trunk/grails-app/services/nl/tno/massSequencing/files/FileService.groovy

    r58 r72  
    165165         * @return Filename given to the file on our system or "" if the moving fails
    166166         */
    167         def String moveFileToUploadDir( File file, String originalFilename, File directory = null ) {
     167        def String moveFileToUploadDir( File file, String originalFilename, File directory = null, boolean keepOriginal = false ) {
    168168                if( directory == null )
    169169                directory = getUploadDir()
     
    172172                        if( file.exists() ) {
    173173                                def newFilename = getUniqueFilename( originalFilename, directory );
    174                                 file.renameTo( new File( directory, newFilename ) )
     174                               
     175                                if( keepOriginal )
     176                                        new File( directory, newFilename ) << file.asWritable()
     177                                else
     178                                        file.renameTo( new File( directory, newFilename ) )
     179                               
    175180                                return newFilename
    176181                        } else {
     
    207212         * @return Filename given to the file on our system or "" if the moving fails
    208213         */
    209         def String moveFileToUploadDir( File file, File dir = null ) {
    210                 moveFileToUploadDir( file, file.getName(), dir );
     214        def String moveFileToUploadDir( File file, File dir = null, boolean keepOriginal = false ) {
     215                moveFileToUploadDir( file, file.getName(), dir, keepOriginal );
    211216        }
    212217
     
    378383                        case "gz":
    379384                                return "gzip";          // GZip files combining all other files
     385                        case "logfile":
     386                        case "log":
     387                                return "logfile";       // Log files
    380388                        default:
    381389                                return "";              // meaning 'unknown'
  • trunk/grails-app/services/nl/tno/massSequencing/imports/ImportService.groovy

    r58 r72  
    1515        def zipService
    1616        def classificationService
     17        def mothurService
    1718       
    1819        static transactional = false
     
    6667
    6768                // which importer services do we have?
    68                 def importerServices = [ fastaService, zipService, excelService, classificationService ].findAll { it && it instanceof Importer }
     69                def importerServices = [ fastaService, zipService, excelService, classificationService, mothurService ].findAll { it && it instanceof Importer }
    6970
    7071                // Loop through all filenames and find a service to handle this file
     
    8586                                                contents.filename = file.getName();
    8687                                                contents.originalfilename = fileService.originalFilename( contents.filename )
    87 
     88                                               
    8889                                                if( contents.success ) {
    8990                                                        success << contents;
  • trunk/grails-app/taglib/nl/tno/massSequencing/UploadTagLib.groovy

    r30 r72  
    8282         */
    8383        def uploadedFile = { attrs ->
     84                def description = attrs.description ?: attrs.value;
     85               
    8486                if( attrs.value != null )
    85                         out << '<span class="uploadedFile">' + attrs.value + '</span>'
     87                        out << '<span class="uploadedFile" rel="' + attrs.value.toString().encodeAsHTML() + '">' + description + '</span>'
    8688        }
    8789}
  • trunk/grails-app/views/assay/_addFilesDialog.gsp

    r59 r72  
    55                <input type="hidden" name="entityType" value="assay" />
    66                <p>
    7                         Select sequence (.fna, .fasta) and quality (.fqa, .qual) files to upload. It is possible to zip the files before upload. You can add multiple files, if needed.
     7                        Select sequence (.fna, .fasta), quality (.fqa, .qual) and classification (.taxonomy) files to upload. It is possible to zip the files before upload. You can add multiple files, if needed.
    88                </p>
    99                <p>
  • trunk/grails-app/views/assay/_enterTagsDialog.gsp

    r43 r72  
    11<div id="enterTagsDialog" class="tabbedDialog">
    22        <div id="excel">
    3                 <h2>Edit sample data by excel file</h2>
     3                <h2>Edit amplicon details with excel file</h2>
    44                <p>
    55                        Enter tag sequence and oligo number for samples in an excel file. <g:link action="downloadTagsExcel" id="${assay.id}">Download an example</g:link>
  • trunk/grails-app/views/assay/show.gsp

    r71 r72  
    2828                                runNames[ runNames.length ] = {id: ${run.id}, name: '${run.name}', alreadyAdded: ${ run.assays.contains( assay ) ? 'true' : 'false' }};
    2929                        </g:each>
    30                        
    31                         function initializeUploadedFiles( selector ) {
    32                                 if( selector == undefined )
    33                                         selector = "";
    34                                
    35                                 $( selector + ' .uploadedFile').each( function( idx, el ) {
    36                                         $(el).html( createFileHTML( $(el).text(), 'getPermanent' ) );
    37                                 });
    38                         }
    3930
    4031                        // Initializefiles on load
     
    9485                <p class="options multiple">
    9586                        <g:if test="${editable}">
    96                                 <a class="editAssociation" onClick="showEnterTagsDialog(); return false;" href="#">Edit sample data</a>
     87                                <a class="editAssociation" onClick="showEnterTagsDialog(); return false;" href="#">Edit amplicon details</a>
    9788                        </g:if>
    9889                        <g:else>
    99                                 <a class="editAssociation disabled" onClick="return false;" href="#">Edit sample data</a>
     90                                <a class="editAssociation disabled" onClick="return false;" href="#">Edit amplicon details</a>
    10091                        </g:else>
    10192                </p>                   
     
    10394                       
    10495                        <g:if test="${!editable || assay.runs == null || assay.runs.size() == 0}">
    105                                 <a class="addSequences disabled" onClick="return false;" href="#">Add sequence files</a>
     96                                <a class="addSequences disabled" onClick="return false;" href="#">Import sequence/classification files</a>
    10697                        </g:if>
    10798                        <g:else>
    108                                 <a class="addSequences" onClick="showAddFilesDialog(); return false;" href="#">Add sequence files</a>
     99                                <a class="addSequences" onClick="showAddFilesDialog(); return false;" href="#">Import sequence/classification files</a>
    109100                        </g:else>
    110101                       
  • trunk/grails-app/views/assaySample/show.gsp

    r71 r72  
    6464                                <th nowrap>Sequence file</th>
    6565                                <th nowrap>Quality file</th>
     66                                <th nowrap>Log file</th>
     67                                <th nowrap>Classifications</th>
    6668                                <th nowrap># sequences</th>
    6769                                <th class="nonsortable"></th>
     
    7173                        <g:each in="${assaySample.sequenceData}" var="sequenceData">
    7274                                <tr>
    73                                         <td><g:uploadedFile value="${sequenceData.sequenceFile}" /></td>
     75                                        <td><g:uploadedFile value="${sequenceData.sequenceFile}" description="${sequenceData.sequenceFile[ 0..sequenceData.sequenceFile.lastIndexOf( '.' )-1 ]}" /></td>
    7476                                        <td>
    7577                                                <g:if test="${sequenceData.qualityFile}">
    76                                                         <g:uploadedFile value="${sequenceData.qualityFile}" />
     78                                                        <g:uploadedFile value="${sequenceData.qualityFile}" description="qual" />
    7779                                                </g:if>
     80                                                <g:else>
     81                                                        -
     82                                                </g:else>
    7883                                        </td>
     84                                        <td>
     85                                                <g:if test="${sequenceData.logFile}">
     86                                                        <g:uploadedFile value="${sequenceData.logFile}" description="log" />
     87                                                </g:if>
     88                                                <g:else>
     89                                                        -
     90                                                </g:else>
     91                                        </td>
     92                                        <td>
     93                                                <% def numClassifications = sequenceData.numClassifications(); %>
     94                                                <g:if test="${numClassifications > 0}">
     95                                                        <g:link controller="classification" action="show" params="${['ids': assaySample.id, 'entityType': entityType, 'entityId': assaySample[ entityType ]?.id ]}">${numClassifications}</g:link>
     96                                                </g:if>
     97                                                <g:else>
     98                                                        -
     99                                                </g:else>
     100                                        </td>                                   
    79101                                        <td>${sequenceData.numSequences}</td>
    80102                                        <td class="button"><g:link onClick="return confirm( 'Are you sure you want to remove the selected files from this sample?' );" controller="fasta" action="deleteData" id="${sequenceData.id}" params="[entityType: entityType]"><img src="${fam.icon(name: 'delete')}" /></g:link></td>
  • trunk/grails-app/views/import/parseUploadResult.gsp

    r67 r72  
    4343                                def sortedSamples = entity.assaySamples.findAll { it.assay.study.canWrite( session.user ) }.sort() { a,b -> a.sample.name <=> b.sample.name }
    4444                        %>
    45                         <table class="importProcessedFiles" cellspacing="0">
    46                                 <thead>
    47                                         <tr>
    48                                                 <th></th>
    49                                                 <th>Fasta file</th>
    50                                                 <th># sequences</th>
    51                                                 <th>Sample</th>
    52                                         </tr>
    53                                 </thead>
    54                                
    55                                 <g:each in="${matchedFiles}" var="file" status="i">
    56                                         <tr class="${ i % 2 == 0 ? 'even' : 'odd' }">
    57                                                 <td>
    58                                                         <g:hiddenField name="file.${i}.fasta" value="${file.fasta.filename}" />
    59                                                         <g:checkBox name="file.${i}.include" value="${file.checked}" />
    60                                                 </td>
    61                                                 <td class="name" valign="center">${file.fasta.originalfilename}</td>
    62                                                 <td class="sequences">${file.fasta.numSequences}</td>
    63                                                 <td nowrap>
    64                                                         <g:if test="${sortedSamples.size()}">
     45                        <g:if test="${sortedSamples.size()}">
     46                                <table class="importProcessedFiles" cellspacing="0">
     47                                        <thead>
     48                                                <tr>
     49                                                        <th></th>
     50                                                        <th>Fasta file</th>
     51                                                        <th># sequences</th>
     52                                                        <th>Type</th>
     53                                                        <th>Choice</th>
     54                                                </tr>
     55                                        </thead>
     56                                       
     57                                        <g:each in="${matchedFiles}" var="file" status="i">
     58                                                <tr class="${ i % 2 == 0 ? 'even' : 'odd' }">
     59                                                        <td>
     60                                                                <g:hiddenField name="file.${i}.fasta" value="${file.fasta.filename}" />
     61                                                                <g:checkBox name="file.${i}.include" value="${file.checked}" />
     62                                                        </td>
     63                                                        <td class="name" valign="center">${file.fasta.originalfilename}</td>
     64                                                        <td class="sequences">${file.fasta.numSequences}</td>
     65                                                        <td class="type">Sample</td>
     66                                                        <td nowrap>
    6567                                                                <select name="file.${i}.assaySample" onChange="showSampleDataWarning(this, ${i});">
    6668                                                                        <g:each in="${sortedSamples}" var="assaySample">
     
    7678                                                                        <img src="${fam.icon( name: "exclamation" ) }" title="This sample already contains sequences. Adding sequences doesn't replace the old ones." />
    7779                                                                </span>
    78                                                         </g:if>
    79                                                         <g:else>
    80                                                                 No samples available.
    81                                                         </g:else>
    82                                                 </td>
    83                                         </tr>
    84                                        
    85                                         <tr class="${ i % 2 == 0 ? 'even' : 'odd' }">
    86                                                 <td></td>
    87                                                 <td></td>
    88                                                 <td>Quality file</td>
    89                                                 <td>
    90                                                         <g:if test="${file.feasibleQuals?.size()}">
    91                                                                 <g:select name="file.${i}.qual" from="${file.feasibleQuals}" optionKey="filename" optionValue="originalfilename" value="${file.qual?.filename}" noSelection="['': '- No qual file -']"/>
    92                                                         </g:if>
    93                                                         <g:else>
    94                                                                 <select name="" disabled="disabled"><option value="">No qual file available</option></select>
    95                                                         </g:else>
    96                                                 </td>
    97                                         </tr>
    98                                         <tr class="${ i % 2 == 0 ? 'even' : 'odd' }">
    99                                                 <td></td>
    100                                                 <td></td>
    101                                                 <td>Classification file</td>
    102                                                 <td>
    103                                                         <g:if test="${file.feasibleClassifications?.size()}">
    104                                                                 <g:select name="file.${i}.classification" from="${file.feasibleClassifications}" optionKey="filename" optionValue="originalfilename" value="${file.classification?.filename}" noSelection="['': '- No classification -']"/>
    105                                                         </g:if>
    106                                                         <g:else>
    107                                                                 <select name="" disabled="disabled"><option value="">No classification available</option></select>
    108                                                         </g:else>
    109                                                 </td>
    110                                         </tr>
    111                                 </g:each>
    112                        
    113                         </table>
    114                
     80                                                        </td>
     81                                                </tr>
     82                                               
     83                                                <g:if test="${existingTypes.qual}">
     84                                                        <tr class="${ i % 2 == 0 ? 'even' : 'odd' }">
     85                                                                <td></td>
     86                                                                <td></td>
     87                                                                <td></td>
     88                                                                <td>Quality file</td>
     89                                                                <td>
     90                                                                        <g:if test="${file.feasibleQuals?.size()}">
     91                                                                                <g:select name="file.${i}.qual" from="${file.feasibleQuals}" optionKey="filename" optionValue="originalfilename" value="${file.qual?.filename}" noSelection="['': '- No qual file -']"/>
     92                                                                        </g:if>
     93                                                                        <g:else>
     94                                                                                <select name="" disabled="disabled"><option value="">No qual file available</option></select>
     95                                                                        </g:else>
     96                                                                </td>
     97                                                        </tr>
     98                                                </g:if>
     99                                                <g:if test="${existingTypes.taxonomy}">
     100                                                        <tr class="${ i % 2 == 0 ? 'even' : 'odd' }">
     101                                                                <td></td>
     102                                                                <td></td>
     103                                                                <td></td>
     104                                                                <td>Classification file</td>
     105                                                                <td>
     106                                                                        <g:if test="${file.feasibleClassifications?.size()}">
     107                                                                                <g:select name="file.${i}.classification" from="${file.feasibleClassifications}" optionKey="filename" optionValue="originalfilename" value="${file.classification?.filename}" noSelection="['': '- No classification -']"/>
     108                                                                        </g:if>
     109                                                                        <g:else>
     110                                                                                <select name="" disabled="disabled"><option value="">No classification available</option></select>
     111                                                                        </g:else>
     112                                                                </td>
     113                                                        </tr>
     114                                                </g:if>
     115                                                <g:if test="${existingTypes.logfile}">
     116                                                        <tr class="${ i % 2 == 0 ? 'even' : 'odd' }">
     117                                                                <td></td>
     118                                                                <td></td>
     119                                                                <td></td>
     120                                                                <td>Log file</td>
     121                                                                <td>
     122                                                                        <g:if test="${file.feasibleLogfiles?.size()}">
     123                                                                                <g:select name="file.${i}.logfile" from="${file.feasibleLogfiles}" optionKey="filename" optionValue="originalfilename" value="${file.logfile?.filename}" noSelection="['': '- No logfile -']"/>
     124                                                                        </g:if>
     125                                                                        <g:else>
     126                                                                                <select name="" disabled="disabled"><option value="">No logfile available</option></select>
     127                                                                        </g:else>
     128                                                                </td>
     129                                                        </tr>
     130                                                </g:if>
     131                                        </g:each>
     132                               
     133                                </table>
     134                        </g:if>
     135                        <g:else>
     136                                <p>${parsedFiles.success?.size()} files were successfully uploaded, but no samples are available to connect the data to.</p>
     137                        </g:else>
    115138                </g:if>
    116139                <g:else>
  • trunk/grails-app/views/run/_addFilesDialog.gsp

    r59 r72  
    55                <input type="hidden" name="entityType" value="run" />
    66                <p>
    7                         Select sequence (.fna, .fasta), quality (.fqa, .qual) and classification (.groups, .taxonomy) files to upload. It is possible to zip the files before upload. You can add multiple files, if needed.
     7                        Select sequence (.fna, .fasta), quality (.fqa, .qual) and classification (.taxonomy) files to upload. It is possible to zip the files before upload. You can add multiple files, if needed.
     8                </p>
     9                <p>
     10                        Additionally, a .logfile file can be uploaded with details about processing these samples. For each imported sequence file, a logfile can be saved.
    811                </p>
    912                <p>
  • trunk/grails-app/views/run/_enterTagsDialog.gsp

    r43 r72  
    11<div id="enterTagsDialog" class="dialog">
    22        <div id="excel">
    3                 <h2>Edit sample data by excel file</h2>
     3                <h2>Edit amplicon details with excel file</h2>
    44                <p>
    55                        Enter tag sequence and oligo number for samples in an excel file. <g:link action="downloadTagsExcel" id="${run.id}">Download an example</g:link>
  • trunk/grails-app/views/run/show.gsp

    r71 r72  
    3131                                runNames[ runNames.length ] = {id: ${currentrun.id}, name: '${currentrun.name}', alreadyAdded: false };
    3232                        </g:each>
    33                        
    34                         function initializeUploadedFiles( selector ) {
    35                                 if( selector == undefined )
    36                                         selector = "";
    37                                
    38                                 $( selector + ' .uploadedFile').each( function( idx, el ) {
    39                                         $(el).html( createFileHTML( $(el).text(), 'getPermanent' ) );
    40                                 });
    41                         }
    4233
    4334                        // Initializefiles on load
     
    129120
    130121                        <g:if test="${numWritableAssaySamples > 0}">
    131                                 <a class="editAssociation" onClick="showEnterTagsDialog(); return false;" href="#">Edit sample data</a>
    132                         </g:if>
    133                         <g:else>
    134                                 <a class="editAssociation disabled" onClick="return false;" href="#">Edit sample data</a>
     122                                <a class="editAssociation" onClick="showEnterTagsDialog(); return false;" href="#">Edit amplicon details</a>
     123                        </g:if>
     124                        <g:else>
     125                                <a class="editAssociation disabled" onClick="return false;" href="#">Edit amplicon details</a>
    135126                        </g:else>
    136127                       
     
    146137                <p class="options multiple">
    147138                        <g:if test="${numWritableAssaySamples == 0 || numWritableAssays == 0 }">
    148                                 <a class="addSequences disabled" onClick="return false;" href="#">Add sequence files</a>
    149                         </g:if>
    150                         <g:else>
    151                                 <a class="addSequences" onClick="showAddFilesDialog(); return false;" href="#">Add sequence files</a>
     139                                <a class="addSequences disabled" onClick="return false;" href="#">Import sequence/classification files</a>
     140                        </g:if>
     141                        <g:else>
     142                                <a class="addSequences" onClick="showAddFilesDialog(); return false;" href="#">Import sequence/classification files</a>
    152143                        </g:else>
    153144                       
  • trunk/web-app/css/metagenomics.css

    r62 r72  
    507507
    508508/* Makes sure the filenames in the dialog don't exceed 200px */
    509 .dataTables_wrapper .uploadedFile { display: inline-block; zoom: 1; *display: inline; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 190px; height: 15px; }
    510509.blok_data { display: inline-block; zoom: 1; *display: inline; width: 400px; vertical-align: top;}
    511510
    512 .importProcessedFiles td { vertical-align: middle; }
     511.importProcessedFiles td { vertical-align: middle; padding-top: 2px; padding-bottom: 2px; }
    513512
    514513/* Classification table */
  • trunk/web-app/js/fileuploads.new.js

    r44 r72  
    259259 * @returns                     {String} HTML containing the link
    260260 */
    261 function createFileHTML( filename, fetchMethod ) {
     261function createFileHTML( filename, fetchMethod, text ) {
    262262        if( fetchMethod == undefined || fetchMethod == "" )
    263263                fetchMethod = "get";
    264        
    265         return '<a target="_blank" href="' + baseUrl + '/file/' + fetchMethod + '/' + filename + '">' + filename + '</a>';
     264
     265        if( text == undefined || text == "" )
     266                text = filename
     267       
     268        return '<a target="_blank" href="' + baseUrl + '/file/' + fetchMethod + '/' + filename + '">' + text + '</a>';
    266269}
    267270
  • trunk/web-app/js/showSampleDialogUniversal.js

    r56 r72  
    2626        } );
    2727}
     28
     29function initializeUploadedFiles( selector ) {
     30        if( selector == undefined )
     31                selector = "";
     32       
     33        $( selector + ' .uploadedFile').each( function( idx, el ) {
     34                var url = $(el).attr( 'rel' );
     35                var text = $(el).text();
     36               
     37                $(el).html( createFileHTML( url, 'getPermanent', text ) );
     38        });
     39}
Note: See TracChangeset for help on using the changeset viewer.