source: trunk/grails-app/views/run/show.gsp @ 50

Last change on this file since 50 was 50, checked in by robert@…, 8 years ago
  • Added links to remove samples from a run
  • Added synchronization of authorization for all studies, if a user logs in
  • Improved excel import to handle Error-values in a cell
File size: 11.5 KB
Line 
1<html>
2        <head>
3                <meta name="layout" content="main" />
4                <title>Show run ${run.name} | Mass Sequencing | dbNP</title>
5               
6                <link rel="stylesheet" href="<g:resource dir="css" file="showAssay.css" />" type="text/css"/>
7                <link rel="stylesheet" href="<g:resource dir="css" file="fileuploader.new.css" />" type="text/css"/>
8               
9                <g:javascript src="jquery.ui.tabbeddialog.js" />
10                <g:javascript src="addFilesDialog.js" />
11                <g:javascript src="editSampleDialog.js" />
12                <g:javascript src="enterTagsDialog.js" />
13
14                <g:javascript src="run.show.enterTagsDialog.js" />
15                <g:javascript src="run.show.assayDialog.js" />
16                <g:javascript src="run.show.runDialog.js" />
17                <g:javascript src="run.show.addSamplesDialog.js" />
18                <g:javascript src="showSampleDialogUniversal.js" />
19
20                <g:javascript src="assay.show.showRunDialog.js" />
21
22                <g:javascript src="fileuploads.new.js" />
23               
24                <script>
25                        var runId = ${run.id};
26                        var numOtherAssays = ${otherAssays.size()};
27
28                        // Create a variable with assay names to check for existing names
29                        var runNames = [];
30                        <g:each in="${allRuns}" var="currentrun">
31                                runNames[ runNames.length ] = {id: ${currentrun.id}, name: '${currentrun.name}', alreadyAdded: false };
32                        </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                        }
42
43                        // Initializefiles on load
44                        $(function() { initializeUploadedFiles(); });
45                </script>
46        </head>
47<body>
48        <h1>
49                Run ${run.name}
50        </h1>
51       
52        <div id="editRunDialog" class="dialog"></div>
53        <div id="editSampleDialog" class="dialog"></div>
54       
55        <div class="blok_data">
56                <label>Run</label>: ${run.name}<br />
57                <label>Date</label>: <g:formatDate format="dd-MM-yyyy" date="${run.date}"/><br />
58                <label>Supplier</label>: ${run.supplier}<br />
59                <label>Machine</label>: ${run.machine}<br />
60                <label>Parameters</label>: <g:uploadedFile value="${run.parameterFile}" /><br />
61        </div>
62        <div class="blok_data">
63                <label># assays</label>: ${run.assays?.size()}
64                <% def numHidden = run.assays?.findAll { !it.study.canRead( session.user ) }.size() ; %>
65                <g:if test="${numHidden}">
66                        (${numHidden}
67                        <a href="#" onClick="alert( '${numHidden} assay(s) from this run are hidden because you don\'t have the right permissions to view them.' ); return false;">
68                        hidden</a>)
69                </g:if>
70                <br />
71       
72                <label># samples</label>: ${run.assaySamples?.size()}
73                <% numHidden = run.assaySamples?.findAll { !it.assay?.study.canRead( session.user ) }.size() ; %>
74                <g:if test="${numHidden}">
75                        (${numHidden}
76                        <a href="#" onClick="alert( '${numHidden} sample(s) from this run are hidden because you don\'t have the right permissions to view them.' ); return false;">
77                        hidden</a>)
78                </g:if>
79                <br />
80                <label># sequences</label>: ${run.numSequences()}<br />
81                <label># files</label>: ${run.numFiles()}<br />
82        </div>
83        <p class="options">
84                <a class="edit" href="#" onClick="showEditRunDialog( ${run.id} ); return false;">Edit run</a>
85        </p>
86       
87        <!-- Samples -->
88        <h2>Samples</h2>
89        <% def assaySamples = run.assaySamples ? run.assaySamples.findAll { it.assay?.study.canRead( session.user ) }.toList().sort { it.sample.name } : []; %>
90        <g:if test="${assaySamples.size() == 0}">
91                No samples found in run.
92        </g:if>
93        <g:else>
94                <form id="sampleForm"><input type="hidden" name="runId" value="${run.id}" /></form>
95                <table class="paginate" id="samples">
96                        <thead>
97                                <tr>
98                                        <th width="5" class="nonsortable"><input type="checkbox" id="checkAll" onClick="checkAllPaginated(this);" /></th>
99                                        <th nowrap>name</th>
100                                        <th nowrap>study</th>
101                                        <th nowrap>assay</th>
102                                        <th nowrap>Forward mid</th>
103                                        <th nowrap># sequences</th>
104                                        <th nowrap># qual</th>
105                                        <th class="nonsortable"></th>
106                                        <th class="nonsortable"></th>
107                                        <th class="nonsortable"></th>
108                                </tr>
109                        </thead>                       
110                        <tbody>
111                                <g:each in="${assaySamples}" var="assaySample">
112                                        <tr>
113                                                <td><g:checkBox name="ids" value="${assaySample.id}" checked="${false}" onClick="updateCheckAll(this);" /></td>
114                                                <td><a href="#" onClick="showSample(${assaySample.id}, 'run'); return false;">${assaySample.sample.name}</a></td>
115                                                <td>${assaySample.assay.study.name}</td>
116                                                <td>${assaySample.assay.name}</td>
117                                                <td>${assaySample.fwMidName}</td>
118                                                <td>
119                                                        <g:if test="${assaySample.numSequenceFiles() > 0}">
120                                                                ${assaySample.numSequences()}
121                                                        </g:if>
122                                                        <g:else>
123                                                                -
124                                                        </g:else>
125                                                </td>
126                                                <td>
127                                                        <g:if test="${assaySample.numQualityFiles() > 0}">
128                                                                ${assaySample.numQualScores()}
129                                                        </g:if>
130                                                        <g:else>
131                                                                -
132                                                        </g:else>
133                                                </td>
134                                                <td class="button">
135                                                        <g:if test="${!assaySample.assay.study.canWrite(session.user)}">
136                                                                <img src="${fam.icon(name: 'pencil')}" class="disabled" title="You can't edit this sample because you don't have sufficient privileges." />
137                                                        </g:if>
138                                                        <g:else>
139                                                                <a onClick="showEditSampleDialog(${assaySample.id}, 'run', ${run.id});" href="#"><img src="${fam.icon(name: 'pencil')}" /></a>
140                                                        </g:else>
141                                                </td>
142                                                <td class="button">
143                                                        <g:if test="${!assaySample.assay.study.canWrite(session.user)}">
144                                                                <img src="${fam.icon(name: 'application_delete')}" class="disabled" title="You can't remove this sample because you don't have sufficient privileges." />
145                                                        </g:if>
146                                                        <g:else>
147                                                                <g:link onClick="return confirm( 'Are you sure you want to remove the selected sample from this run?' );" controller="run" action="removeSample" id="${run.id}" params="${[assaySampleId: assaySample.id]}" ><img src="${fam.icon(name: 'application_delete')}" /></g:link>
148                                                        </g:else>
149                                                </td>
150                                                <td class="button">
151                                                        <g:if test="${assaySample.numSequences() > 0}">
152                                                                <g:link controller="assaySample" action="sequenceLengthHistogram" id="${assaySample.id}"><img src="${fam.icon( name: 'chart_bar' )}" alt="Sequence length histogram" title="Sequence length histogram" /></g:link>
153                                                        </g:if>
154                                                        <g:else>
155                                                                <img src="${fam.icon( name: 'chart_bar' )}" class="disabled" alt="No histogram available because no sequences are uploaded." title="No histogram available because no sequences are uploaded." />
156                                                        </g:else>
157                                                </td>                                                   
158                                        </tr>
159                                </g:each>
160                        </tbody>
161                </table>
162                <div id="showSampleDialog" class="dialog"></div>
163        </g:else>       
164        <g:if test="${editable}">
165                <p class="options multiple">
166                        <% def writableAssaySamples = assaySamples.findAll { it.assay.study.canWrite( session.user ) } %>
167                        <a class="addAssociation" onClick="showAddSamplesDialog(); return false;" href="#">Add samples</a><br />
168
169                        <g:if test="${writableAssaySamples.size() > 0}">
170                                <a class="editAssociation" onClick="showEnterTagsDialog(); return false;" href="#">Edit sample data</a>
171                        </g:if>
172                        <g:else>
173                                <a class="editAssociation disabled" onClick="return false;" href="#">Edit sample data</a>
174                        </g:else>
175                       
176                        <br />
177
178                        <g:if test="${writableAssaySamples.size() > 0}">
179                                <a class="removeAssociation" href="#" onClick="if( confirm( 'Are you sure you want to remove selected samples from this run?' ) ) { submitPaginatedForm( $( '#sampleForm' ), '<g:createLink controller="run" action="removeSamples" />', '#samples', 'Please select one or more samples to remove from this run' ); } return false;">Remove selected samples</a>
180                        </g:if>
181                        <g:else>
182                                <a class="removeAssociation disabled" onClick="return false;" href="#">Remove selected samples</a>
183                        </g:else>
184                </p>
185                <p class="options multiple">
186                        <g:if test="${writableAssaySamples.size() == 0 || !run.assays?.size()}">
187                                <a class="addSequences disabled" onClick="return false;" href="#">Add sequence files</a>
188                        </g:if>
189                        <g:else>
190                                <a class="addSequences" onClick="showAddFilesDialog(); return false;" href="#">Add sequence files</a>
191                        </g:else>
192                       
193                        <br />
194
195                        <g:if test="${writableAssaySamples.size() > 0 && run.numFiles() > 0 }">
196                                <a class="removeSequences" href="#" onClick="if( confirm( 'Are you sure you want to remove all sequence data from this run? Only sequences are removed from samples you have write access to.' ) ) { submitPaginatedForm( $( '#sampleForm' ), '<g:createLink controller="run" action="deleteSequenceData" />', '#samples', 'Please select one or more samples to remove sequences from.' ); } return false;">Delete selected sequences</a>
197                        </g:if>
198                        <g:else>
199                                <a class="removeSequences disabled" onClick="return false;" href="#">Delete selected sequences</a>
200                        </g:else>
201                </p>
202               
203                <p class="options multiple">
204                        <a class="fasta" href="#" onClick="submitPaginatedForm( $( '#sampleForm' ), '<g:createLink controller="assaySample" action="exportAsFasta" />', '#samples', 'Please select one or more samples to export' ); return false;">Export as fasta</a><br />
205                </p>
206               
207                <br clear="all" />             
208                <g:if test="${writableAssaySamples.size() > 0}">
209                        <g:render template="enterTagsDialog" model="[run: run, writableAssaySamples: writableAssaySamples]" />
210                        <g:render template="addFilesDialog" model="[run: run]" />
211                </g:if>
212               
213                <g:render template="addSamplesDialog" model="[run: run]" />
214               
215                </g:if>
216
217
218
219        <!-- Runs -->
220        <h2>Assays</h2>
221        <g:if test="${run.assays == null || run.assays.size() == 0}">
222                No assay found for this run
223        </g:if>
224        <g:else>
225                <table class="paginate">
226                        <thead>
227                                <tr>
228                                        <th nowrap>name</th>
229                                        <th nowrap>study</th>
230                                        <th nowrap># samples</th>
231                                        <th nowrap>other runs</th>
232                                        <th class="nonsortable"></th>
233                                </tr>
234                        </thead>                       
235                        <tbody>
236                                <% def assays = run.assays.findAll { it.study.canRead( session.user ) }.toList().sort { it.name }; %>
237                                <g:each in="${assays}" var="assay">
238                                        <tr>
239                                                <td><g:link controller="assay" action="show" id="${assay.id}">${assay.name}</g:link></td>
240                                                <td>${assay.study?.name}</td>
241                                                <td>${assay.assaySamples?.size()}</td>
242                                                <td>
243                                                        <g:if test="${assay.runs?.size() == 1}">
244                                                                <% /* If only 1 run is found, then it is the current one */ %>
245                                                                -
246                                                        </g:if>
247                                                        <g:else>
248                                                                <g:each in="${assay.runs - run}" var="otherRun">
249                                                                        <g:link action="show" id="${otherRun.id}">${otherRun.name}</g:link><br />
250                                                                </g:each>
251                                                        </g:else>
252                                                </td>
253                                                <td class="button">
254                                                        <g:if test="${run.samples(assay.id).size()}">
255                                                                <img src="${fam.icon(name: 'application_delete')}" class="disabled" title="You can't remove this assay because sequences from this assay are coupled to this run." />
256                                                        </g:if>
257                                                        <g:else>
258                                                                <g:if test="${!assay.study.canWrite(session.user)}">
259                                                                        <img src="${fam.icon(name: 'application_delete')}" class="disabled" title="You can't remove this assay because you don't have sufficient privileges." />
260                                                                </g:if>
261                                                                <g:else>
262                                                                        <g:link onClick="return confirm( 'Are you sure you want to remove the selected assay from this run?' );" controller="run" action="removeAssay" id="${run.id}" params="${[assay_id: assay.id]}" ><img src="${fam.icon(name: 'application_delete')}" /></g:link>
263                                                                </g:else>
264                                                        </g:else>
265                                                </td>
266                                        </tr>
267                                </g:each>
268                        </tbody>
269                </table>
270        </g:else>
271        <% def writableAssays = otherAssays.findAll { it.study.canWrite( session.user ) } %>
272        <g:if test="${editable}">
273                <p class="options">
274                        <g:if test="${writableAssays.size() > 0}">
275                                <a class="addAssociation" href="#" onClick="showAddAssayDialog(); return false;">Add assay</a>
276                        </g:if>
277                        <g:else>
278                                <a class="addAssociation disabled" href="#" onClick="return false;">Add assay</a>
279                        </g:else>
280                </p>
281                <g:if test="${writableAssays.size() > 0}">
282                        <g:render template="addAssayDialog" model="[run: run, writableAssays: writableAssays]" />
283                </g:if>
284        </g:if>
285        <div id="showRunDialog" class="dialog"></div>
286</body>
287</html>
Note: See TracBrowser for help on using the repository browser.